Remove wpr.archive_info dependancy on page to avoid circular dependancies.
[chromium-blink-merge.git] / gpu / command_buffer / build_gles2_cmd_buffer.py
blob3f17ae69b15bc30bd2164364bf57241dd5327112
1 #!/usr/bin/env python
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
4 # found in the LICENSE file.
6 """code generator for GLES2 command buffers."""
8 import itertools
9 import os
10 import os.path
11 import sys
12 import re
13 import platform
14 from optparse import OptionParser
15 from subprocess import call
17 _SIZE_OF_UINT32 = 4
18 _SIZE_OF_COMMAND_HEADER = 4
19 _FIRST_SPECIFIC_COMMAND_ID = 256
21 _LICENSE = """// Copyright 2014 The Chromium Authors. All rights reserved.
22 // Use of this source code is governed by a BSD-style license that can be
23 // found in the LICENSE file.
25 """
27 _DO_NOT_EDIT_WARNING = """// This file is auto-generated from
28 // gpu/command_buffer/build_gles2_cmd_buffer.py
29 // It's formatted by clang-format using chromium coding style:
30 // clang-format -i -style=chromium filename
31 // DO NOT EDIT!
33 """
35 # This string is copied directly out of the gl2.h file from GLES2.0
37 # Edits:
39 # *) Any argument that is a resourceID has been changed to GLid<Type>.
40 # (not pointer arguments) and if it's allowed to be zero it's GLidZero<Type>
41 # If it's allowed to not exist it's GLidBind<Type>
43 # *) All GLenums have been changed to GLenumTypeOfEnum
45 _GL_TYPES = {
46 'GLenum': 'unsigned int',
47 'GLboolean': 'unsigned char',
48 'GLbitfield': 'unsigned int',
49 'GLbyte': 'signed char',
50 'GLshort': 'short',
51 'GLint': 'int',
52 'GLsizei': 'int',
53 'GLubyte': 'unsigned char',
54 'GLushort': 'unsigned short',
55 'GLuint': 'unsigned int',
56 'GLfloat': 'float',
57 'GLclampf': 'float',
58 'GLvoid': 'void',
59 'GLfixed': 'int',
60 'GLclampx': 'int'
63 _GL_TYPES_32 = {
64 'GLintptr': 'long int',
65 'GLsizeiptr': 'long int'
68 _GL_TYPES_64 = {
69 'GLintptr': 'long long int',
70 'GLsizeiptr': 'long long int'
73 # Capabilites selected with glEnable
74 _CAPABILITY_FLAGS = [
75 {'name': 'blend'},
76 {'name': 'cull_face'},
77 {'name': 'depth_test', 'state_flag': 'framebuffer_state_.clear_state_dirty'},
78 {'name': 'dither', 'default': True},
79 {'name': 'polygon_offset_fill'},
80 {'name': 'sample_alpha_to_coverage'},
81 {'name': 'sample_coverage'},
82 {'name': 'scissor_test'},
83 {'name': 'stencil_test',
84 'state_flag': 'framebuffer_state_.clear_state_dirty'},
85 {'name': 'rasterizer_discard', 'es3': True},
86 {'name': 'primitive_restart_fixed_index', 'es3': True},
89 _STATES = {
90 'ClearColor': {
91 'type': 'Normal',
92 'func': 'ClearColor',
93 'enum': 'GL_COLOR_CLEAR_VALUE',
94 'states': [
95 {'name': 'color_clear_red', 'type': 'GLfloat', 'default': '0.0f'},
96 {'name': 'color_clear_green', 'type': 'GLfloat', 'default': '0.0f'},
97 {'name': 'color_clear_blue', 'type': 'GLfloat', 'default': '0.0f'},
98 {'name': 'color_clear_alpha', 'type': 'GLfloat', 'default': '0.0f'},
101 'ClearDepthf': {
102 'type': 'Normal',
103 'func': 'ClearDepth',
104 'enum': 'GL_DEPTH_CLEAR_VALUE',
105 'states': [
106 {'name': 'depth_clear', 'type': 'GLclampf', 'default': '1.0f'},
109 'ColorMask': {
110 'type': 'Normal',
111 'func': 'ColorMask',
112 'enum': 'GL_COLOR_WRITEMASK',
113 'states': [
115 'name': 'color_mask_red',
116 'type': 'GLboolean',
117 'default': 'true',
118 'cached': True
121 'name': 'color_mask_green',
122 'type': 'GLboolean',
123 'default': 'true',
124 'cached': True
127 'name': 'color_mask_blue',
128 'type': 'GLboolean',
129 'default': 'true',
130 'cached': True
133 'name': 'color_mask_alpha',
134 'type': 'GLboolean',
135 'default': 'true',
136 'cached': True
139 'state_flag': 'framebuffer_state_.clear_state_dirty',
141 'ClearStencil': {
142 'type': 'Normal',
143 'func': 'ClearStencil',
144 'enum': 'GL_STENCIL_CLEAR_VALUE',
145 'states': [
146 {'name': 'stencil_clear', 'type': 'GLint', 'default': '0'},
149 'BlendColor': {
150 'type': 'Normal',
151 'func': 'BlendColor',
152 'enum': 'GL_BLEND_COLOR',
153 'states': [
154 {'name': 'blend_color_red', 'type': 'GLfloat', 'default': '0.0f'},
155 {'name': 'blend_color_green', 'type': 'GLfloat', 'default': '0.0f'},
156 {'name': 'blend_color_blue', 'type': 'GLfloat', 'default': '0.0f'},
157 {'name': 'blend_color_alpha', 'type': 'GLfloat', 'default': '0.0f'},
160 'BlendEquation': {
161 'type': 'SrcDst',
162 'func': 'BlendEquationSeparate',
163 'states': [
165 'name': 'blend_equation_rgb',
166 'type': 'GLenum',
167 'enum': 'GL_BLEND_EQUATION_RGB',
168 'default': 'GL_FUNC_ADD',
171 'name': 'blend_equation_alpha',
172 'type': 'GLenum',
173 'enum': 'GL_BLEND_EQUATION_ALPHA',
174 'default': 'GL_FUNC_ADD',
178 'BlendFunc': {
179 'type': 'SrcDst',
180 'func': 'BlendFuncSeparate',
181 'states': [
183 'name': 'blend_source_rgb',
184 'type': 'GLenum',
185 'enum': 'GL_BLEND_SRC_RGB',
186 'default': 'GL_ONE',
189 'name': 'blend_dest_rgb',
190 'type': 'GLenum',
191 'enum': 'GL_BLEND_DST_RGB',
192 'default': 'GL_ZERO',
195 'name': 'blend_source_alpha',
196 'type': 'GLenum',
197 'enum': 'GL_BLEND_SRC_ALPHA',
198 'default': 'GL_ONE',
201 'name': 'blend_dest_alpha',
202 'type': 'GLenum',
203 'enum': 'GL_BLEND_DST_ALPHA',
204 'default': 'GL_ZERO',
208 'PolygonOffset': {
209 'type': 'Normal',
210 'func': 'PolygonOffset',
211 'states': [
213 'name': 'polygon_offset_factor',
214 'type': 'GLfloat',
215 'enum': 'GL_POLYGON_OFFSET_FACTOR',
216 'default': '0.0f',
219 'name': 'polygon_offset_units',
220 'type': 'GLfloat',
221 'enum': 'GL_POLYGON_OFFSET_UNITS',
222 'default': '0.0f',
226 'CullFace': {
227 'type': 'Normal',
228 'func': 'CullFace',
229 'enum': 'GL_CULL_FACE_MODE',
230 'states': [
232 'name': 'cull_mode',
233 'type': 'GLenum',
234 'default': 'GL_BACK',
238 'FrontFace': {
239 'type': 'Normal',
240 'func': 'FrontFace',
241 'enum': 'GL_FRONT_FACE',
242 'states': [{'name': 'front_face', 'type': 'GLenum', 'default': 'GL_CCW'}],
244 'DepthFunc': {
245 'type': 'Normal',
246 'func': 'DepthFunc',
247 'enum': 'GL_DEPTH_FUNC',
248 'states': [{'name': 'depth_func', 'type': 'GLenum', 'default': 'GL_LESS'}],
250 'DepthRange': {
251 'type': 'Normal',
252 'func': 'DepthRange',
253 'enum': 'GL_DEPTH_RANGE',
254 'states': [
255 {'name': 'z_near', 'type': 'GLclampf', 'default': '0.0f'},
256 {'name': 'z_far', 'type': 'GLclampf', 'default': '1.0f'},
259 'SampleCoverage': {
260 'type': 'Normal',
261 'func': 'SampleCoverage',
262 'states': [
264 'name': 'sample_coverage_value',
265 'type': 'GLclampf',
266 'enum': 'GL_SAMPLE_COVERAGE_VALUE',
267 'default': '1.0f',
270 'name': 'sample_coverage_invert',
271 'type': 'GLboolean',
272 'enum': 'GL_SAMPLE_COVERAGE_INVERT',
273 'default': 'false',
277 'StencilMask': {
278 'type': 'FrontBack',
279 'func': 'StencilMaskSeparate',
280 'state_flag': 'framebuffer_state_.clear_state_dirty',
281 'states': [
283 'name': 'stencil_front_writemask',
284 'type': 'GLuint',
285 'enum': 'GL_STENCIL_WRITEMASK',
286 'default': '0xFFFFFFFFU',
287 'cached': True,
290 'name': 'stencil_back_writemask',
291 'type': 'GLuint',
292 'enum': 'GL_STENCIL_BACK_WRITEMASK',
293 'default': '0xFFFFFFFFU',
294 'cached': True,
298 'StencilOp': {
299 'type': 'FrontBack',
300 'func': 'StencilOpSeparate',
301 'states': [
303 'name': 'stencil_front_fail_op',
304 'type': 'GLenum',
305 'enum': 'GL_STENCIL_FAIL',
306 'default': 'GL_KEEP',
309 'name': 'stencil_front_z_fail_op',
310 'type': 'GLenum',
311 'enum': 'GL_STENCIL_PASS_DEPTH_FAIL',
312 'default': 'GL_KEEP',
315 'name': 'stencil_front_z_pass_op',
316 'type': 'GLenum',
317 'enum': 'GL_STENCIL_PASS_DEPTH_PASS',
318 'default': 'GL_KEEP',
321 'name': 'stencil_back_fail_op',
322 'type': 'GLenum',
323 'enum': 'GL_STENCIL_BACK_FAIL',
324 'default': 'GL_KEEP',
327 'name': 'stencil_back_z_fail_op',
328 'type': 'GLenum',
329 'enum': 'GL_STENCIL_BACK_PASS_DEPTH_FAIL',
330 'default': 'GL_KEEP',
333 'name': 'stencil_back_z_pass_op',
334 'type': 'GLenum',
335 'enum': 'GL_STENCIL_BACK_PASS_DEPTH_PASS',
336 'default': 'GL_KEEP',
340 'StencilFunc': {
341 'type': 'FrontBack',
342 'func': 'StencilFuncSeparate',
343 'states': [
345 'name': 'stencil_front_func',
346 'type': 'GLenum',
347 'enum': 'GL_STENCIL_FUNC',
348 'default': 'GL_ALWAYS',
351 'name': 'stencil_front_ref',
352 'type': 'GLint',
353 'enum': 'GL_STENCIL_REF',
354 'default': '0',
357 'name': 'stencil_front_mask',
358 'type': 'GLuint',
359 'enum': 'GL_STENCIL_VALUE_MASK',
360 'default': '0xFFFFFFFFU',
363 'name': 'stencil_back_func',
364 'type': 'GLenum',
365 'enum': 'GL_STENCIL_BACK_FUNC',
366 'default': 'GL_ALWAYS',
369 'name': 'stencil_back_ref',
370 'type': 'GLint',
371 'enum': 'GL_STENCIL_BACK_REF',
372 'default': '0',
375 'name': 'stencil_back_mask',
376 'type': 'GLuint',
377 'enum': 'GL_STENCIL_BACK_VALUE_MASK',
378 'default': '0xFFFFFFFFU',
382 'Hint': {
383 'type': 'NamedParameter',
384 'func': 'Hint',
385 'states': [
387 'name': 'hint_generate_mipmap',
388 'type': 'GLenum',
389 'enum': 'GL_GENERATE_MIPMAP_HINT',
390 'default': 'GL_DONT_CARE',
391 'gl_version_flag': '!is_desktop_core_profile'
394 'name': 'hint_fragment_shader_derivative',
395 'type': 'GLenum',
396 'enum': 'GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES',
397 'default': 'GL_DONT_CARE',
398 'extension_flag': 'oes_standard_derivatives'
402 'PixelStore': {
403 'type': 'NamedParameter',
404 'func': 'PixelStorei',
405 'states': [
407 'name': 'pack_alignment',
408 'type': 'GLint',
409 'enum': 'GL_PACK_ALIGNMENT',
410 'default': '4'
413 'name': 'unpack_alignment',
414 'type': 'GLint',
415 'enum': 'GL_UNPACK_ALIGNMENT',
416 'default': '4'
420 # TODO: Consider implemenenting these states
421 # GL_ACTIVE_TEXTURE
422 'LineWidth': {
423 'type': 'Normal',
424 'func': 'LineWidth',
425 'enum': 'GL_LINE_WIDTH',
426 'states': [
428 'name': 'line_width',
429 'type': 'GLfloat',
430 'default': '1.0f',
431 'range_checks': [{'check': "<= 0.0f", 'test_value': "0.0f"}],
432 'nan_check': True,
435 'DepthMask': {
436 'type': 'Normal',
437 'func': 'DepthMask',
438 'enum': 'GL_DEPTH_WRITEMASK',
439 'states': [
441 'name': 'depth_mask',
442 'type': 'GLboolean',
443 'default': 'true',
444 'cached': True
447 'state_flag': 'framebuffer_state_.clear_state_dirty',
449 'Scissor': {
450 'type': 'Normal',
451 'func': 'Scissor',
452 'enum': 'GL_SCISSOR_BOX',
453 'states': [
454 # NOTE: These defaults reset at GLES2DecoderImpl::Initialization.
456 'name': 'scissor_x',
457 'type': 'GLint',
458 'default': '0',
459 'expected': 'kViewportX',
462 'name': 'scissor_y',
463 'type': 'GLint',
464 'default': '0',
465 'expected': 'kViewportY',
468 'name': 'scissor_width',
469 'type': 'GLsizei',
470 'default': '1',
471 'expected': 'kViewportWidth',
474 'name': 'scissor_height',
475 'type': 'GLsizei',
476 'default': '1',
477 'expected': 'kViewportHeight',
481 'Viewport': {
482 'type': 'Normal',
483 'func': 'Viewport',
484 'enum': 'GL_VIEWPORT',
485 'states': [
486 # NOTE: These defaults reset at GLES2DecoderImpl::Initialization.
488 'name': 'viewport_x',
489 'type': 'GLint',
490 'default': '0',
491 'expected': 'kViewportX',
494 'name': 'viewport_y',
495 'type': 'GLint',
496 'default': '0',
497 'expected': 'kViewportY',
500 'name': 'viewport_width',
501 'type': 'GLsizei',
502 'default': '1',
503 'expected': 'kViewportWidth',
506 'name': 'viewport_height',
507 'type': 'GLsizei',
508 'default': '1',
509 'expected': 'kViewportHeight',
513 'MatrixValuesCHROMIUM': {
514 'type': 'NamedParameter',
515 'func': 'MatrixLoadfEXT',
516 'states': [
517 { 'enum': 'GL_PATH_MODELVIEW_MATRIX_CHROMIUM',
518 'enum_set': 'GL_PATH_MODELVIEW_CHROMIUM',
519 'name': 'modelview_matrix',
520 'type': 'GLfloat',
521 'default': [
522 '1.0f', '0.0f','0.0f','0.0f',
523 '0.0f', '1.0f','0.0f','0.0f',
524 '0.0f', '0.0f','1.0f','0.0f',
525 '0.0f', '0.0f','0.0f','1.0f',
527 'extension_flag': 'chromium_path_rendering',
529 { 'enum': 'GL_PATH_PROJECTION_MATRIX_CHROMIUM',
530 'enum_set': 'GL_PATH_PROJECTION_CHROMIUM',
531 'name': 'projection_matrix',
532 'type': 'GLfloat',
533 'default': [
534 '1.0f', '0.0f','0.0f','0.0f',
535 '0.0f', '1.0f','0.0f','0.0f',
536 '0.0f', '0.0f','1.0f','0.0f',
537 '0.0f', '0.0f','0.0f','1.0f',
539 'extension_flag': 'chromium_path_rendering',
545 # Named type info object represents a named type that is used in OpenGL call
546 # arguments. Each named type defines a set of valid OpenGL call arguments. The
547 # named types are used in 'cmd_buffer_functions.txt'.
548 # type: The actual GL type of the named type.
549 # valid: The list of values that are valid for both the client and the service.
550 # valid_es3: The list of values that are valid in OpenGL ES 3, but not ES 2.
551 # invalid: Examples of invalid values for the type. At least these values
552 # should be tested to be invalid.
553 # deprecated_es3: The list of values that are valid in OpenGL ES 2, but
554 # deprecated in ES 3.
555 # is_complete: The list of valid values of type are final and will not be
556 # modified during runtime.
557 _NAMED_TYPE_INFO = {
558 'BlitFilter': {
559 'type': 'GLenum',
560 'valid': [
561 'GL_NEAREST',
562 'GL_LINEAR',
564 'invalid': [
565 'GL_LINEAR_MIPMAP_LINEAR',
568 'FrameBufferTarget': {
569 'type': 'GLenum',
570 'valid': [
571 'GL_FRAMEBUFFER',
573 'invalid': [
574 'GL_DRAW_FRAMEBUFFER' ,
575 'GL_READ_FRAMEBUFFER' ,
578 'RenderBufferTarget': {
579 'type': 'GLenum',
580 'valid': [
581 'GL_RENDERBUFFER',
583 'invalid': [
584 'GL_FRAMEBUFFER',
587 'BufferTarget': {
588 'type': 'GLenum',
589 'valid': [
590 'GL_ARRAY_BUFFER',
591 'GL_ELEMENT_ARRAY_BUFFER',
593 'valid_es3': [
594 'GL_COPY_READ_BUFFER',
595 'GL_COPY_WRITE_BUFFER',
596 'GL_PIXEL_PACK_BUFFER',
597 'GL_PIXEL_UNPACK_BUFFER',
598 'GL_TRANSFORM_FEEDBACK_BUFFER',
599 'GL_UNIFORM_BUFFER',
601 'invalid': [
602 'GL_RENDERBUFFER',
605 'IndexedBufferTarget': {
606 'type': 'GLenum',
607 'valid': [
608 'GL_TRANSFORM_FEEDBACK_BUFFER',
609 'GL_UNIFORM_BUFFER',
611 'invalid': [
612 'GL_RENDERBUFFER',
615 'MapBufferAccess': {
616 'type': 'GLenum',
617 'valid': [
618 'GL_MAP_READ_BIT',
619 'GL_MAP_WRITE_BIT',
620 'GL_MAP_INVALIDATE_RANGE_BIT',
621 'GL_MAP_INVALIDATE_BUFFER_BIT',
622 'GL_MAP_FLUSH_EXPLICIT_BIT',
623 'GL_MAP_UNSYNCHRONIZED_BIT',
625 'invalid': [
626 'GL_SYNC_FLUSH_COMMANDS_BIT',
629 'Bufferiv': {
630 'type': 'GLenum',
631 'valid': [
632 'GL_COLOR',
633 'GL_STENCIL',
635 'invalid': [
636 'GL_RENDERBUFFER',
639 'Bufferuiv': {
640 'type': 'GLenum',
641 'valid': [
642 'GL_COLOR',
644 'invalid': [
645 'GL_RENDERBUFFER',
648 'Bufferfv': {
649 'type': 'GLenum',
650 'valid': [
651 'GL_COLOR',
652 'GL_DEPTH',
654 'invalid': [
655 'GL_RENDERBUFFER',
658 'Bufferfi': {
659 'type': 'GLenum',
660 'valid': [
661 'GL_DEPTH_STENCIL',
663 'invalid': [
664 'GL_RENDERBUFFER',
667 'BufferUsage': {
668 'type': 'GLenum',
669 'valid': [
670 'GL_STREAM_DRAW',
671 'GL_STATIC_DRAW',
672 'GL_DYNAMIC_DRAW',
674 'invalid': [
675 'GL_STATIC_READ',
678 'CompressedTextureFormat': {
679 'type': 'GLenum',
680 'valid': [
682 'valid_es3': [
683 'GL_COMPRESSED_R11_EAC',
684 'GL_COMPRESSED_SIGNED_R11_EAC',
685 'GL_COMPRESSED_RG11_EAC',
686 'GL_COMPRESSED_SIGNED_RG11_EAC',
687 'GL_COMPRESSED_RGB8_ETC2',
688 'GL_COMPRESSED_SRGB8_ETC2',
689 'GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2',
690 'GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2',
691 'GL_COMPRESSED_RGBA8_ETC2_EAC',
692 'GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC',
695 'GLState': {
696 'type': 'GLenum',
697 'valid': [
698 # NOTE: State an Capability entries added later.
699 'GL_ACTIVE_TEXTURE',
700 'GL_ALIASED_LINE_WIDTH_RANGE',
701 'GL_ALIASED_POINT_SIZE_RANGE',
702 'GL_ALPHA_BITS',
703 'GL_ARRAY_BUFFER_BINDING',
704 'GL_BLUE_BITS',
705 'GL_COMPRESSED_TEXTURE_FORMATS',
706 'GL_CURRENT_PROGRAM',
707 'GL_DEPTH_BITS',
708 'GL_DEPTH_RANGE',
709 'GL_ELEMENT_ARRAY_BUFFER_BINDING',
710 'GL_FRAMEBUFFER_BINDING',
711 'GL_GENERATE_MIPMAP_HINT',
712 'GL_GREEN_BITS',
713 'GL_IMPLEMENTATION_COLOR_READ_FORMAT',
714 'GL_IMPLEMENTATION_COLOR_READ_TYPE',
715 'GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS',
716 'GL_MAX_CUBE_MAP_TEXTURE_SIZE',
717 'GL_MAX_FRAGMENT_UNIFORM_VECTORS',
718 'GL_MAX_RENDERBUFFER_SIZE',
719 'GL_MAX_TEXTURE_IMAGE_UNITS',
720 'GL_MAX_TEXTURE_SIZE',
721 'GL_MAX_VARYING_VECTORS',
722 'GL_MAX_VERTEX_ATTRIBS',
723 'GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS',
724 'GL_MAX_VERTEX_UNIFORM_VECTORS',
725 'GL_MAX_VIEWPORT_DIMS',
726 'GL_NUM_COMPRESSED_TEXTURE_FORMATS',
727 'GL_NUM_SHADER_BINARY_FORMATS',
728 'GL_PACK_ALIGNMENT',
729 'GL_RED_BITS',
730 'GL_RENDERBUFFER_BINDING',
731 'GL_SAMPLE_BUFFERS',
732 'GL_SAMPLE_COVERAGE_INVERT',
733 'GL_SAMPLE_COVERAGE_VALUE',
734 'GL_SAMPLES',
735 'GL_SCISSOR_BOX',
736 'GL_SHADER_BINARY_FORMATS',
737 'GL_SHADER_COMPILER',
738 'GL_SUBPIXEL_BITS',
739 'GL_STENCIL_BITS',
740 'GL_TEXTURE_BINDING_2D',
741 'GL_TEXTURE_BINDING_CUBE_MAP',
742 'GL_UNPACK_ALIGNMENT',
743 'GL_UNPACK_FLIP_Y_CHROMIUM',
744 'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM',
745 'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM',
746 'GL_BIND_GENERATES_RESOURCE_CHROMIUM',
747 # we can add this because we emulate it if the driver does not support it.
748 'GL_VERTEX_ARRAY_BINDING_OES',
749 'GL_VIEWPORT',
751 'valid_es3': [
752 'GL_COPY_READ_BUFFER_BINDING',
753 'GL_COPY_WRITE_BUFFER_BINDING',
754 'GL_DRAW_BUFFER0',
755 'GL_DRAW_BUFFER1',
756 'GL_DRAW_BUFFER2',
757 'GL_DRAW_BUFFER3',
758 'GL_DRAW_BUFFER4',
759 'GL_DRAW_BUFFER5',
760 'GL_DRAW_BUFFER6',
761 'GL_DRAW_BUFFER7',
762 'GL_DRAW_BUFFER8',
763 'GL_DRAW_BUFFER9',
764 'GL_DRAW_BUFFER10',
765 'GL_DRAW_BUFFER11',
766 'GL_DRAW_BUFFER12',
767 'GL_DRAW_BUFFER13',
768 'GL_DRAW_BUFFER14',
769 'GL_DRAW_BUFFER15',
770 'GL_DRAW_FRAMEBUFFER_BINDING',
771 'GL_FRAGMENT_SHADER_DERIVATIVE_HINT',
772 'GL_MAJOR_VERSION',
773 'GL_MAX_3D_TEXTURE_SIZE',
774 'GL_MAX_ARRAY_TEXTURE_LAYERS',
775 'GL_MAX_COLOR_ATTACHMENTS',
776 'GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS',
777 'GL_MAX_COMBINED_UNIFORM_BLOCKS',
778 'GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS',
779 'GL_MAX_DRAW_BUFFERS',
780 'GL_MAX_ELEMENT_INDEX',
781 'GL_MAX_ELEMENTS_INDICES',
782 'GL_MAX_ELEMENTS_VERTICES',
783 'GL_MAX_FRAGMENT_INPUT_COMPONENTS',
784 'GL_MAX_FRAGMENT_UNIFORM_BLOCKS',
785 'GL_MAX_FRAGMENT_UNIFORM_COMPONENTS',
786 'GL_MAX_PROGRAM_TEXEL_OFFSET',
787 'GL_MAX_SAMPLES',
788 'GL_MAX_SERVER_WAIT_TIMEOUT',
789 'GL_MAX_TEXTURE_LOD_BIAS',
790 'GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS',
791 'GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS',
792 'GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS',
793 'GL_MAX_UNIFORM_BLOCK_SIZE',
794 'GL_MAX_UNIFORM_BUFFER_BINDINGS',
795 'GL_MAX_VARYING_COMPONENTS',
796 'GL_MAX_VERTEX_OUTPUT_COMPONENTS',
797 'GL_MAX_VERTEX_UNIFORM_BLOCKS',
798 'GL_MAX_VERTEX_UNIFORM_COMPONENTS',
799 'GL_MIN_PROGRAM_TEXEL_OFFSET',
800 'GL_MINOR_VERSION',
801 'GL_NUM_EXTENSIONS',
802 'GL_NUM_PROGRAM_BINARY_FORMATS',
803 'GL_PACK_ROW_LENGTH',
804 'GL_PACK_SKIP_PIXELS',
805 'GL_PACK_SKIP_ROWS',
806 'GL_PIXEL_PACK_BUFFER_BINDING',
807 'GL_PIXEL_UNPACK_BUFFER_BINDING',
808 'GL_PROGRAM_BINARY_FORMATS',
809 'GL_READ_BUFFER',
810 'GL_READ_FRAMEBUFFER_BINDING',
811 'GL_SAMPLER_BINDING',
812 'GL_TEXTURE_BINDING_2D_ARRAY',
813 'GL_TEXTURE_BINDING_3D',
814 'GL_TRANSFORM_FEEDBACK_BINDING',
815 'GL_TRANSFORM_FEEDBACK_ACTIVE',
816 'GL_TRANSFORM_FEEDBACK_BUFFER_BINDING',
817 'GL_TRANSFORM_FEEDBACK_PAUSED',
818 'GL_TRANSFORM_FEEDBACK_BUFFER_SIZE',
819 'GL_TRANSFORM_FEEDBACK_BUFFER_START',
820 'GL_UNIFORM_BUFFER_BINDING',
821 'GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT',
822 'GL_UNIFORM_BUFFER_SIZE',
823 'GL_UNIFORM_BUFFER_START',
824 'GL_UNPACK_IMAGE_HEIGHT',
825 'GL_UNPACK_ROW_LENGTH',
826 'GL_UNPACK_SKIP_IMAGES',
827 'GL_UNPACK_SKIP_PIXELS',
828 'GL_UNPACK_SKIP_ROWS',
829 # GL_VERTEX_ARRAY_BINDING is the same as GL_VERTEX_ARRAY_BINDING_OES
830 # 'GL_VERTEX_ARRAY_BINDING',
832 'invalid': [
833 'GL_FOG_HINT',
836 'IndexedGLState': {
837 'type': 'GLenum',
838 'valid': [
839 'GL_TRANSFORM_FEEDBACK_BUFFER_BINDING',
840 'GL_TRANSFORM_FEEDBACK_BUFFER_SIZE',
841 'GL_TRANSFORM_FEEDBACK_BUFFER_START',
842 'GL_UNIFORM_BUFFER_BINDING',
843 'GL_UNIFORM_BUFFER_SIZE',
844 'GL_UNIFORM_BUFFER_START',
846 'invalid': [
847 'GL_FOG_HINT',
850 'GetTexParamTarget': {
851 'type': 'GLenum',
852 'valid': [
853 'GL_TEXTURE_2D',
854 'GL_TEXTURE_CUBE_MAP',
856 'invalid': [
857 'GL_PROXY_TEXTURE_CUBE_MAP',
860 'TextureTarget': {
861 'type': 'GLenum',
862 'valid': [
863 'GL_TEXTURE_2D',
864 'GL_TEXTURE_CUBE_MAP_POSITIVE_X',
865 'GL_TEXTURE_CUBE_MAP_NEGATIVE_X',
866 'GL_TEXTURE_CUBE_MAP_POSITIVE_Y',
867 'GL_TEXTURE_CUBE_MAP_NEGATIVE_Y',
868 'GL_TEXTURE_CUBE_MAP_POSITIVE_Z',
869 'GL_TEXTURE_CUBE_MAP_NEGATIVE_Z',
871 'invalid': [
872 'GL_PROXY_TEXTURE_CUBE_MAP',
875 'Texture3DTarget': {
876 'type': 'GLenum',
877 'valid': [
878 'GL_TEXTURE_3D',
879 'GL_TEXTURE_2D_ARRAY',
881 'invalid': [
882 'GL_TEXTURE_2D',
885 'TextureBindTarget': {
886 'type': 'GLenum',
887 'valid': [
888 'GL_TEXTURE_2D',
889 'GL_TEXTURE_CUBE_MAP',
891 'valid_es3': [
892 'GL_TEXTURE_3D',
893 'GL_TEXTURE_2D_ARRAY',
895 'invalid': [
896 'GL_TEXTURE_1D',
897 'GL_TEXTURE_3D',
900 'TransformFeedbackBindTarget': {
901 'type': 'GLenum',
902 'valid': [
903 'GL_TRANSFORM_FEEDBACK',
905 'invalid': [
906 'GL_TEXTURE_2D',
909 'TransformFeedbackPrimitiveMode': {
910 'type': 'GLenum',
911 'valid': [
912 'GL_POINTS',
913 'GL_LINES',
914 'GL_TRIANGLES',
916 'invalid': [
917 'GL_LINE_LOOP',
920 'ShaderType': {
921 'type': 'GLenum',
922 'valid': [
923 'GL_VERTEX_SHADER',
924 'GL_FRAGMENT_SHADER',
926 'invalid': [
927 'GL_GEOMETRY_SHADER',
930 'FaceType': {
931 'type': 'GLenum',
932 'valid': [
933 'GL_FRONT',
934 'GL_BACK',
935 'GL_FRONT_AND_BACK',
938 'FaceMode': {
939 'type': 'GLenum',
940 'valid': [
941 'GL_CW',
942 'GL_CCW',
945 'CmpFunction': {
946 'type': 'GLenum',
947 'valid': [
948 'GL_NEVER',
949 'GL_LESS',
950 'GL_EQUAL',
951 'GL_LEQUAL',
952 'GL_GREATER',
953 'GL_NOTEQUAL',
954 'GL_GEQUAL',
955 'GL_ALWAYS',
958 'Equation': {
959 'type': 'GLenum',
960 'valid': [
961 'GL_FUNC_ADD',
962 'GL_FUNC_SUBTRACT',
963 'GL_FUNC_REVERSE_SUBTRACT',
965 'invalid': [
966 'GL_MIN',
967 'GL_MAX',
970 'SrcBlendFactor': {
971 'type': 'GLenum',
972 'valid': [
973 'GL_ZERO',
974 'GL_ONE',
975 'GL_SRC_COLOR',
976 'GL_ONE_MINUS_SRC_COLOR',
977 'GL_DST_COLOR',
978 'GL_ONE_MINUS_DST_COLOR',
979 'GL_SRC_ALPHA',
980 'GL_ONE_MINUS_SRC_ALPHA',
981 'GL_DST_ALPHA',
982 'GL_ONE_MINUS_DST_ALPHA',
983 'GL_CONSTANT_COLOR',
984 'GL_ONE_MINUS_CONSTANT_COLOR',
985 'GL_CONSTANT_ALPHA',
986 'GL_ONE_MINUS_CONSTANT_ALPHA',
987 'GL_SRC_ALPHA_SATURATE',
990 'DstBlendFactor': {
991 'type': 'GLenum',
992 'valid': [
993 'GL_ZERO',
994 'GL_ONE',
995 'GL_SRC_COLOR',
996 'GL_ONE_MINUS_SRC_COLOR',
997 'GL_DST_COLOR',
998 'GL_ONE_MINUS_DST_COLOR',
999 'GL_SRC_ALPHA',
1000 'GL_ONE_MINUS_SRC_ALPHA',
1001 'GL_DST_ALPHA',
1002 'GL_ONE_MINUS_DST_ALPHA',
1003 'GL_CONSTANT_COLOR',
1004 'GL_ONE_MINUS_CONSTANT_COLOR',
1005 'GL_CONSTANT_ALPHA',
1006 'GL_ONE_MINUS_CONSTANT_ALPHA',
1009 'Capability': {
1010 'type': 'GLenum',
1011 'valid': ["GL_%s" % cap['name'].upper() for cap in _CAPABILITY_FLAGS
1012 if 'es3' not in cap or cap['es3'] != True],
1013 'valid_es3': ["GL_%s" % cap['name'].upper() for cap in _CAPABILITY_FLAGS
1014 if 'es3' in cap and cap['es3'] == True],
1015 'invalid': [
1016 'GL_CLIP_PLANE0',
1017 'GL_POINT_SPRITE',
1020 'DrawMode': {
1021 'type': 'GLenum',
1022 'valid': [
1023 'GL_POINTS',
1024 'GL_LINE_STRIP',
1025 'GL_LINE_LOOP',
1026 'GL_LINES',
1027 'GL_TRIANGLE_STRIP',
1028 'GL_TRIANGLE_FAN',
1029 'GL_TRIANGLES',
1031 'invalid': [
1032 'GL_QUADS',
1033 'GL_POLYGON',
1036 'IndexType': {
1037 'type': 'GLenum',
1038 'valid': [
1039 'GL_UNSIGNED_BYTE',
1040 'GL_UNSIGNED_SHORT',
1042 'invalid': [
1043 'GL_UNSIGNED_INT',
1044 'GL_INT',
1047 'GetMaxIndexType': {
1048 'type': 'GLenum',
1049 'valid': [
1050 'GL_UNSIGNED_BYTE',
1051 'GL_UNSIGNED_SHORT',
1052 'GL_UNSIGNED_INT',
1054 'invalid': [
1055 'GL_INT',
1058 'Attachment': {
1059 'type': 'GLenum',
1060 'valid': [
1061 'GL_COLOR_ATTACHMENT0',
1062 'GL_DEPTH_ATTACHMENT',
1063 'GL_STENCIL_ATTACHMENT',
1066 'BackbufferAttachment': {
1067 'type': 'GLenum',
1068 'valid': [
1069 'GL_COLOR_EXT',
1070 'GL_DEPTH_EXT',
1071 'GL_STENCIL_EXT',
1074 'BufferParameter': {
1075 'type': 'GLenum',
1076 'valid': [
1077 'GL_BUFFER_SIZE',
1078 'GL_BUFFER_USAGE',
1080 'invalid': [
1081 'GL_PIXEL_PACK_BUFFER',
1084 'BufferMode': {
1085 'type': 'GLenum',
1086 'valid': [
1087 'GL_INTERLEAVED_ATTRIBS',
1088 'GL_SEPARATE_ATTRIBS',
1090 'invalid': [
1091 'GL_PIXEL_PACK_BUFFER',
1094 'FrameBufferParameter': {
1095 'type': 'GLenum',
1096 'valid': [
1097 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE',
1098 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME',
1099 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL',
1100 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE',
1103 'MatrixMode': {
1104 'type': 'GLenum',
1105 'valid': [
1106 'GL_PATH_PROJECTION_CHROMIUM',
1107 'GL_PATH_MODELVIEW_CHROMIUM',
1110 'ProgramParameter': {
1111 'type': 'GLenum',
1112 'valid': [
1113 'GL_DELETE_STATUS',
1114 'GL_LINK_STATUS',
1115 'GL_VALIDATE_STATUS',
1116 'GL_INFO_LOG_LENGTH',
1117 'GL_ATTACHED_SHADERS',
1118 'GL_ACTIVE_ATTRIBUTES',
1119 'GL_ACTIVE_ATTRIBUTE_MAX_LENGTH',
1120 'GL_ACTIVE_UNIFORMS',
1121 'GL_ACTIVE_UNIFORM_MAX_LENGTH',
1124 'QueryObjectParameter': {
1125 'type': 'GLenum',
1126 'valid': [
1127 'GL_QUERY_RESULT_EXT',
1128 'GL_QUERY_RESULT_AVAILABLE_EXT',
1131 'QueryParameter': {
1132 'type': 'GLenum',
1133 'valid': [
1134 'GL_CURRENT_QUERY_EXT',
1137 'QueryTarget': {
1138 'type': 'GLenum',
1139 'valid': [
1140 'GL_ANY_SAMPLES_PASSED_EXT',
1141 'GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT',
1142 'GL_COMMANDS_ISSUED_CHROMIUM',
1143 'GL_LATENCY_QUERY_CHROMIUM',
1144 'GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM',
1145 'GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM',
1146 'GL_COMMANDS_COMPLETED_CHROMIUM',
1149 'RenderBufferParameter': {
1150 'type': 'GLenum',
1151 'valid': [
1152 'GL_RENDERBUFFER_RED_SIZE',
1153 'GL_RENDERBUFFER_GREEN_SIZE',
1154 'GL_RENDERBUFFER_BLUE_SIZE',
1155 'GL_RENDERBUFFER_ALPHA_SIZE',
1156 'GL_RENDERBUFFER_DEPTH_SIZE',
1157 'GL_RENDERBUFFER_STENCIL_SIZE',
1158 'GL_RENDERBUFFER_WIDTH',
1159 'GL_RENDERBUFFER_HEIGHT',
1160 'GL_RENDERBUFFER_INTERNAL_FORMAT',
1163 'SamplerParameter': {
1164 'type': 'GLenum',
1165 'valid': [
1166 'GL_TEXTURE_MAG_FILTER',
1167 'GL_TEXTURE_MIN_FILTER',
1168 'GL_TEXTURE_MIN_LOD',
1169 'GL_TEXTURE_MAX_LOD',
1170 'GL_TEXTURE_WRAP_S',
1171 'GL_TEXTURE_WRAP_T',
1172 'GL_TEXTURE_WRAP_R',
1173 'GL_TEXTURE_COMPARE_MODE',
1174 'GL_TEXTURE_COMPARE_FUNC',
1176 'invalid': [
1177 'GL_GENERATE_MIPMAP',
1180 'ShaderParameter': {
1181 'type': 'GLenum',
1182 'valid': [
1183 'GL_SHADER_TYPE',
1184 'GL_DELETE_STATUS',
1185 'GL_COMPILE_STATUS',
1186 'GL_INFO_LOG_LENGTH',
1187 'GL_SHADER_SOURCE_LENGTH',
1188 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE',
1191 'ShaderPrecision': {
1192 'type': 'GLenum',
1193 'valid': [
1194 'GL_LOW_FLOAT',
1195 'GL_MEDIUM_FLOAT',
1196 'GL_HIGH_FLOAT',
1197 'GL_LOW_INT',
1198 'GL_MEDIUM_INT',
1199 'GL_HIGH_INT',
1202 'StringType': {
1203 'type': 'GLenum',
1204 'valid': [
1205 'GL_VENDOR',
1206 'GL_RENDERER',
1207 'GL_VERSION',
1208 'GL_SHADING_LANGUAGE_VERSION',
1209 'GL_EXTENSIONS',
1212 'TextureParameter': {
1213 'type': 'GLenum',
1214 'valid': [
1215 'GL_TEXTURE_MAG_FILTER',
1216 'GL_TEXTURE_MIN_FILTER',
1217 'GL_TEXTURE_POOL_CHROMIUM',
1218 'GL_TEXTURE_WRAP_S',
1219 'GL_TEXTURE_WRAP_T',
1221 'invalid': [
1222 'GL_GENERATE_MIPMAP',
1225 'TexturePool': {
1226 'type': 'GLenum',
1227 'valid': [
1228 'GL_TEXTURE_POOL_MANAGED_CHROMIUM',
1229 'GL_TEXTURE_POOL_UNMANAGED_CHROMIUM',
1232 'TextureWrapMode': {
1233 'type': 'GLenum',
1234 'valid': [
1235 'GL_CLAMP_TO_EDGE',
1236 'GL_MIRRORED_REPEAT',
1237 'GL_REPEAT',
1240 'TextureMinFilterMode': {
1241 'type': 'GLenum',
1242 'valid': [
1243 'GL_NEAREST',
1244 'GL_LINEAR',
1245 'GL_NEAREST_MIPMAP_NEAREST',
1246 'GL_LINEAR_MIPMAP_NEAREST',
1247 'GL_NEAREST_MIPMAP_LINEAR',
1248 'GL_LINEAR_MIPMAP_LINEAR',
1251 'TextureMagFilterMode': {
1252 'type': 'GLenum',
1253 'valid': [
1254 'GL_NEAREST',
1255 'GL_LINEAR',
1258 'TextureUsage': {
1259 'type': 'GLenum',
1260 'valid': [
1261 'GL_NONE',
1262 'GL_FRAMEBUFFER_ATTACHMENT_ANGLE',
1265 'VertexAttribute': {
1266 'type': 'GLenum',
1267 'valid': [
1268 # some enum that the decoder actually passes through to GL needs
1269 # to be the first listed here since it's used in unit tests.
1270 'GL_VERTEX_ATTRIB_ARRAY_NORMALIZED',
1271 'GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING',
1272 'GL_VERTEX_ATTRIB_ARRAY_ENABLED',
1273 'GL_VERTEX_ATTRIB_ARRAY_SIZE',
1274 'GL_VERTEX_ATTRIB_ARRAY_STRIDE',
1275 'GL_VERTEX_ATTRIB_ARRAY_TYPE',
1276 'GL_CURRENT_VERTEX_ATTRIB',
1279 'VertexPointer': {
1280 'type': 'GLenum',
1281 'valid': [
1282 'GL_VERTEX_ATTRIB_ARRAY_POINTER',
1285 'HintTarget': {
1286 'type': 'GLenum',
1287 'valid': [
1288 'GL_GENERATE_MIPMAP_HINT',
1290 'invalid': [
1291 'GL_PERSPECTIVE_CORRECTION_HINT',
1294 'HintMode': {
1295 'type': 'GLenum',
1296 'valid': [
1297 'GL_FASTEST',
1298 'GL_NICEST',
1299 'GL_DONT_CARE',
1302 'PixelStore': {
1303 'type': 'GLenum',
1304 'valid': [
1305 'GL_PACK_ALIGNMENT',
1306 'GL_UNPACK_ALIGNMENT',
1307 'GL_UNPACK_FLIP_Y_CHROMIUM',
1308 'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM',
1309 'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM',
1311 'invalid': [
1312 'GL_PACK_SWAP_BYTES',
1313 'GL_UNPACK_SWAP_BYTES',
1316 'PixelStoreAlignment': {
1317 'type': 'GLint',
1318 'valid': [
1319 '1',
1320 '2',
1321 '4',
1322 '8',
1324 'invalid': [
1325 '3',
1326 '9',
1329 'ReadPixelFormat': {
1330 'type': 'GLenum',
1331 'valid': [
1332 'GL_ALPHA',
1333 'GL_RGB',
1334 'GL_RGBA',
1337 'PixelType': {
1338 'type': 'GLenum',
1339 'valid': [
1340 'GL_UNSIGNED_BYTE',
1341 'GL_UNSIGNED_SHORT_5_6_5',
1342 'GL_UNSIGNED_SHORT_4_4_4_4',
1343 'GL_UNSIGNED_SHORT_5_5_5_1',
1345 'valid_es3': [
1346 'GL_BYTE',
1347 'GL_UNSIGNED_SHORT',
1348 'GL_SHORT',
1349 'GL_UNSIGNED_INT',
1350 'GL_INT',
1351 'GL_HALF_FLOAT',
1352 'GL_FLOAT',
1353 'GL_UNSIGNED_INT_2_10_10_10_REV',
1354 'GL_UNSIGNED_INT_10F_11F_11F_REV',
1355 'GL_UNSIGNED_INT_5_9_9_9_REV',
1356 'GL_UNSIGNED_INT_24_8',
1357 'GL_FLOAT_32_UNSIGNED_INT_24_8_REV',
1359 'invalid': [
1360 'GL_UNSIGNED_BYTE_3_3_2',
1363 'ReadPixelType': {
1364 'type': 'GLenum',
1365 'valid': [
1366 'GL_UNSIGNED_BYTE',
1367 'GL_UNSIGNED_SHORT_5_6_5',
1368 'GL_UNSIGNED_SHORT_4_4_4_4',
1369 'GL_UNSIGNED_SHORT_5_5_5_1',
1371 'invalid': [
1372 'GL_SHORT',
1373 'GL_INT',
1376 'RenderBufferFormat': {
1377 'type': 'GLenum',
1378 'valid': [
1379 'GL_RGBA4',
1380 'GL_RGB565',
1381 'GL_RGB5_A1',
1382 'GL_DEPTH_COMPONENT16',
1383 'GL_STENCIL_INDEX8',
1386 'ShaderBinaryFormat': {
1387 'type': 'GLenum',
1388 'valid': [
1391 'StencilOp': {
1392 'type': 'GLenum',
1393 'valid': [
1394 'GL_KEEP',
1395 'GL_ZERO',
1396 'GL_REPLACE',
1397 'GL_INCR',
1398 'GL_INCR_WRAP',
1399 'GL_DECR',
1400 'GL_DECR_WRAP',
1401 'GL_INVERT',
1404 'TextureFormat': {
1405 'type': 'GLenum',
1406 'valid': [
1407 'GL_ALPHA',
1408 'GL_LUMINANCE',
1409 'GL_LUMINANCE_ALPHA',
1410 'GL_RGB',
1411 'GL_RGBA',
1413 'valid_es3': [
1414 'GL_RED',
1415 'GL_RED_INTEGER',
1416 'GL_RG',
1417 'GL_RG_INTEGER',
1418 'GL_RGB_INTEGER',
1419 'GL_RGBA_INTEGER',
1420 'GL_DEPTH_COMPONENT',
1421 'GL_DEPTH_STENCIL',
1423 'invalid': [
1424 'GL_BGRA',
1425 'GL_BGR',
1428 'TextureInternalFormat': {
1429 'type': 'GLenum',
1430 'valid': [
1431 'GL_ALPHA',
1432 'GL_LUMINANCE',
1433 'GL_LUMINANCE_ALPHA',
1434 'GL_RGB',
1435 'GL_RGBA',
1437 'valid_es3': [
1438 'GL_R8',
1439 'GL_R8_SNORM',
1440 'GL_R16F',
1441 'GL_R32F',
1442 'GL_R8UI',
1443 'GL_R8I',
1444 'GL_R16UI',
1445 'GL_R16I',
1446 'GL_R32UI',
1447 'GL_R32I',
1448 'GL_RG8',
1449 'GL_RG8_SNORM',
1450 'GL_RG16F',
1451 'GL_RG32F',
1452 'GL_RG8UI',
1453 'GL_RG8I',
1454 'GL_RG16UI',
1455 'GL_RG16I',
1456 'GL_RG32UI',
1457 'GL_RG32I',
1458 'GL_RGB8',
1459 'GL_SRGB8',
1460 'GL_RGB565',
1461 'GL_RGB8_SNORM',
1462 'GL_R11F_G11F_B10F',
1463 'GL_RGB9_E5',
1464 'GL_RGB16F',
1465 'GL_RGB32F',
1466 'GL_RGB8UI',
1467 'GL_RGB8I',
1468 'GL_RGB16UI',
1469 'GL_RGB16I',
1470 'GL_RGB32UI',
1471 'GL_RGB32I',
1472 'GL_RGBA8',
1473 'GL_SRGB8_ALPHA8',
1474 'GL_RGBA8_SNORM',
1475 'GL_RGB5_A1',
1476 'GL_RGBA4',
1477 'GL_RGB10_A2',
1478 'GL_RGBA16F',
1479 'GL_RGBA32F',
1480 'GL_RGBA8UI',
1481 'GL_RGBA8I',
1482 'GL_RGB10_A2UI',
1483 'GL_RGBA16UI',
1484 'GL_RGBA16I',
1485 'GL_RGBA32UI',
1486 'GL_RGBA32I',
1487 # The DEPTH/STENCIL formats are not supported in CopyTexImage2D.
1488 # We will reject them dynamically in GPU command buffer.
1489 'GL_DEPTH_COMPONENT16',
1490 'GL_DEPTH_COMPONENT24',
1491 'GL_DEPTH_COMPONENT32F',
1492 'GL_DEPTH24_STENCIL8',
1493 'GL_DEPTH32F_STENCIL8',
1495 'invalid': [
1496 'GL_BGRA',
1497 'GL_BGR',
1500 'TextureInternalFormatStorage': {
1501 'type': 'GLenum',
1502 'valid': [
1503 'GL_RGB565',
1504 'GL_RGBA4',
1505 'GL_RGB5_A1',
1506 'GL_ALPHA8_EXT',
1507 'GL_LUMINANCE8_EXT',
1508 'GL_LUMINANCE8_ALPHA8_EXT',
1509 'GL_RGB8_OES',
1510 'GL_RGBA8_OES',
1512 'valid_es3': [
1513 'GL_R8',
1514 'GL_R8_SNORM',
1515 'GL_R16F',
1516 'GL_R32F',
1517 'GL_R8UI',
1518 'GL_R8I',
1519 'GL_R16UI',
1520 'GL_R16I',
1521 'GL_R32UI',
1522 'GL_R32I',
1523 'GL_RG8',
1524 'GL_RG8_SNORM',
1525 'GL_RG16F',
1526 'GL_RG32F',
1527 'GL_RG8UI',
1528 'GL_RG8I',
1529 'GL_RG16UI',
1530 'GL_RG16I',
1531 'GL_RG32UI',
1532 'GL_RG32I',
1533 'GL_SRGB8',
1534 'GL_RGB8_SNORM',
1535 'GL_R11F_G11F_B10F',
1536 'GL_RGB9_E5',
1537 'GL_RGB16F',
1538 'GL_RGB32F',
1539 'GL_RGB8UI',
1540 'GL_RGB8I',
1541 'GL_RGB16UI',
1542 'GL_RGB16I',
1543 'GL_RGB32UI',
1544 'GL_RGB32I',
1545 'GL_SRGB8_ALPHA8',
1546 'GL_RGBA8_SNORM',
1547 'GL_RGB10_A2',
1548 'GL_RGBA16F',
1549 'GL_RGBA32F',
1550 'GL_RGBA8UI',
1551 'GL_RGBA8I',
1552 'GL_RGB10_A2UI',
1553 'GL_RGBA16UI',
1554 'GL_RGBA16I',
1555 'GL_RGBA32UI',
1556 'GL_RGBA32I',
1557 'GL_DEPTH_COMPONENT16',
1558 'GL_DEPTH_COMPONENT24',
1559 'GL_DEPTH_COMPONENT32F',
1560 'GL_DEPTH24_STENCIL8',
1561 'GL_DEPTH32F_STENCIL8',
1562 'GL_COMPRESSED_R11_EAC',
1563 'GL_COMPRESSED_SIGNED_R11_EAC',
1564 'GL_COMPRESSED_RG11_EAC',
1565 'GL_COMPRESSED_SIGNED_RG11_EAC',
1566 'GL_COMPRESSED_RGB8_ETC2',
1567 'GL_COMPRESSED_SRGB8_ETC2',
1568 'GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2',
1569 'GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2',
1570 'GL_COMPRESSED_RGBA8_ETC2_EAC',
1571 'GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC',
1573 'deprecated_es3': [
1574 'GL_ALPHA8_EXT',
1575 'GL_LUMINANCE8_EXT',
1576 'GL_LUMINANCE8_ALPHA8_EXT',
1577 'GL_ALPHA16F_EXT',
1578 'GL_LUMINANCE16F_EXT',
1579 'GL_LUMINANCE_ALPHA16F_EXT',
1580 'GL_ALPHA32F_EXT',
1581 'GL_LUMINANCE32F_EXT',
1582 'GL_LUMINANCE_ALPHA32F_EXT',
1585 'ImageInternalFormat': {
1586 'type': 'GLenum',
1587 'valid': [
1588 'GL_RGB',
1589 'GL_RGB_YUV_420_CHROMIUM',
1590 'GL_RGBA',
1593 'ImageUsage': {
1594 'type': 'GLenum',
1595 'valid': [
1596 'GL_MAP_CHROMIUM',
1597 'GL_SCANOUT_CHROMIUM'
1600 'ValueBufferTarget': {
1601 'type': 'GLenum',
1602 'valid': [
1603 'GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM',
1606 'SubscriptionTarget': {
1607 'type': 'GLenum',
1608 'valid': [
1609 'GL_MOUSE_POSITION_CHROMIUM',
1612 'UniformParameter': {
1613 'type': 'GLenum',
1614 'valid': [
1615 'GL_UNIFORM_SIZE',
1616 'GL_UNIFORM_TYPE',
1617 'GL_UNIFORM_NAME_LENGTH',
1618 'GL_UNIFORM_BLOCK_INDEX',
1619 'GL_UNIFORM_OFFSET',
1620 'GL_UNIFORM_ARRAY_STRIDE',
1621 'GL_UNIFORM_MATRIX_STRIDE',
1622 'GL_UNIFORM_IS_ROW_MAJOR',
1624 'invalid': [
1625 'GL_UNIFORM_BLOCK_NAME_LENGTH',
1628 'UniformBlockParameter': {
1629 'type': 'GLenum',
1630 'valid': [
1631 'GL_UNIFORM_BLOCK_BINDING',
1632 'GL_UNIFORM_BLOCK_DATA_SIZE',
1633 'GL_UNIFORM_BLOCK_NAME_LENGTH',
1634 'GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS',
1635 'GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES',
1636 'GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER',
1637 'GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER',
1639 'invalid': [
1640 'GL_NEAREST',
1643 'VertexAttribType': {
1644 'type': 'GLenum',
1645 'valid': [
1646 'GL_BYTE',
1647 'GL_UNSIGNED_BYTE',
1648 'GL_SHORT',
1649 'GL_UNSIGNED_SHORT',
1650 # 'GL_FIXED', // This is not available on Desktop GL.
1651 'GL_FLOAT',
1653 'invalid': [
1654 'GL_DOUBLE',
1657 'VertexAttribIType': {
1658 'type': 'GLenum',
1659 'valid': [
1660 'GL_BYTE',
1661 'GL_UNSIGNED_BYTE',
1662 'GL_SHORT',
1663 'GL_UNSIGNED_SHORT',
1664 'GL_INT',
1665 'GL_UNSIGNED_INT',
1667 'invalid': [
1668 'GL_FLOAT',
1669 'GL_DOUBLE',
1672 'TextureBorder': {
1673 'type': 'GLint',
1674 'is_complete': True,
1675 'valid': [
1676 '0',
1678 'invalid': [
1679 '1',
1682 'VertexAttribSize': {
1683 'type': 'GLint',
1684 'valid': [
1685 '1',
1686 '2',
1687 '3',
1688 '4',
1690 'invalid': [
1691 '0',
1692 '5',
1695 'ZeroOnly': {
1696 'type': 'GLint',
1697 'is_complete': True,
1698 'valid': [
1699 '0',
1701 'invalid': [
1702 '1',
1705 'FalseOnly': {
1706 'type': 'GLboolean',
1707 'is_complete': True,
1708 'valid': [
1709 'false',
1711 'invalid': [
1712 'true',
1715 'ResetStatus': {
1716 'type': 'GLenum',
1717 'valid': [
1718 'GL_GUILTY_CONTEXT_RESET_ARB',
1719 'GL_INNOCENT_CONTEXT_RESET_ARB',
1720 'GL_UNKNOWN_CONTEXT_RESET_ARB',
1723 'SyncCondition': {
1724 'type': 'GLenum',
1725 'is_complete': True,
1726 'valid': [
1727 'GL_SYNC_GPU_COMMANDS_COMPLETE',
1729 'invalid': [
1730 '0',
1733 'SyncFlags': {
1734 'type': 'GLbitfield',
1735 'is_complete': True,
1736 'valid': [
1737 '0',
1739 'invalid': [
1740 '1',
1743 'SyncFlushFlags': {
1744 'type': 'GLbitfield',
1745 'valid': [
1746 'GL_SYNC_FLUSH_COMMANDS_BIT',
1747 '0',
1749 'invalid': [
1750 '0xFFFFFFFF',
1753 'SyncParameter': {
1754 'type': 'GLenum',
1755 'valid': [
1756 'GL_SYNC_STATUS', # This needs to be the 1st; all others are cached.
1757 'GL_OBJECT_TYPE',
1758 'GL_SYNC_CONDITION',
1759 'GL_SYNC_FLAGS',
1761 'invalid': [
1762 'GL_SYNC_FENCE',
1767 # This table specifies the different pepper interfaces that are supported for
1768 # GL commands. 'dev' is true if it's a dev interface.
1769 _PEPPER_INTERFACES = [
1770 {'name': '', 'dev': False},
1771 {'name': 'InstancedArrays', 'dev': False},
1772 {'name': 'FramebufferBlit', 'dev': False},
1773 {'name': 'FramebufferMultisample', 'dev': False},
1774 {'name': 'ChromiumEnableFeature', 'dev': False},
1775 {'name': 'ChromiumMapSub', 'dev': False},
1776 {'name': 'Query', 'dev': False},
1777 {'name': 'VertexArrayObject', 'dev': False},
1778 {'name': 'DrawBuffers', 'dev': True},
1781 # A function info object specifies the type and other special data for the
1782 # command that will be generated. A base function info object is generated by
1783 # parsing the "cmd_buffer_functions.txt", one for each function in the
1784 # file. These function info objects can be augmented and their values can be
1785 # overridden by adding an object to the table below.
1787 # Must match function names specified in "cmd_buffer_functions.txt".
1789 # cmd_comment: A comment added to the cmd format.
1790 # type: defines which handler will be used to generate code.
1791 # decoder_func: defines which function to call in the decoder to execute the
1792 # corresponding GL command. If not specified the GL command will
1793 # be called directly.
1794 # gl_test_func: GL function that is expected to be called when testing.
1795 # cmd_args: The arguments to use for the command. This overrides generating
1796 # them based on the GL function arguments.
1797 # gen_cmd: Whether or not this function geneates a command. Default = True.
1798 # data_transfer_methods: Array of methods that are used for transfering the
1799 # pointer data. Possible values: 'immediate', 'shm', 'bucket'.
1800 # The default is 'immediate' if the command has one pointer
1801 # argument, otherwise 'shm'. One command is generated for each
1802 # transfer method. Affects only commands which are not of type
1803 # 'HandWritten', 'GETn' or 'GLcharN'.
1804 # Note: the command arguments that affect this are the final args,
1805 # taking cmd_args override into consideration.
1806 # impl_func: Whether or not to generate the GLES2Implementation part of this
1807 # command.
1808 # impl_decl: Whether or not to generate the GLES2Implementation declaration
1809 # for this command.
1810 # needs_size: If True a data_size field is added to the command.
1811 # count: The number of units per element. For PUTn or PUT types.
1812 # use_count_func: If True the actual data count needs to be computed; the count
1813 # argument specifies the maximum count.
1814 # unit_test: If False no service side unit test will be generated.
1815 # client_test: If False no client side unit test will be generated.
1816 # expectation: If False the unit test will have no expected calls.
1817 # gen_func: Name of function that generates GL resource for corresponding
1818 # bind function.
1819 # states: array of states that get set by this function corresponding to
1820 # the given arguments
1821 # state_flag: name of flag that is set to true when function is called.
1822 # no_gl: no GL function is called.
1823 # valid_args: A dictionary of argument indices to args to use in unit tests
1824 # when they can not be automatically determined.
1825 # pepper_interface: The pepper interface that is used for this extension
1826 # pepper_name: The name of the function as exposed to pepper.
1827 # pepper_args: A string representing the argument list (what would appear in
1828 # C/C++ between the parentheses for the function declaration)
1829 # that the Pepper API expects for this function. Use this only if
1830 # the stable Pepper API differs from the GLES2 argument list.
1831 # invalid_test: False if no invalid test needed.
1832 # shadowed: True = the value is shadowed so no glGetXXX call will be made.
1833 # first_element_only: For PUT types, True if only the first element of an
1834 # array is used and we end up calling the single value
1835 # corresponding function. eg. TexParameteriv -> TexParameteri
1836 # extension: Function is an extension to GL and should not be exposed to
1837 # pepper unless pepper_interface is defined.
1838 # extension_flag: Function is an extension and should be enabled only when
1839 # the corresponding feature info flag is enabled. Implies
1840 # 'extension': True.
1841 # not_shared: For GENn types, True if objects can't be shared between contexts
1842 # unsafe: True = no validation is implemented on the service side and the
1843 # command is only available with --enable-unsafe-es3-apis.
1844 # id_mapping: A list of resource type names whose client side IDs need to be
1845 # mapped to service side IDs. This is only used for unsafe APIs.
1847 _FUNCTION_INFO = {
1848 'ActiveTexture': {
1849 'decoder_func': 'DoActiveTexture',
1850 'unit_test': False,
1851 'impl_func': False,
1852 'client_test': False,
1854 'AttachShader': {'decoder_func': 'DoAttachShader'},
1855 'BindAttribLocation': {
1856 'type': 'GLchar',
1857 'data_transfer_methods': ['bucket'],
1858 'needs_size': True,
1860 'BindBuffer': {
1861 'type': 'Bind',
1862 'decoder_func': 'DoBindBuffer',
1863 'gen_func': 'GenBuffersARB',
1865 'BindBufferBase': {
1866 'type': 'Bind',
1867 'id_mapping': [ 'Buffer' ],
1868 'gen_func': 'GenBuffersARB',
1869 'unsafe': True,
1871 'BindBufferRange': {
1872 'type': 'Bind',
1873 'id_mapping': [ 'Buffer' ],
1874 'gen_func': 'GenBuffersARB',
1875 'valid_args': {
1876 '3': '4',
1877 '4': '4'
1879 'unsafe': True,
1881 'BindFramebuffer': {
1882 'type': 'Bind',
1883 'decoder_func': 'DoBindFramebuffer',
1884 'gl_test_func': 'glBindFramebufferEXT',
1885 'gen_func': 'GenFramebuffersEXT',
1886 'trace_level': 1,
1888 'BindRenderbuffer': {
1889 'type': 'Bind',
1890 'decoder_func': 'DoBindRenderbuffer',
1891 'gl_test_func': 'glBindRenderbufferEXT',
1892 'gen_func': 'GenRenderbuffersEXT',
1894 'BindSampler': {
1895 'type': 'Bind',
1896 'id_mapping': [ 'Sampler' ],
1897 'unsafe': True,
1899 'BindTexture': {
1900 'type': 'Bind',
1901 'decoder_func': 'DoBindTexture',
1902 'gen_func': 'GenTextures',
1903 # TODO(gman): remove this once client side caching works.
1904 'client_test': False,
1905 'trace_level': 1,
1907 'BindTransformFeedback': {
1908 'type': 'Bind',
1909 'id_mapping': [ 'TransformFeedback' ],
1910 'unsafe': True,
1912 'BlitFramebufferCHROMIUM': {
1913 'decoder_func': 'DoBlitFramebufferCHROMIUM',
1914 'unit_test': False,
1915 'extension_flag': 'chromium_framebuffer_multisample',
1916 'pepper_interface': 'FramebufferBlit',
1917 'pepper_name': 'BlitFramebufferEXT',
1918 'defer_reads': True,
1919 'defer_draws': True,
1920 'trace_level': 1,
1922 'BufferData': {
1923 'type': 'Manual',
1924 'data_transfer_methods': ['shm'],
1925 'client_test': False,
1927 'BufferSubData': {
1928 'type': 'Data',
1929 'client_test': False,
1930 'decoder_func': 'DoBufferSubData',
1931 'data_transfer_methods': ['shm'],
1933 'CheckFramebufferStatus': {
1934 'type': 'Is',
1935 'decoder_func': 'DoCheckFramebufferStatus',
1936 'gl_test_func': 'glCheckFramebufferStatusEXT',
1937 'error_value': 'GL_FRAMEBUFFER_UNSUPPORTED',
1938 'result': ['GLenum'],
1940 'Clear': {
1941 'decoder_func': 'DoClear',
1942 'defer_draws': True,
1943 'trace_level': 1,
1945 'ClearBufferiv': {
1946 'type': 'PUT',
1947 'use_count_func': True,
1948 'count': 4,
1949 'unsafe': True,
1951 'ClearBufferuiv': {
1952 'type': 'PUT',
1953 'count': 4,
1954 'unsafe': True,
1956 'ClearBufferfv': {
1957 'type': 'PUT',
1958 'use_count_func': True,
1959 'count': 4,
1960 'unsafe': True,
1962 'ClearBufferfi': {
1963 'unsafe': True,
1965 'ClearColor': {
1966 'type': 'StateSet',
1967 'state': 'ClearColor',
1969 'ClearDepthf': {
1970 'type': 'StateSet',
1971 'state': 'ClearDepthf',
1972 'decoder_func': 'glClearDepth',
1973 'gl_test_func': 'glClearDepth',
1974 'valid_args': {
1975 '0': '0.5f'
1978 'ClientWaitSync': {
1979 'type': 'Custom',
1980 'data_transfer_methods': ['shm'],
1981 'cmd_args': 'GLuint sync, GLbitfieldSyncFlushFlags flags, '
1982 'GLuint timeout_0, GLuint timeout_1, GLenum* result',
1983 'unsafe': True,
1984 'result': ['GLenum'],
1986 'ColorMask': {
1987 'type': 'StateSet',
1988 'state': 'ColorMask',
1989 'no_gl': True,
1990 'expectation': False,
1992 'ConsumeTextureCHROMIUM': {
1993 'decoder_func': 'DoConsumeTextureCHROMIUM',
1994 'impl_func': False,
1995 'type': 'PUT',
1996 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM
1997 'unit_test': False,
1998 'client_test': False,
1999 'extension': "CHROMIUM_texture_mailbox",
2000 'chromium': True,
2001 'trace_level': 1,
2003 'CopyBufferSubData': {
2004 'unsafe': True,
2006 'CreateAndConsumeTextureCHROMIUM': {
2007 'decoder_func': 'DoCreateAndConsumeTextureCHROMIUM',
2008 'impl_func': False,
2009 'type': 'HandWritten',
2010 'data_transfer_methods': ['immediate'],
2011 'unit_test': False,
2012 'client_test': False,
2013 'extension': "CHROMIUM_texture_mailbox",
2014 'chromium': True,
2016 'GenValuebuffersCHROMIUM': {
2017 'type': 'GENn',
2018 'gl_test_func': 'glGenValuebuffersCHROMIUM',
2019 'resource_type': 'Valuebuffer',
2020 'resource_types': 'Valuebuffers',
2021 'unit_test': False,
2022 'extension': True,
2023 'chromium': True,
2025 'DeleteValuebuffersCHROMIUM': {
2026 'type': 'DELn',
2027 'gl_test_func': 'glDeleteValuebuffersCHROMIUM',
2028 'resource_type': 'Valuebuffer',
2029 'resource_types': 'Valuebuffers',
2030 'unit_test': False,
2031 'extension': True,
2032 'chromium': True,
2034 'IsValuebufferCHROMIUM': {
2035 'type': 'Is',
2036 'decoder_func': 'DoIsValuebufferCHROMIUM',
2037 'expectation': False,
2038 'extension': True,
2039 'chromium': True,
2041 'BindValuebufferCHROMIUM': {
2042 'type': 'Bind',
2043 'decoder_func': 'DoBindValueBufferCHROMIUM',
2044 'gen_func': 'GenValueBuffersCHROMIUM',
2045 'unit_test': False,
2046 'extension': True,
2047 'chromium': True,
2049 'SubscribeValueCHROMIUM': {
2050 'decoder_func': 'DoSubscribeValueCHROMIUM',
2051 'unit_test': False,
2052 'extension': True,
2053 'chromium': True,
2055 'PopulateSubscribedValuesCHROMIUM': {
2056 'decoder_func': 'DoPopulateSubscribedValuesCHROMIUM',
2057 'unit_test': False,
2058 'extension': True,
2059 'chromium': True,
2061 'UniformValuebufferCHROMIUM': {
2062 'decoder_func': 'DoUniformValueBufferCHROMIUM',
2063 'unit_test': False,
2064 'extension': True,
2065 'chromium': True,
2067 'ClearStencil': {
2068 'type': 'StateSet',
2069 'state': 'ClearStencil',
2071 'EnableFeatureCHROMIUM': {
2072 'type': 'Custom',
2073 'data_transfer_methods': ['shm'],
2074 'decoder_func': 'DoEnableFeatureCHROMIUM',
2075 'expectation': False,
2076 'cmd_args': 'GLuint bucket_id, GLint* result',
2077 'result': ['GLint'],
2078 'extension': True,
2079 'chromium': True,
2080 'pepper_interface': 'ChromiumEnableFeature',
2082 'CompileShader': {'decoder_func': 'DoCompileShader', 'unit_test': False},
2083 'CompressedTexImage2D': {
2084 'type': 'Manual',
2085 'data_transfer_methods': ['bucket', 'shm'],
2087 'CompressedTexSubImage2D': {
2088 'type': 'Data',
2089 'data_transfer_methods': ['bucket', 'shm'],
2090 'decoder_func': 'DoCompressedTexSubImage2D',
2092 'CopyTexImage2D': {
2093 'decoder_func': 'DoCopyTexImage2D',
2094 'unit_test': False,
2095 'defer_reads': True,
2097 'CopyTexSubImage2D': {
2098 'decoder_func': 'DoCopyTexSubImage2D',
2099 'defer_reads': True,
2101 'CompressedTexImage3D': {
2102 'type': 'Manual',
2103 'data_transfer_methods': ['bucket', 'shm'],
2104 'unsafe': True,
2106 'CompressedTexSubImage3D': {
2107 'type': 'Data',
2108 'data_transfer_methods': ['bucket', 'shm'],
2109 'decoder_func': 'DoCompressedTexSubImage3D',
2110 'unsafe': True,
2112 'CopyTexSubImage3D': {
2113 'defer_reads': True,
2114 'unsafe': True,
2116 'CreateImageCHROMIUM': {
2117 'type': 'Manual',
2118 'cmd_args':
2119 'ClientBuffer buffer, GLsizei width, GLsizei height, '
2120 'GLenum internalformat',
2121 'result': ['GLuint'],
2122 'client_test': False,
2123 'gen_cmd': False,
2124 'expectation': False,
2125 'extension': True,
2126 'chromium': True,
2128 'DestroyImageCHROMIUM': {
2129 'type': 'Manual',
2130 'client_test': False,
2131 'gen_cmd': False,
2132 'extension': True,
2133 'chromium': True,
2135 'CreateGpuMemoryBufferImageCHROMIUM': {
2136 'type': 'Manual',
2137 'cmd_args':
2138 'GLsizei width, GLsizei height, GLenum internalformat, GLenum usage',
2139 'result': ['GLuint'],
2140 'client_test': False,
2141 'gen_cmd': False,
2142 'expectation': False,
2143 'extension': True,
2144 'chromium': True,
2146 'CreateProgram': {
2147 'type': 'Create',
2148 'client_test': False,
2150 'CreateShader': {
2151 'type': 'Create',
2152 'client_test': False,
2154 'BlendColor': {
2155 'type': 'StateSet',
2156 'state': 'BlendColor',
2158 'BlendEquation': {
2159 'type': 'StateSetRGBAlpha',
2160 'state': 'BlendEquation',
2161 'valid_args': {
2162 '0': 'GL_FUNC_SUBTRACT'
2165 'BlendEquationSeparate': {
2166 'type': 'StateSet',
2167 'state': 'BlendEquation',
2168 'valid_args': {
2169 '0': 'GL_FUNC_SUBTRACT'
2172 'BlendFunc': {
2173 'type': 'StateSetRGBAlpha',
2174 'state': 'BlendFunc',
2176 'BlendFuncSeparate': {
2177 'type': 'StateSet',
2178 'state': 'BlendFunc',
2180 'BlendBarrierKHR': {
2181 'gl_test_func': 'glBlendBarrierKHR',
2182 'extension': True,
2183 'extension_flag': 'blend_equation_advanced',
2184 'client_test': False,
2186 'SampleCoverage': {'decoder_func': 'DoSampleCoverage'},
2187 'StencilFunc': {
2188 'type': 'StateSetFrontBack',
2189 'state': 'StencilFunc',
2191 'StencilFuncSeparate': {
2192 'type': 'StateSetFrontBackSeparate',
2193 'state': 'StencilFunc',
2195 'StencilOp': {
2196 'type': 'StateSetFrontBack',
2197 'state': 'StencilOp',
2198 'valid_args': {
2199 '1': 'GL_INCR'
2202 'StencilOpSeparate': {
2203 'type': 'StateSetFrontBackSeparate',
2204 'state': 'StencilOp',
2205 'valid_args': {
2206 '1': 'GL_INCR'
2209 'Hint': {
2210 'type': 'StateSetNamedParameter',
2211 'state': 'Hint',
2213 'CullFace': {'type': 'StateSet', 'state': 'CullFace'},
2214 'FrontFace': {'type': 'StateSet', 'state': 'FrontFace'},
2215 'DepthFunc': {'type': 'StateSet', 'state': 'DepthFunc'},
2216 'LineWidth': {
2217 'type': 'StateSet',
2218 'state': 'LineWidth',
2219 'valid_args': {
2220 '0': '0.5f'
2223 'PolygonOffset': {
2224 'type': 'StateSet',
2225 'state': 'PolygonOffset',
2227 'DeleteBuffers': {
2228 'type': 'DELn',
2229 'gl_test_func': 'glDeleteBuffersARB',
2230 'resource_type': 'Buffer',
2231 'resource_types': 'Buffers',
2233 'DeleteFramebuffers': {
2234 'type': 'DELn',
2235 'gl_test_func': 'glDeleteFramebuffersEXT',
2236 'resource_type': 'Framebuffer',
2237 'resource_types': 'Framebuffers',
2239 'DeleteProgram': { 'type': 'Delete' },
2240 'DeleteRenderbuffers': {
2241 'type': 'DELn',
2242 'gl_test_func': 'glDeleteRenderbuffersEXT',
2243 'resource_type': 'Renderbuffer',
2244 'resource_types': 'Renderbuffers',
2246 'DeleteSamplers': {
2247 'type': 'DELn',
2248 'resource_type': 'Sampler',
2249 'resource_types': 'Samplers',
2250 'unsafe': True,
2252 'DeleteShader': { 'type': 'Delete' },
2253 'DeleteSync': {
2254 'type': 'Delete',
2255 'cmd_args': 'GLuint sync',
2256 'resource_type': 'Sync',
2257 'unsafe': True,
2259 'DeleteTextures': {
2260 'type': 'DELn',
2261 'resource_type': 'Texture',
2262 'resource_types': 'Textures',
2264 'DeleteTransformFeedbacks': {
2265 'type': 'DELn',
2266 'resource_type': 'TransformFeedback',
2267 'resource_types': 'TransformFeedbacks',
2268 'unsafe': True,
2270 'DepthRangef': {
2271 'decoder_func': 'DoDepthRangef',
2272 'gl_test_func': 'glDepthRange',
2274 'DepthMask': {
2275 'type': 'StateSet',
2276 'state': 'DepthMask',
2277 'no_gl': True,
2278 'expectation': False,
2280 'DetachShader': {'decoder_func': 'DoDetachShader'},
2281 'Disable': {
2282 'decoder_func': 'DoDisable',
2283 'impl_func': False,
2284 'client_test': False,
2286 'DisableVertexAttribArray': {
2287 'decoder_func': 'DoDisableVertexAttribArray',
2288 'impl_decl': False,
2290 'DrawArrays': {
2291 'type': 'Manual',
2292 'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count',
2293 'defer_draws': True,
2294 'trace_level': 2,
2296 'DrawElements': {
2297 'type': 'Manual',
2298 'cmd_args': 'GLenumDrawMode mode, GLsizei count, '
2299 'GLenumIndexType type, GLuint index_offset',
2300 'client_test': False,
2301 'defer_draws': True,
2302 'trace_level': 2,
2304 'DrawRangeElements': {
2305 'type': 'Manual',
2306 'gen_cmd': 'False',
2307 'unsafe': True,
2309 'Enable': {
2310 'decoder_func': 'DoEnable',
2311 'impl_func': False,
2312 'client_test': False,
2314 'EnableVertexAttribArray': {
2315 'decoder_func': 'DoEnableVertexAttribArray',
2316 'impl_decl': False,
2318 'FenceSync': {
2319 'type': 'Create',
2320 'client_test': False,
2321 'unsafe': True,
2323 'Finish': {
2324 'impl_func': False,
2325 'client_test': False,
2326 'decoder_func': 'DoFinish',
2327 'defer_reads': True,
2329 'Flush': {
2330 'impl_func': False,
2331 'decoder_func': 'DoFlush',
2333 'FramebufferRenderbuffer': {
2334 'decoder_func': 'DoFramebufferRenderbuffer',
2335 'gl_test_func': 'glFramebufferRenderbufferEXT',
2337 'FramebufferTexture2D': {
2338 'decoder_func': 'DoFramebufferTexture2D',
2339 'gl_test_func': 'glFramebufferTexture2DEXT',
2340 'trace_level': 1,
2342 'FramebufferTexture2DMultisampleEXT': {
2343 'decoder_func': 'DoFramebufferTexture2DMultisample',
2344 'gl_test_func': 'glFramebufferTexture2DMultisampleEXT',
2345 'expectation': False,
2346 'unit_test': False,
2347 'extension_flag': 'multisampled_render_to_texture',
2348 'trace_level': 1,
2350 'FramebufferTextureLayer': {
2351 'decoder_func': 'DoFramebufferTextureLayer',
2352 'unsafe': True,
2354 'GenerateMipmap': {
2355 'decoder_func': 'DoGenerateMipmap',
2356 'gl_test_func': 'glGenerateMipmapEXT',
2358 'GenBuffers': {
2359 'type': 'GENn',
2360 'gl_test_func': 'glGenBuffersARB',
2361 'resource_type': 'Buffer',
2362 'resource_types': 'Buffers',
2364 'GenMailboxCHROMIUM': {
2365 'type': 'HandWritten',
2366 'impl_func': False,
2367 'extension': "CHROMIUM_texture_mailbox",
2368 'chromium': True,
2370 'GenFramebuffers': {
2371 'type': 'GENn',
2372 'gl_test_func': 'glGenFramebuffersEXT',
2373 'resource_type': 'Framebuffer',
2374 'resource_types': 'Framebuffers',
2376 'GenRenderbuffers': {
2377 'type': 'GENn', 'gl_test_func': 'glGenRenderbuffersEXT',
2378 'resource_type': 'Renderbuffer',
2379 'resource_types': 'Renderbuffers',
2381 'GenSamplers': {
2382 'type': 'GENn',
2383 'gl_test_func': 'glGenSamplers',
2384 'resource_type': 'Sampler',
2385 'resource_types': 'Samplers',
2386 'unsafe': True,
2388 'GenTextures': {
2389 'type': 'GENn',
2390 'gl_test_func': 'glGenTextures',
2391 'resource_type': 'Texture',
2392 'resource_types': 'Textures',
2394 'GenTransformFeedbacks': {
2395 'type': 'GENn',
2396 'gl_test_func': 'glGenTransformFeedbacks',
2397 'resource_type': 'TransformFeedback',
2398 'resource_types': 'TransformFeedbacks',
2399 'unsafe': True,
2401 'GetActiveAttrib': {
2402 'type': 'Custom',
2403 'data_transfer_methods': ['shm'],
2404 'cmd_args':
2405 'GLidProgram program, GLuint index, uint32_t name_bucket_id, '
2406 'void* result',
2407 'result': [
2408 'int32_t success',
2409 'int32_t size',
2410 'uint32_t type',
2413 'GetActiveUniform': {
2414 'type': 'Custom',
2415 'data_transfer_methods': ['shm'],
2416 'cmd_args':
2417 'GLidProgram program, GLuint index, uint32_t name_bucket_id, '
2418 'void* result',
2419 'result': [
2420 'int32_t success',
2421 'int32_t size',
2422 'uint32_t type',
2425 'GetActiveUniformBlockiv': {
2426 'type': 'Custom',
2427 'data_transfer_methods': ['shm'],
2428 'result': ['SizedResult<GLint>'],
2429 'unsafe': True,
2431 'GetActiveUniformBlockName': {
2432 'type': 'Custom',
2433 'data_transfer_methods': ['shm'],
2434 'cmd_args':
2435 'GLidProgram program, GLuint index, uint32_t name_bucket_id, '
2436 'void* result',
2437 'result': ['int32_t'],
2438 'unsafe': True,
2440 'GetActiveUniformsiv': {
2441 'type': 'Custom',
2442 'data_transfer_methods': ['shm'],
2443 'cmd_args':
2444 'GLidProgram program, uint32_t indices_bucket_id, GLenum pname, '
2445 'GLint* params',
2446 'result': ['SizedResult<GLint>'],
2447 'unsafe': True,
2449 'GetAttachedShaders': {
2450 'type': 'Custom',
2451 'data_transfer_methods': ['shm'],
2452 'cmd_args': 'GLidProgram program, void* result, uint32_t result_size',
2453 'result': ['SizedResult<GLuint>'],
2455 'GetAttribLocation': {
2456 'type': 'Custom',
2457 'data_transfer_methods': ['shm'],
2458 'cmd_args':
2459 'GLidProgram program, uint32_t name_bucket_id, GLint* location',
2460 'result': ['GLint'],
2461 'error_return': -1,
2463 'GetFragDataLocation': {
2464 'type': 'Custom',
2465 'data_transfer_methods': ['shm'],
2466 'cmd_args':
2467 'GLidProgram program, uint32_t name_bucket_id, GLint* location',
2468 'result': ['GLint'],
2469 'error_return': -1,
2470 'unsafe': True,
2472 'GetBooleanv': {
2473 'type': 'GETn',
2474 'result': ['SizedResult<GLboolean>'],
2475 'decoder_func': 'DoGetBooleanv',
2476 'gl_test_func': 'glGetBooleanv',
2478 'GetBufferParameteriv': {
2479 'type': 'GETn',
2480 'result': ['SizedResult<GLint>'],
2481 'decoder_func': 'DoGetBufferParameteriv',
2482 'expectation': False,
2483 'shadowed': True,
2485 'GetError': {
2486 'type': 'Is',
2487 'decoder_func': 'GetErrorState()->GetGLError',
2488 'impl_func': False,
2489 'result': ['GLenum'],
2490 'client_test': False,
2492 'GetFloatv': {
2493 'type': 'GETn',
2494 'result': ['SizedResult<GLfloat>'],
2495 'decoder_func': 'DoGetFloatv',
2496 'gl_test_func': 'glGetFloatv',
2498 'GetFramebufferAttachmentParameteriv': {
2499 'type': 'GETn',
2500 'decoder_func': 'DoGetFramebufferAttachmentParameteriv',
2501 'gl_test_func': 'glGetFramebufferAttachmentParameterivEXT',
2502 'result': ['SizedResult<GLint>'],
2504 'GetInteger64v': {
2505 'type': 'GETn',
2506 'result': ['SizedResult<GLint64>'],
2507 'client_test': False,
2508 'decoder_func': 'DoGetInteger64v',
2509 'unsafe': True
2511 'GetIntegerv': {
2512 'type': 'GETn',
2513 'result': ['SizedResult<GLint>'],
2514 'decoder_func': 'DoGetIntegerv',
2515 'client_test': False,
2517 'GetInteger64i_v': {
2518 'type': 'GETn',
2519 'result': ['SizedResult<GLint64>'],
2520 'client_test': False,
2521 'unsafe': True
2523 'GetIntegeri_v': {
2524 'type': 'GETn',
2525 'result': ['SizedResult<GLint>'],
2526 'client_test': False,
2527 'unsafe': True
2529 'GetInternalformativ': {
2530 'type': 'GETn',
2531 'result': ['SizedResult<GLint>'],
2532 'unsafe': True,
2534 'GetMaxValueInBufferCHROMIUM': {
2535 'type': 'Is',
2536 'decoder_func': 'DoGetMaxValueInBufferCHROMIUM',
2537 'result': ['GLuint'],
2538 'unit_test': False,
2539 'client_test': False,
2540 'extension': True,
2541 'chromium': True,
2542 'impl_func': False,
2544 'GetProgramiv': {
2545 'type': 'GETn',
2546 'decoder_func': 'DoGetProgramiv',
2547 'result': ['SizedResult<GLint>'],
2548 'expectation': False,
2550 'GetProgramInfoCHROMIUM': {
2551 'type': 'Custom',
2552 'expectation': False,
2553 'impl_func': False,
2554 'extension': True,
2555 'chromium': True,
2556 'client_test': False,
2557 'cmd_args': 'GLidProgram program, uint32_t bucket_id',
2558 'result': [
2559 'uint32_t link_status',
2560 'uint32_t num_attribs',
2561 'uint32_t num_uniforms',
2564 'GetProgramInfoLog': {
2565 'type': 'STRn',
2566 'expectation': False,
2568 'GetRenderbufferParameteriv': {
2569 'type': 'GETn',
2570 'decoder_func': 'DoGetRenderbufferParameteriv',
2571 'gl_test_func': 'glGetRenderbufferParameterivEXT',
2572 'result': ['SizedResult<GLint>'],
2574 'GetSamplerParameterfv': {
2575 'type': 'GETn',
2576 'result': ['SizedResult<GLfloat>'],
2577 'id_mapping': [ 'Sampler' ],
2578 'unsafe': True,
2580 'GetSamplerParameteriv': {
2581 'type': 'GETn',
2582 'result': ['SizedResult<GLint>'],
2583 'id_mapping': [ 'Sampler' ],
2584 'unsafe': True,
2586 'GetShaderiv': {
2587 'type': 'GETn',
2588 'decoder_func': 'DoGetShaderiv',
2589 'result': ['SizedResult<GLint>'],
2591 'GetShaderInfoLog': {
2592 'type': 'STRn',
2593 'get_len_func': 'glGetShaderiv',
2594 'get_len_enum': 'GL_INFO_LOG_LENGTH',
2595 'unit_test': False,
2597 'GetShaderPrecisionFormat': {
2598 'type': 'Custom',
2599 'data_transfer_methods': ['shm'],
2600 'cmd_args':
2601 'GLenumShaderType shadertype, GLenumShaderPrecision precisiontype, '
2602 'void* result',
2603 'result': [
2604 'int32_t success',
2605 'int32_t min_range',
2606 'int32_t max_range',
2607 'int32_t precision',
2610 'GetShaderSource': {
2611 'type': 'STRn',
2612 'get_len_func': 'DoGetShaderiv',
2613 'get_len_enum': 'GL_SHADER_SOURCE_LENGTH',
2614 'unit_test': False,
2615 'client_test': False,
2617 'GetString': {
2618 'type': 'Custom',
2619 'client_test': False,
2620 'cmd_args': 'GLenumStringType name, uint32_t bucket_id',
2622 'GetSynciv': {
2623 'type': 'GETn',
2624 'cmd_args': 'GLuint sync, GLenumSyncParameter pname, void* values',
2625 'result': ['SizedResult<GLint>'],
2626 'id_mapping': ['Sync'],
2627 'unsafe': True,
2629 'GetTexParameterfv': {
2630 'type': 'GETn',
2631 'decoder_func': 'DoGetTexParameterfv',
2632 'result': ['SizedResult<GLfloat>']
2634 'GetTexParameteriv': {
2635 'type': 'GETn',
2636 'decoder_func': 'DoGetTexParameteriv',
2637 'result': ['SizedResult<GLint>']
2639 'GetTranslatedShaderSourceANGLE': {
2640 'type': 'STRn',
2641 'get_len_func': 'DoGetShaderiv',
2642 'get_len_enum': 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE',
2643 'unit_test': False,
2644 'extension': True,
2646 'GetUniformBlockIndex': {
2647 'type': 'Custom',
2648 'data_transfer_methods': ['shm'],
2649 'cmd_args':
2650 'GLidProgram program, uint32_t name_bucket_id, GLuint* index',
2651 'result': ['GLuint'],
2652 'error_return': 'GL_INVALID_INDEX',
2653 'unsafe': True,
2655 'GetUniformBlocksCHROMIUM': {
2656 'type': 'Custom',
2657 'expectation': False,
2658 'impl_func': False,
2659 'extension': True,
2660 'chromium': True,
2661 'client_test': False,
2662 'cmd_args': 'GLidProgram program, uint32_t bucket_id',
2663 'result': ['uint32_t'],
2664 'unsafe': True,
2666 'GetUniformsES3CHROMIUM': {
2667 'type': 'Custom',
2668 'expectation': False,
2669 'impl_func': False,
2670 'extension': True,
2671 'chromium': True,
2672 'client_test': False,
2673 'cmd_args': 'GLidProgram program, uint32_t bucket_id',
2674 'result': ['uint32_t'],
2675 'unsafe': True,
2677 'GetTransformFeedbackVarying': {
2678 'type': 'Custom',
2679 'data_transfer_methods': ['shm'],
2680 'cmd_args':
2681 'GLidProgram program, GLuint index, uint32_t name_bucket_id, '
2682 'void* result',
2683 'result': [
2684 'int32_t success',
2685 'int32_t size',
2686 'uint32_t type',
2688 'unsafe': True,
2690 'GetTransformFeedbackVaryingsCHROMIUM': {
2691 'type': 'Custom',
2692 'expectation': False,
2693 'impl_func': False,
2694 'extension': True,
2695 'chromium': True,
2696 'client_test': False,
2697 'cmd_args': 'GLidProgram program, uint32_t bucket_id',
2698 'result': ['uint32_t'],
2699 'unsafe': True,
2701 'GetUniformfv': {
2702 'type': 'Custom',
2703 'data_transfer_methods': ['shm'],
2704 'result': ['SizedResult<GLfloat>'],
2706 'GetUniformiv': {
2707 'type': 'Custom',
2708 'data_transfer_methods': ['shm'],
2709 'result': ['SizedResult<GLint>'],
2711 'GetUniformuiv': {
2712 'type': 'Custom',
2713 'data_transfer_methods': ['shm'],
2714 'result': ['SizedResult<GLuint>'],
2715 'unsafe': True,
2717 'GetUniformIndices': {
2718 'type': 'Custom',
2719 'data_transfer_methods': ['shm'],
2720 'result': ['SizedResult<GLuint>'],
2721 'cmd_args': 'GLidProgram program, uint32_t names_bucket_id, '
2722 'GLuint* indices',
2723 'unsafe': True,
2725 'GetUniformLocation': {
2726 'type': 'Custom',
2727 'data_transfer_methods': ['shm'],
2728 'cmd_args':
2729 'GLidProgram program, uint32_t name_bucket_id, GLint* location',
2730 'result': ['GLint'],
2731 'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml
2733 'GetVertexAttribfv': {
2734 'type': 'GETn',
2735 'result': ['SizedResult<GLfloat>'],
2736 'impl_decl': False,
2737 'decoder_func': 'DoGetVertexAttribfv',
2738 'expectation': False,
2739 'client_test': False,
2741 'GetVertexAttribiv': {
2742 'type': 'GETn',
2743 'result': ['SizedResult<GLint>'],
2744 'impl_decl': False,
2745 'decoder_func': 'DoGetVertexAttribiv',
2746 'expectation': False,
2747 'client_test': False,
2749 'GetVertexAttribPointerv': {
2750 'type': 'Custom',
2751 'data_transfer_methods': ['shm'],
2752 'result': ['SizedResult<GLuint>'],
2753 'client_test': False,
2755 'InvalidateFramebuffer': {
2756 'type': 'PUTn',
2757 'count': 1,
2758 'client_test': False,
2759 'unit_test': False,
2760 'unsafe': True,
2762 'InvalidateSubFramebuffer': {
2763 'type': 'PUTn',
2764 'count': 1,
2765 'client_test': False,
2766 'unit_test': False,
2767 'unsafe': True,
2769 'IsBuffer': {
2770 'type': 'Is',
2771 'decoder_func': 'DoIsBuffer',
2772 'expectation': False,
2774 'IsEnabled': {
2775 'type': 'Is',
2776 'decoder_func': 'DoIsEnabled',
2777 'client_test': False,
2778 'impl_func': False,
2779 'expectation': False,
2781 'IsFramebuffer': {
2782 'type': 'Is',
2783 'decoder_func': 'DoIsFramebuffer',
2784 'expectation': False,
2786 'IsProgram': {
2787 'type': 'Is',
2788 'decoder_func': 'DoIsProgram',
2789 'expectation': False,
2791 'IsRenderbuffer': {
2792 'type': 'Is',
2793 'decoder_func': 'DoIsRenderbuffer',
2794 'expectation': False,
2796 'IsShader': {
2797 'type': 'Is',
2798 'decoder_func': 'DoIsShader',
2799 'expectation': False,
2801 'IsSampler': {
2802 'type': 'Is',
2803 'id_mapping': [ 'Sampler' ],
2804 'expectation': False,
2805 'unsafe': True,
2807 'IsSync': {
2808 'type': 'Is',
2809 'id_mapping': [ 'Sync' ],
2810 'cmd_args': 'GLuint sync',
2811 'expectation': False,
2812 'unsafe': True,
2814 'IsTexture': {
2815 'type': 'Is',
2816 'decoder_func': 'DoIsTexture',
2817 'expectation': False,
2819 'IsTransformFeedback': {
2820 'type': 'Is',
2821 'id_mapping': [ 'TransformFeedback' ],
2822 'expectation': False,
2823 'unsafe': True,
2825 'LinkProgram': {
2826 'decoder_func': 'DoLinkProgram',
2827 'impl_func': False,
2829 'MapBufferCHROMIUM': {
2830 'gen_cmd': False,
2831 'extension': True,
2832 'chromium': True,
2833 'client_test': False,
2835 'MapBufferSubDataCHROMIUM': {
2836 'gen_cmd': False,
2837 'extension': True,
2838 'chromium': True,
2839 'client_test': False,
2840 'pepper_interface': 'ChromiumMapSub',
2842 'MapTexSubImage2DCHROMIUM': {
2843 'gen_cmd': False,
2844 'extension': "CHROMIUM_sub_image",
2845 'chromium': True,
2846 'client_test': False,
2847 'pepper_interface': 'ChromiumMapSub',
2849 'MapBufferRange': {
2850 'type': 'Custom',
2851 'data_transfer_methods': ['shm'],
2852 'cmd_args': 'GLenumBufferTarget target, GLintptrNotNegative offset, '
2853 'GLsizeiptr size, GLbitfieldMapBufferAccess access, '
2854 'uint32_t data_shm_id, uint32_t data_shm_offset, '
2855 'uint32_t result_shm_id, uint32_t result_shm_offset',
2856 'unsafe': True,
2857 'result': ['uint32_t'],
2859 'PauseTransformFeedback': {
2860 'unsafe': True,
2862 'PixelStorei': {'type': 'Manual'},
2863 'PostSubBufferCHROMIUM': {
2864 'type': 'Custom',
2865 'impl_func': False,
2866 'unit_test': False,
2867 'client_test': False,
2868 'extension': True,
2869 'chromium': True,
2871 'ProduceTextureCHROMIUM': {
2872 'decoder_func': 'DoProduceTextureCHROMIUM',
2873 'impl_func': False,
2874 'type': 'PUT',
2875 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM
2876 'unit_test': False,
2877 'client_test': False,
2878 'extension': "CHROMIUM_texture_mailbox",
2879 'chromium': True,
2880 'trace_level': 1,
2882 'ProduceTextureDirectCHROMIUM': {
2883 'decoder_func': 'DoProduceTextureDirectCHROMIUM',
2884 'impl_func': False,
2885 'type': 'PUT',
2886 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM
2887 'unit_test': False,
2888 'client_test': False,
2889 'extension': "CHROMIUM_texture_mailbox",
2890 'chromium': True,
2891 'trace_level': 1,
2893 'RenderbufferStorage': {
2894 'decoder_func': 'DoRenderbufferStorage',
2895 'gl_test_func': 'glRenderbufferStorageEXT',
2896 'expectation': False,
2898 'RenderbufferStorageMultisampleCHROMIUM': {
2899 'cmd_comment':
2900 '// GL_CHROMIUM_framebuffer_multisample\n',
2901 'decoder_func': 'DoRenderbufferStorageMultisampleCHROMIUM',
2902 'gl_test_func': 'glRenderbufferStorageMultisampleCHROMIUM',
2903 'expectation': False,
2904 'unit_test': False,
2905 'extension_flag': 'chromium_framebuffer_multisample',
2906 'pepper_interface': 'FramebufferMultisample',
2907 'pepper_name': 'RenderbufferStorageMultisampleEXT',
2909 'RenderbufferStorageMultisampleEXT': {
2910 'cmd_comment':
2911 '// GL_EXT_multisampled_render_to_texture\n',
2912 'decoder_func': 'DoRenderbufferStorageMultisampleEXT',
2913 'gl_test_func': 'glRenderbufferStorageMultisampleEXT',
2914 'expectation': False,
2915 'unit_test': False,
2916 'extension_flag': 'multisampled_render_to_texture',
2918 'ReadBuffer': {
2919 'unsafe': True,
2921 'ReadPixels': {
2922 'cmd_comment':
2923 '// ReadPixels has the result separated from the pixel buffer so that\n'
2924 '// it is easier to specify the result going to some specific place\n'
2925 '// that exactly fits the rectangle of pixels.\n',
2926 'type': 'Custom',
2927 'data_transfer_methods': ['shm'],
2928 'impl_func': False,
2929 'client_test': False,
2930 'cmd_args':
2931 'GLint x, GLint y, GLsizei width, GLsizei height, '
2932 'GLenumReadPixelFormat format, GLenumReadPixelType type, '
2933 'uint32_t pixels_shm_id, uint32_t pixels_shm_offset, '
2934 'uint32_t result_shm_id, uint32_t result_shm_offset, '
2935 'GLboolean async',
2936 'result': ['uint32_t'],
2937 'defer_reads': True,
2939 'ReleaseShaderCompiler': {
2940 'decoder_func': 'DoReleaseShaderCompiler',
2941 'unit_test': False,
2943 'ResumeTransformFeedback': {
2944 'unsafe': True,
2946 'SamplerParameterf': {
2947 'valid_args': {
2948 '2': 'GL_NEAREST'
2950 'id_mapping': [ 'Sampler' ],
2951 'unsafe': True,
2953 'SamplerParameterfv': {
2954 'type': 'PUT',
2955 'data_value': 'GL_NEAREST',
2956 'count': 1,
2957 'gl_test_func': 'glSamplerParameterf',
2958 'decoder_func': 'DoSamplerParameterfv',
2959 'first_element_only': True,
2960 'id_mapping': [ 'Sampler' ],
2961 'unsafe': True,
2963 'SamplerParameteri': {
2964 'valid_args': {
2965 '2': 'GL_NEAREST'
2967 'id_mapping': [ 'Sampler' ],
2968 'unsafe': True,
2970 'SamplerParameteriv': {
2971 'type': 'PUT',
2972 'data_value': 'GL_NEAREST',
2973 'count': 1,
2974 'gl_test_func': 'glSamplerParameteri',
2975 'decoder_func': 'DoSamplerParameteriv',
2976 'first_element_only': True,
2977 'unsafe': True,
2979 'ShaderBinary': {
2980 'type': 'Custom',
2981 'client_test': False,
2983 'ShaderSource': {
2984 'type': 'PUTSTR',
2985 'decoder_func': 'DoShaderSource',
2986 'expectation': False,
2987 'data_transfer_methods': ['bucket'],
2988 'cmd_args':
2989 'GLuint shader, const char** str',
2990 'pepper_args':
2991 'GLuint shader, GLsizei count, const char** str, const GLint* length',
2993 'StencilMask': {
2994 'type': 'StateSetFrontBack',
2995 'state': 'StencilMask',
2996 'no_gl': True,
2997 'expectation': False,
2999 'StencilMaskSeparate': {
3000 'type': 'StateSetFrontBackSeparate',
3001 'state': 'StencilMask',
3002 'no_gl': True,
3003 'expectation': False,
3005 'SwapBuffers': {
3006 'impl_func': False,
3007 'decoder_func': 'DoSwapBuffers',
3008 'unit_test': False,
3009 'client_test': False,
3010 'extension': True,
3011 'trace_level': 1,
3013 'SwapInterval': {
3014 'impl_func': False,
3015 'decoder_func': 'DoSwapInterval',
3016 'unit_test': False,
3017 'client_test': False,
3018 'extension': True,
3019 'trace_level': 1,
3021 'TexImage2D': {
3022 'type': 'Manual',
3023 'data_transfer_methods': ['shm'],
3024 'client_test': False,
3026 'TexImage3D': {
3027 'type': 'Manual',
3028 'data_transfer_methods': ['shm'],
3029 'client_test': False,
3030 'unsafe': True,
3032 'TexParameterf': {
3033 'decoder_func': 'DoTexParameterf',
3034 'valid_args': {
3035 '2': 'GL_NEAREST'
3038 'TexParameteri': {
3039 'decoder_func': 'DoTexParameteri',
3040 'valid_args': {
3041 '2': 'GL_NEAREST'
3044 'TexParameterfv': {
3045 'type': 'PUT',
3046 'data_value': 'GL_NEAREST',
3047 'count': 1,
3048 'decoder_func': 'DoTexParameterfv',
3049 'gl_test_func': 'glTexParameterf',
3050 'first_element_only': True,
3052 'TexParameteriv': {
3053 'type': 'PUT',
3054 'data_value': 'GL_NEAREST',
3055 'count': 1,
3056 'decoder_func': 'DoTexParameteriv',
3057 'gl_test_func': 'glTexParameteri',
3058 'first_element_only': True,
3060 'TexStorage3D': {
3061 'unsafe': True,
3063 'TexSubImage2D': {
3064 'type': 'Manual',
3065 'data_transfer_methods': ['shm'],
3066 'client_test': False,
3067 'cmd_args': 'GLenumTextureTarget target, GLint level, '
3068 'GLint xoffset, GLint yoffset, '
3069 'GLsizei width, GLsizei height, '
3070 'GLenumTextureFormat format, GLenumPixelType type, '
3071 'const void* pixels, GLboolean internal'
3073 'TexSubImage3D': {
3074 'type': 'Manual',
3075 'data_transfer_methods': ['shm'],
3076 'client_test': False,
3077 'cmd_args': 'GLenumTextureTarget target, GLint level, '
3078 'GLint xoffset, GLint yoffset, GLint zoffset, '
3079 'GLsizei width, GLsizei height, GLsizei depth, '
3080 'GLenumTextureFormat format, GLenumPixelType type, '
3081 'const void* pixels, GLboolean internal',
3082 'unsafe': True,
3084 'TransformFeedbackVaryings': {
3085 'type': 'PUTSTR',
3086 'data_transfer_methods': ['bucket'],
3087 'decoder_func': 'DoTransformFeedbackVaryings',
3088 'cmd_args':
3089 'GLuint program, const char** varyings, GLenum buffermode',
3090 'unsafe': True,
3092 'Uniform1f': {'type': 'PUTXn', 'count': 1},
3093 'Uniform1fv': {
3094 'type': 'PUTn',
3095 'count': 1,
3096 'decoder_func': 'DoUniform1fv',
3098 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False},
3099 'Uniform1iv': {
3100 'type': 'PUTn',
3101 'count': 1,
3102 'decoder_func': 'DoUniform1iv',
3103 'unit_test': False,
3105 'Uniform1ui': {
3106 'type': 'PUTXn',
3107 'count': 1,
3108 'unsafe': True,
3110 'Uniform1uiv': {
3111 'type': 'PUTn',
3112 'count': 1,
3113 'unsafe': True,
3115 'Uniform2i': {'type': 'PUTXn', 'count': 2},
3116 'Uniform2f': {'type': 'PUTXn', 'count': 2},
3117 'Uniform2fv': {
3118 'type': 'PUTn',
3119 'count': 2,
3120 'decoder_func': 'DoUniform2fv',
3122 'Uniform2iv': {
3123 'type': 'PUTn',
3124 'count': 2,
3125 'decoder_func': 'DoUniform2iv',
3127 'Uniform2ui': {
3128 'type': 'PUTXn',
3129 'count': 2,
3130 'unsafe': True,
3132 'Uniform2uiv': {
3133 'type': 'PUTn',
3134 'count': 2,
3135 'unsafe': True,
3137 'Uniform3i': {'type': 'PUTXn', 'count': 3},
3138 'Uniform3f': {'type': 'PUTXn', 'count': 3},
3139 'Uniform3fv': {
3140 'type': 'PUTn',
3141 'count': 3,
3142 'decoder_func': 'DoUniform3fv',
3144 'Uniform3iv': {
3145 'type': 'PUTn',
3146 'count': 3,
3147 'decoder_func': 'DoUniform3iv',
3149 'Uniform3ui': {
3150 'type': 'PUTXn',
3151 'count': 3,
3152 'unsafe': True,
3154 'Uniform3uiv': {
3155 'type': 'PUTn',
3156 'count': 3,
3157 'unsafe': True,
3159 'Uniform4i': {'type': 'PUTXn', 'count': 4},
3160 'Uniform4f': {'type': 'PUTXn', 'count': 4},
3161 'Uniform4fv': {
3162 'type': 'PUTn',
3163 'count': 4,
3164 'decoder_func': 'DoUniform4fv',
3166 'Uniform4iv': {
3167 'type': 'PUTn',
3168 'count': 4,
3169 'decoder_func': 'DoUniform4iv',
3171 'Uniform4ui': {
3172 'type': 'PUTXn',
3173 'count': 4,
3174 'unsafe': True,
3176 'Uniform4uiv': {
3177 'type': 'PUTn',
3178 'count': 4,
3179 'unsafe': True,
3181 'UniformMatrix2fv': {
3182 'type': 'PUTn',
3183 'count': 4,
3184 'decoder_func': 'DoUniformMatrix2fv',
3186 'UniformMatrix2x3fv': {
3187 'type': 'PUTn',
3188 'count': 6,
3189 'unsafe': True,
3191 'UniformMatrix2x4fv': {
3192 'type': 'PUTn',
3193 'count': 8,
3194 'unsafe': True,
3196 'UniformMatrix3fv': {
3197 'type': 'PUTn',
3198 'count': 9,
3199 'decoder_func': 'DoUniformMatrix3fv',
3201 'UniformMatrix3x2fv': {
3202 'type': 'PUTn',
3203 'count': 6,
3204 'unsafe': True,
3206 'UniformMatrix3x4fv': {
3207 'type': 'PUTn',
3208 'count': 12,
3209 'unsafe': True,
3211 'UniformMatrix4fv': {
3212 'type': 'PUTn',
3213 'count': 16,
3214 'decoder_func': 'DoUniformMatrix4fv',
3216 'UniformMatrix4x2fv': {
3217 'type': 'PUTn',
3218 'count': 8,
3219 'unsafe': True,
3221 'UniformMatrix4x3fv': {
3222 'type': 'PUTn',
3223 'count': 12,
3224 'unsafe': True,
3226 'UniformBlockBinding': {
3227 'type': 'Custom',
3228 'impl_func': False,
3229 'unsafe': True,
3231 'UnmapBufferCHROMIUM': {
3232 'gen_cmd': False,
3233 'extension': True,
3234 'chromium': True,
3235 'client_test': False,
3237 'UnmapBufferSubDataCHROMIUM': {
3238 'gen_cmd': False,
3239 'extension': True,
3240 'chromium': True,
3241 'client_test': False,
3242 'pepper_interface': 'ChromiumMapSub',
3244 'UnmapBuffer': {
3245 'type': 'Custom',
3246 'unsafe': True,
3248 'UnmapTexSubImage2DCHROMIUM': {
3249 'gen_cmd': False,
3250 'extension': "CHROMIUM_sub_image",
3251 'chromium': True,
3252 'client_test': False,
3253 'pepper_interface': 'ChromiumMapSub',
3255 'UseProgram': {
3256 'type': 'Bind',
3257 'decoder_func': 'DoUseProgram',
3259 'ValidateProgram': {'decoder_func': 'DoValidateProgram'},
3260 'VertexAttrib1f': {'decoder_func': 'DoVertexAttrib1f'},
3261 'VertexAttrib1fv': {
3262 'type': 'PUT',
3263 'count': 1,
3264 'decoder_func': 'DoVertexAttrib1fv',
3266 'VertexAttrib2f': {'decoder_func': 'DoVertexAttrib2f'},
3267 'VertexAttrib2fv': {
3268 'type': 'PUT',
3269 'count': 2,
3270 'decoder_func': 'DoVertexAttrib2fv',
3272 'VertexAttrib3f': {'decoder_func': 'DoVertexAttrib3f'},
3273 'VertexAttrib3fv': {
3274 'type': 'PUT',
3275 'count': 3,
3276 'decoder_func': 'DoVertexAttrib3fv',
3278 'VertexAttrib4f': {'decoder_func': 'DoVertexAttrib4f'},
3279 'VertexAttrib4fv': {
3280 'type': 'PUT',
3281 'count': 4,
3282 'decoder_func': 'DoVertexAttrib4fv',
3284 'VertexAttribI4i': {
3285 'unsafe': True,
3287 'VertexAttribI4iv': {
3288 'type': 'PUT',
3289 'count': 4,
3290 'unsafe': True,
3292 'VertexAttribI4ui': {
3293 'unsafe': True,
3295 'VertexAttribI4uiv': {
3296 'type': 'PUT',
3297 'count': 4,
3298 'unsafe': True,
3300 'VertexAttribIPointer': {
3301 'type': 'Manual',
3302 'cmd_args': 'GLuint indx, GLintVertexAttribSize size, '
3303 'GLenumVertexAttribIType type, GLsizei stride, '
3304 'GLuint offset',
3305 'client_test': False,
3306 'unsafe': True,
3308 'VertexAttribPointer': {
3309 'type': 'Manual',
3310 'cmd_args': 'GLuint indx, GLintVertexAttribSize size, '
3311 'GLenumVertexAttribType type, GLboolean normalized, '
3312 'GLsizei stride, GLuint offset',
3313 'client_test': False,
3315 'WaitSync': {
3316 'type': 'Custom',
3317 'cmd_args': 'GLuint sync, GLbitfieldSyncFlushFlags flags, '
3318 'GLuint timeout_0, GLuint timeout_1',
3319 'impl_func': False,
3320 'client_test': False,
3321 'unsafe': True,
3323 'Scissor': {
3324 'type': 'StateSet',
3325 'state': 'Scissor',
3327 'Viewport': {
3328 'decoder_func': 'DoViewport',
3330 'ResizeCHROMIUM': {
3331 'type': 'Custom',
3332 'impl_func': False,
3333 'unit_test': False,
3334 'extension': True,
3335 'chromium': True,
3337 'GetRequestableExtensionsCHROMIUM': {
3338 'type': 'Custom',
3339 'impl_func': False,
3340 'cmd_args': 'uint32_t bucket_id',
3341 'extension': True,
3342 'chromium': True,
3344 'RequestExtensionCHROMIUM': {
3345 'type': 'Custom',
3346 'impl_func': False,
3347 'client_test': False,
3348 'cmd_args': 'uint32_t bucket_id',
3349 'extension': True,
3350 'chromium': True,
3352 'RateLimitOffscreenContextCHROMIUM': {
3353 'gen_cmd': False,
3354 'extension': True,
3355 'chromium': True,
3356 'client_test': False,
3358 'CreateStreamTextureCHROMIUM': {
3359 'type': 'HandWritten',
3360 'impl_func': False,
3361 'gen_cmd': False,
3362 'extension': True,
3363 'chromium': True,
3365 'TexImageIOSurface2DCHROMIUM': {
3366 'decoder_func': 'DoTexImageIOSurface2DCHROMIUM',
3367 'unit_test': False,
3368 'extension': True,
3369 'chromium': True,
3371 'CopyTextureCHROMIUM': {
3372 'decoder_func': 'DoCopyTextureCHROMIUM',
3373 'unit_test': False,
3374 'extension': True,
3375 'chromium': True,
3377 'CopySubTextureCHROMIUM': {
3378 'decoder_func': 'DoCopySubTextureCHROMIUM',
3379 'unit_test': False,
3380 'extension': True,
3381 'chromium': True,
3383 'TexStorage2DEXT': {
3384 'unit_test': False,
3385 'extension': True,
3386 'decoder_func': 'DoTexStorage2DEXT',
3388 'DrawArraysInstancedANGLE': {
3389 'type': 'Manual',
3390 'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count, '
3391 'GLsizei primcount',
3392 'extension': True,
3393 'unit_test': False,
3394 'pepper_interface': 'InstancedArrays',
3395 'defer_draws': True,
3397 'DrawBuffersEXT': {
3398 'type': 'PUTn',
3399 'decoder_func': 'DoDrawBuffersEXT',
3400 'count': 1,
3401 'client_test': False,
3402 'unit_test': False,
3403 # could use 'extension_flag': 'ext_draw_buffers' but currently expected to
3404 # work without.
3405 'extension': True,
3406 'pepper_interface': 'DrawBuffers',
3408 'DrawElementsInstancedANGLE': {
3409 'type': 'Manual',
3410 'cmd_args': 'GLenumDrawMode mode, GLsizei count, '
3411 'GLenumIndexType type, GLuint index_offset, GLsizei primcount',
3412 'extension': True,
3413 'unit_test': False,
3414 'client_test': False,
3415 'pepper_interface': 'InstancedArrays',
3416 'defer_draws': True,
3418 'VertexAttribDivisorANGLE': {
3419 'type': 'Manual',
3420 'cmd_args': 'GLuint index, GLuint divisor',
3421 'extension': True,
3422 'unit_test': False,
3423 'pepper_interface': 'InstancedArrays',
3425 'GenQueriesEXT': {
3426 'type': 'GENn',
3427 'gl_test_func': 'glGenQueriesARB',
3428 'resource_type': 'Query',
3429 'resource_types': 'Queries',
3430 'unit_test': False,
3431 'pepper_interface': 'Query',
3432 'not_shared': 'True',
3433 'extension': "occlusion_query_EXT",
3435 'DeleteQueriesEXT': {
3436 'type': 'DELn',
3437 'gl_test_func': 'glDeleteQueriesARB',
3438 'resource_type': 'Query',
3439 'resource_types': 'Queries',
3440 'unit_test': False,
3441 'pepper_interface': 'Query',
3442 'extension': "occlusion_query_EXT",
3444 'IsQueryEXT': {
3445 'gen_cmd': False,
3446 'client_test': False,
3447 'pepper_interface': 'Query',
3448 'extension': "occlusion_query_EXT",
3450 'BeginQueryEXT': {
3451 'type': 'Manual',
3452 'cmd_args': 'GLenumQueryTarget target, GLidQuery id, void* sync_data',
3453 'data_transfer_methods': ['shm'],
3454 'gl_test_func': 'glBeginQuery',
3455 'pepper_interface': 'Query',
3456 'extension': "occlusion_query_EXT",
3458 'BeginTransformFeedback': {
3459 'unsafe': True,
3461 'EndQueryEXT': {
3462 'type': 'Manual',
3463 'cmd_args': 'GLenumQueryTarget target, GLuint submit_count',
3464 'gl_test_func': 'glEndnQuery',
3465 'client_test': False,
3466 'pepper_interface': 'Query',
3467 'extension': "occlusion_query_EXT",
3469 'EndTransformFeedback': {
3470 'unsafe': True,
3472 'GetQueryivEXT': {
3473 'gen_cmd': False,
3474 'client_test': False,
3475 'gl_test_func': 'glGetQueryiv',
3476 'pepper_interface': 'Query',
3477 'extension': "occlusion_query_EXT",
3479 'GetQueryObjectuivEXT': {
3480 'gen_cmd': False,
3481 'client_test': False,
3482 'gl_test_func': 'glGetQueryObjectuiv',
3483 'pepper_interface': 'Query',
3484 'extension': "occlusion_query_EXT",
3486 'BindUniformLocationCHROMIUM': {
3487 'type': 'GLchar',
3488 'extension': True,
3489 'data_transfer_methods': ['bucket'],
3490 'needs_size': True,
3491 'gl_test_func': 'DoBindUniformLocationCHROMIUM',
3493 'InsertEventMarkerEXT': {
3494 'type': 'GLcharN',
3495 'decoder_func': 'DoInsertEventMarkerEXT',
3496 'expectation': False,
3497 'extension': True,
3499 'PushGroupMarkerEXT': {
3500 'type': 'GLcharN',
3501 'decoder_func': 'DoPushGroupMarkerEXT',
3502 'expectation': False,
3503 'extension': True,
3505 'PopGroupMarkerEXT': {
3506 'decoder_func': 'DoPopGroupMarkerEXT',
3507 'expectation': False,
3508 'extension': True,
3509 'impl_func': False,
3512 'GenVertexArraysOES': {
3513 'type': 'GENn',
3514 'extension': True,
3515 'gl_test_func': 'glGenVertexArraysOES',
3516 'resource_type': 'VertexArray',
3517 'resource_types': 'VertexArrays',
3518 'unit_test': False,
3519 'pepper_interface': 'VertexArrayObject',
3521 'BindVertexArrayOES': {
3522 'type': 'Bind',
3523 'extension': True,
3524 'gl_test_func': 'glBindVertexArrayOES',
3525 'decoder_func': 'DoBindVertexArrayOES',
3526 'gen_func': 'GenVertexArraysOES',
3527 'unit_test': False,
3528 'client_test': False,
3529 'pepper_interface': 'VertexArrayObject',
3531 'DeleteVertexArraysOES': {
3532 'type': 'DELn',
3533 'extension': True,
3534 'gl_test_func': 'glDeleteVertexArraysOES',
3535 'resource_type': 'VertexArray',
3536 'resource_types': 'VertexArrays',
3537 'unit_test': False,
3538 'pepper_interface': 'VertexArrayObject',
3540 'IsVertexArrayOES': {
3541 'type': 'Is',
3542 'extension': True,
3543 'gl_test_func': 'glIsVertexArrayOES',
3544 'decoder_func': 'DoIsVertexArrayOES',
3545 'expectation': False,
3546 'unit_test': False,
3547 'pepper_interface': 'VertexArrayObject',
3549 'BindTexImage2DCHROMIUM': {
3550 'decoder_func': 'DoBindTexImage2DCHROMIUM',
3551 'unit_test': False,
3552 'extension': True,
3553 'chromium': True,
3555 'ReleaseTexImage2DCHROMIUM': {
3556 'decoder_func': 'DoReleaseTexImage2DCHROMIUM',
3557 'unit_test': False,
3558 'extension': True,
3559 'chromium': True,
3561 'ShallowFinishCHROMIUM': {
3562 'impl_func': False,
3563 'gen_cmd': False,
3564 'extension': True,
3565 'chromium': True,
3566 'client_test': False,
3568 'ShallowFlushCHROMIUM': {
3569 'impl_func': False,
3570 'gen_cmd': False,
3571 'extension': "CHROMIUM_miscellaneous",
3572 'chromium': True,
3573 'client_test': False,
3575 'OrderingBarrierCHROMIUM': {
3576 'impl_func': False,
3577 'gen_cmd': False,
3578 'extension': True,
3579 'chromium': True,
3580 'client_test': False,
3582 'TraceBeginCHROMIUM': {
3583 'type': 'Custom',
3584 'impl_func': False,
3585 'client_test': False,
3586 'cmd_args': 'GLuint category_bucket_id, GLuint name_bucket_id',
3587 'extension': True,
3588 'chromium': True,
3590 'TraceEndCHROMIUM': {
3591 'impl_func': False,
3592 'client_test': False,
3593 'decoder_func': 'DoTraceEndCHROMIUM',
3594 'unit_test': False,
3595 'extension': True,
3596 'chromium': True,
3598 'AsyncTexImage2DCHROMIUM': {
3599 'type': 'Manual',
3600 'data_transfer_methods': ['shm'],
3601 'client_test': False,
3602 'cmd_args': 'GLenumTextureTarget target, GLint level, '
3603 'GLintTextureInternalFormat internalformat, '
3604 'GLsizei width, GLsizei height, '
3605 'GLintTextureBorder border, '
3606 'GLenumTextureFormat format, GLenumPixelType type, '
3607 'const void* pixels, '
3608 'uint32_t async_upload_token, '
3609 'void* sync_data',
3610 'extension': True,
3611 'chromium': True,
3613 'AsyncTexSubImage2DCHROMIUM': {
3614 'type': 'Manual',
3615 'data_transfer_methods': ['shm'],
3616 'client_test': False,
3617 'cmd_args': 'GLenumTextureTarget target, GLint level, '
3618 'GLint xoffset, GLint yoffset, '
3619 'GLsizei width, GLsizei height, '
3620 'GLenumTextureFormat format, GLenumPixelType type, '
3621 'const void* data, '
3622 'uint32_t async_upload_token, '
3623 'void* sync_data',
3624 'extension': True,
3625 'chromium': True,
3627 'WaitAsyncTexImage2DCHROMIUM': {
3628 'type': 'Manual',
3629 'client_test': False,
3630 'extension': True,
3631 'chromium': True,
3633 'WaitAllAsyncTexImage2DCHROMIUM': {
3634 'type': 'Manual',
3635 'client_test': False,
3636 'extension': True,
3637 'chromium': True,
3639 'DiscardFramebufferEXT': {
3640 'type': 'PUTn',
3641 'count': 1,
3642 'decoder_func': 'DoDiscardFramebufferEXT',
3643 'unit_test': False,
3644 'client_test': False,
3645 'extension_flag': 'ext_discard_framebuffer',
3647 'LoseContextCHROMIUM': {
3648 'decoder_func': 'DoLoseContextCHROMIUM',
3649 'unit_test': False,
3650 'extension': True,
3651 'chromium': True,
3653 'InsertSyncPointCHROMIUM': {
3654 'type': 'HandWritten',
3655 'impl_func': False,
3656 'extension': "CHROMIUM_sync_point",
3657 'chromium': True,
3659 'WaitSyncPointCHROMIUM': {
3660 'type': 'Custom',
3661 'impl_func': True,
3662 'extension': "CHROMIUM_sync_point",
3663 'chromium': True,
3664 'trace_level': 1,
3666 'DiscardBackbufferCHROMIUM': {
3667 'type': 'Custom',
3668 'impl_func': True,
3669 'extension': True,
3670 'chromium': True,
3672 'ScheduleOverlayPlaneCHROMIUM': {
3673 'type': 'Custom',
3674 'impl_func': True,
3675 'unit_test': False,
3676 'client_test': False,
3677 'extension': True,
3678 'chromium': True,
3680 'MatrixLoadfCHROMIUM': {
3681 'type': 'PUT',
3682 'count': 16,
3683 'data_type': 'GLfloat',
3684 'decoder_func': 'DoMatrixLoadfCHROMIUM',
3685 'gl_test_func': 'glMatrixLoadfEXT',
3686 'chromium': True,
3687 'extension': True,
3688 'extension_flag': 'chromium_path_rendering',
3690 'MatrixLoadIdentityCHROMIUM': {
3691 'decoder_func': 'DoMatrixLoadIdentityCHROMIUM',
3692 'gl_test_func': 'glMatrixLoadIdentityEXT',
3693 'chromium': True,
3694 'extension': True,
3695 'extension_flag': 'chromium_path_rendering',
3700 def Grouper(n, iterable, fillvalue=None):
3701 """Collect data into fixed-length chunks or blocks"""
3702 args = [iter(iterable)] * n
3703 return itertools.izip_longest(fillvalue=fillvalue, *args)
3706 def SplitWords(input_string):
3707 """Transforms a input_string into a list of lower-case components.
3709 Args:
3710 input_string: the input string.
3712 Returns:
3713 a list of lower-case words.
3715 if input_string.find('_') > -1:
3716 # 'some_TEXT_' -> 'some text'
3717 return input_string.replace('_', ' ').strip().lower().split()
3718 else:
3719 if re.search('[A-Z]', input_string) and re.search('[a-z]', input_string):
3720 # mixed case.
3721 # look for capitalization to cut input_strings
3722 # 'SomeText' -> 'Some Text'
3723 input_string = re.sub('([A-Z])', r' \1', input_string).strip()
3724 # 'Vector3' -> 'Vector 3'
3725 input_string = re.sub('([^0-9])([0-9])', r'\1 \2', input_string)
3726 return input_string.lower().split()
3729 def Lower(words):
3730 """Makes a lower-case identifier from words.
3732 Args:
3733 words: a list of lower-case words.
3735 Returns:
3736 the lower-case identifier.
3738 return '_'.join(words)
3741 def ToUnderscore(input_string):
3742 """converts CamelCase to camel_case."""
3743 words = SplitWords(input_string)
3744 return Lower(words)
3746 def CachedStateName(item):
3747 if item.get('cached', False):
3748 return 'cached_' + item['name']
3749 return item['name']
3751 def ToGLExtensionString(extension_flag):
3752 """Returns GL-type extension string of a extension flag."""
3753 if extension_flag == "oes_compressed_etc1_rgb8_texture":
3754 return "OES_compressed_ETC1_RGB8_texture" # Fixup inconsitency with rgb8,
3755 # unfortunate.
3756 uppercase_words = [ 'img', 'ext', 'arb', 'chromium', 'oes', 'amd', 'bgra8888',
3757 'egl', 'atc', 'etc1', 'angle']
3758 parts = extension_flag.split('_')
3759 return "_".join(
3760 [part.upper() if part in uppercase_words else part for part in parts])
3762 def ToCamelCase(input_string):
3763 """converts ABC_underscore_case to ABCUnderscoreCase."""
3764 return ''.join(w[0].upper() + w[1:] for w in input_string.split('_'))
3766 def GetGLGetTypeConversion(result_type, value_type, value):
3767 """Makes a gl compatible type conversion string for accessing state variables.
3769 Useful when accessing state variables through glGetXXX calls.
3770 glGet documetation (for example, the manual pages):
3771 [...] If glGetIntegerv is called, [...] most floating-point values are
3772 rounded to the nearest integer value. [...]
3774 Args:
3775 result_type: the gl type to be obtained
3776 value_type: the GL type of the state variable
3777 value: the name of the state variable
3779 Returns:
3780 String that converts the state variable to desired GL type according to GL
3781 rules.
3784 if result_type == 'GLint':
3785 if value_type == 'GLfloat':
3786 return 'static_cast<GLint>(round(%s))' % value
3787 return 'static_cast<%s>(%s)' % (result_type, value)
3789 class CWriter(object):
3790 """Writes to a file formatting it for Google's style guidelines."""
3792 def __init__(self, filename):
3793 self.filename = filename
3794 self.content = []
3796 def Write(self, string):
3797 """Writes a string to a file spliting if it's > 80 characters."""
3798 lines = string.splitlines()
3799 num_lines = len(lines)
3800 for ii in range(0, num_lines):
3801 self.content.append(lines[ii])
3802 if ii < (num_lines - 1) or string[-1] == '\n':
3803 self.content.append('\n')
3805 def Close(self):
3806 """Close the file."""
3807 content = "".join(self.content)
3808 write_file = True
3809 if os.path.exists(self.filename):
3810 old_file = open(self.filename, "rb");
3811 old_content = old_file.read()
3812 old_file.close();
3813 if content == old_content:
3814 write_file = False
3815 if write_file:
3816 file = open(self.filename, "wb")
3817 file.write(content)
3818 file.close()
3821 class CHeaderWriter(CWriter):
3822 """Writes a C Header file."""
3824 _non_alnum_re = re.compile(r'[^a-zA-Z0-9]')
3826 def __init__(self, filename, file_comment = None):
3827 CWriter.__init__(self, filename)
3829 base = os.path.abspath(filename)
3830 while os.path.basename(base) != 'src':
3831 new_base = os.path.dirname(base)
3832 assert new_base != base # Prevent infinite loop.
3833 base = new_base
3835 hpath = os.path.relpath(filename, base)
3836 self.guard = self._non_alnum_re.sub('_', hpath).upper() + '_'
3838 self.Write(_LICENSE)
3839 self.Write(_DO_NOT_EDIT_WARNING)
3840 if not file_comment == None:
3841 self.Write(file_comment)
3842 self.Write("#ifndef %s\n" % self.guard)
3843 self.Write("#define %s\n\n" % self.guard)
3845 def Close(self):
3846 self.Write("#endif // %s\n\n" % self.guard)
3847 CWriter.Close(self)
3849 class TypeHandler(object):
3850 """This class emits code for a particular type of function."""
3852 _remove_expected_call_re = re.compile(r' EXPECT_CALL.*?;\n', re.S)
3854 def __init__(self):
3855 pass
3857 def InitFunction(self, func):
3858 """Add or adjust anything type specific for this function."""
3859 if func.GetInfo('needs_size') and not func.name.endswith('Bucket'):
3860 func.AddCmdArg(DataSizeArgument('data_size'))
3862 def NeedsDataTransferFunction(self, func):
3863 """Overriden from TypeHandler."""
3864 return func.num_pointer_args >= 1
3866 def WriteStruct(self, func, file):
3867 """Writes a structure that matches the arguments to a function."""
3868 comment = func.GetInfo('cmd_comment')
3869 if not comment == None:
3870 file.Write(comment)
3871 file.Write("struct %s {\n" % func.name)
3872 file.Write(" typedef %s ValueType;\n" % func.name)
3873 file.Write(" static const CommandId kCmdId = k%s;\n" % func.name)
3874 func.WriteCmdArgFlag(file)
3875 func.WriteCmdFlag(file)
3876 file.Write("\n")
3877 result = func.GetInfo('result')
3878 if not result == None:
3879 if len(result) == 1:
3880 file.Write(" typedef %s Result;\n\n" % result[0])
3881 else:
3882 file.Write(" struct Result {\n")
3883 for line in result:
3884 file.Write(" %s;\n" % line)
3885 file.Write(" };\n\n")
3887 func.WriteCmdComputeSize(file)
3888 func.WriteCmdSetHeader(file)
3889 func.WriteCmdInit(file)
3890 func.WriteCmdSet(file)
3892 file.Write(" gpu::CommandHeader header;\n")
3893 args = func.GetCmdArgs()
3894 for arg in args:
3895 file.Write(" %s %s;\n" % (arg.cmd_type, arg.name))
3897 consts = func.GetCmdConstants()
3898 for const in consts:
3899 file.Write(" static const %s %s = %s;\n" %
3900 (const.cmd_type, const.name, const.GetConstantValue()))
3902 file.Write("};\n")
3903 file.Write("\n")
3905 size = len(args) * _SIZE_OF_UINT32 + _SIZE_OF_COMMAND_HEADER
3906 file.Write("static_assert(sizeof(%s) == %d,\n" % (func.name, size))
3907 file.Write(" \"size of %s should be %d\");\n" %
3908 (func.name, size))
3909 file.Write("static_assert(offsetof(%s, header) == 0,\n" % func.name)
3910 file.Write(" \"offset of %s header should be 0\");\n" %
3911 func.name)
3912 offset = _SIZE_OF_COMMAND_HEADER
3913 for arg in args:
3914 file.Write("static_assert(offsetof(%s, %s) == %d,\n" %
3915 (func.name, arg.name, offset))
3916 file.Write(" \"offset of %s %s should be %d\");\n" %
3917 (func.name, arg.name, offset))
3918 offset += _SIZE_OF_UINT32
3919 if not result == None and len(result) > 1:
3920 offset = 0;
3921 for line in result:
3922 parts = line.split()
3923 name = parts[-1]
3924 check = """
3925 static_assert(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
3926 "offset of %(cmd_name)s Result %(field_name)s should be "
3927 "%(offset)d");
3929 file.Write((check.strip() + "\n") % {
3930 'cmd_name': func.name,
3931 'field_name': name,
3932 'offset': offset,
3934 offset += _SIZE_OF_UINT32
3935 file.Write("\n")
3937 def WriteHandlerImplementation(self, func, file):
3938 """Writes the handler implementation for this command."""
3939 if func.IsUnsafe() and func.GetInfo('id_mapping'):
3940 code_no_gen = """ if (!group_->Get%(type)sServiceId(
3941 %(var)s, &%(service_var)s)) {
3942 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "%(func)s", "invalid %(var)s id");
3943 return error::kNoError;
3946 code_gen = """ if (!group_->Get%(type)sServiceId(
3947 %(var)s, &%(service_var)s)) {
3948 if (!group_->bind_generates_resource()) {
3949 LOCAL_SET_GL_ERROR(
3950 GL_INVALID_OPERATION, "%(func)s", "invalid %(var)s id");
3951 return error::kNoError;
3953 GLuint client_id = %(var)s;
3954 gl%(gen_func)s(1, &%(service_var)s);
3955 Create%(type)s(client_id, %(service_var)s);
3958 gen_func = func.GetInfo('gen_func')
3959 for id_type in func.GetInfo('id_mapping'):
3960 service_var = id_type.lower()
3961 if id_type == 'Sync':
3962 service_var = "service_%s" % service_var
3963 file.Write(" GLsync %s = 0;\n" % service_var)
3964 if gen_func and id_type in gen_func:
3965 file.Write(code_gen % { 'type': id_type,
3966 'var': id_type.lower(),
3967 'service_var': service_var,
3968 'func': func.GetGLFunctionName(),
3969 'gen_func': gen_func })
3970 else:
3971 file.Write(code_no_gen % { 'type': id_type,
3972 'var': id_type.lower(),
3973 'service_var': service_var,
3974 'func': func.GetGLFunctionName() })
3975 args = []
3976 for arg in func.GetOriginalArgs():
3977 if arg.type == "GLsync":
3978 args.append("service_%s" % arg.name)
3979 elif arg.name.endswith("size") and arg.type == "GLsizei":
3980 args.append("num_%s" % func.GetLastOriginalArg().name)
3981 elif arg.name == "length":
3982 args.append("nullptr")
3983 else:
3984 args.append(arg.name)
3985 file.Write(" %s(%s);\n" %
3986 (func.GetGLFunctionName(), ", ".join(args)))
3988 def WriteCmdSizeTest(self, func, file):
3989 """Writes the size test for a command."""
3990 file.Write(" EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n")
3992 def WriteFormatTest(self, func, file):
3993 """Writes a format test for a command."""
3994 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
3995 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
3996 (func.name, func.name))
3997 file.Write(" void* next_cmd = cmd.Set(\n")
3998 file.Write(" &cmd")
3999 args = func.GetCmdArgs()
4000 for value, arg in enumerate(args):
4001 file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11))
4002 file.Write(");\n")
4003 file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" %
4004 func.name)
4005 file.Write(" cmd.header.command);\n")
4006 func.type_handler.WriteCmdSizeTest(func, file)
4007 for value, arg in enumerate(args):
4008 file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
4009 (arg.type, value + 11, arg.name))
4010 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
4011 file.Write(" next_cmd, sizeof(cmd));\n")
4012 file.Write("}\n")
4013 file.Write("\n")
4015 def WriteImmediateFormatTest(self, func, file):
4016 """Writes a format test for an immediate version of a command."""
4017 pass
4019 def WriteBucketFormatTest(self, func, file):
4020 """Writes a format test for a bucket version of a command."""
4021 pass
4023 def WriteGetDataSizeCode(self, func, file):
4024 """Writes the code to set data_size used in validation"""
4025 pass
4027 def WriteImmediateCmdSizeTest(self, func, file):
4028 """Writes a size test for an immediate version of a command."""
4029 file.Write(" // TODO(gman): Compute correct size.\n")
4030 file.Write(" EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n")
4032 def __WriteIdMapping(self, func, file):
4033 """Writes client side / service side ID mapping."""
4034 if not func.IsUnsafe() or not func.GetInfo('id_mapping'):
4035 return
4036 for id_type in func.GetInfo('id_mapping'):
4037 file.Write(" group_->Get%sServiceId(%s, &%s);\n" %
4038 (id_type, id_type.lower(), id_type.lower()))
4040 def WriteImmediateHandlerImplementation (self, func, file):
4041 """Writes the handler impl for the immediate version of a command."""
4042 self.__WriteIdMapping(func, file)
4043 file.Write(" %s(%s);\n" %
4044 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
4046 def WriteBucketHandlerImplementation (self, func, file):
4047 """Writes the handler impl for the bucket version of a command."""
4048 self.__WriteIdMapping(func, file)
4049 file.Write(" %s(%s);\n" %
4050 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
4052 def WriteServiceHandlerFunctionHeader(self, func, file):
4053 """Writes function header for service implementation handlers."""
4054 file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s(
4055 uint32_t immediate_data_size, const void* cmd_data) {
4056 """ % {'name': func.name})
4057 if func.IsUnsafe():
4058 file.Write("""if (!unsafe_es3_apis_enabled())
4059 return error::kUnknownCommand;
4060 """)
4061 file.Write("""const gles2::cmds::%(name)s& c =
4062 *static_cast<const gles2::cmds::%(name)s*>(cmd_data);
4063 (void)c;
4064 """ % {'name': func.name})
4066 def WriteServiceImplementation(self, func, file):
4067 """Writes the service implementation for a command."""
4068 self.WriteServiceHandlerFunctionHeader(func, file)
4069 self.WriteHandlerExtensionCheck(func, file)
4070 self.WriteHandlerDeferReadWrite(func, file);
4071 if len(func.GetOriginalArgs()) > 0:
4072 last_arg = func.GetLastOriginalArg()
4073 all_but_last_arg = func.GetOriginalArgs()[:-1]
4074 for arg in all_but_last_arg:
4075 arg.WriteGetCode(file)
4076 self.WriteGetDataSizeCode(func, file)
4077 last_arg.WriteGetCode(file)
4078 func.WriteHandlerValidation(file)
4079 func.WriteHandlerImplementation(file)
4080 file.Write(" return error::kNoError;\n")
4081 file.Write("}\n")
4082 file.Write("\n")
4084 def WriteImmediateServiceImplementation(self, func, file):
4085 """Writes the service implementation for an immediate version of command."""
4086 self.WriteServiceHandlerFunctionHeader(func, file)
4087 self.WriteHandlerExtensionCheck(func, file)
4088 self.WriteHandlerDeferReadWrite(func, file);
4089 for arg in func.GetOriginalArgs():
4090 if arg.IsPointer():
4091 self.WriteGetDataSizeCode(func, file)
4092 arg.WriteGetCode(file)
4093 func.WriteHandlerValidation(file)
4094 func.WriteHandlerImplementation(file)
4095 file.Write(" return error::kNoError;\n")
4096 file.Write("}\n")
4097 file.Write("\n")
4099 def WriteBucketServiceImplementation(self, func, file):
4100 """Writes the service implementation for a bucket version of command."""
4101 self.WriteServiceHandlerFunctionHeader(func, file)
4102 self.WriteHandlerExtensionCheck(func, file)
4103 self.WriteHandlerDeferReadWrite(func, file);
4104 for arg in func.GetCmdArgs():
4105 arg.WriteGetCode(file)
4106 func.WriteHandlerValidation(file)
4107 func.WriteHandlerImplementation(file)
4108 file.Write(" return error::kNoError;\n")
4109 file.Write("}\n")
4110 file.Write("\n")
4112 def WriteHandlerExtensionCheck(self, func, file):
4113 if func.GetInfo('extension_flag'):
4114 file.Write(" if (!features().%s) {\n" % func.GetInfo('extension_flag'))
4115 file.Write(" LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, \"gl%s\","
4116 " \"function not available\");\n" % func.original_name)
4117 file.Write(" return error::kNoError;")
4118 file.Write(" }\n\n")
4120 def WriteHandlerDeferReadWrite(self, func, file):
4121 """Writes the code to handle deferring reads or writes."""
4122 defer_draws = func.GetInfo('defer_draws')
4123 defer_reads = func.GetInfo('defer_reads')
4124 if defer_draws or defer_reads:
4125 file.Write(" error::Error error;\n")
4126 if defer_draws:
4127 file.Write(" error = WillAccessBoundFramebufferForDraw();\n")
4128 file.Write(" if (error != error::kNoError)\n")
4129 file.Write(" return error;\n")
4130 if defer_reads:
4131 file.Write(" error = WillAccessBoundFramebufferForRead();\n")
4132 file.Write(" if (error != error::kNoError)\n")
4133 file.Write(" return error;\n")
4135 def WriteValidUnitTest(self, func, file, test, *extras):
4136 """Writes a valid unit test for the service implementation."""
4137 if func.GetInfo('expectation') == False:
4138 test = self._remove_expected_call_re.sub('', test)
4139 name = func.name
4140 arg_strings = [
4141 arg.GetValidArg(func) \
4142 for arg in func.GetOriginalArgs() if not arg.IsConstant()
4144 gl_arg_strings = [
4145 arg.GetValidGLArg(func) \
4146 for arg in func.GetOriginalArgs()
4148 gl_func_name = func.GetGLTestFunctionName()
4149 vars = {
4150 'name':name,
4151 'gl_func_name': gl_func_name,
4152 'args': ", ".join(arg_strings),
4153 'gl_args': ", ".join(gl_arg_strings),
4155 for extra in extras:
4156 vars.update(extra)
4157 old_test = ""
4158 while (old_test != test):
4159 old_test = test
4160 test = test % vars
4161 file.Write(test % vars)
4163 def WriteInvalidUnitTest(self, func, file, test, *extras):
4164 """Writes an invalid unit test for the service implementation."""
4165 if func.IsUnsafe():
4166 return
4167 for invalid_arg_index, invalid_arg in enumerate(func.GetOriginalArgs()):
4168 # Service implementation does not test constants, as they are not part of
4169 # the call in the service side.
4170 if invalid_arg.IsConstant():
4171 continue
4173 num_invalid_values = invalid_arg.GetNumInvalidValues(func)
4174 for value_index in range(0, num_invalid_values):
4175 arg_strings = []
4176 parse_result = "kNoError"
4177 gl_error = None
4178 for arg in func.GetOriginalArgs():
4179 if arg.IsConstant():
4180 continue
4181 if invalid_arg is arg:
4182 (arg_string, parse_result, gl_error) = arg.GetInvalidArg(
4183 value_index)
4184 else:
4185 arg_string = arg.GetValidArg(func)
4186 arg_strings.append(arg_string)
4187 gl_arg_strings = []
4188 for arg in func.GetOriginalArgs():
4189 gl_arg_strings.append("_")
4190 gl_func_name = func.GetGLTestFunctionName()
4191 gl_error_test = ''
4192 if not gl_error == None:
4193 gl_error_test = '\n EXPECT_EQ(%s, GetGLError());' % gl_error
4195 vars = {
4196 'name': func.name,
4197 'arg_index': invalid_arg_index,
4198 'value_index': value_index,
4199 'gl_func_name': gl_func_name,
4200 'args': ", ".join(arg_strings),
4201 'all_but_last_args': ", ".join(arg_strings[:-1]),
4202 'gl_args': ", ".join(gl_arg_strings),
4203 'parse_result': parse_result,
4204 'gl_error_test': gl_error_test,
4206 for extra in extras:
4207 vars.update(extra)
4208 file.Write(test % vars)
4210 def WriteServiceUnitTest(self, func, file, *extras):
4211 """Writes the service unit test for a command."""
4213 if func.name == 'Enable':
4214 valid_test = """
4215 TEST_P(%(test_name)s, %(name)sValidArgs) {
4216 SetupExpectationsForEnableDisable(%(gl_args)s, true);
4217 SpecializedSetup<cmds::%(name)s, 0>(true);
4218 cmds::%(name)s cmd;
4219 cmd.Init(%(args)s);"""
4220 elif func.name == 'Disable':
4221 valid_test = """
4222 TEST_P(%(test_name)s, %(name)sValidArgs) {
4223 SetupExpectationsForEnableDisable(%(gl_args)s, false);
4224 SpecializedSetup<cmds::%(name)s, 0>(true);
4225 cmds::%(name)s cmd;
4226 cmd.Init(%(args)s);"""
4227 else:
4228 valid_test = """
4229 TEST_P(%(test_name)s, %(name)sValidArgs) {
4230 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
4231 SpecializedSetup<cmds::%(name)s, 0>(true);
4232 cmds::%(name)s cmd;
4233 cmd.Init(%(args)s);"""
4234 if func.IsUnsafe():
4235 valid_test += """
4236 decoder_->set_unsafe_es3_apis_enabled(true);
4237 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4238 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4239 decoder_->set_unsafe_es3_apis_enabled(false);
4240 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
4243 else:
4244 valid_test += """
4245 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4246 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4249 self.WriteValidUnitTest(func, file, valid_test, *extras)
4251 if not func.IsUnsafe():
4252 invalid_test = """
4253 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
4254 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
4255 SpecializedSetup<cmds::%(name)s, 0>(false);
4256 cmds::%(name)s cmd;
4257 cmd.Init(%(args)s);
4258 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
4261 self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
4263 def WriteImmediateServiceUnitTest(self, func, file, *extras):
4264 """Writes the service unit test for an immediate command."""
4265 file.Write("// TODO(gman): %s\n" % func.name)
4267 def WriteImmediateValidationCode(self, func, file):
4268 """Writes the validation code for an immediate version of a command."""
4269 pass
4271 def WriteBucketServiceUnitTest(self, func, file, *extras):
4272 """Writes the service unit test for a bucket command."""
4273 file.Write("// TODO(gman): %s\n" % func.name)
4275 def WriteBucketValidationCode(self, func, file):
4276 """Writes the validation code for a bucket version of a command."""
4277 file.Write("// TODO(gman): %s\n" % func.name)
4279 def WriteGLES2ImplementationDeclaration(self, func, file):
4280 """Writes the GLES2 Implemention declaration."""
4281 impl_decl = func.GetInfo('impl_decl')
4282 if impl_decl == None or impl_decl == True:
4283 file.Write("%s %s(%s) override;\n" %
4284 (func.return_type, func.original_name,
4285 func.MakeTypedOriginalArgString("")))
4286 file.Write("\n")
4288 def WriteGLES2CLibImplementation(self, func, file):
4289 file.Write("%s GLES2%s(%s) {\n" %
4290 (func.return_type, func.name,
4291 func.MakeTypedOriginalArgString("")))
4292 result_string = "return "
4293 if func.return_type == "void":
4294 result_string = ""
4295 file.Write(" %sgles2::GetGLContext()->%s(%s);\n" %
4296 (result_string, func.original_name,
4297 func.MakeOriginalArgString("")))
4298 file.Write("}\n")
4300 def WriteGLES2Header(self, func, file):
4301 """Writes a re-write macro for GLES"""
4302 file.Write("#define gl%s GLES2_GET_FUN(%s)\n" %(func.name, func.name))
4304 def WriteClientGLCallLog(self, func, file):
4305 """Writes a logging macro for the client side code."""
4306 comma = ""
4307 if len(func.GetOriginalArgs()):
4308 comma = " << "
4309 file.Write(
4310 ' GPU_CLIENT_LOG("[" << GetLogPrefix() << "] gl%s("%s%s << ")");\n' %
4311 (func.original_name, comma, func.MakeLogArgString()))
4313 def WriteClientGLReturnLog(self, func, file):
4314 """Writes the return value logging code."""
4315 if func.return_type != "void":
4316 file.Write(' GPU_CLIENT_LOG("return:" << result)\n')
4318 def WriteGLES2ImplementationHeader(self, func, file):
4319 """Writes the GLES2 Implemention."""
4320 self.WriteGLES2ImplementationDeclaration(func, file)
4322 def WriteGLES2TraceImplementationHeader(self, func, file):
4323 """Writes the GLES2 Trace Implemention header."""
4324 file.Write("%s %s(%s) override;\n" %
4325 (func.return_type, func.original_name,
4326 func.MakeTypedOriginalArgString("")))
4328 def WriteGLES2TraceImplementation(self, func, file):
4329 """Writes the GLES2 Trace Implemention."""
4330 file.Write("%s GLES2TraceImplementation::%s(%s) {\n" %
4331 (func.return_type, func.original_name,
4332 func.MakeTypedOriginalArgString("")))
4333 result_string = "return "
4334 if func.return_type == "void":
4335 result_string = ""
4336 file.Write(' TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::%s");\n' %
4337 func.name)
4338 file.Write(" %sgl_->%s(%s);\n" %
4339 (result_string, func.name, func.MakeOriginalArgString("")))
4340 file.Write("}\n")
4341 file.Write("\n")
4343 def WriteGLES2Implementation(self, func, file):
4344 """Writes the GLES2 Implemention."""
4345 impl_func = func.GetInfo('impl_func')
4346 impl_decl = func.GetInfo('impl_decl')
4347 gen_cmd = func.GetInfo('gen_cmd')
4348 if (func.can_auto_generate and
4349 (impl_func == None or impl_func == True) and
4350 (impl_decl == None or impl_decl == True) and
4351 (gen_cmd == None or gen_cmd == True)):
4352 file.Write("%s GLES2Implementation::%s(%s) {\n" %
4353 (func.return_type, func.original_name,
4354 func.MakeTypedOriginalArgString("")))
4355 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
4356 self.WriteClientGLCallLog(func, file)
4357 func.WriteDestinationInitalizationValidation(file)
4358 for arg in func.GetOriginalArgs():
4359 arg.WriteClientSideValidationCode(file, func)
4360 file.Write(" helper_->%s(%s);\n" %
4361 (func.name, func.MakeHelperArgString("")))
4362 file.Write(" CheckGLError();\n")
4363 self.WriteClientGLReturnLog(func, file)
4364 file.Write("}\n")
4365 file.Write("\n")
4367 def WriteGLES2InterfaceHeader(self, func, file):
4368 """Writes the GLES2 Interface."""
4369 file.Write("virtual %s %s(%s) = 0;\n" %
4370 (func.return_type, func.original_name,
4371 func.MakeTypedOriginalArgString("")))
4373 def WriteMojoGLES2ImplHeader(self, func, file):
4374 """Writes the Mojo GLES2 implementation header."""
4375 file.Write("%s %s(%s) override;\n" %
4376 (func.return_type, func.original_name,
4377 func.MakeTypedOriginalArgString("")))
4379 def WriteMojoGLES2Impl(self, func, file):
4380 """Writes the Mojo GLES2 implementation."""
4381 file.Write("%s MojoGLES2Impl::%s(%s) {\n" %
4382 (func.return_type, func.original_name,
4383 func.MakeTypedOriginalArgString("")))
4384 extensions = ["CHROMIUM_sync_point", "CHROMIUM_texture_mailbox",
4385 "CHROMIUM_sub_image", "CHROMIUM_miscellaneous",
4386 "occlusion_query_EXT"]
4387 if func.IsCoreGLFunction() or func.GetInfo("extension") in extensions:
4388 file.Write("MojoGLES2MakeCurrent(context_);");
4389 func_return = "gl" + func.original_name + "(" + \
4390 func.MakeOriginalArgString("") + ");"
4391 if func.return_type == "void":
4392 file.Write(func_return);
4393 else:
4394 file.Write("return " + func_return);
4395 else:
4396 file.Write("NOTREACHED() << \"Unimplemented %s.\";\n" %
4397 func.original_name);
4398 if func.return_type != "void":
4399 file.Write("return 0;")
4400 file.Write("}")
4402 def WriteGLES2InterfaceStub(self, func, file):
4403 """Writes the GLES2 Interface stub declaration."""
4404 file.Write("%s %s(%s) override;\n" %
4405 (func.return_type, func.original_name,
4406 func.MakeTypedOriginalArgString("")))
4408 def WriteGLES2InterfaceStubImpl(self, func, file):
4409 """Writes the GLES2 Interface stub declaration."""
4410 args = func.GetOriginalArgs()
4411 arg_string = ", ".join(
4412 ["%s /* %s */" % (arg.type, arg.name) for arg in args])
4413 file.Write("%s GLES2InterfaceStub::%s(%s) {\n" %
4414 (func.return_type, func.original_name, arg_string))
4415 if func.return_type != "void":
4416 file.Write(" return 0;\n")
4417 file.Write("}\n")
4419 def WriteGLES2ImplementationUnitTest(self, func, file):
4420 """Writes the GLES2 Implemention unit test."""
4421 client_test = func.GetInfo('client_test')
4422 if (func.can_auto_generate and
4423 (client_test == None or client_test == True)):
4424 code = """
4425 TEST_F(GLES2ImplementationTest, %(name)s) {
4426 struct Cmds {
4427 cmds::%(name)s cmd;
4429 Cmds expected;
4430 expected.cmd.Init(%(cmd_args)s);
4432 gl_->%(name)s(%(args)s);
4433 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
4436 cmd_arg_strings = [
4437 arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()
4440 gl_arg_strings = [
4441 arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs()
4444 file.Write(code % {
4445 'name': func.name,
4446 'args': ", ".join(gl_arg_strings),
4447 'cmd_args': ", ".join(cmd_arg_strings),
4450 # Test constants for invalid values, as they are not tested by the
4451 # service.
4452 constants = [arg for arg in func.GetOriginalArgs() if arg.IsConstant()]
4453 if constants:
4454 code = """
4455 TEST_F(GLES2ImplementationTest, %(name)sInvalidConstantArg%(invalid_index)d) {
4456 gl_->%(name)s(%(args)s);
4457 EXPECT_TRUE(NoCommandsWritten());
4458 EXPECT_EQ(%(gl_error)s, CheckError());
4461 for invalid_arg in constants:
4462 gl_arg_strings = []
4463 invalid = invalid_arg.GetInvalidArg(func)
4464 for arg in func.GetOriginalArgs():
4465 if arg is invalid_arg:
4466 gl_arg_strings.append(invalid[0])
4467 else:
4468 gl_arg_strings.append(arg.GetValidClientSideArg(func))
4470 file.Write(code % {
4471 'name': func.name,
4472 'invalid_index': func.GetOriginalArgs().index(invalid_arg),
4473 'args': ", ".join(gl_arg_strings),
4474 'gl_error': invalid[2],
4476 else:
4477 if client_test != False:
4478 file.Write("// TODO(zmo): Implement unit test for %s\n" % func.name)
4480 def WriteDestinationInitalizationValidation(self, func, file):
4481 """Writes the client side destintion initialization validation."""
4482 for arg in func.GetOriginalArgs():
4483 arg.WriteDestinationInitalizationValidation(file, func)
4485 def WriteTraceEvent(self, func, file):
4486 file.Write(' TRACE_EVENT0("gpu", "GLES2Implementation::%s");\n' %
4487 func.original_name)
4489 def WriteImmediateCmdComputeSize(self, func, file):
4490 """Writes the size computation code for the immediate version of a cmd."""
4491 file.Write(" static uint32_t ComputeSize(uint32_t size_in_bytes) {\n")
4492 file.Write(" return static_cast<uint32_t>(\n")
4493 file.Write(" sizeof(ValueType) + // NOLINT\n")
4494 file.Write(" RoundSizeToMultipleOfEntries(size_in_bytes));\n")
4495 file.Write(" }\n")
4496 file.Write("\n")
4498 def WriteImmediateCmdSetHeader(self, func, file):
4499 """Writes the SetHeader function for the immediate version of a cmd."""
4500 file.Write(" void SetHeader(uint32_t size_in_bytes) {\n")
4501 file.Write(" header.SetCmdByTotalSize<ValueType>(size_in_bytes);\n")
4502 file.Write(" }\n")
4503 file.Write("\n")
4505 def WriteImmediateCmdInit(self, func, file):
4506 """Writes the Init function for the immediate version of a command."""
4507 raise NotImplementedError(func.name)
4509 def WriteImmediateCmdSet(self, func, file):
4510 """Writes the Set function for the immediate version of a command."""
4511 raise NotImplementedError(func.name)
4513 def WriteCmdHelper(self, func, file):
4514 """Writes the cmd helper definition for a cmd."""
4515 code = """ void %(name)s(%(typed_args)s) {
4516 gles2::cmds::%(name)s* c = GetCmdSpace<gles2::cmds::%(name)s>();
4517 if (c) {
4518 c->Init(%(args)s);
4523 file.Write(code % {
4524 "name": func.name,
4525 "typed_args": func.MakeTypedCmdArgString(""),
4526 "args": func.MakeCmdArgString(""),
4529 def WriteImmediateCmdHelper(self, func, file):
4530 """Writes the cmd helper definition for the immediate version of a cmd."""
4531 code = """ void %(name)s(%(typed_args)s) {
4532 const uint32_t s = 0; // TODO(gman): compute correct size
4533 gles2::cmds::%(name)s* c =
4534 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(s);
4535 if (c) {
4536 c->Init(%(args)s);
4541 file.Write(code % {
4542 "name": func.name,
4543 "typed_args": func.MakeTypedCmdArgString(""),
4544 "args": func.MakeCmdArgString(""),
4548 class StateSetHandler(TypeHandler):
4549 """Handler for commands that simply set state."""
4551 def __init__(self):
4552 TypeHandler.__init__(self)
4554 def WriteHandlerImplementation(self, func, file):
4555 """Overrriden from TypeHandler."""
4556 state_name = func.GetInfo('state')
4557 state = _STATES[state_name]
4558 states = state['states']
4559 args = func.GetOriginalArgs()
4560 for ndx,item in enumerate(states):
4561 code = []
4562 if 'range_checks' in item:
4563 for range_check in item['range_checks']:
4564 code.append("%s %s" % (args[ndx].name, range_check['check']))
4565 if 'nan_check' in item:
4566 # Drivers might generate an INVALID_VALUE error when a value is set
4567 # to NaN. This is allowed behavior under GLES 3.0 section 2.1.1 or
4568 # OpenGL 4.5 section 2.3.4.1 - providing NaN allows undefined results.
4569 # Make this behavior consistent within Chromium, and avoid leaking GL
4570 # errors by generating the error in the command buffer instead of
4571 # letting the GL driver generate it.
4572 code.append("std::isnan(%s)" % args[ndx].name)
4573 if len(code):
4574 file.Write(" if (%s) {\n" % " ||\n ".join(code))
4575 file.Write(
4576 ' LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,'
4577 ' "%s", "%s out of range");\n' %
4578 (func.name, args[ndx].name))
4579 file.Write(" return error::kNoError;\n")
4580 file.Write(" }\n")
4581 code = []
4582 for ndx,item in enumerate(states):
4583 code.append("state_.%s != %s" % (item['name'], args[ndx].name))
4584 file.Write(" if (%s) {\n" % " ||\n ".join(code))
4585 for ndx,item in enumerate(states):
4586 file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx].name))
4587 if 'state_flag' in state:
4588 file.Write(" %s = true;\n" % state['state_flag'])
4589 if not func.GetInfo("no_gl"):
4590 for ndx,item in enumerate(states):
4591 if item.get('cached', False):
4592 file.Write(" state_.%s = %s;\n" %
4593 (CachedStateName(item), args[ndx].name))
4594 file.Write(" %s(%s);\n" %
4595 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
4596 file.Write(" }\n")
4598 def WriteServiceUnitTest(self, func, file, *extras):
4599 """Overrriden from TypeHandler."""
4600 TypeHandler.WriteServiceUnitTest(self, func, file, *extras)
4601 state_name = func.GetInfo('state')
4602 state = _STATES[state_name]
4603 states = state['states']
4604 for ndx,item in enumerate(states):
4605 if 'range_checks' in item:
4606 for check_ndx, range_check in enumerate(item['range_checks']):
4607 valid_test = """
4608 TEST_P(%(test_name)s, %(name)sInvalidValue%(ndx)d_%(check_ndx)d) {
4609 SpecializedSetup<cmds::%(name)s, 0>(false);
4610 cmds::%(name)s cmd;
4611 cmd.Init(%(args)s);
4612 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4613 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
4616 name = func.name
4617 arg_strings = [
4618 arg.GetValidArg(func) \
4619 for arg in func.GetOriginalArgs() if not arg.IsConstant()
4622 arg_strings[ndx] = range_check['test_value']
4623 vars = {
4624 'name': name,
4625 'ndx': ndx,
4626 'check_ndx': check_ndx,
4627 'args': ", ".join(arg_strings),
4629 for extra in extras:
4630 vars.update(extra)
4631 file.Write(valid_test % vars)
4632 if 'nan_check' in item:
4633 valid_test = """
4634 TEST_P(%(test_name)s, %(name)sNaNValue%(ndx)d) {
4635 SpecializedSetup<cmds::%(name)s, 0>(false);
4636 cmds::%(name)s cmd;
4637 cmd.Init(%(args)s);
4638 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4639 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
4642 name = func.name
4643 arg_strings = [
4644 arg.GetValidArg(func) \
4645 for arg in func.GetOriginalArgs() if not arg.IsConstant()
4648 arg_strings[ndx] = 'nanf("")'
4649 vars = {
4650 'name': name,
4651 'ndx': ndx,
4652 'args': ", ".join(arg_strings),
4654 for extra in extras:
4655 vars.update(extra)
4656 file.Write(valid_test % vars)
4659 class StateSetRGBAlphaHandler(TypeHandler):
4660 """Handler for commands that simply set state that have rgb/alpha."""
4662 def __init__(self):
4663 TypeHandler.__init__(self)
4665 def WriteHandlerImplementation(self, func, file):
4666 """Overrriden from TypeHandler."""
4667 state_name = func.GetInfo('state')
4668 state = _STATES[state_name]
4669 states = state['states']
4670 args = func.GetOriginalArgs()
4671 num_args = len(args)
4672 code = []
4673 for ndx,item in enumerate(states):
4674 code.append("state_.%s != %s" % (item['name'], args[ndx % num_args].name))
4675 file.Write(" if (%s) {\n" % " ||\n ".join(code))
4676 for ndx, item in enumerate(states):
4677 file.Write(" state_.%s = %s;\n" %
4678 (item['name'], args[ndx % num_args].name))
4679 if 'state_flag' in state:
4680 file.Write(" %s = true;\n" % state['state_flag'])
4681 if not func.GetInfo("no_gl"):
4682 file.Write(" %s(%s);\n" %
4683 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
4684 file.Write(" }\n")
4687 class StateSetFrontBackSeparateHandler(TypeHandler):
4688 """Handler for commands that simply set state that have front/back."""
4690 def __init__(self):
4691 TypeHandler.__init__(self)
4693 def WriteHandlerImplementation(self, func, file):
4694 """Overrriden from TypeHandler."""
4695 state_name = func.GetInfo('state')
4696 state = _STATES[state_name]
4697 states = state['states']
4698 args = func.GetOriginalArgs()
4699 face = args[0].name
4700 num_args = len(args)
4701 file.Write(" bool changed = false;\n")
4702 for group_ndx, group in enumerate(Grouper(num_args - 1, states)):
4703 file.Write(" if (%s == %s || %s == GL_FRONT_AND_BACK) {\n" %
4704 (face, ('GL_FRONT', 'GL_BACK')[group_ndx], face))
4705 code = []
4706 for ndx, item in enumerate(group):
4707 code.append("state_.%s != %s" % (item['name'], args[ndx + 1].name))
4708 file.Write(" changed |= %s;\n" % " ||\n ".join(code))
4709 file.Write(" }\n")
4710 file.Write(" if (changed) {\n")
4711 for group_ndx, group in enumerate(Grouper(num_args - 1, states)):
4712 file.Write(" if (%s == %s || %s == GL_FRONT_AND_BACK) {\n" %
4713 (face, ('GL_FRONT', 'GL_BACK')[group_ndx], face))
4714 for ndx, item in enumerate(group):
4715 file.Write(" state_.%s = %s;\n" %
4716 (item['name'], args[ndx + 1].name))
4717 file.Write(" }\n")
4718 if 'state_flag' in state:
4719 file.Write(" %s = true;\n" % state['state_flag'])
4720 if not func.GetInfo("no_gl"):
4721 file.Write(" %s(%s);\n" %
4722 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
4723 file.Write(" }\n")
4726 class StateSetFrontBackHandler(TypeHandler):
4727 """Handler for commands that simply set state that set both front/back."""
4729 def __init__(self):
4730 TypeHandler.__init__(self)
4732 def WriteHandlerImplementation(self, func, file):
4733 """Overrriden from TypeHandler."""
4734 state_name = func.GetInfo('state')
4735 state = _STATES[state_name]
4736 states = state['states']
4737 args = func.GetOriginalArgs()
4738 num_args = len(args)
4739 code = []
4740 for group_ndx, group in enumerate(Grouper(num_args, states)):
4741 for ndx, item in enumerate(group):
4742 code.append("state_.%s != %s" % (item['name'], args[ndx].name))
4743 file.Write(" if (%s) {\n" % " ||\n ".join(code))
4744 for group_ndx, group in enumerate(Grouper(num_args, states)):
4745 for ndx, item in enumerate(group):
4746 file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx].name))
4747 if 'state_flag' in state:
4748 file.Write(" %s = true;\n" % state['state_flag'])
4749 if not func.GetInfo("no_gl"):
4750 file.Write(" %s(%s);\n" %
4751 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
4752 file.Write(" }\n")
4755 class StateSetNamedParameter(TypeHandler):
4756 """Handler for commands that set a state chosen with an enum parameter."""
4758 def __init__(self):
4759 TypeHandler.__init__(self)
4761 def WriteHandlerImplementation(self, func, file):
4762 """Overridden from TypeHandler."""
4763 state_name = func.GetInfo('state')
4764 state = _STATES[state_name]
4765 states = state['states']
4766 args = func.GetOriginalArgs()
4767 num_args = len(args)
4768 assert num_args == 2
4769 file.Write(" switch (%s) {\n" % args[0].name)
4770 for state in states:
4771 file.Write(" case %s:\n" % state['enum'])
4772 file.Write(" if (state_.%s != %s) {\n" %
4773 (state['name'], args[1].name))
4774 file.Write(" state_.%s = %s;\n" % (state['name'], args[1].name))
4775 if not func.GetInfo("no_gl"):
4776 file.Write(" %s(%s);\n" %
4777 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
4778 file.Write(" }\n")
4779 file.Write(" break;\n")
4780 file.Write(" default:\n")
4781 file.Write(" NOTREACHED();\n")
4782 file.Write(" }\n")
4785 class CustomHandler(TypeHandler):
4786 """Handler for commands that are auto-generated but require minor tweaks."""
4788 def __init__(self):
4789 TypeHandler.__init__(self)
4791 def WriteServiceImplementation(self, func, file):
4792 """Overrriden from TypeHandler."""
4793 pass
4795 def WriteImmediateServiceImplementation(self, func, file):
4796 """Overrriden from TypeHandler."""
4797 pass
4799 def WriteBucketServiceImplementation(self, func, file):
4800 """Overrriden from TypeHandler."""
4801 pass
4803 def WriteServiceUnitTest(self, func, file, *extras):
4804 """Overrriden from TypeHandler."""
4805 file.Write("// TODO(gman): %s\n\n" % func.name)
4807 def WriteImmediateServiceUnitTest(self, func, file, *extras):
4808 """Overrriden from TypeHandler."""
4809 file.Write("// TODO(gman): %s\n\n" % func.name)
4811 def WriteImmediateCmdGetTotalSize(self, func, file):
4812 """Overrriden from TypeHandler."""
4813 file.Write(
4814 " uint32_t total_size = 0; // TODO(gman): get correct size.\n")
4816 def WriteImmediateCmdInit(self, func, file):
4817 """Overrriden from TypeHandler."""
4818 file.Write(" void Init(%s) {\n" % func.MakeTypedCmdArgString("_"))
4819 self.WriteImmediateCmdGetTotalSize(func, file)
4820 file.Write(" SetHeader(total_size);\n")
4821 args = func.GetCmdArgs()
4822 for arg in args:
4823 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
4824 file.Write(" }\n")
4825 file.Write("\n")
4827 def WriteImmediateCmdSet(self, func, file):
4828 """Overrriden from TypeHandler."""
4829 copy_args = func.MakeCmdArgString("_", False)
4830 file.Write(" void* Set(void* cmd%s) {\n" %
4831 func.MakeTypedCmdArgString("_", True))
4832 self.WriteImmediateCmdGetTotalSize(func, file)
4833 file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
4834 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
4835 "cmd, total_size);\n")
4836 file.Write(" }\n")
4837 file.Write("\n")
4840 class TodoHandler(CustomHandler):
4841 """Handle for commands that are not yet implemented."""
4843 def NeedsDataTransferFunction(self, func):
4844 """Overriden from TypeHandler."""
4845 return False
4847 def WriteImmediateFormatTest(self, func, file):
4848 """Overrriden from TypeHandler."""
4849 pass
4851 def WriteGLES2ImplementationUnitTest(self, func, file):
4852 """Overrriden from TypeHandler."""
4853 pass
4855 def WriteGLES2Implementation(self, func, file):
4856 """Overrriden from TypeHandler."""
4857 file.Write("%s GLES2Implementation::%s(%s) {\n" %
4858 (func.return_type, func.original_name,
4859 func.MakeTypedOriginalArgString("")))
4860 file.Write(" // TODO: for now this is a no-op\n")
4861 file.Write(
4862 " SetGLError("
4863 "GL_INVALID_OPERATION, \"gl%s\", \"not implemented\");\n" %
4864 func.name)
4865 if func.return_type != "void":
4866 file.Write(" return 0;\n")
4867 file.Write("}\n")
4868 file.Write("\n")
4870 def WriteServiceImplementation(self, func, file):
4871 """Overrriden from TypeHandler."""
4872 self.WriteServiceHandlerFunctionHeader(func, file)
4873 file.Write(" // TODO: for now this is a no-op\n")
4874 file.Write(
4875 " LOCAL_SET_GL_ERROR("
4876 "GL_INVALID_OPERATION, \"gl%s\", \"not implemented\");\n" %
4877 func.name)
4878 file.Write(" return error::kNoError;\n")
4879 file.Write("}\n")
4880 file.Write("\n")
4883 class HandWrittenHandler(CustomHandler):
4884 """Handler for comands where everything must be written by hand."""
4886 def InitFunction(self, func):
4887 """Add or adjust anything type specific for this function."""
4888 CustomHandler.InitFunction(self, func)
4889 func.can_auto_generate = False
4891 def NeedsDataTransferFunction(self, func):
4892 """Overriden from TypeHandler."""
4893 # If specified explicitly, force the data transfer method.
4894 if func.GetInfo('data_transfer_methods'):
4895 return True
4896 return False
4898 def WriteStruct(self, func, file):
4899 """Overrriden from TypeHandler."""
4900 pass
4902 def WriteDocs(self, func, file):
4903 """Overrriden from TypeHandler."""
4904 pass
4906 def WriteServiceUnitTest(self, func, file, *extras):
4907 """Overrriden from TypeHandler."""
4908 file.Write("// TODO(gman): %s\n\n" % func.name)
4910 def WriteImmediateServiceUnitTest(self, func, file, *extras):
4911 """Overrriden from TypeHandler."""
4912 file.Write("// TODO(gman): %s\n\n" % func.name)
4914 def WriteBucketServiceUnitTest(self, func, file, *extras):
4915 """Overrriden from TypeHandler."""
4916 file.Write("// TODO(gman): %s\n\n" % func.name)
4918 def WriteServiceImplementation(self, func, file):
4919 """Overrriden from TypeHandler."""
4920 pass
4922 def WriteImmediateServiceImplementation(self, func, file):
4923 """Overrriden from TypeHandler."""
4924 pass
4926 def WriteBucketServiceImplementation(self, func, file):
4927 """Overrriden from TypeHandler."""
4928 pass
4930 def WriteImmediateCmdHelper(self, func, file):
4931 """Overrriden from TypeHandler."""
4932 pass
4934 def WriteCmdHelper(self, func, file):
4935 """Overrriden from TypeHandler."""
4936 pass
4938 def WriteFormatTest(self, func, file):
4939 """Overrriden from TypeHandler."""
4940 file.Write("// TODO(gman): Write test for %s\n" % func.name)
4942 def WriteImmediateFormatTest(self, func, file):
4943 """Overrriden from TypeHandler."""
4944 file.Write("// TODO(gman): Write test for %s\n" % func.name)
4946 def WriteBucketFormatTest(self, func, file):
4947 """Overrriden from TypeHandler."""
4948 file.Write("// TODO(gman): Write test for %s\n" % func.name)
4952 class ManualHandler(CustomHandler):
4953 """Handler for commands who's handlers must be written by hand."""
4955 def __init__(self):
4956 CustomHandler.__init__(self)
4958 def InitFunction(self, func):
4959 """Overrriden from TypeHandler."""
4960 if (func.name == 'CompressedTexImage2DBucket' or
4961 func.name == 'CompressedTexImage3DBucket'):
4962 func.cmd_args = func.cmd_args[:-1]
4963 func.AddCmdArg(Argument('bucket_id', 'GLuint'))
4964 else:
4965 CustomHandler.InitFunction(self, func)
4967 def WriteServiceImplementation(self, func, file):
4968 """Overrriden from TypeHandler."""
4969 pass
4971 def WriteBucketServiceImplementation(self, func, file):
4972 """Overrriden from TypeHandler."""
4973 pass
4975 def WriteServiceUnitTest(self, func, file, *extras):
4976 """Overrriden from TypeHandler."""
4977 file.Write("// TODO(gman): %s\n\n" % func.name)
4979 def WriteImmediateServiceUnitTest(self, func, file, *extras):
4980 """Overrriden from TypeHandler."""
4981 file.Write("// TODO(gman): %s\n\n" % func.name)
4983 def WriteImmediateServiceImplementation(self, func, file):
4984 """Overrriden from TypeHandler."""
4985 pass
4987 def WriteImmediateFormatTest(self, func, file):
4988 """Overrriden from TypeHandler."""
4989 file.Write("// TODO(gman): Implement test for %s\n" % func.name)
4991 def WriteGLES2Implementation(self, func, file):
4992 """Overrriden from TypeHandler."""
4993 if func.GetInfo('impl_func'):
4994 super(ManualHandler, self).WriteGLES2Implementation(func, file)
4996 def WriteGLES2ImplementationHeader(self, func, file):
4997 """Overrriden from TypeHandler."""
4998 file.Write("%s %s(%s) override;\n" %
4999 (func.return_type, func.original_name,
5000 func.MakeTypedOriginalArgString("")))
5001 file.Write("\n")
5003 def WriteImmediateCmdGetTotalSize(self, func, file):
5004 """Overrriden from TypeHandler."""
5005 # TODO(gman): Move this data to _FUNCTION_INFO?
5006 CustomHandler.WriteImmediateCmdGetTotalSize(self, func, file)
5009 class DataHandler(TypeHandler):
5010 """Handler for glBufferData, glBufferSubData, glTexImage*D, glTexSubImage*D,
5011 glCompressedTexImage*D, glCompressedTexImageSub*D."""
5012 def __init__(self):
5013 TypeHandler.__init__(self)
5015 def InitFunction(self, func):
5016 """Overrriden from TypeHandler."""
5017 if (func.name == 'CompressedTexSubImage2DBucket' or
5018 func.name == 'CompressedTexSubImage3DBucket'):
5019 func.cmd_args = func.cmd_args[:-1]
5020 func.AddCmdArg(Argument('bucket_id', 'GLuint'))
5022 def WriteGetDataSizeCode(self, func, file):
5023 """Overrriden from TypeHandler."""
5024 # TODO(gman): Move this data to _FUNCTION_INFO?
5025 name = func.name
5026 if name.endswith("Immediate"):
5027 name = name[0:-9]
5028 if name == 'BufferData' or name == 'BufferSubData':
5029 file.Write(" uint32_t data_size = size;\n")
5030 elif (name == 'CompressedTexImage2D' or
5031 name == 'CompressedTexSubImage2D' or
5032 name == 'CompressedTexImage3D' or
5033 name == 'CompressedTexSubImage3D'):
5034 file.Write(" uint32_t data_size = imageSize;\n")
5035 elif (name == 'CompressedTexSubImage2DBucket' or
5036 name == 'CompressedTexSubImage3DBucket'):
5037 file.Write(" Bucket* bucket = GetBucket(c.bucket_id);\n")
5038 file.Write(" uint32_t data_size = bucket->size();\n")
5039 file.Write(" GLsizei imageSize = data_size;\n")
5040 elif name == 'TexImage2D' or name == 'TexSubImage2D':
5041 code = """ uint32_t data_size;
5042 if (!GLES2Util::ComputeImageDataSize(
5043 width, height, format, type, unpack_alignment_, &data_size)) {
5044 return error::kOutOfBounds;
5047 file.Write(code)
5048 else:
5049 file.Write(
5050 "// uint32_t data_size = 0; // TODO(gman): get correct size!\n")
5052 def WriteImmediateCmdGetTotalSize(self, func, file):
5053 """Overrriden from TypeHandler."""
5054 pass
5056 def WriteImmediateCmdSizeTest(self, func, file):
5057 """Overrriden from TypeHandler."""
5058 file.Write(" EXPECT_EQ(sizeof(cmd), total_size);\n")
5060 def WriteImmediateCmdInit(self, func, file):
5061 """Overrriden from TypeHandler."""
5062 file.Write(" void Init(%s) {\n" % func.MakeTypedCmdArgString("_"))
5063 self.WriteImmediateCmdGetTotalSize(func, file)
5064 file.Write(" SetHeader(total_size);\n")
5065 args = func.GetCmdArgs()
5066 for arg in args:
5067 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
5068 file.Write(" }\n")
5069 file.Write("\n")
5071 def WriteImmediateCmdSet(self, func, file):
5072 """Overrriden from TypeHandler."""
5073 copy_args = func.MakeCmdArgString("_", False)
5074 file.Write(" void* Set(void* cmd%s) {\n" %
5075 func.MakeTypedCmdArgString("_", True))
5076 self.WriteImmediateCmdGetTotalSize(func, file)
5077 file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
5078 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
5079 "cmd, total_size);\n")
5080 file.Write(" }\n")
5081 file.Write("\n")
5083 def WriteImmediateFormatTest(self, func, file):
5084 """Overrriden from TypeHandler."""
5085 # TODO(gman): Remove this exception.
5086 file.Write("// TODO(gman): Implement test for %s\n" % func.name)
5087 return
5089 def WriteServiceUnitTest(self, func, file, *extras):
5090 """Overrriden from TypeHandler."""
5091 file.Write("// TODO(gman): %s\n\n" % func.name)
5093 def WriteImmediateServiceUnitTest(self, func, file, *extras):
5094 """Overrriden from TypeHandler."""
5095 file.Write("// TODO(gman): %s\n\n" % func.name)
5097 def WriteBucketServiceImplementation(self, func, file):
5098 """Overrriden from TypeHandler."""
5099 if ((not func.name == 'CompressedTexSubImage2DBucket') and
5100 (not func.name == 'CompressedTexSubImage3DBucket')):
5101 TypeHandler.WriteBucketServiceImplemenation(self, func, file)
5104 class BindHandler(TypeHandler):
5105 """Handler for glBind___ type functions."""
5107 def __init__(self):
5108 TypeHandler.__init__(self)
5110 def WriteServiceUnitTest(self, func, file, *extras):
5111 """Overrriden from TypeHandler."""
5113 if len(func.GetOriginalArgs()) == 1:
5114 valid_test = """
5115 TEST_P(%(test_name)s, %(name)sValidArgs) {
5116 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
5117 SpecializedSetup<cmds::%(name)s, 0>(true);
5118 cmds::%(name)s cmd;
5119 cmd.Init(%(args)s);"""
5120 if func.IsUnsafe():
5121 valid_test += """
5122 decoder_->set_unsafe_es3_apis_enabled(true);
5123 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5124 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5125 decoder_->set_unsafe_es3_apis_enabled(false);
5126 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
5129 else:
5130 valid_test += """
5131 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5132 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5135 if func.GetInfo("gen_func"):
5136 valid_test += """
5137 TEST_P(%(test_name)s, %(name)sValidArgsNewId) {
5138 EXPECT_CALL(*gl_, %(gl_func_name)s(kNewServiceId));
5139 EXPECT_CALL(*gl_, %(gl_gen_func_name)s(1, _))
5140 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
5141 SpecializedSetup<cmds::%(name)s, 0>(true);
5142 cmds::%(name)s cmd;
5143 cmd.Init(kNewClientId);
5144 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5145 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5146 EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
5149 self.WriteValidUnitTest(func, file, valid_test, {
5150 'resource_type': func.GetOriginalArgs()[0].resource_type,
5151 'gl_gen_func_name': func.GetInfo("gen_func"),
5152 }, *extras)
5153 else:
5154 valid_test = """
5155 TEST_P(%(test_name)s, %(name)sValidArgs) {
5156 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
5157 SpecializedSetup<cmds::%(name)s, 0>(true);
5158 cmds::%(name)s cmd;
5159 cmd.Init(%(args)s);"""
5160 if func.IsUnsafe():
5161 valid_test += """
5162 decoder_->set_unsafe_es3_apis_enabled(true);
5163 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5164 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5165 decoder_->set_unsafe_es3_apis_enabled(false);
5166 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
5169 else:
5170 valid_test += """
5171 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5172 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5175 if func.GetInfo("gen_func"):
5176 valid_test += """
5177 TEST_P(%(test_name)s, %(name)sValidArgsNewId) {
5178 EXPECT_CALL(*gl_,
5179 %(gl_func_name)s(%(gl_args_with_new_id)s));
5180 EXPECT_CALL(*gl_, %(gl_gen_func_name)s(1, _))
5181 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
5182 SpecializedSetup<cmds::%(name)s, 0>(true);
5183 cmds::%(name)s cmd;
5184 cmd.Init(%(args_with_new_id)s);"""
5185 if func.IsUnsafe():
5186 valid_test += """
5187 decoder_->set_unsafe_es3_apis_enabled(true);
5188 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5189 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5190 EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
5191 decoder_->set_unsafe_es3_apis_enabled(false);
5192 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
5195 else:
5196 valid_test += """
5197 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5198 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5199 EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
5203 gl_args_with_new_id = []
5204 args_with_new_id = []
5205 for arg in func.GetOriginalArgs():
5206 if hasattr(arg, 'resource_type'):
5207 gl_args_with_new_id.append('kNewServiceId')
5208 args_with_new_id.append('kNewClientId')
5209 else:
5210 gl_args_with_new_id.append(arg.GetValidGLArg(func))
5211 args_with_new_id.append(arg.GetValidArg(func))
5212 self.WriteValidUnitTest(func, file, valid_test, {
5213 'args_with_new_id': ", ".join(args_with_new_id),
5214 'gl_args_with_new_id': ", ".join(gl_args_with_new_id),
5215 'resource_type': func.GetResourceIdArg().resource_type,
5216 'gl_gen_func_name': func.GetInfo("gen_func"),
5217 }, *extras)
5219 invalid_test = """
5220 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
5221 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
5222 SpecializedSetup<cmds::%(name)s, 0>(false);
5223 cmds::%(name)s cmd;
5224 cmd.Init(%(args)s);
5225 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
5228 self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
5230 def WriteGLES2Implementation(self, func, file):
5231 """Writes the GLES2 Implemention."""
5233 impl_func = func.GetInfo('impl_func')
5234 impl_decl = func.GetInfo('impl_decl')
5236 if (func.can_auto_generate and
5237 (impl_func == None or impl_func == True) and
5238 (impl_decl == None or impl_decl == True)):
5240 file.Write("%s GLES2Implementation::%s(%s) {\n" %
5241 (func.return_type, func.original_name,
5242 func.MakeTypedOriginalArgString("")))
5243 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
5244 func.WriteDestinationInitalizationValidation(file)
5245 self.WriteClientGLCallLog(func, file)
5246 for arg in func.GetOriginalArgs():
5247 arg.WriteClientSideValidationCode(file, func)
5249 code = """ if (Is%(type)sReservedId(%(id)s)) {
5250 SetGLError(GL_INVALID_OPERATION, "%(name)s\", \"%(id)s reserved id");
5251 return;
5253 %(name)sHelper(%(arg_string)s);
5254 CheckGLError();
5258 name_arg = func.GetResourceIdArg()
5259 file.Write(code % {
5260 'name': func.name,
5261 'arg_string': func.MakeOriginalArgString(""),
5262 'id': name_arg.name,
5263 'type': name_arg.resource_type,
5264 'lc_type': name_arg.resource_type.lower(),
5267 def WriteGLES2ImplementationUnitTest(self, func, file):
5268 """Overrriden from TypeHandler."""
5269 client_test = func.GetInfo('client_test')
5270 if client_test == False:
5271 return
5272 code = """
5273 TEST_F(GLES2ImplementationTest, %(name)s) {
5274 struct Cmds {
5275 cmds::%(name)s cmd;
5277 Cmds expected;
5278 expected.cmd.Init(%(cmd_args)s);
5280 gl_->%(name)s(%(args)s);
5281 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));"""
5282 if not func.IsUnsafe():
5283 code += """
5284 ClearCommands();
5285 gl_->%(name)s(%(args)s);
5286 EXPECT_TRUE(NoCommandsWritten());"""
5287 code += """
5290 cmd_arg_strings = [
5291 arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()
5293 gl_arg_strings = [
5294 arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs()
5297 file.Write(code % {
5298 'name': func.name,
5299 'args': ", ".join(gl_arg_strings),
5300 'cmd_args': ", ".join(cmd_arg_strings),
5304 class GENnHandler(TypeHandler):
5305 """Handler for glGen___ type functions."""
5307 def __init__(self):
5308 TypeHandler.__init__(self)
5310 def InitFunction(self, func):
5311 """Overrriden from TypeHandler."""
5312 pass
5314 def WriteGetDataSizeCode(self, func, file):
5315 """Overrriden from TypeHandler."""
5316 code = """ uint32_t data_size;
5317 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
5318 return error::kOutOfBounds;
5321 file.Write(code)
5323 def WriteHandlerImplementation (self, func, file):
5324 """Overrriden from TypeHandler."""
5325 file.Write(" if (!%sHelper(n, %s)) {\n"
5326 " return error::kInvalidArguments;\n"
5327 " }\n" %
5328 (func.name, func.GetLastOriginalArg().name))
5330 def WriteImmediateHandlerImplementation(self, func, file):
5331 """Overrriden from TypeHandler."""
5332 if func.IsUnsafe():
5333 file.Write(""" for (GLsizei ii = 0; ii < n; ++ii) {
5334 if (group_->Get%(resource_name)sServiceId(%(last_arg_name)s[ii], NULL)) {
5335 return error::kInvalidArguments;
5338 scoped_ptr<GLuint[]> service_ids(new GLuint[n]);
5339 gl%(func_name)s(n, service_ids.get());
5340 for (GLsizei ii = 0; ii < n; ++ii) {
5341 group_->Add%(resource_name)sId(%(last_arg_name)s[ii], service_ids[ii]);
5343 """ % { 'func_name': func.original_name,
5344 'last_arg_name': func.GetLastOriginalArg().name,
5345 'resource_name': func.GetInfo('resource_type') })
5346 else:
5347 file.Write(" if (!%sHelper(n, %s)) {\n"
5348 " return error::kInvalidArguments;\n"
5349 " }\n" %
5350 (func.original_name, func.GetLastOriginalArg().name))
5352 def WriteGLES2Implementation(self, func, file):
5353 """Overrriden from TypeHandler."""
5354 log_code = (""" GPU_CLIENT_LOG_CODE_BLOCK({
5355 for (GLsizei i = 0; i < n; ++i) {
5356 GPU_CLIENT_LOG(" " << i << ": " << %s[i]);
5358 });""" % func.GetOriginalArgs()[1].name)
5359 args = {
5360 'log_code': log_code,
5361 'return_type': func.return_type,
5362 'name': func.original_name,
5363 'typed_args': func.MakeTypedOriginalArgString(""),
5364 'args': func.MakeOriginalArgString(""),
5365 'resource_types': func.GetInfo('resource_types'),
5366 'count_name': func.GetOriginalArgs()[0].name,
5368 file.Write(
5369 "%(return_type)s GLES2Implementation::%(name)s(%(typed_args)s) {\n" %
5370 args)
5371 func.WriteDestinationInitalizationValidation(file)
5372 self.WriteClientGLCallLog(func, file)
5373 for arg in func.GetOriginalArgs():
5374 arg.WriteClientSideValidationCode(file, func)
5375 not_shared = func.GetInfo('not_shared')
5376 if not_shared:
5377 alloc_code = (
5379 """ IdAllocator* id_allocator = GetIdAllocator(id_namespaces::k%s);
5380 for (GLsizei ii = 0; ii < n; ++ii)
5381 %s[ii] = id_allocator->AllocateID();""" %
5382 (func.GetInfo('resource_types'), func.GetOriginalArgs()[1].name))
5383 else:
5384 alloc_code = (""" GetIdHandler(id_namespaces::k%(resource_types)s)->
5385 MakeIds(this, 0, %(args)s);""" % args)
5386 args['alloc_code'] = alloc_code
5388 code = """ GPU_CLIENT_SINGLE_THREAD_CHECK();
5389 %(alloc_code)s
5390 %(name)sHelper(%(args)s);
5391 helper_->%(name)sImmediate(%(args)s);
5392 if (share_group_->bind_generates_resource())
5393 helper_->CommandBufferHelper::Flush();
5394 %(log_code)s
5395 CheckGLError();
5399 file.Write(code % args)
5401 def WriteGLES2ImplementationUnitTest(self, func, file):
5402 """Overrriden from TypeHandler."""
5403 code = """
5404 TEST_F(GLES2ImplementationTest, %(name)s) {
5405 GLuint ids[2] = { 0, };
5406 struct Cmds {
5407 cmds::%(name)sImmediate gen;
5408 GLuint data[2];
5410 Cmds expected;
5411 expected.gen.Init(arraysize(ids), &ids[0]);
5412 expected.data[0] = k%(types)sStartId;
5413 expected.data[1] = k%(types)sStartId + 1;
5414 gl_->%(name)s(arraysize(ids), &ids[0]);
5415 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
5416 EXPECT_EQ(k%(types)sStartId, ids[0]);
5417 EXPECT_EQ(k%(types)sStartId + 1, ids[1]);
5420 file.Write(code % {
5421 'name': func.name,
5422 'types': func.GetInfo('resource_types'),
5425 def WriteServiceUnitTest(self, func, file, *extras):
5426 """Overrriden from TypeHandler."""
5427 valid_test = """
5428 TEST_P(%(test_name)s, %(name)sValidArgs) {
5429 EXPECT_CALL(*gl_, %(gl_func_name)s(1, _))
5430 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
5431 GetSharedMemoryAs<GLuint*>()[0] = kNewClientId;
5432 SpecializedSetup<cmds::%(name)s, 0>(true);
5433 cmds::%(name)s cmd;
5434 cmd.Init(%(args)s);
5435 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5436 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
5437 if func.IsUnsafe():
5438 valid_test += """
5439 GLuint service_id;
5440 EXPECT_TRUE(Get%(resource_name)sServiceId(kNewClientId, &service_id));
5441 EXPECT_EQ(kNewServiceId, service_id)
5444 else:
5445 valid_test += """
5446 EXPECT_TRUE(Get%(resource_name)s(kNewClientId, &service_id) != NULL);
5449 self.WriteValidUnitTest(func, file, valid_test, {
5450 'resource_name': func.GetInfo('resource_type'),
5451 }, *extras)
5452 invalid_test = """
5453 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
5454 EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0);
5455 GetSharedMemoryAs<GLuint*>()[0] = client_%(resource_name)s_id_;
5456 SpecializedSetup<cmds::%(name)s, 0>(false);
5457 cmds::%(name)s cmd;
5458 cmd.Init(%(args)s);
5459 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
5462 self.WriteValidUnitTest(func, file, invalid_test, {
5463 'resource_name': func.GetInfo('resource_type').lower(),
5464 }, *extras)
5466 def WriteImmediateServiceUnitTest(self, func, file, *extras):
5467 """Overrriden from TypeHandler."""
5468 valid_test = """
5469 TEST_P(%(test_name)s, %(name)sValidArgs) {
5470 EXPECT_CALL(*gl_, %(gl_func_name)s(1, _))
5471 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
5472 cmds::%(name)s* cmd = GetImmediateAs<cmds::%(name)s>();
5473 GLuint temp = kNewClientId;
5474 SpecializedSetup<cmds::%(name)s, 0>(true);"""
5475 if func.IsUnsafe():
5476 valid_test += """
5477 decoder_->set_unsafe_es3_apis_enabled(true);"""
5478 valid_test += """
5479 cmd->Init(1, &temp);
5480 EXPECT_EQ(error::kNoError,
5481 ExecuteImmediateCmd(*cmd, sizeof(temp)));
5482 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
5483 if func.IsUnsafe():
5484 valid_test += """
5485 GLuint service_id;
5486 EXPECT_TRUE(Get%(resource_name)sServiceId(kNewClientId, &service_id));
5487 EXPECT_EQ(kNewServiceId, service_id);
5488 decoder_->set_unsafe_es3_apis_enabled(false);
5489 EXPECT_EQ(error::kUnknownCommand,
5490 ExecuteImmediateCmd(*cmd, sizeof(temp)));
5493 else:
5494 valid_test += """
5495 EXPECT_TRUE(Get%(resource_name)s(kNewClientId) != NULL);
5498 self.WriteValidUnitTest(func, file, valid_test, {
5499 'resource_name': func.GetInfo('resource_type'),
5500 }, *extras)
5501 invalid_test = """
5502 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
5503 EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0);
5504 cmds::%(name)s* cmd = GetImmediateAs<cmds::%(name)s>();
5505 SpecializedSetup<cmds::%(name)s, 0>(false);
5506 cmd->Init(1, &client_%(resource_name)s_id_);"""
5507 if func.IsUnsafe():
5508 invalid_test += """
5509 decoder_->set_unsafe_es3_apis_enabled(true);
5510 EXPECT_EQ(error::kInvalidArguments,
5511 ExecuteImmediateCmd(*cmd, sizeof(&client_%(resource_name)s_id_)));
5512 decoder_->set_unsafe_es3_apis_enabled(false);
5515 else:
5516 invalid_test += """
5517 EXPECT_EQ(error::kInvalidArguments,
5518 ExecuteImmediateCmd(*cmd, sizeof(&client_%(resource_name)s_id_)));
5521 self.WriteValidUnitTest(func, file, invalid_test, {
5522 'resource_name': func.GetInfo('resource_type').lower(),
5523 }, *extras)
5525 def WriteImmediateCmdComputeSize(self, func, file):
5526 """Overrriden from TypeHandler."""
5527 file.Write(" static uint32_t ComputeDataSize(GLsizei n) {\n")
5528 file.Write(
5529 " return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT\n")
5530 file.Write(" }\n")
5531 file.Write("\n")
5532 file.Write(" static uint32_t ComputeSize(GLsizei n) {\n")
5533 file.Write(" return static_cast<uint32_t>(\n")
5534 file.Write(" sizeof(ValueType) + ComputeDataSize(n)); // NOLINT\n")
5535 file.Write(" }\n")
5536 file.Write("\n")
5538 def WriteImmediateCmdSetHeader(self, func, file):
5539 """Overrriden from TypeHandler."""
5540 file.Write(" void SetHeader(GLsizei n) {\n")
5541 file.Write(" header.SetCmdByTotalSize<ValueType>(ComputeSize(n));\n")
5542 file.Write(" }\n")
5543 file.Write("\n")
5545 def WriteImmediateCmdInit(self, func, file):
5546 """Overrriden from TypeHandler."""
5547 last_arg = func.GetLastOriginalArg()
5548 file.Write(" void Init(%s, %s _%s) {\n" %
5549 (func.MakeTypedCmdArgString("_"),
5550 last_arg.type, last_arg.name))
5551 file.Write(" SetHeader(_n);\n")
5552 args = func.GetCmdArgs()
5553 for arg in args:
5554 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
5555 file.Write(" memcpy(ImmediateDataAddress(this),\n")
5556 file.Write(" _%s, ComputeDataSize(_n));\n" % last_arg.name)
5557 file.Write(" }\n")
5558 file.Write("\n")
5560 def WriteImmediateCmdSet(self, func, file):
5561 """Overrriden from TypeHandler."""
5562 last_arg = func.GetLastOriginalArg()
5563 copy_args = func.MakeCmdArgString("_", False)
5564 file.Write(" void* Set(void* cmd%s, %s _%s) {\n" %
5565 (func.MakeTypedCmdArgString("_", True),
5566 last_arg.type, last_arg.name))
5567 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
5568 (copy_args, last_arg.name))
5569 file.Write(" const uint32_t size = ComputeSize(_n);\n")
5570 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
5571 "cmd, size);\n")
5572 file.Write(" }\n")
5573 file.Write("\n")
5575 def WriteImmediateCmdHelper(self, func, file):
5576 """Overrriden from TypeHandler."""
5577 code = """ void %(name)s(%(typed_args)s) {
5578 const uint32_t size = gles2::cmds::%(name)s::ComputeSize(n);
5579 gles2::cmds::%(name)s* c =
5580 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
5581 if (c) {
5582 c->Init(%(args)s);
5587 file.Write(code % {
5588 "name": func.name,
5589 "typed_args": func.MakeTypedOriginalArgString(""),
5590 "args": func.MakeOriginalArgString(""),
5593 def WriteImmediateFormatTest(self, func, file):
5594 """Overrriden from TypeHandler."""
5595 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
5596 file.Write(" static GLuint ids[] = { 12, 23, 34, };\n")
5597 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
5598 (func.name, func.name))
5599 file.Write(" void* next_cmd = cmd.Set(\n")
5600 file.Write(" &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n")
5601 file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" %
5602 func.name)
5603 file.Write(" cmd.header.command);\n")
5604 file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
5605 file.Write(" RoundSizeToMultipleOfEntries(cmd.n * 4u),\n")
5606 file.Write(" cmd.header.size * 4u);\n")
5607 file.Write(" EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n);\n");
5608 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
5609 file.Write(" next_cmd, sizeof(cmd) +\n")
5610 file.Write(" RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n")
5611 file.Write(" // TODO(gman): Check that ids were inserted;\n")
5612 file.Write("}\n")
5613 file.Write("\n")
5616 class CreateHandler(TypeHandler):
5617 """Handler for glCreate___ type functions."""
5619 def __init__(self):
5620 TypeHandler.__init__(self)
5622 def InitFunction(self, func):
5623 """Overrriden from TypeHandler."""
5624 func.AddCmdArg(Argument("client_id", 'uint32_t'))
5626 def __GetResourceType(self, func):
5627 if func.return_type == "GLsync":
5628 return "Sync"
5629 else:
5630 return func.name[6:] # Create*
5632 def WriteServiceUnitTest(self, func, file, *extras):
5633 """Overrriden from TypeHandler."""
5634 valid_test = """
5635 TEST_P(%(test_name)s, %(name)sValidArgs) {
5636 %(id_type_cast)sEXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s))
5637 .WillOnce(Return(%(const_service_id)s));
5638 SpecializedSetup<cmds::%(name)s, 0>(true);
5639 cmds::%(name)s cmd;
5640 cmd.Init(%(args)s%(comma)skNewClientId);"""
5641 if func.IsUnsafe():
5642 valid_test += """
5643 decoder_->set_unsafe_es3_apis_enabled(true);"""
5644 valid_test += """
5645 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5646 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
5647 if func.IsUnsafe():
5648 valid_test += """
5649 %(return_type)s service_id = 0;
5650 EXPECT_TRUE(Get%(resource_type)sServiceId(kNewClientId, &service_id));
5651 EXPECT_EQ(%(const_service_id)s, service_id);
5652 decoder_->set_unsafe_es3_apis_enabled(false);
5653 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
5656 else:
5657 valid_test += """
5658 EXPECT_TRUE(Get%(resource_type)s(kNewClientId));
5661 comma = ""
5662 cmd_arg_count = 0
5663 for arg in func.GetOriginalArgs():
5664 if not arg.IsConstant():
5665 cmd_arg_count += 1
5666 if cmd_arg_count:
5667 comma = ", "
5668 if func.return_type == 'GLsync':
5669 id_type_cast = ("const GLsync kNewServiceIdGLuint = reinterpret_cast"
5670 "<GLsync>(kNewServiceId);\n ")
5671 const_service_id = "kNewServiceIdGLuint"
5672 else:
5673 id_type_cast = ""
5674 const_service_id = "kNewServiceId"
5675 self.WriteValidUnitTest(func, file, valid_test, {
5676 'comma': comma,
5677 'resource_type': self.__GetResourceType(func),
5678 'return_type': func.return_type,
5679 'id_type_cast': id_type_cast,
5680 'const_service_id': const_service_id,
5681 }, *extras)
5682 invalid_test = """
5683 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
5684 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
5685 SpecializedSetup<cmds::%(name)s, 0>(false);
5686 cmds::%(name)s cmd;
5687 cmd.Init(%(args)s%(comma)skNewClientId);
5688 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));%(gl_error_test)s
5691 self.WriteInvalidUnitTest(func, file, invalid_test, {
5692 'comma': comma,
5693 }, *extras)
5695 def WriteHandlerImplementation (self, func, file):
5696 """Overrriden from TypeHandler."""
5697 if func.IsUnsafe():
5698 code = """ uint32_t client_id = c.client_id;
5699 %(return_type)s service_id = 0;
5700 if (group_->Get%(resource_name)sServiceId(client_id, &service_id)) {
5701 return error::kInvalidArguments;
5703 service_id = %(gl_func_name)s(%(gl_args)s);
5704 if (service_id) {
5705 group_->Add%(resource_name)sId(client_id, service_id);
5708 else:
5709 code = """ uint32_t client_id = c.client_id;
5710 if (Get%(resource_name)s(client_id)) {
5711 return error::kInvalidArguments;
5713 %(return_type)s service_id = %(gl_func_name)s(%(gl_args)s);
5714 if (service_id) {
5715 Create%(resource_name)s(client_id, service_id%(gl_args_with_comma)s);
5718 file.Write(code % {
5719 'resource_name': self.__GetResourceType(func),
5720 'return_type': func.return_type,
5721 'gl_func_name': func.GetGLFunctionName(),
5722 'gl_args': func.MakeOriginalArgString(""),
5723 'gl_args_with_comma': func.MakeOriginalArgString("", True) })
5725 def WriteGLES2Implementation(self, func, file):
5726 """Overrriden from TypeHandler."""
5727 file.Write("%s GLES2Implementation::%s(%s) {\n" %
5728 (func.return_type, func.original_name,
5729 func.MakeTypedOriginalArgString("")))
5730 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
5731 func.WriteDestinationInitalizationValidation(file)
5732 self.WriteClientGLCallLog(func, file)
5733 for arg in func.GetOriginalArgs():
5734 arg.WriteClientSideValidationCode(file, func)
5735 file.Write(" GLuint client_id;\n")
5736 if func.return_type == "GLsync":
5737 file.Write(
5738 " GetIdHandler(id_namespaces::kSyncs)->\n")
5739 else:
5740 file.Write(
5741 " GetIdHandler(id_namespaces::kProgramsAndShaders)->\n")
5742 file.Write(" MakeIds(this, 0, 1, &client_id);\n")
5743 file.Write(" helper_->%s(%s);\n" %
5744 (func.name, func.MakeCmdArgString("")))
5745 file.Write(' GPU_CLIENT_LOG("returned " << client_id);\n')
5746 file.Write(" CheckGLError();\n")
5747 if func.return_type == "GLsync":
5748 file.Write(" return reinterpret_cast<GLsync>(client_id);\n")
5749 else:
5750 file.Write(" return client_id;\n")
5751 file.Write("}\n")
5752 file.Write("\n")
5755 class DeleteHandler(TypeHandler):
5756 """Handler for glDelete___ single resource type functions."""
5758 def __init__(self):
5759 TypeHandler.__init__(self)
5761 def WriteServiceImplementation(self, func, file):
5762 """Overrriden from TypeHandler."""
5763 if func.IsUnsafe():
5764 TypeHandler.WriteServiceImplementation(self, func, file)
5765 # HandleDeleteShader and HandleDeleteProgram are manually written.
5766 pass
5768 def WriteGLES2Implementation(self, func, file):
5769 """Overrriden from TypeHandler."""
5770 file.Write("%s GLES2Implementation::%s(%s) {\n" %
5771 (func.return_type, func.original_name,
5772 func.MakeTypedOriginalArgString("")))
5773 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
5774 func.WriteDestinationInitalizationValidation(file)
5775 self.WriteClientGLCallLog(func, file)
5776 for arg in func.GetOriginalArgs():
5777 arg.WriteClientSideValidationCode(file, func)
5778 file.Write(
5779 " GPU_CLIENT_DCHECK(%s != 0);\n" % func.GetOriginalArgs()[-1].name)
5780 file.Write(" %sHelper(%s);\n" %
5781 (func.original_name, func.GetOriginalArgs()[-1].name))
5782 file.Write(" CheckGLError();\n")
5783 file.Write("}\n")
5784 file.Write("\n")
5786 def WriteHandlerImplementation (self, func, file):
5787 """Overrriden from TypeHandler."""
5788 assert len(func.GetOriginalArgs()) == 1
5789 arg = func.GetOriginalArgs()[0]
5790 if func.IsUnsafe():
5791 file.Write(""" %(arg_type)s service_id = 0;
5792 if (group_->Get%(resource_type)sServiceId(%(arg_name)s, &service_id)) {
5793 glDelete%(resource_type)s(service_id);
5794 group_->Remove%(resource_type)sId(%(arg_name)s);
5795 } else {
5796 LOCAL_SET_GL_ERROR(
5797 GL_INVALID_VALUE, "gl%(func_name)s", "unknown %(arg_name)s");
5799 """ % { 'resource_type': func.GetInfo('resource_type'),
5800 'arg_name': arg.name,
5801 'arg_type': arg.type,
5802 'func_name': func.original_name })
5803 else:
5804 file.Write(" %sHelper(%s);\n" % (func.original_name, arg.name))
5806 class DELnHandler(TypeHandler):
5807 """Handler for glDelete___ type functions."""
5809 def __init__(self):
5810 TypeHandler.__init__(self)
5812 def WriteGetDataSizeCode(self, func, file):
5813 """Overrriden from TypeHandler."""
5814 code = """ uint32_t data_size;
5815 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
5816 return error::kOutOfBounds;
5819 file.Write(code)
5821 def WriteGLES2ImplementationUnitTest(self, func, file):
5822 """Overrriden from TypeHandler."""
5823 code = """
5824 TEST_F(GLES2ImplementationTest, %(name)s) {
5825 GLuint ids[2] = { k%(types)sStartId, k%(types)sStartId + 1 };
5826 struct Cmds {
5827 cmds::%(name)sImmediate del;
5828 GLuint data[2];
5830 Cmds expected;
5831 expected.del.Init(arraysize(ids), &ids[0]);
5832 expected.data[0] = k%(types)sStartId;
5833 expected.data[1] = k%(types)sStartId + 1;
5834 gl_->%(name)s(arraysize(ids), &ids[0]);
5835 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
5838 file.Write(code % {
5839 'name': func.name,
5840 'types': func.GetInfo('resource_types'),
5843 def WriteServiceUnitTest(self, func, file, *extras):
5844 """Overrriden from TypeHandler."""
5845 valid_test = """
5846 TEST_P(%(test_name)s, %(name)sValidArgs) {
5847 EXPECT_CALL(
5848 *gl_,
5849 %(gl_func_name)s(1, Pointee(kService%(upper_resource_name)sId)))
5850 .Times(1);
5851 GetSharedMemoryAs<GLuint*>()[0] = client_%(resource_name)s_id_;
5852 SpecializedSetup<cmds::%(name)s, 0>(true);
5853 cmds::%(name)s cmd;
5854 cmd.Init(%(args)s);
5855 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5856 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5857 EXPECT_TRUE(
5858 Get%(upper_resource_name)s(client_%(resource_name)s_id_) == NULL);
5861 self.WriteValidUnitTest(func, file, valid_test, {
5862 'resource_name': func.GetInfo('resource_type').lower(),
5863 'upper_resource_name': func.GetInfo('resource_type'),
5864 }, *extras)
5865 invalid_test = """
5866 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
5867 GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId;
5868 SpecializedSetup<cmds::%(name)s, 0>(false);
5869 cmds::%(name)s cmd;
5870 cmd.Init(%(args)s);
5871 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5874 self.WriteValidUnitTest(func, file, invalid_test, *extras)
5876 def WriteImmediateServiceUnitTest(self, func, file, *extras):
5877 """Overrriden from TypeHandler."""
5878 valid_test = """
5879 TEST_P(%(test_name)s, %(name)sValidArgs) {
5880 EXPECT_CALL(
5881 *gl_,
5882 %(gl_func_name)s(1, Pointee(kService%(upper_resource_name)sId)))
5883 .Times(1);
5884 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
5885 SpecializedSetup<cmds::%(name)s, 0>(true);
5886 cmd.Init(1, &client_%(resource_name)s_id_);"""
5887 if func.IsUnsafe():
5888 valid_test += """
5889 decoder_->set_unsafe_es3_apis_enabled(true);"""
5890 valid_test += """
5891 EXPECT_EQ(error::kNoError,
5892 ExecuteImmediateCmd(cmd, sizeof(client_%(resource_name)s_id_)));
5893 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
5894 if func.IsUnsafe():
5895 valid_test += """
5896 EXPECT_FALSE(Get%(upper_resource_name)sServiceId(
5897 client_%(resource_name)s_id_, NULL));
5898 decoder_->set_unsafe_es3_apis_enabled(false);
5899 EXPECT_EQ(error::kUnknownCommand,
5900 ExecuteImmediateCmd(cmd, sizeof(client_%(resource_name)s_id_)));
5903 else:
5904 valid_test += """
5905 EXPECT_TRUE(
5906 Get%(upper_resource_name)s(client_%(resource_name)s_id_) == NULL);
5909 self.WriteValidUnitTest(func, file, valid_test, {
5910 'resource_name': func.GetInfo('resource_type').lower(),
5911 'upper_resource_name': func.GetInfo('resource_type'),
5912 }, *extras)
5913 invalid_test = """
5914 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
5915 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
5916 SpecializedSetup<cmds::%(name)s, 0>(false);
5917 GLuint temp = kInvalidClientId;
5918 cmd.Init(1, &temp);"""
5919 if func.IsUnsafe():
5920 invalid_test += """
5921 decoder_->set_unsafe_es3_apis_enabled(true);
5922 EXPECT_EQ(error::kNoError,
5923 ExecuteImmediateCmd(cmd, sizeof(temp)));
5924 decoder_->set_unsafe_es3_apis_enabled(false);
5925 EXPECT_EQ(error::kUnknownCommand,
5926 ExecuteImmediateCmd(cmd, sizeof(temp)));
5929 else:
5930 invalid_test += """
5931 EXPECT_EQ(error::kNoError,
5932 ExecuteImmediateCmd(cmd, sizeof(temp)));
5935 self.WriteValidUnitTest(func, file, invalid_test, *extras)
5937 def WriteHandlerImplementation (self, func, file):
5938 """Overrriden from TypeHandler."""
5939 file.Write(" %sHelper(n, %s);\n" %
5940 (func.name, func.GetLastOriginalArg().name))
5942 def WriteImmediateHandlerImplementation (self, func, file):
5943 """Overrriden from TypeHandler."""
5944 if func.IsUnsafe():
5945 file.Write(""" for (GLsizei ii = 0; ii < n; ++ii) {
5946 GLuint service_id = 0;
5947 if (group_->Get%(resource_type)sServiceId(
5948 %(last_arg_name)s[ii], &service_id)) {
5949 glDelete%(resource_type)ss(1, &service_id);
5950 group_->Remove%(resource_type)sId(%(last_arg_name)s[ii]);
5953 """ % { 'resource_type': func.GetInfo('resource_type'),
5954 'last_arg_name': func.GetLastOriginalArg().name })
5955 else:
5956 file.Write(" %sHelper(n, %s);\n" %
5957 (func.original_name, func.GetLastOriginalArg().name))
5959 def WriteGLES2Implementation(self, func, file):
5960 """Overrriden from TypeHandler."""
5961 impl_decl = func.GetInfo('impl_decl')
5962 if impl_decl == None or impl_decl == True:
5963 args = {
5964 'return_type': func.return_type,
5965 'name': func.original_name,
5966 'typed_args': func.MakeTypedOriginalArgString(""),
5967 'args': func.MakeOriginalArgString(""),
5968 'resource_type': func.GetInfo('resource_type').lower(),
5969 'count_name': func.GetOriginalArgs()[0].name,
5971 file.Write(
5972 "%(return_type)s GLES2Implementation::%(name)s(%(typed_args)s) {\n" %
5973 args)
5974 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
5975 func.WriteDestinationInitalizationValidation(file)
5976 self.WriteClientGLCallLog(func, file)
5977 file.Write(""" GPU_CLIENT_LOG_CODE_BLOCK({
5978 for (GLsizei i = 0; i < n; ++i) {
5979 GPU_CLIENT_LOG(" " << i << ": " << %s[i]);
5982 """ % func.GetOriginalArgs()[1].name)
5983 file.Write(""" GPU_CLIENT_DCHECK_CODE_BLOCK({
5984 for (GLsizei i = 0; i < n; ++i) {
5985 DCHECK(%s[i] != 0);
5988 """ % func.GetOriginalArgs()[1].name)
5989 for arg in func.GetOriginalArgs():
5990 arg.WriteClientSideValidationCode(file, func)
5991 code = """ %(name)sHelper(%(args)s);
5992 CheckGLError();
5996 file.Write(code % args)
5998 def WriteImmediateCmdComputeSize(self, func, file):
5999 """Overrriden from TypeHandler."""
6000 file.Write(" static uint32_t ComputeDataSize(GLsizei n) {\n")
6001 file.Write(
6002 " return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT\n")
6003 file.Write(" }\n")
6004 file.Write("\n")
6005 file.Write(" static uint32_t ComputeSize(GLsizei n) {\n")
6006 file.Write(" return static_cast<uint32_t>(\n")
6007 file.Write(" sizeof(ValueType) + ComputeDataSize(n)); // NOLINT\n")
6008 file.Write(" }\n")
6009 file.Write("\n")
6011 def WriteImmediateCmdSetHeader(self, func, file):
6012 """Overrriden from TypeHandler."""
6013 file.Write(" void SetHeader(GLsizei n) {\n")
6014 file.Write(" header.SetCmdByTotalSize<ValueType>(ComputeSize(n));\n")
6015 file.Write(" }\n")
6016 file.Write("\n")
6018 def WriteImmediateCmdInit(self, func, file):
6019 """Overrriden from TypeHandler."""
6020 last_arg = func.GetLastOriginalArg()
6021 file.Write(" void Init(%s, %s _%s) {\n" %
6022 (func.MakeTypedCmdArgString("_"),
6023 last_arg.type, last_arg.name))
6024 file.Write(" SetHeader(_n);\n")
6025 args = func.GetCmdArgs()
6026 for arg in args:
6027 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
6028 file.Write(" memcpy(ImmediateDataAddress(this),\n")
6029 file.Write(" _%s, ComputeDataSize(_n));\n" % last_arg.name)
6030 file.Write(" }\n")
6031 file.Write("\n")
6033 def WriteImmediateCmdSet(self, func, file):
6034 """Overrriden from TypeHandler."""
6035 last_arg = func.GetLastOriginalArg()
6036 copy_args = func.MakeCmdArgString("_", False)
6037 file.Write(" void* Set(void* cmd%s, %s _%s) {\n" %
6038 (func.MakeTypedCmdArgString("_", True),
6039 last_arg.type, last_arg.name))
6040 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
6041 (copy_args, last_arg.name))
6042 file.Write(" const uint32_t size = ComputeSize(_n);\n")
6043 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
6044 "cmd, size);\n")
6045 file.Write(" }\n")
6046 file.Write("\n")
6048 def WriteImmediateCmdHelper(self, func, file):
6049 """Overrriden from TypeHandler."""
6050 code = """ void %(name)s(%(typed_args)s) {
6051 const uint32_t size = gles2::cmds::%(name)s::ComputeSize(n);
6052 gles2::cmds::%(name)s* c =
6053 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
6054 if (c) {
6055 c->Init(%(args)s);
6060 file.Write(code % {
6061 "name": func.name,
6062 "typed_args": func.MakeTypedOriginalArgString(""),
6063 "args": func.MakeOriginalArgString(""),
6066 def WriteImmediateFormatTest(self, func, file):
6067 """Overrriden from TypeHandler."""
6068 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
6069 file.Write(" static GLuint ids[] = { 12, 23, 34, };\n")
6070 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
6071 (func.name, func.name))
6072 file.Write(" void* next_cmd = cmd.Set(\n")
6073 file.Write(" &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n")
6074 file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" %
6075 func.name)
6076 file.Write(" cmd.header.command);\n")
6077 file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
6078 file.Write(" RoundSizeToMultipleOfEntries(cmd.n * 4u),\n")
6079 file.Write(" cmd.header.size * 4u);\n")
6080 file.Write(" EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n);\n");
6081 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
6082 file.Write(" next_cmd, sizeof(cmd) +\n")
6083 file.Write(" RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n")
6084 file.Write(" // TODO(gman): Check that ids were inserted;\n")
6085 file.Write("}\n")
6086 file.Write("\n")
6089 class GETnHandler(TypeHandler):
6090 """Handler for GETn for glGetBooleanv, glGetFloatv, ... type functions."""
6092 def __init__(self):
6093 TypeHandler.__init__(self)
6095 def NeedsDataTransferFunction(self, func):
6096 """Overriden from TypeHandler."""
6097 return False
6099 def WriteServiceImplementation(self, func, file):
6100 """Overrriden from TypeHandler."""
6101 self.WriteServiceHandlerFunctionHeader(func, file)
6102 last_arg = func.GetLastOriginalArg()
6103 # All except shm_id and shm_offset.
6104 all_but_last_args = func.GetCmdArgs()[:-2]
6105 for arg in all_but_last_args:
6106 arg.WriteGetCode(file)
6108 code = """ typedef cmds::%(func_name)s::Result Result;
6109 GLsizei num_values = 0;
6110 GetNumValuesReturnedForGLGet(pname, &num_values);
6111 Result* result = GetSharedMemoryAs<Result*>(
6112 c.%(last_arg_name)s_shm_id, c.%(last_arg_name)s_shm_offset,
6113 Result::ComputeSize(num_values));
6114 %(last_arg_type)s %(last_arg_name)s = result ? result->GetData() : NULL;
6116 file.Write(code % {
6117 'last_arg_type': last_arg.type,
6118 'last_arg_name': last_arg.name,
6119 'func_name': func.name,
6121 func.WriteHandlerValidation(file)
6122 code = """ // Check that the client initialized the result.
6123 if (result->size != 0) {
6124 return error::kInvalidArguments;
6127 shadowed = func.GetInfo('shadowed')
6128 if not shadowed:
6129 file.Write(' LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("%s");\n' % func.name)
6130 file.Write(code)
6131 func.WriteHandlerImplementation(file)
6132 if shadowed:
6133 code = """ result->SetNumResults(num_values);
6134 return error::kNoError;
6137 else:
6138 code = """ GLenum error = glGetError();
6139 if (error == GL_NO_ERROR) {
6140 result->SetNumResults(num_values);
6141 } else {
6142 LOCAL_SET_GL_ERROR(error, "%(func_name)s", "");
6144 return error::kNoError;
6148 file.Write(code % {'func_name': func.name})
6150 def WriteGLES2Implementation(self, func, file):
6151 """Overrriden from TypeHandler."""
6152 impl_decl = func.GetInfo('impl_decl')
6153 if impl_decl == None or impl_decl == True:
6154 file.Write("%s GLES2Implementation::%s(%s) {\n" %
6155 (func.return_type, func.original_name,
6156 func.MakeTypedOriginalArgString("")))
6157 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
6158 func.WriteDestinationInitalizationValidation(file)
6159 self.WriteClientGLCallLog(func, file)
6160 for arg in func.GetOriginalArgs():
6161 arg.WriteClientSideValidationCode(file, func)
6162 all_but_last_args = func.GetOriginalArgs()[:-1]
6163 args = []
6164 has_length_arg = False
6165 for arg in all_but_last_args:
6166 if arg.type == 'GLsync':
6167 args.append('ToGLuint(%s)' % arg.name)
6168 elif arg.name.endswith('size') and arg.type == 'GLsizei':
6169 continue
6170 elif arg.name == 'length':
6171 has_length_arg = True
6172 continue
6173 else:
6174 args.append(arg.name)
6175 arg_string = ", ".join(args)
6176 all_arg_string = (
6177 ", ".join([
6178 "%s" % arg.name
6179 for arg in func.GetOriginalArgs() if not arg.IsConstant()]))
6180 self.WriteTraceEvent(func, file)
6181 code = """ if (%(func_name)sHelper(%(all_arg_string)s)) {
6182 return;
6184 typedef cmds::%(func_name)s::Result Result;
6185 Result* result = GetResultAs<Result*>();
6186 if (!result) {
6187 return;
6189 result->SetNumResults(0);
6190 helper_->%(func_name)s(%(arg_string)s,
6191 GetResultShmId(), GetResultShmOffset());
6192 WaitForCmd();
6193 result->CopyResult(%(last_arg_name)s);
6194 GPU_CLIENT_LOG_CODE_BLOCK({
6195 for (int32_t i = 0; i < result->GetNumResults(); ++i) {
6196 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
6198 });"""
6199 if has_length_arg:
6200 code += """
6201 if (length) {
6202 *length = result->GetNumResults();
6203 }"""
6204 code += """
6205 CheckGLError();
6208 file.Write(code % {
6209 'func_name': func.name,
6210 'arg_string': arg_string,
6211 'all_arg_string': all_arg_string,
6212 'last_arg_name': func.GetLastOriginalArg().name,
6215 def WriteGLES2ImplementationUnitTest(self, func, file):
6216 """Writes the GLES2 Implemention unit test."""
6217 code = """
6218 TEST_F(GLES2ImplementationTest, %(name)s) {
6219 struct Cmds {
6220 cmds::%(name)s cmd;
6222 typedef cmds::%(name)s::Result::Type ResultType;
6223 ResultType result = 0;
6224 Cmds expected;
6225 ExpectedMemoryInfo result1 = GetExpectedResultMemory(
6226 sizeof(uint32_t) + sizeof(ResultType));
6227 expected.cmd.Init(%(cmd_args)s, result1.id, result1.offset);
6228 EXPECT_CALL(*command_buffer(), OnFlush())
6229 .WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
6230 .RetiresOnSaturation();
6231 gl_->%(name)s(%(args)s, &result);
6232 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
6233 EXPECT_EQ(static_cast<ResultType>(1), result);
6236 first_cmd_arg = func.GetCmdArgs()[0].GetValidNonCachedClientSideCmdArg(func)
6237 if not first_cmd_arg:
6238 return
6240 first_gl_arg = func.GetOriginalArgs()[0].GetValidNonCachedClientSideArg(
6241 func)
6243 cmd_arg_strings = [first_cmd_arg]
6244 for arg in func.GetCmdArgs()[1:-2]:
6245 cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func))
6246 gl_arg_strings = [first_gl_arg]
6247 for arg in func.GetOriginalArgs()[1:-1]:
6248 gl_arg_strings.append(arg.GetValidClientSideArg(func))
6250 file.Write(code % {
6251 'name': func.name,
6252 'args': ", ".join(gl_arg_strings),
6253 'cmd_args': ", ".join(cmd_arg_strings),
6256 def WriteServiceUnitTest(self, func, file, *extras):
6257 """Overrriden from TypeHandler."""
6258 valid_test = """
6259 TEST_P(%(test_name)s, %(name)sValidArgs) {
6260 EXPECT_CALL(*gl_, GetError())
6261 .WillOnce(Return(GL_NO_ERROR))
6262 .WillOnce(Return(GL_NO_ERROR))
6263 .RetiresOnSaturation();
6264 SpecializedSetup<cmds::%(name)s, 0>(true);
6265 typedef cmds::%(name)s::Result Result;
6266 Result* result = static_cast<Result*>(shared_memory_address_);
6267 EXPECT_CALL(*gl_, %(gl_func_name)s(%(local_gl_args)s));
6268 result->size = 0;
6269 cmds::%(name)s cmd;
6270 cmd.Init(%(cmd_args)s);"""
6271 if func.IsUnsafe():
6272 valid_test += """
6273 decoder_->set_unsafe_es3_apis_enabled(true);"""
6274 valid_test += """
6275 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
6276 EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
6277 %(valid_pname)s),
6278 result->GetNumResults());
6279 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
6280 if func.IsUnsafe():
6281 valid_test += """
6282 decoder_->set_unsafe_es3_apis_enabled(false);
6283 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));"""
6284 valid_test += """
6287 gl_arg_strings = []
6288 cmd_arg_strings = []
6289 valid_pname = ''
6290 for arg in func.GetOriginalArgs()[:-1]:
6291 if arg.name == 'length':
6292 gl_arg_value = 'nullptr'
6293 elif arg.name.endswith('size'):
6294 gl_arg_value = ("decoder_->GetGLES2Util()->GLGetNumValuesReturned(%s)" %
6295 valid_pname)
6296 elif arg.type == 'GLsync':
6297 gl_arg_value = 'reinterpret_cast<GLsync>(kServiceSyncId)'
6298 else:
6299 gl_arg_value = arg.GetValidGLArg(func)
6300 gl_arg_strings.append(gl_arg_value)
6301 if arg.name == 'pname':
6302 valid_pname = gl_arg_value
6303 if arg.name.endswith('size') or arg.name == 'length':
6304 continue
6305 if arg.type == 'GLsync':
6306 arg_value = 'client_sync_id_'
6307 else:
6308 arg_value = arg.GetValidArg(func)
6309 cmd_arg_strings.append(arg_value)
6310 if func.GetInfo('gl_test_func') == 'glGetIntegerv':
6311 gl_arg_strings.append("_")
6312 else:
6313 gl_arg_strings.append("result->GetData()")
6314 cmd_arg_strings.append("shared_memory_id_")
6315 cmd_arg_strings.append("shared_memory_offset_")
6317 self.WriteValidUnitTest(func, file, valid_test, {
6318 'local_gl_args': ", ".join(gl_arg_strings),
6319 'cmd_args': ", ".join(cmd_arg_strings),
6320 'valid_pname': valid_pname,
6321 }, *extras)
6323 if not func.IsUnsafe():
6324 invalid_test = """
6325 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
6326 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
6327 SpecializedSetup<cmds::%(name)s, 0>(false);
6328 cmds::%(name)s::Result* result =
6329 static_cast<cmds::%(name)s::Result*>(shared_memory_address_);
6330 result->size = 0;
6331 cmds::%(name)s cmd;
6332 cmd.Init(%(args)s);
6333 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));
6334 EXPECT_EQ(0u, result->size);%(gl_error_test)s
6337 self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
6339 class ArrayArgTypeHandler(TypeHandler):
6340 """Base class for type handlers that handle args that are arrays"""
6342 def __init__(self):
6343 TypeHandler.__init__(self)
6345 def GetArrayType(self, func):
6346 """Returns the type of the element in the element array being PUT to."""
6347 for arg in func.GetOriginalArgs():
6348 if arg.IsPointer():
6349 element_type = arg.GetPointedType()
6350 return element_type
6352 # Special case: array type handler is used for a function that is forwarded
6353 # to the actual array type implementation
6354 element_type = func.GetOriginalArgs()[-1].type
6355 assert all(arg.type == element_type \
6356 for arg in func.GetOriginalArgs()[-self.GetArrayCount(func):])
6357 return element_type
6359 def GetArrayCount(self, func):
6360 """Returns the count of the elements in the array being PUT to."""
6361 return func.GetInfo('count')
6363 class PUTHandler(ArrayArgTypeHandler):
6364 """Handler for glTexParameter_v, glVertexAttrib_v functions."""
6366 def __init__(self):
6367 ArrayArgTypeHandler.__init__(self)
6369 def WriteServiceUnitTest(self, func, file, *extras):
6370 """Writes the service unit test for a command."""
6371 expected_call = "EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));"
6372 if func.GetInfo("first_element_only"):
6373 gl_arg_strings = [
6374 arg.GetValidGLArg(func) for arg in func.GetOriginalArgs()
6376 gl_arg_strings[-1] = "*" + gl_arg_strings[-1]
6377 expected_call = ("EXPECT_CALL(*gl_, %%(gl_func_name)s(%s));" %
6378 ", ".join(gl_arg_strings))
6379 valid_test = """
6380 TEST_P(%(test_name)s, %(name)sValidArgs) {
6381 SpecializedSetup<cmds::%(name)s, 0>(true);
6382 cmds::%(name)s cmd;
6383 cmd.Init(%(args)s);
6384 GetSharedMemoryAs<%(data_type)s*>()[0] = %(data_value)s;
6385 %(expected_call)s
6386 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
6387 EXPECT_EQ(GL_NO_ERROR, GetGLError());
6390 extra = {
6391 'data_type': self.GetArrayType(func),
6392 'data_value': func.GetInfo('data_value') or '0',
6393 'expected_call': expected_call,
6395 self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
6397 invalid_test = """
6398 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
6399 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
6400 SpecializedSetup<cmds::%(name)s, 0>(false);
6401 cmds::%(name)s cmd;
6402 cmd.Init(%(args)s);
6403 GetSharedMemoryAs<%(data_type)s*>()[0] = %(data_value)s;
6404 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
6407 self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
6409 def WriteImmediateServiceUnitTest(self, func, file, *extras):
6410 """Writes the service unit test for a command."""
6411 valid_test = """
6412 TEST_P(%(test_name)s, %(name)sValidArgs) {
6413 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
6414 SpecializedSetup<cmds::%(name)s, 0>(true);
6415 %(data_type)s temp[%(data_count)s] = { %(data_value)s, };
6416 cmd.Init(%(gl_args)s, &temp[0]);
6417 EXPECT_CALL(
6418 *gl_,
6419 %(gl_func_name)s(%(gl_args)s, %(data_ref)sreinterpret_cast<
6420 %(data_type)s*>(ImmediateDataAddress(&cmd))));"""
6421 if func.IsUnsafe():
6422 valid_test += """
6423 decoder_->set_unsafe_es3_apis_enabled(true);"""
6424 valid_test += """
6425 EXPECT_EQ(error::kNoError,
6426 ExecuteImmediateCmd(cmd, sizeof(temp)));
6427 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
6428 if func.IsUnsafe():
6429 valid_test += """
6430 decoder_->set_unsafe_es3_apis_enabled(false);
6431 EXPECT_EQ(error::kUnknownCommand,
6432 ExecuteImmediateCmd(cmd, sizeof(temp)));"""
6433 valid_test += """
6436 gl_arg_strings = [
6437 arg.GetValidGLArg(func) for arg in func.GetOriginalArgs()[0:-1]
6439 gl_any_strings = ["_"] * len(gl_arg_strings)
6441 extra = {
6442 'data_ref': ("*" if func.GetInfo('first_element_only') else ""),
6443 'data_type': self.GetArrayType(func),
6444 'data_count': self.GetArrayCount(func),
6445 'data_value': func.GetInfo('data_value') or '0',
6446 'gl_args': ", ".join(gl_arg_strings),
6447 'gl_any_args': ", ".join(gl_any_strings),
6449 self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
6451 invalid_test = """
6452 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
6453 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();"""
6454 if func.IsUnsafe():
6455 invalid_test += """
6456 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(1);
6458 else:
6459 invalid_test += """
6460 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0);
6462 invalid_test += """
6463 SpecializedSetup<cmds::%(name)s, 0>(false);
6464 %(data_type)s temp[%(data_count)s] = { %(data_value)s, };
6465 cmd.Init(%(all_but_last_args)s, &temp[0]);"""
6466 if func.IsUnsafe():
6467 invalid_test += """
6468 decoder_->set_unsafe_es3_apis_enabled(true);
6469 EXPECT_EQ(error::%(parse_result)s,
6470 ExecuteImmediateCmd(cmd, sizeof(temp)));
6471 decoder_->set_unsafe_es3_apis_enabled(false);
6474 else:
6475 invalid_test += """
6476 EXPECT_EQ(error::%(parse_result)s,
6477 ExecuteImmediateCmd(cmd, sizeof(temp)));
6478 %(gl_error_test)s
6481 self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
6483 def WriteGetDataSizeCode(self, func, file):
6484 """Overrriden from TypeHandler."""
6485 code = """ uint32_t data_size;
6486 if (!ComputeDataSize(1, sizeof(%s), %d, &data_size)) {
6487 return error::kOutOfBounds;
6490 file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func)))
6491 if func.IsImmediate():
6492 file.Write(" if (data_size > immediate_data_size) {\n")
6493 file.Write(" return error::kOutOfBounds;\n")
6494 file.Write(" }\n")
6496 def __NeedsToCalcDataCount(self, func):
6497 use_count_func = func.GetInfo('use_count_func')
6498 return use_count_func != None and use_count_func != False
6500 def WriteGLES2Implementation(self, func, file):
6501 """Overrriden from TypeHandler."""
6502 impl_func = func.GetInfo('impl_func')
6503 if (impl_func != None and impl_func != True):
6504 return;
6505 file.Write("%s GLES2Implementation::%s(%s) {\n" %
6506 (func.return_type, func.original_name,
6507 func.MakeTypedOriginalArgString("")))
6508 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
6509 func.WriteDestinationInitalizationValidation(file)
6510 self.WriteClientGLCallLog(func, file)
6512 if self.__NeedsToCalcDataCount(func):
6513 file.Write(" size_t count = GLES2Util::Calc%sDataCount(%s);\n" %
6514 (func.name, func.GetOriginalArgs()[0].name))
6515 file.Write(" DCHECK_LE(count, %du);\n" % self.GetArrayCount(func))
6516 else:
6517 file.Write(" size_t count = %d;" % self.GetArrayCount(func))
6518 file.Write(" for (size_t ii = 0; ii < count; ++ii)\n")
6519 file.Write(' GPU_CLIENT_LOG("value[" << ii << "]: " << %s[ii]);\n' %
6520 func.GetLastOriginalArg().name)
6521 for arg in func.GetOriginalArgs():
6522 arg.WriteClientSideValidationCode(file, func)
6523 file.Write(" helper_->%sImmediate(%s);\n" %
6524 (func.name, func.MakeOriginalArgString("")))
6525 file.Write(" CheckGLError();\n")
6526 file.Write("}\n")
6527 file.Write("\n")
6529 def WriteGLES2ImplementationUnitTest(self, func, file):
6530 """Writes the GLES2 Implemention unit test."""
6531 client_test = func.GetInfo('client_test')
6532 if (client_test != None and client_test != True):
6533 return;
6534 code = """
6535 TEST_F(GLES2ImplementationTest, %(name)s) {
6536 %(type)s data[%(count)d] = {0};
6537 struct Cmds {
6538 cmds::%(name)sImmediate cmd;
6539 %(type)s data[%(count)d];
6542 for (int jj = 0; jj < %(count)d; ++jj) {
6543 data[jj] = static_cast<%(type)s>(jj);
6545 Cmds expected;
6546 expected.cmd.Init(%(cmd_args)s, &data[0]);
6547 gl_->%(name)s(%(args)s, &data[0]);
6548 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
6551 cmd_arg_strings = [
6552 arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()[0:-2]
6554 gl_arg_strings = [
6555 arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs()[0:-1]
6558 file.Write(code % {
6559 'name': func.name,
6560 'type': self.GetArrayType(func),
6561 'count': self.GetArrayCount(func),
6562 'args': ", ".join(gl_arg_strings),
6563 'cmd_args': ", ".join(cmd_arg_strings),
6566 def WriteImmediateCmdComputeSize(self, func, file):
6567 """Overrriden from TypeHandler."""
6568 file.Write(" static uint32_t ComputeDataSize() {\n")
6569 file.Write(" return static_cast<uint32_t>(\n")
6570 file.Write(" sizeof(%s) * %d);\n" %
6571 (self.GetArrayType(func), self.GetArrayCount(func)))
6572 file.Write(" }\n")
6573 file.Write("\n")
6574 if self.__NeedsToCalcDataCount(func):
6575 file.Write(" static uint32_t ComputeEffectiveDataSize(%s %s) {\n" %
6576 (func.GetOriginalArgs()[0].type,
6577 func.GetOriginalArgs()[0].name))
6578 file.Write(" return static_cast<uint32_t>(\n")
6579 file.Write(" sizeof(%s) * GLES2Util::Calc%sDataCount(%s));\n" %
6580 (self.GetArrayType(func), func.original_name,
6581 func.GetOriginalArgs()[0].name))
6582 file.Write(" }\n")
6583 file.Write("\n")
6584 file.Write(" static uint32_t ComputeSize() {\n")
6585 file.Write(" return static_cast<uint32_t>(\n")
6586 file.Write(
6587 " sizeof(ValueType) + ComputeDataSize());\n")
6588 file.Write(" }\n")
6589 file.Write("\n")
6591 def WriteImmediateCmdSetHeader(self, func, file):
6592 """Overrriden from TypeHandler."""
6593 file.Write(" void SetHeader() {\n")
6594 file.Write(
6595 " header.SetCmdByTotalSize<ValueType>(ComputeSize());\n")
6596 file.Write(" }\n")
6597 file.Write("\n")
6599 def WriteImmediateCmdInit(self, func, file):
6600 """Overrriden from TypeHandler."""
6601 last_arg = func.GetLastOriginalArg()
6602 file.Write(" void Init(%s, %s _%s) {\n" %
6603 (func.MakeTypedCmdArgString("_"),
6604 last_arg.type, last_arg.name))
6605 file.Write(" SetHeader();\n")
6606 args = func.GetCmdArgs()
6607 for arg in args:
6608 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
6609 file.Write(" memcpy(ImmediateDataAddress(this),\n")
6610 if self.__NeedsToCalcDataCount(func):
6611 file.Write(" _%s, ComputeEffectiveDataSize(%s));" %
6612 (last_arg.name, func.GetOriginalArgs()[0].name))
6613 file.Write("""
6614 DCHECK_GE(ComputeDataSize(), ComputeEffectiveDataSize(%(arg)s));
6615 char* pointer = reinterpret_cast<char*>(ImmediateDataAddress(this)) +
6616 ComputeEffectiveDataSize(%(arg)s);
6617 memset(pointer, 0, ComputeDataSize() - ComputeEffectiveDataSize(%(arg)s));
6618 """ % { 'arg': func.GetOriginalArgs()[0].name, })
6619 else:
6620 file.Write(" _%s, ComputeDataSize());\n" % last_arg.name)
6621 file.Write(" }\n")
6622 file.Write("\n")
6624 def WriteImmediateCmdSet(self, func, file):
6625 """Overrriden from TypeHandler."""
6626 last_arg = func.GetLastOriginalArg()
6627 copy_args = func.MakeCmdArgString("_", False)
6628 file.Write(" void* Set(void* cmd%s, %s _%s) {\n" %
6629 (func.MakeTypedCmdArgString("_", True),
6630 last_arg.type, last_arg.name))
6631 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
6632 (copy_args, last_arg.name))
6633 file.Write(" const uint32_t size = ComputeSize();\n")
6634 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
6635 "cmd, size);\n")
6636 file.Write(" }\n")
6637 file.Write("\n")
6639 def WriteImmediateCmdHelper(self, func, file):
6640 """Overrriden from TypeHandler."""
6641 code = """ void %(name)s(%(typed_args)s) {
6642 const uint32_t size = gles2::cmds::%(name)s::ComputeSize();
6643 gles2::cmds::%(name)s* c =
6644 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
6645 if (c) {
6646 c->Init(%(args)s);
6651 file.Write(code % {
6652 "name": func.name,
6653 "typed_args": func.MakeTypedOriginalArgString(""),
6654 "args": func.MakeOriginalArgString(""),
6657 def WriteImmediateFormatTest(self, func, file):
6658 """Overrriden from TypeHandler."""
6659 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
6660 file.Write(" const int kSomeBaseValueToTestWith = 51;\n")
6661 file.Write(" static %s data[] = {\n" % self.GetArrayType(func))
6662 for v in range(0, self.GetArrayCount(func)):
6663 file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
6664 (self.GetArrayType(func), v))
6665 file.Write(" };\n")
6666 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
6667 (func.name, func.name))
6668 file.Write(" void* next_cmd = cmd.Set(\n")
6669 file.Write(" &cmd")
6670 args = func.GetCmdArgs()
6671 for value, arg in enumerate(args):
6672 file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11))
6673 file.Write(",\n data);\n")
6674 args = func.GetCmdArgs()
6675 file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n"
6676 % func.name)
6677 file.Write(" cmd.header.command);\n")
6678 file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
6679 file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)),\n")
6680 file.Write(" cmd.header.size * 4u);\n")
6681 for value, arg in enumerate(args):
6682 file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
6683 (arg.type, value + 11, arg.name))
6684 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
6685 file.Write(" next_cmd, sizeof(cmd) +\n")
6686 file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n")
6687 file.Write(" // TODO(gman): Check that data was inserted;\n")
6688 file.Write("}\n")
6689 file.Write("\n")
6692 class PUTnHandler(ArrayArgTypeHandler):
6693 """Handler for PUTn 'glUniform__v' type functions."""
6695 def __init__(self):
6696 ArrayArgTypeHandler.__init__(self)
6698 def WriteServiceUnitTest(self, func, file, *extras):
6699 """Overridden from TypeHandler."""
6700 ArrayArgTypeHandler.WriteServiceUnitTest(self, func, file, *extras)
6702 valid_test = """
6703 TEST_P(%(test_name)s, %(name)sValidArgsCountTooLarge) {
6704 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
6705 SpecializedSetup<cmds::%(name)s, 0>(true);
6706 cmds::%(name)s cmd;
6707 cmd.Init(%(args)s);
6708 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
6709 EXPECT_EQ(GL_NO_ERROR, GetGLError());
6712 gl_arg_strings = []
6713 arg_strings = []
6714 for count, arg in enumerate(func.GetOriginalArgs()):
6715 # hardcoded to match unit tests.
6716 if count == 0:
6717 # the location of the second element of the 2nd uniform.
6718 # defined in GLES2DecoderBase::SetupShaderForUniform
6719 gl_arg_strings.append("3")
6720 arg_strings.append("ProgramManager::MakeFakeLocation(1, 1)")
6721 elif count == 1:
6722 # the number of elements that gl will be called with.
6723 gl_arg_strings.append("3")
6724 # the number of elements requested in the command.
6725 arg_strings.append("5")
6726 else:
6727 gl_arg_strings.append(arg.GetValidGLArg(func))
6728 if not arg.IsConstant():
6729 arg_strings.append(arg.GetValidArg(func))
6730 extra = {
6731 'gl_args': ", ".join(gl_arg_strings),
6732 'args': ", ".join(arg_strings),
6734 self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
6736 def WriteImmediateServiceUnitTest(self, func, file, *extras):
6737 """Overridden from TypeHandler."""
6738 valid_test = """
6739 TEST_P(%(test_name)s, %(name)sValidArgs) {
6740 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
6741 EXPECT_CALL(
6742 *gl_,
6743 %(gl_func_name)s(%(gl_args)s,
6744 reinterpret_cast<%(data_type)s*>(ImmediateDataAddress(&cmd))));
6745 SpecializedSetup<cmds::%(name)s, 0>(true);
6746 %(data_type)s temp[%(data_count)s * 2] = { 0, };
6747 cmd.Init(%(args)s, &temp[0]);"""
6748 if func.IsUnsafe():
6749 valid_test += """
6750 decoder_->set_unsafe_es3_apis_enabled(true);"""
6751 valid_test += """
6752 EXPECT_EQ(error::kNoError,
6753 ExecuteImmediateCmd(cmd, sizeof(temp)));
6754 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
6755 if func.IsUnsafe():
6756 valid_test += """
6757 decoder_->set_unsafe_es3_apis_enabled(false);
6758 EXPECT_EQ(error::kUnknownCommand,
6759 ExecuteImmediateCmd(cmd, sizeof(temp)));"""
6760 valid_test += """
6763 gl_arg_strings = []
6764 gl_any_strings = []
6765 arg_strings = []
6766 for arg in func.GetOriginalArgs()[0:-1]:
6767 gl_arg_strings.append(arg.GetValidGLArg(func))
6768 gl_any_strings.append("_")
6769 if not arg.IsConstant():
6770 arg_strings.append(arg.GetValidArg(func))
6771 extra = {
6772 'data_type': self.GetArrayType(func),
6773 'data_count': self.GetArrayCount(func),
6774 'args': ", ".join(arg_strings),
6775 'gl_args': ", ".join(gl_arg_strings),
6776 'gl_any_args': ", ".join(gl_any_strings),
6778 self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
6780 invalid_test = """
6781 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
6782 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
6783 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0);
6784 SpecializedSetup<cmds::%(name)s, 0>(false);
6785 %(data_type)s temp[%(data_count)s * 2] = { 0, };
6786 cmd.Init(%(all_but_last_args)s, &temp[0]);
6787 EXPECT_EQ(error::%(parse_result)s,
6788 ExecuteImmediateCmd(cmd, sizeof(temp)));%(gl_error_test)s
6791 self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
6793 def WriteGetDataSizeCode(self, func, file):
6794 """Overrriden from TypeHandler."""
6795 code = """ uint32_t data_size;
6796 if (!ComputeDataSize(count, sizeof(%s), %d, &data_size)) {
6797 return error::kOutOfBounds;
6800 file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func)))
6801 if func.IsImmediate():
6802 file.Write(" if (data_size > immediate_data_size) {\n")
6803 file.Write(" return error::kOutOfBounds;\n")
6804 file.Write(" }\n")
6806 def WriteGLES2Implementation(self, func, file):
6807 """Overrriden from TypeHandler."""
6808 file.Write("%s GLES2Implementation::%s(%s) {\n" %
6809 (func.return_type, func.original_name,
6810 func.MakeTypedOriginalArgString("")))
6811 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
6812 func.WriteDestinationInitalizationValidation(file)
6813 self.WriteClientGLCallLog(func, file)
6814 last_pointer_name = func.GetLastOriginalPointerArg().name
6815 file.Write(""" GPU_CLIENT_LOG_CODE_BLOCK({
6816 for (GLsizei i = 0; i < count; ++i) {
6817 """)
6818 values_str = ' << ", " << '.join(
6819 ["%s[%d + i * %d]" % (
6820 last_pointer_name, ndx, self.GetArrayCount(func)) for ndx in range(
6821 0, self.GetArrayCount(func))])
6822 file.Write(' GPU_CLIENT_LOG(" " << i << ": " << %s);\n' % values_str)
6823 file.Write(" }\n });\n")
6824 for arg in func.GetOriginalArgs():
6825 arg.WriteClientSideValidationCode(file, func)
6826 file.Write(" helper_->%sImmediate(%s);\n" %
6827 (func.name, func.MakeInitString("")))
6828 file.Write(" CheckGLError();\n")
6829 file.Write("}\n")
6830 file.Write("\n")
6832 def WriteGLES2ImplementationUnitTest(self, func, file):
6833 """Writes the GLES2 Implemention unit test."""
6834 code = """
6835 TEST_F(GLES2ImplementationTest, %(name)s) {
6836 %(type)s data[%(count_param)d][%(count)d] = {{0}};
6837 struct Cmds {
6838 cmds::%(name)sImmediate cmd;
6839 %(type)s data[%(count_param)d][%(count)d];
6842 Cmds expected;
6843 for (int ii = 0; ii < %(count_param)d; ++ii) {
6844 for (int jj = 0; jj < %(count)d; ++jj) {
6845 data[ii][jj] = static_cast<%(type)s>(ii * %(count)d + jj);
6848 expected.cmd.Init(%(cmd_args)s);
6849 gl_->%(name)s(%(args)s);
6850 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
6853 cmd_arg_strings = []
6854 for arg in func.GetCmdArgs():
6855 if arg.name.endswith("_shm_id"):
6856 cmd_arg_strings.append("&data[0][0]")
6857 elif arg.name.endswith("_shm_offset"):
6858 continue
6859 else:
6860 cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func))
6861 gl_arg_strings = []
6862 count_param = 0
6863 for arg in func.GetOriginalArgs():
6864 if arg.IsPointer():
6865 valid_value = "&data[0][0]"
6866 else:
6867 valid_value = arg.GetValidClientSideArg(func)
6868 gl_arg_strings.append(valid_value)
6869 if arg.name == "count":
6870 count_param = int(valid_value)
6871 file.Write(code % {
6872 'name': func.name,
6873 'type': self.GetArrayType(func),
6874 'count': self.GetArrayCount(func),
6875 'args': ", ".join(gl_arg_strings),
6876 'cmd_args': ", ".join(cmd_arg_strings),
6877 'count_param': count_param,
6880 # Test constants for invalid values, as they are not tested by the
6881 # service.
6882 constants = [
6883 arg for arg in func.GetOriginalArgs()[0:-1] if arg.IsConstant()
6885 if not constants:
6886 return
6888 code = """
6889 TEST_F(GLES2ImplementationTest, %(name)sInvalidConstantArg%(invalid_index)d) {
6890 %(type)s data[%(count_param)d][%(count)d] = {{0}};
6891 for (int ii = 0; ii < %(count_param)d; ++ii) {
6892 for (int jj = 0; jj < %(count)d; ++jj) {
6893 data[ii][jj] = static_cast<%(type)s>(ii * %(count)d + jj);
6896 gl_->%(name)s(%(args)s);
6897 EXPECT_TRUE(NoCommandsWritten());
6898 EXPECT_EQ(%(gl_error)s, CheckError());
6901 for invalid_arg in constants:
6902 gl_arg_strings = []
6903 invalid = invalid_arg.GetInvalidArg(func)
6904 for arg in func.GetOriginalArgs():
6905 if arg is invalid_arg:
6906 gl_arg_strings.append(invalid[0])
6907 elif arg.IsPointer():
6908 gl_arg_strings.append("&data[0][0]")
6909 else:
6910 valid_value = arg.GetValidClientSideArg(func)
6911 gl_arg_strings.append(valid_value)
6912 if arg.name == "count":
6913 count_param = int(valid_value)
6915 file.Write(code % {
6916 'name': func.name,
6917 'invalid_index': func.GetOriginalArgs().index(invalid_arg),
6918 'type': self.GetArrayType(func),
6919 'count': self.GetArrayCount(func),
6920 'args': ", ".join(gl_arg_strings),
6921 'gl_error': invalid[2],
6922 'count_param': count_param,
6926 def WriteImmediateCmdComputeSize(self, func, file):
6927 """Overrriden from TypeHandler."""
6928 file.Write(" static uint32_t ComputeDataSize(GLsizei count) {\n")
6929 file.Write(" return static_cast<uint32_t>(\n")
6930 file.Write(" sizeof(%s) * %d * count); // NOLINT\n" %
6931 (self.GetArrayType(func), self.GetArrayCount(func)))
6932 file.Write(" }\n")
6933 file.Write("\n")
6934 file.Write(" static uint32_t ComputeSize(GLsizei count) {\n")
6935 file.Write(" return static_cast<uint32_t>(\n")
6936 file.Write(
6937 " sizeof(ValueType) + ComputeDataSize(count)); // NOLINT\n")
6938 file.Write(" }\n")
6939 file.Write("\n")
6941 def WriteImmediateCmdSetHeader(self, func, file):
6942 """Overrriden from TypeHandler."""
6943 file.Write(" void SetHeader(GLsizei count) {\n")
6944 file.Write(
6945 " header.SetCmdByTotalSize<ValueType>(ComputeSize(count));\n")
6946 file.Write(" }\n")
6947 file.Write("\n")
6949 def WriteImmediateCmdInit(self, func, file):
6950 """Overrriden from TypeHandler."""
6951 file.Write(" void Init(%s) {\n" %
6952 func.MakeTypedInitString("_"))
6953 file.Write(" SetHeader(_count);\n")
6954 args = func.GetCmdArgs()
6955 for arg in args:
6956 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
6957 file.Write(" memcpy(ImmediateDataAddress(this),\n")
6958 pointer_arg = func.GetLastOriginalPointerArg()
6959 file.Write(" _%s, ComputeDataSize(_count));\n" % pointer_arg.name)
6960 file.Write(" }\n")
6961 file.Write("\n")
6963 def WriteImmediateCmdSet(self, func, file):
6964 """Overrriden from TypeHandler."""
6965 file.Write(" void* Set(void* cmd%s) {\n" %
6966 func.MakeTypedInitString("_", True))
6967 file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" %
6968 func.MakeInitString("_"))
6969 file.Write(" const uint32_t size = ComputeSize(_count);\n")
6970 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
6971 "cmd, size);\n")
6972 file.Write(" }\n")
6973 file.Write("\n")
6975 def WriteImmediateCmdHelper(self, func, file):
6976 """Overrriden from TypeHandler."""
6977 code = """ void %(name)s(%(typed_args)s) {
6978 const uint32_t size = gles2::cmds::%(name)s::ComputeSize(count);
6979 gles2::cmds::%(name)s* c =
6980 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
6981 if (c) {
6982 c->Init(%(args)s);
6987 file.Write(code % {
6988 "name": func.name,
6989 "typed_args": func.MakeTypedInitString(""),
6990 "args": func.MakeInitString("")
6993 def WriteImmediateFormatTest(self, func, file):
6994 """Overrriden from TypeHandler."""
6995 args = func.GetOriginalArgs()
6996 count_param = 0
6997 for arg in args:
6998 if arg.name == "count":
6999 count_param = int(arg.GetValidClientSideCmdArg(func))
7000 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
7001 file.Write(" const int kSomeBaseValueToTestWith = 51;\n")
7002 file.Write(" static %s data[] = {\n" % self.GetArrayType(func))
7003 for v in range(0, self.GetArrayCount(func) * count_param):
7004 file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
7005 (self.GetArrayType(func), v))
7006 file.Write(" };\n")
7007 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
7008 (func.name, func.name))
7009 file.Write(" const GLsizei kNumElements = %d;\n" % count_param)
7010 file.Write(" const size_t kExpectedCmdSize =\n")
7011 file.Write(" sizeof(cmd) + kNumElements * sizeof(%s) * %d;\n" %
7012 (self.GetArrayType(func), self.GetArrayCount(func)))
7013 file.Write(" void* next_cmd = cmd.Set(\n")
7014 file.Write(" &cmd")
7015 for value, arg in enumerate(args):
7016 if arg.IsPointer():
7017 file.Write(",\n data")
7018 elif arg.IsConstant():
7019 continue
7020 else:
7021 file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 1))
7022 file.Write(");\n")
7023 file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" %
7024 func.name)
7025 file.Write(" cmd.header.command);\n")
7026 file.Write(" EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);\n")
7027 for value, arg in enumerate(args):
7028 if arg.IsPointer() or arg.IsConstant():
7029 continue
7030 file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
7031 (arg.type, value + 1, arg.name))
7032 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
7033 file.Write(" next_cmd, sizeof(cmd) +\n")
7034 file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n")
7035 file.Write(" // TODO(gman): Check that data was inserted;\n")
7036 file.Write("}\n")
7037 file.Write("\n")
7039 class PUTSTRHandler(ArrayArgTypeHandler):
7040 """Handler for functions that pass a string array."""
7042 def __init__(self):
7043 ArrayArgTypeHandler.__init__(self)
7045 def __GetDataArg(self, func):
7046 """Return the argument that points to the 2D char arrays"""
7047 for arg in func.GetOriginalArgs():
7048 if arg.IsPointer2D():
7049 return arg
7050 return None
7052 def __GetLengthArg(self, func):
7053 """Return the argument that holds length for each char array"""
7054 for arg in func.GetOriginalArgs():
7055 if arg.IsPointer() and not arg.IsPointer2D():
7056 return arg
7057 return None
7059 def WriteGLES2Implementation(self, func, file):
7060 """Overrriden from TypeHandler."""
7061 file.Write("%s GLES2Implementation::%s(%s) {\n" %
7062 (func.return_type, func.original_name,
7063 func.MakeTypedOriginalArgString("")))
7064 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
7065 func.WriteDestinationInitalizationValidation(file)
7066 self.WriteClientGLCallLog(func, file)
7067 data_arg = self.__GetDataArg(func)
7068 length_arg = self.__GetLengthArg(func)
7069 log_code_block = """ GPU_CLIENT_LOG_CODE_BLOCK({
7070 for (GLsizei ii = 0; ii < count; ++ii) {
7071 if (%(data)s[ii]) {"""
7072 if length_arg == None:
7073 log_code_block += """
7074 GPU_CLIENT_LOG(" " << ii << ": ---\\n" << %(data)s[ii] << "\\n---");"""
7075 else:
7076 log_code_block += """
7077 if (%(length)s && %(length)s[ii] >= 0) {
7078 const std::string my_str(%(data)s[ii], %(length)s[ii]);
7079 GPU_CLIENT_LOG(" " << ii << ": ---\\n" << my_str << "\\n---");
7080 } else {
7081 GPU_CLIENT_LOG(" " << ii << ": ---\\n" << %(data)s[ii] << "\\n---");
7082 }"""
7083 log_code_block += """
7084 } else {
7085 GPU_CLIENT_LOG(" " << ii << ": NULL");
7090 file.Write(log_code_block % {
7091 'data': data_arg.name,
7092 'length': length_arg.name if not length_arg == None else ''
7094 for arg in func.GetOriginalArgs():
7095 arg.WriteClientSideValidationCode(file, func)
7097 bucket_args = []
7098 for arg in func.GetOriginalArgs():
7099 if arg.name == 'count' or arg == self.__GetLengthArg(func):
7100 continue
7101 if arg == self.__GetDataArg(func):
7102 bucket_args.append('kResultBucketId')
7103 else:
7104 bucket_args.append(arg.name)
7105 code_block = """
7106 if (!PackStringsToBucket(count, %(data)s, %(length)s, "gl%(func_name)s")) {
7107 return;
7109 helper_->%(func_name)sBucket(%(bucket_args)s);
7110 helper_->SetBucketSize(kResultBucketId, 0);
7111 CheckGLError();
7115 file.Write(code_block % {
7116 'data': data_arg.name,
7117 'length': length_arg.name if not length_arg == None else 'NULL',
7118 'func_name': func.name,
7119 'bucket_args': ', '.join(bucket_args),
7122 def WriteGLES2ImplementationUnitTest(self, func, file):
7123 """Overrriden from TypeHandler."""
7124 code = """
7125 TEST_F(GLES2ImplementationTest, %(name)s) {
7126 const uint32 kBucketId = GLES2Implementation::kResultBucketId;
7127 const char* kString1 = "happy";
7128 const char* kString2 = "ending";
7129 const size_t kString1Size = ::strlen(kString1) + 1;
7130 const size_t kString2Size = ::strlen(kString2) + 1;
7131 const size_t kHeaderSize = sizeof(GLint) * 3;
7132 const size_t kSourceSize = kHeaderSize + kString1Size + kString2Size;
7133 const size_t kPaddedHeaderSize =
7134 transfer_buffer_->RoundToAlignment(kHeaderSize);
7135 const size_t kPaddedString1Size =
7136 transfer_buffer_->RoundToAlignment(kString1Size);
7137 const size_t kPaddedString2Size =
7138 transfer_buffer_->RoundToAlignment(kString2Size);
7139 struct Cmds {
7140 cmd::SetBucketSize set_bucket_size;
7141 cmd::SetBucketData set_bucket_header;
7142 cmd::SetToken set_token1;
7143 cmd::SetBucketData set_bucket_data1;
7144 cmd::SetToken set_token2;
7145 cmd::SetBucketData set_bucket_data2;
7146 cmd::SetToken set_token3;
7147 cmds::%(name)sBucket cmd_bucket;
7148 cmd::SetBucketSize clear_bucket_size;
7151 ExpectedMemoryInfo mem0 = GetExpectedMemory(kPaddedHeaderSize);
7152 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size);
7153 ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size);
7155 Cmds expected;
7156 expected.set_bucket_size.Init(kBucketId, kSourceSize);
7157 expected.set_bucket_header.Init(
7158 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset);
7159 expected.set_token1.Init(GetNextToken());
7160 expected.set_bucket_data1.Init(
7161 kBucketId, kHeaderSize, kString1Size, mem1.id, mem1.offset);
7162 expected.set_token2.Init(GetNextToken());
7163 expected.set_bucket_data2.Init(
7164 kBucketId, kHeaderSize + kString1Size, kString2Size, mem2.id,
7165 mem2.offset);
7166 expected.set_token3.Init(GetNextToken());
7167 expected.cmd_bucket.Init(%(bucket_args)s);
7168 expected.clear_bucket_size.Init(kBucketId, 0);
7169 const char* kStrings[] = { kString1, kString2 };
7170 gl_->%(name)s(%(gl_args)s);
7171 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
7174 gl_args = []
7175 bucket_args = []
7176 for arg in func.GetOriginalArgs():
7177 if arg == self.__GetDataArg(func):
7178 gl_args.append('kStrings')
7179 bucket_args.append('kBucketId')
7180 elif arg == self.__GetLengthArg(func):
7181 gl_args.append('NULL')
7182 elif arg.name == 'count':
7183 gl_args.append('2')
7184 else:
7185 gl_args.append(arg.GetValidClientSideArg(func))
7186 bucket_args.append(arg.GetValidClientSideArg(func))
7187 file.Write(code % {
7188 'name': func.name,
7189 'gl_args': ", ".join(gl_args),
7190 'bucket_args': ", ".join(bucket_args),
7193 if self.__GetLengthArg(func) == None:
7194 return
7195 code = """
7196 TEST_F(GLES2ImplementationTest, %(name)sWithLength) {
7197 const uint32 kBucketId = GLES2Implementation::kResultBucketId;
7198 const char* kString = "foobar******";
7199 const size_t kStringSize = 6; // We only need "foobar".
7200 const size_t kHeaderSize = sizeof(GLint) * 2;
7201 const size_t kSourceSize = kHeaderSize + kStringSize + 1;
7202 const size_t kPaddedHeaderSize =
7203 transfer_buffer_->RoundToAlignment(kHeaderSize);
7204 const size_t kPaddedStringSize =
7205 transfer_buffer_->RoundToAlignment(kStringSize + 1);
7206 struct Cmds {
7207 cmd::SetBucketSize set_bucket_size;
7208 cmd::SetBucketData set_bucket_header;
7209 cmd::SetToken set_token1;
7210 cmd::SetBucketData set_bucket_data;
7211 cmd::SetToken set_token2;
7212 cmds::ShaderSourceBucket shader_source_bucket;
7213 cmd::SetBucketSize clear_bucket_size;
7216 ExpectedMemoryInfo mem0 = GetExpectedMemory(kPaddedHeaderSize);
7217 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedStringSize);
7219 Cmds expected;
7220 expected.set_bucket_size.Init(kBucketId, kSourceSize);
7221 expected.set_bucket_header.Init(
7222 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset);
7223 expected.set_token1.Init(GetNextToken());
7224 expected.set_bucket_data.Init(
7225 kBucketId, kHeaderSize, kStringSize + 1, mem1.id, mem1.offset);
7226 expected.set_token2.Init(GetNextToken());
7227 expected.shader_source_bucket.Init(%(bucket_args)s);
7228 expected.clear_bucket_size.Init(kBucketId, 0);
7229 const char* kStrings[] = { kString };
7230 const GLint kLength[] = { kStringSize };
7231 gl_->%(name)s(%(gl_args)s);
7232 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
7235 gl_args = []
7236 for arg in func.GetOriginalArgs():
7237 if arg == self.__GetDataArg(func):
7238 gl_args.append('kStrings')
7239 elif arg == self.__GetLengthArg(func):
7240 gl_args.append('kLength')
7241 elif arg.name == 'count':
7242 gl_args.append('1')
7243 else:
7244 gl_args.append(arg.GetValidClientSideArg(func))
7245 file.Write(code % {
7246 'name': func.name,
7247 'gl_args': ", ".join(gl_args),
7248 'bucket_args': ", ".join(bucket_args),
7251 def WriteBucketServiceUnitTest(self, func, file, *extras):
7252 """Overrriden from TypeHandler."""
7253 cmd_args = []
7254 cmd_args_with_invalid_id = []
7255 gl_args = []
7256 for index, arg in enumerate(func.GetOriginalArgs()):
7257 if arg == self.__GetLengthArg(func):
7258 gl_args.append('_')
7259 elif arg.name == 'count':
7260 gl_args.append('1')
7261 elif arg == self.__GetDataArg(func):
7262 cmd_args.append('kBucketId')
7263 cmd_args_with_invalid_id.append('kBucketId')
7264 gl_args.append('_')
7265 elif index == 0: # Resource ID arg
7266 cmd_args.append(arg.GetValidArg(func))
7267 cmd_args_with_invalid_id.append('kInvalidClientId')
7268 gl_args.append(arg.GetValidGLArg(func))
7269 else:
7270 cmd_args.append(arg.GetValidArg(func))
7271 cmd_args_with_invalid_id.append(arg.GetValidArg(func))
7272 gl_args.append(arg.GetValidGLArg(func))
7274 test = """
7275 TEST_P(%(test_name)s, %(name)sValidArgs) {
7276 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
7277 const uint32 kBucketId = 123;
7278 const char kSource0[] = "hello";
7279 const char* kSource[] = { kSource0 };
7280 const char kValidStrEnd = 0;
7281 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd);
7282 cmds::%(name)s cmd;
7283 cmd.Init(%(cmd_args)s);
7284 decoder_->set_unsafe_es3_apis_enabled(true);
7285 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));"""
7286 if func.IsUnsafe():
7287 test += """
7288 decoder_->set_unsafe_es3_apis_enabled(false);
7289 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
7291 test += """
7294 self.WriteValidUnitTest(func, file, test, {
7295 'cmd_args': ", ".join(cmd_args),
7296 'gl_args': ", ".join(gl_args),
7297 }, *extras)
7299 test = """
7300 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
7301 const uint32 kBucketId = 123;
7302 const char kSource0[] = "hello";
7303 const char* kSource[] = { kSource0 };
7304 const char kValidStrEnd = 0;
7305 decoder_->set_unsafe_es3_apis_enabled(true);
7306 cmds::%(name)s cmd;
7307 // Test no bucket.
7308 cmd.Init(%(cmd_args)s);
7309 EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
7310 // Test invalid client.
7311 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd);
7312 cmd.Init(%(cmd_args_with_invalid_id)s);
7313 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7314 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
7317 self.WriteValidUnitTest(func, file, test, {
7318 'cmd_args': ", ".join(cmd_args),
7319 'cmd_args_with_invalid_id': ", ".join(cmd_args_with_invalid_id),
7320 }, *extras)
7322 test = """
7323 TEST_P(%(test_name)s, %(name)sInvalidHeader) {
7324 const uint32 kBucketId = 123;
7325 const char kSource0[] = "hello";
7326 const char* kSource[] = { kSource0 };
7327 const char kValidStrEnd = 0;
7328 const GLsizei kCount = static_cast<GLsizei>(arraysize(kSource));
7329 const GLsizei kTests[] = {
7330 kCount + 1,
7332 std::numeric_limits<GLsizei>::max(),
7335 decoder_->set_unsafe_es3_apis_enabled(true);
7336 for (size_t ii = 0; ii < arraysize(kTests); ++ii) {
7337 SetBucketAsCStrings(kBucketId, 1, kSource, kTests[ii], kValidStrEnd);
7338 cmds::%(name)s cmd;
7339 cmd.Init(%(cmd_args)s);
7340 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
7344 self.WriteValidUnitTest(func, file, test, {
7345 'cmd_args': ", ".join(cmd_args),
7346 }, *extras)
7348 test = """
7349 TEST_P(%(test_name)s, %(name)sInvalidStringEnding) {
7350 const uint32 kBucketId = 123;
7351 const char kSource0[] = "hello";
7352 const char* kSource[] = { kSource0 };
7353 const char kInvalidStrEnd = '*';
7354 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kInvalidStrEnd);
7355 cmds::%(name)s cmd;
7356 cmd.Init(%(cmd_args)s);
7357 decoder_->set_unsafe_es3_apis_enabled(true);
7358 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
7361 self.WriteValidUnitTest(func, file, test, {
7362 'cmd_args': ", ".join(cmd_args),
7363 }, *extras)
7366 class PUTXnHandler(ArrayArgTypeHandler):
7367 """Handler for glUniform?f functions."""
7368 def __init__(self):
7369 ArrayArgTypeHandler.__init__(self)
7371 def WriteHandlerImplementation(self, func, file):
7372 """Overrriden from TypeHandler."""
7373 code = """ %(type)s temp[%(count)s] = { %(values)s};"""
7374 if func.IsUnsafe():
7375 code += """
7376 gl%(name)sv(%(location)s, 1, &temp[0]);
7378 else:
7379 code += """
7380 Do%(name)sv(%(location)s, 1, &temp[0]);
7382 values = ""
7383 args = func.GetOriginalArgs()
7384 count = int(self.GetArrayCount(func))
7385 num_args = len(args)
7386 for ii in range(count):
7387 values += "%s, " % args[len(args) - count + ii].name
7389 file.Write(code % {
7390 'name': func.name,
7391 'count': self.GetArrayCount(func),
7392 'type': self.GetArrayType(func),
7393 'location': args[0].name,
7394 'args': func.MakeOriginalArgString(""),
7395 'values': values,
7398 def WriteServiceUnitTest(self, func, file, *extras):
7399 """Overrriden from TypeHandler."""
7400 valid_test = """
7401 TEST_P(%(test_name)s, %(name)sValidArgs) {
7402 EXPECT_CALL(*gl_, %(name)sv(%(local_args)s));
7403 SpecializedSetup<cmds::%(name)s, 0>(true);
7404 cmds::%(name)s cmd;
7405 cmd.Init(%(args)s);"""
7406 if func.IsUnsafe():
7407 valid_test += """
7408 decoder_->set_unsafe_es3_apis_enabled(true);"""
7409 valid_test += """
7410 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7411 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
7412 if func.IsUnsafe():
7413 valid_test += """
7414 decoder_->set_unsafe_es3_apis_enabled(false);
7415 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));"""
7416 valid_test += """
7419 args = func.GetOriginalArgs()
7420 local_args = "%s, 1, _" % args[0].GetValidGLArg(func)
7421 self.WriteValidUnitTest(func, file, valid_test, {
7422 'name': func.name,
7423 'count': self.GetArrayCount(func),
7424 'local_args': local_args,
7425 }, *extras)
7427 invalid_test = """
7428 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
7429 EXPECT_CALL(*gl_, %(name)sv(_, _, _).Times(0);
7430 SpecializedSetup<cmds::%(name)s, 0>(false);
7431 cmds::%(name)s cmd;
7432 cmd.Init(%(args)s);
7433 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
7436 self.WriteInvalidUnitTest(func, file, invalid_test, {
7437 'name': func.GetInfo('name'),
7438 'count': self.GetArrayCount(func),
7442 class GLcharHandler(CustomHandler):
7443 """Handler for functions that pass a single string ."""
7445 def __init__(self):
7446 CustomHandler.__init__(self)
7448 def WriteImmediateCmdComputeSize(self, func, file):
7449 """Overrriden from TypeHandler."""
7450 file.Write(" static uint32_t ComputeSize(uint32_t data_size) {\n")
7451 file.Write(" return static_cast<uint32_t>(\n")
7452 file.Write(" sizeof(ValueType) + data_size); // NOLINT\n")
7453 file.Write(" }\n")
7455 def WriteImmediateCmdSetHeader(self, func, file):
7456 """Overrriden from TypeHandler."""
7457 code = """
7458 void SetHeader(uint32_t data_size) {
7459 header.SetCmdBySize<ValueType>(data_size);
7462 file.Write(code)
7464 def WriteImmediateCmdInit(self, func, file):
7465 """Overrriden from TypeHandler."""
7466 last_arg = func.GetLastOriginalArg()
7467 args = func.GetCmdArgs()
7468 set_code = []
7469 for arg in args:
7470 set_code.append(" %s = _%s;" % (arg.name, arg.name))
7471 code = """
7472 void Init(%(typed_args)s, uint32_t _data_size) {
7473 SetHeader(_data_size);
7474 %(set_code)s
7475 memcpy(ImmediateDataAddress(this), _%(last_arg)s, _data_size);
7479 file.Write(code % {
7480 "typed_args": func.MakeTypedArgString("_"),
7481 "set_code": "\n".join(set_code),
7482 "last_arg": last_arg.name
7485 def WriteImmediateCmdSet(self, func, file):
7486 """Overrriden from TypeHandler."""
7487 last_arg = func.GetLastOriginalArg()
7488 file.Write(" void* Set(void* cmd%s, uint32_t _data_size) {\n" %
7489 func.MakeTypedCmdArgString("_", True))
7490 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _data_size);\n" %
7491 func.MakeCmdArgString("_"))
7492 file.Write(" return NextImmediateCmdAddress<ValueType>("
7493 "cmd, _data_size);\n")
7494 file.Write(" }\n")
7495 file.Write("\n")
7497 def WriteImmediateCmdHelper(self, func, file):
7498 """Overrriden from TypeHandler."""
7499 code = """ void %(name)s(%(typed_args)s) {
7500 const uint32_t data_size = strlen(name);
7501 gles2::cmds::%(name)s* c =
7502 GetImmediateCmdSpace<gles2::cmds::%(name)s>(data_size);
7503 if (c) {
7504 c->Init(%(args)s, data_size);
7509 file.Write(code % {
7510 "name": func.name,
7511 "typed_args": func.MakeTypedOriginalArgString(""),
7512 "args": func.MakeOriginalArgString(""),
7516 def WriteImmediateFormatTest(self, func, file):
7517 """Overrriden from TypeHandler."""
7518 init_code = []
7519 check_code = []
7520 all_but_last_arg = func.GetCmdArgs()[:-1]
7521 for value, arg in enumerate(all_but_last_arg):
7522 init_code.append(" static_cast<%s>(%d)," % (arg.type, value + 11))
7523 for value, arg in enumerate(all_but_last_arg):
7524 check_code.append(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);" %
7525 (arg.type, value + 11, arg.name))
7526 code = """
7527 TEST_F(GLES2FormatTest, %(func_name)s) {
7528 cmds::%(func_name)s& cmd = *GetBufferAs<cmds::%(func_name)s>();
7529 static const char* const test_str = \"test string\";
7530 void* next_cmd = cmd.Set(
7531 &cmd,
7532 %(init_code)s
7533 test_str,
7534 strlen(test_str));
7535 EXPECT_EQ(static_cast<uint32_t>(cmds::%(func_name)s::kCmdId),
7536 cmd.header.command);
7537 EXPECT_EQ(sizeof(cmd) +
7538 RoundSizeToMultipleOfEntries(strlen(test_str)),
7539 cmd.header.size * 4u);
7540 EXPECT_EQ(static_cast<char*>(next_cmd),
7541 reinterpret_cast<char*>(&cmd) + sizeof(cmd) +
7542 RoundSizeToMultipleOfEntries(strlen(test_str)));
7543 %(check_code)s
7544 EXPECT_EQ(static_cast<uint32_t>(strlen(test_str)), cmd.data_size);
7545 EXPECT_EQ(0, memcmp(test_str, ImmediateDataAddress(&cmd), strlen(test_str)));
7546 CheckBytesWritten(
7547 next_cmd,
7548 sizeof(cmd) + RoundSizeToMultipleOfEntries(strlen(test_str)),
7549 sizeof(cmd) + strlen(test_str));
7553 file.Write(code % {
7554 'func_name': func.name,
7555 'init_code': "\n".join(init_code),
7556 'check_code': "\n".join(check_code),
7560 class GLcharNHandler(CustomHandler):
7561 """Handler for functions that pass a single string with an optional len."""
7563 def __init__(self):
7564 CustomHandler.__init__(self)
7566 def InitFunction(self, func):
7567 """Overrriden from TypeHandler."""
7568 func.cmd_args = []
7569 func.AddCmdArg(Argument('bucket_id', 'GLuint'))
7571 def NeedsDataTransferFunction(self, func):
7572 """Overriden from TypeHandler."""
7573 return False
7575 def AddBucketFunction(self, generator, func):
7576 """Overrriden from TypeHandler."""
7577 pass
7579 def WriteServiceImplementation(self, func, file):
7580 """Overrriden from TypeHandler."""
7581 self.WriteServiceHandlerFunctionHeader(func, file)
7582 file.Write("""
7583 GLuint bucket_id = static_cast<GLuint>(c.%(bucket_id)s);
7584 Bucket* bucket = GetBucket(bucket_id);
7585 if (!bucket || bucket->size() == 0) {
7586 return error::kInvalidArguments;
7588 std::string str;
7589 if (!bucket->GetAsString(&str)) {
7590 return error::kInvalidArguments;
7592 %(gl_func_name)s(0, str.c_str());
7593 return error::kNoError;
7596 """ % {
7597 'name': func.name,
7598 'gl_func_name': func.GetGLFunctionName(),
7599 'bucket_id': func.cmd_args[0].name,
7603 class IsHandler(TypeHandler):
7604 """Handler for glIs____ type and glGetError functions."""
7606 def __init__(self):
7607 TypeHandler.__init__(self)
7609 def InitFunction(self, func):
7610 """Overrriden from TypeHandler."""
7611 func.AddCmdArg(Argument("result_shm_id", 'uint32_t'))
7612 func.AddCmdArg(Argument("result_shm_offset", 'uint32_t'))
7613 if func.GetInfo('result') == None:
7614 func.AddInfo('result', ['uint32_t'])
7616 def WriteServiceUnitTest(self, func, file, *extras):
7617 """Overrriden from TypeHandler."""
7618 valid_test = """
7619 TEST_P(%(test_name)s, %(name)sValidArgs) {
7620 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
7621 SpecializedSetup<cmds::%(name)s, 0>(true);
7622 cmds::%(name)s cmd;
7623 cmd.Init(%(args)s%(comma)sshared_memory_id_, shared_memory_offset_);"""
7624 if func.IsUnsafe():
7625 valid_test += """
7626 decoder_->set_unsafe_es3_apis_enabled(true);"""
7627 valid_test += """
7628 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7629 EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
7630 if func.IsUnsafe():
7631 valid_test += """
7632 decoder_->set_unsafe_es3_apis_enabled(false);
7633 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));"""
7634 valid_test += """
7637 comma = ""
7638 if len(func.GetOriginalArgs()):
7639 comma =", "
7640 self.WriteValidUnitTest(func, file, valid_test, {
7641 'comma': comma,
7642 }, *extras)
7644 invalid_test = """
7645 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
7646 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
7647 SpecializedSetup<cmds::%(name)s, 0>(false);
7648 cmds::%(name)s cmd;
7649 cmd.Init(%(args)s%(comma)sshared_memory_id_, shared_memory_offset_);
7650 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
7653 self.WriteInvalidUnitTest(func, file, invalid_test, {
7654 'comma': comma,
7655 }, *extras)
7657 invalid_test = """
7658 TEST_P(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) {
7659 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
7660 SpecializedSetup<cmds::%(name)s, 0>(false);"""
7661 if func.IsUnsafe():
7662 invalid_test += """
7663 decoder_->set_unsafe_es3_apis_enabled(true);"""
7664 invalid_test += """
7665 cmds::%(name)s cmd;
7666 cmd.Init(%(args)s%(comma)skInvalidSharedMemoryId, shared_memory_offset_);
7667 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
7668 cmd.Init(%(args)s%(comma)sshared_memory_id_, kInvalidSharedMemoryOffset);
7669 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));"""
7670 if func.IsUnsafe():
7671 invalid_test += """
7672 decoder_->set_unsafe_es3_apis_enabled(true);"""
7673 invalid_test += """
7676 self.WriteValidUnitTest(func, file, invalid_test, {
7677 'comma': comma,
7678 }, *extras)
7680 def WriteServiceImplementation(self, func, file):
7681 """Overrriden from TypeHandler."""
7682 self.WriteServiceHandlerFunctionHeader(func, file)
7683 args = func.GetOriginalArgs()
7684 for arg in args:
7685 arg.WriteGetCode(file)
7687 code = """ typedef cmds::%(func_name)s::Result Result;
7688 Result* result_dst = GetSharedMemoryAs<Result*>(
7689 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
7690 if (!result_dst) {
7691 return error::kOutOfBounds;
7694 file.Write(code % {'func_name': func.name})
7695 func.WriteHandlerValidation(file)
7696 if func.IsUnsafe():
7697 assert func.GetInfo('id_mapping')
7698 assert len(func.GetInfo('id_mapping')) == 1
7699 assert len(args) == 1
7700 id_type = func.GetInfo('id_mapping')[0]
7701 file.Write(" %s service_%s = 0;\n" % (args[0].type, id_type.lower()))
7702 file.Write(" *result_dst = group_->Get%sServiceId(%s, &service_%s);\n" %
7703 (id_type, id_type.lower(), id_type.lower()))
7704 else:
7705 file.Write(" *result_dst = %s(%s);\n" %
7706 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
7707 file.Write(" return error::kNoError;\n")
7708 file.Write("}\n")
7709 file.Write("\n")
7711 def WriteGLES2Implementation(self, func, file):
7712 """Overrriden from TypeHandler."""
7713 impl_func = func.GetInfo('impl_func')
7714 if impl_func == None or impl_func == True:
7715 error_value = func.GetInfo("error_value") or "GL_FALSE"
7716 file.Write("%s GLES2Implementation::%s(%s) {\n" %
7717 (func.return_type, func.original_name,
7718 func.MakeTypedOriginalArgString("")))
7719 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
7720 self.WriteTraceEvent(func, file)
7721 func.WriteDestinationInitalizationValidation(file)
7722 self.WriteClientGLCallLog(func, file)
7723 file.Write(" typedef cmds::%s::Result Result;\n" % func.name)
7724 file.Write(" Result* result = GetResultAs<Result*>();\n")
7725 file.Write(" if (!result) {\n")
7726 file.Write(" return %s;\n" % error_value)
7727 file.Write(" }\n")
7728 file.Write(" *result = 0;\n")
7729 assert len(func.GetOriginalArgs()) == 1
7730 id_arg = func.GetOriginalArgs()[0]
7731 if id_arg.type == 'GLsync':
7732 arg_string = "ToGLuint(%s)" % func.MakeOriginalArgString("")
7733 else:
7734 arg_string = func.MakeOriginalArgString("")
7735 file.Write(
7736 " helper_->%s(%s, GetResultShmId(), GetResultShmOffset());\n" %
7737 (func.name, arg_string))
7738 file.Write(" WaitForCmd();\n")
7739 file.Write(" %s result_value = *result" % func.return_type)
7740 if func.return_type == "GLboolean":
7741 file.Write(" != 0")
7742 file.Write(';\n GPU_CLIENT_LOG("returned " << result_value);\n')
7743 file.Write(" CheckGLError();\n")
7744 file.Write(" return result_value;\n")
7745 file.Write("}\n")
7746 file.Write("\n")
7748 def WriteGLES2ImplementationUnitTest(self, func, file):
7749 """Overrriden from TypeHandler."""
7750 client_test = func.GetInfo('client_test')
7751 if client_test == None or client_test == True:
7752 code = """
7753 TEST_F(GLES2ImplementationTest, %(name)s) {
7754 struct Cmds {
7755 cmds::%(name)s cmd;
7758 Cmds expected;
7759 ExpectedMemoryInfo result1 =
7760 GetExpectedResultMemory(sizeof(cmds::%(name)s::Result));
7761 expected.cmd.Init(%(cmd_id_value)s, result1.id, result1.offset);
7763 EXPECT_CALL(*command_buffer(), OnFlush())
7764 .WillOnce(SetMemory(result1.ptr, uint32_t(GL_TRUE)))
7765 .RetiresOnSaturation();
7767 GLboolean result = gl_->%(name)s(%(gl_id_value)s);
7768 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
7769 EXPECT_TRUE(result);
7772 args = func.GetOriginalArgs()
7773 assert len(args) == 1
7774 file.Write(code % {
7775 'name': func.name,
7776 'cmd_id_value': args[0].GetValidClientSideCmdArg(func),
7777 'gl_id_value': args[0].GetValidClientSideArg(func) })
7780 class STRnHandler(TypeHandler):
7781 """Handler for GetProgramInfoLog, GetShaderInfoLog, GetShaderSource, and
7782 GetTranslatedShaderSourceANGLE."""
7784 def __init__(self):
7785 TypeHandler.__init__(self)
7787 def InitFunction(self, func):
7788 """Overrriden from TypeHandler."""
7789 # remove all but the first cmd args.
7790 cmd_args = func.GetCmdArgs()
7791 func.ClearCmdArgs()
7792 func.AddCmdArg(cmd_args[0])
7793 # add on a bucket id.
7794 func.AddCmdArg(Argument('bucket_id', 'uint32_t'))
7796 def WriteGLES2Implementation(self, func, file):
7797 """Overrriden from TypeHandler."""
7798 code_1 = """%(return_type)s GLES2Implementation::%(func_name)s(%(args)s) {
7799 GPU_CLIENT_SINGLE_THREAD_CHECK();
7801 code_2 = """ GPU_CLIENT_LOG("[" << GetLogPrefix()
7802 << "] gl%(func_name)s" << "("
7803 << %(arg0)s << ", "
7804 << %(arg1)s << ", "
7805 << static_cast<void*>(%(arg2)s) << ", "
7806 << static_cast<void*>(%(arg3)s) << ")");
7807 helper_->SetBucketSize(kResultBucketId, 0);
7808 helper_->%(func_name)s(%(id_name)s, kResultBucketId);
7809 std::string str;
7810 GLsizei max_size = 0;
7811 if (GetBucketAsString(kResultBucketId, &str)) {
7812 if (bufsize > 0) {
7813 max_size =
7814 std::min(static_cast<size_t>(%(bufsize_name)s) - 1, str.size());
7815 memcpy(%(dest_name)s, str.c_str(), max_size);
7816 %(dest_name)s[max_size] = '\\0';
7817 GPU_CLIENT_LOG("------\\n" << %(dest_name)s << "\\n------");
7820 if (%(length_name)s != NULL) {
7821 *%(length_name)s = max_size;
7823 CheckGLError();
7826 args = func.GetOriginalArgs()
7827 str_args = {
7828 'return_type': func.return_type,
7829 'func_name': func.original_name,
7830 'args': func.MakeTypedOriginalArgString(""),
7831 'id_name': args[0].name,
7832 'bufsize_name': args[1].name,
7833 'length_name': args[2].name,
7834 'dest_name': args[3].name,
7835 'arg0': args[0].name,
7836 'arg1': args[1].name,
7837 'arg2': args[2].name,
7838 'arg3': args[3].name,
7840 file.Write(code_1 % str_args)
7841 func.WriteDestinationInitalizationValidation(file)
7842 file.Write(code_2 % str_args)
7844 def WriteServiceUnitTest(self, func, file, *extras):
7845 """Overrriden from TypeHandler."""
7846 valid_test = """
7847 TEST_P(%(test_name)s, %(name)sValidArgs) {
7848 const char* kInfo = "hello";
7849 const uint32_t kBucketId = 123;
7850 SpecializedSetup<cmds::%(name)s, 0>(true);
7851 %(expect_len_code)s
7852 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s))
7853 .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)),
7854 SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1)));
7855 cmds::%(name)s cmd;
7856 cmd.Init(%(args)s);
7857 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7858 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
7859 ASSERT_TRUE(bucket != NULL);
7860 EXPECT_EQ(strlen(kInfo) + 1, bucket->size());
7861 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kInfo,
7862 bucket->size()));
7863 EXPECT_EQ(GL_NO_ERROR, GetGLError());
7866 args = func.GetOriginalArgs()
7867 id_name = args[0].GetValidGLArg(func)
7868 get_len_func = func.GetInfo('get_len_func')
7869 get_len_enum = func.GetInfo('get_len_enum')
7870 sub = {
7871 'id_name': id_name,
7872 'get_len_func': get_len_func,
7873 'get_len_enum': get_len_enum,
7874 'gl_args': '%s, strlen(kInfo) + 1, _, _' %
7875 args[0].GetValidGLArg(func),
7876 'args': '%s, kBucketId' % args[0].GetValidArg(func),
7877 'expect_len_code': '',
7879 if get_len_func and get_len_func[0:2] == 'gl':
7880 sub['expect_len_code'] = (
7881 " EXPECT_CALL(*gl_, %s(%s, %s, _))\n"
7882 " .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1));") % (
7883 get_len_func[2:], id_name, get_len_enum)
7884 self.WriteValidUnitTest(func, file, valid_test, sub, *extras)
7886 invalid_test = """
7887 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
7888 const uint32_t kBucketId = 123;
7889 EXPECT_CALL(*gl_, %(gl_func_name)s(_, _, _, _))
7890 .Times(0);
7891 cmds::%(name)s cmd;
7892 cmd.Init(kInvalidClientId, kBucketId);
7893 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7894 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
7897 self.WriteValidUnitTest(func, file, invalid_test, *extras)
7899 def WriteServiceImplementation(self, func, file):
7900 """Overrriden from TypeHandler."""
7901 pass
7903 class NamedType(object):
7904 """A class that represents a type of an argument in a client function.
7906 A type of an argument that is to be passed through in the command buffer
7907 command. Currently used only for the arguments that are specificly named in
7908 the 'cmd_buffer_functions.txt' file, mostly enums.
7911 def __init__(self, info):
7912 assert not 'is_complete' in info or info['is_complete'] == True
7913 self.info = info
7914 self.valid = info['valid']
7915 if 'invalid' in info:
7916 self.invalid = info['invalid']
7917 else:
7918 self.invalid = []
7919 if 'valid_es3' in info:
7920 self.valid_es3 = info['valid_es3']
7921 else:
7922 self.valid_es3 = []
7923 if 'deprecated_es3' in info:
7924 self.deprecated_es3 = info['deprecated_es3']
7925 else:
7926 self.deprecated_es3 = []
7928 def GetType(self):
7929 return self.info['type']
7931 def GetInvalidValues(self):
7932 return self.invalid
7934 def GetValidValues(self):
7935 return self.valid
7937 def GetValidValuesES3(self):
7938 return self.valid_es3
7940 def GetDeprecatedValuesES3(self):
7941 return self.deprecated_es3
7943 def IsConstant(self):
7944 if not 'is_complete' in self.info:
7945 return False
7947 return len(self.GetValidValues()) == 1
7949 def GetConstantValue(self):
7950 return self.GetValidValues()[0]
7952 class Argument(object):
7953 """A class that represents a function argument."""
7955 cmd_type_map_ = {
7956 'GLenum': 'uint32_t',
7957 'GLint': 'int32_t',
7958 'GLintptr': 'int32_t',
7959 'GLsizei': 'int32_t',
7960 'GLsizeiptr': 'int32_t',
7961 'GLfloat': 'float',
7962 'GLclampf': 'float',
7964 need_validation_ = ['GLsizei*', 'GLboolean*', 'GLenum*', 'GLint*']
7966 def __init__(self, name, type):
7967 self.name = name
7968 self.optional = type.endswith("Optional*")
7969 if self.optional:
7970 type = type[:-9] + "*"
7971 self.type = type
7973 if type in self.cmd_type_map_:
7974 self.cmd_type = self.cmd_type_map_[type]
7975 else:
7976 self.cmd_type = 'uint32_t'
7978 def IsPointer(self):
7979 """Returns true if argument is a pointer."""
7980 return False
7982 def IsPointer2D(self):
7983 """Returns true if argument is a 2D pointer."""
7984 return False
7986 def IsConstant(self):
7987 """Returns true if the argument has only one valid value."""
7988 return False
7990 def AddCmdArgs(self, args):
7991 """Adds command arguments for this argument to the given list."""
7992 if not self.IsConstant():
7993 return args.append(self)
7995 def AddInitArgs(self, args):
7996 """Adds init arguments for this argument to the given list."""
7997 if not self.IsConstant():
7998 return args.append(self)
8000 def GetValidArg(self, func):
8001 """Gets a valid value for this argument."""
8002 valid_arg = func.GetValidArg(self)
8003 if valid_arg != None:
8004 return valid_arg
8006 index = func.GetOriginalArgs().index(self)
8007 return str(index + 1)
8009 def GetValidClientSideArg(self, func):
8010 """Gets a valid value for this argument."""
8011 valid_arg = func.GetValidArg(self)
8012 if valid_arg != None:
8013 return valid_arg
8015 if self.IsPointer():
8016 return 'nullptr'
8017 index = func.GetOriginalArgs().index(self)
8018 if self.type == 'GLsync':
8019 return ("reinterpret_cast<GLsync>(%d)" % (index + 1))
8020 return str(index + 1)
8022 def GetValidClientSideCmdArg(self, func):
8023 """Gets a valid value for this argument."""
8024 valid_arg = func.GetValidArg(self)
8025 if valid_arg != None:
8026 return valid_arg
8027 try:
8028 index = func.GetOriginalArgs().index(self)
8029 return str(index + 1)
8030 except ValueError:
8031 pass
8032 index = func.GetCmdArgs().index(self)
8033 return str(index + 1)
8035 def GetValidGLArg(self, func):
8036 """Gets a valid GL value for this argument."""
8037 value = self.GetValidArg(func)
8038 if self.type == 'GLsync':
8039 return ("reinterpret_cast<GLsync>(%s)" % value)
8040 return value
8042 def GetValidNonCachedClientSideArg(self, func):
8043 """Returns a valid value for this argument in a GL call.
8044 Using the value will produce a command buffer service invocation.
8045 Returns None if there is no such value."""
8046 value = '123'
8047 if self.type == 'GLsync':
8048 return ("reinterpret_cast<GLsync>(%s)" % value)
8049 return value
8051 def GetValidNonCachedClientSideCmdArg(self, func):
8052 """Returns a valid value for this argument in a command buffer command.
8053 Calling the GL function with the value returned by
8054 GetValidNonCachedClientSideArg will result in a command buffer command
8055 that contains the value returned by this function. """
8056 return '123'
8058 def GetNumInvalidValues(self, func):
8059 """returns the number of invalid values to be tested."""
8060 return 0
8062 def GetInvalidArg(self, index):
8063 """returns an invalid value and expected parse result by index."""
8064 return ("---ERROR0---", "---ERROR2---", None)
8066 def GetLogArg(self):
8067 """Get argument appropriate for LOG macro."""
8068 if self.type == 'GLboolean':
8069 return 'GLES2Util::GetStringBool(%s)' % self.name
8070 if self.type == 'GLenum':
8071 return 'GLES2Util::GetStringEnum(%s)' % self.name
8072 return self.name
8074 def WriteGetCode(self, file):
8075 """Writes the code to get an argument from a command structure."""
8076 if self.type == 'GLsync':
8077 my_type = 'GLuint'
8078 else:
8079 my_type = self.type
8080 file.Write(" %s %s = static_cast<%s>(c.%s);\n" %
8081 (my_type, self.name, my_type, self.name))
8083 def WriteValidationCode(self, file, func):
8084 """Writes the validation code for an argument."""
8085 pass
8087 def WriteClientSideValidationCode(self, file, func):
8088 """Writes the validation code for an argument."""
8089 pass
8091 def WriteDestinationInitalizationValidation(self, file, func):
8092 """Writes the client side destintion initialization validation."""
8093 pass
8095 def WriteDestinationInitalizationValidatationIfNeeded(self, file, func):
8096 """Writes the client side destintion initialization validation if needed."""
8097 parts = self.type.split(" ")
8098 if len(parts) > 1:
8099 return
8100 if parts[0] in self.need_validation_:
8101 file.Write(
8102 " GPU_CLIENT_VALIDATE_DESTINATION_%sINITALIZATION(%s, %s);\n" %
8103 ("OPTIONAL_" if self.optional else "", self.type[:-1], self.name))
8106 def WriteGetAddress(self, file):
8107 """Writes the code to get the address this argument refers to."""
8108 pass
8110 def GetImmediateVersion(self):
8111 """Gets the immediate version of this argument."""
8112 return self
8114 def GetBucketVersion(self):
8115 """Gets the bucket version of this argument."""
8116 return self
8119 class BoolArgument(Argument):
8120 """class for GLboolean"""
8122 def __init__(self, name, type):
8123 Argument.__init__(self, name, 'GLboolean')
8125 def GetValidArg(self, func):
8126 """Gets a valid value for this argument."""
8127 return 'true'
8129 def GetValidClientSideArg(self, func):
8130 """Gets a valid value for this argument."""
8131 return 'true'
8133 def GetValidClientSideCmdArg(self, func):
8134 """Gets a valid value for this argument."""
8135 return 'true'
8137 def GetValidGLArg(self, func):
8138 """Gets a valid GL value for this argument."""
8139 return 'true'
8142 class UniformLocationArgument(Argument):
8143 """class for uniform locations."""
8145 def __init__(self, name):
8146 Argument.__init__(self, name, "GLint")
8148 def WriteGetCode(self, file):
8149 """Writes the code to get an argument from a command structure."""
8150 code = """ %s %s = static_cast<%s>(c.%s);
8152 file.Write(code % (self.type, self.name, self.type, self.name))
8154 class DataSizeArgument(Argument):
8155 """class for data_size which Bucket commands do not need."""
8157 def __init__(self, name):
8158 Argument.__init__(self, name, "uint32_t")
8160 def GetBucketVersion(self):
8161 return None
8164 class SizeArgument(Argument):
8165 """class for GLsizei and GLsizeiptr."""
8167 def __init__(self, name, type):
8168 Argument.__init__(self, name, type)
8170 def GetNumInvalidValues(self, func):
8171 """overridden from Argument."""
8172 if func.IsImmediate():
8173 return 0
8174 return 1
8176 def GetInvalidArg(self, index):
8177 """overridden from Argument."""
8178 return ("-1", "kNoError", "GL_INVALID_VALUE")
8180 def WriteValidationCode(self, file, func):
8181 """overridden from Argument."""
8182 if func.IsUnsafe():
8183 return
8184 code = """ if (%(var_name)s < 0) {
8185 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "gl%(func_name)s", "%(var_name)s < 0");
8186 return error::kNoError;
8189 file.Write(code % {
8190 "var_name": self.name,
8191 "func_name": func.original_name,
8194 def WriteClientSideValidationCode(self, file, func):
8195 """overridden from Argument."""
8196 code = """ if (%(var_name)s < 0) {
8197 SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "%(var_name)s < 0");
8198 return;
8201 file.Write(code % {
8202 "var_name": self.name,
8203 "func_name": func.original_name,
8207 class SizeNotNegativeArgument(SizeArgument):
8208 """class for GLsizeiNotNegative. It's NEVER allowed to be negative"""
8210 def __init__(self, name, type, gl_type):
8211 SizeArgument.__init__(self, name, gl_type)
8213 def GetInvalidArg(self, index):
8214 """overridden from SizeArgument."""
8215 return ("-1", "kOutOfBounds", "GL_NO_ERROR")
8217 def WriteValidationCode(self, file, func):
8218 """overridden from SizeArgument."""
8219 pass
8222 class EnumBaseArgument(Argument):
8223 """Base class for EnumArgument, IntArgument, BitfieldArgument, and
8224 ValidatedBoolArgument."""
8226 def __init__(self, name, gl_type, type, gl_error):
8227 Argument.__init__(self, name, gl_type)
8229 self.local_type = type
8230 self.gl_error = gl_error
8231 name = type[len(gl_type):]
8232 self.type_name = name
8233 self.named_type = NamedType(_NAMED_TYPE_INFO[name])
8235 def IsConstant(self):
8236 return self.named_type.IsConstant()
8238 def GetConstantValue(self):
8239 return self.named_type.GetConstantValue()
8241 def WriteValidationCode(self, file, func):
8242 if func.IsUnsafe():
8243 return
8244 if self.named_type.IsConstant():
8245 return
8246 file.Write(" if (!validators_->%s.IsValid(%s)) {\n" %
8247 (ToUnderscore(self.type_name), self.name))
8248 if self.gl_error == "GL_INVALID_ENUM":
8249 file.Write(
8250 " LOCAL_SET_GL_ERROR_INVALID_ENUM(\"gl%s\", %s, \"%s\");\n" %
8251 (func.original_name, self.name, self.name))
8252 else:
8253 file.Write(
8254 " LOCAL_SET_GL_ERROR(%s, \"gl%s\", \"%s %s\");\n" %
8255 (self.gl_error, func.original_name, self.name, self.gl_error))
8256 file.Write(" return error::kNoError;\n")
8257 file.Write(" }\n")
8259 def WriteClientSideValidationCode(self, file, func):
8260 if not self.named_type.IsConstant():
8261 return
8262 file.Write(" if (%s != %s) {" % (self.name,
8263 self.GetConstantValue()))
8264 file.Write(
8265 " SetGLError(%s, \"gl%s\", \"%s %s\");\n" %
8266 (self.gl_error, func.original_name, self.name, self.gl_error))
8267 if func.return_type == "void":
8268 file.Write(" return;\n")
8269 else:
8270 file.Write(" return %s;\n" % func.GetErrorReturnString())
8271 file.Write(" }\n")
8273 def GetValidArg(self, func):
8274 valid_arg = func.GetValidArg(self)
8275 if valid_arg != None:
8276 return valid_arg
8277 valid = self.named_type.GetValidValues()
8278 if valid:
8279 num_valid = len(valid)
8280 return valid[0]
8282 index = func.GetOriginalArgs().index(self)
8283 return str(index + 1)
8285 def GetValidClientSideArg(self, func):
8286 """Gets a valid value for this argument."""
8287 return self.GetValidArg(func)
8289 def GetValidClientSideCmdArg(self, func):
8290 """Gets a valid value for this argument."""
8291 valid_arg = func.GetValidArg(self)
8292 if valid_arg != None:
8293 return valid_arg
8295 valid = self.named_type.GetValidValues()
8296 if valid:
8297 num_valid = len(valid)
8298 return valid[0]
8300 try:
8301 index = func.GetOriginalArgs().index(self)
8302 return str(index + 1)
8303 except ValueError:
8304 pass
8305 index = func.GetCmdArgs().index(self)
8306 return str(index + 1)
8308 def GetValidGLArg(self, func):
8309 """Gets a valid value for this argument."""
8310 return self.GetValidArg(func)
8312 def GetNumInvalidValues(self, func):
8313 """returns the number of invalid values to be tested."""
8314 return len(self.named_type.GetInvalidValues())
8316 def GetInvalidArg(self, index):
8317 """returns an invalid value by index."""
8318 invalid = self.named_type.GetInvalidValues()
8319 if invalid:
8320 num_invalid = len(invalid)
8321 if index >= num_invalid:
8322 index = num_invalid - 1
8323 return (invalid[index], "kNoError", self.gl_error)
8324 return ("---ERROR1---", "kNoError", self.gl_error)
8327 class EnumArgument(EnumBaseArgument):
8328 """A class that represents a GLenum argument"""
8330 def __init__(self, name, type):
8331 EnumBaseArgument.__init__(self, name, "GLenum", type, "GL_INVALID_ENUM")
8333 def GetLogArg(self):
8334 """Overridden from Argument."""
8335 return ("GLES2Util::GetString%s(%s)" %
8336 (self.type_name, self.name))
8339 class IntArgument(EnumBaseArgument):
8340 """A class for a GLint argument that can only accept specific values.
8342 For example glTexImage2D takes a GLint for its internalformat
8343 argument instead of a GLenum.
8346 def __init__(self, name, type):
8347 EnumBaseArgument.__init__(self, name, "GLint", type, "GL_INVALID_VALUE")
8350 class ValidatedBoolArgument(EnumBaseArgument):
8351 """A class for a GLboolean argument that can only accept specific values.
8353 For example glUniformMatrix takes a GLboolean for it's transpose but it
8354 must be false.
8357 def __init__(self, name, type):
8358 EnumBaseArgument.__init__(self, name, "GLboolean", type, "GL_INVALID_VALUE")
8360 def GetLogArg(self):
8361 """Overridden from Argument."""
8362 return 'GLES2Util::GetStringBool(%s)' % self.name
8365 class BitFieldArgument(EnumBaseArgument):
8366 """A class for a GLbitfield argument that can only accept specific values.
8368 For example glFenceSync takes a GLbitfield for its flags argument bit it
8369 must be 0.
8372 def __init__(self, name, type):
8373 EnumBaseArgument.__init__(self, name, "GLbitfield", type,
8374 "GL_INVALID_VALUE")
8377 class ImmediatePointerArgument(Argument):
8378 """A class that represents an immediate argument to a function.
8380 An immediate argument is one where the data follows the command.
8383 def __init__(self, name, type):
8384 Argument.__init__(self, name, type)
8386 def IsPointer(self):
8387 return True
8389 def GetPointedType(self):
8390 match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type)
8391 assert match
8392 return match.groupdict()['element_type']
8394 def AddCmdArgs(self, args):
8395 """Overridden from Argument."""
8396 pass
8398 def WriteGetCode(self, file):
8399 """Overridden from Argument."""
8400 file.Write(
8401 " %s %s = GetImmediateDataAs<%s>(\n" %
8402 (self.type, self.name, self.type))
8403 file.Write(" c, data_size, immediate_data_size);\n")
8405 def WriteValidationCode(self, file, func):
8406 """Overridden from Argument."""
8407 if self.optional:
8408 return
8409 file.Write(" if (%s == NULL) {\n" % self.name)
8410 file.Write(" return error::kOutOfBounds;\n")
8411 file.Write(" }\n")
8413 def GetImmediateVersion(self):
8414 """Overridden from Argument."""
8415 return None
8417 def WriteDestinationInitalizationValidation(self, file, func):
8418 """Overridden from Argument."""
8419 self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
8421 def GetLogArg(self):
8422 """Overridden from Argument."""
8423 return "static_cast<const void*>(%s)" % self.name
8426 class PointerArgument(Argument):
8427 """A class that represents a pointer argument to a function."""
8429 def __init__(self, name, type):
8430 Argument.__init__(self, name, type)
8432 def IsPointer(self):
8433 """Overridden from Argument."""
8434 return True
8436 def IsPointer2D(self):
8437 """Overridden from Argument."""
8438 return self.type.count('*') == 2
8440 def GetPointedType(self):
8441 match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type)
8442 assert match
8443 return match.groupdict()['element_type']
8445 def GetValidArg(self, func):
8446 """Overridden from Argument."""
8447 return "shared_memory_id_, shared_memory_offset_"
8449 def GetValidGLArg(self, func):
8450 """Overridden from Argument."""
8451 return "reinterpret_cast<%s>(shared_memory_address_)" % self.type
8453 def GetNumInvalidValues(self, func):
8454 """Overridden from Argument."""
8455 return 2
8457 def GetInvalidArg(self, index):
8458 """Overridden from Argument."""
8459 if index == 0:
8460 return ("kInvalidSharedMemoryId, 0", "kOutOfBounds", None)
8461 else:
8462 return ("shared_memory_id_, kInvalidSharedMemoryOffset",
8463 "kOutOfBounds", None)
8465 def GetLogArg(self):
8466 """Overridden from Argument."""
8467 return "static_cast<const void*>(%s)" % self.name
8469 def AddCmdArgs(self, args):
8470 """Overridden from Argument."""
8471 args.append(Argument("%s_shm_id" % self.name, 'uint32_t'))
8472 args.append(Argument("%s_shm_offset" % self.name, 'uint32_t'))
8474 def WriteGetCode(self, file):
8475 """Overridden from Argument."""
8476 file.Write(
8477 " %s %s = GetSharedMemoryAs<%s>(\n" %
8478 (self.type, self.name, self.type))
8479 file.Write(
8480 " c.%s_shm_id, c.%s_shm_offset, data_size);\n" %
8481 (self.name, self.name))
8483 def WriteGetAddress(self, file):
8484 """Overridden from Argument."""
8485 file.Write(
8486 " %s %s = GetSharedMemoryAs<%s>(\n" %
8487 (self.type, self.name, self.type))
8488 file.Write(
8489 " %s_shm_id, %s_shm_offset, %s_size);\n" %
8490 (self.name, self.name, self.name))
8492 def WriteValidationCode(self, file, func):
8493 """Overridden from Argument."""
8494 if self.optional:
8495 return
8496 file.Write(" if (%s == NULL) {\n" % self.name)
8497 file.Write(" return error::kOutOfBounds;\n")
8498 file.Write(" }\n")
8500 def GetImmediateVersion(self):
8501 """Overridden from Argument."""
8502 return ImmediatePointerArgument(self.name, self.type)
8504 def GetBucketVersion(self):
8505 """Overridden from Argument."""
8506 if self.type.find('char') >= 0:
8507 if self.IsPointer2D():
8508 return InputStringArrayBucketArgument(self.name, self.type)
8509 return InputStringBucketArgument(self.name, self.type)
8510 return BucketPointerArgument(self.name, self.type)
8512 def WriteDestinationInitalizationValidation(self, file, func):
8513 """Overridden from Argument."""
8514 self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
8517 class BucketPointerArgument(PointerArgument):
8518 """A class that represents an bucket argument to a function."""
8520 def __init__(self, name, type):
8521 Argument.__init__(self, name, type)
8523 def AddCmdArgs(self, args):
8524 """Overridden from Argument."""
8525 pass
8527 def WriteGetCode(self, file):
8528 """Overridden from Argument."""
8529 file.Write(
8530 " %s %s = bucket->GetData(0, data_size);\n" %
8531 (self.type, self.name))
8533 def WriteValidationCode(self, file, func):
8534 """Overridden from Argument."""
8535 pass
8537 def GetImmediateVersion(self):
8538 """Overridden from Argument."""
8539 return None
8541 def WriteDestinationInitalizationValidation(self, file, func):
8542 """Overridden from Argument."""
8543 self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
8545 def GetLogArg(self):
8546 """Overridden from Argument."""
8547 return "static_cast<const void*>(%s)" % self.name
8550 class InputStringBucketArgument(Argument):
8551 """A string input argument where the string is passed in a bucket."""
8553 def __init__(self, name, type):
8554 Argument.__init__(self, name + "_bucket_id", "uint32_t")
8556 def IsPointer(self):
8557 """Overridden from Argument."""
8558 return True
8560 def IsPointer2D(self):
8561 """Overridden from Argument."""
8562 return False
8565 class InputStringArrayBucketArgument(Argument):
8566 """A string array input argument where the strings are passed in a bucket."""
8568 def __init__(self, name, type):
8569 Argument.__init__(self, name + "_bucket_id", "uint32_t")
8570 self._original_name = name
8572 def WriteGetCode(self, file):
8573 """Overridden from Argument."""
8574 code = """
8575 Bucket* bucket = GetBucket(c.%(name)s);
8576 if (!bucket) {
8577 return error::kInvalidArguments;
8579 GLsizei count = 0;
8580 std::vector<char*> strs;
8581 std::vector<GLint> len;
8582 if (!bucket->GetAsStrings(&count, &strs, &len)) {
8583 return error::kInvalidArguments;
8585 const char** %(original_name)s =
8586 strs.size() > 0 ? const_cast<const char**>(&strs[0]) : NULL;
8587 const GLint* length =
8588 len.size() > 0 ? const_cast<const GLint*>(&len[0]) : NULL;
8589 (void)length;
8591 file.Write(code % {
8592 'name': self.name,
8593 'original_name': self._original_name,
8596 def GetValidArg(self, func):
8597 return "kNameBucketId"
8599 def GetValidGLArg(self, func):
8600 return "_"
8602 def IsPointer(self):
8603 """Overridden from Argument."""
8604 return True
8606 def IsPointer2D(self):
8607 """Overridden from Argument."""
8608 return True
8611 class ResourceIdArgument(Argument):
8612 """A class that represents a resource id argument to a function."""
8614 def __init__(self, name, type):
8615 match = re.match("(GLid\w+)", type)
8616 self.resource_type = match.group(1)[4:]
8617 if self.resource_type == "Sync":
8618 type = type.replace(match.group(1), "GLsync")
8619 else:
8620 type = type.replace(match.group(1), "GLuint")
8621 Argument.__init__(self, name, type)
8623 def WriteGetCode(self, file):
8624 """Overridden from Argument."""
8625 if self.type == "GLsync":
8626 my_type = "GLuint"
8627 else:
8628 my_type = self.type
8629 file.Write(" %s %s = c.%s;\n" % (my_type, self.name, self.name))
8631 def GetValidArg(self, func):
8632 return "client_%s_id_" % self.resource_type.lower()
8634 def GetValidGLArg(self, func):
8635 if self.resource_type == "Sync":
8636 return "reinterpret_cast<GLsync>(kService%sId)" % self.resource_type
8637 return "kService%sId" % self.resource_type
8640 class ResourceIdBindArgument(Argument):
8641 """Represents a resource id argument to a bind function."""
8643 def __init__(self, name, type):
8644 match = re.match("(GLidBind\w+)", type)
8645 self.resource_type = match.group(1)[8:]
8646 type = type.replace(match.group(1), "GLuint")
8647 Argument.__init__(self, name, type)
8649 def WriteGetCode(self, file):
8650 """Overridden from Argument."""
8651 code = """ %(type)s %(name)s = c.%(name)s;
8653 file.Write(code % {'type': self.type, 'name': self.name})
8655 def GetValidArg(self, func):
8656 return "client_%s_id_" % self.resource_type.lower()
8658 def GetValidGLArg(self, func):
8659 return "kService%sId" % self.resource_type
8662 class ResourceIdZeroArgument(Argument):
8663 """Represents a resource id argument to a function that can be zero."""
8665 def __init__(self, name, type):
8666 match = re.match("(GLidZero\w+)", type)
8667 self.resource_type = match.group(1)[8:]
8668 type = type.replace(match.group(1), "GLuint")
8669 Argument.__init__(self, name, type)
8671 def WriteGetCode(self, file):
8672 """Overridden from Argument."""
8673 file.Write(" %s %s = c.%s;\n" % (self.type, self.name, self.name))
8675 def GetValidArg(self, func):
8676 return "client_%s_id_" % self.resource_type.lower()
8678 def GetValidGLArg(self, func):
8679 return "kService%sId" % self.resource_type
8681 def GetNumInvalidValues(self, func):
8682 """returns the number of invalid values to be tested."""
8683 return 1
8685 def GetInvalidArg(self, index):
8686 """returns an invalid value by index."""
8687 return ("kInvalidClientId", "kNoError", "GL_INVALID_VALUE")
8690 class Function(object):
8691 """A class that represents a function."""
8693 type_handlers = {
8694 '': TypeHandler(),
8695 'Bind': BindHandler(),
8696 'Create': CreateHandler(),
8697 'Custom': CustomHandler(),
8698 'Data': DataHandler(),
8699 'Delete': DeleteHandler(),
8700 'DELn': DELnHandler(),
8701 'GENn': GENnHandler(),
8702 'GETn': GETnHandler(),
8703 'GLchar': GLcharHandler(),
8704 'GLcharN': GLcharNHandler(),
8705 'HandWritten': HandWrittenHandler(),
8706 'Is': IsHandler(),
8707 'Manual': ManualHandler(),
8708 'PUT': PUTHandler(),
8709 'PUTn': PUTnHandler(),
8710 'PUTSTR': PUTSTRHandler(),
8711 'PUTXn': PUTXnHandler(),
8712 'StateSet': StateSetHandler(),
8713 'StateSetRGBAlpha': StateSetRGBAlphaHandler(),
8714 'StateSetFrontBack': StateSetFrontBackHandler(),
8715 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(),
8716 'StateSetNamedParameter': StateSetNamedParameter(),
8717 'STRn': STRnHandler(),
8718 'Todo': TodoHandler(),
8721 def __init__(self, name, info):
8722 self.name = name
8723 self.original_name = info['original_name']
8725 self.original_args = self.ParseArgs(info['original_args'])
8727 if 'cmd_args' in info:
8728 self.args_for_cmds = self.ParseArgs(info['cmd_args'])
8729 else:
8730 self.args_for_cmds = self.original_args[:]
8732 self.return_type = info['return_type']
8733 if self.return_type != 'void':
8734 self.return_arg = CreateArg(info['return_type'] + " result")
8735 else:
8736 self.return_arg = None
8738 self.num_pointer_args = sum(
8739 [1 for arg in self.args_for_cmds if arg.IsPointer()])
8740 if self.num_pointer_args > 0:
8741 for arg in reversed(self.original_args):
8742 if arg.IsPointer():
8743 self.last_original_pointer_arg = arg
8744 break
8745 else:
8746 self.last_original_pointer_arg = None
8747 self.info = info
8748 self.type_handler = self.type_handlers[info['type']]
8749 self.can_auto_generate = (self.num_pointer_args == 0 and
8750 info['return_type'] == "void")
8751 self.InitFunction()
8753 def ParseArgs(self, arg_string):
8754 """Parses a function arg string."""
8755 args = []
8756 parts = arg_string.split(',')
8757 for arg_string in parts:
8758 arg = CreateArg(arg_string)
8759 if arg:
8760 args.append(arg)
8761 return args
8763 def IsType(self, type_name):
8764 """Returns true if function is a certain type."""
8765 return self.info['type'] == type_name
8767 def InitFunction(self):
8768 """Creates command args and calls the init function for the type handler.
8770 Creates argument lists for command buffer commands, eg. self.cmd_args and
8771 self.init_args.
8772 Calls the type function initialization.
8773 Override to create different kind of command buffer command argument lists.
8775 self.cmd_args = []
8776 for arg in self.args_for_cmds:
8777 arg.AddCmdArgs(self.cmd_args)
8779 self.init_args = []
8780 for arg in self.args_for_cmds:
8781 arg.AddInitArgs(self.init_args)
8783 if self.return_arg:
8784 self.init_args.append(self.return_arg)
8786 self.type_handler.InitFunction(self)
8788 def IsImmediate(self):
8789 """Returns whether the function is immediate data function or not."""
8790 return False
8792 def IsUnsafe(self):
8793 """Returns whether the function has service side validation or not."""
8794 return self.GetInfo('unsafe', False)
8796 def GetInfo(self, name, default = None):
8797 """Returns a value from the function info for this function."""
8798 if name in self.info:
8799 return self.info[name]
8800 return default
8802 def GetValidArg(self, arg):
8803 """Gets a valid argument value for the parameter arg from the function info
8804 if one exists."""
8805 try:
8806 index = self.GetOriginalArgs().index(arg)
8807 except ValueError:
8808 return None
8810 valid_args = self.GetInfo('valid_args')
8811 if valid_args and str(index) in valid_args:
8812 return valid_args[str(index)]
8813 return None
8815 def AddInfo(self, name, value):
8816 """Adds an info."""
8817 self.info[name] = value
8819 def IsExtension(self):
8820 return self.GetInfo('extension') or self.GetInfo('extension_flag')
8822 def IsCoreGLFunction(self):
8823 return (not self.IsExtension() and
8824 not self.GetInfo('pepper_interface') and
8825 not self.IsUnsafe())
8827 def InPepperInterface(self, interface):
8828 ext = self.GetInfo('pepper_interface')
8829 if not interface.GetName():
8830 return self.IsCoreGLFunction()
8831 return ext == interface.GetName()
8833 def InAnyPepperExtension(self):
8834 return self.IsCoreGLFunction() or self.GetInfo('pepper_interface')
8836 def GetErrorReturnString(self):
8837 if self.GetInfo("error_return"):
8838 return self.GetInfo("error_return")
8839 elif self.return_type == "GLboolean":
8840 return "GL_FALSE"
8841 elif "*" in self.return_type:
8842 return "NULL"
8843 return "0"
8845 def GetGLFunctionName(self):
8846 """Gets the function to call to execute GL for this command."""
8847 if self.GetInfo('decoder_func'):
8848 return self.GetInfo('decoder_func')
8849 return "gl%s" % self.original_name
8851 def GetGLTestFunctionName(self):
8852 gl_func_name = self.GetInfo('gl_test_func')
8853 if gl_func_name == None:
8854 gl_func_name = self.GetGLFunctionName()
8855 if gl_func_name.startswith("gl"):
8856 gl_func_name = gl_func_name[2:]
8857 else:
8858 gl_func_name = self.original_name
8859 return gl_func_name
8861 def GetDataTransferMethods(self):
8862 return self.GetInfo('data_transfer_methods',
8863 ['immediate' if self.num_pointer_args == 1 else 'shm'])
8865 def AddCmdArg(self, arg):
8866 """Adds a cmd argument to this function."""
8867 self.cmd_args.append(arg)
8869 def GetCmdArgs(self):
8870 """Gets the command args for this function."""
8871 return self.cmd_args
8873 def ClearCmdArgs(self):
8874 """Clears the command args for this function."""
8875 self.cmd_args = []
8877 def GetCmdConstants(self):
8878 """Gets the constants for this function."""
8879 return [arg for arg in self.args_for_cmds if arg.IsConstant()]
8881 def GetInitArgs(self):
8882 """Gets the init args for this function."""
8883 return self.init_args
8885 def GetOriginalArgs(self):
8886 """Gets the original arguments to this function."""
8887 return self.original_args
8889 def GetLastOriginalArg(self):
8890 """Gets the last original argument to this function."""
8891 return self.original_args[len(self.original_args) - 1]
8893 def GetLastOriginalPointerArg(self):
8894 return self.last_original_pointer_arg
8896 def GetResourceIdArg(self):
8897 for arg in self.original_args:
8898 if hasattr(arg, 'resource_type'):
8899 return arg
8900 return None
8902 def _MaybePrependComma(self, arg_string, add_comma):
8903 """Adds a comma if arg_string is not empty and add_comma is true."""
8904 comma = ""
8905 if add_comma and len(arg_string):
8906 comma = ", "
8907 return "%s%s" % (comma, arg_string)
8909 def MakeTypedOriginalArgString(self, prefix, add_comma = False):
8910 """Gets a list of arguments as they are in GL."""
8911 args = self.GetOriginalArgs()
8912 arg_string = ", ".join(
8913 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
8914 return self._MaybePrependComma(arg_string, add_comma)
8916 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "):
8917 """Gets the list of arguments as they are in GL."""
8918 args = self.GetOriginalArgs()
8919 arg_string = separator.join(
8920 ["%s%s" % (prefix, arg.name) for arg in args])
8921 return self._MaybePrependComma(arg_string, add_comma)
8923 def MakeTypedHelperArgString(self, prefix, add_comma = False):
8924 """Gets a list of typed GL arguments after removing unneeded arguments."""
8925 args = self.GetOriginalArgs()
8926 arg_string = ", ".join(
8927 ["%s %s%s" % (
8928 arg.type,
8929 prefix,
8930 arg.name,
8931 ) for arg in args if not arg.IsConstant()])
8932 return self._MaybePrependComma(arg_string, add_comma)
8934 def MakeHelperArgString(self, prefix, add_comma = False, separator = ", "):
8935 """Gets a list of GL arguments after removing unneeded arguments."""
8936 args = self.GetOriginalArgs()
8937 arg_string = separator.join(
8938 ["%s%s" % (prefix, arg.name)
8939 for arg in args if not arg.IsConstant()])
8940 return self._MaybePrependComma(arg_string, add_comma)
8942 def MakeTypedPepperArgString(self, prefix):
8943 """Gets a list of arguments as they need to be for Pepper."""
8944 if self.GetInfo("pepper_args"):
8945 return self.GetInfo("pepper_args")
8946 else:
8947 return self.MakeTypedOriginalArgString(prefix, False)
8949 def MapCTypeToPepperIdlType(self, ctype, is_for_return_type=False):
8950 """Converts a C type name to the corresponding Pepper IDL type."""
8951 idltype = {
8952 'char*': '[out] str_t',
8953 'const GLchar* const*': '[out] cstr_t',
8954 'const char*': 'cstr_t',
8955 'const void*': 'mem_t',
8956 'void*': '[out] mem_t',
8957 'void**': '[out] mem_ptr_t',
8958 }.get(ctype, ctype)
8959 # We use "GLxxx_ptr_t" for "GLxxx*".
8960 matched = re.match(r'(const )?(GL\w+)\*$', ctype)
8961 if matched:
8962 idltype = matched.group(2) + '_ptr_t'
8963 if not matched.group(1):
8964 idltype = '[out] ' + idltype
8965 # If an in/out specifier is not specified yet, prepend [in].
8966 if idltype[0] != '[':
8967 idltype = '[in] ' + idltype
8968 # Strip the in/out specifier for a return type.
8969 if is_for_return_type:
8970 idltype = re.sub(r'\[\w+\] ', '', idltype)
8971 return idltype
8973 def MakeTypedPepperIdlArgStrings(self):
8974 """Gets a list of arguments as they need to be for Pepper IDL."""
8975 args = self.GetOriginalArgs()
8976 return ["%s %s" % (self.MapCTypeToPepperIdlType(arg.type), arg.name)
8977 for arg in args]
8979 def GetPepperName(self):
8980 if self.GetInfo("pepper_name"):
8981 return self.GetInfo("pepper_name")
8982 return self.name
8984 def MakeTypedCmdArgString(self, prefix, add_comma = False):
8985 """Gets a typed list of arguments as they need to be for command buffers."""
8986 args = self.GetCmdArgs()
8987 arg_string = ", ".join(
8988 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
8989 return self._MaybePrependComma(arg_string, add_comma)
8991 def MakeCmdArgString(self, prefix, add_comma = False):
8992 """Gets the list of arguments as they need to be for command buffers."""
8993 args = self.GetCmdArgs()
8994 arg_string = ", ".join(
8995 ["%s%s" % (prefix, arg.name) for arg in args])
8996 return self._MaybePrependComma(arg_string, add_comma)
8998 def MakeTypedInitString(self, prefix, add_comma = False):
8999 """Gets a typed list of arguments as they need to be for cmd Init/Set."""
9000 args = self.GetInitArgs()
9001 arg_string = ", ".join(
9002 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
9003 return self._MaybePrependComma(arg_string, add_comma)
9005 def MakeInitString(self, prefix, add_comma = False):
9006 """Gets the list of arguments as they need to be for cmd Init/Set."""
9007 args = self.GetInitArgs()
9008 arg_string = ", ".join(
9009 ["%s%s" % (prefix, arg.name) for arg in args])
9010 return self._MaybePrependComma(arg_string, add_comma)
9012 def MakeLogArgString(self):
9013 """Makes a string of the arguments for the LOG macros"""
9014 args = self.GetOriginalArgs()
9015 return ' << ", " << '.join([arg.GetLogArg() for arg in args])
9017 def WriteCommandDescription(self, file):
9018 """Writes a description of the command."""
9019 file.Write("//! Command that corresponds to gl%s.\n" % self.original_name)
9021 def WriteHandlerValidation(self, file):
9022 """Writes validation code for the function."""
9023 for arg in self.GetOriginalArgs():
9024 arg.WriteValidationCode(file, self)
9025 self.WriteValidationCode(file)
9027 def WriteHandlerImplementation(self, file):
9028 """Writes the handler implementation for this command."""
9029 self.type_handler.WriteHandlerImplementation(self, file)
9031 def WriteValidationCode(self, file):
9032 """Writes the validation code for a command."""
9033 pass
9035 def WriteCmdFlag(self, file):
9036 """Writes the cmd cmd_flags constant."""
9037 flags = []
9038 # By default trace only at the highest level 3.
9039 trace_level = int(self.GetInfo('trace_level', default = 3))
9040 if trace_level not in xrange(0, 4):
9041 raise KeyError("Unhandled trace_level: %d" % trace_level)
9043 flags.append('CMD_FLAG_SET_TRACE_LEVEL(%d)' % trace_level)
9045 if len(flags) > 0:
9046 cmd_flags = ' | '.join(flags)
9047 else:
9048 cmd_flags = 0
9050 file.Write(" static const uint8 cmd_flags = %s;\n" % cmd_flags)
9053 def WriteCmdArgFlag(self, file):
9054 """Writes the cmd kArgFlags constant."""
9055 file.Write(" static const cmd::ArgFlags kArgFlags = cmd::kFixed;\n")
9057 def WriteCmdComputeSize(self, file):
9058 """Writes the ComputeSize function for the command."""
9059 file.Write(" static uint32_t ComputeSize() {\n")
9060 file.Write(
9061 " return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT\n")
9062 file.Write(" }\n")
9063 file.Write("\n")
9065 def WriteCmdSetHeader(self, file):
9066 """Writes the cmd's SetHeader function."""
9067 file.Write(" void SetHeader() {\n")
9068 file.Write(" header.SetCmd<ValueType>();\n")
9069 file.Write(" }\n")
9070 file.Write("\n")
9072 def WriteCmdInit(self, file):
9073 """Writes the cmd's Init function."""
9074 file.Write(" void Init(%s) {\n" % self.MakeTypedCmdArgString("_"))
9075 file.Write(" SetHeader();\n")
9076 args = self.GetCmdArgs()
9077 for arg in args:
9078 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
9079 file.Write(" }\n")
9080 file.Write("\n")
9082 def WriteCmdSet(self, file):
9083 """Writes the cmd's Set function."""
9084 copy_args = self.MakeCmdArgString("_", False)
9085 file.Write(" void* Set(void* cmd%s) {\n" %
9086 self.MakeTypedCmdArgString("_", True))
9087 file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
9088 file.Write(" return NextCmdAddress<ValueType>(cmd);\n")
9089 file.Write(" }\n")
9090 file.Write("\n")
9092 def WriteStruct(self, file):
9093 self.type_handler.WriteStruct(self, file)
9095 def WriteDocs(self, file):
9096 self.type_handler.WriteDocs(self, file)
9098 def WriteCmdHelper(self, file):
9099 """Writes the cmd's helper."""
9100 self.type_handler.WriteCmdHelper(self, file)
9102 def WriteServiceImplementation(self, file):
9103 """Writes the service implementation for a command."""
9104 self.type_handler.WriteServiceImplementation(self, file)
9106 def WriteServiceUnitTest(self, file, *extras):
9107 """Writes the service implementation for a command."""
9108 self.type_handler.WriteServiceUnitTest(self, file, *extras)
9110 def WriteGLES2CLibImplementation(self, file):
9111 """Writes the GLES2 C Lib Implemention."""
9112 self.type_handler.WriteGLES2CLibImplementation(self, file)
9114 def WriteGLES2InterfaceHeader(self, file):
9115 """Writes the GLES2 Interface declaration."""
9116 self.type_handler.WriteGLES2InterfaceHeader(self, file)
9118 def WriteMojoGLES2ImplHeader(self, file):
9119 """Writes the Mojo GLES2 implementation header declaration."""
9120 self.type_handler.WriteMojoGLES2ImplHeader(self, file)
9122 def WriteMojoGLES2Impl(self, file):
9123 """Writes the Mojo GLES2 implementation declaration."""
9124 self.type_handler.WriteMojoGLES2Impl(self, file)
9126 def WriteGLES2InterfaceStub(self, file):
9127 """Writes the GLES2 Interface Stub declaration."""
9128 self.type_handler.WriteGLES2InterfaceStub(self, file)
9130 def WriteGLES2InterfaceStubImpl(self, file):
9131 """Writes the GLES2 Interface Stub declaration."""
9132 self.type_handler.WriteGLES2InterfaceStubImpl(self, file)
9134 def WriteGLES2ImplementationHeader(self, file):
9135 """Writes the GLES2 Implemention declaration."""
9136 self.type_handler.WriteGLES2ImplementationHeader(self, file)
9138 def WriteGLES2Implementation(self, file):
9139 """Writes the GLES2 Implemention definition."""
9140 self.type_handler.WriteGLES2Implementation(self, file)
9142 def WriteGLES2TraceImplementationHeader(self, file):
9143 """Writes the GLES2 Trace Implemention declaration."""
9144 self.type_handler.WriteGLES2TraceImplementationHeader(self, file)
9146 def WriteGLES2TraceImplementation(self, file):
9147 """Writes the GLES2 Trace Implemention definition."""
9148 self.type_handler.WriteGLES2TraceImplementation(self, file)
9150 def WriteGLES2Header(self, file):
9151 """Writes the GLES2 Implemention unit test."""
9152 self.type_handler.WriteGLES2Header(self, file)
9154 def WriteGLES2ImplementationUnitTest(self, file):
9155 """Writes the GLES2 Implemention unit test."""
9156 self.type_handler.WriteGLES2ImplementationUnitTest(self, file)
9158 def WriteDestinationInitalizationValidation(self, file):
9159 """Writes the client side destintion initialization validation."""
9160 self.type_handler.WriteDestinationInitalizationValidation(self, file)
9162 def WriteFormatTest(self, file):
9163 """Writes the cmd's format test."""
9164 self.type_handler.WriteFormatTest(self, file)
9167 class PepperInterface(object):
9168 """A class that represents a function."""
9170 def __init__(self, info):
9171 self.name = info["name"]
9172 self.dev = info["dev"]
9174 def GetName(self):
9175 return self.name
9177 def GetInterfaceName(self):
9178 upperint = ""
9179 dev = ""
9180 if self.name:
9181 upperint = "_" + self.name.upper()
9182 if self.dev:
9183 dev = "_DEV"
9184 return "PPB_OPENGLES2%s%s_INTERFACE" % (upperint, dev)
9186 def GetInterfaceString(self):
9187 dev = ""
9188 if self.dev:
9189 dev = "(Dev)"
9190 return "PPB_OpenGLES2%s%s" % (self.name, dev)
9192 def GetStructName(self):
9193 dev = ""
9194 if self.dev:
9195 dev = "_Dev"
9196 return "PPB_OpenGLES2%s%s" % (self.name, dev)
9199 class ImmediateFunction(Function):
9200 """A class that represnets an immediate function command."""
9202 def __init__(self, func):
9203 Function.__init__(
9204 self,
9205 "%sImmediate" % func.name,
9206 func.info)
9208 def InitFunction(self):
9209 # Override args in original_args and args_for_cmds with immediate versions
9210 # of the args.
9212 new_original_args = []
9213 for arg in self.original_args:
9214 new_arg = arg.GetImmediateVersion()
9215 if new_arg:
9216 new_original_args.append(new_arg)
9217 self.original_args = new_original_args
9219 new_args_for_cmds = []
9220 for arg in self.args_for_cmds:
9221 new_arg = arg.GetImmediateVersion()
9222 if new_arg:
9223 new_args_for_cmds.append(new_arg)
9225 self.args_for_cmds = new_args_for_cmds
9227 Function.InitFunction(self)
9229 def IsImmediate(self):
9230 return True
9232 def WriteCommandDescription(self, file):
9233 """Overridden from Function"""
9234 file.Write("//! Immediate version of command that corresponds to gl%s.\n" %
9235 self.original_name)
9237 def WriteServiceImplementation(self, file):
9238 """Overridden from Function"""
9239 self.type_handler.WriteImmediateServiceImplementation(self, file)
9241 def WriteHandlerImplementation(self, file):
9242 """Overridden from Function"""
9243 self.type_handler.WriteImmediateHandlerImplementation(self, file)
9245 def WriteServiceUnitTest(self, file, *extras):
9246 """Writes the service implementation for a command."""
9247 self.type_handler.WriteImmediateServiceUnitTest(self, file, *extras)
9249 def WriteValidationCode(self, file):
9250 """Overridden from Function"""
9251 self.type_handler.WriteImmediateValidationCode(self, file)
9253 def WriteCmdArgFlag(self, file):
9254 """Overridden from Function"""
9255 file.Write(" static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;\n")
9257 def WriteCmdComputeSize(self, file):
9258 """Overridden from Function"""
9259 self.type_handler.WriteImmediateCmdComputeSize(self, file)
9261 def WriteCmdSetHeader(self, file):
9262 """Overridden from Function"""
9263 self.type_handler.WriteImmediateCmdSetHeader(self, file)
9265 def WriteCmdInit(self, file):
9266 """Overridden from Function"""
9267 self.type_handler.WriteImmediateCmdInit(self, file)
9269 def WriteCmdSet(self, file):
9270 """Overridden from Function"""
9271 self.type_handler.WriteImmediateCmdSet(self, file)
9273 def WriteCmdHelper(self, file):
9274 """Overridden from Function"""
9275 self.type_handler.WriteImmediateCmdHelper(self, file)
9277 def WriteFormatTest(self, file):
9278 """Overridden from Function"""
9279 self.type_handler.WriteImmediateFormatTest(self, file)
9282 class BucketFunction(Function):
9283 """A class that represnets a bucket version of a function command."""
9285 def __init__(self, func):
9286 Function.__init__(
9287 self,
9288 "%sBucket" % func.name,
9289 func.info)
9291 def InitFunction(self):
9292 # Override args in original_args and args_for_cmds with bucket versions
9293 # of the args.
9295 new_original_args = []
9296 for arg in self.original_args:
9297 new_arg = arg.GetBucketVersion()
9298 if new_arg:
9299 new_original_args.append(new_arg)
9300 self.original_args = new_original_args
9302 new_args_for_cmds = []
9303 for arg in self.args_for_cmds:
9304 new_arg = arg.GetBucketVersion()
9305 if new_arg:
9306 new_args_for_cmds.append(new_arg)
9308 self.args_for_cmds = new_args_for_cmds
9310 Function.InitFunction(self)
9312 def WriteCommandDescription(self, file):
9313 """Overridden from Function"""
9314 file.Write("//! Bucket version of command that corresponds to gl%s.\n" %
9315 self.original_name)
9317 def WriteServiceImplementation(self, file):
9318 """Overridden from Function"""
9319 self.type_handler.WriteBucketServiceImplementation(self, file)
9321 def WriteHandlerImplementation(self, file):
9322 """Overridden from Function"""
9323 self.type_handler.WriteBucketHandlerImplementation(self, file)
9325 def WriteServiceUnitTest(self, file, *extras):
9326 """Overridden from Function"""
9327 self.type_handler.WriteBucketServiceUnitTest(self, file, *extras)
9329 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "):
9330 """Overridden from Function"""
9331 args = self.GetOriginalArgs()
9332 arg_string = separator.join(
9333 ["%s%s" % (prefix, arg.name[0:-10] if arg.name.endswith("_bucket_id")
9334 else arg.name) for arg in args])
9335 return super(BucketFunction, self)._MaybePrependComma(arg_string, add_comma)
9338 def CreateArg(arg_string):
9339 """Creates an Argument."""
9340 arg_parts = arg_string.split()
9341 if len(arg_parts) == 1 and arg_parts[0] == 'void':
9342 return None
9343 # Is this a pointer argument?
9344 elif arg_string.find('*') >= 0:
9345 return PointerArgument(
9346 arg_parts[-1],
9347 " ".join(arg_parts[0:-1]))
9348 # Is this a resource argument? Must come after pointer check.
9349 elif arg_parts[0].startswith('GLidBind'):
9350 return ResourceIdBindArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9351 elif arg_parts[0].startswith('GLidZero'):
9352 return ResourceIdZeroArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9353 elif arg_parts[0].startswith('GLid'):
9354 return ResourceIdArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9355 elif arg_parts[0].startswith('GLenum') and len(arg_parts[0]) > 6:
9356 return EnumArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9357 elif arg_parts[0].startswith('GLbitfield') and len(arg_parts[0]) > 10:
9358 return BitFieldArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9359 elif arg_parts[0].startswith('GLboolean') and len(arg_parts[0]) > 9:
9360 return ValidatedBoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9361 elif arg_parts[0].startswith('GLboolean'):
9362 return BoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9363 elif arg_parts[0].startswith('GLintUniformLocation'):
9364 return UniformLocationArgument(arg_parts[-1])
9365 elif (arg_parts[0].startswith('GLint') and len(arg_parts[0]) > 5 and
9366 not arg_parts[0].startswith('GLintptr')):
9367 return IntArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9368 elif (arg_parts[0].startswith('GLsizeiNotNegative') or
9369 arg_parts[0].startswith('GLintptrNotNegative')):
9370 return SizeNotNegativeArgument(arg_parts[-1],
9371 " ".join(arg_parts[0:-1]),
9372 arg_parts[0][0:-11])
9373 elif arg_parts[0].startswith('GLsize'):
9374 return SizeArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9375 else:
9376 return Argument(arg_parts[-1], " ".join(arg_parts[0:-1]))
9379 class GLGenerator(object):
9380 """A class to generate GL command buffers."""
9382 _function_re = re.compile(r'GL_APICALL(.*?)GL_APIENTRY (.*?) \((.*?)\);')
9384 def __init__(self, verbose):
9385 self.original_functions = []
9386 self.functions = []
9387 self.verbose = verbose
9388 self.errors = 0
9389 self.pepper_interfaces = []
9390 self.interface_info = {}
9391 self.generated_cpp_filenames = []
9393 for interface in _PEPPER_INTERFACES:
9394 interface = PepperInterface(interface)
9395 self.pepper_interfaces.append(interface)
9396 self.interface_info[interface.GetName()] = interface
9398 def AddFunction(self, func):
9399 """Adds a function."""
9400 self.functions.append(func)
9402 def GetFunctionInfo(self, name):
9403 """Gets a type info for the given function name."""
9404 if name in _FUNCTION_INFO:
9405 func_info = _FUNCTION_INFO[name].copy()
9406 else:
9407 func_info = {}
9409 if not 'type' in func_info:
9410 func_info['type'] = ''
9412 return func_info
9414 def Log(self, msg):
9415 """Prints something if verbose is true."""
9416 if self.verbose:
9417 print msg
9419 def Error(self, msg):
9420 """Prints an error."""
9421 print "Error: %s" % msg
9422 self.errors += 1
9424 def WriteLicense(self, file):
9425 """Writes the license."""
9426 file.Write(_LICENSE)
9428 def WriteNamespaceOpen(self, file):
9429 """Writes the code for the namespace."""
9430 file.Write("namespace gpu {\n")
9431 file.Write("namespace gles2 {\n")
9432 file.Write("\n")
9434 def WriteNamespaceClose(self, file):
9435 """Writes the code to close the namespace."""
9436 file.Write("} // namespace gles2\n")
9437 file.Write("} // namespace gpu\n")
9438 file.Write("\n")
9440 def ParseGLH(self, filename):
9441 """Parses the cmd_buffer_functions.txt file and extracts the functions"""
9442 f = open(filename, "r")
9443 functions = f.read()
9444 f.close()
9445 for line in functions.splitlines():
9446 match = self._function_re.match(line)
9447 if match:
9448 func_name = match.group(2)[2:]
9449 func_info = self.GetFunctionInfo(func_name)
9450 if func_info['type'] == 'Noop':
9451 continue
9453 parsed_func_info = {
9454 'original_name': func_name,
9455 'original_args': match.group(3),
9456 'return_type': match.group(1).strip(),
9459 for k in parsed_func_info.keys():
9460 if not k in func_info:
9461 func_info[k] = parsed_func_info[k]
9463 f = Function(func_name, func_info)
9464 self.original_functions.append(f)
9466 #for arg in f.GetOriginalArgs():
9467 # if not isinstance(arg, EnumArgument) and arg.type == 'GLenum':
9468 # self.Log("%s uses bare GLenum %s." % (func_name, arg.name))
9470 gen_cmd = f.GetInfo('gen_cmd')
9471 if gen_cmd == True or gen_cmd == None:
9472 if f.type_handler.NeedsDataTransferFunction(f):
9473 methods = f.GetDataTransferMethods()
9474 if 'immediate' in methods:
9475 self.AddFunction(ImmediateFunction(f))
9476 if 'bucket' in methods:
9477 self.AddFunction(BucketFunction(f))
9478 if 'shm' in methods:
9479 self.AddFunction(f)
9480 else:
9481 self.AddFunction(f)
9483 self.Log("Auto Generated Functions : %d" %
9484 len([f for f in self.functions if f.can_auto_generate or
9485 (not f.IsType('') and not f.IsType('Custom') and
9486 not f.IsType('Todo'))]))
9488 funcs = [f for f in self.functions if not f.can_auto_generate and
9489 (f.IsType('') or f.IsType('Custom') or f.IsType('Todo'))]
9490 self.Log("Non Auto Generated Functions: %d" % len(funcs))
9492 for f in funcs:
9493 self.Log(" %-10s %-20s gl%s" % (f.info['type'], f.return_type, f.name))
9495 def WriteCommandIds(self, filename):
9496 """Writes the command buffer format"""
9497 file = CHeaderWriter(filename)
9498 file.Write("#define GLES2_COMMAND_LIST(OP) \\\n")
9499 id = 256
9500 for func in self.functions:
9501 file.Write(" %-60s /* %d */ \\\n" %
9502 ("OP(%s)" % func.name, id))
9503 id += 1
9504 file.Write("\n")
9506 file.Write("enum CommandId {\n")
9507 file.Write(" kStartPoint = cmd::kLastCommonId, "
9508 "// All GLES2 commands start after this.\n")
9509 file.Write("#define GLES2_CMD_OP(name) k ## name,\n")
9510 file.Write(" GLES2_COMMAND_LIST(GLES2_CMD_OP)\n")
9511 file.Write("#undef GLES2_CMD_OP\n")
9512 file.Write(" kNumCommands\n")
9513 file.Write("};\n")
9514 file.Write("\n")
9515 file.Close()
9516 self.generated_cpp_filenames.append(file.filename)
9518 def WriteFormat(self, filename):
9519 """Writes the command buffer format"""
9520 file = CHeaderWriter(filename)
9521 # Forward declaration of a few enums used in constant argument
9522 # to avoid including GL header files.
9523 enum_defines = {
9524 'GL_SYNC_GPU_COMMANDS_COMPLETE': '0x9117',
9525 'GL_SYNC_FLUSH_COMMANDS_BIT': '0x00000001',
9527 file.Write('\n')
9528 for enum in enum_defines:
9529 file.Write("#define %s %s\n" % (enum, enum_defines[enum]))
9530 file.Write('\n')
9531 for func in self.functions:
9532 if True:
9533 #gen_cmd = func.GetInfo('gen_cmd')
9534 #if gen_cmd == True or gen_cmd == None:
9535 func.WriteStruct(file)
9536 file.Write("\n")
9537 file.Close()
9538 self.generated_cpp_filenames.append(file.filename)
9540 def WriteDocs(self, filename):
9541 """Writes the command buffer doc version of the commands"""
9542 file = CWriter(filename)
9543 for func in self.functions:
9544 if True:
9545 #gen_cmd = func.GetInfo('gen_cmd')
9546 #if gen_cmd == True or gen_cmd == None:
9547 func.WriteDocs(file)
9548 file.Write("\n")
9549 file.Close()
9550 self.generated_cpp_filenames.append(file.filename)
9552 def WriteFormatTest(self, filename):
9553 """Writes the command buffer format test."""
9554 file = CHeaderWriter(
9555 filename,
9556 "// This file contains unit tests for gles2 commmands\n"
9557 "// It is included by gles2_cmd_format_test.cc\n"
9558 "\n")
9560 for func in self.functions:
9561 if True:
9562 #gen_cmd = func.GetInfo('gen_cmd')
9563 #if gen_cmd == True or gen_cmd == None:
9564 func.WriteFormatTest(file)
9566 file.Close()
9567 self.generated_cpp_filenames.append(file.filename)
9569 def WriteCmdHelperHeader(self, filename):
9570 """Writes the gles2 command helper."""
9571 file = CHeaderWriter(filename)
9573 for func in self.functions:
9574 if True:
9575 #gen_cmd = func.GetInfo('gen_cmd')
9576 #if gen_cmd == True or gen_cmd == None:
9577 func.WriteCmdHelper(file)
9579 file.Close()
9580 self.generated_cpp_filenames.append(file.filename)
9582 def WriteServiceContextStateHeader(self, filename):
9583 """Writes the service context state header."""
9584 file = CHeaderWriter(
9585 filename,
9586 "// It is included by context_state.h\n")
9587 file.Write("struct EnableFlags {\n")
9588 file.Write(" EnableFlags();\n")
9589 for capability in _CAPABILITY_FLAGS:
9590 file.Write(" bool %s;\n" % capability['name'])
9591 file.Write(" bool cached_%s;\n" % capability['name'])
9592 file.Write("};\n\n")
9594 for state_name in sorted(_STATES.keys()):
9595 state = _STATES[state_name]
9596 for item in state['states']:
9597 if isinstance(item['default'], list):
9598 file.Write("%s %s[%d];\n" % (item['type'], item['name'],
9599 len(item['default'])))
9600 else:
9601 file.Write("%s %s;\n" % (item['type'], item['name']))
9603 if item.get('cached', False):
9604 if isinstance(item['default'], list):
9605 file.Write("%s cached_%s[%d];\n" % (item['type'], item['name'],
9606 len(item['default'])))
9607 else:
9608 file.Write("%s cached_%s;\n" % (item['type'], item['name']))
9610 file.Write("\n")
9612 file.Write("""
9613 inline void SetDeviceCapabilityState(GLenum cap, bool enable) {
9614 switch (cap) {
9615 """)
9616 for capability in _CAPABILITY_FLAGS:
9617 file.Write("""\
9618 case GL_%s:
9619 """ % capability['name'].upper())
9620 file.Write("""\
9621 if (enable_flags.cached_%(name)s == enable &&
9622 !ignore_cached_state)
9623 return;
9624 enable_flags.cached_%(name)s = enable;
9625 break;
9626 """ % capability)
9628 file.Write("""\
9629 default:
9630 NOTREACHED();
9631 return;
9633 if (enable)
9634 glEnable(cap);
9635 else
9636 glDisable(cap);
9638 """)
9640 file.Close()
9641 self.generated_cpp_filenames.append(file.filename)
9643 def WriteClientContextStateHeader(self, filename):
9644 """Writes the client context state header."""
9645 file = CHeaderWriter(
9646 filename,
9647 "// It is included by client_context_state.h\n")
9648 file.Write("struct EnableFlags {\n")
9649 file.Write(" EnableFlags();\n")
9650 for capability in _CAPABILITY_FLAGS:
9651 file.Write(" bool %s;\n" % capability['name'])
9652 file.Write("};\n\n")
9654 file.Close()
9655 self.generated_cpp_filenames.append(file.filename)
9657 def WriteContextStateGetters(self, file, class_name):
9658 """Writes the state getters."""
9659 for gl_type in ["GLint", "GLfloat"]:
9660 file.Write("""
9661 bool %s::GetStateAs%s(
9662 GLenum pname, %s* params, GLsizei* num_written) const {
9663 switch (pname) {
9664 """ % (class_name, gl_type, gl_type))
9665 for state_name in sorted(_STATES.keys()):
9666 state = _STATES[state_name]
9667 if 'enum' in state:
9668 file.Write(" case %s:\n" % state['enum'])
9669 file.Write(" *num_written = %d;\n" % len(state['states']))
9670 file.Write(" if (params) {\n")
9671 for ndx,item in enumerate(state['states']):
9672 file.Write(" params[%d] = static_cast<%s>(%s);\n" %
9673 (ndx, gl_type, item['name']))
9674 file.Write(" }\n")
9675 file.Write(" return true;\n")
9676 else:
9677 for item in state['states']:
9678 file.Write(" case %s:\n" % item['enum'])
9679 if isinstance(item['default'], list):
9680 item_len = len(item['default'])
9681 file.Write(" *num_written = %d;\n" % item_len)
9682 file.Write(" if (params) {\n")
9683 if item['type'] == gl_type:
9684 file.Write(" memcpy(params, %s, sizeof(%s) * %d);\n" %
9685 (item['name'], item['type'], item_len))
9686 else:
9687 file.Write(" for (size_t i = 0; i < %s; ++i) {\n" %
9688 item_len)
9689 file.Write(" params[i] = %s;\n" %
9690 (GetGLGetTypeConversion(gl_type, item['type'],
9691 "%s[i]" % item['name'])))
9692 file.Write(" }\n");
9693 else:
9694 file.Write(" *num_written = 1;\n")
9695 file.Write(" if (params) {\n")
9696 file.Write(" params[0] = %s;\n" %
9697 (GetGLGetTypeConversion(gl_type, item['type'],
9698 item['name'])))
9699 file.Write(" }\n")
9700 file.Write(" return true;\n")
9701 for capability in _CAPABILITY_FLAGS:
9702 file.Write(" case GL_%s:\n" % capability['name'].upper())
9703 file.Write(" *num_written = 1;\n")
9704 file.Write(" if (params) {\n")
9705 file.Write(
9706 " params[0] = static_cast<%s>(enable_flags.%s);\n" %
9707 (gl_type, capability['name']))
9708 file.Write(" }\n")
9709 file.Write(" return true;\n")
9710 file.Write(""" default:
9711 return false;
9714 """)
9716 def WriteServiceContextStateImpl(self, filename):
9717 """Writes the context state service implementation."""
9718 file = CHeaderWriter(
9719 filename,
9720 "// It is included by context_state.cc\n")
9721 code = []
9722 for capability in _CAPABILITY_FLAGS:
9723 code.append("%s(%s)" %
9724 (capability['name'],
9725 ('false', 'true')['default' in capability]))
9726 code.append("cached_%s(%s)" %
9727 (capability['name'],
9728 ('false', 'true')['default' in capability]))
9729 file.Write("ContextState::EnableFlags::EnableFlags()\n : %s {\n}\n" %
9730 ",\n ".join(code))
9731 file.Write("\n")
9733 file.Write("void ContextState::Initialize() {\n")
9734 for state_name in sorted(_STATES.keys()):
9735 state = _STATES[state_name]
9736 for item in state['states']:
9737 if isinstance(item['default'], list):
9738 for ndx, value in enumerate(item['default']):
9739 file.Write(" %s[%d] = %s;\n" % (item['name'], ndx, value))
9740 else:
9741 file.Write(" %s = %s;\n" % (item['name'], item['default']))
9742 if item.get('cached', False):
9743 if isinstance(item['default'], list):
9744 for ndx, value in enumerate(item['default']):
9745 file.Write(" cached_%s[%d] = %s;\n" % (item['name'], ndx, value))
9746 else:
9747 file.Write(" cached_%s = %s;\n" % (item['name'], item['default']))
9748 file.Write("}\n")
9750 file.Write("""
9751 void ContextState::InitCapabilities(const ContextState* prev_state) const {
9752 """)
9753 def WriteCapabilities(test_prev, es3_caps):
9754 for capability in _CAPABILITY_FLAGS:
9755 capability_name = capability['name']
9756 capability_es3 = 'es3' in capability and capability['es3'] == True
9757 if capability_es3 and not es3_caps or not capability_es3 and es3_caps:
9758 continue
9759 if test_prev:
9760 file.Write(""" if (prev_state->enable_flags.cached_%s !=
9761 enable_flags.cached_%s) {\n""" %
9762 (capability_name, capability_name))
9763 file.Write(" EnableDisable(GL_%s, enable_flags.cached_%s);\n" %
9764 (capability_name.upper(), capability_name))
9765 if test_prev:
9766 file.Write(" }")
9768 file.Write(" if (prev_state) {")
9769 WriteCapabilities(True, False)
9770 file.Write(" if (feature_info_->IsES3Capable()) {\n")
9771 WriteCapabilities(True, True)
9772 file.Write(" }\n")
9773 file.Write(" } else {")
9774 WriteCapabilities(False, False)
9775 file.Write(" if (feature_info_->IsES3Capable()) {\n")
9776 WriteCapabilities(False, True)
9777 file.Write(" }\n")
9778 file.Write(" }")
9780 file.Write("""}
9782 void ContextState::InitState(const ContextState *prev_state) const {
9783 """)
9785 def WriteStates(test_prev):
9786 # We need to sort the keys so the expectations match
9787 for state_name in sorted(_STATES.keys()):
9788 state = _STATES[state_name]
9789 if state['type'] == 'FrontBack':
9790 num_states = len(state['states'])
9791 for ndx, group in enumerate(Grouper(num_states / 2, state['states'])):
9792 if test_prev:
9793 file.Write(" if (")
9794 args = []
9795 for place, item in enumerate(group):
9796 item_name = CachedStateName(item)
9797 args.append('%s' % item_name)
9798 if test_prev:
9799 if place > 0:
9800 file.Write(' ||\n')
9801 file.Write("(%s != prev_state->%s)" % (item_name, item_name))
9802 if test_prev:
9803 file.Write(")\n")
9804 file.Write(
9805 " gl%s(%s, %s);\n" %
9806 (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args)))
9807 elif state['type'] == 'NamedParameter':
9808 for item in state['states']:
9809 item_name = CachedStateName(item)
9811 if 'extension_flag' in item:
9812 file.Write(" if (feature_info_->feature_flags().%s) {\n " %
9813 item['extension_flag'])
9814 if test_prev:
9815 if isinstance(item['default'], list):
9816 file.Write(" if (memcmp(prev_state->%s, %s, "
9817 "sizeof(%s) * %d)) {\n" %
9818 (item_name, item_name, item['type'],
9819 len(item['default'])))
9820 else:
9821 file.Write(" if (prev_state->%s != %s) {\n " %
9822 (item_name, item_name))
9823 if 'gl_version_flag' in item:
9824 item_name = item['gl_version_flag']
9825 inverted = ''
9826 if item_name[0] == '!':
9827 inverted = '!'
9828 item_name = item_name[1:]
9829 file.Write(" if (%sfeature_info_->gl_version_info().%s) {\n" %
9830 (inverted, item_name))
9831 file.Write(" gl%s(%s, %s);\n" %
9832 (state['func'],
9833 (item['enum_set']
9834 if 'enum_set' in item else item['enum']),
9835 item['name']))
9836 if 'gl_version_flag' in item:
9837 file.Write(" }\n")
9838 if test_prev:
9839 if 'extension_flag' in item:
9840 file.Write(" ")
9841 file.Write(" }")
9842 if 'extension_flag' in item:
9843 file.Write(" }")
9844 else:
9845 if 'extension_flag' in state:
9846 file.Write(" if (feature_info_->feature_flags().%s)\n " %
9847 state['extension_flag'])
9848 if test_prev:
9849 file.Write(" if (")
9850 args = []
9851 for place, item in enumerate(state['states']):
9852 item_name = CachedStateName(item)
9853 args.append('%s' % item_name)
9854 if test_prev:
9855 if place > 0:
9856 file.Write(' ||\n')
9857 file.Write("(%s != prev_state->%s)" %
9858 (item_name, item_name))
9859 if test_prev:
9860 file.Write(" )\n")
9861 file.Write(" gl%s(%s);\n" % (state['func'], ", ".join(args)))
9863 file.Write(" if (prev_state) {")
9864 WriteStates(True)
9865 file.Write(" } else {")
9866 WriteStates(False)
9867 file.Write(" }")
9868 file.Write("}\n")
9870 file.Write("""bool ContextState::GetEnabled(GLenum cap) const {
9871 switch (cap) {
9872 """)
9873 for capability in _CAPABILITY_FLAGS:
9874 file.Write(" case GL_%s:\n" % capability['name'].upper())
9875 file.Write(" return enable_flags.%s;\n" % capability['name'])
9876 file.Write(""" default:
9877 NOTREACHED();
9878 return false;
9881 """)
9883 self.WriteContextStateGetters(file, "ContextState")
9884 file.Close()
9885 self.generated_cpp_filenames.append(file.filename)
9887 def WriteClientContextStateImpl(self, filename):
9888 """Writes the context state client side implementation."""
9889 file = CHeaderWriter(
9890 filename,
9891 "// It is included by client_context_state.cc\n")
9892 code = []
9893 for capability in _CAPABILITY_FLAGS:
9894 code.append("%s(%s)" %
9895 (capability['name'],
9896 ('false', 'true')['default' in capability]))
9897 file.Write(
9898 "ClientContextState::EnableFlags::EnableFlags()\n : %s {\n}\n" %
9899 ",\n ".join(code))
9900 file.Write("\n")
9902 file.Write("""
9903 bool ClientContextState::SetCapabilityState(
9904 GLenum cap, bool enabled, bool* changed) {
9905 *changed = false;
9906 switch (cap) {
9907 """)
9908 for capability in _CAPABILITY_FLAGS:
9909 file.Write(" case GL_%s:\n" % capability['name'].upper())
9910 file.Write(""" if (enable_flags.%(name)s != enabled) {
9911 *changed = true;
9912 enable_flags.%(name)s = enabled;
9914 return true;
9915 """ % capability)
9916 file.Write(""" default:
9917 return false;
9920 """)
9921 file.Write("""bool ClientContextState::GetEnabled(
9922 GLenum cap, bool* enabled) const {
9923 switch (cap) {
9924 """)
9925 for capability in _CAPABILITY_FLAGS:
9926 file.Write(" case GL_%s:\n" % capability['name'].upper())
9927 file.Write(" *enabled = enable_flags.%s;\n" % capability['name'])
9928 file.Write(" return true;\n")
9929 file.Write(""" default:
9930 return false;
9933 """)
9934 file.Close()
9935 self.generated_cpp_filenames.append(file.filename)
9937 def WriteServiceImplementation(self, filename):
9938 """Writes the service decorder implementation."""
9939 file = CHeaderWriter(
9940 filename,
9941 "// It is included by gles2_cmd_decoder.cc\n")
9943 for func in self.functions:
9944 if True:
9945 #gen_cmd = func.GetInfo('gen_cmd')
9946 #if gen_cmd == True or gen_cmd == None:
9947 func.WriteServiceImplementation(file)
9949 file.Write("""
9950 bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
9951 switch (cap) {
9952 """)
9953 for capability in _CAPABILITY_FLAGS:
9954 file.Write(" case GL_%s:\n" % capability['name'].upper())
9955 if 'state_flag' in capability:
9957 file.Write("""\
9958 state_.enable_flags.%(name)s = enabled;
9959 if (state_.enable_flags.cached_%(name)s != enabled
9960 || state_.ignore_cached_state) {
9961 %(state_flag)s = true;
9963 return false;
9964 """ % capability)
9965 else:
9966 file.Write("""\
9967 state_.enable_flags.%(name)s = enabled;
9968 if (state_.enable_flags.cached_%(name)s != enabled
9969 || state_.ignore_cached_state) {
9970 state_.enable_flags.cached_%(name)s = enabled;
9971 return true;
9973 return false;
9974 """ % capability)
9975 file.Write(""" default:
9976 NOTREACHED();
9977 return false;
9980 """)
9981 file.Close()
9982 self.generated_cpp_filenames.append(file.filename)
9984 def WriteServiceUnitTests(self, filename):
9985 """Writes the service decorder unit tests."""
9986 num_tests = len(self.functions)
9987 FUNCTIONS_PER_FILE = 98 # hard code this so it doesn't change.
9988 count = 0
9989 for test_num in range(0, num_tests, FUNCTIONS_PER_FILE):
9990 count += 1
9991 name = filename % count
9992 file = CHeaderWriter(
9993 name,
9994 "// It is included by gles2_cmd_decoder_unittest_%d.cc\n" % count)
9995 test_name = 'GLES2DecoderTest%d' % count
9996 end = test_num + FUNCTIONS_PER_FILE
9997 if end > num_tests:
9998 end = num_tests
9999 for idx in range(test_num, end):
10000 func = self.functions[idx]
10002 # Do any filtering of the functions here, so that the functions
10003 # will not move between the numbered files if filtering properties
10004 # are changed.
10005 if func.GetInfo('extension_flag'):
10006 continue
10008 if True:
10009 #gen_cmd = func.GetInfo('gen_cmd')
10010 #if gen_cmd == True or gen_cmd == None:
10011 if func.GetInfo('unit_test') == False:
10012 file.Write("// TODO(gman): %s\n" % func.name)
10013 else:
10014 func.WriteServiceUnitTest(file, {
10015 'test_name': test_name
10017 file.Close()
10018 self.generated_cpp_filenames.append(file.filename)
10019 file = CHeaderWriter(
10020 filename % 0,
10021 "// It is included by gles2_cmd_decoder_unittest_base.cc\n")
10022 file.Write(
10023 """void GLES2DecoderTestBase::SetupInitCapabilitiesExpectations(
10024 bool es3_capable) {""")
10025 for capability in _CAPABILITY_FLAGS:
10026 capability_es3 = 'es3' in capability and capability['es3'] == True
10027 if not capability_es3:
10028 file.Write(" ExpectEnableDisable(GL_%s, %s);\n" %
10029 (capability['name'].upper(),
10030 ('false', 'true')['default' in capability]))
10032 file.Write(" if (es3_capable) {")
10033 for capability in _CAPABILITY_FLAGS:
10034 capability_es3 = 'es3' in capability and capability['es3'] == True
10035 if capability_es3:
10036 file.Write(" ExpectEnableDisable(GL_%s, %s);\n" %
10037 (capability['name'].upper(),
10038 ('false', 'true')['default' in capability]))
10039 file.Write(""" }
10042 void GLES2DecoderTestBase::SetupInitStateExpectations() {
10043 """)
10045 # We need to sort the keys so the expectations match
10046 for state_name in sorted(_STATES.keys()):
10047 state = _STATES[state_name]
10048 if state['type'] == 'FrontBack':
10049 num_states = len(state['states'])
10050 for ndx, group in enumerate(Grouper(num_states / 2, state['states'])):
10051 args = []
10052 for item in group:
10053 if 'expected' in item:
10054 args.append(item['expected'])
10055 else:
10056 args.append(item['default'])
10057 file.Write(
10058 " EXPECT_CALL(*gl_, %s(%s, %s))\n" %
10059 (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args)))
10060 file.Write(" .Times(1)\n")
10061 file.Write(" .RetiresOnSaturation();\n")
10062 elif state['type'] == 'NamedParameter':
10063 for item in state['states']:
10064 if 'extension_flag' in item:
10065 file.Write(" if (group_->feature_info()->feature_flags().%s) {\n" %
10066 item['extension_flag'])
10067 file.Write(" ")
10068 expect_value = item['default']
10069 if isinstance(expect_value, list):
10070 # TODO: Currently we do not check array values.
10071 expect_value = "_"
10073 file.Write(
10074 " EXPECT_CALL(*gl_, %s(%s, %s))\n" %
10075 (state['func'],
10076 (item['enum_set']
10077 if 'enum_set' in item else item['enum']),
10078 expect_value))
10079 file.Write(" .Times(1)\n")
10080 file.Write(" .RetiresOnSaturation();\n")
10081 if 'extension_flag' in item:
10082 file.Write(" }\n")
10083 else:
10084 if 'extension_flag' in state:
10085 file.Write(" if (group_->feature_info()->feature_flags().%s) {\n" %
10086 state['extension_flag'])
10087 file.Write(" ")
10088 args = []
10089 for item in state['states']:
10090 if 'expected' in item:
10091 args.append(item['expected'])
10092 else:
10093 args.append(item['default'])
10094 # TODO: Currently we do not check array values.
10095 args = ["_" if isinstance(arg, list) else arg for arg in args]
10096 file.Write(" EXPECT_CALL(*gl_, %s(%s))\n" %
10097 (state['func'], ", ".join(args)))
10098 file.Write(" .Times(1)\n")
10099 file.Write(" .RetiresOnSaturation();\n")
10100 if 'extension_flag' in state:
10101 file.Write(" }\n")
10102 file.Write("""}
10103 """)
10104 file.Close()
10105 self.generated_cpp_filenames.append(file.filename)
10107 def WriteServiceUnitTestsForExtensions(self, filename):
10108 """Writes the service decorder unit tests for functions with extension_flag.
10110 The functions are special in that they need a specific unit test
10111 baseclass to turn on the extension.
10113 functions = [f for f in self.functions if f.GetInfo('extension_flag')]
10114 file = CHeaderWriter(
10115 filename,
10116 "// It is included by gles2_cmd_decoder_unittest_extensions.cc\n")
10117 for func in functions:
10118 if True:
10119 if func.GetInfo('unit_test') == False:
10120 file.Write("// TODO(gman): %s\n" % func.name)
10121 else:
10122 extension = ToCamelCase(
10123 ToGLExtensionString(func.GetInfo('extension_flag')))
10124 func.WriteServiceUnitTest(file, {
10125 'test_name': 'GLES2DecoderTestWith%s' % extension
10128 file.Close()
10129 self.generated_cpp_filenames.append(file.filename)
10131 def WriteGLES2Header(self, filename):
10132 """Writes the GLES2 header."""
10133 file = CHeaderWriter(
10134 filename,
10135 "// This file contains Chromium-specific GLES2 declarations.\n\n")
10137 for func in self.original_functions:
10138 func.WriteGLES2Header(file)
10140 file.Write("\n")
10141 file.Close()
10142 self.generated_cpp_filenames.append(file.filename)
10144 def WriteGLES2CLibImplementation(self, filename):
10145 """Writes the GLES2 c lib implementation."""
10146 file = CHeaderWriter(
10147 filename,
10148 "// These functions emulate GLES2 over command buffers.\n")
10150 for func in self.original_functions:
10151 func.WriteGLES2CLibImplementation(file)
10153 file.Write("""
10154 namespace gles2 {
10156 extern const NameToFunc g_gles2_function_table[] = {
10157 """)
10158 for func in self.original_functions:
10159 file.Write(
10160 ' { "gl%s", reinterpret_cast<GLES2FunctionPointer>(gl%s), },\n' %
10161 (func.name, func.name))
10162 file.Write(""" { NULL, NULL, },
10165 } // namespace gles2
10166 """)
10167 file.Close()
10168 self.generated_cpp_filenames.append(file.filename)
10170 def WriteGLES2InterfaceHeader(self, filename):
10171 """Writes the GLES2 interface header."""
10172 file = CHeaderWriter(
10173 filename,
10174 "// This file is included by gles2_interface.h to declare the\n"
10175 "// GL api functions.\n")
10176 for func in self.original_functions:
10177 func.WriteGLES2InterfaceHeader(file)
10178 file.Close()
10179 self.generated_cpp_filenames.append(file.filename)
10181 def WriteMojoGLES2ImplHeader(self, filename):
10182 """Writes the Mojo GLES2 implementation header."""
10183 file = CHeaderWriter(
10184 filename,
10185 "// This file is included by gles2_interface.h to declare the\n"
10186 "// GL api functions.\n")
10188 code = """
10189 #include "gpu/command_buffer/client/gles2_interface.h"
10190 #include "third_party/mojo/src/mojo/public/c/gles2/gles2.h"
10192 namespace mojo {
10194 class MojoGLES2Impl : public gpu::gles2::GLES2Interface {
10195 public:
10196 explicit MojoGLES2Impl(MojoGLES2Context context) {
10197 context_ = context;
10199 ~MojoGLES2Impl() override {}
10201 file.Write(code);
10202 for func in self.original_functions:
10203 func.WriteMojoGLES2ImplHeader(file)
10204 code = """
10205 private:
10206 MojoGLES2Context context_;
10209 } // namespace mojo
10211 file.Write(code);
10212 file.Close()
10213 self.generated_cpp_filenames.append(file.filename)
10215 def WriteMojoGLES2Impl(self, filename):
10216 """Writes the Mojo GLES2 implementation."""
10217 file = CWriter(filename)
10218 file.Write(_LICENSE)
10219 file.Write(_DO_NOT_EDIT_WARNING)
10221 code = """
10222 #include "mojo/gpu/mojo_gles2_impl_autogen.h"
10224 #include "base/logging.h"
10225 #include "third_party/mojo/src/mojo/public/c/gles2/chromium_miscellaneous.h"
10226 #include "third_party/mojo/src/mojo/public/c/gles2/chromium_sub_image.h"
10227 #include "third_party/mojo/src/mojo/public/c/gles2/chromium_sync_point.h"
10228 #include "third_party/mojo/src/mojo/public/c/gles2/chromium_texture_mailbox.h"
10229 #include "third_party/mojo/src/mojo/public/c/gles2/gles2.h"
10230 #include "third_party/mojo/src/mojo/public/c/gles2/occlusion_query_ext.h"
10232 namespace mojo {
10235 file.Write(code);
10236 for func in self.original_functions:
10237 func.WriteMojoGLES2Impl(file)
10238 code = """
10240 } // namespace mojo
10242 file.Write(code);
10243 file.Close()
10244 self.generated_cpp_filenames.append(file.filename)
10246 def WriteGLES2InterfaceStub(self, filename):
10247 """Writes the GLES2 interface stub header."""
10248 file = CHeaderWriter(
10249 filename,
10250 "// This file is included by gles2_interface_stub.h.\n")
10251 for func in self.original_functions:
10252 func.WriteGLES2InterfaceStub(file)
10253 file.Close()
10254 self.generated_cpp_filenames.append(file.filename)
10256 def WriteGLES2InterfaceStubImpl(self, filename):
10257 """Writes the GLES2 interface header."""
10258 file = CHeaderWriter(
10259 filename,
10260 "// This file is included by gles2_interface_stub.cc.\n")
10261 for func in self.original_functions:
10262 func.WriteGLES2InterfaceStubImpl(file)
10263 file.Close()
10264 self.generated_cpp_filenames.append(file.filename)
10266 def WriteGLES2ImplementationHeader(self, filename):
10267 """Writes the GLES2 Implementation header."""
10268 file = CHeaderWriter(
10269 filename,
10270 "// This file is included by gles2_implementation.h to declare the\n"
10271 "// GL api functions.\n")
10272 for func in self.original_functions:
10273 func.WriteGLES2ImplementationHeader(file)
10274 file.Close()
10275 self.generated_cpp_filenames.append(file.filename)
10277 def WriteGLES2Implementation(self, filename):
10278 """Writes the GLES2 Implementation."""
10279 file = CHeaderWriter(
10280 filename,
10281 "// This file is included by gles2_implementation.cc to define the\n"
10282 "// GL api functions.\n")
10283 for func in self.original_functions:
10284 func.WriteGLES2Implementation(file)
10285 file.Close()
10286 self.generated_cpp_filenames.append(file.filename)
10288 def WriteGLES2TraceImplementationHeader(self, filename):
10289 """Writes the GLES2 Trace Implementation header."""
10290 file = CHeaderWriter(
10291 filename,
10292 "// This file is included by gles2_trace_implementation.h\n")
10293 for func in self.original_functions:
10294 func.WriteGLES2TraceImplementationHeader(file)
10295 file.Close()
10296 self.generated_cpp_filenames.append(file.filename)
10298 def WriteGLES2TraceImplementation(self, filename):
10299 """Writes the GLES2 Trace Implementation."""
10300 file = CHeaderWriter(
10301 filename,
10302 "// This file is included by gles2_trace_implementation.cc\n")
10303 for func in self.original_functions:
10304 func.WriteGLES2TraceImplementation(file)
10305 file.Close()
10306 self.generated_cpp_filenames.append(file.filename)
10308 def WriteGLES2ImplementationUnitTests(self, filename):
10309 """Writes the GLES2 helper header."""
10310 file = CHeaderWriter(
10311 filename,
10312 "// This file is included by gles2_implementation.h to declare the\n"
10313 "// GL api functions.\n")
10314 for func in self.original_functions:
10315 func.WriteGLES2ImplementationUnitTest(file)
10316 file.Close()
10317 self.generated_cpp_filenames.append(file.filename)
10319 def WriteServiceUtilsHeader(self, filename):
10320 """Writes the gles2 auto generated utility header."""
10321 file = CHeaderWriter(filename)
10322 for name in sorted(_NAMED_TYPE_INFO.keys()):
10323 named_type = NamedType(_NAMED_TYPE_INFO[name])
10324 if named_type.IsConstant():
10325 continue
10326 file.Write("ValueValidator<%s> %s;\n" %
10327 (named_type.GetType(), ToUnderscore(name)))
10328 file.Write("\n")
10329 file.Close()
10330 self.generated_cpp_filenames.append(file.filename)
10332 def WriteServiceUtilsImplementation(self, filename):
10333 """Writes the gles2 auto generated utility implementation."""
10334 file = CHeaderWriter(filename)
10335 names = sorted(_NAMED_TYPE_INFO.keys())
10336 for name in names:
10337 named_type = NamedType(_NAMED_TYPE_INFO[name])
10338 if named_type.IsConstant():
10339 continue
10340 if named_type.GetValidValues():
10341 file.Write("static const %s valid_%s_table[] = {\n" %
10342 (named_type.GetType(), ToUnderscore(name)))
10343 for value in named_type.GetValidValues():
10344 file.Write(" %s,\n" % value)
10345 file.Write("};\n")
10346 file.Write("\n")
10347 if named_type.GetValidValuesES3():
10348 file.Write("static const %s valid_%s_table_es3[] = {\n" %
10349 (named_type.GetType(), ToUnderscore(name)))
10350 for value in named_type.GetValidValuesES3():
10351 file.Write(" %s,\n" % value)
10352 file.Write("};\n")
10353 file.Write("\n")
10354 if named_type.GetDeprecatedValuesES3():
10355 file.Write("static const %s deprecated_%s_table_es3[] = {\n" %
10356 (named_type.GetType(), ToUnderscore(name)))
10357 for value in named_type.GetDeprecatedValuesES3():
10358 file.Write(" %s,\n" % value)
10359 file.Write("};\n")
10360 file.Write("\n")
10361 file.Write("Validators::Validators()")
10362 pre = ' : '
10363 for count, name in enumerate(names):
10364 named_type = NamedType(_NAMED_TYPE_INFO[name])
10365 if named_type.IsConstant():
10366 continue
10367 if named_type.GetValidValues():
10368 code = """%(pre)s%(name)s(
10369 valid_%(name)s_table, arraysize(valid_%(name)s_table))"""
10370 else:
10371 code = "%(pre)s%(name)s()"
10372 file.Write(code % {
10373 'name': ToUnderscore(name),
10374 'pre': pre,
10376 pre = ',\n '
10377 file.Write(" {\n");
10378 file.Write("}\n\n");
10380 file.Write("void Validators::UpdateValuesES3() {\n")
10381 for name in names:
10382 named_type = NamedType(_NAMED_TYPE_INFO[name])
10383 if named_type.GetDeprecatedValuesES3():
10384 code = """ %(name)s.RemoveValues(
10385 deprecated_%(name)s_table_es3, arraysize(deprecated_%(name)s_table_es3));
10387 file.Write(code % {
10388 'name': ToUnderscore(name),
10390 if named_type.GetValidValuesES3():
10391 code = """ %(name)s.AddValues(
10392 valid_%(name)s_table_es3, arraysize(valid_%(name)s_table_es3));
10394 file.Write(code % {
10395 'name': ToUnderscore(name),
10397 file.Write("}\n\n");
10398 file.Close()
10399 self.generated_cpp_filenames.append(file.filename)
10401 def WriteCommonUtilsHeader(self, filename):
10402 """Writes the gles2 common utility header."""
10403 file = CHeaderWriter(filename)
10404 type_infos = sorted(_NAMED_TYPE_INFO.keys())
10405 for type_info in type_infos:
10406 if _NAMED_TYPE_INFO[type_info]['type'] == 'GLenum':
10407 file.Write("static std::string GetString%s(uint32_t value);\n" %
10408 type_info)
10409 file.Write("\n")
10410 file.Close()
10411 self.generated_cpp_filenames.append(file.filename)
10413 def WriteCommonUtilsImpl(self, filename):
10414 """Writes the gles2 common utility header."""
10415 enum_re = re.compile(r'\#define\s+(GL_[a-zA-Z0-9_]+)\s+([0-9A-Fa-fx]+)')
10416 dict = {}
10417 for fname in ['third_party/khronos/GLES2/gl2.h',
10418 'third_party/khronos/GLES2/gl2ext.h',
10419 'third_party/khronos/GLES3/gl3.h',
10420 'gpu/GLES2/gl2chromium.h',
10421 'gpu/GLES2/gl2extchromium.h']:
10422 lines = open(fname).readlines()
10423 for line in lines:
10424 m = enum_re.match(line)
10425 if m:
10426 name = m.group(1)
10427 value = m.group(2)
10428 if len(value) <= 10:
10429 if not value in dict:
10430 dict[value] = name
10431 # check our own _CHROMIUM macro conflicts with khronos GL headers.
10432 elif dict[value] != name and (name.endswith('_CHROMIUM') or
10433 dict[value].endswith('_CHROMIUM')):
10434 self.Error("code collision: %s and %s have the same code %s" %
10435 (dict[value], name, value))
10437 file = CHeaderWriter(filename)
10438 file.Write("static const GLES2Util::EnumToString "
10439 "enum_to_string_table[] = {\n")
10440 for value in dict:
10441 file.Write(' { %s, "%s", },\n' % (value, dict[value]))
10442 file.Write("""};
10444 const GLES2Util::EnumToString* const GLES2Util::enum_to_string_table_ =
10445 enum_to_string_table;
10446 const size_t GLES2Util::enum_to_string_table_len_ =
10447 sizeof(enum_to_string_table) / sizeof(enum_to_string_table[0]);
10449 """)
10451 enums = sorted(_NAMED_TYPE_INFO.keys())
10452 for enum in enums:
10453 if _NAMED_TYPE_INFO[enum]['type'] == 'GLenum':
10454 file.Write("std::string GLES2Util::GetString%s(uint32_t value) {\n" %
10455 enum)
10456 valid_list = _NAMED_TYPE_INFO[enum]['valid']
10457 if 'valid_es3' in _NAMED_TYPE_INFO[enum]:
10458 valid_list = valid_list + _NAMED_TYPE_INFO[enum]['valid_es3']
10459 assert len(valid_list) == len(set(valid_list))
10460 if len(valid_list) > 0:
10461 file.Write(" static const EnumToString string_table[] = {\n")
10462 for value in valid_list:
10463 file.Write(' { %s, "%s" },\n' % (value, value))
10464 file.Write(""" };
10465 return GLES2Util::GetQualifiedEnumString(
10466 string_table, arraysize(string_table), value);
10469 """)
10470 else:
10471 file.Write(""" return GLES2Util::GetQualifiedEnumString(
10472 NULL, 0, value);
10475 """)
10476 file.Close()
10477 self.generated_cpp_filenames.append(file.filename)
10479 def WritePepperGLES2Interface(self, filename, dev):
10480 """Writes the Pepper OpenGLES interface definition."""
10481 file = CWriter(filename)
10482 file.Write(_LICENSE)
10483 file.Write(_DO_NOT_EDIT_WARNING)
10485 file.Write("label Chrome {\n")
10486 file.Write(" M39 = 1.0\n")
10487 file.Write("};\n\n")
10489 if not dev:
10490 # Declare GL types.
10491 file.Write("[version=1.0]\n")
10492 file.Write("describe {\n")
10493 for gltype in ['GLbitfield', 'GLboolean', 'GLbyte', 'GLclampf',
10494 'GLclampx', 'GLenum', 'GLfixed', 'GLfloat', 'GLint',
10495 'GLintptr', 'GLshort', 'GLsizei', 'GLsizeiptr',
10496 'GLubyte', 'GLuint', 'GLushort']:
10497 file.Write(" %s;\n" % gltype)
10498 file.Write(" %s_ptr_t;\n" % gltype)
10499 file.Write("};\n\n")
10501 # C level typedefs.
10502 file.Write("#inline c\n")
10503 file.Write("#include \"ppapi/c/pp_resource.h\"\n")
10504 if dev:
10505 file.Write("#include \"ppapi/c/ppb_opengles2.h\"\n\n")
10506 else:
10507 file.Write("\n#ifndef __gl2_h_\n")
10508 for (k, v) in _GL_TYPES.iteritems():
10509 file.Write("typedef %s %s;\n" % (v, k))
10510 file.Write("#ifdef _WIN64\n")
10511 for (k, v) in _GL_TYPES_64.iteritems():
10512 file.Write("typedef %s %s;\n" % (v, k))
10513 file.Write("#else\n")
10514 for (k, v) in _GL_TYPES_32.iteritems():
10515 file.Write("typedef %s %s;\n" % (v, k))
10516 file.Write("#endif // _WIN64\n")
10517 file.Write("#endif // __gl2_h_\n\n")
10518 file.Write("#endinl\n")
10520 for interface in self.pepper_interfaces:
10521 if interface.dev != dev:
10522 continue
10523 # Historically, we provide OpenGLES2 interfaces with struct
10524 # namespace. Not to break code which uses the interface as
10525 # "struct OpenGLES2", we put it in struct namespace.
10526 file.Write('\n[macro="%s", force_struct_namespace]\n' %
10527 interface.GetInterfaceName())
10528 file.Write("interface %s {\n" % interface.GetStructName())
10529 for func in self.original_functions:
10530 if not func.InPepperInterface(interface):
10531 continue
10533 ret_type = func.MapCTypeToPepperIdlType(func.return_type,
10534 is_for_return_type=True)
10535 func_prefix = " %s %s(" % (ret_type, func.GetPepperName())
10536 file.Write(func_prefix)
10537 file.Write("[in] PP_Resource context")
10538 for arg in func.MakeTypedPepperIdlArgStrings():
10539 file.Write(",\n" + " " * len(func_prefix) + arg)
10540 file.Write(");\n")
10541 file.Write("};\n\n")
10544 file.Close()
10546 def WritePepperGLES2Implementation(self, filename):
10547 """Writes the Pepper OpenGLES interface implementation."""
10549 file = CWriter(filename)
10550 file.Write(_LICENSE)
10551 file.Write(_DO_NOT_EDIT_WARNING)
10553 file.Write("#include \"ppapi/shared_impl/ppb_opengles2_shared.h\"\n\n")
10554 file.Write("#include \"base/logging.h\"\n")
10555 file.Write("#include \"gpu/command_buffer/client/gles2_implementation.h\"\n")
10556 file.Write("#include \"ppapi/shared_impl/ppb_graphics_3d_shared.h\"\n")
10557 file.Write("#include \"ppapi/thunk/enter.h\"\n\n")
10559 file.Write("namespace ppapi {\n\n")
10560 file.Write("namespace {\n\n")
10562 file.Write("typedef thunk::EnterResource<thunk::PPB_Graphics3D_API>"
10563 " Enter3D;\n\n")
10565 file.Write("gpu::gles2::GLES2Implementation* ToGles2Impl(Enter3D*"
10566 " enter) {\n")
10567 file.Write(" DCHECK(enter);\n")
10568 file.Write(" DCHECK(enter->succeeded());\n")
10569 file.Write(" return static_cast<PPB_Graphics3D_Shared*>(enter->object())->"
10570 "gles2_impl();\n");
10571 file.Write("}\n\n");
10573 for func in self.original_functions:
10574 if not func.InAnyPepperExtension():
10575 continue
10577 original_arg = func.MakeTypedPepperArgString("")
10578 context_arg = "PP_Resource context_id"
10579 if len(original_arg):
10580 arg = context_arg + ", " + original_arg
10581 else:
10582 arg = context_arg
10583 file.Write("%s %s(%s) {\n" %
10584 (func.return_type, func.GetPepperName(), arg))
10585 file.Write(" Enter3D enter(context_id, true);\n")
10586 file.Write(" if (enter.succeeded()) {\n")
10588 return_str = "" if func.return_type == "void" else "return "
10589 file.Write(" %sToGles2Impl(&enter)->%s(%s);\n" %
10590 (return_str, func.original_name,
10591 func.MakeOriginalArgString("")))
10592 file.Write(" }")
10593 if func.return_type == "void":
10594 file.Write("\n")
10595 else:
10596 file.Write(" else {\n")
10597 file.Write(" return %s;\n" % func.GetErrorReturnString())
10598 file.Write(" }\n")
10599 file.Write("}\n\n")
10601 file.Write("} // namespace\n")
10603 for interface in self.pepper_interfaces:
10604 file.Write("const %s* PPB_OpenGLES2_Shared::Get%sInterface() {\n" %
10605 (interface.GetStructName(), interface.GetName()))
10606 file.Write(" static const struct %s "
10607 "ppb_opengles2 = {\n" % interface.GetStructName())
10608 file.Write(" &")
10609 file.Write(",\n &".join(
10610 f.GetPepperName() for f in self.original_functions
10611 if f.InPepperInterface(interface)))
10612 file.Write("\n")
10614 file.Write(" };\n")
10615 file.Write(" return &ppb_opengles2;\n")
10616 file.Write("}\n")
10618 file.Write("} // namespace ppapi\n")
10619 file.Close()
10620 self.generated_cpp_filenames.append(file.filename)
10622 def WriteGLES2ToPPAPIBridge(self, filename):
10623 """Connects GLES2 helper library to PPB_OpenGLES2 interface"""
10625 file = CWriter(filename)
10626 file.Write(_LICENSE)
10627 file.Write(_DO_NOT_EDIT_WARNING)
10629 file.Write("#ifndef GL_GLEXT_PROTOTYPES\n")
10630 file.Write("#define GL_GLEXT_PROTOTYPES\n")
10631 file.Write("#endif\n")
10632 file.Write("#include <GLES2/gl2.h>\n")
10633 file.Write("#include <GLES2/gl2ext.h>\n")
10634 file.Write("#include \"ppapi/lib/gl/gles2/gl2ext_ppapi.h\"\n\n")
10636 for func in self.original_functions:
10637 if not func.InAnyPepperExtension():
10638 continue
10640 interface = self.interface_info[func.GetInfo('pepper_interface') or '']
10642 file.Write("%s GL_APIENTRY gl%s(%s) {\n" %
10643 (func.return_type, func.GetPepperName(),
10644 func.MakeTypedPepperArgString("")))
10645 return_str = "" if func.return_type == "void" else "return "
10646 interface_str = "glGet%sInterfacePPAPI()" % interface.GetName()
10647 original_arg = func.MakeOriginalArgString("")
10648 context_arg = "glGetCurrentContextPPAPI()"
10649 if len(original_arg):
10650 arg = context_arg + ", " + original_arg
10651 else:
10652 arg = context_arg
10653 if interface.GetName():
10654 file.Write(" const struct %s* ext = %s;\n" %
10655 (interface.GetStructName(), interface_str))
10656 file.Write(" if (ext)\n")
10657 file.Write(" %sext->%s(%s);\n" %
10658 (return_str, func.GetPepperName(), arg))
10659 if return_str:
10660 file.Write(" %s0;\n" % return_str)
10661 else:
10662 file.Write(" %s%s->%s(%s);\n" %
10663 (return_str, interface_str, func.GetPepperName(), arg))
10664 file.Write("}\n\n")
10665 file.Close()
10666 self.generated_cpp_filenames.append(file.filename)
10668 def WriteMojoGLCallVisitor(self, filename):
10669 """Provides the GL implementation for mojo"""
10670 file = CWriter(filename)
10671 file.Write(_LICENSE)
10672 file.Write(_DO_NOT_EDIT_WARNING)
10674 for func in self.original_functions:
10675 if not func.IsCoreGLFunction():
10676 continue
10677 file.Write("VISIT_GL_CALL(%s, %s, (%s), (%s))\n" %
10678 (func.name, func.return_type,
10679 func.MakeTypedOriginalArgString(""),
10680 func.MakeOriginalArgString("")))
10682 file.Close()
10683 self.generated_cpp_filenames.append(file.filename)
10685 def WriteMojoGLCallVisitorForExtension(self, filename, extension):
10686 """Provides the GL implementation for mojo for a particular extension"""
10687 file = CWriter(filename)
10688 file.Write(_LICENSE)
10689 file.Write(_DO_NOT_EDIT_WARNING)
10691 for func in self.original_functions:
10692 if func.GetInfo("extension") != extension:
10693 continue
10694 file.Write("VISIT_GL_CALL(%s, %s, (%s), (%s))\n" %
10695 (func.name, func.return_type,
10696 func.MakeTypedOriginalArgString(""),
10697 func.MakeOriginalArgString("")))
10699 file.Close()
10700 self.generated_cpp_filenames.append(file.filename)
10702 def Format(generated_files):
10703 formatter = "clang-format"
10704 if platform.system() == "Windows":
10705 formatter += ".bat"
10706 for filename in generated_files:
10707 call([formatter, "-i", "-style=chromium", filename])
10709 def main(argv):
10710 """This is the main function."""
10711 parser = OptionParser()
10712 parser.add_option(
10713 "--output-dir",
10714 help="base directory for resulting files, under chrome/src. default is "
10715 "empty. Use this if you want the result stored under gen.")
10716 parser.add_option(
10717 "-v", "--verbose", action="store_true",
10718 help="prints more output.")
10720 (options, args) = parser.parse_args(args=argv)
10722 # Add in states and capabilites to GLState
10723 gl_state_valid = _NAMED_TYPE_INFO['GLState']['valid']
10724 for state_name in sorted(_STATES.keys()):
10725 state = _STATES[state_name]
10726 if 'extension_flag' in state:
10727 continue
10728 if 'enum' in state:
10729 if not state['enum'] in gl_state_valid:
10730 gl_state_valid.append(state['enum'])
10731 else:
10732 for item in state['states']:
10733 if 'extension_flag' in item:
10734 continue
10735 if not item['enum'] in gl_state_valid:
10736 gl_state_valid.append(item['enum'])
10737 for capability in _CAPABILITY_FLAGS:
10738 valid_value = "GL_%s" % capability['name'].upper()
10739 if not valid_value in gl_state_valid:
10740 gl_state_valid.append(valid_value)
10742 # This script lives under gpu/command_buffer, cd to base directory.
10743 os.chdir(os.path.dirname(__file__) + "/../..")
10744 base_dir = os.getcwd()
10745 gen = GLGenerator(options.verbose)
10746 gen.ParseGLH("gpu/command_buffer/cmd_buffer_functions.txt")
10748 # Support generating files under gen/
10749 if options.output_dir != None:
10750 os.chdir(options.output_dir)
10752 gen.WritePepperGLES2Interface("ppapi/api/ppb_opengles2.idl", False)
10753 gen.WritePepperGLES2Interface("ppapi/api/dev/ppb_opengles2ext_dev.idl", True)
10754 gen.WriteGLES2ToPPAPIBridge("ppapi/lib/gl/gles2/gles2.c")
10755 gen.WritePepperGLES2Implementation(
10756 "ppapi/shared_impl/ppb_opengles2_shared.cc")
10757 os.chdir(base_dir)
10758 gen.WriteCommandIds("gpu/command_buffer/common/gles2_cmd_ids_autogen.h")
10759 gen.WriteFormat("gpu/command_buffer/common/gles2_cmd_format_autogen.h")
10760 gen.WriteFormatTest(
10761 "gpu/command_buffer/common/gles2_cmd_format_test_autogen.h")
10762 gen.WriteGLES2InterfaceHeader(
10763 "gpu/command_buffer/client/gles2_interface_autogen.h")
10764 gen.WriteMojoGLES2ImplHeader(
10765 "mojo/gpu/mojo_gles2_impl_autogen.h")
10766 gen.WriteMojoGLES2Impl(
10767 "mojo/gpu/mojo_gles2_impl_autogen.cc")
10768 gen.WriteGLES2InterfaceStub(
10769 "gpu/command_buffer/client/gles2_interface_stub_autogen.h")
10770 gen.WriteGLES2InterfaceStubImpl(
10771 "gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h")
10772 gen.WriteGLES2ImplementationHeader(
10773 "gpu/command_buffer/client/gles2_implementation_autogen.h")
10774 gen.WriteGLES2Implementation(
10775 "gpu/command_buffer/client/gles2_implementation_impl_autogen.h")
10776 gen.WriteGLES2ImplementationUnitTests(
10777 "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h")
10778 gen.WriteGLES2TraceImplementationHeader(
10779 "gpu/command_buffer/client/gles2_trace_implementation_autogen.h")
10780 gen.WriteGLES2TraceImplementation(
10781 "gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h")
10782 gen.WriteGLES2CLibImplementation(
10783 "gpu/command_buffer/client/gles2_c_lib_autogen.h")
10784 gen.WriteCmdHelperHeader(
10785 "gpu/command_buffer/client/gles2_cmd_helper_autogen.h")
10786 gen.WriteServiceImplementation(
10787 "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h")
10788 gen.WriteServiceContextStateHeader(
10789 "gpu/command_buffer/service/context_state_autogen.h")
10790 gen.WriteServiceContextStateImpl(
10791 "gpu/command_buffer/service/context_state_impl_autogen.h")
10792 gen.WriteClientContextStateHeader(
10793 "gpu/command_buffer/client/client_context_state_autogen.h")
10794 gen.WriteClientContextStateImpl(
10795 "gpu/command_buffer/client/client_context_state_impl_autogen.h")
10796 gen.WriteServiceUnitTests(
10797 "gpu/command_buffer/service/gles2_cmd_decoder_unittest_%d_autogen.h")
10798 gen.WriteServiceUnitTestsForExtensions(
10799 "gpu/command_buffer/service/"
10800 "gles2_cmd_decoder_unittest_extensions_autogen.h")
10801 gen.WriteServiceUtilsHeader(
10802 "gpu/command_buffer/service/gles2_cmd_validation_autogen.h")
10803 gen.WriteServiceUtilsImplementation(
10804 "gpu/command_buffer/service/"
10805 "gles2_cmd_validation_implementation_autogen.h")
10806 gen.WriteCommonUtilsHeader(
10807 "gpu/command_buffer/common/gles2_cmd_utils_autogen.h")
10808 gen.WriteCommonUtilsImpl(
10809 "gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h")
10810 gen.WriteGLES2Header("gpu/GLES2/gl2chromium_autogen.h")
10811 mojo_gles2_prefix = ("third_party/mojo/src/mojo/public/c/gles2/"
10812 "gles2_call_visitor")
10813 gen.WriteMojoGLCallVisitor(mojo_gles2_prefix + "_autogen.h")
10814 gen.WriteMojoGLCallVisitorForExtension(
10815 mojo_gles2_prefix + "_chromium_texture_mailbox_autogen.h",
10816 "CHROMIUM_texture_mailbox")
10817 gen.WriteMojoGLCallVisitorForExtension(
10818 mojo_gles2_prefix + "_chromium_sync_point_autogen.h",
10819 "CHROMIUM_sync_point")
10820 gen.WriteMojoGLCallVisitorForExtension(
10821 mojo_gles2_prefix + "_chromium_sub_image_autogen.h",
10822 "CHROMIUM_sub_image")
10823 gen.WriteMojoGLCallVisitorForExtension(
10824 mojo_gles2_prefix + "_chromium_miscellaneous_autogen.h",
10825 "CHROMIUM_miscellaneous")
10826 gen.WriteMojoGLCallVisitorForExtension(
10827 mojo_gles2_prefix + "_occlusion_query_ext_autogen.h",
10828 "occlusion_query_EXT")
10830 Format(gen.generated_cpp_filenames)
10832 if gen.errors > 0:
10833 print "%d errors" % gen.errors
10834 return 1
10835 return 0
10838 if __name__ == '__main__':
10839 sys.exit(main(sys.argv[1:]))