/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GLDispatch.h" #include #include #ifdef __linux__ #include #elif defined(WIN32) #include #endif typedef void (*GL_FUNC_PTR)(); static GL_FUNC_PTR getGLFuncAddress(const char *funcName) { GL_FUNC_PTR ret = NULL; #ifdef __linux__ static osUtils::dynLibrary* libGL = osUtils::dynLibrary::open("libGL.so"); ret = (GL_FUNC_PTR)glXGetProcAddress((const GLubyte*)funcName); #elif defined(WIN32) static osUtils::dynLibrary* libGL = osUtils::dynLibrary::open("opengl32"); ret = (GL_FUNC_PTR)wglGetProcAddress(funcName); #endif if(!ret && libGL){ ret = libGL->findSymbol(funcName); } return ret; } #define LOAD_GL_FUNC(name) { void * funcAddrs = NULL; \ funcAddrs = (void *)getGLFuncAddress(#name); \ if(funcAddrs) \ *(void**)(&name) = funcAddrs; \ else \ fprintf(stderr,"could not load func %s\n",#name); } GLDispatch::GLDispatch():m_isLoaded(false){}; void GLDispatch::dispatchFuncs() { emugl::Mutex::AutoLock mutex(m_lock); if(m_isLoaded) return; LOAD_GL_FUNC(glActiveTexture); LOAD_GL_FUNC(glAlphaFunc); LOAD_GL_FUNC(glBegin); LOAD_GL_FUNC(glBindBuffer); LOAD_GL_FUNC(glBindTexture); LOAD_GL_FUNC(glBlendFunc); LOAD_GL_FUNC(glBufferData); LOAD_GL_FUNC(glBufferSubData); LOAD_GL_FUNC(glClear); LOAD_GL_FUNC(glClearColor); LOAD_GL_FUNC(glClearDepth); LOAD_GL_FUNC(glClearStencil); LOAD_GL_FUNC(glClientActiveTexture); LOAD_GL_FUNC(glClipPlane); LOAD_GL_FUNC(glColor4d); LOAD_GL_FUNC(glColor4f); LOAD_GL_FUNC(glColor4fv); LOAD_GL_FUNC(glColor4ub); LOAD_GL_FUNC(glColor4ubv); LOAD_GL_FUNC(glColorMask); LOAD_GL_FUNC(glColorPointer); LOAD_GL_FUNC(glCompressedTexImage2D); LOAD_GL_FUNC(glCompressedTexSubImage2D); LOAD_GL_FUNC(glCopyTexImage2D); LOAD_GL_FUNC(glCopyTexSubImage2D); LOAD_GL_FUNC(glCullFace); LOAD_GL_FUNC(glDeleteBuffers); LOAD_GL_FUNC(glDeleteTextures); LOAD_GL_FUNC(glDepthFunc); LOAD_GL_FUNC(glDepthMask); LOAD_GL_FUNC(glDepthRange); LOAD_GL_FUNC(glDisable); LOAD_GL_FUNC(glDisableClientState); LOAD_GL_FUNC(glDrawArrays); LOAD_GL_FUNC(glDrawElements); LOAD_GL_FUNC(glEnable); LOAD_GL_FUNC(glEnableClientState); LOAD_GL_FUNC(glEnd); LOAD_GL_FUNC(glFinish); LOAD_GL_FUNC(glFlush); LOAD_GL_FUNC(glFogf); LOAD_GL_FUNC(glFogfv); LOAD_GL_FUNC(glFrontFace); LOAD_GL_FUNC(glFrustum); LOAD_GL_FUNC(glGenBuffers); LOAD_GL_FUNC(glGenTextures); LOAD_GL_FUNC(glGetBooleanv); LOAD_GL_FUNC(glGetBufferParameteriv); LOAD_GL_FUNC(glGetClipPlane); LOAD_GL_FUNC(glGetDoublev); LOAD_GL_FUNC(glGetError); LOAD_GL_FUNC(glGetFloatv); LOAD_GL_FUNC(glGetIntegerv); LOAD_GL_FUNC(glGetLightfv); LOAD_GL_FUNC(glGetMaterialfv); LOAD_GL_FUNC(glGetPointerv); LOAD_GL_FUNC(glGetString); LOAD_GL_FUNC(glGetTexEnvfv); LOAD_GL_FUNC(glGetTexEnviv); LOAD_GL_FUNC(glGetTexParameterfv); LOAD_GL_FUNC(glGetTexParameteriv); LOAD_GL_FUNC(glHint); LOAD_GL_FUNC(glIsBuffer); LOAD_GL_FUNC(glIsEnabled); LOAD_GL_FUNC(glIsTexture); LOAD_GL_FUNC(glLightf); LOAD_GL_FUNC(glLightfv); LOAD_GL_FUNC(glLightModelf); LOAD_GL_FUNC(glLightModelfv); LOAD_GL_FUNC(glLineWidth); LOAD_GL_FUNC(glLoadIdentity); LOAD_GL_FUNC(glLoadMatrixf); LOAD_GL_FUNC(glLogicOp); LOAD_GL_FUNC(glMaterialf); LOAD_GL_FUNC(glMaterialfv); LOAD_GL_FUNC(glMultiTexCoord2fv); LOAD_GL_FUNC(glMultiTexCoord2sv); LOAD_GL_FUNC(glMultiTexCoord3fv); LOAD_GL_FUNC(glMultiTexCoord3sv); LOAD_GL_FUNC(glMultiTexCoord4fv); LOAD_GL_FUNC(glMultiTexCoord4sv); LOAD_GL_FUNC(glMultiTexCoord4f); LOAD_GL_FUNC(glMultMatrixf); LOAD_GL_FUNC(glNormal3f); LOAD_GL_FUNC(glNormal3fv); LOAD_GL_FUNC(glNormal3sv); LOAD_GL_FUNC(glOrtho); LOAD_GL_FUNC(glPointParameterf); LOAD_GL_FUNC(glPointParameterfv); LOAD_GL_FUNC(glPointSize); LOAD_GL_FUNC(glPolygonOffset); LOAD_GL_FUNC(glRotatef); LOAD_GL_FUNC(glScalef); LOAD_GL_FUNC(glTexEnvf); LOAD_GL_FUNC(glTexEnvfv); LOAD_GL_FUNC(glTexParameterf); LOAD_GL_FUNC(glTexParameterfv); LOAD_GL_FUNC(glMatrixMode); LOAD_GL_FUNC(glNormalPointer); LOAD_GL_FUNC(glPixelStorei); LOAD_GL_FUNC(glPopMatrix); LOAD_GL_FUNC(glPushMatrix); LOAD_GL_FUNC(glReadPixels); LOAD_GL_FUNC(glSampleCoverage); LOAD_GL_FUNC(glScissor); LOAD_GL_FUNC(glShadeModel); LOAD_GL_FUNC(glStencilFunc); LOAD_GL_FUNC(glStencilMask); LOAD_GL_FUNC(glStencilOp); LOAD_GL_FUNC(glTexCoordPointer); LOAD_GL_FUNC(glTexEnvi); LOAD_GL_FUNC(glTexEnviv); LOAD_GL_FUNC(glTexImage2D); LOAD_GL_FUNC(glTexParameteri); LOAD_GL_FUNC(glTexParameteriv); LOAD_GL_FUNC(glTexSubImage2D); LOAD_GL_FUNC(glTranslatef); LOAD_GL_FUNC(glVertexPointer); LOAD_GL_FUNC(glViewport); m_isLoaded = true; }