diff options
Diffstat (limited to 'gpu/command_buffer/build_gles2_cmd_buffer.py')
-rwxr-xr-x | gpu/command_buffer/build_gles2_cmd_buffer.py | 444 |
1 files changed, 188 insertions, 256 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index f58dbc7..16f084b 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -360,6 +360,10 @@ _CMD_ID_TABLE = { 'VertexAttribPointer': 429, 'Viewport': 430, 'SwapBuffers': 431, + 'BindAttribLocationBucket': 432, + 'GetUniformLocationBucket': 433, + 'GetAttribLocationBucket': 434, + 'ShaderSourceBucket': 435, } # This is a list of enum names and their valid values. It is used to map @@ -934,6 +938,7 @@ _ENUM_LISTS = { # 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. +# bucket: True to generate a bucket version of the command. # impl_func: Whether or not to generate the GLES2Implementation part of this # command. # needs_size: If true a data_size field is added to the command. @@ -944,7 +949,7 @@ _ENUM_LISTS = { _FUNCTION_INFO = { 'ActiveTexture': {'decoder_func': 'DoActiveTexture', 'unit_test': False}, - 'BindAttribLocation': {'type': 'GLchar'}, + 'BindAttribLocation': {'type': 'GLchar', 'bucket': True, 'needs_size': True}, 'BindBuffer': {'decoder_func': 'DoBindBuffer'}, 'BindFramebuffer': { 'decoder_func': 'DoBindFramebuffer', @@ -1040,6 +1045,7 @@ _FUNCTION_INFO = { 'GetAttribLocation': { 'type': 'HandWritten', 'immediate': True, + 'bucket': True, 'needs_size': True, 'cmd_args': 'GLidProgram program, const char* name, NonImmediate GLint* location', @@ -1122,6 +1128,7 @@ _FUNCTION_INFO = { 'GetUniformLocation': { 'type': 'HandWritten', 'immediate': True, + 'bucket': True, 'needs_size': True, 'cmd_args': 'GLidProgram program, const char* name, NonImmediate GLint* location', @@ -1166,6 +1173,7 @@ _FUNCTION_INFO = { 'ShaderSource': { 'type': 'Manual', 'immediate': True, + 'bucket': True, 'needs_size': True, 'cmd_args': 'GLuint shader, const char* data', @@ -1335,7 +1343,7 @@ class TypeHandler(object): def InitFunction(self, func): """Add or adjust anything type specific for this function.""" if func.GetInfo('needs_size'): - func.AddCmdArg(Argument('data_size', 'uint32')) + func.AddCmdArg(DataSizeArgument('data_size')) def AddImmediateFunction(self, generator, func): """Adds an immediate version of a function.""" @@ -1345,6 +1353,14 @@ class TypeHandler(object): if func.num_pointer_args == 1 or immediate: generator.AddFunction(ImmediateFunction(func)) + def AddBucketFunction(self, generator, func): + """Adds a bucket version of a function.""" + # Generate an immediate command if there is only 1 pointer arg. + bucket = func.GetInfo('bucket') # can be True, False or None + if bucket: + generator.AddFunction(BucketFunction(func)) + + def WriteStruct(self, func, file): """Writes a structure that matches the arguments to a function.""" comment = func.GetInfo('cmd_comment') @@ -1467,6 +1483,10 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write("}\n") file.Write("\n") + def WriteBucketFormatTest(self, func, file): + """Writes a format test for a bucket version of a command.""" + pass + def WriteGetDataSizeCode(self, func, file): """Writes the code to set data_size used in validation""" pass @@ -1481,6 +1501,11 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write(" %s(%s);\n" % (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) + def WriteBucketHandlerImplementation (self, func, file): + """Writes the handler impl for the bucket version of a command.""" + file.Write(" %s(%s);\n" % + (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) + def WriteServiceImplementation(self, func, file): """Writes the service implementation for a command.""" file.Write( @@ -1518,6 +1543,24 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write("}\n") file.Write("\n") + def WriteBucketServiceImplementation(self, func, file): + """Writes the service implementation for a bucket version of command.""" + file.Write( + "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) + file.Write( + " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name) + 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 error::kNoError;\n") + file.Write("}\n") + file.Write("\n") + def WriteValidUnitTest(self, func, file, test, extra = {}): """Writes a valid unit test.""" if func.GetInfo('expectation') == False: @@ -1621,6 +1664,14 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { """Writes the validation code for an immediate version of a command.""" pass + def WriteBucketServiceUnitTest(self, func, file): + """Writes the service unit test for a bucket command.""" + file.Write("// TODO(gman): %s\n" % func.name) + + def WriteBucketValidationCode(self, func, file): + """Writes the validation code for a bucket version of a command.""" + file.Write("// TODO(gman): %s\n" % func.name) + def WriteGLES2ImplementationDeclaration(self, func, file): """Writes the GLES2 Implemention declaration.""" file.Write("%s %s(%s);\n" % @@ -1701,6 +1752,10 @@ class CustomHandler(TypeHandler): """Overrriden from TypeHandler.""" pass + def WriteImmediateServiceImplementation(self, func, file): + """Overrriden from TypeHandler.""" + pass + def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" file.Write("// TODO(gman): %s\n\n" % func.name) @@ -1765,6 +1820,10 @@ class HandWrittenHandler(CustomHandler): """Overrriden from TypeHandler.""" file.Write("// TODO(gman): %s\n\n" % func.name) + def WriteBucketServiceUnitTest(self, func, file): + """Overrriden from TypeHandler.""" + file.Write("// TODO(gman): %s\n\n" % func.name) + def WriteServiceImplementation(self, func, file): """Overrriden from TypeHandler.""" pass @@ -1773,10 +1832,18 @@ class HandWrittenHandler(CustomHandler): """Overrriden from TypeHandler.""" pass + def WriteBucketServiceImplementation(self, func, file): + """Overrriden from TypeHandler.""" + pass + def WriteImmediateCmdHelper(self, func, file): """Overrriden from TypeHandler.""" pass + def WriteBucketCmdHelper(self, func, file): + """Overrriden from TypeHandler.""" + pass + def WriteCmdHelper(self, func, file): """Overrriden from TypeHandler.""" pass @@ -1789,6 +1856,11 @@ class HandWrittenHandler(CustomHandler): """Overrriden from TypeHandler.""" file.Write("// TODO(gman): Write test for %s\n" % func.name) + def WriteBucketFormatTest(self, func, file): + """Overrriden from TypeHandler.""" + file.Write("// TODO(gman): Write test for %s\n" % func.name) + + class ManualHandler(CustomHandler): """Handler for commands who's handlers must be written by hand.""" @@ -2530,7 +2602,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { %(name)s cmd; cmd.Init(%(args)s); EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd)); - EXPECT_EQ(0, result->size);%(gl_error_test)s + EXPECT_EQ(0u, result->size);%(gl_error_test)s } """ self.WriteInvalidUnitTest(func, file, invalid_test) @@ -2894,85 +2966,11 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { file.Write("\n") -class GLcharHandler(TypeHandler): +class GLcharHandler(CustomHandler): """Handler for functions that pass a single string .""" def __init__(self): - TypeHandler.__init__(self) - - def InitFunction(self, func): - """Overrriden from TypeHandler.""" - func.AddCmdArg(Argument('data_size', 'uint32')) - - def WriteServiceUnitTest(self, func, file): - """Overrriden from TypeHandler.""" - file.Write("// TODO(gman): %s\n\n" % func.name) - - def WriteImmediateServiceUnitTest(self, func, file): - """Overrriden from TypeHandler.""" - file.Write("// TODO(gman): %s\n\n" % func.name) - - def WriteServiceImplementation(self, func, file): - """Overrriden from TypeHandler.""" - file.Write( - "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) - file.Write( - " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name) - last_arg = func.GetLastOriginalArg() - - all_but_last_arg = func.GetOriginalArgs()[:-1] - for arg in all_but_last_arg: - arg.WriteGetCode(file) - - file.Write(" uint32 name_size = c.data_size;\n") - file.Write(" const char* name = GetSharedMemoryAs<%s>(\n" % - last_arg.type) - file.Write(" c.%s_shm_id, c.%s_shm_offset, name_size);\n" % - (last_arg.name, last_arg.name)) - 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") - file.Write(" %s(%s, name_str.c_str());\n" % - (func.GetGLFunctionName(), arg_string)) - file.Write(" return error::kNoError;\n") - file.Write("}\n") - file.Write("\n") - - def WriteImmediateServiceImplementation(self, func, file): - """Overrriden from TypeHandler.""" - file.Write( - "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) - file.Write( - " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name) - last_arg = func.GetLastOriginalArg() - - all_but_last_arg = func.GetOriginalArgs()[:-1] - for arg in all_but_last_arg: - arg.WriteGetCode(file) - - file.Write(" uint32 name_size = c.data_size;\n") - file.Write( - " 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") - file.Write(" %s(%s, name_str.c_str());\n" % - (func.GetGLFunctionName(), arg_string)) - file.Write(" return error::kNoError;\n") - file.Write("}\n") - file.Write("\n") - - def WriteGLES2ImplementationHeader(self, func, file): - """Overrriden from TypeHandler.""" - file.Write("%s %s(%s) {\n" % - (func.return_type, func.original_name, - func.MakeTypedOriginalArgString(""))) - file.Write(" // TODO(gman): This needs to change to use SendString.\n") - file.Write(" helper_->%sImmediate(%s);\n" % - (func.name, func.MakeOriginalArgString(""))) - file.Write("}\n") - file.Write("\n") + CustomHandler.__init__(self) def WriteImmediateCmdComputeSize(self, func, file): """Overrriden from TypeHandler.""" @@ -3072,6 +3070,7 @@ TEST(GLES2FormatTest, %(func_name)s) { EXPECT_EQ(static_cast<uint32>(strlen(test_str)), cmd.data_size); EXPECT_EQ(0, memcmp(test_str, ImmediateDataAddress(&cmd), strlen(test_str))); } + """ file.Write(code % { 'func_name': func.name, @@ -3079,180 +3078,6 @@ TEST(GLES2FormatTest, %(func_name)s) { 'check_code': "\n".join(check_code), }) -class GetGLcharHandler(GLcharHandler): - """Handler for glGetAttibLoc, glGetUniformLoc.""" - - def __init__(self): - GLcharHandler.__init__(self) - - def WriteServiceUnitTest(self, func, file): - """Overrriden from TypeHandler.""" - file.Write("// TODO(gman): %s\n\n" % func.name) - - def WriteImmediateServiceUnitTest(self, func, file): - """Overrriden from TypeHandler.""" - file.Write("// TODO(gman): %s\n\n" % func.name) - - def WriteServiceImplementation(self, func, file): - """Overrriden from TypeHandler.""" - file.Write( - "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) - file.Write( - " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name) - last_arg = func.GetLastOriginalArg() - - all_but_last_arg = func.GetOriginalArgs() - for arg in all_but_last_arg: - arg.WriteGetCode(file) - - file.Write(" uint32 name_size = c.data_size;\n") - file.Write(" const char* name = GetSharedMemoryAs<%s>(\n" % - 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") - 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") - file.Write(" *location = %s(%s, name_str.c_str());\n" % - (func.GetGLFunctionName(), arg_string)) - file.Write(" return error::kNoError;\n") - file.Write("}\n") - file.Write("\n") - - def WriteImmediateServiceImplementation(self, func, file): - """Overrriden from TypeHandler.""" - file.Write( - "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) - file.Write( - " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name) - last_arg = func.GetLastOriginalArg() - - all_but_last_arg = func.GetOriginalArgs()[:-1] - for arg in all_but_last_arg: - arg.WriteGetCode(file) - - file.Write(" uint32 name_size = c.data_size;\n") - file.Write( - " 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") - file.Write(" // TODO(gman): Validate location.\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") - file.Write(" *location = %s(%s, name_str.c_str());\n" % - (func.GetGLFunctionName(), arg_string)) - file.Write(" return error::kNoError;\n") - file.Write("}\n") - file.Write("\n") - - def WriteGLES2ImplementationHeader(self, func, file): - """Overrriden from TypeHandler.""" - file.Write("%s %s(%s) {\n" % - (func.return_type, func.original_name, - func.MakeTypedOriginalArgString(""))) - file.Write(" // TODO(gman): This needs to change to use SendString.\n") - file.Write(" GLint* result = shared_memory_.GetAddressAs<GLint*>(0);\n") - file.Write(" DCHECK(false); // pass in shared memory\n") - file.Write(" helper_->%sImmediate(%s);\n" % - (func.name, func.MakeOriginalArgString(""))) - file.Write(" int32 token = helper_->InsertToken();\n") - file.Write(" helper_->WaitForToken(token);\n") - file.Write(" return *result;\n") - file.Write("}\n") - file.Write("\n") - - def WriteImmediateCmdComputeSize(self, func, file): - """Overrriden from TypeHandler.""" - file.Write(" static uint32 ComputeDataSize(const char* s) {\n") - file.Write(" return strlen(s);\n") - file.Write(" }\n") - file.Write("\n") - file.Write(" static uint32 ComputeSize(const char* s) {\n") - file.Write(" return static_cast<uint32>(\n") - file.Write(" sizeof(ValueType) + ComputeDataSize(s)); // NOLINT\n") - file.Write(" }\n") - file.Write("\n") - - def WriteImmediateCmdSetHeader(self, func, file): - """Overrriden from TypeHandler.""" - file.Write(" void SetHeader(const char* s) {\n") - file.Write(" header.SetCmdByTotalSize<ValueType>(ComputeSize(s));\n") - file.Write(" }\n") - file.Write("\n") - - def WriteImmediateCmdInit(self, func, file): - """Overrriden from TypeHandler.""" - 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 = 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.""" - file.Write(" void* Set(void* cmd%s) {\n" % - func.MakeTypedInitString("_", True)) - file.Write(" static_cast<ValueType*>(cmd)->Init(%s);\n" % - func.MakeInitString("_")) - file.Write(" const uint32 size = ComputeSize(_name);\n") - file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>(" - "cmd, size);\n") - file.Write(" }\n") - file.Write("\n") - - def WriteImmediateCmdHelper(self, func, file): - """Overrriden from TypeHandler.""" - file.Write(" void %s(%s) {\n" % - (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" % func.MakeCmdArgString("")) - file.Write(" }\n\n") - - def WriteImmediateFormatTest(self, func, file): - """Overrriden from TypeHandler.""" - file.Write("TEST(GLES2FormatTest, %s) {\n" % func.name) - file.Write(" int8 buf[256] = { 0, };\n") - file.Write(" %s& cmd = *static_cast<%s*>(static_cast<void*>(&buf));\n" % - (func.name, func.name)) - file.Write(" static const char* const test_str = \"test string\";\n") - file.Write(" void* next_cmd = cmd.Set(\n") - file.Write(" &cmd") - all_but_last_arg = func.GetCmdArgs()[:-1] - value = 11 - for arg in all_but_last_arg: - file.Write(",\n static_cast<%s>(%d)" % (arg.type, value)) - value += 1 - file.Write(",\n test_str);\n") - value = 11 - file.Write(" EXPECT_EQ(%s::kCmdId ^ cmd.header.command);\n" % func.name) - file.Write(" EXPECT_EQ(sizeof(cmd)\n") - file.Write(" RoundSizeToMultipleOfEntries(strlen(test_str)),\n") - file.Write(" cmd.header.size * 4u);\n") - file.Write(" EXPECT_EQ(static_cast<char*>(next_cmd),\n") - file.Write(" reinterpret_cast<char*>(&cmd) + sizeof(cmd));\n"); - for arg in all_but_last_arg: - file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" % - (arg.type, value, arg.name)) - value += 1 - file.Write(" // TODO(gman): check that string got copied.\n") - file.Write("}\n") - file.Write("\n") - class IsHandler(TypeHandler): """Handler for glIs____ type and glGetError functions.""" @@ -3568,6 +3393,19 @@ class Argument(object): """Gets the immediate version of this argument.""" return self + def GetBucketVersion(self): + """Gets the bucket version of this argument.""" + return self + +class DataSizeArgument(Argument): + """class for data_size which Bucket commands do not need.""" + + def __init__(self, name): + Argument.__init__(self, name, "uint32") + + def GetBucketVersion(self): + return None + class SizeArgument(Argument): """class for GLsizei and GLsizeiptr.""" @@ -3769,6 +3607,42 @@ class PointerArgument(Argument): """Overridden from Argument.""" return ImmediatePointerArgument(self.name, self.type) + def GetBucketVersion(self): + """Overridden from Argument.""" + if self.type == "const char*": + return InputStringBucketArgument(self.name, self.type) + return self + + +class InputStringBucketArgument(Argument): + """An string input argument where the string is passed in a bucket.""" + + def __init__(self, name, type): + Argument.__init__(self, name + "_bucket_id", "uint32") + + def WriteGetCode(self, file): + """Overridden from Argument.""" + code = """ + Bucket* %(name)s_bucket = GetBucket(c.%(name)s); + if (!%(name)s_bucket) { + return error::kInvalidArguments; + } + std::string %(name)s_str; + if (!%(name)s_bucket->GetAsString(&%(name)s_str)) { + return error::kInvalidArguments; + } + const char* %(name)s = %(name)s_str.c_str(); +""" + file.Write(code % { + 'name': self.name, + }) + + def GetValidArg(self, offset, index): + return "kNameBucketId" + + def GetValidGLArg(self, offset, index): + return "_" + class NonImmediatePointerArgument(PointerArgument): """A pointer argument that stays a pointer even in an immediate cmd.""" @@ -3852,14 +3726,18 @@ class Function(object): self.can_auto_generate = num_pointer_args == 0 and return_type == "void" self.cmd_args = cmd_args self.init_args = init_args + self.InitFunction() self.args_for_cmds = args_for_cmds - self.type_handler.InitFunction(self) self.is_immediate = False def IsType(self, type_name): """Returns true if function is a certain type.""" return self.info.type == type_name + def InitFunction(self): + """Calls the init function for the type handler.""" + self.type_handler.InitFunction(self) + def GetInfo(self, name): """Returns a value from the function info for this function.""" if hasattr(self.info, name): @@ -4116,6 +3994,57 @@ class ImmediateFunction(Function): self.type_handler.WriteImmediateFormatTest(self, file) +class BucketFunction(Function): + """A class that represnets a bucket version of a function command.""" + + def __init__(self, func): + new_args = [] + for arg in func.GetOriginalArgs(): + new_arg = arg.GetBucketVersion() + if new_arg: + new_args.append(new_arg) + + cmd_args = [] + new_args_for_cmds = [] + for arg in func.args_for_cmds: + new_arg = arg.GetBucketVersion() + if new_arg: + 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, + func.original_name, + "%sBucket" % func.name, + func.info, + func.return_type, + new_args, + new_args_for_cmds, + cmd_args, + new_init_args, + 0) + + def InitFunction(self): + """Overridden from Function""" + pass + + def WriteServiceImplementation(self, file): + """Overridden from Function""" + pass + + def WriteHandlerImplementation(self, file): + """Overridden from Function""" + self.type_handler.WriteBucketHandlerImplementation(self, file) + + def WriteServiceUnitTest(self, file): + """Writes the service implementation for a command.""" + self.type_handler.WriteBucketServiceUnitTest(self, file) + + def CreateArg(arg_string): """Creates an Argument.""" arg_parts = arg_string.split() @@ -4170,7 +4099,6 @@ class GLGenerator(object): 'DELn': DELnHandler(), 'GENn': GENnHandler(), 'GETn': GETnHandler(), - 'GetGLchar': GetGLcharHandler(), 'GLchar': GLcharHandler(), 'HandWritten': HandWrittenHandler(), 'Is': IsHandler(), @@ -4279,6 +4207,7 @@ class GLGenerator(object): self.original_functions.append(f) self.AddFunction(f) f.type_handler.AddImmediateFunction(self, f) + f.type_handler.AddBucketFunction(self, f) self.Log("Auto Generated Functions : %d" % len([f for f in self.functions if f.can_auto_generate or @@ -4296,11 +4225,14 @@ class GLGenerator(object): """Writes the command buffer format""" file = CHeaderWriter(filename) file.Write("#define GLES2_COMMAND_LIST(OP) \\\n") + by_id = {} for func in self.functions: if not func.name in _CMD_ID_TABLE: self.Error("Command %s not in _CMD_ID_TABLE" % func.name) + by_id[_CMD_ID_TABLE[func.name]] = func + for id in sorted(by_id.keys()): file.Write(" %-60s /* %d */ \\\n" % - ("OP(%s)" % func.name, _CMD_ID_TABLE[func.name])) + ("OP(%s)" % by_id[id].name, id)) file.Write("\n") file.Write("enum CommandId {\n") |