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

Unified Diff: gpu/command_buffer/build_gles2_cmd_buffer.py

Issue 434063: Merged in recent changes to command buffer code. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 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/gles2_c_lib_autogen.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
===================================================================
--- gpu/command_buffer/build_gles2_cmd_buffer.py (revision 33021)
+++ gpu/command_buffer/build_gles2_cmd_buffer.py (working copy)
@@ -95,7 +95,7 @@
GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLResourceId program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
GL_APICALL void GL_APIENTRY glGetActiveUniform (GLResourceId program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLResourceId program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-GL_APICALL int GL_APIENTRY glGetAttribLocation (GLResourceId program, const char* name);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLResourceId program, const char* name);
GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params);
GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params);
GL_APICALL GLenum GL_APIENTRY glGetError (void);
@@ -114,7 +114,7 @@
GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params);
GL_APICALL void GL_APIENTRY glGetUniformfv (GLResourceId program, GLint location, GLfloat* params);
GL_APICALL void GL_APIENTRY glGetUniformiv (GLResourceId program, GLint location, GLint* params);
-GL_APICALL int GL_APIENTRY glGetUniformLocation (GLResourceId program, const char* name);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLResourceId program, const char* name);
GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params);
GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params);
GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void** pointer);
@@ -193,6 +193,8 @@
# be called directly.
# cmd_args: The arguments to use for the command. This overrides generating
# them based on the GL function arguments.
+# a NonImmediate type is a type that stays a pointer even in
+# and immediate version of acommand.
# immediate: Whether or not to generate an immediate command for the GL
# function. The default is if there is exactly 1 pointer argument
# in the GL function an immediate command is generated.
@@ -205,11 +207,11 @@
'BindBuffer': {'DecoderFunc': 'DoBindBuffer'},
'BindFramebuffer': {'DecoderFunc': 'glBindFramebufferEXT'},
'BindRenderbuffer': {'DecoderFunc': 'glBindRenderbufferEXT'},
- 'BufferData': {'type': 'Data'},
+ 'BufferData': {'type': 'Manual', 'immediate': True,},
'BufferSubData': {'type': 'Data'},
'CheckFramebufferStatus': {'DecoderFunc': 'glCheckFramebufferStatusEXT'},
'ClearDepthf': {'DecoderFunc': 'glClearDepth'},
- 'CompressedTexImage2D': {'type': 'Data'},
+ 'CompressedTexImage2D': {'type': 'Manual', 'immediate': True,},
'CompressedTexSubImage2D': {'type': 'Data'},
'CreateProgram': {'type': 'Create'},
'CreateShader': {'type': 'Create'},
@@ -234,10 +236,16 @@
'GetActiveAttrib': {'type': 'Custom'},
'GetActiveUniform': {'type': 'Custom'},
'GetAttachedShaders': {'type': 'Custom'},
- 'GetAttribLocation': {'type': 'GetGLchar'},
+ 'GetAttribLocation': {
+ 'type': 'HandWritten',
+ 'immediate': True,
+ 'needs_size': True,
+ 'cmd_args':
+ 'GLResourceId program, const char* name, NonImmediate GLint* location',
+ },
'GetBooleanv': {'type': 'GETn'},
'GetBufferParameteriv': {'type': 'GETn'},
- 'GetError': {'type': 'Is'},
+ 'GetError': {'type': 'Is', 'DecoderFunc': 'GetGLError'},
'GetFloatv': {'type': 'GETn'},
'GetFramebufferAttachmentParameteriv': {
'type': 'GETn',
@@ -258,7 +266,13 @@
'GetTexParameteriv': {'type': 'GETn'},
'GetUniformfv': {'type': 'Custom', 'immediate': False},
'GetUniformiv': {'type': 'Custom', 'immediate': False},
- 'GetUniformLocation': {'type': 'GetGLchar'},
+ 'GetUniformLocation': {
+ 'type': 'HandWritten',
+ 'immediate': True,
+ 'needs_size': True,
+ 'cmd_args':
+ 'GLResourceId program, const char* name, NonImmediate GLint* location',
+ },
'GetVertexAttribfv': {'type': 'GETn'},
'GetVertexAttribiv': {'type': 'GETn'},
'GetVertexAttribPointerv': {'type': 'Custom', 'immediate': False},
@@ -269,7 +283,7 @@
'IsRenderbuffer': {'type': 'Is', 'DecoderFunc': 'glIsRenderbufferEXT'},
'IsShader': {'type': 'Is'},
'IsTexture': {'type': 'Is'},
- 'PixelStorei': {'type': 'Custom'},
+ 'PixelStorei': {'type': 'Manual'},
'RenderbufferStorage': {'DecoderFunc': 'glRenderbufferStorageEXT'},
'ReadPixels': {'type': 'Custom', 'immediate': False},
'ReleaseShaderCompiler': {'type': 'Noop'},
@@ -281,7 +295,7 @@
'cmd_args':
'GLuint shader, GLsizei count, const char* data',
},
- 'TexImage2D': {'type': 'Data'},
+ 'TexImage2D': {'type': 'Manual', 'immediate': True},
'TexParameterfv': {'type': 'PUT', 'data_type': 'GLfloat', 'count': 1},
'TexParameteriv': {'type': 'PUT', 'data_type': 'GLint', 'count': 1},
'TexSubImage2D': {'type': 'Data'},
@@ -381,7 +395,7 @@
def InitFunction(self, func):
"""Add or adjust anything type specific for this function."""
if func.GetInfo('needs_size'):
- func.AddCmdArg(CmdArg('data_size', 'uint32'))
+ func.AddCmdArg(Argument('data_size', 'uint32'))
def AddImmediateFunction(self, generator, func):
"""Adds an immediate version of a function."""
@@ -391,10 +405,44 @@
if func.num_pointer_args == 1 or immediate:
generator.AddFunction(ImmediateFunction(func))
+ def WriteStruct(self, func, file):
+ """Writes a structure that matches the arguments to a function."""
+ file.Write("struct %s {\n" % func.name)
+ file.Write(" typedef %s ValueType;\n" % func.name)
+ file.Write(" static const CommandId kCmdId = k%s;\n" % func.name)
+ func.WriteCmdArgFlag(file)
+ file.Write("\n")
+
+ func.WriteCmdComputeSize(file)
+ func.WriteCmdSetHeader(file)
+ func.WriteCmdInit(file)
+ func.WriteCmdSet(file)
+
+ file.Write(" command_buffer::CommandHeader header;\n")
+ args = func.GetCmdArgs()
+ for arg in args:
+ file.Write(" %s %s;\n" % (arg.cmd_type, arg.name))
+ file.Write("};\n")
+ file.Write("\n")
+
+ size = len(args) * _SIZE_OF_UINT32 + _SIZE_OF_COMMAND_HEADER
+ file.Write("COMPILE_ASSERT(sizeof(%s) == %d,\n" % (func.name, size))
+ file.Write(" Sizeof_%s_is_not_%d);\n" % (func.name, size))
+ file.Write("COMPILE_ASSERT(offsetof(%s, header) == 0,\n" % func.name)
+ file.Write(" OffsetOf_%s_header_not_0);\n" % func.name)
+ offset = _SIZE_OF_COMMAND_HEADER
+ for arg in args:
+ file.Write("COMPILE_ASSERT(offsetof(%s, %s) == %d,\n" %
+ (func.name, arg.name, offset))
+ file.Write(" OffsetOf_%s_%s_not_%d);\n" %
+ (func.name, arg.name, offset))
+ offset += _SIZE_OF_UINT32
+ file.Write("\n")
+
def WriteHandlerImplementation(self, func, file):
"""Writes the handler implementation for this command."""
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -461,7 +509,7 @@
"""Writes the handler impl for the immediate version of a command."""
file.Write(" // Immediate version.\n")
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -474,7 +522,7 @@
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
for arg in func.GetOriginalArgs():
arg.WriteGetCode(file)
func.WriteHandlerImplementation(file)
@@ -487,7 +535,7 @@
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
for arg in func.GetOriginalArgs():
arg.WriteGetCode(file)
func.WriteHandlerImplementation(file)
@@ -565,6 +613,16 @@
file.Write(" }\n")
file.Write("\n")
+ def WriteCmdHelper(self, func, file):
+ """Writes the cmd helper definition for a cmd."""
+ args = func.MakeCmdArgString("")
+ file.Write(" void %s(%s) {\n" %
+ (func.name, func.MakeTypedCmdArgString("")))
+ file.Write(" gles2::%s& c = GetCmdSpace<gles2::%s>();\n" %
+ (func.name, func.name))
+ file.Write(" c.Init(%s);\n" % args)
+ file.Write(" }\n\n")
+
def WriteImmediateCmdHelper(self, func, file):
"""Writes the cmd helper definition for the immediate version of a cmd."""
args = func.MakeCmdArgString("")
@@ -590,7 +648,7 @@
def WriteImmediateCmdGetTotalSize(self, func, file):
"""Overrriden from TypeHandler."""
- file.Write(" uint32 total_size = 0; // TODO(gman): get correct size.")
+ file.Write(" uint32 total_size = 0; // TODO(gman): get correct size.\n")
def WriteImmediateCmdInit(self, func, file):
"""Overrriden from TypeHandler."""
@@ -624,8 +682,49 @@
pass
+class HandWrittenHandler(CustomHandler):
+ """Handler for comands where everything must be written by hand."""
+
+ def InitFunction(self, func):
+ """Add or adjust anything type specific for this function."""
+ CustomHandler.InitFunction(self, func)
+ func.can_auto_generate = False
+
+ def WriteStruct(self, func, file):
+ """Overrriden from TypeHandler."""
+ pass
+
+ def WriteServiceImplementation(self, func, file):
+ """Overrriden from TypeHandler."""
+ pass
+
+ def WriteImmediateServiceImplementation(self, func, file):
+ """Overrriden from TypeHandler."""
+ pass
+
+ def WriteGLES2ImplementationImpl(self, func, file):
+ """Overrriden from TypeHandler."""
+ pass
+
+ def WriteImmediateCmdHelper(self, func, file):
+ """Overrriden from TypeHandler."""
+ pass
+
+ def WriteCmdHelper(self, func, file):
+ """Overrriden from TypeHandler."""
+ pass
+
+ def WriteFormatTest(self, func, file):
+ """Overrriden from TypeHandler."""
+ file.Write("// TODO(gman): Write test for %s\n" % func.name)
+
+ def WriteImmediateFormatTest(self, func, file):
+ """Overrriden from TypeHandler."""
+ file.Write("// TODO(gman): Write test for %s\n" % func.name)
+
+
class ManualHandler(CustomHandler):
- """Handler for commands that must be written by hand."""
+ """Handler for commands who's handlers must be written by hand."""
def __init__(self):
CustomHandler.__init__(self)
@@ -673,7 +772,7 @@
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
for arg in func.GetCmdArgs():
arg.WriteGetCode(file)
@@ -763,7 +862,7 @@
def WriteHandlerImplementation (self, func, file):
"""Overrriden from TypeHandler."""
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -774,7 +873,7 @@
def WriteImmediateHandlerImplementation(self, func, file):
"""Overrriden from TypeHandler."""
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -898,13 +997,13 @@
def InitFunction(self, func):
"""Overrriden from TypeHandler."""
- func.AddCmdArg(CmdArg("client_id", 'uint32'))
+ func.AddCmdArg(Argument("client_id", 'uint32'))
def WriteHandlerImplementation (self, func, file):
"""Overrriden from TypeHandler."""
file.Write(" uint32 client_id = c.client_id;\n")
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -939,7 +1038,7 @@
def WriteHandlerImplementation (self, func, file):
"""Overrriden from TypeHandler."""
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -950,7 +1049,7 @@
def WriteImmediateHandlerImplementation (self, func, file):
"""Overrriden from TypeHandler."""
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -1081,7 +1180,7 @@
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
last_arg = func.GetLastOriginalArg()
all_but_last_args = func.GetOriginalArgs()[:-1]
@@ -1106,13 +1205,14 @@
all_but_last_args = func.GetOriginalArgs()[:-1]
arg_string = (
", ".join(["%s" % arg.name for arg in all_but_last_args]))
- file.Write(" helper_->%s(%s, shared_memory_.GetId(), 0);\n" %
+ file.Write(" helper_->%s(%s, result_shm_id(), result_shm_offset());\n" %
(func.name, arg_string))
- file.Write(" int32 token = helper_->InsertToken();\n")
- file.Write(" helper_->WaitForToken(token);\n")
+ file.Write(" WaitForCmd();\n")
file.Write(" GLsizei num_values = util_.GLGetNumValuesReturned(pname);\n")
- file.Write(" memcpy(params, shared_memory_.GetAddress(0),\n")
- file.Write(" num_values * sizeof(*params));\n")
+ file.Write(
+ " DCHECK_LE(num_values * sizeof(*params), kMaxSizeOfSimpleResult);\n")
+ file.Write(
+ " memcpy(params, result_buffer_, num_values * sizeof(*params));\n")
file.Write("}\n")
file.Write("\n")
@@ -1130,7 +1230,7 @@
def WriteImmediateValidationCode(self, func, file):
"""Overrriden from TypeHandler."""
file.Write(" if (!CheckImmediateDataSize<%s>("
- "arg_count, 1, sizeof(%s), %d)) {\n" %
+ "immediate_data_size, 1, sizeof(%s), %d)) {\n" %
(func.name, func.info.data_type, func.info.count))
file.Write(" return parse_error::kParseOutOfBounds;\n")
file.Write(" }\n")
@@ -1259,7 +1359,7 @@
def WriteImmediateValidationCode(self, func, file):
"""Overrriden from TypeHandler."""
file.Write(" if (!CheckImmediateDataSize<%s>("
- "arg_count, count, sizeof(%s), %d)) {\n" %
+ "immediate_data_size, count, sizeof(%s), %d)) {\n" %
(func.name, func.info.data_type, func.info.count))
file.Write(" return parse_error::kParseOutOfBounds;\n")
file.Write(" }\n")
@@ -1387,14 +1487,14 @@
def InitFunction(self, func):
"""Overrriden from TypeHandler."""
- func.AddCmdArg(CmdArg('data_size', 'uint32'))
+ func.AddCmdArg(Argument('data_size', 'uint32'))
def WriteServiceImplementation(self, func, file):
"""Overrriden from TypeHandler."""
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
last_arg = func.GetLastOriginalArg()
all_but_last_arg = func.GetOriginalArgs()[:-1]
@@ -1407,7 +1507,7 @@
file.Write(" c.%s_shm_id, c.%s_shm_offset, name_size);\n" %
(last_arg.name, last_arg.name))
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -1425,7 +1525,7 @@
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
last_arg = func.GetLastOriginalArg()
all_but_last_arg = func.GetOriginalArgs()[:-1]
@@ -1435,10 +1535,10 @@
file.Write(" uint32 name_size = c.data_size;\n")
file.Write(
" const char* name = GetImmediateDataAs<const char*>(c);\n")
- file.Write(" // TODO(gman): Make sure validate checks arg_count\n")
- file.Write(" // covers data_size.\n")
+ file.Write(" // TODO(gman): Make sure validate checks\n")
+ file.Write(" // immediate_data_size covers data_size.\n")
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -1565,10 +1665,10 @@
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
last_arg = func.GetLastOriginalArg()
- all_but_last_arg = func.GetOriginalArgs()[:-1]
+ all_but_last_arg = func.GetOriginalArgs()
for arg in all_but_last_arg:
arg.WriteGetCode(file)
@@ -1577,17 +1677,20 @@
last_arg.type)
file.Write(" c.%s_shm_id, c.%s_shm_offset, name_size);\n" %
(last_arg.name, last_arg.name))
+ file.Write(" GLint* location = GetSharedMemoryAs<GLint*>(\n")
+ file.Write(
+ " c.location_shm_id, c.location_shm_offset, sizeof(*location));\n")
+ file.Write(" // TODO(gman): Validate location.\n")
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
file.Write(" }\n")
arg_string = ", ".join(["%s" % arg.name for arg in all_but_last_arg])
file.Write(" String name_str(name, name_size);\n")
- file.Write(" GLint location = %s(%s, name_str.c_str());\n" %
+ file.Write(" *location = %s(%s, name_str.c_str());\n" %
(func.GetGLFunctionName(), arg_string))
- file.Write(" DCHECK(false); // TODO: return result.\n")
file.Write(" return parse_error::kParseNoError;\n")
file.Write("}\n")
file.Write("\n")
@@ -1597,7 +1700,7 @@
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
last_arg = func.GetLastOriginalArg()
all_but_last_arg = func.GetOriginalArgs()[:-1]
@@ -1607,19 +1710,22 @@
file.Write(" uint32 name_size = c.data_size;\n")
file.Write(
" const char* name = GetImmediateDataAs<const char*>(c);\n")
- file.Write(" // TODO(gman): Make sure validate checks arg_count\n")
- file.Write(" // covers data_size.\n")
+ file.Write(" // TODO(gman): Make sure validate checks\n")
+ file.Write(" // immediate_data_size covers data_size.\n")
+ file.Write(" GLint* location = GetSharedMemoryAs<GLint*>(\n")
+ file.Write(
+ " c.location_shm_id, c.location_shm_offset, sizeof(*location));\n")
+ file.Write(" // TODO(gman): Validate location.\n")
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
file.Write(" }\n")
arg_string = ", ".join(["%s" % arg.name for arg in all_but_last_arg])
file.Write(" String name_str(name, name_size);\n")
- file.Write(" GLint location = %s(%s, name_str.c_str());\n" %
+ file.Write(" *location = %s(%s, name_str.c_str());\n" %
(func.GetGLFunctionName(), arg_string))
- file.Write(" DCHECK(false); // TODO: return result.\n")
file.Write(" return parse_error::kParseNoError;\n")
file.Write("}\n")
file.Write("\n")
@@ -1665,26 +1771,23 @@
def WriteImmediateCmdInit(self, func, file):
"""Overrriden from TypeHandler."""
- last_arg = func.GetLastOriginalArg()
- file.Write(" void Init(%s) {\n" % func.MakeTypedOriginalArgString("_"))
- file.Write(" SetHeader(_%s);\n" % last_arg.name)
- args = func.GetCmdArgs()[:-1]
+ file.Write(" void Init(%s) {\n" % func.MakeTypedInitString("_"))
+ file.Write(" SetHeader(_name);\n")
+ args = func.GetInitArgs()
for arg in args:
file.Write(" %s = _%s;\n" % (arg.name, arg.name))
- file.Write(" data_size = strlen(_%s);\n" % last_arg.name)
- file.Write(" memcpy(ImmediateDataAddress(this), _%s, data_size);\n" %
- last_arg.name)
+ file.Write(" data_size = ComputeDataSize(_name);\n")
+ file.Write(" memcpy(ImmediateDataAddress(this), _name, data_size);\n")
file.Write(" }\n")
file.Write("\n")
def WriteImmediateCmdSet(self, func, file):
"""Overrriden from TypeHandler."""
- last_arg = func.GetLastOriginalArg()
file.Write(" void* Set(void* cmd%s) {\n" %
- func.MakeTypedOriginalArgString("_", True))
+ func.MakeTypedInitString("_", True))
file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" %
- func.MakeOriginalArgString("_"))
- file.Write(" const uint32 size = ComputeSize(_%s);\n" % last_arg.name)
+ func.MakeInitString("_"))
+ file.Write(" const uint32 size = ComputeSize(_name);\n")
file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
"cmd, size);\n")
file.Write(" }\n")
@@ -1692,16 +1795,14 @@
def WriteImmediateCmdHelper(self, func, file):
"""Overrriden from TypeHandler."""
- args = func.MakeOriginalArgString("")
- last_arg = func.GetLastOriginalArg()
file.Write(" void %s(%s) {\n" %
- (func.name, func.MakeTypedOriginalArgString("")))
- file.Write(" const uint32 size = gles2::%s::ComputeSize(%s);\n" %
- (func.name, last_arg.name))
+ (func.name, func.MakeTypedCmdArgString("")))
+ file.Write(" const uint32 size = gles2::%s::ComputeSize(name);\n" %
+ func.name)
file.Write(" gles2::%s& c = GetImmediateCmdSpaceTotalSize<gles2::%s>("
"size);\n" %
(func.name, func.name))
- file.Write(" c.Init(%s);\n" % args)
+ file.Write(" c.Init(%s);\n" % func.MakeCmdArgString(""))
file.Write(" }\n\n")
def WriteImmediateFormatTest(self, func, file):
@@ -1741,15 +1842,15 @@
def InitFunction(self, func):
"""Overrriden from TypeHandler."""
- func.AddCmdArg(CmdArg("result_shm_id", 'uint32'))
- func.AddCmdArg(CmdArg("result_shm_offset", 'uint32'))
+ func.AddCmdArg(Argument("result_shm_id", 'uint32'))
+ func.AddCmdArg(Argument("result_shm_offset", 'uint32'))
def WriteServiceImplementation(self, func, file):
"""Overrriden from TypeHandler."""
file.Write(
"parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
file.Write(
- " unsigned int arg_count, const gles2::%s& c) {\n" % func.name)
+ " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
args = func.GetOriginalArgs()
for arg in args:
arg.WriteGetCode(file)
@@ -1759,7 +1860,7 @@
file.Write(
" c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));\n")
file.Write(" parse_error::ParseError result =\n")
- file.Write(" Validate%s(this, arg_count%s);\n" %
+ file.Write(" Validate%s(this, immediate_data_size%s);\n" %
(func.name, func.MakeOriginalArgString("", True)))
file.Write(" if (result != parse_error::kParseNoError) {\n")
file.Write(" return result;\n")
@@ -1779,11 +1880,10 @@
comma = ""
if len(arg_string) > 0:
comma = ", "
- file.Write(" helper_->%s(%s%sshared_memory_.GetId(), 0);\n" %
+ file.Write(" helper_->%s(%s%sresult_shm_id(), result_shm_offset());\n" %
(func.name, arg_string, comma))
- file.Write(" int32 token = helper_->InsertToken();\n")
- file.Write(" helper_->WaitForToken(token);\n")
- file.Write(" return *shared_memory_.GetAddressAs<%s*>(0);\n" %
+ file.Write(" WaitForCmd();\n")
+ file.Write(" return GetResultAs<%s>();\n" %
func.return_type)
file.Write("}\n")
file.Write("\n")
@@ -1816,8 +1916,9 @@
self.type = ''
-class CmdArg(object):
- """A class used to represent arguments at the command buffer level."""
+class Argument(object):
+ """A class that represents a function argument."""
+
cmd_type_map_ = {
'GLfloat': 'float',
'GLclampf': 'float',
@@ -1832,22 +1933,18 @@
else:
self.cmd_type = 'uint32'
- def WriteGetCode(self, file):
- file.Write(" %s %s = static_cast<%s>(c.%s);\n" %
- (self.type, self.name, self.type, self.name))
+ def IsPointer(self):
+ """Returns true if argument is a pointer."""
+ return False
-
-class Argument(object):
- """A class that represents a function argument."""
-
- def __init__(self, name, type):
- self.name = name
- self.type = type
-
def AddCmdArgs(self, args):
"""Adds command arguments for this argument to the given list."""
- return args.append(CmdArg(self.name, self.type))
+ return args.append(self)
+ def AddInitArgs(self, args):
+ """Adds init arguments for this argument to the given list."""
+ return args.append(self)
+
def WriteGetCode(self, file):
"""Writes the code to get an argument from a command structure."""
file.Write(" %s %s = static_cast<%s>(c.%s);\n" %
@@ -1902,10 +1999,14 @@
def __init__(self, name, type):
Argument.__init__(self, name, type)
+ def IsPointer(self):
+ """Returns true if argument is a pointer."""
+ return True
+
def AddCmdArgs(self, args):
"""Overridden from Argument."""
- args.append(CmdArg("%s_shm_id" % self.name, 'uint32'))
- args.append(CmdArg("%s_shm_offset" % self.name, 'uint32'))
+ args.append(Argument("%s_shm_id" % self.name, 'uint32'))
+ args.append(Argument("%s_shm_offset" % self.name, 'uint32'))
def WriteGetCode(self, file):
"""Overridden from Argument."""
@@ -1936,6 +2037,21 @@
return ImmediatePointerArgument(self.name, self.type)
+class NonImmediatePointerArgument(PointerArgument):
+ """A pointer argument that stays a pointer even in an immediate cmd."""
+
+ def __init__(self, name, type):
+ PointerArgument.__init__(self, name, type)
+
+ def IsPointer(self):
+ """Returns true if argument is a pointer."""
+ return False
+
+ def GetImmediateVersion(self):
+ """Overridden from Argument."""
+ return self
+
+
class ResourceIdArgument(Argument):
"""A class that represents a resource id argument to a function."""
@@ -1957,7 +2073,7 @@
"""A class that represents a function."""
def __init__(self, name, info, return_type, original_args, args_for_cmds,
- cmd_args, num_pointer_args):
+ cmd_args, init_args, num_pointer_args):
self.name = name
self.original_name = name
self.info = info
@@ -1967,6 +2083,7 @@
self.num_pointer_args = num_pointer_args
self.can_auto_generate = num_pointer_args == 0 and return_type == "void"
self.cmd_args = cmd_args
+ self.init_args = init_args
self.args_for_cmds = args_for_cmds
self.type_handler.InitFunction(self)
@@ -1994,6 +2111,10 @@
"""Gets the command args for this function."""
return self.cmd_args
+ def GetInitArgs(self):
+ """Gets the init args for this function."""
+ return self.init_args
+
def GetOriginalArgs(self):
"""Gets the original arguments to this function."""
return self.original_args
@@ -2037,6 +2158,20 @@
["%s%s" % (prefix, arg.name) for arg in args])
return self.__GetArgList(arg_string, add_comma)
+ def MakeTypedInitString(self, prefix, add_comma = False):
+ """Gets a typed list of arguments as they need to be for cmd Init/Set."""
+ args = self.GetInitArgs()
+ arg_string = ", ".join(
+ ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
+ return self.__GetArgList(arg_string, add_comma)
+
+ def MakeInitString(self, prefix, add_comma = False):
+ """Gets the list of arguments as they need to be for cmd Init/Set."""
+ args = self.GetInitArgs()
+ arg_string = ", ".join(
+ ["%s%s" % (prefix, arg.name) for arg in args])
+ return self.__GetArgList(arg_string, add_comma)
+
def WriteHandlerImplementation(self, file):
"""Writes the handler implementation for this command."""
self.type_handler.WriteHandlerImplementation(self, file)
@@ -2085,48 +2220,11 @@
file.Write("\n")
def WriteStruct(self, file):
- """Writes a structure that matched the arguments to the function."""
- file.Write("struct %s {\n" % self.name)
- file.Write(" typedef %s ValueType;\n" % self.name)
- file.Write(" static const CommandId kCmdId = k%s;\n" % self.name)
- self.WriteCmdArgFlag(file)
- file.Write("\n")
+ self.type_handler.WriteStruct(self, file)
- self.WriteCmdComputeSize(file)
- self.WriteCmdSetHeader(file)
- self.WriteCmdInit(file)
- self.WriteCmdSet(file)
-
- file.Write(" command_buffer::CommandHeader header;\n")
- args = self.GetCmdArgs()
- for arg in args:
- file.Write(" %s %s;\n" % (arg.cmd_type, arg.name))
- file.Write("};\n")
- file.Write("\n")
-
- size = len(args) * _SIZE_OF_UINT32 + _SIZE_OF_COMMAND_HEADER
- file.Write("COMPILE_ASSERT(sizeof(%s) == %d,\n" % (self.name, size))
- file.Write(" Sizeof_%s_is_not_%d);\n" % (self.name, size))
- file.Write("COMPILE_ASSERT(offsetof(%s, header) == 0,\n" % self.name)
- file.Write(" OffsetOf_%s_header_not_0);\n" % self.name)
- offset = _SIZE_OF_COMMAND_HEADER
- for arg in args:
- file.Write("COMPILE_ASSERT(offsetof(%s, %s) == %d,\n" %
- (self.name, arg.name, offset))
- file.Write(" OffsetOf_%s_%s_not_%d);\n" %
- (self.name, arg.name, offset))
- offset += _SIZE_OF_UINT32
- file.Write("\n")
-
def WriteCmdHelper(self, file):
"""Writes the cmd's helper."""
- args = self.MakeCmdArgString("")
- file.Write(" void %s(%s) {\n" %
- (self.name, self.MakeTypedCmdArgString("")))
- file.Write(" gles2::%s& c = GetCmdSpace<gles2::%s>();\n" %
- (self.name, self.name))
- file.Write(" c.Init(%s);\n" % args)
- file.Write(" }\n\n")
+ self.type_handler.WriteCmdHelper(self, file)
def WriteServiceImplementation(self, file):
"""Writes the service implementation for a command."""
@@ -2163,6 +2261,10 @@
new_args_for_cmds.append(new_arg)
new_arg.AddCmdArgs(cmd_args)
+ new_init_args = []
+ for arg in new_args_for_cmds:
+ arg.AddInitArgs(new_init_args)
+
Function.__init__(
self,
"%sImmediate" % func.name,
@@ -2171,6 +2273,7 @@
new_args,
new_args_for_cmds,
cmd_args,
+ new_init_args,
0)
self.original_name = func.name
@@ -2215,6 +2318,32 @@
self.type_handler.WriteImmediateFormatTest(self, file)
+def CreateArg(arg_string):
+ """Creates an Argument."""
+ arg_parts = arg_string.split()
+ if len(arg_parts) == 1 and arg_parts[0] == 'void':
+ return None
+ # Is this a pointer argument?
+ elif arg_string.find('*') >= 0:
+ if arg_parts[0] == 'NonImmediate':
+ return NonImmediatePointerArgument(
+ arg_parts[-1],
+ " ".join(arg_parts[1:-1]))
+ else:
+ return PointerArgument(
+ arg_parts[-1],
+ " ".join(arg_parts[0:-1]))
+ # Is this a resource argument? Must come after pointer check.
+ elif arg_parts[0] == 'GLResourceId':
+ return ResourceIdArgument(
+ arg_parts[-1],
+ " ".join(arg_parts[0:-1]))
+ else:
+ return Argument(
+ arg_parts[-1],
+ " ".join(arg_parts[0:-1]))
+
+
class GLGenerator(object):
"""A class to generate GL command buffers."""
@@ -2238,6 +2367,7 @@
'GETn': GETnHandler(),
'GetGLchar': GetGLcharHandler(),
'GLchar': GLcharHandler(),
+ 'HandWritten': HandWrittenHandler(),
'Is': IsHandler(),
'Manual': ManualHandler(),
'PUT': PUTHandler(),
@@ -2309,25 +2439,12 @@
args = []
num_pointer_args = 0
parts = arg_string.split(',')
- for arg in parts:
- arg_parts = arg.split()
- if len(arg_parts) == 1 and arg_parts[0] == 'void':
- pass
- # Is this a pointer argument?
- elif arg.find('*') >= 0:
- num_pointer_args += 1
- args.append(PointerArgument(
- arg_parts[-1],
- " ".join(arg_parts[0:-1])))
- # Is this a resource argument? Must come after pointer check.
- elif arg_parts[0] == 'GLResourceId':
- args.append(ResourceIdArgument(
- arg_parts[-1],
- " ".join(arg_parts[0:-1])))
- else:
- args.append(Argument(
- arg_parts[-1],
- " ".join(arg_parts[0:-1])))
+ for arg_string in parts:
+ arg = CreateArg(arg_string)
+ if arg:
+ args.append(arg)
+ if arg.IsPointer():
+ num_pointer_args += 1
return (args, num_pointer_args)
def ParseGLH(self, filename):
@@ -2348,8 +2465,14 @@
cmd_args = []
for arg in args_for_cmds:
arg.AddCmdArgs(cmd_args)
+ init_args = []
+ for arg in args_for_cmds:
+ arg.AddInitArgs(init_args)
+ return_arg = CreateArg(return_type + " result")
+ if return_arg:
+ init_args.append(return_arg)
f = Function(func_name, func_info, return_type, args, args_for_cmds,
- cmd_args, num_pointer_args)
+ cmd_args, init_args, num_pointer_args)
self.original_functions.append(f)
self.AddFunction(f)
f.type_handler.AddImmediateFunction(self, f)
@@ -2473,8 +2596,9 @@
file.Write("\n")
for func in self.functions:
file.Write("parse_error::ParseError Validate%s(\n" % func.name)
- file.Write(" GLES2Decoder* decoder, unsigned int arg_count%s) {\n" %
- func.MakeTypedOriginalArgString("", True))
+ file.Write(
+ " GLES2Decoder* decoder, uint32 immediate_data_size%s) {\n" %
+ func.MakeTypedOriginalArgString("", True))
for arg in func.GetOriginalArgs():
arg.WriteValidationCode(file)
func.WriteValidationCode(file)
« no previous file with comments | « no previous file | gpu/command_buffer/client/gles2_c_lib_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698