Index: gpu/command_buffer/build_gles2_cmd_buffer.py |
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py |
index 302e0ab811d26d321b8e377ec914e8a6e65a6007..450dea42e0c0ef3458f6a05bee461ccdc4dca83c 100755 |
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py |
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py |
@@ -5,6 +5,7 @@ |
"""code generator for GLES2 command buffers.""" |
+import itertools |
import os |
import os.path |
import sys |
@@ -57,6 +58,376 @@ _GL_TYPES = { |
'GLsizeiptr': 'long int', |
} |
+# Capabilites selected with glEnable |
+_CAPABILITY_FLAGS = [ |
+ {'name': 'blend'}, |
+ {'name': 'cull_face'}, |
+ {'name': 'depth_test', 'state_flag': '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': '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': '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': '0.0f', |
+ }, |
+ { |
+ 'name': 'sample_coverage_invert', |
+ 'type': 'GLboolean', |
+ 'enum': 'GL_SAMPLE_COVERAGE_INVERT', |
+ 'default': 'false', |
+ }, |
+ ], |
+ }, |
+ 'StencilMask': { |
+ 'type': 'FrontBack', |
+ 'func': 'StencilMaskSeparate', |
+ 'state_flag': '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', |
+ }, |
+ ], |
+ }, |
+ # TODO: Consider implemenenting these states |
+ # GL_GENERATE_MIPMAP_HINT |
+ # GL_ACTIVE_TEXTURE, |
+ # GL_PACK_ALIGNMENT, |
+ # GL_UNPACK_ALIGNMENT |
+ 'LineWidth': { |
+ 'type': 'Normal', |
+ 'func': 'LineWidth', |
+ 'enum': 'GL_LINE_WIDTH', |
+ 'states': [{'name': 'line_width', 'type': 'GLfloat', 'default': '1.0f'}], |
+ }, |
+ 'DepthMask': { |
+ 'type': 'Normal', |
+ 'func': 'DepthMask', |
+ 'enum': 'GL_DEPTH_WRITEMASK', |
+ 'states': [ |
+ {'name': 'depth_mask', 'type': 'GLboolean', 'default': 'true'}, |
+ ], |
+ 'state_flag': 'clear_state_dirty_', |
+ }, |
+ 'Scissor': { |
+ 'type': 'Normal', |
+ 'func': 'Scissor', |
+ 'enum': 'GL_SCISSOR_BOX', |
+ 'states': [ |
+ # NOTE: These defaults reset at GLES2DecoderImpl::Initialization. |
+ { |
+ 'name': 'scissor_x', |
+ 'type': 'GLfloat', |
+ 'default': '0.0f', |
+ 'expected': 'kViewportX', |
+ }, |
+ { |
+ 'name': 'scissor_y', |
+ 'type': 'GLfloat', |
+ 'default': '0.0f', |
+ 'expected': 'kViewportY', |
+ }, |
+ { |
+ 'name': 'scissor_width', |
+ 'type': 'GLfloat', |
+ 'default': '1.0f', |
+ 'expected': 'kViewportWidth', |
+ }, |
+ { |
+ 'name': 'scissor_height', |
+ 'type': 'GLfloat', |
+ 'default': '1.0f', |
+ 'expected': 'kViewportHeight', |
+ }, |
+ ], |
+ }, |
+ 'Viewport': { |
+ 'type': 'Normal', |
+ 'func': 'Viewport', |
+ 'enum': 'GL_VIEWPORT', |
+ 'states': [ |
+ # NOTE: These defaults reset at GLES2DecoderImpl::Initialization. |
+ { |
+ 'name': 'viewport_x', |
+ 'type': 'GLfloat', |
+ 'default': '0.0f', |
+ 'expected': 'kViewportX', |
+ }, |
+ { |
+ 'name': 'viewport_y', |
+ 'type': 'GLfloat', |
+ 'default': '0.0f', |
+ 'expected': 'kViewportY', |
+ }, |
+ { |
+ 'name': 'viewport_width', |
+ 'type': 'GLfloat', |
+ 'default': '1.0f', |
+ 'expected': 'kViewportWidth', |
+ }, |
+ { |
+ 'name': 'viewport_height', |
+ 'type': 'GLfloat', |
+ 'default': '1.0f', |
+ '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 = { |
@@ -118,41 +489,23 @@ _ENUM_LISTS = { |
'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_BLEND', |
- 'GL_BLEND_COLOR', |
- 'GL_BLEND_DST_ALPHA', |
- 'GL_BLEND_DST_RGB', |
- 'GL_BLEND_EQUATION_ALPHA', |
- 'GL_BLEND_EQUATION_RGB', |
- 'GL_BLEND_SRC_ALPHA', |
- 'GL_BLEND_SRC_RGB', |
'GL_BLUE_BITS', |
- 'GL_COLOR_CLEAR_VALUE', |
- 'GL_COLOR_WRITEMASK', |
'GL_COMPRESSED_TEXTURE_FORMATS', |
- 'GL_CULL_FACE', |
- 'GL_CULL_FACE_MODE', |
'GL_CURRENT_PROGRAM', |
'GL_DEPTH_BITS', |
- 'GL_DEPTH_CLEAR_VALUE', |
- 'GL_DEPTH_FUNC', |
'GL_DEPTH_RANGE', |
- 'GL_DEPTH_TEST', |
- 'GL_DEPTH_WRITEMASK', |
- 'GL_DITHER', |
'GL_ELEMENT_ARRAY_BUFFER_BINDING', |
'GL_FRAMEBUFFER_BINDING', |
- 'GL_FRONT_FACE', |
'GL_GENERATE_MIPMAP_HINT', |
'GL_GREEN_BITS', |
'GL_IMPLEMENTATION_COLOR_READ_FORMAT', |
'GL_IMPLEMENTATION_COLOR_READ_TYPE', |
- 'GL_LINE_WIDTH', |
'GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS', |
'GL_MAX_CUBE_MAP_TEXTURE_SIZE', |
'GL_MAX_FRAGMENT_UNIFORM_VECTORS', |
@@ -167,9 +520,6 @@ _ENUM_LISTS = { |
'GL_NUM_COMPRESSED_TEXTURE_FORMATS', |
'GL_NUM_SHADER_BINARY_FORMATS', |
'GL_PACK_ALIGNMENT', |
- 'GL_POLYGON_OFFSET_FACTOR', |
- 'GL_POLYGON_OFFSET_FILL', |
- 'GL_POLYGON_OFFSET_UNITS', |
'GL_RED_BITS', |
'GL_RENDERBUFFER_BINDING', |
'GL_SAMPLE_BUFFERS', |
@@ -177,27 +527,10 @@ _ENUM_LISTS = { |
'GL_SAMPLE_COVERAGE_VALUE', |
'GL_SAMPLES', |
'GL_SCISSOR_BOX', |
- 'GL_SCISSOR_TEST', |
'GL_SHADER_BINARY_FORMATS', |
'GL_SHADER_COMPILER', |
- 'GL_STENCIL_BACK_FAIL', |
- 'GL_STENCIL_BACK_FUNC', |
- 'GL_STENCIL_BACK_PASS_DEPTH_FAIL', |
- 'GL_STENCIL_BACK_PASS_DEPTH_PASS', |
- 'GL_STENCIL_BACK_REF', |
- 'GL_STENCIL_BACK_VALUE_MASK', |
- 'GL_STENCIL_BACK_WRITEMASK', |
- 'GL_STENCIL_BITS', |
- 'GL_STENCIL_CLEAR_VALUE', |
- 'GL_STENCIL_FAIL', |
- 'GL_STENCIL_FUNC', |
- 'GL_STENCIL_PASS_DEPTH_FAIL', |
- 'GL_STENCIL_PASS_DEPTH_PASS', |
- 'GL_STENCIL_REF', |
- 'GL_STENCIL_TEST', |
- 'GL_STENCIL_VALUE_MASK', |
- 'GL_STENCIL_WRITEMASK', |
'GL_SUBPIXEL_BITS', |
+ 'GL_STENCIL_BITS', |
'GL_TEXTURE_BINDING_2D', |
'GL_TEXTURE_BINDING_CUBE_MAP', |
'GL_UNPACK_ALIGNMENT', |
@@ -337,17 +670,7 @@ _ENUM_LISTS = { |
}, |
'Capability': { |
'type': 'GLenum', |
- 'valid': [ |
- 'GL_DITHER', # 1st one is a non-cached value so autogen unit tests work. |
- 'GL_BLEND', |
- 'GL_CULL_FACE', |
- 'GL_DEPTH_TEST', |
- 'GL_POLYGON_OFFSET_FILL', |
- 'GL_SAMPLE_ALPHA_TO_COVERAGE', |
- 'GL_SAMPLE_COVERAGE', |
- 'GL_SCISSOR_TEST', |
- 'GL_STENCIL_TEST', |
- ], |
+ 'valid': ["GL_%s" % cap['name'].upper() for cap in _CAPABILITY_FLAGS], |
'invalid': [ |
'GL_CLIP_PLANE0', |
'GL_POINT_SPRITE', |
@@ -881,30 +1204,17 @@ _FUNCTION_INFO = { |
}, |
'ClearColor': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'color_clear_red'}, |
- {'name': 'color_clear_green'}, |
- {'name': 'color_clear_blue'}, |
- {'name': 'color_clear_alpha'}, |
- ], |
+ 'state': 'ClearColor', |
}, |
'ClearDepthf': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'depth_clear'}, |
- ], |
+ 'state': 'ClearDepthf', |
'decoder_func': 'glClearDepth', |
'gl_test_func': 'glClearDepth', |
}, |
'ColorMask': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'color_mask_red'}, |
- {'name': 'color_mask_green'}, |
- {'name': 'color_mask_blue'}, |
- {'name': 'color_mask_alpha'}, |
- ], |
- 'state_flag': 'clear_state_dirty_', |
+ 'state': 'ColorMask', |
'no_gl': True, |
'expectation': False, |
}, |
@@ -919,9 +1229,7 @@ _FUNCTION_INFO = { |
}, |
'ClearStencil': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'stencil_clear'}, |
- ], |
+ 'state': 'ClearStencil', |
}, |
'EnableFeatureCHROMIUM': { |
'type': 'Custom', |
@@ -962,47 +1270,49 @@ _FUNCTION_INFO = { |
}, |
'BlendColor': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'blend_color_red'}, |
- {'name': 'blend_color_green'}, |
- {'name': 'blend_color_blue'}, |
- {'name': 'blend_color_alpha'}, |
- ], |
+ 'state': 'BlendColor', |
+ }, |
+ 'BlendEquation': { |
+ 'type': 'StateSetRGBAlpha', |
+ 'state': 'BlendEquation', |
}, |
- 'BlendEquation': {'decoder_func': 'DoBlendEquation'}, |
'BlendEquationSeparate': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'blend_equation_rgb'}, |
- {'name': 'blend_equation_alpha'}, |
- ], |
+ 'state': 'BlendEquation', |
+ }, |
+ 'BlendFunc': { |
+ 'type': 'StateSetRGBAlpha', |
+ 'state': 'BlendFunc', |
}, |
- 'BlendFunc': {'decoder_func': 'DoBlendFunc'}, |
'BlendFuncSeparate': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'blend_source_rgb'}, |
- {'name': 'blend_dest_rgb'}, |
- {'name': 'blend_source_alpha'}, |
- {'name': 'blend_dest_alpha'}, |
- ], |
+ 'state': 'BlendFunc', |
}, |
'SampleCoverage': {'decoder_func': 'DoSampleCoverage'}, |
- 'StencilFunc': {'decoder_func': 'DoStencilFunc'}, |
- 'StencilFuncSeparate': {'decoder_func': 'DoStencilFuncSeparate'}, |
- 'StencilOp': {'decoder_func': 'DoStencilOp'}, |
- 'StencilOpSeparate': {'decoder_func': 'DoStencilOpSeparate'}, |
+ 'StencilFunc': { |
+ 'type': 'StencilFrontBack', |
+ 'state': 'StencilFunc', |
+ }, |
+ 'StencilFuncSeparate': { |
+ 'type': 'StencilFrontBack', |
+ 'state': 'StencilFunc', |
+ }, |
+ 'StencilOp': { |
+ 'type': 'StateSetFrontBack', |
+ 'state': 'StencilOp', |
+ }, |
+ 'StencilOpSeparate': { |
+ 'type': 'StateSetFrontBackSeparate', |
+ 'state': 'StencilOp', |
+ }, |
'Hint': {'decoder_func': 'DoHint'}, |
- 'CullFace': {'type': 'StateSet', 'states': [{'name': 'cull_mode'}]}, |
- 'FrontFace': {'type': 'StateSet', 'states': [{'name': 'front_face'}]}, |
- 'DepthFunc': {'type': 'StateSet', 'states': [{'name': 'depth_func'}]}, |
- 'LineWidth': {'type': 'StateSet', 'states': [{'name': 'line_width'}]}, |
+ 'CullFace': {'type': 'StateSet', 'state': 'CullFace'}, |
+ 'FrontFace': {'type': 'StateSet', 'state': 'FrontFace'}, |
+ 'DepthFunc': {'type': 'StateSet', 'state': 'DepthFunc'}, |
+ 'LineWidth': {'type': 'StateSet', 'state': 'LineWidth'}, |
'PolygonOffset': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'polygon_offset_factor'}, |
- {'name': 'polygon_offset_units'}, |
- ], |
+ 'state': 'PolygonOffset', |
}, |
'DeleteBuffers': { |
'type': 'DELn', |
@@ -1044,10 +1354,7 @@ _FUNCTION_INFO = { |
}, |
'DepthMask': { |
'type': 'StateSet', |
- 'states': [ |
- {'name': 'depth_mask'}, |
- ], |
- 'state_flag': 'clear_state_dirty_', |
+ 'state': 'DepthMask', |
'no_gl': True, |
'expectation': False, |
}, |
@@ -1480,9 +1787,16 @@ _FUNCTION_INFO = { |
'cmd_args': |
'GLuint shader, const char* data', |
}, |
- 'StencilMask': {'decoder_func': 'DoStencilMask', 'expectation': False}, |
+ 'StencilMask': { |
+ 'type': 'StateSetFrontBack', |
+ 'state': 'StencilMask', |
+ 'no_gl': True, |
+ 'expectation': False, |
+ }, |
'StencilMaskSeparate': { |
- 'decoder_func': 'DoStencilMaskSeparate', |
+ 'type': 'StateSetFrontBackSeparate', |
+ 'state': 'StencilMask', |
+ 'no_gl': True, |
'expectation': False, |
}, |
'SwapBuffers': { |
@@ -1863,6 +2177,12 @@ _FUNCTION_INFO = { |
} |
+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. |
@@ -2135,19 +2455,15 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, |
file.Write(" void* next_cmd = cmd.Set(\n") |
file.Write(" &cmd") |
args = func.GetCmdArgs() |
- value = 11 |
- for arg in args: |
- file.Write(",\n static_cast<%s>(%d)" % (arg.type, value)) |
- value += 1 |
+ for value, arg in enumerate(args): |
+ file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11)) |
file.Write(");\n") |
- value = 11 |
file.Write(" EXPECT_EQ(static_cast<uint32>(%s::kCmdId),\n" % func.name) |
file.Write(" cmd.header.command);\n") |
func.type_handler.WriteCmdSizeTest(func, file) |
- for arg in args: |
+ for value, arg in enumerate(args): |
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" % |
- (arg.type, value, arg.name)) |
- value += 1 |
+ (arg.type, value + 11, arg.name)) |
file.Write(" CheckBytesWrittenMatchesExpectedSize(\n") |
file.Write(" next_cmd, sizeof(cmd));\n") |
file.Write("}\n") |
@@ -2241,15 +2557,11 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, |
test = self._remove_expected_call_re.sub('', test) |
name = func.name |
arg_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs(): |
+ for count, arg in enumerate(func.GetOriginalArgs()): |
arg_strings.append(arg.GetValidArg(func, count, 0)) |
- count += 1 |
gl_arg_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs(): |
+ for count, arg in enumerate(func.GetOriginalArgs()): |
gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) |
- count += 1 |
gl_func_name = func.GetGLTestFunctionName() |
vars = { |
'test_name': 'GLES2DecoderTest%d' % file.file_num, |
@@ -2263,27 +2575,22 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, |
def WriteInvalidUnitTest(self, func, file, test, extra = {}): |
"""Writes a invalid unit test.""" |
- arg_index = 0 |
- for arg in func.GetOriginalArgs(): |
+ 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 |
- count = 0 |
- for arg in func.GetOriginalArgs(): |
+ 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) |
- count += 1 |
gl_arg_strings = [] |
- count = 0 |
for arg in func.GetOriginalArgs(): |
gl_arg_strings.append("_") |
- count += 1 |
gl_func_name = func.GetGLTestFunctionName() |
gl_error_test = '' |
if not gl_error == None: |
@@ -2303,7 +2610,6 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, |
} |
vars.update(extra) |
file.Write(test % vars) |
- arg_index += 1 |
def WriteServiceUnitTest(self, func, file): |
"""Writes the service unit test for a command.""" |
@@ -2449,15 +2755,12 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
} |
""" |
cmd_arg_strings = [] |
- count = 0 |
- for arg in func.GetCmdArgs(): |
+ for count, arg in enumerate(func.GetCmdArgs()): |
cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) |
count += 1 |
gl_arg_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs(): |
+ for count, arg in enumerate(func.GetOriginalArgs()): |
gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) |
- count += 1 |
file.Write(code % { |
'name': func.name, |
'args': ", ".join(gl_arg_strings), |
@@ -2539,20 +2842,92 @@ class StateSetHandler(TypeHandler): |
def WriteHandlerImplementation(self, func, file): |
"""Overrriden from TypeHandler.""" |
- states = func.GetInfo('states') |
+ state_name = func.GetInfo('state') |
+ state = _STATES[state_name] |
+ states = state['states'] |
args = func.GetOriginalArgs() |
- ndx = 0 |
- for state in states: |
+ for ndx,state in enumerate(states): |
file.Write(" state_.%s = %s;\n" % (state['name'], args[ndx].name)) |
- ndx += 1 |
- state_flag = func.GetInfo('state_flag') |
- if state_flag: |
- file.Write(" %s = true;\n" % state_flag) |
+ if 'state_flag' in state: |
+ file.Write(" %s = true;\n" % state['state_flag']) |
if not func.GetInfo("no_gl"): |
file.Write(" %s(%s);\n" % |
(func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
+class StateSetRGBAlphaHandler(TypeHandler): |
+ """Handler for commands that simply set state that have rgb/alpha.""" |
+ |
+ def __init__(self): |
+ TypeHandler.__init__(self) |
+ |
+ def WriteHandlerImplementation(self, func, file): |
+ """Overrriden from TypeHandler.""" |
+ state_name = func.GetInfo('state') |
+ state = _STATES[state_name] |
+ states = state['states'] |
+ args = func.GetOriginalArgs() |
+ num_args = len(args) |
+ for ndx, item in enumerate(states): |
+ file.Write(" state_.%s = %s;\n" % |
+ (item['name'], args[ndx % num_args].name)) |
+ if 'state_flag' in state: |
+ file.Write(" %s = true;\n" % state['state_flag']) |
+ if not func.GetInfo("no_gl"): |
+ file.Write(" %s(%s);\n" % |
+ (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
+ |
+ |
+class StateSetFrontBackSeparateHandler(TypeHandler): |
+ """Handler for commands that simply set state that have front/back.""" |
+ |
+ def __init__(self): |
+ TypeHandler.__init__(self) |
+ |
+ def WriteHandlerImplementation(self, func, file): |
+ """Overrriden from TypeHandler.""" |
+ state_name = func.GetInfo('state') |
+ state = _STATES[state_name] |
+ states = state['states'] |
+ args = func.GetOriginalArgs() |
+ face = args[0].name |
+ num_args = len(args) |
+ for group_ndx, group in enumerate(Grouper(num_args - 1, states)): |
+ file.Write(" if (%s == %s || %s == GL_FRONT_AND_BACK) {\n" % |
+ (face, ('GL_FRONT', 'GL_BACK')[group_ndx], face)) |
+ for ndx, item in enumerate(group): |
+ file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx + 1].name)) |
+ file.Write(" }\n") |
+ if 'state_flag' in state: |
+ file.Write(" %s = true;\n" % state['state_flag']) |
+ if not func.GetInfo("no_gl"): |
+ file.Write(" %s(%s);\n" % |
+ (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
+ |
+ |
+class StateSetFrontBackHandler(TypeHandler): |
+ """Handler for commands that simply set state that set both front/back.""" |
+ |
+ def __init__(self): |
+ TypeHandler.__init__(self) |
+ |
+ def WriteHandlerImplementation(self, func, file): |
+ """Overrriden from TypeHandler.""" |
+ state_name = func.GetInfo('state') |
+ state = _STATES[state_name] |
+ states = state['states'] |
+ args = func.GetOriginalArgs() |
+ face = args[0].name |
+ num_args = len(args) |
+ for group_ndx, group in enumerate(Grouper(num_args, states)): |
+ for ndx, item in enumerate(group): |
+ file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx].name)) |
+ if 'state_flag' in state: |
+ file.Write(" %s = true;\n" % state['state_flag']) |
+ if not func.GetInfo("no_gl"): |
+ file.Write(" %s(%s);\n" % |
+ (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
+ |
class CustomHandler(TypeHandler): |
"""Handler for commands that are auto-generated but require minor tweaks.""" |
@@ -3725,16 +4100,12 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
} |
""" |
cmd_arg_strings = [] |
- count = 0 |
- for arg in func.GetCmdArgs()[0:-2]: |
+ for count, arg in enumerate(func.GetCmdArgs()[0:-2]): |
cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) |
- count += 1 |
cmd_arg_strings[0] = '123' |
gl_arg_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs()[0:-1]: |
+ for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): |
gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) |
- count += 1 |
gl_arg_strings[0] = '123' |
file.Write(code % { |
'name': func.name, |
@@ -3766,13 +4137,11 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { |
""" |
gl_arg_strings = [] |
valid_pname = '' |
- count = 0 |
- for arg in func.GetOriginalArgs()[:-1]: |
+ for count, arg in enumerate(func.GetOriginalArgs()[:-1]): |
arg_value = arg.GetValidGLArg(func, count, 0) |
gl_arg_strings.append(arg_value) |
if arg.name == 'pname': |
valid_pname = arg_value |
- count += 1 |
if func.GetInfo('gl_test_func') == 'glGetIntegerv': |
gl_arg_strings.append("_") |
else: |
@@ -3855,11 +4224,9 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { |
""" |
gl_arg_strings = [] |
gl_any_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs()[0:-1]: |
+ for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): |
gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) |
gl_any_strings.append("_") |
- count += 1 |
extra = { |
'data_type': func.GetInfo('data_type'), |
'data_count': func.GetInfo('count'), |
@@ -3933,15 +4300,11 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
} |
""" |
cmd_arg_strings = [] |
- count = 0 |
- for arg in func.GetCmdArgs()[0:-2]: |
+ for count, arg in enumerate(func.GetCmdArgs()[0:-2]): |
cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) |
- count += 1 |
gl_arg_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs()[0:-1]: |
+ for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): |
gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) |
- count += 1 |
file.Write(code % { |
'name': func.name, |
'type': func.GetInfo('data_type'), |
@@ -4034,22 +4397,18 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
file.Write(" void* next_cmd = cmd.Set(\n") |
file.Write(" &cmd") |
args = func.GetCmdArgs() |
- value = 11 |
- for arg in args: |
- file.Write(",\n static_cast<%s>(%d)" % (arg.type, value)) |
- value += 1 |
+ for value, arg in enumerate(args): |
+ file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11)) |
file.Write(",\n data);\n") |
args = func.GetCmdArgs() |
- value = 11 |
file.Write(" EXPECT_EQ(static_cast<uint32>(%s::kCmdId),\n" % func.name) |
file.Write(" cmd.header.command);\n") |
file.Write(" EXPECT_EQ(sizeof(cmd) +\n") |
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)),\n") |
file.Write(" cmd.header.size * 4u);\n") |
- for arg in args: |
+ for value, arg in enumerate(args): |
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" % |
- (arg.type, value, arg.name)) |
- value += 1 |
+ (arg.type, value + 11, arg.name)) |
file.Write(" CheckBytesWrittenMatchesExpectedSize(\n") |
file.Write(" next_cmd, sizeof(cmd) +\n") |
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n") |
@@ -4080,8 +4439,7 @@ TEST_F(%(test_name)s, %(name)sValidArgsCountTooLarge) { |
""" |
gl_arg_strings = [] |
arg_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs(): |
+ for count, arg in enumerate(func.GetOriginalArgs()): |
# hardcoded to match unit tests. |
if count == 0: |
# the location of the second element of the 2nd uniform. |
@@ -4096,7 +4454,6 @@ TEST_F(%(test_name)s, %(name)sValidArgsCountTooLarge) { |
else: |
gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) |
arg_strings.append(arg.GetValidArg(func, count, 0)) |
- count += 1 |
extra = { |
'gl_args': ", ".join(gl_arg_strings), |
'args': ", ".join(arg_strings), |
@@ -4123,12 +4480,10 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { |
gl_arg_strings = [] |
gl_any_strings = [] |
arg_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs()[0:-1]: |
+ for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): |
gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) |
gl_any_strings.append("_") |
arg_strings.append(arg.GetValidArg(func, count, 0)) |
- count += 1 |
extra = { |
'data_type': func.GetInfo('data_type'), |
'data_count': func.GetInfo('count'), |
@@ -4210,15 +4565,11 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
} |
""" |
cmd_arg_strings = [] |
- count = 0 |
- for arg in func.GetCmdArgs()[0:-2]: |
+ for count, arg in enumerate(func.GetCmdArgs()[0:-2]): |
cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) |
- count += 1 |
gl_arg_strings = [] |
- count = 0 |
- for arg in func.GetOriginalArgs()[0:-1]: |
+ for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): |
gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) |
- count += 1 |
file.Write(code % { |
'name': func.name, |
'type': func.GetInfo('data_type'), |
@@ -4315,20 +4666,16 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
file.Write(" void* next_cmd = cmd.Set(\n") |
file.Write(" &cmd") |
args = func.GetCmdArgs() |
- value = 1 |
- for arg in args: |
- file.Write(",\n static_cast<%s>(%d)" % (arg.type, value)) |
- value += 1 |
+ for value, arg in enumerate(args): |
+ file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 1)) |
file.Write(",\n data);\n") |
args = func.GetCmdArgs() |
- value = 1 |
file.Write(" EXPECT_EQ(static_cast<uint32>(%s::kCmdId),\n" % func.name) |
file.Write(" cmd.header.command);\n") |
file.Write(" EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);\n") |
- for arg in args: |
+ for value, arg in enumerate(args): |
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" % |
- (arg.type, value, arg.name)) |
- value += 1 |
+ (arg.type, value + 1, arg.name)) |
file.Write(" CheckBytesWrittenMatchesExpectedSize(\n") |
file.Write(" next_cmd, sizeof(cmd) +\n") |
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n") |
@@ -4476,15 +4823,11 @@ class GLcharHandler(CustomHandler): |
init_code = [] |
check_code = [] |
all_but_last_arg = func.GetCmdArgs()[:-1] |
- value = 11 |
- for arg in all_but_last_arg: |
- init_code.append(" static_cast<%s>(%d)," % (arg.type, value)) |
- value += 1 |
- value = 11 |
- for arg in all_but_last_arg: |
+ for value, arg in enumerate(all_but_last_arg): |
+ init_code.append(" static_cast<%s>(%d)," % (arg.type, value + 11)) |
+ for value, arg in enumerate(all_but_last_arg): |
check_code.append(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);" % |
- (arg.type, value, arg.name)) |
- value += 1 |
+ (arg.type, value + 11, arg.name)) |
code = """ |
TEST_F(GLES2FormatTest, %(func_name)s) { |
%(func_name)s& cmd = *GetBufferAs<%(func_name)s>(); |
@@ -5941,6 +6284,9 @@ class GLGenerator(object): |
'PUTn': PUTnHandler(), |
'PUTXn': PUTXnHandler(), |
'StateSet': StateSetHandler(), |
+ 'StateSetRGBAlpha': StateSetRGBAlphaHandler(), |
+ 'StateSetFrontBack': StateSetFrontBackHandler(), |
+ 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(), |
'STRn': STRnHandler(), |
'Todo': TodoHandler(), |
} |
@@ -6138,6 +6484,78 @@ class GLGenerator(object): |
file.Close() |
+ def WriteContextStateHeader(self, filename): |
+ """Writes the context state header.""" |
+ file = CHeaderWriter( |
+ filename, |
+ "// It is included by context_state.h\n") |
+ file.Write("struct EnableFlags {\n") |
+ file.Write(" EnableFlags();\n") |
+ for capability in _CAPABILITY_FLAGS: |
+ file.Write(" bool %s;\n" % capability['name']) |
+ file.Write("};\n\n") |
+ |
+ for state_name in sorted(_STATES.keys()): |
+ state = _STATES[state_name] |
+ for item in state['states']: |
+ file.Write("%s %s;\n" % (item['type'], item['name'])) |
+ file.Write("\n") |
+ |
+ file.Close() |
+ |
+ def WriteContextStateImpl(self, filename): |
+ """Writes the context state implementation.""" |
+ file = CHeaderWriter( |
+ filename, |
+ "// It is included by context_state.cc\n") |
+ code = [] |
+ for capability in _CAPABILITY_FLAGS: |
+ code.append("%s(%s)" % |
+ (capability['name'], |
+ ('false', 'true')['default' in capability])) |
+ file.Write("ContextState::EnableFlags::EnableFlags()\n : %s {\n}\n" % |
+ ",\n ".join(code)) |
+ file.Write("\n") |
+ |
+ file.Write("void ContextState::Initialize() {\n") |
+ for state_name in sorted(_STATES.keys()): |
+ state = _STATES[state_name] |
+ for item in state['states']: |
+ file.Write(" %s = %s;\n" % (item['name'], item['default'])) |
+ file.Write("}\n") |
+ |
+ file.Write(""" |
+void ContextState::InitCapabilities() { |
+""") |
+ for capability in _CAPABILITY_FLAGS: |
+ file.Write(" EnableDisable(GL_%s, enable_flags.%s);\n" % |
+ (capability['name'].upper(), capability['name'])) |
+ file.Write("""} |
+ |
+void ContextState::InitState() { |
+""") |
+ |
+ # We need to sort the keys so the expectations match |
+ for state_name in sorted(_STATES.keys()): |
+ state = _STATES[state_name] |
+ if state['type'] == 'FrontBack': |
+ num_states = len(state['states']) |
+ for ndx, group in enumerate(Grouper(num_states / 2, state['states'])): |
+ args = [] |
+ for item in group: |
+ args.append('%s' % item['name']) |
+ file.Write( |
+ " gl%s(%s, %s);\n" % |
+ (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args))) |
+ else: |
+ args = [] |
+ for item in state['states']: |
+ args.append('%s' % item['name']) |
+ file.Write(" gl%s(%s);\n" % (state['func'], ", ".join(args))) |
+ file.Write("}\n") |
+ |
+ file.Close() |
+ |
def WriteServiceImplementation(self, filename): |
"""Writes the service decorder implementation.""" |
file = CHeaderWriter( |
@@ -6150,6 +6568,77 @@ class GLGenerator(object): |
#if gen_cmd == True or gen_cmd == None: |
func.WriteServiceImplementation(file) |
+ file.Write(""" |
+bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { |
+ switch (cap) { |
+""") |
+ for capability in _CAPABILITY_FLAGS: |
+ file.Write(" case GL_%s:\n" % capability['name'].upper()) |
+ if 'state_flag' in capability: |
+ file.Write(""" if (state_.enable_flags.%(name)s != enabled) { |
+ state_.enable_flags.%(name)s = enabled; |
+ %(state_flag)s = true; |
+ } |
+ return false; |
+""" % capability) |
+ else: |
+ file.Write(""" state_.enable_flags.%(name)s = enabled; |
+ return true; |
+""" % capability) |
+ file.Write(""" default: |
+ NOTREACHED(); |
+ return false; |
+ } |
+} |
+ |
+bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { |
+ switch (cap) { |
+""") |
+ for capability in _CAPABILITY_FLAGS: |
+ file.Write(" case GL_%s:\n" % capability['name'].upper()) |
+ file.Write(" return state_.enable_flags.%s;\n" % |
+ capability['name']) |
+ file.Write(""" default: |
+ NOTREACHED(); |
+ return false; |
+ } |
+} |
+ |
+bool GLES2DecoderImpl::GetState( |
+ GLenum pname, GLint* params, GLsizei* num_written) { |
+ switch (pname) { |
+""") |
+ for state_name in _STATES.keys(): |
+ state = _STATES[state_name] |
+ if 'enum' in state: |
+ file.Write(" case %s:\n" % state['enum']) |
+ file.Write(" *num_written = %d;\n" % len(state['states'])) |
+ file.Write(" if (params) {\n") |
+ for ndx,item in enumerate(state['states']): |
+ file.Write(" params[%d] = state_.%s;\n" % (ndx, item['name'])) |
+ file.Write(" }\n") |
+ file.Write(" return true;\n") |
+ else: |
+ for item in state['states']: |
+ file.Write(" case %s:\n" % item['enum']) |
+ file.Write(" *num_written = 1;\n") |
+ file.Write(" if (params) {\n") |
+ file.Write(" params[0] = state_.%s;\n" % item['name']) |
+ file.Write(" }\n") |
+ file.Write(" return true;\n") |
+ for capability in _CAPABILITY_FLAGS: |
+ file.Write(" case GL_%s:\n" % capability['name'].upper()) |
+ file.Write(" *num_written = 1;\n") |
+ file.Write(" if (params) {\n") |
+ file.Write(" params[0] = state_.enable_flags.%s;\n" % |
+ capability['name']) |
+ file.Write(" }\n") |
+ file.Write(" return true;\n") |
+ file.Write(""" default: |
+ return false; |
+ } |
+} |
+""") |
file.Close() |
def WriteServiceUnitTests(self, filename): |
@@ -6178,6 +6667,52 @@ class GLGenerator(object): |
func.WriteServiceUnitTest(file) |
file.Close() |
+ file = CHeaderWriter( |
+ filename % 0, |
+ "// It is included by gles2_cmd_decoder_unittest_base.cc\n") |
+ file.Write( |
+"""void GLES2DecoderTestBase::SetupInitCapabilitiesExpectations() { |
+""") |
+ for capability in _CAPABILITY_FLAGS: |
+ file.Write(" ExpectEnableDisable(GL_%s, %s);\n" % |
+ (capability['name'].upper(), |
+ ('false', 'true')['default' in capability])) |
+ file.Write("""} |
+ |
+void GLES2DecoderTestBase::SetupInitStateExpectations() { |
+""") |
+ |
+ # We need to sort the keys so the expectations match |
+ for state_name in sorted(_STATES.keys()): |
+ state = _STATES[state_name] |
+ if state['type'] == 'FrontBack': |
+ num_states = len(state['states']) |
+ for ndx, group in enumerate(Grouper(num_states / 2, state['states'])): |
+ args = [] |
+ for item in group: |
+ if 'expected' in item: |
+ args.append(item['expected']) |
+ else: |
+ args.append(item['default']) |
+ file.Write( |
+ " EXPECT_CALL(*gl_, %s(%s, %s))\n" % |
+ (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args))) |
+ file.Write(" .Times(1)\n") |
+ file.Write(" .RetiresOnSaturation();\n") |
+ else: |
+ args = [] |
+ for item in state['states']: |
+ if 'expected' in item: |
+ args.append(item['expected']) |
+ else: |
+ args.append(item['default']) |
+ file.Write(" EXPECT_CALL(*gl_, %s(%s))\n" % |
+ (state['func'], ", ".join(args))) |
+ file.Write(" .Times(1)\n") |
+ file.Write(" .RetiresOnSaturation();\n") |
+ file.Write("""} |
+""") |
+ file.Close() |
def WriteGLES2CLibImplementation(self, filename): |
@@ -6274,10 +6809,8 @@ class GLGenerator(object): |
file.Write("Validators::Validators()\n") |
pre = ': ' |
post = ',' |
- count = 0 |
- for enum in enums: |
- count += 1 |
- if count == len(enums): |
+ for count, enum in enumerate(enums): |
+ if count + 1 == len(enums): |
post = ' {' |
if len(_ENUM_LISTS[enum]['valid']) > 0: |
code = """ %(pre)s%(name)s( |
@@ -6582,6 +7115,17 @@ def main(argv): |
(options, args) = parser.parse_args(args=argv) |
+ # Add in states and capabilites to GLState |
+ for state_name in sorted(_STATES.keys()): |
+ state = _STATES[state_name] |
+ if 'enum' in state: |
+ _ENUM_LISTS['GLState']['valid'].append(state['enum']) |
+ else: |
+ for item in state['states']: |
+ _ENUM_LISTS['GLState']['valid'].append(item['enum']) |
+ for capability in _CAPABILITY_FLAGS: |
+ _ENUM_LISTS['GLState']['valid'].append("GL_%s" % capability['name'].upper()) |
+ |
# This script lives under gpu/command_buffer, cd to base directory. |
os.chdir(os.path.dirname(__file__) + "/../..") |
@@ -6625,6 +7169,8 @@ def main(argv): |
gen.WriteGLES2CLibImplementation("client/gles2_c_lib_autogen.h") |
gen.WriteCmdHelperHeader("client/gles2_cmd_helper_autogen.h") |
gen.WriteServiceImplementation("service/gles2_cmd_decoder_autogen.h") |
+ gen.WriteContextStateHeader("service/context_state_autogen.h") |
+ gen.WriteContextStateImpl("service/context_state_impl_autogen.h") |
gen.WriteServiceUnitTests("service/gles2_cmd_decoder_unittest_%d_autogen.h") |
gen.WriteServiceUtilsHeader("service/gles2_cmd_validation_autogen.h") |
gen.WriteServiceUtilsImplementation( |