blob: af82366d514438561360cbcd6c247630a2b934fd [file] [log] [blame]
José Fonsecac6b49ce2010-11-28 16:43:04 +00001##########################################################################
2#
3# Copyright 2010 VMware, Inc.
4# All Rights Reserved.
5#
6# Permission is hereby granted, free of charge, to any person obtaining a copy
7# of this software and associated documentation files (the "Software"), to deal
8# in the Software without restriction, including without limitation the rights
9# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10# copies of the Software, and to permit persons to whom the Software is
11# furnished to do so, subject to the following conditions:
12#
13# The above copyright notice and this permission notice shall be included in
14# all copies or substantial portions of the Software.
15#
16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22# THE SOFTWARE.
23#
24##########################################################################/
25
26
José Fonseca4a826ed2010-11-30 16:58:22 +000027"""Generated an header, glproc.hpp, which does pretty much what GLEW does, but
28covers all the functions we support.
29"""
30
31
José Fonsecae91f5bc2014-07-17 20:42:35 +010032import sys
33
José Fonseca669b2002011-02-20 13:32:19 +000034from dispatch import Dispatcher
José Fonseca4f242f42012-04-14 18:13:25 +010035import specs.stdapi as stdapi
José Fonsecabd86a222011-09-27 09:21:38 +010036from specs.glapi import glapi
37from specs.glxapi import glxapi
38from specs.wglapi import wglapi
39from specs.cglapi import cglapi
Chia-I Wue50c14b2011-11-03 12:24:53 +080040from specs.eglapi import eglapi
José Fonsecac6b49ce2010-11-28 16:43:04 +000041
42
José Fonseca68ec4122011-02-20 11:25:25 +000043# See http://www.opengl.org/registry/ABI/
José Fonsecac6b49ce2010-11-28 16:43:04 +000044public_symbols = set([
José Fonsecab87c2292011-10-09 14:56:16 +010045 # GL 1.2 and ARB_multitexture
46 "glAccum",
47 "glAlphaFunc",
48 "glAreTexturesResident",
49 "glArrayElement",
50 "glBegin",
51 "glBindTexture",
52 "glBitmap",
53 "glBlendFunc",
54 "glCallList",
55 "glCallLists",
56 "glClear",
57 "glClearAccum",
58 "glClearColor",
59 "glClearDepth",
60 "glClearIndex",
61 "glClearStencil",
62 "glClipPlane",
63 "glColor3b",
64 "glColor3bv",
65 "glColor3d",
66 "glColor3dv",
67 "glColor3f",
68 "glColor3fv",
69 "glColor3i",
70 "glColor3iv",
71 "glColor3s",
72 "glColor3sv",
73 "glColor3ub",
74 "glColor3ubv",
75 "glColor3ui",
76 "glColor3uiv",
77 "glColor3us",
78 "glColor3usv",
79 "glColor4b",
80 "glColor4bv",
81 "glColor4d",
82 "glColor4dv",
83 "glColor4f",
84 "glColor4fv",
85 "glColor4i",
86 "glColor4iv",
87 "glColor4s",
88 "glColor4sv",
89 "glColor4ub",
90 "glColor4ubv",
91 "glColor4ui",
92 "glColor4uiv",
93 "glColor4us",
94 "glColor4usv",
95 "glColorMask",
96 "glColorMaterial",
97 "glColorPointer",
98 "glCopyPixels",
99 "glCopyTexImage1D",
100 "glCopyTexImage2D",
101 "glCopyTexSubImage1D",
102 "glCopyTexSubImage2D",
103 "glCullFace",
104 "glDeleteLists",
105 "glDeleteTextures",
106 "glDepthFunc",
107 "glDepthMask",
108 "glDepthRange",
109 "glDisable",
110 "glDisableClientState",
111 "glDrawArrays",
112 "glDrawBuffer",
113 "glDrawElements",
114 "glDrawPixels",
115 "glEdgeFlag",
116 "glEdgeFlagPointer",
117 "glEdgeFlagv",
118 "glEnable",
119 "glEnableClientState",
120 "glEnd",
121 "glEndList",
122 "glEvalCoord1d",
123 "glEvalCoord1dv",
124 "glEvalCoord1f",
125 "glEvalCoord1fv",
126 "glEvalCoord2d",
127 "glEvalCoord2dv",
128 "glEvalCoord2f",
129 "glEvalCoord2fv",
130 "glEvalMesh1",
131 "glEvalMesh2",
132 "glEvalPoint1",
133 "glEvalPoint2",
134 "glFeedbackBuffer",
135 "glFinish",
136 "glFlush",
137 "glFogf",
138 "glFogfv",
139 "glFogi",
140 "glFogiv",
141 "glFrontFace",
142 "glFrustum",
143 "glGenLists",
144 "glGenTextures",
145 "glGetBooleanv",
146 "glGetClipPlane",
147 "glGetDoublev",
148 "glGetError",
149 "glGetFloatv",
150 "glGetIntegerv",
151 "glGetLightfv",
152 "glGetLightiv",
153 "glGetMapdv",
154 "glGetMapfv",
155 "glGetMapiv",
156 "glGetMaterialfv",
157 "glGetMaterialiv",
158 "glGetPixelMapfv",
159 "glGetPixelMapuiv",
160 "glGetPixelMapusv",
161 "glGetPointerv",
162 "glGetPolygonStipple",
163 "glGetString",
164 "glGetTexEnvfv",
165 "glGetTexEnviv",
166 "glGetTexGendv",
167 "glGetTexGenfv",
168 "glGetTexGeniv",
169 "glGetTexImage",
170 "glGetTexLevelParameterfv",
171 "glGetTexLevelParameteriv",
172 "glGetTexParameterfv",
173 "glGetTexParameteriv",
174 "glHint",
175 "glIndexMask",
176 "glIndexPointer",
177 "glIndexd",
178 "glIndexdv",
179 "glIndexf",
180 "glIndexfv",
181 "glIndexi",
182 "glIndexiv",
183 "glIndexs",
184 "glIndexsv",
185 "glIndexub",
186 "glIndexubv",
187 "glInitNames",
188 "glInterleavedArrays",
189 "glIsEnabled",
190 "glIsList",
191 "glIsTexture",
192 "glLightModelf",
193 "glLightModelfv",
194 "glLightModeli",
195 "glLightModeliv",
196 "glLightf",
197 "glLightfv",
198 "glLighti",
199 "glLightiv",
200 "glLineStipple",
201 "glLineWidth",
202 "glListBase",
203 "glLoadIdentity",
204 "glLoadMatrixd",
205 "glLoadMatrixf",
206 "glLoadName",
207 "glLogicOp",
208 "glMap1d",
209 "glMap1f",
210 "glMap2d",
211 "glMap2f",
212 "glMapGrid1d",
213 "glMapGrid1f",
214 "glMapGrid2d",
215 "glMapGrid2f",
216 "glMaterialf",
217 "glMaterialfv",
218 "glMateriali",
219 "glMaterialiv",
220 "glMatrixMode",
221 "glMultMatrixd",
222 "glMultMatrixf",
223 "glNewList",
224 "glNormal3b",
225 "glNormal3bv",
226 "glNormal3d",
227 "glNormal3dv",
228 "glNormal3f",
229 "glNormal3fv",
230 "glNormal3i",
231 "glNormal3iv",
232 "glNormal3s",
233 "glNormal3sv",
234 "glNormalPointer",
235 "glOrtho",
236 "glPassThrough",
237 "glPixelMapfv",
238 "glPixelMapuiv",
239 "glPixelMapusv",
240 "glPixelStoref",
241 "glPixelStorei",
242 "glPixelTransferf",
243 "glPixelTransferi",
244 "glPixelZoom",
245 "glPointSize",
246 "glPolygonMode",
247 "glPolygonOffset",
248 "glPolygonStipple",
249 "glPopAttrib",
250 "glPopClientAttrib",
251 "glPopMatrix",
252 "glPopName",
253 "glPrioritizeTextures",
254 "glPushAttrib",
255 "glPushClientAttrib",
256 "glPushMatrix",
257 "glPushName",
258 "glRasterPos2d",
259 "glRasterPos2dv",
260 "glRasterPos2f",
261 "glRasterPos2fv",
262 "glRasterPos2i",
263 "glRasterPos2iv",
264 "glRasterPos2s",
265 "glRasterPos2sv",
266 "glRasterPos3d",
267 "glRasterPos3dv",
268 "glRasterPos3f",
269 "glRasterPos3fv",
270 "glRasterPos3i",
271 "glRasterPos3iv",
272 "glRasterPos3s",
273 "glRasterPos3sv",
274 "glRasterPos4d",
275 "glRasterPos4dv",
276 "glRasterPos4f",
277 "glRasterPos4fv",
278 "glRasterPos4i",
279 "glRasterPos4iv",
280 "glRasterPos4s",
281 "glRasterPos4sv",
282 "glReadBuffer",
283 "glReadPixels",
284 "glRectd",
285 "glRectdv",
286 "glRectf",
287 "glRectfv",
288 "glRecti",
289 "glRectiv",
290 "glRects",
291 "glRectsv",
292 "glRenderMode",
293 "glRotated",
294 "glRotatef",
295 "glScaled",
296 "glScalef",
297 "glScissor",
298 "glSelectBuffer",
299 "glShadeModel",
300 "glStencilFunc",
301 "glStencilMask",
302 "glStencilOp",
303 "glTexCoord1d",
304 "glTexCoord1dv",
305 "glTexCoord1f",
306 "glTexCoord1fv",
307 "glTexCoord1i",
308 "glTexCoord1iv",
309 "glTexCoord1s",
310 "glTexCoord1sv",
311 "glTexCoord2d",
312 "glTexCoord2dv",
313 "glTexCoord2f",
314 "glTexCoord2fv",
315 "glTexCoord2i",
316 "glTexCoord2iv",
317 "glTexCoord2s",
318 "glTexCoord2sv",
319 "glTexCoord3d",
320 "glTexCoord3dv",
321 "glTexCoord3f",
322 "glTexCoord3fv",
323 "glTexCoord3i",
324 "glTexCoord3iv",
325 "glTexCoord3s",
326 "glTexCoord3sv",
327 "glTexCoord4d",
328 "glTexCoord4dv",
329 "glTexCoord4f",
330 "glTexCoord4fv",
331 "glTexCoord4i",
332 "glTexCoord4iv",
333 "glTexCoord4s",
334 "glTexCoord4sv",
335 "glTexCoordPointer",
336 "glTexEnvf",
337 "glTexEnvfv",
338 "glTexEnvi",
339 "glTexEnviv",
340 "glTexGend",
341 "glTexGendv",
342 "glTexGenf",
343 "glTexGenfv",
344 "glTexGeni",
345 "glTexGeniv",
346 "glTexImage1D",
347 "glTexImage2D",
348 "glTexParameterf",
349 "glTexParameterfv",
350 "glTexParameteri",
351 "glTexParameteriv",
352 "glTexSubImage1D",
353 "glTexSubImage2D",
354 "glTranslated",
355 "glTranslatef",
356 "glVertex2d",
357 "glVertex2dv",
358 "glVertex2f",
359 "glVertex2fv",
360 "glVertex2i",
361 "glVertex2iv",
362 "glVertex2s",
363 "glVertex2sv",
364 "glVertex3d",
365 "glVertex3dv",
366 "glVertex3f",
367 "glVertex3fv",
368 "glVertex3i",
369 "glVertex3iv",
370 "glVertex3s",
371 "glVertex3sv",
372 "glVertex4d",
373 "glVertex4dv",
374 "glVertex4f",
375 "glVertex4fv",
376 "glVertex4i",
377 "glVertex4iv",
378 "glVertex4s",
379 "glVertex4sv",
380 "glVertexPointer",
381 "glViewport",
José Fonseca68ec4122011-02-20 11:25:25 +0000382
José Fonsecab87c2292011-10-09 14:56:16 +0100383 # GLX 1.3 and GLX_ARB_get_proc_address
384 "glXChooseVisual",
385 "glXCreateContext",
386 "glXDestroyContext",
387 "glXMakeCurrent",
388 "glXCopyContext",
389 "glXSwapBuffers",
390 "glXCreateGLXPixmap",
391 "glXDestroyGLXPixmap",
392 "glXQueryExtension",
393 "glXQueryVersion",
394 "glXIsDirect",
395 "glXGetConfig",
396 "glXGetCurrentContext",
397 "glXGetCurrentDrawable",
398 "glXWaitGL",
399 "glXWaitX",
400 "glXUseXFont",
401 "glXQueryExtensionsString",
402 "glXQueryServerString",
403 "glXGetClientString",
404 "glXGetCurrentDisplay",
405 "glXChooseFBConfig",
406 "glXGetFBConfigAttrib",
407 "glXGetFBConfigs",
408 "glXGetVisualFromFBConfig",
409 "glXCreateWindow",
410 "glXDestroyWindow",
411 "glXCreatePixmap",
412 "glXDestroyPixmap",
413 "glXCreatePbuffer",
414 "glXDestroyPbuffer",
415 "glXQueryDrawable",
416 "glXCreateNewContext",
417 "glXMakeContextCurrent",
418 "glXGetCurrentReadDrawable",
419 "glXQueryContext",
420 "glXSelectEvent",
421 "glXGetSelectedEvent",
José Fonseca68ec4122011-02-20 11:25:25 +0000422 "glXGetProcAddressARB",
423 "glXGetProcAddress",
José Fonsecab87c2292011-10-09 14:56:16 +0100424
425 # WGL
426 #"glDebugEntry",
427 "wglChoosePixelFormat",
428 "wglCopyContext",
429 "wglCreateContext",
430 "wglCreateLayerContext",
431 "wglDeleteContext",
432 "wglDescribeLayerPlane",
433 "wglDescribePixelFormat",
434 "wglGetCurrentContext",
435 "wglGetCurrentDC",
436 "wglGetDefaultProcAddress",
437 "wglGetLayerPaletteEntries",
438 "wglGetPixelFormat",
439 "wglGetProcAddress",
440 "wglMakeCurrent",
441 "wglRealizeLayerPalette",
442 "wglSetLayerPaletteEntries",
443 "wglSetPixelFormat",
444 "wglShareLists",
445 "wglSwapBuffers",
446 "wglSwapLayerBuffers",
447 "wglSwapMultipleBuffers",
448 "wglUseFontBitmapsA",
449 "wglUseFontBitmapsW",
450 "wglUseFontOutlinesA",
451 "wglUseFontOutlinesW",
452
José Fonsecac6b49ce2010-11-28 16:43:04 +0000453])
454
Chia-I Wue50c14b2011-11-03 12:24:53 +0800455# EGL 1.4
456public_symbols.update([
457 "eglBindAPI",
458 "eglBindTexImage",
459 "eglChooseConfig",
460 "eglCopyBuffers",
461 "eglCreateContext",
462 "eglCreatePbufferFromClientBuffer",
463 "eglCreatePbufferSurface",
464 "eglCreatePixmapSurface",
465 "eglCreateWindowSurface",
466 "eglDestroyContext",
467 "eglDestroySurface",
468 "eglGetConfigAttrib",
469 "eglGetConfigs",
470 "eglGetCurrentContext",
471 "eglGetCurrentDisplay",
472 "eglGetCurrentSurface",
473 "eglGetDisplay",
474 "eglGetError",
475 "eglGetProcAddress",
476 "eglInitialize",
477 "eglMakeCurrent",
478 "eglQueryAPI",
479 "eglQueryContext",
480 "eglQueryString",
481 "eglQuerySurface",
482 "eglReleaseTexImage",
483 "eglReleaseThread",
484 "eglSurfaceAttrib",
485 "eglSwapBuffers",
486 "eglSwapInterval",
487 "eglTerminate",
488 "eglWaitClient",
489 "eglWaitGL",
490 "eglWaitNative",
491])
José Fonsecac6b49ce2010-11-28 16:43:04 +0000492
José Fonseca68ec4122011-02-20 11:25:25 +0000493class GlDispatcher(Dispatcher):
494
José Fonseca81301932012-11-11 00:10:20 +0000495 def isFunctionPublic(self, module, function):
José Fonseca3bcb33c2011-05-27 20:14:31 +0100496 return function.name in public_symbols or function.name.startswith('CGL')
José Fonsecac6b49ce2010-11-28 16:43:04 +0000497
José Fonseca7989f932014-07-17 19:45:15 +0100498 def getProcAddressName(self, module, function):
499 if self.isFunctionPublic(module, function):
500 return '_getPublicProcAddress'
501 else:
502 return '_getPrivateProcAddress'
503
Peter Lohrmann9d9eb812013-07-12 16:15:25 -0400504 def failFunction(self, function):
José Fonseca71f5a352014-07-28 12:19:50 +0100505 # We fake these when they are not available
506 if function.name in (
507 # GL_KHR_debug
508 'glDebugMessageControl',
509 'glDebugMessageInsert',
510 'glDebugMessageCallback',
511 'glPushDebugGroup',
512 'glPopDebugGroup',
513 'glObjectLabel',
514 'glObjectPtrLabel',
515 # GL_ARB_debug_output
516 'glDebugMessageControlARB',
517 'glDebugMessageInsertARB',
518 'glDebugMessageCallbackARB',
519 # GL_AMD_debug_output
520 'glDebugMessageEnableAMD',
521 'glDebugMessageInsertAMD',
522 'glDebugMessageCallbackAMD',
523 # GL_EXT_debug_label
524 'glLabelObjectEXT',
525 # GL_EXT_debug_marker
526 'glInsertEventMarkerEXT',
527 'glPushGroupMarkerEXT',
528 'glPopGroupMarkerEXT',
529 ):
530 return
José Fonseca7ff82412014-02-04 19:01:22 +0000531 if function.name in ('glGetObjectLabel', 'glGetObjectPtrLabel', 'glGetObjectLabelEXT'):
Peter Lohrmann9d9eb812013-07-12 16:15:25 -0400532 print r' if (length != 0) *length = 0;'
533 print r' if (label != 0 && bufSize > 0) *label = 0;'
534 return
535 if function.name in ('glGetDebugMessageLog', 'glGetDebugMessageLogARB'):
536 print r' if (sources != 0) *sources = 0;'
537 print r' if (types != 0) *types = 0;'
538 print r' if (ids != 0) *ids = 0;'
539 print r' if (severities != 0) *severities = 0;'
540 print r' if (lengths != 0) *lengths = 0;'
541 print r' if (messageLog != 0 && bufsize > 0) *messageLog = 0;'
José Fonseca31215642014-07-17 20:32:12 +0100542 print r' return 0;'
Peter Lohrmann9d9eb812013-07-12 16:15:25 -0400543 return
544 if function.name in ('glGetDebugMessageLogAMD'):
545 print r' if (categories != 0) *categories = 0;'
546 print r' if (ids != 0) *ids = 0;'
547 print r' if (severities != 0) *severities = 0;'
548 print r' if (lengths != 0) *lengths = 0;'
549 print r' if (message != 0 && bufsize > 0) *message = 0;'
José Fonseca31215642014-07-17 20:32:12 +0100550 print r' return 0;'
Peter Lohrmann9d9eb812013-07-12 16:15:25 -0400551 return
552
553 Dispatcher.failFunction(self, function)
554
José Fonsecac6b49ce2010-11-28 16:43:04 +0000555
556if __name__ == '__main__':
José Fonsecae91f5bc2014-07-17 20:42:35 +0100557 decl, impl = sys.argv[1:]
558
559 sys.stdout = open(decl, 'wt')
José Fonsecac6b49ce2010-11-28 16:43:04 +0000560 print
José Fonseca669b2002011-02-20 13:32:19 +0000561 print '#ifndef _GLPROC_HPP_'
562 print '#define _GLPROC_HPP_'
José Fonsecae91f5bc2014-07-17 20:42:35 +0100563 print
José Fonsecac6b49ce2010-11-28 16:43:04 +0000564 print '#include "glimports.hpp"'
José Fonsecae91f5bc2014-07-17 20:42:35 +0100565 print
566 print '#if defined(_WIN32)'
567 print 'extern HMODULE _libGlHandle;'
568 print '#else'
569 print 'extern void * _libGlHandle;'
570 print '#endif'
571 print
572 print 'void * _getPublicProcAddress(const char *procName);'
573 print 'void * _getPrivateProcAddress(const char *procName);'
574 print
575 dispatcher = GlDispatcher()
576 print
577 dispatcher.dispatchModuleDecl(eglapi)
578 print
579 print '#if defined(_WIN32)'
580 print
581 dispatcher.dispatchModuleDecl(wglapi)
582 print
583 print '#elif defined(__APPLE__)'
584 print
585 dispatcher.dispatchModuleDecl(cglapi)
586 print
587 print '#elif defined(HAVE_X11)'
588 print
589 dispatcher.dispatchModuleDecl(glxapi)
590 print
591 print '#endif'
592 print
593 dispatcher.dispatchModuleDecl(glapi)
594 print
José Fonsecae91f5bc2014-07-17 20:42:35 +0100595 print '#endif /* !_GLPROC_HPP_ */'
596 print
597
598 sys.stdout = open(impl, 'wt')
599 print
600 print '#include "glproc.hpp"'
José Fonsecac6b49ce2010-11-28 16:43:04 +0000601 print '#include "os.hpp"'
602 print
José Fonseca68ec4122011-02-20 11:25:25 +0000603 dispatcher = GlDispatcher()
José Fonsecaafc32ba2012-03-30 00:18:16 +0100604 print
José Fonsecae91f5bc2014-07-17 20:42:35 +0100605 dispatcher.dispatchModuleImpl(eglapi)
José Fonsecaafc32ba2012-03-30 00:18:16 +0100606 print
607 print '#if defined(_WIN32)'
José Fonseca68ec4122011-02-20 11:25:25 +0000608 print
José Fonsecae91f5bc2014-07-17 20:42:35 +0100609 dispatcher.dispatchModuleImpl(wglapi)
José Fonsecaafc32ba2012-03-30 00:18:16 +0100610 print
José Fonseca3dabe542011-05-19 17:57:18 +0100611 print '#elif defined(__APPLE__)'
José Fonsecaafc32ba2012-03-30 00:18:16 +0100612 print
José Fonsecae91f5bc2014-07-17 20:42:35 +0100613 dispatcher.dispatchModuleImpl(cglapi)
José Fonsecaafc32ba2012-03-30 00:18:16 +0100614 print
José Fonseca5409d1e2012-03-30 19:58:20 +0100615 print '#elif defined(HAVE_X11)'
José Fonseca68ec4122011-02-20 11:25:25 +0000616 print
José Fonsecae91f5bc2014-07-17 20:42:35 +0100617 dispatcher.dispatchModuleImpl(glxapi)
José Fonsecaafc32ba2012-03-30 00:18:16 +0100618 print
José Fonseca3dabe542011-05-19 17:57:18 +0100619 print '#endif'
José Fonseca43648602011-05-15 12:56:59 +0100620 print
José Fonsecae91f5bc2014-07-17 20:42:35 +0100621 dispatcher.dispatchModuleImpl(glapi)
José Fonsecac6b49ce2010-11-28 16:43:04 +0000622 print