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

Unified Diff: ui/gl/generate_bindings.py

Issue 11266023: Make GL calls go through subclassable class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/program_manager_unittest.cc ('k') | ui/gl/gl.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gl/generate_bindings.py
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index 72c9eb1e1b84332bc19813b7af9415d48c9a33e8..009060233b7b4c3eb54d2e12920b8cb205a420a7 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,89 @@ 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 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 +1255,47 @@ 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 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]))
# 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 +1303,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 +1363,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 +1382,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 +1396,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 +1636,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)
« no previous file with comments | « gpu/command_buffer/service/program_manager_unittest.cc ('k') | ui/gl/gl.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698