1 #include "glx.h"
2 
3 #define MAP(func_name, func) \
4     if (strcmp(name, func_name) == 0) return (void *)func;
5 
6 #define MAP_EGL(func_name, egl_func) \
7     MAP(#func_name, eglGetProcAddress(#egl_func))
8 
9 #define EX(func_name) MAP(#func_name, func_name)
10 
11 #define ARB(func_name) MAP(#func_name "ARB", func_name)
12 
13 #define STUB(func_name)                       \
14     if (strcmp(name, #func_name) == 0) {      \
15         printf("glX stub: %s\n", #func_name); \
16         return (void *)glXStub;               \
17     }
18 
glXStub(void * x,...)19 void glXStub(void *x, ...) {
20     return;
21 }
22 
glXGetProcAddressARB(const char * name)23 void *glXGetProcAddressARB(const char *name) {
24     // generated gles wrappers
25 #ifdef USE_ES2
26     #include "gles2funcs.inc"
27 #else
28     #include "glesfuncs.inc"
29 #endif
30 
31     // glX calls
32     EX(glXChooseVisual);
33     EX(glXCopyContext);
34     EX(glXCreateContext);
35     EX(glXCreateContextAttribsARB);
36     EX(glXCreateGLXPixmap);
37     EX(glXDestroyContext);
38     EX(glXDestroyGLXPixmap);
39     EX(glXGetConfig);
40     EX(glXGetCurrentDisplay);
41     EX(glXGetCurrentDrawable);
42     EX(glXIsDirect);
43     EX(glXMakeCurrent);
44     EX(glXQueryExtensionsString);
45     EX(glXQueryServerString);
46     EX(glXSwapBuffers);
47     EX(glXSwapIntervalEXT);
48     EX(glXSwapIntervalMESA);
49     EX(glXSwapIntervalSGI);
50     EX(glXUseXFont);
51     EX(glXWaitGL);
52     EX(glXWaitX);
53 
54     // GL_ARB_vertex_buffer_object
55 /*
56     ARB(glBindBuffer);
57     ARB(glBufferData);
58     ARB(glBufferSubData);
59     ARB(glDeleteBuffers);
60     ARB(glGenBuffers);
61     ARB(glIsBuffer);
62     MAP_EGL(glGetBufferParameteriARB, glGetBufferParameteriOES);
63     MAP_EGL(glGetBufferPointerARB, glGetBufferPointerOES);
64     MAP_EGL(glGetBufferPointervARB, glGetBufferPointervOES);
65     MAP_EGL(glMapBufferARB, glMapBufferOES);
66     MAP_EGL(glUnmapBufferARB, glMapBufferOES);
67     STUB(glGetBufferParameterivARB);
68     STUB(glGetBufferSubDataARB);
69 */
70 
71     // OES wrapper
72     EX(glClearDepthfOES);
73     EX(glClipPlanefOES);
74     EX(glDepthRangefOES);
75     EX(glFrustumfOES);
76     EX(glGetClipPlanefOES);
77     EX(glOrthofOES);
78 
79     // passthrough
80     // batch thunking!
81     #define THUNK(suffix, type)       \
82     EX(glColor3##suffix##v);          \
83     EX(glColor3##suffix);             \
84     EX(glColor4##suffix##v);          \
85     EX(glColor4##suffix);             \
86     EX(glSecondaryColor3##suffix##v); \
87     EX(glSecondaryColor3##suffix);    \
88     MAP("glSecondaryColor3" #suffix "vEXT", glSecondaryColor3##suffix##v); \
89     MAP("glSecondaryColor3" #suffix "EXT",  glSecondaryColor3##suffix);    \
90     EX(glIndex##suffix##v);           \
91     EX(glIndex##suffix);              \
92     EX(glNormal3##suffix##v);         \
93     EX(glNormal3##suffix);            \
94     EX(glRasterPos2##suffix##v);      \
95     EX(glRasterPos2##suffix);         \
96     EX(glRasterPos3##suffix##v);      \
97     EX(glRasterPos3##suffix);         \
98     EX(glRasterPos4##suffix##v);      \
99     EX(glRasterPos4##suffix);         \
100     EX(glVertex2##suffix##v);         \
101     EX(glVertex2##suffix);            \
102     EX(glVertex3##suffix##v);         \
103     EX(glVertex3##suffix);            \
104     EX(glVertex4##suffix##v);         \
105     EX(glVertex4##suffix);            \
106     EX(glTexCoord1##suffix##v);       \
107     EX(glTexCoord1##suffix);          \
108     EX(glTexCoord2##suffix##v);       \
109     EX(glTexCoord2##suffix);          \
110     EX(glTexCoord3##suffix##v);       \
111     EX(glTexCoord3##suffix);          \
112     EX(glTexCoord4##suffix##v);       \
113     EX(glTexCoord4##suffix);
114 
115     THUNK(b, GLbyte);
116     THUNK(d, GLdouble);
117     THUNK(i, GLint);
118     THUNK(s, GLshort);
119     THUNK(ub, GLubyte);
120     THUNK(ui, GLuint);
121     THUNK(us, GLushort);
122     THUNK(f, GLfloat);
123     #undef THUNK
124 
125 #ifdef USE_ES2
126     EX(glCompileShaderARB);
127     EX(glCreateShaderObjectARB);
128     EX(glGetObjectParameterivARB);
129     EX(glShaderSourceARB);
130 #endif
131 
132     // functions we actually define
133     EX(glActiveTextureARB);
134     EX(glArrayElement);
135     EX(glBegin);
136     EX(glBitmap);
137     EX(glBlendEquationSeparatei);
138     EX(glBlendFuncSeparate);
139     EX(glBlendFuncSeparatei);
140     EX(glCallList);
141     EX(glCallLists);
142     EX(glClearDepth);
143     EX(glClientActiveTextureARB);
144     EX(glClipPlane);
145     EX(glCopyPixels);
146     EX(glDeleteLists);
147     EX(glDepthRange);
148     EX(glDisable);
149     EX(glDrawBuffer);
150     EX(glDrawPixels);
151     EX(glEdgeFlag);
152     EX(glEnable);
153     EX(glEnd);
154     EX(glEndList);
155     EX(glEvalCoord1d);
156     EX(glEvalCoord1f);
157     EX(glEvalCoord2d);
158     EX(glEvalCoord2f);
159     EX(glEvalMesh1);
160     EX(glEvalMesh2);
161     EX(glEvalPoint1);
162     EX(glEvalPoint2);
163     EX(glFogCoordd);
164     EX(glFogCoorddv);
165     EX(glFogCoordf);
166     EX(glFogCoordfv);
167     EX(glFogi);
168     EX(glFogiv);
169     EX(glFrustum);
170     EX(glGenLists);
171     EX(glGetDoublev);
172     EX(glGetIntegerv);
173     EX(glGetMapdv);
174     EX(glGetMapfv);
175     EX(glGetMapiv);
176     EX(glGetTexImage);
177     EX(glGetTexLevelParameterfv);
178     EX(glGetTexLevelParameteriv);
179     EX(glInitNames);
180     EX(glInterleavedArrays);
181     EX(glIsList);
182 #ifndef USE_ES2
183     EX(glLighti);
184     EX(glLightiv);
185     EX(glLightModeli);
186     EX(glLightModeliv);
187 #endif
188     EX(glLineStipple);
189     EX(glListBase);
190     EX(glLoadMatrixd);
191     EX(glLoadName);
192     EX(glLockArraysEXT);
193     EX(glMap1d);
194     EX(glMap1f);
195     EX(glMap2d);
196     EX(glMap2f);
197     EX(glMapGrid1d);
198     EX(glMapGrid1f);
199     EX(glMapGrid2d);
200     EX(glMapGrid2f);
201     EX(glMateriali);
202     EX(glMultiTexCoord2f);
203     EX(glMultMatrixd);
204     EX(glNewList);
205     EX(glOrtho);
206     EX(glPixelTransferf);
207     EX(glPixelTransferi);
208     EX(glPixelZoom);
209     EX(glPolygonMode);
210     EX(glPolygonStipple);
211     EX(glPopAttrib);
212     EX(glPopClientAttrib);
213     EX(glPopName);
214     EX(glPushAttrib);
215     EX(glPushClientAttrib);
216     EX(glPushName);
217     EX(glRasterPos2i);
218     EX(glReadBuffer);
219     EX(glRectd);
220     EX(glRectf);
221     EX(glRecti);
222     EX(glRects);
223     EX(glRenderMode);
224     EX(glRotated);
225     EX(glScaled);
226     EX(glTexGend);
227     EX(glTexGendv);
228     EX(glTexGenf);
229     EX(glTexGenfv);
230     EX(glTexGeni);
231     EX(glTexGeniv);
232     EX(glTexImage1D);
233     EX(glTexImage3D);
234     EX(glTranslated);
235     EX(glUnlockArraysEXT);
236 
237     // stubs for unimplemented functions
238     STUB(glAccum);
239     STUB(glAreTexturesResident);
240     STUB(glClearAccum);
241     STUB(glColorMaterial);
242     STUB(glCopyTexImage1D);
243     STUB(glCopyTexSubImage1D);
244     STUB(glEdgeFlagPointer);
245     STUB(glFeedbackBuffer);
246     STUB(glGetClipPlane);
247     STUB(glGetLightiv);
248     STUB(glGetMaterialiv);
249     STUB(glGetPixelMapfv);
250     STUB(glGetPixelMapuiv);
251     STUB(glGetPixelMapusv);
252     STUB(glGetPolygonStipple);
253     STUB(glGetStringi);
254     STUB(glGetTexGendv);
255     STUB(glGetTexGenfv);
256     STUB(glGetTexGeniv);
257     STUB(glMaterialiv);
258     STUB(glPassThrough);
259     STUB(glPixelMapfv);
260     STUB(glPixelMapuiv);
261     STUB(glPixelMapusv);
262     STUB(glPixelStoref);
263     STUB(glPrioritizeTextures);
264     STUB(glSelectBuffer);
265     STUB(glTexSubImage1D);
266 
267     printf("glXGetProcAddress: %s not found.\n", name);
268     return NULL;
269 }
270 
glXGetProcAddress(const char * name)271 void *glXGetProcAddress(const char *name) {
272     return glXGetProcAddressARB(name);
273 }
274