| Index: gpu/command_buffer/build_gles2_cmd_buffer.py
|
| ===================================================================
|
| --- gpu/command_buffer/build_gles2_cmd_buffer.py (revision 35070)
|
| +++ gpu/command_buffer/build_gles2_cmd_buffer.py (working copy)
|
| @@ -663,10 +663,13 @@
|
| 'DeleteShader': {'type': 'Custom', 'DecoderFunc': 'DoDeleteShader'},
|
| 'DeleteTextures': {'type': 'DELn'},
|
| 'DepthRangef': {'DecoderFunc': 'glDepthRange'},
|
| + 'DisableVertexAttribArray': {'DecoderFunc': 'DoDisableVertexAttribArray'},
|
| + 'DrawArrays': { 'DecoderFunc': 'DoDrawArrays'},
|
| 'DrawElements': {
|
| 'type': 'Manual',
|
| 'cmd_args': 'GLenum mode, GLsizei count, GLenum type, GLuint index_offset',
|
| },
|
| + 'EnableVertexAttribArray': {'DecoderFunc': 'DoEnableVertexAttribArray'},
|
| 'FramebufferRenderbuffer': {'DecoderFunc': 'glFramebufferRenderbufferEXT'},
|
| 'FramebufferTexture2D': {'DecoderFunc': 'glFramebufferTexture2DEXT'},
|
| 'GenerateMipmap': {'DecoderFunc': 'glGenerateMipmapEXT'},
|
| @@ -724,6 +727,7 @@
|
| 'IsRenderbuffer': {'type': 'Is', 'DecoderFunc': 'glIsRenderbufferEXT'},
|
| 'IsShader': {'type': 'Is'},
|
| 'IsTexture': {'type': 'Is'},
|
| + 'LinkProgram': {'DecoderFunc': 'DoLinkProgram'},
|
| 'PixelStorei': {'type': 'Manual'},
|
| 'RenderbufferStorage': {'DecoderFunc': 'glRenderbufferStorageEXT'},
|
| 'ReadPixels': {'type': 'Custom', 'immediate': False},
|
| @@ -751,6 +755,7 @@
|
| 'UniformMatrix2fv': {'type': 'PUTn', 'data_type': 'GLfloat', 'count': 4},
|
| 'UniformMatrix3fv': {'type': 'PUTn', 'data_type': 'GLfloat', 'count': 9},
|
| 'UniformMatrix4fv': {'type': 'PUTn', 'data_type': 'GLfloat', 'count': 16},
|
| + 'UseProgram': {'DecoderFunc': 'DoUseProgram'},
|
| 'VertexAttrib1fv': {'type': 'PUT', 'data_type': 'GLfloat', 'count': 1},
|
| 'VertexAttrib2fv': {'type': 'PUT', 'data_type': 'GLfloat', 'count': 2},
|
| 'VertexAttrib3fv': {'type': 'PUT', 'data_type': 'GLfloat', 'count': 3},
|
| @@ -941,6 +946,10 @@
|
| file.Write("}\n")
|
| file.Write("\n")
|
|
|
| + def WriteGetDataSizeCode(self, func, file):
|
| + """Writes the code to set data_size used in validation"""
|
| + pass
|
| +
|
| def WriteImmediateCmdSizeTest(self, func, file):
|
| """Writes a size test for an immediate version of a command."""
|
| file.Write(" // TODO(gman): Compute correct size.\n")
|
| @@ -948,8 +957,6 @@
|
|
|
| def WriteImmediateHandlerImplementation (self, func, file):
|
| """Writes the handler impl for the immediate version of a command."""
|
| - file.Write(" // Immediate version.\n")
|
| - func.WriteHandlerValidation(file)
|
| file.Write(" %s(%s);\n" %
|
| (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
|
|
|
| @@ -959,8 +966,13 @@
|
| "parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
|
| file.Write(
|
| " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
|
| - for arg in func.GetOriginalArgs():
|
| - arg.WriteGetCode(file)
|
| + if len(func.GetOriginalArgs()) > 0:
|
| + last_arg = func.GetLastOriginalArg()
|
| + all_but_last_arg = func.GetOriginalArgs()[:-1]
|
| + for arg in all_but_last_arg:
|
| + arg.WriteGetCode(file)
|
| + self.WriteGetDataSizeCode(func, file)
|
| + last_arg.WriteGetCode(file)
|
| func.WriteHandlerValidation(file)
|
| func.WriteHandlerImplementation(file)
|
| file.Write(" return parse_error::kParseNoError;\n")
|
| @@ -973,8 +985,12 @@
|
| "parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
|
| file.Write(
|
| " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
|
| - for arg in func.GetOriginalArgs():
|
| + last_arg = func.GetLastOriginalArg()
|
| + all_but_last_arg = func.GetOriginalArgs()[:-1]
|
| + for arg in all_but_last_arg:
|
| arg.WriteGetCode(file)
|
| + self.WriteGetDataSizeCode(func, file)
|
| + last_arg.WriteGetCode(file)
|
| func.WriteHandlerValidation(file)
|
| func.WriteHandlerImplementation(file)
|
| file.Write(" return parse_error::kParseNoError;\n")
|
| @@ -1199,47 +1215,35 @@
|
| CustomHandler.WriteImmediateCmdGetTotalSize(self, func, file)
|
|
|
|
|
| -class DataHandler(CustomHandler):
|
| +class DataHandler(TypeHandler):
|
| """Handler for glBufferData, glBufferSubData, glTexImage2D, glTexSubImage2D,
|
| glCompressedTexImage2D, glCompressedTexImageSub2D."""
|
| def __init__(self):
|
| - CustomHandler.__init__(self)
|
| + TypeHandler.__init__(self)
|
|
|
| - def WriteServiceImplementation(self, func, file):
|
| + def WriteGetDataSizeCode(self, func, file):
|
| """Overrriden from TypeHandler."""
|
| - file.Write(
|
| - "parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
|
| - file.Write(
|
| - " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
|
| - for arg in func.GetCmdArgs():
|
| - arg.WriteGetCode(file)
|
| -
|
| # TODO(gman): Move this data to _FUNCTION_INFO?
|
| - if func.name == 'BufferData':
|
| + name = func.name
|
| + if name.endswith("Immediate"):
|
| + name = name[0:-9]
|
| + if name == 'BufferData':
|
| file.Write(" uint32 data_size = size;\n")
|
| - elif func.name == 'BufferSubData':
|
| + elif name == 'BufferSubData':
|
| file.Write(" uint32 data_size = size;\n")
|
| - elif func.name == 'CompressedTexImage2D':
|
| + elif name == 'CompressedTexImage2D':
|
| file.Write(" uint32 data_size = imageSize;\n")
|
| - elif func.name == 'CompressedTexSubImage2D':
|
| + elif name == 'CompressedTexSubImage2D':
|
| file.Write(" uint32 data_size = imageSize;\n")
|
| - elif func.name == 'TexImage2D':
|
| - file.Write(" uint32 pixels_size = GLES2Util::ComputeImageDataSize(\n")
|
| + elif name == 'TexImage2D':
|
| + file.Write(" uint32 data_size = GLES2Util::ComputeImageDataSize(\n")
|
| file.Write(" width, height, format, type, unpack_alignment_);\n")
|
| - elif func.name == 'TexSubImage2D':
|
| - file.Write(" uint32 pixels_size = GLES2Util::ComputeImageDataSize(\n")
|
| + elif name == 'TexSubImage2D':
|
| + file.Write(" uint32 data_size = GLES2Util::ComputeImageDataSize(\n")
|
| file.Write(" width, height, format, type, unpack_alignment_);\n")
|
| else:
|
| - file.Write(" uint32 data_size = 0; // TODO(gman): get correct size!\n")
|
| + file.Write("// uint32 data_size = 0; // TODO(gman): get correct size!\n")
|
|
|
| - for arg in func.GetOriginalArgs():
|
| - arg.WriteGetAddress(file)
|
| - func.WriteHandlerValidation(file)
|
| - func.WriteHandlerImplementation(file)
|
| - file.Write(" return parse_error::kParseNoError;\n")
|
| - file.Write("}\n")
|
| - file.Write("\n")
|
| -
|
| def WriteImmediateCmdGetTotalSize(self, func, file):
|
| """Overrriden from TypeHandler."""
|
| # TODO(gman): Move this data to _FUNCTION_INFO?
|
| @@ -1277,6 +1281,29 @@
|
| " uint32 total_size = 0; // TODO(gman): get correct size\n")
|
| file.Write(" EXPECT_EQ(sizeof(cmd), total_size);\n")
|
|
|
| + def WriteImmediateCmdInit(self, func, file):
|
| + """Overrriden from TypeHandler."""
|
| + file.Write(" void Init(%s) {\n" % func.MakeTypedCmdArgString("_"))
|
| + self.WriteImmediateCmdGetTotalSize(func, file)
|
| + file.Write(" SetHeader(total_size);\n")
|
| + args = func.GetCmdArgs()
|
| + for arg in args:
|
| + file.Write(" %s = _%s;\n" % (arg.name, arg.name))
|
| + file.Write(" }\n")
|
| + file.Write("\n")
|
| +
|
| + def WriteImmediateCmdSet(self, func, file):
|
| + """Overrriden from TypeHandler."""
|
| + copy_args = func.MakeCmdArgString("_", False)
|
| + file.Write(" void* Set(void* cmd%s) {\n" %
|
| + func.MakeTypedCmdArgString("_", True))
|
| + self.WriteImmediateCmdGetTotalSize(func, file)
|
| + file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
|
| + file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>("
|
| + "cmd, total_size);\n")
|
| + file.Write(" }\n")
|
| + file.Write("\n")
|
| +
|
| def WriteImmediateFormatTest(self, func, file):
|
| """Overrriden from TypeHandler."""
|
| # TODO(gman): Remove this exception.
|
| @@ -1298,15 +1325,17 @@
|
| """Overrriden from TypeHandler."""
|
| pass
|
|
|
| + def WriteGetDataSizeCode(self, func, file):
|
| + """Overrriden from TypeHandler."""
|
| + file.Write(" uint32 data_size = n * sizeof(GLuint);\n")
|
| +
|
| def WriteHandlerImplementation (self, func, file):
|
| """Overrriden from TypeHandler."""
|
| - func.WriteHandlerValidation(file)
|
| file.Write(" GenGLObjects<GL%sHelper>(n, %s);\n" %
|
| (func.name, func.GetLastOriginalArg().name))
|
|
|
| def WriteImmediateHandlerImplementation(self, func, file):
|
| """Overrriden from TypeHandler."""
|
| - func.WriteHandlerValidation(file)
|
| file.Write(" GenGLObjects<GL%sHelper>(n, %s);\n" %
|
| (func.original_name, func.GetLastOriginalArg().name))
|
|
|
| @@ -1435,7 +1464,6 @@
|
| def WriteHandlerImplementation (self, func, file):
|
| """Overrriden from TypeHandler."""
|
| file.Write(" uint32 client_id = c.client_id;\n")
|
| - func.WriteHandlerValidation(file)
|
| file.Write(" %sHelper(%s);\n" %
|
| (func.name, func.MakeCmdArgString("")))
|
|
|
| @@ -1463,15 +1491,17 @@
|
| def __init__(self):
|
| TypeHandler.__init__(self)
|
|
|
| + def WriteGetDataSizeCode(self, func, file):
|
| + """Overrriden from TypeHandler."""
|
| + file.Write(" uint32 data_size = n * sizeof(GLuint);\n")
|
| +
|
| def WriteHandlerImplementation (self, func, file):
|
| """Overrriden from TypeHandler."""
|
| - func.WriteHandlerValidation(file)
|
| file.Write(" DeleteGLObjects<GL%sHelper>(n, %s);\n" %
|
| (func.name, func.GetLastOriginalArg().name))
|
|
|
| def WriteImmediateHandlerImplementation (self, func, file):
|
| """Overrriden from TypeHandler."""
|
| - func.WriteHandlerValidation(file)
|
| file.Write(" DeleteGLObjects<GL%sHelper>(n, %s);\n" %
|
| (func.original_name, func.GetLastOriginalArg().name))
|
|
|
| @@ -1650,13 +1680,11 @@
|
| def __init__(self):
|
| TypeHandler.__init__(self)
|
|
|
| - def WriteImmediateValidationCode(self, func, file):
|
| + def WriteGetDataSizeCode(self, func, file):
|
| """Overrriden from TypeHandler."""
|
| - file.Write(" if (!CheckImmediateDataSize<%s>("
|
| - "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")
|
| + file.Write(" uint32 data_size = ComputeImmediateDataSize("
|
| + "immediate_data_size, 1, sizeof(%s), %d);\n" %
|
| + (func.info.data_type, func.info.count))
|
|
|
| def WriteGLES2ImplementationHeader(self, func, file):
|
| """Overrriden from TypeHandler."""
|
| @@ -1783,13 +1811,11 @@
|
| def __init__(self):
|
| TypeHandler.__init__(self)
|
|
|
| - def WriteImmediateValidationCode(self, func, file):
|
| + def WriteGetDataSizeCode(self, func, file):
|
| """Overrriden from TypeHandler."""
|
| - file.Write(" if (!CheckImmediateDataSize<%s>("
|
| - "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")
|
| + file.Write(" uint32 data_size = ComputeImmediateDataSize("
|
| + "immediate_data_size, 1, sizeof(%s), %d);\n" %
|
| + (func.info.data_type, func.info.count))
|
|
|
| def WriteGLES2ImplementationHeader(self, func, file):
|
| """Overrriden from TypeHandler."""
|
| @@ -1960,9 +1986,8 @@
|
|
|
| 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\n")
|
| - file.Write(" // immediate_data_size covers data_size.\n")
|
| + " const char* name = GetImmediateDataAs<const char*>(\n")
|
| + file.Write(" c, name_size, immediate_data_size);\n")
|
| func.WriteHandlerValidation(file)
|
| arg_string = ", ".join(["%s" % arg.name for arg in all_but_last_arg])
|
| file.Write(" String name_str(name, name_size);\n")
|
| @@ -2129,9 +2154,8 @@
|
|
|
| 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\n")
|
| - file.Write(" // immediate_data_size covers data_size.\n")
|
| + " const char* name = GetImmediateDataAs<const char*>(\n")
|
| + file.Write(" c, name_size, immediate_data_size);\n")
|
| file.Write(" GLint* location = GetSharedMemoryAs<GLint*>(\n")
|
| file.Write(
|
| " c.location_shm_id, c.location_shm_offset, sizeof(*location));\n")
|
| @@ -2316,7 +2340,45 @@
|
| file.Write("// TODO(gman): Implement this\n")
|
| TypeHandler.WriteGLES2ImplementationHeader(self, func, file)
|
|
|
| + def WriteServiceImplementation(self, func, file):
|
| + """Overrriden from TypeHandler."""
|
| + file.Write(
|
| + "parse_error::ParseError GLES2DecoderImpl::Handle%s(\n" % func.name)
|
| + file.Write(
|
| + " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name)
|
| + args = func.GetOriginalArgs()
|
| + all_but_last_2_args = args[:-2]
|
| + for arg in all_but_last_2_args:
|
| + arg.WriteGetCode(file)
|
| + self.WriteGetDataSizeCode(func, file)
|
| + size_arg = args[-2]
|
| + file.Write(" uint32 size_shm_id = c.%s_shm_id;\n" % size_arg.name)
|
| + file.Write(" uint32 size_shm_offset = c.%s_shm_offset;\n" % size_arg.name)
|
| + file.Write(" GLsizei* length = NULL;\n")
|
| + file.Write(" if (size_shm_id != 0 || size_shm_offset != 0) {\n"
|
| + " length = GetSharedMemoryAs<GLsizei*>(\n"
|
| + " size_shm_id, size_shm_offset, sizeof(*length));\n"
|
| + " if (!length) {\n"
|
| + " return parse_error::kParseOutOfBounds;\n"
|
| + " }\n"
|
| + " }\n")
|
| + dest_arg = args[-1]
|
| + bufsize_arg = args[-3]
|
| + file.Write(
|
| + " %s %s = GetSharedMemoryAs<%s>(\n" %
|
| + (dest_arg.type, dest_arg.name, dest_arg.type))
|
| + file.Write(
|
| + " c.%s_shm_id, c.%s_shm_offset, %s);\n" %
|
| + (dest_arg.name, dest_arg.name, bufsize_arg.name))
|
| + for arg in all_but_last_2_args + [dest_arg]:
|
| + arg.WriteValidationCode(file)
|
| + func.WriteValidationCode(file)
|
| + func.WriteHandlerImplementation(file)
|
| + file.Write(" return parse_error::kParseNoError;\n")
|
| + file.Write("}\n")
|
| + file.Write("\n")
|
|
|
| +
|
| class FunctionInfo(object):
|
| """Holds info about a function."""
|
|
|
| @@ -2427,8 +2489,9 @@
|
| def WriteGetCode(self, file):
|
| """Overridden from Argument."""
|
| file.Write(
|
| - " %s %s = GetImmediateDataAs<%s>(c);\n" %
|
| - (self.type, self.name, self.type))
|
| + " %s %s = GetImmediateDataAs<%s>(\n" %
|
| + (self.type, self.name, self.type))
|
| + file.Write(" c, data_size, immediate_data_size);\n")
|
|
|
| def WriteValidationCode(self, file):
|
| """Overridden from Argument."""
|
| @@ -2462,7 +2525,7 @@
|
| " %s %s = GetSharedMemoryAs<%s>(\n" %
|
| (self.type, self.name, self.type))
|
| file.Write(
|
| - " c.%s_shm_id, c.%s_shm_offset, 0 /* TODO(gman): size */);\n" %
|
| + " c.%s_shm_id, c.%s_shm_offset, data_size);\n" %
|
| (self.name, self.name))
|
|
|
| def WriteGetAddress(self, file):
|
|
|