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