1 /*
2  * Copyright (C) 2018 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 <OpenGLESDispatch/GLESv1Dispatch.h>
18 
19 #include "GLESv1.h"
20 
21 // Stubs (common)
22 
glDeleteFencesNV(GLsizei,const GLuint *)23 static void glDeleteFencesNV(GLsizei, const GLuint*) {
24     printf("%s: not implemented\n", __func__);
25 }
26 
glDisableDriverControlQCOM(GLuint)27 static void glDisableDriverControlQCOM(GLuint) {
28     printf("%s: not implemented\n", __func__);
29 }
30 
glDiscardFramebufferEXT(GLenum,GLsizei,const GLenum *)31 static void glDiscardFramebufferEXT(GLenum, GLsizei, const GLenum*) {
32     printf("%s: not implemented\n", __func__);
33 }
34 
glEnableDriverControlQCOM(GLuint)35 static void glEnableDriverControlQCOM(GLuint) {
36     printf("%s: not implemented\n", __func__);
37 }
38 
glEndTilingQCOM(GLbitfield)39 static void glEndTilingQCOM(GLbitfield) {
40     printf("%s: not implemented\n", __func__);
41 }
42 
glExtGetBufferPointervQCOM(GLenum,GLvoid **)43 static void glExtGetBufferPointervQCOM(GLenum, GLvoid**) {
44     printf("%s: not implemented\n", __func__);
45 }
46 
glExtGetBuffersQCOM(GLuint *,GLint,GLint *)47 static void glExtGetBuffersQCOM(GLuint*, GLint, GLint*) {
48     printf("%s: not implemented\n", __func__);
49 }
50 
glExtGetFramebuffersQCOM(GLuint *,GLint,GLint *)51 static void glExtGetFramebuffersQCOM(GLuint*, GLint, GLint*) {
52     printf("%s: not implemented\n", __func__);
53 }
54 
glExtGetProgramBinarySourceQCOM(GLuint,GLenum,GLchar *,GLint *)55 static void glExtGetProgramBinarySourceQCOM(GLuint, GLenum, GLchar*, GLint*) {
56     printf("%s: not implemented\n", __func__);
57 }
58 
glExtGetProgramsQCOM(GLuint *,GLint,GLint *)59 static void glExtGetProgramsQCOM(GLuint*, GLint, GLint*) {
60     printf("%s: not implemented\n", __func__);
61 }
62 
glExtGetRenderbuffersQCOM(GLuint *,GLint,GLint *)63 static void glExtGetRenderbuffersQCOM(GLuint*, GLint, GLint*) {
64     printf("%s: not implemented\n", __func__);
65 }
66 
glExtGetShadersQCOM(GLuint *,GLint,GLint *)67 static void glExtGetShadersQCOM(GLuint*, GLint, GLint*) {
68     printf("%s: not implemented\n", __func__);
69 }
70 
glExtGetTexLevelParameterivQCOM(GLuint,GLenum,GLint,GLenum,GLint *)71 static void glExtGetTexLevelParameterivQCOM(GLuint, GLenum, GLint, GLenum, GLint*) {
72     printf("%s: not implemented\n", __func__);
73 }
74 
glExtGetTexSubImageQCOM(GLenum,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLenum,GLenum,GLvoid *)75 static void glExtGetTexSubImageQCOM(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei,
76                                     GLenum, GLenum, GLvoid*) {
77     printf("%s: not implemented\n", __func__);
78 }
79 
glExtGetTexturesQCOM(GLuint *,GLint,GLint *)80 static void glExtGetTexturesQCOM(GLuint*, GLint, GLint*) {
81     printf("%s: not implemented\n", __func__);
82 }
83 
glExtIsProgramBinaryQCOM(GLuint)84 static GLboolean glExtIsProgramBinaryQCOM(GLuint) {
85     printf("%s: not implemented\n", __func__);
86     return GL_FALSE;
87 }
88 
glExtTexObjectStateOverrideiQCOM(GLenum,GLenum,GLint)89 static void glExtTexObjectStateOverrideiQCOM(GLenum, GLenum, GLint) {
90     printf("%s: not implemented\n", __func__);
91 }
92 
glFinishFenceNV(GLuint)93 static void glFinishFenceNV(GLuint) {
94     printf("%s: not implemented\n", __func__);
95 }
96 
glFramebufferTexture2DMultisampleIMG(GLenum,GLenum,GLenum,GLuint,GLint,GLsizei)97 static void glFramebufferTexture2DMultisampleIMG(GLenum, GLenum, GLenum, GLuint, GLint, GLsizei) {
98     printf("%s: not implemented\n", __func__);
99 }
100 
glGenFencesNV(GLsizei,GLuint *)101 static void glGenFencesNV(GLsizei, GLuint*) {
102     printf("%s: not implemented\n", __func__);
103 }
104 
glGetDriverControlsQCOM(GLint *,GLsizei,GLuint *)105 static void glGetDriverControlsQCOM(GLint*, GLsizei, GLuint*) {
106     printf("%s: not implemented\n", __func__);
107 }
108 
glGetDriverControlStringQCOM(GLuint,GLsizei,GLsizei *,GLchar *)109 static void glGetDriverControlStringQCOM(GLuint, GLsizei, GLsizei*, GLchar*) {
110     printf("%s: not implemented\n", __func__);
111 }
112 
glGetFenceivNV(GLuint,GLenum,GLint *)113 static void glGetFenceivNV(GLuint, GLenum, GLint*) {
114     printf("%s: not implemented\n", __func__);
115 }
116 
glIsFenceNV(GLuint)117 static GLboolean glIsFenceNV(GLuint) {
118     printf("%s: not implemented\n", __func__);
119     return GL_FALSE;
120 }
121 
glMapBufferOES(GLenum,GLenum)122 static void* glMapBufferOES(GLenum, GLenum) {
123     printf("%s: not implemented\n", __func__);
124     return nullptr;
125 }
126 
glMultiDrawArraysEXT(GLenum,const GLint *,const GLsizei *,GLsizei)127 static void glMultiDrawArraysEXT(GLenum, const GLint*, const GLsizei*, GLsizei) {
128     printf("%s: not implemented\n", __func__);
129 }
130 
glMultiDrawElementsEXT(GLenum,const GLsizei *,GLenum,const GLvoid * const *,GLsizei)131 static void glMultiDrawElementsEXT(GLenum, const GLsizei*, GLenum, const GLvoid* const*, GLsizei) {
132     printf("%s: not implemented\n", __func__);
133 }
134 
glRenderbufferStorageMultisampleIMG(GLenum,GLsizei,GLenum,GLsizei,GLsizei)135 static void glRenderbufferStorageMultisampleIMG(GLenum, GLsizei, GLenum, GLsizei, GLsizei) {
136     printf("%s: not implemented\n", __func__);
137 }
138 
glSetFenceNV(GLuint,GLenum)139 static void glSetFenceNV(GLuint, GLenum) {
140     printf("%s: not implemented\n", __func__);
141 }
142 
glStartTilingQCOM(GLuint,GLuint,GLuint,GLuint,GLbitfield)143 static void glStartTilingQCOM(GLuint, GLuint, GLuint, GLuint, GLbitfield) {
144     printf("%s: not implemented\n", __func__);
145 }
146 
glTestFenceNV(GLuint)147 static GLboolean glTestFenceNV(GLuint) {
148     printf("%s: not implemented\n", __func__);
149     return GL_FALSE;
150 }
151 
152 // Stubs (ES 1.1)
153 
glBindVertexArrayOES(GLuint)154 static void glBindVertexArrayOES(GLuint) {
155     printf("%s: not implemented\n", __func__);
156 }
157 
glCurrentPaletteMatrixOES(GLuint)158 static void glCurrentPaletteMatrixOES(GLuint) {
159     printf("%s: not implemented\n", __func__);
160 }
161 
glDeleteVertexArraysOES(GLsizei,const GLuint *)162 static void glDeleteVertexArraysOES(GLsizei, const GLuint*) {
163     printf("%s: not implemented\n", __func__);
164 }
165 
glGenVertexArraysOES(GLsizei,GLuint *)166 static void glGenVertexArraysOES(GLsizei, GLuint*) {
167     printf("%s: not implemented\n", __func__);
168 }
169 
glGetBufferPointervOES(GLenum,GLenum,GLvoid **)170 static void glGetBufferPointervOES(GLenum, GLenum, GLvoid**) {
171     printf("%s: not implemented\n", __func__);
172 }
173 
glGetTexGenfvOES(GLenum,GLenum,GLfloat *)174 static void glGetTexGenfvOES(GLenum, GLenum, GLfloat*) {
175     printf("%s: not implemented\n", __func__);
176 }
177 
glGetTexGenivOES(GLenum,GLenum,GLint *)178 static void glGetTexGenivOES(GLenum, GLenum, GLint*) {
179     printf("%s: not implemented\n", __func__);
180 }
181 
glGetTexGenxvOES(GLenum,GLenum,GLfixed *)182 static void glGetTexGenxvOES(GLenum, GLenum, GLfixed*) {
183     printf("%s: not implemented\n", __func__);
184 }
185 
glIsVertexArrayOES(GLuint)186 static GLboolean glIsVertexArrayOES(GLuint) {
187     printf("%s: not implemented\n", __func__);
188     return GL_FALSE;
189 }
190 
glLoadPaletteFromModelViewMatrixOES()191 static void glLoadPaletteFromModelViewMatrixOES() {
192     printf("%s: not implemented\n", __func__);
193 }
194 
glMatrixIndexPointerData(GLint,GLenum,GLsizei,void *,GLuint)195 static void glMatrixIndexPointerData(GLint, GLenum, GLsizei, void*, GLuint) {
196     printf("%s: not implemented\n", __func__);
197 }
198 
glMatrixIndexPointerOffset(GLint,GLenum,GLsizei,GLuint)199 static void glMatrixIndexPointerOffset(GLint, GLenum, GLsizei, GLuint) {
200     printf("%s: not implemented\n", __func__);
201 }
202 
glMultiDrawArraysSUN(GLenum,GLint *,GLsizei *,GLsizei)203 static void glMultiDrawArraysSUN(GLenum, GLint*, GLsizei*, GLsizei) {
204     printf("%s: not implemented\n", __func__);
205 }
206 
glMultiDrawElementsSUN(GLenum,const GLsizei *,GLenum,const GLvoid **,GLsizei)207 static void glMultiDrawElementsSUN(GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei) {
208     printf("%s: not implemented\n", __func__);
209 }
210 
glQueryMatrixxOES(GLfixed *,GLint *)211 static GLbitfield glQueryMatrixxOES(GLfixed*, GLint*) {
212     printf("%s: not implemented\n", __func__);
213     return 0;
214 }
215 
glTexGenfOES(GLenum,GLenum,GLfloat)216 static void glTexGenfOES(GLenum, GLenum, GLfloat) {
217     printf("%s: not implemented\n", __func__);
218 }
219 
glTexGenfvOES(GLenum,GLenum,const GLfloat *)220 static void glTexGenfvOES(GLenum, GLenum, const GLfloat*) {
221     printf("%s: not implemented\n", __func__);
222 }
223 
glTexGeniOES(GLenum,GLenum,GLint)224 static void glTexGeniOES(GLenum, GLenum, GLint) {
225     printf("%s: not implemented\n", __func__);
226 }
227 
glTexGenivOES(GLenum,GLenum,const GLint *)228 static void glTexGenivOES(GLenum, GLenum, const GLint*) {
229     printf("%s: not implemented\n", __func__);
230 }
231 
glTexGenxOES(GLenum,GLenum,GLfixed)232 static void glTexGenxOES(GLenum, GLenum, GLfixed) {
233     printf("%s: not implemented\n", __func__);
234 }
235 
glTexGenxvOES(GLenum,GLenum,const GLfixed *)236 static void glTexGenxvOES(GLenum, GLenum, const GLfixed*) {
237     printf("%s: not implemented\n", __func__);
238 }
239 
glUnmapBufferOES(GLenum)240 static GLboolean glUnmapBufferOES(GLenum) {
241     printf("%s: not implemented\n", __func__);
242     return GL_FALSE;
243 }
244 
glWeightPointerData(GLint,GLenum,GLsizei,void *,GLuint)245 static void glWeightPointerData(GLint, GLenum, GLsizei, void*, GLuint) {
246     printf("%s: not implemented\n", __func__);
247 }
248 
glWeightPointerOffset(GLint,GLenum,GLsizei,GLuint)249 static void glWeightPointerOffset(GLint, GLenum, GLsizei, GLuint) {
250     printf("%s: not implemented\n", __func__);
251 }
252 
253 // Non-stubs (common)
254 
glDrawElementsData(GLenum mode,GLsizei count,GLenum type,void * indices,GLuint)255 static void glDrawElementsData(GLenum mode, GLsizei count, GLenum type, void* indices, GLuint) {
256     s_gles1.glDrawElements(mode, count, type, indices);
257 }
258 
glDrawElementsOffset(GLenum mode,GLsizei count,GLenum type,GLuint offset)259 static void glDrawElementsOffset(GLenum mode, GLsizei count, GLenum type, GLuint offset) {
260     s_gles1.glDrawElements(mode, count, type, reinterpret_cast<const GLvoid*>(offset));
261 }
262 
glFinishRoundTrip()263 static GLint glFinishRoundTrip() {
264     s_gles1.glFinish();
265     return 0;
266 }
267 
glGetCompressedTextureFormats(int count,GLint * formats)268 static void glGetCompressedTextureFormats(int count, GLint* formats) {
269     int nFormats;
270     s_gles1.glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &nFormats);
271     if (nFormats <= count)
272         s_gles1.glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats);
273 }
274 
275 // Non-stubs (ES 1.1)
276 
glColorPointerData(GLint size,GLenum type,GLsizei,void * data,GLuint)277 static void glColorPointerData(GLint size, GLenum type, GLsizei, void* data, GLuint) {
278     s_gles1.glColorPointer(size, type, 0, data);
279 }
280 
glColorPointerOffset(GLint size,GLenum type,GLsizei,GLuint offset)281 static void glColorPointerOffset(GLint size, GLenum type, GLsizei, GLuint offset) {
282     s_gles1.glColorPointer(size, type, 0, reinterpret_cast<GLvoid*>(offset));
283 }
284 
glNormalPointerData(GLenum type,GLsizei,void * data,GLuint)285 static void glNormalPointerData(GLenum type, GLsizei, void* data, GLuint) {
286     s_gles1.glNormalPointer(type, 0, data);
287 }
288 
glNormalPointerOffset(GLenum type,GLsizei,GLuint offset)289 static void glNormalPointerOffset(GLenum type, GLsizei, GLuint offset) {
290     s_gles1.glNormalPointer(type, 0, reinterpret_cast<GLvoid*>(offset));
291 }
292 
glPointSizePointerData(GLenum type,GLsizei,void * data,GLuint)293 static void glPointSizePointerData(GLenum type, GLsizei, void* data, GLuint) {
294     s_gles1.glPointSizePointerOES(type, 0, data);
295 }
296 
glPointSizePointerOffset(GLenum type,GLsizei,GLuint offset)297 static void glPointSizePointerOffset(GLenum type, GLsizei, GLuint offset) {
298     s_gles1.glPointSizePointerOES(type, 0, reinterpret_cast<GLvoid*>(offset));
299 }
300 
glTexCoordPointerData(GLint,GLint size,GLenum type,GLsizei,void * data,GLuint)301 static void glTexCoordPointerData(GLint, GLint size, GLenum type, GLsizei, void* data, GLuint) {
302     // FIXME: unit?
303     s_gles1.glTexCoordPointer(size, type, 0, data);
304 }
305 
glTexCoordPointerOffset(GLint size,GLenum type,GLsizei,GLuint offset)306 static void glTexCoordPointerOffset(GLint size, GLenum type, GLsizei, GLuint offset) {
307     s_gles1.glTexCoordPointer(size, type, 0, reinterpret_cast<GLvoid*>(offset));
308 }
309 
glVertexPointerData(GLint size,GLenum type,GLsizei,void * data,GLuint)310 static void glVertexPointerData(GLint size, GLenum type, GLsizei, void* data, GLuint) {
311     s_gles1.glVertexPointer(size, type, 0, data);
312 }
313 
glVertexPointerOffset(GLint size,GLenum type,GLsizei,GLuint offset)314 static void glVertexPointerOffset(GLint size, GLenum type, GLsizei, GLuint offset) {
315     s_gles1.glVertexPointer(size, type, 0, reinterpret_cast<GLvoid*>(offset));
316 }
317 
318 #define KNIT(return_type, function_name, signature, callargs) function_name = s_gles1.function_name;
319 
GLESv1()320 GLESv1::GLESv1() {
321     LIST_GLES1_FUNCTIONS(KNIT, KNIT)
322 
323     // Remap some ES 1.0 extensions that become core in ES 1.1
324     glAlphaFuncxOES = glAlphaFuncx;
325     glClearColorxOES = glClearColorx;
326     glClearDepthfOES = glClearDepthf;
327     glClearDepthxOES = glClearDepthx;
328     glClipPlanefIMG = glClipPlanef;
329     glClipPlanefOES = glClipPlanef;
330     glClipPlanexIMG = glClipPlanex;
331     glClipPlanexOES = glClipPlanex;
332     glColor4xOES = glColor4x;
333     glDepthRangefOES = glDepthRangef;
334     glDepthRangexOES = glDepthRangex;
335     glFogxOES = glFogx;
336     glFogxvOES = glFogxv;
337     glFrustumfOES = glFrustumf;
338     glFrustumxOES = glFrustumx;
339     glGetClipPlanefOES = glGetClipPlanef;
340     glGetClipPlanexOES = glGetClipPlanex;
341     glGetFixedvOES = glGetFixedv;
342     glGetLightxvOES = glGetLightxv;
343     glGetMaterialxvOES = glGetMaterialxv;
344     glGetTexEnvxvOES = glGetTexEnvxv;
345     glGetTexParameterxvOES = glGetTexParameterxv;
346     glLightModelxOES = glLightModelx;
347     glLightModelxvOES = glLightModelxv;
348     glLightxOES = glLightx;
349     glLightxvOES = glLightxv;
350     glLineWidthxOES = glLineWidthx;
351     glLoadMatrixxOES = glLoadMatrixx;
352     glMaterialxOES = glMaterialx;
353     glMaterialxvOES = glMaterialxv;
354     glMultiTexCoord4xOES = glMultiTexCoord4x;
355     glMultMatrixxOES = glMultMatrixx;
356     glNormal3xOES = glNormal3x;
357     glOrthofOES = glOrthof;
358     glOrthoxOES = glOrthox;
359     glPointParameterxOES = glPointParameterx;
360     glPointParameterxvOES = glPointParameterxv;
361     glPointSizexOES = glPointSizex;
362     glPolygonOffsetxOES = glPolygonOffsetx;
363     glRotatexOES = glRotatex;
364     glSampleCoveragexOES = glSampleCoveragex;
365     glScalexOES = glScalex;
366     glTexEnvxOES = glTexEnvx;
367     glTexEnvxvOES = glTexEnvxv;
368     glTexParameterxOES = glTexParameterx;
369     glTexParameterxvOES = glTexParameterxv;
370     glTranslatexOES = glTranslatex;
371 
372     // Entrypoints requiring custom wrappers (common)
373     glDrawElementsData = ::glDrawElementsData;
374     glDrawElementsOffset = ::glDrawElementsOffset;
375     glFinishRoundTrip = ::glFinishRoundTrip;
376     glGetCompressedTextureFormats = ::glGetCompressedTextureFormats;
377 
378     // Entrypoints requiring custom wrappers (ES 1.1)
379     glColorPointerData = ::glColorPointerData;
380     glColorPointerOffset = ::glColorPointerOffset;
381     glNormalPointerData = ::glNormalPointerData;
382     glNormalPointerOffset = ::glNormalPointerOffset;
383     glPointSizePointerData = ::glPointSizePointerData;
384     glPointSizePointerOffset = ::glPointSizePointerOffset;
385     glTexCoordPointerData = ::glTexCoordPointerData;
386     glTexCoordPointerOffset = ::glTexCoordPointerOffset;
387     glVertexPointerData = ::glVertexPointerData;
388     glVertexPointerOffset = ::glVertexPointerOffset;
389 
390     // Stub some extensions we will never implement (common)
391     glDeleteFencesNV = ::glDeleteFencesNV;
392     glDisableDriverControlQCOM = ::glDisableDriverControlQCOM;
393     glDiscardFramebufferEXT = ::glDiscardFramebufferEXT;
394     glEnableDriverControlQCOM = ::glEnableDriverControlQCOM;
395     glEndTilingQCOM = ::glEndTilingQCOM;
396     glExtGetBufferPointervQCOM = ::glExtGetBufferPointervQCOM;
397     glExtGetBuffersQCOM = ::glExtGetBuffersQCOM;
398     glExtGetFramebuffersQCOM = ::glExtGetFramebuffersQCOM;
399     glExtGetProgramBinarySourceQCOM = ::glExtGetProgramBinarySourceQCOM;
400     glExtGetProgramsQCOM = ::glExtGetProgramsQCOM;
401     glExtGetRenderbuffersQCOM = ::glExtGetRenderbuffersQCOM;
402     glExtGetShadersQCOM = ::glExtGetShadersQCOM;
403     glExtGetTexLevelParameterivQCOM = ::glExtGetTexLevelParameterivQCOM;
404     glExtGetTexSubImageQCOM = ::glExtGetTexSubImageQCOM;
405     glExtGetTexturesQCOM = ::glExtGetTexturesQCOM;
406     glExtIsProgramBinaryQCOM = ::glExtIsProgramBinaryQCOM;
407     glExtTexObjectStateOverrideiQCOM = ::glExtTexObjectStateOverrideiQCOM;
408     glFinishFenceNV = ::glFinishFenceNV;
409     glFramebufferTexture2DMultisampleIMG = ::glFramebufferTexture2DMultisampleIMG;
410     glGenFencesNV = ::glGenFencesNV;
411     glGetDriverControlsQCOM = ::glGetDriverControlsQCOM;
412     glGetDriverControlStringQCOM = ::glGetDriverControlStringQCOM;
413     glGetFenceivNV = ::glGetFenceivNV;
414     glIsFenceNV = ::glIsFenceNV;
415     glMapBufferOES = ::glMapBufferOES;
416     glMultiDrawArraysEXT = ::glMultiDrawArraysEXT;
417     glMultiDrawElementsEXT = ::glMultiDrawElementsEXT;
418     glRenderbufferStorageMultisampleIMG = ::glRenderbufferStorageMultisampleIMG;
419     glSetFenceNV = ::glSetFenceNV;
420     glStartTilingQCOM = ::glStartTilingQCOM;
421     glTestFenceNV = ::glTestFenceNV;
422 
423     // Stub some extensions we will never implement (ES 1.1)
424     glBindVertexArrayOES = ::glBindVertexArrayOES;
425     glCurrentPaletteMatrixOES = ::glCurrentPaletteMatrixOES;
426     glDeleteVertexArraysOES = ::glDeleteVertexArraysOES;
427     glGenVertexArraysOES = ::glGenVertexArraysOES;
428     glGetBufferPointervOES = ::glGetBufferPointervOES;
429     glGetTexGenfvOES = ::glGetTexGenfvOES;
430     glGetTexGenivOES = ::glGetTexGenivOES;
431     glGetTexGenxvOES = ::glGetTexGenxvOES;
432     glIsVertexArrayOES = ::glIsVertexArrayOES;
433     glLoadPaletteFromModelViewMatrixOES = ::glLoadPaletteFromModelViewMatrixOES;
434     glMatrixIndexPointerData = ::glMatrixIndexPointerData;
435     glMatrixIndexPointerOffset = ::glMatrixIndexPointerOffset;
436     glMultiDrawArraysSUN = ::glMultiDrawArraysSUN;
437     glMultiDrawElementsSUN = ::glMultiDrawElementsSUN;
438     glQueryMatrixxOES = ::glQueryMatrixxOES;
439     glTexGenfOES = ::glTexGenfOES;
440     glTexGenfvOES = ::glTexGenfvOES;
441     glTexGeniOES = ::glTexGeniOES;
442     glTexGenivOES = ::glTexGenivOES;
443     glTexGenxOES = ::glTexGenxOES;
444     glTexGenxvOES = ::glTexGenxvOES;
445     glUnmapBufferOES = ::glUnmapBufferOES;
446     glWeightPointerData = ::glWeightPointerData;
447     glWeightPointerOffset = ::glWeightPointerOffset;
448 }
449