Home | History | Annotate | Download | only in GLcommon
      1 /*
      2 * Copyright (C) 2011 The Android Open Source Project
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 * http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 
     17 #include <GLcommon/GLDispatch.h>
     18 #include <stdio.h>
     19 #include <OpenglOsUtils/osDynLibrary.h>
     20 
     21 #ifdef __linux__
     22 #include <GL/glx.h>
     23 #elif defined(WIN32)
     24 #include <windows.h>
     25 #endif
     26 
     27 #include "DummyGLfuncs.h"
     28 
     29 typedef void (*GL_FUNC_PTR)();
     30 
     31 static GL_FUNC_PTR getGLFuncAddress(const char *funcName) {
     32     GL_FUNC_PTR ret = NULL;
     33 #ifdef __linux__
     34     static osUtils::dynLibrary* libGL = osUtils::dynLibrary::open("libGL.so");
     35     ret = (GL_FUNC_PTR)glXGetProcAddress((const GLubyte*)funcName);
     36 #elif defined(WIN32)
     37     static osUtils::dynLibrary* libGL = osUtils::dynLibrary::open("opengl32");
     38     ret = (GL_FUNC_PTR)wglGetProcAddress(funcName);
     39 #elif defined(__APPLE__)
     40     static osUtils::dynLibrary* libGL = osUtils::dynLibrary::open("/System/Library/Frameworks/OpenGL.framework/OpenGL");
     41 #endif
     42     if(!ret && libGL){
     43         ret = libGL->findSymbol(funcName);
     44     }
     45     return ret;
     46 }
     47 
     48 #define LOAD_GL_FUNC(name)  do { \
     49         if (!name) { \
     50             void* funcAddress = (void *)getGLFuncAddress(#name); \
     51             if (funcAddress) { \
     52                 name = (__typeof__(name))(funcAddress); \
     53             } else { \
     54                 fprintf(stderr, "Could not load func %s\n", #name); \
     55                 name = (__typeof__(name))(dummy_##name); \
     56             } \
     57         } \
     58     } while (0)
     59 
     60 #define LOAD_GLEXT_FUNC(name) do { \
     61         if (!name) { \
     62             void* funcAddress = (void *)getGLFuncAddress(#name); \
     63             if (funcAddress) { \
     64                 name = (__typeof__(name))(funcAddress); \
     65             } \
     66         } \
     67     } while (0)
     68 
     69 /* initializing static GLDispatch members*/
     70 
     71 emugl::Mutex GLDispatch::s_lock;
     72 void (GLAPIENTRY *GLDispatch::glActiveTexture)(GLenum) = NULL;
     73 void (GLAPIENTRY *GLDispatch::glBindBuffer)(GLenum,GLuint) = NULL;
     74 void (GLAPIENTRY *GLDispatch::glBindTexture)(GLenum, GLuint) = NULL;
     75 void (GLAPIENTRY *GLDispatch::glBlendFunc)(GLenum,GLenum) = NULL;
     76 void (GLAPIENTRY *GLDispatch::glBlendEquation)(GLenum) = NULL;
     77 void (GLAPIENTRY *GLDispatch::glBlendEquationSeparate)(GLenum,GLenum) = NULL;
     78 void (GLAPIENTRY *GLDispatch::glBlendFuncSeparate)(GLenum,GLenum,GLenum,GLenum) = NULL;
     79 void (GLAPIENTRY *GLDispatch::glBufferData)(GLenum,GLsizeiptr,const GLvoid *,GLenum) = NULL;
     80 void (GLAPIENTRY *GLDispatch::glBufferSubData)(GLenum,GLintptr,GLsizeiptr,const GLvoid *) = NULL;
     81 void (GLAPIENTRY *GLDispatch::glClear)(GLbitfield) = NULL;
     82 void (GLAPIENTRY *GLDispatch::glClearColor)(GLclampf,GLclampf,GLclampf,GLclampf) = NULL;
     83 void (GLAPIENTRY *GLDispatch::glClearStencil)(GLint) = NULL;
     84 void (GLAPIENTRY *GLDispatch::glColorMask)(GLboolean,GLboolean,GLboolean,GLboolean) = NULL;
     85 void (GLAPIENTRY *GLDispatch::glCompressedTexImage2D)(GLenum,GLint,GLenum,GLsizei,GLsizei,GLint,GLsizei, const GLvoid *) = NULL;
     86 void (GLAPIENTRY *GLDispatch::glCompressedTexSubImage2D)(GLenum,GLint,GLint,GLint,GLsizei,GLsizei,GLenum,GLsizei,const GLvoid *) = NULL;
     87 void (GLAPIENTRY *GLDispatch::glCopyTexImage2D)(GLenum,GLint,GLenum,GLint,GLint,GLsizei,GLsizei,GLint) = NULL;
     88 void (GLAPIENTRY *GLDispatch::glCopyTexSubImage2D)(GLenum,GLint,GLint,GLint,GLint,GLint,GLsizei,GLsizei) = NULL;
     89 void (GLAPIENTRY *GLDispatch::glCullFace)(GLenum) = NULL;
     90 void (GLAPIENTRY *GLDispatch::glDeleteBuffers)(GLsizei,const GLuint *) = NULL;
     91 void (GLAPIENTRY *GLDispatch::glDeleteTextures)(GLsizei,const GLuint *) = NULL;
     92 void (GLAPIENTRY *GLDispatch::glDepthFunc)(GLenum) = NULL;
     93 void (GLAPIENTRY *GLDispatch::glDepthMask)(GLboolean) = NULL;
     94 void (GLAPIENTRY *GLDispatch::glDepthRange)(GLclampd,GLclampd) = NULL;
     95 void (GLAPIENTRY *GLDispatch::glDisable)(GLenum) = NULL;
     96 void (GLAPIENTRY *GLDispatch::glDrawArrays)(GLenum,GLint,GLsizei) = NULL;
     97 void (GLAPIENTRY *GLDispatch::glDrawElements)(GLenum,GLsizei,GLenum,const GLvoid *) = NULL;
     98 void (GLAPIENTRY *GLDispatch::glEnable)(GLenum) = NULL;
     99 void (GLAPIENTRY *GLDispatch::glFinish)() = NULL;
    100 void (GLAPIENTRY *GLDispatch::glFlush)() = NULL;
    101 void (GLAPIENTRY *GLDispatch::glFrontFace)(GLenum) = NULL;
    102 void (GLAPIENTRY *GLDispatch::glGenBuffers)(GLsizei,GLuint *) = NULL;
    103 void (GLAPIENTRY *GLDispatch::glGenTextures)(GLsizei,GLuint *) = NULL;
    104 void (GLAPIENTRY *GLDispatch::glGetBooleanv)(GLenum,GLboolean *) = NULL;
    105 void (GLAPIENTRY *GLDispatch::glGetBufferParameteriv)(GLenum, GLenum, GLint *) = NULL;
    106 GLenum (GLAPIENTRY *GLDispatch::glGetError)() = NULL;
    107 void (GLAPIENTRY *GLDispatch::glGetFloatv)(GLenum,GLfloat *) = NULL;
    108 void (GLAPIENTRY *GLDispatch::glGetIntegerv)(GLenum,GLint *) = NULL;
    109 const GLubyte * (GLAPIENTRY *GLDispatch::glGetString) (GLenum) = NULL;
    110 void (GLAPIENTRY *GLDispatch::glGetTexParameterfv)(GLenum,GLenum,GLfloat *) = NULL;
    111 void (GLAPIENTRY *GLDispatch::glGetTexParameteriv)(GLenum,GLenum,GLint *) = NULL;
    112 void (GLAPIENTRY *GLDispatch::glGetTexLevelParameteriv) (GLenum target, GLint level, GLenum pname, GLint *params) = NULL;
    113 void (GLAPIENTRY *GLDispatch::glHint)(GLenum,GLenum) = NULL;
    114 GLboolean (GLAPIENTRY *GLDispatch::glIsBuffer)(GLuint) = NULL;
    115 GLboolean (GLAPIENTRY *GLDispatch::glIsEnabled)(GLenum) = NULL;
    116 GLboolean (GLAPIENTRY *GLDispatch::glIsTexture)(GLuint) = NULL;
    117 void (GLAPIENTRY *GLDispatch::glLineWidth)(GLfloat) = NULL;
    118 void (GLAPIENTRY *GLDispatch::glPolygonOffset)(GLfloat, GLfloat) = NULL;
    119 void (GLAPIENTRY *GLDispatch::glPixelStorei)(GLenum,GLint) = NULL;
    120 void (GLAPIENTRY *GLDispatch::glReadPixels)(GLint,GLint,GLsizei,GLsizei,GLenum,GLenum,GLvoid *) = NULL;
    121 void (GLAPIENTRY *GLDispatch::glSampleCoverage)(GLclampf,GLboolean) = NULL;
    122 void (GLAPIENTRY *GLDispatch::glScissor)(GLint,GLint,GLsizei,GLsizei) = NULL;
    123 void (GLAPIENTRY *GLDispatch::glStencilFunc)(GLenum,GLint,GLuint) = NULL;
    124 void (GLAPIENTRY *GLDispatch::glStencilMask)(GLuint) = NULL;
    125 void (GLAPIENTRY *GLDispatch::glStencilOp)(GLenum, GLenum,GLenum);
    126 void (GLAPIENTRY *GLDispatch::glTexImage2D)(GLenum,GLint,GLint,GLsizei,GLsizei,GLint,GLenum,GLenum,const GLvoid *) = NULL;
    127 void (GLAPIENTRY *GLDispatch::glTexParameterf)(GLenum,GLenum, GLfloat) = NULL;
    128 void (GLAPIENTRY *GLDispatch::glTexParameterfv)(GLenum,GLenum,const GLfloat *) = NULL;
    129 void (GLAPIENTRY *GLDispatch::glTexParameteri)(GLenum,GLenum,GLint) = NULL;
    130 void (GLAPIENTRY *GLDispatch::glTexParameteriv)(GLenum,GLenum,const GLint *) = NULL;
    131 void (GLAPIENTRY *GLDispatch::glTexSubImage2D)(GLenum,GLint,GLint,GLint,GLsizei,GLsizei,GLenum,GLenum,const GLvoid *) = NULL;
    132 void (GLAPIENTRY *GLDispatch::glViewport)(GLint,GLint,GLsizei,GLsizei) = NULL;
    133 void (GLAPIENTRY *GLDispatch::glPushAttrib) ( GLbitfield mask ) = NULL;
    134 void (GLAPIENTRY *GLDispatch::glPopAttrib) ( void ) = NULL;
    135 void (GLAPIENTRY *GLDispatch::glPushClientAttrib) ( GLbitfield mask ) = NULL;
    136 void (GLAPIENTRY *GLDispatch::glPopClientAttrib) ( void ) = NULL;
    137 
    138 /*GLES 1.1*/
    139 void (GLAPIENTRY *GLDispatch::glAlphaFunc)(GLenum,GLclampf) = NULL;
    140 void (GLAPIENTRY *GLDispatch::glBegin)(GLenum) = NULL;
    141 void (GLAPIENTRY *GLDispatch::glClearDepth)(GLclampd) = NULL;
    142 void (GLAPIENTRY *GLDispatch::glClientActiveTexture)(GLenum) = NULL;
    143 void (GLAPIENTRY *GLDispatch::glClipPlane)(GLenum,const GLdouble *) = NULL;
    144 void (GLAPIENTRY *GLDispatch::glColor4d)(GLdouble,GLdouble,GLdouble,GLdouble) = NULL;
    145 void (GLAPIENTRY *GLDispatch::glColor4f)(GLfloat,GLfloat,GLfloat,GLfloat) = NULL;
    146 void (GLAPIENTRY *GLDispatch::glColor4fv)(const GLfloat *) = NULL;
    147 void (GLAPIENTRY *GLDispatch::glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte) = NULL;
    148 void (GLAPIENTRY *GLDispatch::glColor4ubv)(const GLubyte *) = NULL;
    149 void (GLAPIENTRY *GLDispatch::glColorPointer)(GLint,GLenum,GLsizei,const GLvoid *) = NULL;
    150 void (GLAPIENTRY *GLDispatch::glDisableClientState)(GLenum) = NULL;
    151 void (GLAPIENTRY *GLDispatch::glEnableClientState)(GLenum) = NULL;
    152 void (GLAPIENTRY *GLDispatch::glEnd)() = NULL;
    153 void (GLAPIENTRY *GLDispatch::glFogf)(GLenum, GLfloat) = NULL;
    154 void (GLAPIENTRY *GLDispatch::glFogfv)(GLenum,const GLfloat *);
    155 void (GLAPIENTRY *GLDispatch::glFrustum)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble) = NULL;
    156 void (GLAPIENTRY *GLDispatch::glGetClipPlane)(GLenum,GLdouble *) = NULL;
    157 void (GLAPIENTRY *GLDispatch::glGetDoublev)(GLenum,GLdouble *) = NULL;
    158 void (GLAPIENTRY *GLDispatch::glGetLightfv)(GLenum,GLenum,GLfloat *) = NULL;
    159 void (GLAPIENTRY *GLDispatch::glGetMaterialfv)(GLenum,GLenum,GLfloat *) = NULL;
    160 void (GLAPIENTRY *GLDispatch::glGetPointerv)(GLenum,GLvoid**) = NULL;
    161 void (GLAPIENTRY *GLDispatch::glGetTexEnvfv)(GLenum,GLenum,GLfloat *) = NULL;
    162 void (GLAPIENTRY *GLDispatch::glGetTexEnviv)(GLenum,GLenum,GLint *)= NULL;
    163 void (GLAPIENTRY *GLDispatch::glLightf)(GLenum,GLenum,GLfloat) = NULL;
    164 void (GLAPIENTRY *GLDispatch::glLightfv)(GLenum,GLenum,const GLfloat *) = NULL;
    165 void (GLAPIENTRY *GLDispatch::glLightModelf)(GLenum,GLfloat) = NULL;
    166 void (GLAPIENTRY *GLDispatch::glLightModelfv)(GLenum,const GLfloat *) = NULL;
    167 void (GLAPIENTRY *GLDispatch::glLoadIdentity)() = NULL;
    168 void (GLAPIENTRY *GLDispatch::glLoadMatrixf)(const GLfloat *) = NULL;
    169 void (GLAPIENTRY *GLDispatch::glLogicOp)(GLenum) = NULL;
    170 void (GLAPIENTRY *GLDispatch::glMaterialf)(GLenum,GLenum,GLfloat) = NULL;
    171 void (GLAPIENTRY *GLDispatch::glMaterialfv)(GLenum,GLenum,const GLfloat *);
    172 void (GLAPIENTRY *GLDispatch::glMultiTexCoord2fv)(GLenum, const GLfloat *) = NULL;
    173 void (GLAPIENTRY *GLDispatch::glMultiTexCoord2sv)(GLenum, const GLshort *) = NULL;
    174 void (GLAPIENTRY *GLDispatch::glMultiTexCoord3fv)(GLenum, const GLfloat *) = NULL;
    175 void (GLAPIENTRY *GLDispatch::glMultiTexCoord3sv)(GLenum,const GLshort *) = NULL;
    176 void (GLAPIENTRY *GLDispatch::glMultiTexCoord4f)(GLenum,GLfloat,GLfloat,GLfloat,GLfloat) = NULL;
    177 void (GLAPIENTRY *GLDispatch::glMultiTexCoord4fv)(GLenum,const GLfloat *) = NULL;
    178 void (GLAPIENTRY *GLDispatch::glMultiTexCoord4sv)(GLenum,const GLshort *) = NULL;
    179 void (GLAPIENTRY *GLDispatch::glMultMatrixf)(const GLfloat *) = NULL;
    180 void (GLAPIENTRY *GLDispatch::glNormal3f)(GLfloat,GLfloat,GLfloat) = NULL;
    181 void (GLAPIENTRY *GLDispatch::glNormal3fv)(const GLfloat *) = NULL;
    182 void (GLAPIENTRY *GLDispatch::glNormal3sv)(const GLshort *) = NULL;
    183 void (GLAPIENTRY *GLDispatch::glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble) = NULL;
    184 void (GLAPIENTRY *GLDispatch::glPointParameterf)(GLenum, GLfloat) = NULL;
    185 void (GLAPIENTRY *GLDispatch::glPointParameterfv)(GLenum, const GLfloat *) = NULL;
    186 void (GLAPIENTRY *GLDispatch::glPointSize)(GLfloat) = NULL;
    187 void (GLAPIENTRY *GLDispatch::glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat) = NULL;
    188 void (GLAPIENTRY *GLDispatch::glScalef)(GLfloat,GLfloat,GLfloat) = NULL;
    189 void (GLAPIENTRY *GLDispatch::glTexEnvf)(GLenum,GLenum,GLfloat) = NULL;
    190 void (GLAPIENTRY *GLDispatch::glTexEnvfv)(GLenum,GLenum,const GLfloat *) = NULL;
    191 void (GLAPIENTRY *GLDispatch::glMatrixMode)(GLenum) = NULL;
    192 void (GLAPIENTRY *GLDispatch::glNormalPointer)(GLenum,GLsizei,const GLvoid *) = NULL;
    193 void (GLAPIENTRY *GLDispatch::glPopMatrix)() = NULL;
    194 void (GLAPIENTRY *GLDispatch::glPushMatrix)() = NULL;
    195 void (GLAPIENTRY *GLDispatch::glShadeModel)(GLenum) = NULL;
    196 void (GLAPIENTRY *GLDispatch::glTexCoordPointer)(GLint,GLenum, GLsizei, const GLvoid*) = NULL;
    197 void (GLAPIENTRY *GLDispatch::glTexEnvi)(GLenum ,GLenum,GLint) = NULL;
    198 void (GLAPIENTRY *GLDispatch::glTexEnviv)(GLenum, GLenum, const GLint *) = NULL;
    199 void (GLAPIENTRY *GLDispatch::glTranslatef)(GLfloat,GLfloat, GLfloat) = NULL;
    200 void (GLAPIENTRY *GLDispatch::glVertexPointer)(GLint,GLenum,GLsizei, const GLvoid *) = NULL;
    201 
    202 /* GLES 1.1 EXTENSIONS*/
    203 GLboolean (GLAPIENTRY *GLDispatch::glIsRenderbufferEXT) (GLuint renderbuffer) = NULL;
    204 void (GLAPIENTRY *GLDispatch::glBindRenderbufferEXT) (GLenum target, GLuint renderbuffer) = NULL;
    205 void (GLAPIENTRY *GLDispatch::glDeleteRenderbuffersEXT) (GLsizei n, const GLuint *renderbuffers) = NULL;
    206 void (GLAPIENTRY *GLDispatch::glGenRenderbuffersEXT) (GLsizei n, GLuint *renderbuffers) = NULL;
    207 void (GLAPIENTRY *GLDispatch::glRenderbufferStorageEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
    208 void (GLAPIENTRY *GLDispatch::glGetRenderbufferParameterivEXT) (GLenum target, GLenum pname, GLint *params) = NULL;
    209 GLboolean (GLAPIENTRY *GLDispatch::glIsFramebufferEXT) (GLuint framebuffer) = NULL;
    210 void (GLAPIENTRY *GLDispatch::glBindFramebufferEXT) (GLenum target, GLuint framebuffer) = NULL;
    211 void (GLAPIENTRY *GLDispatch::glDeleteFramebuffersEXT) (GLsizei n, const GLuint *framebuffers) = NULL;
    212 void (GLAPIENTRY *GLDispatch::glGenFramebuffersEXT) (GLsizei n, GLuint *framebuffers) = NULL;
    213 GLenum (GLAPIENTRY *GLDispatch::glCheckFramebufferStatusEXT) (GLenum target) = NULL;
    214 void (GLAPIENTRY *GLDispatch::glFramebufferTexture1DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
    215 void (GLAPIENTRY *GLDispatch::glFramebufferTexture2DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
    216 void (GLAPIENTRY *GLDispatch::glFramebufferTexture3DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) = NULL;
    217 void (GLAPIENTRY *GLDispatch::glFramebufferRenderbufferEXT) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL;
    218 void (GLAPIENTRY *GLDispatch::glGetFramebufferAttachmentParameterivEXT) (GLenum target, GLenum attachment, GLenum pname, GLint *params) = NULL;
    219 void (GLAPIENTRY *GLDispatch::glGenerateMipmapEXT) (GLenum target) = NULL;
    220 void (GLAPIENTRY *GLDispatch::glCurrentPaletteMatrixARB) (GLint index) = NULL;
    221 void (GLAPIENTRY *GLDispatch::glMatrixIndexuivARB) (GLint size, GLuint * indices) = NULL;
    222 void (GLAPIENTRY *GLDispatch::glMatrixIndexPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) = NULL;
    223 void (GLAPIENTRY *GLDispatch::glWeightPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) = NULL;
    224 void (GLAPIENTRY *GLDispatch::glTexGenf) (GLenum coord, GLenum pname, GLfloat param ) = NULL;
    225 void (GLAPIENTRY *GLDispatch::glTexGeni) (GLenum coord, GLenum pname, GLint param ) = NULL;
    226 void (GLAPIENTRY *GLDispatch::glTexGenfv) (GLenum coord, GLenum pname, const GLfloat *params ) = NULL;
    227 void (GLAPIENTRY *GLDispatch::glTexGeniv) (GLenum coord, GLenum pname, const GLint *params ) = NULL;
    228 void (GLAPIENTRY *GLDispatch::glGetTexGenfv) (GLenum coord, GLenum pname, GLfloat *params ) = NULL;
    229 void (GLAPIENTRY *GLDispatch::glGetTexGeniv) (GLenum coord, GLenum pname, GLint *params ) = NULL;
    230 
    231 /* GLES 2.0*/
    232 void (GL_APIENTRY *GLDispatch::glBlendColor)(GLclampf,GLclampf,GLclampf,GLclampf) = NULL;
    233 void (GL_APIENTRY *GLDispatch::glStencilFuncSeparate)(GLenum,GLenum,GLint,GLuint) = NULL;
    234 void (GL_APIENTRY *GLDispatch::glStencilMaskSeparate)(GLenum,GLuint) = NULL;
    235 GLboolean (GL_APIENTRY *GLDispatch::glIsProgram)(GLuint program) = NULL;
    236 GLboolean (GL_APIENTRY *GLDispatch::glIsShader)(GLuint shader) = NULL;
    237 void (GL_APIENTRY *GLDispatch::glVertexAttrib1f)(GLuint,GLfloat) = NULL;
    238 void (GL_APIENTRY *GLDispatch::glVertexAttrib1fv)(GLuint,const GLfloat*) = NULL;
    239 void (GL_APIENTRY *GLDispatch::glVertexAttrib2f)(GLuint,GLfloat, GLfloat) = NULL;
    240 void (GL_APIENTRY *GLDispatch::glVertexAttrib2fv)(GLuint,const GLfloat*) = NULL;
    241 void (GL_APIENTRY *GLDispatch::glVertexAttrib3f)(GLuint,GLfloat, GLfloat,GLfloat) = NULL;
    242 void (GL_APIENTRY *GLDispatch::glVertexAttrib3fv)(GLuint,const GLfloat*) = NULL;
    243 void (GL_APIENTRY *GLDispatch::glVertexAttrib4f)(GLuint,GLfloat,GLfloat,GLfloat,GLfloat ) = NULL;
    244 void (GL_APIENTRY *GLDispatch::glVertexAttrib4fv)(GLuint,const GLfloat*) = NULL;
    245 void (GL_APIENTRY *GLDispatch::glVertexAttribPointer)(GLuint,GLint,GLenum,GLboolean,GLsizei,const GLvoid*) = NULL;
    246 void (GL_APIENTRY *GLDispatch::glDisableVertexAttribArray)(GLuint) = NULL;
    247 void (GL_APIENTRY *GLDispatch::glEnableVertexAttribArray)(GLuint) = NULL;
    248 void (GL_APIENTRY *GLDispatch::glGetVertexAttribfv)(GLuint,GLenum,GLfloat*) = NULL;
    249 void (GL_APIENTRY *GLDispatch::glGetVertexAttribiv)(GLuint,GLenum,GLint*) = NULL;
    250 void (GL_APIENTRY *GLDispatch::glGetVertexAttribPointerv)(GLuint,GLenum,GLvoid**) = NULL;
    251 void (GL_APIENTRY *GLDispatch::glUniform1f)(GLint,GLfloat) = NULL;
    252 void (GL_APIENTRY *GLDispatch::glUniform1fv)(GLint,GLsizei,const GLfloat*) = NULL;
    253 void (GL_APIENTRY *GLDispatch::glUniform1i)(GLint,GLint) = NULL;
    254 void (GL_APIENTRY *GLDispatch::glUniform1iv)(GLint,GLsizei,const GLint*) = NULL;
    255 void (GL_APIENTRY *GLDispatch::glUniform2f)(GLint,GLfloat,GLfloat) = NULL;
    256 void (GL_APIENTRY *GLDispatch::glUniform2fv)(GLint,GLsizei,const GLfloat*) = NULL;
    257 void (GL_APIENTRY *GLDispatch::glUniform2i)(GLint,GLint,GLint) = NULL;
    258 void (GL_APIENTRY *GLDispatch::glUniform2iv)(GLint ,GLsizei,const GLint*) = NULL;
    259 void (GL_APIENTRY *GLDispatch::glUniform3f)(GLint,GLfloat,GLfloat,GLfloat) = NULL;
    260 void (GL_APIENTRY *GLDispatch::glUniform3fv)(GLint,GLsizei,const GLfloat*) = NULL;
    261 void (GL_APIENTRY *GLDispatch::glUniform3i)(GLint,GLint,GLint,GLint) = NULL;
    262 void (GL_APIENTRY *GLDispatch::glUniform3iv)(GLint,GLsizei,const GLint*) = NULL;
    263 void (GL_APIENTRY *GLDispatch::glUniform4f)(GLint,GLfloat,GLfloat,GLfloat,GLfloat) = NULL;
    264 void (GL_APIENTRY *GLDispatch::glUniform4fv)(GLint,GLsizei,const GLfloat*) = NULL;
    265 void (GL_APIENTRY *GLDispatch::glUniform4i)(GLint,GLint,GLint,GLint,GLint) = NULL;
    266 void (GL_APIENTRY *GLDispatch::glUniform4iv)(GLint,GLsizei,const GLint*) = NULL;
    267 void (GL_APIENTRY *GLDispatch::glUniformMatrix2fv)(GLint,GLsizei,GLboolean,const GLfloat*) = NULL;
    268 void (GL_APIENTRY *GLDispatch::glUniformMatrix3fv)(GLint,GLsizei,GLboolean,const GLfloat*) = NULL;
    269 void (GL_APIENTRY *GLDispatch::glUniformMatrix4fv)(GLint,GLsizei,GLboolean,const GLfloat*) = NULL;
    270 void (GL_APIENTRY *GLDispatch::glAttachShader)(GLuint,GLuint) = NULL;
    271 void (GL_APIENTRY *GLDispatch::glBindAttribLocation)(GLuint,GLuint,const GLchar*) = NULL;
    272 void (GL_APIENTRY *GLDispatch::glCompileShader)(GLuint) = NULL;
    273 GLuint (GL_APIENTRY *GLDispatch::glCreateProgram)() = NULL;
    274 GLuint (GL_APIENTRY *GLDispatch::glCreateShader)(GLenum) = NULL;
    275 void (GL_APIENTRY *GLDispatch::glDeleteProgram)(GLuint) = NULL;
    276 void (GL_APIENTRY *GLDispatch::glDeleteShader)(GLuint) = NULL;
    277 void (GL_APIENTRY *GLDispatch::glDetachShader)(GLuint,GLuint) = NULL;
    278 void (GL_APIENTRY *GLDispatch::glLinkProgram)(GLuint) = NULL;
    279 void (GL_APIENTRY *GLDispatch::glUseProgram)(GLuint) = NULL;
    280 void (GL_APIENTRY *GLDispatch::glValidateProgram)(GLuint) = NULL;
    281 void (GL_APIENTRY *GLDispatch::glGetActiveAttrib)(GLuint,GLuint,GLsizei,GLsizei*,GLint*,GLenum*,GLchar*) = NULL;
    282 void (GL_APIENTRY *GLDispatch::glGetActiveUniform)(GLuint,GLuint,GLsizei,GLsizei*,GLint*,GLenum*,GLchar*) = NULL;
    283 void (GL_APIENTRY *GLDispatch::glGetAttachedShaders)(GLuint,GLsizei,GLsizei*,GLuint*) = NULL;
    284 int  (GL_APIENTRY *GLDispatch::glGetAttribLocation)(GLuint,const GLchar*) = NULL;
    285 void (GL_APIENTRY *GLDispatch::glGetProgramiv)(GLuint,GLenum,GLint*) = NULL;
    286 void (GL_APIENTRY *GLDispatch::glGetProgramInfoLog)(GLuint,GLsizei,GLsizei*,GLchar*) = NULL;
    287 void (GL_APIENTRY *GLDispatch::glGetShaderiv)(GLuint,GLenum,GLint*) = NULL;
    288 void (GL_APIENTRY *GLDispatch::glGetShaderInfoLog)(GLuint,GLsizei,GLsizei*,GLchar*) = NULL;
    289 void (GL_APIENTRY *GLDispatch::glGetShaderPrecisionFormat)(GLenum,GLenum,GLint*,GLint*) = NULL;
    290 void (GL_APIENTRY *GLDispatch::glGetShaderSource)(GLuint,GLsizei,GLsizei*,GLchar*) = NULL;
    291 void (GL_APIENTRY *GLDispatch::glGetUniformfv)(GLuint,GLint,GLfloat*) = NULL;
    292 void (GL_APIENTRY *GLDispatch::glGetUniformiv)(GLuint,GLint,GLint*) = NULL;
    293 int  (GL_APIENTRY *GLDispatch::glGetUniformLocation)(GLuint,const GLchar*) = NULL;
    294 void (GL_APIENTRY *GLDispatch::glReleaseShaderCompiler)() = NULL;
    295 void (GL_APIENTRY *GLDispatch::glShaderBinary)(GLsizei,const GLuint*,GLenum,const GLvoid*,GLsizei) = NULL;
    296 void (GL_APIENTRY *GLDispatch::glShaderSource)(GLuint,GLsizei,const GLchar**,const GLint*) = NULL;
    297 
    298 GLDispatch::GLDispatch():m_isLoaded(false){};
    299 
    300 
    301 void GLDispatch::dispatchFuncs(GLESVersion version){
    302     emugl::Mutex::AutoLock mutex(s_lock);
    303     if(m_isLoaded)
    304         return;
    305 
    306     /* Loading OpenGL functions which are needed for implementing BOTH GLES 1.1 & GLES 2.0*/
    307     LOAD_GL_FUNC(glActiveTexture);
    308     LOAD_GL_FUNC(glBindBuffer);
    309     LOAD_GL_FUNC(glBindTexture);
    310     LOAD_GL_FUNC(glBlendFunc);
    311     LOAD_GL_FUNC(glBlendEquation);
    312     LOAD_GL_FUNC(glBlendEquationSeparate);
    313     LOAD_GL_FUNC(glBlendFuncSeparate);
    314     LOAD_GL_FUNC(glBufferData);
    315     LOAD_GL_FUNC(glBufferSubData);
    316     LOAD_GL_FUNC(glClear);
    317     LOAD_GL_FUNC(glClearColor);
    318     LOAD_GL_FUNC(glClearDepth);
    319     LOAD_GL_FUNC(glClearStencil);
    320     LOAD_GL_FUNC(glColorMask);
    321     LOAD_GL_FUNC(glCompressedTexImage2D);
    322     LOAD_GL_FUNC(glCompressedTexSubImage2D);
    323     LOAD_GL_FUNC(glCopyTexImage2D);
    324     LOAD_GL_FUNC(glCopyTexSubImage2D);
    325     LOAD_GL_FUNC(glCullFace);
    326     LOAD_GL_FUNC(glDeleteBuffers);
    327     LOAD_GL_FUNC(glDeleteTextures);
    328     LOAD_GL_FUNC(glDepthFunc);
    329     LOAD_GL_FUNC(glDepthMask);
    330     LOAD_GL_FUNC(glDepthRange);
    331     LOAD_GL_FUNC(glDisable);
    332     LOAD_GL_FUNC(glDrawArrays);
    333     LOAD_GL_FUNC(glDrawElements);
    334     LOAD_GL_FUNC(glEnable);
    335     LOAD_GL_FUNC(glFinish);
    336     LOAD_GL_FUNC(glFlush);
    337     LOAD_GL_FUNC(glFrontFace);
    338     LOAD_GL_FUNC(glGenBuffers);
    339     LOAD_GL_FUNC(glGenTextures);
    340     LOAD_GL_FUNC(glGetBooleanv);
    341     LOAD_GL_FUNC(glGetBufferParameteriv);
    342     LOAD_GL_FUNC(glGetError);
    343     LOAD_GL_FUNC(glGetFloatv);
    344     LOAD_GL_FUNC(glGetIntegerv);
    345     LOAD_GL_FUNC(glGetString);
    346     LOAD_GL_FUNC(glTexParameterf);
    347     LOAD_GL_FUNC(glTexParameterfv);
    348     LOAD_GL_FUNC(glGetTexParameterfv);
    349     LOAD_GL_FUNC(glGetTexParameteriv);
    350     LOAD_GL_FUNC(glGetTexLevelParameteriv);
    351     LOAD_GL_FUNC(glHint);
    352     LOAD_GL_FUNC(glIsBuffer);
    353     LOAD_GL_FUNC(glIsEnabled);
    354     LOAD_GL_FUNC(glIsTexture);
    355     LOAD_GL_FUNC(glLineWidth);
    356     LOAD_GL_FUNC(glPolygonOffset);
    357     LOAD_GL_FUNC(glPixelStorei);
    358     LOAD_GL_FUNC(glReadPixels);
    359     LOAD_GL_FUNC(glSampleCoverage);
    360     LOAD_GL_FUNC(glScissor);
    361     LOAD_GL_FUNC(glStencilFunc);
    362     LOAD_GL_FUNC(glStencilMask);
    363     LOAD_GL_FUNC(glStencilOp);
    364     LOAD_GL_FUNC(glTexImage2D);
    365     LOAD_GL_FUNC(glTexParameteri);
    366     LOAD_GL_FUNC(glTexParameteriv);
    367     LOAD_GL_FUNC(glTexSubImage2D);
    368     LOAD_GL_FUNC(glViewport);
    369     LOAD_GL_FUNC(glPushAttrib);
    370     LOAD_GL_FUNC(glPushClientAttrib);
    371     LOAD_GL_FUNC(glPopAttrib);
    372     LOAD_GL_FUNC(glPopClientAttrib);
    373     LOAD_GLEXT_FUNC(glIsRenderbufferEXT);
    374     LOAD_GLEXT_FUNC(glBindRenderbufferEXT);
    375     LOAD_GLEXT_FUNC(glDeleteRenderbuffersEXT);
    376     LOAD_GLEXT_FUNC(glGenRenderbuffersEXT);
    377     LOAD_GLEXT_FUNC(glRenderbufferStorageEXT);
    378     LOAD_GLEXT_FUNC(glGetRenderbufferParameterivEXT);
    379     LOAD_GLEXT_FUNC(glIsFramebufferEXT);
    380     LOAD_GLEXT_FUNC(glBindFramebufferEXT);
    381     LOAD_GLEXT_FUNC(glDeleteFramebuffersEXT);
    382     LOAD_GLEXT_FUNC(glGenFramebuffersEXT);
    383     LOAD_GLEXT_FUNC(glCheckFramebufferStatusEXT);
    384     LOAD_GLEXT_FUNC(glFramebufferTexture1DEXT);
    385     LOAD_GLEXT_FUNC(glFramebufferTexture2DEXT);
    386     LOAD_GLEXT_FUNC(glFramebufferTexture3DEXT);
    387     LOAD_GLEXT_FUNC(glFramebufferRenderbufferEXT);
    388     LOAD_GLEXT_FUNC(glGetFramebufferAttachmentParameterivEXT);
    389     LOAD_GLEXT_FUNC(glGenerateMipmapEXT);
    390 
    391     /* Loading OpenGL functions which are needed ONLY for implementing GLES 1.1*/
    392     if(version == GLES_1_1){
    393         LOAD_GL_FUNC(glAlphaFunc);
    394         LOAD_GL_FUNC(glBegin);
    395         LOAD_GL_FUNC(glClientActiveTexture);
    396         LOAD_GL_FUNC(glClipPlane);
    397         LOAD_GL_FUNC(glColor4d);
    398         LOAD_GL_FUNC(glColor4f);
    399         LOAD_GL_FUNC(glColor4fv);
    400         LOAD_GL_FUNC(glColor4ub);
    401         LOAD_GL_FUNC(glColor4ubv);
    402         LOAD_GL_FUNC(glColorPointer);
    403         LOAD_GL_FUNC(glDisableClientState);
    404         LOAD_GL_FUNC(glEnableClientState);
    405         LOAD_GL_FUNC(glEnd);
    406         LOAD_GL_FUNC(glFogf);
    407         LOAD_GL_FUNC(glFogfv);
    408         LOAD_GL_FUNC(glFrustum);
    409         LOAD_GL_FUNC(glGetClipPlane);
    410         LOAD_GL_FUNC(glGetDoublev);
    411         LOAD_GL_FUNC(glGetLightfv);
    412         LOAD_GL_FUNC(glGetMaterialfv);
    413         LOAD_GL_FUNC(glGetPointerv);
    414         LOAD_GL_FUNC(glGetTexEnvfv);
    415         LOAD_GL_FUNC(glGetTexEnviv);
    416         LOAD_GL_FUNC(glLightf);
    417         LOAD_GL_FUNC(glLightfv);
    418         LOAD_GL_FUNC(glLightModelf);
    419         LOAD_GL_FUNC(glLightModelfv);
    420         LOAD_GL_FUNC(glLoadIdentity);
    421         LOAD_GL_FUNC(glLoadMatrixf);
    422         LOAD_GL_FUNC(glLogicOp);
    423         LOAD_GL_FUNC(glMaterialf);
    424         LOAD_GL_FUNC(glMaterialfv);
    425         LOAD_GL_FUNC(glMultiTexCoord2fv);
    426         LOAD_GL_FUNC(glMultiTexCoord2sv);
    427         LOAD_GL_FUNC(glMultiTexCoord3fv);
    428         LOAD_GL_FUNC(glMultiTexCoord3sv);
    429         LOAD_GL_FUNC(glMultiTexCoord4fv);
    430         LOAD_GL_FUNC(glMultiTexCoord4sv);
    431         LOAD_GL_FUNC(glMultiTexCoord4f);
    432         LOAD_GL_FUNC(glMultMatrixf);
    433         LOAD_GL_FUNC(glNormal3f);
    434         LOAD_GL_FUNC(glNormal3fv);
    435         LOAD_GL_FUNC(glNormal3sv);
    436         LOAD_GL_FUNC(glOrtho);
    437         LOAD_GL_FUNC(glPointParameterf);
    438         LOAD_GL_FUNC(glPointParameterfv);
    439         LOAD_GL_FUNC(glPointSize);
    440         LOAD_GL_FUNC(glRotatef);
    441         LOAD_GL_FUNC(glScalef);
    442         LOAD_GL_FUNC(glTexEnvf);
    443         LOAD_GL_FUNC(glTexEnvfv);
    444         LOAD_GL_FUNC(glMatrixMode);
    445         LOAD_GL_FUNC(glNormalPointer);
    446         LOAD_GL_FUNC(glPopMatrix);
    447         LOAD_GL_FUNC(glPushMatrix);
    448         LOAD_GL_FUNC(glShadeModel);
    449         LOAD_GL_FUNC(glTexCoordPointer);
    450         LOAD_GL_FUNC(glTexEnvi);
    451         LOAD_GL_FUNC(glTexEnviv);
    452         LOAD_GL_FUNC(glTranslatef);
    453         LOAD_GL_FUNC(glVertexPointer);
    454 
    455         LOAD_GLEXT_FUNC(glCurrentPaletteMatrixARB);
    456         LOAD_GLEXT_FUNC(glMatrixIndexuivARB);
    457         LOAD_GLEXT_FUNC(glMatrixIndexPointerARB);
    458         LOAD_GLEXT_FUNC(glWeightPointerARB);
    459         LOAD_GLEXT_FUNC(glTexGenf);
    460         LOAD_GLEXT_FUNC(glTexGeni);
    461         LOAD_GLEXT_FUNC(glTexGenfv);
    462         LOAD_GLEXT_FUNC(glTexGeniv);
    463         LOAD_GLEXT_FUNC(glGetTexGenfv);
    464         LOAD_GLEXT_FUNC(glGetTexGeniv);
    465 
    466     } else if (version == GLES_2_0){
    467 
    468     /* Loading OpenGL functions which are needed ONLY for implementing GLES 2.0*/
    469 
    470         LOAD_GL_FUNC(glBlendColor);
    471         LOAD_GL_FUNC(glBlendFuncSeparate);
    472         LOAD_GL_FUNC(glStencilFuncSeparate);
    473         LOAD_GL_FUNC(glIsProgram);
    474         LOAD_GL_FUNC(glIsShader);
    475         LOAD_GL_FUNC(glVertexAttrib1f);
    476         LOAD_GL_FUNC(glVertexAttrib1fv);
    477         LOAD_GL_FUNC(glVertexAttrib2f);
    478         LOAD_GL_FUNC(glVertexAttrib2fv);
    479         LOAD_GL_FUNC(glVertexAttrib3f);
    480         LOAD_GL_FUNC(glVertexAttrib3fv);
    481         LOAD_GL_FUNC(glVertexAttrib4f);
    482         LOAD_GL_FUNC(glVertexAttrib4fv);
    483         LOAD_GL_FUNC(glVertexAttribPointer);
    484         LOAD_GL_FUNC(glDisableVertexAttribArray);
    485         LOAD_GL_FUNC(glEnableVertexAttribArray);
    486         LOAD_GL_FUNC(glGetVertexAttribfv);
    487         LOAD_GL_FUNC(glGetVertexAttribiv);
    488         LOAD_GL_FUNC(glGetVertexAttribPointerv);
    489         LOAD_GL_FUNC(glUniform1f);
    490         LOAD_GL_FUNC(glUniform1fv);
    491         LOAD_GL_FUNC(glUniform1i);
    492         LOAD_GL_FUNC(glUniform1iv);
    493         LOAD_GL_FUNC(glUniform2f);
    494         LOAD_GL_FUNC(glUniform2fv);
    495         LOAD_GL_FUNC(glUniform2i);
    496         LOAD_GL_FUNC(glUniform2iv);
    497         LOAD_GL_FUNC(glUniform3f);
    498         LOAD_GL_FUNC(glUniform3fv);
    499         LOAD_GL_FUNC(glUniform3i);
    500         LOAD_GL_FUNC(glUniform3iv);
    501         LOAD_GL_FUNC(glUniform4f);
    502         LOAD_GL_FUNC(glUniform4fv);
    503         LOAD_GL_FUNC(glUniform4i);
    504         LOAD_GL_FUNC(glUniform4iv);
    505         LOAD_GL_FUNC(glUniformMatrix2fv);
    506         LOAD_GL_FUNC(glUniformMatrix3fv);
    507         LOAD_GL_FUNC(glUniformMatrix4fv);
    508         LOAD_GL_FUNC(glAttachShader);
    509         LOAD_GL_FUNC(glBindAttribLocation);
    510         LOAD_GL_FUNC(glCompileShader);
    511         LOAD_GL_FUNC(glCreateProgram);
    512         LOAD_GL_FUNC(glCreateShader);
    513         LOAD_GL_FUNC(glDeleteProgram);
    514         LOAD_GL_FUNC(glDeleteShader);
    515         LOAD_GL_FUNC(glDetachShader);
    516         LOAD_GL_FUNC(glLinkProgram);
    517         LOAD_GL_FUNC(glUseProgram);
    518         LOAD_GL_FUNC(glValidateProgram);
    519         LOAD_GL_FUNC(glGetActiveAttrib);
    520         LOAD_GL_FUNC(glGetActiveUniform);
    521         LOAD_GL_FUNC(glGetAttachedShaders);
    522         LOAD_GL_FUNC(glGetAttribLocation);
    523         LOAD_GL_FUNC(glGetProgramiv);
    524         LOAD_GL_FUNC(glGetProgramInfoLog);
    525         LOAD_GL_FUNC(glGetShaderiv);
    526         LOAD_GL_FUNC(glGetShaderInfoLog);
    527         LOAD_GLEXT_FUNC(glGetShaderPrecisionFormat);
    528         LOAD_GL_FUNC(glGetShaderSource);
    529         LOAD_GL_FUNC(glGetUniformfv);
    530         LOAD_GL_FUNC(glGetUniformiv);
    531         LOAD_GL_FUNC(glGetUniformLocation);
    532         LOAD_GLEXT_FUNC(glReleaseShaderCompiler);
    533         LOAD_GLEXT_FUNC(glShaderBinary);
    534         LOAD_GL_FUNC(glShaderSource);
    535         LOAD_GL_FUNC(glStencilMaskSeparate);
    536     }
    537     m_isLoaded = true;
    538 }
    539