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."""
13 from optparse import OptionParser
16 _SIZE_OF_COMMAND_HEADER = 4
17 _FIRST_SPECIFIC_COMMAND_ID = 256
19 _LICENSE = """// Copyright (c) 2012 The Chromium Authors. All rights reserved.
20 // Use of this source code is governed by a BSD-style license that can be
21 // found in the LICENSE file.
25 _DO_NOT_EDIT_WARNING = """// This file is auto-generated from
26 // gpu/command_buffer/build_gles2_cmd_buffer.py
31 # This string is copied directly out of the gl2.h file from GLES2.0
35 # *) Any argument that is a resourceID has been changed to GLid<Type>.
36 # (not pointer arguments) and if it's allowed to be zero it's GLidZero<Type>
37 # If it's allowed to not exist it's GLidBind<Type>
39 # *) All GLenums have been changed to GLenumTypeOfEnum
42 'GLenum': 'unsigned int',
43 'GLboolean': 'unsigned char',
44 'GLbitfield': 'unsigned int',
45 'GLbyte': 'signed char',
49 'GLubyte': 'unsigned char',
50 'GLushort': 'unsigned short',
51 'GLuint': 'unsigned int',
57 'GLintptr': 'long int',
58 'GLsizeiptr': 'long int',
61 # Capabilites selected with glEnable
64 {'name': 'cull_face'},
65 {'name': 'depth_test', 'state_flag': 'framebuffer_state_.clear_state_dirty'},
66 {'name': 'dither', 'default': True},
67 {'name': 'polygon_offset_fill'},
68 {'name': 'sample_alpha_to_coverage'},
69 {'name': 'sample_coverage'},
70 {'name': 'scissor_test',
71 'state_flag': 'framebuffer_state_.clear_state_dirty'},
72 {'name': 'stencil_test',
73 'state_flag': 'framebuffer_state_.clear_state_dirty'},
80 'enum': 'GL_COLOR_CLEAR_VALUE',
82 {'name': 'color_clear_red', 'type': 'GLfloat', 'default': '0.0f'},
83 {'name': 'color_clear_green', 'type': 'GLfloat', 'default': '0.0f'},
84 {'name': 'color_clear_blue', 'type': 'GLfloat', 'default': '0.0f'},
85 {'name': 'color_clear_alpha', 'type': 'GLfloat', 'default': '0.0f'},
91 'enum': 'GL_DEPTH_CLEAR_VALUE',
93 {'name': 'depth_clear', 'type': 'GLclampf', 'default': '1.0f'},
99 'enum': 'GL_COLOR_WRITEMASK',
101 {'name': 'color_mask_red', 'type': 'GLboolean', 'default': 'true'},
102 {'name': 'color_mask_green', 'type': 'GLboolean', 'default': 'true'},
103 {'name': 'color_mask_blue', 'type': 'GLboolean', 'default': 'true'},
104 {'name': 'color_mask_alpha', 'type': 'GLboolean', 'default': 'true'},
106 'state_flag': 'framebuffer_state_.clear_state_dirty',
110 'func': 'ClearStencil',
111 'enum': 'GL_STENCIL_CLEAR_VALUE',
113 {'name': 'stencil_clear', 'type': 'GLint', 'default': '0'},
118 'func': 'BlendColor',
119 'enum': 'GL_BLEND_COLOR',
121 {'name': 'blend_color_red', 'type': 'GLfloat', 'default': '0.0f'},
122 {'name': 'blend_color_green', 'type': 'GLfloat', 'default': '0.0f'},
123 {'name': 'blend_color_blue', 'type': 'GLfloat', 'default': '0.0f'},
124 {'name': 'blend_color_alpha', 'type': 'GLfloat', 'default': '0.0f'},
129 'func': 'BlendEquationSeparate',
132 'name': 'blend_equation_rgb',
134 'enum': 'GL_BLEND_EQUATION_RGB',
135 'default': 'GL_FUNC_ADD',
138 'name': 'blend_equation_alpha',
140 'enum': 'GL_BLEND_EQUATION_ALPHA',
141 'default': 'GL_FUNC_ADD',
147 'func': 'BlendFuncSeparate',
150 'name': 'blend_source_rgb',
152 'enum': 'GL_BLEND_SRC_RGB',
156 'name': 'blend_dest_rgb',
158 'enum': 'GL_BLEND_DST_RGB',
159 'default': 'GL_ZERO',
162 'name': 'blend_source_alpha',
164 'enum': 'GL_BLEND_SRC_ALPHA',
168 'name': 'blend_dest_alpha',
170 'enum': 'GL_BLEND_DST_ALPHA',
171 'default': 'GL_ZERO',
177 'func': 'PolygonOffset',
180 'name': 'polygon_offset_factor',
182 'enum': 'GL_POLYGON_OFFSET_FACTOR',
186 'name': 'polygon_offset_units',
188 'enum': 'GL_POLYGON_OFFSET_UNITS',
196 'enum': 'GL_CULL_FACE_MODE',
201 'default': 'GL_BACK',
208 'enum': 'GL_FRONT_FACE',
209 'states': [{'name': 'front_face', 'type': 'GLenum', 'default': 'GL_CCW'}],
214 'enum': 'GL_DEPTH_FUNC',
215 'states': [{'name': 'depth_func', 'type': 'GLenum', 'default': 'GL_LESS'}],
219 'func': 'DepthRange',
220 'enum': 'GL_DEPTH_RANGE',
222 {'name': 'z_near', 'type': 'GLclampf', 'default': '0.0f'},
223 {'name': 'z_far', 'type': 'GLclampf', 'default': '1.0f'},
228 'func': 'SampleCoverage',
231 'name': 'sample_coverage_value',
233 'enum': 'GL_SAMPLE_COVERAGE_VALUE',
237 'name': 'sample_coverage_invert',
239 'enum': 'GL_SAMPLE_COVERAGE_INVERT',
246 'func': 'StencilMaskSeparate',
247 'state_flag': 'framebuffer_state_.clear_state_dirty',
250 'name': 'stencil_front_writemask',
252 'enum': 'GL_STENCIL_WRITEMASK',
253 'default': '0xFFFFFFFFU',
256 'name': 'stencil_back_writemask',
258 'enum': 'GL_STENCIL_BACK_WRITEMASK',
259 'default': '0xFFFFFFFFU',
265 'func': 'StencilOpSeparate',
268 'name': 'stencil_front_fail_op',
270 'enum': 'GL_STENCIL_FAIL',
271 'default': 'GL_KEEP',
274 'name': 'stencil_front_z_fail_op',
276 'enum': 'GL_STENCIL_PASS_DEPTH_FAIL',
277 'default': 'GL_KEEP',
280 'name': 'stencil_front_z_pass_op',
282 'enum': 'GL_STENCIL_PASS_DEPTH_PASS',
283 'default': 'GL_KEEP',
286 'name': 'stencil_back_fail_op',
288 'enum': 'GL_STENCIL_BACK_FAIL',
289 'default': 'GL_KEEP',
292 'name': 'stencil_back_z_fail_op',
294 'enum': 'GL_STENCIL_BACK_PASS_DEPTH_FAIL',
295 'default': 'GL_KEEP',
298 'name': 'stencil_back_z_pass_op',
300 'enum': 'GL_STENCIL_BACK_PASS_DEPTH_PASS',
301 'default': 'GL_KEEP',
307 'func': 'StencilFuncSeparate',
310 'name': 'stencil_front_func',
312 'enum': 'GL_STENCIL_FUNC',
313 'default': 'GL_ALWAYS',
316 'name': 'stencil_front_ref',
318 'enum': 'GL_STENCIL_REF',
322 'name': 'stencil_front_mask',
324 'enum': 'GL_STENCIL_VALUE_MASK',
325 'default': '0xFFFFFFFFU',
328 'name': 'stencil_back_func',
330 'enum': 'GL_STENCIL_BACK_FUNC',
331 'default': 'GL_ALWAYS',
334 'name': 'stencil_back_ref',
336 'enum': 'GL_STENCIL_BACK_REF',
340 'name': 'stencil_back_mask',
342 'enum': 'GL_STENCIL_BACK_VALUE_MASK',
343 'default': '0xFFFFFFFFU',
348 'type': 'NamedParameter',
352 'name': 'hint_generate_mipmap',
354 'enum': 'GL_GENERATE_MIPMAP_HINT',
355 'default': 'GL_DONT_CARE'
358 'name': 'hint_fragment_shader_derivative',
360 'enum': 'GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES',
361 'default': 'GL_DONT_CARE',
362 'extension_flag': 'oes_standard_derivatives'
367 'type': 'NamedParameter',
368 'func': 'PixelStorei',
371 'name': 'pack_alignment',
373 'enum': 'GL_PACK_ALIGNMENT',
377 'name': 'unpack_alignment',
379 'enum': 'GL_UNPACK_ALIGNMENT',
384 # TODO: Consider implemenenting these states
389 'enum': 'GL_LINE_WIDTH',
392 'name': 'line_width',
395 'range_checks': [{'check': "<= 0.0f", 'test_value': "0.0f"}],
401 'enum': 'GL_DEPTH_WRITEMASK',
403 {'name': 'depth_mask', 'type': 'GLboolean', 'default': 'true'},
405 'state_flag': 'framebuffer_state_.clear_state_dirty',
410 'enum': 'GL_SCISSOR_BOX',
412 # NOTE: These defaults reset at GLES2DecoderImpl::Initialization.
417 'expected': 'kViewportX',
423 'expected': 'kViewportY',
426 'name': 'scissor_width',
429 'expected': 'kViewportWidth',
432 'name': 'scissor_height',
435 'expected': 'kViewportHeight',
442 'enum': 'GL_VIEWPORT',
444 # NOTE: These defaults reset at GLES2DecoderImpl::Initialization.
446 'name': 'viewport_x',
449 'expected': 'kViewportX',
452 'name': 'viewport_y',
455 'expected': 'kViewportY',
458 'name': 'viewport_width',
461 'expected': 'kViewportWidth',
464 'name': 'viewport_height',
467 'expected': 'kViewportHeight',
473 # This is a list of enum names and their valid values. It is used to map
474 # GLenum arguments to a specific set of valid values.
483 'GL_LINEAR_MIPMAP_LINEAR',
486 'FrameBufferTarget': {
492 'GL_DRAW_FRAMEBUFFER' ,
493 'GL_READ_FRAMEBUFFER' ,
496 'RenderBufferTarget': {
509 'GL_ELEMENT_ARRAY_BUFFER',
526 'CompressedTextureFormat': {
534 # NOTE: State an Capability entries added later.
536 'GL_ALIASED_LINE_WIDTH_RANGE',
537 'GL_ALIASED_POINT_SIZE_RANGE',
539 'GL_ARRAY_BUFFER_BINDING',
541 'GL_COMPRESSED_TEXTURE_FORMATS',
542 'GL_CURRENT_PROGRAM',
545 'GL_ELEMENT_ARRAY_BUFFER_BINDING',
546 'GL_FRAMEBUFFER_BINDING',
547 'GL_GENERATE_MIPMAP_HINT',
549 'GL_IMPLEMENTATION_COLOR_READ_FORMAT',
550 'GL_IMPLEMENTATION_COLOR_READ_TYPE',
551 'GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS',
552 'GL_MAX_CUBE_MAP_TEXTURE_SIZE',
553 'GL_MAX_FRAGMENT_UNIFORM_VECTORS',
554 'GL_MAX_RENDERBUFFER_SIZE',
555 'GL_MAX_TEXTURE_IMAGE_UNITS',
556 'GL_MAX_TEXTURE_SIZE',
557 'GL_MAX_VARYING_VECTORS',
558 'GL_MAX_VERTEX_ATTRIBS',
559 'GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS',
560 'GL_MAX_VERTEX_UNIFORM_VECTORS',
561 'GL_MAX_VIEWPORT_DIMS',
562 'GL_NUM_COMPRESSED_TEXTURE_FORMATS',
563 'GL_NUM_SHADER_BINARY_FORMATS',
566 'GL_RENDERBUFFER_BINDING',
568 'GL_SAMPLE_COVERAGE_INVERT',
569 'GL_SAMPLE_COVERAGE_VALUE',
572 'GL_SHADER_BINARY_FORMATS',
573 'GL_SHADER_COMPILER',
576 'GL_TEXTURE_BINDING_2D',
577 'GL_TEXTURE_BINDING_CUBE_MAP',
578 'GL_UNPACK_ALIGNMENT',
579 'GL_UNPACK_FLIP_Y_CHROMIUM',
580 'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM',
581 'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM',
582 # we can add this because we emulate it if the driver does not support it.
583 'GL_VERTEX_ARRAY_BINDING_OES',
590 'GetTexParamTarget': {
594 'GL_TEXTURE_CUBE_MAP',
597 'GL_PROXY_TEXTURE_CUBE_MAP',
604 'GL_TEXTURE_CUBE_MAP_POSITIVE_X',
605 'GL_TEXTURE_CUBE_MAP_NEGATIVE_X',
606 'GL_TEXTURE_CUBE_MAP_POSITIVE_Y',
607 'GL_TEXTURE_CUBE_MAP_NEGATIVE_Y',
608 'GL_TEXTURE_CUBE_MAP_POSITIVE_Z',
609 'GL_TEXTURE_CUBE_MAP_NEGATIVE_Z',
612 'GL_PROXY_TEXTURE_CUBE_MAP',
615 'TextureBindTarget': {
619 'GL_TEXTURE_CUBE_MAP',
630 'GL_FRAGMENT_SHADER',
633 'GL_GEOMETRY_SHADER',
669 'GL_FUNC_REVERSE_SUBTRACT',
682 'GL_ONE_MINUS_SRC_COLOR',
684 'GL_ONE_MINUS_DST_COLOR',
686 'GL_ONE_MINUS_SRC_ALPHA',
688 'GL_ONE_MINUS_DST_ALPHA',
690 'GL_ONE_MINUS_CONSTANT_COLOR',
692 'GL_ONE_MINUS_CONSTANT_ALPHA',
693 'GL_SRC_ALPHA_SATURATE',
702 'GL_ONE_MINUS_SRC_COLOR',
704 'GL_ONE_MINUS_DST_COLOR',
706 'GL_ONE_MINUS_SRC_ALPHA',
708 'GL_ONE_MINUS_DST_ALPHA',
710 'GL_ONE_MINUS_CONSTANT_COLOR',
712 'GL_ONE_MINUS_CONSTANT_ALPHA',
717 'valid': ["GL_%s" % cap['name'].upper() for cap in _CAPABILITY_FLAGS],
764 'GL_COLOR_ATTACHMENT0',
765 'GL_DEPTH_ATTACHMENT',
766 'GL_STENCIL_ATTACHMENT',
769 'BackbufferAttachment': {
784 'GL_PIXEL_PACK_BUFFER',
787 'FrameBufferParameter': {
790 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE',
791 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME',
792 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL',
793 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE',
796 'ProgramParameter': {
801 'GL_VALIDATE_STATUS',
802 'GL_INFO_LOG_LENGTH',
803 'GL_ATTACHED_SHADERS',
804 'GL_ACTIVE_ATTRIBUTES',
805 'GL_ACTIVE_ATTRIBUTE_MAX_LENGTH',
806 'GL_ACTIVE_UNIFORMS',
807 'GL_ACTIVE_UNIFORM_MAX_LENGTH',
810 'QueryObjectParameter': {
813 'GL_QUERY_RESULT_EXT',
814 'GL_QUERY_RESULT_AVAILABLE_EXT',
820 'GL_CURRENT_QUERY_EXT',
826 'GL_ANY_SAMPLES_PASSED_EXT',
827 'GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT',
828 'GL_COMMANDS_ISSUED_CHROMIUM',
829 'GL_LATENCY_QUERY_CHROMIUM',
830 'GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM',
831 'GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM',
834 'RenderBufferParameter': {
837 'GL_RENDERBUFFER_RED_SIZE',
838 'GL_RENDERBUFFER_GREEN_SIZE',
839 'GL_RENDERBUFFER_BLUE_SIZE',
840 'GL_RENDERBUFFER_ALPHA_SIZE',
841 'GL_RENDERBUFFER_DEPTH_SIZE',
842 'GL_RENDERBUFFER_STENCIL_SIZE',
843 'GL_RENDERBUFFER_WIDTH',
844 'GL_RENDERBUFFER_HEIGHT',
845 'GL_RENDERBUFFER_INTERNAL_FORMAT',
854 'GL_INFO_LOG_LENGTH',
855 'GL_SHADER_SOURCE_LENGTH',
856 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE',
876 'GL_SHADING_LANGUAGE_VERSION',
880 'TextureParameter': {
883 'GL_TEXTURE_MAG_FILTER',
884 'GL_TEXTURE_MIN_FILTER',
885 'GL_TEXTURE_POOL_CHROMIUM',
890 'GL_GENERATE_MIPMAP',
896 'GL_TEXTURE_POOL_MANAGED_CHROMIUM',
897 'GL_TEXTURE_POOL_UNMANAGED_CHROMIUM',
904 'GL_MIRRORED_REPEAT',
908 'TextureMinFilterMode': {
913 'GL_NEAREST_MIPMAP_NEAREST',
914 'GL_LINEAR_MIPMAP_NEAREST',
915 'GL_NEAREST_MIPMAP_LINEAR',
916 'GL_LINEAR_MIPMAP_LINEAR',
919 'TextureMagFilterMode': {
930 'GL_FRAMEBUFFER_ATTACHMENT_ANGLE',
936 # some enum that the decoder actually passes through to GL needs
937 # to be the first listed here since it's used in unit tests.
938 'GL_VERTEX_ATTRIB_ARRAY_NORMALIZED',
939 'GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING',
940 'GL_VERTEX_ATTRIB_ARRAY_ENABLED',
941 'GL_VERTEX_ATTRIB_ARRAY_SIZE',
942 'GL_VERTEX_ATTRIB_ARRAY_STRIDE',
943 'GL_VERTEX_ATTRIB_ARRAY_TYPE',
944 'GL_CURRENT_VERTEX_ATTRIB',
950 'GL_VERTEX_ATTRIB_ARRAY_POINTER',
956 'GL_GENERATE_MIPMAP_HINT',
959 'GL_PERSPECTIVE_CORRECTION_HINT',
974 'GL_UNPACK_ALIGNMENT',
975 'GL_UNPACK_FLIP_Y_CHROMIUM',
976 'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM',
977 'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM',
980 'GL_PACK_SWAP_BYTES',
981 'GL_UNPACK_SWAP_BYTES',
984 'PixelStoreAlignment': {
1009 'GL_UNSIGNED_SHORT_5_6_5',
1010 'GL_UNSIGNED_SHORT_4_4_4_4',
1011 'GL_UNSIGNED_SHORT_5_5_5_1',
1022 'GL_UNSIGNED_SHORT_5_6_5',
1023 'GL_UNSIGNED_SHORT_4_4_4_4',
1024 'GL_UNSIGNED_SHORT_5_5_5_1',
1031 'RenderBufferFormat': {
1037 'GL_DEPTH_COMPONENT16',
1038 'GL_STENCIL_INDEX8',
1041 'ShaderBinaryFormat': {
1064 'GL_LUMINANCE_ALPHA',
1073 'TextureInternalFormat': {
1078 'GL_LUMINANCE_ALPHA',
1087 'TextureInternalFormatStorage': {
1094 'GL_LUMINANCE8_EXT',
1095 'GL_LUMINANCE8_ALPHA8_EXT',
1100 'VertexAttribType': {
1106 'GL_UNSIGNED_SHORT',
1107 # 'GL_FIXED', // This is not available on Desktop GL.
1123 'VertexAttribSize': {
1146 'type': 'GLboolean',
1157 'GL_GUILTY_CONTEXT_RESET_ARB',
1158 'GL_INNOCENT_CONTEXT_RESET_ARB',
1159 'GL_UNKNOWN_CONTEXT_RESET_ARB',
1164 # This table specifies the different pepper interfaces that are supported for
1165 # GL commands. 'dev' is true if it's a dev interface.
1166 _PEPPER_INTERFACES = [
1167 {'name': '', 'dev': False},
1168 {'name': 'InstancedArrays', 'dev': False},
1169 {'name': 'FramebufferBlit', 'dev': False},
1170 {'name': 'FramebufferMultisample', 'dev': False},
1171 {'name': 'ChromiumEnableFeature', 'dev': False},
1172 {'name': 'ChromiumMapSub', 'dev': False},
1173 {'name': 'Query', 'dev': False},
1176 # This table specifies types and other special data for the commands that
1177 # will be generated.
1179 # Must match function names specified in "cmd_buffer_functions.txt".
1181 # cmd_comment: A comment added to the cmd format.
1182 # type: defines which handler will be used to generate code.
1183 # decoder_func: defines which function to call in the decoder to execute the
1184 # corresponding GL command. If not specified the GL command will
1185 # be called directly.
1186 # gl_test_func: GL function that is expected to be called when testing.
1187 # cmd_args: The arguments to use for the command. This overrides generating
1188 # them based on the GL function arguments.
1189 # a NonImmediate type is a type that stays a pointer even in
1190 # and immediate version of acommand.
1191 # gen_cmd: Whether or not this function geneates a command. Default = True.
1192 # immediate: Whether or not to generate an immediate command for the GL
1193 # function. The default is if there is exactly 1 pointer argument
1194 # in the GL function an immediate command is generated.
1195 # bucket: True to generate a bucket version of the command.
1196 # impl_func: Whether or not to generate the GLES2Implementation part of this
1198 # impl_decl: Whether or not to generate the GLES2Implementation declaration
1200 # needs_size: If true a data_size field is added to the command.
1201 # data_type: The type of data the command uses. For PUTn or PUT types.
1202 # count: The number of units per element. For PUTn or PUT types.
1203 # unit_test: If False no service side unit test will be generated.
1204 # client_test: If False no client side unit test will be generated.
1205 # expectation: If False the unit test will have no expected calls.
1206 # gen_func: Name of function that generates GL resource for corresponding
1208 # states: array of states that get set by this function corresponding to
1209 # the given arguments
1210 # state_flag: name of flag that is set to true when function is called.
1211 # no_gl: no GL function is called.
1212 # valid_args: A dictionary of argument indices to args to use in unit tests
1213 # when they can not be automatically determined.
1214 # pepper_interface: The pepper interface that is used for this extension
1215 # pepper_args: A string representing the argument list (what would appear in
1216 # C/C++ between the parentheses for the function declaration)
1217 # that the Pepper API expects for this function. Use this only if
1218 # the stable Pepper API differs from the GLES2 argument list.
1219 # invalid_test: False if no invalid test needed.
1220 # shadowed: True = the value is shadowed so no glGetXXX call will be made.
1221 # first_element_only: For PUT types, True if only the first element of an
1222 # array is used and we end up calling the single value
1223 # corresponding function. eg. TexParameteriv -> TexParameteri
1227 'decoder_func': 'DoActiveTexture',
1230 'client_test': False,
1232 'AttachShader': {'decoder_func': 'DoAttachShader'},
1233 'BindAttribLocation': {
1241 'decoder_func': 'DoBindBuffer',
1242 'gen_func': 'GenBuffersARB',
1244 'BindFramebuffer': {
1246 'decoder_func': 'DoBindFramebuffer',
1247 'gl_test_func': 'glBindFramebufferEXT',
1248 'gen_func': 'GenFramebuffersEXT',
1250 'BindRenderbuffer': {
1252 'decoder_func': 'DoBindRenderbuffer',
1253 'gl_test_func': 'glBindRenderbufferEXT',
1254 'gen_func': 'GenRenderbuffersEXT',
1258 'decoder_func': 'DoBindTexture',
1259 'gen_func': 'GenTextures',
1260 # TODO(gman): remove this once client side caching works.
1261 'client_test': False,
1263 'BlitFramebufferEXT': {
1264 'decoder_func': 'DoBlitFramebufferEXT',
1267 'pepper_interface': 'FramebufferBlit',
1268 'defer_reads': True,
1269 'defer_draws': True,
1274 'client_test': False,
1278 'client_test': False,
1279 'decoder_func': 'DoBufferSubData',
1282 'CheckFramebufferStatus': {
1284 'decoder_func': 'DoCheckFramebufferStatus',
1285 'gl_test_func': 'glCheckFramebufferStatusEXT',
1286 'error_value': 'GL_FRAMEBUFFER_UNSUPPORTED',
1287 'result': ['GLenum'],
1290 'decoder_func': 'DoClear',
1291 'defer_draws': True,
1295 'state': 'ClearColor',
1299 'state': 'ClearDepthf',
1300 'decoder_func': 'glClearDepth',
1301 'gl_test_func': 'glClearDepth',
1308 'state': 'ColorMask',
1310 'expectation': False,
1312 'ConsumeTextureCHROMIUM': {
1313 'decoder_func': 'DoConsumeTextureCHROMIUM',
1315 'data_type': 'GLbyte',
1323 'state': 'ClearStencil',
1325 'EnableFeatureCHROMIUM': {
1328 'decoder_func': 'DoEnableFeatureCHROMIUM',
1329 'expectation': False,
1330 'cmd_args': 'GLuint bucket_id, GLint* result',
1331 'result': ['GLint'],
1334 'pepper_interface': 'ChromiumEnableFeature',
1336 'CompileShader': {'decoder_func': 'DoCompileShader', 'unit_test': False},
1337 'CompressedTexImage2D': {
1342 'CompressedTexSubImage2D': {
1345 'decoder_func': 'DoCompressedTexSubImage2D',
1349 'decoder_func': 'DoCopyTexImage2D',
1351 'defer_reads': True,
1353 'CopyTexSubImage2D': {
1354 'decoder_func': 'DoCopyTexSubImage2D',
1355 'defer_reads': True,
1357 'CreateImageCHROMIUM': {
1359 'cmd_args': 'GLsizei width, GLsizei height, GLenum internalformat',
1360 'result': ['GLuint'],
1361 'client_test': False,
1363 'expectation': False,
1367 'DestroyImageCHROMIUM': {
1370 'client_test': False,
1375 'GetImageParameterivCHROMIUM': {
1377 'client_test': False,
1379 'expectation': False,
1385 'client_test': False,
1389 'client_test': False,
1393 'state': 'BlendColor',
1396 'type': 'StateSetRGBAlpha',
1397 'state': 'BlendEquation',
1399 '0': 'GL_FUNC_SUBTRACT'
1402 'BlendEquationSeparate': {
1404 'state': 'BlendEquation',
1406 '0': 'GL_FUNC_SUBTRACT'
1410 'type': 'StateSetRGBAlpha',
1411 'state': 'BlendFunc',
1413 'BlendFuncSeparate': {
1415 'state': 'BlendFunc',
1417 'SampleCoverage': {'decoder_func': 'DoSampleCoverage'},
1419 'type': 'StateSetFrontBack',
1420 'state': 'StencilFunc',
1422 'StencilFuncSeparate': {
1423 'type': 'StateSetFrontBackSeparate',
1424 'state': 'StencilFunc',
1427 'type': 'StateSetFrontBack',
1428 'state': 'StencilOp',
1433 'StencilOpSeparate': {
1434 'type': 'StateSetFrontBackSeparate',
1435 'state': 'StencilOp',
1441 'type': 'StateSetNamedParameter',
1444 'CullFace': {'type': 'StateSet', 'state': 'CullFace'},
1445 'FrontFace': {'type': 'StateSet', 'state': 'FrontFace'},
1446 'DepthFunc': {'type': 'StateSet', 'state': 'DepthFunc'},
1449 'state': 'LineWidth',
1456 'state': 'PolygonOffset',
1460 'gl_test_func': 'glDeleteBuffersARB',
1461 'resource_type': 'Buffer',
1462 'resource_types': 'Buffers',
1464 'DeleteFramebuffers': {
1466 'gl_test_func': 'glDeleteFramebuffersEXT',
1467 'resource_type': 'Framebuffer',
1468 'resource_types': 'Framebuffers',
1470 'DeleteProgram': {'type': 'Delete', 'decoder_func': 'DoDeleteProgram'},
1471 'DeleteRenderbuffers': {
1473 'gl_test_func': 'glDeleteRenderbuffersEXT',
1474 'resource_type': 'Renderbuffer',
1475 'resource_types': 'Renderbuffers',
1477 'DeleteShader': {'type': 'Delete', 'decoder_func': 'DoDeleteShader'},
1478 'DeleteSharedIdsCHROMIUM': {
1480 'decoder_func': 'DoDeleteSharedIdsCHROMIUM',
1482 'expectation': False,
1489 'resource_type': 'Texture',
1490 'resource_types': 'Textures',
1493 'decoder_func': 'DoDepthRangef',
1494 'gl_test_func': 'glDepthRange',
1498 'state': 'DepthMask',
1500 'expectation': False,
1502 'DetachShader': {'decoder_func': 'DoDetachShader'},
1504 'decoder_func': 'DoDisable',
1506 'client_test': False,
1508 'DisableVertexAttribArray': {
1509 'decoder_func': 'DoDisableVertexAttribArray',
1514 'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count',
1515 'defer_draws': True,
1519 'cmd_args': 'GLenumDrawMode mode, GLsizei count, '
1520 'GLenumIndexType type, GLuint index_offset',
1521 'client_test': False,
1522 'defer_draws': True,
1525 'decoder_func': 'DoEnable',
1527 'client_test': False,
1529 'EnableVertexAttribArray': {
1530 'decoder_func': 'DoEnableVertexAttribArray',
1535 'client_test': False,
1536 'decoder_func': 'DoFinish',
1537 'defer_reads': True,
1541 'decoder_func': 'DoFlush',
1543 'FramebufferRenderbuffer': {
1544 'decoder_func': 'DoFramebufferRenderbuffer',
1545 'gl_test_func': 'glFramebufferRenderbufferEXT',
1547 'FramebufferTexture2D': {
1548 'decoder_func': 'DoFramebufferTexture2D',
1549 'gl_test_func': 'glFramebufferTexture2DEXT',
1551 'FramebufferTexture2DMultisampleEXT': {
1552 'decoder_func': 'DoFramebufferTexture2DMultisample',
1553 'gl_test_func': 'glFramebufferTexture2DMultisampleEXT',
1554 'expectation': False,
1559 'decoder_func': 'DoGenerateMipmap',
1560 'gl_test_func': 'glGenerateMipmapEXT',
1564 'gl_test_func': 'glGenBuffersARB',
1565 'resource_type': 'Buffer',
1566 'resource_types': 'Buffers',
1568 'GenMailboxCHROMIUM': {
1569 'type': 'HandWritten',
1575 'GenFramebuffers': {
1577 'gl_test_func': 'glGenFramebuffersEXT',
1578 'resource_type': 'Framebuffer',
1579 'resource_types': 'Framebuffers',
1581 'GenRenderbuffers': {
1582 'type': 'GENn', 'gl_test_func': 'glGenRenderbuffersEXT',
1583 'resource_type': 'Renderbuffer',
1584 'resource_types': 'Renderbuffers',
1588 'gl_test_func': 'glGenTextures',
1589 'resource_type': 'Texture',
1590 'resource_types': 'Textures',
1592 'GenSharedIdsCHROMIUM': {
1594 'decoder_func': 'DoGenSharedIdsCHROMIUM',
1596 'expectation': False,
1601 'GetActiveAttrib': {
1605 'GLidProgram program, GLuint index, uint32 name_bucket_id, '
1613 'GetActiveUniform': {
1617 'GLidProgram program, GLuint index, uint32 name_bucket_id, '
1625 'GetAttachedShaders': {
1628 'cmd_args': 'GLidProgram program, void* result, uint32 result_size',
1629 'result': ['SizedResult<GLuint>'],
1631 'GetAttribLocation': {
1632 'type': 'HandWritten',
1637 'GLidProgram program, const char* name, NonImmediate GLint* location',
1638 'result': ['GLint'],
1639 'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml
1643 'result': ['SizedResult<GLboolean>'],
1644 'decoder_func': 'DoGetBooleanv',
1645 'gl_test_func': 'glGetBooleanv',
1647 'GetBufferParameteriv': {
1649 'result': ['SizedResult<GLint>'],
1650 'decoder_func': 'DoGetBufferParameteriv',
1651 'expectation': False,
1656 'decoder_func': 'GetErrorState()->GetGLError',
1658 'result': ['GLenum'],
1659 'client_test': False,
1663 'result': ['SizedResult<GLfloat>'],
1664 'decoder_func': 'DoGetFloatv',
1665 'gl_test_func': 'glGetFloatv',
1667 'GetFramebufferAttachmentParameteriv': {
1669 'decoder_func': 'DoGetFramebufferAttachmentParameteriv',
1670 'gl_test_func': 'glGetFramebufferAttachmentParameterivEXT',
1671 'result': ['SizedResult<GLint>'],
1675 'result': ['SizedResult<GLint>'],
1676 'decoder_func': 'DoGetIntegerv',
1677 'client_test': False,
1679 'GetMaxValueInBufferCHROMIUM': {
1681 'decoder_func': 'DoGetMaxValueInBufferCHROMIUM',
1682 'result': ['GLuint'],
1684 'client_test': False,
1689 'GetMultipleIntegervCHROMIUM': {
1692 'expectation': False,
1695 'client_test': False,
1699 'decoder_func': 'DoGetProgramiv',
1700 'result': ['SizedResult<GLint>'],
1701 'expectation': False,
1703 'GetProgramInfoCHROMIUM': {
1706 'expectation': False,
1710 'client_test': False,
1711 'cmd_args': 'GLidProgram program, uint32 bucket_id',
1713 'uint32 link_status',
1714 'uint32 num_attribs',
1715 'uint32 num_uniforms',
1718 'GetProgramInfoLog': {
1720 'expectation': False,
1722 'GetRenderbufferParameteriv': {
1724 'decoder_func': 'DoGetRenderbufferParameteriv',
1725 'gl_test_func': 'glGetRenderbufferParameterivEXT',
1726 'result': ['SizedResult<GLint>'],
1730 'decoder_func': 'DoGetShaderiv',
1731 'result': ['SizedResult<GLint>'],
1733 'GetShaderInfoLog': {
1735 'get_len_func': 'glGetShaderiv',
1736 'get_len_enum': 'GL_INFO_LOG_LENGTH',
1739 'GetShaderPrecisionFormat': {
1743 'GLenumShaderType shadertype, GLenumShaderPrecision precisiontype, '
1752 'GetShaderSource': {
1754 'get_len_func': 'DoGetShaderiv',
1755 'get_len_enum': 'GL_SHADER_SOURCE_LENGTH',
1757 'client_test': False,
1761 'client_test': False,
1762 'cmd_args': 'GLenumStringType name, uint32 bucket_id',
1764 'GetTexParameterfv': {'type': 'GETn', 'result': ['SizedResult<GLfloat>']},
1765 'GetTexParameteriv': {'type': 'GETn', 'result': ['SizedResult<GLint>']},
1766 'GetTranslatedShaderSourceANGLE': {
1768 'get_len_func': 'DoGetShaderiv',
1769 'get_len_enum': 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE',
1776 'result': ['SizedResult<GLfloat>'],
1781 'result': ['SizedResult<GLint>'],
1783 'GetUniformLocation': {
1784 'type': 'HandWritten',
1789 'GLidProgram program, const char* name, NonImmediate GLint* location',
1790 'result': ['GLint'],
1791 'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml
1793 'GetVertexAttribfv': {
1795 'result': ['SizedResult<GLfloat>'],
1797 'decoder_func': 'DoGetVertexAttribfv',
1798 'expectation': False,
1799 'client_test': False,
1801 'GetVertexAttribiv': {
1803 'result': ['SizedResult<GLint>'],
1805 'decoder_func': 'DoGetVertexAttribiv',
1806 'expectation': False,
1807 'client_test': False,
1809 'GetVertexAttribPointerv': {
1812 'result': ['SizedResult<GLuint>'],
1813 'client_test': False,
1817 'decoder_func': 'DoIsBuffer',
1818 'expectation': False,
1822 'decoder_func': 'DoIsEnabled',
1824 'expectation': False,
1828 'decoder_func': 'DoIsFramebuffer',
1829 'expectation': False,
1833 'decoder_func': 'DoIsProgram',
1834 'expectation': False,
1838 'decoder_func': 'DoIsRenderbuffer',
1839 'expectation': False,
1843 'decoder_func': 'DoIsShader',
1844 'expectation': False,
1848 'decoder_func': 'DoIsTexture',
1849 'expectation': False,
1852 'decoder_func': 'DoLinkProgram',
1855 'MapBufferCHROMIUM': {
1859 'client_test': False,
1861 'MapBufferSubDataCHROMIUM': {
1865 'client_test': False,
1866 'pepper_interface': 'ChromiumMapSub',
1868 'MapImageCHROMIUM': {
1872 'client_test': False,
1874 'MapTexSubImage2DCHROMIUM': {
1878 'client_test': False,
1879 'pepper_interface': 'ChromiumMapSub',
1881 'PixelStorei': {'type': 'Manual'},
1882 'PostSubBufferCHROMIUM': {
1886 'client_test': False,
1890 'ProduceTextureCHROMIUM': {
1891 'decoder_func': 'DoProduceTextureCHROMIUM',
1893 'data_type': 'GLbyte',
1899 'RenderbufferStorage': {
1900 'decoder_func': 'DoRenderbufferStorage',
1901 'gl_test_func': 'glRenderbufferStorageEXT',
1902 'expectation': False,
1904 'RenderbufferStorageMultisampleEXT': {
1905 'decoder_func': 'DoRenderbufferStorageMultisample',
1906 'gl_test_func': 'glRenderbufferStorageMultisampleEXT',
1907 'expectation': False,
1910 'pepper_interface': 'FramebufferMultisample',
1914 '// ReadPixels has the result separated from the pixel buffer so that\n'
1915 '// it is easier to specify the result going to some specific place\n'
1916 '// that exactly fits the rectangle of pixels.\n',
1920 'client_test': False,
1922 'GLint x, GLint y, GLsizei width, GLsizei height, '
1923 'GLenumReadPixelFormat format, GLenumReadPixelType type, '
1924 'uint32 pixels_shm_id, uint32 pixels_shm_offset, '
1925 'uint32 result_shm_id, uint32 result_shm_offset, '
1927 'result': ['uint32'],
1928 'defer_reads': True,
1930 'RegisterSharedIdsCHROMIUM': {
1932 'decoder_func': 'DoRegisterSharedIdsCHROMIUM',
1934 'expectation': False,
1939 'ReleaseShaderCompiler': {
1940 'decoder_func': 'DoReleaseShaderCompiler',
1945 'client_test': False,
1952 'client_test': False,
1954 'GLuint shader, const char* data',
1956 'GLuint shader, GLsizei count, const char** str, const GLint* length',
1959 'type': 'StateSetFrontBack',
1960 'state': 'StencilMask',
1962 'expectation': False,
1964 'StencilMaskSeparate': {
1965 'type': 'StateSetFrontBackSeparate',
1966 'state': 'StencilMask',
1968 'expectation': False,
1972 'decoder_func': 'DoSwapBuffers',
1974 'client_test': False,
1980 'client_test': False,
1983 'decoder_func': 'DoTexParameterf',
1984 'gl_test_func': 'glTexParameteri',
1990 'decoder_func': 'DoTexParameteri',
1997 'data_type': 'GLfloat',
1998 'data_value': 'GL_NEAREST',
2000 'decoder_func': 'DoTexParameterfv',
2001 'gl_test_func': 'glTexParameteri',
2002 'first_element_only': True,
2006 'data_type': 'GLint',
2007 'data_value': 'GL_NEAREST',
2009 'decoder_func': 'DoTexParameteriv',
2010 'gl_test_func': 'glTexParameteri',
2011 'first_element_only': True,
2016 'client_test': False,
2017 'cmd_args': 'GLenumTextureTarget target, GLint level, '
2018 'GLint xoffset, GLint yoffset, '
2019 'GLsizei width, GLsizei height, '
2020 'GLenumTextureFormat format, GLenumPixelType type, '
2021 'const void* pixels, GLboolean internal'
2023 'Uniform1f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 1},
2026 'data_type': 'GLfloat',
2028 'decoder_func': 'DoUniform1fv',
2030 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False},
2033 'data_type': 'GLint',
2035 'decoder_func': 'DoUniform1iv',
2038 'Uniform2i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 2},
2039 'Uniform2f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 2},
2042 'data_type': 'GLfloat',
2044 'decoder_func': 'DoUniform2fv',
2048 'data_type': 'GLint',
2050 'decoder_func': 'DoUniform2iv',
2052 'Uniform3i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 3},
2053 'Uniform3f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 3},
2056 'data_type': 'GLfloat',
2058 'decoder_func': 'DoUniform3fv',
2062 'data_type': 'GLint',
2064 'decoder_func': 'DoUniform3iv',
2066 'Uniform4i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 4},
2067 'Uniform4f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 4},
2070 'data_type': 'GLfloat',
2072 'decoder_func': 'DoUniform4fv',
2076 'data_type': 'GLint',
2078 'decoder_func': 'DoUniform4iv',
2080 'UniformMatrix2fv': {
2082 'data_type': 'GLfloat',
2084 'decoder_func': 'DoUniformMatrix2fv',
2086 'UniformMatrix3fv': {
2088 'data_type': 'GLfloat',
2090 'decoder_func': 'DoUniformMatrix3fv',
2092 'UniformMatrix4fv': {
2094 'data_type': 'GLfloat',
2096 'decoder_func': 'DoUniformMatrix4fv',
2098 'UnmapBufferCHROMIUM': {
2102 'client_test': False,
2104 'UnmapBufferSubDataCHROMIUM': {
2108 'client_test': False,
2109 'pepper_interface': 'ChromiumMapSub',
2111 'UnmapImageCHROMIUM': {
2115 'client_test': False,
2117 'UnmapTexSubImage2DCHROMIUM': {
2121 'client_test': False,
2122 'pepper_interface': 'ChromiumMapSub',
2125 'decoder_func': 'DoUseProgram',
2129 'ValidateProgram': {'decoder_func': 'DoValidateProgram'},
2130 'VertexAttrib1f': {'decoder_func': 'DoVertexAttrib1f'},
2131 'VertexAttrib1fv': {
2133 'data_type': 'GLfloat',
2135 'decoder_func': 'DoVertexAttrib1fv',
2137 'VertexAttrib2f': {'decoder_func': 'DoVertexAttrib2f'},
2138 'VertexAttrib2fv': {
2140 'data_type': 'GLfloat',
2142 'decoder_func': 'DoVertexAttrib2fv',
2144 'VertexAttrib3f': {'decoder_func': 'DoVertexAttrib3f'},
2145 'VertexAttrib3fv': {
2147 'data_type': 'GLfloat',
2149 'decoder_func': 'DoVertexAttrib3fv',
2151 'VertexAttrib4f': {'decoder_func': 'DoVertexAttrib4f'},
2152 'VertexAttrib4fv': {
2154 'data_type': 'GLfloat',
2156 'decoder_func': 'DoVertexAttrib4fv',
2158 'VertexAttribPointer': {
2160 'cmd_args': 'GLuint indx, GLintVertexAttribSize size, '
2161 'GLenumVertexAttribType type, GLboolean normalized, '
2162 'GLsizei stride, GLuint offset',
2163 'client_test': False,
2170 'decoder_func': 'DoViewport',
2179 'GetRequestableExtensionsCHROMIUM': {
2183 'cmd_args': 'uint32 bucket_id',
2187 'RequestExtensionCHROMIUM': {
2191 'client_test': False,
2192 'cmd_args': 'uint32 bucket_id',
2196 'RateLimitOffscreenContextCHROMIUM': {
2200 'client_test': False,
2202 'CreateStreamTextureCHROMIUM': {
2204 'cmd_args': 'GLuint client_id, void* result',
2205 'result': ['GLuint'],
2208 'expectation': False,
2211 'client_test': False,
2213 'DestroyStreamTextureCHROMIUM': {
2216 'expectation': False,
2220 'TexImageIOSurface2DCHROMIUM': {
2221 'decoder_func': 'DoTexImageIOSurface2DCHROMIUM',
2226 'CopyTextureCHROMIUM': {
2227 'decoder_func': 'DoCopyTextureCHROMIUM',
2232 'TexStorage2DEXT': {
2235 'decoder_func': 'DoTexStorage2DEXT',
2237 'DrawArraysInstancedANGLE': {
2239 'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count, '
2240 'GLsizei primcount',
2243 'pepper_interface': 'InstancedArrays',
2244 'defer_draws': True,
2248 'decoder_func': 'DoDrawBuffersEXT',
2249 'data_type': 'GLenum',
2251 'client_test': False,
2255 'DrawElementsInstancedANGLE': {
2257 'cmd_args': 'GLenumDrawMode mode, GLsizei count, '
2258 'GLenumIndexType type, GLuint index_offset, GLsizei primcount',
2261 'client_test': False,
2262 'pepper_interface': 'InstancedArrays',
2263 'defer_draws': True,
2265 'VertexAttribDivisorANGLE': {
2267 'cmd_args': 'GLuint index, GLuint divisor',
2270 'pepper_interface': 'InstancedArrays',
2274 'gl_test_func': 'glGenQueriesARB',
2275 'resource_type': 'Query',
2276 'resource_types': 'Queries',
2278 'pepper_interface': 'Query',
2280 'DeleteQueriesEXT': {
2282 'gl_test_func': 'glDeleteQueriesARB',
2283 'resource_type': 'Query',
2284 'resource_types': 'Queries',
2286 'pepper_interface': 'Query',
2290 'client_test': False,
2291 'pepper_interface': 'Query',
2295 'cmd_args': 'GLenumQueryTarget target, GLidQuery id, void* sync_data',
2297 'gl_test_func': 'glBeginQuery',
2298 'pepper_interface': 'Query',
2302 'cmd_args': 'GLenumQueryTarget target, GLuint submit_count',
2303 'gl_test_func': 'glEndnQuery',
2304 'client_test': False,
2305 'pepper_interface': 'Query',
2309 'client_test': False,
2310 'gl_test_func': 'glGetQueryiv',
2311 'pepper_interface': 'Query',
2313 'GetQueryObjectuivEXT': {
2315 'client_test': False,
2316 'gl_test_func': 'glGetQueryObjectuiv',
2317 'pepper_interface': 'Query',
2319 'BindUniformLocationCHROMIUM': {
2324 'gl_test_func': 'DoBindUniformLocationCHROMIUM',
2327 'InsertEventMarkerEXT': {
2329 'decoder_func': 'DoInsertEventMarkerEXT',
2330 'expectation': False,
2333 'PushGroupMarkerEXT': {
2335 'decoder_func': 'DoPushGroupMarkerEXT',
2336 'expectation': False,
2339 'PopGroupMarkerEXT': {
2340 'decoder_func': 'DoPopGroupMarkerEXT',
2341 'expectation': False,
2346 'GenVertexArraysOES': {
2349 'gl_test_func': 'glGenVertexArraysOES',
2350 'resource_type': 'VertexArray',
2351 'resource_types': 'VertexArrays',
2354 'BindVertexArrayOES': {
2357 'gl_test_func': 'glBindVertexArrayOES',
2358 'decoder_func': 'DoBindVertexArrayOES',
2359 'gen_func': 'GenVertexArraysOES',
2361 'client_test': False,
2363 'DeleteVertexArraysOES': {
2366 'gl_test_func': 'glDeleteVertexArraysOES',
2367 'resource_type': 'VertexArray',
2368 'resource_types': 'VertexArrays',
2371 'IsVertexArrayOES': {
2374 'gl_test_func': 'glIsVertexArrayOES',
2375 'decoder_func': 'DoIsVertexArrayOES',
2376 'expectation': False,
2379 'BindTexImage2DCHROMIUM': {
2380 'decoder_func': 'DoBindTexImage2DCHROMIUM',
2385 'ReleaseTexImage2DCHROMIUM': {
2386 'decoder_func': 'DoReleaseTexImage2DCHROMIUM',
2391 'ShallowFinishCHROMIUM': {
2396 'client_test': False,
2398 'ShallowFlushCHROMIUM': {
2403 'client_test': False,
2405 'TraceBeginCHROMIUM': {
2409 'client_test': False,
2410 'cmd_args': 'GLuint bucket_id',
2414 'TraceEndCHROMIUM': {
2417 'client_test': False,
2418 'decoder_func': 'DoTraceEndCHROMIUM',
2423 'AsyncTexImage2DCHROMIUM': {
2426 'client_test': False,
2430 'AsyncTexSubImage2DCHROMIUM': {
2433 'client_test': False,
2437 'WaitAsyncTexImage2DCHROMIUM': {
2440 'client_test': False,
2444 'DiscardFramebufferEXT': {
2447 'data_type': 'GLenum',
2448 'cmd_args': 'GLenum target, GLsizei count, '
2449 'const GLenum* attachments',
2450 'decoder_func': 'DoDiscardFramebufferEXT',
2452 'client_test': False,
2455 'LoseContextCHROMIUM': {
2461 'InsertSyncPointCHROMIUM': {
2462 'type': 'HandWritten',
2467 'WaitSyncPointCHROMIUM': {
2476 def Grouper(n, iterable, fillvalue=None):
2477 """Collect data into fixed-length chunks or blocks"""
2478 args = [iter(iterable)] * n
2479 return itertools.izip_longest(fillvalue=fillvalue, *args)
2482 def SplitWords(input_string):
2483 """Transforms a input_string into a list of lower-case components.
2486 input_string: the input string.
2489 a list of lower-case words.
2491 if input_string.find('_') > -1:
2492 # 'some_TEXT_' -> 'some text'
2493 return input_string.replace('_', ' ').strip().lower().split()
2495 if re.search('[A-Z]', input_string) and re.search('[a-z]', input_string):
2497 # look for capitalization to cut input_strings
2498 # 'SomeText' -> 'Some Text'
2499 input_string = re.sub('([A-Z])', r' \1', input_string).strip()
2500 # 'Vector3' -> 'Vector 3'
2501 input_string = re.sub('([^0-9])([0-9])', r'\1 \2', input_string)
2502 return input_string.lower().split()
2506 """Makes a lower-case identifier from words.
2509 words: a list of lower-case words.
2512 the lower-case identifier.
2514 return '_'.join(words)
2517 def ToUnderscore(input_string):
2518 """converts CamelCase to camel_case."""
2519 words = SplitWords(input_string)
2523 class CWriter(object):
2524 """Writes to a file formatting it for Google's style guidelines."""
2526 def __init__(self, filename):
2527 self.filename = filename
2531 def SetFileNum(self, num):
2532 """Used to help write number files and tests."""
2535 def Write(self, string):
2536 """Writes a string to a file spliting if it's > 80 characters."""
2537 lines = string.splitlines()
2538 num_lines = len(lines)
2539 for ii in range(0, num_lines):
2540 self.__WriteLine(lines[ii], ii < (num_lines - 1) or string[-1] == '\n')
2542 def __FindSplit(self, string):
2543 """Finds a place to split a string."""
2544 splitter = string.find('=')
2545 if splitter >= 1 and not string[splitter + 1] == '=' and splitter < 80:
2547 # parts = string.split('(')
2548 parts = re.split("(?<=[^\"])\((?!\")", string)
2549 fptr = re.compile('\*\w*\)')
2551 splitter = len(parts[0])
2552 for ii in range(1, len(parts)):
2553 # Don't split on the dot in "if (.condition)".
2554 if (not parts[ii - 1][-3:] == "if " and
2555 # Don't split "(.)" or "(.*fptr)".
2556 (len(parts[ii]) > 0 and
2557 not parts[ii][0] == ")" and not fptr.match(parts[ii]))
2560 splitter += len(parts[ii]) + 1
2565 splitter = string[0:end].rfind(',')
2566 if splitter < 0 or (splitter > 0 and string[splitter - 1] == '"'):
2567 return last_splitter
2568 elif splitter >= 80:
2573 def __WriteLine(self, line, ends_with_eol):
2574 """Given a signle line, writes it to a file, splitting if it's > 80 chars"""
2576 i = self.__FindSplit(line)
2578 line1 = line[0:i + 1]
2579 if line1[-1] == ' ':
2586 nolint = ' // NOLINT'
2587 self.__AddLine(line1 + nolint + lineend + '\n')
2588 match = re.match("( +)", line1)
2591 indent = match.group(1)
2593 if not splitter == ',':
2594 indent = " " + indent
2595 self.__WriteLine(indent + line[i + 1:].lstrip(), True)
2599 nolint = ' // NOLINT'
2600 self.__AddLine(line + nolint)
2602 self.__AddLine('\n')
2604 def __AddLine(self, line):
2605 self.content.append(line)
2608 """Close the file."""
2609 content = "".join(self.content)
2611 if os.path.exists(self.filename):
2612 old_file = open(self.filename, "rb");
2613 old_content = old_file.read()
2615 if content == old_content:
2618 file = open(self.filename, "wb")
2623 class CHeaderWriter(CWriter):
2624 """Writes a C Header file."""
2626 _non_alnum_re = re.compile(r'[^a-zA-Z0-9]')
2628 def __init__(self, filename, file_comment = None):
2629 CWriter.__init__(self, filename)
2631 base = os.path.abspath(filename)
2632 while os.path.basename(base) != 'src':
2633 new_base = os.path.dirname(base)
2634 assert new_base != base # Prevent infinite loop.
2637 hpath = os.path.relpath(filename, base)
2638 self.guard = self._non_alnum_re.sub('_', hpath).upper() + '_'
2640 self.Write(_LICENSE)
2641 self.Write(_DO_NOT_EDIT_WARNING)
2642 if not file_comment == None:
2643 self.Write(file_comment)
2644 self.Write("#ifndef %s\n" % self.guard)
2645 self.Write("#define %s\n\n" % self.guard)
2648 self.Write("#endif // %s\n\n" % self.guard)
2651 class TypeHandler(object):
2652 """This class emits code for a particular type of function."""
2654 _remove_expected_call_re = re.compile(r' EXPECT_CALL.*?;\n', re.S)
2659 def InitFunction(self, func):
2660 """Add or adjust anything type specific for this function."""
2661 if func.GetInfo('needs_size') and not func.name.endswith('Bucket'):
2662 func.AddCmdArg(DataSizeArgument('data_size'))
2664 def AddImmediateFunction(self, generator, func):
2665 """Adds an immediate version of a function."""
2666 # Generate an immediate command if there is only 1 pointer arg.
2667 immediate = func.GetInfo('immediate') # can be True, False or None
2668 if immediate == True or immediate == None:
2669 if func.num_pointer_args == 1 or immediate:
2670 generator.AddFunction(ImmediateFunction(func))
2672 def AddBucketFunction(self, generator, func):
2673 """Adds a bucket version of a function."""
2674 # Generate an immediate command if there is only 1 pointer arg.
2675 bucket = func.GetInfo('bucket') # can be True, False or None
2677 generator.AddFunction(BucketFunction(func))
2679 def WriteStruct(self, func, file):
2680 """Writes a structure that matches the arguments to a function."""
2681 comment = func.GetInfo('cmd_comment')
2682 if not comment == None:
2684 file.Write("struct %s {\n" % func.name)
2685 file.Write(" typedef %s ValueType;\n" % func.name)
2686 file.Write(" static const CommandId kCmdId = k%s;\n" % func.name)
2687 func.WriteCmdArgFlag(file)
2689 result = func.GetInfo('result')
2690 if not result == None:
2691 if len(result) == 1:
2692 file.Write(" typedef %s Result;\n\n" % result[0])
2694 file.Write(" struct Result {\n")
2696 file.Write(" %s;\n" % line)
2697 file.Write(" };\n\n")
2699 func.WriteCmdComputeSize(file)
2700 func.WriteCmdSetHeader(file)
2701 func.WriteCmdInit(file)
2702 func.WriteCmdSet(file)
2704 file.Write(" gpu::CommandHeader header;\n")
2705 args = func.GetCmdArgs()
2707 file.Write(" %s %s;\n" % (arg.cmd_type, arg.name))
2711 size = len(args) * _SIZE_OF_UINT32 + _SIZE_OF_COMMAND_HEADER
2712 file.Write("COMPILE_ASSERT(sizeof(%s) == %d,\n" % (func.name, size))
2713 file.Write(" Sizeof_%s_is_not_%d);\n" % (func.name, size))
2714 file.Write("COMPILE_ASSERT(offsetof(%s, header) == 0,\n" % func.name)
2715 file.Write(" OffsetOf_%s_header_not_0);\n" % func.name)
2716 offset = _SIZE_OF_COMMAND_HEADER
2718 file.Write("COMPILE_ASSERT(offsetof(%s, %s) == %d,\n" %
2719 (func.name, arg.name, offset))
2720 file.Write(" OffsetOf_%s_%s_not_%d);\n" %
2721 (func.name, arg.name, offset))
2722 offset += _SIZE_OF_UINT32
2723 if not result == None and len(result) > 1:
2726 parts = line.split()
2729 COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
2730 OffsetOf_%(cmd_name)s_Result_%(field_name)s_not_%(offset)d);
2732 file.Write((check.strip() + "\n") % {
2733 'cmd_name': func.name,
2737 offset += _SIZE_OF_UINT32
2740 def WriteHandlerImplementation(self, func, file):
2741 """Writes the handler implementation for this command."""
2742 file.Write(" %s(%s);\n" %
2743 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
2745 def WriteCmdSizeTest(self, func, file):
2746 """Writes the size test for a command."""
2747 file.Write(" EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n")
2749 def WriteFormatTest(self, func, file):
2750 """Writes a format test for a command."""
2751 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
2752 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
2753 (func.name, func.name))
2754 file.Write(" void* next_cmd = cmd.Set(\n")
2756 args = func.GetCmdArgs()
2757 for value, arg in enumerate(args):
2758 file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11))
2760 file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" %
2762 file.Write(" cmd.header.command);\n")
2763 func.type_handler.WriteCmdSizeTest(func, file)
2764 for value, arg in enumerate(args):
2765 file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
2766 (arg.type, value + 11, arg.name))
2767 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
2768 file.Write(" next_cmd, sizeof(cmd));\n")
2772 def WriteImmediateFormatTest(self, func, file):
2773 """Writes a format test for an immediate version of a command."""
2776 def WriteBucketFormatTest(self, func, file):
2777 """Writes a format test for a bucket version of a command."""
2780 def WriteGetDataSizeCode(self, func, file):
2781 """Writes the code to set data_size used in validation"""
2784 def WriteImmediateCmdSizeTest(self, func, file):
2785 """Writes a size test for an immediate version of a command."""
2786 file.Write(" // TODO(gman): Compute correct size.\n")
2787 file.Write(" EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n")
2789 def WriteImmediateHandlerImplementation (self, func, file):
2790 """Writes the handler impl for the immediate version of a command."""
2791 file.Write(" %s(%s);\n" %
2792 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
2794 def WriteBucketHandlerImplementation (self, func, file):
2795 """Writes the handler impl for the bucket version of a command."""
2796 file.Write(" %s(%s);\n" %
2797 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
2799 def WriteServiceImplementation(self, func, file):
2800 """Writes the service implementation for a command."""
2802 "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
2804 " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" %
2806 self.WriteHandlerDeferReadWrite(func, file);
2807 if len(func.GetOriginalArgs()) > 0:
2808 last_arg = func.GetLastOriginalArg()
2809 all_but_last_arg = func.GetOriginalArgs()[:-1]
2810 for arg in all_but_last_arg:
2811 arg.WriteGetCode(file)
2812 self.WriteGetDataSizeCode(func, file)
2813 last_arg.WriteGetCode(file)
2814 func.WriteHandlerValidation(file)
2815 func.WriteHandlerImplementation(file)
2816 file.Write(" return error::kNoError;\n")
2820 def WriteImmediateServiceImplementation(self, func, file):
2821 """Writes the service implementation for an immediate version of command."""
2823 "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
2825 " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" %
2827 self.WriteHandlerDeferReadWrite(func, file);
2828 last_arg = func.GetLastOriginalArg()
2829 all_but_last_arg = func.GetOriginalArgs()[:-1]
2830 for arg in all_but_last_arg:
2831 arg.WriteGetCode(file)
2832 self.WriteGetDataSizeCode(func, file)
2833 last_arg.WriteGetCode(file)
2834 func.WriteHandlerValidation(file)
2835 func.WriteHandlerImplementation(file)
2836 file.Write(" return error::kNoError;\n")
2840 def WriteBucketServiceImplementation(self, func, file):
2841 """Writes the service implementation for a bucket version of command."""
2843 "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
2845 " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" %
2847 self.WriteHandlerDeferReadWrite(func, file);
2848 last_arg = func.GetLastOriginalArg()
2849 all_but_last_arg = func.GetOriginalArgs()[:-1]
2850 for arg in all_but_last_arg:
2851 arg.WriteGetCode(file)
2852 self.WriteGetDataSizeCode(func, file)
2853 last_arg.WriteGetCode(file)
2854 func.WriteHandlerValidation(file)
2855 func.WriteHandlerImplementation(file)
2856 file.Write(" return error::kNoError;\n")
2860 def WriteHandlerDeferReadWrite(self, func, file):
2861 """Writes the code to handle deferring reads or writes."""
2862 defer_reads = func.GetInfo('defer_reads')
2863 defer_draws = func.GetInfo('defer_draws')
2866 conditions.append('ShouldDeferDraws()');
2868 conditions.append('ShouldDeferReads()');
2871 file.Write(" if (%s)\n" % ' || '.join(conditions))
2872 file.Write(" return error::kDeferCommandUntilLater;\n")
2874 def WriteValidUnitTest(self, func, file, test, extra = {}):
2875 """Writes a valid unit test."""
2876 if func.GetInfo('expectation') == False:
2877 test = self._remove_expected_call_re.sub('', test)
2880 for count, arg in enumerate(func.GetOriginalArgs()):
2881 arg_strings.append(arg.GetValidArg(func, count, 0))
2883 for count, arg in enumerate(func.GetOriginalArgs()):
2884 gl_arg_strings.append(arg.GetValidGLArg(func, count, 0))
2885 gl_func_name = func.GetGLTestFunctionName()
2887 'test_name': 'GLES2DecoderTest%d' % file.file_num,
2889 'gl_func_name': gl_func_name,
2890 'args': ", ".join(arg_strings),
2891 'gl_args': ", ".join(gl_arg_strings),
2895 while (old_test != test):
2898 file.Write(test % vars)
2900 def WriteInvalidUnitTest(self, func, file, test, extra = {}):
2901 """Writes a invalid unit test."""
2902 for arg_index, arg in enumerate(func.GetOriginalArgs()):
2903 num_invalid_values = arg.GetNumInvalidValues(func)
2904 for value_index in range(0, num_invalid_values):
2906 parse_result = "kNoError"
2908 for count, arg in enumerate(func.GetOriginalArgs()):
2909 if count == arg_index:
2910 (arg_string, parse_result, gl_error) = arg.GetInvalidArg(
2913 arg_string = arg.GetValidArg(func, count, 0)
2914 arg_strings.append(arg_string)
2916 for arg in func.GetOriginalArgs():
2917 gl_arg_strings.append("_")
2918 gl_func_name = func.GetGLTestFunctionName()
2920 if not gl_error == None:
2921 gl_error_test = '\n EXPECT_EQ(%s, GetGLError());' % gl_error
2924 'test_name': 'GLES2DecoderTest%d' % file.file_num ,
2926 'arg_index': arg_index,
2927 'value_index': value_index,
2928 'gl_func_name': gl_func_name,
2929 'args': ", ".join(arg_strings),
2930 'all_but_last_args': ", ".join(arg_strings[:-1]),
2931 'gl_args': ", ".join(gl_arg_strings),
2932 'parse_result': parse_result,
2933 'gl_error_test': gl_error_test,
2936 file.Write(test % vars)
2938 def WriteServiceUnitTest(self, func, file):
2939 """Writes the service unit test for a command."""
2941 TEST_F(%(test_name)s, %(name)sValidArgs) {
2942 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
2943 SpecializedSetup<cmds::%(name)s, 0>(true);
2946 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2947 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2950 self.WriteValidUnitTest(func, file, valid_test)
2953 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
2954 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
2955 SpecializedSetup<cmds::%(name)s, 0>(false);
2958 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
2961 self.WriteInvalidUnitTest(func, file, invalid_test)
2963 def WriteImmediateServiceUnitTest(self, func, file):
2964 """Writes the service unit test for an immediate command."""
2965 file.Write("// TODO(gman): %s\n" % func.name)
2967 def WriteImmediateValidationCode(self, func, file):
2968 """Writes the validation code for an immediate version of a command."""
2971 def WriteBucketServiceUnitTest(self, func, file):
2972 """Writes the service unit test for a bucket command."""
2973 file.Write("// TODO(gman): %s\n" % func.name)
2975 def WriteBucketValidationCode(self, func, file):
2976 """Writes the validation code for a bucket version of a command."""
2977 file.Write("// TODO(gman): %s\n" % func.name)
2979 def WriteGLES2ImplementationDeclaration(self, func, file):
2980 """Writes the GLES2 Implemention declaration."""
2981 impl_decl = func.GetInfo('impl_decl')
2982 if impl_decl == None or impl_decl == True:
2983 file.Write("virtual %s %s(%s) OVERRIDE;\n" %
2984 (func.return_type, func.original_name,
2985 func.MakeTypedOriginalArgString("")))
2988 def WriteGLES2CLibImplementation(self, func, file):
2989 file.Write("%s GLES2%s(%s) {\n" %
2990 (func.return_type, func.name,
2991 func.MakeTypedOriginalArgString("")))
2992 result_string = "return "
2993 if func.return_type == "void":
2995 file.Write(" %sgles2::GetGLContext()->%s(%s);\n" %
2996 (result_string, func.original_name,
2997 func.MakeOriginalArgString("")))
3000 def WriteGLES2Header(self, func, file):
3001 """Writes a re-write macro for GLES"""
3002 file.Write("#define gl%s GLES2_GET_FUN(%s)\n" %(func.name, func.name))
3004 def WriteClientGLCallLog(self, func, file):
3005 """Writes a logging macro for the client side code."""
3007 if len(func.GetOriginalArgs()):
3010 ' GPU_CLIENT_LOG("[" << GetLogPrefix() << "] gl%s("%s%s << ")");\n' %
3011 (func.original_name, comma, func.MakeLogArgString()))
3013 def WriteClientGLReturnLog(self, func, file):
3014 """Writes the return value logging code."""
3015 if func.return_type != "void":
3016 file.Write(' GPU_CLIENT_LOG("return:" << result)\n')
3018 def WriteGLES2ImplementationHeader(self, func, file):
3019 """Writes the GLES2 Implemention."""
3020 self.WriteGLES2ImplementationDeclaration(func, file)
3022 def WriteGLES2TraceImplementationHeader(self, func, file):
3023 """Writes the GLES2 Trace Implemention header."""
3024 file.Write("virtual %s %s(%s) OVERRIDE;\n" %
3025 (func.return_type, func.original_name,
3026 func.MakeTypedOriginalArgString("")))
3028 def WriteGLES2TraceImplementation(self, func, file):
3029 """Writes the GLES2 Trace Implemention."""
3030 file.Write("%s GLES2TraceImplementation::%s(%s) {\n" %
3031 (func.return_type, func.original_name,
3032 func.MakeTypedOriginalArgString("")))
3033 result_string = "return "
3034 if func.return_type == "void":
3036 file.Write(' TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::%s");\n' %
3038 file.Write(" %sgl_->%s(%s);\n" %
3039 (result_string, func.name, func.MakeOriginalArgString("")))
3043 def WriteGLES2Implementation(self, func, file):
3044 """Writes the GLES2 Implemention."""
3045 impl_func = func.GetInfo('impl_func')
3046 impl_decl = func.GetInfo('impl_decl')
3047 gen_cmd = func.GetInfo('gen_cmd')
3048 if (func.can_auto_generate and
3049 (impl_func == None or impl_func == True) and
3050 (impl_decl == None or impl_decl == True) and
3051 (gen_cmd == None or gen_cmd == True)):
3052 file.Write("%s GLES2Implementation::%s(%s) {\n" %
3053 (func.return_type, func.original_name,
3054 func.MakeTypedOriginalArgString("")))
3055 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
3056 self.WriteClientGLCallLog(func, file)
3057 func.WriteDestinationInitalizationValidation(file)
3058 for arg in func.GetOriginalArgs():
3059 arg.WriteClientSideValidationCode(file, func)
3060 file.Write(" helper_->%s(%s);\n" %
3061 (func.name, func.MakeOriginalArgString("")))
3062 file.Write(" CheckGLError();\n")
3063 self.WriteClientGLReturnLog(func, file)
3067 def WriteGLES2InterfaceHeader(self, func, file):
3068 """Writes the GLES2 Interface."""
3069 file.Write("virtual %s %s(%s) = 0;\n" %
3070 (func.return_type, func.original_name,
3071 func.MakeTypedOriginalArgString("")))
3073 def WriteGLES2InterfaceStub(self, func, file):
3074 """Writes the GLES2 Interface stub declaration."""
3075 file.Write("virtual %s %s(%s) OVERRIDE;\n" %
3076 (func.return_type, func.original_name,
3077 func.MakeTypedOriginalArgString("")))
3079 def WriteGLES2InterfaceStubImpl(self, func, file):
3080 """Writes the GLES2 Interface stub declaration."""
3081 args = func.GetOriginalArgs()
3082 arg_string = ", ".join(
3083 ["%s /* %s */" % (arg.type, arg.name) for arg in args])
3084 file.Write("%s GLES2InterfaceStub::%s(%s) {\n" %
3085 (func.return_type, func.original_name, arg_string))
3086 if func.return_type != "void":
3087 file.Write(" return 0;\n")
3090 def WriteGLES2ImplementationUnitTest(self, func, file):
3091 """Writes the GLES2 Implemention unit test."""
3092 client_test = func.GetInfo('client_test')
3093 if (func.can_auto_generate and
3094 (client_test == None or client_test == True)):
3096 TEST_F(GLES2ImplementationTest, %(name)s) {
3101 expected.cmd.Init(%(cmd_args)s);
3103 gl_->%(name)s(%(args)s);
3104 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
3107 cmd_arg_strings = []
3108 for count, arg in enumerate(func.GetCmdArgs()):
3109 cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0))
3112 for count, arg in enumerate(func.GetOriginalArgs()):
3113 gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0))
3116 'args': ", ".join(gl_arg_strings),
3117 'cmd_args': ", ".join(cmd_arg_strings),
3120 if client_test != False:
3121 file.Write("// TODO: Implement unit test for %s\n" % func.name)
3123 def WriteDestinationInitalizationValidation(self, func, file):
3124 """Writes the client side destintion initialization validation."""
3125 for arg in func.GetOriginalArgs():
3126 arg.WriteDestinationInitalizationValidation(file, func)
3128 def WriteTraceEvent(self, func, file):
3129 file.Write(' TRACE_EVENT0("gpu", "GLES2Implementation::%s");\n' %
3132 def WriteImmediateCmdComputeSize(self, func, file):
3133 """Writes the size computation code for the immediate version of a cmd."""
3134 file.Write(" static uint32 ComputeSize(uint32 size_in_bytes) {\n")
3135 file.Write(" return static_cast<uint32>(\n")
3136 file.Write(" sizeof(ValueType) + // NOLINT\n")
3137 file.Write(" RoundSizeToMultipleOfEntries(size_in_bytes));\n")
3141 def WriteImmediateCmdSetHeader(self, func, file):
3142 """Writes the SetHeader function for the immediate version of a cmd."""
3143 file.Write(" void SetHeader(uint32 size_in_bytes) {\n")
3144 file.Write(" header.SetCmdByTotalSize<ValueType>(size_in_bytes);\n")
3148 def WriteImmediateCmdInit(self, func, file):
3149 """Writes the Init function for the immediate version of a command."""
3150 raise NotImplementedError(func.name)
3152 def WriteImmediateCmdSet(self, func, file):
3153 """Writes the Set function for the immediate version of a command."""
3154 raise NotImplementedError(func.name)
3156 def WriteCmdHelper(self, func, file):
3157 """Writes the cmd helper definition for a cmd."""
3158 code = """ void %(name)s(%(typed_args)s) {
3159 gles2::cmds::%(name)s* c = GetCmdSpace<gles2::cmds::%(name)s>();
3168 "typed_args": func.MakeTypedCmdArgString(""),
3169 "args": func.MakeCmdArgString(""),
3172 def WriteImmediateCmdHelper(self, func, file):
3173 """Writes the cmd helper definition for the immediate version of a cmd."""
3174 code = """ void %(name)s(%(typed_args)s) {
3175 const uint32 s = 0; // TODO(gman): compute correct size
3176 gles2::cmds::%(name)s* c =
3177 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(s);
3186 "typed_args": func.MakeTypedCmdArgString(""),
3187 "args": func.MakeCmdArgString(""),
3191 class StateSetHandler(TypeHandler):
3192 """Handler for commands that simply set state."""
3195 TypeHandler.__init__(self)
3197 def WriteHandlerImplementation(self, func, file):
3198 """Overrriden from TypeHandler."""
3199 state_name = func.GetInfo('state')
3200 state = _STATES[state_name]
3201 states = state['states']
3202 args = func.GetOriginalArgs()
3204 for ndx,item in enumerate(states):
3205 if 'range_checks' in item:
3206 for range_check in item['range_checks']:
3207 code.append("%s %s" % (args[ndx].name, range_check['check']))
3209 file.Write(" if (%s) {\n" % " ||\n ".join(code))
3211 ' LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,'
3212 ' "%s", "%s out of range");\n' %
3213 (func.name, args[ndx].name))
3214 file.Write(" return error::kNoError;\n")
3217 for ndx,item in enumerate(states):
3218 code.append("state_.%s != %s" % (item['name'], args[ndx].name))
3219 file.Write(" if (%s) {\n" % " ||\n ".join(code))
3220 for ndx,item in enumerate(states):
3221 file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx].name))
3222 if 'state_flag' in state:
3223 file.Write(" %s = true;\n" % state['state_flag'])
3224 if not func.GetInfo("no_gl"):
3225 file.Write(" %s(%s);\n" %
3226 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
3229 def WriteServiceUnitTest(self, func, file):
3230 """Overrriden from TypeHandler."""
3231 TypeHandler.WriteServiceUnitTest(self, func, file)
3232 state_name = func.GetInfo('state')
3233 state = _STATES[state_name]
3234 states = state['states']
3235 for ndx,item in enumerate(states):
3236 if 'range_checks' in item:
3237 for check_ndx, range_check in enumerate(item['range_checks']):
3239 TEST_F(%(test_name)s, %(name)sInvalidValue%(ndx)d_%(check_ndx)d) {
3240 SpecializedSetup<cmds::%(name)s, 0>(false);
3243 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3244 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
3249 for count, arg in enumerate(func.GetOriginalArgs()):
3250 arg_strings.append(arg.GetValidArg(func, count, 0))
3251 arg_strings[ndx] = range_check['test_value']
3253 'test_name': 'GLES2DecoderTest%d' % file.file_num,
3256 'check_ndx': check_ndx,
3257 'args': ", ".join(arg_strings),
3259 file.Write(valid_test % vars)
3262 class StateSetRGBAlphaHandler(TypeHandler):
3263 """Handler for commands that simply set state that have rgb/alpha."""
3266 TypeHandler.__init__(self)
3268 def WriteHandlerImplementation(self, func, file):
3269 """Overrriden from TypeHandler."""
3270 state_name = func.GetInfo('state')
3271 state = _STATES[state_name]
3272 states = state['states']
3273 args = func.GetOriginalArgs()
3274 num_args = len(args)
3276 for ndx,item in enumerate(states):
3277 code.append("state_.%s != %s" % (item['name'], args[ndx % num_args].name))
3278 file.Write(" if (%s) {\n" % " ||\n ".join(code))
3279 for ndx, item in enumerate(states):
3280 file.Write(" state_.%s = %s;\n" %
3281 (item['name'], args[ndx % num_args].name))
3282 if 'state_flag' in state:
3283 file.Write(" %s = true;\n" % state['state_flag'])
3284 if not func.GetInfo("no_gl"):
3285 file.Write(" %s(%s);\n" %
3286 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
3290 class StateSetFrontBackSeparateHandler(TypeHandler):
3291 """Handler for commands that simply set state that have front/back."""
3294 TypeHandler.__init__(self)
3296 def WriteHandlerImplementation(self, func, file):
3297 """Overrriden from TypeHandler."""
3298 state_name = func.GetInfo('state')
3299 state = _STATES[state_name]
3300 states = state['states']
3301 args = func.GetOriginalArgs()
3303 num_args = len(args)
3304 file.Write(" bool changed = false;\n")
3305 for group_ndx, group in enumerate(Grouper(num_args - 1, states)):
3306 file.Write(" if (%s == %s || %s == GL_FRONT_AND_BACK) {\n" %
3307 (face, ('GL_FRONT', 'GL_BACK')[group_ndx], face))
3309 for ndx, item in enumerate(group):
3310 code.append("state_.%s != %s" % (item['name'], args[ndx + 1].name))
3311 file.Write(" changed |= %s;\n" % " ||\n ".join(code))
3313 file.Write(" if (changed) {\n")
3314 for group_ndx, group in enumerate(Grouper(num_args - 1, states)):
3315 file.Write(" if (%s == %s || %s == GL_FRONT_AND_BACK) {\n" %
3316 (face, ('GL_FRONT', 'GL_BACK')[group_ndx], face))
3317 for ndx, item in enumerate(group):
3318 file.Write(" state_.%s = %s;\n" %
3319 (item['name'], args[ndx + 1].name))
3321 if 'state_flag' in state:
3322 file.Write(" %s = true;\n" % state['state_flag'])
3323 if not func.GetInfo("no_gl"):
3324 file.Write(" %s(%s);\n" %
3325 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
3329 class StateSetFrontBackHandler(TypeHandler):
3330 """Handler for commands that simply set state that set both front/back."""
3333 TypeHandler.__init__(self)
3335 def WriteHandlerImplementation(self, func, file):
3336 """Overrriden from TypeHandler."""
3337 state_name = func.GetInfo('state')
3338 state = _STATES[state_name]
3339 states = state['states']
3340 args = func.GetOriginalArgs()
3341 num_args = len(args)
3343 for group_ndx, group in enumerate(Grouper(num_args, states)):
3344 for ndx, item in enumerate(group):
3345 code.append("state_.%s != %s" % (item['name'], args[ndx].name))
3346 file.Write(" if (%s) {\n" % " ||\n ".join(code))
3347 for group_ndx, group in enumerate(Grouper(num_args, states)):
3348 for ndx, item in enumerate(group):
3349 file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx].name))
3350 if 'state_flag' in state:
3351 file.Write(" %s = true;\n" % state['state_flag'])
3352 if not func.GetInfo("no_gl"):
3353 file.Write(" %s(%s);\n" %
3354 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
3358 class StateSetNamedParameter(TypeHandler):
3359 """Handler for commands that set a state chosen with an enum parameter."""
3362 TypeHandler.__init__(self)
3364 def WriteHandlerImplementation(self, func, file):
3365 """Overridden from TypeHandler."""
3366 state_name = func.GetInfo('state')
3367 state = _STATES[state_name]
3368 states = state['states']
3369 args = func.GetOriginalArgs()
3370 num_args = len(args)
3371 assert num_args == 2
3372 file.Write(" switch (%s) {\n" % args[0].name)
3373 for state in states:
3374 file.Write(" case %s:\n" % state['enum'])
3375 file.Write(" if (state_.%s != %s) {\n" %
3376 (state['name'], args[1].name))
3377 file.Write(" state_.%s = %s;\n" % (state['name'], args[1].name))
3378 if not func.GetInfo("no_gl"):
3379 file.Write(" %s(%s);\n" %
3380 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
3382 file.Write(" break;\n")
3383 file.Write(" default:\n")
3384 file.Write(" NOTREACHED();\n")
3388 class CustomHandler(TypeHandler):
3389 """Handler for commands that are auto-generated but require minor tweaks."""
3392 TypeHandler.__init__(self)
3394 def WriteServiceImplementation(self, func, file):
3395 """Overrriden from TypeHandler."""
3398 def WriteImmediateServiceImplementation(self, func, file):
3399 """Overrriden from TypeHandler."""
3402 def WriteBucketServiceImplementation(self, func, file):
3403 """Overrriden from TypeHandler."""
3406 def WriteServiceUnitTest(self, func, file):
3407 """Overrriden from TypeHandler."""
3408 file.Write("// TODO(gman): %s\n\n" % func.name)
3410 def WriteImmediateServiceUnitTest(self, func, file):
3411 """Overrriden from TypeHandler."""
3412 file.Write("// TODO(gman): %s\n\n" % func.name)
3414 def WriteImmediateCmdGetTotalSize(self, func, file):
3415 """Overrriden from TypeHandler."""
3416 file.Write(" uint32 total_size = 0; // TODO(gman): get correct size.\n")
3418 def WriteImmediateCmdInit(self, func, file):
3419 """Overrriden from TypeHandler."""
3420 file.Write(" void Init(%s) {\n" % func.MakeTypedCmdArgString("_"))
3421 self.WriteImmediateCmdGetTotalSize(func, file)
3422 file.Write(" SetHeader(total_size);\n")
3423 args = func.GetCmdArgs()
3425 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
3429 def WriteImmediateCmdSet(self, func, file):
3430 """Overrriden from TypeHandler."""
3431 copy_args = func.MakeCmdArgString("_", False)
3432 file.Write(" void* Set(void* cmd%s) {\n" %
3433 func.MakeTypedCmdArgString("_", True))
3434 self.WriteImmediateCmdGetTotalSize(func, file)
3435 file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
3436 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
3437 "cmd, total_size);\n")
3442 class TodoHandler(CustomHandler):
3443 """Handle for commands that are not yet implemented."""
3445 def AddImmediateFunction(self, generator, func):
3446 """Overrriden from TypeHandler."""
3449 def WriteImmediateFormatTest(self, func, file):
3450 """Overrriden from TypeHandler."""
3453 def WriteGLES2ImplementationUnitTest(self, func, file):
3454 """Overrriden from TypeHandler."""
3457 def WriteGLES2Implementation(self, func, file):
3458 """Overrriden from TypeHandler."""
3459 file.Write("%s GLES2Implementation::%s(%s) {\n" %
3460 (func.return_type, func.original_name,
3461 func.MakeTypedOriginalArgString("")))
3462 file.Write(" // TODO: for now this is a no-op\n")
3465 "GL_INVALID_OPERATION, \"gl%s\", \"not implemented\");\n" %
3467 if func.return_type != "void":
3468 file.Write(" return 0;\n")
3472 def WriteServiceImplementation(self, func, file):
3473 """Overrriden from TypeHandler."""
3475 "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
3477 " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" %
3479 file.Write(" // TODO: for now this is a no-op\n")
3481 " LOCAL_SET_GL_ERROR("
3482 "GL_INVALID_OPERATION, \"gl%s\", \"not implemented\");\n" %
3484 file.Write(" return error::kNoError;\n")
3489 class HandWrittenHandler(CustomHandler):
3490 """Handler for comands where everything must be written by hand."""
3492 def InitFunction(self, func):
3493 """Add or adjust anything type specific for this function."""
3494 CustomHandler.InitFunction(self, func)
3495 func.can_auto_generate = False
3497 def WriteStruct(self, func, file):
3498 """Overrriden from TypeHandler."""
3501 def WriteDocs(self, func, file):
3502 """Overrriden from TypeHandler."""
3505 def WriteServiceUnitTest(self, func, file):
3506 """Overrriden from TypeHandler."""
3507 file.Write("// TODO(gman): %s\n\n" % func.name)
3509 def WriteImmediateServiceUnitTest(self, func, file):
3510 """Overrriden from TypeHandler."""
3511 file.Write("// TODO(gman): %s\n\n" % func.name)
3513 def WriteBucketServiceUnitTest(self, func, file):
3514 """Overrriden from TypeHandler."""
3515 file.Write("// TODO(gman): %s\n\n" % func.name)
3517 def WriteServiceImplementation(self, func, file):
3518 """Overrriden from TypeHandler."""
3521 def WriteImmediateServiceImplementation(self, func, file):
3522 """Overrriden from TypeHandler."""
3525 def WriteBucketServiceImplementation(self, func, file):
3526 """Overrriden from TypeHandler."""
3529 def WriteImmediateCmdHelper(self, func, file):
3530 """Overrriden from TypeHandler."""
3533 def WriteBucketCmdHelper(self, func, file):
3534 """Overrriden from TypeHandler."""
3537 def WriteCmdHelper(self, func, file):
3538 """Overrriden from TypeHandler."""
3541 def WriteFormatTest(self, func, file):
3542 """Overrriden from TypeHandler."""
3543 file.Write("// TODO(gman): Write test for %s\n" % func.name)
3545 def WriteImmediateFormatTest(self, func, file):
3546 """Overrriden from TypeHandler."""
3547 file.Write("// TODO(gman): Write test for %s\n" % func.name)
3549 def WriteBucketFormatTest(self, func, file):
3550 """Overrriden from TypeHandler."""
3551 file.Write("// TODO(gman): Write test for %s\n" % func.name)
3555 class ManualHandler(CustomHandler):
3556 """Handler for commands who's handlers must be written by hand."""
3559 CustomHandler.__init__(self)
3561 def InitFunction(self, func):
3562 """Overrriden from TypeHandler."""
3563 if (func.name == 'CompressedTexImage2DBucket'):
3564 func.cmd_args = func.cmd_args[:-1]
3565 func.AddCmdArg(Argument('bucket_id', 'GLuint'))
3567 CustomHandler.InitFunction(self, func)
3569 def WriteServiceImplementation(self, func, file):
3570 """Overrriden from TypeHandler."""
3573 def WriteBucketServiceImplementation(self, func, file):
3574 """Overrriden from TypeHandler."""
3577 def WriteServiceUnitTest(self, func, file):
3578 """Overrriden from TypeHandler."""
3579 file.Write("// TODO(gman): %s\n\n" % func.name)
3581 def WriteImmediateServiceUnitTest(self, func, file):
3582 """Overrriden from TypeHandler."""
3583 file.Write("// TODO(gman): %s\n\n" % func.name)
3585 def WriteImmediateServiceImplementation(self, func, file):
3586 """Overrriden from TypeHandler."""
3589 def WriteImmediateFormatTest(self, func, file):
3590 """Overrriden from TypeHandler."""
3591 file.Write("// TODO(gman): Implement test for %s\n" % func.name)
3593 def WriteGLES2Implementation(self, func, file):
3594 """Overrriden from TypeHandler."""
3595 if func.GetInfo('impl_func'):
3596 super(ManualHandler, self).WriteGLES2Implementation(func, file)
3598 def WriteGLES2ImplementationHeader(self, func, file):
3599 """Overrriden from TypeHandler."""
3600 file.Write("virtual %s %s(%s) OVERRIDE;\n" %
3601 (func.return_type, func.original_name,
3602 func.MakeTypedOriginalArgString("")))
3605 def WriteImmediateCmdGetTotalSize(self, func, file):
3606 """Overrriden from TypeHandler."""
3607 # TODO(gman): Move this data to _FUNCTION_INFO?
3608 CustomHandler.WriteImmediateCmdGetTotalSize(self, func, file)
3611 class DataHandler(TypeHandler):
3612 """Handler for glBufferData, glBufferSubData, glTexImage2D, glTexSubImage2D,
3613 glCompressedTexImage2D, glCompressedTexImageSub2D."""
3615 TypeHandler.__init__(self)
3617 def InitFunction(self, func):
3618 """Overrriden from TypeHandler."""
3619 if func.name == 'CompressedTexSubImage2DBucket':
3620 func.cmd_args = func.cmd_args[:-1]
3621 func.AddCmdArg(Argument('bucket_id', 'GLuint'))
3623 def WriteGetDataSizeCode(self, func, file):
3624 """Overrriden from TypeHandler."""
3625 # TODO(gman): Move this data to _FUNCTION_INFO?
3627 if name.endswith("Immediate"):
3629 if name == 'BufferData' or name == 'BufferSubData':
3630 file.Write(" uint32 data_size = size;\n")
3631 elif (name == 'CompressedTexImage2D' or
3632 name == 'CompressedTexSubImage2D'):
3633 file.Write(" uint32 data_size = imageSize;\n")
3634 elif (name == 'CompressedTexSubImage2DBucket'):
3635 file.Write(" Bucket* bucket = GetBucket(c.bucket_id);\n")
3636 file.Write(" uint32 data_size = bucket->size();\n")
3637 file.Write(" GLsizei imageSize = data_size;\n")
3638 elif name == 'TexImage2D' or name == 'TexSubImage2D':
3639 code = """ uint32 data_size;
3640 if (!GLES2Util::ComputeImageDataSize(
3641 width, height, format, type, unpack_alignment_, &data_size)) {
3642 return error::kOutOfBounds;
3647 file.Write("// uint32 data_size = 0; // TODO(gman): get correct size!\n")
3649 def WriteImmediateCmdGetTotalSize(self, func, file):
3650 """Overrriden from TypeHandler."""
3653 def WriteImmediateCmdSizeTest(self, func, file):
3654 """Overrriden from TypeHandler."""
3655 file.Write(" EXPECT_EQ(sizeof(cmd), total_size);\n")
3657 def WriteImmediateCmdInit(self, func, file):
3658 """Overrriden from TypeHandler."""
3659 file.Write(" void Init(%s) {\n" % func.MakeTypedCmdArgString("_"))
3660 self.WriteImmediateCmdGetTotalSize(func, file)
3661 file.Write(" SetHeader(total_size);\n")
3662 args = func.GetCmdArgs()
3664 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
3668 def WriteImmediateCmdSet(self, func, file):
3669 """Overrriden from TypeHandler."""
3670 copy_args = func.MakeCmdArgString("_", False)
3671 file.Write(" void* Set(void* cmd%s) {\n" %
3672 func.MakeTypedCmdArgString("_", True))
3673 self.WriteImmediateCmdGetTotalSize(func, file)
3674 file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
3675 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
3676 "cmd, total_size);\n")
3680 def WriteImmediateFormatTest(self, func, file):
3681 """Overrriden from TypeHandler."""
3682 # TODO(gman): Remove this exception.
3683 file.Write("// TODO(gman): Implement test for %s\n" % func.name)
3686 def WriteServiceUnitTest(self, func, file):
3687 """Overrriden from TypeHandler."""
3688 file.Write("// TODO(gman): %s\n\n" % func.name)
3690 def WriteImmediateServiceUnitTest(self, func, file):
3691 """Overrriden from TypeHandler."""
3692 file.Write("// TODO(gman): %s\n\n" % func.name)
3694 def WriteBucketServiceImplementation(self, func, file):
3695 """Overrriden from TypeHandler."""
3696 if not func.name == 'CompressedTexSubImage2DBucket':
3697 TypeHandler.WriteBucketServiceImplemenation(self, func, file)
3700 class BindHandler(TypeHandler):
3701 """Handler for glBind___ type functions."""
3704 TypeHandler.__init__(self)
3706 def WriteServiceUnitTest(self, func, file):
3707 """Overrriden from TypeHandler."""
3709 if len(func.GetOriginalArgs()) == 1:
3711 TEST_F(%(test_name)s, %(name)sValidArgs) {
3712 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
3713 SpecializedSetup<cmds::%(name)s, 0>(true);
3716 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3717 EXPECT_EQ(GL_NO_ERROR, GetGLError());
3720 TEST_F(%(test_name)s, %(name)sValidArgsNewId) {
3721 EXPECT_CALL(*gl_, %(gl_func_name)s(kNewServiceId));
3722 EXPECT_CALL(*gl_, %(gl_gen_func_name)s(1, _))
3723 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
3724 SpecializedSetup<cmds::%(name)s, 0>(true);
3726 cmd.Init(kNewClientId);
3727 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3728 EXPECT_EQ(GL_NO_ERROR, GetGLError());
3729 EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
3734 self.WriteValidUnitTest(func, file, valid_test, {
3735 'resource_type': func.GetOriginalArgs()[0].resource_type,
3736 'gl_gen_func_name': func.GetInfo("gen_func"),
3740 TEST_F(%(test_name)s, %(name)sValidArgs) {
3741 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
3742 SpecializedSetup<cmds::%(name)s, 0>(true);
3745 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3746 EXPECT_EQ(GL_NO_ERROR, GetGLError());
3749 TEST_F(%(test_name)s, %(name)sValidArgsNewId) {
3750 EXPECT_CALL(*gl_, %(gl_func_name)s(%(first_gl_arg)s, kNewServiceId));
3751 EXPECT_CALL(*gl_, %(gl_gen_func_name)s(1, _))
3752 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
3753 SpecializedSetup<cmds::%(name)s, 0>(true);
3755 cmd.Init(%(first_arg)s, kNewClientId);
3756 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3757 EXPECT_EQ(GL_NO_ERROR, GetGLError());
3758 EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
3763 self.WriteValidUnitTest(func, file, valid_test, {
3764 'first_arg': func.GetOriginalArgs()[0].GetValidArg(func, 0, 0),
3765 'first_gl_arg': func.GetOriginalArgs()[0].GetValidGLArg(func, 0, 0),
3766 'resource_type': func.GetOriginalArgs()[1].resource_type,
3767 'gl_gen_func_name': func.GetInfo("gen_func"),
3771 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
3772 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
3773 SpecializedSetup<cmds::%(name)s, 0>(false);
3776 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
3779 self.WriteInvalidUnitTest(func, file, invalid_test)
3781 def WriteGLES2Implementation(self, func, file):
3782 """Writes the GLES2 Implemention."""
3784 impl_func = func.GetInfo('impl_func')
3785 impl_decl = func.GetInfo('impl_decl')
3787 if (func.can_auto_generate and
3788 (impl_func == None or impl_func == True) and
3789 (impl_decl == None or impl_decl == True)):
3791 file.Write("%s GLES2Implementation::%s(%s) {\n" %
3792 (func.return_type, func.original_name,
3793 func.MakeTypedOriginalArgString("")))
3794 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
3795 func.WriteDestinationInitalizationValidation(file)
3796 self.WriteClientGLCallLog(func, file)
3797 for arg in func.GetOriginalArgs():
3798 arg.WriteClientSideValidationCode(file, func)
3800 code = """ if (Is%(type)sReservedId(%(id)s)) {
3801 SetGLError(GL_INVALID_OPERATION, "%(name)s\", \"%(id)s reserved id");
3804 if (Bind%(type)sHelper(%(arg_string)s)) {
3805 helper_->%(name)s(%(arg_string)s);
3812 if len(func.GetOriginalArgs()) == 1:
3813 # Bind functions that have no target (like BindVertexArrayOES)
3814 name_arg = func.GetOriginalArgs()[0]
3816 # Bind functions that have both a target and a name (like BindTexture)
3817 name_arg = func.GetOriginalArgs()[1]
3821 'arg_string': func.MakeOriginalArgString(""),
3822 'id': name_arg.name,
3823 'type': name_arg.resource_type,
3824 'lc_type': name_arg.resource_type.lower(),
3827 def WriteGLES2ImplementationUnitTest(self, func, file):
3828 """Overrriden from TypeHandler."""
3829 client_test = func.GetInfo('client_test')
3830 if client_test == False:
3833 TEST_F(GLES2ImplementationTest, %(name)s) {
3838 expected.cmd.Init(%(cmd_args)s);
3840 gl_->%(name)s(%(args)s);
3841 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
3843 gl_->%(name)s(%(args)s);
3844 EXPECT_TRUE(NoCommandsWritten());
3847 cmd_arg_strings = []
3848 for count, arg in enumerate(func.GetCmdArgs()):
3849 cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0))
3852 for count, arg in enumerate(func.GetOriginalArgs()):
3853 gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0))
3856 'args': ", ".join(gl_arg_strings),
3857 'cmd_args': ", ".join(cmd_arg_strings),
3861 class GENnHandler(TypeHandler):
3862 """Handler for glGen___ type functions."""
3865 TypeHandler.__init__(self)
3867 def InitFunction(self, func):
3868 """Overrriden from TypeHandler."""
3871 def WriteGetDataSizeCode(self, func, file):
3872 """Overrriden from TypeHandler."""
3873 code = """ uint32 data_size;
3874 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
3875 return error::kOutOfBounds;
3880 def WriteHandlerImplementation (self, func, file):
3881 """Overrriden from TypeHandler."""
3882 file.Write(" if (!%sHelper(n, %s)) {\n"
3883 " return error::kInvalidArguments;\n"
3885 (func.name, func.GetLastOriginalArg().name))
3887 def WriteImmediateHandlerImplementation(self, func, file):
3888 """Overrriden from TypeHandler."""
3889 file.Write(" if (!%sHelper(n, %s)) {\n"
3890 " return error::kInvalidArguments;\n"
3892 (func.original_name, func.GetLastOriginalArg().name))
3894 def WriteGLES2Implementation(self, func, file):
3895 """Overrriden from TypeHandler."""
3896 log_code = (""" GPU_CLIENT_LOG_CODE_BLOCK({
3897 for (GLsizei i = 0; i < n; ++i) {
3898 GPU_CLIENT_LOG(" " << i << ": " << %s[i]);
3900 });""" % func.GetOriginalArgs()[1].name)
3902 'log_code': log_code,
3903 'return_type': func.return_type,
3904 'name': func.original_name,
3905 'typed_args': func.MakeTypedOriginalArgString(""),
3906 'args': func.MakeOriginalArgString(""),
3907 'resource_types': func.GetInfo('resource_types'),
3908 'count_name': func.GetOriginalArgs()[0].name,
3911 "%(return_type)s GLES2Implementation::%(name)s(%(typed_args)s) {\n" %
3913 func.WriteDestinationInitalizationValidation(file)
3914 self.WriteClientGLCallLog(func, file)
3915 for arg in func.GetOriginalArgs():
3916 arg.WriteClientSideValidationCode(file, func)
3917 code = """ GPU_CLIENT_SINGLE_THREAD_CHECK();
3918 GetIdHandler(id_namespaces::k%(resource_types)s)->
3919 MakeIds(this, 0, %(args)s);
3920 %(name)sHelper(%(args)s);
3921 helper_->%(name)sImmediate(%(args)s);
3922 helper_->CommandBufferHelper::Flush();
3928 file.Write(code % args)
3930 def WriteGLES2ImplementationUnitTest(self, func, file):
3931 """Overrriden from TypeHandler."""
3933 TEST_F(GLES2ImplementationTest, %(name)s) {
3934 GLuint ids[2] = { 0, };
3936 cmds::%(name)sImmediate gen;
3940 expected.gen.Init(arraysize(ids), &ids[0]);
3941 expected.data[0] = k%(types)sStartId;
3942 expected.data[1] = k%(types)sStartId + 1;
3943 gl_->%(name)s(arraysize(ids), &ids[0]);
3944 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
3945 EXPECT_EQ(k%(types)sStartId, ids[0]);
3946 EXPECT_EQ(k%(types)sStartId + 1, ids[1]);
3951 'types': func.GetInfo('resource_types'),
3954 def WriteServiceUnitTest(self, func, file):
3955 """Overrriden from TypeHandler."""
3957 TEST_F(%(test_name)s, %(name)sValidArgs) {
3958 EXPECT_CALL(*gl_, %(gl_func_name)s(1, _))
3959 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
3960 GetSharedMemoryAs<GLuint*>()[0] = kNewClientId;
3961 SpecializedSetup<cmds::%(name)s, 0>(true);
3964 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3965 EXPECT_EQ(GL_NO_ERROR, GetGLError());
3966 EXPECT_TRUE(Get%(resource_name)s(kNewClientId) != NULL);
3969 self.WriteValidUnitTest(func, file, valid_test, {
3970 'resource_name': func.GetInfo('resource_type'),
3973 TEST_F(%(test_name)s, %(name)sInvalidArgs) {
3974 EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0);
3975 GetSharedMemoryAs<GLuint*>()[0] = client_%(resource_name)s_id_;
3976 SpecializedSetup<cmds::%(name)s, 0>(false);
3979 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
3982 self.WriteValidUnitTest(func, file, invalid_test, {
3983 'resource_name': func.GetInfo('resource_type').lower(),
3986 def WriteImmediateServiceUnitTest(self, func, file):
3987 """Overrriden from TypeHandler."""
3989 TEST_F(%(test_name)s, %(name)sValidArgs) {
3990 EXPECT_CALL(*gl_, %(gl_func_name)s(1, _))
3991 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
3992 cmds::%(name)s* cmd = GetImmediateAs<cmds::%(name)s>();
3993 GLuint temp = kNewClientId;
3994 SpecializedSetup<cmds::%(name)s, 0>(true);
3995 cmd->Init(1, &temp);
3996 EXPECT_EQ(error::kNoError,
3997 ExecuteImmediateCmd(*cmd, sizeof(temp)));
3998 EXPECT_EQ(GL_NO_ERROR, GetGLError());
3999 EXPECT_TRUE(Get%(resource_name)s(kNewClientId) != NULL);
4002 self.WriteValidUnitTest(func, file, valid_test, {
4003 'resource_name': func.GetInfo('resource_type'),
4006 TEST_F(%(test_name)s, %(name)sInvalidArgs) {
4007 EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0);
4008 cmds::%(name)s* cmd = GetImmediateAs<cmds::%(name)s>();
4009 SpecializedSetup<cmds::%(name)s, 0>(false);
4010 cmd->Init(1, &client_%(resource_name)s_id_);
4011 EXPECT_EQ(error::kInvalidArguments,
4012 ExecuteImmediateCmd(*cmd, sizeof(&client_%(resource_name)s_id_)));
4015 self.WriteValidUnitTest(func, file, invalid_test, {
4016 'resource_name': func.GetInfo('resource_type').lower(),
4019 def WriteImmediateCmdComputeSize(self, func, file):
4020 """Overrriden from TypeHandler."""
4021 file.Write(" static uint32 ComputeDataSize(GLsizei n) {\n")
4023 " return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT\n")
4026 file.Write(" static uint32 ComputeSize(GLsizei n) {\n")
4027 file.Write(" return static_cast<uint32>(\n")
4028 file.Write(" sizeof(ValueType) + ComputeDataSize(n)); // NOLINT\n")
4032 def WriteImmediateCmdSetHeader(self, func, file):
4033 """Overrriden from TypeHandler."""
4034 file.Write(" void SetHeader(GLsizei n) {\n")
4035 file.Write(" header.SetCmdByTotalSize<ValueType>(ComputeSize(n));\n")
4039 def WriteImmediateCmdInit(self, func, file):
4040 """Overrriden from TypeHandler."""
4041 last_arg = func.GetLastOriginalArg()
4042 file.Write(" void Init(%s, %s _%s) {\n" %
4043 (func.MakeTypedCmdArgString("_"),
4044 last_arg.type, last_arg.name))
4045 file.Write(" SetHeader(_n);\n")
4046 args = func.GetCmdArgs()
4048 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
4049 file.Write(" memcpy(ImmediateDataAddress(this),\n")
4050 file.Write(" _%s, ComputeDataSize(_n));\n" % last_arg.name)
4054 def WriteImmediateCmdSet(self, func, file):
4055 """Overrriden from TypeHandler."""
4056 last_arg = func.GetLastOriginalArg()
4057 copy_args = func.MakeCmdArgString("_", False)
4058 file.Write(" void* Set(void* cmd%s, %s _%s) {\n" %
4059 (func.MakeTypedCmdArgString("_", True),
4060 last_arg.type, last_arg.name))
4061 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
4062 (copy_args, last_arg.name))
4063 file.Write(" const uint32 size = ComputeSize(_n);\n")
4064 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
4069 def WriteImmediateCmdHelper(self, func, file):
4070 """Overrriden from TypeHandler."""
4071 code = """ void %(name)s(%(typed_args)s) {
4072 const uint32 size = gles2::cmds::%(name)s::ComputeSize(n);
4073 gles2::cmds::%(name)s* c =
4074 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
4083 "typed_args": func.MakeTypedOriginalArgString(""),
4084 "args": func.MakeOriginalArgString(""),
4087 def WriteImmediateFormatTest(self, func, file):
4088 """Overrriden from TypeHandler."""
4089 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
4090 file.Write(" static GLuint ids[] = { 12, 23, 34, };\n")
4091 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
4092 (func.name, func.name))
4093 file.Write(" void* next_cmd = cmd.Set(\n")
4094 file.Write(" &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n")
4095 file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" %
4097 file.Write(" cmd.header.command);\n")
4098 file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
4099 file.Write(" RoundSizeToMultipleOfEntries(cmd.n * 4u),\n")
4100 file.Write(" cmd.header.size * 4u);\n")
4101 file.Write(" EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n);\n");
4102 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
4103 file.Write(" next_cmd, sizeof(cmd) +\n")
4104 file.Write(" RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n")
4105 file.Write(" // TODO(gman): Check that ids were inserted;\n")
4110 class CreateHandler(TypeHandler):
4111 """Handler for glCreate___ type functions."""
4114 TypeHandler.__init__(self)
4116 def InitFunction(self, func):
4117 """Overrriden from TypeHandler."""
4118 func.AddCmdArg(Argument("client_id", 'uint32'))
4120 def WriteServiceUnitTest(self, func, file):
4121 """Overrriden from TypeHandler."""
4123 TEST_F(%(test_name)s, %(name)sValidArgs) {
4124 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s))
4125 .WillOnce(Return(kNewServiceId));
4126 SpecializedSetup<cmds::%(name)s, 0>(true);
4128 cmd.Init(%(args)s%(comma)skNewClientId);
4129 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4130 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4131 EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
4135 if len(func.GetOriginalArgs()):
4137 self.WriteValidUnitTest(func, file, valid_test, {
4139 'resource_type': func.name[6:],
4142 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
4143 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
4144 SpecializedSetup<cmds::%(name)s, 0>(false);
4146 cmd.Init(%(args)s%(comma)skNewClientId);
4147 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));%(gl_error_test)s
4150 self.WriteInvalidUnitTest(func, file, invalid_test, {
4154 def WriteHandlerImplementation (self, func, file):
4155 """Overrriden from TypeHandler."""
4156 file.Write(" uint32 client_id = c.client_id;\n")
4157 file.Write(" if (!%sHelper(%s)) {\n" %
4158 (func.name, func.MakeCmdArgString("")))
4159 file.Write(" return error::kInvalidArguments;\n")
4162 def WriteGLES2Implementation(self, func, file):
4163 """Overrriden from TypeHandler."""
4164 file.Write("%s GLES2Implementation::%s(%s) {\n" %
4165 (func.return_type, func.original_name,
4166 func.MakeTypedOriginalArgString("")))
4167 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
4168 func.WriteDestinationInitalizationValidation(file)
4169 self.WriteClientGLCallLog(func, file)
4170 for arg in func.GetOriginalArgs():
4171 arg.WriteClientSideValidationCode(file, func)
4172 file.Write(" GLuint client_id;\n")
4174 " GetIdHandler(id_namespaces::kProgramsAndShaders)->\n")
4175 file.Write(" MakeIds(this, 0, 1, &client_id);\n")
4176 file.Write(" helper_->%s(%s);\n" %
4177 (func.name, func.MakeCmdArgString("")))
4178 file.Write(' GPU_CLIENT_LOG("returned " << client_id);\n')
4179 file.Write(" CheckGLError();\n")
4180 file.Write(" return client_id;\n")
4185 class DeleteHandler(TypeHandler):
4186 """Handler for glDelete___ single resource type functions."""
4189 TypeHandler.__init__(self)
4191 def WriteServiceImplementation(self, func, file):
4192 """Overrriden from TypeHandler."""
4195 def WriteGLES2Implementation(self, func, file):
4196 """Overrriden from TypeHandler."""
4197 file.Write("%s GLES2Implementation::%s(%s) {\n" %
4198 (func.return_type, func.original_name,
4199 func.MakeTypedOriginalArgString("")))
4200 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
4201 func.WriteDestinationInitalizationValidation(file)
4202 self.WriteClientGLCallLog(func, file)
4203 for arg in func.GetOriginalArgs():
4204 arg.WriteClientSideValidationCode(file, func)
4206 " GPU_CLIENT_DCHECK(%s != 0);\n" % func.GetOriginalArgs()[-1].name)
4207 file.Write(" %sHelper(%s);\n" %
4208 (func.original_name, func.GetOriginalArgs()[-1].name))
4209 file.Write(" CheckGLError();\n")
4214 class DELnHandler(TypeHandler):
4215 """Handler for glDelete___ type functions."""
4218 TypeHandler.__init__(self)
4220 def WriteGetDataSizeCode(self, func, file):
4221 """Overrriden from TypeHandler."""
4222 code = """ uint32 data_size;
4223 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
4224 return error::kOutOfBounds;
4229 def WriteGLES2ImplementationUnitTest(self, func, file):
4230 """Overrriden from TypeHandler."""
4232 TEST_F(GLES2ImplementationTest, %(name)s) {
4233 GLuint ids[2] = { k%(types)sStartId, k%(types)sStartId + 1 };
4235 cmds::%(name)sImmediate del;
4239 expected.del.Init(arraysize(ids), &ids[0]);
4240 expected.data[0] = k%(types)sStartId;
4241 expected.data[1] = k%(types)sStartId + 1;
4242 gl_->%(name)s(arraysize(ids), &ids[0]);
4243 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
4248 'types': func.GetInfo('resource_types'),
4251 def WriteServiceUnitTest(self, func, file):
4252 """Overrriden from TypeHandler."""
4254 TEST_F(%(test_name)s, %(name)sValidArgs) {
4257 %(gl_func_name)s(1, Pointee(kService%(upper_resource_name)sId)))
4259 GetSharedMemoryAs<GLuint*>()[0] = client_%(resource_name)s_id_;
4260 SpecializedSetup<cmds::%(name)s, 0>(true);
4263 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4264 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4266 Get%(upper_resource_name)s(client_%(resource_name)s_id_) == NULL);
4269 self.WriteValidUnitTest(func, file, valid_test, {
4270 'resource_name': func.GetInfo('resource_type').lower(),
4271 'upper_resource_name': func.GetInfo('resource_type'),
4274 TEST_F(%(test_name)s, %(name)sInvalidArgs) {
4275 GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId;
4276 SpecializedSetup<cmds::%(name)s, 0>(false);
4279 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4282 self.WriteValidUnitTest(func, file, invalid_test)
4284 def WriteImmediateServiceUnitTest(self, func, file):
4285 """Overrriden from TypeHandler."""
4287 TEST_F(%(test_name)s, %(name)sValidArgs) {
4290 %(gl_func_name)s(1, Pointee(kService%(upper_resource_name)sId)))
4292 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
4293 SpecializedSetup<cmds::%(name)s, 0>(true);
4294 cmd.Init(1, &client_%(resource_name)s_id_);
4295 EXPECT_EQ(error::kNoError,
4296 ExecuteImmediateCmd(cmd, sizeof(client_%(resource_name)s_id_)));
4297 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4299 Get%(upper_resource_name)s(client_%(resource_name)s_id_) == NULL);
4302 self.WriteValidUnitTest(func, file, valid_test, {
4303 'resource_name': func.GetInfo('resource_type').lower(),
4304 'upper_resource_name': func.GetInfo('resource_type'),
4307 TEST_F(%(test_name)s, %(name)sInvalidArgs) {
4308 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
4309 SpecializedSetup<cmds::%(name)s, 0>(false);
4310 GLuint temp = kInvalidClientId;
4312 EXPECT_EQ(error::kNoError,
4313 ExecuteImmediateCmd(cmd, sizeof(temp)));
4316 self.WriteValidUnitTest(func, file, invalid_test)
4318 def WriteHandlerImplementation (self, func, file):
4319 """Overrriden from TypeHandler."""
4320 file.Write(" %sHelper(n, %s);\n" %
4321 (func.name, func.GetLastOriginalArg().name))
4323 def WriteImmediateHandlerImplementation (self, func, file):
4324 """Overrriden from TypeHandler."""
4325 file.Write(" %sHelper(n, %s);\n" %
4326 (func.original_name, func.GetLastOriginalArg().name))
4328 def WriteGLES2Implementation(self, func, file):
4329 """Overrriden from TypeHandler."""
4330 impl_decl = func.GetInfo('impl_decl')
4331 if impl_decl == None or impl_decl == True:
4333 'return_type': func.return_type,
4334 'name': func.original_name,
4335 'typed_args': func.MakeTypedOriginalArgString(""),
4336 'args': func.MakeOriginalArgString(""),
4337 'resource_type': func.GetInfo('resource_type').lower(),
4338 'count_name': func.GetOriginalArgs()[0].name,
4341 "%(return_type)s GLES2Implementation::%(name)s(%(typed_args)s) {\n" %
4343 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
4344 func.WriteDestinationInitalizationValidation(file)
4345 self.WriteClientGLCallLog(func, file)
4346 file.Write(""" GPU_CLIENT_LOG_CODE_BLOCK({
4347 for (GLsizei i = 0; i < n; ++i) {
4348 GPU_CLIENT_LOG(" " << i << ": " << %s[i]);
4351 """ % func.GetOriginalArgs()[1].name)
4352 file.Write(""" GPU_CLIENT_DCHECK_CODE_BLOCK({
4353 for (GLsizei i = 0; i < n; ++i) {
4354 GPU_DCHECK(%s[i] != 0);
4357 """ % func.GetOriginalArgs()[1].name)
4358 for arg in func.GetOriginalArgs():
4359 arg.WriteClientSideValidationCode(file, func)
4360 code = """ %(name)sHelper(%(args)s);
4365 file.Write(code % args)
4367 def WriteImmediateCmdComputeSize(self, func, file):
4368 """Overrriden from TypeHandler."""
4369 file.Write(" static uint32 ComputeDataSize(GLsizei n) {\n")
4371 " return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT\n")
4374 file.Write(" static uint32 ComputeSize(GLsizei n) {\n")
4375 file.Write(" return static_cast<uint32>(\n")
4376 file.Write(" sizeof(ValueType) + ComputeDataSize(n)); // NOLINT\n")
4380 def WriteImmediateCmdSetHeader(self, func, file):
4381 """Overrriden from TypeHandler."""
4382 file.Write(" void SetHeader(GLsizei n) {\n")
4383 file.Write(" header.SetCmdByTotalSize<ValueType>(ComputeSize(n));\n")
4387 def WriteImmediateCmdInit(self, func, file):
4388 """Overrriden from TypeHandler."""
4389 last_arg = func.GetLastOriginalArg()
4390 file.Write(" void Init(%s, %s _%s) {\n" %
4391 (func.MakeTypedCmdArgString("_"),
4392 last_arg.type, last_arg.name))
4393 file.Write(" SetHeader(_n);\n")
4394 args = func.GetCmdArgs()
4396 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
4397 file.Write(" memcpy(ImmediateDataAddress(this),\n")
4398 file.Write(" _%s, ComputeDataSize(_n));\n" % last_arg.name)
4402 def WriteImmediateCmdSet(self, func, file):
4403 """Overrriden from TypeHandler."""
4404 last_arg = func.GetLastOriginalArg()
4405 copy_args = func.MakeCmdArgString("_", False)
4406 file.Write(" void* Set(void* cmd%s, %s _%s) {\n" %
4407 (func.MakeTypedCmdArgString("_", True),
4408 last_arg.type, last_arg.name))
4409 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
4410 (copy_args, last_arg.name))
4411 file.Write(" const uint32 size = ComputeSize(_n);\n")
4412 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
4417 def WriteImmediateCmdHelper(self, func, file):
4418 """Overrriden from TypeHandler."""
4419 code = """ void %(name)s(%(typed_args)s) {
4420 const uint32 size = gles2::cmds::%(name)s::ComputeSize(n);
4421 gles2::cmds::%(name)s* c =
4422 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
4431 "typed_args": func.MakeTypedOriginalArgString(""),
4432 "args": func.MakeOriginalArgString(""),
4435 def WriteImmediateFormatTest(self, func, file):
4436 """Overrriden from TypeHandler."""
4437 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
4438 file.Write(" static GLuint ids[] = { 12, 23, 34, };\n")
4439 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
4440 (func.name, func.name))
4441 file.Write(" void* next_cmd = cmd.Set(\n")
4442 file.Write(" &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n")
4443 file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" %
4445 file.Write(" cmd.header.command);\n")
4446 file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
4447 file.Write(" RoundSizeToMultipleOfEntries(cmd.n * 4u),\n")
4448 file.Write(" cmd.header.size * 4u);\n")
4449 file.Write(" EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n);\n");
4450 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
4451 file.Write(" next_cmd, sizeof(cmd) +\n")
4452 file.Write(" RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n")
4453 file.Write(" // TODO(gman): Check that ids were inserted;\n")
4458 class GETnHandler(TypeHandler):
4459 """Handler for GETn for glGetBooleanv, glGetFloatv, ... type functions."""
4462 TypeHandler.__init__(self)
4464 def AddImmediateFunction(self, generator, func):
4465 """Overrriden from TypeHandler."""
4468 def WriteServiceImplementation(self, func, file):
4469 """Overrriden from TypeHandler."""
4471 "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
4473 " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" %
4475 last_arg = func.GetLastOriginalArg()
4477 all_but_last_args = func.GetOriginalArgs()[:-1]
4478 for arg in all_but_last_args:
4479 arg.WriteGetCode(file)
4481 code = """ typedef cmds::%(func_name)s::Result Result;
4482 GLsizei num_values = 0;
4483 GetNumValuesReturnedForGLGet(pname, &num_values);
4484 Result* result = GetSharedMemoryAs<Result*>(
4485 c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
4486 %(last_arg_type)s params = result ? result->GetData() : NULL;
4489 'last_arg_type': last_arg.type,
4490 'func_name': func.name,
4492 func.WriteHandlerValidation(file)
4493 code = """ // Check that the client initialized the result.
4494 if (result->size != 0) {
4495 return error::kInvalidArguments;
4498 shadowed = func.GetInfo('shadowed')
4500 file.Write(' LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("%s");\n' % func.name)
4502 func.WriteHandlerImplementation(file)
4504 code = """ result->SetNumResults(num_values);
4505 return error::kNoError;
4509 code = """ GLenum error = glGetError();
4510 if (error == GL_NO_ERROR) {
4511 result->SetNumResults(num_values);
4513 LOCAL_SET_GL_ERROR(error, "%(func_name)s", "");
4515 return error::kNoError;
4519 file.Write(code % {'func_name': func.name})
4521 def WriteGLES2Implementation(self, func, file):
4522 """Overrriden from TypeHandler."""
4523 impl_decl = func.GetInfo('impl_decl')
4524 if impl_decl == None or impl_decl == True:
4525 file.Write("%s GLES2Implementation::%s(%s) {\n" %
4526 (func.return_type, func.original_name,
4527 func.MakeTypedOriginalArgString("")))
4528 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
4529 func.WriteDestinationInitalizationValidation(file)
4530 self.WriteClientGLCallLog(func, file)
4531 for arg in func.GetOriginalArgs():
4532 arg.WriteClientSideValidationCode(file, func)
4533 all_but_last_args = func.GetOriginalArgs()[:-1]
4535 ", ".join(["%s" % arg.name for arg in all_but_last_args]))
4537 ", ".join(["%s" % arg.name for arg in func.GetOriginalArgs()]))
4538 self.WriteTraceEvent(func, file)
4539 code = """ if (%(func_name)sHelper(%(all_arg_string)s)) {
4542 typedef cmds::%(func_name)s::Result Result;
4543 Result* result = GetResultAs<Result*>();
4547 result->SetNumResults(0);
4548 helper_->%(func_name)s(%(arg_string)s,
4549 GetResultShmId(), GetResultShmOffset());
4551 result->CopyResult(params);
4552 GPU_CLIENT_LOG_CODE_BLOCK({
4553 for (int32 i = 0; i < result->GetNumResults(); ++i) {
4554 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
4561 'func_name': func.name,
4562 'arg_string': arg_string,
4563 'all_arg_string': all_arg_string,
4566 def WriteGLES2ImplementationUnitTest(self, func, file):
4567 """Writes the GLES2 Implemention unit test."""
4569 TEST_F(GLES2ImplementationTest, %(name)s) {
4573 typedef cmds::%(name)s::Result Result;
4574 Result::Type result = 0;
4576 ExpectedMemoryInfo result1 = GetExpectedResultMemory(4);
4577 expected.cmd.Init(%(cmd_args)s, result1.id, result1.offset);
4578 EXPECT_CALL(*command_buffer(), OnFlush())
4579 .WillOnce(SetMemory(result1.ptr, SizedResultHelper<Result::Type>(1)))
4580 .RetiresOnSaturation();
4581 gl_->%(name)s(%(args)s, &result);
4582 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
4583 EXPECT_EQ(static_cast<Result::Type>(1), result);
4586 cmd_arg_strings = []
4587 for count, arg in enumerate(func.GetCmdArgs()[0:-2]):
4588 cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0))
4589 cmd_arg_strings[0] = '123'
4591 for count, arg in enumerate(func.GetOriginalArgs()[0:-1]):
4592 gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0))
4593 gl_arg_strings[0] = '123'
4596 'args': ", ".join(gl_arg_strings),
4597 'cmd_args': ", ".join(cmd_arg_strings),
4600 def WriteServiceUnitTest(self, func, file):
4601 """Overrriden from TypeHandler."""
4603 TEST_F(%(test_name)s, %(name)sValidArgs) {
4604 EXPECT_CALL(*gl_, GetError())
4605 .WillOnce(Return(GL_NO_ERROR))
4606 .WillOnce(Return(GL_NO_ERROR))
4607 .RetiresOnSaturation();
4608 SpecializedSetup<cmds::%(name)s, 0>(true);
4609 typedef cmds::%(name)s::Result Result;
4610 Result* result = static_cast<Result*>(shared_memory_address_);
4611 EXPECT_CALL(*gl_, %(gl_func_name)s(%(local_gl_args)s));
4615 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4616 EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
4618 result->GetNumResults());
4619 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4624 for count, arg in enumerate(func.GetOriginalArgs()[:-1]):
4625 arg_value = arg.GetValidGLArg(func, count, 0)
4626 gl_arg_strings.append(arg_value)
4627 if arg.name == 'pname':
4628 valid_pname = arg_value
4629 if func.GetInfo('gl_test_func') == 'glGetIntegerv':
4630 gl_arg_strings.append("_")
4632 gl_arg_strings.append("result->GetData()")
4634 self.WriteValidUnitTest(func, file, valid_test, {
4635 'local_gl_args': ", ".join(gl_arg_strings),
4636 'valid_pname': valid_pname,
4640 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
4641 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
4642 SpecializedSetup<cmds::%(name)s, 0>(false);
4643 cmds::%(name)s::Result* result =
4644 static_cast<cmds::%(name)s::Result*>(shared_memory_address_);
4648 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));
4649 EXPECT_EQ(0u, result->size);%(gl_error_test)s
4652 self.WriteInvalidUnitTest(func, file, invalid_test)
4655 class PUTHandler(TypeHandler):
4656 """Handler for glTexParameter_v, glVertexAttrib_v functions."""
4659 TypeHandler.__init__(self)
4661 def WriteServiceUnitTest(self, func, file):
4662 """Writes the service unit test for a command."""
4663 expected_call = "EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));"
4664 if func.GetInfo("first_element_only"):
4666 for count, arg in enumerate(func.GetOriginalArgs()):
4667 gl_arg_strings.append(arg.GetValidGLArg(func, count, 0))
4668 gl_arg_strings[-1] = "*" + gl_arg_strings[-1]
4669 expected_call = ("EXPECT_CALL(*gl_, %%(gl_func_name)s(%s));" %
4670 ", ".join(gl_arg_strings))
4672 TEST_F(%(test_name)s, %(name)sValidArgs) {
4673 SpecializedSetup<cmds::%(name)s, 0>(true);
4676 GetSharedMemoryAs<%(data_type)s*>()[0] = %(data_value)s;
4678 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4679 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4683 'data_type': func.GetInfo('data_type'),
4684 'data_value': func.GetInfo('data_value') or '0',
4685 'expected_call': expected_call,
4687 self.WriteValidUnitTest(func, file, valid_test, extra)
4690 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
4691 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
4692 SpecializedSetup<cmds::%(name)s, 0>(false);
4695 GetSharedMemoryAs<%(data_type)s*>()[0] = %(data_value)s;
4696 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
4699 self.WriteInvalidUnitTest(func, file, invalid_test, extra)
4701 def WriteImmediateServiceUnitTest(self, func, file):
4702 """Writes the service unit test for a command."""
4704 TEST_F(%(test_name)s, %(name)sValidArgs) {
4705 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
4706 SpecializedSetup<cmds::%(name)s, 0>(true);
4707 %(data_type)s temp[%(data_count)s] = { %(data_value)s, };
4708 cmd.Init(%(gl_args)s, &temp[0]);
4711 %(gl_func_name)s(%(gl_args)s, %(data_ref)sreinterpret_cast<
4712 %(data_type)s*>(ImmediateDataAddress(&cmd))));
4713 EXPECT_EQ(error::kNoError,
4714 ExecuteImmediateCmd(cmd, sizeof(temp)));
4715 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4720 for count, arg in enumerate(func.GetOriginalArgs()[0:-1]):
4721 gl_arg_strings.append(arg.GetValidGLArg(func, count, 0))
4722 gl_any_strings.append("_")
4724 'data_ref': ("*" if func.GetInfo('first_element_only') else ""),
4725 'data_type': func.GetInfo('data_type'),
4726 'data_count': func.GetInfo('count'),
4727 'data_value': func.GetInfo('data_value') or '0',
4728 'gl_args': ", ".join(gl_arg_strings),
4729 'gl_any_args': ", ".join(gl_any_strings),
4731 self.WriteValidUnitTest(func, file, valid_test, extra)
4734 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
4735 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
4736 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0);
4737 SpecializedSetup<cmds::%(name)s, 0>(false);
4738 %(data_type)s temp[%(data_count)s] = { %(data_value)s, };
4739 cmd.Init(%(all_but_last_args)s, &temp[0]);
4740 EXPECT_EQ(error::%(parse_result)s,
4741 ExecuteImmediateCmd(cmd, sizeof(temp)));%(gl_error_test)s
4744 self.WriteInvalidUnitTest(func, file, invalid_test, extra)
4746 def WriteGetDataSizeCode(self, func, file):
4747 """Overrriden from TypeHandler."""
4748 code = """ uint32 data_size;
4749 if (!ComputeDataSize(1, sizeof(%s), %d, &data_size)) {
4750 return error::kOutOfBounds;
4753 file.Write(code % (func.info.data_type, func.info.count))
4754 if func.is_immediate:
4755 file.Write(" if (data_size > immediate_data_size) {\n")
4756 file.Write(" return error::kOutOfBounds;\n")
4759 def WriteGLES2Implementation(self, func, file):
4760 """Overrriden from TypeHandler."""
4761 file.Write("%s GLES2Implementation::%s(%s) {\n" %
4762 (func.return_type, func.original_name,
4763 func.MakeTypedOriginalArgString("")))
4764 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
4765 func.WriteDestinationInitalizationValidation(file)
4766 self.WriteClientGLCallLog(func, file)
4767 last_arg_name = func.GetLastOriginalArg().name
4768 values_str = ' << ", " << '.join(
4769 ["%s[%d]" % (last_arg_name, ndx) for ndx in range(0, func.info.count)])
4770 file.Write(' GPU_CLIENT_LOG("values: " << %s);\n' % values_str)
4771 for arg in func.GetOriginalArgs():
4772 arg.WriteClientSideValidationCode(file, func)
4773 file.Write(" helper_->%sImmediate(%s);\n" %
4774 (func.name, func.MakeOriginalArgString("")))
4775 file.Write(" CheckGLError();\n")
4779 def WriteGLES2ImplementationUnitTest(self, func, file):
4780 """Writes the GLES2 Implemention unit test."""
4782 TEST_F(GLES2ImplementationTest, %(name)s) {
4783 %(type)s data[%(count)d] = {0};
4785 cmds::%(name)sImmediate cmd;
4786 %(type)s data[%(count)d];
4789 for (int jj = 0; jj < %(count)d; ++jj) {
4790 data[jj] = static_cast<%(type)s>(jj);
4793 expected.cmd.Init(%(cmd_args)s, &data[0]);
4794 gl_->%(name)s(%(args)s, &data[0]);
4795 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
4798 cmd_arg_strings = []
4799 for count, arg in enumerate(func.GetCmdArgs()[0:-2]):
4800 cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0))
4802 for count, arg in enumerate(func.GetOriginalArgs()[0:-1]):
4803 gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0))
4806 'type': func.GetInfo('data_type'),
4807 'count': func.GetInfo('count'),
4808 'args': ", ".join(gl_arg_strings),
4809 'cmd_args': ", ".join(cmd_arg_strings),
4812 def WriteImmediateCmdComputeSize(self, func, file):
4813 """Overrriden from TypeHandler."""
4814 file.Write(" static uint32 ComputeDataSize() {\n")
4815 file.Write(" return static_cast<uint32>(\n")
4816 file.Write(" sizeof(%s) * %d); // NOLINT\n" %
4817 (func.info.data_type, func.info.count))
4820 file.Write(" static uint32 ComputeSize() {\n")
4821 file.Write(" return static_cast<uint32>(\n")
4823 " sizeof(ValueType) + ComputeDataSize()); // NOLINT\n")
4827 def WriteImmediateCmdSetHeader(self, func, file):
4828 """Overrriden from TypeHandler."""
4829 file.Write(" void SetHeader() {\n")
4831 " header.SetCmdByTotalSize<ValueType>(ComputeSize());\n")
4835 def WriteImmediateCmdInit(self, func, file):
4836 """Overrriden from TypeHandler."""
4837 last_arg = func.GetLastOriginalArg()
4838 file.Write(" void Init(%s, %s _%s) {\n" %
4839 (func.MakeTypedCmdArgString("_"),
4840 last_arg.type, last_arg.name))
4841 file.Write(" SetHeader();\n")
4842 args = func.GetCmdArgs()
4844 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
4845 file.Write(" memcpy(ImmediateDataAddress(this),\n")
4846 file.Write(" _%s, ComputeDataSize());\n" % last_arg.name)
4850 def WriteImmediateCmdSet(self, func, file):
4851 """Overrriden from TypeHandler."""
4852 last_arg = func.GetLastOriginalArg()
4853 copy_args = func.MakeCmdArgString("_", False)
4854 file.Write(" void* Set(void* cmd%s, %s _%s) {\n" %
4855 (func.MakeTypedCmdArgString("_", True),
4856 last_arg.type, last_arg.name))
4857 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
4858 (copy_args, last_arg.name))
4859 file.Write(" const uint32 size = ComputeSize();\n")
4860 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
4865 def WriteImmediateCmdHelper(self, func, file):
4866 """Overrriden from TypeHandler."""
4867 code = """ void %(name)s(%(typed_args)s) {
4868 const uint32 size = gles2::cmds::%(name)s::ComputeSize();
4869 gles2::cmds::%(name)s* c =
4870 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
4879 "typed_args": func.MakeTypedOriginalArgString(""),
4880 "args": func.MakeOriginalArgString(""),
4883 def WriteImmediateFormatTest(self, func, file):
4884 """Overrriden from TypeHandler."""
4885 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
4886 file.Write(" const int kSomeBaseValueToTestWith = 51;\n")
4887 file.Write(" static %s data[] = {\n" % func.info.data_type)
4888 for v in range(0, func.info.count):
4889 file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
4890 (func.info.data_type, v))
4892 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
4893 (func.name, func.name))
4894 file.Write(" void* next_cmd = cmd.Set(\n")
4896 args = func.GetCmdArgs()
4897 for value, arg in enumerate(args):
4898 file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11))
4899 file.Write(",\n data);\n")
4900 args = func.GetCmdArgs()
4901 file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n"
4903 file.Write(" cmd.header.command);\n")
4904 file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
4905 file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)),\n")
4906 file.Write(" cmd.header.size * 4u);\n")
4907 for value, arg in enumerate(args):
4908 file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
4909 (arg.type, value + 11, arg.name))
4910 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
4911 file.Write(" next_cmd, sizeof(cmd) +\n")
4912 file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n")
4913 file.Write(" // TODO(gman): Check that data was inserted;\n")
4918 class PUTnHandler(TypeHandler):
4919 """Handler for PUTn 'glUniform__v' type functions."""
4922 TypeHandler.__init__(self)
4924 def WriteServiceUnitTest(self, func, file):
4925 """Overridden from TypeHandler."""
4926 TypeHandler.WriteServiceUnitTest(self, func, file)
4929 TEST_F(%(test_name)s, %(name)sValidArgsCountTooLarge) {
4930 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
4931 SpecializedSetup<cmds::%(name)s, 0>(true);
4934 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4935 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4940 for count, arg in enumerate(func.GetOriginalArgs()):
4941 # hardcoded to match unit tests.
4943 # the location of the second element of the 2nd uniform.
4944 # defined in GLES2DecoderBase::SetupShaderForUniform
4945 gl_arg_strings.append("3")
4946 arg_strings.append("ProgramManager::MakeFakeLocation(1, 1)")
4948 # the number of elements that gl will be called with.
4949 gl_arg_strings.append("3")
4950 # the number of elements requested in the command.
4951 arg_strings.append("5")
4953 gl_arg_strings.append(arg.GetValidGLArg(func, count, 0))
4954 arg_strings.append(arg.GetValidArg(func, count, 0))
4956 'gl_args': ", ".join(gl_arg_strings),
4957 'args': ", ".join(arg_strings),
4959 self.WriteValidUnitTest(func, file, valid_test, extra)
4961 def WriteImmediateServiceUnitTest(self, func, file):
4962 """Overridden from TypeHandler."""
4964 TEST_F(%(test_name)s, %(name)sValidArgs) {
4965 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
4968 %(gl_func_name)s(%(gl_args)s,
4969 reinterpret_cast<%(data_type)s*>(ImmediateDataAddress(&cmd))));
4970 SpecializedSetup<cmds::%(name)s, 0>(true);
4971 %(data_type)s temp[%(data_count)s * 2] = { 0, };
4972 cmd.Init(%(args)s, &temp[0]);
4973 EXPECT_EQ(error::kNoError,
4974 ExecuteImmediateCmd(cmd, sizeof(temp)));
4975 EXPECT_EQ(GL_NO_ERROR, GetGLError());
4981 for count, arg in enumerate(func.GetOriginalArgs()[0:-1]):
4982 gl_arg_strings.append(arg.GetValidGLArg(func, count, 0))
4983 gl_any_strings.append("_")
4984 arg_strings.append(arg.GetValidArg(func, count, 0))
4986 'data_type': func.GetInfo('data_type'),
4987 'data_count': func.GetInfo('count'),
4988 'args': ", ".join(arg_strings),
4989 'gl_args': ", ".join(gl_arg_strings),
4990 'gl_any_args': ", ".join(gl_any_strings),
4992 self.WriteValidUnitTest(func, file, valid_test, extra)
4995 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
4996 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
4997 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0);
4998 SpecializedSetup<cmds::%(name)s, 0>(false);
4999 %(data_type)s temp[%(data_count)s * 2] = { 0, };
5000 cmd.Init(%(all_but_last_args)s, &temp[0]);
5001 EXPECT_EQ(error::%(parse_result)s,
5002 ExecuteImmediateCmd(cmd, sizeof(temp)));%(gl_error_test)s
5005 self.WriteInvalidUnitTest(func, file, invalid_test, extra)
5007 def WriteGetDataSizeCode(self, func, file):
5008 """Overrriden from TypeHandler."""
5009 code = """ uint32 data_size;
5010 if (!ComputeDataSize(count, sizeof(%s), %d, &data_size)) {
5011 return error::kOutOfBounds;
5014 file.Write(code % (func.info.data_type, func.info.count))
5015 if func.is_immediate:
5016 file.Write(" if (data_size > immediate_data_size) {\n")
5017 file.Write(" return error::kOutOfBounds;\n")
5020 def WriteGLES2Implementation(self, func, file):
5021 """Overrriden from TypeHandler."""
5022 file.Write("%s GLES2Implementation::%s(%s) {\n" %
5023 (func.return_type, func.original_name,
5024 func.MakeTypedOriginalArgString("")))
5025 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
5026 func.WriteDestinationInitalizationValidation(file)
5027 self.WriteClientGLCallLog(func, file)
5028 last_arg_name = func.GetLastOriginalArg().name
5029 file.Write(""" GPU_CLIENT_LOG_CODE_BLOCK({
5030 for (GLsizei i = 0; i < count; ++i) {
5032 values_str = ' << ", " << '.join(
5033 ["%s[%d + i * %d]" % (
5034 last_arg_name, ndx, func.info.count) for ndx in range(
5035 0, func.info.count)])
5036 file.Write(' GPU_CLIENT_LOG(" " << i << ": " << %s);\n' % values_str)
5037 file.Write(" }\n });\n")
5038 for arg in func.GetOriginalArgs():
5039 arg.WriteClientSideValidationCode(file, func)
5040 file.Write(" helper_->%sImmediate(%s);\n" %
5041 (func.name, func.MakeOriginalArgString("")))
5042 file.Write(" CheckGLError();\n")
5046 def WriteGLES2ImplementationUnitTest(self, func, file):
5047 """Writes the GLES2 Implemention unit test."""
5049 TEST_F(GLES2ImplementationTest, %(name)s) {
5050 %(type)s data[%(count_param)d][%(count)d] = {{0}};
5052 cmds::%(name)sImmediate cmd;
5053 %(type)s data[%(count_param)d][%(count)d];
5057 for (int ii = 0; ii < %(count_param)d; ++ii) {
5058 for (int jj = 0; jj < %(count)d; ++jj) {
5059 data[ii][jj] = static_cast<%(type)s>(ii * %(count)d + jj);
5062 expected.cmd.Init(%(cmd_args)s, &data[0][0]);
5063 gl_->%(name)s(%(args)s, &data[0][0]);
5064 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
5067 cmd_arg_strings = []
5068 for count, arg in enumerate(func.GetCmdArgs()[0:-2]):
5069 cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0))
5072 for count, arg in enumerate(func.GetOriginalArgs()[0:-1]):
5073 gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0))
5074 if arg.name == "count":
5075 count_param = int(arg.GetValidClientSideArg(func, count, 0))
5078 'type': func.GetInfo('data_type'),
5079 'count': func.GetInfo('count'),
5080 'args': ", ".join(gl_arg_strings),
5081 'cmd_args': ", ".join(cmd_arg_strings),
5082 'count_param': count_param,
5085 def WriteImmediateCmdComputeSize(self, func, file):
5086 """Overrriden from TypeHandler."""
5087 file.Write(" static uint32 ComputeDataSize(GLsizei count) {\n")
5088 file.Write(" return static_cast<uint32>(\n")
5089 file.Write(" sizeof(%s) * %d * count); // NOLINT\n" %
5090 (func.info.data_type, func.info.count))
5093 file.Write(" static uint32 ComputeSize(GLsizei count) {\n")
5094 file.Write(" return static_cast<uint32>(\n")
5096 " sizeof(ValueType) + ComputeDataSize(count)); // NOLINT\n")
5100 def WriteImmediateCmdSetHeader(self, func, file):
5101 """Overrriden from TypeHandler."""
5102 file.Write(" void SetHeader(GLsizei count) {\n")
5104 " header.SetCmdByTotalSize<ValueType>(ComputeSize(count));\n")
5108 def WriteImmediateCmdInit(self, func, file):
5109 """Overrriden from TypeHandler."""
5110 last_arg = func.GetLastOriginalArg()
5111 file.Write(" void Init(%s, %s _%s) {\n" %
5112 (func.MakeTypedCmdArgString("_"),
5113 last_arg.type, last_arg.name))
5114 file.Write(" SetHeader(_count);\n")
5115 args = func.GetCmdArgs()
5117 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
5118 file.Write(" memcpy(ImmediateDataAddress(this),\n")
5119 file.Write(" _%s, ComputeDataSize(_count));\n" % last_arg.name)
5123 def WriteImmediateCmdSet(self, func, file):
5124 """Overrriden from TypeHandler."""
5125 last_arg = func.GetLastOriginalArg()
5126 copy_args = func.MakeCmdArgString("_", False)
5127 file.Write(" void* Set(void* cmd%s, %s _%s) {\n" %
5128 (func.MakeTypedCmdArgString("_", True),
5129 last_arg.type, last_arg.name))
5130 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
5131 (copy_args, last_arg.name))
5132 file.Write(" const uint32 size = ComputeSize(_count);\n")
5133 file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
5138 def WriteImmediateCmdHelper(self, func, file):
5139 """Overrriden from TypeHandler."""
5140 code = """ void %(name)s(%(typed_args)s) {
5141 const uint32 size = gles2::cmds::%(name)s::ComputeSize(count);
5142 gles2::cmds::%(name)s* c =
5143 GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
5152 "typed_args": func.MakeTypedOriginalArgString(""),
5153 "args": func.MakeOriginalArgString(""),
5156 def WriteImmediateFormatTest(self, func, file):
5157 """Overrriden from TypeHandler."""
5158 args = func.GetCmdArgs()
5160 for value, arg in enumerate(args):
5161 if arg.name == "count":
5162 count_param = int(arg.GetValidClientSideArg(func, value, 0))
5163 file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
5164 file.Write(" const int kSomeBaseValueToTestWith = 51;\n")
5165 file.Write(" static %s data[] = {\n" % func.info.data_type)
5166 for v in range(0, func.info.count * count_param):
5167 file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
5168 (func.info.data_type, v))
5170 file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
5171 (func.name, func.name))
5172 file.Write(" const GLsizei kNumElements = %d;\n" % count_param)
5173 file.Write(" const size_t kExpectedCmdSize =\n")
5174 file.Write(" sizeof(cmd) + kNumElements * sizeof(%s) * %d;\n" %
5175 (func.info.data_type, func.info.count))
5176 file.Write(" void* next_cmd = cmd.Set(\n")
5178 for value, arg in enumerate(args):
5179 file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 1))
5180 file.Write(",\n data);\n")
5181 file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" %
5183 file.Write(" cmd.header.command);\n")
5184 file.Write(" EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);\n")
5185 for value, arg in enumerate(args):
5186 file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
5187 (arg.type, value + 1, arg.name))
5188 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
5189 file.Write(" next_cmd, sizeof(cmd) +\n")
5190 file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n")
5191 file.Write(" // TODO(gman): Check that data was inserted;\n")
5196 class PUTXnHandler(TypeHandler):
5197 """Handler for glUniform?f functions."""
5199 TypeHandler.__init__(self)
5201 def WriteHandlerImplementation(self, func, file):
5202 """Overrriden from TypeHandler."""
5203 code = """ %(type)s temp[%(count)s] = { %(values)s};
5204 Do%(name)sv(%(location)s, 1, &temp[0]);
5207 args = func.GetOriginalArgs()
5208 count = int(func.GetInfo('count'))
5209 num_args = len(args)
5210 for ii in range(count):
5211 values += "%s, " % args[len(args) - count + ii].name
5215 'count': func.GetInfo('count'),
5216 'type': func.GetInfo('data_type'),
5217 'location': args[0].name,
5218 'args': func.MakeOriginalArgString(""),
5222 def WriteServiceUnitTest(self, func, file):
5223 """Overrriden from TypeHandler."""
5225 TEST_F(%(test_name)s, %(name)sValidArgs) {
5226 EXPECT_CALL(*gl_, %(name)sv(%(local_args)s));
5227 SpecializedSetup<cmds::%(name)s, 0>(true);
5230 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5231 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5234 args = func.GetOriginalArgs()
5235 local_args = "%s, 1, _" % args[0].GetValidGLArg(func, 0, 0)
5236 self.WriteValidUnitTest(func, file, valid_test, {
5238 'count': func.GetInfo('count'),
5239 'local_args': local_args,
5243 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
5244 EXPECT_CALL(*gl_, %(name)sv(_, _, _).Times(0);
5245 SpecializedSetup<cmds::%(name)s, 0>(false);
5248 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
5251 self.WriteInvalidUnitTest(func, file, invalid_test, {
5252 'name': func.GetInfo('name'),
5253 'count': func.GetInfo('count'),
5257 class GLcharHandler(CustomHandler):
5258 """Handler for functions that pass a single string ."""
5261 CustomHandler.__init__(self)
5263 def WriteImmediateCmdComputeSize(self, func, file):
5264 """Overrriden from TypeHandler."""
5265 file.Write(" static uint32 ComputeSize(uint32 data_size) {\n")
5266 file.Write(" return static_cast<uint32>(\n")
5267 file.Write(" sizeof(ValueType) + data_size); // NOLINT\n")
5270 def WriteImmediateCmdSetHeader(self, func, file):
5271 """Overrriden from TypeHandler."""
5273 void SetHeader(uint32 data_size) {
5274 header.SetCmdBySize<ValueType>(data_size);
5279 def WriteImmediateCmdInit(self, func, file):
5280 """Overrriden from TypeHandler."""
5281 last_arg = func.GetLastOriginalArg()
5282 args = func.GetCmdArgs()
5285 set_code.append(" %s = _%s;" % (arg.name, arg.name))
5287 void Init(%(typed_args)s, uint32 _data_size) {
5288 SetHeader(_data_size);
5290 memcpy(ImmediateDataAddress(this), _%(last_arg)s, _data_size);
5295 "typed_args": func.MakeTypedOriginalArgString("_"),
5296 "set_code": "\n".join(set_code),
5297 "last_arg": last_arg.name
5300 def WriteImmediateCmdSet(self, func, file):
5301 """Overrriden from TypeHandler."""
5302 last_arg = func.GetLastOriginalArg()
5303 file.Write(" void* Set(void* cmd%s, uint32 _data_size) {\n" %
5304 func.MakeTypedOriginalArgString("_", True))
5305 file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _data_size);\n" %
5306 func.MakeOriginalArgString("_"))
5307 file.Write(" return NextImmediateCmdAddress<ValueType>("
5308 "cmd, _data_size);\n")
5312 def WriteImmediateCmdHelper(self, func, file):
5313 """Overrriden from TypeHandler."""
5314 code = """ void %(name)s(%(typed_args)s) {
5315 const uint32 data_size = strlen(name);
5316 gles2::cmds::%(name)s* c =
5317 GetImmediateCmdSpace<gles2::cmds::%(name)s>(data_size);
5319 c->Init(%(args)s, data_size);
5326 "typed_args": func.MakeTypedOriginalArgString(""),
5327 "args": func.MakeOriginalArgString(""),
5331 def WriteImmediateFormatTest(self, func, file):
5332 """Overrriden from TypeHandler."""
5335 all_but_last_arg = func.GetCmdArgs()[:-1]
5336 for value, arg in enumerate(all_but_last_arg):
5337 init_code.append(" static_cast<%s>(%d)," % (arg.type, value + 11))
5338 for value, arg in enumerate(all_but_last_arg):
5339 check_code.append(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);" %
5340 (arg.type, value + 11, arg.name))
5342 TEST_F(GLES2FormatTest, %(func_name)s) {
5343 cmds::%(func_name)s& cmd = *GetBufferAs<cmds::%(func_name)s>();
5344 static const char* const test_str = \"test string\";
5345 void* next_cmd = cmd.Set(
5350 EXPECT_EQ(static_cast<uint32>(cmds::%(func_name)s::kCmdId),
5351 cmd.header.command);
5352 EXPECT_EQ(sizeof(cmd) +
5353 RoundSizeToMultipleOfEntries(strlen(test_str)),
5354 cmd.header.size * 4u);
5355 EXPECT_EQ(static_cast<char*>(next_cmd),
5356 reinterpret_cast<char*>(&cmd) + sizeof(cmd) +
5357 RoundSizeToMultipleOfEntries(strlen(test_str)));
5359 EXPECT_EQ(static_cast<uint32>(strlen(test_str)), cmd.data_size);
5360 EXPECT_EQ(0, memcmp(test_str, ImmediateDataAddress(&cmd), strlen(test_str)));
5363 sizeof(cmd) + RoundSizeToMultipleOfEntries(strlen(test_str)),
5364 sizeof(cmd) + strlen(test_str));
5369 'func_name': func.name,
5370 'init_code': "\n".join(init_code),
5371 'check_code': "\n".join(check_code),
5375 class GLcharNHandler(CustomHandler):
5376 """Handler for functions that pass a single string with an optional len."""
5379 CustomHandler.__init__(self)
5381 def InitFunction(self, func):
5382 """Overrriden from TypeHandler."""
5384 func.AddCmdArg(Argument('bucket_id', 'GLuint'))
5386 def AddImmediateFunction(self, generator, func):
5387 """Overrriden from TypeHandler."""
5390 def AddBucketFunction(self, generator, func):
5391 """Overrriden from TypeHandler."""
5394 def WriteServiceImplementation(self, func, file):
5395 """Overrriden from TypeHandler."""
5396 file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s(
5397 uint32 immediate_data_size, const gles2::cmds::%(name)s& c) {
5398 GLuint bucket_id = static_cast<GLuint>(c.%(bucket_id)s);
5399 Bucket* bucket = GetBucket(bucket_id);
5400 if (!bucket || bucket->size() == 0) {
5401 return error::kInvalidArguments;
5404 if (!bucket->GetAsString(&str)) {
5405 return error::kInvalidArguments;
5407 %(gl_func_name)s(0, str.c_str());
5408 return error::kNoError;
5413 'gl_func_name': func.GetGLFunctionName(),
5414 'bucket_id': func.cmd_args[0].name,
5418 class IsHandler(TypeHandler):
5419 """Handler for glIs____ type and glGetError functions."""
5422 TypeHandler.__init__(self)
5424 def InitFunction(self, func):
5425 """Overrriden from TypeHandler."""
5426 func.AddCmdArg(Argument("result_shm_id", 'uint32'))
5427 func.AddCmdArg(Argument("result_shm_offset", 'uint32'))
5428 if func.GetInfo('result') == None:
5429 func.AddInfo('result', ['uint32'])
5431 def WriteServiceUnitTest(self, func, file):
5432 """Overrriden from TypeHandler."""
5434 TEST_F(%(test_name)s, %(name)sValidArgs) {
5435 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
5436 SpecializedSetup<cmds::%(name)s, 0>(true);
5438 cmd.Init(%(args)s%(comma)sshared_memory_id_, shared_memory_offset_);
5439 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5440 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5444 if len(func.GetOriginalArgs()):
5446 self.WriteValidUnitTest(func, file, valid_test, {
5451 TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
5452 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
5453 SpecializedSetup<cmds::%(name)s, 0>(false);
5455 cmd.Init(%(args)s%(comma)sshared_memory_id_, shared_memory_offset_);
5456 EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
5459 self.WriteInvalidUnitTest(func, file, invalid_test, {
5464 TEST_F(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) {
5465 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
5466 SpecializedSetup<cmds::%(name)s, 0>(false);
5468 cmd.Init(%(args)s%(comma)skInvalidSharedMemoryId, shared_memory_offset_);
5469 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
5470 cmd.Init(%(args)s%(comma)sshared_memory_id_, kInvalidSharedMemoryOffset);
5471 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
5474 self.WriteValidUnitTest(func, file, invalid_test, {
5478 def WriteServiceImplementation(self, func, file):
5479 """Overrriden from TypeHandler."""
5481 "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
5483 " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" %
5485 args = func.GetOriginalArgs()
5487 arg.WriteGetCode(file)
5489 code = """ typedef cmds::%(func_name)s::Result Result;
5490 Result* result_dst = GetSharedMemoryAs<Result*>(
5491 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
5493 return error::kOutOfBounds;
5496 file.Write(code % {'func_name': func.name})
5497 func.WriteHandlerValidation(file)
5498 file.Write(" *result_dst = %s(%s);\n" %
5499 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
5500 file.Write(" return error::kNoError;\n")
5504 def WriteGLES2Implementation(self, func, file):
5505 """Overrriden from TypeHandler."""
5506 impl_func = func.GetInfo('impl_func')
5507 if impl_func == None or impl_func == True:
5508 error_value = func.GetInfo("error_value") or "GL_FALSE"
5509 file.Write("%s GLES2Implementation::%s(%s) {\n" %
5510 (func.return_type, func.original_name,
5511 func.MakeTypedOriginalArgString("")))
5512 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
5513 self.WriteTraceEvent(func, file)
5514 func.WriteDestinationInitalizationValidation(file)
5515 self.WriteClientGLCallLog(func, file)
5516 file.Write(" typedef cmds::%s::Result Result;\n" % func.name)
5517 file.Write(" Result* result = GetResultAs<Result*>();\n")
5518 file.Write(" if (!result) {\n")
5519 file.Write(" return %s;\n" % error_value)
5521 file.Write(" *result = 0;\n")
5522 arg_string = func.MakeOriginalArgString("")
5524 if len(arg_string) > 0:
5527 " helper_->%s(%s%sGetResultShmId(), GetResultShmOffset());\n" %
5528 (func.name, arg_string, comma))
5529 file.Write(" WaitForCmd();\n")
5530 file.Write(" %s result_value = *result;\n" % func.return_type)
5531 file.Write(' GPU_CLIENT_LOG("returned " << result_value);\n')
5532 file.Write(" CheckGLError();\n")
5533 file.Write(" return result_value;\n")
5537 def WriteGLES2ImplementationUnitTest(self, func, file):
5538 """Overrriden from TypeHandler."""
5539 client_test = func.GetInfo('client_test')
5540 if client_test == None or client_test == True:
5542 TEST_F(GLES2ImplementationTest, %(name)s) {
5547 typedef cmds::%(name)s::Result Result;
5549 ExpectedMemoryInfo result1 =
5550 GetExpectedResultMemory(sizeof(cmds::%(name)s::Result));
5551 expected.cmd.Init(1, result1.id, result1.offset);
5553 EXPECT_CALL(*command_buffer(), OnFlush())
5554 .WillOnce(SetMemory(result1.ptr, uint32(1)))
5555 .RetiresOnSaturation();
5557 GLboolean result = gl_->%(name)s(1);
5558 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
5559 EXPECT_TRUE(result);
5567 class STRnHandler(TypeHandler):
5568 """Handler for GetProgramInfoLog, GetShaderInfoLog, GetShaderSource, and
5569 GetTranslatedShaderSourceANGLE."""
5572 TypeHandler.__init__(self)
5574 def InitFunction(self, func):
5575 """Overrriden from TypeHandler."""
5576 # remove all but the first cmd args.
5577 cmd_args = func.GetCmdArgs()
5579 func.AddCmdArg(cmd_args[0])
5580 # add on a bucket id.
5581 func.AddCmdArg(Argument('bucket_id', 'uint32'))
5583 def WriteGLES2Implementation(self, func, file):
5584 """Overrriden from TypeHandler."""
5585 code_1 = """%(return_type)s GLES2Implementation::%(func_name)s(%(args)s) {
5586 GPU_CLIENT_SINGLE_THREAD_CHECK();
5588 code_2 = """ GPU_CLIENT_LOG("[" << GetLogPrefix()
5589 << "] gl%(func_name)s" << "("
5592 << static_cast<void*>(%(arg2)s) << ", "
5593 << static_cast<void*>(%(arg3)s) << ")");
5594 helper_->SetBucketSize(kResultBucketId, 0);
5595 helper_->%(func_name)s(%(id_name)s, kResultBucketId);
5597 GLsizei max_size = 0;
5598 if (GetBucketAsString(kResultBucketId, &str)) {
5601 std::min(static_cast<size_t>(%(bufsize_name)s) - 1, str.size());
5602 memcpy(%(dest_name)s, str.c_str(), max_size);
5603 %(dest_name)s[max_size] = '\\0';
5604 GPU_CLIENT_LOG("------\\n" << %(dest_name)s << "\\n------");
5607 if (%(length_name)s != NULL) {
5608 *%(length_name)s = max_size;
5613 args = func.GetOriginalArgs()
5615 'return_type': func.return_type,
5616 'func_name': func.original_name,
5617 'args': func.MakeTypedOriginalArgString(""),
5618 'id_name': args[0].name,
5619 'bufsize_name': args[1].name,
5620 'length_name': args[2].name,
5621 'dest_name': args[3].name,
5622 'arg0': args[0].name,
5623 'arg1': args[1].name,
5624 'arg2': args[2].name,
5625 'arg3': args[3].name,
5627 file.Write(code_1 % str_args)
5628 func.WriteDestinationInitalizationValidation(file)
5629 file.Write(code_2 % str_args)
5631 def WriteServiceUnitTest(self, func, file):
5632 """Overrriden from TypeHandler."""
5634 TEST_F(%(test_name)s, %(name)sValidArgs) {
5635 const char* kInfo = "hello";
5636 const uint32 kBucketId = 123;
5637 SpecializedSetup<cmds::%(name)s, 0>(true);
5639 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s))
5640 .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)),
5641 SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1)));
5644 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5645 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
5646 ASSERT_TRUE(bucket != NULL);
5647 EXPECT_EQ(strlen(kInfo) + 1, bucket->size());
5648 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kInfo,
5650 EXPECT_EQ(GL_NO_ERROR, GetGLError());
5653 args = func.GetOriginalArgs()
5654 id_name = args[0].GetValidGLArg(func, 0, 0)
5655 get_len_func = func.GetInfo('get_len_func')
5656 get_len_enum = func.GetInfo('get_len_enum')
5659 'get_len_func': get_len_func,
5660 'get_len_enum': get_len_enum,
5661 'gl_args': '%s, strlen(kInfo) + 1, _, _' %
5662 args[0].GetValidGLArg(func, 0, 0),
5663 'args': '%s, kBucketId' % args[0].GetValidArg(func, 0, 0),
5664 'expect_len_code': '',
5666 if get_len_func and get_len_func[0:2] == 'gl':
5667 sub['expect_len_code'] = (
5668 " EXPECT_CALL(*gl_, %s(%s, %s, _))\n"
5669 " .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1));") % (
5670 get_len_func[2:], id_name, get_len_enum)
5671 self.WriteValidUnitTest(func, file, valid_test, sub)
5674 TEST_F(%(test_name)s, %(name)sInvalidArgs) {
5675 const uint32 kBucketId = 123;
5676 EXPECT_CALL(*gl_, %(gl_func_name)s(_, _, _, _))
5679 cmd.Init(kInvalidClientId, kBucketId);
5680 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5681 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
5684 self.WriteValidUnitTest(func, file, invalid_test)
5686 def WriteServiceImplementation(self, func, file):
5687 """Overrriden from TypeHandler."""
5691 class FunctionInfo(object):
5692 """Holds info about a function."""
5694 def __init__(self, info, type_handler):
5696 setattr(self, key, info[key])
5697 self.type_handler = type_handler
5698 if not 'type' in info:
5702 class Argument(object):
5703 """A class that represents a function argument."""
5708 'GLintptr': 'int32',
5710 'GLsizeiptr': 'int32',
5712 'GLclampf': 'float',
5714 need_validation_ = ['GLsizei*', 'GLboolean*', 'GLenum*', 'GLint*']
5716 def __init__(self, name, type):
5718 self.optional = type.endswith("Optional*")
5720 type = type[:-9] + "*"
5723 if type in self.cmd_type_map_:
5724 self.cmd_type = self.cmd_type_map_[type]
5726 self.cmd_type = 'uint32'
5728 def IsPointer(self):
5729 """Returns true if argument is a pointer."""
5732 def AddCmdArgs(self, args):
5733 """Adds command arguments for this argument to the given list."""
5734 return args.append(self)
5736 def AddInitArgs(self, args):
5737 """Adds init arguments for this argument to the given list."""
5738 return args.append(self)
5740 def GetValidArg(self, func, offset, index):
5741 """Gets a valid value for this argument."""
5742 valid_arg = func.GetValidArg(offset)
5743 if valid_arg != None:
5745 return str(offset + 1)
5747 def GetValidClientSideArg(self, func, offset, index):
5748 """Gets a valid value for this argument."""
5749 return str(offset + 1)
5751 def GetValidClientSideCmdArg(self, func, offset, index):
5752 """Gets a valid value for this argument."""
5753 return str(offset + 1)
5755 def GetValidGLArg(self, func, offset, index):
5756 """Gets a valid GL value for this argument."""
5757 valid_arg = func.GetValidArg(offset)
5758 if valid_arg != None:
5760 return str(offset + 1)
5762 def GetNumInvalidValues(self, func):
5763 """returns the number of invalid values to be tested."""
5766 def GetInvalidArg(self, offset, index):
5767 """returns an invalid value and expected parse result by index."""
5768 return ("---ERROR0---", "---ERROR2---", None)
5770 def GetLogArg(self):
5771 """Get argument appropriate for LOG macro."""
5772 if self.type == 'GLboolean':
5773 return 'GLES2Util::GetStringBool(%s)' % self.name
5774 if self.type == 'GLenum':
5775 return 'GLES2Util::GetStringEnum(%s)' % self.name
5778 def WriteGetCode(self, file):
5779 """Writes the code to get an argument from a command structure."""
5780 file.Write(" %s %s = static_cast<%s>(c.%s);\n" %
5781 (self.type, self.name, self.type, self.name))
5783 def WriteValidationCode(self, file, func):
5784 """Writes the validation code for an argument."""
5787 def WriteClientSideValidationCode(self, file, func):
5788 """Writes the validation code for an argument."""
5791 def WriteDestinationInitalizationValidation(self, file, func):
5792 """Writes the client side destintion initialization validation."""
5795 def WriteDestinationInitalizationValidatationIfNeeded(self, file, func):
5796 """Writes the client side destintion initialization validation if needed."""
5797 parts = self.type.split(" ")
5800 if parts[0] in self.need_validation_:
5802 " GPU_CLIENT_VALIDATE_DESTINATION_%sINITALIZATION(%s, %s);\n" %
5803 ("OPTIONAL_" if self.optional else "", self.type[:-1], self.name))
5806 def WriteGetAddress(self, file):
5807 """Writes the code to get the address this argument refers to."""
5810 def GetImmediateVersion(self):
5811 """Gets the immediate version of this argument."""
5814 def GetBucketVersion(self):
5815 """Gets the bucket version of this argument."""
5819 class BoolArgument(Argument):
5820 """class for GLboolean"""
5822 def __init__(self, name, type):
5823 Argument.__init__(self, name, 'GLboolean')
5825 def GetValidArg(self, func, offset, index):
5826 """Gets a valid value for this argument."""
5829 def GetValidClientSideArg(self, func, offset, index):
5830 """Gets a valid value for this argument."""
5833 def GetValidClientSideCmdArg(self, func, offset, index):
5834 """Gets a valid value for this argument."""
5837 def GetValidGLArg(self, func, offset, index):
5838 """Gets a valid GL value for this argument."""
5842 class UniformLocationArgument(Argument):
5843 """class for uniform locations."""
5845 def __init__(self, name):
5846 Argument.__init__(self, name, "GLint")
5848 def WriteGetCode(self, file):
5849 """Writes the code to get an argument from a command structure."""
5850 code = """ %s %s = static_cast<%s>(c.%s);
5852 file.Write(code % (self.type, self.name, self.type, self.name))
5854 def GetValidArg(self, func, offset, index):
5855 """Gets a valid value for this argument."""
5856 return "%d" % (offset + 1)
5859 class DataSizeArgument(Argument):
5860 """class for data_size which Bucket commands do not need."""
5862 def __init__(self, name):
5863 Argument.__init__(self, name, "uint32")
5865 def GetBucketVersion(self):
5869 class SizeArgument(Argument):
5870 """class for GLsizei and GLsizeiptr."""
5872 def __init__(self, name, type):
5873 Argument.__init__(self, name, type)
5875 def GetNumInvalidValues(self, func):
5876 """overridden from Argument."""
5877 if func.is_immediate:
5881 def GetInvalidArg(self, offset, index):
5882 """overridden from Argument."""
5883 return ("-1", "kNoError", "GL_INVALID_VALUE")
5885 def WriteValidationCode(self, file, func):
5886 """overridden from Argument."""
5887 file.Write(" if (%s < 0) {\n" % self.name)
5889 " LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, \"gl%s\", \"%s < 0\");\n" %
5890 (func.original_name, self.name))
5891 file.Write(" return error::kNoError;\n")
5894 def WriteClientSideValidationCode(self, file, func):
5895 """overridden from Argument."""
5896 file.Write(" if (%s < 0) {\n" % self.name)
5898 " SetGLError(GL_INVALID_VALUE, \"gl%s\", \"%s < 0\");\n" %
5899 (func.original_name, self.name))
5900 file.Write(" return;\n")
5904 class SizeNotNegativeArgument(SizeArgument):
5905 """class for GLsizeiNotNegative. It's NEVER allowed to be negative"""
5907 def __init__(self, name, type, gl_type):
5908 SizeArgument.__init__(self, name, gl_type)
5910 def GetInvalidArg(self, offset, index):
5911 """overridden from SizeArgument."""
5912 return ("-1", "kOutOfBounds", "GL_NO_ERROR")
5914 def WriteValidationCode(self, file, func):
5915 """overridden from SizeArgument."""
5919 class EnumBaseArgument(Argument):
5920 """Base class for EnumArgument, IntArgument and ValidatedBoolArgument"""
5922 def __init__(self, name, gl_type, type, gl_error):
5923 Argument.__init__(self, name, gl_type)
5925 self.local_type = type
5926 self.gl_error = gl_error
5927 name = type[len(gl_type):]
5928 self.type_name = name
5929 self.enum_info = _ENUM_LISTS[name]
5931 def WriteValidationCode(self, file, func):
5932 file.Write(" if (!validators_->%s.IsValid(%s)) {\n" %
5933 (ToUnderscore(self.type_name), self.name))
5934 if self.gl_error == "GL_INVALID_ENUM":
5936 " LOCAL_SET_GL_ERROR_INVALID_ENUM(\"gl%s\", %s, \"%s\");\n" %
5937 (func.original_name, self.name, self.name))
5940 " LOCAL_SET_GL_ERROR(%s, \"gl%s\", \"%s %s\");\n" %
5941 (self.gl_error, func.original_name, self.name, self.gl_error))
5942 file.Write(" return error::kNoError;\n")
5945 def GetValidArg(self, func, offset, index):
5946 valid_arg = func.GetValidArg(offset)
5947 if valid_arg != None:
5949 if 'valid' in self.enum_info:
5950 valid = self.enum_info['valid']
5951 num_valid = len(valid)
5952 if index >= num_valid:
5953 index = num_valid - 1
5955 return str(offset + 1)
5957 def GetValidClientSideArg(self, func, offset, index):
5958 """Gets a valid value for this argument."""
5959 return self.GetValidArg(func, offset, index)
5961 def GetValidClientSideCmdArg(self, func, offset, index):
5962 """Gets a valid value for this argument."""
5963 return self.GetValidArg(func, offset, index)
5965 def GetValidGLArg(self, func, offset, index):
5966 """Gets a valid value for this argument."""
5967 return self.GetValidArg(func, offset, index)
5969 def GetNumInvalidValues(self, func):
5970 """returns the number of invalid values to be tested."""
5971 if 'invalid' in self.enum_info:
5972 invalid = self.enum_info['invalid']
5976 def GetInvalidArg(self, offset, index):
5977 """returns an invalid value by index."""
5978 if 'invalid' in self.enum_info:
5979 invalid = self.enum_info['invalid']
5980 num_invalid = len(invalid)
5981 if index >= num_invalid:
5982 index = num_invalid - 1
5983 return (invalid[index], "kNoError", self.gl_error)
5984 return ("---ERROR1---", "kNoError", self.gl_error)
5987 class EnumArgument(EnumBaseArgument):
5988 """A class that represents a GLenum argument"""
5990 def __init__(self, name, type):
5991 EnumBaseArgument.__init__(self, name, "GLenum", type, "GL_INVALID_ENUM")
5993 def GetLogArg(self):
5994 """Overridden from Argument."""
5995 return ("GLES2Util::GetString%s(%s)" %
5996 (self.type_name, self.name))
5999 class IntArgument(EnumBaseArgument):
6000 """A class for a GLint argument that can only except specific values.
6002 For example glTexImage2D takes a GLint for its internalformat
6003 argument instead of a GLenum.
6006 def __init__(self, name, type):
6007 EnumBaseArgument.__init__(self, name, "GLint", type, "GL_INVALID_VALUE")
6010 class ValidatedBoolArgument(EnumBaseArgument):
6011 """A class for a GLboolean argument that can only except specific values.
6013 For example glUniformMatrix takes a GLboolean for it's transpose but it
6017 def __init__(self, name, type):
6018 EnumBaseArgument.__init__(self, name, "GLboolean", type, "GL_INVALID_VALUE")
6020 def GetLogArg(self):
6021 """Overridden from Argument."""
6022 return 'GLES2Util::GetStringBool(%s)' % self.name
6025 class ImmediatePointerArgument(Argument):
6026 """A class that represents an immediate argument to a function.
6028 An immediate argument is one where the data follows the command.
6031 def __init__(self, name, type):
6032 Argument.__init__(self, name, type)
6034 def AddCmdArgs(self, args):
6035 """Overridden from Argument."""
6038 def WriteGetCode(self, file):
6039 """Overridden from Argument."""
6041 " %s %s = GetImmediateDataAs<%s>(\n" %
6042 (self.type, self.name, self.type))
6043 file.Write(" c, data_size, immediate_data_size);\n")
6045 def WriteValidationCode(self, file, func):
6046 """Overridden from Argument."""
6047 file.Write(" if (%s == NULL) {\n" % self.name)
6048 file.Write(" return error::kOutOfBounds;\n")
6051 def GetImmediateVersion(self):
6052 """Overridden from Argument."""
6055 def WriteDestinationInitalizationValidation(self, file, func):
6056 """Overridden from Argument."""
6057 self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
6059 def GetLogArg(self):
6060 """Overridden from Argument."""
6061 return "static_cast<const void*>(%s)" % self.name
6064 class BucketPointerArgument(Argument):
6065 """A class that represents an bucket argument to a function."""
6067 def __init__(self, name, type):
6068 Argument.__init__(self, name, type)
6070 def AddCmdArgs(self, args):
6071 """Overridden from Argument."""
6074 def WriteGetCode(self, file):
6075 """Overridden from Argument."""
6077 " %s %s = bucket->GetData(0, data_size);\n" %
6078 (self.type, self.name))
6080 def WriteValidationCode(self, file, func):
6081 """Overridden from Argument."""
6084 def GetImmediateVersion(self):
6085 """Overridden from Argument."""
6088 def WriteDestinationInitalizationValidation(self, file, func):
6089 """Overridden from Argument."""
6090 self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
6092 def GetLogArg(self):
6093 """Overridden from Argument."""
6094 return "static_cast<const void*>(%s)" % self.name
6097 class PointerArgument(Argument):
6098 """A class that represents a pointer argument to a function."""
6100 def __init__(self, name, type):
6101 Argument.__init__(self, name, type)
6103 def IsPointer(self):
6104 """Returns true if argument is a pointer."""
6107 def GetValidArg(self, func, offset, index):
6108 """Overridden from Argument."""
6109 return "shared_memory_id_, shared_memory_offset_"
6111 def GetValidGLArg(self, func, offset, index):
6112 """Overridden from Argument."""
6113 return "reinterpret_cast<%s>(shared_memory_address_)" % self.type
6115 def GetNumInvalidValues(self, func):
6116 """Overridden from Argument."""
6119 def GetInvalidArg(self, offset, index):
6120 """Overridden from Argument."""
6122 return ("kInvalidSharedMemoryId, 0", "kOutOfBounds", None)
6124 return ("shared_memory_id_, kInvalidSharedMemoryOffset",
6125 "kOutOfBounds", None)
6127 def GetLogArg(self):
6128 """Overridden from Argument."""
6129 return "static_cast<const void*>(%s)" % self.name
6131 def AddCmdArgs(self, args):
6132 """Overridden from Argument."""
6133 args.append(Argument("%s_shm_id" % self.name, 'uint32'))
6134 args.append(Argument("%s_shm_offset" % self.name, 'uint32'))
6136 def WriteGetCode(self, file):
6137 """Overridden from Argument."""
6139 " %s %s = GetSharedMemoryAs<%s>(\n" %
6140 (self.type, self.name, self.type))
6142 " c.%s_shm_id, c.%s_shm_offset, data_size);\n" %
6143 (self.name, self.name))
6145 def WriteGetAddress(self, file):
6146 """Overridden from Argument."""
6148 " %s %s = GetSharedMemoryAs<%s>(\n" %
6149 (self.type, self.name, self.type))
6151 " %s_shm_id, %s_shm_offset, %s_size);\n" %
6152 (self.name, self.name, self.name))
6154 def WriteValidationCode(self, file, func):
6155 """Overridden from Argument."""
6156 file.Write(" if (%s == NULL) {\n" % self.name)
6157 file.Write(" return error::kOutOfBounds;\n")
6160 def GetImmediateVersion(self):
6161 """Overridden from Argument."""
6162 return ImmediatePointerArgument(self.name, self.type)
6164 def GetBucketVersion(self):
6165 """Overridden from Argument."""
6166 if self.type == "const char*":
6167 return InputStringBucketArgument(self.name, self.type)
6168 return BucketPointerArgument(self.name, self.type)
6170 def WriteDestinationInitalizationValidation(self, file, func):
6171 """Overridden from Argument."""
6172 self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
6175 class InputStringBucketArgument(Argument):
6176 """An string input argument where the string is passed in a bucket."""
6178 def __init__(self, name, type):
6179 Argument.__init__(self, name + "_bucket_id", "uint32")
6181 def WriteGetCode(self, file):
6182 """Overridden from Argument."""
6184 Bucket* %(name)s_bucket = GetBucket(c.%(name)s);
6185 if (!%(name)s_bucket) {
6186 return error::kInvalidArguments;
6188 std::string %(name)s_str;
6189 if (!%(name)s_bucket->GetAsString(&%(name)s_str)) {
6190 return error::kInvalidArguments;
6192 const char* %(name)s = %(name)s_str.c_str();
6198 def GetValidArg(self, func, offset, index):
6199 return "kNameBucketId"
6201 def GetValidGLArg(self, func, offset, index):
6205 class NonImmediatePointerArgument(PointerArgument):
6206 """A pointer argument that stays a pointer even in an immediate cmd."""
6208 def __init__(self, name, type):
6209 PointerArgument.__init__(self, name, type)
6211 def IsPointer(self):
6212 """Returns true if argument is a pointer."""
6215 def GetImmediateVersion(self):
6216 """Overridden from Argument."""
6220 class ResourceIdArgument(Argument):
6221 """A class that represents a resource id argument to a function."""
6223 def __init__(self, name, type):
6224 match = re.match("(GLid\w+)", type)
6225 self.resource_type = match.group(1)[4:]
6226 type = type.replace(match.group(1), "GLuint")
6227 Argument.__init__(self, name, type)
6229 def WriteGetCode(self, file):
6230 """Overridden from Argument."""
6231 file.Write(" %s %s = c.%s;\n" % (self.type, self.name, self.name))
6233 def GetValidArg(self, func, offset, index):
6234 return "client_%s_id_" % self.resource_type.lower()
6236 def GetValidGLArg(self, func, offset, index):
6237 return "kService%sId" % self.resource_type
6240 class ResourceIdBindArgument(Argument):
6241 """Represents a resource id argument to a bind function."""
6243 def __init__(self, name, type):
6244 match = re.match("(GLidBind\w+)", type)
6245 self.resource_type = match.group(1)[8:]
6246 type = type.replace(match.group(1), "GLuint")
6247 Argument.__init__(self, name, type)
6249 def WriteGetCode(self, file):
6250 """Overridden from Argument."""
6251 code = """ %(type)s %(name)s = c.%(name)s;
6253 file.Write(code % {'type': self.type, 'name': self.name})
6255 def GetValidArg(self, func, offset, index):
6256 return "client_%s_id_" % self.resource_type.lower()
6258 def GetValidGLArg(self, func, offset, index):
6259 return "kService%sId" % self.resource_type
6262 class ResourceIdZeroArgument(Argument):
6263 """Represents a resource id argument to a function that can be zero."""
6265 def __init__(self, name, type):
6266 match = re.match("(GLidZero\w+)", type)
6267 self.resource_type = match.group(1)[8:]
6268 type = type.replace(match.group(1), "GLuint")
6269 Argument.__init__(self, name, type)
6271 def WriteGetCode(self, file):
6272 """Overridden from Argument."""
6273 file.Write(" %s %s = c.%s;\n" % (self.type, self.name, self.name))
6275 def GetValidArg(self, func, offset, index):
6276 return "client_%s_id_" % self.resource_type.lower()
6278 def GetValidGLArg(self, func, offset, index):
6279 return "kService%sId" % self.resource_type
6281 def GetNumInvalidValues(self, func):
6282 """returns the number of invalid values to be tested."""
6285 def GetInvalidArg(self, offset, index):
6286 """returns an invalid value by index."""
6287 return ("kInvalidClientId", "kNoError", "GL_INVALID_VALUE")
6290 class Function(object):
6291 """A class that represents a function."""
6293 def __init__(self, original_name, name, info, return_type, original_args,
6294 args_for_cmds, cmd_args, init_args, num_pointer_args):
6296 self.original_name = original_name
6298 self.type_handler = info.type_handler
6299 self.return_type = return_type
6300 self.original_args = original_args
6301 self.num_pointer_args = num_pointer_args
6302 self.can_auto_generate = num_pointer_args == 0 and return_type == "void"
6303 self.cmd_args = cmd_args
6304 self.init_args = init_args
6306 self.args_for_cmds = args_for_cmds
6307 self.is_immediate = False
6309 def IsType(self, type_name):
6310 """Returns true if function is a certain type."""
6311 return self.info.type == type_name
6313 def InitFunction(self):
6314 """Calls the init function for the type handler."""
6315 self.type_handler.InitFunction(self)
6317 def GetInfo(self, name):
6318 """Returns a value from the function info for this function."""
6319 if hasattr(self.info, name):
6320 return getattr(self.info, name)
6323 def GetValidArg(self, index):
6324 """Gets a valid arg from the function info if one exists."""
6325 valid_args = self.GetInfo('valid_args')
6326 if valid_args and str(index) in valid_args:
6327 return valid_args[str(index)]
6330 def AddInfo(self, name, value):
6332 setattr(self.info, name, value)
6334 def IsCoreGLFunction(self):
6335 return (not self.GetInfo('extension') and
6336 not self.GetInfo('pepper_interface'))
6338 def InPepperInterface(self, interface):
6339 ext = self.GetInfo('pepper_interface')
6340 if not interface.GetName():
6341 return self.IsCoreGLFunction()
6342 return ext == interface.GetName()
6344 def InAnyPepperExtension(self):
6345 return self.IsCoreGLFunction() or self.GetInfo('pepper_interface')
6347 def GetGLFunctionName(self):
6348 """Gets the function to call to execute GL for this command."""
6349 if self.GetInfo('decoder_func'):
6350 return self.GetInfo('decoder_func')
6351 return "gl%s" % self.original_name
6353 def GetGLTestFunctionName(self):
6354 gl_func_name = self.GetInfo('gl_test_func')
6355 if gl_func_name == None:
6356 gl_func_name = self.GetGLFunctionName()
6357 if gl_func_name.startswith("gl"):
6358 gl_func_name = gl_func_name[2:]
6360 gl_func_name = self.original_name
6363 def AddCmdArg(self, arg):
6364 """Adds a cmd argument to this function."""
6365 self.cmd_args.append(arg)
6367 def GetCmdArgs(self):
6368 """Gets the command args for this function."""
6369 return self.cmd_args
6371 def ClearCmdArgs(self):
6372 """Clears the command args for this function."""
6375 def GetInitArgs(self):
6376 """Gets the init args for this function."""
6377 return self.init_args
6379 def GetOriginalArgs(self):
6380 """Gets the original arguments to this function."""
6381 return self.original_args
6383 def GetLastOriginalArg(self):
6384 """Gets the last original argument to this function."""
6385 return self.original_args[len(self.original_args) - 1]
6387 def __MaybePrependComma(self, arg_string, add_comma):
6388 """Adds a comma if arg_string is not empty and add_comma is true."""
6390 if add_comma and len(arg_string):
6392 return "%s%s" % (comma, arg_string)
6394 def MakeTypedOriginalArgString(self, prefix, add_comma = False):
6395 """Gets a list of arguments as they are in GL."""
6396 args = self.GetOriginalArgs()
6397 arg_string = ", ".join(
6398 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
6399 return self.__MaybePrependComma(arg_string, add_comma)
6401 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "):
6402 """Gets the list of arguments as they are in GL."""
6403 args = self.GetOriginalArgs()
6404 arg_string = separator.join(
6405 ["%s%s" % (prefix, arg.name) for arg in args])
6406 return self.__MaybePrependComma(arg_string, add_comma)
6408 def MakeTypedPepperArgString(self, prefix):
6409 """Gets a list of arguments as they need to be for Pepper."""
6410 if self.GetInfo("pepper_args"):
6411 return self.GetInfo("pepper_args")
6413 return self.MakeTypedOriginalArgString(prefix, False)
6415 def MakeTypedCmdArgString(self, prefix, add_comma = False):
6416 """Gets a typed list of arguments as they need to be for command buffers."""
6417 args = self.GetCmdArgs()
6418 arg_string = ", ".join(
6419 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
6420 return self.__MaybePrependComma(arg_string, add_comma)
6422 def MakeCmdArgString(self, prefix, add_comma = False):
6423 """Gets the list of arguments as they need to be for command buffers."""
6424 args = self.GetCmdArgs()
6425 arg_string = ", ".join(
6426 ["%s%s" % (prefix, arg.name) for arg in args])
6427 return self.__MaybePrependComma(arg_string, add_comma)
6429 def MakeTypedInitString(self, prefix, add_comma = False):
6430 """Gets a typed list of arguments as they need to be for cmd Init/Set."""
6431 args = self.GetInitArgs()
6432 arg_string = ", ".join(
6433 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
6434 return self.__MaybePrependComma(arg_string, add_comma)
6436 def MakeInitString(self, prefix, add_comma = False):
6437 """Gets the list of arguments as they need to be for cmd Init/Set."""
6438 args = self.GetInitArgs()
6439 arg_string = ", ".join(
6440 ["%s%s" % (prefix, arg.name) for arg in args])
6441 return self.__MaybePrependComma(arg_string, add_comma)
6443 def MakeLogArgString(self):
6444 """Makes a string of the arguments for the LOG macros"""
6445 args = self.GetOriginalArgs()
6446 return ' << ", " << '.join([arg.GetLogArg() for arg in args])
6448 def WriteCommandDescription(self, file):
6449 """Writes a description of the command."""
6450 file.Write("//! Command that corresponds to gl%s.\n" % self.original_name)
6452 def WriteHandlerValidation(self, file):
6453 """Writes validation code for the function."""
6454 for arg in self.GetOriginalArgs():
6455 arg.WriteValidationCode(file, self)
6456 self.WriteValidationCode(file)
6458 def WriteHandlerImplementation(self, file):
6459 """Writes the handler implementation for this command."""
6460 self.type_handler.WriteHandlerImplementation(self, file)
6462 def WriteValidationCode(self, file):
6463 """Writes the validation code for a command."""
6466 def WriteCmdArgFlag(self, file):
6467 """Writes the cmd kArgFlags constant."""
6468 file.Write(" static const cmd::ArgFlags kArgFlags = cmd::kFixed;\n")
6470 def WriteCmdComputeSize(self, file):
6471 """Writes the ComputeSize function for the command."""
6472 file.Write(" static uint32 ComputeSize() {\n")
6474 " return static_cast<uint32>(sizeof(ValueType)); // NOLINT\n")
6478 def WriteCmdSetHeader(self, file):
6479 """Writes the cmd's SetHeader function."""
6480 file.Write(" void SetHeader() {\n")
6481 file.Write(" header.SetCmd<ValueType>();\n")
6485 def WriteCmdInit(self, file):
6486 """Writes the cmd's Init function."""
6487 file.Write(" void Init(%s) {\n" % self.MakeTypedCmdArgString("_"))
6488 file.Write(" SetHeader();\n")
6489 args = self.GetCmdArgs()
6491 file.Write(" %s = _%s;\n" % (arg.name, arg.name))
6495 def WriteCmdSet(self, file):
6496 """Writes the cmd's Set function."""
6497 copy_args = self.MakeCmdArgString("_", False)
6498 file.Write(" void* Set(void* cmd%s) {\n" %
6499 self.MakeTypedCmdArgString("_", True))
6500 file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
6501 file.Write(" return NextCmdAddress<ValueType>(cmd);\n")
6505 def WriteStruct(self, file):
6506 self.type_handler.WriteStruct(self, file)
6508 def WriteDocs(self, file):
6509 self.type_handler.WriteDocs(self, file)
6511 def WriteCmdHelper(self, file):
6512 """Writes the cmd's helper."""
6513 self.type_handler.WriteCmdHelper(self, file)
6515 def WriteServiceImplementation(self, file):
6516 """Writes the service implementation for a command."""
6517 self.type_handler.WriteServiceImplementation(self, file)
6519 def WriteServiceUnitTest(self, file):
6520 """Writes the service implementation for a command."""
6521 self.type_handler.WriteServiceUnitTest(self, file)
6523 def WriteGLES2CLibImplementation(self, file):
6524 """Writes the GLES2 C Lib Implemention."""
6525 self.type_handler.WriteGLES2CLibImplementation(self, file)
6527 def WriteGLES2InterfaceHeader(self, file):
6528 """Writes the GLES2 Interface declaration."""
6529 self.type_handler.WriteGLES2InterfaceHeader(self, file)
6531 def WriteGLES2InterfaceStub(self, file):
6532 """Writes the GLES2 Interface Stub declaration."""
6533 self.type_handler.WriteGLES2InterfaceStub(self, file)
6535 def WriteGLES2InterfaceStubImpl(self, file):
6536 """Writes the GLES2 Interface Stub declaration."""
6537 self.type_handler.WriteGLES2InterfaceStubImpl(self, file)
6539 def WriteGLES2ImplementationHeader(self, file):
6540 """Writes the GLES2 Implemention declaration."""
6541 self.type_handler.WriteGLES2ImplementationHeader(self, file)
6543 def WriteGLES2Implementation(self, file):
6544 """Writes the GLES2 Implemention definition."""
6545 self.type_handler.WriteGLES2Implementation(self, file)
6547 def WriteGLES2TraceImplementationHeader(self, file):
6548 """Writes the GLES2 Trace Implemention declaration."""
6549 self.type_handler.WriteGLES2TraceImplementationHeader(self, file)
6551 def WriteGLES2TraceImplementation(self, file):
6552 """Writes the GLES2 Trace Implemention definition."""
6553 self.type_handler.WriteGLES2TraceImplementation(self, file)
6555 def WriteGLES2Header(self, file):
6556 """Writes the GLES2 Implemention unit test."""
6557 self.type_handler.WriteGLES2Header(self, file)
6559 def WriteGLES2ImplementationUnitTest(self, file):
6560 """Writes the GLES2 Implemention unit test."""
6561 self.type_handler.WriteGLES2ImplementationUnitTest(self, file)
6563 def WriteDestinationInitalizationValidation(self, file):
6564 """Writes the client side destintion initialization validation."""
6565 self.type_handler.WriteDestinationInitalizationValidation(self, file)
6567 def WriteFormatTest(self, file):
6568 """Writes the cmd's format test."""
6569 self.type_handler.WriteFormatTest(self, file)
6572 class PepperInterface(object):
6573 """A class that represents a function."""
6575 def __init__(self, info):
6576 self.name = info["name"]
6577 self.dev = info["dev"]
6582 def GetInterfaceName(self):
6586 upperint = "_" + self.name.upper()
6589 return "PPB_OPENGLES2%s%s_INTERFACE" % (upperint, dev)
6591 def GetInterfaceString(self):
6595 return "PPB_OpenGLES2%s%s" % (self.name, dev)
6597 def GetStructName(self):
6601 return "PPB_OpenGLES2%s%s" % (self.name, dev)
6604 class ImmediateFunction(Function):
6605 """A class that represnets an immediate function command."""
6607 def __init__(self, func):
6609 for arg in func.GetOriginalArgs():
6610 new_arg = arg.GetImmediateVersion()
6612 new_args.append(new_arg)
6615 new_args_for_cmds = []
6616 for arg in func.args_for_cmds:
6617 new_arg = arg.GetImmediateVersion()
6619 new_args_for_cmds.append(new_arg)
6620 new_arg.AddCmdArgs(cmd_args)
6623 for arg in new_args_for_cmds:
6624 arg.AddInitArgs(new_init_args)
6629 "%sImmediate" % func.name,
6637 self.is_immediate = True
6639 def WriteCommandDescription(self, file):
6640 """Overridden from Function"""
6641 file.Write("//! Immediate version of command that corresponds to gl%s.\n" %
6644 def WriteServiceImplementation(self, file):
6645 """Overridden from Function"""
6646 self.type_handler.WriteImmediateServiceImplementation(self, file)
6648 def WriteHandlerImplementation(self, file):
6649 """Overridden from Function"""
6650 self.type_handler.WriteImmediateHandlerImplementation(self, file)
6652 def WriteServiceUnitTest(self, file):
6653 """Writes the service implementation for a command."""
6654 self.type_handler.WriteImmediateServiceUnitTest(self, file)
6656 def WriteValidationCode(self, file):
6657 """Overridden from Function"""
6658 self.type_handler.WriteImmediateValidationCode(self, file)
6660 def WriteCmdArgFlag(self, file):
6661 """Overridden from Function"""
6662 file.Write(" static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;\n")
6664 def WriteCmdComputeSize(self, file):
6665 """Overridden from Function"""
6666 self.type_handler.WriteImmediateCmdComputeSize(self, file)
6668 def WriteCmdSetHeader(self, file):
6669 """Overridden from Function"""
6670 self.type_handler.WriteImmediateCmdSetHeader(self, file)
6672 def WriteCmdInit(self, file):
6673 """Overridden from Function"""
6674 self.type_handler.WriteImmediateCmdInit(self, file)
6676 def WriteCmdSet(self, file):
6677 """Overridden from Function"""
6678 self.type_handler.WriteImmediateCmdSet(self, file)
6680 def WriteCmdHelper(self, file):
6681 """Overridden from Function"""
6682 self.type_handler.WriteImmediateCmdHelper(self, file)
6684 def WriteFormatTest(self, file):
6685 """Overridden from Function"""
6686 self.type_handler.WriteImmediateFormatTest(self, file)
6689 class BucketFunction(Function):
6690 """A class that represnets a bucket version of a function command."""
6692 def __init__(self, func):
6694 for arg in func.GetOriginalArgs():
6695 new_arg = arg.GetBucketVersion()
6697 new_args.append(new_arg)
6700 new_args_for_cmds = []
6701 for arg in func.args_for_cmds:
6702 new_arg = arg.GetBucketVersion()
6704 new_args_for_cmds.append(new_arg)
6705 new_arg.AddCmdArgs(cmd_args)
6708 for arg in new_args_for_cmds:
6709 arg.AddInitArgs(new_init_args)
6714 "%sBucket" % func.name,
6723 # def InitFunction(self):
6724 # """Overridden from Function"""
6727 def WriteCommandDescription(self, file):
6728 """Overridden from Function"""
6729 file.Write("//! Bucket version of command that corresponds to gl%s.\n" %
6732 def WriteServiceImplementation(self, file):
6733 """Overridden from Function"""
6734 self.type_handler.WriteBucketServiceImplementation(self, file)
6736 def WriteHandlerImplementation(self, file):
6737 """Overridden from Function"""
6738 self.type_handler.WriteBucketHandlerImplementation(self, file)
6740 def WriteServiceUnitTest(self, file):
6741 """Writes the service implementation for a command."""
6742 self.type_handler.WriteBucketServiceUnitTest(self, file)
6745 def CreateArg(arg_string):
6746 """Creates an Argument."""
6747 arg_parts = arg_string.split()
6748 if len(arg_parts) == 1 and arg_parts[0] == 'void':
6750 # Is this a pointer argument?
6751 elif arg_string.find('*') >= 0:
6752 if arg_parts[0] == 'NonImmediate':
6753 return NonImmediatePointerArgument(
6755 " ".join(arg_parts[1:-1]))
6757 return PointerArgument(
6759 " ".join(arg_parts[0:-1]))
6760 # Is this a resource argument? Must come after pointer check.
6761 elif arg_parts[0].startswith('GLidBind'):
6762 return ResourceIdBindArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6763 elif arg_parts[0].startswith('GLidZero'):
6764 return ResourceIdZeroArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6765 elif arg_parts[0].startswith('GLid'):
6766 return ResourceIdArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6767 elif arg_parts[0].startswith('GLenum') and len(arg_parts[0]) > 6:
6768 return EnumArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6769 elif arg_parts[0].startswith('GLboolean') and len(arg_parts[0]) > 9:
6770 return ValidatedBoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6771 elif arg_parts[0].startswith('GLboolean'):
6772 return BoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6773 elif arg_parts[0].startswith('GLintUniformLocation'):
6774 return UniformLocationArgument(arg_parts[-1])
6775 elif (arg_parts[0].startswith('GLint') and len(arg_parts[0]) > 5 and
6776 not arg_parts[0].startswith('GLintptr')):
6777 return IntArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6778 elif (arg_parts[0].startswith('GLsizeiNotNegative') or
6779 arg_parts[0].startswith('GLintptrNotNegative')):
6780 return SizeNotNegativeArgument(arg_parts[-1],
6781 " ".join(arg_parts[0:-1]),
6782 arg_parts[0][0:-11])
6783 elif arg_parts[0].startswith('GLsize'):
6784 return SizeArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6786 return Argument(arg_parts[-1], " ".join(arg_parts[0:-1]))
6789 class GLGenerator(object):
6790 """A class to generate GL command buffers."""
6792 _function_re = re.compile(r'GL_APICALL(.*?)GL_APIENTRY (.*?) \((.*?)\);')
6794 def __init__(self, verbose):
6795 self.original_functions = []
6797 self.verbose = verbose
6799 self._function_info = {}
6800 self._empty_type_handler = TypeHandler()
6801 self._empty_function_info = FunctionInfo({}, self._empty_type_handler)
6802 self.pepper_interfaces = []
6803 self.interface_info = {}
6805 self._type_handlers = {
6806 'Bind': BindHandler(),
6807 'Create': CreateHandler(),
6808 'Custom': CustomHandler(),
6809 'Data': DataHandler(),
6810 'Delete': DeleteHandler(),
6811 'DELn': DELnHandler(),
6812 'GENn': GENnHandler(),
6813 'GETn': GETnHandler(),
6814 'GLchar': GLcharHandler(),
6815 'GLcharN': GLcharNHandler(),
6816 'HandWritten': HandWrittenHandler(),
6818 'Manual': ManualHandler(),
6819 'PUT': PUTHandler(),
6820 'PUTn': PUTnHandler(),
6821 'PUTXn': PUTXnHandler(),
6822 'StateSet': StateSetHandler(),
6823 'StateSetRGBAlpha': StateSetRGBAlphaHandler(),
6824 'StateSetFrontBack': StateSetFrontBackHandler(),
6825 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(),
6826 'StateSetNamedParameter': StateSetNamedParameter(),
6827 'STRn': STRnHandler(),
6828 'Todo': TodoHandler(),
6831 for func_name in _FUNCTION_INFO:
6832 info = _FUNCTION_INFO[func_name]
6836 self._function_info[func_name] = FunctionInfo(info,
6837 self.GetTypeHandler(type))
6838 for interface in _PEPPER_INTERFACES:
6839 interface = PepperInterface(interface)
6840 self.pepper_interfaces.append(interface)
6841 self.interface_info[interface.GetName()] = interface
6843 def AddFunction(self, func):
6844 """Adds a function."""
6845 self.functions.append(func)
6847 def GetTypeHandler(self, name):
6848 """Gets a type info for the given type."""
6850 if name in self._type_handlers:
6851 return self._type_handlers[name]
6853 raise KeyError("no such type handler: %s" % name)
6854 return self._empty_type_handler
6856 def GetFunctionInfo(self, name):
6857 """Gets a type info for the given function name."""
6858 if name in self._function_info:
6859 return self._function_info[name]
6860 return self._empty_function_info
6863 """Prints something if verbose is true."""
6867 def Error(self, msg):
6868 """Prints an error."""
6869 print "Error: %s" % msg
6872 def WriteLicense(self, file):
6873 """Writes the license."""
6874 file.Write(_LICENSE)
6876 def WriteNamespaceOpen(self, file):
6877 """Writes the code for the namespace."""
6878 file.Write("namespace gpu {\n")
6879 file.Write("namespace gles2 {\n")
6882 def WriteNamespaceClose(self, file):
6883 """Writes the code to close the namespace."""
6884 file.Write("} // namespace gles2\n")
6885 file.Write("} // namespace gpu\n")
6888 def ParseArgs(self, arg_string):
6889 """Parses a function arg string."""
6891 num_pointer_args = 0
6892 parts = arg_string.split(',')
6894 for arg_string in parts:
6895 if arg_string.startswith('GLenum '):
6897 arg = CreateArg(arg_string)
6901 num_pointer_args += 1
6902 return (args, num_pointer_args, is_gl_enum)
6904 def ParseGLH(self, filename):
6905 """Parses the cmd_buffer_functions.txt file and extracts the functions"""
6906 f = open("gpu/command_buffer/cmd_buffer_functions.txt", "r")
6907 functions = f.read()
6909 for line in functions.splitlines():
6910 match = self._function_re.match(line)
6912 func_name = match.group(2)[2:]
6913 func_info = self.GetFunctionInfo(func_name)
6914 if func_info.type != 'Noop':
6915 return_type = match.group(1).strip()
6916 arg_string = match.group(3)
6917 (args, num_pointer_args, is_gl_enum) = self.ParseArgs(arg_string)
6918 # comment in to find out which functions use bare enums.
6920 # self.Log("%s uses bare GLenum" % func_name)
6921 args_for_cmds = args
6922 if hasattr(func_info, 'cmd_args'):
6923 (args_for_cmds, num_pointer_args, is_gl_enum) = (
6924 self.ParseArgs(getattr(func_info, 'cmd_args')))
6926 for arg in args_for_cmds:
6927 arg.AddCmdArgs(cmd_args)
6929 for arg in args_for_cmds:
6930 arg.AddInitArgs(init_args)
6931 return_arg = CreateArg(return_type + " result")
6933 init_args.append(return_arg)
6934 f = Function(func_name, func_name, func_info, return_type, args,
6935 args_for_cmds, cmd_args, init_args, num_pointer_args)
6936 self.original_functions.append(f)
6937 gen_cmd = f.GetInfo('gen_cmd')
6938 if gen_cmd == True or gen_cmd == None:
6940 f.type_handler.AddImmediateFunction(self, f)
6941 f.type_handler.AddBucketFunction(self, f)
6943 self.Log("Auto Generated Functions : %d" %
6944 len([f for f in self.functions if f.can_auto_generate or
6945 (not f.IsType('') and not f.IsType('Custom') and
6946 not f.IsType('Todo'))]))
6948 funcs = [f for f in self.functions if not f.can_auto_generate and
6949 (f.IsType('') or f.IsType('Custom') or f.IsType('Todo'))]
6950 self.Log("Non Auto Generated Functions: %d" % len(funcs))
6953 self.Log(" %-10s %-20s gl%s" % (f.info.type, f.return_type, f.name))
6955 def WriteCommandIds(self, filename):
6956 """Writes the command buffer format"""
6957 file = CHeaderWriter(filename)
6958 file.Write("#define GLES2_COMMAND_LIST(OP) \\\n")
6960 for func in self.functions:
6961 file.Write(" %-60s /* %d */ \\\n" %
6962 ("OP(%s)" % func.name, id))
6966 file.Write("enum CommandId {\n")
6967 file.Write(" kStartPoint = cmd::kLastCommonId, "
6968 "// All GLES2 commands start after this.\n")
6969 file.Write("#define GLES2_CMD_OP(name) k ## name,\n")
6970 file.Write(" GLES2_COMMAND_LIST(GLES2_CMD_OP)\n")
6971 file.Write("#undef GLES2_CMD_OP\n")
6972 file.Write(" kNumCommands\n")
6977 def WriteFormat(self, filename):
6978 """Writes the command buffer format"""
6979 file = CHeaderWriter(filename)
6980 for func in self.functions:
6982 #gen_cmd = func.GetInfo('gen_cmd')
6983 #if gen_cmd == True or gen_cmd == None:
6984 func.WriteStruct(file)
6988 def WriteDocs(self, filename):
6989 """Writes the command buffer doc version of the commands"""
6990 file = CWriter(filename)
6991 for func in self.functions:
6993 #gen_cmd = func.GetInfo('gen_cmd')
6994 #if gen_cmd == True or gen_cmd == None:
6995 func.WriteDocs(file)
6999 def WriteFormatTest(self, filename):
7000 """Writes the command buffer format test."""
7001 file = CHeaderWriter(
7003 "// This file contains unit tests for gles2 commmands\n"
7004 "// It is included by gles2_cmd_format_test.cc\n"
7007 for func in self.functions:
7009 #gen_cmd = func.GetInfo('gen_cmd')
7010 #if gen_cmd == True or gen_cmd == None:
7011 func.WriteFormatTest(file)
7015 def WriteCmdHelperHeader(self, filename):
7016 """Writes the gles2 command helper."""
7017 file = CHeaderWriter(filename)
7019 for func in self.functions:
7021 #gen_cmd = func.GetInfo('gen_cmd')
7022 #if gen_cmd == True or gen_cmd == None:
7023 func.WriteCmdHelper(file)
7027 def WriteServiceContextStateHeader(self, filename):
7028 """Writes the service context state header."""
7029 file = CHeaderWriter(
7031 "// It is included by context_state.h\n")
7032 file.Write("struct EnableFlags {\n")
7033 file.Write(" EnableFlags();\n")
7034 for capability in _CAPABILITY_FLAGS:
7035 file.Write(" bool %s;\n" % capability['name'])
7036 file.Write("};\n\n")
7038 for state_name in sorted(_STATES.keys()):
7039 state = _STATES[state_name]
7040 for item in state['states']:
7041 file.Write("%s %s;\n" % (item['type'], item['name']))
7046 def WriteClientContextStateHeader(self, filename):
7047 """Writes the client context state header."""
7048 file = CHeaderWriter(
7050 "// It is included by client_context_state.h\n")
7051 file.Write("struct EnableFlags {\n")
7052 file.Write(" EnableFlags();\n")
7053 for capability in _CAPABILITY_FLAGS:
7054 file.Write(" bool %s;\n" % capability['name'])
7055 file.Write("};\n\n")
7059 def WriteContextStateGetters(self, file, class_name):
7060 """Writes the state getters."""
7061 for gl_type in ["GLint", "GLfloat"]:
7063 bool %s::GetStateAs%s(
7064 GLenum pname, %s* params, GLsizei* num_written) const {
7066 """ % (class_name, gl_type, gl_type))
7067 for state_name in sorted(_STATES.keys()):
7068 state = _STATES[state_name]
7070 file.Write(" case %s:\n" % state['enum'])
7071 file.Write(" *num_written = %d;\n" % len(state['states']))
7072 file.Write(" if (params) {\n")
7073 for ndx,item in enumerate(state['states']):
7074 file.Write(" params[%d] = static_cast<%s>(%s);\n" %
7075 (ndx, gl_type, item['name']))
7077 file.Write(" return true;\n")
7079 for item in state['states']:
7080 file.Write(" case %s:\n" % item['enum'])
7081 file.Write(" *num_written = 1;\n")
7082 file.Write(" if (params) {\n")
7083 file.Write(" params[0] = static_cast<%s>(%s);\n" %
7084 (gl_type, item['name']))
7086 file.Write(" return true;\n")
7087 for capability in _CAPABILITY_FLAGS:
7088 file.Write(" case GL_%s:\n" % capability['name'].upper())
7089 file.Write(" *num_written = 1;\n")
7090 file.Write(" if (params) {\n")
7092 " params[0] = static_cast<%s>(enable_flags.%s);\n" %
7093 (gl_type, capability['name']))
7095 file.Write(" return true;\n")
7096 file.Write(""" default:
7102 def WriteServiceContextStateImpl(self, filename):
7103 """Writes the context state service implementation."""
7104 file = CHeaderWriter(
7106 "// It is included by context_state.cc\n")
7108 for capability in _CAPABILITY_FLAGS:
7109 code.append("%s(%s)" %
7110 (capability['name'],
7111 ('false', 'true')['default' in capability]))
7112 file.Write("ContextState::EnableFlags::EnableFlags()\n : %s {\n}\n" %
7116 file.Write("void ContextState::Initialize() {\n")
7117 for state_name in sorted(_STATES.keys()):
7118 state = _STATES[state_name]
7119 for item in state['states']:
7120 file.Write(" %s = %s;\n" % (item['name'], item['default']))
7124 void ContextState::InitCapabilities() const {
7126 for capability in _CAPABILITY_FLAGS:
7127 file.Write(" EnableDisable(GL_%s, enable_flags.%s);\n" %
7128 (capability['name'].upper(), capability['name']))
7131 void ContextState::InitState() const {
7134 # We need to sort the keys so the expectations match
7135 for state_name in sorted(_STATES.keys()):
7136 state = _STATES[state_name]
7137 if state['type'] == 'FrontBack':
7138 num_states = len(state['states'])
7139 for ndx, group in enumerate(Grouper(num_states / 2, state['states'])):
7142 args.append('%s' % item['name'])
7144 " gl%s(%s, %s);\n" %
7145 (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args)))
7146 elif state['type'] == 'NamedParameter':
7147 for item in state['states']:
7148 if 'extension_flag' in item:
7149 file.Write(" if (feature_info_->feature_flags().%s)\n " %
7150 item['extension_flag'])
7151 file.Write(" gl%s(%s, %s);\n" %
7152 (state['func'], item['enum'], item['name']))
7155 for item in state['states']:
7156 args.append('%s' % item['name'])
7157 file.Write(" gl%s(%s);\n" % (state['func'], ", ".join(args)))
7160 file.Write("""bool ContextState::GetEnabled(GLenum cap) const {
7163 for capability in _CAPABILITY_FLAGS:
7164 file.Write(" case GL_%s:\n" % capability['name'].upper())
7165 file.Write(" return enable_flags.%s;\n" % capability['name'])
7166 file.Write(""" default:
7173 self.WriteContextStateGetters(file, "ContextState")
7176 def WriteClientContextStateImpl(self, filename):
7177 """Writes the context state client side implementation."""
7178 file = CHeaderWriter(
7180 "// It is included by client_context_state.cc\n")
7182 for capability in _CAPABILITY_FLAGS:
7183 code.append("%s(%s)" %
7184 (capability['name'],
7185 ('false', 'true')['default' in capability]))
7187 "ClientContextState::EnableFlags::EnableFlags()\n : %s {\n}\n" %
7192 bool ClientContextState::SetCapabilityState(
7193 GLenum cap, bool enabled, bool* changed) {
7197 for capability in _CAPABILITY_FLAGS:
7198 file.Write(" case GL_%s:\n" % capability['name'].upper())
7199 file.Write(""" if (enable_flags.%(name)s != enabled) {
7201 enable_flags.%(name)s = enabled;
7205 file.Write(""" default:
7210 file.Write("""bool ClientContextState::GetEnabled(
7211 GLenum cap, bool* enabled) const {
7214 for capability in _CAPABILITY_FLAGS:
7215 file.Write(" case GL_%s:\n" % capability['name'].upper())
7216 file.Write(" *enabled = enable_flags.%s;\n" % capability['name'])
7217 file.Write(" return true;\n")
7218 file.Write(""" default:
7225 def WriteServiceImplementation(self, filename):
7226 """Writes the service decorder implementation."""
7227 file = CHeaderWriter(
7229 "// It is included by gles2_cmd_decoder.cc\n")
7231 for func in self.functions:
7233 #gen_cmd = func.GetInfo('gen_cmd')
7234 #if gen_cmd == True or gen_cmd == None:
7235 func.WriteServiceImplementation(file)
7238 bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
7241 for capability in _CAPABILITY_FLAGS:
7242 file.Write(" case GL_%s:\n" % capability['name'].upper())
7243 if 'state_flag' in capability:
7244 file.Write(""" if (state_.enable_flags.%(name)s != enabled) {
7245 state_.enable_flags.%(name)s = enabled;
7246 %(state_flag)s = true;
7251 file.Write(""" state_.enable_flags.%(name)s = enabled;
7254 file.Write(""" default:
7262 def WriteServiceUnitTests(self, filename):
7263 """Writes the service decorder unit tests."""
7264 num_tests = len(self.functions)
7265 FUNCTIONS_PER_FILE = 98 # hard code this so it doesn't change.
7267 for test_num in range(0, num_tests, FUNCTIONS_PER_FILE):
7269 name = filename % count
7270 file = CHeaderWriter(
7272 "// It is included by gles2_cmd_decoder_unittest_%d.cc\n" % count)
7273 file.SetFileNum(count)
7274 end = test_num + FUNCTIONS_PER_FILE
7277 for idx in range(test_num, end):
7278 func = self.functions[idx]
7280 #gen_cmd = func.GetInfo('gen_cmd')
7281 #if gen_cmd == True or gen_cmd == None:
7282 if func.GetInfo('unit_test') == False:
7283 file.Write("// TODO(gman): %s\n" % func.name)
7285 func.WriteServiceUnitTest(file)
7288 file = CHeaderWriter(
7290 "// It is included by gles2_cmd_decoder_unittest_base.cc\n")
7292 """void GLES2DecoderTestBase::SetupInitCapabilitiesExpectations() {
7294 for capability in _CAPABILITY_FLAGS:
7295 file.Write(" ExpectEnableDisable(GL_%s, %s);\n" %
7296 (capability['name'].upper(),
7297 ('false', 'true')['default' in capability]))
7300 void GLES2DecoderTestBase::SetupInitStateExpectations() {
7303 # We need to sort the keys so the expectations match
7304 for state_name in sorted(_STATES.keys()):
7305 state = _STATES[state_name]
7306 if state['type'] == 'FrontBack':
7307 num_states = len(state['states'])
7308 for ndx, group in enumerate(Grouper(num_states / 2, state['states'])):
7311 if 'expected' in item:
7312 args.append(item['expected'])
7314 args.append(item['default'])
7316 " EXPECT_CALL(*gl_, %s(%s, %s))\n" %
7317 (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args)))
7318 file.Write(" .Times(1)\n")
7319 file.Write(" .RetiresOnSaturation();\n")
7320 elif state['type'] == 'NamedParameter':
7321 for item in state['states']:
7322 if 'extension_flag' in item:
7325 " EXPECT_CALL(*gl_, %s(%s, %s))\n" %
7326 (state['func'], item['enum'], item['default']))
7327 file.Write(" .Times(1)\n")
7328 file.Write(" .RetiresOnSaturation();\n")
7331 for item in state['states']:
7332 if 'expected' in item:
7333 args.append(item['expected'])
7335 args.append(item['default'])
7336 file.Write(" EXPECT_CALL(*gl_, %s(%s))\n" %
7337 (state['func'], ", ".join(args)))
7338 file.Write(" .Times(1)\n")
7339 file.Write(" .RetiresOnSaturation();\n")
7344 def WriteGLES2Header(self, filename):
7345 """Writes the GLES2 header."""
7346 file = CHeaderWriter(
7348 "// This file contains Chromium-specific GLES2 declarations.\n\n")
7350 for func in self.original_functions:
7351 func.WriteGLES2Header(file)
7356 def WriteGLES2CLibImplementation(self, filename):
7357 """Writes the GLES2 c lib implementation."""
7358 file = CHeaderWriter(
7360 "// These functions emulate GLES2 over command buffers.\n")
7362 for func in self.original_functions:
7363 func.WriteGLES2CLibImplementation(file)
7368 extern const NameToFunc g_gles2_function_table[] = {
7370 for func in self.original_functions:
7372 ' { "gl%s", reinterpret_cast<GLES2FunctionPointer>(gl%s), },\n' %
7373 (func.name, func.name))
7374 file.Write(""" { NULL, NULL, },
7377 } // namespace gles2
7381 def WriteGLES2InterfaceHeader(self, filename):
7382 """Writes the GLES2 interface header."""
7383 file = CHeaderWriter(
7385 "// This file is included by gles2_interface.h to declare the\n"
7386 "// GL api functions.\n")
7387 for func in self.original_functions:
7388 func.WriteGLES2InterfaceHeader(file)
7391 def WriteGLES2InterfaceStub(self, filename):
7392 """Writes the GLES2 interface stub header."""
7393 file = CHeaderWriter(
7395 "// This file is included by gles2_interface_stub.h.\n")
7396 for func in self.original_functions:
7397 func.WriteGLES2InterfaceStub(file)
7400 def WriteGLES2InterfaceStubImpl(self, filename):
7401 """Writes the GLES2 interface header."""
7402 file = CHeaderWriter(
7404 "// This file is included by gles2_interface_stub.cc.\n")
7405 for func in self.original_functions:
7406 func.WriteGLES2InterfaceStubImpl(file)
7409 def WriteGLES2ImplementationHeader(self, filename):
7410 """Writes the GLES2 Implementation header."""
7411 file = CHeaderWriter(
7413 "// This file is included by gles2_implementation.h to declare the\n"
7414 "// GL api functions.\n")
7415 for func in self.original_functions:
7416 func.WriteGLES2ImplementationHeader(file)
7419 def WriteGLES2Implementation(self, filename):
7420 """Writes the GLES2 Implementation."""
7421 file = CHeaderWriter(
7423 "// This file is included by gles2_implementation.cc to define the\n"
7424 "// GL api functions.\n")
7425 for func in self.original_functions:
7426 func.WriteGLES2Implementation(file)
7429 def WriteGLES2TraceImplementationHeader(self, filename):
7430 """Writes the GLES2 Trace Implementation header."""
7431 file = CHeaderWriter(
7433 "// This file is included by gles2_trace_implementation.h\n")
7434 for func in self.original_functions:
7435 func.WriteGLES2TraceImplementationHeader(file)
7438 def WriteGLES2TraceImplementation(self, filename):
7439 """Writes the GLES2 Trace Implementation."""
7440 file = CHeaderWriter(
7442 "// This file is included by gles2_trace_implementation.cc\n")
7443 for func in self.original_functions:
7444 func.WriteGLES2TraceImplementation(file)
7447 def WriteGLES2ImplementationUnitTests(self, filename):
7448 """Writes the GLES2 helper header."""
7449 file = CHeaderWriter(
7451 "// This file is included by gles2_implementation.h to declare the\n"
7452 "// GL api functions.\n")
7453 for func in self.original_functions:
7454 func.WriteGLES2ImplementationUnitTest(file)
7457 def WriteServiceUtilsHeader(self, filename):
7458 """Writes the gles2 auto generated utility header."""
7459 file = CHeaderWriter(filename)
7460 for enum in sorted(_ENUM_LISTS.keys()):
7461 file.Write("ValueValidator<%s> %s;\n" %
7462 (_ENUM_LISTS[enum]['type'], ToUnderscore(enum)))
7466 def WriteServiceUtilsImplementation(self, filename):
7467 """Writes the gles2 auto generated utility implementation."""
7468 file = CHeaderWriter(filename)
7469 enums = sorted(_ENUM_LISTS.keys())
7471 if len(_ENUM_LISTS[enum]['valid']) > 0:
7472 file.Write("static const %s valid_%s_table[] = {\n" %
7473 (_ENUM_LISTS[enum]['type'], ToUnderscore(enum)))
7474 for value in _ENUM_LISTS[enum]['valid']:
7475 file.Write(" %s,\n" % value)
7478 file.Write("Validators::Validators()\n")
7481 for count, enum in enumerate(enums):
7482 if count + 1 == len(enums):
7484 if len(_ENUM_LISTS[enum]['valid']) > 0:
7485 code = """ %(pre)s%(name)s(
7486 valid_%(name)s_table, arraysize(valid_%(name)s_table))%(post)s
7489 code = """ %(pre)s%(name)s()%(post)s
7492 'name': ToUnderscore(enum),
7497 file.Write("}\n\n");
7500 def WriteCommonUtilsHeader(self, filename):
7501 """Writes the gles2 common utility header."""
7502 file = CHeaderWriter(filename)
7503 enums = sorted(_ENUM_LISTS.keys())
7505 if _ENUM_LISTS[enum]['type'] == 'GLenum':
7506 file.Write("static std::string GetString%s(uint32 value);\n" % enum)
7510 def WriteCommonUtilsImpl(self, filename):
7511 """Writes the gles2 common utility header."""
7512 enum_re = re.compile(r'\#define\s+(GL_[a-zA-Z0-9_]+)\s+([0-9A-Fa-fx]+)')
7514 for fname in ['../../third_party/khronos/GLES2/gl2.h',
7515 '../../third_party/khronos/GLES2/gl2ext.h',
7516 '../../gpu/GLES2/gl2chromium.h',
7517 '../../gpu/GLES2/gl2extchromium.h']:
7518 lines = open(fname).readlines()
7520 m = enum_re.match(line)
7524 if len(value) <= 10 and not value in dict:
7527 file = CHeaderWriter(filename)
7528 file.Write("static const GLES2Util::EnumToString "
7529 "enum_to_string_table[] = {\n")
7531 file.Write(' { %s, "%s", },\n' % (value, dict[value]))
7534 const GLES2Util::EnumToString* const GLES2Util::enum_to_string_table_ =
7535 enum_to_string_table;
7536 const size_t GLES2Util::enum_to_string_table_len_ =
7537 sizeof(enum_to_string_table) / sizeof(enum_to_string_table[0]);
7541 enums = sorted(_ENUM_LISTS.keys())
7543 if _ENUM_LISTS[enum]['type'] == 'GLenum':
7544 file.Write("std::string GLES2Util::GetString%s(uint32 value) {\n" %
7546 if len(_ENUM_LISTS[enum]['valid']) > 0:
7547 file.Write(" static const EnumToString string_table[] = {\n")
7548 for value in _ENUM_LISTS[enum]['valid']:
7549 file.Write(' { %s, "%s" },\n' % (value, value))
7551 return GLES2Util::GetQualifiedEnumString(
7552 string_table, arraysize(string_table), value);
7557 file.Write(""" return GLES2Util::GetQualifiedEnumString(
7564 def WritePepperGLES2Interface(self, filename, dev):
7565 """Writes the Pepper OpenGLES interface definition."""
7566 file = CHeaderWriter(
7568 "// OpenGL ES interface.\n",
7571 file.Write("#include \"ppapi/c/pp_resource.h\"\n")
7573 file.Write("#include \"ppapi/c/ppb_opengles2.h\"\n\n")
7575 file.Write("\n#ifndef __gl2_h_\n")
7576 for (k, v) in _GL_TYPES.iteritems():
7577 file.Write("typedef %s %s;\n" % (v, k))
7578 file.Write("#endif // __gl2_h_\n\n")
7580 for interface in self.pepper_interfaces:
7581 if interface.dev != dev:
7583 file.Write("#define %s_1_0 \"%s;1.0\"\n" %
7584 (interface.GetInterfaceName(), interface.GetInterfaceString()))
7585 file.Write("#define %s %s_1_0\n" %
7586 (interface.GetInterfaceName(), interface.GetInterfaceName()))
7588 file.Write("\nstruct %s {\n" % interface.GetStructName())
7589 for func in self.original_functions:
7590 if not func.InPepperInterface(interface):
7593 original_arg = func.MakeTypedPepperArgString("")
7594 context_arg = "PP_Resource context"
7595 if len(original_arg):
7596 arg = context_arg + ", " + original_arg
7599 file.Write(" %s (*%s)(%s);\n" % (func.return_type, func.name, arg))
7600 file.Write("};\n\n")
7605 def WritePepperGLES2Implementation(self, filename):
7606 """Writes the Pepper OpenGLES interface implementation."""
7608 file = CWriter(filename)
7609 file.Write(_LICENSE)
7610 file.Write(_DO_NOT_EDIT_WARNING)
7612 file.Write("#include \"ppapi/shared_impl/ppb_opengles2_shared.h\"\n\n")
7613 file.Write("#include \"base/logging.h\"\n")
7614 file.Write("#include \"gpu/command_buffer/client/gles2_implementation.h\"\n")
7615 file.Write("#include \"ppapi/shared_impl/ppb_graphics_3d_shared.h\"\n")
7616 file.Write("#include \"ppapi/thunk/enter.h\"\n\n")
7618 file.Write("namespace ppapi {\n\n")
7619 file.Write("namespace {\n\n")
7621 file.Write("typedef thunk::EnterResource<thunk::PPB_Graphics3D_API>"
7624 file.Write("gpu::gles2::GLES2Implementation* ToGles2Impl(Enter3D*"
7626 file.Write(" DCHECK(enter);\n")
7627 file.Write(" DCHECK(enter->succeeded());\n")
7628 file.Write(" return static_cast<PPB_Graphics3D_Shared*>(enter->object())->"
7630 file.Write("}\n\n");
7632 for func in self.original_functions:
7633 if not func.InAnyPepperExtension():
7636 original_arg = func.MakeTypedPepperArgString("")
7637 context_arg = "PP_Resource context_id"
7638 if len(original_arg):
7639 arg = context_arg + ", " + original_arg
7642 file.Write("%s %s(%s) {\n" % (func.return_type, func.name, arg))
7643 file.Write(" Enter3D enter(context_id, true);\n")
7644 file.Write(" if (enter.succeeded()) {\n")
7646 return_str = "" if func.return_type == "void" else "return "
7647 file.Write(" %sToGles2Impl(&enter)->%s(%s);\n" %
7648 (return_str, func.original_name,
7649 func.MakeOriginalArgString("")))
7651 if func.return_type == "void":
7654 file.Write(" else {\n")
7656 if func.GetInfo("error_return"):
7657 error_return = func.GetInfo("error_return")
7658 elif func.return_type == "GLboolean":
7659 error_return = "GL_FALSE"
7660 elif "*" in func.return_type:
7661 error_return = "NULL"
7662 file.Write(" return %s;\n" % error_return)
7666 file.Write("} // namespace\n")
7668 for interface in self.pepper_interfaces:
7669 file.Write("const %s* PPB_OpenGLES2_Shared::Get%sInterface() {\n" %
7670 (interface.GetStructName(), interface.GetName()))
7671 file.Write(" static const struct %s "
7672 "ppb_opengles2 = {\n" % interface.GetStructName())
7674 file.Write(",\n &".join(
7675 f.name for f in self.original_functions
7676 if f.InPepperInterface(interface)))
7680 file.Write(" return &ppb_opengles2;\n")
7683 file.Write("} // namespace ppapi\n")
7686 def WriteGLES2ToPPAPIBridge(self, filename):
7687 """Connects GLES2 helper library to PPB_OpenGLES2 interface"""
7689 file = CWriter(filename)
7690 file.Write(_LICENSE)
7691 file.Write(_DO_NOT_EDIT_WARNING)
7693 file.Write("#ifndef GL_GLEXT_PROTOTYPES\n")
7694 file.Write("#define GL_GLEXT_PROTOTYPES\n")
7695 file.Write("#endif\n")
7696 file.Write("#include <GLES2/gl2.h>\n")
7697 file.Write("#include <GLES2/gl2ext.h>\n")
7698 file.Write("#include \"ppapi/lib/gl/gles2/gl2ext_ppapi.h\"\n\n")
7700 for func in self.original_functions:
7701 if not func.InAnyPepperExtension():
7704 interface = self.interface_info[func.GetInfo('pepper_interface') or '']
7706 file.Write("%s GL_APIENTRY gl%s(%s) {\n" %
7707 (func.return_type, func.name,
7708 func.MakeTypedOriginalArgString("")))
7709 return_str = "" if func.return_type == "void" else "return "
7710 interface_str = "glGet%sInterfacePPAPI()" % interface.GetName()
7711 original_arg = func.MakeOriginalArgString("")
7712 context_arg = "glGetCurrentContextPPAPI()"
7713 if len(original_arg):
7714 arg = context_arg + ", " + original_arg
7717 if interface.GetName():
7718 file.Write(" const struct %s* ext = %s;\n" %
7719 (interface.GetStructName(), interface_str))
7720 file.Write(" if (ext)\n")
7721 file.Write(" %sext->%s(%s);\n" %
7722 (return_str, func.name, arg))
7724 file.Write(" %s0;\n" % return_str)
7726 file.Write(" %s%s->%s(%s);\n" %
7727 (return_str, interface_str, func.name, arg))
7732 """This is the main function."""
7733 parser = OptionParser()
7735 "-g", "--generate-implementation-templates", action="store_true",
7736 help="generates files that are generally hand edited..")
7738 "--alternate-mode", type="choice",
7739 choices=("ppapi", "chrome_ppapi", "chrome_ppapi_proxy", "nacl_ppapi"),
7740 help="generate files for other projects. \"ppapi\" will generate ppapi "
7741 "bindings. \"chrome_ppapi\" generate chrome implementation for ppapi. "
7742 "\"chrome_ppapi_proxy\" will generate the glue for the chrome IPC ppapi"
7743 "proxy. \"nacl_ppapi\" will generate NaCl implementation for ppapi")
7746 help="base directory for resulting files, under chrome/src. default is "
7747 "empty. Use this if you want the result stored under gen.")
7749 "-v", "--verbose", action="store_true",
7750 help="prints more output.")
7752 (options, args) = parser.parse_args(args=argv)
7754 # Add in states and capabilites to GLState
7755 for state_name in sorted(_STATES.keys()):
7756 state = _STATES[state_name]
7758 _ENUM_LISTS['GLState']['valid'].append(state['enum'])
7760 for item in state['states']:
7761 if 'extension_flag' in item:
7763 _ENUM_LISTS['GLState']['valid'].append(item['enum'])
7764 for capability in _CAPABILITY_FLAGS:
7765 _ENUM_LISTS['GLState']['valid'].append("GL_%s" % capability['name'].upper())
7767 # This script lives under gpu/command_buffer, cd to base directory.
7768 os.chdir(os.path.dirname(__file__) + "/../..")
7770 gen = GLGenerator(options.verbose)
7771 gen.ParseGLH("common/GLES2/gl2.h")
7773 # Support generating files under gen/
7774 if options.output_dir != None:
7775 os.chdir(options.output_dir)
7777 if options.alternate_mode == "ppapi":
7778 # To trigger this action, do "make ppapi_gles_bindings"
7780 gen.WritePepperGLES2Interface("c/ppb_opengles2.h", False)
7781 gen.WritePepperGLES2Interface("c/dev/ppb_opengles2ext_dev.h", True)
7782 gen.WriteGLES2ToPPAPIBridge("lib/gl/gles2/gles2.c")
7784 elif options.alternate_mode == "chrome_ppapi":
7785 # To trigger this action, do "make ppapi_gles_implementation"
7786 gen.WritePepperGLES2Implementation(
7787 "ppapi/shared_impl/ppb_opengles2_shared.cc")
7790 os.chdir("gpu/command_buffer")
7791 gen.WriteCommandIds("common/gles2_cmd_ids_autogen.h")
7792 gen.WriteFormat("common/gles2_cmd_format_autogen.h")
7793 gen.WriteFormatTest("common/gles2_cmd_format_test_autogen.h")
7794 gen.WriteGLES2InterfaceHeader("client/gles2_interface_autogen.h")
7795 gen.WriteGLES2InterfaceStub("client/gles2_interface_stub_autogen.h")
7796 gen.WriteGLES2InterfaceStubImpl(
7797 "client/gles2_interface_stub_impl_autogen.h")
7798 gen.WriteGLES2ImplementationHeader("client/gles2_implementation_autogen.h")
7799 gen.WriteGLES2Implementation("client/gles2_implementation_impl_autogen.h")
7800 gen.WriteGLES2ImplementationUnitTests(
7801 "client/gles2_implementation_unittest_autogen.h")
7802 gen.WriteGLES2TraceImplementationHeader(
7803 "client/gles2_trace_implementation_autogen.h")
7804 gen.WriteGLES2TraceImplementation(
7805 "client/gles2_trace_implementation_impl_autogen.h")
7806 gen.WriteGLES2CLibImplementation("client/gles2_c_lib_autogen.h")
7807 gen.WriteCmdHelperHeader("client/gles2_cmd_helper_autogen.h")
7808 gen.WriteServiceImplementation("service/gles2_cmd_decoder_autogen.h")
7809 gen.WriteServiceContextStateHeader("service/context_state_autogen.h")
7810 gen.WriteServiceContextStateImpl("service/context_state_impl_autogen.h")
7811 gen.WriteClientContextStateHeader("client/client_context_state_autogen.h")
7812 gen.WriteClientContextStateImpl(
7813 "client/client_context_state_impl_autogen.h")
7814 gen.WriteServiceUnitTests("service/gles2_cmd_decoder_unittest_%d_autogen.h")
7815 gen.WriteServiceUtilsHeader("service/gles2_cmd_validation_autogen.h")
7816 gen.WriteServiceUtilsImplementation(
7817 "service/gles2_cmd_validation_implementation_autogen.h")
7818 gen.WriteCommonUtilsHeader("common/gles2_cmd_utils_autogen.h")
7819 gen.WriteCommonUtilsImpl("common/gles2_cmd_utils_implementation_autogen.h")
7820 gen.WriteGLES2Header("../GLES2/gl2chromium_autogen.h")
7823 print "%d errors" % gen.errors
7828 if __name__ == '__main__':
7829 sys.exit(main(sys.argv[1:]))