Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Unified Diff: gpu/command_buffer/build_gles2_cmd_buffer.py

Issue 11363191: Cache more GL state both service and client side. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | gpu/command_buffer/client/client_context_state.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(
« no previous file with comments | « no previous file | gpu/command_buffer/client/client_context_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698