Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(269)

Side by Side Diff: ui/gl/generate_bindings.py

Issue 94963003: Take GL version and extensions correctly into account when binding functions (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Improve Windows initialization and renderBufferMultisample explanation Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/compositor/test/test_suite.cc ('k') | ui/gl/gl.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
11 import re 11 import re
12 import sys 12 import sys
13 13
14 """In case there are multiple versions of the same function, one that's listed
15 first takes priority if its conditions are met. If the function is an extension
16 function, finding the extension from the extension string is a condition for
17 binding it. The last version of the function is treated as a fallback option in
18 case no other versions were bound, so a non-null function pointer in the
19 bindings does not guarantee that the function is supported.
20
21 Function binding conditions can be specified manually by supplying a versions
22 array instead of the names array. Each version has the following keys:
23 name: Mandatory. Name of the function. Multiple versions can have the same
24 name but different conditions.
25 gl_versions: List of GL versions where the function is found.
26 extension/extensions: Extensions where the function is found. If not
27 specified, the extensions are determined based on GL
28 header files.
29 If the function exists in an extension header, you
30 may specify an empty array to prevent making that a
31 condition for binding.
32
33 By default, the function gets its name from the first name in its names or
34 versions array. This can be overridden by supplying a 'known_as' key.
35 """
14 GL_FUNCTIONS = [ 36 GL_FUNCTIONS = [
15 { 'return_type': 'void', 37 { 'return_type': 'void',
16 'names': ['glActiveTexture'], 38 'names': ['glActiveTexture'],
17 'arguments': 'GLenum texture', }, 39 'arguments': 'GLenum texture', },
18 { 'return_type': 'void', 40 { 'return_type': 'void',
19 'names': ['glAttachShader'], 41 'names': ['glAttachShader'],
20 'arguments': 'GLuint program, GLuint shader', }, 42 'arguments': 'GLuint program, GLuint shader', },
21 { 'return_type': 'void', 43 { 'return_type': 'void',
22 'names': ['glBeginQuery'], 44 'names': ['glBeginQuery'],
23 'arguments': 'GLenum target, GLuint id', }, 45 'arguments': 'GLenum target, GLuint id', },
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 'arguments': 'GLenum target, ' 328 'arguments': 'GLenum target, '
307 'GLenum attachment, GLenum pname, GLint* params', }, 329 'GLenum attachment, GLenum pname, GLint* params', },
308 { 'return_type': 'GLenum', 330 { 'return_type': 'GLenum',
309 'names': ['glGetGraphicsResetStatusARB', 331 'names': ['glGetGraphicsResetStatusARB',
310 'glGetGraphicsResetStatusEXT'], 332 'glGetGraphicsResetStatusEXT'],
311 'arguments': 'void', }, 333 'arguments': 'void', },
312 { 'return_type': 'void', 334 { 'return_type': 'void',
313 'names': ['glGetIntegerv'], 335 'names': ['glGetIntegerv'],
314 'arguments': 'GLenum pname, GLint* params', }, 336 'arguments': 'GLenum pname, GLint* params', },
315 { 'return_type': 'void', 337 { 'return_type': 'void',
316 'names': ['glGetProgramBinary', 'glGetProgramBinaryOES'], 338 'known_as': 'glGetProgramBinary',
339 'versions': [{ 'name': 'glGetProgramBinaryOES' },
340 { 'name': 'glGetProgramBinary',
341 'extension': 'GL_ARB_get_program_binary' },
342 { 'name': 'glGetProgramBinary' }],
317 'arguments': 'GLuint program, GLsizei bufSize, GLsizei* length, ' 343 'arguments': 'GLuint program, GLsizei bufSize, GLsizei* length, '
318 'GLenum* binaryFormat, GLvoid* binary', 344 'GLenum* binaryFormat, GLvoid* binary' },
319 'other_extensions': ['ARB_get_program_binary',
320 'OES_get_program_binary'] },
321 { 'return_type': 'void', 345 { 'return_type': 'void',
322 'names': ['glGetProgramiv'], 346 'names': ['glGetProgramiv'],
323 'arguments': 'GLuint program, GLenum pname, GLint* params', }, 347 'arguments': 'GLuint program, GLenum pname, GLint* params', },
324 { 'return_type': 'void', 348 { 'return_type': 'void',
325 'names': ['glGetProgramInfoLog'], 349 'names': ['glGetProgramInfoLog'],
326 'arguments': 350 'arguments':
327 'GLuint program, GLsizei bufsize, GLsizei* length, char* infolog', }, 351 'GLuint program, GLsizei bufsize, GLsizei* length, char* infolog', },
328 { 'return_type': 'void', 352 { 'return_type': 'void',
329 'names': ['glGetQueryiv'], 353 'names': ['glGetQueryiv'],
330 'arguments': 'GLenum target, GLenum pname, GLint* params', }, 354 'arguments': 'GLenum target, GLenum pname, GLint* params', },
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 { 'return_type': 'GLboolean', 452 { 'return_type': 'GLboolean',
429 'names': ['glIsTexture'], 453 'names': ['glIsTexture'],
430 'arguments': 'GLuint texture', }, 454 'arguments': 'GLuint texture', },
431 { 'return_type': 'void', 455 { 'return_type': 'void',
432 'names': ['glLineWidth'], 456 'names': ['glLineWidth'],
433 'arguments': 'GLfloat width', }, 457 'arguments': 'GLfloat width', },
434 { 'return_type': 'void', 458 { 'return_type': 'void',
435 'names': ['glLinkProgram'], 459 'names': ['glLinkProgram'],
436 'arguments': 'GLuint program', }, 460 'arguments': 'GLuint program', },
437 { 'return_type': 'void*', 461 { 'return_type': 'void*',
438 'names': ['glMapBuffer', 'glMapBufferOES'], 462 'known_as': 'glMapBuffer',
463 'names': ['glMapBufferOES', 'glMapBuffer'],
439 'arguments': 'GLenum target, GLenum access', }, 464 'arguments': 'GLenum target, GLenum access', },
440 { 'return_type': 'void*', 465 { 'return_type': 'void*',
441 'names': ['glMapBufferRange'], 466 'names': ['glMapBufferRange'],
442 'arguments': 467 'arguments':
443 'GLenum target, GLintptr offset, GLsizeiptr length, GLenum access', }, 468 'GLenum target, GLintptr offset, GLsizeiptr length, GLenum access', },
444 { 'return_type': 'void', 469 { 'return_type': 'void',
445 'names': ['glFlushMappedBufferRange'], 470 'names': ['glFlushMappedBufferRange'],
446 'arguments': 'GLenum target, GLintptr offset, GLsizeiptr length', }, 471 'arguments': 'GLenum target, GLintptr offset, GLsizeiptr length', },
447 { 'return_type': 'void', 472 { 'return_type': 'void',
448 'names': ['glPixelStorei'], 473 'names': ['glPixelStorei'],
449 'arguments': 'GLenum pname, GLint param', }, 474 'arguments': 'GLenum pname, GLint param', },
450 { 'return_type': 'void', 475 { 'return_type': 'void',
451 'names': ['glPointParameteri'], 476 'names': ['glPointParameteri'],
452 'arguments': 'GLenum pname, GLint param', }, 477 'arguments': 'GLenum pname, GLint param', },
453 { 'return_type': 'void', 478 { 'return_type': 'void',
454 'names': ['glPolygonOffset'], 479 'names': ['glPolygonOffset'],
455 'arguments': 'GLfloat factor, GLfloat units', }, 480 'arguments': 'GLfloat factor, GLfloat units', },
456 { 'return_type': 'void', 481 { 'return_type': 'void',
457 'names': ['glProgramBinary', 'glProgramBinaryOES'], 482 'known_as': 'glProgramBinary',
483 'versions': [{ 'name': 'glProgramBinaryOES' },
484 { 'name': 'glProgramBinary',
485 'extension': 'GL_ARB_get_program_binary' },
486 { 'name': 'glProgramBinary' }],
458 'arguments': 'GLuint program, GLenum binaryFormat, ' 487 'arguments': 'GLuint program, GLenum binaryFormat, '
459 'const GLvoid* binary, GLsizei length', 488 'const GLvoid* binary, GLsizei length' },
460 'other_extensions': ['ARB_get_program_binary',
461 'OES_get_program_binary'] },
462 { 'return_type': 'void', 489 { 'return_type': 'void',
463 'names': ['glProgramParameteri'], 490 'versions': [{ 'name': 'glProgramParameteri',
464 'arguments': 'GLuint program, GLenum pname, GLint value', 491 'extension': 'GL_ARB_get_program_binary' },
465 'other_extensions': ['ARB_get_program_binary'] }, 492 { 'name': 'glProgramParameteri' }],
493 'arguments': 'GLuint program, GLenum pname, GLint value' },
466 { 'return_type': 'void', 494 { 'return_type': 'void',
467 'names': ['glQueryCounter'], 495 'names': ['glQueryCounter'],
468 'arguments': 'GLuint id, GLenum target', }, 496 'arguments': 'GLuint id, GLenum target', },
469 { 'return_type': 'void', 497 { 'return_type': 'void',
470 'names': ['glReadBuffer'], 498 'names': ['glReadBuffer'],
471 'arguments': 'GLenum src', }, 499 'arguments': 'GLenum src', },
472 { 'return_type': 'void', 500 { 'return_type': 'void',
473 'names': ['glReadPixels'], 501 'names': ['glReadPixels'],
474 'arguments': 502 'arguments':
475 'GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, ' 503 'GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, '
476 'GLenum type, void* pixels', }, 504 'GLenum type, void* pixels', },
477 { 'return_type': 'void', 505 { 'return_type': 'void',
478 'names': ['glReleaseShaderCompiler'], 506 'names': ['glReleaseShaderCompiler'],
479 'arguments': 'void', }, 507 'arguments': 'void', },
508 # Multisampling API is different in different GL versions, some require an
509 # explicit resolve step for renderbuffers and/or FBO texture attachments and
510 # some do not. Multiple alternatives might be present in a single
511 # implementation, which require different use of the API and may have
512 # different performance (explicit resolve performing worse, for example).
513 # So even though the function signature is the same across versions, we split
514 # their definitions so that the function to use can be chosen correctly at a
515 # higher level.
516 # TODO(oetuaho@nvidia.com): Some of these might still be possible to combine.
517 # This could also fix weirdness in the mock bindings that's caused by the same
518 # function name appearing multiple times.
519 # This is the ES3 function, which requires explicit resolve:
480 { 'return_type': 'void', 520 { 'return_type': 'void',
481 'names': ['glRenderbufferStorageMultisample'], 521 'names': ['glRenderbufferStorageMultisample'],
482 'arguments': 'GLenum target, GLsizei samples, GLenum internalformat, ' 522 'arguments': 'GLenum target, GLsizei samples, GLenum internalformat, '
483 'GLsizei width, GLsizei height', }, 523 'GLsizei width, GLsizei height', },
524 # In desktop GL, EXT and core versions both have an explicit resolve step,
525 # though desktop core GL implicitly resolves when drawing to a window.
526 # TODO(oetuaho@nvidia.com): Right now this function also doubles as ES2 EXT
527 # function, which has implicit resolve, and for which the fallback is wrong.
528 # Fix this.
484 { 'return_type': 'void', 529 { 'return_type': 'void',
485 'names': ['glRenderbufferStorageMultisampleEXT', 530 'names': ['glRenderbufferStorageMultisampleEXT',
486 'glRenderbufferStorageMultisample'], 531 'glRenderbufferStorageMultisample'],
487 'arguments': 'GLenum target, GLsizei samples, GLenum internalformat, ' 532 'arguments': 'GLenum target, GLsizei samples, GLenum internalformat, '
488 'GLsizei width, GLsizei height', }, 533 'GLsizei width, GLsizei height', },
489 { 'return_type': 'void', 534 { 'return_type': 'void',
490 'names': ['glRenderbufferStorageMultisampleANGLE', 535 'names': ['glRenderbufferStorageMultisampleANGLE',
491 'glRenderbufferStorageMultisample'], 536 'glRenderbufferStorageMultisample'],
492 'arguments': 'GLenum target, GLsizei samples, GLenum internalformat, ' 537 'arguments': 'GLenum target, GLsizei samples, GLenum internalformat, '
493 'GLsizei width, GLsizei height', }, 538 'GLsizei width, GLsizei height', },
(...skipping 10 matching lines...) Expand all
504 'arguments': 'GLclampf value, GLboolean invert', }, 549 'arguments': 'GLclampf value, GLboolean invert', },
505 { 'return_type': 'void', 550 { 'return_type': 'void',
506 'names': ['glScissor'], 551 'names': ['glScissor'],
507 'arguments': 'GLint x, GLint y, GLsizei width, GLsizei height', }, 552 'arguments': 'GLint x, GLint y, GLsizei width, GLsizei height', },
508 { 'return_type': 'void', 553 { 'return_type': 'void',
509 'names': ['glShaderBinary'], 554 'names': ['glShaderBinary'],
510 'arguments': 'GLsizei n, const GLuint* shaders, GLenum binaryformat, ' 555 'arguments': 'GLsizei n, const GLuint* shaders, GLenum binaryformat, '
511 'const void* binary, GLsizei length', }, 556 'const void* binary, GLsizei length', },
512 { 'return_type': 'void', 557 { 'return_type': 'void',
513 'names': ['glShaderSource'], 558 'names': ['glShaderSource'],
514 'arguments': 559 'arguments': 'GLuint shader, GLsizei count, const char* const* str, '
515 'GLuint shader, GLsizei count, const char* const* str, const GLint* length ', 560 'const GLint* length',
516 'logging_code': """ 561 'logging_code': """
517 GL_SERVICE_LOG_CODE_BLOCK({ 562 GL_SERVICE_LOG_CODE_BLOCK({
518 for (GLsizei ii = 0; ii < count; ++ii) { 563 for (GLsizei ii = 0; ii < count; ++ii) {
519 if (str[ii]) { 564 if (str[ii]) {
520 if (length && length[ii] >= 0) { 565 if (length && length[ii] >= 0) {
521 std::string source(str[ii], length[ii]); 566 std::string source(str[ii], length[ii]);
522 GL_SERVICE_LOG(" " << ii << ": ---\\n" << source << "\\n---"); 567 GL_SERVICE_LOG(" " << ii << ": ---\\n" << source << "\\n---");
523 } else { 568 } else {
524 GL_SERVICE_LOG(" " << ii << ": ---\\n" << str[ii] << "\\n---"); 569 GL_SERVICE_LOG(" " << ii << ": ---\\n" << str[ii] << "\\n---");
525 } 570 }
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 'GLboolean transpose, const GLfloat* value', }, 674 'GLboolean transpose, const GLfloat* value', },
630 { 'return_type': 'void', 675 { 'return_type': 'void',
631 'names': ['glUniformMatrix3fv'], 676 'names': ['glUniformMatrix3fv'],
632 'arguments': 'GLint location, GLsizei count, ' 677 'arguments': 'GLint location, GLsizei count, '
633 'GLboolean transpose, const GLfloat* value', }, 678 'GLboolean transpose, const GLfloat* value', },
634 { 'return_type': 'void', 679 { 'return_type': 'void',
635 'names': ['glUniformMatrix4fv'], 680 'names': ['glUniformMatrix4fv'],
636 'arguments': 'GLint location, GLsizei count, ' 681 'arguments': 'GLint location, GLsizei count, '
637 'GLboolean transpose, const GLfloat* value', }, 682 'GLboolean transpose, const GLfloat* value', },
638 { 'return_type': 'GLboolean', 683 { 'return_type': 'GLboolean',
639 'names': ['glUnmapBuffer', 'glUnmapBufferOES'], 684 'known_as': 'glUnmapBuffer',
685 'names': ['glUnmapBufferOES', 'glUnmapBuffer'],
640 'arguments': 'GLenum target', }, 686 'arguments': 'GLenum target', },
641 { 'return_type': 'void', 687 { 'return_type': 'void',
642 'names': ['glUseProgram'], 688 'names': ['glUseProgram'],
643 'arguments': 'GLuint program', }, 689 'arguments': 'GLuint program', },
644 { 'return_type': 'void', 690 { 'return_type': 'void',
645 'names': ['glValidateProgram'], 691 'names': ['glValidateProgram'],
646 'arguments': 'GLuint program', }, 692 'arguments': 'GLuint program', },
647 { 'return_type': 'void', 693 { 'return_type': 'void',
648 'names': ['glVertexAttrib1f'], 694 'names': ['glVertexAttrib1f'],
649 'arguments': 'GLuint indx, GLfloat x', }, 695 'arguments': 'GLuint indx, GLfloat x', },
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 { 'return_type': 'void', 751 { 'return_type': 'void',
706 'names': ['glGetSynciv'], 752 'names': ['glGetSynciv'],
707 'arguments': 753 'arguments':
708 'GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length,' 754 'GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length,'
709 'GLint* values', }, 755 'GLint* values', },
710 { 'return_type': 'GLenum', 756 { 'return_type': 'GLenum',
711 'names': ['glClientWaitSync'], 757 'names': ['glClientWaitSync'],
712 'arguments': 758 'arguments':
713 'GLsync sync, GLbitfield flags, GLuint64 timeout', }, 759 'GLsync sync, GLbitfield flags, GLuint64 timeout', },
714 { 'return_type': 'void', 760 { 'return_type': 'void',
715 'names': ['glDrawArraysInstancedANGLE', 'glDrawArraysInstancedARB'], 761 'known_as': 'glDrawArraysInstancedANGLE',
762 'names': ['glDrawArraysInstancedARB', 'glDrawArraysInstancedANGLE'],
716 'arguments': 'GLenum mode, GLint first, GLsizei count, GLsizei primcount', }, 763 'arguments': 'GLenum mode, GLint first, GLsizei count, GLsizei primcount', },
717 { 'return_type': 'void', 764 { 'return_type': 'void',
718 'names': ['glDrawElementsInstancedANGLE', 'glDrawElementsInstancedARB'], 765 'known_as': 'glDrawElementsInstancedANGLE',
766 'names': ['glDrawElementsInstancedARB', 'glDrawElementsInstancedANGLE'],
719 'arguments': 767 'arguments':
720 'GLenum mode, GLsizei count, GLenum type, const void* indices, ' 768 'GLenum mode, GLsizei count, GLenum type, const void* indices, '
721 'GLsizei primcount', }, 769 'GLsizei primcount', },
722 { 'return_type': 'void', 770 { 'return_type': 'void',
723 'names': ['glVertexAttribDivisorANGLE', 'glVertexAttribDivisorARB'], 771 'known_as': 'glVertexAttribDivisorANGLE',
772 'names': ['glVertexAttribDivisorARB', 'glVertexAttribDivisorANGLE'],
724 'arguments': 773 'arguments':
725 'GLuint index, GLuint divisor', }, 774 'GLuint index, GLuint divisor', },
726 { 'return_type': 'void', 775 { 'return_type': 'void',
727 'names': ['glGenVertexArraysOES', 776 'known_as': 'glGenVertexArraysOES',
728 'glGenVertexArraysAPPLE', 777 'versions': [{ 'name': 'glGenVertexArrays',
729 'glGenVertexArrays'], 778 'gl_versions': ['gl3', 'gl4'] },
730 'arguments': 'GLsizei n, GLuint* arrays', 779 { 'name': 'glGenVertexArrays',
731 'other_extensions': ['OES_vertex_array_object', 780 'extension': 'GL_ARB_vertex_array_object' },
732 'APPLE_vertex_array_object', 781 { 'name': 'glGenVertexArraysOES' },
733 'ARB_vertex_array_object'] }, 782 { 'name': 'glGenVertexArraysAPPLE',
783 'extension': 'GL_APPLE_vertex_array_object' }],
784 'arguments': 'GLsizei n, GLuint* arrays', },
734 { 'return_type': 'void', 785 { 'return_type': 'void',
735 'names': ['glDeleteVertexArraysOES', 786 'known_as': 'glDeleteVertexArraysOES',
736 'glDeleteVertexArraysAPPLE', 787 'versions': [{ 'name': 'glDeleteVertexArrays',
737 'glDeleteVertexArrays'], 788 'gl_versions': ['gl3', 'gl4'] },
738 'arguments': 'GLsizei n, const GLuint* arrays', 789 { 'name': 'glDeleteVertexArrays',
739 'other_extensions': ['OES_vertex_array_object', 790 'extension': 'GL_ARB_vertex_array_object' },
740 'APPLE_vertex_array_object', 791 { 'name': 'glDeleteVertexArraysOES' },
741 'ARB_vertex_array_object'] }, 792 { 'name': 'glDeleteVertexArraysAPPLE',
793 'extension': 'GL_APPLE_vertex_array_object' }],
794 'arguments': 'GLsizei n, const GLuint* arrays' },
742 { 'return_type': 'void', 795 { 'return_type': 'void',
743 'names': ['glBindVertexArrayOES', 796 'known_as': 'glBindVertexArrayOES',
744 'glBindVertexArrayAPPLE', 797 'versions': [{ 'name': 'glBindVertexArray',
745 'glBindVertexArray'], 798 'gl_versions': ['gl3', 'gl4'] },
746 'arguments': 'GLuint array', 799 { 'name': 'glBindVertexArray',
747 'other_extensions': ['OES_vertex_array_object', 800 'extension': 'GL_ARB_vertex_array_object' },
748 'APPLE_vertex_array_object', 801 { 'name': 'glBindVertexArrayOES' },
749 'ARB_vertex_array_object'] }, 802 { 'name': 'glBindVertexArrayAPPLE',
803 'extension': 'GL_APPLE_vertex_array_object' }],
804 'arguments': 'GLuint array' },
750 { 'return_type': 'GLboolean', 805 { 'return_type': 'GLboolean',
751 'names': ['glIsVertexArrayOES', 806 'known_as': 'glIsVertexArrayOES',
752 'glIsVertexArrayAPPLE', 807 'versions': [{ 'name': 'glIsVertexArray',
753 'glIsVertexArray'], 808 'gl_versions': ['gl3', 'gl4'] },
754 'arguments': 'GLuint array', 809 { 'name': 'glIsVertexArray',
755 'other_extensions': ['OES_vertex_array_object', 810 'extension': 'GL_ARB_vertex_array_object' },
756 'APPLE_vertex_array_object', 811 { 'name': 'glIsVertexArrayOES' },
757 'ARB_vertex_array_object'] }, 812 { 'name': 'glIsVertexArrayAPPLE',
813 'extension': 'GL_APPLE_vertex_array_object' }],
814 'arguments': 'GLuint array' },
758 { 'return_type': 'void', 815 { 'return_type': 'void',
759 'names': ['glDiscardFramebufferEXT', 'glInvalidateFramebuffer'], 816 'known_as': 'glDiscardFramebufferEXT',
817 'versions': [{ 'name': 'glInvalidateFramebuffer',
818 'gl_versions': ['es3'],
819 'extensions': [] },
820 { 'name': 'glDiscardFramebufferEXT',
821 'gl_versions': ['es1', 'es2'] }],
760 'arguments': 'GLenum target, GLsizei numAttachments, ' 822 'arguments': 'GLenum target, GLsizei numAttachments, '
761 'const GLenum* attachments' }, 823 'const GLenum* attachments' },
762 ] 824 ]
763 825
764 OSMESA_FUNCTIONS = [ 826 OSMESA_FUNCTIONS = [
765 { 'return_type': 'OSMesaContext', 827 { 'return_type': 'OSMesaContext',
766 'names': ['OSMesaCreateContext'], 828 'names': ['OSMesaCreateContext'],
767 'arguments': 'GLenum format, OSMesaContext sharelist', }, 829 'arguments': 'GLenum format, OSMesaContext sharelist', },
768 { 'return_type': 'OSMesaContext', 830 { 'return_type': 'OSMesaContext',
769 'names': ['OSMesaCreateContextExt'], 831 'names': ['OSMesaCreateContextExt'],
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 'EGLint* num_config', }, 887 'EGLint* num_config', },
826 { 'return_type': 'EGLBoolean', 888 { 'return_type': 'EGLBoolean',
827 'names': ['eglChooseConfig'], 889 'names': ['eglChooseConfig'],
828 'arguments': 'EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, ' 890 'arguments': 'EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, '
829 'EGLint config_size, EGLint* num_config', }, 891 'EGLint config_size, EGLint* num_config', },
830 { 'return_type': 'EGLBoolean', 892 { 'return_type': 'EGLBoolean',
831 'names': ['eglGetConfigAttrib'], 893 'names': ['eglGetConfigAttrib'],
832 'arguments': 894 'arguments':
833 'EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value', }, 895 'EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value', },
834 { 'return_type': 'EGLImageKHR', 896 { 'return_type': 'EGLImageKHR',
835 'names': ['eglCreateImageKHR'], 897 'versions': [{ 'name': 'eglCreateImageKHR',
898 'extension': 'EGL_KHR_image_base' }],
836 'arguments': 899 'arguments':
837 'EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, ' 900 'EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, '
838 'const EGLint* attrib_list', 901 'const EGLint* attrib_list' },
839 'other_extensions': ['EGL_KHR_image_base'] },
840 { 'return_type': 'EGLBoolean', 902 { 'return_type': 'EGLBoolean',
841 'names': ['eglDestroyImageKHR'], 903 'versions': [{ 'name' : 'eglDestroyImageKHR',
842 'arguments': 'EGLDisplay dpy, EGLImageKHR image', 904 'extension': 'EGL_KHR_image_base' }],
843 'other_extensions': ['EGL_KHR_image_base'] }, 905 'arguments': 'EGLDisplay dpy, EGLImageKHR image' },
844 { 'return_type': 'EGLSurface', 906 { 'return_type': 'EGLSurface',
845 'names': ['eglCreateWindowSurface'], 907 'names': ['eglCreateWindowSurface'],
846 'arguments': 'EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, ' 908 'arguments': 'EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, '
847 'const EGLint* attrib_list', }, 909 'const EGLint* attrib_list', },
848 { 'return_type': 'EGLSurface', 910 { 'return_type': 'EGLSurface',
849 'names': ['eglCreatePbufferSurface'], 911 'names': ['eglCreatePbufferSurface'],
850 'arguments': 'EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list', }, 912 'arguments': 'EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list', },
851 { 'return_type': 'EGLSurface', 913 { 'return_type': 'EGLSurface',
852 'names': ['eglCreatePixmapSurface'], 914 'names': ['eglCreatePixmapSurface'],
853 'arguments': 'EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, ' 915 'arguments': 'EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, '
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 'arguments': 'const char* procname', }, 993 'arguments': 'const char* procname', },
932 { 'return_type': 'EGLBoolean', 994 { 'return_type': 'EGLBoolean',
933 'names': ['eglPostSubBufferNV'], 995 'names': ['eglPostSubBufferNV'],
934 'arguments': 'EGLDisplay dpy, EGLSurface surface, ' 996 'arguments': 'EGLDisplay dpy, EGLSurface surface, '
935 'EGLint x, EGLint y, EGLint width, EGLint height', }, 997 'EGLint x, EGLint y, EGLint width, EGLint height', },
936 { 'return_type': 'EGLBoolean', 998 { 'return_type': 'EGLBoolean',
937 'names': ['eglQuerySurfacePointerANGLE'], 999 'names': ['eglQuerySurfacePointerANGLE'],
938 'arguments': 1000 'arguments':
939 'EGLDisplay dpy, EGLSurface surface, EGLint attribute, void** value', }, 1001 'EGLDisplay dpy, EGLSurface surface, EGLint attribute, void** value', },
940 { 'return_type': 'EGLSyncKHR', 1002 { 'return_type': 'EGLSyncKHR',
941 'names': ['eglCreateSyncKHR'], 1003 'versions': [{ 'name': 'eglCreateSyncKHR',
942 'arguments': 'EGLDisplay dpy, EGLenum type, const EGLint* attrib_list', 1004 'extension': 'EGL_KHR_fence_sync' }],
943 'other_extensions': ['EGL_KHR_fence_sync'] }, 1005 'arguments': 'EGLDisplay dpy, EGLenum type, const EGLint* attrib_list' },
944 { 'return_type': 'EGLint', 1006 { 'return_type': 'EGLint',
945 'names': ['eglClientWaitSyncKHR'], 1007 'versions': [{ 'name': 'eglClientWaitSyncKHR',
1008 'extension': 'EGL_KHR_fence_sync' }],
946 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, ' 1009 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, '
947 'EGLTimeKHR timeout', 1010 'EGLTimeKHR timeout' },
948 'other_extensions': ['EGL_KHR_fence_sync'] },
949 { 'return_type': 'EGLBoolean', 1011 { 'return_type': 'EGLBoolean',
950 'names': ['eglGetSyncAttribKHR'], 1012 'versions': [{ 'name': 'eglGetSyncAttribKHR',
1013 'extension': 'EGL_KHR_fence_sync' }],
951 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, ' 1014 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, '
952 'EGLint* value', 1015 'EGLint* value' },
953 'other_extensions': ['EGL_KHR_fence_sync'] },
954 { 'return_type': 'EGLBoolean', 1016 { 'return_type': 'EGLBoolean',
955 'names': ['eglDestroySyncKHR'], 1017 'versions': [{ 'name': 'eglDestroySyncKHR',
956 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync', 1018 'extension': 'EGL_KHR_fence_sync' }],
957 'other_extensions': ['EGL_KHR_fence_sync'] }, 1019 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync' },
958 { 'return_type': 'EGLBoolean', 1020 { 'return_type': 'EGLBoolean',
959 'names': ['eglGetSyncValuesCHROMIUM'], 1021 'names': ['eglGetSyncValuesCHROMIUM'],
960 'arguments': 1022 'arguments':
961 'EGLDisplay dpy, EGLSurface surface, ' 1023 'EGLDisplay dpy, EGLSurface surface, '
962 'EGLuint64CHROMIUM* ust, EGLuint64CHROMIUM* msc, ' 1024 'EGLuint64CHROMIUM* ust, EGLuint64CHROMIUM* msc, '
963 'EGLuint64CHROMIUM* sbc', }, 1025 'EGLuint64CHROMIUM* sbc', },
964 { 'return_type': 'EGLint', 1026 { 'return_type': 'EGLint',
965 'names': ['eglWaitSyncKHR'], 1027 'versions': [{ 'name': 'eglWaitSyncKHR',
966 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint flags', 1028 'extension': 'EGL_KHR_fence_sync' }],
967 'other_extensions': ['EGL_KHR_wait_sync'] }, 1029 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint flags' }
968 ] 1030 ]
969 1031
970 WGL_FUNCTIONS = [ 1032 WGL_FUNCTIONS = [
971 { 'return_type': 'HGLRC', 1033 { 'return_type': 'HGLRC',
972 'names': ['wglCreateContext'], 1034 'names': ['wglCreateContext'],
973 'arguments': 'HDC hdc', }, 1035 'arguments': 'HDC hdc', },
974 { 'return_type': 'HGLRC', 1036 { 'return_type': 'HGLRC',
975 'names': ['wglCreateLayerContext'], 1037 'names': ['wglCreateLayerContext'],
976 'arguments': 'HDC hdc, int iLayerPlane', }, 1038 'arguments': 'HDC hdc, int iLayerPlane', },
977 { 'return_type': 'BOOL', 1039 { 'return_type': 'BOOL',
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1207 ], 1269 ],
1208 [ 1270 [
1209 'EGL_ANGLE_d3d_share_handle_client_buffer', 1271 'EGL_ANGLE_d3d_share_handle_client_buffer',
1210 'EGL_ANGLE_surface_d3d_texture_2d_share_handle', 1272 'EGL_ANGLE_surface_d3d_texture_2d_share_handle',
1211 ], 1273 ],
1212 ], 1274 ],
1213 [WGL_FUNCTIONS, 'wgl', ['GL/wglext.h'], []], 1275 [WGL_FUNCTIONS, 'wgl', ['GL/wglext.h'], []],
1214 [GLX_FUNCTIONS, 'glx', ['GL/glx.h', 'GL/glxext.h'], []], 1276 [GLX_FUNCTIONS, 'glx', ['GL/glx.h', 'GL/glxext.h'], []],
1215 ] 1277 ]
1216 1278
1217 def GenerateHeader(file, functions, set_name, used_extension_functions): 1279 def GenerateHeader(file, functions, set_name, used_extensions):
1218 """Generates gl_bindings_autogen_x.h""" 1280 """Generates gl_bindings_autogen_x.h"""
1219 1281
1220 # Write file header. 1282 # Write file header.
1221 file.write( 1283 file.write(
1222 """// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1284 """// Copyright (c) 2012 The Chromium Authors. All rights reserved.
1223 // Use of this source code is governed by a BSD-style license that can be 1285 // Use of this source code is governed by a BSD-style license that can be
1224 // found in the LICENSE file. 1286 // found in the LICENSE file.
1225 1287
1226 // This file is automatically generated. 1288 // This file is automatically generated.
1227 1289
1228 #ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_ 1290 #ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
1229 #define UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_ 1291 #define UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
1230 1292
1231 namespace gfx { 1293 namespace gfx {
1232 1294
1233 class GLContext; 1295 class GLContext;
1234 1296
1235 """ % {'name': set_name.upper()}) 1297 """ % {'name': set_name.upper()})
1236 1298
1237 # Write typedefs for function pointer types. Always use the GL name for the 1299 # Write typedefs for function pointer types. Always use the GL name for the
1238 # typedef. 1300 # typedef.
1239 file.write('\n') 1301 file.write('\n')
1240 for func in functions: 1302 for func in functions:
1241 file.write('typedef %s (GL_BINDING_CALL *%sProc)(%s);\n' % 1303 file.write('typedef %s (GL_BINDING_CALL *%sProc)(%s);\n' %
1242 (func['return_type'], func['names'][0], func['arguments'])) 1304 (func['return_type'], func['known_as'], func['arguments']))
1243 1305
1244 # Write declarations for booleans indicating which extensions are available. 1306 # Write declarations for booleans indicating which extensions are available.
1245 file.write('\n') 1307 file.write('\n')
1246 file.write("struct Extensions%s {\n" % set_name.upper()) 1308 file.write("struct Extensions%s {\n" % set_name.upper())
1247 for extension, ext_functions in used_extension_functions: 1309 for extension in used_extensions:
1248 file.write(' bool b_%s;\n' % extension) 1310 file.write(' bool b_%s;\n' % extension)
1249 file.write('};\n') 1311 file.write('};\n')
1250 file.write('\n') 1312 file.write('\n')
1251 1313
1252 # Write Procs struct. 1314 # Write Procs struct.
1253 file.write("struct Procs%s {\n" % set_name.upper()) 1315 file.write("struct Procs%s {\n" % set_name.upper())
1254 for func in functions: 1316 for func in functions:
1255 file.write(' %sProc %sFn;\n' % (func['names'][0], func['names'][0])) 1317 file.write(' %sProc %sFn;\n' % (func['known_as'], func['known_as']))
1256 file.write('};\n') 1318 file.write('};\n')
1257 file.write('\n') 1319 file.write('\n')
1258 1320
1259 # Write Api class. 1321 # Write Api class.
1260 file.write( 1322 file.write(
1261 """class GL_EXPORT %(name)sApi { 1323 """class GL_EXPORT %(name)sApi {
1262 public: 1324 public:
1263 %(name)sApi(); 1325 %(name)sApi();
1264 virtual ~%(name)sApi(); 1326 virtual ~%(name)sApi();
1265 1327
1266 """ % {'name': set_name.upper()}) 1328 """ % {'name': set_name.upper()})
1267 for func in functions: 1329 for func in functions:
1268 file.write(' virtual %s %sFn(%s) = 0;\n' % 1330 file.write(' virtual %s %sFn(%s) = 0;\n' %
1269 (func['return_type'], func['names'][0], func['arguments'])) 1331 (func['return_type'], func['known_as'], func['arguments']))
1270 file.write('};\n') 1332 file.write('};\n')
1271 file.write('\n') 1333 file.write('\n')
1272 1334
1273 file.write( '} // namespace gfx\n') 1335 file.write( '} // namespace gfx\n')
1274 1336
1275 # Write macros to invoke function pointers. Always use the GL name for the 1337 # Write macros to invoke function pointers. Always use the GL name for the
1276 # macro. 1338 # macro.
1277 file.write('\n') 1339 file.write('\n')
1278 for func in functions: 1340 for func in functions:
1279 file.write('#define %s ::gfx::g_current_%s_context->%sFn\n' % 1341 file.write('#define %s ::gfx::g_current_%s_context->%sFn\n' %
1280 (func['names'][0], set_name.lower(), func['names'][0])) 1342 (func['known_as'], set_name.lower(), func['known_as']))
1281 1343
1282 file.write('\n') 1344 file.write('\n')
1283 file.write('#endif // UI_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' % 1345 file.write('#endif // UI_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' %
1284 set_name.upper()) 1346 set_name.upper())
1285 1347
1286 1348
1287 def GenerateAPIHeader(file, functions, set_name, used_extension_functions): 1349 def GenerateAPIHeader(file, functions, set_name):
1288 """Generates gl_bindings_api_autogen_x.h""" 1350 """Generates gl_bindings_api_autogen_x.h"""
1289 1351
1290 # Write file header. 1352 # Write file header.
1291 file.write( 1353 file.write(
1292 """// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1354 """// Copyright (c) 2012 The Chromium Authors. All rights reserved.
1293 // Use of this source code is governed by a BSD-style license that can be 1355 // Use of this source code is governed by a BSD-style license that can be
1294 // found in the LICENSE file. 1356 // found in the LICENSE file.
1295 1357
1296 // This file is automatically generated. 1358 // This file is automatically generated.
1297 1359
1298 """ % {'name': set_name.upper()}) 1360 """ % {'name': set_name.upper()})
1299 1361
1300 # Write API declaration. 1362 # Write API declaration.
1301 for func in functions: 1363 for func in functions:
1302 file.write(' virtual %s %sFn(%s) OVERRIDE;\n' % 1364 file.write(' virtual %s %sFn(%s) OVERRIDE;\n' %
1303 (func['return_type'], func['names'][0], func['arguments'])) 1365 (func['return_type'], func['known_as'], func['arguments']))
1304 1366
1305 file.write('\n') 1367 file.write('\n')
1306 1368
1307 1369
1308 def GenerateMockHeader(file, functions, set_name, used_extension_functions): 1370 def GenerateMockHeader(file, functions, set_name):
1309 """Generates gl_mock_autogen_x.h""" 1371 """Generates gl_mock_autogen_x.h"""
1310 1372
1311 # Write file header. 1373 # Write file header.
1312 file.write( 1374 file.write(
1313 """// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1375 """// Copyright (c) 2012 The Chromium Authors. All rights reserved.
1314 // Use of this source code is governed by a BSD-style license that can be 1376 // Use of this source code is governed by a BSD-style license that can be
1315 // found in the LICENSE file. 1377 // found in the LICENSE file.
1316 1378
1317 // This file is automatically generated. 1379 // This file is automatically generated.
1318 1380
1319 """ % {'name': set_name.upper()}) 1381 """ % {'name': set_name.upper()})
1320 1382
1321 # Write API declaration. 1383 # Write API declaration.
1322 for func in functions: 1384 for func in functions:
1323 args = func['arguments'] 1385 args = func['arguments']
1324 if args == 'void': 1386 if args == 'void':
1325 args = '' 1387 args = ''
1326 arg_count = 0 1388 arg_count = 0
1327 if len(args): 1389 if len(args):
1328 arg_count = func['arguments'].count(',') + 1 1390 arg_count = func['arguments'].count(',') + 1
1329 file.write(' MOCK_METHOD%d(%s, %s(%s));\n' % 1391 file.write(' MOCK_METHOD%d(%s, %s(%s));\n' %
1330 (arg_count, func['names'][0][2:], func['return_type'], args)) 1392 (arg_count, func['known_as'][2:], func['return_type'], args))
1331 1393
1332 file.write('\n') 1394 file.write('\n')
1333 1395
1334 1396
1335 def GenerateInterfaceHeader( 1397 def GenerateInterfaceHeader(file, functions, set_name):
1336 file, functions, set_name, used_extension_functions):
1337 """Generates gl_interface_autogen_x.h""" 1398 """Generates gl_interface_autogen_x.h"""
1338 1399
1339 # Write file header. 1400 # Write file header.
1340 file.write( 1401 file.write(
1341 """// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1402 """// Copyright (c) 2012 The Chromium Authors. All rights reserved.
1342 // Use of this source code is governed by a BSD-style license that can be 1403 // Use of this source code is governed by a BSD-style license that can be
1343 // found in the LICENSE file. 1404 // found in the LICENSE file.
1344 1405
1345 // This file is automatically generated. 1406 // This file is automatically generated.
1346 1407
1347 """ % {'name': set_name.upper()}) 1408 """ % {'name': set_name.upper()})
1348 1409
1349 # Write API declaration. 1410 # Write API declaration.
1350 for func in functions: 1411 for func in functions:
1351 args = func['arguments'] 1412 args = func['arguments']
1352 if args == 'void': 1413 if args == 'void':
1353 args = '' 1414 args = ''
1354 file.write(' virtual %s %s(%s) = 0;\n' % 1415 file.write(' virtual %s %s(%s) = 0;\n' %
1355 (func['return_type'], func['names'][0][2:], args)) 1416 (func['return_type'], func['known_as'][2:], args))
1356 1417
1357 file.write('\n') 1418 file.write('\n')
1358 1419
1359 1420
1360 def GenerateSource(file, functions, set_name, used_extension_functions): 1421 def GenerateSource(file, functions, set_name, used_extensions):
1361 """Generates gl_bindings_autogen_x.cc""" 1422 """Generates gl_bindings_autogen_x.cc"""
1362 1423
1363 # Write file header. 1424 # Write file header.
1364 file.write( 1425 file.write(
1365 """// Copyright (c) 2011 The Chromium Authors. All rights reserved. 1426 """// Copyright (c) 2011 The Chromium Authors. All rights reserved.
1366 // Use of this source code is governed by a BSD-style license that can be 1427 // Use of this source code is governed by a BSD-style license that can be
1367 // found in the LICENSE file. 1428 // found in the LICENSE file.
1368 1429
1369 // This file is automatically generated. 1430 // This file is automatically generated.
1370 1431
1371 #include <string> 1432 #include <string>
1372 #include "base/debug/trace_event.h" 1433 #include "base/debug/trace_event.h"
1373 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 1434 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
1374 #include "ui/gl/gl_bindings.h" 1435 #include "ui/gl/gl_bindings.h"
1375 #include "ui/gl/gl_context.h" 1436 #include "ui/gl/gl_context.h"
1376 #include "ui/gl/gl_implementation.h" 1437 #include "ui/gl/gl_implementation.h"
1438 #include "ui/gl/gl_version_info.h"
1377 #include "ui/gl/gl_%s_api_implementation.h" 1439 #include "ui/gl/gl_%s_api_implementation.h"
1378 1440
1379 using gpu::gles2::GLES2Util; 1441 using gpu::gles2::GLES2Util;
1380 1442
1381 namespace gfx { 1443 namespace gfx {
1382 """ % set_name.lower()) 1444 """ % set_name.lower())
1383 1445
1384 # Write definitions of function pointers.
1385 file.write('\n') 1446 file.write('\n')
1386 file.write('static bool g_debugBindingsInitialized;\n') 1447 file.write('static bool g_debugBindingsInitialized;\n')
1387 file.write('Driver%s g_driver_%s;\n' % (set_name.upper(), set_name.lower())) 1448 file.write('Driver%s g_driver_%s;\n' % (set_name.upper(), set_name.lower()))
1388 file.write('\n') 1449 file.write('\n')
1389 1450
1390 # Write function to initialize the core function pointers. The code assumes 1451 # Write stub functions that take the place of some functions before a context
1391 # any non-NULL pointer returned by GetGLCoreProcAddress() is valid, although 1452 # is initialized. This is done to provide clear asserts on debug build and to
1392 # it may be overwritten by an extension function pointer later. 1453 # avoid crashing in case of a bug on release build.
1393 file.write('\n') 1454 file.write('\n')
1394 file.write('void Driver%s::InitializeBindings() {\n' % 1455 for func in functions:
1456 if len(func['names']) > 1:
1457 file.write('%s %sNotBound(%s) {\n' %
1458 (func['return_type'], func['known_as'], func['arguments']))
1459 file.write(' NOTREACHED();\n')
1460 return_type = func['return_type'].lower()
1461 # Returning 0 works for booleans, integers and pointers.
1462 if return_type != 'void':
1463 file.write(' return 0;\n')
1464 file.write('}\n')
1465
1466 # Write function to initialize the function pointers that are always the same
1467 # and to initialize bindings where choice of the function depends on the
1468 # extension string or the GL version to point to stub functions.
1469 file.write('\n')
1470 file.write('void Driver%s::InitializeStaticBindings() {\n' %
1395 set_name.upper()) 1471 set_name.upper())
1472
1473 def WriteFuncBinding(file, known_as, version_name):
1474 file.write(
1475 ' fn.%sFn = reinterpret_cast<%sProc>(GetGLProcAddress("%s"));\n' %
1476 (known_as, known_as, version_name))
1477
1396 for func in functions: 1478 for func in functions:
1397 first_name = func['names'][0] 1479 if len(func['names']) == 1:
1398 for i, name in enumerate(func['names']): 1480 WriteFuncBinding(file, func['known_as'], func['known_as'])
1399 if i: 1481 else:
1400 file.write(' if (!fn.%sFn)\n ' % first_name) 1482 file.write(' fn.%sFn = reinterpret_cast<%sProc>(%sNotBound);\n' %
1401 file.write( 1483 (func['known_as'], func['known_as'], func['known_as']))
1402 ' fn.%sFn = reinterpret_cast<%sProc>(' 1484
1403 'GetGLCoreProcAddress("%s"));\n' %
1404 (first_name, first_name, name))
1405 file.write('}\n') 1485 file.write('}\n')
1406 file.write('\n') 1486 file.write('\n')
1407 1487
1408 # Write function to initialize the extension function pointers. This function 1488 # Write function to initialize bindings where choice of the function depends
1409 # uses a current context to query which extensions are actually supported. 1489 # on the extension string or the GL version.
1410 file.write("""void Driver%s::InitializeExtensionBindings( 1490 file.write("""void Driver%s::InitializeDynamicBindings(GLContext* context) {
1411 GLContext* context) { 1491 DCHECK(context && context->IsCurrent(NULL));
1492 const GLVersionInfo* ver ALLOW_UNUSED = context->GetVersionInfo();
1493 std::string extensions ALLOW_UNUSED = context->GetExtensions();
1494 extensions += " ";
1495
1412 """ % set_name.upper()) 1496 """ % set_name.upper())
1413 file.write(' DCHECK(context && context->IsCurrent(NULL));\n') 1497 for extension in used_extensions:
1414 for extension, ext_functions in used_extension_functions: 1498 # Extra space at the end of the extension name is intentional, it is used
1415 file.write(' ext.b_%s = context->HasExtension("%s");\n' % 1499 # as a separator
1500 file.write(' ext.b_%s = extensions.find("%s ") != std::string::npos;\n' %
1416 (extension, extension)) 1501 (extension, extension))
1417 file.write(' if (ext.b_%s) {\n' % 1502
1418 (extension)) 1503 def VersionCondition(version):
1419 queried_entry_points = set() 1504 conditions = []
1420 for entry_point_name, function_name in ext_functions: 1505 if 'gl_versions' in version:
1421 # Replace the pointer unconditionally unless this extension has several 1506 gl_versions = version['gl_versions']
1422 # alternatives for the same entry point (e.g., 1507 version_cond = ' || '.join(['ver->is_%s' % gl for gl in gl_versions])
1423 # GL_ARB_blend_func_extended). 1508 conditions.append(version_cond)
1424 if entry_point_name in queried_entry_points: 1509 ext = []
1425 file.write(' if (!fn.%sFn)\n ' % entry_point_name) 1510 if 'extension' in version:
1426 file.write( 1511 ext.append(version['extension'])
1427 ' fn.%sFn = reinterpret_cast<%sProc>(GetGLProcAddress("%s"));\n' % 1512 if 'extensions' in version:
1428 (entry_point_name, entry_point_name, function_name)) 1513 ext.extend([e for e in version['extensions'] if e not in ext])
1429 queried_entry_points.add(entry_point_name) 1514 if ext:
1430 file.write(' }\n') 1515 ext_cond = ' || '.join(['ext.b_%s' % e for e in ext])
1516 conditions.append(ext_cond)
1517 def Wrap(cond):
1518 if ' || ' in cond:
1519 return '(%s)' % cond
1520 return cond
1521 return ' && '.join([Wrap(cond) for cond in conditions])
1522
1523 def WriteConditionalFuncBinding(file, func):
1524 assert len(func['versions']) > 1
1525 known_as = func['known_as']
1526 i = 0
1527 first_version = True
1528 while i < len(func['versions']):
1529 version = func['versions'][i]
1530 cond = VersionCondition(version)
1531 combined_conditions = [cond]
1532 while i + 1 < len(func['versions']) and \
1533 func['versions'][i + 1]['name'] == version['name']:
1534 i += 1
1535 combined_conditions.append(VersionCondition(func['versions'][i]))
1536 if len(combined_conditions) > 1:
1537 if [1 for cond in combined_conditions if cond == '']:
1538 cond = ''
1539 else:
1540 def Wrap(cond):
1541 if ' && ' in cond:
1542 return '(%s)' % cond
1543 return cond
1544 cond = ' || '.join([Wrap(cond) for cond in combined_conditions])
1545 # Don't make the last possible binding conditional on anything else but
1546 # that the function isn't already bound to avoid verbose specification
1547 # of functions which have both ARB and core versions with the same name,
1548 # and to be able to bind to mock extension functions in unit tests which
1549 # call InitializeDynamicGLBindings with a stub context that doesn't have
1550 # extensions in its extension string.
1551 # TODO(oetuaho@nvidia.com): Get rid of the fallback.
1552 # http://crbug.com/325668
1553 if cond != '' and i + 1 < len(func['versions']):
1554 if not first_version:
1555 file.write(' if (!fn.%sFn && (%s))\n ' % (known_as, cond))
1556 else:
1557 file.write(' if (%s)\n ' % cond)
1558 elif not first_version:
1559 file.write(' if (!fn.%sFn)\n ' % known_as)
1560 WriteFuncBinding(file, known_as, version['name'])
1561 i += 1
1562 first_version = False
1563
1564 for func in functions:
1565 if len(func['names']) > 1:
1566 file.write('\n')
1567 file.write(' fn.%sFn = 0;\n' % func['known_as'])
1568 file.write(' debug_fn.%sFn = 0;\n' % func['known_as'])
1569 WriteConditionalFuncBinding(file, func)
1570
1571 # Some new function pointers have been added, so update them in debug bindings
1572 file.write('\n')
1431 file.write(' if (g_debugBindingsInitialized)\n') 1573 file.write(' if (g_debugBindingsInitialized)\n')
1432 file.write(' UpdateDebugExtensionBindings();\n') 1574 file.write(' InitializeDebugBindings();\n')
1433 file.write('}\n') 1575 file.write('}\n')
1434 file.write('\n') 1576 file.write('\n')
1435 1577
1436 # Write logging wrappers for each function. 1578 # Write logging wrappers for each function.
1437 file.write('extern "C" {\n') 1579 file.write('extern "C" {\n')
1438 for func in functions: 1580 for func in functions:
1439 names = func['names']
1440 return_type = func['return_type'] 1581 return_type = func['return_type']
1441 arguments = func['arguments'] 1582 arguments = func['arguments']
1442 file.write('\n') 1583 file.write('\n')
1443 file.write('static %s GL_BINDING_CALL Debug_%s(%s) {\n' % 1584 file.write('static %s GL_BINDING_CALL Debug_%s(%s) {\n' %
1444 (return_type, names[0], arguments)) 1585 (return_type, func['known_as'], arguments))
1445 argument_names = re.sub( 1586 argument_names = re.sub(
1446 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments) 1587 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments)
1447 argument_names = re.sub( 1588 argument_names = re.sub(
1448 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names) 1589 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names)
1449 log_argument_names = re.sub( 1590 log_argument_names = re.sub(
1450 r'const char\* ([a-zA-Z0-9_]+)', r'CONSTCHAR_\1', arguments) 1591 r'const char\* ([a-zA-Z0-9_]+)', r'CONSTCHAR_\1', arguments)
1451 log_argument_names = re.sub( 1592 log_argument_names = re.sub(
1452 r'(const )?[a-zA-Z0-9_]+\* ([a-zA-Z0-9_]+)', 1593 r'(const )?[a-zA-Z0-9_]+\* ([a-zA-Z0-9_]+)',
1453 r'CONSTVOID_\2', log_argument_names) 1594 r'CONSTVOID_\2', log_argument_names)
1454 log_argument_names = re.sub( 1595 log_argument_names = re.sub(
1455 r'(?<!E)GLenum ([a-zA-Z0-9_]+)', r'GLenum_\1', log_argument_names) 1596 r'(?<!E)GLenum ([a-zA-Z0-9_]+)', r'GLenum_\1', log_argument_names)
1456 log_argument_names = re.sub( 1597 log_argument_names = re.sub(
1457 r'(?<!E)GLboolean ([a-zA-Z0-9_]+)', r'GLboolean_\1', log_argument_names) 1598 r'(?<!E)GLboolean ([a-zA-Z0-9_]+)', r'GLboolean_\1', log_argument_names)
1458 log_argument_names = re.sub( 1599 log_argument_names = re.sub(
1459 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', 1600 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2',
1460 log_argument_names) 1601 log_argument_names)
1461 log_argument_names = re.sub( 1602 log_argument_names = re.sub(
1462 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', 1603 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2',
1463 log_argument_names) 1604 log_argument_names)
1464 log_argument_names = re.sub( 1605 log_argument_names = re.sub(
1465 r'CONSTVOID_([a-zA-Z0-9_]+)', 1606 r'CONSTVOID_([a-zA-Z0-9_]+)',
1466 r'static_cast<const void*>(\1)', log_argument_names); 1607 r'static_cast<const void*>(\1)', log_argument_names)
1467 log_argument_names = re.sub( 1608 log_argument_names = re.sub(
1468 r'CONSTCHAR_([a-zA-Z0-9_]+)', r'\1', log_argument_names); 1609 r'CONSTCHAR_([a-zA-Z0-9_]+)', r'\1', log_argument_names)
1469 log_argument_names = re.sub( 1610 log_argument_names = re.sub(
1470 r'GLenum_([a-zA-Z0-9_]+)', r'GLES2Util::GetStringEnum(\1)', 1611 r'GLenum_([a-zA-Z0-9_]+)', r'GLES2Util::GetStringEnum(\1)',
1471 log_argument_names) 1612 log_argument_names)
1472 log_argument_names = re.sub( 1613 log_argument_names = re.sub(
1473 r'GLboolean_([a-zA-Z0-9_]+)', r'GLES2Util::GetStringBool(\1)', 1614 r'GLboolean_([a-zA-Z0-9_]+)', r'GLES2Util::GetStringBool(\1)',
1474 log_argument_names) 1615 log_argument_names)
1475 log_argument_names = log_argument_names.replace(',', ' << ", " <<') 1616 log_argument_names = log_argument_names.replace(',', ' << ", " <<')
1476 if argument_names == 'void' or argument_names == '': 1617 if argument_names == 'void' or argument_names == '':
1477 argument_names = '' 1618 argument_names = ''
1478 log_argument_names = '' 1619 log_argument_names = ''
1479 else: 1620 else:
1480 log_argument_names = " << " + log_argument_names 1621 log_argument_names = " << " + log_argument_names
1481 function_name = names[0] 1622 function_name = func['known_as']
1482 if return_type == 'void': 1623 if return_type == 'void':
1483 file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' % 1624 file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' %
1484 (function_name, log_argument_names)) 1625 (function_name, log_argument_names))
1485 file.write(' g_driver_%s.debug_fn.%sFn(%s);\n' % 1626 file.write(' g_driver_%s.debug_fn.%sFn(%s);\n' %
1486 (set_name.lower(), function_name, argument_names)) 1627 (set_name.lower(), function_name, argument_names))
1487 if 'logging_code' in func: 1628 if 'logging_code' in func:
1488 file.write("%s\n" % func['logging_code']) 1629 file.write("%s\n" % func['logging_code'])
1489 else: 1630 else:
1490 file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' % 1631 file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' %
1491 (function_name, log_argument_names)) 1632 (function_name, log_argument_names))
1492 file.write(' %s result = g_driver_%s.debug_fn.%sFn(%s);\n' % 1633 file.write(' %s result = g_driver_%s.debug_fn.%sFn(%s);\n' %
1493 (return_type, set_name.lower(), function_name, argument_names)) 1634 (return_type, set_name.lower(), function_name, argument_names))
1494 if 'logging_code' in func: 1635 if 'logging_code' in func:
1495 file.write("%s\n" % func['logging_code']) 1636 file.write("%s\n" % func['logging_code'])
1496 else: 1637 else:
1497 file.write(' GL_SERVICE_LOG("GL_RESULT: " << result);\n'); 1638 file.write(' GL_SERVICE_LOG("GL_RESULT: " << result);\n')
1498 file.write(' return result;\n') 1639 file.write(' return result;\n')
1499 file.write('}\n') 1640 file.write('}\n')
1500 file.write('} // extern "C"\n') 1641 file.write('} // extern "C"\n')
1501 1642
1502 # Write function to initialize the debug function pointers. 1643 # Write function to initialize the debug function pointers.
1503 file.write('\n') 1644 file.write('\n')
1504 file.write('void Driver%s::InitializeDebugBindings() {\n' % 1645 file.write('void Driver%s::InitializeDebugBindings() {\n' %
1505 set_name.upper()) 1646 set_name.upper())
1506 for func in functions: 1647 for func in functions:
1507 first_name = func['names'][0] 1648 first_name = func['known_as']
1508 file.write(' if (!debug_fn.%sFn) {\n' % first_name) 1649 file.write(' if (!debug_fn.%sFn) {\n' % first_name)
1509 file.write(' debug_fn.%sFn = fn.%sFn;\n' % (first_name, first_name)) 1650 file.write(' debug_fn.%sFn = fn.%sFn;\n' % (first_name, first_name))
1510 file.write(' fn.%sFn = Debug_%s;\n' % (first_name, first_name)) 1651 file.write(' fn.%sFn = Debug_%s;\n' % (first_name, first_name))
1511 file.write(' }\n') 1652 file.write(' }\n')
1512 file.write(' g_debugBindingsInitialized = true;\n') 1653 file.write(' g_debugBindingsInitialized = true;\n')
1513 file.write('}\n') 1654 file.write('}\n')
1514 1655
1515 # Write function to update the debug function pointers to extension functions
1516 # after the extensions have been initialized.
1517 file.write('\n')
1518 file.write('void Driver%s::UpdateDebugExtensionBindings() {\n' %
1519 set_name.upper())
1520 for extension, ext_functions in used_extension_functions:
1521 for name, _ in ext_functions:
1522 file.write(' if (debug_fn.%sFn != fn.%sFn &&\n' % (name, name))
1523 file.write(' fn.%sFn != Debug_%s) {\n' % (name, name))
1524 file.write(' debug_fn.%sFn = fn.%sFn;\n' % (name, name))
1525 file.write(' fn.%sFn = Debug_%s;\n' % (name, name))
1526 file.write(' }\n')
1527 file.write('}\n')
1528
1529 # Write function to clear all function pointers. 1656 # Write function to clear all function pointers.
1530 file.write('\n') 1657 file.write('\n')
1531 file.write("""void Driver%s::ClearBindings() { 1658 file.write("""void Driver%s::ClearBindings() {
1532 memset(this, 0, sizeof(*this)); 1659 memset(this, 0, sizeof(*this));
1533 } 1660 }
1534 """ % set_name.upper()) 1661 """ % set_name.upper())
1535 1662
1536 # Write GLApiBase functions 1663 # Write GLApiBase functions
1537 for func in functions: 1664 for func in functions:
1538 names = func['names']
1539 return_type = func['return_type'] 1665 return_type = func['return_type']
1540 arguments = func['arguments'] 1666 arguments = func['arguments']
1541 file.write('\n') 1667 file.write('\n')
1542 file.write('%s %sApiBase::%sFn(%s) {\n' % 1668 file.write('%s %sApiBase::%sFn(%s) {\n' %
1543 (return_type, set_name.upper(), names[0], arguments)) 1669 (return_type, set_name.upper(), func['known_as'], arguments))
1544 argument_names = re.sub( 1670 argument_names = re.sub(
1545 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments) 1671 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments)
1546 argument_names = re.sub( 1672 argument_names = re.sub(
1547 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names) 1673 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names)
1548 if argument_names == 'void' or argument_names == '': 1674 if argument_names == 'void' or argument_names == '':
1549 argument_names = '' 1675 argument_names = ''
1550 function_name = names[0] 1676 function_name = func['known_as']
1551 if return_type == 'void': 1677 if return_type == 'void':
1552 file.write(' driver_->fn.%sFn(%s);\n' % 1678 file.write(' driver_->fn.%sFn(%s);\n' %
1553 (function_name, argument_names)) 1679 (function_name, argument_names))
1554 else: 1680 else:
1555 file.write(' return driver_->fn.%sFn(%s);\n' % 1681 file.write(' return driver_->fn.%sFn(%s);\n' %
1556 (function_name, argument_names)) 1682 (function_name, argument_names))
1557 file.write('}\n') 1683 file.write('}\n')
1558 1684
1559 # Write TraceGLApi functions 1685 # Write TraceGLApi functions
1560 for func in functions: 1686 for func in functions:
1561 names = func['names']
1562 return_type = func['return_type'] 1687 return_type = func['return_type']
1563 arguments = func['arguments'] 1688 arguments = func['arguments']
1564 file.write('\n') 1689 file.write('\n')
1565 file.write('%s Trace%sApi::%sFn(%s) {\n' % 1690 file.write('%s Trace%sApi::%sFn(%s) {\n' %
1566 (return_type, set_name.upper(), names[0], arguments)) 1691 (return_type, set_name.upper(), func['known_as'], arguments))
1567 argument_names = re.sub( 1692 argument_names = re.sub(
1568 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments) 1693 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments)
1569 argument_names = re.sub( 1694 argument_names = re.sub(
1570 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names) 1695 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names)
1571 if argument_names == 'void' or argument_names == '': 1696 if argument_names == 'void' or argument_names == '':
1572 argument_names = '' 1697 argument_names = ''
1573 function_name = names[0] 1698 function_name = func['known_as']
1574 file.write(' TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::%s")\n' % 1699 file.write(' TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::%s")\n' %
1575 function_name) 1700 function_name)
1576 if return_type == 'void': 1701 if return_type == 'void':
1577 file.write(' %s_api_->%sFn(%s);\n' % 1702 file.write(' %s_api_->%sFn(%s);\n' %
1578 (set_name.lower(), function_name, argument_names)) 1703 (set_name.lower(), function_name, argument_names))
1579 else: 1704 else:
1580 file.write(' return %s_api_->%sFn(%s);\n' % 1705 file.write(' return %s_api_->%sFn(%s);\n' %
1581 (set_name.lower(), function_name, argument_names)) 1706 (set_name.lower(), function_name, argument_names))
1582 file.write('}\n') 1707 file.write('}\n')
1583 1708
(...skipping 14 matching lines...) Expand all
1598 #include <string.h> 1723 #include <string.h>
1599 1724
1600 #include "ui/gl/gl_interface.h" 1725 #include "ui/gl/gl_interface.h"
1601 1726
1602 namespace gfx { 1727 namespace gfx {
1603 """) 1728 """)
1604 # Write function that trampoline into the GLInterface. 1729 # Write function that trampoline into the GLInterface.
1605 for func in functions: 1730 for func in functions:
1606 file.write('\n') 1731 file.write('\n')
1607 file.write('%s GL_BINDING_CALL Mock_%s(%s) {\n' % 1732 file.write('%s GL_BINDING_CALL Mock_%s(%s) {\n' %
1608 (func['return_type'], func['names'][0], func['arguments'])) 1733 (func['return_type'], func['known_as'], func['arguments']))
1609 argument_names = re.sub(r'(const )?[a-zA-Z0-9]+((\s*const\s*)?\*)* ([a-zA-Z0 -9]+)', r'\4', 1734 arg_re = r'(const )?[a-zA-Z0-9]+((\s*const\s*)?\*)* ([a-zA-Z0-9]+)'
1610 func['arguments']) 1735 argument_names = re.sub(arg_re, r'\4', func['arguments'])
1611 if argument_names == 'void': 1736 if argument_names == 'void':
1612 argument_names = '' 1737 argument_names = ''
1613 function_name = func['names'][0][2:] 1738 function_name = func['known_as'][2:]
1614 if func['return_type'] == 'void': 1739 if func['return_type'] == 'void':
1615 file.write(' GLInterface::GetGLInterface()->%s(%s);\n' % 1740 file.write(' GLInterface::GetGLInterface()->%s(%s);\n' %
1616 (function_name, argument_names)) 1741 (function_name, argument_names))
1617 else: 1742 else:
1618 file.write(' return GLInterface::GetGLInterface()->%s(%s);\n' % 1743 file.write(' return GLInterface::GetGLInterface()->%s(%s);\n' %
1619 (function_name, argument_names)) 1744 (function_name, argument_names))
1620 file.write('}\n') 1745 file.write('}\n')
1621 1746
1622 # Write an 'invalid' function to catch code calling through uninitialized 1747 # Write an 'invalid' function to catch code calling through uninitialized
1623 # function pointers or trying to interpret the return value of 1748 # function pointers or trying to interpret the return value of
1624 # GLProcAddress(). 1749 # GLProcAddress().
1625 file.write('\n') 1750 file.write('\n')
1626 file.write('static void MockInvalidFunction() {\n') 1751 file.write('static void MockInvalidFunction() {\n')
1627 file.write(' NOTREACHED();\n') 1752 file.write(' NOTREACHED();\n')
1628 file.write('}\n') 1753 file.write('}\n')
1629 1754
1630 # Write a function to lookup a mock GL function based on its name. 1755 # Write a function to lookup a mock GL function based on its name.
1631 file.write('\n') 1756 file.write('\n')
1632 file.write('void* GL_BINDING_CALL GetMockGLProcAddress(const char* name) {\n') 1757 file.write('void* GL_BINDING_CALL GetMockGLProcAddress(const char* name) {\n')
1633 for func in functions: 1758 for func in functions:
1634 first_name = func['names'][0] 1759 for name in func['names']:
1635 file.write(' if (strcmp(name, "%s") == 0)\n' % first_name) 1760 file.write(' if (strcmp(name, "%s") == 0)\n' % name)
1636 file.write(' return reinterpret_cast<void*>(Mock_%s);\n' % first_name) 1761 file.write(
1762 ' return reinterpret_cast<void*>(Mock_%s);\n' % func['known_as'])
1637 # Always return a non-NULL pointer like some EGL implementations do. 1763 # Always return a non-NULL pointer like some EGL implementations do.
1638 file.write(' return reinterpret_cast<void*>(&MockInvalidFunction);\n') 1764 file.write(' return reinterpret_cast<void*>(&MockInvalidFunction);\n')
1639 file.write('}\n'); 1765 file.write('}\n')
1640 1766
1641 file.write('\n') 1767 file.write('\n')
1642 file.write('} // namespace gfx\n') 1768 file.write('} // namespace gfx\n')
1643 1769
1644 1770
1645 def ParseExtensionFunctionsFromHeader(header_file): 1771 def ParseExtensionFunctionsFromHeader(header_file):
1646 """Parse a C extension header file and return a map from extension names to 1772 """Parse a C extension header file and return a map from extension names to
1647 a list of functions. 1773 a list of functions.
1648 1774
1649 Args: 1775 Args:
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1712 return function_to_extensions 1838 return function_to_extensions
1713 1839
1714 1840
1715 def LooksLikeExtensionFunction(function): 1841 def LooksLikeExtensionFunction(function):
1716 """Heuristic to see if a function name is consistent with extension function 1842 """Heuristic to see if a function name is consistent with extension function
1717 naming.""" 1843 naming."""
1718 vendor = re.match(r'\w+?([A-Z][A-Z]+)$', function) 1844 vendor = re.match(r'\w+?([A-Z][A-Z]+)$', function)
1719 return vendor is not None and not vendor.group(1) in ['GL', 'API', 'DC'] 1845 return vendor is not None and not vendor.group(1) in ['GL', 'API', 'DC']
1720 1846
1721 1847
1722 def GetUsedExtensionFunctions(functions, extension_headers, extra_extensions): 1848 def FillExtensionsFromHeaders(functions, extension_headers, extra_extensions):
1723 """Determine which functions belong to extensions. 1849 """Determine which functions belong to extensions based on extension headers,
1850 and fill in this information to the functions table for functions that don't
1851 already have the information.
1724 1852
1725 Args: 1853 Args:
1726 functions: List of (return type, function names, arguments). 1854 functions: List of (return type, function versions, arguments).
1727 extension_headers: List of header file names. 1855 extension_headers: List of header file names.
1856 extra_extensions: Extensions to add to the list.
1728 Returns: 1857 Returns:
1729 List of (extension name, [function name alternatives]) sorted with least 1858 List of used extensions.
1730 preferred extensions first.
1731 """ 1859 """
1732 # Parse known extensions. 1860 # Parse known extensions.
1733 extensions = GetExtensionFunctions(extension_headers) 1861 extensions = GetExtensionFunctions(extension_headers)
1734 functions_to_extensions = GetFunctionToExtensionMap(extensions) 1862 functions_to_extensions = GetFunctionToExtensionMap(extensions)
1735 1863
1736 # Collect all used extension functions. 1864 # Fill in the extension information.
1737 used_extension_functions = collections.defaultdict(lambda: []) 1865 used_extensions = []
1738 for func in functions: 1866 for func in functions:
1739 for name in func['names']: 1867 for version in func['versions']:
1740 # Make sure we know about all extension functions. 1868 name = version['name']
1741 if (LooksLikeExtensionFunction(name) and 1869 # Make sure we know about all extensions and extension functions.
1742 not name in functions_to_extensions): 1870 if 'extension' in version:
1871 if version['extension'] not in used_extensions:
1872 used_extensions.append(version['extension'])
1873 elif 'extensions' in version:
1874 used_extensions.extend(
1875 [e for e in version['extensions'] if e not in used_extensions])
1876 elif name in functions_to_extensions:
1877 # If there are multiple versions with the same name, assume that they
1878 # already have all the correct conditions, we can't just blindly add
1879 # the same extension conditions to all of them
1880 if len([v for v in func['versions'] if v['name'] == name]) == 1:
1881 version['extensions'] = functions_to_extensions[name]
1882 used_extensions.extend(
1883 [e for e in version['extensions'] if e not in used_extensions])
1884 elif LooksLikeExtensionFunction(name):
1743 raise RuntimeError('%s looks like an extension function but does not ' 1885 raise RuntimeError('%s looks like an extension function but does not '
1744 'belong to any of the known extensions.' % name) 1886 'belong to any of the known extensions.' % name)
1745 if name in functions_to_extensions:
1746 extensions = functions_to_extensions[name][:]
1747 if 'other_extensions' in func:
1748 extensions.extend(func['other_extensions'])
1749 for extension in extensions:
1750 used_extension_functions[extension].append((func['names'][0], name))
1751 1887
1752 # Add extensions that do not have any functions. 1888 # Add extensions that do not have any functions.
1753 used_extension_functions.update(dict( 1889 used_extensions.extend(
1754 [(e, []) for e in extra_extensions if e not in used_extension_functions])) 1890 [e for e in extra_extensions if e not in used_extensions])
1755 1891
1756 def ExtensionSortKey(name): 1892 return used_extensions
1757 # Prefer ratified extensions and EXTs.
1758 preferences = ['_ARB_', '_OES_', '_EXT_', '']
1759 for i, category in enumerate(preferences):
1760 if category in name:
1761 return -i
1762 used_extension_functions = sorted(used_extension_functions.items(),
1763 key = lambda item: ExtensionSortKey(item[0]))
1764 return used_extension_functions
1765 1893
1766 1894
1767 def ResolveHeader(header, header_paths): 1895 def ResolveHeader(header, header_paths):
1768 paths = header_paths.split(':') 1896 paths = header_paths.split(':')
1769 1897
1770 # Always use a path for Chromium-specific extensions. They are extracted 1898 # Always use a path for Chromium-specific extensions. They are extracted
1771 # to separate files. 1899 # to separate files.
1772 paths.append('.') 1900 paths.append('.')
1773 paths.append('../../gpu') 1901 paths.append('../../gpu')
1774 1902
(...skipping 19 matching lines...) Expand all
1794 parser.add_option('--header-paths') 1922 parser.add_option('--header-paths')
1795 1923
1796 options, args = parser.parse_args(argv) 1924 options, args = parser.parse_args(argv)
1797 1925
1798 if options.inputs: 1926 if options.inputs:
1799 for [_, _, headers, _] in FUNCTION_SETS: 1927 for [_, _, headers, _] in FUNCTION_SETS:
1800 for header in headers: 1928 for header in headers:
1801 print ResolveHeader(header, options.header_paths) 1929 print ResolveHeader(header, options.header_paths)
1802 return 0 1930 return 0
1803 1931
1932 directory = '.'
1804 if len(args) >= 1: 1933 if len(args) >= 1:
1805 dir = args[0] 1934 directory = args[0]
1806 else:
1807 dir = '.'
1808 1935
1809 for [functions, set_name, extension_headers, extensions] in FUNCTION_SETS: 1936 for [functions, set_name, extension_headers, extensions] in FUNCTION_SETS:
1937 # Function names can be specified in two ways (list of unique names or list
1938 # of versions with different binding conditions), fill in the data both
1939 # ways:
1940 for func in functions:
1941 assert 'versions' in func or 'names' in func, 'Function with no names'
1942 if 'versions' not in func:
1943 func['versions'] = [{'name': n} for n in func['names']]
1944 if 'names' not in func:
1945 func['names'] = []
1946 for version in func['versions']:
1947 if version['name'] not in func['names']:
1948 func['names'].append(version['name'])
1949 # Use the first version's name unless otherwise specified
1950 if 'known_as' not in func:
1951 func['known_as'] = func['names'][0]
1952
1810 extension_headers = [ResolveHeader(h, options.header_paths) 1953 extension_headers = [ResolveHeader(h, options.header_paths)
1811 for h in extension_headers] 1954 for h in extension_headers]
1812 used_extension_functions = GetUsedExtensionFunctions( 1955 used_extensions = FillExtensionsFromHeaders(
1813 functions, extension_headers, extensions) 1956 functions, extension_headers, extensions)
1814 1957
1815 header_file = open( 1958 header_file = open(
1816 os.path.join(dir, 'gl_bindings_autogen_%s.h' % set_name), 'wb') 1959 os.path.join(directory, 'gl_bindings_autogen_%s.h' % set_name), 'wb')
1817 GenerateHeader(header_file, functions, set_name, used_extension_functions) 1960 GenerateHeader(header_file, functions, set_name, used_extensions)
1818 header_file.close() 1961 header_file.close()
1819 1962
1820 header_file = open( 1963 header_file = open(
1821 os.path.join(dir, 'gl_bindings_api_autogen_%s.h' % set_name), 'wb') 1964 os.path.join(directory, 'gl_bindings_api_autogen_%s.h' % set_name),
1822 GenerateAPIHeader( 1965 'wb')
1823 header_file, functions, set_name, used_extension_functions) 1966 GenerateAPIHeader(header_file, functions, set_name)
1824 header_file.close() 1967 header_file.close()
1825 1968
1826 source_file = open( 1969 source_file = open(
1827 os.path.join(dir, 'gl_bindings_autogen_%s.cc' % set_name), 'wb') 1970 os.path.join(directory, 'gl_bindings_autogen_%s.cc' % set_name), 'wb')
1828 GenerateSource(source_file, functions, set_name, used_extension_functions) 1971 GenerateSource(source_file, functions, set_name, used_extensions)
1829 source_file.close() 1972 source_file.close()
1830 1973
1831 header_file = open( 1974 header_file = open(
1832 os.path.join(dir, 'gl_interface_autogen_%s.h' % set_name), 'wb') 1975 os.path.join(directory, 'gl_interface_autogen_%s.h' % set_name), 'wb')
1833 GenerateInterfaceHeader( 1976 GenerateInterfaceHeader(header_file, functions, set_name)
1834 header_file, functions, set_name, used_extension_functions)
1835 header_file.close() 1977 header_file.close()
1836 1978
1837 header_file = open( 1979 header_file = open(
1838 os.path.join(dir, 'gl_mock_autogen_%s.h' % set_name), 'wb') 1980 os.path.join(directory, 'gl_mock_autogen_%s.h' % set_name), 'wb')
1839 GenerateMockHeader( 1981 GenerateMockHeader(header_file, functions, set_name)
1840 header_file, functions, set_name, used_extension_functions)
1841 header_file.close() 1982 header_file.close()
1842 1983
1843 source_file = open(os.path.join(dir, 'gl_bindings_autogen_mock.cc'), 'wb') 1984 source_file = open(os.path.join(directory, 'gl_bindings_autogen_mock.cc'),
1985 'wb')
1844 GenerateMockSource(source_file, GL_FUNCTIONS) 1986 GenerateMockSource(source_file, GL_FUNCTIONS)
1845 source_file.close() 1987 source_file.close()
1846 return 0 1988 return 0
1847 1989
1848 1990
1849 if __name__ == '__main__': 1991 if __name__ == '__main__':
1850 sys.exit(main(sys.argv[1:])) 1992 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « ui/compositor/test/test_suite.cc ('k') | ui/gl/gl.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698