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 ca0398653177d2d7f67064018d3fffe2a5659c21..95aac878b79705883eb56db478cebd89d97c76e2 100755 |
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py |
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py |
@@ -1238,7 +1238,6 @@ _PEPPER_INTERFACES = [ |
# impl_decl: Whether or not to generate the GLES2Implementation declaration |
# for this command. |
# needs_size: If true a data_size field is added to the command. |
-# data_type: The type of data the command uses. For PUTn or PUT types. |
# count: The number of units per element. For PUTn or PUT types. |
# unit_test: If False no service side unit test will be generated. |
# client_test: If False no client side unit test will be generated. |
@@ -1359,7 +1358,6 @@ _FUNCTION_INFO = { |
'decoder_func': 'DoConsumeTextureCHROMIUM', |
'impl_func': False, |
'type': 'PUT', |
- 'data_type': 'GLbyte', |
'count': 64, # GL_MAILBOX_SIZE_CHROMIUM |
'unit_test': False, |
'client_test': False, |
@@ -1953,7 +1951,6 @@ _FUNCTION_INFO = { |
'decoder_func': 'DoProduceTextureCHROMIUM', |
'impl_func': False, |
'type': 'PUT', |
- 'data_type': 'GLbyte', |
'count': 64, # GL_MAILBOX_SIZE_CHROMIUM |
'unit_test': False, |
'client_test': False, |
@@ -2071,7 +2068,6 @@ _FUNCTION_INFO = { |
}, |
'TexParameterfv': { |
'type': 'PUT', |
- 'data_type': 'GLfloat', |
'data_value': 'GL_NEAREST', |
'count': 1, |
'decoder_func': 'DoTexParameterfv', |
@@ -2080,7 +2076,6 @@ _FUNCTION_INFO = { |
}, |
'TexParameteriv': { |
'type': 'PUT', |
- 'data_type': 'GLint', |
'data_value': 'GL_NEAREST', |
'count': 1, |
'decoder_func': 'DoTexParameteriv', |
@@ -2097,78 +2092,67 @@ _FUNCTION_INFO = { |
'GLenumTextureFormat format, GLenumPixelType type, ' |
'const void* pixels, GLboolean internal' |
}, |
- 'Uniform1f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 1}, |
+ 'Uniform1f': {'type': 'PUTXn', 'count': 1}, |
'Uniform1fv': { |
'type': 'PUTn', |
- 'data_type': 'GLfloat', |
'count': 1, |
'decoder_func': 'DoUniform1fv', |
}, |
'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False}, |
'Uniform1iv': { |
'type': 'PUTn', |
- 'data_type': 'GLint', |
'count': 1, |
'decoder_func': 'DoUniform1iv', |
'unit_test': False, |
}, |
- 'Uniform2i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 2}, |
- 'Uniform2f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 2}, |
+ 'Uniform2i': {'type': 'PUTXn', 'count': 2}, |
+ 'Uniform2f': {'type': 'PUTXn', 'count': 2}, |
'Uniform2fv': { |
'type': 'PUTn', |
- 'data_type': 'GLfloat', |
'count': 2, |
'decoder_func': 'DoUniform2fv', |
}, |
'Uniform2iv': { |
'type': 'PUTn', |
- 'data_type': 'GLint', |
'count': 2, |
'decoder_func': 'DoUniform2iv', |
}, |
- 'Uniform3i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 3}, |
- 'Uniform3f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 3}, |
+ 'Uniform3i': {'type': 'PUTXn', 'count': 3}, |
+ 'Uniform3f': {'type': 'PUTXn', 'count': 3}, |
'Uniform3fv': { |
'type': 'PUTn', |
- 'data_type': 'GLfloat', |
'count': 3, |
'decoder_func': 'DoUniform3fv', |
}, |
'Uniform3iv': { |
'type': 'PUTn', |
- 'data_type': 'GLint', |
'count': 3, |
'decoder_func': 'DoUniform3iv', |
}, |
- 'Uniform4i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 4}, |
- 'Uniform4f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 4}, |
+ 'Uniform4i': {'type': 'PUTXn', 'count': 4}, |
+ 'Uniform4f': {'type': 'PUTXn', 'count': 4}, |
'Uniform4fv': { |
'type': 'PUTn', |
- 'data_type': 'GLfloat', |
'count': 4, |
'decoder_func': 'DoUniform4fv', |
}, |
'Uniform4iv': { |
'type': 'PUTn', |
- 'data_type': 'GLint', |
'count': 4, |
'decoder_func': 'DoUniform4iv', |
}, |
'UniformMatrix2fv': { |
'type': 'PUTn', |
- 'data_type': 'GLfloat', |
'count': 4, |
'decoder_func': 'DoUniformMatrix2fv', |
}, |
'UniformMatrix3fv': { |
'type': 'PUTn', |
- 'data_type': 'GLfloat', |
'count': 9, |
'decoder_func': 'DoUniformMatrix3fv', |
}, |
'UniformMatrix4fv': { |
'type': 'PUTn', |
- 'data_type': 'GLfloat', |
'count': 16, |
'decoder_func': 'DoUniformMatrix4fv', |
}, |
@@ -2206,28 +2190,24 @@ _FUNCTION_INFO = { |
'VertexAttrib1f': {'decoder_func': 'DoVertexAttrib1f'}, |
'VertexAttrib1fv': { |
'type': 'PUT', |
- 'data_type': 'GLfloat', |
'count': 1, |
'decoder_func': 'DoVertexAttrib1fv', |
}, |
'VertexAttrib2f': {'decoder_func': 'DoVertexAttrib2f'}, |
'VertexAttrib2fv': { |
'type': 'PUT', |
- 'data_type': 'GLfloat', |
'count': 2, |
'decoder_func': 'DoVertexAttrib2fv', |
}, |
'VertexAttrib3f': {'decoder_func': 'DoVertexAttrib3f'}, |
'VertexAttrib3fv': { |
'type': 'PUT', |
- 'data_type': 'GLfloat', |
'count': 3, |
'decoder_func': 'DoVertexAttrib3fv', |
}, |
'VertexAttrib4f': {'decoder_func': 'DoVertexAttrib4f'}, |
'VertexAttrib4fv': { |
'type': 'PUT', |
- 'data_type': 'GLfloat', |
'count': 4, |
'decoder_func': 'DoVertexAttrib4fv', |
}, |
@@ -2312,7 +2292,6 @@ _FUNCTION_INFO = { |
'DrawBuffersEXT': { |
'type': 'PUTn', |
'decoder_func': 'DoDrawBuffersEXT', |
- 'data_type': 'GLenum', |
'count': 1, |
'client_test': False, |
'unit_test': False, |
@@ -2533,7 +2512,6 @@ _FUNCTION_INFO = { |
'DiscardFramebufferEXT': { |
'type': 'PUTn', |
'count': 1, |
- 'data_type': 'GLenum', |
'cmd_args': 'GLenum target, GLsizei count, ' |
'const GLenum* attachments', |
'decoder_func': 'DoDiscardFramebufferEXT', |
@@ -4730,12 +4708,35 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
""" |
self.WriteInvalidUnitTest(func, file, invalid_test) |
+class ArrayArgTypeHandler(TypeHandler): |
+ """Base class for type handlers that handle args that are arrays""" |
-class PUTHandler(TypeHandler): |
+ def __init__(self): |
+ TypeHandler.__init__(self) |
+ |
+ def GetArrayType(self, func): |
+ """Returns the type of the element in the element array being PUT to.""" |
+ for arg in func.GetOriginalArgs(): |
+ if arg.IsPointer(): |
+ element_type = arg.GetPointedType() |
+ return element_type |
+ |
+ # Special case: array type handler is used for a function that is forwarded |
+ # to the actual array type implementation |
+ element_type = func.GetOriginalArgs()[-1].type |
+ assert all(arg.type == element_type \ |
+ for arg in func.GetOriginalArgs()[-self.GetArrayCount(func):]) |
+ return element_type |
+ |
+ def GetArrayCount(self, func): |
+ """Returns the count of the elements in the array being PUT to.""" |
+ return func.GetInfo('count') |
+ |
+class PUTHandler(ArrayArgTypeHandler): |
"""Handler for glTexParameter_v, glVertexAttrib_v functions.""" |
def __init__(self): |
- TypeHandler.__init__(self) |
+ ArrayArgTypeHandler.__init__(self) |
def WriteServiceUnitTest(self, func, file): |
"""Writes the service unit test for a command.""" |
@@ -4759,7 +4760,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) { |
} |
""" |
extra = { |
- 'data_type': func.GetInfo('data_type'), |
+ 'data_type': self.GetArrayType(func), |
'data_value': func.GetInfo('data_value') or '0', |
'expected_call': expected_call, |
} |
@@ -4801,8 +4802,8 @@ TEST_P(%(test_name)s, %(name)sValidArgs) { |
gl_any_strings.append("_") |
extra = { |
'data_ref': ("*" if func.GetInfo('first_element_only') else ""), |
- 'data_type': func.GetInfo('data_type'), |
- 'data_count': func.GetInfo('count'), |
+ 'data_type': self.GetArrayType(func), |
+ 'data_count': self.GetArrayCount(func), |
'data_value': func.GetInfo('data_value') or '0', |
'gl_args': ", ".join(gl_arg_strings), |
'gl_any_args': ", ".join(gl_any_strings), |
@@ -4829,7 +4830,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
return error::kOutOfBounds; |
} |
""" |
- file.Write(code % (func.info.data_type, func.info.count)) |
+ file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func))) |
if func.is_immediate: |
file.Write(" if (data_size > immediate_data_size) {\n") |
file.Write(" return error::kOutOfBounds;\n") |
@@ -4848,7 +4849,8 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
self.WriteClientGLCallLog(func, file) |
last_arg_name = func.GetLastOriginalArg().name |
values_str = ' << ", " << '.join( |
- ["%s[%d]" % (last_arg_name, ndx) for ndx in range(0, func.info.count)]) |
+ ["%s[%d]" % (last_arg_name, ndx) \ |
+ for ndx in range(0, self.GetArrayCount(func))]) |
file.Write(' GPU_CLIENT_LOG("values: " << %s);\n' % values_str) |
for arg in func.GetOriginalArgs(): |
arg.WriteClientSideValidationCode(file, func) |
@@ -4888,8 +4890,8 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) |
file.Write(code % { |
'name': func.name, |
- 'type': func.GetInfo('data_type'), |
- 'count': func.GetInfo('count'), |
+ 'type': self.GetArrayType(func), |
+ 'count': self.GetArrayCount(func), |
'args': ", ".join(gl_arg_strings), |
'cmd_args': ", ".join(cmd_arg_strings), |
}) |
@@ -4899,7 +4901,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
file.Write(" static uint32_t ComputeDataSize() {\n") |
file.Write(" return static_cast<uint32_t>(\n") |
file.Write(" sizeof(%s) * %d); // NOLINT\n" % |
- (func.info.data_type, func.info.count)) |
+ (self.GetArrayType(func), self.GetArrayCount(func))) |
file.Write(" }\n") |
file.Write("\n") |
file.Write(" static uint32_t ComputeSize() {\n") |
@@ -4969,10 +4971,10 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
"""Overrriden from TypeHandler.""" |
file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name) |
file.Write(" const int kSomeBaseValueToTestWith = 51;\n") |
- file.Write(" static %s data[] = {\n" % func.info.data_type) |
- for v in range(0, func.info.count): |
+ file.Write(" static %s data[] = {\n" % self.GetArrayType(func)) |
+ for v in range(0, self.GetArrayCount(func)): |
file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" % |
- (func.info.data_type, v)) |
+ (self.GetArrayType(func), v)) |
file.Write(" };\n") |
file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" % |
(func.name, func.name)) |
@@ -5000,15 +5002,15 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
file.Write("\n") |
-class PUTnHandler(TypeHandler): |
+class PUTnHandler(ArrayArgTypeHandler): |
"""Handler for PUTn 'glUniform__v' type functions.""" |
def __init__(self): |
- TypeHandler.__init__(self) |
+ ArrayArgTypeHandler.__init__(self) |
def WriteServiceUnitTest(self, func, file): |
"""Overridden from TypeHandler.""" |
- TypeHandler.WriteServiceUnitTest(self, func, file) |
+ ArrayArgTypeHandler.WriteServiceUnitTest(self, func, file) |
valid_test = """ |
TEST_P(%(test_name)s, %(name)sValidArgsCountTooLarge) { |
@@ -5068,8 +5070,8 @@ TEST_P(%(test_name)s, %(name)sValidArgs) { |
gl_any_strings.append("_") |
arg_strings.append(arg.GetValidArg(func, count, 0)) |
extra = { |
- 'data_type': func.GetInfo('data_type'), |
- 'data_count': func.GetInfo('count'), |
+ 'data_type': self.GetArrayType(func), |
+ 'data_count': self.GetArrayCount(func), |
'args': ", ".join(arg_strings), |
'gl_args': ", ".join(gl_arg_strings), |
'gl_any_args': ", ".join(gl_any_strings), |
@@ -5096,7 +5098,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
return error::kOutOfBounds; |
} |
""" |
- file.Write(code % (func.info.data_type, func.info.count)) |
+ file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func))) |
if func.is_immediate: |
file.Write(" if (data_size > immediate_data_size) {\n") |
file.Write(" return error::kOutOfBounds;\n") |
@@ -5116,8 +5118,8 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
""") |
values_str = ' << ", " << '.join( |
["%s[%d + i * %d]" % ( |
- last_arg_name, ndx, func.info.count) for ndx in range( |
- 0, func.info.count)]) |
+ last_arg_name, ndx, self.GetArrayCount(func)) for ndx in range( |
+ 0, self.GetArrayCount(func))]) |
file.Write(' GPU_CLIENT_LOG(" " << i << ": " << %s);\n' % values_str) |
file.Write(" }\n });\n") |
for arg in func.GetOriginalArgs(): |
@@ -5160,8 +5162,8 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
count_param = int(arg.GetValidClientSideArg(func, count, 0)) |
file.Write(code % { |
'name': func.name, |
- 'type': func.GetInfo('data_type'), |
- 'count': func.GetInfo('count'), |
+ 'type': self.GetArrayType(func), |
+ 'count': self.GetArrayCount(func), |
'args': ", ".join(gl_arg_strings), |
'cmd_args': ", ".join(cmd_arg_strings), |
'count_param': count_param, |
@@ -5172,7 +5174,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
file.Write(" static uint32_t ComputeDataSize(GLsizei count) {\n") |
file.Write(" return static_cast<uint32_t>(\n") |
file.Write(" sizeof(%s) * %d * count); // NOLINT\n" % |
- (func.info.data_type, func.info.count)) |
+ (self.GetArrayType(func), self.GetArrayCount(func))) |
file.Write(" }\n") |
file.Write("\n") |
file.Write(" static uint32_t ComputeSize(GLsizei count) {\n") |
@@ -5247,17 +5249,17 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
count_param = int(arg.GetValidClientSideArg(func, value, 0)) |
file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name) |
file.Write(" const int kSomeBaseValueToTestWith = 51;\n") |
- file.Write(" static %s data[] = {\n" % func.info.data_type) |
- for v in range(0, func.info.count * count_param): |
+ file.Write(" static %s data[] = {\n" % self.GetArrayType(func)) |
+ for v in range(0, self.GetArrayCount(func) * count_param): |
file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" % |
- (func.info.data_type, v)) |
+ (self.GetArrayType(func), v)) |
file.Write(" };\n") |
file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" % |
(func.name, func.name)) |
file.Write(" const GLsizei kNumElements = %d;\n" % count_param) |
file.Write(" const size_t kExpectedCmdSize =\n") |
file.Write(" sizeof(cmd) + kNumElements * sizeof(%s) * %d;\n" % |
- (func.info.data_type, func.info.count)) |
+ (self.GetArrayType(func), self.GetArrayCount(func))) |
file.Write(" void* next_cmd = cmd.Set(\n") |
file.Write(" &cmd") |
for value, arg in enumerate(args): |
@@ -5278,10 +5280,10 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
file.Write("\n") |
-class PUTXnHandler(TypeHandler): |
+class PUTXnHandler(ArrayArgTypeHandler): |
"""Handler for glUniform?f functions.""" |
def __init__(self): |
- TypeHandler.__init__(self) |
+ ArrayArgTypeHandler.__init__(self) |
def WriteHandlerImplementation(self, func, file): |
"""Overrriden from TypeHandler.""" |
@@ -5290,15 +5292,15 @@ class PUTXnHandler(TypeHandler): |
""" |
values = "" |
args = func.GetOriginalArgs() |
- count = int(func.GetInfo('count')) |
+ count = int(self.GetArrayCount(func)) |
num_args = len(args) |
for ii in range(count): |
values += "%s, " % args[len(args) - count + ii].name |
file.Write(code % { |
'name': func.name, |
- 'count': func.GetInfo('count'), |
- 'type': func.GetInfo('data_type'), |
+ 'count': self.GetArrayCount(func), |
+ 'type': self.GetArrayType(func), |
'location': args[0].name, |
'args': func.MakeOriginalArgString(""), |
'values': values, |
@@ -5320,7 +5322,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) { |
local_args = "%s, 1, _" % args[0].GetValidGLArg(func, 0, 0) |
self.WriteValidUnitTest(func, file, valid_test, { |
'name': func.name, |
- 'count': func.GetInfo('count'), |
+ 'count': self.GetArrayCount(func), |
'local_args': local_args, |
}) |
@@ -5335,7 +5337,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
""" |
self.WriteInvalidUnitTest(func, file, invalid_test, { |
'name': func.GetInfo('name'), |
- 'count': func.GetInfo('count'), |
+ 'count': self.GetArrayCount(func), |
}) |
@@ -6115,6 +6117,14 @@ class ImmediatePointerArgument(Argument): |
def __init__(self, name, type): |
Argument.__init__(self, name, type) |
+ def IsPointer(self): |
+ return True |
+ |
+ def GetPointedType(self): |
+ match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type) |
+ assert match |
+ return match.groupdict()['element_type'] |
+ |
def AddCmdArgs(self, args): |
"""Overridden from Argument.""" |
pass |
@@ -6188,6 +6198,11 @@ class PointerArgument(Argument): |
"""Returns true if argument is a pointer.""" |
return True |
+ def GetPointedType(self): |
+ match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type) |
+ assert match |
+ return match.groupdict()['element_type'] |
+ |
def GetValidArg(self, func, offset, index): |
"""Overridden from Argument.""" |
return "shared_memory_id_, shared_memory_offset_" |