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
getGLFuncAddress(const char * funcName)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
GLDispatch()297 GLDispatch::GLDispatch():m_isLoaded(false){};
298
299
dispatchFuncs(GLESVersion version)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