diff options
author | jbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-26 18:43:13 +0000 |
---|---|---|
committer | jbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-26 18:43:13 +0000 |
commit | 6965d7dcbce91c55c492ff34983a8a3a35f14740 (patch) | |
tree | a04a41b2c2db8eaa2ce5877e2f8869d5d9cf3336 /gpu | |
parent | 866fdd9219e015f582095faf35129a3d9f26be8c (diff) | |
download | chromium_src-6965d7dcbce91c55c492ff34983a8a3a35f14740.zip chromium_src-6965d7dcbce91c55c492ff34983a8a3a35f14740.tar.gz chromium_src-6965d7dcbce91c55c492ff34983a8a3a35f14740.tar.bz2 |
Add Pepper support for several GL extensions
Add support to the command buffer code generator to generate multiple pepper interfaces, and use that to generate interfaces for ANGLE_instanced_arrays, ANGLE_framebuffer_blit, ANGLE_framebuffer_multisample, CHROMIUM_enable_feature, and CHROMIUM_map_sub.
BUG=93148
TEST=
Review URL: https://chromiumcodereview.appspot.com/9420017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@123696 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rwxr-xr-x | gpu/command_buffer/build_gles2_cmd_buffer.py | 225 |
1 files changed, 169 insertions, 56 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index d092034..ca2c747 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -731,6 +731,17 @@ _ENUM_LISTS = { }, } +# This table specifies the different pepper interfaces that are supported for +# GL commands. 'dev' is true if it's a dev interface. +_PEPPER_INTERFACES = [ + {'name': '', 'dev': False}, + {'name': 'InstancedArrays', 'dev': True}, + {'name': 'FramebufferBlit', 'dev': True}, + {'name': 'FramebufferMultisample', 'dev': True}, + {'name': 'ChromiumEnableFeature', 'dev': True}, + {'name': 'ChromiumMapSub', 'dev': True}, +] + # This table specifies types and other special data for the commands that # will be generated. # @@ -763,6 +774,7 @@ _ENUM_LISTS = { # bind function. # valid_args: A dictionary of argument indices to args to use in unit tests # when they can not be automatically determined. +# pepper_interface: The pepper interface that is used for this extension _FUNCTION_INFO = { 'ActiveTexture': { @@ -799,6 +811,7 @@ _FUNCTION_INFO = { 'decoder_func': 'DoBlitFramebufferEXT', 'unit_test': False, 'extension': True, + 'pepper_interface': 'FramebufferBlit', }, 'BufferData': { 'type': 'Manual', @@ -834,6 +847,7 @@ _FUNCTION_INFO = { 'result': ['GLint'], 'extension': True, 'chromium': True, + 'pepper_interface': 'ChromiumEnableFeature', }, 'CompileShader': {'decoder_func': 'DoCompileShader', 'unit_test': False}, 'CompressedTexImage2D': { @@ -1187,12 +1201,14 @@ _FUNCTION_INFO = { 'extension': True, 'chromium': True, 'client_test': False, + 'pepper_interface': 'ChromiumMapSub', }, 'MapTexSubImage2DCHROMIUM': { 'gen_cmd': False, 'extension': True, 'chromium': True, 'client_test': False, + 'pepper_interface': 'ChromiumMapSub', }, 'PixelStorei': {'type': 'Manual'}, 'PostSubBufferCHROMIUM': { @@ -1214,6 +1230,7 @@ _FUNCTION_INFO = { 'expectation': False, 'unit_test': False, 'extension': True, + 'pepper_interface': 'FramebufferMultisample', }, 'ReadPixels': { 'cmd_comment': @@ -1390,12 +1407,14 @@ _FUNCTION_INFO = { 'extension': True, 'chromium': True, 'client_test': False, - }, + 'pepper_interface': 'ChromiumMapSub', + }, 'UnmapTexSubImage2DCHROMIUM': { 'gen_cmd': False, 'extension': True, 'chromium': True, 'client_test': False, + 'pepper_interface': 'ChromiumMapSub', }, 'UseProgram': {'decoder_func': 'DoUseProgram', 'unit_test': False}, 'ValidateProgram': {'decoder_func': 'DoValidateProgram'}, @@ -1499,6 +1518,7 @@ _FUNCTION_INFO = { 'GLsizei primcount', 'extension': True, 'unit_test': False, + 'pepper_interface': 'InstancedArrays', }, 'DrawElementsInstancedANGLE': { 'type': 'Manual', @@ -1507,12 +1527,14 @@ _FUNCTION_INFO = { 'extension': True, 'unit_test': False, 'client_test': False, + 'pepper_interface': 'InstancedArrays', }, 'VertexAttribDivisorANGLE': { 'type': 'Manual', 'cmd_args': 'GLuint index, GLuint divisor', 'extension': True, 'unit_test': False, + 'pepper_interface': 'InstancedArrays', }, } @@ -1603,6 +1625,18 @@ class CWriter(object): while not done: splitter = string[0:end].rfind(',') if splitter < 0 or (splitter > 0 and string[splitter - 1] == '"'): + if last_splitter == -1: + break + return last_splitter + elif splitter >= 80: + end = splitter + else: + return splitter + end = len(string) + last_splitter = -1 + while not done: + splitter = string[0:end].rfind(' ') + if splitter < 0 or (splitter > 0 and string[splitter - 1] == '"'): return last_splitter elif splitter >= 80: end = splitter @@ -1615,10 +1649,15 @@ class CWriter(object): i = self.__FindSplit(line) if i > 0: line1 = line[0:i + 1] + if line1[-1] == ' ': + line1 = line1[:-1] + lineend = '' + if line1[0] == '#': + lineend = ' \\' nolint = '' if len(line1) > 80: nolint = ' // NOLINT' - self.__AddLine(line1 + nolint + '\n') + self.__AddLine(line1 + nolint + lineend + '\n') match = re.match("( +)", line1) indent = "" if match: @@ -4948,6 +4987,15 @@ class Function(object): def IsCoreGLFunction(self): return not self.GetInfo('extension') + def InPepperInterface(self, interface): + ext = self.GetInfo('pepper_interface') + if not interface.GetName(): + return self.IsCoreGLFunction() + return ext == interface.GetName() + + def InAnyPepperExtension(self): + return self.IsCoreGLFunction() or self.GetInfo('pepper_interface') + def GetGLFunctionName(self): """Gets the function to call to execute GL for this command.""" if self.GetInfo('decoder_func'): @@ -5138,6 +5186,38 @@ class Function(object): self.type_handler.WriteFormatTest(self, file) +class PepperInterface(object): + """A class that represents a function.""" + + def __init__(self, info): + self.name = info["name"] + self.dev = info["dev"] + + def GetName(self): + return self.name + + def GetInterfaceName(self): + upperint = "" + dev = "" + if self.name: + upperint = "_" + self.name.upper() + if self.dev: + dev = "_DEV" + return "PPB_OPENGLES2%s%s_INTERFACE" % (upperint, dev) + + def GetInterfaceString(self): + dev = "" + if self.dev: + dev = "(Dev)" + return "PPB_OpenGLES2%s%s" % (self.name, dev) + + def GetStructName(self): + dev = "" + if self.dev: + dev = "_Dev" + return "PPB_OpenGLES2%s%s" % (self.name, dev) + + class ImmediateFunction(Function): """A class that represnets an immediate function command.""" @@ -5336,6 +5416,8 @@ class GLGenerator(object): 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(), @@ -5364,6 +5446,10 @@ class GLGenerator(object): 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) + self.interface_info[interface.GetName()] = interface def AddFunction(self, func): """Adds a function.""" @@ -5726,36 +5812,44 @@ const size_t GLES2Util::enum_to_string_table_len_ = """) file.Close() - def WritePepperGLES2Interface(self, filename): + def WritePepperGLES2Interface(self, filename, dev): """Writes the Pepper OpenGLES interface definition.""" file = CHeaderWriter( filename, "// OpenGL ES interface.\n", - 3) - - file.Write("#include \"ppapi/c/pp_resource.h\"\n\n") - - file.Write("#ifndef __gl2_h_\n") - for (k, v) in _GL_TYPES.iteritems(): - file.Write("typedef %s %s;\n" % (v, k)) - file.Write("#endif // __gl2_h_\n\n") + 2) - file.Write("#define PPB_OPENGLES2_INTERFACE_1_0 \"PPB_OpenGLES2;1.0\"\n") - file.Write("#define PPB_OPENGLES2_INTERFACE PPB_OPENGLES2_INTERFACE_1_0\n") + file.Write("#include \"ppapi/c/pp_resource.h\"\n") + if dev: + file.Write("#include \"ppapi/c/ppb_opengles2.h\"\n\n") + else: + file.Write("\n#ifndef __gl2_h_\n") + for (k, v) in _GL_TYPES.iteritems(): + file.Write("typedef %s %s;\n" % (v, k)) + file.Write("#endif // __gl2_h_\n\n") - file.Write("\nstruct PPB_OpenGLES2 {\n") - for func in self.original_functions: - if not func.IsCoreGLFunction(): + for interface in self.pepper_interfaces: + if interface.dev != dev: continue + file.Write("#define %s_1_0 \"%s;1.0\"\n" % + (interface.GetInterfaceName(), interface.GetInterfaceString())) + file.Write("#define %s %s_1_0\n" % + (interface.GetInterfaceName(), interface.GetInterfaceName())) + + file.Write("\nstruct %s {\n" % interface.GetStructName()) + for func in self.original_functions: + if not func.InPepperInterface(interface): + continue + + original_arg = func.MakeTypedOriginalArgString("") + context_arg = "PP_Resource context" + if len(original_arg): + arg = context_arg + ", " + original_arg + else: + arg = context_arg + file.Write(" %s (*%s)(%s);\n" % (func.return_type, func.name, arg)) + file.Write("};\n\n") - original_arg = func.MakeTypedOriginalArgString("") - context_arg = "PP_Resource context" - if len(original_arg): - arg = context_arg + ", " + original_arg - else: - arg = context_arg - file.Write(" %s (*%s)(%s);\n" % (func.return_type, func.name, arg)) - file.Write("};\n\n") file.Close() @@ -5785,7 +5879,7 @@ const size_t GLES2Util::enum_to_string_table_len_ = file.Write("}\n\n") for func in self.original_functions: - if not func.IsCoreGLFunction(): + if not func.InAnyPepperExtension(): continue original_arg = func.MakeTypedOriginalArgString("") @@ -5802,21 +5896,23 @@ const size_t GLES2Util::enum_to_string_table_len_ = func.MakeOriginalArgString(""))) file.Write("}\n\n") - file.Write("\nconst struct PPB_OpenGLES2 ppb_opengles2 = {\n") - file.Write(" &") - file.Write(",\n &".join( - f.name for f in self.original_functions if f.IsCoreGLFunction())) - file.Write("\n") - file.Write("};\n\n") - file.Write("} // namespace\n") - file.Write(""" -const PPB_OpenGLES2* PPB_OpenGLES2_Shared::GetInterface() { - return &ppb_opengles2; -} + for interface in self.pepper_interfaces: + file.Write("const %s* PPB_OpenGLES2_Shared::Get%sInterface() {\n" % + (interface.GetStructName(), interface.GetName())) + file.Write(" static const struct %s " + "ppb_opengles2 = {\n" % interface.GetStructName()) + file.Write(" &") + file.Write(",\n &".join( + f.name for f in self.original_functions + if f.InPepperInterface(interface))) + file.Write("\n") + + file.Write(" };\n") + file.Write(" return &ppb_opengles2;\n") + file.Write("}\n") -""") file.Write("} // namespace ppapi\n") file.Close() @@ -5831,23 +5927,35 @@ const PPB_OpenGLES2* PPB_OpenGLES2_Shared::GetInterface() { file.Write("#include \"ppapi/lib/gl/gles2/gl2ext_ppapi.h\"\n\n") for func in self.original_functions: - if not func.IsCoreGLFunction(): + if not func.InAnyPepperExtension(): continue + interface = self.interface_info[func.GetInfo('pepper_interface') or ''] + file.Write("%s GL_APIENTRY gl%s(%s) {\n" % (func.return_type, func.name, func.MakeTypedOriginalArgString(""))) return_str = "" if func.return_type == "void" else "return " - interface_str = "glGetInterfacePPAPI()" + interface_str = "glGet%sInterfacePPAPI()" % interface.GetName() original_arg = func.MakeOriginalArgString("") context_arg = "glGetCurrentContextPPAPI()" if len(original_arg): arg = context_arg + ", " + original_arg else: arg = context_arg - file.Write(" %s%s->%s(%s);\n" % - (return_str, interface_str, func.name, arg)) + if interface.GetName(): + file.Write(" const struct %s* ext = %s;\n" % + (interface.GetStructName(), interface_str)) + file.Write(" if (ext)\n") + file.Write(" %sext->%s(%s);\n" % + (return_str, func.name, arg)) + if return_str: + file.Write(" %s0;\n" % return_str) + else: + file.Write(" %s%s->%s(%s);\n" % + (return_str, interface_str, func.name, arg)) file.Write("}\n\n") + file.Close() def WritePepperGLES2NaClProxy(self, filename): """Writes the Pepper OpenGLES interface implementation for NaCl.""" @@ -5859,15 +5967,14 @@ const PPB_OpenGLES2* PPB_OpenGLES2_Shared::GetInterface() { "/plugin_ppb_graphics_3d.h\"\n\n") file.Write("#include \"gpu/command_buffer/client/gles2_implementation.h\"") - file.Write("\n#include \"native_client/src/third_party" - "/ppapi/c/dev/ppb_opengles_dev.h\"\n\n") + file.Write("\n#include \"ppapi/c/ppb_opengles2.h\"\n\n") file.Write("using ppapi_proxy::PluginGraphics3D;\n") file.Write("using ppapi_proxy::PluginResource;\n\n") file.Write("namespace {\n\n") for func in self.original_functions: - if not func.IsCoreGLFunction(): + if not func.InAnyPepperExtension(): continue args = func.MakeTypedOriginalArgString("") if len(args) != 0: @@ -5886,17 +5993,21 @@ const PPB_OpenGLES2* PPB_OpenGLES2_Shared::GetInterface() { file.Write("\n} // namespace\n\n") - file.Write("const PPB_OpenGLES2* " - "PluginGraphics3D::GetOpenGLESInterface() {\n") - - file.Write(" const static struct PPB_OpenGLES2 ppb_opengles = {\n") - file.Write(" &") - file.Write(",\n &".join( - f.name for f in self.original_functions if f.IsCoreGLFunction())) - file.Write("\n") - file.Write(" };\n") - file.Write(" return &ppb_opengles;\n") - file.Write("}\n") + for interface in self.pepper_interfaces: + file.Write("const %s* " + "PluginGraphics3D::GetOpenGLES%sInterface() {\n" % + (interface.GetStructName(), interface.GetName())) + + file.Write(" const static struct %s ppb_opengles = {\n" % + interface.GetStructName()) + file.Write(" &") + file.Write(",\n &".join( + f.name for f in self.original_functions + if f.InPepperInterface(interface))) + file.Write("\n") + file.Write(" };\n") + file.Write(" return &ppb_opengles;\n") + file.Write("}\n") file.Close() @@ -5936,7 +6047,8 @@ def main(argv): if options.alternate_mode == "ppapi": # To trigger this action, do "make ppapi_gles_bindings" os.chdir("ppapi"); - gen.WritePepperGLES2Interface("c/ppb_opengles2.h") + gen.WritePepperGLES2Interface("c/ppb_opengles2.h", False) + gen.WritePepperGLES2Interface("c/dev/ppb_opengles2ext_dev.h", True) gen.WriteGLES2ToPPAPIBridge("lib/gl/gles2/gles2.c") elif options.alternate_mode == "chrome_ppapi": @@ -5945,6 +6057,7 @@ def main(argv): "ppapi/shared_impl/ppb_opengles2_shared.cc") elif options.alternate_mode == "nacl_ppapi": + os.chdir("ppapi") gen.WritePepperGLES2NaClProxy( "native_client/src/shared/ppapi_proxy/plugin_opengles.cc") |