OLD | NEW |
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 6943 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6954 for arg in args if not arg.IsConstant()]) | 6954 for arg in args if not arg.IsConstant()]) |
6955 return self.__MaybePrependComma(arg_string, add_comma) | 6955 return self.__MaybePrependComma(arg_string, add_comma) |
6956 | 6956 |
6957 def MakeTypedPepperArgString(self, prefix): | 6957 def MakeTypedPepperArgString(self, prefix): |
6958 """Gets a list of arguments as they need to be for Pepper.""" | 6958 """Gets a list of arguments as they need to be for Pepper.""" |
6959 if self.GetInfo("pepper_args"): | 6959 if self.GetInfo("pepper_args"): |
6960 return self.GetInfo("pepper_args") | 6960 return self.GetInfo("pepper_args") |
6961 else: | 6961 else: |
6962 return self.MakeTypedOriginalArgString(prefix, False) | 6962 return self.MakeTypedOriginalArgString(prefix, False) |
6963 | 6963 |
| 6964 def MapCTypeToPepperIdlType(self, ctype, is_for_return_type=False): |
| 6965 """Converts a C type name to the corresponding Pepper IDL type.""" |
| 6966 idltype = { |
| 6967 'char*': '[out] str_t', |
| 6968 'const GLchar* const*': '[out] cstr_t', |
| 6969 'const char*': 'cstr_t', |
| 6970 'const void*': 'mem_t', |
| 6971 'void*': '[out] mem_t', |
| 6972 'void**': '[out] mem_ptr_t', |
| 6973 }.get(ctype, ctype) |
| 6974 # We use "GLxxx_ptr_t" for "GLxxx*". |
| 6975 matched = re.match(r'(const )?(GL\w+)\*$', ctype) |
| 6976 if matched: |
| 6977 idltype = matched.group(2) + '_ptr_t' |
| 6978 if not matched.group(1): |
| 6979 idltype = '[out] ' + idltype |
| 6980 # If an in/out specifier is not specified yet, prepend [in]. |
| 6981 if idltype[0] != '[': |
| 6982 idltype = '[in] ' + idltype |
| 6983 # Strip the in/out specifier for a return type. |
| 6984 if is_for_return_type: |
| 6985 idltype = re.sub(r'\[\w+\] ', '', idltype) |
| 6986 return idltype |
| 6987 |
| 6988 def MakeTypedPepperIdlArgStrings(self): |
| 6989 """Gets a list of arguments as they need to be for Pepper IDL.""" |
| 6990 args = self.GetOriginalArgs() |
| 6991 return ["%s %s" % (self.MapCTypeToPepperIdlType(arg.type), arg.name) |
| 6992 for arg in args] |
| 6993 |
6964 def GetPepperName(self): | 6994 def GetPepperName(self): |
6965 if self.GetInfo("pepper_name"): | 6995 if self.GetInfo("pepper_name"): |
6966 return self.GetInfo("pepper_name") | 6996 return self.GetInfo("pepper_name") |
6967 return self.name | 6997 return self.name |
6968 | 6998 |
6969 def MakeTypedCmdArgString(self, prefix, add_comma = False): | 6999 def MakeTypedCmdArgString(self, prefix, add_comma = False): |
6970 """Gets a typed list of arguments as they need to be for command buffers.""" | 7000 """Gets a typed list of arguments as they need to be for command buffers.""" |
6971 args = self.GetCmdArgs() | 7001 args = self.GetCmdArgs() |
6972 arg_string = ", ".join( | 7002 arg_string = ", ".join( |
6973 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) | 7003 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) |
(...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8260 else: | 8290 else: |
8261 file.Write(""" return GLES2Util::GetQualifiedEnumString( | 8291 file.Write(""" return GLES2Util::GetQualifiedEnumString( |
8262 NULL, 0, value); | 8292 NULL, 0, value); |
8263 } | 8293 } |
8264 | 8294 |
8265 """) | 8295 """) |
8266 file.Close() | 8296 file.Close() |
8267 | 8297 |
8268 def WritePepperGLES2Interface(self, filename, dev): | 8298 def WritePepperGLES2Interface(self, filename, dev): |
8269 """Writes the Pepper OpenGLES interface definition.""" | 8299 """Writes the Pepper OpenGLES interface definition.""" |
8270 file = CHeaderWriter( | 8300 file = CWriter(filename) |
8271 filename, | 8301 file.Write(_LICENSE) |
8272 "// OpenGL ES interface.\n") | 8302 file.Write(_DO_NOT_EDIT_WARNING) |
8273 | 8303 |
| 8304 file.Write("label Chrome {\n") |
| 8305 file.Write(" M39 = 1.0\n") |
| 8306 file.Write("};\n\n") |
| 8307 |
| 8308 if not dev: |
| 8309 # Declare GL types. |
| 8310 file.Write("[version=1.0]\n") |
| 8311 file.Write("describe {\n") |
| 8312 for gltype in ['GLbitfield', 'GLboolean', 'GLbyte', 'GLclampf', |
| 8313 'GLclampx', 'GLenum', 'GLfixed', 'GLfloat', 'GLint', |
| 8314 'GLintptr', 'GLshort', 'GLsizei', 'GLsizeiptr', |
| 8315 'GLubyte', 'GLuint', 'GLushort']: |
| 8316 file.Write(" %s;\n" % gltype) |
| 8317 file.Write(" %s_ptr_t;\n" % gltype) |
| 8318 file.Write("};\n\n") |
| 8319 |
| 8320 # C level typedefs. |
| 8321 file.Write("#inline c\n") |
8274 file.Write("#include \"ppapi/c/pp_resource.h\"\n") | 8322 file.Write("#include \"ppapi/c/pp_resource.h\"\n") |
8275 if dev: | 8323 if dev: |
8276 file.Write("#include \"ppapi/c/ppb_opengles2.h\"\n\n") | 8324 file.Write("#include \"ppapi/c/ppb_opengles2.h\"\n\n") |
8277 else: | 8325 else: |
8278 file.Write("\n#ifndef __gl2_h_\n") | 8326 file.Write("\n#ifndef __gl2_h_\n") |
8279 for (k, v) in _GL_TYPES.iteritems(): | 8327 for (k, v) in _GL_TYPES.iteritems(): |
8280 file.Write("typedef %s %s;\n" % (v, k)) | 8328 file.Write("typedef %s %s;\n" % (v, k)) |
8281 file.Write("#ifdef _WIN64\n") | 8329 file.Write("#ifdef _WIN64\n") |
8282 for (k, v) in _GL_TYPES_64.iteritems(): | 8330 for (k, v) in _GL_TYPES_64.iteritems(): |
8283 file.Write("typedef %s %s;\n" % (v, k)) | 8331 file.Write("typedef %s %s;\n" % (v, k)) |
8284 file.Write("#else\n") | 8332 file.Write("#else\n") |
8285 for (k, v) in _GL_TYPES_32.iteritems(): | 8333 for (k, v) in _GL_TYPES_32.iteritems(): |
8286 file.Write("typedef %s %s;\n" % (v, k)) | 8334 file.Write("typedef %s %s;\n" % (v, k)) |
8287 file.Write("#endif // _WIN64\n") | 8335 file.Write("#endif // _WIN64\n") |
8288 file.Write("#endif // __gl2_h_\n\n") | 8336 file.Write("#endif // __gl2_h_\n\n") |
| 8337 file.Write("#endinl\n") |
8289 | 8338 |
8290 for interface in self.pepper_interfaces: | 8339 for interface in self.pepper_interfaces: |
8291 if interface.dev != dev: | 8340 if interface.dev != dev: |
8292 continue | 8341 continue |
8293 file.Write("#define %s_1_0 \"%s;1.0\"\n" % | 8342 # Historically, we provide OpenGLES2 interfaces with struct |
8294 (interface.GetInterfaceName(), interface.GetInterfaceString())) | 8343 # namespace. Not to break code which uses the interface as |
8295 file.Write("#define %s %s_1_0\n" % | 8344 # "struct OpenGLES2", we put it in struct namespace. |
8296 (interface.GetInterfaceName(), interface.GetInterfaceName())) | 8345 file.Write('\n[macro="%s", force_struct_namespace]\n' % |
8297 | 8346 interface.GetInterfaceName()) |
8298 file.Write("\nstruct %s {\n" % interface.GetStructName()) | 8347 file.Write("interface %s {\n" % interface.GetStructName()) |
8299 for func in self.original_functions: | 8348 for func in self.original_functions: |
8300 if not func.InPepperInterface(interface): | 8349 if not func.InPepperInterface(interface): |
8301 continue | 8350 continue |
8302 | 8351 |
8303 original_arg = func.MakeTypedPepperArgString("") | 8352 ret_type = func.MapCTypeToPepperIdlType(func.return_type, |
8304 context_arg = "PP_Resource context" | 8353 is_for_return_type=True) |
8305 if len(original_arg): | 8354 func_prefix = " %s %s(" % (ret_type, func.GetPepperName()) |
8306 arg = context_arg + ", " + original_arg | 8355 file.Write(func_prefix) |
8307 else: | 8356 file.Write("[in] PP_Resource context") |
8308 arg = context_arg | 8357 for arg in func.MakeTypedPepperIdlArgStrings(): |
8309 file.Write(" %s (*%s)(%s);\n" % | 8358 file.Write(",\n" + " " * len(func_prefix) + arg) |
8310 (func.return_type, func.GetPepperName(), arg)) | 8359 file.Write(");\n") |
8311 file.Write("};\n\n") | 8360 file.Write("};\n\n") |
8312 | 8361 |
8313 | 8362 |
8314 file.Close() | 8363 file.Close() |
8315 | 8364 |
8316 def WritePepperGLES2Implementation(self, filename): | 8365 def WritePepperGLES2Implementation(self, filename): |
8317 """Writes the Pepper OpenGLES interface implementation.""" | 8366 """Writes the Pepper OpenGLES interface implementation.""" |
8318 | 8367 |
8319 file = CWriter(filename) | 8368 file = CWriter(filename) |
8320 file.Write(_LICENSE) | 8369 file.Write(_LICENSE) |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8505 # This script lives under gpu/command_buffer, cd to base directory. | 8554 # This script lives under gpu/command_buffer, cd to base directory. |
8506 os.chdir(os.path.dirname(__file__) + "/../..") | 8555 os.chdir(os.path.dirname(__file__) + "/../..") |
8507 | 8556 |
8508 gen = GLGenerator(options.verbose) | 8557 gen = GLGenerator(options.verbose) |
8509 gen.ParseGLH("gpu/command_buffer/cmd_buffer_functions.txt") | 8558 gen.ParseGLH("gpu/command_buffer/cmd_buffer_functions.txt") |
8510 | 8559 |
8511 # Support generating files under gen/ | 8560 # Support generating files under gen/ |
8512 if options.output_dir != None: | 8561 if options.output_dir != None: |
8513 os.chdir(options.output_dir) | 8562 os.chdir(options.output_dir) |
8514 | 8563 |
8515 gen.WritePepperGLES2Interface("ppapi/c/ppb_opengles2.h", False) | 8564 gen.WritePepperGLES2Interface("ppapi/api/ppb_opengles2.idl", False) |
8516 gen.WritePepperGLES2Interface("ppapi/c/dev/ppb_opengles2ext_dev.h", True) | 8565 gen.WritePepperGLES2Interface("ppapi/api/dev/ppb_opengles2ext_dev.idl", True) |
8517 gen.WriteGLES2ToPPAPIBridge("ppapi/lib/gl/gles2/gles2.c") | 8566 gen.WriteGLES2ToPPAPIBridge("ppapi/lib/gl/gles2/gles2.c") |
8518 gen.WritePepperGLES2Implementation( | 8567 gen.WritePepperGLES2Implementation( |
8519 "ppapi/shared_impl/ppb_opengles2_shared.cc") | 8568 "ppapi/shared_impl/ppb_opengles2_shared.cc") |
8520 os.chdir("gpu/command_buffer") | 8569 os.chdir("gpu/command_buffer") |
8521 gen.WriteCommandIds("common/gles2_cmd_ids_autogen.h") | 8570 gen.WriteCommandIds("common/gles2_cmd_ids_autogen.h") |
8522 gen.WriteFormat("common/gles2_cmd_format_autogen.h") | 8571 gen.WriteFormat("common/gles2_cmd_format_autogen.h") |
8523 gen.WriteFormatTest("common/gles2_cmd_format_test_autogen.h") | 8572 gen.WriteFormatTest("common/gles2_cmd_format_test_autogen.h") |
8524 gen.WriteGLES2InterfaceHeader("client/gles2_interface_autogen.h") | 8573 gen.WriteGLES2InterfaceHeader("client/gles2_interface_autogen.h") |
8525 gen.WriteGLES2InterfaceStub("client/gles2_interface_stub_autogen.h") | 8574 gen.WriteGLES2InterfaceStub("client/gles2_interface_stub_autogen.h") |
8526 gen.WriteGLES2InterfaceStubImpl( | 8575 gen.WriteGLES2InterfaceStubImpl( |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8599 "ppapi/shared_impl/ppb_opengles2_shared.cc"]) | 8648 "ppapi/shared_impl/ppb_opengles2_shared.cc"]) |
8600 | 8649 |
8601 if gen.errors > 0: | 8650 if gen.errors > 0: |
8602 print "%d errors" % gen.errors | 8651 print "%d errors" % gen.errors |
8603 return 1 | 8652 return 1 |
8604 return 0 | 8653 return 0 |
8605 | 8654 |
8606 | 8655 |
8607 if __name__ == '__main__': | 8656 if __name__ == '__main__': |
8608 sys.exit(main(sys.argv[1:])) | 8657 sys.exit(main(sys.argv[1:])) |
OLD | NEW |