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 66dc012fd24068bcd6de3005cecbdbcc5d596256..6720998d258605c89f98880ac01d2167c17786b5 100755 |
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py |
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py |
@@ -506,6 +506,36 @@ _STATES = { |
}, |
], |
}, |
+ 'MatrixValuesCHROMIUM': { |
+ 'type': 'NamedParameter', |
+ 'func': 'MatrixLoadfEXT', |
+ 'states': [ |
+ { 'enum': 'GL_PATH_MODELVIEW_MATRIX_CHROMIUM', |
+ 'enum_set': 'GL_PATH_MODELVIEW_CHROMIUM', |
+ 'name': 'modelview_matrix', |
+ 'type': 'GLfloat', |
+ 'default': [ |
+ '1.0f', '0.0f','0.0f','0.0f', |
+ '0.0f', '1.0f','0.0f','0.0f', |
+ '0.0f', '0.0f','1.0f','0.0f', |
+ '0.0f', '0.0f','0.0f','1.0f', |
+ ], |
+ 'extension_flag': 'chromium_path_rendering', |
+ }, |
+ { 'enum': 'GL_PATH_PROJECTION_MATRIX_CHROMIUM', |
+ 'enum_set': 'GL_PATH_PROJECTION_CHROMIUM', |
+ 'name': 'projection_matrix', |
+ 'type': 'GLfloat', |
+ 'default': [ |
+ '1.0f', '0.0f','0.0f','0.0f', |
+ '0.0f', '1.0f','0.0f','0.0f', |
+ '0.0f', '0.0f','1.0f','0.0f', |
+ '0.0f', '0.0f','0.0f','1.0f', |
+ ], |
+ 'extension_flag': 'chromium_path_rendering', |
+ }, |
+ ], |
+ }, |
} |
# Named type info object represents a named type that is used in OpenGL call |
@@ -839,6 +869,13 @@ _NAMED_TYPE_INFO = { |
'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE', |
], |
}, |
+ 'MatrixMode': { |
+ 'type': 'GLenum', |
+ 'valid': [ |
+ 'GL_PATH_PROJECTION_CHROMIUM', |
+ 'GL_PATH_MODELVIEW_CHROMIUM', |
+ ], |
+ }, |
'ProgramParameter': { |
'type': 'GLenum', |
'valid': [ |
@@ -2584,6 +2621,23 @@ _FUNCTION_INFO = { |
'extension': True, |
'chromium': True, |
}, |
+ 'MatrixLoadfCHROMIUM': { |
+ 'type': 'PUT', |
+ 'count': 16, |
+ 'data_type': 'GLfloat', |
+ 'decoder_func': 'DoMatrixLoadfCHROMIUM', |
+ 'gl_test_func': 'glMatrixLoadfEXT', |
+ 'chromium': True, |
+ 'extension': True, |
+ 'extension_flag': 'chromium_path_rendering', |
+ }, |
+ 'MatrixLoadIdentityCHROMIUM': { |
+ 'decoder_func': 'DoMatrixLoadIdentityCHROMIUM', |
+ 'gl_test_func': 'glMatrixLoadIdentityEXT', |
+ 'chromium': True, |
+ 'extension': True, |
+ 'extension_flag': 'chromium_path_rendering', |
+ }, |
} |
@@ -2653,6 +2707,29 @@ def ToCamelCase(input_string): |
"""converts ABC_underscore_case to ABCUnderscoreCase.""" |
return ''.join(w[0].upper() + w[1:] for w in input_string.split('_')) |
+def GetGLGetTypeConversion(result_type, value_type, value): |
+ """Makes a gl compatible type conversion string for accessing state variables. |
+ |
+ Useful when accessing state variables through glGetXXX calls. |
+ glGet documetation (for example, the manual pages): |
+ [...] If glGetIntegerv is called, [...] most floating-point values are |
+ rounded to the nearest integer value. [...] |
+ |
+ Args: |
+ result_type: the gl type to be obtained |
+ value_type: the GL type of the state variable |
+ value: the name of the state variable |
+ |
+ Returns: |
+ String that converts the state variable to desired GL type according to GL |
+ rules. |
+ """ |
+ |
+ if result_type == 'GLint': |
+ if value_type == 'GLfloat': |
+ return 'static_cast<GLint>(round(%s))' % value |
+ return 'static_cast<%s>(%s)' % (result_type, value) |
+ |
class CWriter(object): |
"""Writes to a file formatting it for Google's style guidelines.""" |
@@ -7468,9 +7545,19 @@ class GLGenerator(object): |
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'])) |
+ if isinstance(item['default'], list): |
+ file.Write("%s %s[%d];\n" % (item['type'], item['name'], |
+ len(item['default']))) |
+ else: |
+ file.Write("%s %s;\n" % (item['type'], item['name'])) |
+ |
if item.get('cached', False): |
- file.Write("%s cached_%s;\n" % (item['type'], item['name'])) |
+ if isinstance(item['default'], list): |
+ file.Write("%s cached_%s[%d];\n" % (item['type'], item['name'], |
+ len(item['default']))) |
+ else: |
+ file.Write("%s cached_%s;\n" % (item['type'], item['name'])) |
+ |
file.Write("\n") |
file.Write(""" |
@@ -7538,10 +7625,26 @@ bool %s::GetStateAs%s( |
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] = static_cast<%s>(%s);\n" % |
- (gl_type, item['name'])) |
+ if isinstance(item['default'], list): |
+ item_len = len(item['default']) |
+ file.Write(" *num_written = %d;\n" % item_len) |
+ file.Write(" if (params) {\n") |
+ if item['type'] == gl_type: |
+ file.Write(" memcpy(params, %s, sizeof(%s) * %d);\n" % |
+ (item['name'], item['type'], item_len)) |
+ else: |
+ file.Write(" for (size_t i = 0; i < %s; ++i) {\n" % |
+ item_len) |
+ file.Write(" params[i] = %s;\n" % |
+ (GetGLGetTypeConversion(gl_type, item['type'], |
+ "%s[i]" % item['name']))) |
+ file.Write(" }\n"); |
+ else: |
+ file.Write(" *num_written = 1;\n") |
+ file.Write(" if (params) {\n") |
+ file.Write(" params[0] = %s;\n" % |
+ (GetGLGetTypeConversion(gl_type, item['type'], |
+ item['name']))) |
file.Write(" }\n") |
file.Write(" return true;\n") |
for capability in _CAPABILITY_FLAGS: |
@@ -7580,9 +7683,17 @@ bool %s::GetStateAs%s( |
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'])) |
+ if isinstance(item['default'], list): |
+ for ndx, value in enumerate(item['default']): |
+ file.Write(" %s[%d] = %s;\n" % (item['name'], ndx, value)) |
+ else: |
+ file.Write(" %s = %s;\n" % (item['name'], item['default'])) |
if item.get('cached', False): |
- file.Write(" cached_%s = %s;\n" % (item['name'], item['default'])) |
+ if isinstance(item['default'], list): |
+ for ndx, value in enumerate(item['default']): |
+ file.Write(" cached_%s[%d] = %s;\n" % (item['name'], ndx, value)) |
+ else: |
+ file.Write(" cached_%s = %s;\n" % (item['name'], item['default'])) |
file.Write("}\n") |
file.Write(""" |
@@ -7636,13 +7747,28 @@ void ContextState::InitState(const ContextState *prev_state) const { |
item_name = CachedStateName(item) |
if 'extension_flag' in item: |
- file.Write(" if (feature_info_->feature_flags().%s)\n " % |
+ file.Write(" if (feature_info_->feature_flags().%s) {\n " % |
item['extension_flag']) |
if test_prev: |
- file.Write(" if (prev_state->%s != %s)\n" % |
- (item_name, item_name)) |
+ if isinstance(item['default'], list): |
+ file.Write(" if (memcmp(prev_state->%s, %s, " |
+ "sizeof(%s) * %d)) {\n" % |
+ (item_name, item_name, item['type'], |
+ len(item['default']))) |
+ else: |
+ file.Write(" if (prev_state->%s != %s) {\n " % |
+ (item_name, item_name)) |
file.Write(" gl%s(%s, %s);\n" % |
- (state['func'], item['enum'], item_name)) |
+ (state['func'], |
+ (item['enum_set'] |
+ if 'enum_set' in item else item['enum']), |
+ item['name'])) |
+ if test_prev: |
+ if 'extension_flag' in item: |
+ file.Write(" ") |
+ file.Write(" }") |
+ if 'extension_flag' in item: |
+ file.Write(" }") |
else: |
if 'extension_flag' in state: |
file.Write(" if (feature_info_->feature_flags().%s)\n " % |
@@ -7667,7 +7793,6 @@ void ContextState::InitState(const ContextState *prev_state) const { |
file.Write(" } else {") |
WriteStates(False) |
file.Write(" }") |
- |
file.Write("}\n") |
file.Write("""bool ContextState::GetEnabled(GLenum cap) const { |
@@ -7854,10 +7979,17 @@ void GLES2DecoderTestBase::SetupInitStateExpectations() { |
file.Write(" if (group_->feature_info()->feature_flags().%s) {\n" % |
item['extension_flag']) |
file.Write(" ") |
+ expect_value = item['default'] |
+ if isinstance(expect_value, list): |
+ # TODO: Currently we do not check array values. |
+ expect_value = "_" |
file.Write( |
" EXPECT_CALL(*gl_, %s(%s, %s))\n" % |
- (state['func'], item['enum'], item['default'])) |
+ (state['func'], |
+ (item['enum_set'] |
+ if 'enum_set' in item else item['enum']), |
+ expect_value)) |
file.Write(" .Times(1)\n") |
file.Write(" .RetiresOnSaturation();\n") |
if 'extension_flag' in item: |
@@ -7873,6 +8005,8 @@ void GLES2DecoderTestBase::SetupInitStateExpectations() { |
args.append(item['expected']) |
else: |
args.append(item['default']) |
+ # TODO: Currently we do not check array values. |
+ args = ["_" if isinstance(arg, list) else arg for arg in args] |
file.Write(" EXPECT_CALL(*gl_, %s(%s))\n" % |
(state['func'], ", ".join(args))) |
file.Write(" .Times(1)\n") |
@@ -8352,6 +8486,8 @@ def main(argv): |
gl_state_valid = _NAMED_TYPE_INFO['GLState']['valid'] |
for state_name in sorted(_STATES.keys()): |
state = _STATES[state_name] |
+ if 'extension_flag' in state: |
+ continue |
if 'enum' in state: |
if not state['enum'] in gl_state_valid: |
gl_state_valid.append(state['enum']) |