| 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 |