Chromium Code Reviews| Index: ui/gl/generate_bindings.py |
| diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py |
| index 72c9eb1e1b84332bc19813b7af9415d48c9a33e8..a19a7607f8969955e3a1cc5b2fc8a3cc35923057 100755 |
| --- a/ui/gl/generate_bindings.py |
| +++ b/ui/gl/generate_bindings.py |
| @@ -1145,10 +1145,6 @@ namespace gfx { |
| class GLContext; |
| -void InitializeGLBindings%(name)s(); |
| -void InitializeGLExtensionBindings%(name)s(GLContext* context); |
| -void InitializeDebugGLBindings%(name)s(); |
| -void ClearGLBindings%(name)s(); |
| """ % {'name': set_name.upper()}) |
| # Write typedefs for function pointer types. Always use the GL name for the |
| @@ -1160,30 +1156,97 @@ void ClearGLBindings%(name)s(); |
| # Write declarations for booleans indicating which extensions are available. |
| file.write('\n') |
| + file.write("struct Extensions%s {\n" % set_name.upper()) |
| for extension, ext_functions in used_extension_functions: |
| - file.write('GL_EXPORT extern bool g_%s;\n' % extension) |
| + file.write(' bool b_%s;\n' % extension) |
| + file.write('};\n') |
| + file.write('\n') |
| + |
| +# # Write declarations for function pointers. Always use the GL name for the |
| +# # declaration. |
| +# file.write('\n') |
|
apatrick_chromium
2012/10/24 23:09:12
Commented out
|
| +# for func in functions: |
| +# file.write('GL_EXPORT extern %sProc g_%s;\n' % |
| +# (func['names'][0], func['names'][0])) |
| +# file.write('\n') |
| + |
| + # Write Procs struct. |
| + file.write("struct Procs%s {\n" % set_name.upper()) |
| + for func in functions: |
| + file.write(' %sProc %sFn;\n' % (func['names'][0], func['names'][0])) |
| + file.write('};\n') |
| + file.write('\n') |
| - # Write declarations for function pointers. Always use the GL name for the |
| - # declaration. |
| + # Write Driver struct. |
| + file.write( |
| +"""struct GL_EXPORT Driver%(name)s { |
| + void InitializeBindings(); |
| + void InitializeExtensionBindings(GLContext* context); |
| + void InitializeDebugBindings(); |
| + void ClearBindings(); |
| + void UpdateDebugExtensionBindings(); |
| + |
| + Procs%(name)s fn; |
| + Procs%(name)s debug_fn; |
| + Extensions%(name)s ext; |
| +""" % {'name': set_name.upper()}) |
| + file.write('};\n') |
| file.write('\n') |
| + |
| + # Write Api class. |
| + file.write( |
| +"""class GL_EXPORT %(name)sApi { |
| + public: |
| + %(name)sApi(); |
| + virtual ~%(name)sApi(); |
| + |
| +""" % {'name': set_name.upper()}) |
| for func in functions: |
| - file.write('GL_EXPORT extern %sProc g_%s;\n' % |
| - (func['names'][0], func['names'][0])) |
| + file.write(' virtual %s %sFn(%s) = 0;\n' % |
| + (func['return_type'], func['names'][0], func['arguments'])) |
| + file.write('};\n') |
| file.write('\n') |
| + |
| file.write( '} // namespace gfx\n') |
| # Write macros to invoke function pointers. Always use the GL name for the |
| # macro. |
| file.write('\n') |
| for func in functions: |
| - file.write('#define %s ::gfx::g_%s\n' % |
| - (func['names'][0], func['names'][0])) |
| + file.write('#define %s ::gfx::g_current_%s_context->%sFn\n' % |
| + (func['names'][0], set_name.lower(), func['names'][0])) |
| file.write('\n') |
| file.write('#endif // UI_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' % |
| set_name.upper()) |
| +def GenerateAPIHeader(file, functions, set_name, used_extension_functions): |
| + """Generates gl_binding_api_autogen_x.h""" |
| + |
| + # Write file header. |
| + file.write( |
| +"""// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// This file is automatically generated. |
| + |
| +#ifndef UI_GFX_GL_GL_BINDINGS_API_AUTOGEN_%(name)s_H_ |
| +#define UI_GFX_GL_GL_BINDINGS_API_AUTOGEN_%(name)s_H_ |
| + |
| +""" % {'name': set_name.upper()}) |
| + |
| + # Write API declaration. |
| + for func in functions: |
| + file.write(' virtual %s %sFn(%s) OVERRIDE;\n' % |
| + (func['return_type'], func['names'][0], func['arguments'])) |
| + |
| + file.write('\n') |
| + file.write('#endif // UI_GFX_GL_GL_BINDINGS_API_AUTOGEN_%s_H_\n' % |
| + set_name.upper()) |
| + |
| + |
| def GenerateSource(file, functions, set_name, used_extension_functions): |
| """Generates gl_binding_autogen_x.cc""" |
| @@ -1200,53 +1263,52 @@ def GenerateSource(file, functions, set_name, used_extension_functions): |
| #include "ui/gl/gl_bindings.h" |
| #include "ui/gl/gl_context.h" |
| #include "ui/gl/gl_implementation.h" |
| +#include "ui/gl/gl_%s_api_implementation.h" |
| using gpu::gles2::GLES2Util; |
| namespace gfx { |
| -""") |
| - # Write definitions for booleans indicating which extensions are available. |
| - for extension, ext_functions in used_extension_functions: |
| - file.write('bool g_%s;\n' % extension) |
| +""" % set_name.lower()) |
| +# # Write definitions for booleans indicating which extensions are available. |
| +# for extension, ext_functions in used_extension_functions: |
|
apatrick_chromium
2012/10/24 23:09:12
Commented out
|
| +# file.write('bool g_%s;\n' % extension) |
| # Write definitions of function pointers. |
| file.write('\n') |
| file.write('static bool g_debugBindingsInitialized;\n') |
| - file.write('static void UpdateDebugGLExtensionBindings();\n') |
| + file.write('Driver%s g_driver_%s;\n' % (set_name.upper(), set_name.lower())) |
| file.write('\n') |
| - for func in functions: |
| - file.write('%sProc g_%s;\n' % (func['names'][0], func['names'][0])) |
| - |
| - file.write('\n') |
| - for func in functions: |
| - file.write('static %sProc g_debug_%s;\n' % |
| - (func['names'][0], func['names'][0])) |
| +# for func in functions: |
|
apatrick_chromium
2012/10/24 23:09:12
And here!
|
| +# file.write('%sProc g_%s;\n' % (func['names'][0], func['names'][0])) |
| # Write function to initialize the core function pointers. The code assumes |
| # any non-NULL pointer returned by GetGLCoreProcAddress() is valid, although |
| # it may be overwritten by an extension function pointer later. |
| file.write('\n') |
| - file.write('void InitializeGLBindings%s() {\n' % set_name.upper()) |
| + file.write('void Driver%s::InitializeBindings() {\n' % |
| + set_name.upper()) |
| for func in functions: |
| first_name = func['names'][0] |
| for i, name in enumerate(func['names']): |
| if i: |
| - file.write(' if (!g_%s)\n ' % first_name) |
| + file.write(' if (!fn.%sFn)\n ' % first_name) |
| file.write( |
| - ' g_%s = reinterpret_cast<%sProc>(GetGLCoreProcAddress("%s"));\n' % |
| - (first_name, first_name, name)) |
| + ' fn.%sFn = reinterpret_cast<%sProc>(' |
| + 'GetGLCoreProcAddress("%s"));\n' % |
| + (first_name, first_name, name)) |
| file.write('}\n') |
| file.write('\n') |
| # Write function to initialize the extension function pointers. This function |
| # uses a current context to query which extensions are actually supported. |
| - file.write('void InitializeGLExtensionBindings%s(GLContext* context) {\n' % |
| - set_name.upper()) |
| + file.write("""void Driver%s::InitializeExtensionBindings( |
| + GLContext* context) { |
| +""" % set_name.upper()) |
| file.write(' DCHECK(context && context->IsCurrent(NULL));\n') |
| for extension, ext_functions in used_extension_functions: |
| - file.write(' g_%s = context->HasExtension("%s");\n' % |
| + file.write(' ext.b_%s = context->HasExtension("%s");\n' % |
| (extension, extension)) |
| - file.write(' if (g_%s) {\n' % |
| + file.write(' if (ext.b_%s) {\n' % |
| (extension)) |
| queried_entry_points = set() |
| for entry_point_name, function_name in ext_functions: |
| @@ -1254,14 +1316,14 @@ namespace gfx { |
| # alternatives for the same entry point (e.g., |
| # GL_ARB_blend_func_extended). |
| if entry_point_name in queried_entry_points: |
| - file.write(' if (!g_%s)\n ' % entry_point_name) |
| + file.write(' if (!fn.%sFn)\n ' % entry_point_name) |
| file.write( |
| - ' g_%s = reinterpret_cast<%sProc>(GetGLProcAddress("%s"));\n' % |
| + ' fn.%sFn = reinterpret_cast<%sProc>(GetGLProcAddress("%s"));\n' % |
| (entry_point_name, entry_point_name, function_name)) |
| queried_entry_points.add(entry_point_name) |
| file.write(' }\n') |
| file.write(' if (g_debugBindingsInitialized)\n') |
| - file.write(' UpdateDebugGLExtensionBindings();\n') |
| + file.write(' UpdateDebugExtensionBindings();\n') |
| file.write('}\n') |
| file.write('\n') |
| @@ -1314,15 +1376,15 @@ namespace gfx { |
| if return_type == 'void': |
| file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' % |
| (function_name, log_argument_names)) |
| - file.write(' g_debug_%s(%s);\n' % |
| - (function_name, argument_names)) |
| + file.write(' g_driver_%s.debug_fn.%sFn(%s);\n' % |
| + (set_name.lower(), function_name, argument_names)) |
| if 'logging_code' in func: |
| file.write("%s\n" % func['logging_code']) |
| else: |
| file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' % |
| (function_name, log_argument_names)) |
| - file.write(' %s result = g_debug_%s(%s);\n' % |
| - (return_type, function_name, argument_names)) |
| + file.write(' %s result = g_driver_%s.debug_fn.%sFn(%s);\n' % |
| + (return_type, set_name.lower(), function_name, argument_names)) |
| if 'logging_code' in func: |
| file.write("%s\n" % func['logging_code']) |
| else: |
| @@ -1333,12 +1395,13 @@ namespace gfx { |
| # Write function to initialize the debug function pointers. |
| file.write('\n') |
| - file.write('void InitializeDebugGLBindings%s() {\n' % set_name.upper()) |
| + file.write('void Driver%s::InitializeDebugBindings() {\n' % |
| + set_name.upper()) |
| for func in functions: |
| first_name = func['names'][0] |
| - file.write(' if (!g_debug_%s) {\n' % first_name) |
| - file.write(' g_debug_%s = g_%s;\n' % (first_name, first_name)) |
| - file.write(' g_%s = Debug_%s;\n' % (first_name, first_name)) |
| + file.write(' if (!debug_fn.%sFn) {\n' % first_name) |
| + file.write(' debug_fn.%sFn = fn.%sFn;\n' % (first_name, first_name)) |
| + file.write(' fn.%sFn = Debug_%s;\n' % (first_name, first_name)) |
| file.write(' }\n') |
| file.write(' g_debugBindingsInitialized = true;\n') |
| file.write('}\n') |
| @@ -1346,32 +1409,46 @@ namespace gfx { |
| # Write function to update the debug function pointers to extension functions |
| # after the extensions have been initialized. |
| file.write('\n') |
| - file.write('static void UpdateDebugGLExtensionBindings() {\n') |
| + file.write('void Driver%s::UpdateDebugExtensionBindings() {\n' % |
| + set_name.upper()) |
| for extension, ext_functions in used_extension_functions: |
| for name, _ in ext_functions: |
| - file.write(' if (g_debug_%s != g_%s &&\n' % (name, name)) |
| - file.write(' g_%s != Debug_%s) {\n' % (name, name)) |
| - file.write(' g_debug_%s = g_%s;\n' % (name, name)) |
| - file.write(' g_%s = Debug_%s;\n' % (name, name)) |
| + file.write(' if (debug_fn.%sFn != fn.%sFn &&\n' % (name, name)) |
| + file.write(' fn.%sFn != Debug_%s) {\n' % (name, name)) |
| + file.write(' debug_fn.%sFn = fn.%sFn;\n' % (name, name)) |
| + file.write(' fn.%sFn = Debug_%s;\n' % (name, name)) |
| file.write(' }\n') |
| file.write('}\n') |
| # Write function to clear all function pointers. |
| file.write('\n') |
| - file.write('void ClearGLBindings%s() {\n' % set_name.upper()) |
| - # Clear the availability of GL extensions. |
| - for extension, ext_functions in used_extension_functions: |
| - file.write(' g_%s = false;\n' % extension) |
| - # Clear GL bindings. |
| - file.write('\n') |
| - for func in functions: |
| - file.write(' g_%s = NULL;\n' % func['names'][0]) |
| - # Clear debug GL bindings. |
| - file.write('\n') |
| + file.write("""void Driver%s::ClearBindings() { |
| + memset(this, 0, sizeof(*this)); |
| +} |
| +""" % set_name.upper()) |
| + |
| + # Write RealGLApi functions |
| for func in functions: |
| - file.write(' g_debug_%s = NULL;\n' % func['names'][0]) |
| - file.write(' g_debugBindingsInitialized = false;\n') |
| - file.write('}\n') |
| + names = func['names'] |
| + return_type = func['return_type'] |
| + arguments = func['arguments'] |
| + file.write('\n') |
| + file.write('%s Real%sApi::%sFn(%s) {\n' % |
| + (return_type, set_name.upper(), names[0], arguments)) |
| + argument_names = re.sub( |
| + r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments) |
| + argument_names = re.sub( |
| + r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names) |
| + if argument_names == 'void' or argument_names == '': |
| + argument_names = '' |
| + function_name = names[0] |
| + if return_type == 'void': |
| + file.write(' driver_->fn.%sFn(%s);\n' % |
| + (function_name, argument_names)) |
| + else: |
| + file.write(' return driver_->fn.%sFn(%s);\n' % |
| + (function_name, argument_names)) |
| + file.write('}\n') |
| file.write('\n') |
| file.write('} // namespace gfx\n') |
| @@ -1572,6 +1649,12 @@ def main(argv): |
| GenerateHeader(header_file, functions, set_name, used_extension_functions) |
| header_file.close() |
| + header_file = open( |
| + os.path.join(dir, 'gl_bindings_api_autogen_%s.h' % set_name), 'wb') |
| + GenerateAPIHeader( |
| + header_file, functions, set_name, used_extension_functions) |
| + header_file.close() |
| + |
| source_file = open( |
| os.path.join(dir, 'gl_bindings_autogen_%s.cc' % set_name), 'wb') |
| GenerateSource(source_file, functions, set_name, used_extension_functions) |