| #!/usr/bin/env python |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """code generator for GLES2 command buffers.""" |
| |
| import itertools |
| import os |
| import os.path |
| import sys |
| import re |
| from optparse import OptionParser |
| |
| _SIZE_OF_UINT32 = 4 |
| _SIZE_OF_COMMAND_HEADER = 4 |
| _FIRST_SPECIFIC_COMMAND_ID = 256 |
| |
| _LICENSE = """// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| """ |
| |
| _DO_NOT_EDIT_WARNING = """// This file is auto-generated from |
| // gpu/command_buffer/build_gles2_cmd_buffer.py |
| // DO NOT EDIT! |
| |
| """ |
| |
| # This string is copied directly out of the gl2.h file from GLES2.0 |
| # |
| # Edits: |
| # |
| # *) Any argument that is a resourceID has been changed to GLid<Type>. |
| # (not pointer arguments) and if it's allowed to be zero it's GLidZero<Type> |
| # If it's allowed to not exist it's GLidBind<Type> |
| # |
| # *) All GLenums have been changed to GLenumTypeOfEnum |
| # |
| _GL_TYPES = { |
| 'GLenum': 'unsigned int', |
| 'GLboolean': 'unsigned char', |
| 'GLbitfield': 'unsigned int', |
| 'GLbyte': 'signed char', |
| 'GLshort': 'short', |
| 'GLint': 'int', |
| 'GLsizei': 'int', |
| 'GLubyte': 'unsigned char', |
| 'GLushort': 'unsigned short', |
| 'GLuint': 'unsigned int', |
| 'GLfloat': 'float', |
| 'GLclampf': 'float', |
| 'GLvoid': 'void', |
| 'GLfixed': 'int', |
| 'GLclampx': 'int', |
| 'GLintptr': 'long int', |
| 'GLsizeiptr': 'long int', |
| } |
| |
| # Capabilites selected with glEnable |
| _CAPABILITY_FLAGS = [ |
| {'name': 'blend'}, |
| {'name': 'cull_face'}, |
| {'name': 'depth_test', 'state_flag': 'framebuffer_state_.clear_state_dirty'}, |
| {'name': 'dither', 'default': True}, |
| {'name': 'polygon_offset_fill'}, |
| {'name': 'sample_alpha_to_coverage'}, |
| {'name': 'sample_coverage'}, |
| {'name': 'scissor_test', |
| 'state_flag': 'framebuffer_state_.clear_state_dirty'}, |
| {'name': 'stencil_test', |
| 'state_flag': 'framebuffer_state_.clear_state_dirty'}, |
| ] |
| |
| _STATES = { |
| 'ClearColor': { |
| 'type': 'Normal', |
| 'func': 'ClearColor', |
| 'enum': 'GL_COLOR_CLEAR_VALUE', |
| 'states': [ |
| {'name': 'color_clear_red', 'type': 'GLfloat', 'default': '0.0f'}, |
| {'name': 'color_clear_green', 'type': 'GLfloat', 'default': '0.0f'}, |
| {'name': 'color_clear_blue', 'type': 'GLfloat', 'default': '0.0f'}, |
| {'name': 'color_clear_alpha', 'type': 'GLfloat', 'default': '0.0f'}, |
| ], |
| }, |
| 'ClearDepthf': { |
| 'type': 'Normal', |
| 'func': 'ClearDepth', |
| 'enum': 'GL_DEPTH_CLEAR_VALUE', |
| 'states': [ |
| {'name': 'depth_clear', 'type': 'GLclampf', 'default': '1.0f'}, |
| ], |
| }, |
| 'ColorMask': { |
| 'type': 'Normal', |
| 'func': 'ColorMask', |
| 'enum': 'GL_COLOR_WRITEMASK', |
| 'states': [ |
| {'name': 'color_mask_red', 'type': 'GLboolean', 'default': 'true'}, |
| {'name': 'color_mask_green', 'type': 'GLboolean', 'default': 'true'}, |
| {'name': 'color_mask_blue', 'type': 'GLboolean', 'default': 'true'}, |
| {'name': 'color_mask_alpha', 'type': 'GLboolean', 'default': 'true'}, |
| ], |
| 'state_flag': 'framebuffer_state_.clear_state_dirty', |
| }, |
| 'ClearStencil': { |
| 'type': 'Normal', |
| 'func': 'ClearStencil', |
| 'enum': 'GL_STENCIL_CLEAR_VALUE', |
| 'states': [ |
| {'name': 'stencil_clear', 'type': 'GLint', 'default': '0'}, |
| ], |
| }, |
| 'BlendColor': { |
| 'type': 'Normal', |
| 'func': 'BlendColor', |
| 'enum': 'GL_BLEND_COLOR', |
| 'states': [ |
| {'name': 'blend_color_red', 'type': 'GLfloat', 'default': '0.0f'}, |
| {'name': 'blend_color_green', 'type': 'GLfloat', 'default': '0.0f'}, |
| {'name': 'blend_color_blue', 'type': 'GLfloat', 'default': '0.0f'}, |
| {'name': 'blend_color_alpha', 'type': 'GLfloat', 'default': '0.0f'}, |
| ], |
| }, |
| 'BlendEquation': { |
| 'type': 'SrcDst', |
| 'func': 'BlendEquationSeparate', |
| 'states': [ |
| { |
| 'name': 'blend_equation_rgb', |
| 'type': 'GLenum', |
| 'enum': 'GL_BLEND_EQUATION_RGB', |
| 'default': 'GL_FUNC_ADD', |
| }, |
| { |
| 'name': 'blend_equation_alpha', |
| 'type': 'GLenum', |
| 'enum': 'GL_BLEND_EQUATION_ALPHA', |
| 'default': 'GL_FUNC_ADD', |
| }, |
| ], |
| }, |
| 'BlendFunc': { |
| 'type': 'SrcDst', |
| 'func': 'BlendFuncSeparate', |
| 'states': [ |
| { |
| 'name': 'blend_source_rgb', |
| 'type': 'GLenum', |
| 'enum': 'GL_BLEND_SRC_RGB', |
| 'default': 'GL_ONE', |
| }, |
| { |
| 'name': 'blend_dest_rgb', |
| 'type': 'GLenum', |
| 'enum': 'GL_BLEND_DST_RGB', |
| 'default': 'GL_ZERO', |
| }, |
| { |
| 'name': 'blend_source_alpha', |
| 'type': 'GLenum', |
| 'enum': 'GL_BLEND_SRC_ALPHA', |
| 'default': 'GL_ONE', |
| }, |
| { |
| 'name': 'blend_dest_alpha', |
| 'type': 'GLenum', |
| 'enum': 'GL_BLEND_DST_ALPHA', |
| 'default': 'GL_ZERO', |
| }, |
| ], |
| }, |
| 'PolygonOffset': { |
| 'type': 'Normal', |
| 'func': 'PolygonOffset', |
| 'states': [ |
| { |
| 'name': 'polygon_offset_factor', |
| 'type': 'GLfloat', |
| 'enum': 'GL_POLYGON_OFFSET_FACTOR', |
| 'default': '0.0f', |
| }, |
| { |
| 'name': 'polygon_offset_units', |
| 'type': 'GLfloat', |
| 'enum': 'GL_POLYGON_OFFSET_UNITS', |
| 'default': '0.0f', |
| }, |
| ], |
| }, |
| 'CullFace': { |
| 'type': 'Normal', |
| 'func': 'CullFace', |
| 'enum': 'GL_CULL_FACE_MODE', |
| 'states': [ |
| { |
| 'name': 'cull_mode', |
| 'type': 'GLenum', |
| 'default': 'GL_BACK', |
| }, |
| ], |
| }, |
| 'FrontFace': { |
| 'type': 'Normal', |
| 'func': 'FrontFace', |
| 'enum': 'GL_FRONT_FACE', |
| 'states': [{'name': 'front_face', 'type': 'GLenum', 'default': 'GL_CCW'}], |
| }, |
| 'DepthFunc': { |
| 'type': 'Normal', |
| 'func': 'DepthFunc', |
| 'enum': 'GL_DEPTH_FUNC', |
| 'states': [{'name': 'depth_func', 'type': 'GLenum', 'default': 'GL_LESS'}], |
| }, |
| 'DepthRange': { |
| 'type': 'Normal', |
| 'func': 'DepthRange', |
| 'enum': 'GL_DEPTH_RANGE', |
| 'states': [ |
| {'name': 'z_near', 'type': 'GLclampf', 'default': '0.0f'}, |
| {'name': 'z_far', 'type': 'GLclampf', 'default': '1.0f'}, |
| ], |
| }, |
| 'SampleCoverage': { |
| 'type': 'Normal', |
| 'func': 'SampleCoverage', |
| 'states': [ |
| { |
| 'name': 'sample_coverage_value', |
| 'type': 'GLclampf', |
| 'enum': 'GL_SAMPLE_COVERAGE_VALUE', |
| 'default': '1.0f', |
| }, |
| { |
| 'name': 'sample_coverage_invert', |
| 'type': 'GLboolean', |
| 'enum': 'GL_SAMPLE_COVERAGE_INVERT', |
| 'default': 'false', |
| }, |
| ], |
| }, |
| 'StencilMask': { |
| 'type': 'FrontBack', |
| 'func': 'StencilMaskSeparate', |
| 'state_flag': 'framebuffer_state_.clear_state_dirty', |
| 'states': [ |
| { |
| 'name': 'stencil_front_writemask', |
| 'type': 'GLuint', |
| 'enum': 'GL_STENCIL_WRITEMASK', |
| 'default': '0xFFFFFFFFU', |
| }, |
| { |
| 'name': 'stencil_back_writemask', |
| 'type': 'GLuint', |
| 'enum': 'GL_STENCIL_BACK_WRITEMASK', |
| 'default': '0xFFFFFFFFU', |
| }, |
| ], |
| }, |
| 'StencilOp': { |
| 'type': 'FrontBack', |
| 'func': 'StencilOpSeparate', |
| 'states': [ |
| { |
| 'name': 'stencil_front_fail_op', |
| 'type': 'GLenum', |
| 'enum': 'GL_STENCIL_FAIL', |
| 'default': 'GL_KEEP', |
| }, |
| { |
| 'name': 'stencil_front_z_fail_op', |
| 'type': 'GLenum', |
| 'enum': 'GL_STENCIL_PASS_DEPTH_FAIL', |
| 'default': 'GL_KEEP', |
| }, |
| { |
| 'name': 'stencil_front_z_pass_op', |
| 'type': 'GLenum', |
| 'enum': 'GL_STENCIL_PASS_DEPTH_PASS', |
| 'default': 'GL_KEEP', |
| }, |
| { |
| 'name': 'stencil_back_fail_op', |
| 'type': 'GLenum', |
| 'enum': 'GL_STENCIL_BACK_FAIL', |
| 'default': 'GL_KEEP', |
| }, |
| { |
| 'name': 'stencil_back_z_fail_op', |
| 'type': 'GLenum', |
| 'enum': 'GL_STENCIL_BACK_PASS_DEPTH_FAIL', |
| 'default': 'GL_KEEP', |
| }, |
| { |
| 'name': 'stencil_back_z_pass_op', |
| 'type': 'GLenum', |
| 'enum': 'GL_STENCIL_BACK_PASS_DEPTH_PASS', |
| 'default': 'GL_KEEP', |
| }, |
| ], |
| }, |
| 'StencilFunc': { |
| 'type': 'FrontBack', |
| 'func': 'StencilFuncSeparate', |
| 'states': [ |
| { |
| 'name': 'stencil_front_func', |
| 'type': 'GLenum', |
| 'enum': 'GL_STENCIL_FUNC', |
| 'default': 'GL_ALWAYS', |
| }, |
| { |
| 'name': 'stencil_front_ref', |
| 'type': 'GLint', |
| 'enum': 'GL_STENCIL_REF', |
| 'default': '0', |
| }, |
| { |
| 'name': 'stencil_front_mask', |
| 'type': 'GLuint', |
| 'enum': 'GL_STENCIL_VALUE_MASK', |
| 'default': '0xFFFFFFFFU', |
| }, |
| { |
| 'name': 'stencil_back_func', |
| 'type': 'GLenum', |
| 'enum': 'GL_STENCIL_BACK_FUNC', |
| 'default': 'GL_ALWAYS', |
| }, |
| { |
| 'name': 'stencil_back_ref', |
| 'type': 'GLint', |
| 'enum': 'GL_STENCIL_BACK_REF', |
| 'default': '0', |
| }, |
| { |
| 'name': 'stencil_back_mask', |
| 'type': 'GLuint', |
| 'enum': 'GL_STENCIL_BACK_VALUE_MASK', |
| 'default': '0xFFFFFFFFU', |
| }, |
| ], |
| }, |
| 'Hint': { |
| 'type': 'NamedParameter', |
| 'func': 'Hint', |
| 'states': [ |
| { |
| 'name': 'hint_generate_mipmap', |
| 'type': 'GLenum', |
| 'enum': 'GL_GENERATE_MIPMAP_HINT', |
| 'default': 'GL_DONT_CARE' |
| }, |
| { |
| 'name': 'hint_fragment_shader_derivative', |
| 'type': 'GLenum', |
| 'enum': 'GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES', |
| 'default': 'GL_DONT_CARE', |
| 'extension_flag': 'oes_standard_derivatives' |
| } |
| ], |
| }, |
| 'PixelStore': { |
| 'type': 'NamedParameter', |
| 'func': 'PixelStorei', |
| 'states': [ |
| { |
| 'name': 'pack_alignment', |
| 'type': 'GLint', |
| 'enum': 'GL_PACK_ALIGNMENT', |
| 'default': '4' |
| }, |
| { |
| 'name': 'unpack_alignment', |
| 'type': 'GLint', |
| 'enum': 'GL_UNPACK_ALIGNMENT', |
| 'default': '4' |
| } |
| ], |
| }, |
| # TODO: Consider implemenenting these states |
| # GL_ACTIVE_TEXTURE |
| 'LineWidth': { |
| 'type': 'Normal', |
| 'func': 'LineWidth', |
| 'enum': 'GL_LINE_WIDTH', |
| 'states': [ |
| { |
| 'name': 'line_width', |
| 'type': 'GLfloat', |
| 'default': '1.0f', |
| 'range_checks': [{'check': "<= 0.0f", 'test_value': "0.0f"}], |
| }], |
| }, |
| 'DepthMask': { |
| 'type': 'Normal', |
| 'func': 'DepthMask', |
| 'enum': 'GL_DEPTH_WRITEMASK', |
| 'states': [ |
| {'name': 'depth_mask', 'type': 'GLboolean', 'default': 'true'}, |
| ], |
| 'state_flag': 'framebuffer_state_.clear_state_dirty', |
| }, |
| 'Scissor': { |
| 'type': 'Normal', |
| 'func': 'Scissor', |
| 'enum': 'GL_SCISSOR_BOX', |
| 'states': [ |
| # NOTE: These defaults reset at GLES2DecoderImpl::Initialization. |
| { |
| 'name': 'scissor_x', |
| 'type': 'GLint', |
| 'default': '0', |
| 'expected': 'kViewportX', |
| }, |
| { |
| 'name': 'scissor_y', |
| 'type': 'GLint', |
| 'default': '0', |
| 'expected': 'kViewportY', |
| }, |
| { |
| 'name': 'scissor_width', |
| 'type': 'GLsizei', |
| 'default': '1', |
| 'expected': 'kViewportWidth', |
| }, |
| { |
| 'name': 'scissor_height', |
| 'type': 'GLsizei', |
| 'default': '1', |
| 'expected': 'kViewportHeight', |
| }, |
| ], |
| }, |
| 'Viewport': { |
| 'type': 'Normal', |
| 'func': 'Viewport', |
| 'enum': 'GL_VIEWPORT', |
| 'states': [ |
| # NOTE: These defaults reset at GLES2DecoderImpl::Initialization. |
| { |
| 'name': 'viewport_x', |
| 'type': 'GLint', |
| 'default': '0', |
| 'expected': 'kViewportX', |
| }, |
| { |
| 'name': 'viewport_y', |
| 'type': 'GLint', |
| 'default': '0', |
| 'expected': 'kViewportY', |
| }, |
| { |
| 'name': 'viewport_width', |
| 'type': 'GLsizei', |
| 'default': '1', |
| 'expected': 'kViewportWidth', |
| }, |
| { |
| 'name': 'viewport_height', |
| 'type': 'GLsizei', |
| 'default': '1', |
| 'expected': 'kViewportHeight', |
| }, |
| ], |
| }, |
| } |
| |
| # This is a list of enum names and their valid values. It is used to map |
| # GLenum arguments to a specific set of valid values. |
| _ENUM_LISTS = { |
| 'BlitFilter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_NEAREST', |
| 'GL_LINEAR', |
| ], |
| 'invalid': [ |
| 'GL_LINEAR_MIPMAP_LINEAR', |
| ], |
| }, |
| 'FrameBufferTarget': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_FRAMEBUFFER', |
| ], |
| 'invalid': [ |
| 'GL_DRAW_FRAMEBUFFER' , |
| 'GL_READ_FRAMEBUFFER' , |
| ], |
| }, |
| 'RenderBufferTarget': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_RENDERBUFFER', |
| ], |
| 'invalid': [ |
| 'GL_FRAMEBUFFER', |
| ], |
| }, |
| 'BufferTarget': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_ARRAY_BUFFER', |
| 'GL_ELEMENT_ARRAY_BUFFER', |
| ], |
| 'invalid': [ |
| 'GL_RENDERBUFFER', |
| ], |
| }, |
| 'BufferUsage': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_STREAM_DRAW', |
| 'GL_STATIC_DRAW', |
| 'GL_DYNAMIC_DRAW', |
| ], |
| 'invalid': [ |
| 'GL_STATIC_READ', |
| ], |
| }, |
| 'CompressedTextureFormat': { |
| 'type': 'GLenum', |
| 'valid': [ |
| ], |
| }, |
| 'GLState': { |
| 'type': 'GLenum', |
| 'valid': [ |
| # NOTE: State an Capability entries added later. |
| 'GL_ACTIVE_TEXTURE', |
| 'GL_ALIASED_LINE_WIDTH_RANGE', |
| 'GL_ALIASED_POINT_SIZE_RANGE', |
| 'GL_ALPHA_BITS', |
| 'GL_ARRAY_BUFFER_BINDING', |
| 'GL_BLUE_BITS', |
| 'GL_COMPRESSED_TEXTURE_FORMATS', |
| 'GL_CURRENT_PROGRAM', |
| 'GL_DEPTH_BITS', |
| 'GL_DEPTH_RANGE', |
| 'GL_ELEMENT_ARRAY_BUFFER_BINDING', |
| 'GL_FRAMEBUFFER_BINDING', |
| 'GL_GENERATE_MIPMAP_HINT', |
| 'GL_GREEN_BITS', |
| 'GL_IMPLEMENTATION_COLOR_READ_FORMAT', |
| 'GL_IMPLEMENTATION_COLOR_READ_TYPE', |
| 'GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS', |
| 'GL_MAX_CUBE_MAP_TEXTURE_SIZE', |
| 'GL_MAX_FRAGMENT_UNIFORM_VECTORS', |
| 'GL_MAX_RENDERBUFFER_SIZE', |
| 'GL_MAX_TEXTURE_IMAGE_UNITS', |
| 'GL_MAX_TEXTURE_SIZE', |
| 'GL_MAX_VARYING_VECTORS', |
| 'GL_MAX_VERTEX_ATTRIBS', |
| 'GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS', |
| 'GL_MAX_VERTEX_UNIFORM_VECTORS', |
| 'GL_MAX_VIEWPORT_DIMS', |
| 'GL_NUM_COMPRESSED_TEXTURE_FORMATS', |
| 'GL_NUM_SHADER_BINARY_FORMATS', |
| 'GL_PACK_ALIGNMENT', |
| 'GL_RED_BITS', |
| 'GL_RENDERBUFFER_BINDING', |
| 'GL_SAMPLE_BUFFERS', |
| 'GL_SAMPLE_COVERAGE_INVERT', |
| 'GL_SAMPLE_COVERAGE_VALUE', |
| 'GL_SAMPLES', |
| 'GL_SCISSOR_BOX', |
| 'GL_SHADER_BINARY_FORMATS', |
| 'GL_SHADER_COMPILER', |
| 'GL_SUBPIXEL_BITS', |
| 'GL_STENCIL_BITS', |
| 'GL_TEXTURE_BINDING_2D', |
| 'GL_TEXTURE_BINDING_CUBE_MAP', |
| 'GL_UNPACK_ALIGNMENT', |
| 'GL_UNPACK_FLIP_Y_CHROMIUM', |
| 'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM', |
| 'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM', |
| # we can add this because we emulate it if the driver does not support it. |
| 'GL_VERTEX_ARRAY_BINDING_OES', |
| 'GL_VIEWPORT', |
| ], |
| 'invalid': [ |
| 'GL_FOG_HINT', |
| ], |
| }, |
| 'GetTexParamTarget': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_TEXTURE_2D', |
| 'GL_TEXTURE_CUBE_MAP', |
| ], |
| 'invalid': [ |
| 'GL_PROXY_TEXTURE_CUBE_MAP', |
| ] |
| }, |
| 'TextureTarget': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_TEXTURE_2D', |
| 'GL_TEXTURE_CUBE_MAP_POSITIVE_X', |
| 'GL_TEXTURE_CUBE_MAP_NEGATIVE_X', |
| 'GL_TEXTURE_CUBE_MAP_POSITIVE_Y', |
| 'GL_TEXTURE_CUBE_MAP_NEGATIVE_Y', |
| 'GL_TEXTURE_CUBE_MAP_POSITIVE_Z', |
| 'GL_TEXTURE_CUBE_MAP_NEGATIVE_Z', |
| ], |
| 'invalid': [ |
| 'GL_PROXY_TEXTURE_CUBE_MAP', |
| ] |
| }, |
| 'TextureBindTarget': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_TEXTURE_2D', |
| 'GL_TEXTURE_CUBE_MAP', |
| ], |
| 'invalid': [ |
| 'GL_TEXTURE_1D', |
| 'GL_TEXTURE_3D', |
| ], |
| }, |
| 'ShaderType': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_VERTEX_SHADER', |
| 'GL_FRAGMENT_SHADER', |
| ], |
| 'invalid': [ |
| 'GL_GEOMETRY_SHADER', |
| ], |
| }, |
| 'FaceType': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_FRONT', |
| 'GL_BACK', |
| 'GL_FRONT_AND_BACK', |
| ], |
| }, |
| 'FaceMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_CW', |
| 'GL_CCW', |
| ], |
| }, |
| 'CmpFunction': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_NEVER', |
| 'GL_LESS', |
| 'GL_EQUAL', |
| 'GL_LEQUAL', |
| 'GL_GREATER', |
| 'GL_NOTEQUAL', |
| 'GL_GEQUAL', |
| 'GL_ALWAYS', |
| ], |
| }, |
| 'Equation': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_FUNC_ADD', |
| 'GL_FUNC_SUBTRACT', |
| 'GL_FUNC_REVERSE_SUBTRACT', |
| ], |
| 'invalid': [ |
| 'GL_MIN', |
| 'GL_MAX', |
| ], |
| }, |
| 'SrcBlendFactor': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_ZERO', |
| 'GL_ONE', |
| 'GL_SRC_COLOR', |
| 'GL_ONE_MINUS_SRC_COLOR', |
| 'GL_DST_COLOR', |
| 'GL_ONE_MINUS_DST_COLOR', |
| 'GL_SRC_ALPHA', |
| 'GL_ONE_MINUS_SRC_ALPHA', |
| 'GL_DST_ALPHA', |
| 'GL_ONE_MINUS_DST_ALPHA', |
| 'GL_CONSTANT_COLOR', |
| 'GL_ONE_MINUS_CONSTANT_COLOR', |
| 'GL_CONSTANT_ALPHA', |
| 'GL_ONE_MINUS_CONSTANT_ALPHA', |
| 'GL_SRC_ALPHA_SATURATE', |
| ], |
| }, |
| 'DstBlendFactor': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_ZERO', |
| 'GL_ONE', |
| 'GL_SRC_COLOR', |
| 'GL_ONE_MINUS_SRC_COLOR', |
| 'GL_DST_COLOR', |
| 'GL_ONE_MINUS_DST_COLOR', |
| 'GL_SRC_ALPHA', |
| 'GL_ONE_MINUS_SRC_ALPHA', |
| 'GL_DST_ALPHA', |
| 'GL_ONE_MINUS_DST_ALPHA', |
| 'GL_CONSTANT_COLOR', |
| 'GL_ONE_MINUS_CONSTANT_COLOR', |
| 'GL_CONSTANT_ALPHA', |
| 'GL_ONE_MINUS_CONSTANT_ALPHA', |
| ], |
| }, |
| 'Capability': { |
| 'type': 'GLenum', |
| 'valid': ["GL_%s" % cap['name'].upper() for cap in _CAPABILITY_FLAGS], |
| 'invalid': [ |
| 'GL_CLIP_PLANE0', |
| 'GL_POINT_SPRITE', |
| ], |
| }, |
| 'DrawMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_POINTS', |
| 'GL_LINE_STRIP', |
| 'GL_LINE_LOOP', |
| 'GL_LINES', |
| 'GL_TRIANGLE_STRIP', |
| 'GL_TRIANGLE_FAN', |
| 'GL_TRIANGLES', |
| ], |
| 'invalid': [ |
| 'GL_QUADS', |
| 'GL_POLYGON', |
| ], |
| }, |
| 'IndexType': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_UNSIGNED_BYTE', |
| 'GL_UNSIGNED_SHORT', |
| ], |
| 'invalid': [ |
| 'GL_UNSIGNED_INT', |
| 'GL_INT', |
| ], |
| }, |
| 'GetMaxIndexType': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_UNSIGNED_BYTE', |
| 'GL_UNSIGNED_SHORT', |
| 'GL_UNSIGNED_INT', |
| ], |
| 'invalid': [ |
| 'GL_INT', |
| ], |
| }, |
| 'Attachment': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_COLOR_ATTACHMENT0', |
| 'GL_DEPTH_ATTACHMENT', |
| 'GL_STENCIL_ATTACHMENT', |
| ], |
| }, |
| 'BackbufferAttachment': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_COLOR_EXT', |
| 'GL_DEPTH_EXT', |
| 'GL_STENCIL_EXT', |
| ], |
| }, |
| 'BufferParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_BUFFER_SIZE', |
| 'GL_BUFFER_USAGE', |
| ], |
| 'invalid': [ |
| 'GL_PIXEL_PACK_BUFFER', |
| ], |
| }, |
| 'FrameBufferParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE', |
| 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME', |
| 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL', |
| 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE', |
| ], |
| }, |
| 'ProgramParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_DELETE_STATUS', |
| 'GL_LINK_STATUS', |
| 'GL_VALIDATE_STATUS', |
| 'GL_INFO_LOG_LENGTH', |
| 'GL_ATTACHED_SHADERS', |
| 'GL_ACTIVE_ATTRIBUTES', |
| 'GL_ACTIVE_ATTRIBUTE_MAX_LENGTH', |
| 'GL_ACTIVE_UNIFORMS', |
| 'GL_ACTIVE_UNIFORM_MAX_LENGTH', |
| ], |
| }, |
| 'QueryObjectParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_QUERY_RESULT_EXT', |
| 'GL_QUERY_RESULT_AVAILABLE_EXT', |
| ], |
| }, |
| 'QueryParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_CURRENT_QUERY_EXT', |
| ], |
| }, |
| 'QueryTarget': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_ANY_SAMPLES_PASSED_EXT', |
| 'GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT', |
| 'GL_COMMANDS_ISSUED_CHROMIUM', |
| 'GL_LATENCY_QUERY_CHROMIUM', |
| 'GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM', |
| 'GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM', |
| ], |
| }, |
| 'RenderBufferParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_RENDERBUFFER_RED_SIZE', |
| 'GL_RENDERBUFFER_GREEN_SIZE', |
| 'GL_RENDERBUFFER_BLUE_SIZE', |
| 'GL_RENDERBUFFER_ALPHA_SIZE', |
| 'GL_RENDERBUFFER_DEPTH_SIZE', |
| 'GL_RENDERBUFFER_STENCIL_SIZE', |
| 'GL_RENDERBUFFER_WIDTH', |
| 'GL_RENDERBUFFER_HEIGHT', |
| 'GL_RENDERBUFFER_INTERNAL_FORMAT', |
| ], |
| }, |
| 'ShaderParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_SHADER_TYPE', |
| 'GL_DELETE_STATUS', |
| 'GL_COMPILE_STATUS', |
| 'GL_INFO_LOG_LENGTH', |
| 'GL_SHADER_SOURCE_LENGTH', |
| 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE', |
| ], |
| }, |
| 'ShaderPrecision': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_LOW_FLOAT', |
| 'GL_MEDIUM_FLOAT', |
| 'GL_HIGH_FLOAT', |
| 'GL_LOW_INT', |
| 'GL_MEDIUM_INT', |
| 'GL_HIGH_INT', |
| ], |
| }, |
| 'StringType': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_VENDOR', |
| 'GL_RENDERER', |
| 'GL_VERSION', |
| 'GL_SHADING_LANGUAGE_VERSION', |
| 'GL_EXTENSIONS', |
| ], |
| }, |
| 'TextureParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_TEXTURE_MAG_FILTER', |
| 'GL_TEXTURE_MIN_FILTER', |
| 'GL_TEXTURE_POOL_CHROMIUM', |
| 'GL_TEXTURE_WRAP_S', |
| 'GL_TEXTURE_WRAP_T', |
| ], |
| 'invalid': [ |
| 'GL_GENERATE_MIPMAP', |
| ], |
| }, |
| 'TexturePool': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_TEXTURE_POOL_MANAGED_CHROMIUM', |
| 'GL_TEXTURE_POOL_UNMANAGED_CHROMIUM', |
| ], |
| }, |
| 'TextureWrapMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_CLAMP_TO_EDGE', |
| 'GL_MIRRORED_REPEAT', |
| 'GL_REPEAT', |
| ], |
| }, |
| 'TextureMinFilterMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_NEAREST', |
| 'GL_LINEAR', |
| 'GL_NEAREST_MIPMAP_NEAREST', |
| 'GL_LINEAR_MIPMAP_NEAREST', |
| 'GL_NEAREST_MIPMAP_LINEAR', |
| 'GL_LINEAR_MIPMAP_LINEAR', |
| ], |
| }, |
| 'TextureMagFilterMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_NEAREST', |
| 'GL_LINEAR', |
| ], |
| }, |
| 'TextureUsage': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_NONE', |
| 'GL_FRAMEBUFFER_ATTACHMENT_ANGLE', |
| ], |
| }, |
| 'VertexAttribute': { |
| 'type': 'GLenum', |
| 'valid': [ |
| # some enum that the decoder actually passes through to GL needs |
| # to be the first listed here since it's used in unit tests. |
| 'GL_VERTEX_ATTRIB_ARRAY_NORMALIZED', |
| 'GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING', |
| 'GL_VERTEX_ATTRIB_ARRAY_ENABLED', |
| 'GL_VERTEX_ATTRIB_ARRAY_SIZE', |
| 'GL_VERTEX_ATTRIB_ARRAY_STRIDE', |
| 'GL_VERTEX_ATTRIB_ARRAY_TYPE', |
| 'GL_CURRENT_VERTEX_ATTRIB', |
| ], |
| }, |
| 'VertexPointer': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_VERTEX_ATTRIB_ARRAY_POINTER', |
| ], |
| }, |
| 'HintTarget': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_GENERATE_MIPMAP_HINT', |
| ], |
| 'invalid': [ |
| 'GL_PERSPECTIVE_CORRECTION_HINT', |
| ], |
| }, |
| 'HintMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_FASTEST', |
| 'GL_NICEST', |
| 'GL_DONT_CARE', |
| ], |
| }, |
| 'PixelStore': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_PACK_ALIGNMENT', |
| 'GL_UNPACK_ALIGNMENT', |
| 'GL_UNPACK_FLIP_Y_CHROMIUM', |
| 'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM', |
| 'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM', |
| ], |
| 'invalid': [ |
| 'GL_PACK_SWAP_BYTES', |
| 'GL_UNPACK_SWAP_BYTES', |
| ], |
| }, |
| 'PixelStoreAlignment': { |
| 'type': 'GLint', |
| 'valid': [ |
| '1', |
| '2', |
| '4', |
| '8', |
| ], |
| 'invalid': [ |
| '3', |
| '9', |
| ], |
| }, |
| 'ReadPixelFormat': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_ALPHA', |
| 'GL_RGB', |
| 'GL_RGBA', |
| ], |
| }, |
| 'PixelType': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_UNSIGNED_BYTE', |
| 'GL_UNSIGNED_SHORT_5_6_5', |
| 'GL_UNSIGNED_SHORT_4_4_4_4', |
| 'GL_UNSIGNED_SHORT_5_5_5_1', |
| ], |
| 'invalid': [ |
| 'GL_SHORT', |
| 'GL_INT', |
| ], |
| }, |
| 'ReadPixelType': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_UNSIGNED_BYTE', |
| 'GL_UNSIGNED_SHORT_5_6_5', |
| 'GL_UNSIGNED_SHORT_4_4_4_4', |
| 'GL_UNSIGNED_SHORT_5_5_5_1', |
| ], |
| 'invalid': [ |
| 'GL_SHORT', |
| 'GL_INT', |
| ], |
| }, |
| 'RenderBufferFormat': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_RGBA4', |
| 'GL_RGB565', |
| 'GL_RGB5_A1', |
| 'GL_DEPTH_COMPONENT16', |
| 'GL_STENCIL_INDEX8', |
| ], |
| }, |
| 'ShaderBinaryFormat': { |
| 'type': 'GLenum', |
| 'valid': [ |
| ], |
| }, |
| 'StencilOp': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_KEEP', |
| 'GL_ZERO', |
| 'GL_REPLACE', |
| 'GL_INCR', |
| 'GL_INCR_WRAP', |
| 'GL_DECR', |
| 'GL_DECR_WRAP', |
| 'GL_INVERT', |
| ], |
| }, |
| 'TextureFormat': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_ALPHA', |
| 'GL_LUMINANCE', |
| 'GL_LUMINANCE_ALPHA', |
| 'GL_RGB', |
| 'GL_RGBA', |
| ], |
| 'invalid': [ |
| 'GL_BGRA', |
| 'GL_BGR', |
| ], |
| }, |
| 'TextureInternalFormat': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_ALPHA', |
| 'GL_LUMINANCE', |
| 'GL_LUMINANCE_ALPHA', |
| 'GL_RGB', |
| 'GL_RGBA', |
| ], |
| 'invalid': [ |
| 'GL_BGRA', |
| 'GL_BGR', |
| ], |
| }, |
| 'TextureInternalFormatStorage': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_RGB565', |
| 'GL_RGBA4', |
| 'GL_RGB5_A1', |
| 'GL_ALPHA8_EXT', |
| 'GL_LUMINANCE8_EXT', |
| 'GL_LUMINANCE8_ALPHA8_EXT', |
| 'GL_RGB8_OES', |
| 'GL_RGBA8_OES', |
| ], |
| }, |
| 'VertexAttribType': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_BYTE', |
| 'GL_UNSIGNED_BYTE', |
| 'GL_SHORT', |
| 'GL_UNSIGNED_SHORT', |
| # 'GL_FIXED', // This is not available on Desktop GL. |
| 'GL_FLOAT', |
| ], |
| 'invalid': [ |
| 'GL_DOUBLE', |
| ], |
| }, |
| 'TextureBorder': { |
| 'type': 'GLint', |
| 'valid': [ |
| '0', |
| ], |
| 'invalid': [ |
| '1', |
| ], |
| }, |
| 'VertexAttribSize': { |
| 'type': 'GLint', |
| 'valid': [ |
| '1', |
| '2', |
| '3', |
| '4', |
| ], |
| 'invalid': [ |
| '0', |
| '5', |
| ], |
| }, |
| 'ZeroOnly': { |
| 'type': 'GLint', |
| 'valid': [ |
| '0', |
| ], |
| 'invalid': [ |
| '1', |
| ], |
| }, |
| 'FalseOnly': { |
| 'type': 'GLboolean', |
| 'valid': [ |
| 'false', |
| ], |
| 'invalid': [ |
| 'true', |
| ], |
| }, |
| 'ResetStatus': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_GUILTY_CONTEXT_RESET_ARB', |
| 'GL_INNOCENT_CONTEXT_RESET_ARB', |
| 'GL_UNKNOWN_CONTEXT_RESET_ARB', |
| ], |
| }, |
| } |
| |
| # This table specifies the different pepper interfaces that are supported for |
| # GL commands. 'dev' is true if it's a dev interface. |
| _PEPPER_INTERFACES = [ |
| {'name': '', 'dev': False}, |
| {'name': 'InstancedArrays', 'dev': False}, |
| {'name': 'FramebufferBlit', 'dev': False}, |
| {'name': 'FramebufferMultisample', 'dev': False}, |
| {'name': 'ChromiumEnableFeature', 'dev': False}, |
| {'name': 'ChromiumMapSub', 'dev': False}, |
| {'name': 'Query', 'dev': False}, |
| ] |
| |
| # This table specifies types and other special data for the commands that |
| # will be generated. |
| # |
| # Must match function names specified in "cmd_buffer_functions.txt". |
| # |
| # cmd_comment: A comment added to the cmd format. |
| # type: defines which handler will be used to generate code. |
| # decoder_func: defines which function to call in the decoder to execute the |
| # corresponding GL command. If not specified the GL command will |
| # be called directly. |
| # gl_test_func: GL function that is expected to be called when testing. |
| # cmd_args: The arguments to use for the command. This overrides generating |
| # them based on the GL function arguments. |
| # a NonImmediate type is a type that stays a pointer even in |
| # and immediate version of acommand. |
| # gen_cmd: Whether or not this function geneates a command. Default = True. |
| # immediate: Whether or not to generate an immediate command for the GL |
| # function. The default is if there is exactly 1 pointer argument |
| # in the GL function an immediate command is generated. |
| # bucket: True to generate a bucket version of the command. |
| # impl_func: Whether or not to generate the GLES2Implementation part of this |
| # command. |
| # impl_decl: Whether or not to generate the GLES2Implementation declaration |
| # for this command. |
| # needs_size: If true a data_size field is added to the command. |
| # data_type: The type of data the command uses. For PUTn or PUT types. |
| # count: The number of units per element. For PUTn or PUT types. |
| # unit_test: If False no service side unit test will be generated. |
| # client_test: If False no client side unit test will be generated. |
| # expectation: If False the unit test will have no expected calls. |
| # gen_func: Name of function that generates GL resource for corresponding |
| # bind function. |
| # states: array of states that get set by this function corresponding to |
| # the given arguments |
| # state_flag: name of flag that is set to true when function is called. |
| # no_gl: no GL function is called. |
| # valid_args: A dictionary of argument indices to args to use in unit tests |
| # when they can not be automatically determined. |
| # pepper_interface: The pepper interface that is used for this extension |
| # invalid_test: False if no invalid test needed. |
| # shadowed: True = the value is shadowed so no glGetXXX call will be made. |
| # first_element_only: For PUT types, True if only the first element of an |
| # array is used and we end up calling the single value |
| # corresponding function. eg. TexParameteriv -> TexParameteri |
| |
| _FUNCTION_INFO = { |
| 'ActiveTexture': { |
| 'decoder_func': 'DoActiveTexture', |
| 'unit_test': False, |
| 'impl_func': False, |
| 'client_test': False, |
| }, |
| 'AttachShader': {'decoder_func': 'DoAttachShader'}, |
| 'BindAttribLocation': {'type': 'GLchar', 'bucket': True, 'needs_size': True}, |
| 'BindBuffer': { |
| 'type': 'Bind', |
| 'decoder_func': 'DoBindBuffer', |
| 'gen_func': 'GenBuffersARB', |
| }, |
| 'BindFramebuffer': { |
| 'type': 'Bind', |
| 'decoder_func': 'DoBindFramebuffer', |
| 'gl_test_func': 'glBindFramebufferEXT', |
| 'gen_func': 'GenFramebuffersEXT', |
| }, |
| 'BindRenderbuffer': { |
| 'type': 'Bind', |
| 'decoder_func': 'DoBindRenderbuffer', |
| 'gl_test_func': 'glBindRenderbufferEXT', |
| 'gen_func': 'GenRenderbuffersEXT', |
| }, |
| 'BindTexture': { |
| 'type': 'Bind', |
| 'decoder_func': 'DoBindTexture', |
| 'gen_func': 'GenTextures', |
| # TODO(gman): remove this once client side caching works. |
| 'client_test': False, |
| }, |
| 'BlitFramebufferEXT': { |
| 'decoder_func': 'DoBlitFramebufferEXT', |
| 'unit_test': False, |
| 'extension': True, |
| 'pepper_interface': 'FramebufferBlit', |
| 'defer_reads': True, |
| 'defer_draws': True, |
| }, |
| 'BufferData': { |
| 'type': 'Manual', |
| 'immediate': True, |
| 'client_test': False, |
| }, |
| 'BufferSubData': { |
| 'type': 'Data', |
| 'client_test': False, |
| 'decoder_func': 'DoBufferSubData', |
| }, |
| 'CheckFramebufferStatus': { |
| 'type': 'Is', |
| 'decoder_func': 'DoCheckFramebufferStatus', |
| 'gl_test_func': 'glCheckFramebufferStatusEXT', |
| 'error_value': 'GL_FRAMEBUFFER_UNSUPPORTED', |
| 'result': ['GLenum'], |
| }, |
| 'Clear': { |
| 'decoder_func': 'DoClear', |
| 'defer_draws': True, |
| }, |
| 'ClearColor': { |
| 'type': 'StateSet', |
| 'state': 'ClearColor', |
| }, |
| 'ClearDepthf': { |
| 'type': 'StateSet', |
| 'state': 'ClearDepthf', |
| 'decoder_func': 'glClearDepth', |
| 'gl_test_func': 'glClearDepth', |
| 'valid_args': { |
| '0': '0.5f' |
| }, |
| }, |
| 'ColorMask': { |
| 'type': 'StateSet', |
| 'state': 'ColorMask', |
| 'no_gl': True, |
| 'expectation': False, |
| }, |
| 'ConsumeTextureCHROMIUM': { |
| 'decoder_func': 'DoConsumeTextureCHROMIUM', |
| 'type': 'PUT', |
| 'data_type': 'GLbyte', |
| 'count': 64, |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'ClearStencil': { |
| 'type': 'StateSet', |
| 'state': 'ClearStencil', |
| }, |
| 'EnableFeatureCHROMIUM': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'decoder_func': 'DoEnableFeatureCHROMIUM', |
| 'expectation': False, |
| 'cmd_args': 'GLuint bucket_id, GLint* result', |
| 'result': ['GLint'], |
| 'extension': True, |
| 'chromium': True, |
| 'pepper_interface': 'ChromiumEnableFeature', |
| }, |
| 'CompileShader': {'decoder_func': 'DoCompileShader', 'unit_test': False}, |
| 'CompressedTexImage2D': { |
| 'type': 'Manual', |
| 'immediate': True, |
| 'bucket': True, |
| }, |
| 'CompressedTexSubImage2D': { |
| 'type': 'Data', |
| 'bucket': True, |
| 'decoder_func': 'DoCompressedTexSubImage2D', |
| }, |
| 'CopyTexImage2D': { |
| 'decoder_func': 'DoCopyTexImage2D', |
| 'unit_test': False, |
| 'defer_reads': True, |
| }, |
| 'CopyTexSubImage2D': { |
| 'decoder_func': 'DoCopyTexSubImage2D', |
| 'defer_reads': True, |
| }, |
| 'CreateImageCHROMIUM': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLsizei width, GLsizei height, GLenum internalformat', |
| 'result': ['GLuint'], |
| 'client_test': False, |
| 'gen_cmd': False, |
| 'expectation': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'DestroyImageCHROMIUM': { |
| 'type': 'Manual', |
| 'immediate': True, |
| 'client_test': False, |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'GetImageParameterivCHROMIUM': { |
| 'type': 'Manual', |
| 'client_test': False, |
| 'gen_cmd': False, |
| 'expectation': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'CreateProgram': { |
| 'type': 'Create', |
| 'client_test': False, |
| }, |
| 'CreateShader': { |
| 'type': 'Create', |
| 'client_test': False, |
| }, |
| 'BlendColor': { |
| 'type': 'StateSet', |
| 'state': 'BlendColor', |
| }, |
| 'BlendEquation': { |
| 'type': 'StateSetRGBAlpha', |
| 'state': 'BlendEquation', |
| 'valid_args': { |
| '0': 'GL_FUNC_SUBTRACT' |
| }, |
| }, |
| 'BlendEquationSeparate': { |
| 'type': 'StateSet', |
| 'state': 'BlendEquation', |
| 'valid_args': { |
| '0': 'GL_FUNC_SUBTRACT' |
| }, |
| }, |
| 'BlendFunc': { |
| 'type': 'StateSetRGBAlpha', |
| 'state': 'BlendFunc', |
| }, |
| 'BlendFuncSeparate': { |
| 'type': 'StateSet', |
| 'state': 'BlendFunc', |
| }, |
| 'SampleCoverage': {'decoder_func': 'DoSampleCoverage'}, |
| 'StencilFunc': { |
| 'type': 'StateSetFrontBack', |
| 'state': 'StencilFunc', |
| }, |
| 'StencilFuncSeparate': { |
| 'type': 'StateSetFrontBackSeparate', |
| 'state': 'StencilFunc', |
| }, |
| 'StencilOp': { |
| 'type': 'StateSetFrontBack', |
| 'state': 'StencilOp', |
| 'valid_args': { |
| '1': 'GL_INCR' |
| }, |
| }, |
| 'StencilOpSeparate': { |
| 'type': 'StateSetFrontBackSeparate', |
| 'state': 'StencilOp', |
| 'valid_args': { |
| '1': 'GL_INCR' |
| }, |
| }, |
| 'Hint': { |
| 'type': 'StateSetNamedParameter', |
| 'state': 'Hint', |
| }, |
| 'CullFace': {'type': 'StateSet', 'state': 'CullFace'}, |
| 'FrontFace': {'type': 'StateSet', 'state': 'FrontFace'}, |
| 'DepthFunc': {'type': 'StateSet', 'state': 'DepthFunc'}, |
| 'LineWidth': { |
| 'type': 'StateSet', |
| 'state': 'LineWidth', |
| 'valid_args': { |
| '0': '0.5f' |
| }, |
| }, |
| 'PolygonOffset': { |
| 'type': 'StateSet', |
| 'state': 'PolygonOffset', |
| }, |
| 'DeleteBuffers': { |
| 'type': 'DELn', |
| 'gl_test_func': 'glDeleteBuffersARB', |
| 'resource_type': 'Buffer', |
| 'resource_types': 'Buffers', |
| }, |
| 'DeleteFramebuffers': { |
| 'type': 'DELn', |
| 'gl_test_func': 'glDeleteFramebuffersEXT', |
| 'resource_type': 'Framebuffer', |
| 'resource_types': 'Framebuffers', |
| }, |
| 'DeleteProgram': {'type': 'Delete', 'decoder_func': 'DoDeleteProgram'}, |
| 'DeleteRenderbuffers': { |
| 'type': 'DELn', |
| 'gl_test_func': 'glDeleteRenderbuffersEXT', |
| 'resource_type': 'Renderbuffer', |
| 'resource_types': 'Renderbuffers', |
| }, |
| 'DeleteShader': {'type': 'Delete', 'decoder_func': 'DoDeleteShader'}, |
| 'DeleteSharedIdsCHROMIUM': { |
| 'type': 'Custom', |
| 'decoder_func': 'DoDeleteSharedIdsCHROMIUM', |
| 'impl_func': False, |
| 'expectation': False, |
| 'immediate': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'DeleteTextures': { |
| 'type': 'DELn', |
| 'resource_type': 'Texture', |
| 'resource_types': 'Textures', |
| }, |
| 'DepthRangef': { |
| 'decoder_func': 'DoDepthRangef', |
| 'gl_test_func': 'glDepthRange', |
| }, |
| 'DepthMask': { |
| 'type': 'StateSet', |
| 'state': 'DepthMask', |
| 'no_gl': True, |
| 'expectation': False, |
| }, |
| 'DetachShader': {'decoder_func': 'DoDetachShader'}, |
| 'Disable': { |
| 'decoder_func': 'DoDisable', |
| 'impl_func': False, |
| 'client_test': False, |
| }, |
| 'DisableVertexAttribArray': { |
| 'decoder_func': 'DoDisableVertexAttribArray', |
| 'impl_decl': False, |
| }, |
| 'DrawArrays': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count', |
| 'defer_draws': True, |
| }, |
| 'DrawElements': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLenumDrawMode mode, GLsizei count, ' |
| 'GLenumIndexType type, GLuint index_offset', |
| 'client_test': False, |
| 'defer_draws': True, |
| }, |
| 'Enable': { |
| 'decoder_func': 'DoEnable', |
| 'impl_func': False, |
| 'client_test': False, |
| }, |
| 'EnableVertexAttribArray': { |
| 'decoder_func': 'DoEnableVertexAttribArray', |
| 'impl_decl': False, |
| }, |
| 'Finish': { |
| 'impl_func': False, |
| 'client_test': False, |
| 'decoder_func': 'DoFinish', |
| 'defer_reads': True, |
| }, |
| 'Flush': { |
| 'impl_func': False, |
| 'decoder_func': 'DoFlush', |
| }, |
| 'FramebufferRenderbuffer': { |
| 'decoder_func': 'DoFramebufferRenderbuffer', |
| 'gl_test_func': 'glFramebufferRenderbufferEXT', |
| }, |
| 'FramebufferTexture2D': { |
| 'decoder_func': 'DoFramebufferTexture2D', |
| 'gl_test_func': 'glFramebufferTexture2DEXT', |
| }, |
| 'FramebufferTexture2DMultisampleEXT': { |
| 'decoder_func': 'DoFramebufferTexture2DMultisample', |
| 'gl_test_func': 'glFramebufferTexture2DMultisampleEXT', |
| 'expectation': False, |
| 'unit_test': False, |
| 'extension': True, |
| }, |
| 'GenerateMipmap': { |
| 'decoder_func': 'DoGenerateMipmap', |
| 'gl_test_func': 'glGenerateMipmapEXT', |
| }, |
| 'GenBuffers': { |
| 'type': 'GENn', |
| 'gl_test_func': 'glGenBuffersARB', |
| 'resource_type': 'Buffer', |
| 'resource_types': 'Buffers', |
| }, |
| 'GenMailboxCHROMIUM': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLuint bucket_id', |
| 'result': ['SizedResult<GLint>'], |
| 'client_test': False, |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'GenFramebuffers': { |
| 'type': 'GENn', |
| 'gl_test_func': 'glGenFramebuffersEXT', |
| 'resource_type': 'Framebuffer', |
| 'resource_types': 'Framebuffers', |
| }, |
| 'GenRenderbuffers': { |
| 'type': 'GENn', 'gl_test_func': 'glGenRenderbuffersEXT', |
| 'resource_type': 'Renderbuffer', |
| 'resource_types': 'Renderbuffers', |
| }, |
| 'GenTextures': { |
| 'type': 'GENn', |
| 'gl_test_func': 'glGenTextures', |
| 'resource_type': 'Texture', |
| 'resource_types': 'Textures', |
| }, |
| 'GenSharedIdsCHROMIUM': { |
| 'type': 'Custom', |
| 'decoder_func': 'DoGenSharedIdsCHROMIUM', |
| 'impl_func': False, |
| 'expectation': False, |
| 'immediate': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'GetActiveAttrib': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'cmd_args': |
| 'GLidProgram program, GLuint index, uint32 name_bucket_id, ' |
| 'void* result', |
| 'result': [ |
| 'int32 success', |
| 'int32 size', |
| 'uint32 type', |
| ], |
| }, |
| 'GetActiveUniform': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'cmd_args': |
| 'GLidProgram program, GLuint index, uint32 name_bucket_id, ' |
| 'void* result', |
| 'result': [ |
| 'int32 success', |
| 'int32 size', |
| 'uint32 type', |
| ], |
| }, |
| 'GetAttachedShaders': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'cmd_args': 'GLidProgram program, void* result, uint32 result_size', |
| 'result': ['SizedResult<GLuint>'], |
| }, |
| 'GetAttribLocation': { |
| 'type': 'HandWritten', |
| 'immediate': True, |
| 'bucket': True, |
| 'needs_size': True, |
| 'cmd_args': |
| 'GLidProgram program, const char* name, NonImmediate GLint* location', |
| 'result': ['GLint'], |
| }, |
| 'GetBooleanv': { |
| 'type': 'GETn', |
| 'result': ['SizedResult<GLboolean>'], |
| 'decoder_func': 'DoGetBooleanv', |
| 'gl_test_func': 'glGetBooleanv', |
| }, |
| 'GetBufferParameteriv': { |
| 'type': 'GETn', |
| 'result': ['SizedResult<GLint>'], |
| 'decoder_func': 'DoGetBufferParameteriv', |
| 'expectation': False, |
| 'shadowed': True, |
| }, |
| 'GetError': { |
| 'type': 'Is', |
| 'decoder_func': 'GetErrorState()->GetGLError', |
| 'impl_func': False, |
| 'result': ['GLenum'], |
| 'client_test': False, |
| }, |
| 'GetFloatv': { |
| 'type': 'GETn', |
| 'result': ['SizedResult<GLfloat>'], |
| 'decoder_func': 'DoGetFloatv', |
| 'gl_test_func': 'glGetFloatv', |
| }, |
| 'GetFramebufferAttachmentParameteriv': { |
| 'type': 'GETn', |
| 'decoder_func': 'DoGetFramebufferAttachmentParameteriv', |
| 'gl_test_func': 'glGetFramebufferAttachmentParameterivEXT', |
| 'result': ['SizedResult<GLint>'], |
| }, |
| 'GetIntegerv': { |
| 'type': 'GETn', |
| 'result': ['SizedResult<GLint>'], |
| 'decoder_func': 'DoGetIntegerv', |
| 'client_test': False, |
| }, |
| 'GetMaxValueInBufferCHROMIUM': { |
| 'type': 'Is', |
| 'decoder_func': 'DoGetMaxValueInBufferCHROMIUM', |
| 'result': ['GLuint'], |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| 'impl_func': False, |
| }, |
| 'GetMultipleIntegervCHROMIUM': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'expectation': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'GetProgramiv': { |
| 'type': 'GETn', |
| 'decoder_func': 'DoGetProgramiv', |
| 'result': ['SizedResult<GLint>'], |
| 'expectation': False, |
| }, |
| 'GetProgramInfoCHROMIUM': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'expectation': False, |
| 'impl_func': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| 'cmd_args': 'GLidProgram program, uint32 bucket_id', |
| 'result': [ |
| 'uint32 link_status', |
| 'uint32 num_attribs', |
| 'uint32 num_uniforms', |
| ], |
| }, |
| 'GetProgramInfoLog': { |
| 'type': 'STRn', |
| 'expectation': False, |
| }, |
| 'GetRenderbufferParameteriv': { |
| 'type': 'GETn', |
| 'decoder_func': 'DoGetRenderbufferParameteriv', |
| 'gl_test_func': 'glGetRenderbufferParameterivEXT', |
| 'result': ['SizedResult<GLint>'], |
| }, |
| 'GetShaderiv': { |
| 'type': 'GETn', |
| 'decoder_func': 'DoGetShaderiv', |
| 'result': ['SizedResult<GLint>'], |
| }, |
| 'GetShaderInfoLog': { |
| 'type': 'STRn', |
| 'get_len_func': 'glGetShaderiv', |
| 'get_len_enum': 'GL_INFO_LOG_LENGTH', |
| 'unit_test': False, |
| }, |
| 'GetShaderPrecisionFormat': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'cmd_args': |
| 'GLenumShaderType shadertype, GLenumShaderPrecision precisiontype, ' |
| 'void* result', |
| 'result': [ |
| 'int32 success', |
| 'int32 min_range', |
| 'int32 max_range', |
| 'int32 precision', |
| ], |
| }, |
| 'GetShaderSource': { |
| 'type': 'STRn', |
| 'get_len_func': 'DoGetShaderiv', |
| 'get_len_enum': 'GL_SHADER_SOURCE_LENGTH', |
| 'unit_test': False, |
| 'client_test': False, |
| }, |
| 'GetString': { |
| 'type': 'Custom', |
| 'client_test': False, |
| 'cmd_args': 'GLenumStringType name, uint32 bucket_id', |
| }, |
| 'GetTexParameterfv': {'type': 'GETn', 'result': ['SizedResult<GLfloat>']}, |
| 'GetTexParameteriv': {'type': 'GETn', 'result': ['SizedResult<GLint>']}, |
| 'GetTranslatedShaderSourceANGLE': { |
| 'type': 'STRn', |
| 'get_len_func': 'DoGetShaderiv', |
| 'get_len_enum': 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE', |
| 'unit_test': False, |
| 'extension': True, |
| }, |
| 'GetUniformfv': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'result': ['SizedResult<GLfloat>'], |
| }, |
| 'GetUniformiv': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'result': ['SizedResult<GLint>'], |
| }, |
| 'GetUniformLocation': { |
| 'type': 'HandWritten', |
| 'immediate': True, |
| 'bucket': True, |
| 'needs_size': True, |
| 'cmd_args': |
| 'GLidProgram program, const char* name, NonImmediate GLint* location', |
| 'result': ['GLint'], |
| }, |
| 'GetVertexAttribfv': { |
| 'type': 'GETn', |
| 'result': ['SizedResult<GLfloat>'], |
| 'impl_decl': False, |
| 'decoder_func': 'DoGetVertexAttribfv', |
| 'expectation': False, |
| 'client_test': False, |
| }, |
| 'GetVertexAttribiv': { |
| 'type': 'GETn', |
| 'result': ['SizedResult<GLint>'], |
| 'impl_decl': False, |
| 'decoder_func': 'DoGetVertexAttribiv', |
| 'expectation': False, |
| 'client_test': False, |
| }, |
| 'GetVertexAttribPointerv': { |
| 'type': 'Custom', |
| 'immediate': False, |
| 'result': ['SizedResult<GLuint>'], |
| 'client_test': False, |
| }, |
| 'IsBuffer': { |
| 'type': 'Is', |
| 'decoder_func': 'DoIsBuffer', |
| 'expectation': False, |
| }, |
| 'IsEnabled': { |
| 'type': 'Is', |
| 'decoder_func': 'DoIsEnabled', |
| 'impl_func': False, |
| 'expectation': False, |
| }, |
| 'IsFramebuffer': { |
| 'type': 'Is', |
| 'decoder_func': 'DoIsFramebuffer', |
| 'expectation': False, |
| }, |
| 'IsProgram': { |
| 'type': 'Is', |
| 'decoder_func': 'DoIsProgram', |
| 'expectation': False, |
| }, |
| 'IsRenderbuffer': { |
| 'type': 'Is', |
| 'decoder_func': 'DoIsRenderbuffer', |
| 'expectation': False, |
| }, |
| 'IsShader': { |
| 'type': 'Is', |
| 'decoder_func': 'DoIsShader', |
| 'expectation': False, |
| }, |
| 'IsTexture': { |
| 'type': 'Is', |
| 'decoder_func': 'DoIsTexture', |
| 'expectation': False, |
| }, |
| 'LinkProgram': { |
| 'decoder_func': 'DoLinkProgram', |
| 'impl_func': False, |
| }, |
| 'MapBufferCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'MapBufferSubDataCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| 'pepper_interface': 'ChromiumMapSub', |
| }, |
| 'MapImageCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'MapTexSubImage2DCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| 'pepper_interface': 'ChromiumMapSub', |
| }, |
| 'PixelStorei': {'type': 'Manual'}, |
| 'PostSubBufferCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'ProduceTextureCHROMIUM': { |
| 'decoder_func': 'DoProduceTextureCHROMIUM', |
| 'type': 'PUT', |
| 'data_type': 'GLbyte', |
| 'count': 64, |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'RenderbufferStorage': { |
| 'decoder_func': 'DoRenderbufferStorage', |
| 'gl_test_func': 'glRenderbufferStorageEXT', |
| 'expectation': False, |
| }, |
| 'RenderbufferStorageMultisampleEXT': { |
| 'decoder_func': 'DoRenderbufferStorageMultisample', |
| 'gl_test_func': 'glRenderbufferStorageMultisampleEXT', |
| 'expectation': False, |
| 'unit_test': False, |
| 'extension': True, |
| 'pepper_interface': 'FramebufferMultisample', |
| }, |
| 'ReadPixels': { |
| 'cmd_comment': |
| '// ReadPixels has the result separated from the pixel buffer so that\n' |
| '// it is easier to specify the result going to some specific place\n' |
| '// that exactly fits the rectangle of pixels.\n', |
| 'type': 'Custom', |
| 'immediate': False, |
| 'impl_func': False, |
| 'client_test': False, |
| 'cmd_args': |
| 'GLint x, GLint y, GLsizei width, GLsizei height, ' |
| 'GLenumReadPixelFormat format, GLenumReadPixelType type, ' |
| 'uint32 pixels_shm_id, uint32 pixels_shm_offset, ' |
| 'uint32 result_shm_id, uint32 result_shm_offset, ' |
| 'GLboolean async', |
| 'result': ['uint32'], |
| 'defer_reads': True, |
| }, |
| 'RegisterSharedIdsCHROMIUM': { |
| 'type': 'Custom', |
| 'decoder_func': 'DoRegisterSharedIdsCHROMIUM', |
| 'impl_func': False, |
| 'expectation': False, |
| 'immediate': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'ReleaseShaderCompiler': { |
| 'decoder_func': 'DoReleaseShaderCompiler', |
| 'unit_test': False, |
| }, |
| 'ShaderBinary': { |
| 'type': 'Custom', |
| 'client_test': False, |
| }, |
| 'ShaderSource': { |
| 'type': 'Manual', |
| 'immediate': True, |
| 'bucket': True, |
| 'needs_size': True, |
| 'client_test': False, |
| 'cmd_args': |
| 'GLuint shader, const char* data', |
| }, |
| 'StencilMask': { |
| 'type': 'StateSetFrontBack', |
| 'state': 'StencilMask', |
| 'no_gl': True, |
| 'expectation': False, |
| }, |
| 'StencilMaskSeparate': { |
| 'type': 'StateSetFrontBackSeparate', |
| 'state': 'StencilMask', |
| 'no_gl': True, |
| 'expectation': False, |
| }, |
| 'SwapBuffers': { |
| 'impl_func': False, |
| 'decoder_func': 'DoSwapBuffers', |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension': True, |
| }, |
| 'TexImage2D': { |
| 'type': 'Manual', |
| 'immediate': True, |
| 'client_test': False, |
| }, |
| 'TexParameterf': { |
| 'decoder_func': 'DoTexParameterf', |
| 'gl_test_func': 'glTexParameteri', |
| 'valid_args': { |
| '2': 'GL_NEAREST' |
| }, |
| }, |
| 'TexParameteri': { |
| 'decoder_func': 'DoTexParameteri', |
| 'valid_args': { |
| '2': 'GL_NEAREST' |
| }, |
| }, |
| 'TexParameterfv': { |
| 'type': 'PUT', |
| 'data_type': 'GLfloat', |
| 'data_value': 'GL_NEAREST', |
| 'count': 1, |
| 'decoder_func': 'DoTexParameterfv', |
| 'gl_test_func': 'glTexParameteri', |
| 'first_element_only': True, |
| }, |
| 'TexParameteriv': { |
| 'type': 'PUT', |
| 'data_type': 'GLint', |
| 'data_value': 'GL_NEAREST', |
| 'count': 1, |
| 'decoder_func': 'DoTexParameteriv', |
| 'gl_test_func': 'glTexParameteri', |
| 'first_element_only': True, |
| }, |
| 'TexSubImage2D': { |
| 'type': 'Manual', |
| 'immediate': True, |
| 'client_test': False, |
| 'cmd_args': 'GLenumTextureTarget target, GLint level, ' |
| 'GLint xoffset, GLint yoffset, ' |
| 'GLsizei width, GLsizei height, ' |
| 'GLenumTextureFormat format, GLenumPixelType type, ' |
| 'const void* pixels, GLboolean internal' |
| }, |
| 'Uniform1f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 1}, |
| 'Uniform1fv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLfloat', |
| 'count': 1, |
| 'decoder_func': 'DoUniform1fv', |
| }, |
| 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False}, |
| 'Uniform1iv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLint', |
| 'count': 1, |
| 'decoder_func': 'DoUniform1iv', |
| 'unit_test': False, |
| }, |
| 'Uniform2i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 2}, |
| 'Uniform2f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 2}, |
| 'Uniform2fv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLfloat', |
| 'count': 2, |
| 'decoder_func': 'DoUniform2fv', |
| }, |
| 'Uniform2iv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLint', |
| 'count': 2, |
| 'decoder_func': 'DoUniform2iv', |
| }, |
| 'Uniform3i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 3}, |
| 'Uniform3f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 3}, |
| 'Uniform3fv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLfloat', |
| 'count': 3, |
| 'decoder_func': 'DoUniform3fv', |
| }, |
| 'Uniform3iv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLint', |
| 'count': 3, |
| 'decoder_func': 'DoUniform3iv', |
| }, |
| 'Uniform4i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 4}, |
| 'Uniform4f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 4}, |
| 'Uniform4fv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLfloat', |
| 'count': 4, |
| 'decoder_func': 'DoUniform4fv', |
| }, |
| 'Uniform4iv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLint', |
| 'count': 4, |
| 'decoder_func': 'DoUniform4iv', |
| }, |
| 'UniformMatrix2fv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLfloat', |
| 'count': 4, |
| 'decoder_func': 'DoUniformMatrix2fv', |
| }, |
| 'UniformMatrix3fv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLfloat', |
| 'count': 9, |
| 'decoder_func': 'DoUniformMatrix3fv', |
| }, |
| 'UniformMatrix4fv': { |
| 'type': 'PUTn', |
| 'data_type': 'GLfloat', |
| 'count': 16, |
| 'decoder_func': 'DoUniformMatrix4fv', |
| }, |
| 'UnmapBufferCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'UnmapBufferSubDataCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| 'pepper_interface': 'ChromiumMapSub', |
| }, |
| 'UnmapImageCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'UnmapTexSubImage2DCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| 'pepper_interface': 'ChromiumMapSub', |
| }, |
| 'UseProgram': { |
| 'decoder_func': 'DoUseProgram', |
| 'impl_func': False, |
| 'unit_test': False, |
| }, |
| 'ValidateProgram': {'decoder_func': 'DoValidateProgram'}, |
| 'VertexAttrib1f': {'decoder_func': 'DoVertexAttrib1f'}, |
| 'VertexAttrib1fv': { |
| 'type': 'PUT', |
| 'data_type': 'GLfloat', |
| 'count': 1, |
| 'decoder_func': 'DoVertexAttrib1fv', |
| }, |
| 'VertexAttrib2f': {'decoder_func': 'DoVertexAttrib2f'}, |
| 'VertexAttrib2fv': { |
| 'type': 'PUT', |
| 'data_type': 'GLfloat', |
| 'count': 2, |
| 'decoder_func': 'DoVertexAttrib2fv', |
| }, |
| 'VertexAttrib3f': {'decoder_func': 'DoVertexAttrib3f'}, |
| 'VertexAttrib3fv': { |
| 'type': 'PUT', |
| 'data_type': 'GLfloat', |
| 'count': 3, |
| 'decoder_func': 'DoVertexAttrib3fv', |
| }, |
| 'VertexAttrib4f': {'decoder_func': 'DoVertexAttrib4f'}, |
| 'VertexAttrib4fv': { |
| 'type': 'PUT', |
| 'data_type': 'GLfloat', |
| 'count': 4, |
| 'decoder_func': 'DoVertexAttrib4fv', |
| }, |
| 'VertexAttribPointer': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLuint indx, GLintVertexAttribSize size, ' |
| 'GLenumVertexAttribType type, GLboolean normalized, ' |
| 'GLsizei stride, GLuint offset', |
| 'client_test': False, |
| }, |
| 'Scissor': { |
| 'type': 'StateSet', |
| 'state': 'Scissor', |
| }, |
| 'Viewport': { |
| 'decoder_func': 'DoViewport', |
| }, |
| 'ResizeCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'GetRequestableExtensionsCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'immediate': False, |
| 'cmd_args': 'uint32 bucket_id', |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'RequestExtensionCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'immediate': False, |
| 'client_test': False, |
| 'cmd_args': 'uint32 bucket_id', |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'RateLimitOffscreenContextCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'CreateStreamTextureCHROMIUM': { |
| 'type': 'Custom', |
| 'cmd_args': 'GLuint client_id, void* result', |
| 'result': ['GLuint'], |
| 'immediate': False, |
| 'impl_func': False, |
| 'expectation': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'DestroyStreamTextureCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'expectation': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'TexImageIOSurface2DCHROMIUM': { |
| 'decoder_func': 'DoTexImageIOSurface2DCHROMIUM', |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'CopyTextureCHROMIUM': { |
| 'decoder_func': 'DoCopyTextureCHROMIUM', |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'TexStorage2DEXT': { |
| 'unit_test': False, |
| 'extension': True, |
| 'decoder_func': 'DoTexStorage2DEXT', |
| }, |
| 'DrawArraysInstancedANGLE': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count, ' |
| 'GLsizei primcount', |
| 'extension': True, |
| 'unit_test': False, |
| 'pepper_interface': 'InstancedArrays', |
| 'defer_draws': True, |
| }, |
| 'DrawBuffersEXT': { |
| 'type': 'PUTn', |
| 'decoder_func': 'DoDrawBuffersEXT', |
| 'data_type': 'GLenum', |
| 'count': 1, |
| 'client_test': False, |
| 'unit_test': False, |
| 'extension': True, |
| }, |
| 'DrawElementsInstancedANGLE': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLenumDrawMode mode, GLsizei count, ' |
| 'GLenumIndexType type, GLuint index_offset, GLsizei primcount', |
| 'extension': True, |
| 'unit_test': False, |
| 'client_test': False, |
| 'pepper_interface': 'InstancedArrays', |
| 'defer_draws': True, |
| }, |
| 'VertexAttribDivisorANGLE': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLuint index, GLuint divisor', |
| 'extension': True, |
| 'unit_test': False, |
| 'pepper_interface': 'InstancedArrays', |
| }, |
| 'GenQueriesEXT': { |
| 'type': 'GENn', |
| 'gl_test_func': 'glGenQueriesARB', |
| 'resource_type': 'Query', |
| 'resource_types': 'Queries', |
| 'unit_test': False, |
| 'pepper_interface': 'Query', |
| }, |
| 'DeleteQueriesEXT': { |
| 'type': 'DELn', |
| 'gl_test_func': 'glDeleteQueriesARB', |
| 'resource_type': 'Query', |
| 'resource_types': 'Queries', |
| 'unit_test': False, |
| 'pepper_interface': 'Query', |
| }, |
| 'IsQueryEXT': { |
| 'gen_cmd': False, |
| 'client_test': False, |
| 'pepper_interface': 'Query', |
| }, |
| 'BeginQueryEXT': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLenumQueryTarget target, GLidQuery id, void* sync_data', |
| 'immediate': False, |
| 'gl_test_func': 'glBeginQuery', |
| 'pepper_interface': 'Query', |
| }, |
| 'EndQueryEXT': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLenumQueryTarget target, GLuint submit_count', |
| 'gl_test_func': 'glEndnQuery', |
| 'client_test': False, |
| 'pepper_interface': 'Query', |
| }, |
| 'GetQueryivEXT': { |
| 'gen_cmd': False, |
| 'client_test': False, |
| 'gl_test_func': 'glGetQueryiv', |
| 'pepper_interface': 'Query', |
| }, |
| 'GetQueryObjectuivEXT': { |
| 'gen_cmd': False, |
| 'client_test': False, |
| 'gl_test_func': 'glGetQueryObjectuiv', |
| 'pepper_interface': 'Query', |
| }, |
| 'BindUniformLocationCHROMIUM': { |
| 'type': 'GLchar', |
| 'bucket': True, |
| 'needs_size': True, |
| 'gl_test_func': 'DoBindUniformLocationCHROMIUM', |
| }, |
| 'InsertEventMarkerEXT': { |
| 'type': 'GLcharN', |
| 'decoder_func': 'DoInsertEventMarkerEXT', |
| 'expectation': False, |
| }, |
| 'PushGroupMarkerEXT': { |
| 'type': 'GLcharN', |
| 'decoder_func': 'DoPushGroupMarkerEXT', |
| 'expectation': False, |
| }, |
| 'PopGroupMarkerEXT': { |
| 'decoder_func': 'DoPopGroupMarkerEXT', |
| 'expectation': False, |
| 'impl_func': False, |
| }, |
| |
| 'GenVertexArraysOES': { |
| 'type': 'GENn', |
| 'gl_test_func': 'glGenVertexArraysOES', |
| 'resource_type': 'VertexArray', |
| 'resource_types': 'VertexArrays', |
| 'unit_test': False, |
| }, |
| 'BindVertexArrayOES': { |
| 'type': 'Bind', |
| 'gl_test_func': 'glBindVertexArrayOES', |
| 'decoder_func': 'DoBindVertexArrayOES', |
| 'gen_func': 'GenVertexArraysOES', |
| 'unit_test': False, |
| 'client_test': False, |
| }, |
| 'DeleteVertexArraysOES': { |
| 'type': 'DELn', |
| 'gl_test_func': 'glDeleteVertexArraysOES', |
| 'resource_type': 'VertexArray', |
| 'resource_types': 'VertexArrays', |
| 'unit_test': False, |
| }, |
| 'IsVertexArrayOES': { |
| 'type': 'Is', |
| 'gl_test_func': 'glIsVertexArrayOES', |
| 'decoder_func': 'DoIsVertexArrayOES', |
| 'expectation': False, |
| 'unit_test': False, |
| }, |
| 'BindTexImage2DCHROMIUM': { |
| 'decoder_func': 'DoBindTexImage2DCHROMIUM', |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'ReleaseTexImage2DCHROMIUM': { |
| 'decoder_func': 'DoReleaseTexImage2DCHROMIUM', |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'ShallowFinishCHROMIUM': { |
| 'impl_func': False, |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'ShallowFlushCHROMIUM': { |
| 'impl_func': False, |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'TraceBeginCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'immediate': False, |
| 'client_test': False, |
| 'cmd_args': 'GLuint bucket_id', |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'TraceEndCHROMIUM': { |
| 'impl_func': False, |
| 'immediate': False, |
| 'client_test': False, |
| 'decoder_func': 'DoTraceEndCHROMIUM', |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'AsyncTexImage2DCHROMIUM': { |
| 'type': 'Manual', |
| 'immediate': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'AsyncTexSubImage2DCHROMIUM': { |
| 'type': 'Manual', |
| 'immediate': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'WaitAsyncTexImage2DCHROMIUM': { |
| 'type': 'Manual', |
| 'immediate': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'DiscardFramebufferEXT': { |
| 'type': 'PUTn', |
| 'count': 1, |
| 'data_type': 'GLenum', |
| 'cmd_args': 'GLenum target, GLsizei count, ' |
| 'const GLenum* attachments', |
| 'decoder_func': 'DoDiscardFramebufferEXT', |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension': True, |
| }, |
| 'LoseContextCHROMIUM': { |
| 'type': 'Manual', |
| 'impl_func': True, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'InsertSyncPointCHROMIUM': { |
| 'type': 'HandWritten', |
| 'impl_func': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'WaitSyncPointCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': True, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| } |
| |
| |
| def Grouper(n, iterable, fillvalue=None): |
| """Collect data into fixed-length chunks or blocks""" |
| args = [iter(iterable)] * n |
| return itertools.izip_longest(fillvalue=fillvalue, *args) |
| |
| |
| def SplitWords(input_string): |
| """Transforms a input_string into a list of lower-case components. |
| |
| Args: |
| input_string: the input string. |
| |
| Returns: |
| a list of lower-case words. |
| """ |
| if input_string.find('_') > -1: |
| # 'some_TEXT_' -> 'some text' |
| return input_string.replace('_', ' ').strip().lower().split() |
| else: |
| if re.search('[A-Z]', input_string) and re.search('[a-z]', input_string): |
| # mixed case. |
| # look for capitalization to cut input_strings |
| # 'SomeText' -> 'Some Text' |
| input_string = re.sub('([A-Z])', r' \1', input_string).strip() |
| # 'Vector3' -> 'Vector 3' |
| input_string = re.sub('([^0-9])([0-9])', r'\1 \2', input_string) |
| return input_string.lower().split() |
| |
| |
| def Lower(words): |
| """Makes a lower-case identifier from words. |
| |
| Args: |
| words: a list of lower-case words. |
| |
| Returns: |
| the lower-case identifier. |
| """ |
| return '_'.join(words) |
| |
| |
| def ToUnderscore(input_string): |
| """converts CamelCase to camel_case.""" |
| words = SplitWords(input_string) |
| return Lower(words) |
| |
| |
| class CWriter(object): |
| """Writes to a file formatting it for Google's style guidelines.""" |
| |
| def __init__(self, filename): |
| self.filename = filename |
| self.file_num = 0 |
| self.content = [] |
| |
| def SetFileNum(self, num): |
| """Used to help write number files and tests.""" |
| self.file_num = num |
| |
| def Write(self, string): |
| """Writes a string to a file spliting if it's > 80 characters.""" |
| lines = string.splitlines() |
| num_lines = len(lines) |
| for ii in range(0, num_lines): |
| self.__WriteLine(lines[ii], ii < (num_lines - 1) or string[-1] == '\n') |
| |
| def __FindSplit(self, string): |
| """Finds a place to split a string.""" |
| splitter = string.find('=') |
| if splitter >= 1 and not string[splitter + 1] == '=' and splitter < 80: |
| return splitter |
| # parts = string.split('(') |
| parts = re.split("(?<=[^\"])\((?!\")", string) |
| fptr = re.compile('\*\w*\)') |
| if len(parts) > 1: |
| splitter = len(parts[0]) |
| for ii in range(1, len(parts)): |
| # Don't split on the dot in "if (.condition)". |
| if (not parts[ii - 1][-3:] == "if " and |
| # Don't split "(.)" or "(.*fptr)". |
| (len(parts[ii]) > 0 and |
| not parts[ii][0] == ")" and not fptr.match(parts[ii])) |
| and splitter < 80): |
| return splitter |
| splitter += len(parts[ii]) + 1 |
| done = False |
| end = len(string) |
| last_splitter = -1 |
| while not done: |
| splitter = string[0:end].rfind(',') |
| if splitter < 0 or (splitter > 0 and string[splitter - 1] == '"'): |
| return last_splitter |
| elif splitter >= 80: |
| end = splitter |
| else: |
| return splitter |
| |
| def __WriteLine(self, line, ends_with_eol): |
| """Given a signle line, writes it to a file, splitting if it's > 80 chars""" |
| if len(line) >= 80: |
| i = self.__FindSplit(line) |
| if i > 0: |
| line1 = line[0:i + 1] |
| if line1[-1] == ' ': |
| line1 = line1[:-1] |
| lineend = '' |
| if line1[0] == '#': |
| lineend = ' \\' |
| nolint = '' |
| if len(line1) > 80: |
| nolint = ' // NOLINT' |
| self.__AddLine(line1 + nolint + lineend + '\n') |
| match = re.match("( +)", line1) |
| indent = "" |
| if match: |
| indent = match.group(1) |
| splitter = line[i] |
| if not splitter == ',': |
| indent = " " + indent |
| self.__WriteLine(indent + line[i + 1:].lstrip(), True) |
| return |
| nolint = '' |
| if len(line) > 80: |
| nolint = ' // NOLINT' |
| self.__AddLine(line + nolint) |
| if ends_with_eol: |
| self.__AddLine('\n') |
| |
| def __AddLine(self, line): |
| self.content.append(line) |
| |
| def Close(self): |
| """Close the file.""" |
| content = "".join(self.content) |
| write_file = True |
| if os.path.exists(self.filename): |
| old_file = open(self.filename, "rb"); |
| old_content = old_file.read() |
| old_file.close(); |
| if content == old_content: |
| write_file = False |
| if write_file: |
| file = open(self.filename, "wb") |
| file.write(content) |
| file.close() |
| |
| |
| class CHeaderWriter(CWriter): |
| """Writes a C Header file.""" |
| |
| _non_alnum_re = re.compile(r'[^a-zA-Z0-9]') |
| |
| def __init__(self, filename, file_comment = None): |
| CWriter.__init__(self, filename) |
| |
| base = os.path.abspath(filename) |
| while os.path.basename(base) != 'src': |
| new_base = os.path.dirname(base) |
| assert new_base != base # Prevent infinite loop. |
| base = new_base |
| |
| hpath = os.path.relpath(filename, base) |
| self.guard = self._non_alnum_re.sub('_', hpath).upper() + '_' |
| |
| self.Write(_LICENSE) |
| self.Write(_DO_NOT_EDIT_WARNING) |
| if not file_comment == None: |
| self.Write(file_comment) |
| self.Write("#ifndef %s\n" % self.guard) |
| self.Write("#define %s\n\n" % self.guard) |
| |
| def Close(self): |
| self.Write("#endif // %s\n\n" % self.guard) |
| CWriter.Close(self) |
| |
| class TypeHandler(object): |
| """This class emits code for a particular type of function.""" |
| |
| _remove_expected_call_re = re.compile(r' EXPECT_CALL.*?;\n', re.S) |
| |
| def __init__(self): |
| pass |
| |
| def InitFunction(self, func): |
| """Add or adjust anything type specific for this function.""" |
| if func.GetInfo('needs_size') and not func.name.endswith('Bucket'): |
| func.AddCmdArg(DataSizeArgument('data_size')) |
| |
| def AddImmediateFunction(self, generator, func): |
| """Adds an immediate version of a function.""" |
| # Generate an immediate command if there is only 1 pointer arg. |
| immediate = func.GetInfo('immediate') # can be True, False or None |
| if immediate == True or immediate == None: |
| if func.num_pointer_args == 1 or immediate: |
| generator.AddFunction(ImmediateFunction(func)) |
| |
| def AddBucketFunction(self, generator, func): |
| """Adds a bucket version of a function.""" |
| # Generate an immediate command if there is only 1 pointer arg. |
| bucket = func.GetInfo('bucket') # can be True, False or None |
| if bucket: |
| generator.AddFunction(BucketFunction(func)) |
| |
| def WriteStruct(self, func, file): |
| """Writes a structure that matches the arguments to a function.""" |
| comment = func.GetInfo('cmd_comment') |
| if not comment == None: |
| file.Write(comment) |
| file.Write("struct %s {\n" % func.name) |
| file.Write(" typedef %s ValueType;\n" % func.name) |
| file.Write(" static const CommandId kCmdId = k%s;\n" % func.name) |
| func.WriteCmdArgFlag(file) |
| file.Write("\n") |
| result = func.GetInfo('result') |
| if not result == None: |
| if len(result) == 1: |
| file.Write(" typedef %s Result;\n\n" % result[0]) |
| else: |
| file.Write(" struct Result {\n") |
| for line in result: |
| file.Write(" %s;\n" % line) |
| file.Write(" };\n\n") |
| |
| func.WriteCmdComputeSize(file) |
| func.WriteCmdSetHeader(file) |
| func.WriteCmdInit(file) |
| func.WriteCmdSet(file) |
| |
| file.Write(" gpu::CommandHeader header;\n") |
| args = func.GetCmdArgs() |
| for arg in args: |
| file.Write(" %s %s;\n" % (arg.cmd_type, arg.name)) |
| file.Write("};\n") |
| file.Write("\n") |
| |
| size = len(args) * _SIZE_OF_UINT32 + _SIZE_OF_COMMAND_HEADER |
| file.Write("COMPILE_ASSERT(sizeof(%s) == %d,\n" % (func.name, size)) |
| file.Write(" Sizeof_%s_is_not_%d);\n" % (func.name, size)) |
| file.Write("COMPILE_ASSERT(offsetof(%s, header) == 0,\n" % func.name) |
| file.Write(" OffsetOf_%s_header_not_0);\n" % func.name) |
| offset = _SIZE_OF_COMMAND_HEADER |
| for arg in args: |
| file.Write("COMPILE_ASSERT(offsetof(%s, %s) == %d,\n" % |
| (func.name, arg.name, offset)) |
| file.Write(" OffsetOf_%s_%s_not_%d);\n" % |
| (func.name, arg.name, offset)) |
| offset += _SIZE_OF_UINT32 |
| if not result == None and len(result) > 1: |
| offset = 0; |
| for line in result: |
| parts = line.split() |
| name = parts[-1] |
| check = """ |
| COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, |
| OffsetOf_%(cmd_name)s_Result_%(field_name)s_not_%(offset)d); |
| """ |
| file.Write((check.strip() + "\n") % { |
| 'cmd_name': func.name, |
| 'field_name': name, |
| 'offset': offset, |
| }) |
| offset += _SIZE_OF_UINT32 |
| file.Write("\n") |
| |
| def WriteHandlerImplementation(self, func, file): |
| """Writes the handler implementation for this command.""" |
| file.Write(" %s(%s);\n" % |
| (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
| |
| def WriteCmdSizeTest(self, func, file): |
| """Writes the size test for a command.""" |
| file.Write(" EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n") |
| |
| def WriteFormatTest(self, func, file): |
| """Writes a format test for a command.""" |
| file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name) |
| file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" % |
| (func.name, func.name)) |
| file.Write(" void* next_cmd = cmd.Set(\n") |
| file.Write(" &cmd") |
| args = func.GetCmdArgs() |
| for value, arg in enumerate(args): |
| file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11)) |
| file.Write(");\n") |
| file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" % |
| func.name) |
| file.Write(" cmd.header.command);\n") |
| func.type_handler.WriteCmdSizeTest(func, file) |
| for value, arg in enumerate(args): |
| file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" % |
| (arg.type, value + 11, arg.name)) |
| file.Write(" CheckBytesWrittenMatchesExpectedSize(\n") |
| file.Write(" next_cmd, sizeof(cmd));\n") |
| file.Write("}\n") |
| file.Write("\n") |
| |
| def WriteImmediateFormatTest(self, func, file): |
| """Writes a format test for an immediate version of a command.""" |
| pass |
| |
| def WriteBucketFormatTest(self, func, file): |
| """Writes a format test for a bucket version of a command.""" |
| pass |
| |
| def WriteGetDataSizeCode(self, func, file): |
| """Writes the code to set data_size used in validation""" |
| pass |
| |
| def WriteImmediateCmdSizeTest(self, func, file): |
| """Writes a size test for an immediate version of a command.""" |
| file.Write(" // TODO(gman): Compute correct size.\n") |
| file.Write(" EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n") |
| |
| def WriteImmediateHandlerImplementation (self, func, file): |
| """Writes the handler impl for the immediate version of a command.""" |
| file.Write(" %s(%s);\n" % |
| (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
| |
| def WriteBucketHandlerImplementation (self, func, file): |
| """Writes the handler impl for the bucket version of a command.""" |
| file.Write(" %s(%s);\n" % |
| (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
| |
| def WriteServiceImplementation(self, func, file): |
| """Writes the service implementation for a command.""" |
| file.Write( |
| "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) |
| file.Write( |
| " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % |
| func.name) |
| self.WriteHandlerDeferReadWrite(func, file); |
| if len(func.GetOriginalArgs()) > 0: |
| last_arg = func.GetLastOriginalArg() |
| all_but_last_arg = func.GetOriginalArgs()[:-1] |
| for arg in all_but_last_arg: |
| arg.WriteGetCode(file) |
| self.WriteGetDataSizeCode(func, file) |
| last_arg.WriteGetCode(file) |
| func.WriteHandlerValidation(file) |
| func.WriteHandlerImplementation(file) |
| file.Write(" return error::kNoError;\n") |
| file.Write("}\n") |
| file.Write("\n") |
| |
| def WriteImmediateServiceImplementation(self, func, file): |
| """Writes the service implementation for an immediate version of command.""" |
| file.Write( |
| "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) |
| file.Write( |
| " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % |
| func.name) |
| self.WriteHandlerDeferReadWrite(func, file); |
| last_arg = func.GetLastOriginalArg() |
| all_but_last_arg = func.GetOriginalArgs()[:-1] |
| for arg in all_but_last_arg: |
| arg.WriteGetCode(file) |
| self.WriteGetDataSizeCode(func, file) |
| last_arg.WriteGetCode(file) |
| func.WriteHandlerValidation(file) |
| func.WriteHandlerImplementation(file) |
| file.Write(" return error::kNoError;\n") |
| file.Write("}\n") |
| file.Write("\n") |
| |
| def WriteBucketServiceImplementation(self, func, file): |
| """Writes the service implementation for a bucket version of command.""" |
| file.Write( |
| "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) |
| file.Write( |
| " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % |
| func.name) |
| self.WriteHandlerDeferReadWrite(func, file); |
| last_arg = func.GetLastOriginalArg() |
| all_but_last_arg = func.GetOriginalArgs()[:-1] |
| for arg in all_but_last_arg: |
| arg.WriteGetCode(file) |
| self.WriteGetDataSizeCode(func, file) |
| last_arg.WriteGetCode(file) |
| func.WriteHandlerValidation(file) |
| func.WriteHandlerImplementation(file) |
| file.Write(" return error::kNoError;\n") |
| file.Write("}\n") |
| file.Write("\n") |
| |
| def WriteHandlerDeferReadWrite(self, func, file): |
| """Writes the code to handle deferring reads or writes.""" |
| defer_reads = func.GetInfo('defer_reads') |
| defer_draws = func.GetInfo('defer_draws') |
| conditions = [] |
| if defer_draws: |
| conditions.append('ShouldDeferDraws()'); |
| if defer_reads: |
| conditions.append('ShouldDeferReads()'); |
| if not conditions: |
| return |
| file.Write(" if (%s)\n" % ' || '.join(conditions)) |
| file.Write(" return error::kDeferCommandUntilLater;\n") |
| |
| def WriteValidUnitTest(self, func, file, test, extra = {}): |
| """Writes a valid unit test.""" |
| if func.GetInfo('expectation') == False: |
| test = self._remove_expected_call_re.sub('', test) |
| name = func.name |
| arg_strings = [] |
| for count, arg in enumerate(func.GetOriginalArgs()): |
| arg_strings.append(arg.GetValidArg(func, count, 0)) |
| gl_arg_strings = [] |
| for count, arg in enumerate(func.GetOriginalArgs()): |
| gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) |
| gl_func_name = func.GetGLTestFunctionName() |
| vars = { |
| 'test_name': 'GLES2DecoderTest%d' % file.file_num, |
| 'name':name, |
| 'gl_func_name': gl_func_name, |
| 'args': ", ".join(arg_strings), |
| 'gl_args': ", ".join(gl_arg_strings), |
| } |
| vars.update(extra) |
| old_test = "" |
| while (old_test != test): |
| old_test = test |
| test = test % vars |
| file.Write(test % vars) |
| |
| def WriteInvalidUnitTest(self, func, file, test, extra = {}): |
| """Writes a invalid unit test.""" |
| for arg_index, arg in enumerate(func.GetOriginalArgs()): |
| num_invalid_values = arg.GetNumInvalidValues(func) |
| for value_index in range(0, num_invalid_values): |
| arg_strings = [] |
| parse_result = "kNoError" |
| gl_error = None |
| for count, arg in enumerate(func.GetOriginalArgs()): |
| if count == arg_index: |
| (arg_string, parse_result, gl_error) = arg.GetInvalidArg( |
| count, value_index) |
| else: |
| arg_string = arg.GetValidArg(func, count, 0) |
| arg_strings.append(arg_string) |
| gl_arg_strings = [] |
| for arg in func.GetOriginalArgs(): |
| gl_arg_strings.append("_") |
| gl_func_name = func.GetGLTestFunctionName() |
| gl_error_test = '' |
| if not gl_error == None: |
| gl_error_test = '\n EXPECT_EQ(%s, GetGLError());' % gl_error |
| |
| vars = { |
| 'test_name': 'GLES2DecoderTest%d' % file.file_num , |
| 'name': func.name, |
| 'arg_index': arg_index, |
| 'value_index': value_index, |
| 'gl_func_name': gl_func_name, |
| 'args': ", ".join(arg_strings), |
| 'all_but_last_args': ", ".join(arg_strings[:-1]), |
| 'gl_args': ", ".join(gl_arg_strings), |
| 'parse_result': parse_result, |
| 'gl_error_test': gl_error_test, |
| } |
| vars.update(extra) |
| file.Write(test % vars) |
| |
| def WriteServiceUnitTest(self, func, file): |
| """Writes the service unit test for a command.""" |
| valid_test = """ |
| TEST_F(%(test_name)s, %(name)sValidArgs) { |
| EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); |
| SpecializedSetup<cmds::%(name)s, 0>(true); |
| cmds::%(name)s cmd; |
| cmd.Init(%(args)s); |
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| } |
| """ |
| self.WriteValidUnitTest(func, file, valid_test) |
| |
| invalid_test = """ |
| TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
| EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); |
| SpecializedSetup<cmds::%(name)s, 0>(false); |
| cmds::%(name)s cmd; |
| cmd.Init(%(args)s); |
| EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s |
| } |
| """ |
| self.WriteInvalidUnitTest(func, file, invalid_test) |
| |
| def WriteImmediateServiceUnitTest(self, func, file): |
| """Writes the service unit test for an immediate command.""" |
| file.Write("// TODO(gman): %s\n" % func.name) |
| |
| def WriteImmediateValidationCode(self, func, file): |
| """Writes the validation code for an immediate version of a command.""" |
| pass |
| |
| def WriteBucketServiceUnitTest(self, func, file): |
| """Writes the service unit test for a bucket command.""" |
| file.Write("// TODO(gman): %s\n" % func.name) |
| |
| def WriteBucketValidationCode(self, func, file): |
| """Writes the validation code for a bucket version of a command.""" |
| file.Write("// TODO(gman): %s\n" % func.name) |
| |
| def WriteGLES2ImplementationDeclaration(self, func, file): |
| """Writes the GLES2 Implemention declaration.""" |
| impl_decl = func.GetInfo('impl_decl') |
| if impl_decl == None or impl_decl == True: |
| file.Write("virtual %s %s(%s) OVERRIDE;\n" % |
| (func.return_type, func.original_name, |
| func.MakeTypedOriginalArgString(""))) |
| file.Write("\n") |
| |
| def WriteGLES2CLibImplementation(self, func, file): |
| file.Write("%s GLES2%s(%s) {\n" % |
| (func.return_type, func.name, |
| func.MakeTypedOriginalArgString(""))) |
| result_string = "return " |
| if func.return_type == "void": |
| result_string = "" |
| file.Write(" %sgles2::GetGLContext()->%s(%s);\n" % |
| (result_string, func.original_name, |
| func.MakeOriginalArgString(""))) |
| file.Write("}\n") |
| |
| def WriteGLES2Header(self, func, file): |
| """Writes a re-write macro for GLES""" |
| file.Write("#define gl%s GLES2_GET_FUN(%s)\n" %(func.name, func.name)) |
| |
| def WriteClientGLCallLog(self, func, file): |
| """Writes a logging macro for the client side code.""" |
| comma = "" |
| if len(func.GetOriginalArgs()): |
| comma = " << " |
| file.Write( |
| ' GPU_CLIENT_LOG("[" << GetLogPrefix() << "] gl%s("%s%s << ")");\n' % |
| (func.original_name, comma, func.MakeLogArgString())) |
| |
| def WriteClientGLReturnLog(self, func, file): |
| """Writes the return value logging code.""" |
| if func.return_type != "void": |
| file.Write(' GPU_CLIENT_LOG("return:" << result)\n') |
| |
| def WriteGLES2ImplementationHeader(self, func, file): |
| """Writes the GLES2 Implemention.""" |
| self.WriteGLES2ImplementationDeclaration(func, file) |
| |
| def WriteGLES2TraceImplementationHeader(self, func, file): |
| """Writes the GLES2 Trace Implemention header.""" |
| file.Write("virtual %s %s(%s) OVERRIDE;\n" % |
| (func.return_type, func.original_name, |
| func.MakeTypedOriginalArgString(""))) |
| |
| def WriteGLES2TraceImplementation(self, func, file): |
| """Writes the GLES2 Trace Implemention.""" |
| file.Write("%s GLES2TraceImplementation::%s(%s) {\n" % |
| (func.return_type, func.original_name, |
| func.MakeTypedOriginalArgString(""))) |
| result_string = "return " |
| if func.return_type == "void": |
| result_string = "" |
| file.Write(' TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::%s");\n' % |
| func.name) |
| file.Write(" %sgl_->%s(%s);\n" % |
| (result_string, func.name, func.MakeOriginalArgString(""))) |
| file.Write("}\n") |
| file.Write("\n") |
| |
| def WriteGLES2Implementation(self, func, file): |
| """Writes the GLES2 Implemention.""" |
| impl_func = func.GetInfo( |