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

Unified Diff: gpu/command_buffer/build_gles2_cmd_buffer.py

Issue 2012533004: Add generated and hand-written passthrough command handlers with stub Doers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 6 months 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/common/buffer.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 9dd258d209dad4b7cf650a588b768dcc13182ebe..9310f7c2f2a281079051eaf40ce640aa4195bd06 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -4967,11 +4967,8 @@ static_assert(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
(void)c;
""" % {'name': func.name})
- def WriteServiceImplementation(self, func, f):
- """Writes the service implementation for a command."""
- self.WriteServiceHandlerFunctionHeader(func, f)
- self.WriteHandlerExtensionCheck(func, f)
- self.WriteHandlerDeferReadWrite(func, f);
+ def WriteServiceHandlerArgGetCode(self, func, f):
+ """Writes the argument unpack code for service handlers."""
if len(func.GetOriginalArgs()) > 0:
last_arg = func.GetLastOriginalArg()
all_but_last_arg = func.GetOriginalArgs()[:-1]
@@ -4979,6 +4976,25 @@ static_assert(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
arg.WriteGetCode(f)
self.WriteGetDataSizeCode(func, f)
last_arg.WriteGetCode(f)
+
+ def WriteImmediateServiceHandlerArgGetCode(self, func, f):
+ """Writes the argument unpack code for immediate service handlers."""
+ for arg in func.GetOriginalArgs():
+ if arg.IsPointer():
+ self.WriteGetDataSizeCode(func, f)
+ arg.WriteGetCode(f)
+
+ def WriteBucketServiceHandlerArgGetCode(self, func, f):
+ """Writes the argument unpack code for bucket service handlers."""
+ for arg in func.GetCmdArgs():
+ arg.WriteGetCode(f)
+
+ def WriteServiceImplementation(self, func, f):
+ """Writes the service implementation for a command."""
+ self.WriteServiceHandlerFunctionHeader(func, f)
+ self.WriteHandlerExtensionCheck(func, f)
+ self.WriteHandlerDeferReadWrite(func, f);
+ self.WriteServiceHandlerArgGetCode(func, f)
func.WriteHandlerValidation(f)
func.WriteHandlerImplementation(f)
f.write(" return error::kNoError;\n")
@@ -4990,10 +5006,7 @@ static_assert(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
self.WriteServiceHandlerFunctionHeader(func, f)
self.WriteHandlerExtensionCheck(func, f)
self.WriteHandlerDeferReadWrite(func, f);
- for arg in func.GetOriginalArgs():
- if arg.IsPointer():
- self.WriteGetDataSizeCode(func, f)
- arg.WriteGetCode(f)
+ self.WriteImmediateServiceHandlerArgGetCode(func, f)
func.WriteHandlerValidation(f)
func.WriteHandlerImplementation(f)
f.write(" return error::kNoError;\n")
@@ -5005,14 +5018,58 @@ static_assert(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
self.WriteServiceHandlerFunctionHeader(func, f)
self.WriteHandlerExtensionCheck(func, f)
self.WriteHandlerDeferReadWrite(func, f);
- for arg in func.GetCmdArgs():
- arg.WriteGetCode(f)
+ self.WriteBucketServiceHandlerArgGetCode(func, f)
func.WriteHandlerValidation(f)
func.WriteHandlerImplementation(f)
f.write(" return error::kNoError;\n")
f.write("}\n")
f.write("\n")
+ def WritePassthroughServiceFunctionHeader(self, func, f):
+ """Writes function header for service passthrough handlers."""
+ f.write("""error::Error GLES2DecoderPassthroughImpl::Handle%(name)s(
+ uint32_t immediate_data_size, const void* cmd_data) {
+ """ % {'name': func.name})
+ f.write("""const gles2::cmds::%(name)s& c =
+ *static_cast<const gles2::cmds::%(name)s*>(cmd_data);
+ (void)c;
+ """ % {'name': func.name})
+
+ def WritePassthroughServiceFunctionDoerCall(self, func, f):
+ """Writes the function call to the passthrough service doer."""
+ f.write(""" error::Error error = Do%(name)s(%(args)s);
+ if (error != error::kNoError) {
+ return error;
+ }""" % {'name': func.original_name,
+ 'args': func.MakePassthroughServiceDoerArgString("")})
+
+ def WritePassthroughServiceImplementation(self, func, f):
+ """Writes the service implementation for a command."""
+ self.WritePassthroughServiceFunctionHeader(func, f)
+ self.WriteServiceHandlerArgGetCode(func, f)
+ self.WritePassthroughServiceFunctionDoerCall(func, f)
+ f.write(" return error::kNoError;\n")
+ f.write("}\n")
+ f.write("\n")
+
+ def WritePassthroughImmediateServiceImplementation(self, func, f):
+ """Writes the service implementation for a command."""
+ self.WritePassthroughServiceFunctionHeader(func, f)
+ self.WriteImmediateServiceHandlerArgGetCode(func, f)
+ self.WritePassthroughServiceFunctionDoerCall(func, f)
+ f.write(" return error::kNoError;\n")
+ f.write("}\n")
+ f.write("\n")
+
+ def WritePassthroughBucketServiceImplementation(self, func, f):
+ """Writes the service implementation for a command."""
+ self.WritePassthroughServiceFunctionHeader(func, f)
+ self.WriteBucketServiceHandlerArgGetCode(func, f)
+ self.WritePassthroughServiceFunctionDoerCall(func, f)
+ f.write(" return error::kNoError;\n")
+ f.write("}\n")
+ f.write("\n")
+
def WriteHandlerExtensionCheck(self, func, f):
if func.GetInfo('extension_flag'):
f.write(" if (!features().%s) {\n" % func.GetInfo('extension_flag'))
@@ -5649,6 +5706,18 @@ class CustomHandler(TypeHandler):
"""Overrriden from TypeHandler."""
pass
+ def WritePassthroughServiceImplementation(self, func, f):
+ """Overrriden from TypeHandler."""
+ pass
+
+ def WritePassthroughImmediateServiceImplementation(self, func, f):
+ """Overrriden from TypeHandler."""
+ pass
+
+ def WritePassthroughBucketServiceImplementation(self, func, f):
+ """Overrriden from TypeHandler."""
+ pass
+
def WriteServiceUnitTest(self, func, f, *extras):
"""Overrriden from TypeHandler."""
pass
@@ -5891,6 +5960,11 @@ class DataHandler(TypeHandler):
(not func.name == 'CompressedTexSubImage3DBucket')):
TypeHandler.WriteBucketServiceImplemenation(self, func, f)
+ def WritePassthroughBucketServiceImplementation(self, func, f):
+ """Overrriden from TypeHandler."""
+ if ((not func.name == 'CompressedTexSubImage2DBucket') and
+ (not func.name == 'CompressedTexSubImage3DBucket')):
+ TypeHandler.WritePassthroughBucketServiceImplementation(self, func, f)
class BindHandler(TypeHandler):
"""Handler for glBind___ type functions."""
@@ -6488,6 +6562,9 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
f.write("}\n")
f.write("\n")
+ def WritePassthroughServiceImplementation(self, func, f):
+ """Overrriden from TypeHandler."""
+ pass
class DeleteHandler(TypeHandler):
"""Handler for glDelete___ single resource type functions."""
@@ -6784,6 +6861,19 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) {
class GETnHandler(TypeHandler):
"""Handler for GETn for glGetBooleanv, glGetFloatv, ... type functions."""
+ def InitFunction(self, func):
+ """Overrriden from TypeHandler."""
+ TypeHandler.InitFunction(self, func)
+
+ if func.name == 'GetSynciv':
+ return
+
+ arg_insert_point = len(func.passthrough_service_doer_args) - 1;
+ func.passthrough_service_doer_args.insert(
+ arg_insert_point, Argument('length', 'GLsizei*'))
+ func.passthrough_service_doer_args.insert(
+ arg_insert_point, Argument('bufsize', 'GLsizei'))
+
def NeedsDataTransferFunction(self, func):
"""Overriden from TypeHandler."""
return False
@@ -6837,6 +6927,46 @@ class GETnHandler(TypeHandler):
"""
f.write(code % {'func_name': func.name})
+ def WritePassthroughServiceImplementation(self, func, f):
+ """Overrriden from TypeHandler."""
+ self.WritePassthroughServiceFunctionHeader(func, f)
+ last_arg = func.GetLastOriginalArg()
+ # All except shm_id and shm_offset.
+ all_but_last_args = func.GetCmdArgs()[:-2]
+ for arg in all_but_last_args:
+ arg.WriteGetCode(f)
+
+ code = """ unsigned int buffer_size = 0;
+ typedef cmds::%(func_name)s::Result Result;
+ Result* result = GetSharedMemoryAndSizeAs<Result*>(
+ c.%(last_arg_name)s_shm_id, c.%(last_arg_name)s_shm_offset,
+ &buffer_size);
+ %(last_arg_type)s %(last_arg_name)s = result ? result->GetData() : NULL;
+ if (%(last_arg_name)s == NULL) {
+ return error::kOutOfBounds;
+ }
+ GLsizei bufsize = Result::ComputeMaxResults(buffer_size);
+ GLsizei written_values = 0;
+ GLsizei* length = &written_values;
+"""
+ f.write(code % {
+ 'last_arg_type': last_arg.type,
+ 'last_arg_name': last_arg.name,
+ 'func_name': func.name,
+ })
+
+ self.WritePassthroughServiceFunctionDoerCall(func, f)
+
+ code = """ if (written_values > bufsize) {
+ return error::kOutOfBounds;
+ }
+ result->SetNumResults(written_values);
+ return error::kNoError;
+}
+
+"""
+ f.write(code % {'func_name': func.name})
+
def WriteGLES2Implementation(self, func, f):
"""Overrriden from TypeHandler."""
impl_decl = func.GetInfo('impl_decl')
@@ -8273,6 +8403,7 @@ class IsHandler(TypeHandler):
func.AddCmdArg(Argument("result_shm_offset", 'uint32_t'))
if func.GetInfo('result') == None:
func.AddInfo('result', ['uint32_t'])
+ func.passthrough_service_doer_args.append(Argument('result', 'uint32_t*'))
def WriteServiceUnitTest(self, func, f, *extras):
"""Overrriden from TypeHandler."""
@@ -8361,6 +8492,24 @@ TEST_P(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) {
f.write("}\n")
f.write("\n")
+ def WritePassthroughServiceImplementation(self, func, f):
+ """Overrriden from TypeHandler."""
+ self.WritePassthroughServiceFunctionHeader(func, f)
+ self.WriteServiceHandlerArgGetCode(func, f)
+
+ code = """ typedef cmds::%(func_name)s::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>(
+ c.result_shm_id, c.result_shm_offset, sizeof(*result));
+ if (!result) {
+ return error::kOutOfBounds;
+ }
+"""
+ f.write(code % {'func_name': func.name})
+ self.WritePassthroughServiceFunctionDoerCall(func, f)
+ f.write(" return error::kNoError;\n")
+ f.write("}\n")
+ f.write("\n")
+
def WriteGLES2Implementation(self, func, f):
"""Overrriden from TypeHandler."""
impl_func = func.GetInfo('impl_func')
@@ -8550,6 +8699,10 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) {
"""Overrriden from TypeHandler."""
pass
+ def WritePassthroughServiceImplementation(self, func, f):
+ """Overrriden from TypeHandler."""
+ pass
+
class NamedType(object):
"""A class that represents a type of an argument in a client function.
@@ -9385,6 +9538,8 @@ class Function(object):
else:
self.args_for_cmds = self.original_args[:]
+ self.passthrough_service_doer_args = self.original_args[:]
+
self.return_type = info['return_type']
if self.return_type != 'void':
self.return_arg = CreateArg(info['return_type'] + " result")
@@ -9542,6 +9697,10 @@ class Function(object):
"""Gets the original arguments to this function."""
return self.original_args
+ def GetPassthroughServiceDoerArgs(self):
+ """Gets the original arguments to this function."""
+ return self.passthrough_service_doer_args
+
def GetLastOriginalArg(self):
"""Gets the last original argument to this function."""
return self.original_args[len(self.original_args) - 1]
@@ -9576,6 +9735,15 @@ class Function(object):
["%s%s" % (prefix, arg.name) for arg in args])
return self._MaybePrependComma(arg_string, add_comma)
+ def MakePassthroughServiceDoerArgString(self, prefix, add_comma = False,
+ separator = ", "):
+ """Gets the list of arguments as they are in used by the passthrough
+ service doer function."""
+ args = self.GetPassthroughServiceDoerArgs()
+ arg_string = separator.join(
+ ["%s%s" % (prefix, arg.name) for arg in args])
+ return self._MaybePrependComma(arg_string, add_comma)
+
def MakeHelperArgString(self, prefix, add_comma = False, separator = ", "):
"""Gets a list of GL arguments after removing unneeded arguments."""
args = self.GetOriginalArgs()
@@ -9749,6 +9917,10 @@ class Function(object):
"""Writes the service implementation for a command."""
self.type_handler.WriteServiceImplementation(self, f)
+ def WritePassthroughServiceImplementation(self, f):
+ """Writes the service implementation for a command."""
+ self.type_handler.WritePassthroughServiceImplementation(self, f)
+
def WriteServiceUnitTest(self, f, *extras):
"""Writes the service implementation for a command."""
self.type_handler.WriteServiceUnitTest(self, f, *extras)
@@ -9865,6 +10037,10 @@ class ImmediateFunction(Function):
"""Overridden from Function"""
self.type_handler.WriteImmediateServiceImplementation(self, f)
+ def WritePassthroughServiceImplementation(self, f):
+ """Overridden from Function"""
+ self.type_handler.WritePassthroughImmediateServiceImplementation(self, f)
+
def WriteHandlerImplementation(self, f):
"""Overridden from Function"""
self.type_handler.WriteImmediateHandlerImplementation(self, f)
@@ -9940,6 +10116,10 @@ class BucketFunction(Function):
"""Overridden from Function"""
self.type_handler.WriteBucketServiceImplementation(self, f)
+ def WritePassthroughServiceImplementation(self, f):
+ """Overridden from Function"""
+ self.type_handler.WritePassthroughBucketServiceImplementation(self, f)
+
def WriteHandlerImplementation(self, f):
"""Overridden from Function"""
self.type_handler.WriteBucketHandlerImplementation(self, f)
@@ -10571,6 +10751,29 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
""")
self.generated_cpp_filenames.append(filename)
+ def WritePassthroughServiceImplementation(self, filename):
+ """Writes the passthrough service decorder implementation."""
+ with CWriter(filename) as f:
+ header = """
+#include \"gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h\"
+
+namespace gpu {
+namespace gles2 {
+
+""";
+ f.write(header);
+
+ for func in self.functions:
+ func.WritePassthroughServiceImplementation(f)
+
+ footer = """
+} // namespace gles2
+} // namespace gpu
+
+""";
+ f.write(footer);
+ self.generated_cpp_filenames.append(filename)
+
def WriteServiceUnitTests(self, filename_pattern):
"""Writes the service decorder unit tests."""
num_tests = len(self.functions)
@@ -11286,6 +11489,9 @@ def main(argv):
"gpu/command_buffer/client/gles2_cmd_helper_autogen.h")
gen.WriteServiceImplementation(
"gpu/command_buffer/service/gles2_cmd_decoder_autogen.h")
+ gen.WritePassthroughServiceImplementation(
+ "gpu/command_buffer/service/" +
+ "gles2_cmd_decoder_passthrough_handlers_autogen.cc")
gen.WriteServiceContextStateHeader(
"gpu/command_buffer/service/context_state_autogen.h")
gen.WriteServiceContextStateImpl(
« no previous file with comments | « no previous file | gpu/command_buffer/common/buffer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698