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