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

Side by Side Diff: gpu/command_buffer/build_gles2_cmd_buffer.py

Issue 276873002: Clarify function info object usage in the command buffer generator (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@00-cmd-buffer-refactor--put-data-type
Patch Set: rebase Created 6 years, 7 months 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """code generator for GLES2 command buffers.""" 6 """code generator for GLES2 command buffers."""
7 7
8 import itertools 8 import itertools
9 import os 9 import os
10 import os.path 10 import os.path
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1206 {'name': '', 'dev': False}, 1206 {'name': '', 'dev': False},
1207 {'name': 'InstancedArrays', 'dev': False}, 1207 {'name': 'InstancedArrays', 'dev': False},
1208 {'name': 'FramebufferBlit', 'dev': False}, 1208 {'name': 'FramebufferBlit', 'dev': False},
1209 {'name': 'FramebufferMultisample', 'dev': False}, 1209 {'name': 'FramebufferMultisample', 'dev': False},
1210 {'name': 'ChromiumEnableFeature', 'dev': False}, 1210 {'name': 'ChromiumEnableFeature', 'dev': False},
1211 {'name': 'ChromiumMapSub', 'dev': False}, 1211 {'name': 'ChromiumMapSub', 'dev': False},
1212 {'name': 'Query', 'dev': False}, 1212 {'name': 'Query', 'dev': False},
1213 {'name': 'DrawBuffers', 'dev': True}, 1213 {'name': 'DrawBuffers', 'dev': True},
1214 ] 1214 ]
1215 1215
1216 # This table specifies types and other special data for the commands that 1216 # A function info object specifies the type and other special data for the
1217 # will be generated. 1217 # command that will be generated. A base function info object is generated by
1218 # parsing the "cmd_buffer_functions.txt", one for each function in the
1219 # file. These function info objects can be augmented and their values can be
1220 # overridden by adding an object to the table below.
1218 # 1221 #
1219 # Must match function names specified in "cmd_buffer_functions.txt". 1222 # Must match function names specified in "cmd_buffer_functions.txt".
1220 # 1223 #
1221 # cmd_comment: A comment added to the cmd format. 1224 # cmd_comment: A comment added to the cmd format.
1222 # type: defines which handler will be used to generate code. 1225 # type: defines which handler will be used to generate code.
1223 # decoder_func: defines which function to call in the decoder to execute the 1226 # decoder_func: defines which function to call in the decoder to execute the
1224 # corresponding GL command. If not specified the GL command will 1227 # corresponding GL command. If not specified the GL command will
1225 # be called directly. 1228 # be called directly.
1226 # gl_test_func: GL function that is expected to be called when testing. 1229 # gl_test_func: GL function that is expected to be called when testing.
1227 # cmd_args: The arguments to use for the command. This overrides generating 1230 # cmd_args: The arguments to use for the command. This overrides generating
(...skipping 3596 matching lines...) Expand 10 before | Expand all | Expand 10 after
4824 self.WriteInvalidUnitTest(func, file, invalid_test, extra) 4827 self.WriteInvalidUnitTest(func, file, invalid_test, extra)
4825 4828
4826 def WriteGetDataSizeCode(self, func, file): 4829 def WriteGetDataSizeCode(self, func, file):
4827 """Overrriden from TypeHandler.""" 4830 """Overrriden from TypeHandler."""
4828 code = """ uint32_t data_size; 4831 code = """ uint32_t data_size;
4829 if (!ComputeDataSize(1, sizeof(%s), %d, &data_size)) { 4832 if (!ComputeDataSize(1, sizeof(%s), %d, &data_size)) {
4830 return error::kOutOfBounds; 4833 return error::kOutOfBounds;
4831 } 4834 }
4832 """ 4835 """
4833 file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func))) 4836 file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func)))
4834 if func.is_immediate: 4837 if func.IsImmediate():
4835 file.Write(" if (data_size > immediate_data_size) {\n") 4838 file.Write(" if (data_size > immediate_data_size) {\n")
4836 file.Write(" return error::kOutOfBounds;\n") 4839 file.Write(" return error::kOutOfBounds;\n")
4837 file.Write(" }\n") 4840 file.Write(" }\n")
4838 4841
4839 def WriteGLES2Implementation(self, func, file): 4842 def WriteGLES2Implementation(self, func, file):
4840 """Overrriden from TypeHandler.""" 4843 """Overrriden from TypeHandler."""
4841 impl_func = func.GetInfo('impl_func') 4844 impl_func = func.GetInfo('impl_func')
4842 if (impl_func != None and impl_func != True): 4845 if (impl_func != None and impl_func != True):
4843 return; 4846 return;
4844 file.Write("%s GLES2Implementation::%s(%s) {\n" % 4847 file.Write("%s GLES2Implementation::%s(%s) {\n" %
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
5092 self.WriteInvalidUnitTest(func, file, invalid_test, extra) 5095 self.WriteInvalidUnitTest(func, file, invalid_test, extra)
5093 5096
5094 def WriteGetDataSizeCode(self, func, file): 5097 def WriteGetDataSizeCode(self, func, file):
5095 """Overrriden from TypeHandler.""" 5098 """Overrriden from TypeHandler."""
5096 code = """ uint32_t data_size; 5099 code = """ uint32_t data_size;
5097 if (!ComputeDataSize(count, sizeof(%s), %d, &data_size)) { 5100 if (!ComputeDataSize(count, sizeof(%s), %d, &data_size)) {
5098 return error::kOutOfBounds; 5101 return error::kOutOfBounds;
5099 } 5102 }
5100 """ 5103 """
5101 file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func))) 5104 file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func)))
5102 if func.is_immediate: 5105 if func.IsImmediate():
5103 file.Write(" if (data_size > immediate_data_size) {\n") 5106 file.Write(" if (data_size > immediate_data_size) {\n")
5104 file.Write(" return error::kOutOfBounds;\n") 5107 file.Write(" return error::kOutOfBounds;\n")
5105 file.Write(" }\n") 5108 file.Write(" }\n")
5106 5109
5107 def WriteGLES2Implementation(self, func, file): 5110 def WriteGLES2Implementation(self, func, file):
5108 """Overrriden from TypeHandler.""" 5111 """Overrriden from TypeHandler."""
5109 file.Write("%s GLES2Implementation::%s(%s) {\n" % 5112 file.Write("%s GLES2Implementation::%s(%s) {\n" %
5110 (func.return_type, func.original_name, 5113 (func.return_type, func.original_name,
5111 func.MakeTypedOriginalArgString(""))) 5114 func.MakeTypedOriginalArgString("")))
5112 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") 5115 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after
5766 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 5769 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5767 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 5770 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
5768 } 5771 }
5769 """ 5772 """
5770 self.WriteValidUnitTest(func, file, invalid_test) 5773 self.WriteValidUnitTest(func, file, invalid_test)
5771 5774
5772 def WriteServiceImplementation(self, func, file): 5775 def WriteServiceImplementation(self, func, file):
5773 """Overrriden from TypeHandler.""" 5776 """Overrriden from TypeHandler."""
5774 pass 5777 pass
5775 5778
5776
5777 class FunctionInfo(object):
5778 """Holds info about a function."""
5779
5780 def __init__(self, info, type_handler):
5781 for key in info:
5782 setattr(self, key, info[key])
5783 self.type_handler = type_handler
5784 if not 'type' in info:
5785 self.type = ''
5786
5787
5788 class Argument(object): 5779 class Argument(object):
5789 """A class that represents a function argument.""" 5780 """A class that represents a function argument."""
5790 5781
5791 cmd_type_map_ = { 5782 cmd_type_map_ = {
5792 'GLenum': 'uint32_t', 5783 'GLenum': 'uint32_t',
5793 'GLint': 'int32_t', 5784 'GLint': 'int32_t',
5794 'GLintptr': 'int32_t', 5785 'GLintptr': 'int32_t',
5795 'GLsizei': 'int32_t', 5786 'GLsizei': 'int32_t',
5796 'GLsizeiptr': 'int32_t', 5787 'GLsizeiptr': 'int32_t',
5797 'GLfloat': 'float', 5788 'GLfloat': 'float',
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
5953 5944
5954 5945
5955 class SizeArgument(Argument): 5946 class SizeArgument(Argument):
5956 """class for GLsizei and GLsizeiptr.""" 5947 """class for GLsizei and GLsizeiptr."""
5957 5948
5958 def __init__(self, name, type): 5949 def __init__(self, name, type):
5959 Argument.__init__(self, name, type) 5950 Argument.__init__(self, name, type)
5960 5951
5961 def GetNumInvalidValues(self, func): 5952 def GetNumInvalidValues(self, func):
5962 """overridden from Argument.""" 5953 """overridden from Argument."""
5963 if func.is_immediate: 5954 if func.IsImmediate():
5964 return 0 5955 return 0
5965 return 1 5956 return 1
5966 5957
5967 def GetInvalidArg(self, offset, index): 5958 def GetInvalidArg(self, offset, index):
5968 """overridden from Argument.""" 5959 """overridden from Argument."""
5969 return ("-1", "kNoError", "GL_INVALID_VALUE") 5960 return ("-1", "kNoError", "GL_INVALID_VALUE")
5970 5961
5971 def WriteValidationCode(self, file, func): 5962 def WriteValidationCode(self, file, func):
5972 """overridden from Argument.""" 5963 """overridden from Argument."""
5973 file.Write(" if (%s < 0) {\n" % self.name) 5964 file.Write(" if (%s < 0) {\n" % self.name)
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
6382 return 1 6373 return 1
6383 6374
6384 def GetInvalidArg(self, offset, index): 6375 def GetInvalidArg(self, offset, index):
6385 """returns an invalid value by index.""" 6376 """returns an invalid value by index."""
6386 return ("kInvalidClientId", "kNoError", "GL_INVALID_VALUE") 6377 return ("kInvalidClientId", "kNoError", "GL_INVALID_VALUE")
6387 6378
6388 6379
6389 class Function(object): 6380 class Function(object):
6390 """A class that represents a function.""" 6381 """A class that represents a function."""
6391 6382
6392 def __init__(self, original_name, name, info, return_type, original_args, 6383 type_handlers = {
6393 args_for_cmds, cmd_args, init_args, num_pointer_args): 6384 '': TypeHandler(),
6385 'Bind': BindHandler(),
6386 'Create': CreateHandler(),
6387 'Custom': CustomHandler(),
6388 'Data': DataHandler(),
6389 'Delete': DeleteHandler(),
6390 'DELn': DELnHandler(),
6391 'GENn': GENnHandler(),
6392 'GETn': GETnHandler(),
6393 'GLchar': GLcharHandler(),
6394 'GLcharN': GLcharNHandler(),
6395 'HandWritten': HandWrittenHandler(),
6396 'Is': IsHandler(),
6397 'Manual': ManualHandler(),
6398 'PUT': PUTHandler(),
6399 'PUTn': PUTnHandler(),
6400 'PUTXn': PUTXnHandler(),
6401 'StateSet': StateSetHandler(),
6402 'StateSetRGBAlpha': StateSetRGBAlphaHandler(),
6403 'StateSetFrontBack': StateSetFrontBackHandler(),
6404 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(),
6405 'StateSetNamedParameter': StateSetNamedParameter(),
6406 'STRn': STRnHandler(),
6407 'Todo': TodoHandler(),
6408 }
6409
6410 def __init__(self, name, info):
6394 self.name = name 6411 self.name = name
6395 self.original_name = original_name 6412 self.original_name = info['original_name']
6413
6414 self.original_args = self.ParseArgs(info['original_args'])
6415
6416 if 'cmd_args' in info:
6417 self.args_for_cmds = self.ParseArgs(info['cmd_args'])
6418 else:
6419 self.args_for_cmds = self.original_args[:]
6420
6421 self.return_type = info['return_type']
6422 if self.return_type != 'void':
6423 self.return_arg = CreateArg(info['return_type'] + " result")
6424 else:
6425 self.return_arg = None
6426
6427 self.num_pointer_args = sum(
6428 [1 for arg in self.args_for_cmds if arg.IsPointer()])
6396 self.info = info 6429 self.info = info
6397 self.type_handler = info.type_handler 6430 self.type_handler = self.type_handlers[info['type']]
6398 self.return_type = return_type 6431 self.can_auto_generate = (self.num_pointer_args == 0 and
6399 self.original_args = original_args 6432 info['return_type'] == "void")
6400 self.num_pointer_args = num_pointer_args
6401 self.can_auto_generate = num_pointer_args == 0 and return_type == "void"
6402 self.cmd_args = cmd_args
6403 self.init_args = init_args
6404 self.InitFunction() 6433 self.InitFunction()
6405 self.args_for_cmds = args_for_cmds 6434
6406 self.is_immediate = False 6435 def ParseArgs(self, arg_string):
6436 """Parses a function arg string."""
6437 args = []
6438 parts = arg_string.split(',')
6439 for arg_string in parts:
6440 arg = CreateArg(arg_string)
6441 if arg:
6442 args.append(arg)
6443 return args
6407 6444
6408 def IsType(self, type_name): 6445 def IsType(self, type_name):
6409 """Returns true if function is a certain type.""" 6446 """Returns true if function is a certain type."""
6410 return self.info.type == type_name 6447 return self.info['type'] == type_name
6411 6448
6412 def InitFunction(self): 6449 def InitFunction(self):
6413 """Calls the init function for the type handler.""" 6450 """Creates command args and calls the init function for the type handler.
6451
6452 Creates argument lists for command buffer commands, eg. self.cmd_args and
6453 self.init_args.
6454 Calls the type function initialization.
6455 Override to create different kind of command buffer command argument lists.
6456 """
6457 self.cmd_args = []
6458 for arg in self.args_for_cmds:
6459 arg.AddCmdArgs(self.cmd_args)
6460
6461 self.init_args = []
6462 for arg in self.args_for_cmds:
6463 arg.AddInitArgs(self.init_args)
6464
6465 if self.return_arg:
6466 self.init_args.append(self.return_arg)
6467
6414 self.type_handler.InitFunction(self) 6468 self.type_handler.InitFunction(self)
6415 6469
6416 def GetInfo(self, name): 6470 def IsImmediate(self):
6471 """Returns whether the function is immediate data function or not."""
6472 return False
6473
6474 def GetInfo(self, name, default = None):
6417 """Returns a value from the function info for this function.""" 6475 """Returns a value from the function info for this function."""
6418 if hasattr(self.info, name): 6476 if name in self.info:
6419 return getattr(self.info, name) 6477 return self.info[name]
6420 return None 6478 return default
6421 6479
6422 def GetValidArg(self, index): 6480 def GetValidArg(self, index):
6423 """Gets a valid arg from the function info if one exists.""" 6481 """Gets a valid arg from the function info if one exists."""
6424 valid_args = self.GetInfo('valid_args') 6482 valid_args = self.GetInfo('valid_args')
6425 if valid_args and str(index) in valid_args: 6483 if valid_args and str(index) in valid_args:
6426 return valid_args[str(index)] 6484 return valid_args[str(index)]
6427 return None 6485 return None
6428 6486
6429 def AddInfo(self, name, value): 6487 def AddInfo(self, name, value):
6430 """Adds an info.""" 6488 """Adds an info."""
6431 setattr(self.info, name, value) 6489 self.info[name] = value
6432 6490
6433 def IsCoreGLFunction(self): 6491 def IsCoreGLFunction(self):
6434 return (not self.GetInfo('extension') and 6492 return (not self.GetInfo('extension') and
6435 not self.GetInfo('pepper_interface')) 6493 not self.GetInfo('pepper_interface'))
6436 6494
6437 def InPepperInterface(self, interface): 6495 def InPepperInterface(self, interface):
6438 ext = self.GetInfo('pepper_interface') 6496 ext = self.GetInfo('pepper_interface')
6439 if not interface.GetName(): 6497 if not interface.GetName():
6440 return self.IsCoreGLFunction() 6498 return self.IsCoreGLFunction()
6441 return ext == interface.GetName() 6499 return ext == interface.GetName()
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
6563 """Writes the handler implementation for this command.""" 6621 """Writes the handler implementation for this command."""
6564 self.type_handler.WriteHandlerImplementation(self, file) 6622 self.type_handler.WriteHandlerImplementation(self, file)
6565 6623
6566 def WriteValidationCode(self, file): 6624 def WriteValidationCode(self, file):
6567 """Writes the validation code for a command.""" 6625 """Writes the validation code for a command."""
6568 pass 6626 pass
6569 6627
6570 def WriteCmdFlag(self, file): 6628 def WriteCmdFlag(self, file):
6571 """Writes the cmd cmd_flags constant.""" 6629 """Writes the cmd cmd_flags constant."""
6572 flags = [] 6630 flags = []
6573 trace_level = 3 # By default trace only at the highest level 6631 # By default trace only at the highest level 3.
6574 if hasattr(self.info, 'trace_level'): 6632 trace_level = int(self.GetInfo('trace_level', default = 3))
6575 if (self.info.trace_level < 0) or (self.info.trace_level > 3): 6633 if trace_level not in xrange(0, 4):
6576 raise KeyError("Unhandled trace_level: %d" % self.info.trace_level) 6634 raise KeyError("Unhandled trace_level: %d" % trace_level)
6577 trace_level = self.info.trace_level
6578 6635
6579 flags.append('CMD_FLAG_SET_TRACE_LEVEL(%d)' % trace_level) 6636 flags.append('CMD_FLAG_SET_TRACE_LEVEL(%d)' % trace_level)
6580 6637
6581 if len(flags) > 0: 6638 if len(flags) > 0:
6582 cmd_flags = ' | '.join(flags) 6639 cmd_flags = ' | '.join(flags)
6583 else: 6640 else:
6584 cmd_flags = 0 6641 cmd_flags = 0
6585 6642
6586 file.Write(" static const uint8 cmd_flags = %s;\n" % cmd_flags) 6643 file.Write(" static const uint8 cmd_flags = %s;\n" % cmd_flags)
6587 6644
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
6721 dev = "" 6778 dev = ""
6722 if self.dev: 6779 if self.dev:
6723 dev = "_Dev" 6780 dev = "_Dev"
6724 return "PPB_OpenGLES2%s%s" % (self.name, dev) 6781 return "PPB_OpenGLES2%s%s" % (self.name, dev)
6725 6782
6726 6783
6727 class ImmediateFunction(Function): 6784 class ImmediateFunction(Function):
6728 """A class that represnets an immediate function command.""" 6785 """A class that represnets an immediate function command."""
6729 6786
6730 def __init__(self, func): 6787 def __init__(self, func):
6731 new_args = [] 6788 Function.__init__(
6732 for arg in func.GetOriginalArgs(): 6789 self,
6790 "%sImmediate" % func.name,
6791 func.info)
6792
6793 def InitFunction(self):
6794 # Override args in original_args and args_for_cmds with immediate versions
6795 # of the args.
6796
6797 new_original_args = []
6798 for arg in self.original_args:
6733 new_arg = arg.GetImmediateVersion() 6799 new_arg = arg.GetImmediateVersion()
6734 if new_arg: 6800 if new_arg:
6735 new_args.append(new_arg) 6801 new_original_args.append(new_arg)
6802 self.original_args = new_original_args
6736 6803
6737 cmd_args = []
6738 new_args_for_cmds = [] 6804 new_args_for_cmds = []
6739 for arg in func.args_for_cmds: 6805 for arg in self.args_for_cmds:
6740 new_arg = arg.GetImmediateVersion() 6806 new_arg = arg.GetImmediateVersion()
6741 if new_arg: 6807 if new_arg:
6742 new_args_for_cmds.append(new_arg) 6808 new_args_for_cmds.append(new_arg)
6743 new_arg.AddCmdArgs(cmd_args)
6744 6809
6745 new_init_args = [] 6810 self.args_for_cmds = new_args_for_cmds
6746 for arg in new_args_for_cmds:
6747 arg.AddInitArgs(new_init_args)
6748 6811
6749 Function.__init__( 6812 Function.InitFunction(self)
6750 self, 6813
6751 func.original_name, 6814 def IsImmediate(self):
6752 "%sImmediate" % func.name, 6815 return True
6753 func.info,
6754 func.return_type,
6755 new_args,
6756 new_args_for_cmds,
6757 cmd_args,
6758 new_init_args,
6759 0)
6760 self.is_immediate = True
6761 6816
6762 def WriteCommandDescription(self, file): 6817 def WriteCommandDescription(self, file):
6763 """Overridden from Function""" 6818 """Overridden from Function"""
6764 file.Write("//! Immediate version of command that corresponds to gl%s.\n" % 6819 file.Write("//! Immediate version of command that corresponds to gl%s.\n" %
6765 self.original_name) 6820 self.original_name)
6766 6821
6767 def WriteServiceImplementation(self, file): 6822 def WriteServiceImplementation(self, file):
6768 """Overridden from Function""" 6823 """Overridden from Function"""
6769 self.type_handler.WriteImmediateServiceImplementation(self, file) 6824 self.type_handler.WriteImmediateServiceImplementation(self, file)
6770 6825
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
6806 6861
6807 def WriteFormatTest(self, file): 6862 def WriteFormatTest(self, file):
6808 """Overridden from Function""" 6863 """Overridden from Function"""
6809 self.type_handler.WriteImmediateFormatTest(self, file) 6864 self.type_handler.WriteImmediateFormatTest(self, file)
6810 6865
6811 6866
6812 class BucketFunction(Function): 6867 class BucketFunction(Function):
6813 """A class that represnets a bucket version of a function command.""" 6868 """A class that represnets a bucket version of a function command."""
6814 6869
6815 def __init__(self, func): 6870 def __init__(self, func):
6816 new_args = [] 6871 Function.__init__(
6817 for arg in func.GetOriginalArgs(): 6872 self,
6873 "%sBucket" % func.name,
6874 func.info)
6875
6876 def InitFunction(self):
6877 # Override args in original_args and args_for_cmds with bucket versions
6878 # of the args.
6879
6880 new_original_args = []
6881 for arg in self.original_args:
6818 new_arg = arg.GetBucketVersion() 6882 new_arg = arg.GetBucketVersion()
6819 if new_arg: 6883 if new_arg:
6820 new_args.append(new_arg) 6884 new_original_args.append(new_arg)
6885 self.original_args = new_original_args
6821 6886
6822 cmd_args = []
6823 new_args_for_cmds = [] 6887 new_args_for_cmds = []
6824 for arg in func.args_for_cmds: 6888 for arg in self.args_for_cmds:
6825 new_arg = arg.GetBucketVersion() 6889 new_arg = arg.GetBucketVersion()
6826 if new_arg: 6890 if new_arg:
6827 new_args_for_cmds.append(new_arg) 6891 new_args_for_cmds.append(new_arg)
6828 new_arg.AddCmdArgs(cmd_args)
6829 6892
6830 new_init_args = [] 6893 self.args_for_cmds = new_args_for_cmds
6831 for arg in new_args_for_cmds:
6832 arg.AddInitArgs(new_init_args)
6833 6894
6834 Function.__init__( 6895 Function.InitFunction(self)
6835 self,
6836 func.original_name,
6837 "%sBucket" % func.name,
6838 func.info,
6839 func.return_type,
6840 new_args,
6841 new_args_for_cmds,
6842 cmd_args,
6843 new_init_args,
6844 0)
6845
6846 # def InitFunction(self):
6847 # """Overridden from Function"""
6848 # pass
6849 6896
6850 def WriteCommandDescription(self, file): 6897 def WriteCommandDescription(self, file):
6851 """Overridden from Function""" 6898 """Overridden from Function"""
6852 file.Write("//! Bucket version of command that corresponds to gl%s.\n" % 6899 file.Write("//! Bucket version of command that corresponds to gl%s.\n" %
6853 self.original_name) 6900 self.original_name)
6854 6901
6855 def WriteServiceImplementation(self, file): 6902 def WriteServiceImplementation(self, file):
6856 """Overridden from Function""" 6903 """Overridden from Function"""
6857 self.type_handler.WriteBucketServiceImplementation(self, file) 6904 self.type_handler.WriteBucketServiceImplementation(self, file)
6858 6905
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
6912 class GLGenerator(object): 6959 class GLGenerator(object):
6913 """A class to generate GL command buffers.""" 6960 """A class to generate GL command buffers."""
6914 6961
6915 _function_re = re.compile(r'GL_APICALL(.*?)GL_APIENTRY (.*?) \((.*?)\);') 6962 _function_re = re.compile(r'GL_APICALL(.*?)GL_APIENTRY (.*?) \((.*?)\);')
6916 6963
6917 def __init__(self, verbose): 6964 def __init__(self, verbose):
6918 self.original_functions = [] 6965 self.original_functions = []
6919 self.functions = [] 6966 self.functions = []
6920 self.verbose = verbose 6967 self.verbose = verbose
6921 self.errors = 0 6968 self.errors = 0
6922 self._function_info = {}
6923 self._empty_type_handler = TypeHandler()
6924 self._empty_function_info = FunctionInfo({}, self._empty_type_handler)
6925 self.pepper_interfaces = [] 6969 self.pepper_interfaces = []
6926 self.interface_info = {} 6970 self.interface_info = {}
6927 6971
6928 self._type_handlers = {
6929 'Bind': BindHandler(),
6930 'Create': CreateHandler(),
6931 'Custom': CustomHandler(),
6932 'Data': DataHandler(),
6933 'Delete': DeleteHandler(),
6934 'DELn': DELnHandler(),
6935 'GENn': GENnHandler(),
6936 'GETn': GETnHandler(),
6937 'GLchar': GLcharHandler(),
6938 'GLcharN': GLcharNHandler(),
6939 'HandWritten': HandWrittenHandler(),
6940 'Is': IsHandler(),
6941 'Manual': ManualHandler(),
6942 'PUT': PUTHandler(),
6943 'PUTn': PUTnHandler(),
6944 'PUTXn': PUTXnHandler(),
6945 'StateSet': StateSetHandler(),
6946 'StateSetRGBAlpha': StateSetRGBAlphaHandler(),
6947 'StateSetFrontBack': StateSetFrontBackHandler(),
6948 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(),
6949 'StateSetNamedParameter': StateSetNamedParameter(),
6950 'STRn': STRnHandler(),
6951 'Todo': TodoHandler(),
6952 }
6953
6954 for func_name in _FUNCTION_INFO:
6955 info = _FUNCTION_INFO[func_name]
6956 type = ''
6957 if 'type' in info:
6958 type = info['type']
6959 self._function_info[func_name] = FunctionInfo(info,
6960 self.GetTypeHandler(type))
6961 for interface in _PEPPER_INTERFACES: 6972 for interface in _PEPPER_INTERFACES:
6962 interface = PepperInterface(interface) 6973 interface = PepperInterface(interface)
6963 self.pepper_interfaces.append(interface) 6974 self.pepper_interfaces.append(interface)
6964 self.interface_info[interface.GetName()] = interface 6975 self.interface_info[interface.GetName()] = interface
6965 6976
6966 def AddFunction(self, func): 6977 def AddFunction(self, func):
6967 """Adds a function.""" 6978 """Adds a function."""
6968 self.functions.append(func) 6979 self.functions.append(func)
6969 6980
6970 def GetTypeHandler(self, name):
6971 """Gets a type info for the given type."""
6972 if len(name):
6973 if name in self._type_handlers:
6974 return self._type_handlers[name]
6975 else:
6976 raise KeyError("no such type handler: %s" % name)
6977 return self._empty_type_handler
6978
6979 def GetFunctionInfo(self, name): 6981 def GetFunctionInfo(self, name):
6980 """Gets a type info for the given function name.""" 6982 """Gets a type info for the given function name."""
6981 if name in self._function_info: 6983 if name in _FUNCTION_INFO:
6982 return self._function_info[name] 6984 func_info = _FUNCTION_INFO[name].copy()
6983 return self._empty_function_info 6985 else:
6986 func_info = {}
6987
6988 if not 'type' in func_info:
6989 func_info['type'] = ''
6990
6991 return func_info
6984 6992
6985 def Log(self, msg): 6993 def Log(self, msg):
6986 """Prints something if verbose is true.""" 6994 """Prints something if verbose is true."""
6987 if self.verbose: 6995 if self.verbose:
6988 print msg 6996 print msg
6989 6997
6990 def Error(self, msg): 6998 def Error(self, msg):
6991 """Prints an error.""" 6999 """Prints an error."""
6992 print "Error: %s" % msg 7000 print "Error: %s" % msg
6993 self.errors += 1 7001 self.errors += 1
6994 7002
6995 def WriteLicense(self, file): 7003 def WriteLicense(self, file):
6996 """Writes the license.""" 7004 """Writes the license."""
6997 file.Write(_LICENSE) 7005 file.Write(_LICENSE)
6998 7006
6999 def WriteNamespaceOpen(self, file): 7007 def WriteNamespaceOpen(self, file):
7000 """Writes the code for the namespace.""" 7008 """Writes the code for the namespace."""
7001 file.Write("namespace gpu {\n") 7009 file.Write("namespace gpu {\n")
7002 file.Write("namespace gles2 {\n") 7010 file.Write("namespace gles2 {\n")
7003 file.Write("\n") 7011 file.Write("\n")
7004 7012
7005 def WriteNamespaceClose(self, file): 7013 def WriteNamespaceClose(self, file):
7006 """Writes the code to close the namespace.""" 7014 """Writes the code to close the namespace."""
7007 file.Write("} // namespace gles2\n") 7015 file.Write("} // namespace gles2\n")
7008 file.Write("} // namespace gpu\n") 7016 file.Write("} // namespace gpu\n")
7009 file.Write("\n") 7017 file.Write("\n")
7010 7018
7011 def ParseArgs(self, arg_string):
7012 """Parses a function arg string."""
7013 args = []
7014 num_pointer_args = 0
7015 parts = arg_string.split(',')
7016 is_gl_enum = False
7017 for arg_string in parts:
7018 if arg_string.startswith('GLenum '):
7019 is_gl_enum = True
7020 arg = CreateArg(arg_string)
7021 if arg:
7022 args.append(arg)
7023 if arg.IsPointer():
7024 num_pointer_args += 1
7025 return (args, num_pointer_args, is_gl_enum)
7026
7027 def ParseGLH(self, filename): 7019 def ParseGLH(self, filename):
7028 """Parses the cmd_buffer_functions.txt file and extracts the functions""" 7020 """Parses the cmd_buffer_functions.txt file and extracts the functions"""
7029 f = open(filename, "r") 7021 f = open(filename, "r")
7030 functions = f.read() 7022 functions = f.read()
7031 f.close() 7023 f.close()
7032 for line in functions.splitlines(): 7024 for line in functions.splitlines():
7033 match = self._function_re.match(line) 7025 match = self._function_re.match(line)
7034 if match: 7026 if match:
7035 func_name = match.group(2)[2:] 7027 func_name = match.group(2)[2:]
7036 func_info = self.GetFunctionInfo(func_name) 7028 func_info = self.GetFunctionInfo(func_name)
7037 if func_info.type != 'Noop': 7029 if func_info['type'] == 'Noop':
7038 return_type = match.group(1).strip() 7030 continue
7039 arg_string = match.group(3) 7031
7040 (args, num_pointer_args, is_gl_enum) = self.ParseArgs(arg_string) 7032 parsed_func_info = {
7041 # comment in to find out which functions use bare enums. 7033 'original_name': func_name,
7042 # if is_gl_enum: 7034 'original_args': match.group(3),
7043 # self.Log("%s uses bare GLenum" % func_name) 7035 'return_type': match.group(1).strip(),
7044 args_for_cmds = args 7036 }
7045 if hasattr(func_info, 'cmd_args'): 7037
7046 (args_for_cmds, num_pointer_args, is_gl_enum) = ( 7038 for k in parsed_func_info.keys():
7047 self.ParseArgs(getattr(func_info, 'cmd_args'))) 7039 if not k in func_info:
7048 cmd_args = [] 7040 func_info[k] = parsed_func_info[k]
7049 for arg in args_for_cmds: 7041
7050 arg.AddCmdArgs(cmd_args) 7042 f = Function(func_name, func_info)
7051 init_args = [] 7043 self.original_functions.append(f)
7052 for arg in args_for_cmds: 7044
7053 arg.AddInitArgs(init_args) 7045 #for arg in f.GetOriginalArgs():
7054 return_arg = CreateArg(return_type + " result") 7046 # if not isinstance(arg, EnumArgument) and arg.type == 'GLenum':
7055 if return_arg: 7047 # self.Log("%s uses bare GLenum %s." % (func_name, arg.name))
7056 init_args.append(return_arg) 7048
7057 f = Function(func_name, func_name, func_info, return_type, args, 7049 gen_cmd = f.GetInfo('gen_cmd')
7058 args_for_cmds, cmd_args, init_args, num_pointer_args) 7050 if gen_cmd == True or gen_cmd == None:
7059 self.original_functions.append(f) 7051 self.AddFunction(f)
7060 gen_cmd = f.GetInfo('gen_cmd') 7052 f.type_handler.AddImmediateFunction(self, f)
7061 if gen_cmd == True or gen_cmd == None: 7053 f.type_handler.AddBucketFunction(self, f)
7062 self.AddFunction(f)
7063 f.type_handler.AddImmediateFunction(self, f)
7064 f.type_handler.AddBucketFunction(self, f)
7065 7054
7066 self.Log("Auto Generated Functions : %d" % 7055 self.Log("Auto Generated Functions : %d" %
7067 len([f for f in self.functions if f.can_auto_generate or 7056 len([f for f in self.functions if f.can_auto_generate or
7068 (not f.IsType('') and not f.IsType('Custom') and 7057 (not f.IsType('') and not f.IsType('Custom') and
7069 not f.IsType('Todo'))])) 7058 not f.IsType('Todo'))]))
7070 7059
7071 funcs = [f for f in self.functions if not f.can_auto_generate and 7060 funcs = [f for f in self.functions if not f.can_auto_generate and
7072 (f.IsType('') or f.IsType('Custom') or f.IsType('Todo'))] 7061 (f.IsType('') or f.IsType('Custom') or f.IsType('Todo'))]
7073 self.Log("Non Auto Generated Functions: %d" % len(funcs)) 7062 self.Log("Non Auto Generated Functions: %d" % len(funcs))
7074 7063
7075 for f in funcs: 7064 for f in funcs:
7076 self.Log(" %-10s %-20s gl%s" % (f.info.type, f.return_type, f.name)) 7065 self.Log(" %-10s %-20s gl%s" % (f.info['type'], f.return_type, f.name))
7077 7066
7078 def WriteCommandIds(self, filename): 7067 def WriteCommandIds(self, filename):
7079 """Writes the command buffer format""" 7068 """Writes the command buffer format"""
7080 file = CHeaderWriter(filename) 7069 file = CHeaderWriter(filename)
7081 file.Write("#define GLES2_COMMAND_LIST(OP) \\\n") 7070 file.Write("#define GLES2_COMMAND_LIST(OP) \\\n")
7082 id = 256 7071 id = 256
7083 for func in self.functions: 7072 for func in self.functions:
7084 file.Write(" %-60s /* %d */ \\\n" % 7073 file.Write(" %-60s /* %d */ \\\n" %
7085 ("OP(%s)" % func.name, id)) 7074 ("OP(%s)" % func.name, id))
7086 id += 1 7075 id += 1
(...skipping 994 matching lines...) Expand 10 before | Expand all | Expand 10 after
8081 "ppapi/shared_impl/ppb_opengles2_shared.cc"]) 8070 "ppapi/shared_impl/ppb_opengles2_shared.cc"])
8082 8071
8083 if gen.errors > 0: 8072 if gen.errors > 0:
8084 print "%d errors" % gen.errors 8073 print "%d errors" % gen.errors
8085 return 1 8074 return 1
8086 return 0 8075 return 0
8087 8076
8088 8077
8089 if __name__ == '__main__': 8078 if __name__ == '__main__':
8090 sys.exit(main(sys.argv[1:])) 8079 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698