| #!/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 |
| from subprocess import call |
| |
| _SIZE_OF_UINT32 = 4 |
| _SIZE_OF_COMMAND_HEADER = 4 |
| _FIRST_SPECIFIC_COMMAND_ID = 256 |
| |
| _LICENSE = """// Copyright 2014 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 |
| // It's formatted by clang-format using chromium coding style: |
| // clang-format -i -style=chromium filename |
| // 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' |
| } |
| |
| _GL_TYPES_32 = { |
| 'GLintptr': 'long int', |
| 'GLsizeiptr': 'long int' |
| } |
| |
| _GL_TYPES_64 = { |
| 'GLintptr': 'long long int', |
| 'GLsizeiptr': 'long 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'}, |
| {'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', |
| 'cached': True |
| }, |
| { |
| 'name': 'color_mask_green', |
| 'type': 'GLboolean', |
| 'default': 'true', |
| 'cached': True |
| }, |
| { |
| 'name': 'color_mask_blue', |
| 'type': 'GLboolean', |
| 'default': 'true', |
| 'cached': True |
| }, |
| { |
| 'name': 'color_mask_alpha', |
| 'type': 'GLboolean', |
| 'default': 'true', |
| 'cached': 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', |
| 'cached': True, |
| }, |
| { |
| 'name': 'stencil_back_writemask', |
| 'type': 'GLuint', |
| 'enum': 'GL_STENCIL_BACK_WRITEMASK', |
| 'default': '0xFFFFFFFFU', |
| 'cached': True, |
| }, |
| ], |
| }, |
| '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', |
| 'cached': 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', |
| }, |
| ], |
| }, |
| } |
| |
| # Named type info object represents a named type that is used in OpenGL call |
| # arguments. Each named type defines a set of valid OpenGL call arguments. The |
| # named types are used in 'cmd_buffer_functions.txt'. |
| # type: The actual GL type of the named type. |
| # valid: The list of values that are valid for both the client and the service. |
| # invalid: Examples of invalid values for the type. At least these values |
| # should be tested to be invalid. |
| # is_complete: The list of valid values of type are final and will not be |
| # modified during runtime. |
| _NAMED_TYPE_INFO = { |
| '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', |
| 'GL_BIND_GENERATES_RESOURCE_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', |
| 'GL_COMMANDS_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', |
| 'is_complete': True, |
| 'valid': [ |
| '0', |
| ], |
| 'invalid': [ |
| '1', |
| ], |
| }, |
| 'VertexAttribSize': { |
| 'type': 'GLint', |
| 'valid': [ |
| '1', |
| '2', |
| '3', |
| '4', |
| ], |
| 'invalid': [ |
| '0', |
| '5', |
| ], |
| }, |
| 'ZeroOnly': { |
| 'type': 'GLint', |
| 'is_complete': True, |
| 'valid': [ |
| '0', |
| ], |
| 'invalid': [ |
| '1', |
| ], |
| }, |
| 'FalseOnly': { |
| 'type': 'GLboolean', |
| 'is_complete': True, |
| '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}, |
| {'name': 'VertexArrayObject', 'dev': False}, |
| {'name': 'DrawBuffers', 'dev': True}, |
| ] |
| |
| # A function info object specifies the type and other special data for the |
| # command that will be generated. A base function info object is generated by |
| # parsing the "cmd_buffer_functions.txt", one for each function in the |
| # file. These function info objects can be augmented and their values can be |
| # overridden by adding an object to the table below. |
| # |
| # 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. |
| # gen_cmd: Whether or not this function geneates a command. Default = True. |
| # data_transfer_methods: Array of methods that are used for transfering the |
| # pointer data. Possible values: 'immediate', 'shm', 'bucket'. |
| # The default is 'immediate' if the command has one pointer |
| # argument, otherwise 'shm'. One command is generated for each |
| # transfer method. Affects only commands which are not of type |
| # 'HandWritten', 'GETn' or 'GLcharN'. |
| # Note: the command arguments that affect this are the final args, |
| # taking cmd_args override into consideration. |
| # 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. |
| # 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 |
| # pepper_name: The name of the function as exposed to pepper. |
| # pepper_args: A string representing the argument list (what would appear in |
| # C/C++ between the parentheses for the function declaration) |
| # that the Pepper API expects for this function. Use this only if |
| # the stable Pepper API differs from the GLES2 argument list. |
| # 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 |
| # extension: Function is an extension to GL and should not be exposed to |
| # pepper unless pepper_interface is defined. |
| # extension_flag: Function is an extension and should be enabled only when |
| # the corresponding feature info flag is enabled. Implies |
| # 'extension': True. |
| # not_shared: For GENn types, True if objects can't be shared between contexts |
| |
| _FUNCTION_INFO = { |
| 'ActiveTexture': { |
| 'decoder_func': 'DoActiveTexture', |
| 'unit_test': False, |
| 'impl_func': False, |
| 'client_test': False, |
| }, |
| 'AttachShader': {'decoder_func': 'DoAttachShader'}, |
| 'BindAttribLocation': { |
| 'type': 'GLchar', |
| 'data_transfer_methods': ['bucket'], |
| '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', |
| 'trace_level': 1, |
| }, |
| '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, |
| 'trace_level': 1, |
| }, |
| 'BlitFramebufferCHROMIUM': { |
| 'decoder_func': 'DoBlitFramebufferCHROMIUM', |
| 'unit_test': False, |
| 'extension_flag': 'chromium_framebuffer_multisample', |
| 'pepper_interface': 'FramebufferBlit', |
| 'pepper_name': 'BlitFramebufferEXT', |
| 'defer_reads': True, |
| 'defer_draws': True, |
| 'trace_level': 1, |
| }, |
| 'BufferData': { |
| 'type': 'Manual', |
| 'data_transfer_methods': ['shm'], |
| 'client_test': False, |
| }, |
| 'BufferSubData': { |
| 'type': 'Data', |
| 'client_test': False, |
| 'decoder_func': 'DoBufferSubData', |
| 'data_transfer_methods': ['shm'], |
| }, |
| 'CheckFramebufferStatus': { |
| 'type': 'Is', |
| 'decoder_func': 'DoCheckFramebufferStatus', |
| 'gl_test_func': 'glCheckFramebufferStatusEXT', |
| 'error_value': 'GL_FRAMEBUFFER_UNSUPPORTED', |
| 'result': ['GLenum'], |
| }, |
| 'Clear': { |
| 'decoder_func': 'DoClear', |
| 'defer_draws': True, |
| 'trace_level': 1, |
| }, |
| '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', |
| 'impl_func': False, |
| 'type': 'PUT', |
| 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| 'trace_level': 1, |
| }, |
| 'CreateAndConsumeTextureCHROMIUM': { |
| 'decoder_func': 'DoCreateAndConsumeTextureCHROMIUM', |
| 'impl_func': False, |
| 'type': 'HandWritten', |
| 'data_transfer_methods': ['immediate'], |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'ClearStencil': { |
| 'type': 'StateSet', |
| 'state': 'ClearStencil', |
| }, |
| 'EnableFeatureCHROMIUM': { |
| 'type': 'Custom', |
| 'data_transfer_methods': ['shm'], |
| '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', |
| 'data_transfer_methods': ['bucket', 'shm'], |
| }, |
| 'CompressedTexSubImage2D': { |
| 'type': 'Data', |
| 'data_transfer_methods': ['bucket', 'shm'], |
| '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, GLenum usage', |
| 'result': ['GLuint'], |
| 'client_test': False, |
| 'gen_cmd': False, |
| 'expectation': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'DestroyImageCHROMIUM': { |
| 'type': 'Manual', |
| '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, |
| 'data_transfer_methods': ['shm'], |
| '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, |
| 'trace_level': 2, |
| }, |
| 'DrawElements': { |
| 'type': 'Manual', |
| 'cmd_args': 'GLenumDrawMode mode, GLsizei count, ' |
| 'GLenumIndexType type, GLuint index_offset', |
| 'client_test': False, |
| 'defer_draws': True, |
| 'trace_level': 2, |
| }, |
| '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', |
| 'trace_level': 1, |
| }, |
| 'FramebufferTexture2DMultisampleEXT': { |
| 'decoder_func': 'DoFramebufferTexture2DMultisample', |
| 'gl_test_func': 'glFramebufferTexture2DMultisampleEXT', |
| 'expectation': False, |
| 'unit_test': False, |
| 'extension_flag': 'multisampled_render_to_texture', |
| 'trace_level': 1, |
| }, |
| 'GenerateMipmap': { |
| 'decoder_func': 'DoGenerateMipmap', |
| 'gl_test_func': 'glGenerateMipmapEXT', |
| }, |
| 'GenBuffers': { |
| 'type': 'GENn', |
| 'gl_test_func': 'glGenBuffersARB', |
| 'resource_type': 'Buffer', |
| 'resource_types': 'Buffers', |
| }, |
| 'GenMailboxCHROMIUM': { |
| 'type': 'HandWritten', |
| 'impl_func': 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, |
| 'data_transfer_methods': ['shm'], |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'GetActiveAttrib': { |
| 'type': 'Custom', |
| 'data_transfer_methods': ['shm'], |
| 'cmd_args': |
| 'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' |
| 'void* result', |
| 'result': [ |
| 'int32_t success', |
| 'int32_t size', |
| 'uint32_t type', |
| ], |
| }, |
| 'GetActiveUniform': { |
| 'type': 'Custom', |
| 'data_transfer_methods': ['shm'], |
| 'cmd_args': |
| 'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' |
| 'void* result', |
| 'result': [ |
| 'int32_t success', |
| 'int32_t size', |
| 'uint32_t type', |
| ], |
| }, |
| 'GetAttachedShaders': { |
| 'type': 'Custom', |
| 'data_transfer_methods': ['shm'], |
| 'cmd_args': 'GLidProgram program, void* result, uint32_t result_size', |
| 'result': ['SizedResult<GLuint>'], |
| }, |
| 'GetAttribLocation': { |
| 'type': 'Custom', |
| 'data_transfer_methods': ['shm'], |
| 'cmd_args': |
| 'GLidProgram program, uint32_t name_bucket_id, GLint* location', |
| 'result': ['GLint'], |
| 'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml |
| }, |
| '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', |
| 'data_transfer_methods': ['shm'], |
| 'expectation': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'GetProgramiv': { |
| 'type': 'GETn', |
| 'decoder_func': 'DoGetProgramiv', |
| 'result': ['SizedResult<GLint>'], |
| 'expectation': False, |
| }, |
| 'GetProgramInfoCHROMIUM': { |
| 'type': 'Custom', |
| 'expectation': False, |
| 'impl_func': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| 'cmd_args': 'GLidProgram program, uint32_t bucket_id', |
| 'result': [ |
| 'uint32_t link_status', |
| 'uint32_t num_attribs', |
| 'uint32_t 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', |
| 'data_transfer_methods': ['shm'], |
| 'cmd_args': |
| 'GLenumShaderType shadertype, GLenumShaderPrecision precisiontype, ' |
| 'void* result', |
| 'result': [ |
| 'int32_t success', |
| 'int32_t min_range', |
| 'int32_t max_range', |
| 'int32_t 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_t bucket_id', |
| }, |
| 'GetTexParameterfv': { |
| 'type': 'GETn', |
| 'decoder_func': 'DoGetTexParameterfv', |
| 'result': ['SizedResult<GLfloat>'] |
| }, |
| 'GetTexParameteriv': { |
| 'type': 'GETn', |
| 'decoder_func': 'DoGetTexParameteriv', |
| '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', |
| 'data_transfer_methods': ['shm'], |
| 'result': ['SizedResult<GLfloat>'], |
| }, |
| 'GetUniformiv': { |
| 'type': 'Custom', |
| 'data_transfer_methods': ['shm'], |
| 'result': ['SizedResult<GLint>'], |
| }, |
| 'GetUniformLocation': { |
| 'type': 'Custom', |
| 'data_transfer_methods': ['shm'], |
| 'cmd_args': |
| 'GLidProgram program, uint32_t name_bucket_id, GLint* location', |
| 'result': ['GLint'], |
| 'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml |
| }, |
| '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', |
| 'data_transfer_methods': ['shm'], |
| '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', |
| 'impl_func': False, |
| 'type': 'PUT', |
| 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| 'trace_level': 1, |
| }, |
| 'ProduceTextureDirectCHROMIUM': { |
| 'decoder_func': 'DoProduceTextureDirectCHROMIUM', |
| 'impl_func': False, |
| 'type': 'PUT', |
| 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| 'trace_level': 1, |
| }, |
| 'RenderbufferStorage': { |
| 'decoder_func': 'DoRenderbufferStorage', |
| 'gl_test_func': 'glRenderbufferStorageEXT', |
| 'expectation': False, |
| }, |
| 'RenderbufferStorageMultisampleCHROMIUM': { |
| 'cmd_comment': |
| '// GL_CHROMIUM_framebuffer_multisample\n', |
| 'decoder_func': 'DoRenderbufferStorageMultisampleCHROMIUM', |
| 'gl_test_func': 'glRenderbufferStorageMultisampleCHROMIUM', |
| 'expectation': False, |
| 'unit_test': False, |
| 'extension_flag': 'chromium_framebuffer_multisample', |
| 'pepper_interface': 'FramebufferMultisample', |
| 'pepper_name': 'RenderbufferStorageMultisampleEXT', |
| }, |
| 'RenderbufferStorageMultisampleEXT': { |
| 'cmd_comment': |
| '// GL_EXT_multisampled_render_to_texture\n', |
| 'decoder_func': 'DoRenderbufferStorageMultisampleEXT', |
| 'gl_test_func': 'glRenderbufferStorageMultisampleEXT', |
| 'expectation': False, |
| 'unit_test': False, |
| 'extension_flag': 'multisampled_render_to_texture', |
| }, |
| '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', |
| 'data_transfer_methods': ['shm'], |
| 'impl_func': False, |
| 'client_test': False, |
| 'cmd_args': |
| 'GLint x, GLint y, GLsizei width, GLsizei height, ' |
| 'GLenumReadPixelFormat format, GLenumReadPixelType type, ' |
| 'uint32_t pixels_shm_id, uint32_t pixels_shm_offset, ' |
| 'uint32_t result_shm_id, uint32_t result_shm_offset, ' |
| 'GLboolean async', |
| 'result': ['uint32_t'], |
| 'defer_reads': True, |
| }, |
| 'RegisterSharedIdsCHROMIUM': { |
| 'type': 'Custom', |
| 'decoder_func': 'DoRegisterSharedIdsCHROMIUM', |
| 'impl_func': False, |
| 'expectation': False, |
| 'data_transfer_methods': ['shm'], |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'ReleaseShaderCompiler': { |
| 'decoder_func': 'DoReleaseShaderCompiler', |
| 'unit_test': False, |
| }, |
| 'ShaderBinary': { |
| 'type': 'Custom', |
| 'client_test': False, |
| }, |
| 'ShaderSource': { |
| 'type': 'Manual', |
| 'data_transfer_methods': ['bucket'], |
| 'needs_size': True, |
| 'client_test': False, |
| 'cmd_args': |
| 'GLuint shader, const char* data', |
| 'pepper_args': |
| 'GLuint shader, GLsizei count, const char** str, const GLint* length', |
| }, |
| '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, |
| 'trace_level': 1, |
| }, |
| 'TexImage2D': { |
| 'type': 'Manual', |
| 'data_transfer_methods': ['shm'], |
| 'client_test': False, |
| }, |
| 'TexParameterf': { |
| 'decoder_func': 'DoTexParameterf', |
| 'valid_args': { |
| '2': 'GL_NEAREST' |
| }, |
| }, |
| 'TexParameteri': { |
| 'decoder_func': 'DoTexParameteri', |
| 'valid_args': { |
| '2': 'GL_NEAREST' |
| }, |
| }, |
| 'TexParameterfv': { |
| 'type': 'PUT', |
| 'data_value': 'GL_NEAREST', |
| 'count': 1, |
| 'decoder_func': 'DoTexParameterfv', |
| 'gl_test_func': 'glTexParameterf', |
| 'first_element_only': True, |
| }, |
| 'TexParameteriv': { |
| 'type': 'PUT', |
| 'data_value': 'GL_NEAREST', |
| 'count': 1, |
| 'decoder_func': 'DoTexParameteriv', |
| 'gl_test_func': 'glTexParameteri', |
| 'first_element_only': True, |
| }, |
| 'TexSubImage2D': { |
| 'type': 'Manual', |
| 'data_transfer_methods': ['shm'], |
| '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', 'count': 1}, |
| 'Uniform1fv': { |
| 'type': 'PUTn', |
| 'count': 1, |
| 'decoder_func': 'DoUniform1fv', |
| }, |
| 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False}, |
| 'Uniform1iv': { |
| 'type': 'PUTn', |
| 'count': 1, |
| 'decoder_func': 'DoUniform1iv', |
| 'unit_test': False, |
| }, |
| 'Uniform2i': {'type': 'PUTXn', 'count': 2}, |
| 'Uniform2f': {'type': 'PUTXn', 'count': 2}, |
| 'Uniform2fv': { |
| 'type': 'PUTn', |
| 'count': 2, |
| 'decoder_func': 'DoUniform2fv', |
| }, |
| 'Uniform2iv': { |
| 'type': 'PUTn', |
| 'count': 2, |
| 'decoder_func': 'DoUniform2iv', |
| }, |
| 'Uniform3i': {'type': 'PUTXn', 'count': 3}, |
| 'Uniform3f': {'type': 'PUTXn', 'count': 3}, |
| 'Uniform3fv': { |
| 'type': 'PUTn', |
| 'count': 3, |
| 'decoder_func': 'DoUniform3fv', |
| }, |
| 'Uniform3iv': { |
| 'type': 'PUTn', |
| 'count': 3, |
| 'decoder_func': 'DoUniform3iv', |
| }, |
| 'Uniform4i': {'type': 'PUTXn', 'count': 4}, |
| 'Uniform4f': {'type': 'PUTXn', 'count': 4}, |
| 'Uniform4fv': { |
| 'type': 'PUTn', |
| 'count': 4, |
| 'decoder_func': 'DoUniform4fv', |
| }, |
| 'Uniform4iv': { |
| 'type': 'PUTn', |
| 'count': 4, |
| 'decoder_func': 'DoUniform4iv', |
| }, |
| 'UniformMatrix2fv': { |
| 'type': 'PUTn', |
| 'count': 4, |
| 'decoder_func': 'DoUniformMatrix2fv', |
| }, |
| 'UniformMatrix3fv': { |
| 'type': 'PUTn', |
| 'count': 9, |
| 'decoder_func': 'DoUniformMatrix3fv', |
| }, |
| 'UniformMatrix4fv': { |
| 'type': 'PUTn', |
| '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': { |
| 'type': 'Bind', |
| 'decoder_func': 'DoUseProgram', |
| }, |
| 'ValidateProgram': {'decoder_func': 'DoValidateProgram'}, |
| 'VertexAttrib1f': {'decoder_func': 'DoVertexAttrib1f'}, |
| 'VertexAttrib1fv': { |
| 'type': 'PUT', |
| 'count': 1, |
| 'decoder_func': 'DoVertexAttrib1fv', |
| }, |
| 'VertexAttrib2f': {'decoder_func': 'DoVertexAttrib2f'}, |
| 'VertexAttrib2fv': { |
| 'type': 'PUT', |
| 'count': 2, |
| 'decoder_func': 'DoVertexAttrib2fv', |
| }, |
| 'VertexAttrib3f': {'decoder_func': 'DoVertexAttrib3f'}, |
| 'VertexAttrib3fv': { |
| 'type': 'PUT', |
| 'count': 3, |
| 'decoder_func': 'DoVertexAttrib3fv', |
| }, |
| 'VertexAttrib4f': {'decoder_func': 'DoVertexAttrib4f'}, |
| 'VertexAttrib4fv': { |
| 'type': 'PUT', |
| '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, |
| 'cmd_args': 'uint32_t bucket_id', |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'RequestExtensionCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'client_test': False, |
| 'cmd_args': 'uint32_t bucket_id', |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'RateLimitOffscreenContextCHROMIUM': { |
| 'gen_cmd': False, |
| 'extension': True, |
| 'chromium': True, |
| 'client_test': False, |
| }, |
| 'CreateStreamTextureCHROMIUM': { |
| 'type': 'HandWritten', |
| 'impl_func': False, |
| 'gen_cmd': 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', |
| 'count': 1, |
| 'client_test': False, |
| 'unit_test': False, |
| # could use 'extension_flag': 'ext_draw_buffers' but currently expected to |
| # work without. |
| 'extension': True, |
| 'pepper_interface': 'DrawBuffers', |
| }, |
| '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', |
| 'not_shared': 'True', |
| }, |
| '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', |
| 'data_transfer_methods': ['shm'], |
| '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', |
| 'extension': True, |
| 'data_transfer_methods': ['bucket'], |
| 'needs_size': True, |
| 'gl_test_func': 'DoBindUniformLocationCHROMIUM', |
| }, |
| 'InsertEventMarkerEXT': { |
| 'type': 'GLcharN', |
| 'decoder_func': 'DoInsertEventMarkerEXT', |
| 'expectation': False, |
| 'extension': True, |
| }, |
| 'PushGroupMarkerEXT': { |
| 'type': 'GLcharN', |
| 'decoder_func': 'DoPushGroupMarkerEXT', |
| 'expectation': False, |
| 'extension': True, |
| }, |
| 'PopGroupMarkerEXT': { |
| 'decoder_func': 'DoPopGroupMarkerEXT', |
| 'expectation': False, |
| 'extension': True, |
| 'impl_func': False, |
| }, |
| |
| 'GenVertexArraysOES': { |
| 'type': 'GENn', |
| 'extension': True, |
| 'gl_test_func': 'glGenVertexArraysOES', |
| 'resource_type': 'VertexArray', |
| 'resource_types': 'VertexArrays', |
| 'unit_test': False, |
| 'pepper_interface': 'VertexArrayObject', |
| }, |
| 'BindVertexArrayOES': { |
| 'type': 'Bind', |
| 'extension': True, |
| 'gl_test_func': 'glBindVertexArrayOES', |
| 'decoder_func': 'DoBindVertexArrayOES', |
| 'gen_func': 'GenVertexArraysOES', |
| 'unit_test': False, |
| 'client_test': False, |
| 'pepper_interface': 'VertexArrayObject', |
| }, |
| 'DeleteVertexArraysOES': { |
| 'type': 'DELn', |
| 'extension': True, |
| 'gl_test_func': 'glDeleteVertexArraysOES', |
| 'resource_type': 'VertexArray', |
| 'resource_types': 'VertexArrays', |
| 'unit_test': False, |
| 'pepper_interface': 'VertexArrayObject', |
| }, |
| 'IsVertexArrayOES': { |
| 'type': 'Is', |
| 'extension': True, |
| 'gl_test_func': 'glIsVertexArrayOES', |
| 'decoder_func': 'DoIsVertexArrayOES', |
| 'expectation': False, |
| 'unit_test': False, |
| 'pepper_interface': 'VertexArrayObject', |
| }, |
| '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, |
| 'client_test': False, |
| 'cmd_args': 'GLuint bucket_id', |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'TraceEndCHROMIUM': { |
| 'impl_func': False, |
| 'client_test': False, |
| 'decoder_func': 'DoTraceEndCHROMIUM', |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'AsyncTexImage2DCHROMIUM': { |
| 'type': 'Manual', |
| 'data_transfer_methods': ['shm'], |
| 'client_test': False, |
| 'cmd_args': 'GLenumTextureTarget target, GLint level, ' |
| 'GLintTextureInternalFormat internalformat, ' |
| 'GLsizei width, GLsizei height, ' |
| 'GLintTextureBorder border, ' |
| 'GLenumTextureFormat format, GLenumPixelType type, ' |
| 'const void* pixels, ' |
| 'uint32_t async_upload_token, ' |
| 'void* sync_data', |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'AsyncTexSubImage2DCHROMIUM': { |
| 'type': 'Manual', |
| 'data_transfer_methods': ['shm'], |
| 'client_test': False, |
| 'cmd_args': 'GLenumTextureTarget target, GLint level, ' |
| 'GLint xoffset, GLint yoffset, ' |
| 'GLsizei width, GLsizei height, ' |
| 'GLenumTextureFormat format, GLenumPixelType type, ' |
| 'const void* data, ' |
| 'uint32_t async_upload_token, ' |
| 'void* sync_data', |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'WaitAsyncTexImage2DCHROMIUM': { |
| 'type': 'Manual', |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'WaitAllAsyncTexImage2DCHROMIUM': { |
| 'type': 'Manual', |
| 'client_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'DiscardFramebufferEXT': { |
| 'type': 'PUTn', |
| 'count': 1, |
| 'cmd_args': 'GLenum target, GLsizei count, ' |
| 'const GLenum* attachments', |
| 'decoder_func': 'DoDiscardFramebufferEXT', |
| 'unit_test': False, |
| 'client_test': False, |
| 'extension_flag': 'ext_discard_framebuffer', |
| }, |
| 'LoseContextCHROMIUM': { |
| 'decoder_func': 'DoLoseContextCHROMIUM', |
| 'unit_test': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'InsertSyncPointCHROMIUM': { |
| 'type': 'HandWritten', |
| 'impl_func': False, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'WaitSyncPointCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': True, |
| 'extension': True, |
| 'chromium': True, |
| 'trace_level': 1, |
| }, |
| 'DiscardBackbufferCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': True, |
| 'extension': True, |
| 'chromium': True, |
| }, |
| 'ScheduleOverlayPlaneCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': True, |
| 'unit_test': False, |
| 'client_test': False, |
| '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) |
| |
| def CachedStateName(item): |
| if item.get('cached', False): |
| return 'cached_' + item['name'] |
| return item['name'] |
| |
| |
| 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.content.append(lines[ii]) |
| if ii < (num_lines - 1) or string[-1] == '\n': |
| self.content.append('\n') |
| |
| 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 NeedsDataTransferFunction(self, func): |
| """Overriden from TypeHandler.""" |
| return func.num_pointer_args >= 1 |
| |
| 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) |
| func.WriteCmdFlag(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)) |
| |
| consts = func.GetCmdConstants() |
| for const in consts: |
| file.Write(" static const %s %s = %s;\n" % |
| (const.cmd_type, const.name, const.GetConstantValue())) |
| |
| 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_t>(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_t immediate_data_size, const gles2::cmds::%s& c) {\n" % |
| func.name) |
| self.WriteHandlerExtensionCheck(func, file) |
| 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_t immediate_data_size, const gles2::cmds::%s& c) {\n" % |
| func.name) |
| self.WriteHandlerExtensionCheck(func, file) |
| 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_t immediate_data_size, const gles2::cmds::%s& c) {\n" % |
| func.name) |
| self.WriteHandlerExtensionCheck(func, file) |
| 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 WriteHandlerExtensionCheck(self, func, file): |
| if func.GetInfo('extension_flag'): |
| file.Write(" if (!features().%s) {\n" % func.GetInfo('extension_flag')) |
| file.Write(" LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, \"gl%s\"," |
| " \"function not available\");\n" % func.original_name) |
| file.Write(" return error::kNoError;") |
| file.Write(" }\n\n") |
| |
| def WriteHandlerDeferReadWrite(self, func, file): |
| """Writes the code to handle deferring reads or writes.""" |
| defer_draws = func.GetInfo('defer_draws') |
| defer_reads = func.GetInfo('defer_reads') |
| if defer_draws or defer_reads: |
| file.Write(" error::Error error;\n") |
| if defer_draws: |
| file.Write(" error = WillAccessBoundFramebufferForDraw();\n") |
| file.Write(" if (error != error::kNoError)\n") |
| file.Write(" return error;\n") |
| if defer_reads: |
| file.Write(" error = WillAccessBoundFramebufferForRead();\n") |
| file.Write(" if (error != error::kNoError)\n") |
| file.Write(" return error;\n") |
| |
| def WriteValidUnitTest(self, func, file, test, extra = {}): |
| """Writes a valid unit test for the service implementation.""" |
| if func.GetInfo('expectation') == False: |
| test = self._remove_expected_call_re.sub('', test) |
| name = func.name |
| arg_strings = [ |
| arg.GetValidArg(func) \ |
| for arg in func.GetOriginalArgs() if not arg.IsConstant() |
| ] |
| gl_arg_strings = [ |
| arg.GetValidGLArg(func) \ |
| for arg in func.GetOriginalArgs() |
| ] |
| 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 an invalid unit test for the service implementation.""" |
| for invalid_arg_index, invalid_arg in enumerate(func.GetOriginalArgs()): |
| # Service implementation does not test constants, as they are not part of |
| # the call in the service side. |
| if invalid_arg.IsConstant(): |
| continue |
| |
| num_invalid_values = invalid_arg.GetNumInvalidValues(func) |
| for value_index in range(0, num_invalid_values): |
| arg_strings = [] |
| parse_result = "kNoError" |
| gl_error = None |
| for arg in func.GetOriginalArgs(): |
| if arg.IsConstant(): |
| continue |
| if invalid_arg is arg: |
| (arg_string, parse_result, gl_error) = arg.GetInvalidArg( |
| value_index) |
| else: |
| arg_string = arg.GetValidArg(func) |
| 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': invalid_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.""" |
| |
| if func.name == 'Enable': |
| valid_test = """ |
| TEST_P(%(test_name)s, %(name)sValidArgs) { |
| SetupExpectationsForEnableDisable(%(gl_args)s, true); |
| 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()); |
| } |
| """ |
| elif func.name == 'Disable': |
| valid_test = """ |
| TEST_P(%(test_name)s, %(name)sValidArgs) { |
| SetupExpectationsForEnableDisable(%(gl_args)s, false); |
| 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()); |
| } |
| """ |
| else: |
| valid_test = """ |
| TEST_P(%(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_P(%(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) |
|