| 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 1441fa3c64de1842c132c9916b81fe8623f2ae0c..59f1ba2f4f0ed9845775945cc9eef237ab30dcc2 100755
|
| --- a/gpu/command_buffer/build_gles2_cmd_buffer.py
|
| +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
|
| @@ -67,7 +67,7 @@ _CAPABILITY_FLAGS = [
|
| {'name': 'polygon_offset_fill'},
|
| {'name': 'sample_alpha_to_coverage'},
|
| {'name': 'sample_coverage'},
|
| - {'name': 'scissor_test'},
|
| + {'name': 'scissor_test', 'state_flag': 'clear_state_dirty_'},
|
| {'name': 'stencil_test', 'state_flag': 'clear_state_dirty_'},
|
| ]
|
|
|
| @@ -1211,6 +1211,9 @@ _FUNCTION_INFO = {
|
| 'state': 'ClearDepthf',
|
| 'decoder_func': 'glClearDepth',
|
| 'gl_test_func': 'glClearDepth',
|
| + 'valid_args': {
|
| + '0': '0.5f'
|
| + },
|
| },
|
| 'ColorMask': {
|
| 'type': 'StateSet',
|
| @@ -1275,10 +1278,16 @@ _FUNCTION_INFO = {
|
| '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',
|
| @@ -1290,26 +1299,38 @@ _FUNCTION_INFO = {
|
| },
|
| 'SampleCoverage': {'decoder_func': 'DoSampleCoverage'},
|
| 'StencilFunc': {
|
| - 'type': 'StencilFrontBack',
|
| + 'type': 'StateSetFrontBack',
|
| 'state': 'StencilFunc',
|
| },
|
| 'StencilFuncSeparate': {
|
| - 'type': 'StencilFrontBack',
|
| + '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': {'decoder_func': 'DoHint'},
|
| 'CullFace': {'type': 'StateSet', 'state': 'CullFace'},
|
| 'FrontFace': {'type': 'StateSet', 'state': 'FrontFace'},
|
| 'DepthFunc': {'type': 'StateSet', 'state': 'DepthFunc'},
|
| - 'LineWidth': {'type': 'StateSet', 'state': 'LineWidth'},
|
| + 'LineWidth': {
|
| + 'type': 'StateSet',
|
| + 'state': 'LineWidth',
|
| + 'valid_args': {
|
| + '0': '0.5f'
|
| + },
|
| + },
|
| 'PolygonOffset': {
|
| 'type': 'StateSet',
|
| 'state': 'PolygonOffset',
|
| @@ -1362,6 +1383,7 @@ _FUNCTION_INFO = {
|
| 'Disable': {
|
| 'decoder_func': 'DoDisable',
|
| 'impl_func': False,
|
| + 'client_test': False,
|
| },
|
| 'DisableVertexAttribArray': {
|
| 'decoder_func': 'DoDisableVertexAttribArray',
|
| @@ -1380,6 +1402,7 @@ _FUNCTION_INFO = {
|
| 'Enable': {
|
| 'decoder_func': 'DoEnable',
|
| 'impl_func': False,
|
| + 'client_test': False,
|
| },
|
| 'EnableVertexAttribArray': {
|
| 'decoder_func': 'DoEnableVertexAttribArray',
|
| @@ -1936,7 +1959,11 @@ _FUNCTION_INFO = {
|
| 'client_test': False,
|
| 'pepper_interface': 'ChromiumMapSub',
|
| },
|
| - 'UseProgram': {'decoder_func': 'DoUseProgram', 'unit_test': False},
|
| + 'UseProgram': {
|
| + 'decoder_func': 'DoUseProgram',
|
| + 'impl_func': False,
|
| + 'unit_test': False,
|
| + },
|
| 'ValidateProgram': {'decoder_func': 'DoValidateProgram'},
|
| 'VertexAttrib1f': {'decoder_func': 'DoVertexAttrib1f'},
|
| 'VertexAttrib1fv': {
|
| @@ -2850,13 +2877,18 @@ class StateSetHandler(TypeHandler):
|
| state = _STATES[state_name]
|
| states = state['states']
|
| args = func.GetOriginalArgs()
|
| + code = []
|
| + for ndx,item in enumerate(states):
|
| + code.append("state_.%s != %s" % (item['name'], args[ndx].name))
|
| + file.Write(" if (%s) {\n" % " ||\n ".join(code))
|
| for ndx,item in enumerate(states):
|
| - file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx].name))
|
| + file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx].name))
|
| if 'state_flag' in state:
|
| - file.Write(" %s = true;\n" % state['state_flag'])
|
| + file.Write(" %s = true;\n" % state['state_flag'])
|
| if not func.GetInfo("no_gl"):
|
| - file.Write(" %s(%s);\n" %
|
| + file.Write(" %s(%s);\n" %
|
| (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
|
| + file.Write(" }\n")
|
|
|
|
|
| class StateSetRGBAlphaHandler(TypeHandler):
|
| @@ -2872,14 +2904,19 @@ class StateSetRGBAlphaHandler(TypeHandler):
|
| states = state['states']
|
| args = func.GetOriginalArgs()
|
| num_args = len(args)
|
| - for ndx, item in enumerate(states):
|
| - file.Write(" state_.%s = %s;\n" %
|
| + code = []
|
| + for ndx,item in enumerate(states):
|
| + code.append("state_.%s != %s" % (item['name'], args[ndx % num_args].name))
|
| + file.Write(" if (%s) {\n" % " ||\n ".join(code))
|
| + 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'])
|
| + file.Write(" %s = true;\n" % state['state_flag'])
|
| if not func.GetInfo("no_gl"):
|
| - file.Write(" %s(%s);\n" %
|
| + file.Write(" %s(%s);\n" %
|
| (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
|
| + file.Write(" }\n")
|
|
|
|
|
| class StateSetFrontBackSeparateHandler(TypeHandler):
|
| @@ -2896,17 +2933,29 @@ class StateSetFrontBackSeparateHandler(TypeHandler):
|
| args = func.GetOriginalArgs()
|
| face = args[0].name
|
| num_args = len(args)
|
| + file.Write(" bool changed = false;\n")
|
| 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))
|
| + code = []
|
| for ndx, item in enumerate(group):
|
| - file.Write(" state_.%s = %s;\n" % (item['name'], args[ndx + 1].name))
|
| + code.append("state_.%s != %s" % (item['name'], args[ndx + 1].name))
|
| + file.Write(" changed |= %s;\n" % " ||\n ".join(code))
|
| file.Write(" }\n")
|
| + file.Write(" if (changed) {\n")
|
| + 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'])
|
| + file.Write(" %s = true;\n" % state['state_flag'])
|
| if not func.GetInfo("no_gl"):
|
| - file.Write(" %s(%s);\n" %
|
| + file.Write(" %s(%s);\n" %
|
| (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
|
| + file.Write(" }\n")
|
|
|
|
|
| class StateSetFrontBackHandler(TypeHandler):
|
| @@ -2921,16 +2970,22 @@ class StateSetFrontBackHandler(TypeHandler):
|
| state = _STATES[state_name]
|
| states = state['states']
|
| args = func.GetOriginalArgs()
|
| - face = args[0].name
|
| num_args = len(args)
|
| + code = []
|
| 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))
|
| + code.append("state_.%s != %s" % (item['name'], args[ndx].name))
|
| + file.Write(" if (%s) {\n" % " ||\n ".join(code))
|
| + 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'])
|
| + file.Write(" %s = true;\n" % state['state_flag'])
|
| if not func.GetInfo("no_gl"):
|
| - file.Write(" %s(%s);\n" %
|
| + file.Write(" %s(%s);\n" %
|
| (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
|
| + file.Write(" }\n")
|
| +
|
|
|
| class CustomHandler(TypeHandler):
|
| """Handler for commands that are auto-generated but require minor tweaks."""
|
| @@ -3376,8 +3431,9 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
|
| SetGLError(GL_INVALID_OPERATION, "%(name)s\", \"%(id)s reserved id");
|
| return;
|
| }
|
| - Bind%(type)sHelper(%(arg_string)s);
|
| - helper_->%(name)s(%(arg_string)s);
|
| + if (Bind%(type)sHelper(%(arg_string)s)) {
|
| + helper_->%(name)s(%(arg_string)s);
|
| + }
|
| }
|
|
|
| """
|
| @@ -3397,6 +3453,36 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
|
| 'lc_type': name_arg.resource_type.lower(),
|
| })
|
|
|
| + def WriteGLES2ImplementationUnitTest(self, func, file):
|
| + """Overrriden from TypeHandler."""
|
| + code = """
|
| +TEST_F(GLES2ImplementationTest, %(name)s) {
|
| + struct Cmds {
|
| + %(name)s cmd;
|
| + };
|
| + Cmds expected;
|
| + expected.cmd.Init(%(cmd_args)s);
|
| +
|
| + gl_->%(name)s(%(args)s);
|
| + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
|
| + ClearCommands();
|
| + gl_->%(name)s(%(args)s);
|
| + EXPECT_TRUE(NoCommandsWritten());
|
| +}
|
| +"""
|
| + cmd_arg_strings = []
|
| + for count, arg in enumerate(func.GetCmdArgs()):
|
| + cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0))
|
| + count += 1
|
| + gl_arg_strings = []
|
| + for count, arg in enumerate(func.GetOriginalArgs()):
|
| + gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0))
|
| + file.Write(code % {
|
| + 'name': func.name,
|
| + 'args': ", ".join(gl_arg_strings),
|
| + 'cmd_args': ", ".join(cmd_arg_strings),
|
| + })
|
| +
|
|
|
| class GENnHandler(TypeHandler):
|
| """Handler for glGen___ type functions."""
|
| @@ -6313,8 +6399,11 @@ class GLGenerator(object):
|
|
|
| def GetTypeHandler(self, name):
|
| """Gets a type info for the given type."""
|
| - if name in self._type_handlers:
|
| - return self._type_handlers[name]
|
| + if len(name):
|
| + if name in self._type_handlers:
|
| + return self._type_handlers[name]
|
| + else:
|
| + raise KeyError("no such type handler: %s" % name)
|
| return self._empty_type_handler
|
|
|
| def GetFunctionInfo(self, name):
|
| @@ -6488,8 +6577,8 @@ class GLGenerator(object):
|
|
|
| file.Close()
|
|
|
| - def WriteContextStateHeader(self, filename):
|
| - """Writes the context state header."""
|
| + def WriteServiceContextStateHeader(self, filename):
|
| + """Writes the service context state header."""
|
| file = CHeaderWriter(
|
| filename,
|
| "// It is included by context_state.h\n")
|
| @@ -6507,8 +6596,64 @@ class GLGenerator(object):
|
|
|
| file.Close()
|
|
|
| - def WriteContextStateImpl(self, filename):
|
| - """Writes the context state implementation."""
|
| + def WriteClientContextStateHeader(self, filename):
|
| + """Writes the client context state header."""
|
| + file = CHeaderWriter(
|
| + filename,
|
| + "// It is included by client_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")
|
| +
|
| + file.Close()
|
| +
|
| + def WriteContextStateGetters(self, file, class_name):
|
| + """Writes the state getters."""
|
| + for gl_type in ["GLint", "GLfloat"]:
|
| + file.Write("""
|
| +bool %s::GetStateAs%s(
|
| + GLenum pname, %s* params, GLsizei* num_written) const {
|
| + switch (pname) {
|
| +""" % (class_name, gl_type, gl_type))
|
| + 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] = static_cast<%s>(%s);\n" %
|
| + (ndx, gl_type, 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] = static_cast<%s>(%s);\n" %
|
| + (gl_type, 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] = static_cast<%s>(enable_flags.%s);\n" %
|
| + (gl_type, capability['name']))
|
| + file.Write(" }\n")
|
| + file.Write(" return true;\n")
|
| + file.Write(""" default:
|
| + return false;
|
| + }
|
| +}
|
| +""")
|
| +
|
| + def WriteServiceContextStateImpl(self, filename):
|
| + """Writes the context state service implementation."""
|
| file = CHeaderWriter(
|
| filename,
|
| "// It is included by context_state.cc\n")
|
| @@ -6558,6 +6703,69 @@ void ContextState::InitState() const {
|
| file.Write(" gl%s(%s);\n" % (state['func'], ", ".join(args)))
|
| file.Write("}\n")
|
|
|
| + file.Write("""bool ContextState::GetEnabled(GLenum cap) const {
|
| + switch (cap) {
|
| +""")
|
| + for capability in _CAPABILITY_FLAGS:
|
| + file.Write(" case GL_%s:\n" % capability['name'].upper())
|
| + file.Write(" return enable_flags.%s;\n" % capability['name'])
|
| + file.Write(""" default:
|
| + GPU_NOTREACHED();
|
| + return false;
|
| + }
|
| +}
|
| +""")
|
| +
|
| + self.WriteContextStateGetters(file, "ContextState")
|
| + file.Close()
|
| +
|
| + def WriteClientContextStateImpl(self, filename):
|
| + """Writes the context state client side implementation."""
|
| + file = CHeaderWriter(
|
| + filename,
|
| + "// It is included by client_context_state.cc\n")
|
| + code = []
|
| + for capability in _CAPABILITY_FLAGS:
|
| + code.append("%s(%s)" %
|
| + (capability['name'],
|
| + ('false', 'true')['default' in capability]))
|
| + file.Write(
|
| + "ClientContextState::EnableFlags::EnableFlags()\n : %s {\n}\n" %
|
| + ",\n ".join(code))
|
| + file.Write("\n")
|
| +
|
| + file.Write("""
|
| +bool ClientContextState::SetCapabilityState(
|
| + GLenum cap, bool enabled, bool* changed) {
|
| + *changed = false;
|
| + switch (cap) {
|
| +""")
|
| + for capability in _CAPABILITY_FLAGS:
|
| + file.Write(" case GL_%s:\n" % capability['name'].upper())
|
| + file.Write(""" if (enable_flags.%(name)s != enabled) {
|
| + *changed = true;
|
| + enable_flags.%(name)s = enabled;
|
| + }
|
| + return true;
|
| +""" % capability)
|
| + file.Write(""" default:
|
| + return false;
|
| + }
|
| +}
|
| +""")
|
| + file.Write("""bool ClientContextState::GetEnabled(
|
| + GLenum cap, bool* enabled) const {
|
| + switch (cap) {
|
| +""")
|
| + for capability in _CAPABILITY_FLAGS:
|
| + file.Write(" case GL_%s:\n" % capability['name'].upper())
|
| + file.Write(" *enabled = enable_flags.%s;\n" % capability['name'])
|
| + file.Write(" return true;\n")
|
| + file.Write(""" default:
|
| + return false;
|
| + }
|
| +}
|
| +""")
|
| file.Close()
|
|
|
| def WriteServiceImplementation(self, filename):
|
| @@ -6594,59 +6802,6 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
|
| 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;
|
| - }
|
| -}
|
| -""")
|
| - for gl_type in ["GLint", "GLfloat"]:
|
| - file.Write("""
|
| -bool GLES2DecoderImpl::GetStateAs%s(
|
| - GLenum pname, %s* params, GLsizei* num_written) {
|
| - switch (pname) {
|
| -""" % (gl_type, gl_type))
|
| - 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] = static_cast<%s>(state_.%s);\n" %
|
| - (ndx, gl_type, 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] = static_cast<%s>(state_.%s);\n" %
|
| - (gl_type, 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] = static_cast<%s>("
|
| - "state_.enable_flags.%s);\n" %
|
| - (gl_type, capability['name']))
|
| - file.Write(" }\n")
|
| - file.Write(" return true;\n")
|
| - file.Write(""" default:
|
| - return false;
|
| - }
|
| -}
|
| """)
|
| file.Close()
|
|
|
| @@ -7178,8 +7333,11 @@ 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.WriteServiceContextStateHeader("service/context_state_autogen.h")
|
| + gen.WriteServiceContextStateImpl("service/context_state_impl_autogen.h")
|
| + gen.WriteClientContextStateHeader("client/client_context_state_autogen.h")
|
| + gen.WriteClientContextStateImpl(
|
| + "client/client_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(
|
|
|