| 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 95aac878b79705883eb56db478cebd89d97c76e2..8f6cf77257a775b20f732e4fddd4315b88bccc9d 100755
|
| --- a/gpu/command_buffer/build_gles2_cmd_buffer.py
|
| +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
|
| @@ -1213,8 +1213,11 @@ _PEPPER_INTERFACES = [
|
| {'name': 'DrawBuffers', 'dev': True},
|
| ]
|
|
|
| -# This table specifies types and other special data for the commands that
|
| -# will be generated.
|
| +# A function info object specifies the type and other special data for the
|
| +# command that will be generated. A base function info object is generated by
|
| +# parsing the "cmd_buffer_functions.txt", one for each function in the
|
| +# file. These function info objects can be augmented and their values can be
|
| +# overridden by adding an object to the table below.
|
| #
|
| # Must match function names specified in "cmd_buffer_functions.txt".
|
| #
|
| @@ -4831,7 +4834,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
|
| }
|
| """
|
| file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func)))
|
| - if func.is_immediate:
|
| + if func.IsImmediate():
|
| file.Write(" if (data_size > immediate_data_size) {\n")
|
| file.Write(" return error::kOutOfBounds;\n")
|
| file.Write(" }\n")
|
| @@ -5099,7 +5102,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
|
| }
|
| """
|
| file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func)))
|
| - if func.is_immediate:
|
| + if func.IsImmediate():
|
| file.Write(" if (data_size > immediate_data_size) {\n")
|
| file.Write(" return error::kOutOfBounds;\n")
|
| file.Write(" }\n")
|
| @@ -5773,18 +5776,6 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) {
|
| """Overrriden from TypeHandler."""
|
| pass
|
|
|
| -
|
| -class FunctionInfo(object):
|
| - """Holds info about a function."""
|
| -
|
| - def __init__(self, info, type_handler):
|
| - for key in info:
|
| - setattr(self, key, info[key])
|
| - self.type_handler = type_handler
|
| - if not 'type' in info:
|
| - self.type = ''
|
| -
|
| -
|
| class Argument(object):
|
| """A class that represents a function argument."""
|
|
|
| @@ -5960,7 +5951,7 @@ class SizeArgument(Argument):
|
|
|
| def GetNumInvalidValues(self, func):
|
| """overridden from Argument."""
|
| - if func.is_immediate:
|
| + if func.IsImmediate():
|
| return 0
|
| return 1
|
|
|
| @@ -6389,35 +6380,102 @@ class ResourceIdZeroArgument(Argument):
|
| class Function(object):
|
| """A class that represents a function."""
|
|
|
| - def __init__(self, original_name, name, info, return_type, original_args,
|
| - args_for_cmds, cmd_args, init_args, num_pointer_args):
|
| + type_handlers = {
|
| + '': TypeHandler(),
|
| + 'Bind': BindHandler(),
|
| + 'Create': CreateHandler(),
|
| + 'Custom': CustomHandler(),
|
| + 'Data': DataHandler(),
|
| + 'Delete': DeleteHandler(),
|
| + 'DELn': DELnHandler(),
|
| + 'GENn': GENnHandler(),
|
| + 'GETn': GETnHandler(),
|
| + 'GLchar': GLcharHandler(),
|
| + 'GLcharN': GLcharNHandler(),
|
| + 'HandWritten': HandWrittenHandler(),
|
| + 'Is': IsHandler(),
|
| + 'Manual': ManualHandler(),
|
| + 'PUT': PUTHandler(),
|
| + 'PUTn': PUTnHandler(),
|
| + 'PUTXn': PUTXnHandler(),
|
| + 'StateSet': StateSetHandler(),
|
| + 'StateSetRGBAlpha': StateSetRGBAlphaHandler(),
|
| + 'StateSetFrontBack': StateSetFrontBackHandler(),
|
| + 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(),
|
| + 'StateSetNamedParameter': StateSetNamedParameter(),
|
| + 'STRn': STRnHandler(),
|
| + 'Todo': TodoHandler(),
|
| + }
|
| +
|
| + def __init__(self, name, info):
|
| self.name = name
|
| - self.original_name = original_name
|
| + self.original_name = info['original_name']
|
| +
|
| + self.original_args = self.ParseArgs(info['original_args'])
|
| +
|
| + if 'cmd_args' in info:
|
| + self.args_for_cmds = self.ParseArgs(info['cmd_args'])
|
| + else:
|
| + self.args_for_cmds = self.original_args[:]
|
| +
|
| + self.return_type = info['return_type']
|
| + if self.return_type != 'void':
|
| + self.return_arg = CreateArg(info['return_type'] + " result")
|
| + else:
|
| + self.return_arg = None
|
| +
|
| + self.num_pointer_args = sum(
|
| + [1 for arg in self.args_for_cmds if arg.IsPointer()])
|
| self.info = info
|
| - self.type_handler = info.type_handler
|
| - self.return_type = return_type
|
| - self.original_args = original_args
|
| - 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.type_handler = self.type_handlers[info['type']]
|
| + self.can_auto_generate = (self.num_pointer_args == 0 and
|
| + info['return_type'] == "void")
|
| self.InitFunction()
|
| - self.args_for_cmds = args_for_cmds
|
| - self.is_immediate = False
|
| +
|
| + def ParseArgs(self, arg_string):
|
| + """Parses a function arg string."""
|
| + args = []
|
| + parts = arg_string.split(',')
|
| + for arg_string in parts:
|
| + arg = CreateArg(arg_string)
|
| + if arg:
|
| + args.append(arg)
|
| + return args
|
|
|
| def IsType(self, type_name):
|
| """Returns true if function is a certain type."""
|
| - return self.info.type == type_name
|
| + return self.info['type'] == type_name
|
|
|
| def InitFunction(self):
|
| - """Calls the init function for the type handler."""
|
| + """Creates command args and calls the init function for the type handler.
|
| +
|
| + Creates argument lists for command buffer commands, eg. self.cmd_args and
|
| + self.init_args.
|
| + Calls the type function initialization.
|
| + Override to create different kind of command buffer command argument lists.
|
| + """
|
| + self.cmd_args = []
|
| + for arg in self.args_for_cmds:
|
| + arg.AddCmdArgs(self.cmd_args)
|
| +
|
| + self.init_args = []
|
| + for arg in self.args_for_cmds:
|
| + arg.AddInitArgs(self.init_args)
|
| +
|
| + if self.return_arg:
|
| + self.init_args.append(self.return_arg)
|
| +
|
| self.type_handler.InitFunction(self)
|
|
|
| - def GetInfo(self, name):
|
| + def IsImmediate(self):
|
| + """Returns whether the function is immediate data function or not."""
|
| + return False
|
| +
|
| + def GetInfo(self, name, default = None):
|
| """Returns a value from the function info for this function."""
|
| - if hasattr(self.info, name):
|
| - return getattr(self.info, name)
|
| - return None
|
| + if name in self.info:
|
| + return self.info[name]
|
| + return default
|
|
|
| def GetValidArg(self, index):
|
| """Gets a valid arg from the function info if one exists."""
|
| @@ -6428,7 +6486,7 @@ class Function(object):
|
|
|
| def AddInfo(self, name, value):
|
| """Adds an info."""
|
| - setattr(self.info, name, value)
|
| + self.info[name] = value
|
|
|
| def IsCoreGLFunction(self):
|
| return (not self.GetInfo('extension') and
|
| @@ -6570,11 +6628,10 @@ class Function(object):
|
| def WriteCmdFlag(self, file):
|
| """Writes the cmd cmd_flags constant."""
|
| flags = []
|
| - trace_level = 3 # By default trace only at the highest level
|
| - if hasattr(self.info, 'trace_level'):
|
| - if (self.info.trace_level < 0) or (self.info.trace_level > 3):
|
| - raise KeyError("Unhandled trace_level: %d" % self.info.trace_level)
|
| - trace_level = self.info.trace_level
|
| + # By default trace only at the highest level 3.
|
| + trace_level = int(self.GetInfo('trace_level', default = 3))
|
| + if trace_level not in xrange(0, 4):
|
| + raise KeyError("Unhandled trace_level: %d" % trace_level)
|
|
|
| flags.append('CMD_FLAG_SET_TRACE_LEVEL(%d)' % trace_level)
|
|
|
| @@ -6728,36 +6785,34 @@ class ImmediateFunction(Function):
|
| """A class that represnets an immediate function command."""
|
|
|
| def __init__(self, func):
|
| - new_args = []
|
| - for arg in func.GetOriginalArgs():
|
| + Function.__init__(
|
| + self,
|
| + "%sImmediate" % func.name,
|
| + func.info)
|
| +
|
| + def InitFunction(self):
|
| + # Override args in original_args and args_for_cmds with immediate versions
|
| + # of the args.
|
| +
|
| + new_original_args = []
|
| + for arg in self.original_args:
|
| new_arg = arg.GetImmediateVersion()
|
| if new_arg:
|
| - new_args.append(new_arg)
|
| + new_original_args.append(new_arg)
|
| + self.original_args = new_original_args
|
|
|
| - cmd_args = []
|
| new_args_for_cmds = []
|
| - for arg in func.args_for_cmds:
|
| + for arg in self.args_for_cmds:
|
| new_arg = arg.GetImmediateVersion()
|
| 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)
|
| + self.args_for_cmds = new_args_for_cmds
|
|
|
| - Function.__init__(
|
| - self,
|
| - func.original_name,
|
| - "%sImmediate" % func.name,
|
| - func.info,
|
| - func.return_type,
|
| - new_args,
|
| - new_args_for_cmds,
|
| - cmd_args,
|
| - new_init_args,
|
| - 0)
|
| - self.is_immediate = True
|
| + Function.InitFunction(self)
|
| +
|
| + def IsImmediate(self):
|
| + return True
|
|
|
| def WriteCommandDescription(self, file):
|
| """Overridden from Function"""
|
| @@ -6813,39 +6868,31 @@ 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():
|
| + Function.__init__(
|
| + self,
|
| + "%sBucket" % func.name,
|
| + func.info)
|
| +
|
| + def InitFunction(self):
|
| + # Override args in original_args and args_for_cmds with bucket versions
|
| + # of the args.
|
| +
|
| + new_original_args = []
|
| + for arg in self.original_args:
|
| new_arg = arg.GetBucketVersion()
|
| if new_arg:
|
| - new_args.append(new_arg)
|
| + new_original_args.append(new_arg)
|
| + self.original_args = new_original_args
|
|
|
| - cmd_args = []
|
| new_args_for_cmds = []
|
| - for arg in func.args_for_cmds:
|
| + for arg in self.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)
|
| + self.args_for_cmds = new_args_for_cmds
|
|
|
| - 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
|
| + Function.InitFunction(self)
|
|
|
| def WriteCommandDescription(self, file):
|
| """Overridden from Function"""
|
| @@ -6919,45 +6966,9 @@ class GLGenerator(object):
|
| self.functions = []
|
| self.verbose = verbose
|
| self.errors = 0
|
| - self._function_info = {}
|
| - self._empty_type_handler = TypeHandler()
|
| - self._empty_function_info = FunctionInfo({}, self._empty_type_handler)
|
| self.pepper_interfaces = []
|
| self.interface_info = {}
|
|
|
| - self._type_handlers = {
|
| - 'Bind': BindHandler(),
|
| - 'Create': CreateHandler(),
|
| - 'Custom': CustomHandler(),
|
| - 'Data': DataHandler(),
|
| - 'Delete': DeleteHandler(),
|
| - 'DELn': DELnHandler(),
|
| - 'GENn': GENnHandler(),
|
| - 'GETn': GETnHandler(),
|
| - 'GLchar': GLcharHandler(),
|
| - 'GLcharN': GLcharNHandler(),
|
| - 'HandWritten': HandWrittenHandler(),
|
| - 'Is': IsHandler(),
|
| - 'Manual': ManualHandler(),
|
| - 'PUT': PUTHandler(),
|
| - 'PUTn': PUTnHandler(),
|
| - 'PUTXn': PUTXnHandler(),
|
| - 'StateSet': StateSetHandler(),
|
| - 'StateSetRGBAlpha': StateSetRGBAlphaHandler(),
|
| - 'StateSetFrontBack': StateSetFrontBackHandler(),
|
| - 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(),
|
| - 'StateSetNamedParameter': StateSetNamedParameter(),
|
| - 'STRn': STRnHandler(),
|
| - 'Todo': TodoHandler(),
|
| - }
|
| -
|
| - for func_name in _FUNCTION_INFO:
|
| - info = _FUNCTION_INFO[func_name]
|
| - type = ''
|
| - if 'type' in info:
|
| - type = info['type']
|
| - self._function_info[func_name] = FunctionInfo(info,
|
| - self.GetTypeHandler(type))
|
| for interface in _PEPPER_INTERFACES:
|
| interface = PepperInterface(interface)
|
| self.pepper_interfaces.append(interface)
|
| @@ -6967,20 +6978,17 @@ class GLGenerator(object):
|
| """Adds a function."""
|
| self.functions.append(func)
|
|
|
| - def GetTypeHandler(self, name):
|
| - """Gets a type info for the given type."""
|
| - if len(name):
|
| - if name in self._type_handlers:
|
| - return self._type_handlers[name]
|
| - else:
|
| - raise KeyError("no such type handler: %s" % name)
|
| - return self._empty_type_handler
|
| -
|
| def GetFunctionInfo(self, name):
|
| """Gets a type info for the given function name."""
|
| - if name in self._function_info:
|
| - return self._function_info[name]
|
| - return self._empty_function_info
|
| + if name in _FUNCTION_INFO:
|
| + func_info = _FUNCTION_INFO[name].copy()
|
| + else:
|
| + func_info = {}
|
| +
|
| + if not 'type' in func_info:
|
| + func_info['type'] = ''
|
| +
|
| + return func_info
|
|
|
| def Log(self, msg):
|
| """Prints something if verbose is true."""
|
| @@ -7008,22 +7016,6 @@ class GLGenerator(object):
|
| file.Write("} // namespace gpu\n")
|
| file.Write("\n")
|
|
|
| - def ParseArgs(self, arg_string):
|
| - """Parses a function arg string."""
|
| - args = []
|
| - num_pointer_args = 0
|
| - parts = arg_string.split(',')
|
| - is_gl_enum = False
|
| - for arg_string in parts:
|
| - if arg_string.startswith('GLenum '):
|
| - is_gl_enum = True
|
| - arg = CreateArg(arg_string)
|
| - if arg:
|
| - args.append(arg)
|
| - if arg.IsPointer():
|
| - num_pointer_args += 1
|
| - return (args, num_pointer_args, is_gl_enum)
|
| -
|
| def ParseGLH(self, filename):
|
| """Parses the cmd_buffer_functions.txt file and extracts the functions"""
|
| f = open(filename, "r")
|
| @@ -7034,34 +7026,31 @@ class GLGenerator(object):
|
| if match:
|
| func_name = match.group(2)[2:]
|
| func_info = self.GetFunctionInfo(func_name)
|
| - if func_info.type != 'Noop':
|
| - return_type = match.group(1).strip()
|
| - arg_string = match.group(3)
|
| - (args, num_pointer_args, is_gl_enum) = self.ParseArgs(arg_string)
|
| - # comment in to find out which functions use bare enums.
|
| - # if is_gl_enum:
|
| - # self.Log("%s uses bare GLenum" % func_name)
|
| - args_for_cmds = args
|
| - if hasattr(func_info, 'cmd_args'):
|
| - (args_for_cmds, num_pointer_args, is_gl_enum) = (
|
| - self.ParseArgs(getattr(func_info, 'cmd_args')))
|
| - 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_name, func_info, return_type, args,
|
| - args_for_cmds, cmd_args, init_args, num_pointer_args)
|
| - self.original_functions.append(f)
|
| - gen_cmd = f.GetInfo('gen_cmd')
|
| - if gen_cmd == True or gen_cmd == None:
|
| - self.AddFunction(f)
|
| - f.type_handler.AddImmediateFunction(self, f)
|
| - f.type_handler.AddBucketFunction(self, f)
|
| + if func_info['type'] == 'Noop':
|
| + continue
|
| +
|
| + parsed_func_info = {
|
| + 'original_name': func_name,
|
| + 'original_args': match.group(3),
|
| + 'return_type': match.group(1).strip(),
|
| + }
|
| +
|
| + for k in parsed_func_info.keys():
|
| + if not k in func_info:
|
| + func_info[k] = parsed_func_info[k]
|
| +
|
| + f = Function(func_name, func_info)
|
| + self.original_functions.append(f)
|
| +
|
| + #for arg in f.GetOriginalArgs():
|
| + # if not isinstance(arg, EnumArgument) and arg.type == 'GLenum':
|
| + # self.Log("%s uses bare GLenum %s." % (func_name, arg.name))
|
| +
|
| + gen_cmd = f.GetInfo('gen_cmd')
|
| + if gen_cmd == True or gen_cmd == None:
|
| + 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
|
| @@ -7073,7 +7062,7 @@ class GLGenerator(object):
|
| self.Log("Non Auto Generated Functions: %d" % len(funcs))
|
|
|
| for f in funcs:
|
| - self.Log(" %-10s %-20s gl%s" % (f.info.type, f.return_type, f.name))
|
| + self.Log(" %-10s %-20s gl%s" % (f.info['type'], f.return_type, f.name))
|
|
|
| def WriteCommandIds(self, filename):
|
| """Writes the command buffer format"""
|
|
|