Skip to content

Commit

Permalink
Revert "Revert 164047 - Make GL calls go through subclassable class."
Browse files Browse the repository at this point in the history
This reverts commit 25afcfe.

BUG=155557
TBR=apatrick@chromium.org

Review URL: https://codereview.chromium.org/11264041

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@164095 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
gman@chromium.org committed Oct 25, 2012
1 parent 5bcd97c commit b97c908
Show file tree
Hide file tree
Showing 27 changed files with 705 additions and 91 deletions.
3 changes: 2 additions & 1 deletion content/common/gpu/gpu_channel_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ GpuChannelManager::~GpuChannelManager() {

gpu::gles2::ProgramCache* GpuChannelManager::program_cache() {
if (!program_cache_.get() &&
(gfx::g_ARB_get_program_binary || gfx::g_OES_get_program_binary) &&
(gfx::g_driver_gl.ext.b_ARB_get_program_binary ||
gfx::g_driver_gl.ext.b_OES_get_program_binary) &&
!CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableGpuProgramCache)) {
program_cache_.reset(new gpu::gles2::MemoryProgramCache());
Expand Down
2 changes: 1 addition & 1 deletion gpu/command_buffer/service/program_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,7 @@ bool ProgramManager::ProgramInfo::Link(ShaderManager* manager,

if (link) {
before_time = TimeTicks::HighResNow();
if (cache && gfx::g_GL_ARB_get_program_binary) {
if (cache && gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) {
glProgramParameteri(service_id(),
PROGRAM_BINARY_RETRIEVABLE_HINT,
GL_TRUE);
Expand Down
2 changes: 1 addition & 1 deletion gpu/command_buffer/service/program_manager_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1287,7 +1287,7 @@ class ProgramManagerWithCacheTest : public testing::Test {

void SetExpectationsForProgramLink(GLuint service_program_id) {
TestHelper::SetupShader(gl_.get(), NULL, 0, NULL, 0, service_program_id);
if (gfx::g_GL_ARB_get_program_binary) {
if (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) {
EXPECT_CALL(*gl_.get(),
ProgramParameteri(service_program_id,
PROGRAM_BINARY_RETRIEVABLE_HINT,
Expand Down
190 changes: 130 additions & 60 deletions ui/gl/generate_bindings.py
Original file line number Diff line number Diff line change
Expand Up @@ -1145,10 +1145,6 @@ def GenerateHeader(file, functions, set_name, used_extension_functions):
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
Expand All @@ -1160,30 +1156,89 @@ class GLContext;

# 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"""

Expand All @@ -1200,68 +1255,62 @@ 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:
# Replace the pointer unconditionally unless this extension has several
# 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')

Expand Down Expand Up @@ -1314,15 +1363,15 @@ def GenerateSource(file, functions, set_name, used_extension_functions):
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:
Expand All @@ -1333,45 +1382,60 @@ def GenerateSource(file, functions, set_name, used_extension_functions):

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

# 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')
Expand Down Expand Up @@ -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)
Expand Down
Loading

0 comments on commit b97c908

Please sign in to comment.