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) |