OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """code generator for GL/GLES extension wrangler.""" | 6 """code generator for GL/GLES extension wrangler.""" |
7 | 7 |
8 import optparse | 8 import optparse |
9 import os | 9 import os |
10 import collections | 10 import collections |
(...skipping 17 matching lines...) Expand all Loading... |
28 'GL_CHROMIUM_glgetstringi_hack', # crbug.com/470396 | 28 'GL_CHROMIUM_glgetstringi_hack', # crbug.com/470396 |
29 ]) | 29 ]) |
30 | 30 |
31 """Function binding conditions can be specified manually by supplying a versions | 31 """Function binding conditions can be specified manually by supplying a versions |
32 array instead of the names array. Each version has the following keys: | 32 array instead of the names array. Each version has the following keys: |
33 name: Mandatory. Name of the function. Multiple versions can have the same | 33 name: Mandatory. Name of the function. Multiple versions can have the same |
34 name but different conditions. | 34 name but different conditions. |
35 extensions: Extra Extensions for which the function is bound. Only needed | 35 extensions: Extra Extensions for which the function is bound. Only needed |
36 in some cases where the extension cannot be parsed from the | 36 in some cases where the extension cannot be parsed from the |
37 headers. | 37 headers. |
| 38 is_optional: Set to True if the function might be missing even if |
| 39 the the extension string is present. This can happen |
| 40 when the extension is updated with new functions, but |
| 41 the extension string does not change. |
38 | 42 |
39 By default, the function gets its name from the first name in its names or | 43 By default, the function gets its name from the first name in its names or |
40 versions array. This can be overridden by supplying a 'known_as' key. | 44 versions array. This can be overridden by supplying a 'known_as' key. |
| 45 |
41 """ | 46 """ |
42 GL_FUNCTIONS = [ | 47 GL_FUNCTIONS = [ |
43 { 'return_type': 'void', | 48 { 'return_type': 'void', |
44 'names': ['glActiveTexture'], | 49 'names': ['glActiveTexture'], |
45 'arguments': 'GLenum texture', }, | 50 'arguments': 'GLenum texture', }, |
46 { 'return_type': 'void', | 51 { 'return_type': 'void', |
47 'names': ['glAttachShader'], | 52 'names': ['glAttachShader'], |
48 'arguments': 'GLuint program, GLuint shader', }, | 53 'arguments': 'GLuint program, GLuint shader', }, |
49 { 'return_type': 'void', | 54 { 'return_type': 'void', |
50 'versions': [{ 'name': 'glBeginQuery' }, | 55 'versions': [{ 'name': 'glBeginQuery' }, |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 { 'return_type': 'void', | 232 { 'return_type': 'void', |
228 'names': ['glCopyTexSubImage2D'], | 233 'names': ['glCopyTexSubImage2D'], |
229 'arguments': | 234 'arguments': |
230 'GLenum target, GLint level, GLint xoffset, ' | 235 'GLenum target, GLint level, GLint xoffset, ' |
231 'GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height', }, | 236 'GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height', }, |
232 { 'return_type': 'void', | 237 { 'return_type': 'void', |
233 'versions': [{ 'name': 'glCopyTexSubImage3D' }], | 238 'versions': [{ 'name': 'glCopyTexSubImage3D' }], |
234 'arguments': | 239 'arguments': |
235 'GLenum target, GLint level, GLint xoffset, GLint yoffset, ' | 240 'GLenum target, GLint level, GLint xoffset, GLint yoffset, ' |
236 'GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height', }, | 241 'GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height', }, |
| 242 { 'return_type': 'void', |
| 243 'names': ['glCoverFillPathNV'], |
| 244 'arguments': 'GLuint path, GLenum coverMode' }, |
| 245 { 'return_type': 'void', |
| 246 'names': ['glCoverStrokePathNV'], |
| 247 'arguments': 'GLuint name, GLenum coverMode' }, |
237 { 'return_type': 'GLuint', | 248 { 'return_type': 'GLuint', |
238 'names': ['glCreateProgram'], | 249 'names': ['glCreateProgram'], |
239 'arguments': 'void', }, | 250 'arguments': 'void', }, |
240 { 'return_type': 'GLuint', | 251 { 'return_type': 'GLuint', |
241 'names': ['glCreateShader'], | 252 'names': ['glCreateShader'], |
242 'arguments': 'GLenum type', }, | 253 'arguments': 'GLenum type', }, |
243 { 'return_type': 'void', | 254 { 'return_type': 'void', |
244 'names': ['glCullFace'], | 255 'names': ['glCullFace'], |
245 'arguments': 'GLenum mode', }, | 256 'arguments': 'GLenum mode', }, |
246 { 'return_type': 'void', | 257 { 'return_type': 'void', |
247 'names': ['glDeleteBuffers'], | 258 'names': ['glDeleteBuffers'], |
248 'known_as': 'glDeleteBuffersARB', | 259 'known_as': 'glDeleteBuffersARB', |
249 'arguments': 'GLsizei n, const GLuint* buffers', }, | 260 'arguments': 'GLsizei n, const GLuint* buffers', }, |
250 { 'return_type': 'void', | 261 { 'return_type': 'void', |
251 'known_as': 'glDeleteFencesAPPLE', | 262 'known_as': 'glDeleteFencesAPPLE', |
252 'versions': [{ 'name': 'glDeleteFencesAPPLE', | 263 'versions': [{ 'name': 'glDeleteFencesAPPLE', |
253 'extensions': ['GL_APPLE_fence'] }], | 264 'extensions': ['GL_APPLE_fence'] }], |
254 'arguments': 'GLsizei n, const GLuint* fences', }, | 265 'arguments': 'GLsizei n, const GLuint* fences', }, |
255 { 'return_type': 'void', | 266 { 'return_type': 'void', |
256 'names': ['glDeleteFencesNV'], | 267 'names': ['glDeleteFencesNV'], |
257 'arguments': 'GLsizei n, const GLuint* fences', }, | 268 'arguments': 'GLsizei n, const GLuint* fences', }, |
258 { 'return_type': 'void', | 269 { 'return_type': 'void', |
259 'names': ['glDeleteFramebuffersEXT', 'glDeleteFramebuffers'], | 270 'names': ['glDeleteFramebuffersEXT', 'glDeleteFramebuffers'], |
260 'arguments': 'GLsizei n, const GLuint* framebuffers', }, | 271 'arguments': 'GLsizei n, const GLuint* framebuffers', }, |
261 { 'return_type': 'void', | 272 { 'return_type': 'void', |
| 273 'names': ['glDeletePathsNV'], |
| 274 'arguments': 'GLuint path, GLsizei range' }, |
| 275 { 'return_type': 'void', |
262 'names': ['glDeleteProgram'], | 276 'names': ['glDeleteProgram'], |
263 'arguments': 'GLuint program', }, | 277 'arguments': 'GLuint program', }, |
264 { 'return_type': 'void', | 278 { 'return_type': 'void', |
265 'versions': [{ 'name': 'glDeleteQueries' }, | 279 'versions': [{ 'name': 'glDeleteQueries' }, |
266 { 'name': 'glDeleteQueriesARB'}, | 280 { 'name': 'glDeleteQueriesARB'}, |
267 { 'name': 'glDeleteQueriesEXT', | 281 { 'name': 'glDeleteQueriesEXT', |
268 'extensions': ['GL_EXT_occlusion_query_boolean'] }], | 282 'extensions': ['GL_EXT_occlusion_query_boolean'] }], |
269 'arguments': 'GLsizei n, const GLuint* ids', }, | 283 'arguments': 'GLsizei n, const GLuint* ids', }, |
270 { 'return_type': 'void', | 284 { 'return_type': 'void', |
271 'names': ['glDeleteRenderbuffersEXT', 'glDeleteRenderbuffers'], | 285 'names': ['glDeleteRenderbuffersEXT', 'glDeleteRenderbuffers'], |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 'known_as': 'glGenFencesAPPLE', | 444 'known_as': 'glGenFencesAPPLE', |
431 'versions': [{ 'name': 'glGenFencesAPPLE', | 445 'versions': [{ 'name': 'glGenFencesAPPLE', |
432 'extensions': ['GL_APPLE_fence'] }], | 446 'extensions': ['GL_APPLE_fence'] }], |
433 'arguments': 'GLsizei n, GLuint* fences', }, | 447 'arguments': 'GLsizei n, GLuint* fences', }, |
434 { 'return_type': 'void', | 448 { 'return_type': 'void', |
435 'names': ['glGenFencesNV'], | 449 'names': ['glGenFencesNV'], |
436 'arguments': 'GLsizei n, GLuint* fences', }, | 450 'arguments': 'GLsizei n, GLuint* fences', }, |
437 { 'return_type': 'void', | 451 { 'return_type': 'void', |
438 'names': ['glGenFramebuffersEXT', 'glGenFramebuffers'], | 452 'names': ['glGenFramebuffersEXT', 'glGenFramebuffers'], |
439 'arguments': 'GLsizei n, GLuint* framebuffers', }, | 453 'arguments': 'GLsizei n, GLuint* framebuffers', }, |
| 454 { 'return_type': 'GLuint', |
| 455 'names': ['glGenPathsNV'], |
| 456 'arguments': 'GLsizei range' }, |
440 { 'return_type': 'void', | 457 { 'return_type': 'void', |
441 'versions': [{ 'name': 'glGenQueries' }, | 458 'versions': [{ 'name': 'glGenQueries' }, |
442 { 'name': 'glGenQueriesARB', }, | 459 { 'name': 'glGenQueriesARB', }, |
443 { 'name' : 'glGenQueriesEXT', | 460 { 'name' : 'glGenQueriesEXT', |
444 'extensions': ['GL_EXT_occlusion_query_boolean'] }], | 461 'extensions': ['GL_EXT_occlusion_query_boolean'] }], |
445 'arguments': 'GLsizei n, GLuint* ids', }, | 462 'arguments': 'GLsizei n, GLuint* ids', }, |
446 { 'return_type': 'void', | 463 { 'return_type': 'void', |
447 'names': ['glGenRenderbuffersEXT', 'glGenRenderbuffers'], | 464 'names': ['glGenRenderbuffersEXT', 'glGenRenderbuffers'], |
448 'arguments': 'GLsizei n, GLuint* renderbuffers', }, | 465 'arguments': 'GLsizei n, GLuint* renderbuffers', }, |
449 { 'return_type': 'void', | 466 { 'return_type': 'void', |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 'versions': [{ 'name': 'glIsFenceAPPLE', | 714 'versions': [{ 'name': 'glIsFenceAPPLE', |
698 'extensions': ['GL_APPLE_fence'] }], | 715 'extensions': ['GL_APPLE_fence'] }], |
699 'arguments': 'GLuint fence', }, | 716 'arguments': 'GLuint fence', }, |
700 { 'return_type': 'GLboolean', | 717 { 'return_type': 'GLboolean', |
701 'names': ['glIsFenceNV'], | 718 'names': ['glIsFenceNV'], |
702 'arguments': 'GLuint fence', }, | 719 'arguments': 'GLuint fence', }, |
703 { 'return_type': 'GLboolean', | 720 { 'return_type': 'GLboolean', |
704 'names': ['glIsFramebufferEXT', 'glIsFramebuffer'], | 721 'names': ['glIsFramebufferEXT', 'glIsFramebuffer'], |
705 'arguments': 'GLuint framebuffer', }, | 722 'arguments': 'GLuint framebuffer', }, |
706 { 'return_type': 'GLboolean', | 723 { 'return_type': 'GLboolean', |
| 724 'names': ['glIsPathNV'], |
| 725 'arguments': 'GLuint path' }, |
| 726 { 'return_type': 'GLboolean', |
707 'names': ['glIsProgram'], | 727 'names': ['glIsProgram'], |
708 'arguments': 'GLuint program', }, | 728 'arguments': 'GLuint program', }, |
709 { 'return_type': 'GLboolean', | 729 { 'return_type': 'GLboolean', |
710 'versions': [{ 'name': 'glIsQuery' }, | 730 'versions': [{ 'name': 'glIsQuery' }, |
711 { 'name': 'glIsQueryARB' }, | 731 { 'name': 'glIsQueryARB' }, |
712 { 'name': 'glIsQueryEXT', | 732 { 'name': 'glIsQueryEXT', |
713 'extensions': ['GL_EXT_occlusion_query_boolean'] }], | 733 'extensions': ['GL_EXT_occlusion_query_boolean'] }], |
714 'arguments': 'GLuint query', }, | 734 'arguments': 'GLuint query', }, |
715 { 'return_type': 'GLboolean', | 735 { 'return_type': 'GLboolean', |
716 'names': ['glIsRenderbufferEXT', 'glIsRenderbuffer'], | 736 'names': ['glIsRenderbufferEXT', 'glIsRenderbuffer'], |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 'extensions': ['GL_EXT_direct_state_access', | 783 'extensions': ['GL_EXT_direct_state_access', |
764 'GL_NV_path_rendering'] }], | 784 'GL_NV_path_rendering'] }], |
765 'arguments': 'GLenum matrixMode, const GLfloat* m' }, | 785 'arguments': 'GLenum matrixMode, const GLfloat* m' }, |
766 { 'return_type': 'void', | 786 { 'return_type': 'void', |
767 'known_as': 'glMatrixLoadIdentityEXT', | 787 'known_as': 'glMatrixLoadIdentityEXT', |
768 'versions': [{ 'name': 'glMatrixLoadIdentityEXT', | 788 'versions': [{ 'name': 'glMatrixLoadIdentityEXT', |
769 'extensions': ['GL_EXT_direct_state_access', | 789 'extensions': ['GL_EXT_direct_state_access', |
770 'GL_NV_path_rendering'] },], | 790 'GL_NV_path_rendering'] },], |
771 'arguments': 'GLenum matrixMode' }, | 791 'arguments': 'GLenum matrixMode' }, |
772 { 'return_type': 'void', | 792 { 'return_type': 'void', |
| 793 'names': ['glPathCommandsNV'], |
| 794 'arguments': 'GLuint path, GLsizei numCommands, const GLubyte* commands, ' |
| 795 'GLsizei numCoords, GLenum coordType, const GLvoid* coords' }, |
| 796 { 'return_type': 'void', |
| 797 'names': ['glPathParameterfNV'], |
| 798 'arguments': 'GLuint path, GLenum pname, GLfloat value' }, |
| 799 { 'return_type': 'void', |
| 800 'names': ['glPathParameteriNV'], |
| 801 'arguments': 'GLuint path, GLenum pname, GLint value' }, |
| 802 { 'return_type': 'void', |
| 803 'names': ['glPathStencilFuncNV'], |
| 804 'arguments': 'GLenum func, GLint ref, GLuint mask' }, |
| 805 { 'return_type': 'void', |
773 'versions': [{ 'name': 'glPauseTransformFeedback' }], | 806 'versions': [{ 'name': 'glPauseTransformFeedback' }], |
774 'arguments': 'void', }, | 807 'arguments': 'void', }, |
775 { 'return_type': 'void', | 808 { 'return_type': 'void', |
776 'names': ['glPixelStorei'], | 809 'names': ['glPixelStorei'], |
777 'arguments': 'GLenum pname, GLint param', }, | 810 'arguments': 'GLenum pname, GLint param', }, |
778 { 'return_type': 'void', | 811 { 'return_type': 'void', |
779 'names': ['glPointParameteri'], | 812 'names': ['glPointParameteri'], |
780 'arguments': 'GLenum pname, GLint param', }, | 813 'arguments': 'GLenum pname, GLint param', }, |
781 { 'return_type': 'void', | 814 { 'return_type': 'void', |
782 'names': ['glPolygonOffset'], | 815 'names': ['glPolygonOffset'], |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 } else { | 914 } else { |
882 GL_SERVICE_LOG(" " << ii << ": ---\\n" << str[ii] << "\\n---"); | 915 GL_SERVICE_LOG(" " << ii << ": ---\\n" << str[ii] << "\\n---"); |
883 } | 916 } |
884 } else { | 917 } else { |
885 GL_SERVICE_LOG(" " << ii << ": NULL"); | 918 GL_SERVICE_LOG(" " << ii << ": NULL"); |
886 } | 919 } |
887 } | 920 } |
888 }); | 921 }); |
889 """, }, | 922 """, }, |
890 { 'return_type': 'void', | 923 { 'return_type': 'void', |
| 924 'names': ['glStencilFillPathNV'], |
| 925 'arguments': 'GLuint path, GLenum fillMode, GLuint mask' }, |
| 926 { 'return_type': 'void', |
891 'names': ['glStencilFunc'], | 927 'names': ['glStencilFunc'], |
892 'arguments': 'GLenum func, GLint ref, GLuint mask', }, | 928 'arguments': 'GLenum func, GLint ref, GLuint mask', }, |
893 { 'return_type': 'void', | 929 { 'return_type': 'void', |
894 'names': ['glStencilFuncSeparate'], | 930 'names': ['glStencilFuncSeparate'], |
895 'arguments': 'GLenum face, GLenum func, GLint ref, GLuint mask', }, | 931 'arguments': 'GLenum face, GLenum func, GLint ref, GLuint mask', }, |
896 { 'return_type': 'void', | 932 { 'return_type': 'void', |
897 'names': ['glStencilMask'], | 933 'names': ['glStencilMask'], |
898 'arguments': 'GLuint mask', }, | 934 'arguments': 'GLuint mask', }, |
899 { 'return_type': 'void', | 935 { 'return_type': 'void', |
900 'names': ['glStencilMaskSeparate'], | 936 'names': ['glStencilMaskSeparate'], |
901 'arguments': 'GLenum face, GLuint mask', }, | 937 'arguments': 'GLenum face, GLuint mask', }, |
902 { 'return_type': 'void', | 938 { 'return_type': 'void', |
903 'names': ['glStencilOp'], | 939 'names': ['glStencilOp'], |
904 'arguments': 'GLenum fail, GLenum zfail, GLenum zpass', }, | 940 'arguments': 'GLenum fail, GLenum zfail, GLenum zpass', }, |
905 { 'return_type': 'void', | 941 { 'return_type': 'void', |
906 'names': ['glStencilOpSeparate'], | 942 'names': ['glStencilOpSeparate'], |
907 'arguments': 'GLenum face, GLenum fail, GLenum zfail, GLenum zpass', }, | 943 'arguments': 'GLenum face, GLenum fail, GLenum zfail, GLenum zpass', }, |
| 944 { 'return_type': 'void', |
| 945 'names': ['glStencilStrokePathNV'], |
| 946 'arguments': 'GLuint path, GLint reference, GLuint mask' }, |
| 947 { 'return_type': 'void', |
| 948 'names': ['glStencilThenCoverFillPathNV'], |
| 949 'arguments': 'GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode', |
| 950 'is_optional': True, }, |
| 951 { 'return_type': 'void', |
| 952 'names': ['glStencilThenCoverStrokePathNV'], |
| 953 'arguments': 'GLuint path, GLint reference, GLuint mask, GLenum coverMode', |
| 954 'is_optional': True, }, |
908 { 'return_type': 'GLboolean', | 955 { 'return_type': 'GLboolean', |
909 'known_as': 'glTestFenceAPPLE', | 956 'known_as': 'glTestFenceAPPLE', |
910 'versions': [{ 'name': 'glTestFenceAPPLE', | 957 'versions': [{ 'name': 'glTestFenceAPPLE', |
911 'extensions': ['GL_APPLE_fence'] }], | 958 'extensions': ['GL_APPLE_fence'] }], |
912 'arguments': 'GLuint fence', }, | 959 'arguments': 'GLuint fence', }, |
913 { 'return_type': 'GLboolean', | 960 { 'return_type': 'GLboolean', |
914 'names': ['glTestFenceNV'], | 961 'names': ['glTestFenceNV'], |
915 'arguments': 'GLuint fence', }, | 962 'arguments': 'GLuint fence', }, |
916 { 'return_type': 'void', | 963 { 'return_type': 'void', |
917 'names': ['glTexImage2D'], | 964 'names': ['glTexImage2D'], |
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1885 first_version = True | 1932 first_version = True |
1886 while i < len(func['versions']): | 1933 while i < len(func['versions']): |
1887 version = func['versions'][i] | 1934 version = func['versions'][i] |
1888 cond = GetBindingCondition(version) | 1935 cond = GetBindingCondition(version) |
1889 if first_version: | 1936 if first_version: |
1890 file.write(' if (%s) {\n ' % cond) | 1937 file.write(' if (%s) {\n ' % cond) |
1891 else: | 1938 else: |
1892 file.write(' else if (%s) {\n ' % (cond)) | 1939 file.write(' else if (%s) {\n ' % (cond)) |
1893 | 1940 |
1894 WriteFuncBinding(file, known_as, version['name']) | 1941 WriteFuncBinding(file, known_as, version['name']) |
1895 file.write('DCHECK(fn.%sFn);\n' % known_as) | 1942 if not 'is_optional' in func or not func['is_optional']: |
| 1943 file.write('DCHECK(fn.%sFn);\n' % known_as) |
1896 file.write('}\n') | 1944 file.write('}\n') |
1897 i += 1 | 1945 i += 1 |
1898 first_version = False | 1946 first_version = False |
1899 | 1947 |
1900 # TODO(jmadill): make more robust | 1948 # TODO(jmadill): make more robust |
1901 def IsClientExtensionFunc(func): | 1949 def IsClientExtensionFunc(func): |
1902 assert len(func['versions']) > 0 | 1950 assert len(func['versions']) > 0 |
1903 if 'client_extensions' in func['versions'][0]: | 1951 if 'client_extensions' in func['versions'][0]: |
1904 assert len(func['versions']) == 1 | 1952 assert len(func['versions']) == 1 |
1905 return True | 1953 return True |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2607 'gl_enums_implementation_autogen.h'), | 2655 'gl_enums_implementation_autogen.h'), |
2608 'wb') | 2656 'wb') |
2609 GenerateEnumUtils(header_file, enum_header_filenames) | 2657 GenerateEnumUtils(header_file, enum_header_filenames) |
2610 header_file.close() | 2658 header_file.close() |
2611 ClangFormat(header_file.name) | 2659 ClangFormat(header_file.name) |
2612 return 0 | 2660 return 0 |
2613 | 2661 |
2614 | 2662 |
2615 if __name__ == '__main__': | 2663 if __name__ == '__main__': |
2616 sys.exit(main(sys.argv[1:])) | 2664 sys.exit(main(sys.argv[1:])) |
OLD | NEW |