Update from https://crrev.com/312398

Involves adding many //testing/test.gni imports, fixing one
SkSurface::NewRenderTarget invocation inside sky, and fixing up
base::Process usage in the shell.

Review URL: https://codereview.chromium.org/862133002
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index ea1ea98..bdd7c98 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -8,16 +8,10 @@
   import("//build/config/android/rules.gni")
 }
 
-gl_binding_output_dir = target_gen_dir
-
 config("gl_config") {
   if (use_x11) {
     defines = [ "GL_GLEXT_PROTOTYPES" ]
   }
-
-  # TODO(brettw) this should be removed and the the files using the generated
-  # GL bindings should use the path inside the gen directory.
-  include_dirs = [ gl_binding_output_dir ]
 }
 
 component("gl") {
@@ -33,6 +27,10 @@
     "android/surface_texture_listener.cc",
     "android/surface_texture_listener.h",
     "gl_bindings.h",
+    "gl_bindings_autogen_gl.cc",
+    "gl_bindings_autogen_gl.h",
+    "gl_bindings_autogen_osmesa.cc",
+    "gl_bindings_autogen_osmesa.h",
     "gl_bindings_skia_in_process.cc",
     "gl_bindings_skia_in_process.h",
     "gl_context.cc",
@@ -46,6 +44,9 @@
     "gl_context_stub_with_extensions.cc",
     "gl_context_stub_with_extensions.h",
     "gl_context_win.cc",
+    "gl_enums.cc",
+    "gl_enums.h",
+    "gl_enums_implementation_autogen.h",
     "gl_export.h",
     "gl_fence.cc",
     "gl_fence.h",
@@ -96,10 +97,6 @@
     "scoped_make_current.h",
     "sync_control_vsync_provider.cc",
     "sync_control_vsync_provider.h",
-    "$gl_binding_output_dir/gl_bindings_autogen_gl.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_gl.h",
-    "$gl_binding_output_dir/gl_bindings_autogen_osmesa.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_osmesa.h",
   ]
 
   defines = [ "GL_IMPLEMENTATION" ]
@@ -108,13 +105,11 @@
     "//third_party/switfshader/include",
     "//third_party/khronos",
     "//third_party/mesa/src/include",
-    gl_binding_output_dir,
   ]
 
   all_dependent_configs = [ ":gl_config" ]
 
   deps = [
-    ":generate_gl_bindings",
     "//base/third_party/dynamic_annotations",
     "//gpu/command_buffer/common",
     "//skia",
@@ -131,6 +126,8 @@
     sources += [
       "egl_util.cc",
       "egl_util.h",
+      "gl_bindings_autogen_egl.cc",
+      "gl_bindings_autogen_egl.h",
       "gl_context_egl.cc",
       "gl_context_egl.h",
       "gl_fence_egl.cc",
@@ -139,8 +136,6 @@
       "gl_image_egl.h",
       "gl_surface_egl.cc",
       "gl_surface_egl.h",
-      "$gl_binding_output_dir/gl_bindings_autogen_egl.cc",
-      "$gl_binding_output_dir/gl_bindings_autogen_egl.h",
     ]
   }
   if (is_android || is_linux) {
@@ -158,6 +153,8 @@
   }
   if (use_x11) {
     sources += [
+      "gl_bindings_autogen_glx.cc",
+      "gl_bindings_autogen_glx.h",
       "gl_context_glx.cc",
       "gl_context_glx.h",
       "gl_context_x11.cc",
@@ -171,8 +168,6 @@
       "gl_surface_x11.cc",
       "gl_egl_api_implementation.cc",
       "gl_egl_api_implementation.h",
-      "$gl_binding_output_dir/gl_bindings_autogen_glx.cc",
-      "$gl_binding_output_dir/gl_bindings_autogen_glx.h",
     ]
 
     configs += [
@@ -185,6 +180,8 @@
   }
   if (is_win) {
     sources += [
+      "gl_bindings_autogen_wgl.cc",
+      "gl_bindings_autogen_wgl.h",
       "gl_context_wgl.cc",
       "gl_context_wgl.h",
       "gl_egl_api_implementation.cc",
@@ -193,8 +190,6 @@
       "gl_surface_wgl.h",
       "gl_wgl_api_implementation.cc",
       "gl_wgl_api_implementation.h",
-      "$gl_binding_output_dir/gl_bindings_autogen_wgl.cc",
-      "$gl_binding_output_dir/gl_bindings_autogen_wgl.h",
     ]
 
     libs = [ "dwmapi.lib" ]
@@ -234,81 +229,36 @@
 
     deps += [ ":gl_jni_headers" ]
   }
+  if (use_ozone) {
+    sources += [
+      "gl_context_ozone.cc",
+      "gl_egl_api_implementation.cc",
+      "gl_egl_api_implementation.h",
+      "gl_implementation_ozone.cc",
+      "gl_surface_ozone.cc",
+    ]
+    deps += [
+      "//ui/ozone",
+      "//ui/ozone:ozone_base",
+    ]
+  }
 
   if (is_android && !is_android_webview_build) {
     deps += [ "//ui/android:ui_java" ]
   }
 }
 
-action("generate_gl_bindings") {
-  visibility = [ ":*" ]  # Only targets in this file can see this.
-
-  script = "generate_bindings.py"
-
-  # TODO(brettw) make this dynamic. The GYP version calls "generate_bindings.py
-  # --inputs" to get the list here. What should happen is that the script
-  # should generate a .d file, which we should declare here. That will
-  # eliminate the need bot both hardcoding the list here or calling the script
-  # during GN-time.
-  inputs = [
-    "EGL/eglextchromium.h",
-    "GL/glextchromium.h",
-    "//third_party/mesa/src/include/GL/glext.h",
-    "//third_party/khronos/GLES2/gl2ext.h",
-    "//gpu/GLES2/gl2chromium.h",
-    "//gpu/GLES2/gl2extchromium.h",
-    "//third_party/khronos/EGL/eglext.h",
-    "//third_party/mesa/src/include/GL/wglext.h",
-    "//third_party/mesa/src/include/GL/glx.h",
-    "//third_party/mesa/src/include/GL/glxext.h",
-  ]
-
-  outputs = [
-    "$gl_binding_output_dir/gl_bindings_autogen_egl.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_egl.h",
-    "$gl_binding_output_dir/gl_bindings_api_autogen_egl.h",
-    "$gl_binding_output_dir/gl_bindings_autogen_gl.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_gl.h",
-    "$gl_binding_output_dir/gl_bindings_api_autogen_gl.h",
-    "$gl_binding_output_dir/gl_bindings_autogen_glx.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_glx.h",
-    "$gl_binding_output_dir/gl_bindings_api_autogen_glx.h",
-    "$gl_binding_output_dir/gl_bindings_autogen_mock.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_mock.h",
-    "$gl_binding_output_dir/gl_bindings_autogen_osmesa.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_osmesa.h",
-    "$gl_binding_output_dir/gl_bindings_api_autogen_osmesa.h",
-    "$gl_binding_output_dir/gl_bindings_autogen_wgl.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_wgl.h",
-    "$gl_binding_output_dir/gl_bindings_api_autogen_wgl.h",
-    "$gl_binding_output_dir/gl_mock_autogen_gl.h",
-  ]
-
-  args = [
-    "--header-paths=" + rebase_path("//third_party/khronos", root_build_dir) +
-        ":" + rebase_path("//third_party/mesa/src/include", root_build_dir) +
-        ":" + rebase_path("//ui/gl", root_build_dir) + ":" +
-        rebase_path("//gpu", root_build_dir),
-    rebase_path(gl_binding_output_dir, root_build_dir),
-  ]
-}
-
-config("gl_unittest_utils_config") {
-  include_dirs = [ gl_binding_output_dir ]
-}
-
 source_set("gl_unittest_utils") {
   testonly = true
   sources = [
+    "gl_bindings_autogen_mock.cc",
+    "gl_bindings_autogen_mock.h",
+    "gl_mock_autogen_gl.h",
     "gl_mock.h",
     "gl_mock.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_mock.cc",
-    "$gl_binding_output_dir/gl_bindings_autogen_mock.h",
-    "$gl_binding_output_dir/gl_mock_autogen_gl.h",
   ]
 
   configs += [ "//third_party/khronos:khronos_headers" ]
-  public_configs = [ ":gl_unittest_utils_config" ]
 
   deps = [
     ":gl",
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index af1bdc8..7a339b6 100755
--- a/ui/gl/generate_bindings.py
+++ b/ui/gl/generate_bindings.py
@@ -9,7 +9,16 @@
 import os
 import collections
 import re
+import platform
 import sys
+from subprocess import call
+
+HEADER_PATHS = [
+  '../../third_party/khronos',
+  '../../third_party/mesa/src/include',
+  '.',
+  '../../gpu',
+]
 
 """In case there are multiple versions of the same function, one that's listed
 first takes priority if its conditions are met. If the function is an extension
@@ -149,7 +158,7 @@
             'glCheckFramebufferStatus'],
   'arguments': 'GLenum target',
   'logging_code': """
-  GL_SERVICE_LOG("GL_RESULT: " << GLES2Util::GetStringEnum(result));
+  GL_SERVICE_LOG("GL_RESULT: " << GLEnums::GetStringEnum(result));
 """, },
 { 'return_type': 'void',
   'names': ['glClear'],
@@ -521,7 +530,7 @@
   'names': ['glGetError'],
   'arguments': 'void',
   'logging_code': """
-  GL_SERVICE_LOG("GL_RESULT: " << GLES2Util::GetStringError(result));
+  GL_SERVICE_LOG("GL_RESULT: " << GLEnums::GetStringError(result));
 """, },
 { 'return_type': 'void',
   'names': ['glGetFenceivNV'],
@@ -1688,17 +1697,35 @@
   [GLX_FUNCTIONS, 'glx', ['GL/glx.h', 'GL/glxext.h'], []],
 ]
 
+GLES2_HEADERS_WITH_ENUMS = [
+  'GLES2/gl2.h',
+  'GLES2/gl2ext.h',
+  'GLES2/gl2chromium.h',
+  'GLES2/gl2extchromium.h',
+  'GLES3/gl3.h',
+]
+
+SELF_LOCATION = os.path.dirname(os.path.abspath(__file__))
+
+LICENSE_AND_HEADER = """\
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+"""
 
 def GenerateHeader(file, functions, set_name, used_extensions):
   """Generates gl_bindings_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.
+  file.write(LICENSE_AND_HEADER +
+"""
 
 #ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
 #define UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
@@ -1763,14 +1790,7 @@
   """Generates gl_bindings_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.
-
-""" % {'name': set_name.upper()})
+  file.write(LICENSE_AND_HEADER)
 
   # Write API declaration.
   for func in functions:
@@ -1784,14 +1804,7 @@
   """Generates gl_mock_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.
-
-""" % {'name': set_name.upper()})
+  file.write(LICENSE_AND_HEADER)
 
   # Write API declaration.
   for func in functions:
@@ -1810,27 +1823,27 @@
 def GenerateSource(file, functions, set_name, used_extensions):
   """Generates gl_bindings_autogen_x.cc"""
 
-  # Write file header.
-  file.write(
-"""// Copyright (c) 2011 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.
+  set_header_name = "ui/gl/gl_" + set_name.lower() + "_api_implementation.h"
+  include_list = [ 'base/debug/trace_event.h',
+                   'ui/gl/gl_enums.h',
+                   'ui/gl/gl_bindings.h',
+                   'ui/gl/gl_context.h',
+                   'ui/gl/gl_implementation.h',
+                   'ui/gl/gl_version_info.h',
+                   set_header_name ]
+  includes_string = "\n".join(["#include \"{0}\"".format(h)
+                               for h in sorted(include_list)])
 
-// This file is automatically generated.
+  # Write file header.
+  file.write(LICENSE_AND_HEADER +
+"""
 
 #include <string>
-#include "base/debug/trace_event.h"
-#include "gpu/command_buffer/common/gles2_cmd_utils.h"
-#include "ui/gl/gl_bindings.h"
-#include "ui/gl/gl_context.h"
-#include "ui/gl/gl_implementation.h"
-#include "ui/gl/gl_version_info.h"
-#include "ui/gl/gl_%s_api_implementation.h"
 
-using gpu::gles2::GLES2Util;
+%s
 
 namespace gfx {
-""" % set_name.lower())
+""" % includes_string)
 
   file.write('\n')
   file.write('static bool g_debugBindingsInitialized;\n')
@@ -1945,12 +1958,13 @@
       # http://crbug.com/325668
       if cond != '' and not last_version:
         if not first_version:
-          file.write('  if (!fn.%sFn && (%s))\n  ' % (known_as, cond))
+          file.write('  if (!fn.%sFn && (%s)) {\n  ' % (known_as, cond))
         else:
-          file.write('  if (%s)\n  ' % cond)
+          file.write('  if (%s) {\n  ' % cond)
       elif not first_version:
-        file.write('  if (!fn.%sFn)\n  ' % known_as)
+        file.write('  if (!fn.%sFn) {\n  ' % known_as)
       WriteFuncBinding(file, known_as, version['name'])
+      file.write('}\n')
       i += 1
       first_version = False
 
@@ -2002,10 +2016,10 @@
     log_argument_names = re.sub(
         r'CONSTCHAR_([a-zA-Z0-9_]+)', r'\1', log_argument_names)
     log_argument_names = re.sub(
-        r'GLenum_([a-zA-Z0-9_]+)', r'GLES2Util::GetStringEnum(\1)',
+        r'GLenum_([a-zA-Z0-9_]+)', r'GLEnums::GetStringEnum(\1)',
         log_argument_names)
     log_argument_names = re.sub(
-        r'GLboolean_([a-zA-Z0-9_]+)', r'GLES2Util::GetStringBool(\1)',
+        r'GLboolean_([a-zA-Z0-9_]+)', r'GLEnums::GetStringBool(\1)',
         log_argument_names)
     log_argument_names = log_argument_names.replace(',', ' << ", " <<')
     if argument_names == 'void' or argument_names == '':
@@ -2151,14 +2165,7 @@
 def GenerateMockBindingsHeader(file, functions):
   """Headers for functions that invoke MockGLInterface members"""
 
-  file.write(
-"""// Copyright (c) 2014 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.
-
-""")
+  file.write(LICENSE_AND_HEADER)
   uniquely_named_functions = GetUniquelyNamedFunctions(functions)
 
   for key in sorted(uniquely_named_functions.iterkeys()):
@@ -2171,12 +2178,8 @@
   """Generates functions that invoke MockGLInterface members and a
   GetGLProcAddress function that returns addresses to those functions."""
 
-  file.write(
-"""// Copyright (c) 2011 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.
+  file.write(LICENSE_AND_HEADER +
+"""
 
 #include <string.h>
 
@@ -2238,6 +2241,39 @@
   file.write('\n')
   file.write('}  // namespace gfx\n')
 
+def GenerateEnumUtils(out_file, input_filenames):
+  enum_re = re.compile(r'\#define\s+(GL_[a-zA-Z0-9_]+)\s+([0-9A-Fa-fx]+)')
+  dict = {}
+  for fname in input_filenames:
+    lines = open(fname).readlines()
+    for line in lines:
+      m = enum_re.match(line)
+      if m:
+        name = m.group(1)
+        value = m.group(2)
+        if len(value) <= 10:
+          if not value in dict:
+            dict[value] = name
+          # check our own _CHROMIUM macro conflicts with khronos GL headers.
+          elif dict[value] != name and (name.endswith('_CHROMIUM') or
+              dict[value].endswith('_CHROMIUM')):
+            raise RunTimeError("code collision: %s and %s have the same code %s"
+                               %  (dict[value], name, value))
+
+  out_file.write(LICENSE_AND_HEADER)
+  out_file.write("static const GLEnums::EnumToString "
+                 "enum_to_string_table[] = {\n")
+  for value in dict:
+    out_file.write('  { %s, "%s", },\n' % (value, dict[value]))
+  out_file.write("""};
+
+const GLEnums::EnumToString* const GLEnums::enum_to_string_table_ =
+  enum_to_string_table;
+const size_t GLEnums::enum_to_string_table_len_ =
+  sizeof(enum_to_string_table) / sizeof(enum_to_string_table[0]);
+
+""")
+
 
 def ParseExtensionFunctionsFromHeader(header_file):
   """Parse a C extension header file and return a map from extension names to
@@ -2358,12 +2394,10 @@
 
 
 def ResolveHeader(header, header_paths):
-  paths = header_paths.split(':')
-
-  for path in paths:
+  for path in header_paths:
     result = os.path.join(path, header)
     if not os.path.isabs(path):
-      result = os.path.relpath(os.path.join(os.getcwd(), result), os.getcwd())
+      result = os.path.abspath(os.path.join(SELF_LOCATION, result))
     if os.path.exists(result):
       # Always use forward slashes as path separators. Otherwise backslashes
       # may be incorrectly interpreted as escape characters.
@@ -2377,7 +2411,6 @@
 
   parser = optparse.OptionParser()
   parser.add_option('--inputs', action='store_true')
-  parser.add_option('--header-paths')
   parser.add_option('--verify-order', action='store_true')
 
   options, args = parser.parse_args(argv)
@@ -2385,13 +2418,19 @@
   if options.inputs:
     for [_, _, headers, _] in FUNCTION_SETS:
       for header in headers:
-        print ResolveHeader(header, options.header_paths)
+        print ResolveHeader(header, HEADER_PATHS)
     return 0
 
-  directory = '.'
+  directory = SELF_LOCATION
   if len(args) >= 1:
     directory = args[0]
 
+  def ClangFormat(filename):
+    formatter = "clang-format"
+    if platform.system() == "Windows":
+      formatter += ".bat"
+    call([formatter, "-i", "-style=chromium", filename])
+
   for [functions, set_name, extension_headers, extensions] in FUNCTION_SETS:
     # Function names can be specified in two ways (list of unique names or list
     # of versions with different binding conditions). Fill in the data to the
@@ -2417,7 +2456,7 @@
     if options.verify_order:
       continue
 
-    extension_headers = [ResolveHeader(h, options.header_paths)
+    extension_headers = [ResolveHeader(h, HEADER_PATHS)
                          for h in extension_headers]
     used_extensions = FillExtensionsFromHeaders(
         functions, extension_headers, extensions)
@@ -2426,33 +2465,48 @@
         os.path.join(directory, 'gl_bindings_autogen_%s.h' % set_name), 'wb')
     GenerateHeader(header_file, functions, set_name, used_extensions)
     header_file.close()
+    ClangFormat(header_file.name)
 
     header_file = open(
         os.path.join(directory, 'gl_bindings_api_autogen_%s.h' % set_name),
         'wb')
     GenerateAPIHeader(header_file, functions, set_name)
     header_file.close()
+    ClangFormat(header_file.name)
 
     source_file = open(
         os.path.join(directory, 'gl_bindings_autogen_%s.cc' % set_name), 'wb')
     GenerateSource(source_file, functions, set_name, used_extensions)
     source_file.close()
+    ClangFormat(source_file.name)
 
   if not options.verify_order:
     header_file = open(
         os.path.join(directory, 'gl_mock_autogen_gl.h'), 'wb')
     GenerateMockHeader(header_file, GL_FUNCTIONS, 'gl')
     header_file.close()
+    ClangFormat(header_file.name)
 
     header_file = open(os.path.join(directory, 'gl_bindings_autogen_mock.h'),
                        'wb')
     GenerateMockBindingsHeader(header_file, GL_FUNCTIONS)
     header_file.close()
+    ClangFormat(header_file.name)
 
     source_file = open(os.path.join(directory, 'gl_bindings_autogen_mock.cc'),
                        'wb')
     GenerateMockBindingsSource(source_file, GL_FUNCTIONS)
     source_file.close()
+    ClangFormat(source_file.name)
+
+    enum_header_filenames = [ResolveHeader(h, HEADER_PATHS)
+                             for h in GLES2_HEADERS_WITH_ENUMS]
+    header_file = open(os.path.join(directory,
+                                    'gl_enums_implementation_autogen.h'),
+                       'wb')
+    GenerateEnumUtils(header_file, enum_header_filenames)
+    header_file.close()
+    ClangFormat(header_file.name)
   return 0
 
 
diff --git a/ui/gl/gl.gyp b/ui/gl/gl.gyp
index f11f40c..93c4d2b 100644
--- a/ui/gl/gl.gyp
+++ b/ui/gl/gl.gyp
@@ -21,22 +21,13 @@
         '<(DEPTH)/ui/gfx/gfx.gyp:gfx',
         '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',
       ],
-      'variables': {
-        'gl_binding_output_dir': '<(SHARED_INTERMEDIATE_DIR)/ui/gl',
-      },
       'defines': [
         'GL_IMPLEMENTATION',
       ],
       'include_dirs': [
         '<(DEPTH)/third_party/swiftshader/include',
         '<(DEPTH)/third_party/khronos',
-        '<(gl_binding_output_dir)',
       ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(gl_binding_output_dir)',
-        ],
-      },
       'export_dependent_settings': [
         '<(DEPTH)/third_party/mesa/mesa.gyp:mesa_headers',
       ],
@@ -50,12 +41,17 @@
         'android/surface_texture_listener.cc',
         'android/surface_texture_listener.h',
         'gl_bindings.h',
+        'gl_bindings_autogen_gl.cc',
+        'gl_bindings_autogen_gl.h',
+        'gl_bindings_autogen_osmesa.cc',
+        'gl_bindings_autogen_osmesa.h',
         'gl_bindings_skia_in_process.cc',
         'gl_bindings_skia_in_process.h',
         'gl_context.cc',
         'gl_context.h',
         'gl_context_android.cc',
         'gl_context_mac.mm',
+        'gl_context_ozone.cc',
         'gl_context_osmesa.cc',
         'gl_context_osmesa.h',
         'gl_context_stub.cc',
@@ -64,6 +60,9 @@
         'gl_context_stub_with_extensions.h',
         'gl_context_win.cc',
         'gl_context_x11.cc',
+        'gl_enums.cc',
+        'gl_enums.h',
+        'gl_enums_implementation_autogen.h',
         'gl_export.h',
         'gl_fence.cc',
         'gl_fence.h',
@@ -85,6 +84,7 @@
         'gl_implementation.cc',
         'gl_implementation.h',
         'gl_implementation_android.cc',
+        'gl_implementation_ozone.cc',
         'gl_implementation_mac.cc',
         'gl_implementation_win.cc',
         'gl_implementation_x11.cc',
@@ -104,6 +104,7 @@
         'gl_surface_x11.cc',
         'gl_surface_osmesa.cc',
         'gl_surface_osmesa.h',
+        'gl_surface_ozone.cc',
         'gl_switches.cc',
         'gl_switches.h',
         'gl_version_info.cc',
@@ -117,61 +118,14 @@
         'scoped_make_current.h',
         'sync_control_vsync_provider.cc',
         'sync_control_vsync_provider.h',
-        '<(gl_binding_output_dir)/gl_bindings_autogen_gl.cc',
-        '<(gl_binding_output_dir)/gl_bindings_autogen_gl.h',
-        '<(gl_binding_output_dir)/gl_bindings_autogen_osmesa.cc',
-        '<(gl_binding_output_dir)/gl_bindings_autogen_osmesa.h',
-      ],
-      # hard_dependency is necessary for this target because it has actions
-      # that generate header files included by dependent targets. The header
-      # files must be generated before the dependents are compiled. The usual
-      # semantics are to allow the two targets to build concurrently.
-      'hard_dependency': 1,
-      'actions': [
-        {
-          'action_name': 'generate_gl_bindings',
-          'variables': {
-            'generator_path': 'generate_bindings.py',
-            # Prefer khronos EGL/GLES headers by listing that path first.
-            'header_paths': '../../third_party/khronos:../../third_party/mesa/src/include:.:../../gpu',
-          },
-          'inputs': [
-            '<(generator_path)',
-            '<!@(python <(generator_path) --header-paths=<(header_paths) --inputs)',
-          ],
-          'outputs': [
-            '<(gl_binding_output_dir)/gl_bindings_autogen_egl.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_egl.h',
-            '<(gl_binding_output_dir)/gl_bindings_api_autogen_egl.h',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_gl.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_gl.h',
-            '<(gl_binding_output_dir)/gl_bindings_api_autogen_gl.h',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_glx.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_glx.h',
-            '<(gl_binding_output_dir)/gl_bindings_api_autogen_glx.h',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_mock.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_mock.h',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_osmesa.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_osmesa.h',
-            '<(gl_binding_output_dir)/gl_bindings_api_autogen_osmesa.h',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_wgl.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_wgl.h',
-            '<(gl_binding_output_dir)/gl_bindings_api_autogen_wgl.h',
-            '<(gl_binding_output_dir)/gl_mock_autogen_gl.h',
-          ],
-          'action': [
-            'python',
-            '<(generator_path)',
-            '--header-paths=<(header_paths)',
-            '<(gl_binding_output_dir)',
-          ],
-        },
       ],
       'conditions': [
         ['OS in ("win", "android", "linux")', {
           'sources': [
             'egl_util.cc',
             'egl_util.h',
+            'gl_bindings_autogen_egl.cc',
+            'gl_bindings_autogen_egl.h',
             'gl_context_egl.cc',
             'gl_context_egl.h',
             'gl_fence_egl.cc',
@@ -182,8 +136,6 @@
             'gl_surface_egl.h',
             'gl_egl_api_implementation.cc',
             'gl_egl_api_implementation.h',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_egl.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_egl.h',
           ],
           'include_dirs': [
             '<(DEPTH)/third_party/khronos',
@@ -203,6 +155,8 @@
         }],
         ['use_x11 == 1', {
           'sources': [
+            'gl_bindings_autogen_glx.cc',
+            'gl_bindings_autogen_glx.h',
             'gl_context_glx.cc',
             'gl_context_glx.h',
             'gl_glx_api_implementation.cc',
@@ -213,8 +167,6 @@
             'gl_surface_glx.h',
             'gl_egl_api_implementation.cc',
             'gl_egl_api_implementation.h',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_glx.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_glx.h',
           ],
           'all_dependent_settings': {
             'defines': [
@@ -231,6 +183,8 @@
         }],
         ['OS=="win"', {
           'sources': [
+            'gl_bindings_autogen_wgl.cc',
+            'gl_bindings_autogen_wgl.h',
             'gl_context_wgl.cc',
             'gl_context_wgl.h',
             'gl_egl_api_implementation.cc',
@@ -239,8 +193,6 @@
             'gl_surface_wgl.h',
             'gl_wgl_api_implementation.cc',
             'gl_wgl_api_implementation.h',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_wgl.cc',
-            '<(gl_binding_output_dir)/gl_bindings_autogen_wgl.h',
           ],
           'msvs_settings': {
             'VCLinkerTool': {
@@ -300,6 +252,12 @@
         ['OS!="android"', {
           'sources/': [ ['exclude', '^android/'] ],
         }],
+        ['use_ozone==1', {
+          'dependencies': [
+            '../ozone/ozone.gyp:ozone',
+            '../ozone/ozone.gyp:ozone_base',
+          ],
+        }],
         ['OS=="android" and android_webview_build==0', {
           'dependencies': [
             '../android/ui_android.gyp:ui_java',
@@ -310,29 +268,20 @@
     {
       'target_name': 'gl_unittest_utils',
       'type': 'static_library',
-      'variables': {
-        'gl_binding_output_dir': '<(SHARED_INTERMEDIATE_DIR)/ui/gl',
-      },
       'dependencies': [
         '../../testing/gmock.gyp:gmock',
         '../../third_party/khronos/khronos.gyp:khronos_headers',
         'gl',
       ],
       'include_dirs': [
-        '<(gl_binding_output_dir)',
         '../..',
       ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(gl_binding_output_dir)',
-        ],
-      },
       'sources': [
+        'gl_bindings_autogen_mock.cc',
+        'gl_bindings_autogen_mock.h',
+        'gl_mock_autogen_gl.h',
         'gl_mock.h',
         'gl_mock.cc',
-        '<(gl_binding_output_dir)/gl_bindings_autogen_mock.cc',
-        '<(gl_binding_output_dir)/gl_bindings_autogen_mock.h',
-        '<(gl_binding_output_dir)/gl_mock_autogen_gl.h',
       ],
     },
   ],
diff --git a/ui/gl/gl_bindings_api_autogen_egl.h b/ui/gl/gl_bindings_api_autogen_egl.h
new file mode 100644
index 0000000..43337be
--- /dev/null
+++ b/ui/gl/gl_bindings_api_autogen_egl.h
@@ -0,0 +1,128 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+EGLBoolean eglBindAPIFn(EGLenum api) override;
+EGLBoolean eglBindTexImageFn(EGLDisplay dpy,
+                             EGLSurface surface,
+                             EGLint buffer) override;
+EGLBoolean eglChooseConfigFn(EGLDisplay dpy,
+                             const EGLint* attrib_list,
+                             EGLConfig* configs,
+                             EGLint config_size,
+                             EGLint* num_config) override;
+EGLint eglClientWaitSyncKHRFn(EGLDisplay dpy,
+                              EGLSyncKHR sync,
+                              EGLint flags,
+                              EGLTimeKHR timeout) override;
+EGLBoolean eglCopyBuffersFn(EGLDisplay dpy,
+                            EGLSurface surface,
+                            EGLNativePixmapType target) override;
+EGLContext eglCreateContextFn(EGLDisplay dpy,
+                              EGLConfig config,
+                              EGLContext share_context,
+                              const EGLint* attrib_list) override;
+EGLImageKHR eglCreateImageKHRFn(EGLDisplay dpy,
+                                EGLContext ctx,
+                                EGLenum target,
+                                EGLClientBuffer buffer,
+                                const EGLint* attrib_list) override;
+EGLSurface eglCreatePbufferFromClientBufferFn(
+    EGLDisplay dpy,
+    EGLenum buftype,
+    void* buffer,
+    EGLConfig config,
+    const EGLint* attrib_list) override;
+EGLSurface eglCreatePbufferSurfaceFn(EGLDisplay dpy,
+                                     EGLConfig config,
+                                     const EGLint* attrib_list) override;
+EGLSurface eglCreatePixmapSurfaceFn(EGLDisplay dpy,
+                                    EGLConfig config,
+                                    EGLNativePixmapType pixmap,
+                                    const EGLint* attrib_list) override;
+EGLSyncKHR eglCreateSyncKHRFn(EGLDisplay dpy,
+                              EGLenum type,
+                              const EGLint* attrib_list) override;
+EGLSurface eglCreateWindowSurfaceFn(EGLDisplay dpy,
+                                    EGLConfig config,
+                                    EGLNativeWindowType win,
+                                    const EGLint* attrib_list) override;
+EGLBoolean eglDestroyContextFn(EGLDisplay dpy, EGLContext ctx) override;
+EGLBoolean eglDestroyImageKHRFn(EGLDisplay dpy, EGLImageKHR image) override;
+EGLBoolean eglDestroySurfaceFn(EGLDisplay dpy, EGLSurface surface) override;
+EGLBoolean eglDestroySyncKHRFn(EGLDisplay dpy, EGLSyncKHR sync) override;
+EGLBoolean eglGetConfigAttribFn(EGLDisplay dpy,
+                                EGLConfig config,
+                                EGLint attribute,
+                                EGLint* value) override;
+EGLBoolean eglGetConfigsFn(EGLDisplay dpy,
+                           EGLConfig* configs,
+                           EGLint config_size,
+                           EGLint* num_config) override;
+EGLContext eglGetCurrentContextFn(void) override;
+EGLDisplay eglGetCurrentDisplayFn(void) override;
+EGLSurface eglGetCurrentSurfaceFn(EGLint readdraw) override;
+EGLDisplay eglGetDisplayFn(EGLNativeDisplayType display_id) override;
+EGLint eglGetErrorFn(void) override;
+EGLDisplay eglGetPlatformDisplayEXTFn(EGLenum platform,
+                                      void* native_display,
+                                      const EGLint* attrib_list) override;
+__eglMustCastToProperFunctionPointerType eglGetProcAddressFn(
+    const char* procname) override;
+EGLBoolean eglGetSyncAttribKHRFn(EGLDisplay dpy,
+                                 EGLSyncKHR sync,
+                                 EGLint attribute,
+                                 EGLint* value) override;
+EGLBoolean eglGetSyncValuesCHROMIUMFn(EGLDisplay dpy,
+                                      EGLSurface surface,
+                                      EGLuint64CHROMIUM* ust,
+                                      EGLuint64CHROMIUM* msc,
+                                      EGLuint64CHROMIUM* sbc) override;
+EGLBoolean eglInitializeFn(EGLDisplay dpy,
+                           EGLint* major,
+                           EGLint* minor) override;
+EGLBoolean eglMakeCurrentFn(EGLDisplay dpy,
+                            EGLSurface draw,
+                            EGLSurface read,
+                            EGLContext ctx) override;
+EGLBoolean eglPostSubBufferNVFn(EGLDisplay dpy,
+                                EGLSurface surface,
+                                EGLint x,
+                                EGLint y,
+                                EGLint width,
+                                EGLint height) override;
+EGLenum eglQueryAPIFn(void) override;
+EGLBoolean eglQueryContextFn(EGLDisplay dpy,
+                             EGLContext ctx,
+                             EGLint attribute,
+                             EGLint* value) override;
+const char* eglQueryStringFn(EGLDisplay dpy, EGLint name) override;
+EGLBoolean eglQuerySurfaceFn(EGLDisplay dpy,
+                             EGLSurface surface,
+                             EGLint attribute,
+                             EGLint* value) override;
+EGLBoolean eglQuerySurfacePointerANGLEFn(EGLDisplay dpy,
+                                         EGLSurface surface,
+                                         EGLint attribute,
+                                         void** value) override;
+EGLBoolean eglReleaseTexImageFn(EGLDisplay dpy,
+                                EGLSurface surface,
+                                EGLint buffer) override;
+EGLBoolean eglReleaseThreadFn(void) override;
+EGLBoolean eglSurfaceAttribFn(EGLDisplay dpy,
+                              EGLSurface surface,
+                              EGLint attribute,
+                              EGLint value) override;
+EGLBoolean eglSwapBuffersFn(EGLDisplay dpy, EGLSurface surface) override;
+EGLBoolean eglSwapIntervalFn(EGLDisplay dpy, EGLint interval) override;
+EGLBoolean eglTerminateFn(EGLDisplay dpy) override;
+EGLBoolean eglWaitClientFn(void) override;
+EGLBoolean eglWaitGLFn(void) override;
+EGLBoolean eglWaitNativeFn(EGLint engine) override;
+EGLint eglWaitSyncKHRFn(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags) override;
diff --git a/ui/gl/gl_bindings_api_autogen_gl.h b/ui/gl/gl_bindings_api_autogen_gl.h
new file mode 100644
index 0000000..5aac77c
--- /dev/null
+++ b/ui/gl/gl_bindings_api_autogen_gl.h
@@ -0,0 +1,703 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+void glActiveTextureFn(GLenum texture) override;
+void glAttachShaderFn(GLuint program, GLuint shader) override;
+void glBeginQueryFn(GLenum target, GLuint id) override;
+void glBeginQueryARBFn(GLenum target, GLuint id) override;
+void glBeginTransformFeedbackFn(GLenum primitiveMode) override;
+void glBindAttribLocationFn(GLuint program,
+                            GLuint index,
+                            const char* name) override;
+void glBindBufferFn(GLenum target, GLuint buffer) override;
+void glBindBufferBaseFn(GLenum target, GLuint index, GLuint buffer) override;
+void glBindBufferRangeFn(GLenum target,
+                         GLuint index,
+                         GLuint buffer,
+                         GLintptr offset,
+                         GLsizeiptr size) override;
+void glBindFragDataLocationFn(GLuint program,
+                              GLuint colorNumber,
+                              const char* name) override;
+void glBindFragDataLocationIndexedFn(GLuint program,
+                                     GLuint colorNumber,
+                                     GLuint index,
+                                     const char* name) override;
+void glBindFramebufferEXTFn(GLenum target, GLuint framebuffer) override;
+void glBindRenderbufferEXTFn(GLenum target, GLuint renderbuffer) override;
+void glBindSamplerFn(GLuint unit, GLuint sampler) override;
+void glBindTextureFn(GLenum target, GLuint texture) override;
+void glBindTransformFeedbackFn(GLenum target, GLuint id) override;
+void glBindVertexArrayOESFn(GLuint array) override;
+void glBlendBarrierKHRFn(void) override;
+void glBlendColorFn(GLclampf red,
+                    GLclampf green,
+                    GLclampf blue,
+                    GLclampf alpha) override;
+void glBlendEquationFn(GLenum mode) override;
+void glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) override;
+void glBlendFuncFn(GLenum sfactor, GLenum dfactor) override;
+void glBlendFuncSeparateFn(GLenum srcRGB,
+                           GLenum dstRGB,
+                           GLenum srcAlpha,
+                           GLenum dstAlpha) override;
+void glBlitFramebufferFn(GLint srcX0,
+                         GLint srcY0,
+                         GLint srcX1,
+                         GLint srcY1,
+                         GLint dstX0,
+                         GLint dstY0,
+                         GLint dstX1,
+                         GLint dstY1,
+                         GLbitfield mask,
+                         GLenum filter) override;
+void glBlitFramebufferANGLEFn(GLint srcX0,
+                              GLint srcY0,
+                              GLint srcX1,
+                              GLint srcY1,
+                              GLint dstX0,
+                              GLint dstY0,
+                              GLint dstX1,
+                              GLint dstY1,
+                              GLbitfield mask,
+                              GLenum filter) override;
+void glBlitFramebufferEXTFn(GLint srcX0,
+                            GLint srcY0,
+                            GLint srcX1,
+                            GLint srcY1,
+                            GLint dstX0,
+                            GLint dstY0,
+                            GLint dstX1,
+                            GLint dstY1,
+                            GLbitfield mask,
+                            GLenum filter) override;
+void glBufferDataFn(GLenum target,
+                    GLsizeiptr size,
+                    const void* data,
+                    GLenum usage) override;
+void glBufferSubDataFn(GLenum target,
+                       GLintptr offset,
+                       GLsizeiptr size,
+                       const void* data) override;
+GLenum glCheckFramebufferStatusEXTFn(GLenum target) override;
+void glClearFn(GLbitfield mask) override;
+void glClearBufferfiFn(GLenum buffer,
+                       GLint drawbuffer,
+                       const GLfloat depth,
+                       GLint stencil) override;
+void glClearBufferfvFn(GLenum buffer,
+                       GLint drawbuffer,
+                       const GLfloat* value) override;
+void glClearBufferivFn(GLenum buffer,
+                       GLint drawbuffer,
+                       const GLint* value) override;
+void glClearBufferuivFn(GLenum buffer,
+                        GLint drawbuffer,
+                        const GLuint* value) override;
+void glClearColorFn(GLclampf red,
+                    GLclampf green,
+                    GLclampf blue,
+                    GLclampf alpha) override;
+void glClearDepthFn(GLclampd depth) override;
+void glClearDepthfFn(GLclampf depth) override;
+void glClearStencilFn(GLint s) override;
+GLenum glClientWaitSyncFn(GLsync sync,
+                          GLbitfield flags,
+                          GLuint64 timeout) override;
+void glColorMaskFn(GLboolean red,
+                   GLboolean green,
+                   GLboolean blue,
+                   GLboolean alpha) override;
+void glCompileShaderFn(GLuint shader) override;
+void glCompressedTexImage2DFn(GLenum target,
+                              GLint level,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLint border,
+                              GLsizei imageSize,
+                              const void* data) override;
+void glCompressedTexImage3DFn(GLenum target,
+                              GLint level,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth,
+                              GLint border,
+                              GLsizei imageSize,
+                              const void* data) override;
+void glCompressedTexSubImage2DFn(GLenum target,
+                                 GLint level,
+                                 GLint xoffset,
+                                 GLint yoffset,
+                                 GLsizei width,
+                                 GLsizei height,
+                                 GLenum format,
+                                 GLsizei imageSize,
+                                 const void* data) override;
+void glCopyBufferSubDataFn(GLenum readTarget,
+                           GLenum writeTarget,
+                           GLintptr readOffset,
+                           GLintptr writeOffset,
+                           GLsizeiptr size) override;
+void glCopyTexImage2DFn(GLenum target,
+                        GLint level,
+                        GLenum internalformat,
+                        GLint x,
+                        GLint y,
+                        GLsizei width,
+                        GLsizei height,
+                        GLint border) override;
+void glCopyTexSubImage2DFn(GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLint yoffset,
+                           GLint x,
+                           GLint y,
+                           GLsizei width,
+                           GLsizei height) override;
+void glCopyTexSubImage3DFn(GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLint yoffset,
+                           GLint zoffset,
+                           GLint x,
+                           GLint y,
+                           GLsizei width,
+                           GLsizei height) override;
+GLuint glCreateProgramFn(void) override;
+GLuint glCreateShaderFn(GLenum type) override;
+void glCullFaceFn(GLenum mode) override;
+void glDeleteBuffersARBFn(GLsizei n, const GLuint* buffers) override;
+void glDeleteFencesAPPLEFn(GLsizei n, const GLuint* fences) override;
+void glDeleteFencesNVFn(GLsizei n, const GLuint* fences) override;
+void glDeleteFramebuffersEXTFn(GLsizei n, const GLuint* framebuffers) override;
+void glDeleteProgramFn(GLuint program) override;
+void glDeleteQueriesFn(GLsizei n, const GLuint* ids) override;
+void glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) override;
+void glDeleteRenderbuffersEXTFn(GLsizei n,
+                                const GLuint* renderbuffers) override;
+void glDeleteSamplersFn(GLsizei n, const GLuint* samplers) override;
+void glDeleteShaderFn(GLuint shader) override;
+void glDeleteSyncFn(GLsync sync) override;
+void glDeleteTexturesFn(GLsizei n, const GLuint* textures) override;
+void glDeleteTransformFeedbacksFn(GLsizei n, const GLuint* ids) override;
+void glDeleteVertexArraysOESFn(GLsizei n, const GLuint* arrays) override;
+void glDepthFuncFn(GLenum func) override;
+void glDepthMaskFn(GLboolean flag) override;
+void glDepthRangeFn(GLclampd zNear, GLclampd zFar) override;
+void glDepthRangefFn(GLclampf zNear, GLclampf zFar) override;
+void glDetachShaderFn(GLuint program, GLuint shader) override;
+void glDisableFn(GLenum cap) override;
+void glDisableVertexAttribArrayFn(GLuint index) override;
+void glDiscardFramebufferEXTFn(GLenum target,
+                               GLsizei numAttachments,
+                               const GLenum* attachments) override;
+void glDrawArraysFn(GLenum mode, GLint first, GLsizei count) override;
+void glDrawArraysInstancedANGLEFn(GLenum mode,
+                                  GLint first,
+                                  GLsizei count,
+                                  GLsizei primcount) override;
+void glDrawBufferFn(GLenum mode) override;
+void glDrawBuffersARBFn(GLsizei n, const GLenum* bufs) override;
+void glDrawElementsFn(GLenum mode,
+                      GLsizei count,
+                      GLenum type,
+                      const void* indices) override;
+void glDrawElementsInstancedANGLEFn(GLenum mode,
+                                    GLsizei count,
+                                    GLenum type,
+                                    const void* indices,
+                                    GLsizei primcount) override;
+void glDrawRangeElementsFn(GLenum mode,
+                           GLuint start,
+                           GLuint end,
+                           GLsizei count,
+                           GLenum type,
+                           const void* indices) override;
+void glEGLImageTargetRenderbufferStorageOESFn(GLenum target,
+                                              GLeglImageOES image) override;
+void glEGLImageTargetTexture2DOESFn(GLenum target,
+                                    GLeglImageOES image) override;
+void glEnableFn(GLenum cap) override;
+void glEnableVertexAttribArrayFn(GLuint index) override;
+void glEndQueryFn(GLenum target) override;
+void glEndQueryARBFn(GLenum target) override;
+void glEndTransformFeedbackFn(void) override;
+GLsync glFenceSyncFn(GLenum condition, GLbitfield flags) override;
+void glFinishFn(void) override;
+void glFinishFenceAPPLEFn(GLuint fence) override;
+void glFinishFenceNVFn(GLuint fence) override;
+void glFlushFn(void) override;
+void glFlushMappedBufferRangeFn(GLenum target,
+                                GLintptr offset,
+                                GLsizeiptr length) override;
+void glFramebufferRenderbufferEXTFn(GLenum target,
+                                    GLenum attachment,
+                                    GLenum renderbuffertarget,
+                                    GLuint renderbuffer) override;
+void glFramebufferTexture2DEXTFn(GLenum target,
+                                 GLenum attachment,
+                                 GLenum textarget,
+                                 GLuint texture,
+                                 GLint level) override;
+void glFramebufferTexture2DMultisampleEXTFn(GLenum target,
+                                            GLenum attachment,
+                                            GLenum textarget,
+                                            GLuint texture,
+                                            GLint level,
+                                            GLsizei samples) override;
+void glFramebufferTexture2DMultisampleIMGFn(GLenum target,
+                                            GLenum attachment,
+                                            GLenum textarget,
+                                            GLuint texture,
+                                            GLint level,
+                                            GLsizei samples) override;
+void glFramebufferTextureLayerFn(GLenum target,
+                                 GLenum attachment,
+                                 GLuint texture,
+                                 GLint level,
+                                 GLint layer) override;
+void glFrontFaceFn(GLenum mode) override;
+void glGenBuffersARBFn(GLsizei n, GLuint* buffers) override;
+void glGenerateMipmapEXTFn(GLenum target) override;
+void glGenFencesAPPLEFn(GLsizei n, GLuint* fences) override;
+void glGenFencesNVFn(GLsizei n, GLuint* fences) override;
+void glGenFramebuffersEXTFn(GLsizei n, GLuint* framebuffers) override;
+void glGenQueriesFn(GLsizei n, GLuint* ids) override;
+void glGenQueriesARBFn(GLsizei n, GLuint* ids) override;
+void glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) override;
+void glGenSamplersFn(GLsizei n, GLuint* samplers) override;
+void glGenTexturesFn(GLsizei n, GLuint* textures) override;
+void glGenTransformFeedbacksFn(GLsizei n, GLuint* ids) override;
+void glGenVertexArraysOESFn(GLsizei n, GLuint* arrays) override;
+void glGetActiveAttribFn(GLuint program,
+                         GLuint index,
+                         GLsizei bufsize,
+                         GLsizei* length,
+                         GLint* size,
+                         GLenum* type,
+                         char* name) override;
+void glGetActiveUniformFn(GLuint program,
+                          GLuint index,
+                          GLsizei bufsize,
+                          GLsizei* length,
+                          GLint* size,
+                          GLenum* type,
+                          char* name) override;
+void glGetActiveUniformBlockivFn(GLuint program,
+                                 GLuint uniformBlockIndex,
+                                 GLenum pname,
+                                 GLint* params) override;
+void glGetActiveUniformBlockNameFn(GLuint program,
+                                   GLuint uniformBlockIndex,
+                                   GLsizei bufSize,
+                                   GLsizei* length,
+                                   char* uniformBlockName) override;
+void glGetActiveUniformsivFn(GLuint program,
+                             GLsizei uniformCount,
+                             const GLuint* uniformIndices,
+                             GLenum pname,
+                             GLint* params) override;
+void glGetAttachedShadersFn(GLuint program,
+                            GLsizei maxcount,
+                            GLsizei* count,
+                            GLuint* shaders) override;
+GLint glGetAttribLocationFn(GLuint program, const char* name) override;
+void glGetBooleanvFn(GLenum pname, GLboolean* params) override;
+void glGetBufferParameterivFn(GLenum target,
+                              GLenum pname,
+                              GLint* params) override;
+GLenum glGetErrorFn(void) override;
+void glGetFenceivNVFn(GLuint fence, GLenum pname, GLint* params) override;
+void glGetFloatvFn(GLenum pname, GLfloat* params) override;
+GLint glGetFragDataLocationFn(GLuint program, const char* name) override;
+void glGetFramebufferAttachmentParameterivEXTFn(GLenum target,
+                                                GLenum attachment,
+                                                GLenum pname,
+                                                GLint* params) override;
+GLenum glGetGraphicsResetStatusARBFn(void) override;
+void glGetInteger64i_vFn(GLenum target, GLuint index, GLint64* data) override;
+void glGetInteger64vFn(GLenum pname, GLint64* params) override;
+void glGetIntegeri_vFn(GLenum target, GLuint index, GLint* data) override;
+void glGetIntegervFn(GLenum pname, GLint* params) override;
+void glGetInternalformativFn(GLenum target,
+                             GLenum internalformat,
+                             GLenum pname,
+                             GLsizei bufSize,
+                             GLint* params) override;
+void glGetProgramBinaryFn(GLuint program,
+                          GLsizei bufSize,
+                          GLsizei* length,
+                          GLenum* binaryFormat,
+                          GLvoid* binary) override;
+void glGetProgramInfoLogFn(GLuint program,
+                           GLsizei bufsize,
+                           GLsizei* length,
+                           char* infolog) override;
+void glGetProgramivFn(GLuint program, GLenum pname, GLint* params) override;
+void glGetQueryivFn(GLenum target, GLenum pname, GLint* params) override;
+void glGetQueryivARBFn(GLenum target, GLenum pname, GLint* params) override;
+void glGetQueryObjecti64vFn(GLuint id, GLenum pname, GLint64* params) override;
+void glGetQueryObjectivFn(GLuint id, GLenum pname, GLint* params) override;
+void glGetQueryObjectivARBFn(GLuint id, GLenum pname, GLint* params) override;
+void glGetQueryObjectui64vFn(GLuint id,
+                             GLenum pname,
+                             GLuint64* params) override;
+void glGetQueryObjectuivFn(GLuint id, GLenum pname, GLuint* params) override;
+void glGetQueryObjectuivARBFn(GLuint id, GLenum pname, GLuint* params) override;
+void glGetRenderbufferParameterivEXTFn(GLenum target,
+                                       GLenum pname,
+                                       GLint* params) override;
+void glGetSamplerParameterfvFn(GLuint sampler,
+                               GLenum pname,
+                               GLfloat* params) override;
+void glGetSamplerParameterivFn(GLuint sampler,
+                               GLenum pname,
+                               GLint* params) override;
+void glGetShaderInfoLogFn(GLuint shader,
+                          GLsizei bufsize,
+                          GLsizei* length,
+                          char* infolog) override;
+void glGetShaderivFn(GLuint shader, GLenum pname, GLint* params) override;
+void glGetShaderPrecisionFormatFn(GLenum shadertype,
+                                  GLenum precisiontype,
+                                  GLint* range,
+                                  GLint* precision) override;
+void glGetShaderSourceFn(GLuint shader,
+                         GLsizei bufsize,
+                         GLsizei* length,
+                         char* source) override;
+const GLubyte* glGetStringFn(GLenum name) override;
+void glGetSyncivFn(GLsync sync,
+                   GLenum pname,
+                   GLsizei bufSize,
+                   GLsizei* length,
+                   GLint* values) override;
+void glGetTexLevelParameterfvFn(GLenum target,
+                                GLint level,
+                                GLenum pname,
+                                GLfloat* params) override;
+void glGetTexLevelParameterivFn(GLenum target,
+                                GLint level,
+                                GLenum pname,
+                                GLint* params) override;
+void glGetTexParameterfvFn(GLenum target,
+                           GLenum pname,
+                           GLfloat* params) override;
+void glGetTexParameterivFn(GLenum target, GLenum pname, GLint* params) override;
+void glGetTransformFeedbackVaryingFn(GLuint program,
+                                     GLuint index,
+                                     GLsizei bufSize,
+                                     GLsizei* length,
+                                     GLenum* type,
+                                     char* name) override;
+void glGetTranslatedShaderSourceANGLEFn(GLuint shader,
+                                        GLsizei bufsize,
+                                        GLsizei* length,
+                                        char* source) override;
+GLuint glGetUniformBlockIndexFn(GLuint program,
+                                const char* uniformBlockName) override;
+void glGetUniformfvFn(GLuint program, GLint location, GLfloat* params) override;
+void glGetUniformIndicesFn(GLuint program,
+                           GLsizei uniformCount,
+                           const char* const* uniformNames,
+                           GLuint* uniformIndices) override;
+void glGetUniformivFn(GLuint program, GLint location, GLint* params) override;
+GLint glGetUniformLocationFn(GLuint program, const char* name) override;
+void glGetVertexAttribfvFn(GLuint index,
+                           GLenum pname,
+                           GLfloat* params) override;
+void glGetVertexAttribivFn(GLuint index, GLenum pname, GLint* params) override;
+void glGetVertexAttribPointervFn(GLuint index,
+                                 GLenum pname,
+                                 void** pointer) override;
+void glHintFn(GLenum target, GLenum mode) override;
+void glInsertEventMarkerEXTFn(GLsizei length, const char* marker) override;
+void glInvalidateFramebufferFn(GLenum target,
+                               GLsizei numAttachments,
+                               const GLenum* attachments) override;
+void glInvalidateSubFramebufferFn(GLenum target,
+                                  GLsizei numAttachments,
+                                  const GLenum* attachments,
+                                  GLint x,
+                                  GLint y,
+                                  GLint width,
+                                  GLint height) override;
+GLboolean glIsBufferFn(GLuint buffer) override;
+GLboolean glIsEnabledFn(GLenum cap) override;
+GLboolean glIsFenceAPPLEFn(GLuint fence) override;
+GLboolean glIsFenceNVFn(GLuint fence) override;
+GLboolean glIsFramebufferEXTFn(GLuint framebuffer) override;
+GLboolean glIsProgramFn(GLuint program) override;
+GLboolean glIsQueryFn(GLuint query) override;
+GLboolean glIsQueryARBFn(GLuint query) override;
+GLboolean glIsRenderbufferEXTFn(GLuint renderbuffer) override;
+GLboolean glIsSamplerFn(GLuint sampler) override;
+GLboolean glIsShaderFn(GLuint shader) override;
+GLboolean glIsSyncFn(GLsync sync) override;
+GLboolean glIsTextureFn(GLuint texture) override;
+GLboolean glIsTransformFeedbackFn(GLuint id) override;
+GLboolean glIsVertexArrayOESFn(GLuint array) override;
+void glLineWidthFn(GLfloat width) override;
+void glLinkProgramFn(GLuint program) override;
+void* glMapBufferFn(GLenum target, GLenum access) override;
+void* glMapBufferRangeFn(GLenum target,
+                         GLintptr offset,
+                         GLsizeiptr length,
+                         GLbitfield access) override;
+void glMatrixLoadfEXTFn(GLenum matrixMode, const GLfloat* m) override;
+void glMatrixLoadIdentityEXTFn(GLenum matrixMode) override;
+void glPauseTransformFeedbackFn(void) override;
+void glPixelStoreiFn(GLenum pname, GLint param) override;
+void glPointParameteriFn(GLenum pname, GLint param) override;
+void glPolygonOffsetFn(GLfloat factor, GLfloat units) override;
+void glPopGroupMarkerEXTFn(void) override;
+void glProgramBinaryFn(GLuint program,
+                       GLenum binaryFormat,
+                       const GLvoid* binary,
+                       GLsizei length) override;
+void glProgramParameteriFn(GLuint program, GLenum pname, GLint value) override;
+void glPushGroupMarkerEXTFn(GLsizei length, const char* marker) override;
+void glQueryCounterFn(GLuint id, GLenum target) override;
+void glReadBufferFn(GLenum src) override;
+void glReadPixelsFn(GLint x,
+                    GLint y,
+                    GLsizei width,
+                    GLsizei height,
+                    GLenum format,
+                    GLenum type,
+                    void* pixels) override;
+void glReleaseShaderCompilerFn(void) override;
+void glRenderbufferStorageEXTFn(GLenum target,
+                                GLenum internalformat,
+                                GLsizei width,
+                                GLsizei height) override;
+void glRenderbufferStorageMultisampleFn(GLenum target,
+                                        GLsizei samples,
+                                        GLenum internalformat,
+                                        GLsizei width,
+                                        GLsizei height) override;
+void glRenderbufferStorageMultisampleANGLEFn(GLenum target,
+                                             GLsizei samples,
+                                             GLenum internalformat,
+                                             GLsizei width,
+                                             GLsizei height) override;
+void glRenderbufferStorageMultisampleEXTFn(GLenum target,
+                                           GLsizei samples,
+                                           GLenum internalformat,
+                                           GLsizei width,
+                                           GLsizei height) override;
+void glRenderbufferStorageMultisampleIMGFn(GLenum target,
+                                           GLsizei samples,
+                                           GLenum internalformat,
+                                           GLsizei width,
+                                           GLsizei height) override;
+void glResumeTransformFeedbackFn(void) override;
+void glSampleCoverageFn(GLclampf value, GLboolean invert) override;
+void glSamplerParameterfFn(GLuint sampler,
+                           GLenum pname,
+                           GLfloat param) override;
+void glSamplerParameterfvFn(GLuint sampler,
+                            GLenum pname,
+                            const GLfloat* params) override;
+void glSamplerParameteriFn(GLuint sampler, GLenum pname, GLint param) override;
+void glSamplerParameterivFn(GLuint sampler,
+                            GLenum pname,
+                            const GLint* params) override;
+void glScissorFn(GLint x, GLint y, GLsizei width, GLsizei height) override;
+void glSetFenceAPPLEFn(GLuint fence) override;
+void glSetFenceNVFn(GLuint fence, GLenum condition) override;
+void glShaderBinaryFn(GLsizei n,
+                      const GLuint* shaders,
+                      GLenum binaryformat,
+                      const void* binary,
+                      GLsizei length) override;
+void glShaderSourceFn(GLuint shader,
+                      GLsizei count,
+                      const char* const* str,
+                      const GLint* length) override;
+void glStencilFuncFn(GLenum func, GLint ref, GLuint mask) override;
+void glStencilFuncSeparateFn(GLenum face,
+                             GLenum func,
+                             GLint ref,
+                             GLuint mask) override;
+void glStencilMaskFn(GLuint mask) override;
+void glStencilMaskSeparateFn(GLenum face, GLuint mask) override;
+void glStencilOpFn(GLenum fail, GLenum zfail, GLenum zpass) override;
+void glStencilOpSeparateFn(GLenum face,
+                           GLenum fail,
+                           GLenum zfail,
+                           GLenum zpass) override;
+GLboolean glTestFenceAPPLEFn(GLuint fence) override;
+GLboolean glTestFenceNVFn(GLuint fence) override;
+void glTexImage2DFn(GLenum target,
+                    GLint level,
+                    GLint internalformat,
+                    GLsizei width,
+                    GLsizei height,
+                    GLint border,
+                    GLenum format,
+                    GLenum type,
+                    const void* pixels) override;
+void glTexImage3DFn(GLenum target,
+                    GLint level,
+                    GLint internalformat,
+                    GLsizei width,
+                    GLsizei height,
+                    GLsizei depth,
+                    GLint border,
+                    GLenum format,
+                    GLenum type,
+                    const void* pixels) override;
+void glTexParameterfFn(GLenum target, GLenum pname, GLfloat param) override;
+void glTexParameterfvFn(GLenum target,
+                        GLenum pname,
+                        const GLfloat* params) override;
+void glTexParameteriFn(GLenum target, GLenum pname, GLint param) override;
+void glTexParameterivFn(GLenum target,
+                        GLenum pname,
+                        const GLint* params) override;
+void glTexStorage2DEXTFn(GLenum target,
+                         GLsizei levels,
+                         GLenum internalformat,
+                         GLsizei width,
+                         GLsizei height) override;
+void glTexStorage3DFn(GLenum target,
+                      GLsizei levels,
+                      GLenum internalformat,
+                      GLsizei width,
+                      GLsizei height,
+                      GLsizei depth) override;
+void glTexSubImage2DFn(GLenum target,
+                       GLint level,
+                       GLint xoffset,
+                       GLint yoffset,
+                       GLsizei width,
+                       GLsizei height,
+                       GLenum format,
+                       GLenum type,
+                       const void* pixels) override;
+void glTransformFeedbackVaryingsFn(GLuint program,
+                                   GLsizei count,
+                                   const char* const* varyings,
+                                   GLenum bufferMode) override;
+void glUniform1fFn(GLint location, GLfloat x) override;
+void glUniform1fvFn(GLint location, GLsizei count, const GLfloat* v) override;
+void glUniform1iFn(GLint location, GLint x) override;
+void glUniform1ivFn(GLint location, GLsizei count, const GLint* v) override;
+void glUniform1uiFn(GLint location, GLuint v0) override;
+void glUniform1uivFn(GLint location, GLsizei count, const GLuint* v) override;
+void glUniform2fFn(GLint location, GLfloat x, GLfloat y) override;
+void glUniform2fvFn(GLint location, GLsizei count, const GLfloat* v) override;
+void glUniform2iFn(GLint location, GLint x, GLint y) override;
+void glUniform2ivFn(GLint location, GLsizei count, const GLint* v) override;
+void glUniform2uiFn(GLint location, GLuint v0, GLuint v1) override;
+void glUniform2uivFn(GLint location, GLsizei count, const GLuint* v) override;
+void glUniform3fFn(GLint location, GLfloat x, GLfloat y, GLfloat z) override;
+void glUniform3fvFn(GLint location, GLsizei count, const GLfloat* v) override;
+void glUniform3iFn(GLint location, GLint x, GLint y, GLint z) override;
+void glUniform3ivFn(GLint location, GLsizei count, const GLint* v) override;
+void glUniform3uiFn(GLint location, GLuint v0, GLuint v1, GLuint v2) override;
+void glUniform3uivFn(GLint location, GLsizei count, const GLuint* v) override;
+void glUniform4fFn(GLint location,
+                   GLfloat x,
+                   GLfloat y,
+                   GLfloat z,
+                   GLfloat w) override;
+void glUniform4fvFn(GLint location, GLsizei count, const GLfloat* v) override;
+void glUniform4iFn(GLint location, GLint x, GLint y, GLint z, GLint w) override;
+void glUniform4ivFn(GLint location, GLsizei count, const GLint* v) override;
+void glUniform4uiFn(GLint location,
+                    GLuint v0,
+                    GLuint v1,
+                    GLuint v2,
+                    GLuint v3) override;
+void glUniform4uivFn(GLint location, GLsizei count, const GLuint* v) override;
+void glUniformBlockBindingFn(GLuint program,
+                             GLuint uniformBlockIndex,
+                             GLuint uniformBlockBinding) override;
+void glUniformMatrix2fvFn(GLint location,
+                          GLsizei count,
+                          GLboolean transpose,
+                          const GLfloat* value) override;
+void glUniformMatrix2x3fvFn(GLint location,
+                            GLsizei count,
+                            GLboolean transpose,
+                            const GLfloat* value) override;
+void glUniformMatrix2x4fvFn(GLint location,
+                            GLsizei count,
+                            GLboolean transpose,
+                            const GLfloat* value) override;
+void glUniformMatrix3fvFn(GLint location,
+                          GLsizei count,
+                          GLboolean transpose,
+                          const GLfloat* value) override;
+void glUniformMatrix3x2fvFn(GLint location,
+                            GLsizei count,
+                            GLboolean transpose,
+                            const GLfloat* value) override;
+void glUniformMatrix3x4fvFn(GLint location,
+                            GLsizei count,
+                            GLboolean transpose,
+                            const GLfloat* value) override;
+void glUniformMatrix4fvFn(GLint location,
+                          GLsizei count,
+                          GLboolean transpose,
+                          const GLfloat* value) override;
+void glUniformMatrix4x2fvFn(GLint location,
+                            GLsizei count,
+                            GLboolean transpose,
+                            const GLfloat* value) override;
+void glUniformMatrix4x3fvFn(GLint location,
+                            GLsizei count,
+                            GLboolean transpose,
+                            const GLfloat* value) override;
+GLboolean glUnmapBufferFn(GLenum target) override;
+void glUseProgramFn(GLuint program) override;
+void glValidateProgramFn(GLuint program) override;
+void glVertexAttrib1fFn(GLuint indx, GLfloat x) override;
+void glVertexAttrib1fvFn(GLuint indx, const GLfloat* values) override;
+void glVertexAttrib2fFn(GLuint indx, GLfloat x, GLfloat y) override;
+void glVertexAttrib2fvFn(GLuint indx, const GLfloat* values) override;
+void glVertexAttrib3fFn(GLuint indx, GLfloat x, GLfloat y, GLfloat z) override;
+void glVertexAttrib3fvFn(GLuint indx, const GLfloat* values) override;
+void glVertexAttrib4fFn(GLuint indx,
+                        GLfloat x,
+                        GLfloat y,
+                        GLfloat z,
+                        GLfloat w) override;
+void glVertexAttrib4fvFn(GLuint indx, const GLfloat* values) override;
+void glVertexAttribDivisorANGLEFn(GLuint index, GLuint divisor) override;
+void glVertexAttribI4iFn(GLuint indx,
+                         GLint x,
+                         GLint y,
+                         GLint z,
+                         GLint w) override;
+void glVertexAttribI4ivFn(GLuint indx, const GLint* values) override;
+void glVertexAttribI4uiFn(GLuint indx,
+                          GLuint x,
+                          GLuint y,
+                          GLuint z,
+                          GLuint w) override;
+void glVertexAttribI4uivFn(GLuint indx, const GLuint* values) override;
+void glVertexAttribIPointerFn(GLuint indx,
+                              GLint size,
+                              GLenum type,
+                              GLsizei stride,
+                              const void* ptr) override;
+void glVertexAttribPointerFn(GLuint indx,
+                             GLint size,
+                             GLenum type,
+                             GLboolean normalized,
+                             GLsizei stride,
+                             const void* ptr) override;
+void glViewportFn(GLint x, GLint y, GLsizei width, GLsizei height) override;
+GLenum glWaitSyncFn(GLsync sync, GLbitfield flags, GLuint64 timeout) override;
diff --git a/ui/gl/gl_bindings_api_autogen_glx.h b/ui/gl/gl_bindings_api_autogen_glx.h
new file mode 100644
index 0000000..7efbae1
--- /dev/null
+++ b/ui/gl/gl_bindings_api_autogen_glx.h
@@ -0,0 +1,133 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+void glXBindTexImageEXTFn(Display* dpy,
+                          GLXDrawable drawable,
+                          int buffer,
+                          int* attribList) override;
+GLXFBConfig* glXChooseFBConfigFn(Display* dpy,
+                                 int screen,
+                                 const int* attribList,
+                                 int* nitems) override;
+XVisualInfo* glXChooseVisualFn(Display* dpy,
+                               int screen,
+                               int* attribList) override;
+void glXCopyContextFn(Display* dpy,
+                      GLXContext src,
+                      GLXContext dst,
+                      unsigned long mask) override;
+void glXCopySubBufferMESAFn(Display* dpy,
+                            GLXDrawable drawable,
+                            int x,
+                            int y,
+                            int width,
+                            int height) override;
+GLXContext glXCreateContextFn(Display* dpy,
+                              XVisualInfo* vis,
+                              GLXContext shareList,
+                              int direct) override;
+GLXContext glXCreateContextAttribsARBFn(Display* dpy,
+                                        GLXFBConfig config,
+                                        GLXContext share_context,
+                                        int direct,
+                                        const int* attrib_list) override;
+GLXPixmap glXCreateGLXPixmapFn(Display* dpy,
+                               XVisualInfo* visual,
+                               Pixmap pixmap) override;
+GLXContext glXCreateNewContextFn(Display* dpy,
+                                 GLXFBConfig config,
+                                 int renderType,
+                                 GLXContext shareList,
+                                 int direct) override;
+GLXPbuffer glXCreatePbufferFn(Display* dpy,
+                              GLXFBConfig config,
+                              const int* attribList) override;
+GLXPixmap glXCreatePixmapFn(Display* dpy,
+                            GLXFBConfig config,
+                            Pixmap pixmap,
+                            const int* attribList) override;
+GLXWindow glXCreateWindowFn(Display* dpy,
+                            GLXFBConfig config,
+                            Window win,
+                            const int* attribList) override;
+void glXDestroyContextFn(Display* dpy, GLXContext ctx) override;
+void glXDestroyGLXPixmapFn(Display* dpy, GLXPixmap pixmap) override;
+void glXDestroyPbufferFn(Display* dpy, GLXPbuffer pbuf) override;
+void glXDestroyPixmapFn(Display* dpy, GLXPixmap pixmap) override;
+void glXDestroyWindowFn(Display* dpy, GLXWindow window) override;
+const char* glXGetClientStringFn(Display* dpy, int name) override;
+int glXGetConfigFn(Display* dpy,
+                   XVisualInfo* visual,
+                   int attrib,
+                   int* value) override;
+GLXContext glXGetCurrentContextFn(void) override;
+Display* glXGetCurrentDisplayFn(void) override;
+GLXDrawable glXGetCurrentDrawableFn(void) override;
+GLXDrawable glXGetCurrentReadDrawableFn(void) override;
+int glXGetFBConfigAttribFn(Display* dpy,
+                           GLXFBConfig config,
+                           int attribute,
+                           int* value) override;
+GLXFBConfig glXGetFBConfigFromVisualSGIXFn(Display* dpy,
+                                           XVisualInfo* visualInfo) override;
+GLXFBConfig* glXGetFBConfigsFn(Display* dpy,
+                               int screen,
+                               int* nelements) override;
+bool glXGetMscRateOMLFn(Display* dpy,
+                        GLXDrawable drawable,
+                        int32* numerator,
+                        int32* denominator) override;
+void glXGetSelectedEventFn(Display* dpy,
+                           GLXDrawable drawable,
+                           unsigned long* mask) override;
+bool glXGetSyncValuesOMLFn(Display* dpy,
+                           GLXDrawable drawable,
+                           int64* ust,
+                           int64* msc,
+                           int64* sbc) override;
+XVisualInfo* glXGetVisualFromFBConfigFn(Display* dpy,
+                                        GLXFBConfig config) override;
+int glXIsDirectFn(Display* dpy, GLXContext ctx) override;
+int glXMakeContextCurrentFn(Display* dpy,
+                            GLXDrawable draw,
+                            GLXDrawable read,
+                            GLXContext ctx) override;
+int glXMakeCurrentFn(Display* dpy,
+                     GLXDrawable drawable,
+                     GLXContext ctx) override;
+int glXQueryContextFn(Display* dpy,
+                      GLXContext ctx,
+                      int attribute,
+                      int* value) override;
+void glXQueryDrawableFn(Display* dpy,
+                        GLXDrawable draw,
+                        int attribute,
+                        unsigned int* value) override;
+int glXQueryExtensionFn(Display* dpy, int* errorb, int* event) override;
+const char* glXQueryExtensionsStringFn(Display* dpy, int screen) override;
+const char* glXQueryServerStringFn(Display* dpy, int screen, int name) override;
+int glXQueryVersionFn(Display* dpy, int* maj, int* min) override;
+void glXReleaseTexImageEXTFn(Display* dpy,
+                             GLXDrawable drawable,
+                             int buffer) override;
+void glXSelectEventFn(Display* dpy,
+                      GLXDrawable drawable,
+                      unsigned long mask) override;
+void glXSwapBuffersFn(Display* dpy, GLXDrawable drawable) override;
+void glXSwapIntervalEXTFn(Display* dpy,
+                          GLXDrawable drawable,
+                          int interval) override;
+void glXSwapIntervalMESAFn(unsigned int interval) override;
+void glXUseXFontFn(Font font, int first, int count, int list) override;
+void glXWaitGLFn(void) override;
+int glXWaitVideoSyncSGIFn(int divisor,
+                          int remainder,
+                          unsigned int* count) override;
+void glXWaitXFn(void) override;
diff --git a/ui/gl/gl_bindings_api_autogen_osmesa.h b/ui/gl/gl_bindings_api_autogen_osmesa.h
new file mode 100644
index 0000000..c061275
--- /dev/null
+++ b/ui/gl/gl_bindings_api_autogen_osmesa.h
@@ -0,0 +1,38 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+void OSMesaColorClampFn(GLboolean enable) override;
+OSMesaContext OSMesaCreateContextFn(GLenum format,
+                                    OSMesaContext sharelist) override;
+OSMesaContext OSMesaCreateContextExtFn(GLenum format,
+                                       GLint depthBits,
+                                       GLint stencilBits,
+                                       GLint accumBits,
+                                       OSMesaContext sharelist) override;
+void OSMesaDestroyContextFn(OSMesaContext ctx) override;
+GLboolean OSMesaGetColorBufferFn(OSMesaContext c,
+                                 GLint* width,
+                                 GLint* height,
+                                 GLint* format,
+                                 void** buffer) override;
+OSMesaContext OSMesaGetCurrentContextFn(void) override;
+GLboolean OSMesaGetDepthBufferFn(OSMesaContext c,
+                                 GLint* width,
+                                 GLint* height,
+                                 GLint* bytesPerValue,
+                                 void** buffer) override;
+void OSMesaGetIntegervFn(GLint pname, GLint* value) override;
+OSMESAproc OSMesaGetProcAddressFn(const char* funcName) override;
+GLboolean OSMesaMakeCurrentFn(OSMesaContext ctx,
+                              void* buffer,
+                              GLenum type,
+                              GLsizei width,
+                              GLsizei height) override;
+void OSMesaPixelStoreFn(GLint pname, GLint value) override;
diff --git a/ui/gl/gl_bindings_api_autogen_wgl.h b/ui/gl/gl_bindings_api_autogen_wgl.h
new file mode 100644
index 0000000..18b471d
--- /dev/null
+++ b/ui/gl/gl_bindings_api_autogen_wgl.h
@@ -0,0 +1,39 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+BOOL wglChoosePixelFormatARBFn(HDC dc,
+                               const int* int_attrib_list,
+                               const float* float_attrib_list,
+                               UINT max_formats,
+                               int* formats,
+                               UINT* num_formats) override;
+BOOL wglCopyContextFn(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask) override;
+HGLRC wglCreateContextFn(HDC hdc) override;
+HGLRC wglCreateLayerContextFn(HDC hdc, int iLayerPlane) override;
+HPBUFFERARB wglCreatePbufferARBFn(HDC hDC,
+                                  int iPixelFormat,
+                                  int iWidth,
+                                  int iHeight,
+                                  const int* piAttribList) override;
+BOOL wglDeleteContextFn(HGLRC hglrc) override;
+BOOL wglDestroyPbufferARBFn(HPBUFFERARB hPbuffer) override;
+HGLRC wglGetCurrentContextFn() override;
+HDC wglGetCurrentDCFn() override;
+const char* wglGetExtensionsStringARBFn(HDC hDC) override;
+const char* wglGetExtensionsStringEXTFn() override;
+HDC wglGetPbufferDCARBFn(HPBUFFERARB hPbuffer) override;
+BOOL wglMakeCurrentFn(HDC hdc, HGLRC hglrc) override;
+BOOL wglQueryPbufferARBFn(HPBUFFERARB hPbuffer,
+                          int iAttribute,
+                          int* piValue) override;
+int wglReleasePbufferDCARBFn(HPBUFFERARB hPbuffer, HDC hDC) override;
+BOOL wglShareListsFn(HGLRC hglrc1, HGLRC hglrc2) override;
+BOOL wglSwapIntervalEXTFn(int interval) override;
+BOOL wglSwapLayerBuffersFn(HDC hdc, UINT fuPlanes) override;
diff --git a/ui/gl/gl_bindings_autogen_egl.cc b/ui/gl/gl_bindings_autogen_egl.cc
new file mode 100644
index 0000000..051e1b3
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_egl.cc
@@ -0,0 +1,1428 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#include <string>
+
+#include "base/debug/trace_event.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_egl_api_implementation.h"
+#include "ui/gl/gl_enums.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_version_info.h"
+
+namespace gfx {
+
+static bool g_debugBindingsInitialized;
+DriverEGL g_driver_egl;
+
+void DriverEGL::InitializeStaticBindings() {
+  fn.eglBindAPIFn =
+      reinterpret_cast<eglBindAPIProc>(GetGLProcAddress("eglBindAPI"));
+  fn.eglBindTexImageFn = reinterpret_cast<eglBindTexImageProc>(
+      GetGLProcAddress("eglBindTexImage"));
+  fn.eglChooseConfigFn = reinterpret_cast<eglChooseConfigProc>(
+      GetGLProcAddress("eglChooseConfig"));
+  fn.eglClientWaitSyncKHRFn = reinterpret_cast<eglClientWaitSyncKHRProc>(
+      GetGLProcAddress("eglClientWaitSyncKHR"));
+  fn.eglCopyBuffersFn =
+      reinterpret_cast<eglCopyBuffersProc>(GetGLProcAddress("eglCopyBuffers"));
+  fn.eglCreateContextFn = reinterpret_cast<eglCreateContextProc>(
+      GetGLProcAddress("eglCreateContext"));
+  fn.eglCreateImageKHRFn = reinterpret_cast<eglCreateImageKHRProc>(
+      GetGLProcAddress("eglCreateImageKHR"));
+  fn.eglCreatePbufferFromClientBufferFn =
+      reinterpret_cast<eglCreatePbufferFromClientBufferProc>(
+          GetGLProcAddress("eglCreatePbufferFromClientBuffer"));
+  fn.eglCreatePbufferSurfaceFn = reinterpret_cast<eglCreatePbufferSurfaceProc>(
+      GetGLProcAddress("eglCreatePbufferSurface"));
+  fn.eglCreatePixmapSurfaceFn = reinterpret_cast<eglCreatePixmapSurfaceProc>(
+      GetGLProcAddress("eglCreatePixmapSurface"));
+  fn.eglCreateSyncKHRFn = reinterpret_cast<eglCreateSyncKHRProc>(
+      GetGLProcAddress("eglCreateSyncKHR"));
+  fn.eglCreateWindowSurfaceFn = reinterpret_cast<eglCreateWindowSurfaceProc>(
+      GetGLProcAddress("eglCreateWindowSurface"));
+  fn.eglDestroyContextFn = reinterpret_cast<eglDestroyContextProc>(
+      GetGLProcAddress("eglDestroyContext"));
+  fn.eglDestroyImageKHRFn = reinterpret_cast<eglDestroyImageKHRProc>(
+      GetGLProcAddress("eglDestroyImageKHR"));
+  fn.eglDestroySurfaceFn = reinterpret_cast<eglDestroySurfaceProc>(
+      GetGLProcAddress("eglDestroySurface"));
+  fn.eglDestroySyncKHRFn = reinterpret_cast<eglDestroySyncKHRProc>(
+      GetGLProcAddress("eglDestroySyncKHR"));
+  fn.eglGetConfigAttribFn = reinterpret_cast<eglGetConfigAttribProc>(
+      GetGLProcAddress("eglGetConfigAttrib"));
+  fn.eglGetConfigsFn =
+      reinterpret_cast<eglGetConfigsProc>(GetGLProcAddress("eglGetConfigs"));
+  fn.eglGetCurrentContextFn = reinterpret_cast<eglGetCurrentContextProc>(
+      GetGLProcAddress("eglGetCurrentContext"));
+  fn.eglGetCurrentDisplayFn = reinterpret_cast<eglGetCurrentDisplayProc>(
+      GetGLProcAddress("eglGetCurrentDisplay"));
+  fn.eglGetCurrentSurfaceFn = reinterpret_cast<eglGetCurrentSurfaceProc>(
+      GetGLProcAddress("eglGetCurrentSurface"));
+  fn.eglGetDisplayFn =
+      reinterpret_cast<eglGetDisplayProc>(GetGLProcAddress("eglGetDisplay"));
+  fn.eglGetErrorFn =
+      reinterpret_cast<eglGetErrorProc>(GetGLProcAddress("eglGetError"));
+  fn.eglGetPlatformDisplayEXTFn =
+      reinterpret_cast<eglGetPlatformDisplayEXTProc>(
+          GetGLProcAddress("eglGetPlatformDisplayEXT"));
+  fn.eglGetProcAddressFn = reinterpret_cast<eglGetProcAddressProc>(
+      GetGLProcAddress("eglGetProcAddress"));
+  fn.eglGetSyncAttribKHRFn = reinterpret_cast<eglGetSyncAttribKHRProc>(
+      GetGLProcAddress("eglGetSyncAttribKHR"));
+  fn.eglGetSyncValuesCHROMIUMFn =
+      reinterpret_cast<eglGetSyncValuesCHROMIUMProc>(
+          GetGLProcAddress("eglGetSyncValuesCHROMIUM"));
+  fn.eglInitializeFn =
+      reinterpret_cast<eglInitializeProc>(GetGLProcAddress("eglInitialize"));
+  fn.eglMakeCurrentFn =
+      reinterpret_cast<eglMakeCurrentProc>(GetGLProcAddress("eglMakeCurrent"));
+  fn.eglPostSubBufferNVFn = reinterpret_cast<eglPostSubBufferNVProc>(
+      GetGLProcAddress("eglPostSubBufferNV"));
+  fn.eglQueryAPIFn =
+      reinterpret_cast<eglQueryAPIProc>(GetGLProcAddress("eglQueryAPI"));
+  fn.eglQueryContextFn = reinterpret_cast<eglQueryContextProc>(
+      GetGLProcAddress("eglQueryContext"));
+  fn.eglQueryStringFn =
+      reinterpret_cast<eglQueryStringProc>(GetGLProcAddress("eglQueryString"));
+  fn.eglQuerySurfaceFn = reinterpret_cast<eglQuerySurfaceProc>(
+      GetGLProcAddress("eglQuerySurface"));
+  fn.eglQuerySurfacePointerANGLEFn =
+      reinterpret_cast<eglQuerySurfacePointerANGLEProc>(
+          GetGLProcAddress("eglQuerySurfacePointerANGLE"));
+  fn.eglReleaseTexImageFn = reinterpret_cast<eglReleaseTexImageProc>(
+      GetGLProcAddress("eglReleaseTexImage"));
+  fn.eglReleaseThreadFn = reinterpret_cast<eglReleaseThreadProc>(
+      GetGLProcAddress("eglReleaseThread"));
+  fn.eglSurfaceAttribFn = reinterpret_cast<eglSurfaceAttribProc>(
+      GetGLProcAddress("eglSurfaceAttrib"));
+  fn.eglSwapBuffersFn =
+      reinterpret_cast<eglSwapBuffersProc>(GetGLProcAddress("eglSwapBuffers"));
+  fn.eglSwapIntervalFn = reinterpret_cast<eglSwapIntervalProc>(
+      GetGLProcAddress("eglSwapInterval"));
+  fn.eglTerminateFn =
+      reinterpret_cast<eglTerminateProc>(GetGLProcAddress("eglTerminate"));
+  fn.eglWaitClientFn =
+      reinterpret_cast<eglWaitClientProc>(GetGLProcAddress("eglWaitClient"));
+  fn.eglWaitGLFn =
+      reinterpret_cast<eglWaitGLProc>(GetGLProcAddress("eglWaitGL"));
+  fn.eglWaitNativeFn =
+      reinterpret_cast<eglWaitNativeProc>(GetGLProcAddress("eglWaitNative"));
+  fn.eglWaitSyncKHRFn =
+      reinterpret_cast<eglWaitSyncKHRProc>(GetGLProcAddress("eglWaitSyncKHR"));
+}
+
+void DriverEGL::InitializeDynamicBindings(GLContext* context) {
+  DCHECK(context && context->IsCurrent(NULL));
+  const GLVersionInfo* ver = context->GetVersionInfo();
+  ALLOW_UNUSED_LOCAL(ver);
+  std::string extensions = context->GetExtensions() + " ";
+  ALLOW_UNUSED_LOCAL(extensions);
+
+  ext.b_EGL_ANGLE_d3d_share_handle_client_buffer =
+      extensions.find("EGL_ANGLE_d3d_share_handle_client_buffer ") !=
+      std::string::npos;
+  ext.b_EGL_ANGLE_platform_angle =
+      extensions.find("EGL_ANGLE_platform_angle ") != std::string::npos;
+  ext.b_EGL_ANGLE_query_surface_pointer =
+      extensions.find("EGL_ANGLE_query_surface_pointer ") != std::string::npos;
+  ext.b_EGL_ANGLE_surface_d3d_texture_2d_share_handle =
+      extensions.find("EGL_ANGLE_surface_d3d_texture_2d_share_handle ") !=
+      std::string::npos;
+  ext.b_EGL_CHROMIUM_sync_control =
+      extensions.find("EGL_CHROMIUM_sync_control ") != std::string::npos;
+  ext.b_EGL_KHR_fence_sync =
+      extensions.find("EGL_KHR_fence_sync ") != std::string::npos;
+  ext.b_EGL_KHR_gl_texture_2D_image =
+      extensions.find("EGL_KHR_gl_texture_2D_image ") != std::string::npos;
+  ext.b_EGL_KHR_image_base =
+      extensions.find("EGL_KHR_image_base ") != std::string::npos;
+  ext.b_EGL_KHR_wait_sync =
+      extensions.find("EGL_KHR_wait_sync ") != std::string::npos;
+  ext.b_EGL_NV_post_sub_buffer =
+      extensions.find("EGL_NV_post_sub_buffer ") != std::string::npos;
+
+  if (g_debugBindingsInitialized)
+    InitializeDebugBindings();
+}
+
+extern "C" {
+
+static EGLBoolean GL_BINDING_CALL Debug_eglBindAPI(EGLenum api) {
+  GL_SERVICE_LOG("eglBindAPI"
+                 << "(" << api << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglBindAPIFn(api);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
+  GL_SERVICE_LOG("eglBindTexImage"
+                 << "(" << dpy << ", " << surface << ", " << buffer << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglBindTexImageFn(dpy, surface, buffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglChooseConfig(EGLDisplay dpy,
+                      const EGLint* attrib_list,
+                      EGLConfig* configs,
+                      EGLint config_size,
+                      EGLint* num_config) {
+  GL_SERVICE_LOG("eglChooseConfig"
+                 << "(" << dpy << ", " << static_cast<const void*>(attrib_list)
+                 << ", " << static_cast<const void*>(configs) << ", "
+                 << config_size << ", " << static_cast<const void*>(num_config)
+                 << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglChooseConfigFn(
+      dpy, attrib_list, configs, config_size, num_config);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLint GL_BINDING_CALL Debug_eglClientWaitSyncKHR(EGLDisplay dpy,
+                                                         EGLSyncKHR sync,
+                                                         EGLint flags,
+                                                         EGLTimeKHR timeout) {
+  GL_SERVICE_LOG("eglClientWaitSyncKHR"
+                 << "(" << dpy << ", " << sync << ", " << flags << ", "
+                 << timeout << ")");
+  EGLint result =
+      g_driver_egl.debug_fn.eglClientWaitSyncKHRFn(dpy, sync, flags, timeout);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglCopyBuffers(EGLDisplay dpy,
+                     EGLSurface surface,
+                     EGLNativePixmapType target) {
+  GL_SERVICE_LOG("eglCopyBuffers"
+                 << "(" << dpy << ", " << surface << ", " << target << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglCopyBuffersFn(dpy, surface, target);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLContext GL_BINDING_CALL
+Debug_eglCreateContext(EGLDisplay dpy,
+                       EGLConfig config,
+                       EGLContext share_context,
+                       const EGLint* attrib_list) {
+  GL_SERVICE_LOG("eglCreateContext"
+                 << "(" << dpy << ", " << config << ", " << share_context
+                 << ", " << static_cast<const void*>(attrib_list) << ")");
+  EGLContext result = g_driver_egl.debug_fn.eglCreateContextFn(
+      dpy, config, share_context, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLImageKHR GL_BINDING_CALL
+Debug_eglCreateImageKHR(EGLDisplay dpy,
+                        EGLContext ctx,
+                        EGLenum target,
+                        EGLClientBuffer buffer,
+                        const EGLint* attrib_list) {
+  GL_SERVICE_LOG("eglCreateImageKHR"
+                 << "(" << dpy << ", " << ctx << ", " << target << ", "
+                 << buffer << ", " << static_cast<const void*>(attrib_list)
+                 << ")");
+  EGLImageKHR result = g_driver_egl.debug_fn.eglCreateImageKHRFn(
+      dpy, ctx, target, buffer, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLSurface GL_BINDING_CALL
+Debug_eglCreatePbufferFromClientBuffer(EGLDisplay dpy,
+                                       EGLenum buftype,
+                                       void* buffer,
+                                       EGLConfig config,
+                                       const EGLint* attrib_list) {
+  GL_SERVICE_LOG("eglCreatePbufferFromClientBuffer"
+                 << "(" << dpy << ", " << buftype << ", "
+                 << static_cast<const void*>(buffer) << ", " << config << ", "
+                 << static_cast<const void*>(attrib_list) << ")");
+  EGLSurface result = g_driver_egl.debug_fn.eglCreatePbufferFromClientBufferFn(
+      dpy, buftype, buffer, config, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLSurface GL_BINDING_CALL
+Debug_eglCreatePbufferSurface(EGLDisplay dpy,
+                              EGLConfig config,
+                              const EGLint* attrib_list) {
+  GL_SERVICE_LOG("eglCreatePbufferSurface"
+                 << "(" << dpy << ", " << config << ", "
+                 << static_cast<const void*>(attrib_list) << ")");
+  EGLSurface result =
+      g_driver_egl.debug_fn.eglCreatePbufferSurfaceFn(dpy, config, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLSurface GL_BINDING_CALL
+Debug_eglCreatePixmapSurface(EGLDisplay dpy,
+                             EGLConfig config,
+                             EGLNativePixmapType pixmap,
+                             const EGLint* attrib_list) {
+  GL_SERVICE_LOG("eglCreatePixmapSurface"
+                 << "(" << dpy << ", " << config << ", " << pixmap << ", "
+                 << static_cast<const void*>(attrib_list) << ")");
+  EGLSurface result = g_driver_egl.debug_fn.eglCreatePixmapSurfaceFn(
+      dpy, config, pixmap, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLSyncKHR GL_BINDING_CALL
+Debug_eglCreateSyncKHR(EGLDisplay dpy,
+                       EGLenum type,
+                       const EGLint* attrib_list) {
+  GL_SERVICE_LOG("eglCreateSyncKHR"
+                 << "(" << dpy << ", " << type << ", "
+                 << static_cast<const void*>(attrib_list) << ")");
+  EGLSyncKHR result =
+      g_driver_egl.debug_fn.eglCreateSyncKHRFn(dpy, type, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLSurface GL_BINDING_CALL
+Debug_eglCreateWindowSurface(EGLDisplay dpy,
+                             EGLConfig config,
+                             EGLNativeWindowType win,
+                             const EGLint* attrib_list) {
+  GL_SERVICE_LOG("eglCreateWindowSurface"
+                 << "(" << dpy << ", " << config << ", " << win << ", "
+                 << static_cast<const void*>(attrib_list) << ")");
+  EGLSurface result = g_driver_egl.debug_fn.eglCreateWindowSurfaceFn(
+      dpy, config, win, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglDestroyContext(EGLDisplay dpy, EGLContext ctx) {
+  GL_SERVICE_LOG("eglDestroyContext"
+                 << "(" << dpy << ", " << ctx << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglDestroyContextFn(dpy, ctx);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) {
+  GL_SERVICE_LOG("eglDestroyImageKHR"
+                 << "(" << dpy << ", " << image << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglDestroyImageKHRFn(dpy, image);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglDestroySurface(EGLDisplay dpy, EGLSurface surface) {
+  GL_SERVICE_LOG("eglDestroySurface"
+                 << "(" << dpy << ", " << surface << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglDestroySurfaceFn(dpy, surface);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) {
+  GL_SERVICE_LOG("eglDestroySyncKHR"
+                 << "(" << dpy << ", " << sync << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglDestroySyncKHRFn(dpy, sync);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglGetConfigAttrib(EGLDisplay dpy,
+                                                           EGLConfig config,
+                                                           EGLint attribute,
+                                                           EGLint* value) {
+  GL_SERVICE_LOG("eglGetConfigAttrib"
+                 << "(" << dpy << ", " << config << ", " << attribute << ", "
+                 << static_cast<const void*>(value) << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglGetConfigAttribFn(dpy, config, attribute, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglGetConfigs(EGLDisplay dpy,
+                                                      EGLConfig* configs,
+                                                      EGLint config_size,
+                                                      EGLint* num_config) {
+  GL_SERVICE_LOG("eglGetConfigs"
+                 << "(" << dpy << ", " << static_cast<const void*>(configs)
+                 << ", " << config_size << ", "
+                 << static_cast<const void*>(num_config) << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglGetConfigsFn(
+      dpy, configs, config_size, num_config);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLContext GL_BINDING_CALL Debug_eglGetCurrentContext(void) {
+  GL_SERVICE_LOG("eglGetCurrentContext"
+                 << "("
+                 << ")");
+  EGLContext result = g_driver_egl.debug_fn.eglGetCurrentContextFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLDisplay GL_BINDING_CALL Debug_eglGetCurrentDisplay(void) {
+  GL_SERVICE_LOG("eglGetCurrentDisplay"
+                 << "("
+                 << ")");
+  EGLDisplay result = g_driver_egl.debug_fn.eglGetCurrentDisplayFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLSurface GL_BINDING_CALL Debug_eglGetCurrentSurface(EGLint readdraw) {
+  GL_SERVICE_LOG("eglGetCurrentSurface"
+                 << "(" << readdraw << ")");
+  EGLSurface result = g_driver_egl.debug_fn.eglGetCurrentSurfaceFn(readdraw);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLDisplay GL_BINDING_CALL
+Debug_eglGetDisplay(EGLNativeDisplayType display_id) {
+  GL_SERVICE_LOG("eglGetDisplay"
+                 << "(" << display_id << ")");
+  EGLDisplay result = g_driver_egl.debug_fn.eglGetDisplayFn(display_id);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLint GL_BINDING_CALL Debug_eglGetError(void) {
+  GL_SERVICE_LOG("eglGetError"
+                 << "("
+                 << ")");
+  EGLint result = g_driver_egl.debug_fn.eglGetErrorFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLDisplay GL_BINDING_CALL
+Debug_eglGetPlatformDisplayEXT(EGLenum platform,
+                               void* native_display,
+                               const EGLint* attrib_list) {
+  GL_SERVICE_LOG("eglGetPlatformDisplayEXT"
+                 << "(" << platform << ", "
+                 << static_cast<const void*>(native_display) << ", "
+                 << static_cast<const void*>(attrib_list) << ")");
+  EGLDisplay result = g_driver_egl.debug_fn.eglGetPlatformDisplayEXTFn(
+      platform, native_display, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static __eglMustCastToProperFunctionPointerType GL_BINDING_CALL
+Debug_eglGetProcAddress(const char* procname) {
+  GL_SERVICE_LOG("eglGetProcAddress"
+                 << "(" << procname << ")");
+  __eglMustCastToProperFunctionPointerType result =
+      g_driver_egl.debug_fn.eglGetProcAddressFn(procname);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglGetSyncAttribKHR(EGLDisplay dpy,
+                                                            EGLSyncKHR sync,
+                                                            EGLint attribute,
+                                                            EGLint* value) {
+  GL_SERVICE_LOG("eglGetSyncAttribKHR"
+                 << "(" << dpy << ", " << sync << ", " << attribute << ", "
+                 << static_cast<const void*>(value) << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglGetSyncAttribKHRFn(dpy, sync, attribute, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglGetSyncValuesCHROMIUM(EGLDisplay dpy,
+                               EGLSurface surface,
+                               EGLuint64CHROMIUM* ust,
+                               EGLuint64CHROMIUM* msc,
+                               EGLuint64CHROMIUM* sbc) {
+  GL_SERVICE_LOG("eglGetSyncValuesCHROMIUM"
+                 << "(" << dpy << ", " << surface << ", "
+                 << static_cast<const void*>(ust) << ", "
+                 << static_cast<const void*>(msc) << ", "
+                 << static_cast<const void*>(sbc) << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglGetSyncValuesCHROMIUMFn(
+      dpy, surface, ust, msc, sbc);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor) {
+  GL_SERVICE_LOG("eglInitialize"
+                 << "(" << dpy << ", " << static_cast<const void*>(major)
+                 << ", " << static_cast<const void*>(minor) << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglInitializeFn(dpy, major, minor);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglMakeCurrent(EGLDisplay dpy,
+                                                       EGLSurface draw,
+                                                       EGLSurface read,
+                                                       EGLContext ctx) {
+  GL_SERVICE_LOG("eglMakeCurrent"
+                 << "(" << dpy << ", " << draw << ", " << read << ", " << ctx
+                 << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglMakeCurrentFn(dpy, draw, read, ctx);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglPostSubBufferNV(EGLDisplay dpy,
+                                                           EGLSurface surface,
+                                                           EGLint x,
+                                                           EGLint y,
+                                                           EGLint width,
+                                                           EGLint height) {
+  GL_SERVICE_LOG("eglPostSubBufferNV"
+                 << "(" << dpy << ", " << surface << ", " << x << ", " << y
+                 << ", " << width << ", " << height << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglPostSubBufferNVFn(
+      dpy, surface, x, y, width, height);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLenum GL_BINDING_CALL Debug_eglQueryAPI(void) {
+  GL_SERVICE_LOG("eglQueryAPI"
+                 << "("
+                 << ")");
+  EGLenum result = g_driver_egl.debug_fn.eglQueryAPIFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglQueryContext(EGLDisplay dpy,
+                                                        EGLContext ctx,
+                                                        EGLint attribute,
+                                                        EGLint* value) {
+  GL_SERVICE_LOG("eglQueryContext"
+                 << "(" << dpy << ", " << ctx << ", " << attribute << ", "
+                 << static_cast<const void*>(value) << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglQueryContextFn(dpy, ctx, attribute, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static const char* GL_BINDING_CALL
+Debug_eglQueryString(EGLDisplay dpy, EGLint name) {
+  GL_SERVICE_LOG("eglQueryString"
+                 << "(" << dpy << ", " << name << ")");
+  const char* result = g_driver_egl.debug_fn.eglQueryStringFn(dpy, name);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglQuerySurface(EGLDisplay dpy,
+                                                        EGLSurface surface,
+                                                        EGLint attribute,
+                                                        EGLint* value) {
+  GL_SERVICE_LOG("eglQuerySurface"
+                 << "(" << dpy << ", " << surface << ", " << attribute << ", "
+                 << static_cast<const void*>(value) << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglQuerySurfaceFn(dpy, surface, attribute, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglQuerySurfacePointerANGLE(EGLDisplay dpy,
+                                  EGLSurface surface,
+                                  EGLint attribute,
+                                  void** value) {
+  GL_SERVICE_LOG("eglQuerySurfacePointerANGLE"
+                 << "(" << dpy << ", " << surface << ", " << attribute << ", "
+                 << value << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglQuerySurfacePointerANGLEFn(
+      dpy, surface, attribute, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
+  GL_SERVICE_LOG("eglReleaseTexImage"
+                 << "(" << dpy << ", " << surface << ", " << buffer << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglReleaseTexImageFn(dpy, surface, buffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglReleaseThread(void) {
+  GL_SERVICE_LOG("eglReleaseThread"
+                 << "("
+                 << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglReleaseThreadFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglSurfaceAttrib(EGLDisplay dpy,
+                                                         EGLSurface surface,
+                                                         EGLint attribute,
+                                                         EGLint value) {
+  GL_SERVICE_LOG("eglSurfaceAttrib"
+                 << "(" << dpy << ", " << surface << ", " << attribute << ", "
+                 << value << ")");
+  EGLBoolean result =
+      g_driver_egl.debug_fn.eglSurfaceAttribFn(dpy, surface, attribute, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) {
+  GL_SERVICE_LOG("eglSwapBuffers"
+                 << "(" << dpy << ", " << surface << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglSwapBuffersFn(dpy, surface);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL
+Debug_eglSwapInterval(EGLDisplay dpy, EGLint interval) {
+  GL_SERVICE_LOG("eglSwapInterval"
+                 << "(" << dpy << ", " << interval << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglSwapIntervalFn(dpy, interval);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglTerminate(EGLDisplay dpy) {
+  GL_SERVICE_LOG("eglTerminate"
+                 << "(" << dpy << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglTerminateFn(dpy);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglWaitClient(void) {
+  GL_SERVICE_LOG("eglWaitClient"
+                 << "("
+                 << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglWaitClientFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglWaitGL(void) {
+  GL_SERVICE_LOG("eglWaitGL"
+                 << "("
+                 << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglWaitGLFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLBoolean GL_BINDING_CALL Debug_eglWaitNative(EGLint engine) {
+  GL_SERVICE_LOG("eglWaitNative"
+                 << "(" << engine << ")");
+  EGLBoolean result = g_driver_egl.debug_fn.eglWaitNativeFn(engine);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static EGLint GL_BINDING_CALL
+Debug_eglWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags) {
+  GL_SERVICE_LOG("eglWaitSyncKHR"
+                 << "(" << dpy << ", " << sync << ", " << flags << ")");
+  EGLint result = g_driver_egl.debug_fn.eglWaitSyncKHRFn(dpy, sync, flags);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+}  // extern "C"
+
+void DriverEGL::InitializeDebugBindings() {
+  if (!debug_fn.eglBindAPIFn) {
+    debug_fn.eglBindAPIFn = fn.eglBindAPIFn;
+    fn.eglBindAPIFn = Debug_eglBindAPI;
+  }
+  if (!debug_fn.eglBindTexImageFn) {
+    debug_fn.eglBindTexImageFn = fn.eglBindTexImageFn;
+    fn.eglBindTexImageFn = Debug_eglBindTexImage;
+  }
+  if (!debug_fn.eglChooseConfigFn) {
+    debug_fn.eglChooseConfigFn = fn.eglChooseConfigFn;
+    fn.eglChooseConfigFn = Debug_eglChooseConfig;
+  }
+  if (!debug_fn.eglClientWaitSyncKHRFn) {
+    debug_fn.eglClientWaitSyncKHRFn = fn.eglClientWaitSyncKHRFn;
+    fn.eglClientWaitSyncKHRFn = Debug_eglClientWaitSyncKHR;
+  }
+  if (!debug_fn.eglCopyBuffersFn) {
+    debug_fn.eglCopyBuffersFn = fn.eglCopyBuffersFn;
+    fn.eglCopyBuffersFn = Debug_eglCopyBuffers;
+  }
+  if (!debug_fn.eglCreateContextFn) {
+    debug_fn.eglCreateContextFn = fn.eglCreateContextFn;
+    fn.eglCreateContextFn = Debug_eglCreateContext;
+  }
+  if (!debug_fn.eglCreateImageKHRFn) {
+    debug_fn.eglCreateImageKHRFn = fn.eglCreateImageKHRFn;
+    fn.eglCreateImageKHRFn = Debug_eglCreateImageKHR;
+  }
+  if (!debug_fn.eglCreatePbufferFromClientBufferFn) {
+    debug_fn.eglCreatePbufferFromClientBufferFn =
+        fn.eglCreatePbufferFromClientBufferFn;
+    fn.eglCreatePbufferFromClientBufferFn =
+        Debug_eglCreatePbufferFromClientBuffer;
+  }
+  if (!debug_fn.eglCreatePbufferSurfaceFn) {
+    debug_fn.eglCreatePbufferSurfaceFn = fn.eglCreatePbufferSurfaceFn;
+    fn.eglCreatePbufferSurfaceFn = Debug_eglCreatePbufferSurface;
+  }
+  if (!debug_fn.eglCreatePixmapSurfaceFn) {
+    debug_fn.eglCreatePixmapSurfaceFn = fn.eglCreatePixmapSurfaceFn;
+    fn.eglCreatePixmapSurfaceFn = Debug_eglCreatePixmapSurface;
+  }
+  if (!debug_fn.eglCreateSyncKHRFn) {
+    debug_fn.eglCreateSyncKHRFn = fn.eglCreateSyncKHRFn;
+    fn.eglCreateSyncKHRFn = Debug_eglCreateSyncKHR;
+  }
+  if (!debug_fn.eglCreateWindowSurfaceFn) {
+    debug_fn.eglCreateWindowSurfaceFn = fn.eglCreateWindowSurfaceFn;
+    fn.eglCreateWindowSurfaceFn = Debug_eglCreateWindowSurface;
+  }
+  if (!debug_fn.eglDestroyContextFn) {
+    debug_fn.eglDestroyContextFn = fn.eglDestroyContextFn;
+    fn.eglDestroyContextFn = Debug_eglDestroyContext;
+  }
+  if (!debug_fn.eglDestroyImageKHRFn) {
+    debug_fn.eglDestroyImageKHRFn = fn.eglDestroyImageKHRFn;
+    fn.eglDestroyImageKHRFn = Debug_eglDestroyImageKHR;
+  }
+  if (!debug_fn.eglDestroySurfaceFn) {
+    debug_fn.eglDestroySurfaceFn = fn.eglDestroySurfaceFn;
+    fn.eglDestroySurfaceFn = Debug_eglDestroySurface;
+  }
+  if (!debug_fn.eglDestroySyncKHRFn) {
+    debug_fn.eglDestroySyncKHRFn = fn.eglDestroySyncKHRFn;
+    fn.eglDestroySyncKHRFn = Debug_eglDestroySyncKHR;
+  }
+  if (!debug_fn.eglGetConfigAttribFn) {
+    debug_fn.eglGetConfigAttribFn = fn.eglGetConfigAttribFn;
+    fn.eglGetConfigAttribFn = Debug_eglGetConfigAttrib;
+  }
+  if (!debug_fn.eglGetConfigsFn) {
+    debug_fn.eglGetConfigsFn = fn.eglGetConfigsFn;
+    fn.eglGetConfigsFn = Debug_eglGetConfigs;
+  }
+  if (!debug_fn.eglGetCurrentContextFn) {
+    debug_fn.eglGetCurrentContextFn = fn.eglGetCurrentContextFn;
+    fn.eglGetCurrentContextFn = Debug_eglGetCurrentContext;
+  }
+  if (!debug_fn.eglGetCurrentDisplayFn) {
+    debug_fn.eglGetCurrentDisplayFn = fn.eglGetCurrentDisplayFn;
+    fn.eglGetCurrentDisplayFn = Debug_eglGetCurrentDisplay;
+  }
+  if (!debug_fn.eglGetCurrentSurfaceFn) {
+    debug_fn.eglGetCurrentSurfaceFn = fn.eglGetCurrentSurfaceFn;
+    fn.eglGetCurrentSurfaceFn = Debug_eglGetCurrentSurface;
+  }
+  if (!debug_fn.eglGetDisplayFn) {
+    debug_fn.eglGetDisplayFn = fn.eglGetDisplayFn;
+    fn.eglGetDisplayFn = Debug_eglGetDisplay;
+  }
+  if (!debug_fn.eglGetErrorFn) {
+    debug_fn.eglGetErrorFn = fn.eglGetErrorFn;
+    fn.eglGetErrorFn = Debug_eglGetError;
+  }
+  if (!debug_fn.eglGetPlatformDisplayEXTFn) {
+    debug_fn.eglGetPlatformDisplayEXTFn = fn.eglGetPlatformDisplayEXTFn;
+    fn.eglGetPlatformDisplayEXTFn = Debug_eglGetPlatformDisplayEXT;
+  }
+  if (!debug_fn.eglGetProcAddressFn) {
+    debug_fn.eglGetProcAddressFn = fn.eglGetProcAddressFn;
+    fn.eglGetProcAddressFn = Debug_eglGetProcAddress;
+  }
+  if (!debug_fn.eglGetSyncAttribKHRFn) {
+    debug_fn.eglGetSyncAttribKHRFn = fn.eglGetSyncAttribKHRFn;
+    fn.eglGetSyncAttribKHRFn = Debug_eglGetSyncAttribKHR;
+  }
+  if (!debug_fn.eglGetSyncValuesCHROMIUMFn) {
+    debug_fn.eglGetSyncValuesCHROMIUMFn = fn.eglGetSyncValuesCHROMIUMFn;
+    fn.eglGetSyncValuesCHROMIUMFn = Debug_eglGetSyncValuesCHROMIUM;
+  }
+  if (!debug_fn.eglInitializeFn) {
+    debug_fn.eglInitializeFn = fn.eglInitializeFn;
+    fn.eglInitializeFn = Debug_eglInitialize;
+  }
+  if (!debug_fn.eglMakeCurrentFn) {
+    debug_fn.eglMakeCurrentFn = fn.eglMakeCurrentFn;
+    fn.eglMakeCurrentFn = Debug_eglMakeCurrent;
+  }
+  if (!debug_fn.eglPostSubBufferNVFn) {
+    debug_fn.eglPostSubBufferNVFn = fn.eglPostSubBufferNVFn;
+    fn.eglPostSubBufferNVFn = Debug_eglPostSubBufferNV;
+  }
+  if (!debug_fn.eglQueryAPIFn) {
+    debug_fn.eglQueryAPIFn = fn.eglQueryAPIFn;
+    fn.eglQueryAPIFn = Debug_eglQueryAPI;
+  }
+  if (!debug_fn.eglQueryContextFn) {
+    debug_fn.eglQueryContextFn = fn.eglQueryContextFn;
+    fn.eglQueryContextFn = Debug_eglQueryContext;
+  }
+  if (!debug_fn.eglQueryStringFn) {
+    debug_fn.eglQueryStringFn = fn.eglQueryStringFn;
+    fn.eglQueryStringFn = Debug_eglQueryString;
+  }
+  if (!debug_fn.eglQuerySurfaceFn) {
+    debug_fn.eglQuerySurfaceFn = fn.eglQuerySurfaceFn;
+    fn.eglQuerySurfaceFn = Debug_eglQuerySurface;
+  }
+  if (!debug_fn.eglQuerySurfacePointerANGLEFn) {
+    debug_fn.eglQuerySurfacePointerANGLEFn = fn.eglQuerySurfacePointerANGLEFn;
+    fn.eglQuerySurfacePointerANGLEFn = Debug_eglQuerySurfacePointerANGLE;
+  }
+  if (!debug_fn.eglReleaseTexImageFn) {
+    debug_fn.eglReleaseTexImageFn = fn.eglReleaseTexImageFn;
+    fn.eglReleaseTexImageFn = Debug_eglReleaseTexImage;
+  }
+  if (!debug_fn.eglReleaseThreadFn) {
+    debug_fn.eglReleaseThreadFn = fn.eglReleaseThreadFn;
+    fn.eglReleaseThreadFn = Debug_eglReleaseThread;
+  }
+  if (!debug_fn.eglSurfaceAttribFn) {
+    debug_fn.eglSurfaceAttribFn = fn.eglSurfaceAttribFn;
+    fn.eglSurfaceAttribFn = Debug_eglSurfaceAttrib;
+  }
+  if (!debug_fn.eglSwapBuffersFn) {
+    debug_fn.eglSwapBuffersFn = fn.eglSwapBuffersFn;
+    fn.eglSwapBuffersFn = Debug_eglSwapBuffers;
+  }
+  if (!debug_fn.eglSwapIntervalFn) {
+    debug_fn.eglSwapIntervalFn = fn.eglSwapIntervalFn;
+    fn.eglSwapIntervalFn = Debug_eglSwapInterval;
+  }
+  if (!debug_fn.eglTerminateFn) {
+    debug_fn.eglTerminateFn = fn.eglTerminateFn;
+    fn.eglTerminateFn = Debug_eglTerminate;
+  }
+  if (!debug_fn.eglWaitClientFn) {
+    debug_fn.eglWaitClientFn = fn.eglWaitClientFn;
+    fn.eglWaitClientFn = Debug_eglWaitClient;
+  }
+  if (!debug_fn.eglWaitGLFn) {
+    debug_fn.eglWaitGLFn = fn.eglWaitGLFn;
+    fn.eglWaitGLFn = Debug_eglWaitGL;
+  }
+  if (!debug_fn.eglWaitNativeFn) {
+    debug_fn.eglWaitNativeFn = fn.eglWaitNativeFn;
+    fn.eglWaitNativeFn = Debug_eglWaitNative;
+  }
+  if (!debug_fn.eglWaitSyncKHRFn) {
+    debug_fn.eglWaitSyncKHRFn = fn.eglWaitSyncKHRFn;
+    fn.eglWaitSyncKHRFn = Debug_eglWaitSyncKHR;
+  }
+  g_debugBindingsInitialized = true;
+}
+
+void DriverEGL::ClearBindings() {
+  memset(this, 0, sizeof(*this));
+}
+
+EGLBoolean EGLApiBase::eglBindAPIFn(EGLenum api) {
+  return driver_->fn.eglBindAPIFn(api);
+}
+
+EGLBoolean EGLApiBase::eglBindTexImageFn(EGLDisplay dpy,
+                                         EGLSurface surface,
+                                         EGLint buffer) {
+  return driver_->fn.eglBindTexImageFn(dpy, surface, buffer);
+}
+
+EGLBoolean EGLApiBase::eglChooseConfigFn(EGLDisplay dpy,
+                                         const EGLint* attrib_list,
+                                         EGLConfig* configs,
+                                         EGLint config_size,
+                                         EGLint* num_config) {
+  return driver_->fn.eglChooseConfigFn(dpy, attrib_list, configs, config_size,
+                                       num_config);
+}
+
+EGLint EGLApiBase::eglClientWaitSyncKHRFn(EGLDisplay dpy,
+                                          EGLSyncKHR sync,
+                                          EGLint flags,
+                                          EGLTimeKHR timeout) {
+  return driver_->fn.eglClientWaitSyncKHRFn(dpy, sync, flags, timeout);
+}
+
+EGLBoolean EGLApiBase::eglCopyBuffersFn(EGLDisplay dpy,
+                                        EGLSurface surface,
+                                        EGLNativePixmapType target) {
+  return driver_->fn.eglCopyBuffersFn(dpy, surface, target);
+}
+
+EGLContext EGLApiBase::eglCreateContextFn(EGLDisplay dpy,
+                                          EGLConfig config,
+                                          EGLContext share_context,
+                                          const EGLint* attrib_list) {
+  return driver_->fn.eglCreateContextFn(dpy, config, share_context,
+                                        attrib_list);
+}
+
+EGLImageKHR EGLApiBase::eglCreateImageKHRFn(EGLDisplay dpy,
+                                            EGLContext ctx,
+                                            EGLenum target,
+                                            EGLClientBuffer buffer,
+                                            const EGLint* attrib_list) {
+  return driver_->fn.eglCreateImageKHRFn(dpy, ctx, target, buffer, attrib_list);
+}
+
+EGLSurface EGLApiBase::eglCreatePbufferFromClientBufferFn(
+    EGLDisplay dpy,
+    EGLenum buftype,
+    void* buffer,
+    EGLConfig config,
+    const EGLint* attrib_list) {
+  return driver_->fn.eglCreatePbufferFromClientBufferFn(dpy, buftype, buffer,
+                                                        config, attrib_list);
+}
+
+EGLSurface EGLApiBase::eglCreatePbufferSurfaceFn(EGLDisplay dpy,
+                                                 EGLConfig config,
+                                                 const EGLint* attrib_list) {
+  return driver_->fn.eglCreatePbufferSurfaceFn(dpy, config, attrib_list);
+}
+
+EGLSurface EGLApiBase::eglCreatePixmapSurfaceFn(EGLDisplay dpy,
+                                                EGLConfig config,
+                                                EGLNativePixmapType pixmap,
+                                                const EGLint* attrib_list) {
+  return driver_->fn.eglCreatePixmapSurfaceFn(dpy, config, pixmap, attrib_list);
+}
+
+EGLSyncKHR EGLApiBase::eglCreateSyncKHRFn(EGLDisplay dpy,
+                                          EGLenum type,
+                                          const EGLint* attrib_list) {
+  return driver_->fn.eglCreateSyncKHRFn(dpy, type, attrib_list);
+}
+
+EGLSurface EGLApiBase::eglCreateWindowSurfaceFn(EGLDisplay dpy,
+                                                EGLConfig config,
+                                                EGLNativeWindowType win,
+                                                const EGLint* attrib_list) {
+  return driver_->fn.eglCreateWindowSurfaceFn(dpy, config, win, attrib_list);
+}
+
+EGLBoolean EGLApiBase::eglDestroyContextFn(EGLDisplay dpy, EGLContext ctx) {
+  return driver_->fn.eglDestroyContextFn(dpy, ctx);
+}
+
+EGLBoolean EGLApiBase::eglDestroyImageKHRFn(EGLDisplay dpy, EGLImageKHR image) {
+  return driver_->fn.eglDestroyImageKHRFn(dpy, image);
+}
+
+EGLBoolean EGLApiBase::eglDestroySurfaceFn(EGLDisplay dpy, EGLSurface surface) {
+  return driver_->fn.eglDestroySurfaceFn(dpy, surface);
+}
+
+EGLBoolean EGLApiBase::eglDestroySyncKHRFn(EGLDisplay dpy, EGLSyncKHR sync) {
+  return driver_->fn.eglDestroySyncKHRFn(dpy, sync);
+}
+
+EGLBoolean EGLApiBase::eglGetConfigAttribFn(EGLDisplay dpy,
+                                            EGLConfig config,
+                                            EGLint attribute,
+                                            EGLint* value) {
+  return driver_->fn.eglGetConfigAttribFn(dpy, config, attribute, value);
+}
+
+EGLBoolean EGLApiBase::eglGetConfigsFn(EGLDisplay dpy,
+                                       EGLConfig* configs,
+                                       EGLint config_size,
+                                       EGLint* num_config) {
+  return driver_->fn.eglGetConfigsFn(dpy, configs, config_size, num_config);
+}
+
+EGLContext EGLApiBase::eglGetCurrentContextFn(void) {
+  return driver_->fn.eglGetCurrentContextFn();
+}
+
+EGLDisplay EGLApiBase::eglGetCurrentDisplayFn(void) {
+  return driver_->fn.eglGetCurrentDisplayFn();
+}
+
+EGLSurface EGLApiBase::eglGetCurrentSurfaceFn(EGLint readdraw) {
+  return driver_->fn.eglGetCurrentSurfaceFn(readdraw);
+}
+
+EGLDisplay EGLApiBase::eglGetDisplayFn(EGLNativeDisplayType display_id) {
+  return driver_->fn.eglGetDisplayFn(display_id);
+}
+
+EGLint EGLApiBase::eglGetErrorFn(void) {
+  return driver_->fn.eglGetErrorFn();
+}
+
+EGLDisplay EGLApiBase::eglGetPlatformDisplayEXTFn(EGLenum platform,
+                                                  void* native_display,
+                                                  const EGLint* attrib_list) {
+  return driver_->fn.eglGetPlatformDisplayEXTFn(platform, native_display,
+                                                attrib_list);
+}
+
+__eglMustCastToProperFunctionPointerType EGLApiBase::eglGetProcAddressFn(
+    const char* procname) {
+  return driver_->fn.eglGetProcAddressFn(procname);
+}
+
+EGLBoolean EGLApiBase::eglGetSyncAttribKHRFn(EGLDisplay dpy,
+                                             EGLSyncKHR sync,
+                                             EGLint attribute,
+                                             EGLint* value) {
+  return driver_->fn.eglGetSyncAttribKHRFn(dpy, sync, attribute, value);
+}
+
+EGLBoolean EGLApiBase::eglGetSyncValuesCHROMIUMFn(EGLDisplay dpy,
+                                                  EGLSurface surface,
+                                                  EGLuint64CHROMIUM* ust,
+                                                  EGLuint64CHROMIUM* msc,
+                                                  EGLuint64CHROMIUM* sbc) {
+  return driver_->fn.eglGetSyncValuesCHROMIUMFn(dpy, surface, ust, msc, sbc);
+}
+
+EGLBoolean EGLApiBase::eglInitializeFn(EGLDisplay dpy,
+                                       EGLint* major,
+                                       EGLint* minor) {
+  return driver_->fn.eglInitializeFn(dpy, major, minor);
+}
+
+EGLBoolean EGLApiBase::eglMakeCurrentFn(EGLDisplay dpy,
+                                        EGLSurface draw,
+                                        EGLSurface read,
+                                        EGLContext ctx) {
+  return driver_->fn.eglMakeCurrentFn(dpy, draw, read, ctx);
+}
+
+EGLBoolean EGLApiBase::eglPostSubBufferNVFn(EGLDisplay dpy,
+                                            EGLSurface surface,
+                                            EGLint x,
+                                            EGLint y,
+                                            EGLint width,
+                                            EGLint height) {
+  return driver_->fn.eglPostSubBufferNVFn(dpy, surface, x, y, width, height);
+}
+
+EGLenum EGLApiBase::eglQueryAPIFn(void) {
+  return driver_->fn.eglQueryAPIFn();
+}
+
+EGLBoolean EGLApiBase::eglQueryContextFn(EGLDisplay dpy,
+                                         EGLContext ctx,
+                                         EGLint attribute,
+                                         EGLint* value) {
+  return driver_->fn.eglQueryContextFn(dpy, ctx, attribute, value);
+}
+
+const char* EGLApiBase::eglQueryStringFn(EGLDisplay dpy, EGLint name) {
+  return driver_->fn.eglQueryStringFn(dpy, name);
+}
+
+EGLBoolean EGLApiBase::eglQuerySurfaceFn(EGLDisplay dpy,
+                                         EGLSurface surface,
+                                         EGLint attribute,
+                                         EGLint* value) {
+  return driver_->fn.eglQuerySurfaceFn(dpy, surface, attribute, value);
+}
+
+EGLBoolean EGLApiBase::eglQuerySurfacePointerANGLEFn(EGLDisplay dpy,
+                                                     EGLSurface surface,
+                                                     EGLint attribute,
+                                                     void** value) {
+  return driver_->fn.eglQuerySurfacePointerANGLEFn(dpy, surface, attribute,
+                                                   value);
+}
+
+EGLBoolean EGLApiBase::eglReleaseTexImageFn(EGLDisplay dpy,
+                                            EGLSurface surface,
+                                            EGLint buffer) {
+  return driver_->fn.eglReleaseTexImageFn(dpy, surface, buffer);
+}
+
+EGLBoolean EGLApiBase::eglReleaseThreadFn(void) {
+  return driver_->fn.eglReleaseThreadFn();
+}
+
+EGLBoolean EGLApiBase::eglSurfaceAttribFn(EGLDisplay dpy,
+                                          EGLSurface surface,
+                                          EGLint attribute,
+                                          EGLint value) {
+  return driver_->fn.eglSurfaceAttribFn(dpy, surface, attribute, value);
+}
+
+EGLBoolean EGLApiBase::eglSwapBuffersFn(EGLDisplay dpy, EGLSurface surface) {
+  return driver_->fn.eglSwapBuffersFn(dpy, surface);
+}
+
+EGLBoolean EGLApiBase::eglSwapIntervalFn(EGLDisplay dpy, EGLint interval) {
+  return driver_->fn.eglSwapIntervalFn(dpy, interval);
+}
+
+EGLBoolean EGLApiBase::eglTerminateFn(EGLDisplay dpy) {
+  return driver_->fn.eglTerminateFn(dpy);
+}
+
+EGLBoolean EGLApiBase::eglWaitClientFn(void) {
+  return driver_->fn.eglWaitClientFn();
+}
+
+EGLBoolean EGLApiBase::eglWaitGLFn(void) {
+  return driver_->fn.eglWaitGLFn();
+}
+
+EGLBoolean EGLApiBase::eglWaitNativeFn(EGLint engine) {
+  return driver_->fn.eglWaitNativeFn(engine);
+}
+
+EGLint EGLApiBase::eglWaitSyncKHRFn(EGLDisplay dpy,
+                                    EGLSyncKHR sync,
+                                    EGLint flags) {
+  return driver_->fn.eglWaitSyncKHRFn(dpy, sync, flags);
+}
+
+EGLBoolean TraceEGLApi::eglBindAPIFn(EGLenum api) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglBindAPI")
+  return egl_api_->eglBindAPIFn(api);
+}
+
+EGLBoolean TraceEGLApi::eglBindTexImageFn(EGLDisplay dpy,
+                                          EGLSurface surface,
+                                          EGLint buffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglBindTexImage")
+  return egl_api_->eglBindTexImageFn(dpy, surface, buffer);
+}
+
+EGLBoolean TraceEGLApi::eglChooseConfigFn(EGLDisplay dpy,
+                                          const EGLint* attrib_list,
+                                          EGLConfig* configs,
+                                          EGLint config_size,
+                                          EGLint* num_config) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglChooseConfig")
+  return egl_api_->eglChooseConfigFn(dpy, attrib_list, configs, config_size,
+                                     num_config);
+}
+
+EGLint TraceEGLApi::eglClientWaitSyncKHRFn(EGLDisplay dpy,
+                                           EGLSyncKHR sync,
+                                           EGLint flags,
+                                           EGLTimeKHR timeout) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglClientWaitSyncKHR")
+  return egl_api_->eglClientWaitSyncKHRFn(dpy, sync, flags, timeout);
+}
+
+EGLBoolean TraceEGLApi::eglCopyBuffersFn(EGLDisplay dpy,
+                                         EGLSurface surface,
+                                         EGLNativePixmapType target) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglCopyBuffers")
+  return egl_api_->eglCopyBuffersFn(dpy, surface, target);
+}
+
+EGLContext TraceEGLApi::eglCreateContextFn(EGLDisplay dpy,
+                                           EGLConfig config,
+                                           EGLContext share_context,
+                                           const EGLint* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglCreateContext")
+  return egl_api_->eglCreateContextFn(dpy, config, share_context, attrib_list);
+}
+
+EGLImageKHR TraceEGLApi::eglCreateImageKHRFn(EGLDisplay dpy,
+                                             EGLContext ctx,
+                                             EGLenum target,
+                                             EGLClientBuffer buffer,
+                                             const EGLint* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglCreateImageKHR")
+  return egl_api_->eglCreateImageKHRFn(dpy, ctx, target, buffer, attrib_list);
+}
+
+EGLSurface TraceEGLApi::eglCreatePbufferFromClientBufferFn(
+    EGLDisplay dpy,
+    EGLenum buftype,
+    void* buffer,
+    EGLConfig config,
+    const EGLint* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::eglCreatePbufferFromClientBuffer")
+  return egl_api_->eglCreatePbufferFromClientBufferFn(dpy, buftype, buffer,
+                                                      config, attrib_list);
+}
+
+EGLSurface TraceEGLApi::eglCreatePbufferSurfaceFn(EGLDisplay dpy,
+                                                  EGLConfig config,
+                                                  const EGLint* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglCreatePbufferSurface")
+  return egl_api_->eglCreatePbufferSurfaceFn(dpy, config, attrib_list);
+}
+
+EGLSurface TraceEGLApi::eglCreatePixmapSurfaceFn(EGLDisplay dpy,
+                                                 EGLConfig config,
+                                                 EGLNativePixmapType pixmap,
+                                                 const EGLint* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglCreatePixmapSurface")
+  return egl_api_->eglCreatePixmapSurfaceFn(dpy, config, pixmap, attrib_list);
+}
+
+EGLSyncKHR TraceEGLApi::eglCreateSyncKHRFn(EGLDisplay dpy,
+                                           EGLenum type,
+                                           const EGLint* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglCreateSyncKHR")
+  return egl_api_->eglCreateSyncKHRFn(dpy, type, attrib_list);
+}
+
+EGLSurface TraceEGLApi::eglCreateWindowSurfaceFn(EGLDisplay dpy,
+                                                 EGLConfig config,
+                                                 EGLNativeWindowType win,
+                                                 const EGLint* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglCreateWindowSurface")
+  return egl_api_->eglCreateWindowSurfaceFn(dpy, config, win, attrib_list);
+}
+
+EGLBoolean TraceEGLApi::eglDestroyContextFn(EGLDisplay dpy, EGLContext ctx) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglDestroyContext")
+  return egl_api_->eglDestroyContextFn(dpy, ctx);
+}
+
+EGLBoolean TraceEGLApi::eglDestroyImageKHRFn(EGLDisplay dpy,
+                                             EGLImageKHR image) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglDestroyImageKHR")
+  return egl_api_->eglDestroyImageKHRFn(dpy, image);
+}
+
+EGLBoolean TraceEGLApi::eglDestroySurfaceFn(EGLDisplay dpy,
+                                            EGLSurface surface) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglDestroySurface")
+  return egl_api_->eglDestroySurfaceFn(dpy, surface);
+}
+
+EGLBoolean TraceEGLApi::eglDestroySyncKHRFn(EGLDisplay dpy, EGLSyncKHR sync) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglDestroySyncKHR")
+  return egl_api_->eglDestroySyncKHRFn(dpy, sync);
+}
+
+EGLBoolean TraceEGLApi::eglGetConfigAttribFn(EGLDisplay dpy,
+                                             EGLConfig config,
+                                             EGLint attribute,
+                                             EGLint* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetConfigAttrib")
+  return egl_api_->eglGetConfigAttribFn(dpy, config, attribute, value);
+}
+
+EGLBoolean TraceEGLApi::eglGetConfigsFn(EGLDisplay dpy,
+                                        EGLConfig* configs,
+                                        EGLint config_size,
+                                        EGLint* num_config) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetConfigs")
+  return egl_api_->eglGetConfigsFn(dpy, configs, config_size, num_config);
+}
+
+EGLContext TraceEGLApi::eglGetCurrentContextFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetCurrentContext")
+  return egl_api_->eglGetCurrentContextFn();
+}
+
+EGLDisplay TraceEGLApi::eglGetCurrentDisplayFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetCurrentDisplay")
+  return egl_api_->eglGetCurrentDisplayFn();
+}
+
+EGLSurface TraceEGLApi::eglGetCurrentSurfaceFn(EGLint readdraw) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetCurrentSurface")
+  return egl_api_->eglGetCurrentSurfaceFn(readdraw);
+}
+
+EGLDisplay TraceEGLApi::eglGetDisplayFn(EGLNativeDisplayType display_id) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetDisplay")
+  return egl_api_->eglGetDisplayFn(display_id);
+}
+
+EGLint TraceEGLApi::eglGetErrorFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetError")
+  return egl_api_->eglGetErrorFn();
+}
+
+EGLDisplay TraceEGLApi::eglGetPlatformDisplayEXTFn(EGLenum platform,
+                                                   void* native_display,
+                                                   const EGLint* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetPlatformDisplayEXT")
+  return egl_api_->eglGetPlatformDisplayEXTFn(platform, native_display,
+                                              attrib_list);
+}
+
+__eglMustCastToProperFunctionPointerType TraceEGLApi::eglGetProcAddressFn(
+    const char* procname) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetProcAddress")
+  return egl_api_->eglGetProcAddressFn(procname);
+}
+
+EGLBoolean TraceEGLApi::eglGetSyncAttribKHRFn(EGLDisplay dpy,
+                                              EGLSyncKHR sync,
+                                              EGLint attribute,
+                                              EGLint* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetSyncAttribKHR")
+  return egl_api_->eglGetSyncAttribKHRFn(dpy, sync, attribute, value);
+}
+
+EGLBoolean TraceEGLApi::eglGetSyncValuesCHROMIUMFn(EGLDisplay dpy,
+                                                   EGLSurface surface,
+                                                   EGLuint64CHROMIUM* ust,
+                                                   EGLuint64CHROMIUM* msc,
+                                                   EGLuint64CHROMIUM* sbc) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglGetSyncValuesCHROMIUM")
+  return egl_api_->eglGetSyncValuesCHROMIUMFn(dpy, surface, ust, msc, sbc);
+}
+
+EGLBoolean TraceEGLApi::eglInitializeFn(EGLDisplay dpy,
+                                        EGLint* major,
+                                        EGLint* minor) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglInitialize")
+  return egl_api_->eglInitializeFn(dpy, major, minor);
+}
+
+EGLBoolean TraceEGLApi::eglMakeCurrentFn(EGLDisplay dpy,
+                                         EGLSurface draw,
+                                         EGLSurface read,
+                                         EGLContext ctx) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglMakeCurrent")
+  return egl_api_->eglMakeCurrentFn(dpy, draw, read, ctx);
+}
+
+EGLBoolean TraceEGLApi::eglPostSubBufferNVFn(EGLDisplay dpy,
+                                             EGLSurface surface,
+                                             EGLint x,
+                                             EGLint y,
+                                             EGLint width,
+                                             EGLint height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglPostSubBufferNV")
+  return egl_api_->eglPostSubBufferNVFn(dpy, surface, x, y, width, height);
+}
+
+EGLenum TraceEGLApi::eglQueryAPIFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglQueryAPI")
+  return egl_api_->eglQueryAPIFn();
+}
+
+EGLBoolean TraceEGLApi::eglQueryContextFn(EGLDisplay dpy,
+                                          EGLContext ctx,
+                                          EGLint attribute,
+                                          EGLint* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglQueryContext")
+  return egl_api_->eglQueryContextFn(dpy, ctx, attribute, value);
+}
+
+const char* TraceEGLApi::eglQueryStringFn(EGLDisplay dpy, EGLint name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglQueryString")
+  return egl_api_->eglQueryStringFn(dpy, name);
+}
+
+EGLBoolean TraceEGLApi::eglQuerySurfaceFn(EGLDisplay dpy,
+                                          EGLSurface surface,
+                                          EGLint attribute,
+                                          EGLint* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglQuerySurface")
+  return egl_api_->eglQuerySurfaceFn(dpy, surface, attribute, value);
+}
+
+EGLBoolean TraceEGLApi::eglQuerySurfacePointerANGLEFn(EGLDisplay dpy,
+                                                      EGLSurface surface,
+                                                      EGLint attribute,
+                                                      void** value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::eglQuerySurfacePointerANGLE")
+  return egl_api_->eglQuerySurfacePointerANGLEFn(dpy, surface, attribute,
+                                                 value);
+}
+
+EGLBoolean TraceEGLApi::eglReleaseTexImageFn(EGLDisplay dpy,
+                                             EGLSurface surface,
+                                             EGLint buffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglReleaseTexImage")
+  return egl_api_->eglReleaseTexImageFn(dpy, surface, buffer);
+}
+
+EGLBoolean TraceEGLApi::eglReleaseThreadFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglReleaseThread")
+  return egl_api_->eglReleaseThreadFn();
+}
+
+EGLBoolean TraceEGLApi::eglSurfaceAttribFn(EGLDisplay dpy,
+                                           EGLSurface surface,
+                                           EGLint attribute,
+                                           EGLint value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglSurfaceAttrib")
+  return egl_api_->eglSurfaceAttribFn(dpy, surface, attribute, value);
+}
+
+EGLBoolean TraceEGLApi::eglSwapBuffersFn(EGLDisplay dpy, EGLSurface surface) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglSwapBuffers")
+  return egl_api_->eglSwapBuffersFn(dpy, surface);
+}
+
+EGLBoolean TraceEGLApi::eglSwapIntervalFn(EGLDisplay dpy, EGLint interval) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglSwapInterval")
+  return egl_api_->eglSwapIntervalFn(dpy, interval);
+}
+
+EGLBoolean TraceEGLApi::eglTerminateFn(EGLDisplay dpy) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglTerminate")
+  return egl_api_->eglTerminateFn(dpy);
+}
+
+EGLBoolean TraceEGLApi::eglWaitClientFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglWaitClient")
+  return egl_api_->eglWaitClientFn();
+}
+
+EGLBoolean TraceEGLApi::eglWaitGLFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglWaitGL")
+  return egl_api_->eglWaitGLFn();
+}
+
+EGLBoolean TraceEGLApi::eglWaitNativeFn(EGLint engine) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglWaitNative")
+  return egl_api_->eglWaitNativeFn(engine);
+}
+
+EGLint TraceEGLApi::eglWaitSyncKHRFn(EGLDisplay dpy,
+                                     EGLSyncKHR sync,
+                                     EGLint flags) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::eglWaitSyncKHR")
+  return egl_api_->eglWaitSyncKHRFn(dpy, sync, flags);
+}
+
+}  // namespace gfx
diff --git a/ui/gl/gl_bindings_autogen_egl.h b/ui/gl/gl_bindings_autogen_egl.h
new file mode 100644
index 0000000..a49935e
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_egl.h
@@ -0,0 +1,407 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
+#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
+
+namespace gfx {
+
+class GLContext;
+
+typedef EGLBoolean(GL_BINDING_CALL* eglBindAPIProc)(EGLenum api);
+typedef EGLBoolean(GL_BINDING_CALL* eglBindTexImageProc)(EGLDisplay dpy,
+                                                         EGLSurface surface,
+                                                         EGLint buffer);
+typedef EGLBoolean(GL_BINDING_CALL* eglChooseConfigProc)(
+    EGLDisplay dpy,
+    const EGLint* attrib_list,
+    EGLConfig* configs,
+    EGLint config_size,
+    EGLint* num_config);
+typedef EGLint(GL_BINDING_CALL* eglClientWaitSyncKHRProc)(EGLDisplay dpy,
+                                                          EGLSyncKHR sync,
+                                                          EGLint flags,
+                                                          EGLTimeKHR timeout);
+typedef EGLBoolean(GL_BINDING_CALL* eglCopyBuffersProc)(
+    EGLDisplay dpy,
+    EGLSurface surface,
+    EGLNativePixmapType target);
+typedef EGLContext(GL_BINDING_CALL* eglCreateContextProc)(
+    EGLDisplay dpy,
+    EGLConfig config,
+    EGLContext share_context,
+    const EGLint* attrib_list);
+typedef EGLImageKHR(GL_BINDING_CALL* eglCreateImageKHRProc)(
+    EGLDisplay dpy,
+    EGLContext ctx,
+    EGLenum target,
+    EGLClientBuffer buffer,
+    const EGLint* attrib_list);
+typedef EGLSurface(GL_BINDING_CALL* eglCreatePbufferFromClientBufferProc)(
+    EGLDisplay dpy,
+    EGLenum buftype,
+    void* buffer,
+    EGLConfig config,
+    const EGLint* attrib_list);
+typedef EGLSurface(GL_BINDING_CALL* eglCreatePbufferSurfaceProc)(
+    EGLDisplay dpy,
+    EGLConfig config,
+    const EGLint* attrib_list);
+typedef EGLSurface(GL_BINDING_CALL* eglCreatePixmapSurfaceProc)(
+    EGLDisplay dpy,
+    EGLConfig config,
+    EGLNativePixmapType pixmap,
+    const EGLint* attrib_list);
+typedef EGLSyncKHR(GL_BINDING_CALL* eglCreateSyncKHRProc)(
+    EGLDisplay dpy,
+    EGLenum type,
+    const EGLint* attrib_list);
+typedef EGLSurface(GL_BINDING_CALL* eglCreateWindowSurfaceProc)(
+    EGLDisplay dpy,
+    EGLConfig config,
+    EGLNativeWindowType win,
+    const EGLint* attrib_list);
+typedef EGLBoolean(GL_BINDING_CALL* eglDestroyContextProc)(EGLDisplay dpy,
+                                                           EGLContext ctx);
+typedef EGLBoolean(GL_BINDING_CALL* eglDestroyImageKHRProc)(EGLDisplay dpy,
+                                                            EGLImageKHR image);
+typedef EGLBoolean(GL_BINDING_CALL* eglDestroySurfaceProc)(EGLDisplay dpy,
+                                                           EGLSurface surface);
+typedef EGLBoolean(GL_BINDING_CALL* eglDestroySyncKHRProc)(EGLDisplay dpy,
+                                                           EGLSyncKHR sync);
+typedef EGLBoolean(GL_BINDING_CALL* eglGetConfigAttribProc)(EGLDisplay dpy,
+                                                            EGLConfig config,
+                                                            EGLint attribute,
+                                                            EGLint* value);
+typedef EGLBoolean(GL_BINDING_CALL* eglGetConfigsProc)(EGLDisplay dpy,
+                                                       EGLConfig* configs,
+                                                       EGLint config_size,
+                                                       EGLint* num_config);
+typedef EGLContext(GL_BINDING_CALL* eglGetCurrentContextProc)(void);
+typedef EGLDisplay(GL_BINDING_CALL* eglGetCurrentDisplayProc)(void);
+typedef EGLSurface(GL_BINDING_CALL* eglGetCurrentSurfaceProc)(EGLint readdraw);
+typedef EGLDisplay(GL_BINDING_CALL* eglGetDisplayProc)(
+    EGLNativeDisplayType display_id);
+typedef EGLint(GL_BINDING_CALL* eglGetErrorProc)(void);
+typedef EGLDisplay(GL_BINDING_CALL* eglGetPlatformDisplayEXTProc)(
+    EGLenum platform,
+    void* native_display,
+    const EGLint* attrib_list);
+typedef __eglMustCastToProperFunctionPointerType(
+    GL_BINDING_CALL* eglGetProcAddressProc)(const char* procname);
+typedef EGLBoolean(GL_BINDING_CALL* eglGetSyncAttribKHRProc)(EGLDisplay dpy,
+                                                             EGLSyncKHR sync,
+                                                             EGLint attribute,
+                                                             EGLint* value);
+typedef EGLBoolean(GL_BINDING_CALL* eglGetSyncValuesCHROMIUMProc)(
+    EGLDisplay dpy,
+    EGLSurface surface,
+    EGLuint64CHROMIUM* ust,
+    EGLuint64CHROMIUM* msc,
+    EGLuint64CHROMIUM* sbc);
+typedef EGLBoolean(GL_BINDING_CALL* eglInitializeProc)(EGLDisplay dpy,
+                                                       EGLint* major,
+                                                       EGLint* minor);
+typedef EGLBoolean(GL_BINDING_CALL* eglMakeCurrentProc)(EGLDisplay dpy,
+                                                        EGLSurface draw,
+                                                        EGLSurface read,
+                                                        EGLContext ctx);
+typedef EGLBoolean(GL_BINDING_CALL* eglPostSubBufferNVProc)(EGLDisplay dpy,
+                                                            EGLSurface surface,
+                                                            EGLint x,
+                                                            EGLint y,
+                                                            EGLint width,
+                                                            EGLint height);
+typedef EGLenum(GL_BINDING_CALL* eglQueryAPIProc)(void);
+typedef EGLBoolean(GL_BINDING_CALL* eglQueryContextProc)(EGLDisplay dpy,
+                                                         EGLContext ctx,
+                                                         EGLint attribute,
+                                                         EGLint* value);
+typedef const char*(GL_BINDING_CALL* eglQueryStringProc)(EGLDisplay dpy,
+                                                         EGLint name);
+typedef EGLBoolean(GL_BINDING_CALL* eglQuerySurfaceProc)(EGLDisplay dpy,
+                                                         EGLSurface surface,
+                                                         EGLint attribute,
+                                                         EGLint* value);
+typedef EGLBoolean(GL_BINDING_CALL* eglQuerySurfacePointerANGLEProc)(
+    EGLDisplay dpy,
+    EGLSurface surface,
+    EGLint attribute,
+    void** value);
+typedef EGLBoolean(GL_BINDING_CALL* eglReleaseTexImageProc)(EGLDisplay dpy,
+                                                            EGLSurface surface,
+                                                            EGLint buffer);
+typedef EGLBoolean(GL_BINDING_CALL* eglReleaseThreadProc)(void);
+typedef EGLBoolean(GL_BINDING_CALL* eglSurfaceAttribProc)(EGLDisplay dpy,
+                                                          EGLSurface surface,
+                                                          EGLint attribute,
+                                                          EGLint value);
+typedef EGLBoolean(GL_BINDING_CALL* eglSwapBuffersProc)(EGLDisplay dpy,
+                                                        EGLSurface surface);
+typedef EGLBoolean(GL_BINDING_CALL* eglSwapIntervalProc)(EGLDisplay dpy,
+                                                         EGLint interval);
+typedef EGLBoolean(GL_BINDING_CALL* eglTerminateProc)(EGLDisplay dpy);
+typedef EGLBoolean(GL_BINDING_CALL* eglWaitClientProc)(void);
+typedef EGLBoolean(GL_BINDING_CALL* eglWaitGLProc)(void);
+typedef EGLBoolean(GL_BINDING_CALL* eglWaitNativeProc)(EGLint engine);
+typedef EGLint(GL_BINDING_CALL* eglWaitSyncKHRProc)(EGLDisplay dpy,
+                                                    EGLSyncKHR sync,
+                                                    EGLint flags);
+
+struct ExtensionsEGL {
+  bool b_EGL_ANGLE_d3d_share_handle_client_buffer;
+  bool b_EGL_ANGLE_platform_angle;
+  bool b_EGL_ANGLE_query_surface_pointer;
+  bool b_EGL_ANGLE_surface_d3d_texture_2d_share_handle;
+  bool b_EGL_CHROMIUM_sync_control;
+  bool b_EGL_KHR_fence_sync;
+  bool b_EGL_KHR_gl_texture_2D_image;
+  bool b_EGL_KHR_image_base;
+  bool b_EGL_KHR_wait_sync;
+  bool b_EGL_NV_post_sub_buffer;
+};
+
+struct ProcsEGL {
+  eglBindAPIProc eglBindAPIFn;
+  eglBindTexImageProc eglBindTexImageFn;
+  eglChooseConfigProc eglChooseConfigFn;
+  eglClientWaitSyncKHRProc eglClientWaitSyncKHRFn;
+  eglCopyBuffersProc eglCopyBuffersFn;
+  eglCreateContextProc eglCreateContextFn;
+  eglCreateImageKHRProc eglCreateImageKHRFn;
+  eglCreatePbufferFromClientBufferProc eglCreatePbufferFromClientBufferFn;
+  eglCreatePbufferSurfaceProc eglCreatePbufferSurfaceFn;
+  eglCreatePixmapSurfaceProc eglCreatePixmapSurfaceFn;
+  eglCreateSyncKHRProc eglCreateSyncKHRFn;
+  eglCreateWindowSurfaceProc eglCreateWindowSurfaceFn;
+  eglDestroyContextProc eglDestroyContextFn;
+  eglDestroyImageKHRProc eglDestroyImageKHRFn;
+  eglDestroySurfaceProc eglDestroySurfaceFn;
+  eglDestroySyncKHRProc eglDestroySyncKHRFn;
+  eglGetConfigAttribProc eglGetConfigAttribFn;
+  eglGetConfigsProc eglGetConfigsFn;
+  eglGetCurrentContextProc eglGetCurrentContextFn;
+  eglGetCurrentDisplayProc eglGetCurrentDisplayFn;
+  eglGetCurrentSurfaceProc eglGetCurrentSurfaceFn;
+  eglGetDisplayProc eglGetDisplayFn;
+  eglGetErrorProc eglGetErrorFn;
+  eglGetPlatformDisplayEXTProc eglGetPlatformDisplayEXTFn;
+  eglGetProcAddressProc eglGetProcAddressFn;
+  eglGetSyncAttribKHRProc eglGetSyncAttribKHRFn;
+  eglGetSyncValuesCHROMIUMProc eglGetSyncValuesCHROMIUMFn;
+  eglInitializeProc eglInitializeFn;
+  eglMakeCurrentProc eglMakeCurrentFn;
+  eglPostSubBufferNVProc eglPostSubBufferNVFn;
+  eglQueryAPIProc eglQueryAPIFn;
+  eglQueryContextProc eglQueryContextFn;
+  eglQueryStringProc eglQueryStringFn;
+  eglQuerySurfaceProc eglQuerySurfaceFn;
+  eglQuerySurfacePointerANGLEProc eglQuerySurfacePointerANGLEFn;
+  eglReleaseTexImageProc eglReleaseTexImageFn;
+  eglReleaseThreadProc eglReleaseThreadFn;
+  eglSurfaceAttribProc eglSurfaceAttribFn;
+  eglSwapBuffersProc eglSwapBuffersFn;
+  eglSwapIntervalProc eglSwapIntervalFn;
+  eglTerminateProc eglTerminateFn;
+  eglWaitClientProc eglWaitClientFn;
+  eglWaitGLProc eglWaitGLFn;
+  eglWaitNativeProc eglWaitNativeFn;
+  eglWaitSyncKHRProc eglWaitSyncKHRFn;
+};
+
+class GL_EXPORT EGLApi {
+ public:
+  EGLApi();
+  virtual ~EGLApi();
+
+  virtual EGLBoolean eglBindAPIFn(EGLenum api) = 0;
+  virtual EGLBoolean eglBindTexImageFn(EGLDisplay dpy,
+                                       EGLSurface surface,
+                                       EGLint buffer) = 0;
+  virtual EGLBoolean eglChooseConfigFn(EGLDisplay dpy,
+                                       const EGLint* attrib_list,
+                                       EGLConfig* configs,
+                                       EGLint config_size,
+                                       EGLint* num_config) = 0;
+  virtual EGLint eglClientWaitSyncKHRFn(EGLDisplay dpy,
+                                        EGLSyncKHR sync,
+                                        EGLint flags,
+                                        EGLTimeKHR timeout) = 0;
+  virtual EGLBoolean eglCopyBuffersFn(EGLDisplay dpy,
+                                      EGLSurface surface,
+                                      EGLNativePixmapType target) = 0;
+  virtual EGLContext eglCreateContextFn(EGLDisplay dpy,
+                                        EGLConfig config,
+                                        EGLContext share_context,
+                                        const EGLint* attrib_list) = 0;
+  virtual EGLImageKHR eglCreateImageKHRFn(EGLDisplay dpy,
+                                          EGLContext ctx,
+                                          EGLenum target,
+                                          EGLClientBuffer buffer,
+                                          const EGLint* attrib_list) = 0;
+  virtual EGLSurface eglCreatePbufferFromClientBufferFn(
+      EGLDisplay dpy,
+      EGLenum buftype,
+      void* buffer,
+      EGLConfig config,
+      const EGLint* attrib_list) = 0;
+  virtual EGLSurface eglCreatePbufferSurfaceFn(EGLDisplay dpy,
+                                               EGLConfig config,
+                                               const EGLint* attrib_list) = 0;
+  virtual EGLSurface eglCreatePixmapSurfaceFn(EGLDisplay dpy,
+                                              EGLConfig config,
+                                              EGLNativePixmapType pixmap,
+                                              const EGLint* attrib_list) = 0;
+  virtual EGLSyncKHR eglCreateSyncKHRFn(EGLDisplay dpy,
+                                        EGLenum type,
+                                        const EGLint* attrib_list) = 0;
+  virtual EGLSurface eglCreateWindowSurfaceFn(EGLDisplay dpy,
+                                              EGLConfig config,
+                                              EGLNativeWindowType win,
+                                              const EGLint* attrib_list) = 0;
+  virtual EGLBoolean eglDestroyContextFn(EGLDisplay dpy, EGLContext ctx) = 0;
+  virtual EGLBoolean eglDestroyImageKHRFn(EGLDisplay dpy,
+                                          EGLImageKHR image) = 0;
+  virtual EGLBoolean eglDestroySurfaceFn(EGLDisplay dpy,
+                                         EGLSurface surface) = 0;
+  virtual EGLBoolean eglDestroySyncKHRFn(EGLDisplay dpy, EGLSyncKHR sync) = 0;
+  virtual EGLBoolean eglGetConfigAttribFn(EGLDisplay dpy,
+                                          EGLConfig config,
+                                          EGLint attribute,
+                                          EGLint* value) = 0;
+  virtual EGLBoolean eglGetConfigsFn(EGLDisplay dpy,
+                                     EGLConfig* configs,
+                                     EGLint config_size,
+                                     EGLint* num_config) = 0;
+  virtual EGLContext eglGetCurrentContextFn(void) = 0;
+  virtual EGLDisplay eglGetCurrentDisplayFn(void) = 0;
+  virtual EGLSurface eglGetCurrentSurfaceFn(EGLint readdraw) = 0;
+  virtual EGLDisplay eglGetDisplayFn(EGLNativeDisplayType display_id) = 0;
+  virtual EGLint eglGetErrorFn(void) = 0;
+  virtual EGLDisplay eglGetPlatformDisplayEXTFn(EGLenum platform,
+                                                void* native_display,
+                                                const EGLint* attrib_list) = 0;
+  virtual __eglMustCastToProperFunctionPointerType eglGetProcAddressFn(
+      const char* procname) = 0;
+  virtual EGLBoolean eglGetSyncAttribKHRFn(EGLDisplay dpy,
+                                           EGLSyncKHR sync,
+                                           EGLint attribute,
+                                           EGLint* value) = 0;
+  virtual EGLBoolean eglGetSyncValuesCHROMIUMFn(EGLDisplay dpy,
+                                                EGLSurface surface,
+                                                EGLuint64CHROMIUM* ust,
+                                                EGLuint64CHROMIUM* msc,
+                                                EGLuint64CHROMIUM* sbc) = 0;
+  virtual EGLBoolean eglInitializeFn(EGLDisplay dpy,
+                                     EGLint* major,
+                                     EGLint* minor) = 0;
+  virtual EGLBoolean eglMakeCurrentFn(EGLDisplay dpy,
+                                      EGLSurface draw,
+                                      EGLSurface read,
+                                      EGLContext ctx) = 0;
+  virtual EGLBoolean eglPostSubBufferNVFn(EGLDisplay dpy,
+                                          EGLSurface surface,
+                                          EGLint x,
+                                          EGLint y,
+                                          EGLint width,
+                                          EGLint height) = 0;
+  virtual EGLenum eglQueryAPIFn(void) = 0;
+  virtual EGLBoolean eglQueryContextFn(EGLDisplay dpy,
+                                       EGLContext ctx,
+                                       EGLint attribute,
+                                       EGLint* value) = 0;
+  virtual const char* eglQueryStringFn(EGLDisplay dpy, EGLint name) = 0;
+  virtual EGLBoolean eglQuerySurfaceFn(EGLDisplay dpy,
+                                       EGLSurface surface,
+                                       EGLint attribute,
+                                       EGLint* value) = 0;
+  virtual EGLBoolean eglQuerySurfacePointerANGLEFn(EGLDisplay dpy,
+                                                   EGLSurface surface,
+                                                   EGLint attribute,
+                                                   void** value) = 0;
+  virtual EGLBoolean eglReleaseTexImageFn(EGLDisplay dpy,
+                                          EGLSurface surface,
+                                          EGLint buffer) = 0;
+  virtual EGLBoolean eglReleaseThreadFn(void) = 0;
+  virtual EGLBoolean eglSurfaceAttribFn(EGLDisplay dpy,
+                                        EGLSurface surface,
+                                        EGLint attribute,
+                                        EGLint value) = 0;
+  virtual EGLBoolean eglSwapBuffersFn(EGLDisplay dpy, EGLSurface surface) = 0;
+  virtual EGLBoolean eglSwapIntervalFn(EGLDisplay dpy, EGLint interval) = 0;
+  virtual EGLBoolean eglTerminateFn(EGLDisplay dpy) = 0;
+  virtual EGLBoolean eglWaitClientFn(void) = 0;
+  virtual EGLBoolean eglWaitGLFn(void) = 0;
+  virtual EGLBoolean eglWaitNativeFn(EGLint engine) = 0;
+  virtual EGLint eglWaitSyncKHRFn(EGLDisplay dpy,
+                                  EGLSyncKHR sync,
+                                  EGLint flags) = 0;
+};
+
+}  // namespace gfx
+
+#define eglBindAPI ::gfx::g_current_egl_context->eglBindAPIFn
+#define eglBindTexImage ::gfx::g_current_egl_context->eglBindTexImageFn
+#define eglChooseConfig ::gfx::g_current_egl_context->eglChooseConfigFn
+#define eglClientWaitSyncKHR \
+  ::gfx::g_current_egl_context->eglClientWaitSyncKHRFn
+#define eglCopyBuffers ::gfx::g_current_egl_context->eglCopyBuffersFn
+#define eglCreateContext ::gfx::g_current_egl_context->eglCreateContextFn
+#define eglCreateImageKHR ::gfx::g_current_egl_context->eglCreateImageKHRFn
+#define eglCreatePbufferFromClientBuffer \
+  ::gfx::g_current_egl_context->eglCreatePbufferFromClientBufferFn
+#define eglCreatePbufferSurface \
+  ::gfx::g_current_egl_context->eglCreatePbufferSurfaceFn
+#define eglCreatePixmapSurface \
+  ::gfx::g_current_egl_context->eglCreatePixmapSurfaceFn
+#define eglCreateSyncKHR ::gfx::g_current_egl_context->eglCreateSyncKHRFn
+#define eglCreateWindowSurface \
+  ::gfx::g_current_egl_context->eglCreateWindowSurfaceFn
+#define eglDestroyContext ::gfx::g_current_egl_context->eglDestroyContextFn
+#define eglDestroyImageKHR ::gfx::g_current_egl_context->eglDestroyImageKHRFn
+#define eglDestroySurface ::gfx::g_current_egl_context->eglDestroySurfaceFn
+#define eglDestroySyncKHR ::gfx::g_current_egl_context->eglDestroySyncKHRFn
+#define eglGetConfigAttrib ::gfx::g_current_egl_context->eglGetConfigAttribFn
+#define eglGetConfigs ::gfx::g_current_egl_context->eglGetConfigsFn
+#define eglGetCurrentContext \
+  ::gfx::g_current_egl_context->eglGetCurrentContextFn
+#define eglGetCurrentDisplay \
+  ::gfx::g_current_egl_context->eglGetCurrentDisplayFn
+#define eglGetCurrentSurface \
+  ::gfx::g_current_egl_context->eglGetCurrentSurfaceFn
+#define eglGetDisplay ::gfx::g_current_egl_context->eglGetDisplayFn
+#define eglGetError ::gfx::g_current_egl_context->eglGetErrorFn
+#define eglGetPlatformDisplayEXT \
+  ::gfx::g_current_egl_context->eglGetPlatformDisplayEXTFn
+#define eglGetProcAddress ::gfx::g_current_egl_context->eglGetProcAddressFn
+#define eglGetSyncAttribKHR ::gfx::g_current_egl_context->eglGetSyncAttribKHRFn
+#define eglGetSyncValuesCHROMIUM \
+  ::gfx::g_current_egl_context->eglGetSyncValuesCHROMIUMFn
+#define eglInitialize ::gfx::g_current_egl_context->eglInitializeFn
+#define eglMakeCurrent ::gfx::g_current_egl_context->eglMakeCurrentFn
+#define eglPostSubBufferNV ::gfx::g_current_egl_context->eglPostSubBufferNVFn
+#define eglQueryAPI ::gfx::g_current_egl_context->eglQueryAPIFn
+#define eglQueryContext ::gfx::g_current_egl_context->eglQueryContextFn
+#define eglQueryString ::gfx::g_current_egl_context->eglQueryStringFn
+#define eglQuerySurface ::gfx::g_current_egl_context->eglQuerySurfaceFn
+#define eglQuerySurfacePointerANGLE \
+  ::gfx::g_current_egl_context->eglQuerySurfacePointerANGLEFn
+#define eglReleaseTexImage ::gfx::g_current_egl_context->eglReleaseTexImageFn
+#define eglReleaseThread ::gfx::g_current_egl_context->eglReleaseThreadFn
+#define eglSurfaceAttrib ::gfx::g_current_egl_context->eglSurfaceAttribFn
+#define eglSwapBuffers ::gfx::g_current_egl_context->eglSwapBuffersFn
+#define eglSwapInterval ::gfx::g_current_egl_context->eglSwapIntervalFn
+#define eglTerminate ::gfx::g_current_egl_context->eglTerminateFn
+#define eglWaitClient ::gfx::g_current_egl_context->eglWaitClientFn
+#define eglWaitGL ::gfx::g_current_egl_context->eglWaitGLFn
+#define eglWaitNative ::gfx::g_current_egl_context->eglWaitNativeFn
+#define eglWaitSyncKHR ::gfx::g_current_egl_context->eglWaitSyncKHRFn
+
+#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
diff --git a/ui/gl/gl_bindings_autogen_gl.cc b/ui/gl/gl_bindings_autogen_gl.cc
new file mode 100644
index 0000000..435758d
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_gl.cc
@@ -0,0 +1,11338 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#include <string>
+
+#include "base/debug/trace_event.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_enums.h"
+#include "ui/gl/gl_gl_api_implementation.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_version_info.h"
+
+namespace gfx {
+
+static bool g_debugBindingsInitialized;
+DriverGL g_driver_gl;
+
+void glBeginQueryARBNotBound(GLenum target, GLuint id) {
+  NOTREACHED();
+}
+void glBindFramebufferEXTNotBound(GLenum target, GLuint framebuffer) {
+  NOTREACHED();
+}
+void glBindRenderbufferEXTNotBound(GLenum target, GLuint renderbuffer) {
+  NOTREACHED();
+}
+void glBindVertexArrayOESNotBound(GLuint array) {
+  NOTREACHED();
+}
+void glBlendBarrierKHRNotBound(void) {
+  NOTREACHED();
+}
+void glBlitFramebufferANGLENotBound(GLint srcX0,
+                                    GLint srcY0,
+                                    GLint srcX1,
+                                    GLint srcY1,
+                                    GLint dstX0,
+                                    GLint dstY0,
+                                    GLint dstX1,
+                                    GLint dstY1,
+                                    GLbitfield mask,
+                                    GLenum filter) {
+  NOTREACHED();
+}
+void glBlitFramebufferEXTNotBound(GLint srcX0,
+                                  GLint srcY0,
+                                  GLint srcX1,
+                                  GLint srcY1,
+                                  GLint dstX0,
+                                  GLint dstY0,
+                                  GLint dstX1,
+                                  GLint dstY1,
+                                  GLbitfield mask,
+                                  GLenum filter) {
+  NOTREACHED();
+}
+GLenum glCheckFramebufferStatusEXTNotBound(GLenum target) {
+  NOTREACHED();
+  return 0;
+}
+void glDeleteBuffersARBNotBound(GLsizei n, const GLuint* buffers) {
+  NOTREACHED();
+}
+void glDeleteFramebuffersEXTNotBound(GLsizei n, const GLuint* framebuffers) {
+  NOTREACHED();
+}
+void glDeleteQueriesARBNotBound(GLsizei n, const GLuint* ids) {
+  NOTREACHED();
+}
+void glDeleteRenderbuffersEXTNotBound(GLsizei n, const GLuint* renderbuffers) {
+  NOTREACHED();
+}
+void glDeleteVertexArraysOESNotBound(GLsizei n, const GLuint* arrays) {
+  NOTREACHED();
+}
+void glDrawArraysInstancedANGLENotBound(GLenum mode,
+                                        GLint first,
+                                        GLsizei count,
+                                        GLsizei primcount) {
+  NOTREACHED();
+}
+void glDrawBuffersARBNotBound(GLsizei n, const GLenum* bufs) {
+  NOTREACHED();
+}
+void glDrawElementsInstancedANGLENotBound(GLenum mode,
+                                          GLsizei count,
+                                          GLenum type,
+                                          const void* indices,
+                                          GLsizei primcount) {
+  NOTREACHED();
+}
+void glEndQueryARBNotBound(GLenum target) {
+  NOTREACHED();
+}
+void glFramebufferRenderbufferEXTNotBound(GLenum target,
+                                          GLenum attachment,
+                                          GLenum renderbuffertarget,
+                                          GLuint renderbuffer) {
+  NOTREACHED();
+}
+void glFramebufferTexture2DEXTNotBound(GLenum target,
+                                       GLenum attachment,
+                                       GLenum textarget,
+                                       GLuint texture,
+                                       GLint level) {
+  NOTREACHED();
+}
+void glGenBuffersARBNotBound(GLsizei n, GLuint* buffers) {
+  NOTREACHED();
+}
+void glGenerateMipmapEXTNotBound(GLenum target) {
+  NOTREACHED();
+}
+void glGenFramebuffersEXTNotBound(GLsizei n, GLuint* framebuffers) {
+  NOTREACHED();
+}
+void glGenQueriesARBNotBound(GLsizei n, GLuint* ids) {
+  NOTREACHED();
+}
+void glGenRenderbuffersEXTNotBound(GLsizei n, GLuint* renderbuffers) {
+  NOTREACHED();
+}
+void glGenVertexArraysOESNotBound(GLsizei n, GLuint* arrays) {
+  NOTREACHED();
+}
+void glGetFramebufferAttachmentParameterivEXTNotBound(GLenum target,
+                                                      GLenum attachment,
+                                                      GLenum pname,
+                                                      GLint* params) {
+  NOTREACHED();
+}
+GLenum glGetGraphicsResetStatusARBNotBound(void) {
+  NOTREACHED();
+  return 0;
+}
+void glGetProgramBinaryNotBound(GLuint program,
+                                GLsizei bufSize,
+                                GLsizei* length,
+                                GLenum* binaryFormat,
+                                GLvoid* binary) {
+  NOTREACHED();
+}
+void glGetQueryivARBNotBound(GLenum target, GLenum pname, GLint* params) {
+  NOTREACHED();
+}
+void glGetQueryObjectivARBNotBound(GLuint id, GLenum pname, GLint* params) {
+  NOTREACHED();
+}
+void glGetQueryObjectui64vNotBound(GLuint id, GLenum pname, GLuint64* params) {
+  NOTREACHED();
+}
+void glGetQueryObjectuivARBNotBound(GLuint id, GLenum pname, GLuint* params) {
+  NOTREACHED();
+}
+void glGetRenderbufferParameterivEXTNotBound(GLenum target,
+                                             GLenum pname,
+                                             GLint* params) {
+  NOTREACHED();
+}
+GLboolean glIsFramebufferEXTNotBound(GLuint framebuffer) {
+  NOTREACHED();
+  return 0;
+}
+GLboolean glIsQueryARBNotBound(GLuint query) {
+  NOTREACHED();
+  return 0;
+}
+GLboolean glIsRenderbufferEXTNotBound(GLuint renderbuffer) {
+  NOTREACHED();
+  return 0;
+}
+GLboolean glIsVertexArrayOESNotBound(GLuint array) {
+  NOTREACHED();
+  return 0;
+}
+void* glMapBufferNotBound(GLenum target, GLenum access) {
+  NOTREACHED();
+  return 0;
+}
+void* glMapBufferRangeNotBound(GLenum target,
+                               GLintptr offset,
+                               GLsizeiptr length,
+                               GLbitfield access) {
+  NOTREACHED();
+  return 0;
+}
+void glProgramBinaryNotBound(GLuint program,
+                             GLenum binaryFormat,
+                             const GLvoid* binary,
+                             GLsizei length) {
+  NOTREACHED();
+}
+void glQueryCounterNotBound(GLuint id, GLenum target) {
+  NOTREACHED();
+}
+void glRenderbufferStorageEXTNotBound(GLenum target,
+                                      GLenum internalformat,
+                                      GLsizei width,
+                                      GLsizei height) {
+  NOTREACHED();
+}
+void glRenderbufferStorageMultisampleANGLENotBound(GLenum target,
+                                                   GLsizei samples,
+                                                   GLenum internalformat,
+                                                   GLsizei width,
+                                                   GLsizei height) {
+  NOTREACHED();
+}
+void glRenderbufferStorageMultisampleEXTNotBound(GLenum target,
+                                                 GLsizei samples,
+                                                 GLenum internalformat,
+                                                 GLsizei width,
+                                                 GLsizei height) {
+  NOTREACHED();
+}
+void glTexStorage2DEXTNotBound(GLenum target,
+                               GLsizei levels,
+                               GLenum internalformat,
+                               GLsizei width,
+                               GLsizei height) {
+  NOTREACHED();
+}
+GLboolean glUnmapBufferNotBound(GLenum target) {
+  NOTREACHED();
+  return 0;
+}
+void glVertexAttribDivisorANGLENotBound(GLuint index, GLuint divisor) {
+  NOTREACHED();
+}
+
+void DriverGL::InitializeStaticBindings() {
+  fn.glActiveTextureFn = reinterpret_cast<glActiveTextureProc>(
+      GetGLProcAddress("glActiveTexture"));
+  fn.glAttachShaderFn =
+      reinterpret_cast<glAttachShaderProc>(GetGLProcAddress("glAttachShader"));
+  fn.glBeginQueryFn =
+      reinterpret_cast<glBeginQueryProc>(GetGLProcAddress("glBeginQuery"));
+  fn.glBeginQueryARBFn =
+      reinterpret_cast<glBeginQueryARBProc>(glBeginQueryARBNotBound);
+  fn.glBeginTransformFeedbackFn =
+      reinterpret_cast<glBeginTransformFeedbackProc>(
+          GetGLProcAddress("glBeginTransformFeedback"));
+  fn.glBindAttribLocationFn = reinterpret_cast<glBindAttribLocationProc>(
+      GetGLProcAddress("glBindAttribLocation"));
+  fn.glBindBufferFn =
+      reinterpret_cast<glBindBufferProc>(GetGLProcAddress("glBindBuffer"));
+  fn.glBindBufferBaseFn = reinterpret_cast<glBindBufferBaseProc>(
+      GetGLProcAddress("glBindBufferBase"));
+  fn.glBindBufferRangeFn = reinterpret_cast<glBindBufferRangeProc>(
+      GetGLProcAddress("glBindBufferRange"));
+  fn.glBindFragDataLocationFn = reinterpret_cast<glBindFragDataLocationProc>(
+      GetGLProcAddress("glBindFragDataLocation"));
+  fn.glBindFragDataLocationIndexedFn =
+      reinterpret_cast<glBindFragDataLocationIndexedProc>(
+          GetGLProcAddress("glBindFragDataLocationIndexed"));
+  fn.glBindFramebufferEXTFn =
+      reinterpret_cast<glBindFramebufferEXTProc>(glBindFramebufferEXTNotBound);
+  fn.glBindRenderbufferEXTFn = reinterpret_cast<glBindRenderbufferEXTProc>(
+      glBindRenderbufferEXTNotBound);
+  fn.glBindSamplerFn =
+      reinterpret_cast<glBindSamplerProc>(GetGLProcAddress("glBindSampler"));
+  fn.glBindTextureFn =
+      reinterpret_cast<glBindTextureProc>(GetGLProcAddress("glBindTexture"));
+  fn.glBindTransformFeedbackFn = reinterpret_cast<glBindTransformFeedbackProc>(
+      GetGLProcAddress("glBindTransformFeedback"));
+  fn.glBindVertexArrayOESFn =
+      reinterpret_cast<glBindVertexArrayOESProc>(glBindVertexArrayOESNotBound);
+  fn.glBlendBarrierKHRFn =
+      reinterpret_cast<glBlendBarrierKHRProc>(glBlendBarrierKHRNotBound);
+  fn.glBlendColorFn =
+      reinterpret_cast<glBlendColorProc>(GetGLProcAddress("glBlendColor"));
+  fn.glBlendEquationFn = reinterpret_cast<glBlendEquationProc>(
+      GetGLProcAddress("glBlendEquation"));
+  fn.glBlendEquationSeparateFn = reinterpret_cast<glBlendEquationSeparateProc>(
+      GetGLProcAddress("glBlendEquationSeparate"));
+  fn.glBlendFuncFn =
+      reinterpret_cast<glBlendFuncProc>(GetGLProcAddress("glBlendFunc"));
+  fn.glBlendFuncSeparateFn = reinterpret_cast<glBlendFuncSeparateProc>(
+      GetGLProcAddress("glBlendFuncSeparate"));
+  fn.glBlitFramebufferFn = reinterpret_cast<glBlitFramebufferProc>(
+      GetGLProcAddress("glBlitFramebuffer"));
+  fn.glBlitFramebufferANGLEFn = reinterpret_cast<glBlitFramebufferANGLEProc>(
+      glBlitFramebufferANGLENotBound);
+  fn.glBlitFramebufferEXTFn =
+      reinterpret_cast<glBlitFramebufferEXTProc>(glBlitFramebufferEXTNotBound);
+  fn.glBufferDataFn =
+      reinterpret_cast<glBufferDataProc>(GetGLProcAddress("glBufferData"));
+  fn.glBufferSubDataFn = reinterpret_cast<glBufferSubDataProc>(
+      GetGLProcAddress("glBufferSubData"));
+  fn.glCheckFramebufferStatusEXTFn =
+      reinterpret_cast<glCheckFramebufferStatusEXTProc>(
+          glCheckFramebufferStatusEXTNotBound);
+  fn.glClearFn = reinterpret_cast<glClearProc>(GetGLProcAddress("glClear"));
+  fn.glClearBufferfiFn = reinterpret_cast<glClearBufferfiProc>(
+      GetGLProcAddress("glClearBufferfi"));
+  fn.glClearBufferfvFn = reinterpret_cast<glClearBufferfvProc>(
+      GetGLProcAddress("glClearBufferfv"));
+  fn.glClearBufferivFn = reinterpret_cast<glClearBufferivProc>(
+      GetGLProcAddress("glClearBufferiv"));
+  fn.glClearBufferuivFn = reinterpret_cast<glClearBufferuivProc>(
+      GetGLProcAddress("glClearBufferuiv"));
+  fn.glClearColorFn =
+      reinterpret_cast<glClearColorProc>(GetGLProcAddress("glClearColor"));
+  fn.glClearDepthFn =
+      reinterpret_cast<glClearDepthProc>(GetGLProcAddress("glClearDepth"));
+  fn.glClearDepthfFn =
+      reinterpret_cast<glClearDepthfProc>(GetGLProcAddress("glClearDepthf"));
+  fn.glClearStencilFn =
+      reinterpret_cast<glClearStencilProc>(GetGLProcAddress("glClearStencil"));
+  fn.glClientWaitSyncFn = reinterpret_cast<glClientWaitSyncProc>(
+      GetGLProcAddress("glClientWaitSync"));
+  fn.glColorMaskFn =
+      reinterpret_cast<glColorMaskProc>(GetGLProcAddress("glColorMask"));
+  fn.glCompileShaderFn = reinterpret_cast<glCompileShaderProc>(
+      GetGLProcAddress("glCompileShader"));
+  fn.glCompressedTexImage2DFn = reinterpret_cast<glCompressedTexImage2DProc>(
+      GetGLProcAddress("glCompressedTexImage2D"));
+  fn.glCompressedTexImage3DFn = reinterpret_cast<glCompressedTexImage3DProc>(
+      GetGLProcAddress("glCompressedTexImage3D"));
+  fn.glCompressedTexSubImage2DFn =
+      reinterpret_cast<glCompressedTexSubImage2DProc>(
+          GetGLProcAddress("glCompressedTexSubImage2D"));
+  fn.glCopyBufferSubDataFn = reinterpret_cast<glCopyBufferSubDataProc>(
+      GetGLProcAddress("glCopyBufferSubData"));
+  fn.glCopyTexImage2DFn = reinterpret_cast<glCopyTexImage2DProc>(
+      GetGLProcAddress("glCopyTexImage2D"));
+  fn.glCopyTexSubImage2DFn = reinterpret_cast<glCopyTexSubImage2DProc>(
+      GetGLProcAddress("glCopyTexSubImage2D"));
+  fn.glCopyTexSubImage3DFn = reinterpret_cast<glCopyTexSubImage3DProc>(
+      GetGLProcAddress("glCopyTexSubImage3D"));
+  fn.glCreateProgramFn = reinterpret_cast<glCreateProgramProc>(
+      GetGLProcAddress("glCreateProgram"));
+  fn.glCreateShaderFn =
+      reinterpret_cast<glCreateShaderProc>(GetGLProcAddress("glCreateShader"));
+  fn.glCullFaceFn =
+      reinterpret_cast<glCullFaceProc>(GetGLProcAddress("glCullFace"));
+  fn.glDeleteBuffersARBFn =
+      reinterpret_cast<glDeleteBuffersARBProc>(glDeleteBuffersARBNotBound);
+  fn.glDeleteFencesAPPLEFn = reinterpret_cast<glDeleteFencesAPPLEProc>(
+      GetGLProcAddress("glDeleteFencesAPPLE"));
+  fn.glDeleteFencesNVFn = reinterpret_cast<glDeleteFencesNVProc>(
+      GetGLProcAddress("glDeleteFencesNV"));
+  fn.glDeleteFramebuffersEXTFn = reinterpret_cast<glDeleteFramebuffersEXTProc>(
+      glDeleteFramebuffersEXTNotBound);
+  fn.glDeleteProgramFn = reinterpret_cast<glDeleteProgramProc>(
+      GetGLProcAddress("glDeleteProgram"));
+  fn.glDeleteQueriesFn = reinterpret_cast<glDeleteQueriesProc>(
+      GetGLProcAddress("glDeleteQueries"));
+  fn.glDeleteQueriesARBFn =
+      reinterpret_cast<glDeleteQueriesARBProc>(glDeleteQueriesARBNotBound);
+  fn.glDeleteRenderbuffersEXTFn =
+      reinterpret_cast<glDeleteRenderbuffersEXTProc>(
+          glDeleteRenderbuffersEXTNotBound);
+  fn.glDeleteSamplersFn = reinterpret_cast<glDeleteSamplersProc>(
+      GetGLProcAddress("glDeleteSamplers"));
+  fn.glDeleteShaderFn =
+      reinterpret_cast<glDeleteShaderProc>(GetGLProcAddress("glDeleteShader"));
+  fn.glDeleteSyncFn =
+      reinterpret_cast<glDeleteSyncProc>(GetGLProcAddress("glDeleteSync"));
+  fn.glDeleteTexturesFn = reinterpret_cast<glDeleteTexturesProc>(
+      GetGLProcAddress("glDeleteTextures"));
+  fn.glDeleteTransformFeedbacksFn =
+      reinterpret_cast<glDeleteTransformFeedbacksProc>(
+          GetGLProcAddress("glDeleteTransformFeedbacks"));
+  fn.glDeleteVertexArraysOESFn = reinterpret_cast<glDeleteVertexArraysOESProc>(
+      glDeleteVertexArraysOESNotBound);
+  fn.glDepthFuncFn =
+      reinterpret_cast<glDepthFuncProc>(GetGLProcAddress("glDepthFunc"));
+  fn.glDepthMaskFn =
+      reinterpret_cast<glDepthMaskProc>(GetGLProcAddress("glDepthMask"));
+  fn.glDepthRangeFn =
+      reinterpret_cast<glDepthRangeProc>(GetGLProcAddress("glDepthRange"));
+  fn.glDepthRangefFn =
+      reinterpret_cast<glDepthRangefProc>(GetGLProcAddress("glDepthRangef"));
+  fn.glDetachShaderFn =
+      reinterpret_cast<glDetachShaderProc>(GetGLProcAddress("glDetachShader"));
+  fn.glDisableFn =
+      reinterpret_cast<glDisableProc>(GetGLProcAddress("glDisable"));
+  fn.glDisableVertexAttribArrayFn =
+      reinterpret_cast<glDisableVertexAttribArrayProc>(
+          GetGLProcAddress("glDisableVertexAttribArray"));
+  fn.glDiscardFramebufferEXTFn = reinterpret_cast<glDiscardFramebufferEXTProc>(
+      GetGLProcAddress("glDiscardFramebufferEXT"));
+  fn.glDrawArraysFn =
+      reinterpret_cast<glDrawArraysProc>(GetGLProcAddress("glDrawArrays"));
+  fn.glDrawArraysInstancedANGLEFn =
+      reinterpret_cast<glDrawArraysInstancedANGLEProc>(
+          glDrawArraysInstancedANGLENotBound);
+  fn.glDrawBufferFn =
+      reinterpret_cast<glDrawBufferProc>(GetGLProcAddress("glDrawBuffer"));
+  fn.glDrawBuffersARBFn =
+      reinterpret_cast<glDrawBuffersARBProc>(glDrawBuffersARBNotBound);
+  fn.glDrawElementsFn =
+      reinterpret_cast<glDrawElementsProc>(GetGLProcAddress("glDrawElements"));
+  fn.glDrawElementsInstancedANGLEFn =
+      reinterpret_cast<glDrawElementsInstancedANGLEProc>(
+          glDrawElementsInstancedANGLENotBound);
+  fn.glDrawRangeElementsFn = reinterpret_cast<glDrawRangeElementsProc>(
+      GetGLProcAddress("glDrawRangeElements"));
+  fn.glEGLImageTargetRenderbufferStorageOESFn =
+      reinterpret_cast<glEGLImageTargetRenderbufferStorageOESProc>(
+          GetGLProcAddress("glEGLImageTargetRenderbufferStorageOES"));
+  fn.glEGLImageTargetTexture2DOESFn =
+      reinterpret_cast<glEGLImageTargetTexture2DOESProc>(
+          GetGLProcAddress("glEGLImageTargetTexture2DOES"));
+  fn.glEnableFn = reinterpret_cast<glEnableProc>(GetGLProcAddress("glEnable"));
+  fn.glEnableVertexAttribArrayFn =
+      reinterpret_cast<glEnableVertexAttribArrayProc>(
+          GetGLProcAddress("glEnableVertexAttribArray"));
+  fn.glEndQueryFn =
+      reinterpret_cast<glEndQueryProc>(GetGLProcAddress("glEndQuery"));
+  fn.glEndQueryARBFn =
+      reinterpret_cast<glEndQueryARBProc>(glEndQueryARBNotBound);
+  fn.glEndTransformFeedbackFn = reinterpret_cast<glEndTransformFeedbackProc>(
+      GetGLProcAddress("glEndTransformFeedback"));
+  fn.glFenceSyncFn =
+      reinterpret_cast<glFenceSyncProc>(GetGLProcAddress("glFenceSync"));
+  fn.glFinishFn = reinterpret_cast<glFinishProc>(GetGLProcAddress("glFinish"));
+  fn.glFinishFenceAPPLEFn = reinterpret_cast<glFinishFenceAPPLEProc>(
+      GetGLProcAddress("glFinishFenceAPPLE"));
+  fn.glFinishFenceNVFn = reinterpret_cast<glFinishFenceNVProc>(
+      GetGLProcAddress("glFinishFenceNV"));
+  fn.glFlushFn = reinterpret_cast<glFlushProc>(GetGLProcAddress("glFlush"));
+  fn.glFlushMappedBufferRangeFn =
+      reinterpret_cast<glFlushMappedBufferRangeProc>(
+          GetGLProcAddress("glFlushMappedBufferRange"));
+  fn.glFramebufferRenderbufferEXTFn =
+      reinterpret_cast<glFramebufferRenderbufferEXTProc>(
+          glFramebufferRenderbufferEXTNotBound);
+  fn.glFramebufferTexture2DEXTFn =
+      reinterpret_cast<glFramebufferTexture2DEXTProc>(
+          glFramebufferTexture2DEXTNotBound);
+  fn.glFramebufferTexture2DMultisampleEXTFn =
+      reinterpret_cast<glFramebufferTexture2DMultisampleEXTProc>(
+          GetGLProcAddress("glFramebufferTexture2DMultisampleEXT"));
+  fn.glFramebufferTexture2DMultisampleIMGFn =
+      reinterpret_cast<glFramebufferTexture2DMultisampleIMGProc>(
+          GetGLProcAddress("glFramebufferTexture2DMultisampleIMG"));
+  fn.glFramebufferTextureLayerFn =
+      reinterpret_cast<glFramebufferTextureLayerProc>(
+          GetGLProcAddress("glFramebufferTextureLayer"));
+  fn.glFrontFaceFn =
+      reinterpret_cast<glFrontFaceProc>(GetGLProcAddress("glFrontFace"));
+  fn.glGenBuffersARBFn =
+      reinterpret_cast<glGenBuffersARBProc>(glGenBuffersARBNotBound);
+  fn.glGenerateMipmapEXTFn =
+      reinterpret_cast<glGenerateMipmapEXTProc>(glGenerateMipmapEXTNotBound);
+  fn.glGenFencesAPPLEFn = reinterpret_cast<glGenFencesAPPLEProc>(
+      GetGLProcAddress("glGenFencesAPPLE"));
+  fn.glGenFencesNVFn =
+      reinterpret_cast<glGenFencesNVProc>(GetGLProcAddress("glGenFencesNV"));
+  fn.glGenFramebuffersEXTFn =
+      reinterpret_cast<glGenFramebuffersEXTProc>(glGenFramebuffersEXTNotBound);
+  fn.glGenQueriesFn =
+      reinterpret_cast<glGenQueriesProc>(GetGLProcAddress("glGenQueries"));
+  fn.glGenQueriesARBFn =
+      reinterpret_cast<glGenQueriesARBProc>(glGenQueriesARBNotBound);
+  fn.glGenRenderbuffersEXTFn = reinterpret_cast<glGenRenderbuffersEXTProc>(
+      glGenRenderbuffersEXTNotBound);
+  fn.glGenSamplersFn =
+      reinterpret_cast<glGenSamplersProc>(GetGLProcAddress("glGenSamplers"));
+  fn.glGenTexturesFn =
+      reinterpret_cast<glGenTexturesProc>(GetGLProcAddress("glGenTextures"));
+  fn.glGenTransformFeedbacksFn = reinterpret_cast<glGenTransformFeedbacksProc>(
+      GetGLProcAddress("glGenTransformFeedbacks"));
+  fn.glGenVertexArraysOESFn =
+      reinterpret_cast<glGenVertexArraysOESProc>(glGenVertexArraysOESNotBound);
+  fn.glGetActiveAttribFn = reinterpret_cast<glGetActiveAttribProc>(
+      GetGLProcAddress("glGetActiveAttrib"));
+  fn.glGetActiveUniformFn = reinterpret_cast<glGetActiveUniformProc>(
+      GetGLProcAddress("glGetActiveUniform"));
+  fn.glGetActiveUniformBlockivFn =
+      reinterpret_cast<glGetActiveUniformBlockivProc>(
+          GetGLProcAddress("glGetActiveUniformBlockiv"));
+  fn.glGetActiveUniformBlockNameFn =
+      reinterpret_cast<glGetActiveUniformBlockNameProc>(
+          GetGLProcAddress("glGetActiveUniformBlockName"));
+  fn.glGetActiveUniformsivFn = reinterpret_cast<glGetActiveUniformsivProc>(
+      GetGLProcAddress("glGetActiveUniformsiv"));
+  fn.glGetAttachedShadersFn = reinterpret_cast<glGetAttachedShadersProc>(
+      GetGLProcAddress("glGetAttachedShaders"));
+  fn.glGetAttribLocationFn = reinterpret_cast<glGetAttribLocationProc>(
+      GetGLProcAddress("glGetAttribLocation"));
+  fn.glGetBooleanvFn =
+      reinterpret_cast<glGetBooleanvProc>(GetGLProcAddress("glGetBooleanv"));
+  fn.glGetBufferParameterivFn = reinterpret_cast<glGetBufferParameterivProc>(
+      GetGLProcAddress("glGetBufferParameteriv"));
+  fn.glGetErrorFn =
+      reinterpret_cast<glGetErrorProc>(GetGLProcAddress("glGetError"));
+  fn.glGetFenceivNVFn =
+      reinterpret_cast<glGetFenceivNVProc>(GetGLProcAddress("glGetFenceivNV"));
+  fn.glGetFloatvFn =
+      reinterpret_cast<glGetFloatvProc>(GetGLProcAddress("glGetFloatv"));
+  fn.glGetFragDataLocationFn = reinterpret_cast<glGetFragDataLocationProc>(
+      GetGLProcAddress("glGetFragDataLocation"));
+  fn.glGetFramebufferAttachmentParameterivEXTFn =
+      reinterpret_cast<glGetFramebufferAttachmentParameterivEXTProc>(
+          glGetFramebufferAttachmentParameterivEXTNotBound);
+  fn.glGetGraphicsResetStatusARBFn =
+      reinterpret_cast<glGetGraphicsResetStatusARBProc>(
+          glGetGraphicsResetStatusARBNotBound);
+  fn.glGetInteger64i_vFn = reinterpret_cast<glGetInteger64i_vProc>(
+      GetGLProcAddress("glGetInteger64i_v"));
+  fn.glGetInteger64vFn = reinterpret_cast<glGetInteger64vProc>(
+      GetGLProcAddress("glGetInteger64v"));
+  fn.glGetIntegeri_vFn = reinterpret_cast<glGetIntegeri_vProc>(
+      GetGLProcAddress("glGetIntegeri_v"));
+  fn.glGetIntegervFn =
+      reinterpret_cast<glGetIntegervProc>(GetGLProcAddress("glGetIntegerv"));
+  fn.glGetInternalformativFn = reinterpret_cast<glGetInternalformativProc>(
+      GetGLProcAddress("glGetInternalformativ"));
+  fn.glGetProgramBinaryFn =
+      reinterpret_cast<glGetProgramBinaryProc>(glGetProgramBinaryNotBound);
+  fn.glGetProgramInfoLogFn = reinterpret_cast<glGetProgramInfoLogProc>(
+      GetGLProcAddress("glGetProgramInfoLog"));
+  fn.glGetProgramivFn =
+      reinterpret_cast<glGetProgramivProc>(GetGLProcAddress("glGetProgramiv"));
+  fn.glGetQueryivFn =
+      reinterpret_cast<glGetQueryivProc>(GetGLProcAddress("glGetQueryiv"));
+  fn.glGetQueryivARBFn =
+      reinterpret_cast<glGetQueryivARBProc>(glGetQueryivARBNotBound);
+  fn.glGetQueryObjecti64vFn = reinterpret_cast<glGetQueryObjecti64vProc>(
+      GetGLProcAddress("glGetQueryObjecti64v"));
+  fn.glGetQueryObjectivFn = reinterpret_cast<glGetQueryObjectivProc>(
+      GetGLProcAddress("glGetQueryObjectiv"));
+  fn.glGetQueryObjectivARBFn = reinterpret_cast<glGetQueryObjectivARBProc>(
+      glGetQueryObjectivARBNotBound);
+  fn.glGetQueryObjectui64vFn = reinterpret_cast<glGetQueryObjectui64vProc>(
+      glGetQueryObjectui64vNotBound);
+  fn.glGetQueryObjectuivFn = reinterpret_cast<glGetQueryObjectuivProc>(
+      GetGLProcAddress("glGetQueryObjectuiv"));
+  fn.glGetQueryObjectuivARBFn = reinterpret_cast<glGetQueryObjectuivARBProc>(
+      glGetQueryObjectuivARBNotBound);
+  fn.glGetRenderbufferParameterivEXTFn =
+      reinterpret_cast<glGetRenderbufferParameterivEXTProc>(
+          glGetRenderbufferParameterivEXTNotBound);
+  fn.glGetSamplerParameterfvFn = reinterpret_cast<glGetSamplerParameterfvProc>(
+      GetGLProcAddress("glGetSamplerParameterfv"));
+  fn.glGetSamplerParameterivFn = reinterpret_cast<glGetSamplerParameterivProc>(
+      GetGLProcAddress("glGetSamplerParameteriv"));
+  fn.glGetShaderInfoLogFn = reinterpret_cast<glGetShaderInfoLogProc>(
+      GetGLProcAddress("glGetShaderInfoLog"));
+  fn.glGetShaderivFn =
+      reinterpret_cast<glGetShaderivProc>(GetGLProcAddress("glGetShaderiv"));
+  fn.glGetShaderPrecisionFormatFn =
+      reinterpret_cast<glGetShaderPrecisionFormatProc>(
+          GetGLProcAddress("glGetShaderPrecisionFormat"));
+  fn.glGetShaderSourceFn = reinterpret_cast<glGetShaderSourceProc>(
+      GetGLProcAddress("glGetShaderSource"));
+  fn.glGetStringFn =
+      reinterpret_cast<glGetStringProc>(GetGLProcAddress("glGetString"));
+  fn.glGetSyncivFn =
+      reinterpret_cast<glGetSyncivProc>(GetGLProcAddress("glGetSynciv"));
+  fn.glGetTexLevelParameterfvFn =
+      reinterpret_cast<glGetTexLevelParameterfvProc>(
+          GetGLProcAddress("glGetTexLevelParameterfv"));
+  fn.glGetTexLevelParameterivFn =
+      reinterpret_cast<glGetTexLevelParameterivProc>(
+          GetGLProcAddress("glGetTexLevelParameteriv"));
+  fn.glGetTexParameterfvFn = reinterpret_cast<glGetTexParameterfvProc>(
+      GetGLProcAddress("glGetTexParameterfv"));
+  fn.glGetTexParameterivFn = reinterpret_cast<glGetTexParameterivProc>(
+      GetGLProcAddress("glGetTexParameteriv"));
+  fn.glGetTransformFeedbackVaryingFn =
+      reinterpret_cast<glGetTransformFeedbackVaryingProc>(
+          GetGLProcAddress("glGetTransformFeedbackVarying"));
+  fn.glGetTranslatedShaderSourceANGLEFn =
+      reinterpret_cast<glGetTranslatedShaderSourceANGLEProc>(
+          GetGLProcAddress("glGetTranslatedShaderSourceANGLE"));
+  fn.glGetUniformBlockIndexFn = reinterpret_cast<glGetUniformBlockIndexProc>(
+      GetGLProcAddress("glGetUniformBlockIndex"));
+  fn.glGetUniformfvFn =
+      reinterpret_cast<glGetUniformfvProc>(GetGLProcAddress("glGetUniformfv"));
+  fn.glGetUniformIndicesFn = reinterpret_cast<glGetUniformIndicesProc>(
+      GetGLProcAddress("glGetUniformIndices"));
+  fn.glGetUniformivFn =
+      reinterpret_cast<glGetUniformivProc>(GetGLProcAddress("glGetUniformiv"));
+  fn.glGetUniformLocationFn = reinterpret_cast<glGetUniformLocationProc>(
+      GetGLProcAddress("glGetUniformLocation"));
+  fn.glGetVertexAttribfvFn = reinterpret_cast<glGetVertexAttribfvProc>(
+      GetGLProcAddress("glGetVertexAttribfv"));
+  fn.glGetVertexAttribivFn = reinterpret_cast<glGetVertexAttribivProc>(
+      GetGLProcAddress("glGetVertexAttribiv"));
+  fn.glGetVertexAttribPointervFn =
+      reinterpret_cast<glGetVertexAttribPointervProc>(
+          GetGLProcAddress("glGetVertexAttribPointerv"));
+  fn.glHintFn = reinterpret_cast<glHintProc>(GetGLProcAddress("glHint"));
+  fn.glInsertEventMarkerEXTFn = reinterpret_cast<glInsertEventMarkerEXTProc>(
+      GetGLProcAddress("glInsertEventMarkerEXT"));
+  fn.glInvalidateFramebufferFn = reinterpret_cast<glInvalidateFramebufferProc>(
+      GetGLProcAddress("glInvalidateFramebuffer"));
+  fn.glInvalidateSubFramebufferFn =
+      reinterpret_cast<glInvalidateSubFramebufferProc>(
+          GetGLProcAddress("glInvalidateSubFramebuffer"));
+  fn.glIsBufferFn =
+      reinterpret_cast<glIsBufferProc>(GetGLProcAddress("glIsBuffer"));
+  fn.glIsEnabledFn =
+      reinterpret_cast<glIsEnabledProc>(GetGLProcAddress("glIsEnabled"));
+  fn.glIsFenceAPPLEFn =
+      reinterpret_cast<glIsFenceAPPLEProc>(GetGLProcAddress("glIsFenceAPPLE"));
+  fn.glIsFenceNVFn =
+      reinterpret_cast<glIsFenceNVProc>(GetGLProcAddress("glIsFenceNV"));
+  fn.glIsFramebufferEXTFn =
+      reinterpret_cast<glIsFramebufferEXTProc>(glIsFramebufferEXTNotBound);
+  fn.glIsProgramFn =
+      reinterpret_cast<glIsProgramProc>(GetGLProcAddress("glIsProgram"));
+  fn.glIsQueryFn =
+      reinterpret_cast<glIsQueryProc>(GetGLProcAddress("glIsQuery"));
+  fn.glIsQueryARBFn = reinterpret_cast<glIsQueryARBProc>(glIsQueryARBNotBound);
+  fn.glIsRenderbufferEXTFn =
+      reinterpret_cast<glIsRenderbufferEXTProc>(glIsRenderbufferEXTNotBound);
+  fn.glIsSamplerFn =
+      reinterpret_cast<glIsSamplerProc>(GetGLProcAddress("glIsSampler"));
+  fn.glIsShaderFn =
+      reinterpret_cast<glIsShaderProc>(GetGLProcAddress("glIsShader"));
+  fn.glIsSyncFn = reinterpret_cast<glIsSyncProc>(GetGLProcAddress("glIsSync"));
+  fn.glIsTextureFn =
+      reinterpret_cast<glIsTextureProc>(GetGLProcAddress("glIsTexture"));
+  fn.glIsTransformFeedbackFn = reinterpret_cast<glIsTransformFeedbackProc>(
+      GetGLProcAddress("glIsTransformFeedback"));
+  fn.glIsVertexArrayOESFn =
+      reinterpret_cast<glIsVertexArrayOESProc>(glIsVertexArrayOESNotBound);
+  fn.glLineWidthFn =
+      reinterpret_cast<glLineWidthProc>(GetGLProcAddress("glLineWidth"));
+  fn.glLinkProgramFn =
+      reinterpret_cast<glLinkProgramProc>(GetGLProcAddress("glLinkProgram"));
+  fn.glMapBufferFn = reinterpret_cast<glMapBufferProc>(glMapBufferNotBound);
+  fn.glMapBufferRangeFn =
+      reinterpret_cast<glMapBufferRangeProc>(glMapBufferRangeNotBound);
+  fn.glMatrixLoadfEXTFn = reinterpret_cast<glMatrixLoadfEXTProc>(
+      GetGLProcAddress("glMatrixLoadfEXT"));
+  fn.glMatrixLoadIdentityEXTFn = reinterpret_cast<glMatrixLoadIdentityEXTProc>(
+      GetGLProcAddress("glMatrixLoadIdentityEXT"));
+  fn.glPauseTransformFeedbackFn =
+      reinterpret_cast<glPauseTransformFeedbackProc>(
+          GetGLProcAddress("glPauseTransformFeedback"));
+  fn.glPixelStoreiFn =
+      reinterpret_cast<glPixelStoreiProc>(GetGLProcAddress("glPixelStorei"));
+  fn.glPointParameteriFn = reinterpret_cast<glPointParameteriProc>(
+      GetGLProcAddress("glPointParameteri"));
+  fn.glPolygonOffsetFn = reinterpret_cast<glPolygonOffsetProc>(
+      GetGLProcAddress("glPolygonOffset"));
+  fn.glPopGroupMarkerEXTFn = reinterpret_cast<glPopGroupMarkerEXTProc>(
+      GetGLProcAddress("glPopGroupMarkerEXT"));
+  fn.glProgramBinaryFn =
+      reinterpret_cast<glProgramBinaryProc>(glProgramBinaryNotBound);
+  fn.glProgramParameteriFn = reinterpret_cast<glProgramParameteriProc>(
+      GetGLProcAddress("glProgramParameteri"));
+  fn.glPushGroupMarkerEXTFn = reinterpret_cast<glPushGroupMarkerEXTProc>(
+      GetGLProcAddress("glPushGroupMarkerEXT"));
+  fn.glQueryCounterFn =
+      reinterpret_cast<glQueryCounterProc>(glQueryCounterNotBound);
+  fn.glReadBufferFn =
+      reinterpret_cast<glReadBufferProc>(GetGLProcAddress("glReadBuffer"));
+  fn.glReadPixelsFn =
+      reinterpret_cast<glReadPixelsProc>(GetGLProcAddress("glReadPixels"));
+  fn.glReleaseShaderCompilerFn = reinterpret_cast<glReleaseShaderCompilerProc>(
+      GetGLProcAddress("glReleaseShaderCompiler"));
+  fn.glRenderbufferStorageEXTFn =
+      reinterpret_cast<glRenderbufferStorageEXTProc>(
+          glRenderbufferStorageEXTNotBound);
+  fn.glRenderbufferStorageMultisampleFn =
+      reinterpret_cast<glRenderbufferStorageMultisampleProc>(
+          GetGLProcAddress("glRenderbufferStorageMultisample"));
+  fn.glRenderbufferStorageMultisampleANGLEFn =
+      reinterpret_cast<glRenderbufferStorageMultisampleANGLEProc>(
+          glRenderbufferStorageMultisampleANGLENotBound);
+  fn.glRenderbufferStorageMultisampleEXTFn =
+      reinterpret_cast<glRenderbufferStorageMultisampleEXTProc>(
+          glRenderbufferStorageMultisampleEXTNotBound);
+  fn.glRenderbufferStorageMultisampleIMGFn =
+      reinterpret_cast<glRenderbufferStorageMultisampleIMGProc>(
+          GetGLProcAddress("glRenderbufferStorageMultisampleIMG"));
+  fn.glResumeTransformFeedbackFn =
+      reinterpret_cast<glResumeTransformFeedbackProc>(
+          GetGLProcAddress("glResumeTransformFeedback"));
+  fn.glSampleCoverageFn = reinterpret_cast<glSampleCoverageProc>(
+      GetGLProcAddress("glSampleCoverage"));
+  fn.glSamplerParameterfFn = reinterpret_cast<glSamplerParameterfProc>(
+      GetGLProcAddress("glSamplerParameterf"));
+  fn.glSamplerParameterfvFn = reinterpret_cast<glSamplerParameterfvProc>(
+      GetGLProcAddress("glSamplerParameterfv"));
+  fn.glSamplerParameteriFn = reinterpret_cast<glSamplerParameteriProc>(
+      GetGLProcAddress("glSamplerParameteri"));
+  fn.glSamplerParameterivFn = reinterpret_cast<glSamplerParameterivProc>(
+      GetGLProcAddress("glSamplerParameteriv"));
+  fn.glScissorFn =
+      reinterpret_cast<glScissorProc>(GetGLProcAddress("glScissor"));
+  fn.glSetFenceAPPLEFn = reinterpret_cast<glSetFenceAPPLEProc>(
+      GetGLProcAddress("glSetFenceAPPLE"));
+  fn.glSetFenceNVFn =
+      reinterpret_cast<glSetFenceNVProc>(GetGLProcAddress("glSetFenceNV"));
+  fn.glShaderBinaryFn =
+      reinterpret_cast<glShaderBinaryProc>(GetGLProcAddress("glShaderBinary"));
+  fn.glShaderSourceFn =
+      reinterpret_cast<glShaderSourceProc>(GetGLProcAddress("glShaderSource"));
+  fn.glStencilFuncFn =
+      reinterpret_cast<glStencilFuncProc>(GetGLProcAddress("glStencilFunc"));
+  fn.glStencilFuncSeparateFn = reinterpret_cast<glStencilFuncSeparateProc>(
+      GetGLProcAddress("glStencilFuncSeparate"));
+  fn.glStencilMaskFn =
+      reinterpret_cast<glStencilMaskProc>(GetGLProcAddress("glStencilMask"));
+  fn.glStencilMaskSeparateFn = reinterpret_cast<glStencilMaskSeparateProc>(
+      GetGLProcAddress("glStencilMaskSeparate"));
+  fn.glStencilOpFn =
+      reinterpret_cast<glStencilOpProc>(GetGLProcAddress("glStencilOp"));
+  fn.glStencilOpSeparateFn = reinterpret_cast<glStencilOpSeparateProc>(
+      GetGLProcAddress("glStencilOpSeparate"));
+  fn.glTestFenceAPPLEFn = reinterpret_cast<glTestFenceAPPLEProc>(
+      GetGLProcAddress("glTestFenceAPPLE"));
+  fn.glTestFenceNVFn =
+      reinterpret_cast<glTestFenceNVProc>(GetGLProcAddress("glTestFenceNV"));
+  fn.glTexImage2DFn =
+      reinterpret_cast<glTexImage2DProc>(GetGLProcAddress("glTexImage2D"));
+  fn.glTexImage3DFn =
+      reinterpret_cast<glTexImage3DProc>(GetGLProcAddress("glTexImage3D"));
+  fn.glTexParameterfFn = reinterpret_cast<glTexParameterfProc>(
+      GetGLProcAddress("glTexParameterf"));
+  fn.glTexParameterfvFn = reinterpret_cast<glTexParameterfvProc>(
+      GetGLProcAddress("glTexParameterfv"));
+  fn.glTexParameteriFn = reinterpret_cast<glTexParameteriProc>(
+      GetGLProcAddress("glTexParameteri"));
+  fn.glTexParameterivFn = reinterpret_cast<glTexParameterivProc>(
+      GetGLProcAddress("glTexParameteriv"));
+  fn.glTexStorage2DEXTFn =
+      reinterpret_cast<glTexStorage2DEXTProc>(glTexStorage2DEXTNotBound);
+  fn.glTexStorage3DFn =
+      reinterpret_cast<glTexStorage3DProc>(GetGLProcAddress("glTexStorage3D"));
+  fn.glTexSubImage2DFn = reinterpret_cast<glTexSubImage2DProc>(
+      GetGLProcAddress("glTexSubImage2D"));
+  fn.glTransformFeedbackVaryingsFn =
+      reinterpret_cast<glTransformFeedbackVaryingsProc>(
+          GetGLProcAddress("glTransformFeedbackVaryings"));
+  fn.glUniform1fFn =
+      reinterpret_cast<glUniform1fProc>(GetGLProcAddress("glUniform1f"));
+  fn.glUniform1fvFn =
+      reinterpret_cast<glUniform1fvProc>(GetGLProcAddress("glUniform1fv"));
+  fn.glUniform1iFn =
+      reinterpret_cast<glUniform1iProc>(GetGLProcAddress("glUniform1i"));
+  fn.glUniform1ivFn =
+      reinterpret_cast<glUniform1ivProc>(GetGLProcAddress("glUniform1iv"));
+  fn.glUniform1uiFn =
+      reinterpret_cast<glUniform1uiProc>(GetGLProcAddress("glUniform1ui"));
+  fn.glUniform1uivFn =
+      reinterpret_cast<glUniform1uivProc>(GetGLProcAddress("glUniform1uiv"));
+  fn.glUniform2fFn =
+      reinterpret_cast<glUniform2fProc>(GetGLProcAddress("glUniform2f"));
+  fn.glUniform2fvFn =
+      reinterpret_cast<glUniform2fvProc>(GetGLProcAddress("glUniform2fv"));
+  fn.glUniform2iFn =
+      reinterpret_cast<glUniform2iProc>(GetGLProcAddress("glUniform2i"));
+  fn.glUniform2ivFn =
+      reinterpret_cast<glUniform2ivProc>(GetGLProcAddress("glUniform2iv"));
+  fn.glUniform2uiFn =
+      reinterpret_cast<glUniform2uiProc>(GetGLProcAddress("glUniform2ui"));
+  fn.glUniform2uivFn =
+      reinterpret_cast<glUniform2uivProc>(GetGLProcAddress("glUniform2uiv"));
+  fn.glUniform3fFn =
+      reinterpret_cast<glUniform3fProc>(GetGLProcAddress("glUniform3f"));
+  fn.glUniform3fvFn =
+      reinterpret_cast<glUniform3fvProc>(GetGLProcAddress("glUniform3fv"));
+  fn.glUniform3iFn =
+      reinterpret_cast<glUniform3iProc>(GetGLProcAddress("glUniform3i"));
+  fn.glUniform3ivFn =
+      reinterpret_cast<glUniform3ivProc>(GetGLProcAddress("glUniform3iv"));
+  fn.glUniform3uiFn =
+      reinterpret_cast<glUniform3uiProc>(GetGLProcAddress("glUniform3ui"));
+  fn.glUniform3uivFn =
+      reinterpret_cast<glUniform3uivProc>(GetGLProcAddress("glUniform3uiv"));
+  fn.glUniform4fFn =
+      reinterpret_cast<glUniform4fProc>(GetGLProcAddress("glUniform4f"));
+  fn.glUniform4fvFn =
+      reinterpret_cast<glUniform4fvProc>(GetGLProcAddress("glUniform4fv"));
+  fn.glUniform4iFn =
+      reinterpret_cast<glUniform4iProc>(GetGLProcAddress("glUniform4i"));
+  fn.glUniform4ivFn =
+      reinterpret_cast<glUniform4ivProc>(GetGLProcAddress("glUniform4iv"));
+  fn.glUniform4uiFn =
+      reinterpret_cast<glUniform4uiProc>(GetGLProcAddress("glUniform4ui"));
+  fn.glUniform4uivFn =
+      reinterpret_cast<glUniform4uivProc>(GetGLProcAddress("glUniform4uiv"));
+  fn.glUniformBlockBindingFn = reinterpret_cast<glUniformBlockBindingProc>(
+      GetGLProcAddress("glUniformBlockBinding"));
+  fn.glUniformMatrix2fvFn = reinterpret_cast<glUniformMatrix2fvProc>(
+      GetGLProcAddress("glUniformMatrix2fv"));
+  fn.glUniformMatrix2x3fvFn = reinterpret_cast<glUniformMatrix2x3fvProc>(
+      GetGLProcAddress("glUniformMatrix2x3fv"));
+  fn.glUniformMatrix2x4fvFn = reinterpret_cast<glUniformMatrix2x4fvProc>(
+      GetGLProcAddress("glUniformMatrix2x4fv"));
+  fn.glUniformMatrix3fvFn = reinterpret_cast<glUniformMatrix3fvProc>(
+      GetGLProcAddress("glUniformMatrix3fv"));
+  fn.glUniformMatrix3x2fvFn = reinterpret_cast<glUniformMatrix3x2fvProc>(
+      GetGLProcAddress("glUniformMatrix3x2fv"));
+  fn.glUniformMatrix3x4fvFn = reinterpret_cast<glUniformMatrix3x4fvProc>(
+      GetGLProcAddress("glUniformMatrix3x4fv"));
+  fn.glUniformMatrix4fvFn = reinterpret_cast<glUniformMatrix4fvProc>(
+      GetGLProcAddress("glUniformMatrix4fv"));
+  fn.glUniformMatrix4x2fvFn = reinterpret_cast<glUniformMatrix4x2fvProc>(
+      GetGLProcAddress("glUniformMatrix4x2fv"));
+  fn.glUniformMatrix4x3fvFn = reinterpret_cast<glUniformMatrix4x3fvProc>(
+      GetGLProcAddress("glUniformMatrix4x3fv"));
+  fn.glUnmapBufferFn =
+      reinterpret_cast<glUnmapBufferProc>(glUnmapBufferNotBound);
+  fn.glUseProgramFn =
+      reinterpret_cast<glUseProgramProc>(GetGLProcAddress("glUseProgram"));
+  fn.glValidateProgramFn = reinterpret_cast<glValidateProgramProc>(
+      GetGLProcAddress("glValidateProgram"));
+  fn.glVertexAttrib1fFn = reinterpret_cast<glVertexAttrib1fProc>(
+      GetGLProcAddress("glVertexAttrib1f"));
+  fn.glVertexAttrib1fvFn = reinterpret_cast<glVertexAttrib1fvProc>(
+      GetGLProcAddress("glVertexAttrib1fv"));
+  fn.glVertexAttrib2fFn = reinterpret_cast<glVertexAttrib2fProc>(
+      GetGLProcAddress("glVertexAttrib2f"));
+  fn.glVertexAttrib2fvFn = reinterpret_cast<glVertexAttrib2fvProc>(
+      GetGLProcAddress("glVertexAttrib2fv"));
+  fn.glVertexAttrib3fFn = reinterpret_cast<glVertexAttrib3fProc>(
+      GetGLProcAddress("glVertexAttrib3f"));
+  fn.glVertexAttrib3fvFn = reinterpret_cast<glVertexAttrib3fvProc>(
+      GetGLProcAddress("glVertexAttrib3fv"));
+  fn.glVertexAttrib4fFn = reinterpret_cast<glVertexAttrib4fProc>(
+      GetGLProcAddress("glVertexAttrib4f"));
+  fn.glVertexAttrib4fvFn = reinterpret_cast<glVertexAttrib4fvProc>(
+      GetGLProcAddress("glVertexAttrib4fv"));
+  fn.glVertexAttribDivisorANGLEFn =
+      reinterpret_cast<glVertexAttribDivisorANGLEProc>(
+          glVertexAttribDivisorANGLENotBound);
+  fn.glVertexAttribI4iFn = reinterpret_cast<glVertexAttribI4iProc>(
+      GetGLProcAddress("glVertexAttribI4i"));
+  fn.glVertexAttribI4ivFn = reinterpret_cast<glVertexAttribI4ivProc>(
+      GetGLProcAddress("glVertexAttribI4iv"));
+  fn.glVertexAttribI4uiFn = reinterpret_cast<glVertexAttribI4uiProc>(
+      GetGLProcAddress("glVertexAttribI4ui"));
+  fn.glVertexAttribI4uivFn = reinterpret_cast<glVertexAttribI4uivProc>(
+      GetGLProcAddress("glVertexAttribI4uiv"));
+  fn.glVertexAttribIPointerFn = reinterpret_cast<glVertexAttribIPointerProc>(
+      GetGLProcAddress("glVertexAttribIPointer"));
+  fn.glVertexAttribPointerFn = reinterpret_cast<glVertexAttribPointerProc>(
+      GetGLProcAddress("glVertexAttribPointer"));
+  fn.glViewportFn =
+      reinterpret_cast<glViewportProc>(GetGLProcAddress("glViewport"));
+  fn.glWaitSyncFn =
+      reinterpret_cast<glWaitSyncProc>(GetGLProcAddress("glWaitSync"));
+}
+
+void DriverGL::InitializeDynamicBindings(GLContext* context) {
+  DCHECK(context && context->IsCurrent(NULL));
+  const GLVersionInfo* ver = context->GetVersionInfo();
+  ALLOW_UNUSED_LOCAL(ver);
+  std::string extensions = context->GetExtensions() + " ";
+  ALLOW_UNUSED_LOCAL(extensions);
+
+  ext.b_GL_ANGLE_framebuffer_blit =
+      extensions.find("GL_ANGLE_framebuffer_blit ") != std::string::npos;
+  ext.b_GL_ANGLE_framebuffer_multisample =
+      extensions.find("GL_ANGLE_framebuffer_multisample ") != std::string::npos;
+  ext.b_GL_ANGLE_instanced_arrays =
+      extensions.find("GL_ANGLE_instanced_arrays ") != std::string::npos;
+  ext.b_GL_ANGLE_translated_shader_source =
+      extensions.find("GL_ANGLE_translated_shader_source ") !=
+      std::string::npos;
+  ext.b_GL_APPLE_fence =
+      extensions.find("GL_APPLE_fence ") != std::string::npos;
+  ext.b_GL_APPLE_vertex_array_object =
+      extensions.find("GL_APPLE_vertex_array_object ") != std::string::npos;
+  ext.b_GL_ARB_ES2_compatibility =
+      extensions.find("GL_ARB_ES2_compatibility ") != std::string::npos;
+  ext.b_GL_ARB_blend_func_extended =
+      extensions.find("GL_ARB_blend_func_extended ") != std::string::npos;
+  ext.b_GL_ARB_copy_buffer =
+      extensions.find("GL_ARB_copy_buffer ") != std::string::npos;
+  ext.b_GL_ARB_draw_buffers =
+      extensions.find("GL_ARB_draw_buffers ") != std::string::npos;
+  ext.b_GL_ARB_draw_instanced =
+      extensions.find("GL_ARB_draw_instanced ") != std::string::npos;
+  ext.b_GL_ARB_framebuffer_object =
+      extensions.find("GL_ARB_framebuffer_object ") != std::string::npos;
+  ext.b_GL_ARB_get_program_binary =
+      extensions.find("GL_ARB_get_program_binary ") != std::string::npos;
+  ext.b_GL_ARB_instanced_arrays =
+      extensions.find("GL_ARB_instanced_arrays ") != std::string::npos;
+  ext.b_GL_ARB_internalformat_query =
+      extensions.find("GL_ARB_internalformat_query ") != std::string::npos;
+  ext.b_GL_ARB_invalidate_subdata =
+      extensions.find("GL_ARB_invalidate_subdata ") != std::string::npos;
+  ext.b_GL_ARB_map_buffer_range =
+      extensions.find("GL_ARB_map_buffer_range ") != std::string::npos;
+  ext.b_GL_ARB_occlusion_query =
+      extensions.find("GL_ARB_occlusion_query ") != std::string::npos;
+  ext.b_GL_ARB_robustness =
+      extensions.find("GL_ARB_robustness ") != std::string::npos;
+  ext.b_GL_ARB_sampler_objects =
+      extensions.find("GL_ARB_sampler_objects ") != std::string::npos;
+  ext.b_GL_ARB_sync = extensions.find("GL_ARB_sync ") != std::string::npos;
+  ext.b_GL_ARB_texture_storage =
+      extensions.find("GL_ARB_texture_storage ") != std::string::npos;
+  ext.b_GL_ARB_timer_query =
+      extensions.find("GL_ARB_timer_query ") != std::string::npos;
+  ext.b_GL_ARB_transform_feedback2 =
+      extensions.find("GL_ARB_transform_feedback2 ") != std::string::npos;
+  ext.b_GL_ARB_uniform_buffer_object =
+      extensions.find("GL_ARB_uniform_buffer_object ") != std::string::npos;
+  ext.b_GL_ARB_vertex_array_object =
+      extensions.find("GL_ARB_vertex_array_object ") != std::string::npos;
+  ext.b_GL_ARB_vertex_buffer_object =
+      extensions.find("GL_ARB_vertex_buffer_object ") != std::string::npos;
+  ext.b_GL_EXT_debug_marker =
+      extensions.find("GL_EXT_debug_marker ") != std::string::npos;
+  ext.b_GL_EXT_direct_state_access =
+      extensions.find("GL_EXT_direct_state_access ") != std::string::npos;
+  ext.b_GL_EXT_discard_framebuffer =
+      extensions.find("GL_EXT_discard_framebuffer ") != std::string::npos;
+  ext.b_GL_EXT_disjoint_timer_query =
+      extensions.find("GL_EXT_disjoint_timer_query ") != std::string::npos;
+  ext.b_GL_EXT_draw_buffers =
+      extensions.find("GL_EXT_draw_buffers ") != std::string::npos;
+  ext.b_GL_EXT_framebuffer_blit =
+      extensions.find("GL_EXT_framebuffer_blit ") != std::string::npos;
+  ext.b_GL_EXT_framebuffer_multisample =
+      extensions.find("GL_EXT_framebuffer_multisample ") != std::string::npos;
+  ext.b_GL_EXT_framebuffer_object =
+      extensions.find("GL_EXT_framebuffer_object ") != std::string::npos;
+  ext.b_GL_EXT_map_buffer_range =
+      extensions.find("GL_EXT_map_buffer_range ") != std::string::npos;
+  ext.b_GL_EXT_multisampled_render_to_texture =
+      extensions.find("GL_EXT_multisampled_render_to_texture ") !=
+      std::string::npos;
+  ext.b_GL_EXT_robustness =
+      extensions.find("GL_EXT_robustness ") != std::string::npos;
+  ext.b_GL_EXT_texture_storage =
+      extensions.find("GL_EXT_texture_storage ") != std::string::npos;
+  ext.b_GL_EXT_timer_query =
+      extensions.find("GL_EXT_timer_query ") != std::string::npos;
+  ext.b_GL_IMG_multisampled_render_to_texture =
+      extensions.find("GL_IMG_multisampled_render_to_texture ") !=
+      std::string::npos;
+  ext.b_GL_KHR_blend_equation_advanced =
+      extensions.find("GL_KHR_blend_equation_advanced ") != std::string::npos;
+  ext.b_GL_KHR_robustness =
+      extensions.find("GL_KHR_robustness ") != std::string::npos;
+  ext.b_GL_NV_blend_equation_advanced =
+      extensions.find("GL_NV_blend_equation_advanced ") != std::string::npos;
+  ext.b_GL_NV_fence = extensions.find("GL_NV_fence ") != std::string::npos;
+  ext.b_GL_NV_path_rendering =
+      extensions.find("GL_NV_path_rendering ") != std::string::npos;
+  ext.b_GL_OES_EGL_image =
+      extensions.find("GL_OES_EGL_image ") != std::string::npos;
+  ext.b_GL_OES_get_program_binary =
+      extensions.find("GL_OES_get_program_binary ") != std::string::npos;
+  ext.b_GL_OES_mapbuffer =
+      extensions.find("GL_OES_mapbuffer ") != std::string::npos;
+  ext.b_GL_OES_vertex_array_object =
+      extensions.find("GL_OES_vertex_array_object ") != std::string::npos;
+
+  fn.glBeginQueryARBFn = 0;
+  debug_fn.glBeginQueryARBFn = 0;
+  if (ext.b_GL_ARB_occlusion_query) {
+    fn.glBeginQueryARBFn = reinterpret_cast<glBeginQueryARBProc>(
+        GetGLProcAddress("glBeginQueryARB"));
+  }
+  if (!fn.glBeginQueryARBFn) {
+    fn.glBeginQueryARBFn = reinterpret_cast<glBeginQueryARBProc>(
+        GetGLProcAddress("glBeginQueryEXT"));
+  }
+
+  fn.glBindFramebufferEXTFn = 0;
+  debug_fn.glBindFramebufferEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glBindFramebufferEXTFn = reinterpret_cast<glBindFramebufferEXTProc>(
+        GetGLProcAddress("glBindFramebufferEXT"));
+  }
+  if (!fn.glBindFramebufferEXTFn) {
+    fn.glBindFramebufferEXTFn = reinterpret_cast<glBindFramebufferEXTProc>(
+        GetGLProcAddress("glBindFramebuffer"));
+  }
+
+  fn.glBindRenderbufferEXTFn = 0;
+  debug_fn.glBindRenderbufferEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glBindRenderbufferEXTFn = reinterpret_cast<glBindRenderbufferEXTProc>(
+        GetGLProcAddress("glBindRenderbufferEXT"));
+  }
+  if (!fn.glBindRenderbufferEXTFn) {
+    fn.glBindRenderbufferEXTFn = reinterpret_cast<glBindRenderbufferEXTProc>(
+        GetGLProcAddress("glBindRenderbuffer"));
+  }
+
+  fn.glBindVertexArrayOESFn = 0;
+  debug_fn.glBindVertexArrayOESFn = 0;
+  if ((ver->is_gl3 || ver->is_gl4 || ver->is_es3) ||
+      ext.b_GL_ARB_vertex_array_object) {
+    fn.glBindVertexArrayOESFn = reinterpret_cast<glBindVertexArrayOESProc>(
+        GetGLProcAddress("glBindVertexArray"));
+  }
+  if (!fn.glBindVertexArrayOESFn && (ext.b_GL_OES_vertex_array_object)) {
+    fn.glBindVertexArrayOESFn = reinterpret_cast<glBindVertexArrayOESProc>(
+        GetGLProcAddress("glBindVertexArrayOES"));
+  }
+  if (!fn.glBindVertexArrayOESFn) {
+    fn.glBindVertexArrayOESFn = reinterpret_cast<glBindVertexArrayOESProc>(
+        GetGLProcAddress("glBindVertexArrayAPPLE"));
+  }
+
+  fn.glBlendBarrierKHRFn = 0;
+  debug_fn.glBlendBarrierKHRFn = 0;
+  if (ext.b_GL_NV_blend_equation_advanced) {
+    fn.glBlendBarrierKHRFn = reinterpret_cast<glBlendBarrierKHRProc>(
+        GetGLProcAddress("glBlendBarrierNV"));
+  }
+  if (!fn.glBlendBarrierKHRFn) {
+    fn.glBlendBarrierKHRFn = reinterpret_cast<glBlendBarrierKHRProc>(
+        GetGLProcAddress("glBlendBarrierKHR"));
+  }
+
+  fn.glBlitFramebufferANGLEFn = 0;
+  debug_fn.glBlitFramebufferANGLEFn = 0;
+  if (ext.b_GL_ANGLE_framebuffer_blit) {
+    fn.glBlitFramebufferANGLEFn = reinterpret_cast<glBlitFramebufferANGLEProc>(
+        GetGLProcAddress("glBlitFramebufferANGLE"));
+  }
+  if (!fn.glBlitFramebufferANGLEFn) {
+    fn.glBlitFramebufferANGLEFn = reinterpret_cast<glBlitFramebufferANGLEProc>(
+        GetGLProcAddress("glBlitFramebuffer"));
+  }
+
+  fn.glBlitFramebufferEXTFn = 0;
+  debug_fn.glBlitFramebufferEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_blit) {
+    fn.glBlitFramebufferEXTFn = reinterpret_cast<glBlitFramebufferEXTProc>(
+        GetGLProcAddress("glBlitFramebufferEXT"));
+  }
+  if (!fn.glBlitFramebufferEXTFn) {
+    fn.glBlitFramebufferEXTFn = reinterpret_cast<glBlitFramebufferEXTProc>(
+        GetGLProcAddress("glBlitFramebuffer"));
+  }
+
+  fn.glCheckFramebufferStatusEXTFn = 0;
+  debug_fn.glCheckFramebufferStatusEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glCheckFramebufferStatusEXTFn =
+        reinterpret_cast<glCheckFramebufferStatusEXTProc>(
+            GetGLProcAddress("glCheckFramebufferStatusEXT"));
+  }
+  if (!fn.glCheckFramebufferStatusEXTFn) {
+    fn.glCheckFramebufferStatusEXTFn =
+        reinterpret_cast<glCheckFramebufferStatusEXTProc>(
+            GetGLProcAddress("glCheckFramebufferStatus"));
+  }
+
+  fn.glDeleteBuffersARBFn = 0;
+  debug_fn.glDeleteBuffersARBFn = 0;
+  if (ext.b_GL_ARB_vertex_buffer_object) {
+    fn.glDeleteBuffersARBFn = reinterpret_cast<glDeleteBuffersARBProc>(
+        GetGLProcAddress("glDeleteBuffersARB"));
+  }
+  if (!fn.glDeleteBuffersARBFn) {
+    fn.glDeleteBuffersARBFn = reinterpret_cast<glDeleteBuffersARBProc>(
+        GetGLProcAddress("glDeleteBuffers"));
+  }
+
+  fn.glDeleteFramebuffersEXTFn = 0;
+  debug_fn.glDeleteFramebuffersEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glDeleteFramebuffersEXTFn =
+        reinterpret_cast<glDeleteFramebuffersEXTProc>(
+            GetGLProcAddress("glDeleteFramebuffersEXT"));
+  }
+  if (!fn.glDeleteFramebuffersEXTFn) {
+    fn.glDeleteFramebuffersEXTFn =
+        reinterpret_cast<glDeleteFramebuffersEXTProc>(
+            GetGLProcAddress("glDeleteFramebuffers"));
+  }
+
+  fn.glDeleteQueriesARBFn = 0;
+  debug_fn.glDeleteQueriesARBFn = 0;
+  if (ext.b_GL_ARB_occlusion_query) {
+    fn.glDeleteQueriesARBFn = reinterpret_cast<glDeleteQueriesARBProc>(
+        GetGLProcAddress("glDeleteQueriesARB"));
+  }
+  if (!fn.glDeleteQueriesARBFn) {
+    fn.glDeleteQueriesARBFn = reinterpret_cast<glDeleteQueriesARBProc>(
+        GetGLProcAddress("glDeleteQueriesEXT"));
+  }
+
+  fn.glDeleteRenderbuffersEXTFn = 0;
+  debug_fn.glDeleteRenderbuffersEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glDeleteRenderbuffersEXTFn =
+        reinterpret_cast<glDeleteRenderbuffersEXTProc>(
+            GetGLProcAddress("glDeleteRenderbuffersEXT"));
+  }
+  if (!fn.glDeleteRenderbuffersEXTFn) {
+    fn.glDeleteRenderbuffersEXTFn =
+        reinterpret_cast<glDeleteRenderbuffersEXTProc>(
+            GetGLProcAddress("glDeleteRenderbuffers"));
+  }
+
+  fn.glDeleteVertexArraysOESFn = 0;
+  debug_fn.glDeleteVertexArraysOESFn = 0;
+  if ((ver->is_gl3 || ver->is_gl4 || ver->is_es3) ||
+      ext.b_GL_ARB_vertex_array_object) {
+    fn.glDeleteVertexArraysOESFn =
+        reinterpret_cast<glDeleteVertexArraysOESProc>(
+            GetGLProcAddress("glDeleteVertexArrays"));
+  }
+  if (!fn.glDeleteVertexArraysOESFn && (ext.b_GL_OES_vertex_array_object)) {
+    fn.glDeleteVertexArraysOESFn =
+        reinterpret_cast<glDeleteVertexArraysOESProc>(
+            GetGLProcAddress("glDeleteVertexArraysOES"));
+  }
+  if (!fn.glDeleteVertexArraysOESFn) {
+    fn.glDeleteVertexArraysOESFn =
+        reinterpret_cast<glDeleteVertexArraysOESProc>(
+            GetGLProcAddress("glDeleteVertexArraysAPPLE"));
+  }
+
+  fn.glDrawArraysInstancedANGLEFn = 0;
+  debug_fn.glDrawArraysInstancedANGLEFn = 0;
+  if (ext.b_GL_ARB_draw_instanced) {
+    fn.glDrawArraysInstancedANGLEFn =
+        reinterpret_cast<glDrawArraysInstancedANGLEProc>(
+            GetGLProcAddress("glDrawArraysInstancedARB"));
+  }
+  if (!fn.glDrawArraysInstancedANGLEFn && (ext.b_GL_ANGLE_instanced_arrays)) {
+    fn.glDrawArraysInstancedANGLEFn =
+        reinterpret_cast<glDrawArraysInstancedANGLEProc>(
+            GetGLProcAddress("glDrawArraysInstancedANGLE"));
+  }
+  if (!fn.glDrawArraysInstancedANGLEFn) {
+    fn.glDrawArraysInstancedANGLEFn =
+        reinterpret_cast<glDrawArraysInstancedANGLEProc>(
+            GetGLProcAddress("glDrawArraysInstanced"));
+  }
+
+  fn.glDrawBuffersARBFn = 0;
+  debug_fn.glDrawBuffersARBFn = 0;
+  if (ext.b_GL_ARB_draw_buffers) {
+    fn.glDrawBuffersARBFn = reinterpret_cast<glDrawBuffersARBProc>(
+        GetGLProcAddress("glDrawBuffersARB"));
+  }
+  if (!fn.glDrawBuffersARBFn && (ext.b_GL_EXT_draw_buffers)) {
+    fn.glDrawBuffersARBFn = reinterpret_cast<glDrawBuffersARBProc>(
+        GetGLProcAddress("glDrawBuffersEXT"));
+  }
+  if (!fn.glDrawBuffersARBFn) {
+    fn.glDrawBuffersARBFn = reinterpret_cast<glDrawBuffersARBProc>(
+        GetGLProcAddress("glDrawBuffers"));
+  }
+
+  fn.glDrawElementsInstancedANGLEFn = 0;
+  debug_fn.glDrawElementsInstancedANGLEFn = 0;
+  if (ext.b_GL_ARB_draw_instanced) {
+    fn.glDrawElementsInstancedANGLEFn =
+        reinterpret_cast<glDrawElementsInstancedANGLEProc>(
+            GetGLProcAddress("glDrawElementsInstancedARB"));
+  }
+  if (!fn.glDrawElementsInstancedANGLEFn && (ext.b_GL_ANGLE_instanced_arrays)) {
+    fn.glDrawElementsInstancedANGLEFn =
+        reinterpret_cast<glDrawElementsInstancedANGLEProc>(
+            GetGLProcAddress("glDrawElementsInstancedANGLE"));
+  }
+  if (!fn.glDrawElementsInstancedANGLEFn) {
+    fn.glDrawElementsInstancedANGLEFn =
+        reinterpret_cast<glDrawElementsInstancedANGLEProc>(
+            GetGLProcAddress("glDrawElementsInstanced"));
+  }
+
+  fn.glEndQueryARBFn = 0;
+  debug_fn.glEndQueryARBFn = 0;
+  if (ext.b_GL_ARB_occlusion_query) {
+    fn.glEndQueryARBFn =
+        reinterpret_cast<glEndQueryARBProc>(GetGLProcAddress("glEndQueryARB"));
+  }
+  if (!fn.glEndQueryARBFn) {
+    fn.glEndQueryARBFn =
+        reinterpret_cast<glEndQueryARBProc>(GetGLProcAddress("glEndQueryEXT"));
+  }
+
+  fn.glFramebufferRenderbufferEXTFn = 0;
+  debug_fn.glFramebufferRenderbufferEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glFramebufferRenderbufferEXTFn =
+        reinterpret_cast<glFramebufferRenderbufferEXTProc>(
+            GetGLProcAddress("glFramebufferRenderbufferEXT"));
+  }
+  if (!fn.glFramebufferRenderbufferEXTFn) {
+    fn.glFramebufferRenderbufferEXTFn =
+        reinterpret_cast<glFramebufferRenderbufferEXTProc>(
+            GetGLProcAddress("glFramebufferRenderbuffer"));
+  }
+
+  fn.glFramebufferTexture2DEXTFn = 0;
+  debug_fn.glFramebufferTexture2DEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glFramebufferTexture2DEXTFn =
+        reinterpret_cast<glFramebufferTexture2DEXTProc>(
+            GetGLProcAddress("glFramebufferTexture2DEXT"));
+  }
+  if (!fn.glFramebufferTexture2DEXTFn) {
+    fn.glFramebufferTexture2DEXTFn =
+        reinterpret_cast<glFramebufferTexture2DEXTProc>(
+            GetGLProcAddress("glFramebufferTexture2D"));
+  }
+
+  fn.glGenBuffersARBFn = 0;
+  debug_fn.glGenBuffersARBFn = 0;
+  if (ext.b_GL_ARB_vertex_buffer_object) {
+    fn.glGenBuffersARBFn = reinterpret_cast<glGenBuffersARBProc>(
+        GetGLProcAddress("glGenBuffersARB"));
+  }
+  if (!fn.glGenBuffersARBFn) {
+    fn.glGenBuffersARBFn =
+        reinterpret_cast<glGenBuffersARBProc>(GetGLProcAddress("glGenBuffers"));
+  }
+
+  fn.glGenerateMipmapEXTFn = 0;
+  debug_fn.glGenerateMipmapEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glGenerateMipmapEXTFn = reinterpret_cast<glGenerateMipmapEXTProc>(
+        GetGLProcAddress("glGenerateMipmapEXT"));
+  }
+  if (!fn.glGenerateMipmapEXTFn) {
+    fn.glGenerateMipmapEXTFn = reinterpret_cast<glGenerateMipmapEXTProc>(
+        GetGLProcAddress("glGenerateMipmap"));
+  }
+
+  fn.glGenFramebuffersEXTFn = 0;
+  debug_fn.glGenFramebuffersEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glGenFramebuffersEXTFn = reinterpret_cast<glGenFramebuffersEXTProc>(
+        GetGLProcAddress("glGenFramebuffersEXT"));
+  }
+  if (!fn.glGenFramebuffersEXTFn) {
+    fn.glGenFramebuffersEXTFn = reinterpret_cast<glGenFramebuffersEXTProc>(
+        GetGLProcAddress("glGenFramebuffers"));
+  }
+
+  fn.glGenQueriesARBFn = 0;
+  debug_fn.glGenQueriesARBFn = 0;
+  if (ext.b_GL_ARB_occlusion_query) {
+    fn.glGenQueriesARBFn = reinterpret_cast<glGenQueriesARBProc>(
+        GetGLProcAddress("glGenQueriesARB"));
+  }
+  if (!fn.glGenQueriesARBFn) {
+    fn.glGenQueriesARBFn = reinterpret_cast<glGenQueriesARBProc>(
+        GetGLProcAddress("glGenQueriesEXT"));
+  }
+
+  fn.glGenRenderbuffersEXTFn = 0;
+  debug_fn.glGenRenderbuffersEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glGenRenderbuffersEXTFn = reinterpret_cast<glGenRenderbuffersEXTProc>(
+        GetGLProcAddress("glGenRenderbuffersEXT"));
+  }
+  if (!fn.glGenRenderbuffersEXTFn) {
+    fn.glGenRenderbuffersEXTFn = reinterpret_cast<glGenRenderbuffersEXTProc>(
+        GetGLProcAddress("glGenRenderbuffers"));
+  }
+
+  fn.glGenVertexArraysOESFn = 0;
+  debug_fn.glGenVertexArraysOESFn = 0;
+  if ((ver->is_gl3 || ver->is_gl4 || ver->is_es3) ||
+      ext.b_GL_ARB_vertex_array_object) {
+    fn.glGenVertexArraysOESFn = reinterpret_cast<glGenVertexArraysOESProc>(
+        GetGLProcAddress("glGenVertexArrays"));
+  }
+  if (!fn.glGenVertexArraysOESFn && (ext.b_GL_OES_vertex_array_object)) {
+    fn.glGenVertexArraysOESFn = reinterpret_cast<glGenVertexArraysOESProc>(
+        GetGLProcAddress("glGenVertexArraysOES"));
+  }
+  if (!fn.glGenVertexArraysOESFn) {
+    fn.glGenVertexArraysOESFn = reinterpret_cast<glGenVertexArraysOESProc>(
+        GetGLProcAddress("glGenVertexArraysAPPLE"));
+  }
+
+  fn.glGetFramebufferAttachmentParameterivEXTFn = 0;
+  debug_fn.glGetFramebufferAttachmentParameterivEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glGetFramebufferAttachmentParameterivEXTFn =
+        reinterpret_cast<glGetFramebufferAttachmentParameterivEXTProc>(
+            GetGLProcAddress("glGetFramebufferAttachmentParameterivEXT"));
+  }
+  if (!fn.glGetFramebufferAttachmentParameterivEXTFn) {
+    fn.glGetFramebufferAttachmentParameterivEXTFn =
+        reinterpret_cast<glGetFramebufferAttachmentParameterivEXTProc>(
+            GetGLProcAddress("glGetFramebufferAttachmentParameteriv"));
+  }
+
+  fn.glGetGraphicsResetStatusARBFn = 0;
+  debug_fn.glGetGraphicsResetStatusARBFn = 0;
+  if (ext.b_GL_ARB_robustness) {
+    fn.glGetGraphicsResetStatusARBFn =
+        reinterpret_cast<glGetGraphicsResetStatusARBProc>(
+            GetGLProcAddress("glGetGraphicsResetStatusARB"));
+  }
+  if (!fn.glGetGraphicsResetStatusARBFn && (ext.b_GL_KHR_robustness)) {
+    fn.glGetGraphicsResetStatusARBFn =
+        reinterpret_cast<glGetGraphicsResetStatusARBProc>(
+            GetGLProcAddress("glGetGraphicsResetStatusKHR"));
+  }
+  if (!fn.glGetGraphicsResetStatusARBFn && (ext.b_GL_EXT_robustness)) {
+    fn.glGetGraphicsResetStatusARBFn =
+        reinterpret_cast<glGetGraphicsResetStatusARBProc>(
+            GetGLProcAddress("glGetGraphicsResetStatusEXT"));
+  }
+  if (!fn.glGetGraphicsResetStatusARBFn) {
+    fn.glGetGraphicsResetStatusARBFn =
+        reinterpret_cast<glGetGraphicsResetStatusARBProc>(
+            GetGLProcAddress("glGetGraphicsResetStatus"));
+  }
+
+  fn.glGetProgramBinaryFn = 0;
+  debug_fn.glGetProgramBinaryFn = 0;
+  if (ext.b_GL_OES_get_program_binary) {
+    fn.glGetProgramBinaryFn = reinterpret_cast<glGetProgramBinaryProc>(
+        GetGLProcAddress("glGetProgramBinaryOES"));
+  }
+  if (!fn.glGetProgramBinaryFn) {
+    fn.glGetProgramBinaryFn = reinterpret_cast<glGetProgramBinaryProc>(
+        GetGLProcAddress("glGetProgramBinary"));
+  }
+
+  fn.glGetQueryivARBFn = 0;
+  debug_fn.glGetQueryivARBFn = 0;
+  if (ext.b_GL_ARB_occlusion_query) {
+    fn.glGetQueryivARBFn = reinterpret_cast<glGetQueryivARBProc>(
+        GetGLProcAddress("glGetQueryivARB"));
+  }
+  if (!fn.glGetQueryivARBFn) {
+    fn.glGetQueryivARBFn = reinterpret_cast<glGetQueryivARBProc>(
+        GetGLProcAddress("glGetQueryivEXT"));
+  }
+
+  fn.glGetQueryObjectivARBFn = 0;
+  debug_fn.glGetQueryObjectivARBFn = 0;
+  if (ext.b_GL_ARB_occlusion_query) {
+    fn.glGetQueryObjectivARBFn = reinterpret_cast<glGetQueryObjectivARBProc>(
+        GetGLProcAddress("glGetQueryObjectivARB"));
+  }
+  if (!fn.glGetQueryObjectivARBFn) {
+    fn.glGetQueryObjectivARBFn = reinterpret_cast<glGetQueryObjectivARBProc>(
+        GetGLProcAddress("glGetQueryObjectivEXT"));
+  }
+
+  fn.glGetQueryObjectui64vFn = 0;
+  debug_fn.glGetQueryObjectui64vFn = 0;
+  if (ext.b_GL_ARB_timer_query) {
+    fn.glGetQueryObjectui64vFn = reinterpret_cast<glGetQueryObjectui64vProc>(
+        GetGLProcAddress("glGetQueryObjectui64v"));
+  }
+  if (!fn.glGetQueryObjectui64vFn) {
+    fn.glGetQueryObjectui64vFn = reinterpret_cast<glGetQueryObjectui64vProc>(
+        GetGLProcAddress("glGetQueryObjectui64vEXT"));
+  }
+
+  fn.glGetQueryObjectuivARBFn = 0;
+  debug_fn.glGetQueryObjectuivARBFn = 0;
+  if (ext.b_GL_ARB_occlusion_query) {
+    fn.glGetQueryObjectuivARBFn = reinterpret_cast<glGetQueryObjectuivARBProc>(
+        GetGLProcAddress("glGetQueryObjectuivARB"));
+  }
+  if (!fn.glGetQueryObjectuivARBFn) {
+    fn.glGetQueryObjectuivARBFn = reinterpret_cast<glGetQueryObjectuivARBProc>(
+        GetGLProcAddress("glGetQueryObjectuivEXT"));
+  }
+
+  fn.glGetRenderbufferParameterivEXTFn = 0;
+  debug_fn.glGetRenderbufferParameterivEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glGetRenderbufferParameterivEXTFn =
+        reinterpret_cast<glGetRenderbufferParameterivEXTProc>(
+            GetGLProcAddress("glGetRenderbufferParameterivEXT"));
+  }
+  if (!fn.glGetRenderbufferParameterivEXTFn) {
+    fn.glGetRenderbufferParameterivEXTFn =
+        reinterpret_cast<glGetRenderbufferParameterivEXTProc>(
+            GetGLProcAddress("glGetRenderbufferParameteriv"));
+  }
+
+  fn.glIsFramebufferEXTFn = 0;
+  debug_fn.glIsFramebufferEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glIsFramebufferEXTFn = reinterpret_cast<glIsFramebufferEXTProc>(
+        GetGLProcAddress("glIsFramebufferEXT"));
+  }
+  if (!fn.glIsFramebufferEXTFn) {
+    fn.glIsFramebufferEXTFn = reinterpret_cast<glIsFramebufferEXTProc>(
+        GetGLProcAddress("glIsFramebuffer"));
+  }
+
+  fn.glIsQueryARBFn = 0;
+  debug_fn.glIsQueryARBFn = 0;
+  if (ext.b_GL_ARB_occlusion_query) {
+    fn.glIsQueryARBFn =
+        reinterpret_cast<glIsQueryARBProc>(GetGLProcAddress("glIsQueryARB"));
+  }
+  if (!fn.glIsQueryARBFn) {
+    fn.glIsQueryARBFn =
+        reinterpret_cast<glIsQueryARBProc>(GetGLProcAddress("glIsQueryEXT"));
+  }
+
+  fn.glIsRenderbufferEXTFn = 0;
+  debug_fn.glIsRenderbufferEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glIsRenderbufferEXTFn = reinterpret_cast<glIsRenderbufferEXTProc>(
+        GetGLProcAddress("glIsRenderbufferEXT"));
+  }
+  if (!fn.glIsRenderbufferEXTFn) {
+    fn.glIsRenderbufferEXTFn = reinterpret_cast<glIsRenderbufferEXTProc>(
+        GetGLProcAddress("glIsRenderbuffer"));
+  }
+
+  fn.glIsVertexArrayOESFn = 0;
+  debug_fn.glIsVertexArrayOESFn = 0;
+  if ((ver->is_gl3 || ver->is_gl4 || ver->is_es3) ||
+      ext.b_GL_ARB_vertex_array_object) {
+    fn.glIsVertexArrayOESFn = reinterpret_cast<glIsVertexArrayOESProc>(
+        GetGLProcAddress("glIsVertexArray"));
+  }
+  if (!fn.glIsVertexArrayOESFn && (ext.b_GL_OES_vertex_array_object)) {
+    fn.glIsVertexArrayOESFn = reinterpret_cast<glIsVertexArrayOESProc>(
+        GetGLProcAddress("glIsVertexArrayOES"));
+  }
+  if (!fn.glIsVertexArrayOESFn) {
+    fn.glIsVertexArrayOESFn = reinterpret_cast<glIsVertexArrayOESProc>(
+        GetGLProcAddress("glIsVertexArrayAPPLE"));
+  }
+
+  fn.glMapBufferFn = 0;
+  debug_fn.glMapBufferFn = 0;
+  if (ext.b_GL_OES_mapbuffer) {
+    fn.glMapBufferFn =
+        reinterpret_cast<glMapBufferProc>(GetGLProcAddress("glMapBufferOES"));
+  }
+  if (!fn.glMapBufferFn) {
+    fn.glMapBufferFn =
+        reinterpret_cast<glMapBufferProc>(GetGLProcAddress("glMapBuffer"));
+  }
+
+  fn.glMapBufferRangeFn = 0;
+  debug_fn.glMapBufferRangeFn = 0;
+  if ((ver->is_gl3 || ver->is_gl4 || ver->is_es3) ||
+      ext.b_GL_ARB_map_buffer_range) {
+    fn.glMapBufferRangeFn = reinterpret_cast<glMapBufferRangeProc>(
+        GetGLProcAddress("glMapBufferRange"));
+  }
+  if (!fn.glMapBufferRangeFn) {
+    fn.glMapBufferRangeFn = reinterpret_cast<glMapBufferRangeProc>(
+        GetGLProcAddress("glMapBufferRangeEXT"));
+  }
+
+  fn.glProgramBinaryFn = 0;
+  debug_fn.glProgramBinaryFn = 0;
+  if (ext.b_GL_OES_get_program_binary) {
+    fn.glProgramBinaryFn = reinterpret_cast<glProgramBinaryProc>(
+        GetGLProcAddress("glProgramBinaryOES"));
+  }
+  if (!fn.glProgramBinaryFn) {
+    fn.glProgramBinaryFn = reinterpret_cast<glProgramBinaryProc>(
+        GetGLProcAddress("glProgramBinary"));
+  }
+
+  fn.glQueryCounterFn = 0;
+  debug_fn.glQueryCounterFn = 0;
+  if (ext.b_GL_ARB_timer_query) {
+    fn.glQueryCounterFn = reinterpret_cast<glQueryCounterProc>(
+        GetGLProcAddress("glQueryCounter"));
+  }
+  if (!fn.glQueryCounterFn) {
+    fn.glQueryCounterFn = reinterpret_cast<glQueryCounterProc>(
+        GetGLProcAddress("glQueryCounterEXT"));
+  }
+
+  fn.glRenderbufferStorageEXTFn = 0;
+  debug_fn.glRenderbufferStorageEXTFn = 0;
+  if (ext.b_GL_EXT_framebuffer_object) {
+    fn.glRenderbufferStorageEXTFn =
+        reinterpret_cast<glRenderbufferStorageEXTProc>(
+            GetGLProcAddress("glRenderbufferStorageEXT"));
+  }
+  if (!fn.glRenderbufferStorageEXTFn) {
+    fn.glRenderbufferStorageEXTFn =
+        reinterpret_cast<glRenderbufferStorageEXTProc>(
+            GetGLProcAddress("glRenderbufferStorage"));
+  }
+
+  fn.glRenderbufferStorageMultisampleANGLEFn = 0;
+  debug_fn.glRenderbufferStorageMultisampleANGLEFn = 0;
+  if (ext.b_GL_ANGLE_framebuffer_multisample) {
+    fn.glRenderbufferStorageMultisampleANGLEFn =
+        reinterpret_cast<glRenderbufferStorageMultisampleANGLEProc>(
+            GetGLProcAddress("glRenderbufferStorageMultisampleANGLE"));
+  }
+  if (!fn.glRenderbufferStorageMultisampleANGLEFn) {
+    fn.glRenderbufferStorageMultisampleANGLEFn =
+        reinterpret_cast<glRenderbufferStorageMultisampleANGLEProc>(
+            GetGLProcAddress("glRenderbufferStorageMultisample"));
+  }
+
+  fn.glRenderbufferStorageMultisampleEXTFn = 0;
+  debug_fn.glRenderbufferStorageMultisampleEXTFn = 0;
+  if ((ext.b_GL_EXT_framebuffer_multisample ||
+       ext.b_GL_EXT_multisampled_render_to_texture)) {
+    fn.glRenderbufferStorageMultisampleEXTFn =
+        reinterpret_cast<glRenderbufferStorageMultisampleEXTProc>(
+            GetGLProcAddress("glRenderbufferStorageMultisampleEXT"));
+  }
+  if (!fn.glRenderbufferStorageMultisampleEXTFn) {
+    fn.glRenderbufferStorageMultisampleEXTFn =
+        reinterpret_cast<glRenderbufferStorageMultisampleEXTProc>(
+            GetGLProcAddress("glRenderbufferStorageMultisample"));
+  }
+
+  fn.glTexStorage2DEXTFn = 0;
+  debug_fn.glTexStorage2DEXTFn = 0;
+  if (ver->is_es3 || ext.b_GL_ARB_texture_storage) {
+    fn.glTexStorage2DEXTFn = reinterpret_cast<glTexStorage2DEXTProc>(
+        GetGLProcAddress("glTexStorage2D"));
+  }
+  if (!fn.glTexStorage2DEXTFn) {
+    fn.glTexStorage2DEXTFn = reinterpret_cast<glTexStorage2DEXTProc>(
+        GetGLProcAddress("glTexStorage2DEXT"));
+  }
+
+  fn.glUnmapBufferFn = 0;
+  debug_fn.glUnmapBufferFn = 0;
+  if (ext.b_GL_OES_mapbuffer) {
+    fn.glUnmapBufferFn = reinterpret_cast<glUnmapBufferProc>(
+        GetGLProcAddress("glUnmapBufferOES"));
+  }
+  if (!fn.glUnmapBufferFn) {
+    fn.glUnmapBufferFn =
+        reinterpret_cast<glUnmapBufferProc>(GetGLProcAddress("glUnmapBuffer"));
+  }
+
+  fn.glVertexAttribDivisorANGLEFn = 0;
+  debug_fn.glVertexAttribDivisorANGLEFn = 0;
+  if (ext.b_GL_ARB_instanced_arrays) {
+    fn.glVertexAttribDivisorANGLEFn =
+        reinterpret_cast<glVertexAttribDivisorANGLEProc>(
+            GetGLProcAddress("glVertexAttribDivisorARB"));
+  }
+  if (!fn.glVertexAttribDivisorANGLEFn && (ext.b_GL_ANGLE_instanced_arrays)) {
+    fn.glVertexAttribDivisorANGLEFn =
+        reinterpret_cast<glVertexAttribDivisorANGLEProc>(
+            GetGLProcAddress("glVertexAttribDivisorANGLE"));
+  }
+  if (!fn.glVertexAttribDivisorANGLEFn) {
+    fn.glVertexAttribDivisorANGLEFn =
+        reinterpret_cast<glVertexAttribDivisorANGLEProc>(
+            GetGLProcAddress("glVertexAttribDivisor"));
+  }
+
+  if (g_debugBindingsInitialized)
+    InitializeDebugBindings();
+}
+
+extern "C" {
+
+static void GL_BINDING_CALL Debug_glActiveTexture(GLenum texture) {
+  GL_SERVICE_LOG("glActiveTexture"
+                 << "(" << GLEnums::GetStringEnum(texture) << ")");
+  g_driver_gl.debug_fn.glActiveTextureFn(texture);
+}
+
+static void GL_BINDING_CALL
+Debug_glAttachShader(GLuint program, GLuint shader) {
+  GL_SERVICE_LOG("glAttachShader"
+                 << "(" << program << ", " << shader << ")");
+  g_driver_gl.debug_fn.glAttachShaderFn(program, shader);
+}
+
+static void GL_BINDING_CALL Debug_glBeginQuery(GLenum target, GLuint id) {
+  GL_SERVICE_LOG("glBeginQuery"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << id << ")");
+  g_driver_gl.debug_fn.glBeginQueryFn(target, id);
+}
+
+static void GL_BINDING_CALL Debug_glBeginQueryARB(GLenum target, GLuint id) {
+  GL_SERVICE_LOG("glBeginQueryARB"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << id << ")");
+  g_driver_gl.debug_fn.glBeginQueryARBFn(target, id);
+}
+
+static void GL_BINDING_CALL
+Debug_glBeginTransformFeedback(GLenum primitiveMode) {
+  GL_SERVICE_LOG("glBeginTransformFeedback"
+                 << "(" << GLEnums::GetStringEnum(primitiveMode) << ")");
+  g_driver_gl.debug_fn.glBeginTransformFeedbackFn(primitiveMode);
+}
+
+static void GL_BINDING_CALL
+Debug_glBindAttribLocation(GLuint program, GLuint index, const char* name) {
+  GL_SERVICE_LOG("glBindAttribLocation"
+                 << "(" << program << ", " << index << ", " << name << ")");
+  g_driver_gl.debug_fn.glBindAttribLocationFn(program, index, name);
+}
+
+static void GL_BINDING_CALL Debug_glBindBuffer(GLenum target, GLuint buffer) {
+  GL_SERVICE_LOG("glBindBuffer"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << buffer
+                 << ")");
+  g_driver_gl.debug_fn.glBindBufferFn(target, buffer);
+}
+
+static void GL_BINDING_CALL
+Debug_glBindBufferBase(GLenum target, GLuint index, GLuint buffer) {
+  GL_SERVICE_LOG("glBindBufferBase"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << index
+                 << ", " << buffer << ")");
+  g_driver_gl.debug_fn.glBindBufferBaseFn(target, index, buffer);
+}
+
+static void GL_BINDING_CALL Debug_glBindBufferRange(GLenum target,
+                                                    GLuint index,
+                                                    GLuint buffer,
+                                                    GLintptr offset,
+                                                    GLsizeiptr size) {
+  GL_SERVICE_LOG("glBindBufferRange"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << index
+                 << ", " << buffer << ", " << offset << ", " << size << ")");
+  g_driver_gl.debug_fn.glBindBufferRangeFn(target, index, buffer, offset, size);
+}
+
+static void GL_BINDING_CALL Debug_glBindFragDataLocation(GLuint program,
+                                                         GLuint colorNumber,
+                                                         const char* name) {
+  GL_SERVICE_LOG("glBindFragDataLocation"
+                 << "(" << program << ", " << colorNumber << ", " << name
+                 << ")");
+  g_driver_gl.debug_fn.glBindFragDataLocationFn(program, colorNumber, name);
+}
+
+static void GL_BINDING_CALL
+Debug_glBindFragDataLocationIndexed(GLuint program,
+                                    GLuint colorNumber,
+                                    GLuint index,
+                                    const char* name) {
+  GL_SERVICE_LOG("glBindFragDataLocationIndexed"
+                 << "(" << program << ", " << colorNumber << ", " << index
+                 << ", " << name << ")");
+  g_driver_gl.debug_fn.glBindFragDataLocationIndexedFn(program, colorNumber,
+                                                       index, name);
+}
+
+static void GL_BINDING_CALL
+Debug_glBindFramebufferEXT(GLenum target, GLuint framebuffer) {
+  GL_SERVICE_LOG("glBindFramebufferEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << framebuffer
+                 << ")");
+  g_driver_gl.debug_fn.glBindFramebufferEXTFn(target, framebuffer);
+}
+
+static void GL_BINDING_CALL
+Debug_glBindRenderbufferEXT(GLenum target, GLuint renderbuffer) {
+  GL_SERVICE_LOG("glBindRenderbufferEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << renderbuffer << ")");
+  g_driver_gl.debug_fn.glBindRenderbufferEXTFn(target, renderbuffer);
+}
+
+static void GL_BINDING_CALL Debug_glBindSampler(GLuint unit, GLuint sampler) {
+  GL_SERVICE_LOG("glBindSampler"
+                 << "(" << unit << ", " << sampler << ")");
+  g_driver_gl.debug_fn.glBindSamplerFn(unit, sampler);
+}
+
+static void GL_BINDING_CALL Debug_glBindTexture(GLenum target, GLuint texture) {
+  GL_SERVICE_LOG("glBindTexture"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << texture
+                 << ")");
+  g_driver_gl.debug_fn.glBindTextureFn(target, texture);
+}
+
+static void GL_BINDING_CALL
+Debug_glBindTransformFeedback(GLenum target, GLuint id) {
+  GL_SERVICE_LOG("glBindTransformFeedback"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << id << ")");
+  g_driver_gl.debug_fn.glBindTransformFeedbackFn(target, id);
+}
+
+static void GL_BINDING_CALL Debug_glBindVertexArrayOES(GLuint array) {
+  GL_SERVICE_LOG("glBindVertexArrayOES"
+                 << "(" << array << ")");
+  g_driver_gl.debug_fn.glBindVertexArrayOESFn(array);
+}
+
+static void GL_BINDING_CALL Debug_glBlendBarrierKHR(void) {
+  GL_SERVICE_LOG("glBlendBarrierKHR"
+                 << "("
+                 << ")");
+  g_driver_gl.debug_fn.glBlendBarrierKHRFn();
+}
+
+static void GL_BINDING_CALL Debug_glBlendColor(GLclampf red,
+                                               GLclampf green,
+                                               GLclampf blue,
+                                               GLclampf alpha) {
+  GL_SERVICE_LOG("glBlendColor"
+                 << "(" << red << ", " << green << ", " << blue << ", " << alpha
+                 << ")");
+  g_driver_gl.debug_fn.glBlendColorFn(red, green, blue, alpha);
+}
+
+static void GL_BINDING_CALL Debug_glBlendEquation(GLenum mode) {
+  GL_SERVICE_LOG("glBlendEquation"
+                 << "(" << GLEnums::GetStringEnum(mode) << ")");
+  g_driver_gl.debug_fn.glBlendEquationFn(mode);
+}
+
+static void GL_BINDING_CALL
+Debug_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) {
+  GL_SERVICE_LOG("glBlendEquationSeparate"
+                 << "(" << GLEnums::GetStringEnum(modeRGB) << ", "
+                 << GLEnums::GetStringEnum(modeAlpha) << ")");
+  g_driver_gl.debug_fn.glBlendEquationSeparateFn(modeRGB, modeAlpha);
+}
+
+static void GL_BINDING_CALL Debug_glBlendFunc(GLenum sfactor, GLenum dfactor) {
+  GL_SERVICE_LOG("glBlendFunc"
+                 << "(" << GLEnums::GetStringEnum(sfactor) << ", "
+                 << GLEnums::GetStringEnum(dfactor) << ")");
+  g_driver_gl.debug_fn.glBlendFuncFn(sfactor, dfactor);
+}
+
+static void GL_BINDING_CALL Debug_glBlendFuncSeparate(GLenum srcRGB,
+                                                      GLenum dstRGB,
+                                                      GLenum srcAlpha,
+                                                      GLenum dstAlpha) {
+  GL_SERVICE_LOG("glBlendFuncSeparate"
+                 << "(" << GLEnums::GetStringEnum(srcRGB) << ", "
+                 << GLEnums::GetStringEnum(dstRGB) << ", "
+                 << GLEnums::GetStringEnum(srcAlpha) << ", "
+                 << GLEnums::GetStringEnum(dstAlpha) << ")");
+  g_driver_gl.debug_fn.glBlendFuncSeparateFn(srcRGB, dstRGB, srcAlpha,
+                                             dstAlpha);
+}
+
+static void GL_BINDING_CALL Debug_glBlitFramebuffer(GLint srcX0,
+                                                    GLint srcY0,
+                                                    GLint srcX1,
+                                                    GLint srcY1,
+                                                    GLint dstX0,
+                                                    GLint dstY0,
+                                                    GLint dstX1,
+                                                    GLint dstY1,
+                                                    GLbitfield mask,
+                                                    GLenum filter) {
+  GL_SERVICE_LOG("glBlitFramebuffer"
+                 << "(" << srcX0 << ", " << srcY0 << ", " << srcX1 << ", "
+                 << srcY1 << ", " << dstX0 << ", " << dstY0 << ", " << dstX1
+                 << ", " << dstY1 << ", " << mask << ", "
+                 << GLEnums::GetStringEnum(filter) << ")");
+  g_driver_gl.debug_fn.glBlitFramebufferFn(srcX0, srcY0, srcX1, srcY1, dstX0,
+                                           dstY0, dstX1, dstY1, mask, filter);
+}
+
+static void GL_BINDING_CALL Debug_glBlitFramebufferANGLE(GLint srcX0,
+                                                         GLint srcY0,
+                                                         GLint srcX1,
+                                                         GLint srcY1,
+                                                         GLint dstX0,
+                                                         GLint dstY0,
+                                                         GLint dstX1,
+                                                         GLint dstY1,
+                                                         GLbitfield mask,
+                                                         GLenum filter) {
+  GL_SERVICE_LOG("glBlitFramebufferANGLE"
+                 << "(" << srcX0 << ", " << srcY0 << ", " << srcX1 << ", "
+                 << srcY1 << ", " << dstX0 << ", " << dstY0 << ", " << dstX1
+                 << ", " << dstY1 << ", " << mask << ", "
+                 << GLEnums::GetStringEnum(filter) << ")");
+  g_driver_gl.debug_fn.glBlitFramebufferANGLEFn(
+      srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+static void GL_BINDING_CALL Debug_glBlitFramebufferEXT(GLint srcX0,
+                                                       GLint srcY0,
+                                                       GLint srcX1,
+                                                       GLint srcY1,
+                                                       GLint dstX0,
+                                                       GLint dstY0,
+                                                       GLint dstX1,
+                                                       GLint dstY1,
+                                                       GLbitfield mask,
+                                                       GLenum filter) {
+  GL_SERVICE_LOG("glBlitFramebufferEXT"
+                 << "(" << srcX0 << ", " << srcY0 << ", " << srcX1 << ", "
+                 << srcY1 << ", " << dstX0 << ", " << dstY0 << ", " << dstX1
+                 << ", " << dstY1 << ", " << mask << ", "
+                 << GLEnums::GetStringEnum(filter) << ")");
+  g_driver_gl.debug_fn.glBlitFramebufferEXTFn(
+      srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+static void GL_BINDING_CALL Debug_glBufferData(GLenum target,
+                                               GLsizeiptr size,
+                                               const void* data,
+                                               GLenum usage) {
+  GL_SERVICE_LOG("glBufferData"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << size
+                 << ", " << static_cast<const void*>(data) << ", "
+                 << GLEnums::GetStringEnum(usage) << ")");
+  g_driver_gl.debug_fn.glBufferDataFn(target, size, data, usage);
+}
+
+static void GL_BINDING_CALL Debug_glBufferSubData(GLenum target,
+                                                  GLintptr offset,
+                                                  GLsizeiptr size,
+                                                  const void* data) {
+  GL_SERVICE_LOG("glBufferSubData"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << offset
+                 << ", " << size << ", " << static_cast<const void*>(data)
+                 << ")");
+  g_driver_gl.debug_fn.glBufferSubDataFn(target, offset, size, data);
+}
+
+static GLenum GL_BINDING_CALL Debug_glCheckFramebufferStatusEXT(GLenum target) {
+  GL_SERVICE_LOG("glCheckFramebufferStatusEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ")");
+  GLenum result = g_driver_gl.debug_fn.glCheckFramebufferStatusEXTFn(target);
+
+  GL_SERVICE_LOG("GL_RESULT: " << GLEnums::GetStringEnum(result));
+
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glClear(GLbitfield mask) {
+  GL_SERVICE_LOG("glClear"
+                 << "(" << mask << ")");
+  g_driver_gl.debug_fn.glClearFn(mask);
+}
+
+static void GL_BINDING_CALL Debug_glClearBufferfi(GLenum buffer,
+                                                  GLint drawbuffer,
+                                                  const GLfloat depth,
+                                                  GLint stencil) {
+  GL_SERVICE_LOG("glClearBufferfi"
+                 << "(" << GLEnums::GetStringEnum(buffer) << ", " << drawbuffer
+                 << ", " << depth << ", " << stencil << ")");
+  g_driver_gl.debug_fn.glClearBufferfiFn(buffer, drawbuffer, depth, stencil);
+}
+
+static void GL_BINDING_CALL
+Debug_glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value) {
+  GL_SERVICE_LOG("glClearBufferfv"
+                 << "(" << GLEnums::GetStringEnum(buffer) << ", " << drawbuffer
+                 << ", " << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glClearBufferfvFn(buffer, drawbuffer, value);
+}
+
+static void GL_BINDING_CALL
+Debug_glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value) {
+  GL_SERVICE_LOG("glClearBufferiv"
+                 << "(" << GLEnums::GetStringEnum(buffer) << ", " << drawbuffer
+                 << ", " << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glClearBufferivFn(buffer, drawbuffer, value);
+}
+
+static void GL_BINDING_CALL
+Debug_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value) {
+  GL_SERVICE_LOG("glClearBufferuiv"
+                 << "(" << GLEnums::GetStringEnum(buffer) << ", " << drawbuffer
+                 << ", " << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glClearBufferuivFn(buffer, drawbuffer, value);
+}
+
+static void GL_BINDING_CALL Debug_glClearColor(GLclampf red,
+                                               GLclampf green,
+                                               GLclampf blue,
+                                               GLclampf alpha) {
+  GL_SERVICE_LOG("glClearColor"
+                 << "(" << red << ", " << green << ", " << blue << ", " << alpha
+                 << ")");
+  g_driver_gl.debug_fn.glClearColorFn(red, green, blue, alpha);
+}
+
+static void GL_BINDING_CALL Debug_glClearDepth(GLclampd depth) {
+  GL_SERVICE_LOG("glClearDepth"
+                 << "(" << depth << ")");
+  g_driver_gl.debug_fn.glClearDepthFn(depth);
+}
+
+static void GL_BINDING_CALL Debug_glClearDepthf(GLclampf depth) {
+  GL_SERVICE_LOG("glClearDepthf"
+                 << "(" << depth << ")");
+  g_driver_gl.debug_fn.glClearDepthfFn(depth);
+}
+
+static void GL_BINDING_CALL Debug_glClearStencil(GLint s) {
+  GL_SERVICE_LOG("glClearStencil"
+                 << "(" << s << ")");
+  g_driver_gl.debug_fn.glClearStencilFn(s);
+}
+
+static GLenum GL_BINDING_CALL
+Debug_glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) {
+  GL_SERVICE_LOG("glClientWaitSync"
+                 << "(" << sync << ", " << flags << ", " << timeout << ")");
+  GLenum result = g_driver_gl.debug_fn.glClientWaitSyncFn(sync, flags, timeout);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glColorMask(GLboolean red,
+                                              GLboolean green,
+                                              GLboolean blue,
+                                              GLboolean alpha) {
+  GL_SERVICE_LOG("glColorMask"
+                 << "(" << GLEnums::GetStringBool(red) << ", "
+                 << GLEnums::GetStringBool(green) << ", "
+                 << GLEnums::GetStringBool(blue) << ", "
+                 << GLEnums::GetStringBool(alpha) << ")");
+  g_driver_gl.debug_fn.glColorMaskFn(red, green, blue, alpha);
+}
+
+static void GL_BINDING_CALL Debug_glCompileShader(GLuint shader) {
+  GL_SERVICE_LOG("glCompileShader"
+                 << "(" << shader << ")");
+  g_driver_gl.debug_fn.glCompileShaderFn(shader);
+}
+
+static void GL_BINDING_CALL Debug_glCompressedTexImage2D(GLenum target,
+                                                         GLint level,
+                                                         GLenum internalformat,
+                                                         GLsizei width,
+                                                         GLsizei height,
+                                                         GLint border,
+                                                         GLsizei imageSize,
+                                                         const void* data) {
+  GL_SERVICE_LOG("glCompressedTexImage2D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", "
+                 << width << ", " << height << ", " << border << ", "
+                 << imageSize << ", " << static_cast<const void*>(data) << ")");
+  g_driver_gl.debug_fn.glCompressedTexImage2DFn(
+      target, level, internalformat, width, height, border, imageSize, data);
+}
+
+static void GL_BINDING_CALL Debug_glCompressedTexImage3D(GLenum target,
+                                                         GLint level,
+                                                         GLenum internalformat,
+                                                         GLsizei width,
+                                                         GLsizei height,
+                                                         GLsizei depth,
+                                                         GLint border,
+                                                         GLsizei imageSize,
+                                                         const void* data) {
+  GL_SERVICE_LOG("glCompressedTexImage3D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", "
+                 << width << ", " << height << ", " << depth << ", " << border
+                 << ", " << imageSize << ", " << static_cast<const void*>(data)
+                 << ")");
+  g_driver_gl.debug_fn.glCompressedTexImage3DFn(target, level, internalformat,
+                                                width, height, depth, border,
+                                                imageSize, data);
+}
+
+static void GL_BINDING_CALL Debug_glCompressedTexSubImage2D(GLenum target,
+                                                            GLint level,
+                                                            GLint xoffset,
+                                                            GLint yoffset,
+                                                            GLsizei width,
+                                                            GLsizei height,
+                                                            GLenum format,
+                                                            GLsizei imageSize,
+                                                            const void* data) {
+  GL_SERVICE_LOG("glCompressedTexSubImage2D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << xoffset << ", " << yoffset << ", " << width << ", "
+                 << height << ", " << GLEnums::GetStringEnum(format) << ", "
+                 << imageSize << ", " << static_cast<const void*>(data) << ")");
+  g_driver_gl.debug_fn.glCompressedTexSubImage2DFn(
+      target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+static void GL_BINDING_CALL Debug_glCopyBufferSubData(GLenum readTarget,
+                                                      GLenum writeTarget,
+                                                      GLintptr readOffset,
+                                                      GLintptr writeOffset,
+                                                      GLsizeiptr size) {
+  GL_SERVICE_LOG("glCopyBufferSubData"
+                 << "(" << GLEnums::GetStringEnum(readTarget) << ", "
+                 << GLEnums::GetStringEnum(writeTarget) << ", " << readOffset
+                 << ", " << writeOffset << ", " << size << ")");
+  g_driver_gl.debug_fn.glCopyBufferSubDataFn(readTarget, writeTarget,
+                                             readOffset, writeOffset, size);
+}
+
+static void GL_BINDING_CALL Debug_glCopyTexImage2D(GLenum target,
+                                                   GLint level,
+                                                   GLenum internalformat,
+                                                   GLint x,
+                                                   GLint y,
+                                                   GLsizei width,
+                                                   GLsizei height,
+                                                   GLint border) {
+  GL_SERVICE_LOG("glCopyTexImage2D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", " << x
+                 << ", " << y << ", " << width << ", " << height << ", "
+                 << border << ")");
+  g_driver_gl.debug_fn.glCopyTexImage2DFn(target, level, internalformat, x, y,
+                                          width, height, border);
+}
+
+static void GL_BINDING_CALL Debug_glCopyTexSubImage2D(GLenum target,
+                                                      GLint level,
+                                                      GLint xoffset,
+                                                      GLint yoffset,
+                                                      GLint x,
+                                                      GLint y,
+                                                      GLsizei width,
+                                                      GLsizei height) {
+  GL_SERVICE_LOG("glCopyTexSubImage2D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << xoffset << ", " << yoffset << ", " << x << ", " << y
+                 << ", " << width << ", " << height << ")");
+  g_driver_gl.debug_fn.glCopyTexSubImage2DFn(target, level, xoffset, yoffset, x,
+                                             y, width, height);
+}
+
+static void GL_BINDING_CALL Debug_glCopyTexSubImage3D(GLenum target,
+                                                      GLint level,
+                                                      GLint xoffset,
+                                                      GLint yoffset,
+                                                      GLint zoffset,
+                                                      GLint x,
+                                                      GLint y,
+                                                      GLsizei width,
+                                                      GLsizei height) {
+  GL_SERVICE_LOG("glCopyTexSubImage3D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << xoffset << ", " << yoffset << ", " << zoffset
+                 << ", " << x << ", " << y << ", " << width << ", " << height
+                 << ")");
+  g_driver_gl.debug_fn.glCopyTexSubImage3DFn(target, level, xoffset, yoffset,
+                                             zoffset, x, y, width, height);
+}
+
+static GLuint GL_BINDING_CALL Debug_glCreateProgram(void) {
+  GL_SERVICE_LOG("glCreateProgram"
+                 << "("
+                 << ")");
+  GLuint result = g_driver_gl.debug_fn.glCreateProgramFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLuint GL_BINDING_CALL Debug_glCreateShader(GLenum type) {
+  GL_SERVICE_LOG("glCreateShader"
+                 << "(" << GLEnums::GetStringEnum(type) << ")");
+  GLuint result = g_driver_gl.debug_fn.glCreateShaderFn(type);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glCullFace(GLenum mode) {
+  GL_SERVICE_LOG("glCullFace"
+                 << "(" << GLEnums::GetStringEnum(mode) << ")");
+  g_driver_gl.debug_fn.glCullFaceFn(mode);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteBuffersARB(GLsizei n, const GLuint* buffers) {
+  GL_SERVICE_LOG("glDeleteBuffersARB"
+                 << "(" << n << ", " << static_cast<const void*>(buffers)
+                 << ")");
+  g_driver_gl.debug_fn.glDeleteBuffersARBFn(n, buffers);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteFencesAPPLE(GLsizei n, const GLuint* fences) {
+  GL_SERVICE_LOG("glDeleteFencesAPPLE"
+                 << "(" << n << ", " << static_cast<const void*>(fences)
+                 << ")");
+  g_driver_gl.debug_fn.glDeleteFencesAPPLEFn(n, fences);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteFencesNV(GLsizei n, const GLuint* fences) {
+  GL_SERVICE_LOG("glDeleteFencesNV"
+                 << "(" << n << ", " << static_cast<const void*>(fences)
+                 << ")");
+  g_driver_gl.debug_fn.glDeleteFencesNVFn(n, fences);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteFramebuffersEXT(GLsizei n, const GLuint* framebuffers) {
+  GL_SERVICE_LOG("glDeleteFramebuffersEXT"
+                 << "(" << n << ", " << static_cast<const void*>(framebuffers)
+                 << ")");
+  g_driver_gl.debug_fn.glDeleteFramebuffersEXTFn(n, framebuffers);
+}
+
+static void GL_BINDING_CALL Debug_glDeleteProgram(GLuint program) {
+  GL_SERVICE_LOG("glDeleteProgram"
+                 << "(" << program << ")");
+  g_driver_gl.debug_fn.glDeleteProgramFn(program);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteQueries(GLsizei n, const GLuint* ids) {
+  GL_SERVICE_LOG("glDeleteQueries"
+                 << "(" << n << ", " << static_cast<const void*>(ids) << ")");
+  g_driver_gl.debug_fn.glDeleteQueriesFn(n, ids);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteQueriesARB(GLsizei n, const GLuint* ids) {
+  GL_SERVICE_LOG("glDeleteQueriesARB"
+                 << "(" << n << ", " << static_cast<const void*>(ids) << ")");
+  g_driver_gl.debug_fn.glDeleteQueriesARBFn(n, ids);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteRenderbuffersEXT(GLsizei n, const GLuint* renderbuffers) {
+  GL_SERVICE_LOG("glDeleteRenderbuffersEXT"
+                 << "(" << n << ", " << static_cast<const void*>(renderbuffers)
+                 << ")");
+  g_driver_gl.debug_fn.glDeleteRenderbuffersEXTFn(n, renderbuffers);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteSamplers(GLsizei n, const GLuint* samplers) {
+  GL_SERVICE_LOG("glDeleteSamplers"
+                 << "(" << n << ", " << static_cast<const void*>(samplers)
+                 << ")");
+  g_driver_gl.debug_fn.glDeleteSamplersFn(n, samplers);
+}
+
+static void GL_BINDING_CALL Debug_glDeleteShader(GLuint shader) {
+  GL_SERVICE_LOG("glDeleteShader"
+                 << "(" << shader << ")");
+  g_driver_gl.debug_fn.glDeleteShaderFn(shader);
+}
+
+static void GL_BINDING_CALL Debug_glDeleteSync(GLsync sync) {
+  GL_SERVICE_LOG("glDeleteSync"
+                 << "(" << sync << ")");
+  g_driver_gl.debug_fn.glDeleteSyncFn(sync);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteTextures(GLsizei n, const GLuint* textures) {
+  GL_SERVICE_LOG("glDeleteTextures"
+                 << "(" << n << ", " << static_cast<const void*>(textures)
+                 << ")");
+  g_driver_gl.debug_fn.glDeleteTexturesFn(n, textures);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids) {
+  GL_SERVICE_LOG("glDeleteTransformFeedbacks"
+                 << "(" << n << ", " << static_cast<const void*>(ids) << ")");
+  g_driver_gl.debug_fn.glDeleteTransformFeedbacksFn(n, ids);
+}
+
+static void GL_BINDING_CALL
+Debug_glDeleteVertexArraysOES(GLsizei n, const GLuint* arrays) {
+  GL_SERVICE_LOG("glDeleteVertexArraysOES"
+                 << "(" << n << ", " << static_cast<const void*>(arrays)
+                 << ")");
+  g_driver_gl.debug_fn.glDeleteVertexArraysOESFn(n, arrays);
+}
+
+static void GL_BINDING_CALL Debug_glDepthFunc(GLenum func) {
+  GL_SERVICE_LOG("glDepthFunc"
+                 << "(" << GLEnums::GetStringEnum(func) << ")");
+  g_driver_gl.debug_fn.glDepthFuncFn(func);
+}
+
+static void GL_BINDING_CALL Debug_glDepthMask(GLboolean flag) {
+  GL_SERVICE_LOG("glDepthMask"
+                 << "(" << GLEnums::GetStringBool(flag) << ")");
+  g_driver_gl.debug_fn.glDepthMaskFn(flag);
+}
+
+static void GL_BINDING_CALL Debug_glDepthRange(GLclampd zNear, GLclampd zFar) {
+  GL_SERVICE_LOG("glDepthRange"
+                 << "(" << zNear << ", " << zFar << ")");
+  g_driver_gl.debug_fn.glDepthRangeFn(zNear, zFar);
+}
+
+static void GL_BINDING_CALL Debug_glDepthRangef(GLclampf zNear, GLclampf zFar) {
+  GL_SERVICE_LOG("glDepthRangef"
+                 << "(" << zNear << ", " << zFar << ")");
+  g_driver_gl.debug_fn.glDepthRangefFn(zNear, zFar);
+}
+
+static void GL_BINDING_CALL
+Debug_glDetachShader(GLuint program, GLuint shader) {
+  GL_SERVICE_LOG("glDetachShader"
+                 << "(" << program << ", " << shader << ")");
+  g_driver_gl.debug_fn.glDetachShaderFn(program, shader);
+}
+
+static void GL_BINDING_CALL Debug_glDisable(GLenum cap) {
+  GL_SERVICE_LOG("glDisable"
+                 << "(" << GLEnums::GetStringEnum(cap) << ")");
+  g_driver_gl.debug_fn.glDisableFn(cap);
+}
+
+static void GL_BINDING_CALL Debug_glDisableVertexAttribArray(GLuint index) {
+  GL_SERVICE_LOG("glDisableVertexAttribArray"
+                 << "(" << index << ")");
+  g_driver_gl.debug_fn.glDisableVertexAttribArrayFn(index);
+}
+
+static void GL_BINDING_CALL
+Debug_glDiscardFramebufferEXT(GLenum target,
+                              GLsizei numAttachments,
+                              const GLenum* attachments) {
+  GL_SERVICE_LOG("glDiscardFramebufferEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << numAttachments << ", "
+                 << static_cast<const void*>(attachments) << ")");
+  g_driver_gl.debug_fn.glDiscardFramebufferEXTFn(target, numAttachments,
+                                                 attachments);
+}
+
+static void GL_BINDING_CALL
+Debug_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
+  GL_SERVICE_LOG("glDrawArrays"
+                 << "(" << GLEnums::GetStringEnum(mode) << ", " << first << ", "
+                 << count << ")");
+  g_driver_gl.debug_fn.glDrawArraysFn(mode, first, count);
+}
+
+static void GL_BINDING_CALL
+Debug_glDrawArraysInstancedANGLE(GLenum mode,
+                                 GLint first,
+                                 GLsizei count,
+                                 GLsizei primcount) {
+  GL_SERVICE_LOG("glDrawArraysInstancedANGLE"
+                 << "(" << GLEnums::GetStringEnum(mode) << ", " << first << ", "
+                 << count << ", " << primcount << ")");
+  g_driver_gl.debug_fn.glDrawArraysInstancedANGLEFn(mode, first, count,
+                                                    primcount);
+}
+
+static void GL_BINDING_CALL Debug_glDrawBuffer(GLenum mode) {
+  GL_SERVICE_LOG("glDrawBuffer"
+                 << "(" << GLEnums::GetStringEnum(mode) << ")");
+  g_driver_gl.debug_fn.glDrawBufferFn(mode);
+}
+
+static void GL_BINDING_CALL
+Debug_glDrawBuffersARB(GLsizei n, const GLenum* bufs) {
+  GL_SERVICE_LOG("glDrawBuffersARB"
+                 << "(" << n << ", " << static_cast<const void*>(bufs) << ")");
+  g_driver_gl.debug_fn.glDrawBuffersARBFn(n, bufs);
+}
+
+static void GL_BINDING_CALL Debug_glDrawElements(GLenum mode,
+                                                 GLsizei count,
+                                                 GLenum type,
+                                                 const void* indices) {
+  GL_SERVICE_LOG("glDrawElements"
+                 << "(" << GLEnums::GetStringEnum(mode) << ", " << count << ", "
+                 << GLEnums::GetStringEnum(type) << ", "
+                 << static_cast<const void*>(indices) << ")");
+  g_driver_gl.debug_fn.glDrawElementsFn(mode, count, type, indices);
+}
+
+static void GL_BINDING_CALL
+Debug_glDrawElementsInstancedANGLE(GLenum mode,
+                                   GLsizei count,
+                                   GLenum type,
+                                   const void* indices,
+                                   GLsizei primcount) {
+  GL_SERVICE_LOG("glDrawElementsInstancedANGLE"
+                 << "(" << GLEnums::GetStringEnum(mode) << ", " << count << ", "
+                 << GLEnums::GetStringEnum(type) << ", "
+                 << static_cast<const void*>(indices) << ", " << primcount
+                 << ")");
+  g_driver_gl.debug_fn.glDrawElementsInstancedANGLEFn(mode, count, type,
+                                                      indices, primcount);
+}
+
+static void GL_BINDING_CALL Debug_glDrawRangeElements(GLenum mode,
+                                                      GLuint start,
+                                                      GLuint end,
+                                                      GLsizei count,
+                                                      GLenum type,
+                                                      const void* indices) {
+  GL_SERVICE_LOG("glDrawRangeElements"
+                 << "(" << GLEnums::GetStringEnum(mode) << ", " << start << ", "
+                 << end << ", " << count << ", " << GLEnums::GetStringEnum(type)
+                 << ", " << static_cast<const void*>(indices) << ")");
+  g_driver_gl.debug_fn.glDrawRangeElementsFn(mode, start, end, count, type,
+                                             indices);
+}
+
+static void GL_BINDING_CALL
+Debug_glEGLImageTargetRenderbufferStorageOES(GLenum target,
+                                             GLeglImageOES image) {
+  GL_SERVICE_LOG("glEGLImageTargetRenderbufferStorageOES"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << image
+                 << ")");
+  g_driver_gl.debug_fn.glEGLImageTargetRenderbufferStorageOESFn(target, image);
+}
+
+static void GL_BINDING_CALL
+Debug_glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) {
+  GL_SERVICE_LOG("glEGLImageTargetTexture2DOES"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << image
+                 << ")");
+  g_driver_gl.debug_fn.glEGLImageTargetTexture2DOESFn(target, image);
+}
+
+static void GL_BINDING_CALL Debug_glEnable(GLenum cap) {
+  GL_SERVICE_LOG("glEnable"
+                 << "(" << GLEnums::GetStringEnum(cap) << ")");
+  g_driver_gl.debug_fn.glEnableFn(cap);
+}
+
+static void GL_BINDING_CALL Debug_glEnableVertexAttribArray(GLuint index) {
+  GL_SERVICE_LOG("glEnableVertexAttribArray"
+                 << "(" << index << ")");
+  g_driver_gl.debug_fn.glEnableVertexAttribArrayFn(index);
+}
+
+static void GL_BINDING_CALL Debug_glEndQuery(GLenum target) {
+  GL_SERVICE_LOG("glEndQuery"
+                 << "(" << GLEnums::GetStringEnum(target) << ")");
+  g_driver_gl.debug_fn.glEndQueryFn(target);
+}
+
+static void GL_BINDING_CALL Debug_glEndQueryARB(GLenum target) {
+  GL_SERVICE_LOG("glEndQueryARB"
+                 << "(" << GLEnums::GetStringEnum(target) << ")");
+  g_driver_gl.debug_fn.glEndQueryARBFn(target);
+}
+
+static void GL_BINDING_CALL Debug_glEndTransformFeedback(void) {
+  GL_SERVICE_LOG("glEndTransformFeedback"
+                 << "("
+                 << ")");
+  g_driver_gl.debug_fn.glEndTransformFeedbackFn();
+}
+
+static GLsync GL_BINDING_CALL
+Debug_glFenceSync(GLenum condition, GLbitfield flags) {
+  GL_SERVICE_LOG("glFenceSync"
+                 << "(" << GLEnums::GetStringEnum(condition) << ", " << flags
+                 << ")");
+  GLsync result = g_driver_gl.debug_fn.glFenceSyncFn(condition, flags);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glFinish(void) {
+  GL_SERVICE_LOG("glFinish"
+                 << "("
+                 << ")");
+  g_driver_gl.debug_fn.glFinishFn();
+}
+
+static void GL_BINDING_CALL Debug_glFinishFenceAPPLE(GLuint fence) {
+  GL_SERVICE_LOG("glFinishFenceAPPLE"
+                 << "(" << fence << ")");
+  g_driver_gl.debug_fn.glFinishFenceAPPLEFn(fence);
+}
+
+static void GL_BINDING_CALL Debug_glFinishFenceNV(GLuint fence) {
+  GL_SERVICE_LOG("glFinishFenceNV"
+                 << "(" << fence << ")");
+  g_driver_gl.debug_fn.glFinishFenceNVFn(fence);
+}
+
+static void GL_BINDING_CALL Debug_glFlush(void) {
+  GL_SERVICE_LOG("glFlush"
+                 << "("
+                 << ")");
+  g_driver_gl.debug_fn.glFlushFn();
+}
+
+static void GL_BINDING_CALL Debug_glFlushMappedBufferRange(GLenum target,
+                                                           GLintptr offset,
+                                                           GLsizeiptr length) {
+  GL_SERVICE_LOG("glFlushMappedBufferRange"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << offset
+                 << ", " << length << ")");
+  g_driver_gl.debug_fn.glFlushMappedBufferRangeFn(target, offset, length);
+}
+
+static void GL_BINDING_CALL
+Debug_glFramebufferRenderbufferEXT(GLenum target,
+                                   GLenum attachment,
+                                   GLenum renderbuffertarget,
+                                   GLuint renderbuffer) {
+  GL_SERVICE_LOG("glFramebufferRenderbufferEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(attachment) << ", "
+                 << GLEnums::GetStringEnum(renderbuffertarget) << ", "
+                 << renderbuffer << ")");
+  g_driver_gl.debug_fn.glFramebufferRenderbufferEXTFn(
+      target, attachment, renderbuffertarget, renderbuffer);
+}
+
+static void GL_BINDING_CALL Debug_glFramebufferTexture2DEXT(GLenum target,
+                                                            GLenum attachment,
+                                                            GLenum textarget,
+                                                            GLuint texture,
+                                                            GLint level) {
+  GL_SERVICE_LOG("glFramebufferTexture2DEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(attachment) << ", "
+                 << GLEnums::GetStringEnum(textarget) << ", " << texture << ", "
+                 << level << ")");
+  g_driver_gl.debug_fn.glFramebufferTexture2DEXTFn(target, attachment,
+                                                   textarget, texture, level);
+}
+
+static void GL_BINDING_CALL
+Debug_glFramebufferTexture2DMultisampleEXT(GLenum target,
+                                           GLenum attachment,
+                                           GLenum textarget,
+                                           GLuint texture,
+                                           GLint level,
+                                           GLsizei samples) {
+  GL_SERVICE_LOG("glFramebufferTexture2DMultisampleEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(attachment) << ", "
+                 << GLEnums::GetStringEnum(textarget) << ", " << texture << ", "
+                 << level << ", " << samples << ")");
+  g_driver_gl.debug_fn.glFramebufferTexture2DMultisampleEXTFn(
+      target, attachment, textarget, texture, level, samples);
+}
+
+static void GL_BINDING_CALL
+Debug_glFramebufferTexture2DMultisampleIMG(GLenum target,
+                                           GLenum attachment,
+                                           GLenum textarget,
+                                           GLuint texture,
+                                           GLint level,
+                                           GLsizei samples) {
+  GL_SERVICE_LOG("glFramebufferTexture2DMultisampleIMG"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(attachment) << ", "
+                 << GLEnums::GetStringEnum(textarget) << ", " << texture << ", "
+                 << level << ", " << samples << ")");
+  g_driver_gl.debug_fn.glFramebufferTexture2DMultisampleIMGFn(
+      target, attachment, textarget, texture, level, samples);
+}
+
+static void GL_BINDING_CALL Debug_glFramebufferTextureLayer(GLenum target,
+                                                            GLenum attachment,
+                                                            GLuint texture,
+                                                            GLint level,
+                                                            GLint layer) {
+  GL_SERVICE_LOG("glFramebufferTextureLayer"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(attachment) << ", " << texture
+                 << ", " << level << ", " << layer << ")");
+  g_driver_gl.debug_fn.glFramebufferTextureLayerFn(target, attachment, texture,
+                                                   level, layer);
+}
+
+static void GL_BINDING_CALL Debug_glFrontFace(GLenum mode) {
+  GL_SERVICE_LOG("glFrontFace"
+                 << "(" << GLEnums::GetStringEnum(mode) << ")");
+  g_driver_gl.debug_fn.glFrontFaceFn(mode);
+}
+
+static void GL_BINDING_CALL Debug_glGenBuffersARB(GLsizei n, GLuint* buffers) {
+  GL_SERVICE_LOG("glGenBuffersARB"
+                 << "(" << n << ", " << static_cast<const void*>(buffers)
+                 << ")");
+  g_driver_gl.debug_fn.glGenBuffersARBFn(n, buffers);
+}
+
+static void GL_BINDING_CALL Debug_glGenerateMipmapEXT(GLenum target) {
+  GL_SERVICE_LOG("glGenerateMipmapEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ")");
+  g_driver_gl.debug_fn.glGenerateMipmapEXTFn(target);
+}
+
+static void GL_BINDING_CALL Debug_glGenFencesAPPLE(GLsizei n, GLuint* fences) {
+  GL_SERVICE_LOG("glGenFencesAPPLE"
+                 << "(" << n << ", " << static_cast<const void*>(fences)
+                 << ")");
+  g_driver_gl.debug_fn.glGenFencesAPPLEFn(n, fences);
+}
+
+static void GL_BINDING_CALL Debug_glGenFencesNV(GLsizei n, GLuint* fences) {
+  GL_SERVICE_LOG("glGenFencesNV"
+                 << "(" << n << ", " << static_cast<const void*>(fences)
+                 << ")");
+  g_driver_gl.debug_fn.glGenFencesNVFn(n, fences);
+}
+
+static void GL_BINDING_CALL
+Debug_glGenFramebuffersEXT(GLsizei n, GLuint* framebuffers) {
+  GL_SERVICE_LOG("glGenFramebuffersEXT"
+                 << "(" << n << ", " << static_cast<const void*>(framebuffers)
+                 << ")");
+  g_driver_gl.debug_fn.glGenFramebuffersEXTFn(n, framebuffers);
+}
+
+static void GL_BINDING_CALL Debug_glGenQueries(GLsizei n, GLuint* ids) {
+  GL_SERVICE_LOG("glGenQueries"
+                 << "(" << n << ", " << static_cast<const void*>(ids) << ")");
+  g_driver_gl.debug_fn.glGenQueriesFn(n, ids);
+}
+
+static void GL_BINDING_CALL Debug_glGenQueriesARB(GLsizei n, GLuint* ids) {
+  GL_SERVICE_LOG("glGenQueriesARB"
+                 << "(" << n << ", " << static_cast<const void*>(ids) << ")");
+  g_driver_gl.debug_fn.glGenQueriesARBFn(n, ids);
+}
+
+static void GL_BINDING_CALL
+Debug_glGenRenderbuffersEXT(GLsizei n, GLuint* renderbuffers) {
+  GL_SERVICE_LOG("glGenRenderbuffersEXT"
+                 << "(" << n << ", " << static_cast<const void*>(renderbuffers)
+                 << ")");
+  g_driver_gl.debug_fn.glGenRenderbuffersEXTFn(n, renderbuffers);
+}
+
+static void GL_BINDING_CALL Debug_glGenSamplers(GLsizei n, GLuint* samplers) {
+  GL_SERVICE_LOG("glGenSamplers"
+                 << "(" << n << ", " << static_cast<const void*>(samplers)
+                 << ")");
+  g_driver_gl.debug_fn.glGenSamplersFn(n, samplers);
+}
+
+static void GL_BINDING_CALL Debug_glGenTextures(GLsizei n, GLuint* textures) {
+  GL_SERVICE_LOG("glGenTextures"
+                 << "(" << n << ", " << static_cast<const void*>(textures)
+                 << ")");
+  g_driver_gl.debug_fn.glGenTexturesFn(n, textures);
+}
+
+static void GL_BINDING_CALL
+Debug_glGenTransformFeedbacks(GLsizei n, GLuint* ids) {
+  GL_SERVICE_LOG("glGenTransformFeedbacks"
+                 << "(" << n << ", " << static_cast<const void*>(ids) << ")");
+  g_driver_gl.debug_fn.glGenTransformFeedbacksFn(n, ids);
+}
+
+static void GL_BINDING_CALL
+Debug_glGenVertexArraysOES(GLsizei n, GLuint* arrays) {
+  GL_SERVICE_LOG("glGenVertexArraysOES"
+                 << "(" << n << ", " << static_cast<const void*>(arrays)
+                 << ")");
+  g_driver_gl.debug_fn.glGenVertexArraysOESFn(n, arrays);
+}
+
+static void GL_BINDING_CALL Debug_glGetActiveAttrib(GLuint program,
+                                                    GLuint index,
+                                                    GLsizei bufsize,
+                                                    GLsizei* length,
+                                                    GLint* size,
+                                                    GLenum* type,
+                                                    char* name) {
+  GL_SERVICE_LOG("glGetActiveAttrib"
+                 << "(" << program << ", " << index << ", " << bufsize << ", "
+                 << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(size) << ", "
+                 << static_cast<const void*>(type) << ", "
+                 << static_cast<const void*>(name) << ")");
+  g_driver_gl.debug_fn.glGetActiveAttribFn(program, index, bufsize, length,
+                                           size, type, name);
+}
+
+static void GL_BINDING_CALL Debug_glGetActiveUniform(GLuint program,
+                                                     GLuint index,
+                                                     GLsizei bufsize,
+                                                     GLsizei* length,
+                                                     GLint* size,
+                                                     GLenum* type,
+                                                     char* name) {
+  GL_SERVICE_LOG("glGetActiveUniform"
+                 << "(" << program << ", " << index << ", " << bufsize << ", "
+                 << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(size) << ", "
+                 << static_cast<const void*>(type) << ", "
+                 << static_cast<const void*>(name) << ")");
+  g_driver_gl.debug_fn.glGetActiveUniformFn(program, index, bufsize, length,
+                                            size, type, name);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetActiveUniformBlockiv(GLuint program,
+                                GLuint uniformBlockIndex,
+                                GLenum pname,
+                                GLint* params) {
+  GL_SERVICE_LOG("glGetActiveUniformBlockiv"
+                 << "(" << program << ", " << uniformBlockIndex << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetActiveUniformBlockivFn(program, uniformBlockIndex,
+                                                   pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetActiveUniformBlockName(GLuint program,
+                                  GLuint uniformBlockIndex,
+                                  GLsizei bufSize,
+                                  GLsizei* length,
+                                  char* uniformBlockName) {
+  GL_SERVICE_LOG("glGetActiveUniformBlockName"
+                 << "(" << program << ", " << uniformBlockIndex << ", "
+                 << bufSize << ", " << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(uniformBlockName) << ")");
+  g_driver_gl.debug_fn.glGetActiveUniformBlockNameFn(
+      program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetActiveUniformsiv(GLuint program,
+                            GLsizei uniformCount,
+                            const GLuint* uniformIndices,
+                            GLenum pname,
+                            GLint* params) {
+  GL_SERVICE_LOG("glGetActiveUniformsiv"
+                 << "(" << program << ", " << uniformCount << ", "
+                 << static_cast<const void*>(uniformIndices) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetActiveUniformsivFn(program, uniformCount,
+                                               uniformIndices, pname, params);
+}
+
+static void GL_BINDING_CALL Debug_glGetAttachedShaders(GLuint program,
+                                                       GLsizei maxcount,
+                                                       GLsizei* count,
+                                                       GLuint* shaders) {
+  GL_SERVICE_LOG("glGetAttachedShaders"
+                 << "(" << program << ", " << maxcount << ", "
+                 << static_cast<const void*>(count) << ", "
+                 << static_cast<const void*>(shaders) << ")");
+  g_driver_gl.debug_fn.glGetAttachedShadersFn(program, maxcount, count,
+                                              shaders);
+}
+
+static GLint GL_BINDING_CALL
+Debug_glGetAttribLocation(GLuint program, const char* name) {
+  GL_SERVICE_LOG("glGetAttribLocation"
+                 << "(" << program << ", " << name << ")");
+  GLint result = g_driver_gl.debug_fn.glGetAttribLocationFn(program, name);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glGetBooleanv(GLenum pname, GLboolean* params) {
+  GL_SERVICE_LOG("glGetBooleanv"
+                 << "(" << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetBooleanvFn(pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetBufferParameteriv"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetBufferParameterivFn(target, pname, params);
+}
+
+static GLenum GL_BINDING_CALL Debug_glGetError(void) {
+  GL_SERVICE_LOG("glGetError"
+                 << "("
+                 << ")");
+  GLenum result = g_driver_gl.debug_fn.glGetErrorFn();
+
+  GL_SERVICE_LOG("GL_RESULT: " << GLEnums::GetStringError(result));
+
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glGetFenceivNV(GLuint fence, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetFenceivNV"
+                 << "(" << fence << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetFenceivNVFn(fence, pname, params);
+}
+
+static void GL_BINDING_CALL Debug_glGetFloatv(GLenum pname, GLfloat* params) {
+  GL_SERVICE_LOG("glGetFloatv"
+                 << "(" << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetFloatvFn(pname, params);
+}
+
+static GLint GL_BINDING_CALL
+Debug_glGetFragDataLocation(GLuint program, const char* name) {
+  GL_SERVICE_LOG("glGetFragDataLocation"
+                 << "(" << program << ", " << name << ")");
+  GLint result = g_driver_gl.debug_fn.glGetFragDataLocationFn(program, name);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glGetFramebufferAttachmentParameterivEXT(GLenum target,
+                                               GLenum attachment,
+                                               GLenum pname,
+                                               GLint* params) {
+  GL_SERVICE_LOG("glGetFramebufferAttachmentParameterivEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(attachment) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetFramebufferAttachmentParameterivEXTFn(
+      target, attachment, pname, params);
+}
+
+static GLenum GL_BINDING_CALL Debug_glGetGraphicsResetStatusARB(void) {
+  GL_SERVICE_LOG("glGetGraphicsResetStatusARB"
+                 << "("
+                 << ")");
+  GLenum result = g_driver_gl.debug_fn.glGetGraphicsResetStatusARBFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glGetInteger64i_v(GLenum target, GLuint index, GLint64* data) {
+  GL_SERVICE_LOG("glGetInteger64i_v"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << index
+                 << ", " << static_cast<const void*>(data) << ")");
+  g_driver_gl.debug_fn.glGetInteger64i_vFn(target, index, data);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetInteger64v(GLenum pname, GLint64* params) {
+  GL_SERVICE_LOG("glGetInteger64v"
+                 << "(" << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetInteger64vFn(pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetIntegeri_v(GLenum target, GLuint index, GLint* data) {
+  GL_SERVICE_LOG("glGetIntegeri_v"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << index
+                 << ", " << static_cast<const void*>(data) << ")");
+  g_driver_gl.debug_fn.glGetIntegeri_vFn(target, index, data);
+}
+
+static void GL_BINDING_CALL Debug_glGetIntegerv(GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetIntegerv"
+                 << "(" << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetIntegervFn(pname, params);
+}
+
+static void GL_BINDING_CALL Debug_glGetInternalformativ(GLenum target,
+                                                        GLenum internalformat,
+                                                        GLenum pname,
+                                                        GLsizei bufSize,
+                                                        GLint* params) {
+  GL_SERVICE_LOG("glGetInternalformativ"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(internalformat) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", " << bufSize << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetInternalformativFn(target, internalformat, pname,
+                                               bufSize, params);
+}
+
+static void GL_BINDING_CALL Debug_glGetProgramBinary(GLuint program,
+                                                     GLsizei bufSize,
+                                                     GLsizei* length,
+                                                     GLenum* binaryFormat,
+                                                     GLvoid* binary) {
+  GL_SERVICE_LOG("glGetProgramBinary"
+                 << "(" << program << ", " << bufSize << ", "
+                 << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(binaryFormat) << ", "
+                 << static_cast<const void*>(binary) << ")");
+  g_driver_gl.debug_fn.glGetProgramBinaryFn(program, bufSize, length,
+                                            binaryFormat, binary);
+}
+
+static void GL_BINDING_CALL Debug_glGetProgramInfoLog(GLuint program,
+                                                      GLsizei bufsize,
+                                                      GLsizei* length,
+                                                      char* infolog) {
+  GL_SERVICE_LOG("glGetProgramInfoLog"
+                 << "(" << program << ", " << bufsize << ", "
+                 << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(infolog) << ")");
+  g_driver_gl.debug_fn.glGetProgramInfoLogFn(program, bufsize, length, infolog);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetProgramiv(GLuint program, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetProgramiv"
+                 << "(" << program << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetProgramivFn(program, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetQueryiv(GLenum target, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetQueryiv"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetQueryivFn(target, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetQueryivARB(GLenum target, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetQueryivARB"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetQueryivARBFn(target, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64* params) {
+  GL_SERVICE_LOG("glGetQueryObjecti64v"
+                 << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetQueryObjecti64vFn(id, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetQueryObjectiv(GLuint id, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetQueryObjectiv"
+                 << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetQueryObjectivFn(id, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetQueryObjectivARB(GLuint id, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetQueryObjectivARB"
+                 << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetQueryObjectivARBFn(id, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) {
+  GL_SERVICE_LOG("glGetQueryObjectui64v"
+                 << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetQueryObjectui64vFn(id, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params) {
+  GL_SERVICE_LOG("glGetQueryObjectuiv"
+                 << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetQueryObjectuivFn(id, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint* params) {
+  GL_SERVICE_LOG("glGetQueryObjectuivARB"
+                 << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetQueryObjectuivARBFn(id, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetRenderbufferParameterivEXT(GLenum target,
+                                      GLenum pname,
+                                      GLint* params) {
+  GL_SERVICE_LOG("glGetRenderbufferParameterivEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetRenderbufferParameterivEXTFn(target, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) {
+  GL_SERVICE_LOG("glGetSamplerParameterfv"
+                 << "(" << sampler << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetSamplerParameterfvFn(sampler, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetSamplerParameteriv"
+                 << "(" << sampler << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetSamplerParameterivFn(sampler, pname, params);
+}
+
+static void GL_BINDING_CALL Debug_glGetShaderInfoLog(GLuint shader,
+                                                     GLsizei bufsize,
+                                                     GLsizei* length,
+                                                     char* infolog) {
+  GL_SERVICE_LOG("glGetShaderInfoLog"
+                 << "(" << shader << ", " << bufsize << ", "
+                 << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(infolog) << ")");
+  g_driver_gl.debug_fn.glGetShaderInfoLogFn(shader, bufsize, length, infolog);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetShaderiv(GLuint shader, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetShaderiv"
+                 << "(" << shader << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetShaderivFn(shader, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetShaderPrecisionFormat(GLenum shadertype,
+                                 GLenum precisiontype,
+                                 GLint* range,
+                                 GLint* precision) {
+  GL_SERVICE_LOG("glGetShaderPrecisionFormat"
+                 << "(" << GLEnums::GetStringEnum(shadertype) << ", "
+                 << GLEnums::GetStringEnum(precisiontype) << ", "
+                 << static_cast<const void*>(range) << ", "
+                 << static_cast<const void*>(precision) << ")");
+  g_driver_gl.debug_fn.glGetShaderPrecisionFormatFn(shadertype, precisiontype,
+                                                    range, precision);
+}
+
+static void GL_BINDING_CALL Debug_glGetShaderSource(GLuint shader,
+                                                    GLsizei bufsize,
+                                                    GLsizei* length,
+                                                    char* source) {
+  GL_SERVICE_LOG("glGetShaderSource"
+                 << "(" << shader << ", " << bufsize << ", "
+                 << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(source) << ")");
+  g_driver_gl.debug_fn.glGetShaderSourceFn(shader, bufsize, length, source);
+}
+
+static const GLubyte* GL_BINDING_CALL Debug_glGetString(GLenum name) {
+  GL_SERVICE_LOG("glGetString"
+                 << "(" << GLEnums::GetStringEnum(name) << ")");
+  const GLubyte* result = g_driver_gl.debug_fn.glGetStringFn(name);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glGetSynciv(GLsync sync,
+                                              GLenum pname,
+                                              GLsizei bufSize,
+                                              GLsizei* length,
+                                              GLint* values) {
+  GL_SERVICE_LOG("glGetSynciv"
+                 << "(" << sync << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << bufSize << ", " << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(values) << ")");
+  g_driver_gl.debug_fn.glGetSyncivFn(sync, pname, bufSize, length, values);
+}
+
+static void GL_BINDING_CALL Debug_glGetTexLevelParameterfv(GLenum target,
+                                                           GLint level,
+                                                           GLenum pname,
+                                                           GLfloat* params) {
+  GL_SERVICE_LOG("glGetTexLevelParameterfv"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetTexLevelParameterfvFn(target, level, pname, params);
+}
+
+static void GL_BINDING_CALL Debug_glGetTexLevelParameteriv(GLenum target,
+                                                           GLint level,
+                                                           GLenum pname,
+                                                           GLint* params) {
+  GL_SERVICE_LOG("glGetTexLevelParameteriv"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetTexLevelParameterivFn(target, level, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) {
+  GL_SERVICE_LOG("glGetTexParameterfv"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetTexParameterfvFn(target, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetTexParameteriv"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetTexParameterivFn(target, pname, params);
+}
+
+static void GL_BINDING_CALL Debug_glGetTransformFeedbackVarying(GLuint program,
+                                                                GLuint index,
+                                                                GLsizei bufSize,
+                                                                GLsizei* length,
+                                                                GLenum* type,
+                                                                char* name) {
+  GL_SERVICE_LOG("glGetTransformFeedbackVarying"
+                 << "(" << program << ", " << index << ", " << bufSize << ", "
+                 << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(type) << ", "
+                 << static_cast<const void*>(name) << ")");
+  g_driver_gl.debug_fn.glGetTransformFeedbackVaryingFn(program, index, bufSize,
+                                                       length, type, name);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetTranslatedShaderSourceANGLE(GLuint shader,
+                                       GLsizei bufsize,
+                                       GLsizei* length,
+                                       char* source) {
+  GL_SERVICE_LOG("glGetTranslatedShaderSourceANGLE"
+                 << "(" << shader << ", " << bufsize << ", "
+                 << static_cast<const void*>(length) << ", "
+                 << static_cast<const void*>(source) << ")");
+  g_driver_gl.debug_fn.glGetTranslatedShaderSourceANGLEFn(shader, bufsize,
+                                                          length, source);
+}
+
+static GLuint GL_BINDING_CALL
+Debug_glGetUniformBlockIndex(GLuint program, const char* uniformBlockName) {
+  GL_SERVICE_LOG("glGetUniformBlockIndex"
+                 << "(" << program << ", " << uniformBlockName << ")");
+  GLuint result =
+      g_driver_gl.debug_fn.glGetUniformBlockIndexFn(program, uniformBlockName);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glGetUniformfv(GLuint program, GLint location, GLfloat* params) {
+  GL_SERVICE_LOG("glGetUniformfv"
+                 << "(" << program << ", " << location << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetUniformfvFn(program, location, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetUniformIndices(GLuint program,
+                          GLsizei uniformCount,
+                          const char* const* uniformNames,
+                          GLuint* uniformIndices) {
+  GL_SERVICE_LOG("glGetUniformIndices"
+                 << "(" << program << ", " << uniformCount << ", "
+                 << static_cast<const void*>(uniformNames) << ", "
+                 << static_cast<const void*>(uniformIndices) << ")");
+  g_driver_gl.debug_fn.glGetUniformIndicesFn(program, uniformCount,
+                                             uniformNames, uniformIndices);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetUniformiv(GLuint program, GLint location, GLint* params) {
+  GL_SERVICE_LOG("glGetUniformiv"
+                 << "(" << program << ", " << location << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetUniformivFn(program, location, params);
+}
+
+static GLint GL_BINDING_CALL
+Debug_glGetUniformLocation(GLuint program, const char* name) {
+  GL_SERVICE_LOG("glGetUniformLocation"
+                 << "(" << program << ", " << name << ")");
+  GLint result = g_driver_gl.debug_fn.glGetUniformLocationFn(program, name);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) {
+  GL_SERVICE_LOG("glGetVertexAttribfv"
+                 << "(" << index << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetVertexAttribfvFn(index, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) {
+  GL_SERVICE_LOG("glGetVertexAttribiv"
+                 << "(" << index << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glGetVertexAttribivFn(index, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) {
+  GL_SERVICE_LOG("glGetVertexAttribPointerv"
+                 << "(" << index << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << pointer << ")");
+  g_driver_gl.debug_fn.glGetVertexAttribPointervFn(index, pname, pointer);
+}
+
+static void GL_BINDING_CALL Debug_glHint(GLenum target, GLenum mode) {
+  GL_SERVICE_LOG("glHint"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(mode) << ")");
+  g_driver_gl.debug_fn.glHintFn(target, mode);
+}
+
+static void GL_BINDING_CALL
+Debug_glInsertEventMarkerEXT(GLsizei length, const char* marker) {
+  GL_SERVICE_LOG("glInsertEventMarkerEXT"
+                 << "(" << length << ", " << marker << ")");
+  g_driver_gl.debug_fn.glInsertEventMarkerEXTFn(length, marker);
+}
+
+static void GL_BINDING_CALL
+Debug_glInvalidateFramebuffer(GLenum target,
+                              GLsizei numAttachments,
+                              const GLenum* attachments) {
+  GL_SERVICE_LOG("glInvalidateFramebuffer"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << numAttachments << ", "
+                 << static_cast<const void*>(attachments) << ")");
+  g_driver_gl.debug_fn.glInvalidateFramebufferFn(target, numAttachments,
+                                                 attachments);
+}
+
+static void GL_BINDING_CALL
+Debug_glInvalidateSubFramebuffer(GLenum target,
+                                 GLsizei numAttachments,
+                                 const GLenum* attachments,
+                                 GLint x,
+                                 GLint y,
+                                 GLint width,
+                                 GLint height) {
+  GL_SERVICE_LOG("glInvalidateSubFramebuffer"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << numAttachments << ", "
+                 << static_cast<const void*>(attachments) << ", " << x << ", "
+                 << y << ", " << width << ", " << height << ")");
+  g_driver_gl.debug_fn.glInvalidateSubFramebufferFn(
+      target, numAttachments, attachments, x, y, width, height);
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsBuffer(GLuint buffer) {
+  GL_SERVICE_LOG("glIsBuffer"
+                 << "(" << buffer << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsBufferFn(buffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsEnabled(GLenum cap) {
+  GL_SERVICE_LOG("glIsEnabled"
+                 << "(" << GLEnums::GetStringEnum(cap) << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsEnabledFn(cap);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsFenceAPPLE(GLuint fence) {
+  GL_SERVICE_LOG("glIsFenceAPPLE"
+                 << "(" << fence << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsFenceAPPLEFn(fence);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsFenceNV(GLuint fence) {
+  GL_SERVICE_LOG("glIsFenceNV"
+                 << "(" << fence << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsFenceNVFn(fence);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsFramebufferEXT(GLuint framebuffer) {
+  GL_SERVICE_LOG("glIsFramebufferEXT"
+                 << "(" << framebuffer << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsFramebufferEXTFn(framebuffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsProgram(GLuint program) {
+  GL_SERVICE_LOG("glIsProgram"
+                 << "(" << program << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsProgramFn(program);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsQuery(GLuint query) {
+  GL_SERVICE_LOG("glIsQuery"
+                 << "(" << query << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsQueryFn(query);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsQueryARB(GLuint query) {
+  GL_SERVICE_LOG("glIsQueryARB"
+                 << "(" << query << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsQueryARBFn(query);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL
+Debug_glIsRenderbufferEXT(GLuint renderbuffer) {
+  GL_SERVICE_LOG("glIsRenderbufferEXT"
+                 << "(" << renderbuffer << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsRenderbufferEXTFn(renderbuffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsSampler(GLuint sampler) {
+  GL_SERVICE_LOG("glIsSampler"
+                 << "(" << sampler << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsSamplerFn(sampler);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsShader(GLuint shader) {
+  GL_SERVICE_LOG("glIsShader"
+                 << "(" << shader << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsShaderFn(shader);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsSync(GLsync sync) {
+  GL_SERVICE_LOG("glIsSync"
+                 << "(" << sync << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsSyncFn(sync);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsTexture(GLuint texture) {
+  GL_SERVICE_LOG("glIsTexture"
+                 << "(" << texture << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsTextureFn(texture);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsTransformFeedback(GLuint id) {
+  GL_SERVICE_LOG("glIsTransformFeedback"
+                 << "(" << id << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsTransformFeedbackFn(id);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glIsVertexArrayOES(GLuint array) {
+  GL_SERVICE_LOG("glIsVertexArrayOES"
+                 << "(" << array << ")");
+  GLboolean result = g_driver_gl.debug_fn.glIsVertexArrayOESFn(array);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glLineWidth(GLfloat width) {
+  GL_SERVICE_LOG("glLineWidth"
+                 << "(" << width << ")");
+  g_driver_gl.debug_fn.glLineWidthFn(width);
+}
+
+static void GL_BINDING_CALL Debug_glLinkProgram(GLuint program) {
+  GL_SERVICE_LOG("glLinkProgram"
+                 << "(" << program << ")");
+  g_driver_gl.debug_fn.glLinkProgramFn(program);
+}
+
+static void* GL_BINDING_CALL Debug_glMapBuffer(GLenum target, GLenum access) {
+  GL_SERVICE_LOG("glMapBuffer"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(access) << ")");
+  void* result = g_driver_gl.debug_fn.glMapBufferFn(target, access);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void* GL_BINDING_CALL Debug_glMapBufferRange(GLenum target,
+                                                    GLintptr offset,
+                                                    GLsizeiptr length,
+                                                    GLbitfield access) {
+  GL_SERVICE_LOG("glMapBufferRange"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << offset
+                 << ", " << length << ", " << access << ")");
+  void* result =
+      g_driver_gl.debug_fn.glMapBufferRangeFn(target, offset, length, access);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glMatrixLoadfEXT(GLenum matrixMode, const GLfloat* m) {
+  GL_SERVICE_LOG("glMatrixLoadfEXT"
+                 << "(" << GLEnums::GetStringEnum(matrixMode) << ", "
+                 << static_cast<const void*>(m) << ")");
+  g_driver_gl.debug_fn.glMatrixLoadfEXTFn(matrixMode, m);
+}
+
+static void GL_BINDING_CALL Debug_glMatrixLoadIdentityEXT(GLenum matrixMode) {
+  GL_SERVICE_LOG("glMatrixLoadIdentityEXT"
+                 << "(" << GLEnums::GetStringEnum(matrixMode) << ")");
+  g_driver_gl.debug_fn.glMatrixLoadIdentityEXTFn(matrixMode);
+}
+
+static void GL_BINDING_CALL Debug_glPauseTransformFeedback(void) {
+  GL_SERVICE_LOG("glPauseTransformFeedback"
+                 << "("
+                 << ")");
+  g_driver_gl.debug_fn.glPauseTransformFeedbackFn();
+}
+
+static void GL_BINDING_CALL Debug_glPixelStorei(GLenum pname, GLint param) {
+  GL_SERVICE_LOG("glPixelStorei"
+                 << "(" << GLEnums::GetStringEnum(pname) << ", " << param
+                 << ")");
+  g_driver_gl.debug_fn.glPixelStoreiFn(pname, param);
+}
+
+static void GL_BINDING_CALL Debug_glPointParameteri(GLenum pname, GLint param) {
+  GL_SERVICE_LOG("glPointParameteri"
+                 << "(" << GLEnums::GetStringEnum(pname) << ", " << param
+                 << ")");
+  g_driver_gl.debug_fn.glPointParameteriFn(pname, param);
+}
+
+static void GL_BINDING_CALL
+Debug_glPolygonOffset(GLfloat factor, GLfloat units) {
+  GL_SERVICE_LOG("glPolygonOffset"
+                 << "(" << factor << ", " << units << ")");
+  g_driver_gl.debug_fn.glPolygonOffsetFn(factor, units);
+}
+
+static void GL_BINDING_CALL Debug_glPopGroupMarkerEXT(void) {
+  GL_SERVICE_LOG("glPopGroupMarkerEXT"
+                 << "("
+                 << ")");
+  g_driver_gl.debug_fn.glPopGroupMarkerEXTFn();
+}
+
+static void GL_BINDING_CALL Debug_glProgramBinary(GLuint program,
+                                                  GLenum binaryFormat,
+                                                  const GLvoid* binary,
+                                                  GLsizei length) {
+  GL_SERVICE_LOG("glProgramBinary"
+                 << "(" << program << ", "
+                 << GLEnums::GetStringEnum(binaryFormat) << ", "
+                 << static_cast<const void*>(binary) << ", " << length << ")");
+  g_driver_gl.debug_fn.glProgramBinaryFn(program, binaryFormat, binary, length);
+}
+
+static void GL_BINDING_CALL
+Debug_glProgramParameteri(GLuint program, GLenum pname, GLint value) {
+  GL_SERVICE_LOG("glProgramParameteri"
+                 << "(" << program << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << value << ")");
+  g_driver_gl.debug_fn.glProgramParameteriFn(program, pname, value);
+}
+
+static void GL_BINDING_CALL
+Debug_glPushGroupMarkerEXT(GLsizei length, const char* marker) {
+  GL_SERVICE_LOG("glPushGroupMarkerEXT"
+                 << "(" << length << ", " << marker << ")");
+  g_driver_gl.debug_fn.glPushGroupMarkerEXTFn(length, marker);
+}
+
+static void GL_BINDING_CALL Debug_glQueryCounter(GLuint id, GLenum target) {
+  GL_SERVICE_LOG("glQueryCounter"
+                 << "(" << id << ", " << GLEnums::GetStringEnum(target) << ")");
+  g_driver_gl.debug_fn.glQueryCounterFn(id, target);
+}
+
+static void GL_BINDING_CALL Debug_glReadBuffer(GLenum src) {
+  GL_SERVICE_LOG("glReadBuffer"
+                 << "(" << GLEnums::GetStringEnum(src) << ")");
+  g_driver_gl.debug_fn.glReadBufferFn(src);
+}
+
+static void GL_BINDING_CALL Debug_glReadPixels(GLint x,
+                                               GLint y,
+                                               GLsizei width,
+                                               GLsizei height,
+                                               GLenum format,
+                                               GLenum type,
+                                               void* pixels) {
+  GL_SERVICE_LOG("glReadPixels"
+                 << "(" << x << ", " << y << ", " << width << ", " << height
+                 << ", " << GLEnums::GetStringEnum(format) << ", "
+                 << GLEnums::GetStringEnum(type) << ", "
+                 << static_cast<const void*>(pixels) << ")");
+  g_driver_gl.debug_fn.glReadPixelsFn(x, y, width, height, format, type,
+                                      pixels);
+}
+
+static void GL_BINDING_CALL Debug_glReleaseShaderCompiler(void) {
+  GL_SERVICE_LOG("glReleaseShaderCompiler"
+                 << "("
+                 << ")");
+  g_driver_gl.debug_fn.glReleaseShaderCompilerFn();
+}
+
+static void GL_BINDING_CALL
+Debug_glRenderbufferStorageEXT(GLenum target,
+                               GLenum internalformat,
+                               GLsizei width,
+                               GLsizei height) {
+  GL_SERVICE_LOG("glRenderbufferStorageEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(internalformat) << ", " << width
+                 << ", " << height << ")");
+  g_driver_gl.debug_fn.glRenderbufferStorageEXTFn(target, internalformat, width,
+                                                  height);
+}
+
+static void GL_BINDING_CALL
+Debug_glRenderbufferStorageMultisample(GLenum target,
+                                       GLsizei samples,
+                                       GLenum internalformat,
+                                       GLsizei width,
+                                       GLsizei height) {
+  GL_SERVICE_LOG("glRenderbufferStorageMultisample"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << samples
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", "
+                 << width << ", " << height << ")");
+  g_driver_gl.debug_fn.glRenderbufferStorageMultisampleFn(
+      target, samples, internalformat, width, height);
+}
+
+static void GL_BINDING_CALL
+Debug_glRenderbufferStorageMultisampleANGLE(GLenum target,
+                                            GLsizei samples,
+                                            GLenum internalformat,
+                                            GLsizei width,
+                                            GLsizei height) {
+  GL_SERVICE_LOG("glRenderbufferStorageMultisampleANGLE"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << samples
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", "
+                 << width << ", " << height << ")");
+  g_driver_gl.debug_fn.glRenderbufferStorageMultisampleANGLEFn(
+      target, samples, internalformat, width, height);
+}
+
+static void GL_BINDING_CALL
+Debug_glRenderbufferStorageMultisampleEXT(GLenum target,
+                                          GLsizei samples,
+                                          GLenum internalformat,
+                                          GLsizei width,
+                                          GLsizei height) {
+  GL_SERVICE_LOG("glRenderbufferStorageMultisampleEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << samples
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", "
+                 << width << ", " << height << ")");
+  g_driver_gl.debug_fn.glRenderbufferStorageMultisampleEXTFn(
+      target, samples, internalformat, width, height);
+}
+
+static void GL_BINDING_CALL
+Debug_glRenderbufferStorageMultisampleIMG(GLenum target,
+                                          GLsizei samples,
+                                          GLenum internalformat,
+                                          GLsizei width,
+                                          GLsizei height) {
+  GL_SERVICE_LOG("glRenderbufferStorageMultisampleIMG"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << samples
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", "
+                 << width << ", " << height << ")");
+  g_driver_gl.debug_fn.glRenderbufferStorageMultisampleIMGFn(
+      target, samples, internalformat, width, height);
+}
+
+static void GL_BINDING_CALL Debug_glResumeTransformFeedback(void) {
+  GL_SERVICE_LOG("glResumeTransformFeedback"
+                 << "("
+                 << ")");
+  g_driver_gl.debug_fn.glResumeTransformFeedbackFn();
+}
+
+static void GL_BINDING_CALL
+Debug_glSampleCoverage(GLclampf value, GLboolean invert) {
+  GL_SERVICE_LOG("glSampleCoverage"
+                 << "(" << value << ", " << GLEnums::GetStringBool(invert)
+                 << ")");
+  g_driver_gl.debug_fn.glSampleCoverageFn(value, invert);
+}
+
+static void GL_BINDING_CALL
+Debug_glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) {
+  GL_SERVICE_LOG("glSamplerParameterf"
+                 << "(" << sampler << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << param << ")");
+  g_driver_gl.debug_fn.glSamplerParameterfFn(sampler, pname, param);
+}
+
+static void GL_BINDING_CALL Debug_glSamplerParameterfv(GLuint sampler,
+                                                       GLenum pname,
+                                                       const GLfloat* params) {
+  GL_SERVICE_LOG("glSamplerParameterfv"
+                 << "(" << sampler << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glSamplerParameterfvFn(sampler, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glSamplerParameteri(GLuint sampler, GLenum pname, GLint param) {
+  GL_SERVICE_LOG("glSamplerParameteri"
+                 << "(" << sampler << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << param << ")");
+  g_driver_gl.debug_fn.glSamplerParameteriFn(sampler, pname, param);
+}
+
+static void GL_BINDING_CALL
+Debug_glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* params) {
+  GL_SERVICE_LOG("glSamplerParameteriv"
+                 << "(" << sampler << ", " << GLEnums::GetStringEnum(pname)
+                 << ", " << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glSamplerParameterivFn(sampler, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glScissor(GLint x, GLint y, GLsizei width, GLsizei height) {
+  GL_SERVICE_LOG("glScissor"
+                 << "(" << x << ", " << y << ", " << width << ", " << height
+                 << ")");
+  g_driver_gl.debug_fn.glScissorFn(x, y, width, height);
+}
+
+static void GL_BINDING_CALL Debug_glSetFenceAPPLE(GLuint fence) {
+  GL_SERVICE_LOG("glSetFenceAPPLE"
+                 << "(" << fence << ")");
+  g_driver_gl.debug_fn.glSetFenceAPPLEFn(fence);
+}
+
+static void GL_BINDING_CALL Debug_glSetFenceNV(GLuint fence, GLenum condition) {
+  GL_SERVICE_LOG("glSetFenceNV"
+                 << "(" << fence << ", " << GLEnums::GetStringEnum(condition)
+                 << ")");
+  g_driver_gl.debug_fn.glSetFenceNVFn(fence, condition);
+}
+
+static void GL_BINDING_CALL Debug_glShaderBinary(GLsizei n,
+                                                 const GLuint* shaders,
+                                                 GLenum binaryformat,
+                                                 const void* binary,
+                                                 GLsizei length) {
+  GL_SERVICE_LOG("glShaderBinary"
+                 << "(" << n << ", " << static_cast<const void*>(shaders)
+                 << ", " << GLEnums::GetStringEnum(binaryformat) << ", "
+                 << static_cast<const void*>(binary) << ", " << length << ")");
+  g_driver_gl.debug_fn.glShaderBinaryFn(n, shaders, binaryformat, binary,
+                                        length);
+}
+
+static void GL_BINDING_CALL Debug_glShaderSource(GLuint shader,
+                                                 GLsizei count,
+                                                 const char* const* str,
+                                                 const GLint* length) {
+  GL_SERVICE_LOG("glShaderSource"
+                 << "(" << shader << ", " << count << ", "
+                 << static_cast<const void*>(str) << ", "
+                 << static_cast<const void*>(length) << ")");
+  g_driver_gl.debug_fn.glShaderSourceFn(shader, count, str, length);
+
+  GL_SERVICE_LOG_CODE_BLOCK({
+    for (GLsizei ii = 0; ii < count; ++ii) {
+      if (str[ii]) {
+        if (length && length[ii] >= 0) {
+          std::string source(str[ii], length[ii]);
+          GL_SERVICE_LOG("  " << ii << ": ---\n" << source << "\n---");
+        } else {
+          GL_SERVICE_LOG("  " << ii << ": ---\n" << str[ii] << "\n---");
+        }
+      } else {
+        GL_SERVICE_LOG("  " << ii << ": NULL");
+      }
+    }
+  });
+}
+
+static void GL_BINDING_CALL
+Debug_glStencilFunc(GLenum func, GLint ref, GLuint mask) {
+  GL_SERVICE_LOG("glStencilFunc"
+                 << "(" << GLEnums::GetStringEnum(func) << ", " << ref << ", "
+                 << mask << ")");
+  g_driver_gl.debug_fn.glStencilFuncFn(func, ref, mask);
+}
+
+static void GL_BINDING_CALL
+Debug_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) {
+  GL_SERVICE_LOG("glStencilFuncSeparate"
+                 << "(" << GLEnums::GetStringEnum(face) << ", "
+                 << GLEnums::GetStringEnum(func) << ", " << ref << ", " << mask
+                 << ")");
+  g_driver_gl.debug_fn.glStencilFuncSeparateFn(face, func, ref, mask);
+}
+
+static void GL_BINDING_CALL Debug_glStencilMask(GLuint mask) {
+  GL_SERVICE_LOG("glStencilMask"
+                 << "(" << mask << ")");
+  g_driver_gl.debug_fn.glStencilMaskFn(mask);
+}
+
+static void GL_BINDING_CALL
+Debug_glStencilMaskSeparate(GLenum face, GLuint mask) {
+  GL_SERVICE_LOG("glStencilMaskSeparate"
+                 << "(" << GLEnums::GetStringEnum(face) << ", " << mask << ")");
+  g_driver_gl.debug_fn.glStencilMaskSeparateFn(face, mask);
+}
+
+static void GL_BINDING_CALL
+Debug_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) {
+  GL_SERVICE_LOG("glStencilOp"
+                 << "(" << GLEnums::GetStringEnum(fail) << ", "
+                 << GLEnums::GetStringEnum(zfail) << ", "
+                 << GLEnums::GetStringEnum(zpass) << ")");
+  g_driver_gl.debug_fn.glStencilOpFn(fail, zfail, zpass);
+}
+
+static void GL_BINDING_CALL Debug_glStencilOpSeparate(GLenum face,
+                                                      GLenum fail,
+                                                      GLenum zfail,
+                                                      GLenum zpass) {
+  GL_SERVICE_LOG("glStencilOpSeparate"
+                 << "(" << GLEnums::GetStringEnum(face) << ", "
+                 << GLEnums::GetStringEnum(fail) << ", "
+                 << GLEnums::GetStringEnum(zfail) << ", "
+                 << GLEnums::GetStringEnum(zpass) << ")");
+  g_driver_gl.debug_fn.glStencilOpSeparateFn(face, fail, zfail, zpass);
+}
+
+static GLboolean GL_BINDING_CALL Debug_glTestFenceAPPLE(GLuint fence) {
+  GL_SERVICE_LOG("glTestFenceAPPLE"
+                 << "(" << fence << ")");
+  GLboolean result = g_driver_gl.debug_fn.glTestFenceAPPLEFn(fence);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_glTestFenceNV(GLuint fence) {
+  GL_SERVICE_LOG("glTestFenceNV"
+                 << "(" << fence << ")");
+  GLboolean result = g_driver_gl.debug_fn.glTestFenceNVFn(fence);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glTexImage2D(GLenum target,
+                                               GLint level,
+                                               GLint internalformat,
+                                               GLsizei width,
+                                               GLsizei height,
+                                               GLint border,
+                                               GLenum format,
+                                               GLenum type,
+                                               const void* pixels) {
+  GL_SERVICE_LOG("glTexImage2D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << internalformat << ", " << width << ", " << height
+                 << ", " << border << ", " << GLEnums::GetStringEnum(format)
+                 << ", " << GLEnums::GetStringEnum(type) << ", "
+                 << static_cast<const void*>(pixels) << ")");
+  g_driver_gl.debug_fn.glTexImage2DFn(target, level, internalformat, width,
+                                      height, border, format, type, pixels);
+}
+
+static void GL_BINDING_CALL Debug_glTexImage3D(GLenum target,
+                                               GLint level,
+                                               GLint internalformat,
+                                               GLsizei width,
+                                               GLsizei height,
+                                               GLsizei depth,
+                                               GLint border,
+                                               GLenum format,
+                                               GLenum type,
+                                               const void* pixels) {
+  GL_SERVICE_LOG("glTexImage3D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << internalformat << ", " << width << ", " << height
+                 << ", " << depth << ", " << border << ", "
+                 << GLEnums::GetStringEnum(format) << ", "
+                 << GLEnums::GetStringEnum(type) << ", "
+                 << static_cast<const void*>(pixels) << ")");
+  g_driver_gl.debug_fn.glTexImage3DFn(target, level, internalformat, width,
+                                      height, depth, border, format, type,
+                                      pixels);
+}
+
+static void GL_BINDING_CALL
+Debug_glTexParameterf(GLenum target, GLenum pname, GLfloat param) {
+  GL_SERVICE_LOG("glTexParameterf"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", " << param << ")");
+  g_driver_gl.debug_fn.glTexParameterfFn(target, pname, param);
+}
+
+static void GL_BINDING_CALL
+Debug_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params) {
+  GL_SERVICE_LOG("glTexParameterfv"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glTexParameterfvFn(target, pname, params);
+}
+
+static void GL_BINDING_CALL
+Debug_glTexParameteri(GLenum target, GLenum pname, GLint param) {
+  GL_SERVICE_LOG("glTexParameteri"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", " << param << ")");
+  g_driver_gl.debug_fn.glTexParameteriFn(target, pname, param);
+}
+
+static void GL_BINDING_CALL
+Debug_glTexParameteriv(GLenum target, GLenum pname, const GLint* params) {
+  GL_SERVICE_LOG("glTexParameteriv"
+                 << "(" << GLEnums::GetStringEnum(target) << ", "
+                 << GLEnums::GetStringEnum(pname) << ", "
+                 << static_cast<const void*>(params) << ")");
+  g_driver_gl.debug_fn.glTexParameterivFn(target, pname, params);
+}
+
+static void GL_BINDING_CALL Debug_glTexStorage2DEXT(GLenum target,
+                                                    GLsizei levels,
+                                                    GLenum internalformat,
+                                                    GLsizei width,
+                                                    GLsizei height) {
+  GL_SERVICE_LOG("glTexStorage2DEXT"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << levels
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", "
+                 << width << ", " << height << ")");
+  g_driver_gl.debug_fn.glTexStorage2DEXTFn(target, levels, internalformat,
+                                           width, height);
+}
+
+static void GL_BINDING_CALL Debug_glTexStorage3D(GLenum target,
+                                                 GLsizei levels,
+                                                 GLenum internalformat,
+                                                 GLsizei width,
+                                                 GLsizei height,
+                                                 GLsizei depth) {
+  GL_SERVICE_LOG("glTexStorage3D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << levels
+                 << ", " << GLEnums::GetStringEnum(internalformat) << ", "
+                 << width << ", " << height << ", " << depth << ")");
+  g_driver_gl.debug_fn.glTexStorage3DFn(target, levels, internalformat, width,
+                                        height, depth);
+}
+
+static void GL_BINDING_CALL Debug_glTexSubImage2D(GLenum target,
+                                                  GLint level,
+                                                  GLint xoffset,
+                                                  GLint yoffset,
+                                                  GLsizei width,
+                                                  GLsizei height,
+                                                  GLenum format,
+                                                  GLenum type,
+                                                  const void* pixels) {
+  GL_SERVICE_LOG("glTexSubImage2D"
+                 << "(" << GLEnums::GetStringEnum(target) << ", " << level
+                 << ", " << xoffset << ", " << yoffset << ", " << width << ", "
+                 << height << ", " << GLEnums::GetStringEnum(format) << ", "
+                 << GLEnums::GetStringEnum(type) << ", "
+                 << static_cast<const void*>(pixels) << ")");
+  g_driver_gl.debug_fn.glTexSubImage2DFn(target, level, xoffset, yoffset, width,
+                                         height, format, type, pixels);
+}
+
+static void GL_BINDING_CALL
+Debug_glTransformFeedbackVaryings(GLuint program,
+                                  GLsizei count,
+                                  const char* const* varyings,
+                                  GLenum bufferMode) {
+  GL_SERVICE_LOG("glTransformFeedbackVaryings"
+                 << "(" << program << ", " << count << ", "
+                 << static_cast<const void*>(varyings) << ", "
+                 << GLEnums::GetStringEnum(bufferMode) << ")");
+  g_driver_gl.debug_fn.glTransformFeedbackVaryingsFn(program, count, varyings,
+                                                     bufferMode);
+}
+
+static void GL_BINDING_CALL Debug_glUniform1f(GLint location, GLfloat x) {
+  GL_SERVICE_LOG("glUniform1f"
+                 << "(" << location << ", " << x << ")");
+  g_driver_gl.debug_fn.glUniform1fFn(location, x);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform1fv(GLint location, GLsizei count, const GLfloat* v) {
+  GL_SERVICE_LOG("glUniform1fv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform1fvFn(location, count, v);
+}
+
+static void GL_BINDING_CALL Debug_glUniform1i(GLint location, GLint x) {
+  GL_SERVICE_LOG("glUniform1i"
+                 << "(" << location << ", " << x << ")");
+  g_driver_gl.debug_fn.glUniform1iFn(location, x);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform1iv(GLint location, GLsizei count, const GLint* v) {
+  GL_SERVICE_LOG("glUniform1iv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform1ivFn(location, count, v);
+}
+
+static void GL_BINDING_CALL Debug_glUniform1ui(GLint location, GLuint v0) {
+  GL_SERVICE_LOG("glUniform1ui"
+                 << "(" << location << ", " << v0 << ")");
+  g_driver_gl.debug_fn.glUniform1uiFn(location, v0);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform1uiv(GLint location, GLsizei count, const GLuint* v) {
+  GL_SERVICE_LOG("glUniform1uiv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform1uivFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform2f(GLint location, GLfloat x, GLfloat y) {
+  GL_SERVICE_LOG("glUniform2f"
+                 << "(" << location << ", " << x << ", " << y << ")");
+  g_driver_gl.debug_fn.glUniform2fFn(location, x, y);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform2fv(GLint location, GLsizei count, const GLfloat* v) {
+  GL_SERVICE_LOG("glUniform2fv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform2fvFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform2i(GLint location, GLint x, GLint y) {
+  GL_SERVICE_LOG("glUniform2i"
+                 << "(" << location << ", " << x << ", " << y << ")");
+  g_driver_gl.debug_fn.glUniform2iFn(location, x, y);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform2iv(GLint location, GLsizei count, const GLint* v) {
+  GL_SERVICE_LOG("glUniform2iv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform2ivFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform2ui(GLint location, GLuint v0, GLuint v1) {
+  GL_SERVICE_LOG("glUniform2ui"
+                 << "(" << location << ", " << v0 << ", " << v1 << ")");
+  g_driver_gl.debug_fn.glUniform2uiFn(location, v0, v1);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform2uiv(GLint location, GLsizei count, const GLuint* v) {
+  GL_SERVICE_LOG("glUniform2uiv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform2uivFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) {
+  GL_SERVICE_LOG("glUniform3f"
+                 << "(" << location << ", " << x << ", " << y << ", " << z
+                 << ")");
+  g_driver_gl.debug_fn.glUniform3fFn(location, x, y, z);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform3fv(GLint location, GLsizei count, const GLfloat* v) {
+  GL_SERVICE_LOG("glUniform3fv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform3fvFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform3i(GLint location, GLint x, GLint y, GLint z) {
+  GL_SERVICE_LOG("glUniform3i"
+                 << "(" << location << ", " << x << ", " << y << ", " << z
+                 << ")");
+  g_driver_gl.debug_fn.glUniform3iFn(location, x, y, z);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform3iv(GLint location, GLsizei count, const GLint* v) {
+  GL_SERVICE_LOG("glUniform3iv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform3ivFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) {
+  GL_SERVICE_LOG("glUniform3ui"
+                 << "(" << location << ", " << v0 << ", " << v1 << ", " << v2
+                 << ")");
+  g_driver_gl.debug_fn.glUniform3uiFn(location, v0, v1, v2);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform3uiv(GLint location, GLsizei count, const GLuint* v) {
+  GL_SERVICE_LOG("glUniform3uiv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform3uivFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
+  GL_SERVICE_LOG("glUniform4f"
+                 << "(" << location << ", " << x << ", " << y << ", " << z
+                 << ", " << w << ")");
+  g_driver_gl.debug_fn.glUniform4fFn(location, x, y, z, w);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform4fv(GLint location, GLsizei count, const GLfloat* v) {
+  GL_SERVICE_LOG("glUniform4fv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform4fvFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) {
+  GL_SERVICE_LOG("glUniform4i"
+                 << "(" << location << ", " << x << ", " << y << ", " << z
+                 << ", " << w << ")");
+  g_driver_gl.debug_fn.glUniform4iFn(location, x, y, z, w);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform4iv(GLint location, GLsizei count, const GLint* v) {
+  GL_SERVICE_LOG("glUniform4iv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform4ivFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) {
+  GL_SERVICE_LOG("glUniform4ui"
+                 << "(" << location << ", " << v0 << ", " << v1 << ", " << v2
+                 << ", " << v3 << ")");
+  g_driver_gl.debug_fn.glUniform4uiFn(location, v0, v1, v2, v3);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniform4uiv(GLint location, GLsizei count, const GLuint* v) {
+  GL_SERVICE_LOG("glUniform4uiv"
+                 << "(" << location << ", " << count << ", "
+                 << static_cast<const void*>(v) << ")");
+  g_driver_gl.debug_fn.glUniform4uivFn(location, count, v);
+}
+
+static void GL_BINDING_CALL
+Debug_glUniformBlockBinding(GLuint program,
+                            GLuint uniformBlockIndex,
+                            GLuint uniformBlockBinding) {
+  GL_SERVICE_LOG("glUniformBlockBinding"
+                 << "(" << program << ", " << uniformBlockIndex << ", "
+                 << uniformBlockBinding << ")");
+  g_driver_gl.debug_fn.glUniformBlockBindingFn(program, uniformBlockIndex,
+                                               uniformBlockBinding);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix2fv(GLint location,
+                                                     GLsizei count,
+                                                     GLboolean transpose,
+                                                     const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix2fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix2fvFn(location, count, transpose, value);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix2x3fv(GLint location,
+                                                       GLsizei count,
+                                                       GLboolean transpose,
+                                                       const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix2x3fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix2x3fvFn(location, count, transpose,
+                                              value);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix2x4fv(GLint location,
+                                                       GLsizei count,
+                                                       GLboolean transpose,
+                                                       const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix2x4fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix2x4fvFn(location, count, transpose,
+                                              value);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix3fv(GLint location,
+                                                     GLsizei count,
+                                                     GLboolean transpose,
+                                                     const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix3fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix3fvFn(location, count, transpose, value);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix3x2fv(GLint location,
+                                                       GLsizei count,
+                                                       GLboolean transpose,
+                                                       const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix3x2fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix3x2fvFn(location, count, transpose,
+                                              value);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix3x4fv(GLint location,
+                                                       GLsizei count,
+                                                       GLboolean transpose,
+                                                       const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix3x4fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix3x4fvFn(location, count, transpose,
+                                              value);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix4fv(GLint location,
+                                                     GLsizei count,
+                                                     GLboolean transpose,
+                                                     const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix4fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix4fvFn(location, count, transpose, value);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix4x2fv(GLint location,
+                                                       GLsizei count,
+                                                       GLboolean transpose,
+                                                       const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix4x2fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix4x2fvFn(location, count, transpose,
+                                              value);
+}
+
+static void GL_BINDING_CALL Debug_glUniformMatrix4x3fv(GLint location,
+                                                       GLsizei count,
+                                                       GLboolean transpose,
+                                                       const GLfloat* value) {
+  GL_SERVICE_LOG("glUniformMatrix4x3fv"
+                 << "(" << location << ", " << count << ", "
+                 << GLEnums::GetStringBool(transpose) << ", "
+                 << static_cast<const void*>(value) << ")");
+  g_driver_gl.debug_fn.glUniformMatrix4x3fvFn(location, count, transpose,
+                                              value);
+}
+
+static GLboolean GL_BINDING_CALL Debug_glUnmapBuffer(GLenum target) {
+  GL_SERVICE_LOG("glUnmapBuffer"
+                 << "(" << GLEnums::GetStringEnum(target) << ")");
+  GLboolean result = g_driver_gl.debug_fn.glUnmapBufferFn(target);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glUseProgram(GLuint program) {
+  GL_SERVICE_LOG("glUseProgram"
+                 << "(" << program << ")");
+  g_driver_gl.debug_fn.glUseProgramFn(program);
+}
+
+static void GL_BINDING_CALL Debug_glValidateProgram(GLuint program) {
+  GL_SERVICE_LOG("glValidateProgram"
+                 << "(" << program << ")");
+  g_driver_gl.debug_fn.glValidateProgramFn(program);
+}
+
+static void GL_BINDING_CALL Debug_glVertexAttrib1f(GLuint indx, GLfloat x) {
+  GL_SERVICE_LOG("glVertexAttrib1f"
+                 << "(" << indx << ", " << x << ")");
+  g_driver_gl.debug_fn.glVertexAttrib1fFn(indx, x);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttrib1fv(GLuint indx, const GLfloat* values) {
+  GL_SERVICE_LOG("glVertexAttrib1fv"
+                 << "(" << indx << ", " << static_cast<const void*>(values)
+                 << ")");
+  g_driver_gl.debug_fn.glVertexAttrib1fvFn(indx, values);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) {
+  GL_SERVICE_LOG("glVertexAttrib2f"
+                 << "(" << indx << ", " << x << ", " << y << ")");
+  g_driver_gl.debug_fn.glVertexAttrib2fFn(indx, x, y);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttrib2fv(GLuint indx, const GLfloat* values) {
+  GL_SERVICE_LOG("glVertexAttrib2fv"
+                 << "(" << indx << ", " << static_cast<const void*>(values)
+                 << ")");
+  g_driver_gl.debug_fn.glVertexAttrib2fvFn(indx, values);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) {
+  GL_SERVICE_LOG("glVertexAttrib3f"
+                 << "(" << indx << ", " << x << ", " << y << ", " << z << ")");
+  g_driver_gl.debug_fn.glVertexAttrib3fFn(indx, x, y, z);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttrib3fv(GLuint indx, const GLfloat* values) {
+  GL_SERVICE_LOG("glVertexAttrib3fv"
+                 << "(" << indx << ", " << static_cast<const void*>(values)
+                 << ")");
+  g_driver_gl.debug_fn.glVertexAttrib3fvFn(indx, values);
+}
+
+static void GL_BINDING_CALL Debug_glVertexAttrib4f(GLuint indx,
+                                                   GLfloat x,
+                                                   GLfloat y,
+                                                   GLfloat z,
+                                                   GLfloat w) {
+  GL_SERVICE_LOG("glVertexAttrib4f"
+                 << "(" << indx << ", " << x << ", " << y << ", " << z << ", "
+                 << w << ")");
+  g_driver_gl.debug_fn.glVertexAttrib4fFn(indx, x, y, z, w);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttrib4fv(GLuint indx, const GLfloat* values) {
+  GL_SERVICE_LOG("glVertexAttrib4fv"
+                 << "(" << indx << ", " << static_cast<const void*>(values)
+                 << ")");
+  g_driver_gl.debug_fn.glVertexAttrib4fvFn(indx, values);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttribDivisorANGLE(GLuint index, GLuint divisor) {
+  GL_SERVICE_LOG("glVertexAttribDivisorANGLE"
+                 << "(" << index << ", " << divisor << ")");
+  g_driver_gl.debug_fn.glVertexAttribDivisorANGLEFn(index, divisor);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttribI4i(GLuint indx, GLint x, GLint y, GLint z, GLint w) {
+  GL_SERVICE_LOG("glVertexAttribI4i"
+                 << "(" << indx << ", " << x << ", " << y << ", " << z << ", "
+                 << w << ")");
+  g_driver_gl.debug_fn.glVertexAttribI4iFn(indx, x, y, z, w);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttribI4iv(GLuint indx, const GLint* values) {
+  GL_SERVICE_LOG("glVertexAttribI4iv"
+                 << "(" << indx << ", " << static_cast<const void*>(values)
+                 << ")");
+  g_driver_gl.debug_fn.glVertexAttribI4ivFn(indx, values);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttribI4ui(GLuint indx, GLuint x, GLuint y, GLuint z, GLuint w) {
+  GL_SERVICE_LOG("glVertexAttribI4ui"
+                 << "(" << indx << ", " << x << ", " << y << ", " << z << ", "
+                 << w << ")");
+  g_driver_gl.debug_fn.glVertexAttribI4uiFn(indx, x, y, z, w);
+}
+
+static void GL_BINDING_CALL
+Debug_glVertexAttribI4uiv(GLuint indx, const GLuint* values) {
+  GL_SERVICE_LOG("glVertexAttribI4uiv"
+                 << "(" << indx << ", " << static_cast<const void*>(values)
+                 << ")");
+  g_driver_gl.debug_fn.glVertexAttribI4uivFn(indx, values);
+}
+
+static void GL_BINDING_CALL Debug_glVertexAttribIPointer(GLuint indx,
+                                                         GLint size,
+                                                         GLenum type,
+                                                         GLsizei stride,
+                                                         const void* ptr) {
+  GL_SERVICE_LOG("glVertexAttribIPointer"
+                 << "(" << indx << ", " << size << ", "
+                 << GLEnums::GetStringEnum(type) << ", " << stride << ", "
+                 << static_cast<const void*>(ptr) << ")");
+  g_driver_gl.debug_fn.glVertexAttribIPointerFn(indx, size, type, stride, ptr);
+}
+
+static void GL_BINDING_CALL Debug_glVertexAttribPointer(GLuint indx,
+                                                        GLint size,
+                                                        GLenum type,
+                                                        GLboolean normalized,
+                                                        GLsizei stride,
+                                                        const void* ptr) {
+  GL_SERVICE_LOG("glVertexAttribPointer"
+                 << "(" << indx << ", " << size << ", "
+                 << GLEnums::GetStringEnum(type) << ", "
+                 << GLEnums::GetStringBool(normalized) << ", " << stride << ", "
+                 << static_cast<const void*>(ptr) << ")");
+  g_driver_gl.debug_fn.glVertexAttribPointerFn(indx, size, type, normalized,
+                                               stride, ptr);
+}
+
+static void GL_BINDING_CALL
+Debug_glViewport(GLint x, GLint y, GLsizei width, GLsizei height) {
+  GL_SERVICE_LOG("glViewport"
+                 << "(" << x << ", " << y << ", " << width << ", " << height
+                 << ")");
+  g_driver_gl.debug_fn.glViewportFn(x, y, width, height);
+}
+
+static GLenum GL_BINDING_CALL
+Debug_glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) {
+  GL_SERVICE_LOG("glWaitSync"
+                 << "(" << sync << ", " << flags << ", " << timeout << ")");
+  GLenum result = g_driver_gl.debug_fn.glWaitSyncFn(sync, flags, timeout);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+}  // extern "C"
+
+void DriverGL::InitializeDebugBindings() {
+  if (!debug_fn.glActiveTextureFn) {
+    debug_fn.glActiveTextureFn = fn.glActiveTextureFn;
+    fn.glActiveTextureFn = Debug_glActiveTexture;
+  }
+  if (!debug_fn.glAttachShaderFn) {
+    debug_fn.glAttachShaderFn = fn.glAttachShaderFn;
+    fn.glAttachShaderFn = Debug_glAttachShader;
+  }
+  if (!debug_fn.glBeginQueryFn) {
+    debug_fn.glBeginQueryFn = fn.glBeginQueryFn;
+    fn.glBeginQueryFn = Debug_glBeginQuery;
+  }
+  if (!debug_fn.glBeginQueryARBFn) {
+    debug_fn.glBeginQueryARBFn = fn.glBeginQueryARBFn;
+    fn.glBeginQueryARBFn = Debug_glBeginQueryARB;
+  }
+  if (!debug_fn.glBeginTransformFeedbackFn) {
+    debug_fn.glBeginTransformFeedbackFn = fn.glBeginTransformFeedbackFn;
+    fn.glBeginTransformFeedbackFn = Debug_glBeginTransformFeedback;
+  }
+  if (!debug_fn.glBindAttribLocationFn) {
+    debug_fn.glBindAttribLocationFn = fn.glBindAttribLocationFn;
+    fn.glBindAttribLocationFn = Debug_glBindAttribLocation;
+  }
+  if (!debug_fn.glBindBufferFn) {
+    debug_fn.glBindBufferFn = fn.glBindBufferFn;
+    fn.glBindBufferFn = Debug_glBindBuffer;
+  }
+  if (!debug_fn.glBindBufferBaseFn) {
+    debug_fn.glBindBufferBaseFn = fn.glBindBufferBaseFn;
+    fn.glBindBufferBaseFn = Debug_glBindBufferBase;
+  }
+  if (!debug_fn.glBindBufferRangeFn) {
+    debug_fn.glBindBufferRangeFn = fn.glBindBufferRangeFn;
+    fn.glBindBufferRangeFn = Debug_glBindBufferRange;
+  }
+  if (!debug_fn.glBindFragDataLocationFn) {
+    debug_fn.glBindFragDataLocationFn = fn.glBindFragDataLocationFn;
+    fn.glBindFragDataLocationFn = Debug_glBindFragDataLocation;
+  }
+  if (!debug_fn.glBindFragDataLocationIndexedFn) {
+    debug_fn.glBindFragDataLocationIndexedFn =
+        fn.glBindFragDataLocationIndexedFn;
+    fn.glBindFragDataLocationIndexedFn = Debug_glBindFragDataLocationIndexed;
+  }
+  if (!debug_fn.glBindFramebufferEXTFn) {
+    debug_fn.glBindFramebufferEXTFn = fn.glBindFramebufferEXTFn;
+    fn.glBindFramebufferEXTFn = Debug_glBindFramebufferEXT;
+  }
+  if (!debug_fn.glBindRenderbufferEXTFn) {
+    debug_fn.glBindRenderbufferEXTFn = fn.glBindRenderbufferEXTFn;
+    fn.glBindRenderbufferEXTFn = Debug_glBindRenderbufferEXT;
+  }
+  if (!debug_fn.glBindSamplerFn) {
+    debug_fn.glBindSamplerFn = fn.glBindSamplerFn;
+    fn.glBindSamplerFn = Debug_glBindSampler;
+  }
+  if (!debug_fn.glBindTextureFn) {
+    debug_fn.glBindTextureFn = fn.glBindTextureFn;
+    fn.glBindTextureFn = Debug_glBindTexture;
+  }
+  if (!debug_fn.glBindTransformFeedbackFn) {
+    debug_fn.glBindTransformFeedbackFn = fn.glBindTransformFeedbackFn;
+    fn.glBindTransformFeedbackFn = Debug_glBindTransformFeedback;
+  }
+  if (!debug_fn.glBindVertexArrayOESFn) {
+    debug_fn.glBindVertexArrayOESFn = fn.glBindVertexArrayOESFn;
+    fn.glBindVertexArrayOESFn = Debug_glBindVertexArrayOES;
+  }
+  if (!debug_fn.glBlendBarrierKHRFn) {
+    debug_fn.glBlendBarrierKHRFn = fn.glBlendBarrierKHRFn;
+    fn.glBlendBarrierKHRFn = Debug_glBlendBarrierKHR;
+  }
+  if (!debug_fn.glBlendColorFn) {
+    debug_fn.glBlendColorFn = fn.glBlendColorFn;
+    fn.glBlendColorFn = Debug_glBlendColor;
+  }
+  if (!debug_fn.glBlendEquationFn) {
+    debug_fn.glBlendEquationFn = fn.glBlendEquationFn;
+    fn.glBlendEquationFn = Debug_glBlendEquation;
+  }
+  if (!debug_fn.glBlendEquationSeparateFn) {
+    debug_fn.glBlendEquationSeparateFn = fn.glBlendEquationSeparateFn;
+    fn.glBlendEquationSeparateFn = Debug_glBlendEquationSeparate;
+  }
+  if (!debug_fn.glBlendFuncFn) {
+    debug_fn.glBlendFuncFn = fn.glBlendFuncFn;
+    fn.glBlendFuncFn = Debug_glBlendFunc;
+  }
+  if (!debug_fn.glBlendFuncSeparateFn) {
+    debug_fn.glBlendFuncSeparateFn = fn.glBlendFuncSeparateFn;
+    fn.glBlendFuncSeparateFn = Debug_glBlendFuncSeparate;
+  }
+  if (!debug_fn.glBlitFramebufferFn) {
+    debug_fn.glBlitFramebufferFn = fn.glBlitFramebufferFn;
+    fn.glBlitFramebufferFn = Debug_glBlitFramebuffer;
+  }
+  if (!debug_fn.glBlitFramebufferANGLEFn) {
+    debug_fn.glBlitFramebufferANGLEFn = fn.glBlitFramebufferANGLEFn;
+    fn.glBlitFramebufferANGLEFn = Debug_glBlitFramebufferANGLE;
+  }
+  if (!debug_fn.glBlitFramebufferEXTFn) {
+    debug_fn.glBlitFramebufferEXTFn = fn.glBlitFramebufferEXTFn;
+    fn.glBlitFramebufferEXTFn = Debug_glBlitFramebufferEXT;
+  }
+  if (!debug_fn.glBufferDataFn) {
+    debug_fn.glBufferDataFn = fn.glBufferDataFn;
+    fn.glBufferDataFn = Debug_glBufferData;
+  }
+  if (!debug_fn.glBufferSubDataFn) {
+    debug_fn.glBufferSubDataFn = fn.glBufferSubDataFn;
+    fn.glBufferSubDataFn = Debug_glBufferSubData;
+  }
+  if (!debug_fn.glCheckFramebufferStatusEXTFn) {
+    debug_fn.glCheckFramebufferStatusEXTFn = fn.glCheckFramebufferStatusEXTFn;
+    fn.glCheckFramebufferStatusEXTFn = Debug_glCheckFramebufferStatusEXT;
+  }
+  if (!debug_fn.glClearFn) {
+    debug_fn.glClearFn = fn.glClearFn;
+    fn.glClearFn = Debug_glClear;
+  }
+  if (!debug_fn.glClearBufferfiFn) {
+    debug_fn.glClearBufferfiFn = fn.glClearBufferfiFn;
+    fn.glClearBufferfiFn = Debug_glClearBufferfi;
+  }
+  if (!debug_fn.glClearBufferfvFn) {
+    debug_fn.glClearBufferfvFn = fn.glClearBufferfvFn;
+    fn.glClearBufferfvFn = Debug_glClearBufferfv;
+  }
+  if (!debug_fn.glClearBufferivFn) {
+    debug_fn.glClearBufferivFn = fn.glClearBufferivFn;
+    fn.glClearBufferivFn = Debug_glClearBufferiv;
+  }
+  if (!debug_fn.glClearBufferuivFn) {
+    debug_fn.glClearBufferuivFn = fn.glClearBufferuivFn;
+    fn.glClearBufferuivFn = Debug_glClearBufferuiv;
+  }
+  if (!debug_fn.glClearColorFn) {
+    debug_fn.glClearColorFn = fn.glClearColorFn;
+    fn.glClearColorFn = Debug_glClearColor;
+  }
+  if (!debug_fn.glClearDepthFn) {
+    debug_fn.glClearDepthFn = fn.glClearDepthFn;
+    fn.glClearDepthFn = Debug_glClearDepth;
+  }
+  if (!debug_fn.glClearDepthfFn) {
+    debug_fn.glClearDepthfFn = fn.glClearDepthfFn;
+    fn.glClearDepthfFn = Debug_glClearDepthf;
+  }
+  if (!debug_fn.glClearStencilFn) {
+    debug_fn.glClearStencilFn = fn.glClearStencilFn;
+    fn.glClearStencilFn = Debug_glClearStencil;
+  }
+  if (!debug_fn.glClientWaitSyncFn) {
+    debug_fn.glClientWaitSyncFn = fn.glClientWaitSyncFn;
+    fn.glClientWaitSyncFn = Debug_glClientWaitSync;
+  }
+  if (!debug_fn.glColorMaskFn) {
+    debug_fn.glColorMaskFn = fn.glColorMaskFn;
+    fn.glColorMaskFn = Debug_glColorMask;
+  }
+  if (!debug_fn.glCompileShaderFn) {
+    debug_fn.glCompileShaderFn = fn.glCompileShaderFn;
+    fn.glCompileShaderFn = Debug_glCompileShader;
+  }
+  if (!debug_fn.glCompressedTexImage2DFn) {
+    debug_fn.glCompressedTexImage2DFn = fn.glCompressedTexImage2DFn;
+    fn.glCompressedTexImage2DFn = Debug_glCompressedTexImage2D;
+  }
+  if (!debug_fn.glCompressedTexImage3DFn) {
+    debug_fn.glCompressedTexImage3DFn = fn.glCompressedTexImage3DFn;
+    fn.glCompressedTexImage3DFn = Debug_glCompressedTexImage3D;
+  }
+  if (!debug_fn.glCompressedTexSubImage2DFn) {
+    debug_fn.glCompressedTexSubImage2DFn = fn.glCompressedTexSubImage2DFn;
+    fn.glCompressedTexSubImage2DFn = Debug_glCompressedTexSubImage2D;
+  }
+  if (!debug_fn.glCopyBufferSubDataFn) {
+    debug_fn.glCopyBufferSubDataFn = fn.glCopyBufferSubDataFn;
+    fn.glCopyBufferSubDataFn = Debug_glCopyBufferSubData;
+  }
+  if (!debug_fn.glCopyTexImage2DFn) {
+    debug_fn.glCopyTexImage2DFn = fn.glCopyTexImage2DFn;
+    fn.glCopyTexImage2DFn = Debug_glCopyTexImage2D;
+  }
+  if (!debug_fn.glCopyTexSubImage2DFn) {
+    debug_fn.glCopyTexSubImage2DFn = fn.glCopyTexSubImage2DFn;
+    fn.glCopyTexSubImage2DFn = Debug_glCopyTexSubImage2D;
+  }
+  if (!debug_fn.glCopyTexSubImage3DFn) {
+    debug_fn.glCopyTexSubImage3DFn = fn.glCopyTexSubImage3DFn;
+    fn.glCopyTexSubImage3DFn = Debug_glCopyTexSubImage3D;
+  }
+  if (!debug_fn.glCreateProgramFn) {
+    debug_fn.glCreateProgramFn = fn.glCreateProgramFn;
+    fn.glCreateProgramFn = Debug_glCreateProgram;
+  }
+  if (!debug_fn.glCreateShaderFn) {
+    debug_fn.glCreateShaderFn = fn.glCreateShaderFn;
+    fn.glCreateShaderFn = Debug_glCreateShader;
+  }
+  if (!debug_fn.glCullFaceFn) {
+    debug_fn.glCullFaceFn = fn.glCullFaceFn;
+    fn.glCullFaceFn = Debug_glCullFace;
+  }
+  if (!debug_fn.glDeleteBuffersARBFn) {
+    debug_fn.glDeleteBuffersARBFn = fn.glDeleteBuffersARBFn;
+    fn.glDeleteBuffersARBFn = Debug_glDeleteBuffersARB;
+  }
+  if (!debug_fn.glDeleteFencesAPPLEFn) {
+    debug_fn.glDeleteFencesAPPLEFn = fn.glDeleteFencesAPPLEFn;
+    fn.glDeleteFencesAPPLEFn = Debug_glDeleteFencesAPPLE;
+  }
+  if (!debug_fn.glDeleteFencesNVFn) {
+    debug_fn.glDeleteFencesNVFn = fn.glDeleteFencesNVFn;
+    fn.glDeleteFencesNVFn = Debug_glDeleteFencesNV;
+  }
+  if (!debug_fn.glDeleteFramebuffersEXTFn) {
+    debug_fn.glDeleteFramebuffersEXTFn = fn.glDeleteFramebuffersEXTFn;
+    fn.glDeleteFramebuffersEXTFn = Debug_glDeleteFramebuffersEXT;
+  }
+  if (!debug_fn.glDeleteProgramFn) {
+    debug_fn.glDeleteProgramFn = fn.glDeleteProgramFn;
+    fn.glDeleteProgramFn = Debug_glDeleteProgram;
+  }
+  if (!debug_fn.glDeleteQueriesFn) {
+    debug_fn.glDeleteQueriesFn = fn.glDeleteQueriesFn;
+    fn.glDeleteQueriesFn = Debug_glDeleteQueries;
+  }
+  if (!debug_fn.glDeleteQueriesARBFn) {
+    debug_fn.glDeleteQueriesARBFn = fn.glDeleteQueriesARBFn;
+    fn.glDeleteQueriesARBFn = Debug_glDeleteQueriesARB;
+  }
+  if (!debug_fn.glDeleteRenderbuffersEXTFn) {
+    debug_fn.glDeleteRenderbuffersEXTFn = fn.glDeleteRenderbuffersEXTFn;
+    fn.glDeleteRenderbuffersEXTFn = Debug_glDeleteRenderbuffersEXT;
+  }
+  if (!debug_fn.glDeleteSamplersFn) {
+    debug_fn.glDeleteSamplersFn = fn.glDeleteSamplersFn;
+    fn.glDeleteSamplersFn = Debug_glDeleteSamplers;
+  }
+  if (!debug_fn.glDeleteShaderFn) {
+    debug_fn.glDeleteShaderFn = fn.glDeleteShaderFn;
+    fn.glDeleteShaderFn = Debug_glDeleteShader;
+  }
+  if (!debug_fn.glDeleteSyncFn) {
+    debug_fn.glDeleteSyncFn = fn.glDeleteSyncFn;
+    fn.glDeleteSyncFn = Debug_glDeleteSync;
+  }
+  if (!debug_fn.glDeleteTexturesFn) {
+    debug_fn.glDeleteTexturesFn = fn.glDeleteTexturesFn;
+    fn.glDeleteTexturesFn = Debug_glDeleteTextures;
+  }
+  if (!debug_fn.glDeleteTransformFeedbacksFn) {
+    debug_fn.glDeleteTransformFeedbacksFn = fn.glDeleteTransformFeedbacksFn;
+    fn.glDeleteTransformFeedbacksFn = Debug_glDeleteTransformFeedbacks;
+  }
+  if (!debug_fn.glDeleteVertexArraysOESFn) {
+    debug_fn.glDeleteVertexArraysOESFn = fn.glDeleteVertexArraysOESFn;
+    fn.glDeleteVertexArraysOESFn = Debug_glDeleteVertexArraysOES;
+  }
+  if (!debug_fn.glDepthFuncFn) {
+    debug_fn.glDepthFuncFn = fn.glDepthFuncFn;
+    fn.glDepthFuncFn = Debug_glDepthFunc;
+  }
+  if (!debug_fn.glDepthMaskFn) {
+    debug_fn.glDepthMaskFn = fn.glDepthMaskFn;
+    fn.glDepthMaskFn = Debug_glDepthMask;
+  }
+  if (!debug_fn.glDepthRangeFn) {
+    debug_fn.glDepthRangeFn = fn.glDepthRangeFn;
+    fn.glDepthRangeFn = Debug_glDepthRange;
+  }
+  if (!debug_fn.glDepthRangefFn) {
+    debug_fn.glDepthRangefFn = fn.glDepthRangefFn;
+    fn.glDepthRangefFn = Debug_glDepthRangef;
+  }
+  if (!debug_fn.glDetachShaderFn) {
+    debug_fn.glDetachShaderFn = fn.glDetachShaderFn;
+    fn.glDetachShaderFn = Debug_glDetachShader;
+  }
+  if (!debug_fn.glDisableFn) {
+    debug_fn.glDisableFn = fn.glDisableFn;
+    fn.glDisableFn = Debug_glDisable;
+  }
+  if (!debug_fn.glDisableVertexAttribArrayFn) {
+    debug_fn.glDisableVertexAttribArrayFn = fn.glDisableVertexAttribArrayFn;
+    fn.glDisableVertexAttribArrayFn = Debug_glDisableVertexAttribArray;
+  }
+  if (!debug_fn.glDiscardFramebufferEXTFn) {
+    debug_fn.glDiscardFramebufferEXTFn = fn.glDiscardFramebufferEXTFn;
+    fn.glDiscardFramebufferEXTFn = Debug_glDiscardFramebufferEXT;
+  }
+  if (!debug_fn.glDrawArraysFn) {
+    debug_fn.glDrawArraysFn = fn.glDrawArraysFn;
+    fn.glDrawArraysFn = Debug_glDrawArrays;
+  }
+  if (!debug_fn.glDrawArraysInstancedANGLEFn) {
+    debug_fn.glDrawArraysInstancedANGLEFn = fn.glDrawArraysInstancedANGLEFn;
+    fn.glDrawArraysInstancedANGLEFn = Debug_glDrawArraysInstancedANGLE;
+  }
+  if (!debug_fn.glDrawBufferFn) {
+    debug_fn.glDrawBufferFn = fn.glDrawBufferFn;
+    fn.glDrawBufferFn = Debug_glDrawBuffer;
+  }
+  if (!debug_fn.glDrawBuffersARBFn) {
+    debug_fn.glDrawBuffersARBFn = fn.glDrawBuffersARBFn;
+    fn.glDrawBuffersARBFn = Debug_glDrawBuffersARB;
+  }
+  if (!debug_fn.glDrawElementsFn) {
+    debug_fn.glDrawElementsFn = fn.glDrawElementsFn;
+    fn.glDrawElementsFn = Debug_glDrawElements;
+  }
+  if (!debug_fn.glDrawElementsInstancedANGLEFn) {
+    debug_fn.glDrawElementsInstancedANGLEFn = fn.glDrawElementsInstancedANGLEFn;
+    fn.glDrawElementsInstancedANGLEFn = Debug_glDrawElementsInstancedANGLE;
+  }
+  if (!debug_fn.glDrawRangeElementsFn) {
+    debug_fn.glDrawRangeElementsFn = fn.glDrawRangeElementsFn;
+    fn.glDrawRangeElementsFn = Debug_glDrawRangeElements;
+  }
+  if (!debug_fn.glEGLImageTargetRenderbufferStorageOESFn) {
+    debug_fn.glEGLImageTargetRenderbufferStorageOESFn =
+        fn.glEGLImageTargetRenderbufferStorageOESFn;
+    fn.glEGLImageTargetRenderbufferStorageOESFn =
+        Debug_glEGLImageTargetRenderbufferStorageOES;
+  }
+  if (!debug_fn.glEGLImageTargetTexture2DOESFn) {
+    debug_fn.glEGLImageTargetTexture2DOESFn = fn.glEGLImageTargetTexture2DOESFn;
+    fn.glEGLImageTargetTexture2DOESFn = Debug_glEGLImageTargetTexture2DOES;
+  }
+  if (!debug_fn.glEnableFn) {
+    debug_fn.glEnableFn = fn.glEnableFn;
+    fn.glEnableFn = Debug_glEnable;
+  }
+  if (!debug_fn.glEnableVertexAttribArrayFn) {
+    debug_fn.glEnableVertexAttribArrayFn = fn.glEnableVertexAttribArrayFn;
+    fn.glEnableVertexAttribArrayFn = Debug_glEnableVertexAttribArray;
+  }
+  if (!debug_fn.glEndQueryFn) {
+    debug_fn.glEndQueryFn = fn.glEndQueryFn;
+    fn.glEndQueryFn = Debug_glEndQuery;
+  }
+  if (!debug_fn.glEndQueryARBFn) {
+    debug_fn.glEndQueryARBFn = fn.glEndQueryARBFn;
+    fn.glEndQueryARBFn = Debug_glEndQueryARB;
+  }
+  if (!debug_fn.glEndTransformFeedbackFn) {
+    debug_fn.glEndTransformFeedbackFn = fn.glEndTransformFeedbackFn;
+    fn.glEndTransformFeedbackFn = Debug_glEndTransformFeedback;
+  }
+  if (!debug_fn.glFenceSyncFn) {
+    debug_fn.glFenceSyncFn = fn.glFenceSyncFn;
+    fn.glFenceSyncFn = Debug_glFenceSync;
+  }
+  if (!debug_fn.glFinishFn) {
+    debug_fn.glFinishFn = fn.glFinishFn;
+    fn.glFinishFn = Debug_glFinish;
+  }
+  if (!debug_fn.glFinishFenceAPPLEFn) {
+    debug_fn.glFinishFenceAPPLEFn = fn.glFinishFenceAPPLEFn;
+    fn.glFinishFenceAPPLEFn = Debug_glFinishFenceAPPLE;
+  }
+  if (!debug_fn.glFinishFenceNVFn) {
+    debug_fn.glFinishFenceNVFn = fn.glFinishFenceNVFn;
+    fn.glFinishFenceNVFn = Debug_glFinishFenceNV;
+  }
+  if (!debug_fn.glFlushFn) {
+    debug_fn.glFlushFn = fn.glFlushFn;
+    fn.glFlushFn = Debug_glFlush;
+  }
+  if (!debug_fn.glFlushMappedBufferRangeFn) {
+    debug_fn.glFlushMappedBufferRangeFn = fn.glFlushMappedBufferRangeFn;
+    fn.glFlushMappedBufferRangeFn = Debug_glFlushMappedBufferRange;
+  }
+  if (!debug_fn.glFramebufferRenderbufferEXTFn) {
+    debug_fn.glFramebufferRenderbufferEXTFn = fn.glFramebufferRenderbufferEXTFn;
+    fn.glFramebufferRenderbufferEXTFn = Debug_glFramebufferRenderbufferEXT;
+  }
+  if (!debug_fn.glFramebufferTexture2DEXTFn) {
+    debug_fn.glFramebufferTexture2DEXTFn = fn.glFramebufferTexture2DEXTFn;
+    fn.glFramebufferTexture2DEXTFn = Debug_glFramebufferTexture2DEXT;
+  }
+  if (!debug_fn.glFramebufferTexture2DMultisampleEXTFn) {
+    debug_fn.glFramebufferTexture2DMultisampleEXTFn =
+        fn.glFramebufferTexture2DMultisampleEXTFn;
+    fn.glFramebufferTexture2DMultisampleEXTFn =
+        Debug_glFramebufferTexture2DMultisampleEXT;
+  }
+  if (!debug_fn.glFramebufferTexture2DMultisampleIMGFn) {
+    debug_fn.glFramebufferTexture2DMultisampleIMGFn =
+        fn.glFramebufferTexture2DMultisampleIMGFn;
+    fn.glFramebufferTexture2DMultisampleIMGFn =
+        Debug_glFramebufferTexture2DMultisampleIMG;
+  }
+  if (!debug_fn.glFramebufferTextureLayerFn) {
+    debug_fn.glFramebufferTextureLayerFn = fn.glFramebufferTextureLayerFn;
+    fn.glFramebufferTextureLayerFn = Debug_glFramebufferTextureLayer;
+  }
+  if (!debug_fn.glFrontFaceFn) {
+    debug_fn.glFrontFaceFn = fn.glFrontFaceFn;
+    fn.glFrontFaceFn = Debug_glFrontFace;
+  }
+  if (!debug_fn.glGenBuffersARBFn) {
+    debug_fn.glGenBuffersARBFn = fn.glGenBuffersARBFn;
+    fn.glGenBuffersARBFn = Debug_glGenBuffersARB;
+  }
+  if (!debug_fn.glGenerateMipmapEXTFn) {
+    debug_fn.glGenerateMipmapEXTFn = fn.glGenerateMipmapEXTFn;
+    fn.glGenerateMipmapEXTFn = Debug_glGenerateMipmapEXT;
+  }
+  if (!debug_fn.glGenFencesAPPLEFn) {
+    debug_fn.glGenFencesAPPLEFn = fn.glGenFencesAPPLEFn;
+    fn.glGenFencesAPPLEFn = Debug_glGenFencesAPPLE;
+  }
+  if (!debug_fn.glGenFencesNVFn) {
+    debug_fn.glGenFencesNVFn = fn.glGenFencesNVFn;
+    fn.glGenFencesNVFn = Debug_glGenFencesNV;
+  }
+  if (!debug_fn.glGenFramebuffersEXTFn) {
+    debug_fn.glGenFramebuffersEXTFn = fn.glGenFramebuffersEXTFn;
+    fn.glGenFramebuffersEXTFn = Debug_glGenFramebuffersEXT;
+  }
+  if (!debug_fn.glGenQueriesFn) {
+    debug_fn.glGenQueriesFn = fn.glGenQueriesFn;
+    fn.glGenQueriesFn = Debug_glGenQueries;
+  }
+  if (!debug_fn.glGenQueriesARBFn) {
+    debug_fn.glGenQueriesARBFn = fn.glGenQueriesARBFn;
+    fn.glGenQueriesARBFn = Debug_glGenQueriesARB;
+  }
+  if (!debug_fn.glGenRenderbuffersEXTFn) {
+    debug_fn.glGenRenderbuffersEXTFn = fn.glGenRenderbuffersEXTFn;
+    fn.glGenRenderbuffersEXTFn = Debug_glGenRenderbuffersEXT;
+  }
+  if (!debug_fn.glGenSamplersFn) {
+    debug_fn.glGenSamplersFn = fn.glGenSamplersFn;
+    fn.glGenSamplersFn = Debug_glGenSamplers;
+  }
+  if (!debug_fn.glGenTexturesFn) {
+    debug_fn.glGenTexturesFn = fn.glGenTexturesFn;
+    fn.glGenTexturesFn = Debug_glGenTextures;
+  }
+  if (!debug_fn.glGenTransformFeedbacksFn) {
+    debug_fn.glGenTransformFeedbacksFn = fn.glGenTransformFeedbacksFn;
+    fn.glGenTransformFeedbacksFn = Debug_glGenTransformFeedbacks;
+  }
+  if (!debug_fn.glGenVertexArraysOESFn) {
+    debug_fn.glGenVertexArraysOESFn = fn.glGenVertexArraysOESFn;
+    fn.glGenVertexArraysOESFn = Debug_glGenVertexArraysOES;
+  }
+  if (!debug_fn.glGetActiveAttribFn) {
+    debug_fn.glGetActiveAttribFn = fn.glGetActiveAttribFn;
+    fn.glGetActiveAttribFn = Debug_glGetActiveAttrib;
+  }
+  if (!debug_fn.glGetActiveUniformFn) {
+    debug_fn.glGetActiveUniformFn = fn.glGetActiveUniformFn;
+    fn.glGetActiveUniformFn = Debug_glGetActiveUniform;
+  }
+  if (!debug_fn.glGetActiveUniformBlockivFn) {
+    debug_fn.glGetActiveUniformBlockivFn = fn.glGetActiveUniformBlockivFn;
+    fn.glGetActiveUniformBlockivFn = Debug_glGetActiveUniformBlockiv;
+  }
+  if (!debug_fn.glGetActiveUniformBlockNameFn) {
+    debug_fn.glGetActiveUniformBlockNameFn = fn.glGetActiveUniformBlockNameFn;
+    fn.glGetActiveUniformBlockNameFn = Debug_glGetActiveUniformBlockName;
+  }
+  if (!debug_fn.glGetActiveUniformsivFn) {
+    debug_fn.glGetActiveUniformsivFn = fn.glGetActiveUniformsivFn;
+    fn.glGetActiveUniformsivFn = Debug_glGetActiveUniformsiv;
+  }
+  if (!debug_fn.glGetAttachedShadersFn) {
+    debug_fn.glGetAttachedShadersFn = fn.glGetAttachedShadersFn;
+    fn.glGetAttachedShadersFn = Debug_glGetAttachedShaders;
+  }
+  if (!debug_fn.glGetAttribLocationFn) {
+    debug_fn.glGetAttribLocationFn = fn.glGetAttribLocationFn;
+    fn.glGetAttribLocationFn = Debug_glGetAttribLocation;
+  }
+  if (!debug_fn.glGetBooleanvFn) {
+    debug_fn.glGetBooleanvFn = fn.glGetBooleanvFn;
+    fn.glGetBooleanvFn = Debug_glGetBooleanv;
+  }
+  if (!debug_fn.glGetBufferParameterivFn) {
+    debug_fn.glGetBufferParameterivFn = fn.glGetBufferParameterivFn;
+    fn.glGetBufferParameterivFn = Debug_glGetBufferParameteriv;
+  }
+  if (!debug_fn.glGetErrorFn) {
+    debug_fn.glGetErrorFn = fn.glGetErrorFn;
+    fn.glGetErrorFn = Debug_glGetError;
+  }
+  if (!debug_fn.glGetFenceivNVFn) {
+    debug_fn.glGetFenceivNVFn = fn.glGetFenceivNVFn;
+    fn.glGetFenceivNVFn = Debug_glGetFenceivNV;
+  }
+  if (!debug_fn.glGetFloatvFn) {
+    debug_fn.glGetFloatvFn = fn.glGetFloatvFn;
+    fn.glGetFloatvFn = Debug_glGetFloatv;
+  }
+  if (!debug_fn.glGetFragDataLocationFn) {
+    debug_fn.glGetFragDataLocationFn = fn.glGetFragDataLocationFn;
+    fn.glGetFragDataLocationFn = Debug_glGetFragDataLocation;
+  }
+  if (!debug_fn.glGetFramebufferAttachmentParameterivEXTFn) {
+    debug_fn.glGetFramebufferAttachmentParameterivEXTFn =
+        fn.glGetFramebufferAttachmentParameterivEXTFn;
+    fn.glGetFramebufferAttachmentParameterivEXTFn =
+        Debug_glGetFramebufferAttachmentParameterivEXT;
+  }
+  if (!debug_fn.glGetGraphicsResetStatusARBFn) {
+    debug_fn.glGetGraphicsResetStatusARBFn = fn.glGetGraphicsResetStatusARBFn;
+    fn.glGetGraphicsResetStatusARBFn = Debug_glGetGraphicsResetStatusARB;
+  }
+  if (!debug_fn.glGetInteger64i_vFn) {
+    debug_fn.glGetInteger64i_vFn = fn.glGetInteger64i_vFn;
+    fn.glGetInteger64i_vFn = Debug_glGetInteger64i_v;
+  }
+  if (!debug_fn.glGetInteger64vFn) {
+    debug_fn.glGetInteger64vFn = fn.glGetInteger64vFn;
+    fn.glGetInteger64vFn = Debug_glGetInteger64v;
+  }
+  if (!debug_fn.glGetIntegeri_vFn) {
+    debug_fn.glGetIntegeri_vFn = fn.glGetIntegeri_vFn;
+    fn.glGetIntegeri_vFn = Debug_glGetIntegeri_v;
+  }
+  if (!debug_fn.glGetIntegervFn) {
+    debug_fn.glGetIntegervFn = fn.glGetIntegervFn;
+    fn.glGetIntegervFn = Debug_glGetIntegerv;
+  }
+  if (!debug_fn.glGetInternalformativFn) {
+    debug_fn.glGetInternalformativFn = fn.glGetInternalformativFn;
+    fn.glGetInternalformativFn = Debug_glGetInternalformativ;
+  }
+  if (!debug_fn.glGetProgramBinaryFn) {
+    debug_fn.glGetProgramBinaryFn = fn.glGetProgramBinaryFn;
+    fn.glGetProgramBinaryFn = Debug_glGetProgramBinary;
+  }
+  if (!debug_fn.glGetProgramInfoLogFn) {
+    debug_fn.glGetProgramInfoLogFn = fn.glGetProgramInfoLogFn;
+    fn.glGetProgramInfoLogFn = Debug_glGetProgramInfoLog;
+  }
+  if (!debug_fn.glGetProgramivFn) {
+    debug_fn.glGetProgramivFn = fn.glGetProgramivFn;
+    fn.glGetProgramivFn = Debug_glGetProgramiv;
+  }
+  if (!debug_fn.glGetQueryivFn) {
+    debug_fn.glGetQueryivFn = fn.glGetQueryivFn;
+    fn.glGetQueryivFn = Debug_glGetQueryiv;
+  }
+  if (!debug_fn.glGetQueryivARBFn) {
+    debug_fn.glGetQueryivARBFn = fn.glGetQueryivARBFn;
+    fn.glGetQueryivARBFn = Debug_glGetQueryivARB;
+  }
+  if (!debug_fn.glGetQueryObjecti64vFn) {
+    debug_fn.glGetQueryObjecti64vFn = fn.glGetQueryObjecti64vFn;
+    fn.glGetQueryObjecti64vFn = Debug_glGetQueryObjecti64v;
+  }
+  if (!debug_fn.glGetQueryObjectivFn) {
+    debug_fn.glGetQueryObjectivFn = fn.glGetQueryObjectivFn;
+    fn.glGetQueryObjectivFn = Debug_glGetQueryObjectiv;
+  }
+  if (!debug_fn.glGetQueryObjectivARBFn) {
+    debug_fn.glGetQueryObjectivARBFn = fn.glGetQueryObjectivARBFn;
+    fn.glGetQueryObjectivARBFn = Debug_glGetQueryObjectivARB;
+  }
+  if (!debug_fn.glGetQueryObjectui64vFn) {
+    debug_fn.glGetQueryObjectui64vFn = fn.glGetQueryObjectui64vFn;
+    fn.glGetQueryObjectui64vFn = Debug_glGetQueryObjectui64v;
+  }
+  if (!debug_fn.glGetQueryObjectuivFn) {
+    debug_fn.glGetQueryObjectuivFn = fn.glGetQueryObjectuivFn;
+    fn.glGetQueryObjectuivFn = Debug_glGetQueryObjectuiv;
+  }
+  if (!debug_fn.glGetQueryObjectuivARBFn) {
+    debug_fn.glGetQueryObjectuivARBFn = fn.glGetQueryObjectuivARBFn;
+    fn.glGetQueryObjectuivARBFn = Debug_glGetQueryObjectuivARB;
+  }
+  if (!debug_fn.glGetRenderbufferParameterivEXTFn) {
+    debug_fn.glGetRenderbufferParameterivEXTFn =
+        fn.glGetRenderbufferParameterivEXTFn;
+    fn.glGetRenderbufferParameterivEXTFn =
+        Debug_glGetRenderbufferParameterivEXT;
+  }
+  if (!debug_fn.glGetSamplerParameterfvFn) {
+    debug_fn.glGetSamplerParameterfvFn = fn.glGetSamplerParameterfvFn;
+    fn.glGetSamplerParameterfvFn = Debug_glGetSamplerParameterfv;
+  }
+  if (!debug_fn.glGetSamplerParameterivFn) {
+    debug_fn.glGetSamplerParameterivFn = fn.glGetSamplerParameterivFn;
+    fn.glGetSamplerParameterivFn = Debug_glGetSamplerParameteriv;
+  }
+  if (!debug_fn.glGetShaderInfoLogFn) {
+    debug_fn.glGetShaderInfoLogFn = fn.glGetShaderInfoLogFn;
+    fn.glGetShaderInfoLogFn = Debug_glGetShaderInfoLog;
+  }
+  if (!debug_fn.glGetShaderivFn) {
+    debug_fn.glGetShaderivFn = fn.glGetShaderivFn;
+    fn.glGetShaderivFn = Debug_glGetShaderiv;
+  }
+  if (!debug_fn.glGetShaderPrecisionFormatFn) {
+    debug_fn.glGetShaderPrecisionFormatFn = fn.glGetShaderPrecisionFormatFn;
+    fn.glGetShaderPrecisionFormatFn = Debug_glGetShaderPrecisionFormat;
+  }
+  if (!debug_fn.glGetShaderSourceFn) {
+    debug_fn.glGetShaderSourceFn = fn.glGetShaderSourceFn;
+    fn.glGetShaderSourceFn = Debug_glGetShaderSource;
+  }
+  if (!debug_fn.glGetStringFn) {
+    debug_fn.glGetStringFn = fn.glGetStringFn;
+    fn.glGetStringFn = Debug_glGetString;
+  }
+  if (!debug_fn.glGetSyncivFn) {
+    debug_fn.glGetSyncivFn = fn.glGetSyncivFn;
+    fn.glGetSyncivFn = Debug_glGetSynciv;
+  }
+  if (!debug_fn.glGetTexLevelParameterfvFn) {
+    debug_fn.glGetTexLevelParameterfvFn = fn.glGetTexLevelParameterfvFn;
+    fn.glGetTexLevelParameterfvFn = Debug_glGetTexLevelParameterfv;
+  }
+  if (!debug_fn.glGetTexLevelParameterivFn) {
+    debug_fn.glGetTexLevelParameterivFn = fn.glGetTexLevelParameterivFn;
+    fn.glGetTexLevelParameterivFn = Debug_glGetTexLevelParameteriv;
+  }
+  if (!debug_fn.glGetTexParameterfvFn) {
+    debug_fn.glGetTexParameterfvFn = fn.glGetTexParameterfvFn;
+    fn.glGetTexParameterfvFn = Debug_glGetTexParameterfv;
+  }
+  if (!debug_fn.glGetTexParameterivFn) {
+    debug_fn.glGetTexParameterivFn = fn.glGetTexParameterivFn;
+    fn.glGetTexParameterivFn = Debug_glGetTexParameteriv;
+  }
+  if (!debug_fn.glGetTransformFeedbackVaryingFn) {
+    debug_fn.glGetTransformFeedbackVaryingFn =
+        fn.glGetTransformFeedbackVaryingFn;
+    fn.glGetTransformFeedbackVaryingFn = Debug_glGetTransformFeedbackVarying;
+  }
+  if (!debug_fn.glGetTranslatedShaderSourceANGLEFn) {
+    debug_fn.glGetTranslatedShaderSourceANGLEFn =
+        fn.glGetTranslatedShaderSourceANGLEFn;
+    fn.glGetTranslatedShaderSourceANGLEFn =
+        Debug_glGetTranslatedShaderSourceANGLE;
+  }
+  if (!debug_fn.glGetUniformBlockIndexFn) {
+    debug_fn.glGetUniformBlockIndexFn = fn.glGetUniformBlockIndexFn;
+    fn.glGetUniformBlockIndexFn = Debug_glGetUniformBlockIndex;
+  }
+  if (!debug_fn.glGetUniformfvFn) {
+    debug_fn.glGetUniformfvFn = fn.glGetUniformfvFn;
+    fn.glGetUniformfvFn = Debug_glGetUniformfv;
+  }
+  if (!debug_fn.glGetUniformIndicesFn) {
+    debug_fn.glGetUniformIndicesFn = fn.glGetUniformIndicesFn;
+    fn.glGetUniformIndicesFn = Debug_glGetUniformIndices;
+  }
+  if (!debug_fn.glGetUniformivFn) {
+    debug_fn.glGetUniformivFn = fn.glGetUniformivFn;
+    fn.glGetUniformivFn = Debug_glGetUniformiv;
+  }
+  if (!debug_fn.glGetUniformLocationFn) {
+    debug_fn.glGetUniformLocationFn = fn.glGetUniformLocationFn;
+    fn.glGetUniformLocationFn = Debug_glGetUniformLocation;
+  }
+  if (!debug_fn.glGetVertexAttribfvFn) {
+    debug_fn.glGetVertexAttribfvFn = fn.glGetVertexAttribfvFn;
+    fn.glGetVertexAttribfvFn = Debug_glGetVertexAttribfv;
+  }
+  if (!debug_fn.glGetVertexAttribivFn) {
+    debug_fn.glGetVertexAttribivFn = fn.glGetVertexAttribivFn;
+    fn.glGetVertexAttribivFn = Debug_glGetVertexAttribiv;
+  }
+  if (!debug_fn.glGetVertexAttribPointervFn) {
+    debug_fn.glGetVertexAttribPointervFn = fn.glGetVertexAttribPointervFn;
+    fn.glGetVertexAttribPointervFn = Debug_glGetVertexAttribPointerv;
+  }
+  if (!debug_fn.glHintFn) {
+    debug_fn.glHintFn = fn.glHintFn;
+    fn.glHintFn = Debug_glHint;
+  }
+  if (!debug_fn.glInsertEventMarkerEXTFn) {
+    debug_fn.glInsertEventMarkerEXTFn = fn.glInsertEventMarkerEXTFn;
+    fn.glInsertEventMarkerEXTFn = Debug_glInsertEventMarkerEXT;
+  }
+  if (!debug_fn.glInvalidateFramebufferFn) {
+    debug_fn.glInvalidateFramebufferFn = fn.glInvalidateFramebufferFn;
+    fn.glInvalidateFramebufferFn = Debug_glInvalidateFramebuffer;
+  }
+  if (!debug_fn.glInvalidateSubFramebufferFn) {
+    debug_fn.glInvalidateSubFramebufferFn = fn.glInvalidateSubFramebufferFn;
+    fn.glInvalidateSubFramebufferFn = Debug_glInvalidateSubFramebuffer;
+  }
+  if (!debug_fn.glIsBufferFn) {
+    debug_fn.glIsBufferFn = fn.glIsBufferFn;
+    fn.glIsBufferFn = Debug_glIsBuffer;
+  }
+  if (!debug_fn.glIsEnabledFn) {
+    debug_fn.glIsEnabledFn = fn.glIsEnabledFn;
+    fn.glIsEnabledFn = Debug_glIsEnabled;
+  }
+  if (!debug_fn.glIsFenceAPPLEFn) {
+    debug_fn.glIsFenceAPPLEFn = fn.glIsFenceAPPLEFn;
+    fn.glIsFenceAPPLEFn = Debug_glIsFenceAPPLE;
+  }
+  if (!debug_fn.glIsFenceNVFn) {
+    debug_fn.glIsFenceNVFn = fn.glIsFenceNVFn;
+    fn.glIsFenceNVFn = Debug_glIsFenceNV;
+  }
+  if (!debug_fn.glIsFramebufferEXTFn) {
+    debug_fn.glIsFramebufferEXTFn = fn.glIsFramebufferEXTFn;
+    fn.glIsFramebufferEXTFn = Debug_glIsFramebufferEXT;
+  }
+  if (!debug_fn.glIsProgramFn) {
+    debug_fn.glIsProgramFn = fn.glIsProgramFn;
+    fn.glIsProgramFn = Debug_glIsProgram;
+  }
+  if (!debug_fn.glIsQueryFn) {
+    debug_fn.glIsQueryFn = fn.glIsQueryFn;
+    fn.glIsQueryFn = Debug_glIsQuery;
+  }
+  if (!debug_fn.glIsQueryARBFn) {
+    debug_fn.glIsQueryARBFn = fn.glIsQueryARBFn;
+    fn.glIsQueryARBFn = Debug_glIsQueryARB;
+  }
+  if (!debug_fn.glIsRenderbufferEXTFn) {
+    debug_fn.glIsRenderbufferEXTFn = fn.glIsRenderbufferEXTFn;
+    fn.glIsRenderbufferEXTFn = Debug_glIsRenderbufferEXT;
+  }
+  if (!debug_fn.glIsSamplerFn) {
+    debug_fn.glIsSamplerFn = fn.glIsSamplerFn;
+    fn.glIsSamplerFn = Debug_glIsSampler;
+  }
+  if (!debug_fn.glIsShaderFn) {
+    debug_fn.glIsShaderFn = fn.glIsShaderFn;
+    fn.glIsShaderFn = Debug_glIsShader;
+  }
+  if (!debug_fn.glIsSyncFn) {
+    debug_fn.glIsSyncFn = fn.glIsSyncFn;
+    fn.glIsSyncFn = Debug_glIsSync;
+  }
+  if (!debug_fn.glIsTextureFn) {
+    debug_fn.glIsTextureFn = fn.glIsTextureFn;
+    fn.glIsTextureFn = Debug_glIsTexture;
+  }
+  if (!debug_fn.glIsTransformFeedbackFn) {
+    debug_fn.glIsTransformFeedbackFn = fn.glIsTransformFeedbackFn;
+    fn.glIsTransformFeedbackFn = Debug_glIsTransformFeedback;
+  }
+  if (!debug_fn.glIsVertexArrayOESFn) {
+    debug_fn.glIsVertexArrayOESFn = fn.glIsVertexArrayOESFn;
+    fn.glIsVertexArrayOESFn = Debug_glIsVertexArrayOES;
+  }
+  if (!debug_fn.glLineWidthFn) {
+    debug_fn.glLineWidthFn = fn.glLineWidthFn;
+    fn.glLineWidthFn = Debug_glLineWidth;
+  }
+  if (!debug_fn.glLinkProgramFn) {
+    debug_fn.glLinkProgramFn = fn.glLinkProgramFn;
+    fn.glLinkProgramFn = Debug_glLinkProgram;
+  }
+  if (!debug_fn.glMapBufferFn) {
+    debug_fn.glMapBufferFn = fn.glMapBufferFn;
+    fn.glMapBufferFn = Debug_glMapBuffer;
+  }
+  if (!debug_fn.glMapBufferRangeFn) {
+    debug_fn.glMapBufferRangeFn = fn.glMapBufferRangeFn;
+    fn.glMapBufferRangeFn = Debug_glMapBufferRange;
+  }
+  if (!debug_fn.glMatrixLoadfEXTFn) {
+    debug_fn.glMatrixLoadfEXTFn = fn.glMatrixLoadfEXTFn;
+    fn.glMatrixLoadfEXTFn = Debug_glMatrixLoadfEXT;
+  }
+  if (!debug_fn.glMatrixLoadIdentityEXTFn) {
+    debug_fn.glMatrixLoadIdentityEXTFn = fn.glMatrixLoadIdentityEXTFn;
+    fn.glMatrixLoadIdentityEXTFn = Debug_glMatrixLoadIdentityEXT;
+  }
+  if (!debug_fn.glPauseTransformFeedbackFn) {
+    debug_fn.glPauseTransformFeedbackFn = fn.glPauseTransformFeedbackFn;
+    fn.glPauseTransformFeedbackFn = Debug_glPauseTransformFeedback;
+  }
+  if (!debug_fn.glPixelStoreiFn) {
+    debug_fn.glPixelStoreiFn = fn.glPixelStoreiFn;
+    fn.glPixelStoreiFn = Debug_glPixelStorei;
+  }
+  if (!debug_fn.glPointParameteriFn) {
+    debug_fn.glPointParameteriFn = fn.glPointParameteriFn;
+    fn.glPointParameteriFn = Debug_glPointParameteri;
+  }
+  if (!debug_fn.glPolygonOffsetFn) {
+    debug_fn.glPolygonOffsetFn = fn.glPolygonOffsetFn;
+    fn.glPolygonOffsetFn = Debug_glPolygonOffset;
+  }
+  if (!debug_fn.glPopGroupMarkerEXTFn) {
+    debug_fn.glPopGroupMarkerEXTFn = fn.glPopGroupMarkerEXTFn;
+    fn.glPopGroupMarkerEXTFn = Debug_glPopGroupMarkerEXT;
+  }
+  if (!debug_fn.glProgramBinaryFn) {
+    debug_fn.glProgramBinaryFn = fn.glProgramBinaryFn;
+    fn.glProgramBinaryFn = Debug_glProgramBinary;
+  }
+  if (!debug_fn.glProgramParameteriFn) {
+    debug_fn.glProgramParameteriFn = fn.glProgramParameteriFn;
+    fn.glProgramParameteriFn = Debug_glProgramParameteri;
+  }
+  if (!debug_fn.glPushGroupMarkerEXTFn) {
+    debug_fn.glPushGroupMarkerEXTFn = fn.glPushGroupMarkerEXTFn;
+    fn.glPushGroupMarkerEXTFn = Debug_glPushGroupMarkerEXT;
+  }
+  if (!debug_fn.glQueryCounterFn) {
+    debug_fn.glQueryCounterFn = fn.glQueryCounterFn;
+    fn.glQueryCounterFn = Debug_glQueryCounter;
+  }
+  if (!debug_fn.glReadBufferFn) {
+    debug_fn.glReadBufferFn = fn.glReadBufferFn;
+    fn.glReadBufferFn = Debug_glReadBuffer;
+  }
+  if (!debug_fn.glReadPixelsFn) {
+    debug_fn.glReadPixelsFn = fn.glReadPixelsFn;
+    fn.glReadPixelsFn = Debug_glReadPixels;
+  }
+  if (!debug_fn.glReleaseShaderCompilerFn) {
+    debug_fn.glReleaseShaderCompilerFn = fn.glReleaseShaderCompilerFn;
+    fn.glReleaseShaderCompilerFn = Debug_glReleaseShaderCompiler;
+  }
+  if (!debug_fn.glRenderbufferStorageEXTFn) {
+    debug_fn.glRenderbufferStorageEXTFn = fn.glRenderbufferStorageEXTFn;
+    fn.glRenderbufferStorageEXTFn = Debug_glRenderbufferStorageEXT;
+  }
+  if (!debug_fn.glRenderbufferStorageMultisampleFn) {
+    debug_fn.glRenderbufferStorageMultisampleFn =
+        fn.glRenderbufferStorageMultisampleFn;
+    fn.glRenderbufferStorageMultisampleFn =
+        Debug_glRenderbufferStorageMultisample;
+  }
+  if (!debug_fn.glRenderbufferStorageMultisampleANGLEFn) {
+    debug_fn.glRenderbufferStorageMultisampleANGLEFn =
+        fn.glRenderbufferStorageMultisampleANGLEFn;
+    fn.glRenderbufferStorageMultisampleANGLEFn =
+        Debug_glRenderbufferStorageMultisampleANGLE;
+  }
+  if (!debug_fn.glRenderbufferStorageMultisampleEXTFn) {
+    debug_fn.glRenderbufferStorageMultisampleEXTFn =
+        fn.glRenderbufferStorageMultisampleEXTFn;
+    fn.glRenderbufferStorageMultisampleEXTFn =
+        Debug_glRenderbufferStorageMultisampleEXT;
+  }
+  if (!debug_fn.glRenderbufferStorageMultisampleIMGFn) {
+    debug_fn.glRenderbufferStorageMultisampleIMGFn =
+        fn.glRenderbufferStorageMultisampleIMGFn;
+    fn.glRenderbufferStorageMultisampleIMGFn =
+        Debug_glRenderbufferStorageMultisampleIMG;
+  }
+  if (!debug_fn.glResumeTransformFeedbackFn) {
+    debug_fn.glResumeTransformFeedbackFn = fn.glResumeTransformFeedbackFn;
+    fn.glResumeTransformFeedbackFn = Debug_glResumeTransformFeedback;
+  }
+  if (!debug_fn.glSampleCoverageFn) {
+    debug_fn.glSampleCoverageFn = fn.glSampleCoverageFn;
+    fn.glSampleCoverageFn = Debug_glSampleCoverage;
+  }
+  if (!debug_fn.glSamplerParameterfFn) {
+    debug_fn.glSamplerParameterfFn = fn.glSamplerParameterfFn;
+    fn.glSamplerParameterfFn = Debug_glSamplerParameterf;
+  }
+  if (!debug_fn.glSamplerParameterfvFn) {
+    debug_fn.glSamplerParameterfvFn = fn.glSamplerParameterfvFn;
+    fn.glSamplerParameterfvFn = Debug_glSamplerParameterfv;
+  }
+  if (!debug_fn.glSamplerParameteriFn) {
+    debug_fn.glSamplerParameteriFn = fn.glSamplerParameteriFn;
+    fn.glSamplerParameteriFn = Debug_glSamplerParameteri;
+  }
+  if (!debug_fn.glSamplerParameterivFn) {
+    debug_fn.glSamplerParameterivFn = fn.glSamplerParameterivFn;
+    fn.glSamplerParameterivFn = Debug_glSamplerParameteriv;
+  }
+  if (!debug_fn.glScissorFn) {
+    debug_fn.glScissorFn = fn.glScissorFn;
+    fn.glScissorFn = Debug_glScissor;
+  }
+  if (!debug_fn.glSetFenceAPPLEFn) {
+    debug_fn.glSetFenceAPPLEFn = fn.glSetFenceAPPLEFn;
+    fn.glSetFenceAPPLEFn = Debug_glSetFenceAPPLE;
+  }
+  if (!debug_fn.glSetFenceNVFn) {
+    debug_fn.glSetFenceNVFn = fn.glSetFenceNVFn;
+    fn.glSetFenceNVFn = Debug_glSetFenceNV;
+  }
+  if (!debug_fn.glShaderBinaryFn) {
+    debug_fn.glShaderBinaryFn = fn.glShaderBinaryFn;
+    fn.glShaderBinaryFn = Debug_glShaderBinary;
+  }
+  if (!debug_fn.glShaderSourceFn) {
+    debug_fn.glShaderSourceFn = fn.glShaderSourceFn;
+    fn.glShaderSourceFn = Debug_glShaderSource;
+  }
+  if (!debug_fn.glStencilFuncFn) {
+    debug_fn.glStencilFuncFn = fn.glStencilFuncFn;
+    fn.glStencilFuncFn = Debug_glStencilFunc;
+  }
+  if (!debug_fn.glStencilFuncSeparateFn) {
+    debug_fn.glStencilFuncSeparateFn = fn.glStencilFuncSeparateFn;
+    fn.glStencilFuncSeparateFn = Debug_glStencilFuncSeparate;
+  }
+  if (!debug_fn.glStencilMaskFn) {
+    debug_fn.glStencilMaskFn = fn.glStencilMaskFn;
+    fn.glStencilMaskFn = Debug_glStencilMask;
+  }
+  if (!debug_fn.glStencilMaskSeparateFn) {
+    debug_fn.glStencilMaskSeparateFn = fn.glStencilMaskSeparateFn;
+    fn.glStencilMaskSeparateFn = Debug_glStencilMaskSeparate;
+  }
+  if (!debug_fn.glStencilOpFn) {
+    debug_fn.glStencilOpFn = fn.glStencilOpFn;
+    fn.glStencilOpFn = Debug_glStencilOp;
+  }
+  if (!debug_fn.glStencilOpSeparateFn) {
+    debug_fn.glStencilOpSeparateFn = fn.glStencilOpSeparateFn;
+    fn.glStencilOpSeparateFn = Debug_glStencilOpSeparate;
+  }
+  if (!debug_fn.glTestFenceAPPLEFn) {
+    debug_fn.glTestFenceAPPLEFn = fn.glTestFenceAPPLEFn;
+    fn.glTestFenceAPPLEFn = Debug_glTestFenceAPPLE;
+  }
+  if (!debug_fn.glTestFenceNVFn) {
+    debug_fn.glTestFenceNVFn = fn.glTestFenceNVFn;
+    fn.glTestFenceNVFn = Debug_glTestFenceNV;
+  }
+  if (!debug_fn.glTexImage2DFn) {
+    debug_fn.glTexImage2DFn = fn.glTexImage2DFn;
+    fn.glTexImage2DFn = Debug_glTexImage2D;
+  }
+  if (!debug_fn.glTexImage3DFn) {
+    debug_fn.glTexImage3DFn = fn.glTexImage3DFn;
+    fn.glTexImage3DFn = Debug_glTexImage3D;
+  }
+  if (!debug_fn.glTexParameterfFn) {
+    debug_fn.glTexParameterfFn = fn.glTexParameterfFn;
+    fn.glTexParameterfFn = Debug_glTexParameterf;
+  }
+  if (!debug_fn.glTexParameterfvFn) {
+    debug_fn.glTexParameterfvFn = fn.glTexParameterfvFn;
+    fn.glTexParameterfvFn = Debug_glTexParameterfv;
+  }
+  if (!debug_fn.glTexParameteriFn) {
+    debug_fn.glTexParameteriFn = fn.glTexParameteriFn;
+    fn.glTexParameteriFn = Debug_glTexParameteri;
+  }
+  if (!debug_fn.glTexParameterivFn) {
+    debug_fn.glTexParameterivFn = fn.glTexParameterivFn;
+    fn.glTexParameterivFn = Debug_glTexParameteriv;
+  }
+  if (!debug_fn.glTexStorage2DEXTFn) {
+    debug_fn.glTexStorage2DEXTFn = fn.glTexStorage2DEXTFn;
+    fn.glTexStorage2DEXTFn = Debug_glTexStorage2DEXT;
+  }
+  if (!debug_fn.glTexStorage3DFn) {
+    debug_fn.glTexStorage3DFn = fn.glTexStorage3DFn;
+    fn.glTexStorage3DFn = Debug_glTexStorage3D;
+  }
+  if (!debug_fn.glTexSubImage2DFn) {
+    debug_fn.glTexSubImage2DFn = fn.glTexSubImage2DFn;
+    fn.glTexSubImage2DFn = Debug_glTexSubImage2D;
+  }
+  if (!debug_fn.glTransformFeedbackVaryingsFn) {
+    debug_fn.glTransformFeedbackVaryingsFn = fn.glTransformFeedbackVaryingsFn;
+    fn.glTransformFeedbackVaryingsFn = Debug_glTransformFeedbackVaryings;
+  }
+  if (!debug_fn.glUniform1fFn) {
+    debug_fn.glUniform1fFn = fn.glUniform1fFn;
+    fn.glUniform1fFn = Debug_glUniform1f;
+  }
+  if (!debug_fn.glUniform1fvFn) {
+    debug_fn.glUniform1fvFn = fn.glUniform1fvFn;
+    fn.glUniform1fvFn = Debug_glUniform1fv;
+  }
+  if (!debug_fn.glUniform1iFn) {
+    debug_fn.glUniform1iFn = fn.glUniform1iFn;
+    fn.glUniform1iFn = Debug_glUniform1i;
+  }
+  if (!debug_fn.glUniform1ivFn) {
+    debug_fn.glUniform1ivFn = fn.glUniform1ivFn;
+    fn.glUniform1ivFn = Debug_glUniform1iv;
+  }
+  if (!debug_fn.glUniform1uiFn) {
+    debug_fn.glUniform1uiFn = fn.glUniform1uiFn;
+    fn.glUniform1uiFn = Debug_glUniform1ui;
+  }
+  if (!debug_fn.glUniform1uivFn) {
+    debug_fn.glUniform1uivFn = fn.glUniform1uivFn;
+    fn.glUniform1uivFn = Debug_glUniform1uiv;
+  }
+  if (!debug_fn.glUniform2fFn) {
+    debug_fn.glUniform2fFn = fn.glUniform2fFn;
+    fn.glUniform2fFn = Debug_glUniform2f;
+  }
+  if (!debug_fn.glUniform2fvFn) {
+    debug_fn.glUniform2fvFn = fn.glUniform2fvFn;
+    fn.glUniform2fvFn = Debug_glUniform2fv;
+  }
+  if (!debug_fn.glUniform2iFn) {
+    debug_fn.glUniform2iFn = fn.glUniform2iFn;
+    fn.glUniform2iFn = Debug_glUniform2i;
+  }
+  if (!debug_fn.glUniform2ivFn) {
+    debug_fn.glUniform2ivFn = fn.glUniform2ivFn;
+    fn.glUniform2ivFn = Debug_glUniform2iv;
+  }
+  if (!debug_fn.glUniform2uiFn) {
+    debug_fn.glUniform2uiFn = fn.glUniform2uiFn;
+    fn.glUniform2uiFn = Debug_glUniform2ui;
+  }
+  if (!debug_fn.glUniform2uivFn) {
+    debug_fn.glUniform2uivFn = fn.glUniform2uivFn;
+    fn.glUniform2uivFn = Debug_glUniform2uiv;
+  }
+  if (!debug_fn.glUniform3fFn) {
+    debug_fn.glUniform3fFn = fn.glUniform3fFn;
+    fn.glUniform3fFn = Debug_glUniform3f;
+  }
+  if (!debug_fn.glUniform3fvFn) {
+    debug_fn.glUniform3fvFn = fn.glUniform3fvFn;
+    fn.glUniform3fvFn = Debug_glUniform3fv;
+  }
+  if (!debug_fn.glUniform3iFn) {
+    debug_fn.glUniform3iFn = fn.glUniform3iFn;
+    fn.glUniform3iFn = Debug_glUniform3i;
+  }
+  if (!debug_fn.glUniform3ivFn) {
+    debug_fn.glUniform3ivFn = fn.glUniform3ivFn;
+    fn.glUniform3ivFn = Debug_glUniform3iv;
+  }
+  if (!debug_fn.glUniform3uiFn) {
+    debug_fn.glUniform3uiFn = fn.glUniform3uiFn;
+    fn.glUniform3uiFn = Debug_glUniform3ui;
+  }
+  if (!debug_fn.glUniform3uivFn) {
+    debug_fn.glUniform3uivFn = fn.glUniform3uivFn;
+    fn.glUniform3uivFn = Debug_glUniform3uiv;
+  }
+  if (!debug_fn.glUniform4fFn) {
+    debug_fn.glUniform4fFn = fn.glUniform4fFn;
+    fn.glUniform4fFn = Debug_glUniform4f;
+  }
+  if (!debug_fn.glUniform4fvFn) {
+    debug_fn.glUniform4fvFn = fn.glUniform4fvFn;
+    fn.glUniform4fvFn = Debug_glUniform4fv;
+  }
+  if (!debug_fn.glUniform4iFn) {
+    debug_fn.glUniform4iFn = fn.glUniform4iFn;
+    fn.glUniform4iFn = Debug_glUniform4i;
+  }
+  if (!debug_fn.glUniform4ivFn) {
+    debug_fn.glUniform4ivFn = fn.glUniform4ivFn;
+    fn.glUniform4ivFn = Debug_glUniform4iv;
+  }
+  if (!debug_fn.glUniform4uiFn) {
+    debug_fn.glUniform4uiFn = fn.glUniform4uiFn;
+    fn.glUniform4uiFn = Debug_glUniform4ui;
+  }
+  if (!debug_fn.glUniform4uivFn) {
+    debug_fn.glUniform4uivFn = fn.glUniform4uivFn;
+    fn.glUniform4uivFn = Debug_glUniform4uiv;
+  }
+  if (!debug_fn.glUniformBlockBindingFn) {
+    debug_fn.glUniformBlockBindingFn = fn.glUniformBlockBindingFn;
+    fn.glUniformBlockBindingFn = Debug_glUniformBlockBinding;
+  }
+  if (!debug_fn.glUniformMatrix2fvFn) {
+    debug_fn.glUniformMatrix2fvFn = fn.glUniformMatrix2fvFn;
+    fn.glUniformMatrix2fvFn = Debug_glUniformMatrix2fv;
+  }
+  if (!debug_fn.glUniformMatrix2x3fvFn) {
+    debug_fn.glUniformMatrix2x3fvFn = fn.glUniformMatrix2x3fvFn;
+    fn.glUniformMatrix2x3fvFn = Debug_glUniformMatrix2x3fv;
+  }
+  if (!debug_fn.glUniformMatrix2x4fvFn) {
+    debug_fn.glUniformMatrix2x4fvFn = fn.glUniformMatrix2x4fvFn;
+    fn.glUniformMatrix2x4fvFn = Debug_glUniformMatrix2x4fv;
+  }
+  if (!debug_fn.glUniformMatrix3fvFn) {
+    debug_fn.glUniformMatrix3fvFn = fn.glUniformMatrix3fvFn;
+    fn.glUniformMatrix3fvFn = Debug_glUniformMatrix3fv;
+  }
+  if (!debug_fn.glUniformMatrix3x2fvFn) {
+    debug_fn.glUniformMatrix3x2fvFn = fn.glUniformMatrix3x2fvFn;
+    fn.glUniformMatrix3x2fvFn = Debug_glUniformMatrix3x2fv;
+  }
+  if (!debug_fn.glUniformMatrix3x4fvFn) {
+    debug_fn.glUniformMatrix3x4fvFn = fn.glUniformMatrix3x4fvFn;
+    fn.glUniformMatrix3x4fvFn = Debug_glUniformMatrix3x4fv;
+  }
+  if (!debug_fn.glUniformMatrix4fvFn) {
+    debug_fn.glUniformMatrix4fvFn = fn.glUniformMatrix4fvFn;
+    fn.glUniformMatrix4fvFn = Debug_glUniformMatrix4fv;
+  }
+  if (!debug_fn.glUniformMatrix4x2fvFn) {
+    debug_fn.glUniformMatrix4x2fvFn = fn.glUniformMatrix4x2fvFn;
+    fn.glUniformMatrix4x2fvFn = Debug_glUniformMatrix4x2fv;
+  }
+  if (!debug_fn.glUniformMatrix4x3fvFn) {
+    debug_fn.glUniformMatrix4x3fvFn = fn.glUniformMatrix4x3fvFn;
+    fn.glUniformMatrix4x3fvFn = Debug_glUniformMatrix4x3fv;
+  }
+  if (!debug_fn.glUnmapBufferFn) {
+    debug_fn.glUnmapBufferFn = fn.glUnmapBufferFn;
+    fn.glUnmapBufferFn = Debug_glUnmapBuffer;
+  }
+  if (!debug_fn.glUseProgramFn) {
+    debug_fn.glUseProgramFn = fn.glUseProgramFn;
+    fn.glUseProgramFn = Debug_glUseProgram;
+  }
+  if (!debug_fn.glValidateProgramFn) {
+    debug_fn.glValidateProgramFn = fn.glValidateProgramFn;
+    fn.glValidateProgramFn = Debug_glValidateProgram;
+  }
+  if (!debug_fn.glVertexAttrib1fFn) {
+    debug_fn.glVertexAttrib1fFn = fn.glVertexAttrib1fFn;
+    fn.glVertexAttrib1fFn = Debug_glVertexAttrib1f;
+  }
+  if (!debug_fn.glVertexAttrib1fvFn) {
+    debug_fn.glVertexAttrib1fvFn = fn.glVertexAttrib1fvFn;
+    fn.glVertexAttrib1fvFn = Debug_glVertexAttrib1fv;
+  }
+  if (!debug_fn.glVertexAttrib2fFn) {
+    debug_fn.glVertexAttrib2fFn = fn.glVertexAttrib2fFn;
+    fn.glVertexAttrib2fFn = Debug_glVertexAttrib2f;
+  }
+  if (!debug_fn.glVertexAttrib2fvFn) {
+    debug_fn.glVertexAttrib2fvFn = fn.glVertexAttrib2fvFn;
+    fn.glVertexAttrib2fvFn = Debug_glVertexAttrib2fv;
+  }
+  if (!debug_fn.glVertexAttrib3fFn) {
+    debug_fn.glVertexAttrib3fFn = fn.glVertexAttrib3fFn;
+    fn.glVertexAttrib3fFn = Debug_glVertexAttrib3f;
+  }
+  if (!debug_fn.glVertexAttrib3fvFn) {
+    debug_fn.glVertexAttrib3fvFn = fn.glVertexAttrib3fvFn;
+    fn.glVertexAttrib3fvFn = Debug_glVertexAttrib3fv;
+  }
+  if (!debug_fn.glVertexAttrib4fFn) {
+    debug_fn.glVertexAttrib4fFn = fn.glVertexAttrib4fFn;
+    fn.glVertexAttrib4fFn = Debug_glVertexAttrib4f;
+  }
+  if (!debug_fn.glVertexAttrib4fvFn) {
+    debug_fn.glVertexAttrib4fvFn = fn.glVertexAttrib4fvFn;
+    fn.glVertexAttrib4fvFn = Debug_glVertexAttrib4fv;
+  }
+  if (!debug_fn.glVertexAttribDivisorANGLEFn) {
+    debug_fn.glVertexAttribDivisorANGLEFn = fn.glVertexAttribDivisorANGLEFn;
+    fn.glVertexAttribDivisorANGLEFn = Debug_glVertexAttribDivisorANGLE;
+  }
+  if (!debug_fn.glVertexAttribI4iFn) {
+    debug_fn.glVertexAttribI4iFn = fn.glVertexAttribI4iFn;
+    fn.glVertexAttribI4iFn = Debug_glVertexAttribI4i;
+  }
+  if (!debug_fn.glVertexAttribI4ivFn) {
+    debug_fn.glVertexAttribI4ivFn = fn.glVertexAttribI4ivFn;
+    fn.glVertexAttribI4ivFn = Debug_glVertexAttribI4iv;
+  }
+  if (!debug_fn.glVertexAttribI4uiFn) {
+    debug_fn.glVertexAttribI4uiFn = fn.glVertexAttribI4uiFn;
+    fn.glVertexAttribI4uiFn = Debug_glVertexAttribI4ui;
+  }
+  if (!debug_fn.glVertexAttribI4uivFn) {
+    debug_fn.glVertexAttribI4uivFn = fn.glVertexAttribI4uivFn;
+    fn.glVertexAttribI4uivFn = Debug_glVertexAttribI4uiv;
+  }
+  if (!debug_fn.glVertexAttribIPointerFn) {
+    debug_fn.glVertexAttribIPointerFn = fn.glVertexAttribIPointerFn;
+    fn.glVertexAttribIPointerFn = Debug_glVertexAttribIPointer;
+  }
+  if (!debug_fn.glVertexAttribPointerFn) {
+    debug_fn.glVertexAttribPointerFn = fn.glVertexAttribPointerFn;
+    fn.glVertexAttribPointerFn = Debug_glVertexAttribPointer;
+  }
+  if (!debug_fn.glViewportFn) {
+    debug_fn.glViewportFn = fn.glViewportFn;
+    fn.glViewportFn = Debug_glViewport;
+  }
+  if (!debug_fn.glWaitSyncFn) {
+    debug_fn.glWaitSyncFn = fn.glWaitSyncFn;
+    fn.glWaitSyncFn = Debug_glWaitSync;
+  }
+  g_debugBindingsInitialized = true;
+}
+
+void DriverGL::ClearBindings() {
+  memset(this, 0, sizeof(*this));
+}
+
+void GLApiBase::glActiveTextureFn(GLenum texture) {
+  driver_->fn.glActiveTextureFn(texture);
+}
+
+void GLApiBase::glAttachShaderFn(GLuint program, GLuint shader) {
+  driver_->fn.glAttachShaderFn(program, shader);
+}
+
+void GLApiBase::glBeginQueryFn(GLenum target, GLuint id) {
+  driver_->fn.glBeginQueryFn(target, id);
+}
+
+void GLApiBase::glBeginQueryARBFn(GLenum target, GLuint id) {
+  driver_->fn.glBeginQueryARBFn(target, id);
+}
+
+void GLApiBase::glBeginTransformFeedbackFn(GLenum primitiveMode) {
+  driver_->fn.glBeginTransformFeedbackFn(primitiveMode);
+}
+
+void GLApiBase::glBindAttribLocationFn(GLuint program,
+                                       GLuint index,
+                                       const char* name) {
+  driver_->fn.glBindAttribLocationFn(program, index, name);
+}
+
+void GLApiBase::glBindBufferFn(GLenum target, GLuint buffer) {
+  driver_->fn.glBindBufferFn(target, buffer);
+}
+
+void GLApiBase::glBindBufferBaseFn(GLenum target, GLuint index, GLuint buffer) {
+  driver_->fn.glBindBufferBaseFn(target, index, buffer);
+}
+
+void GLApiBase::glBindBufferRangeFn(GLenum target,
+                                    GLuint index,
+                                    GLuint buffer,
+                                    GLintptr offset,
+                                    GLsizeiptr size) {
+  driver_->fn.glBindBufferRangeFn(target, index, buffer, offset, size);
+}
+
+void GLApiBase::glBindFragDataLocationFn(GLuint program,
+                                         GLuint colorNumber,
+                                         const char* name) {
+  driver_->fn.glBindFragDataLocationFn(program, colorNumber, name);
+}
+
+void GLApiBase::glBindFragDataLocationIndexedFn(GLuint program,
+                                                GLuint colorNumber,
+                                                GLuint index,
+                                                const char* name) {
+  driver_->fn.glBindFragDataLocationIndexedFn(program, colorNumber, index,
+                                              name);
+}
+
+void GLApiBase::glBindFramebufferEXTFn(GLenum target, GLuint framebuffer) {
+  driver_->fn.glBindFramebufferEXTFn(target, framebuffer);
+}
+
+void GLApiBase::glBindRenderbufferEXTFn(GLenum target, GLuint renderbuffer) {
+  driver_->fn.glBindRenderbufferEXTFn(target, renderbuffer);
+}
+
+void GLApiBase::glBindSamplerFn(GLuint unit, GLuint sampler) {
+  driver_->fn.glBindSamplerFn(unit, sampler);
+}
+
+void GLApiBase::glBindTextureFn(GLenum target, GLuint texture) {
+  driver_->fn.glBindTextureFn(target, texture);
+}
+
+void GLApiBase::glBindTransformFeedbackFn(GLenum target, GLuint id) {
+  driver_->fn.glBindTransformFeedbackFn(target, id);
+}
+
+void GLApiBase::glBindVertexArrayOESFn(GLuint array) {
+  driver_->fn.glBindVertexArrayOESFn(array);
+}
+
+void GLApiBase::glBlendBarrierKHRFn(void) {
+  driver_->fn.glBlendBarrierKHRFn();
+}
+
+void GLApiBase::glBlendColorFn(GLclampf red,
+                               GLclampf green,
+                               GLclampf blue,
+                               GLclampf alpha) {
+  driver_->fn.glBlendColorFn(red, green, blue, alpha);
+}
+
+void GLApiBase::glBlendEquationFn(GLenum mode) {
+  driver_->fn.glBlendEquationFn(mode);
+}
+
+void GLApiBase::glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) {
+  driver_->fn.glBlendEquationSeparateFn(modeRGB, modeAlpha);
+}
+
+void GLApiBase::glBlendFuncFn(GLenum sfactor, GLenum dfactor) {
+  driver_->fn.glBlendFuncFn(sfactor, dfactor);
+}
+
+void GLApiBase::glBlendFuncSeparateFn(GLenum srcRGB,
+                                      GLenum dstRGB,
+                                      GLenum srcAlpha,
+                                      GLenum dstAlpha) {
+  driver_->fn.glBlendFuncSeparateFn(srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+void GLApiBase::glBlitFramebufferFn(GLint srcX0,
+                                    GLint srcY0,
+                                    GLint srcX1,
+                                    GLint srcY1,
+                                    GLint dstX0,
+                                    GLint dstY0,
+                                    GLint dstX1,
+                                    GLint dstY1,
+                                    GLbitfield mask,
+                                    GLenum filter) {
+  driver_->fn.glBlitFramebufferFn(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                  dstX1, dstY1, mask, filter);
+}
+
+void GLApiBase::glBlitFramebufferANGLEFn(GLint srcX0,
+                                         GLint srcY0,
+                                         GLint srcX1,
+                                         GLint srcY1,
+                                         GLint dstX0,
+                                         GLint dstY0,
+                                         GLint dstX1,
+                                         GLint dstY1,
+                                         GLbitfield mask,
+                                         GLenum filter) {
+  driver_->fn.glBlitFramebufferANGLEFn(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                       dstX1, dstY1, mask, filter);
+}
+
+void GLApiBase::glBlitFramebufferEXTFn(GLint srcX0,
+                                       GLint srcY0,
+                                       GLint srcX1,
+                                       GLint srcY1,
+                                       GLint dstX0,
+                                       GLint dstY0,
+                                       GLint dstX1,
+                                       GLint dstY1,
+                                       GLbitfield mask,
+                                       GLenum filter) {
+  driver_->fn.glBlitFramebufferEXTFn(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                     dstX1, dstY1, mask, filter);
+}
+
+void GLApiBase::glBufferDataFn(GLenum target,
+                               GLsizeiptr size,
+                               const void* data,
+                               GLenum usage) {
+  driver_->fn.glBufferDataFn(target, size, data, usage);
+}
+
+void GLApiBase::glBufferSubDataFn(GLenum target,
+                                  GLintptr offset,
+                                  GLsizeiptr size,
+                                  const void* data) {
+  driver_->fn.glBufferSubDataFn(target, offset, size, data);
+}
+
+GLenum GLApiBase::glCheckFramebufferStatusEXTFn(GLenum target) {
+  return driver_->fn.glCheckFramebufferStatusEXTFn(target);
+}
+
+void GLApiBase::glClearFn(GLbitfield mask) {
+  driver_->fn.glClearFn(mask);
+}
+
+void GLApiBase::glClearBufferfiFn(GLenum buffer,
+                                  GLint drawbuffer,
+                                  const GLfloat depth,
+                                  GLint stencil) {
+  driver_->fn.glClearBufferfiFn(buffer, drawbuffer, depth, stencil);
+}
+
+void GLApiBase::glClearBufferfvFn(GLenum buffer,
+                                  GLint drawbuffer,
+                                  const GLfloat* value) {
+  driver_->fn.glClearBufferfvFn(buffer, drawbuffer, value);
+}
+
+void GLApiBase::glClearBufferivFn(GLenum buffer,
+                                  GLint drawbuffer,
+                                  const GLint* value) {
+  driver_->fn.glClearBufferivFn(buffer, drawbuffer, value);
+}
+
+void GLApiBase::glClearBufferuivFn(GLenum buffer,
+                                   GLint drawbuffer,
+                                   const GLuint* value) {
+  driver_->fn.glClearBufferuivFn(buffer, drawbuffer, value);
+}
+
+void GLApiBase::glClearColorFn(GLclampf red,
+                               GLclampf green,
+                               GLclampf blue,
+                               GLclampf alpha) {
+  driver_->fn.glClearColorFn(red, green, blue, alpha);
+}
+
+void GLApiBase::glClearDepthFn(GLclampd depth) {
+  driver_->fn.glClearDepthFn(depth);
+}
+
+void GLApiBase::glClearDepthfFn(GLclampf depth) {
+  driver_->fn.glClearDepthfFn(depth);
+}
+
+void GLApiBase::glClearStencilFn(GLint s) {
+  driver_->fn.glClearStencilFn(s);
+}
+
+GLenum GLApiBase::glClientWaitSyncFn(GLsync sync,
+                                     GLbitfield flags,
+                                     GLuint64 timeout) {
+  return driver_->fn.glClientWaitSyncFn(sync, flags, timeout);
+}
+
+void GLApiBase::glColorMaskFn(GLboolean red,
+                              GLboolean green,
+                              GLboolean blue,
+                              GLboolean alpha) {
+  driver_->fn.glColorMaskFn(red, green, blue, alpha);
+}
+
+void GLApiBase::glCompileShaderFn(GLuint shader) {
+  driver_->fn.glCompileShaderFn(shader);
+}
+
+void GLApiBase::glCompressedTexImage2DFn(GLenum target,
+                                         GLint level,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLint border,
+                                         GLsizei imageSize,
+                                         const void* data) {
+  driver_->fn.glCompressedTexImage2DFn(target, level, internalformat, width,
+                                       height, border, imageSize, data);
+}
+
+void GLApiBase::glCompressedTexImage3DFn(GLenum target,
+                                         GLint level,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         GLint border,
+                                         GLsizei imageSize,
+                                         const void* data) {
+  driver_->fn.glCompressedTexImage3DFn(target, level, internalformat, width,
+                                       height, depth, border, imageSize, data);
+}
+
+void GLApiBase::glCompressedTexSubImage2DFn(GLenum target,
+                                            GLint level,
+                                            GLint xoffset,
+                                            GLint yoffset,
+                                            GLsizei width,
+                                            GLsizei height,
+                                            GLenum format,
+                                            GLsizei imageSize,
+                                            const void* data) {
+  driver_->fn.glCompressedTexSubImage2DFn(
+      target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+void GLApiBase::glCopyBufferSubDataFn(GLenum readTarget,
+                                      GLenum writeTarget,
+                                      GLintptr readOffset,
+                                      GLintptr writeOffset,
+                                      GLsizeiptr size) {
+  driver_->fn.glCopyBufferSubDataFn(readTarget, writeTarget, readOffset,
+                                    writeOffset, size);
+}
+
+void GLApiBase::glCopyTexImage2DFn(GLenum target,
+                                   GLint level,
+                                   GLenum internalformat,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLint border) {
+  driver_->fn.glCopyTexImage2DFn(target, level, internalformat, x, y, width,
+                                 height, border);
+}
+
+void GLApiBase::glCopyTexSubImage2DFn(GLenum target,
+                                      GLint level,
+                                      GLint xoffset,
+                                      GLint yoffset,
+                                      GLint x,
+                                      GLint y,
+                                      GLsizei width,
+                                      GLsizei height) {
+  driver_->fn.glCopyTexSubImage2DFn(target, level, xoffset, yoffset, x, y,
+                                    width, height);
+}
+
+void GLApiBase::glCopyTexSubImage3DFn(GLenum target,
+                                      GLint level,
+                                      GLint xoffset,
+                                      GLint yoffset,
+                                      GLint zoffset,
+                                      GLint x,
+                                      GLint y,
+                                      GLsizei width,
+                                      GLsizei height) {
+  driver_->fn.glCopyTexSubImage3DFn(target, level, xoffset, yoffset, zoffset, x,
+                                    y, width, height);
+}
+
+GLuint GLApiBase::glCreateProgramFn(void) {
+  return driver_->fn.glCreateProgramFn();
+}
+
+GLuint GLApiBase::glCreateShaderFn(GLenum type) {
+  return driver_->fn.glCreateShaderFn(type);
+}
+
+void GLApiBase::glCullFaceFn(GLenum mode) {
+  driver_->fn.glCullFaceFn(mode);
+}
+
+void GLApiBase::glDeleteBuffersARBFn(GLsizei n, const GLuint* buffers) {
+  driver_->fn.glDeleteBuffersARBFn(n, buffers);
+}
+
+void GLApiBase::glDeleteFencesAPPLEFn(GLsizei n, const GLuint* fences) {
+  driver_->fn.glDeleteFencesAPPLEFn(n, fences);
+}
+
+void GLApiBase::glDeleteFencesNVFn(GLsizei n, const GLuint* fences) {
+  driver_->fn.glDeleteFencesNVFn(n, fences);
+}
+
+void GLApiBase::glDeleteFramebuffersEXTFn(GLsizei n,
+                                          const GLuint* framebuffers) {
+  driver_->fn.glDeleteFramebuffersEXTFn(n, framebuffers);
+}
+
+void GLApiBase::glDeleteProgramFn(GLuint program) {
+  driver_->fn.glDeleteProgramFn(program);
+}
+
+void GLApiBase::glDeleteQueriesFn(GLsizei n, const GLuint* ids) {
+  driver_->fn.glDeleteQueriesFn(n, ids);
+}
+
+void GLApiBase::glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) {
+  driver_->fn.glDeleteQueriesARBFn(n, ids);
+}
+
+void GLApiBase::glDeleteRenderbuffersEXTFn(GLsizei n,
+                                           const GLuint* renderbuffers) {
+  driver_->fn.glDeleteRenderbuffersEXTFn(n, renderbuffers);
+}
+
+void GLApiBase::glDeleteSamplersFn(GLsizei n, const GLuint* samplers) {
+  driver_->fn.glDeleteSamplersFn(n, samplers);
+}
+
+void GLApiBase::glDeleteShaderFn(GLuint shader) {
+  driver_->fn.glDeleteShaderFn(shader);
+}
+
+void GLApiBase::glDeleteSyncFn(GLsync sync) {
+  driver_->fn.glDeleteSyncFn(sync);
+}
+
+void GLApiBase::glDeleteTexturesFn(GLsizei n, const GLuint* textures) {
+  driver_->fn.glDeleteTexturesFn(n, textures);
+}
+
+void GLApiBase::glDeleteTransformFeedbacksFn(GLsizei n, const GLuint* ids) {
+  driver_->fn.glDeleteTransformFeedbacksFn(n, ids);
+}
+
+void GLApiBase::glDeleteVertexArraysOESFn(GLsizei n, const GLuint* arrays) {
+  driver_->fn.glDeleteVertexArraysOESFn(n, arrays);
+}
+
+void GLApiBase::glDepthFuncFn(GLenum func) {
+  driver_->fn.glDepthFuncFn(func);
+}
+
+void GLApiBase::glDepthMaskFn(GLboolean flag) {
+  driver_->fn.glDepthMaskFn(flag);
+}
+
+void GLApiBase::glDepthRangeFn(GLclampd zNear, GLclampd zFar) {
+  driver_->fn.glDepthRangeFn(zNear, zFar);
+}
+
+void GLApiBase::glDepthRangefFn(GLclampf zNear, GLclampf zFar) {
+  driver_->fn.glDepthRangefFn(zNear, zFar);
+}
+
+void GLApiBase::glDetachShaderFn(GLuint program, GLuint shader) {
+  driver_->fn.glDetachShaderFn(program, shader);
+}
+
+void GLApiBase::glDisableFn(GLenum cap) {
+  driver_->fn.glDisableFn(cap);
+}
+
+void GLApiBase::glDisableVertexAttribArrayFn(GLuint index) {
+  driver_->fn.glDisableVertexAttribArrayFn(index);
+}
+
+void GLApiBase::glDiscardFramebufferEXTFn(GLenum target,
+                                          GLsizei numAttachments,
+                                          const GLenum* attachments) {
+  driver_->fn.glDiscardFramebufferEXTFn(target, numAttachments, attachments);
+}
+
+void GLApiBase::glDrawArraysFn(GLenum mode, GLint first, GLsizei count) {
+  driver_->fn.glDrawArraysFn(mode, first, count);
+}
+
+void GLApiBase::glDrawArraysInstancedANGLEFn(GLenum mode,
+                                             GLint first,
+                                             GLsizei count,
+                                             GLsizei primcount) {
+  driver_->fn.glDrawArraysInstancedANGLEFn(mode, first, count, primcount);
+}
+
+void GLApiBase::glDrawBufferFn(GLenum mode) {
+  driver_->fn.glDrawBufferFn(mode);
+}
+
+void GLApiBase::glDrawBuffersARBFn(GLsizei n, const GLenum* bufs) {
+  driver_->fn.glDrawBuffersARBFn(n, bufs);
+}
+
+void GLApiBase::glDrawElementsFn(GLenum mode,
+                                 GLsizei count,
+                                 GLenum type,
+                                 const void* indices) {
+  driver_->fn.glDrawElementsFn(mode, count, type, indices);
+}
+
+void GLApiBase::glDrawElementsInstancedANGLEFn(GLenum mode,
+                                               GLsizei count,
+                                               GLenum type,
+                                               const void* indices,
+                                               GLsizei primcount) {
+  driver_->fn.glDrawElementsInstancedANGLEFn(mode, count, type, indices,
+                                             primcount);
+}
+
+void GLApiBase::glDrawRangeElementsFn(GLenum mode,
+                                      GLuint start,
+                                      GLuint end,
+                                      GLsizei count,
+                                      GLenum type,
+                                      const void* indices) {
+  driver_->fn.glDrawRangeElementsFn(mode, start, end, count, type, indices);
+}
+
+void GLApiBase::glEGLImageTargetRenderbufferStorageOESFn(GLenum target,
+                                                         GLeglImageOES image) {
+  driver_->fn.glEGLImageTargetRenderbufferStorageOESFn(target, image);
+}
+
+void GLApiBase::glEGLImageTargetTexture2DOESFn(GLenum target,
+                                               GLeglImageOES image) {
+  driver_->fn.glEGLImageTargetTexture2DOESFn(target, image);
+}
+
+void GLApiBase::glEnableFn(GLenum cap) {
+  driver_->fn.glEnableFn(cap);
+}
+
+void GLApiBase::glEnableVertexAttribArrayFn(GLuint index) {
+  driver_->fn.glEnableVertexAttribArrayFn(index);
+}
+
+void GLApiBase::glEndQueryFn(GLenum target) {
+  driver_->fn.glEndQueryFn(target);
+}
+
+void GLApiBase::glEndQueryARBFn(GLenum target) {
+  driver_->fn.glEndQueryARBFn(target);
+}
+
+void GLApiBase::glEndTransformFeedbackFn(void) {
+  driver_->fn.glEndTransformFeedbackFn();
+}
+
+GLsync GLApiBase::glFenceSyncFn(GLenum condition, GLbitfield flags) {
+  return driver_->fn.glFenceSyncFn(condition, flags);
+}
+
+void GLApiBase::glFinishFn(void) {
+  driver_->fn.glFinishFn();
+}
+
+void GLApiBase::glFinishFenceAPPLEFn(GLuint fence) {
+  driver_->fn.glFinishFenceAPPLEFn(fence);
+}
+
+void GLApiBase::glFinishFenceNVFn(GLuint fence) {
+  driver_->fn.glFinishFenceNVFn(fence);
+}
+
+void GLApiBase::glFlushFn(void) {
+  driver_->fn.glFlushFn();
+}
+
+void GLApiBase::glFlushMappedBufferRangeFn(GLenum target,
+                                           GLintptr offset,
+                                           GLsizeiptr length) {
+  driver_->fn.glFlushMappedBufferRangeFn(target, offset, length);
+}
+
+void GLApiBase::glFramebufferRenderbufferEXTFn(GLenum target,
+                                               GLenum attachment,
+                                               GLenum renderbuffertarget,
+                                               GLuint renderbuffer) {
+  driver_->fn.glFramebufferRenderbufferEXTFn(target, attachment,
+                                             renderbuffertarget, renderbuffer);
+}
+
+void GLApiBase::glFramebufferTexture2DEXTFn(GLenum target,
+                                            GLenum attachment,
+                                            GLenum textarget,
+                                            GLuint texture,
+                                            GLint level) {
+  driver_->fn.glFramebufferTexture2DEXTFn(target, attachment, textarget,
+                                          texture, level);
+}
+
+void GLApiBase::glFramebufferTexture2DMultisampleEXTFn(GLenum target,
+                                                       GLenum attachment,
+                                                       GLenum textarget,
+                                                       GLuint texture,
+                                                       GLint level,
+                                                       GLsizei samples) {
+  driver_->fn.glFramebufferTexture2DMultisampleEXTFn(
+      target, attachment, textarget, texture, level, samples);
+}
+
+void GLApiBase::glFramebufferTexture2DMultisampleIMGFn(GLenum target,
+                                                       GLenum attachment,
+                                                       GLenum textarget,
+                                                       GLuint texture,
+                                                       GLint level,
+                                                       GLsizei samples) {
+  driver_->fn.glFramebufferTexture2DMultisampleIMGFn(
+      target, attachment, textarget, texture, level, samples);
+}
+
+void GLApiBase::glFramebufferTextureLayerFn(GLenum target,
+                                            GLenum attachment,
+                                            GLuint texture,
+                                            GLint level,
+                                            GLint layer) {
+  driver_->fn.glFramebufferTextureLayerFn(target, attachment, texture, level,
+                                          layer);
+}
+
+void GLApiBase::glFrontFaceFn(GLenum mode) {
+  driver_->fn.glFrontFaceFn(mode);
+}
+
+void GLApiBase::glGenBuffersARBFn(GLsizei n, GLuint* buffers) {
+  driver_->fn.glGenBuffersARBFn(n, buffers);
+}
+
+void GLApiBase::glGenerateMipmapEXTFn(GLenum target) {
+  driver_->fn.glGenerateMipmapEXTFn(target);
+}
+
+void GLApiBase::glGenFencesAPPLEFn(GLsizei n, GLuint* fences) {
+  driver_->fn.glGenFencesAPPLEFn(n, fences);
+}
+
+void GLApiBase::glGenFencesNVFn(GLsizei n, GLuint* fences) {
+  driver_->fn.glGenFencesNVFn(n, fences);
+}
+
+void GLApiBase::glGenFramebuffersEXTFn(GLsizei n, GLuint* framebuffers) {
+  driver_->fn.glGenFramebuffersEXTFn(n, framebuffers);
+}
+
+void GLApiBase::glGenQueriesFn(GLsizei n, GLuint* ids) {
+  driver_->fn.glGenQueriesFn(n, ids);
+}
+
+void GLApiBase::glGenQueriesARBFn(GLsizei n, GLuint* ids) {
+  driver_->fn.glGenQueriesARBFn(n, ids);
+}
+
+void GLApiBase::glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) {
+  driver_->fn.glGenRenderbuffersEXTFn(n, renderbuffers);
+}
+
+void GLApiBase::glGenSamplersFn(GLsizei n, GLuint* samplers) {
+  driver_->fn.glGenSamplersFn(n, samplers);
+}
+
+void GLApiBase::glGenTexturesFn(GLsizei n, GLuint* textures) {
+  driver_->fn.glGenTexturesFn(n, textures);
+}
+
+void GLApiBase::glGenTransformFeedbacksFn(GLsizei n, GLuint* ids) {
+  driver_->fn.glGenTransformFeedbacksFn(n, ids);
+}
+
+void GLApiBase::glGenVertexArraysOESFn(GLsizei n, GLuint* arrays) {
+  driver_->fn.glGenVertexArraysOESFn(n, arrays);
+}
+
+void GLApiBase::glGetActiveAttribFn(GLuint program,
+                                    GLuint index,
+                                    GLsizei bufsize,
+                                    GLsizei* length,
+                                    GLint* size,
+                                    GLenum* type,
+                                    char* name) {
+  driver_->fn.glGetActiveAttribFn(program, index, bufsize, length, size, type,
+                                  name);
+}
+
+void GLApiBase::glGetActiveUniformFn(GLuint program,
+                                     GLuint index,
+                                     GLsizei bufsize,
+                                     GLsizei* length,
+                                     GLint* size,
+                                     GLenum* type,
+                                     char* name) {
+  driver_->fn.glGetActiveUniformFn(program, index, bufsize, length, size, type,
+                                   name);
+}
+
+void GLApiBase::glGetActiveUniformBlockivFn(GLuint program,
+                                            GLuint uniformBlockIndex,
+                                            GLenum pname,
+                                            GLint* params) {
+  driver_->fn.glGetActiveUniformBlockivFn(program, uniformBlockIndex, pname,
+                                          params);
+}
+
+void GLApiBase::glGetActiveUniformBlockNameFn(GLuint program,
+                                              GLuint uniformBlockIndex,
+                                              GLsizei bufSize,
+                                              GLsizei* length,
+                                              char* uniformBlockName) {
+  driver_->fn.glGetActiveUniformBlockNameFn(program, uniformBlockIndex, bufSize,
+                                            length, uniformBlockName);
+}
+
+void GLApiBase::glGetActiveUniformsivFn(GLuint program,
+                                        GLsizei uniformCount,
+                                        const GLuint* uniformIndices,
+                                        GLenum pname,
+                                        GLint* params) {
+  driver_->fn.glGetActiveUniformsivFn(program, uniformCount, uniformIndices,
+                                      pname, params);
+}
+
+void GLApiBase::glGetAttachedShadersFn(GLuint program,
+                                       GLsizei maxcount,
+                                       GLsizei* count,
+                                       GLuint* shaders) {
+  driver_->fn.glGetAttachedShadersFn(program, maxcount, count, shaders);
+}
+
+GLint GLApiBase::glGetAttribLocationFn(GLuint program, const char* name) {
+  return driver_->fn.glGetAttribLocationFn(program, name);
+}
+
+void GLApiBase::glGetBooleanvFn(GLenum pname, GLboolean* params) {
+  driver_->fn.glGetBooleanvFn(pname, params);
+}
+
+void GLApiBase::glGetBufferParameterivFn(GLenum target,
+                                         GLenum pname,
+                                         GLint* params) {
+  driver_->fn.glGetBufferParameterivFn(target, pname, params);
+}
+
+GLenum GLApiBase::glGetErrorFn(void) {
+  return driver_->fn.glGetErrorFn();
+}
+
+void GLApiBase::glGetFenceivNVFn(GLuint fence, GLenum pname, GLint* params) {
+  driver_->fn.glGetFenceivNVFn(fence, pname, params);
+}
+
+void GLApiBase::glGetFloatvFn(GLenum pname, GLfloat* params) {
+  driver_->fn.glGetFloatvFn(pname, params);
+}
+
+GLint GLApiBase::glGetFragDataLocationFn(GLuint program, const char* name) {
+  return driver_->fn.glGetFragDataLocationFn(program, name);
+}
+
+void GLApiBase::glGetFramebufferAttachmentParameterivEXTFn(GLenum target,
+                                                           GLenum attachment,
+                                                           GLenum pname,
+                                                           GLint* params) {
+  driver_->fn.glGetFramebufferAttachmentParameterivEXTFn(target, attachment,
+                                                         pname, params);
+}
+
+GLenum GLApiBase::glGetGraphicsResetStatusARBFn(void) {
+  return driver_->fn.glGetGraphicsResetStatusARBFn();
+}
+
+void GLApiBase::glGetInteger64i_vFn(GLenum target,
+                                    GLuint index,
+                                    GLint64* data) {
+  driver_->fn.glGetInteger64i_vFn(target, index, data);
+}
+
+void GLApiBase::glGetInteger64vFn(GLenum pname, GLint64* params) {
+  driver_->fn.glGetInteger64vFn(pname, params);
+}
+
+void GLApiBase::glGetIntegeri_vFn(GLenum target, GLuint index, GLint* data) {
+  driver_->fn.glGetIntegeri_vFn(target, index, data);
+}
+
+void GLApiBase::glGetIntegervFn(GLenum pname, GLint* params) {
+  driver_->fn.glGetIntegervFn(pname, params);
+}
+
+void GLApiBase::glGetInternalformativFn(GLenum target,
+                                        GLenum internalformat,
+                                        GLenum pname,
+                                        GLsizei bufSize,
+                                        GLint* params) {
+  driver_->fn.glGetInternalformativFn(target, internalformat, pname, bufSize,
+                                      params);
+}
+
+void GLApiBase::glGetProgramBinaryFn(GLuint program,
+                                     GLsizei bufSize,
+                                     GLsizei* length,
+                                     GLenum* binaryFormat,
+                                     GLvoid* binary) {
+  driver_->fn.glGetProgramBinaryFn(program, bufSize, length, binaryFormat,
+                                   binary);
+}
+
+void GLApiBase::glGetProgramInfoLogFn(GLuint program,
+                                      GLsizei bufsize,
+                                      GLsizei* length,
+                                      char* infolog) {
+  driver_->fn.glGetProgramInfoLogFn(program, bufsize, length, infolog);
+}
+
+void GLApiBase::glGetProgramivFn(GLuint program, GLenum pname, GLint* params) {
+  driver_->fn.glGetProgramivFn(program, pname, params);
+}
+
+void GLApiBase::glGetQueryivFn(GLenum target, GLenum pname, GLint* params) {
+  driver_->fn.glGetQueryivFn(target, pname, params);
+}
+
+void GLApiBase::glGetQueryivARBFn(GLenum target, GLenum pname, GLint* params) {
+  driver_->fn.glGetQueryivARBFn(target, pname, params);
+}
+
+void GLApiBase::glGetQueryObjecti64vFn(GLuint id,
+                                       GLenum pname,
+                                       GLint64* params) {
+  driver_->fn.glGetQueryObjecti64vFn(id, pname, params);
+}
+
+void GLApiBase::glGetQueryObjectivFn(GLuint id, GLenum pname, GLint* params) {
+  driver_->fn.glGetQueryObjectivFn(id, pname, params);
+}
+
+void GLApiBase::glGetQueryObjectivARBFn(GLuint id,
+                                        GLenum pname,
+                                        GLint* params) {
+  driver_->fn.glGetQueryObjectivARBFn(id, pname, params);
+}
+
+void GLApiBase::glGetQueryObjectui64vFn(GLuint id,
+                                        GLenum pname,
+                                        GLuint64* params) {
+  driver_->fn.glGetQueryObjectui64vFn(id, pname, params);
+}
+
+void GLApiBase::glGetQueryObjectuivFn(GLuint id, GLenum pname, GLuint* params) {
+  driver_->fn.glGetQueryObjectuivFn(id, pname, params);
+}
+
+void GLApiBase::glGetQueryObjectuivARBFn(GLuint id,
+                                         GLenum pname,
+                                         GLuint* params) {
+  driver_->fn.glGetQueryObjectuivARBFn(id, pname, params);
+}
+
+void GLApiBase::glGetRenderbufferParameterivEXTFn(GLenum target,
+                                                  GLenum pname,
+                                                  GLint* params) {
+  driver_->fn.glGetRenderbufferParameterivEXTFn(target, pname, params);
+}
+
+void GLApiBase::glGetSamplerParameterfvFn(GLuint sampler,
+                                          GLenum pname,
+                                          GLfloat* params) {
+  driver_->fn.glGetSamplerParameterfvFn(sampler, pname, params);
+}
+
+void GLApiBase::glGetSamplerParameterivFn(GLuint sampler,
+                                          GLenum pname,
+                                          GLint* params) {
+  driver_->fn.glGetSamplerParameterivFn(sampler, pname, params);
+}
+
+void GLApiBase::glGetShaderInfoLogFn(GLuint shader,
+                                     GLsizei bufsize,
+                                     GLsizei* length,
+                                     char* infolog) {
+  driver_->fn.glGetShaderInfoLogFn(shader, bufsize, length, infolog);
+}
+
+void GLApiBase::glGetShaderivFn(GLuint shader, GLenum pname, GLint* params) {
+  driver_->fn.glGetShaderivFn(shader, pname, params);
+}
+
+void GLApiBase::glGetShaderPrecisionFormatFn(GLenum shadertype,
+                                             GLenum precisiontype,
+                                             GLint* range,
+                                             GLint* precision) {
+  driver_->fn.glGetShaderPrecisionFormatFn(shadertype, precisiontype, range,
+                                           precision);
+}
+
+void GLApiBase::glGetShaderSourceFn(GLuint shader,
+                                    GLsizei bufsize,
+                                    GLsizei* length,
+                                    char* source) {
+  driver_->fn.glGetShaderSourceFn(shader, bufsize, length, source);
+}
+
+const GLubyte* GLApiBase::glGetStringFn(GLenum name) {
+  return driver_->fn.glGetStringFn(name);
+}
+
+void GLApiBase::glGetSyncivFn(GLsync sync,
+                              GLenum pname,
+                              GLsizei bufSize,
+                              GLsizei* length,
+                              GLint* values) {
+  driver_->fn.glGetSyncivFn(sync, pname, bufSize, length, values);
+}
+
+void GLApiBase::glGetTexLevelParameterfvFn(GLenum target,
+                                           GLint level,
+                                           GLenum pname,
+                                           GLfloat* params) {
+  driver_->fn.glGetTexLevelParameterfvFn(target, level, pname, params);
+}
+
+void GLApiBase::glGetTexLevelParameterivFn(GLenum target,
+                                           GLint level,
+                                           GLenum pname,
+                                           GLint* params) {
+  driver_->fn.glGetTexLevelParameterivFn(target, level, pname, params);
+}
+
+void GLApiBase::glGetTexParameterfvFn(GLenum target,
+                                      GLenum pname,
+                                      GLfloat* params) {
+  driver_->fn.glGetTexParameterfvFn(target, pname, params);
+}
+
+void GLApiBase::glGetTexParameterivFn(GLenum target,
+                                      GLenum pname,
+                                      GLint* params) {
+  driver_->fn.glGetTexParameterivFn(target, pname, params);
+}
+
+void GLApiBase::glGetTransformFeedbackVaryingFn(GLuint program,
+                                                GLuint index,
+                                                GLsizei bufSize,
+                                                GLsizei* length,
+                                                GLenum* type,
+                                                char* name) {
+  driver_->fn.glGetTransformFeedbackVaryingFn(program, index, bufSize, length,
+                                              type, name);
+}
+
+void GLApiBase::glGetTranslatedShaderSourceANGLEFn(GLuint shader,
+                                                   GLsizei bufsize,
+                                                   GLsizei* length,
+                                                   char* source) {
+  driver_->fn.glGetTranslatedShaderSourceANGLEFn(shader, bufsize, length,
+                                                 source);
+}
+
+GLuint GLApiBase::glGetUniformBlockIndexFn(GLuint program,
+                                           const char* uniformBlockName) {
+  return driver_->fn.glGetUniformBlockIndexFn(program, uniformBlockName);
+}
+
+void GLApiBase::glGetUniformfvFn(GLuint program,
+                                 GLint location,
+                                 GLfloat* params) {
+  driver_->fn.glGetUniformfvFn(program, location, params);
+}
+
+void GLApiBase::glGetUniformIndicesFn(GLuint program,
+                                      GLsizei uniformCount,
+                                      const char* const* uniformNames,
+                                      GLuint* uniformIndices) {
+  driver_->fn.glGetUniformIndicesFn(program, uniformCount, uniformNames,
+                                    uniformIndices);
+}
+
+void GLApiBase::glGetUniformivFn(GLuint program,
+                                 GLint location,
+                                 GLint* params) {
+  driver_->fn.glGetUniformivFn(program, location, params);
+}
+
+GLint GLApiBase::glGetUniformLocationFn(GLuint program, const char* name) {
+  return driver_->fn.glGetUniformLocationFn(program, name);
+}
+
+void GLApiBase::glGetVertexAttribfvFn(GLuint index,
+                                      GLenum pname,
+                                      GLfloat* params) {
+  driver_->fn.glGetVertexAttribfvFn(index, pname, params);
+}
+
+void GLApiBase::glGetVertexAttribivFn(GLuint index,
+                                      GLenum pname,
+                                      GLint* params) {
+  driver_->fn.glGetVertexAttribivFn(index, pname, params);
+}
+
+void GLApiBase::glGetVertexAttribPointervFn(GLuint index,
+                                            GLenum pname,
+                                            void** pointer) {
+  driver_->fn.glGetVertexAttribPointervFn(index, pname, pointer);
+}
+
+void GLApiBase::glHintFn(GLenum target, GLenum mode) {
+  driver_->fn.glHintFn(target, mode);
+}
+
+void GLApiBase::glInsertEventMarkerEXTFn(GLsizei length, const char* marker) {
+  driver_->fn.glInsertEventMarkerEXTFn(length, marker);
+}
+
+void GLApiBase::glInvalidateFramebufferFn(GLenum target,
+                                          GLsizei numAttachments,
+                                          const GLenum* attachments) {
+  driver_->fn.glInvalidateFramebufferFn(target, numAttachments, attachments);
+}
+
+void GLApiBase::glInvalidateSubFramebufferFn(GLenum target,
+                                             GLsizei numAttachments,
+                                             const GLenum* attachments,
+                                             GLint x,
+                                             GLint y,
+                                             GLint width,
+                                             GLint height) {
+  driver_->fn.glInvalidateSubFramebufferFn(target, numAttachments, attachments,
+                                           x, y, width, height);
+}
+
+GLboolean GLApiBase::glIsBufferFn(GLuint buffer) {
+  return driver_->fn.glIsBufferFn(buffer);
+}
+
+GLboolean GLApiBase::glIsEnabledFn(GLenum cap) {
+  return driver_->fn.glIsEnabledFn(cap);
+}
+
+GLboolean GLApiBase::glIsFenceAPPLEFn(GLuint fence) {
+  return driver_->fn.glIsFenceAPPLEFn(fence);
+}
+
+GLboolean GLApiBase::glIsFenceNVFn(GLuint fence) {
+  return driver_->fn.glIsFenceNVFn(fence);
+}
+
+GLboolean GLApiBase::glIsFramebufferEXTFn(GLuint framebuffer) {
+  return driver_->fn.glIsFramebufferEXTFn(framebuffer);
+}
+
+GLboolean GLApiBase::glIsProgramFn(GLuint program) {
+  return driver_->fn.glIsProgramFn(program);
+}
+
+GLboolean GLApiBase::glIsQueryFn(GLuint query) {
+  return driver_->fn.glIsQueryFn(query);
+}
+
+GLboolean GLApiBase::glIsQueryARBFn(GLuint query) {
+  return driver_->fn.glIsQueryARBFn(query);
+}
+
+GLboolean GLApiBase::glIsRenderbufferEXTFn(GLuint renderbuffer) {
+  return driver_->fn.glIsRenderbufferEXTFn(renderbuffer);
+}
+
+GLboolean GLApiBase::glIsSamplerFn(GLuint sampler) {
+  return driver_->fn.glIsSamplerFn(sampler);
+}
+
+GLboolean GLApiBase::glIsShaderFn(GLuint shader) {
+  return driver_->fn.glIsShaderFn(shader);
+}
+
+GLboolean GLApiBase::glIsSyncFn(GLsync sync) {
+  return driver_->fn.glIsSyncFn(sync);
+}
+
+GLboolean GLApiBase::glIsTextureFn(GLuint texture) {
+  return driver_->fn.glIsTextureFn(texture);
+}
+
+GLboolean GLApiBase::glIsTransformFeedbackFn(GLuint id) {
+  return driver_->fn.glIsTransformFeedbackFn(id);
+}
+
+GLboolean GLApiBase::glIsVertexArrayOESFn(GLuint array) {
+  return driver_->fn.glIsVertexArrayOESFn(array);
+}
+
+void GLApiBase::glLineWidthFn(GLfloat width) {
+  driver_->fn.glLineWidthFn(width);
+}
+
+void GLApiBase::glLinkProgramFn(GLuint program) {
+  driver_->fn.glLinkProgramFn(program);
+}
+
+void* GLApiBase::glMapBufferFn(GLenum target, GLenum access) {
+  return driver_->fn.glMapBufferFn(target, access);
+}
+
+void* GLApiBase::glMapBufferRangeFn(GLenum target,
+                                    GLintptr offset,
+                                    GLsizeiptr length,
+                                    GLbitfield access) {
+  return driver_->fn.glMapBufferRangeFn(target, offset, length, access);
+}
+
+void GLApiBase::glMatrixLoadfEXTFn(GLenum matrixMode, const GLfloat* m) {
+  driver_->fn.glMatrixLoadfEXTFn(matrixMode, m);
+}
+
+void GLApiBase::glMatrixLoadIdentityEXTFn(GLenum matrixMode) {
+  driver_->fn.glMatrixLoadIdentityEXTFn(matrixMode);
+}
+
+void GLApiBase::glPauseTransformFeedbackFn(void) {
+  driver_->fn.glPauseTransformFeedbackFn();
+}
+
+void GLApiBase::glPixelStoreiFn(GLenum pname, GLint param) {
+  driver_->fn.glPixelStoreiFn(pname, param);
+}
+
+void GLApiBase::glPointParameteriFn(GLenum pname, GLint param) {
+  driver_->fn.glPointParameteriFn(pname, param);
+}
+
+void GLApiBase::glPolygonOffsetFn(GLfloat factor, GLfloat units) {
+  driver_->fn.glPolygonOffsetFn(factor, units);
+}
+
+void GLApiBase::glPopGroupMarkerEXTFn(void) {
+  driver_->fn.glPopGroupMarkerEXTFn();
+}
+
+void GLApiBase::glProgramBinaryFn(GLuint program,
+                                  GLenum binaryFormat,
+                                  const GLvoid* binary,
+                                  GLsizei length) {
+  driver_->fn.glProgramBinaryFn(program, binaryFormat, binary, length);
+}
+
+void GLApiBase::glProgramParameteriFn(GLuint program,
+                                      GLenum pname,
+                                      GLint value) {
+  driver_->fn.glProgramParameteriFn(program, pname, value);
+}
+
+void GLApiBase::glPushGroupMarkerEXTFn(GLsizei length, const char* marker) {
+  driver_->fn.glPushGroupMarkerEXTFn(length, marker);
+}
+
+void GLApiBase::glQueryCounterFn(GLuint id, GLenum target) {
+  driver_->fn.glQueryCounterFn(id, target);
+}
+
+void GLApiBase::glReadBufferFn(GLenum src) {
+  driver_->fn.glReadBufferFn(src);
+}
+
+void GLApiBase::glReadPixelsFn(GLint x,
+                               GLint y,
+                               GLsizei width,
+                               GLsizei height,
+                               GLenum format,
+                               GLenum type,
+                               void* pixels) {
+  driver_->fn.glReadPixelsFn(x, y, width, height, format, type, pixels);
+}
+
+void GLApiBase::glReleaseShaderCompilerFn(void) {
+  driver_->fn.glReleaseShaderCompilerFn();
+}
+
+void GLApiBase::glRenderbufferStorageEXTFn(GLenum target,
+                                           GLenum internalformat,
+                                           GLsizei width,
+                                           GLsizei height) {
+  driver_->fn.glRenderbufferStorageEXTFn(target, internalformat, width, height);
+}
+
+void GLApiBase::glRenderbufferStorageMultisampleFn(GLenum target,
+                                                   GLsizei samples,
+                                                   GLenum internalformat,
+                                                   GLsizei width,
+                                                   GLsizei height) {
+  driver_->fn.glRenderbufferStorageMultisampleFn(target, samples,
+                                                 internalformat, width, height);
+}
+
+void GLApiBase::glRenderbufferStorageMultisampleANGLEFn(GLenum target,
+                                                        GLsizei samples,
+                                                        GLenum internalformat,
+                                                        GLsizei width,
+                                                        GLsizei height) {
+  driver_->fn.glRenderbufferStorageMultisampleANGLEFn(
+      target, samples, internalformat, width, height);
+}
+
+void GLApiBase::glRenderbufferStorageMultisampleEXTFn(GLenum target,
+                                                      GLsizei samples,
+                                                      GLenum internalformat,
+                                                      GLsizei width,
+                                                      GLsizei height) {
+  driver_->fn.glRenderbufferStorageMultisampleEXTFn(
+      target, samples, internalformat, width, height);
+}
+
+void GLApiBase::glRenderbufferStorageMultisampleIMGFn(GLenum target,
+                                                      GLsizei samples,
+                                                      GLenum internalformat,
+                                                      GLsizei width,
+                                                      GLsizei height) {
+  driver_->fn.glRenderbufferStorageMultisampleIMGFn(
+      target, samples, internalformat, width, height);
+}
+
+void GLApiBase::glResumeTransformFeedbackFn(void) {
+  driver_->fn.glResumeTransformFeedbackFn();
+}
+
+void GLApiBase::glSampleCoverageFn(GLclampf value, GLboolean invert) {
+  driver_->fn.glSampleCoverageFn(value, invert);
+}
+
+void GLApiBase::glSamplerParameterfFn(GLuint sampler,
+                                      GLenum pname,
+                                      GLfloat param) {
+  driver_->fn.glSamplerParameterfFn(sampler, pname, param);
+}
+
+void GLApiBase::glSamplerParameterfvFn(GLuint sampler,
+                                       GLenum pname,
+                                       const GLfloat* params) {
+  driver_->fn.glSamplerParameterfvFn(sampler, pname, params);
+}
+
+void GLApiBase::glSamplerParameteriFn(GLuint sampler,
+                                      GLenum pname,
+                                      GLint param) {
+  driver_->fn.glSamplerParameteriFn(sampler, pname, param);
+}
+
+void GLApiBase::glSamplerParameterivFn(GLuint sampler,
+                                       GLenum pname,
+                                       const GLint* params) {
+  driver_->fn.glSamplerParameterivFn(sampler, pname, params);
+}
+
+void GLApiBase::glScissorFn(GLint x, GLint y, GLsizei width, GLsizei height) {
+  driver_->fn.glScissorFn(x, y, width, height);
+}
+
+void GLApiBase::glSetFenceAPPLEFn(GLuint fence) {
+  driver_->fn.glSetFenceAPPLEFn(fence);
+}
+
+void GLApiBase::glSetFenceNVFn(GLuint fence, GLenum condition) {
+  driver_->fn.glSetFenceNVFn(fence, condition);
+}
+
+void GLApiBase::glShaderBinaryFn(GLsizei n,
+                                 const GLuint* shaders,
+                                 GLenum binaryformat,
+                                 const void* binary,
+                                 GLsizei length) {
+  driver_->fn.glShaderBinaryFn(n, shaders, binaryformat, binary, length);
+}
+
+void GLApiBase::glShaderSourceFn(GLuint shader,
+                                 GLsizei count,
+                                 const char* const* str,
+                                 const GLint* length) {
+  driver_->fn.glShaderSourceFn(shader, count, str, length);
+}
+
+void GLApiBase::glStencilFuncFn(GLenum func, GLint ref, GLuint mask) {
+  driver_->fn.glStencilFuncFn(func, ref, mask);
+}
+
+void GLApiBase::glStencilFuncSeparateFn(GLenum face,
+                                        GLenum func,
+                                        GLint ref,
+                                        GLuint mask) {
+  driver_->fn.glStencilFuncSeparateFn(face, func, ref, mask);
+}
+
+void GLApiBase::glStencilMaskFn(GLuint mask) {
+  driver_->fn.glStencilMaskFn(mask);
+}
+
+void GLApiBase::glStencilMaskSeparateFn(GLenum face, GLuint mask) {
+  driver_->fn.glStencilMaskSeparateFn(face, mask);
+}
+
+void GLApiBase::glStencilOpFn(GLenum fail, GLenum zfail, GLenum zpass) {
+  driver_->fn.glStencilOpFn(fail, zfail, zpass);
+}
+
+void GLApiBase::glStencilOpSeparateFn(GLenum face,
+                                      GLenum fail,
+                                      GLenum zfail,
+                                      GLenum zpass) {
+  driver_->fn.glStencilOpSeparateFn(face, fail, zfail, zpass);
+}
+
+GLboolean GLApiBase::glTestFenceAPPLEFn(GLuint fence) {
+  return driver_->fn.glTestFenceAPPLEFn(fence);
+}
+
+GLboolean GLApiBase::glTestFenceNVFn(GLuint fence) {
+  return driver_->fn.glTestFenceNVFn(fence);
+}
+
+void GLApiBase::glTexImage2DFn(GLenum target,
+                               GLint level,
+                               GLint internalformat,
+                               GLsizei width,
+                               GLsizei height,
+                               GLint border,
+                               GLenum format,
+                               GLenum type,
+                               const void* pixels) {
+  driver_->fn.glTexImage2DFn(target, level, internalformat, width, height,
+                             border, format, type, pixels);
+}
+
+void GLApiBase::glTexImage3DFn(GLenum target,
+                               GLint level,
+                               GLint internalformat,
+                               GLsizei width,
+                               GLsizei height,
+                               GLsizei depth,
+                               GLint border,
+                               GLenum format,
+                               GLenum type,
+                               const void* pixels) {
+  driver_->fn.glTexImage3DFn(target, level, internalformat, width, height,
+                             depth, border, format, type, pixels);
+}
+
+void GLApiBase::glTexParameterfFn(GLenum target, GLenum pname, GLfloat param) {
+  driver_->fn.glTexParameterfFn(target, pname, param);
+}
+
+void GLApiBase::glTexParameterfvFn(GLenum target,
+                                   GLenum pname,
+                                   const GLfloat* params) {
+  driver_->fn.glTexParameterfvFn(target, pname, params);
+}
+
+void GLApiBase::glTexParameteriFn(GLenum target, GLenum pname, GLint param) {
+  driver_->fn.glTexParameteriFn(target, pname, param);
+}
+
+void GLApiBase::glTexParameterivFn(GLenum target,
+                                   GLenum pname,
+                                   const GLint* params) {
+  driver_->fn.glTexParameterivFn(target, pname, params);
+}
+
+void GLApiBase::glTexStorage2DEXTFn(GLenum target,
+                                    GLsizei levels,
+                                    GLenum internalformat,
+                                    GLsizei width,
+                                    GLsizei height) {
+  driver_->fn.glTexStorage2DEXTFn(target, levels, internalformat, width,
+                                  height);
+}
+
+void GLApiBase::glTexStorage3DFn(GLenum target,
+                                 GLsizei levels,
+                                 GLenum internalformat,
+                                 GLsizei width,
+                                 GLsizei height,
+                                 GLsizei depth) {
+  driver_->fn.glTexStorage3DFn(target, levels, internalformat, width, height,
+                               depth);
+}
+
+void GLApiBase::glTexSubImage2DFn(GLenum target,
+                                  GLint level,
+                                  GLint xoffset,
+                                  GLint yoffset,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLenum format,
+                                  GLenum type,
+                                  const void* pixels) {
+  driver_->fn.glTexSubImage2DFn(target, level, xoffset, yoffset, width, height,
+                                format, type, pixels);
+}
+
+void GLApiBase::glTransformFeedbackVaryingsFn(GLuint program,
+                                              GLsizei count,
+                                              const char* const* varyings,
+                                              GLenum bufferMode) {
+  driver_->fn.glTransformFeedbackVaryingsFn(program, count, varyings,
+                                            bufferMode);
+}
+
+void GLApiBase::glUniform1fFn(GLint location, GLfloat x) {
+  driver_->fn.glUniform1fFn(location, x);
+}
+
+void GLApiBase::glUniform1fvFn(GLint location,
+                               GLsizei count,
+                               const GLfloat* v) {
+  driver_->fn.glUniform1fvFn(location, count, v);
+}
+
+void GLApiBase::glUniform1iFn(GLint location, GLint x) {
+  driver_->fn.glUniform1iFn(location, x);
+}
+
+void GLApiBase::glUniform1ivFn(GLint location, GLsizei count, const GLint* v) {
+  driver_->fn.glUniform1ivFn(location, count, v);
+}
+
+void GLApiBase::glUniform1uiFn(GLint location, GLuint v0) {
+  driver_->fn.glUniform1uiFn(location, v0);
+}
+
+void GLApiBase::glUniform1uivFn(GLint location,
+                                GLsizei count,
+                                const GLuint* v) {
+  driver_->fn.glUniform1uivFn(location, count, v);
+}
+
+void GLApiBase::glUniform2fFn(GLint location, GLfloat x, GLfloat y) {
+  driver_->fn.glUniform2fFn(location, x, y);
+}
+
+void GLApiBase::glUniform2fvFn(GLint location,
+                               GLsizei count,
+                               const GLfloat* v) {
+  driver_->fn.glUniform2fvFn(location, count, v);
+}
+
+void GLApiBase::glUniform2iFn(GLint location, GLint x, GLint y) {
+  driver_->fn.glUniform2iFn(location, x, y);
+}
+
+void GLApiBase::glUniform2ivFn(GLint location, GLsizei count, const GLint* v) {
+  driver_->fn.glUniform2ivFn(location, count, v);
+}
+
+void GLApiBase::glUniform2uiFn(GLint location, GLuint v0, GLuint v1) {
+  driver_->fn.glUniform2uiFn(location, v0, v1);
+}
+
+void GLApiBase::glUniform2uivFn(GLint location,
+                                GLsizei count,
+                                const GLuint* v) {
+  driver_->fn.glUniform2uivFn(location, count, v);
+}
+
+void GLApiBase::glUniform3fFn(GLint location, GLfloat x, GLfloat y, GLfloat z) {
+  driver_->fn.glUniform3fFn(location, x, y, z);
+}
+
+void GLApiBase::glUniform3fvFn(GLint location,
+                               GLsizei count,
+                               const GLfloat* v) {
+  driver_->fn.glUniform3fvFn(location, count, v);
+}
+
+void GLApiBase::glUniform3iFn(GLint location, GLint x, GLint y, GLint z) {
+  driver_->fn.glUniform3iFn(location, x, y, z);
+}
+
+void GLApiBase::glUniform3ivFn(GLint location, GLsizei count, const GLint* v) {
+  driver_->fn.glUniform3ivFn(location, count, v);
+}
+
+void GLApiBase::glUniform3uiFn(GLint location,
+                               GLuint v0,
+                               GLuint v1,
+                               GLuint v2) {
+  driver_->fn.glUniform3uiFn(location, v0, v1, v2);
+}
+
+void GLApiBase::glUniform3uivFn(GLint location,
+                                GLsizei count,
+                                const GLuint* v) {
+  driver_->fn.glUniform3uivFn(location, count, v);
+}
+
+void GLApiBase::glUniform4fFn(GLint location,
+                              GLfloat x,
+                              GLfloat y,
+                              GLfloat z,
+                              GLfloat w) {
+  driver_->fn.glUniform4fFn(location, x, y, z, w);
+}
+
+void GLApiBase::glUniform4fvFn(GLint location,
+                               GLsizei count,
+                               const GLfloat* v) {
+  driver_->fn.glUniform4fvFn(location, count, v);
+}
+
+void GLApiBase::glUniform4iFn(GLint location,
+                              GLint x,
+                              GLint y,
+                              GLint z,
+                              GLint w) {
+  driver_->fn.glUniform4iFn(location, x, y, z, w);
+}
+
+void GLApiBase::glUniform4ivFn(GLint location, GLsizei count, const GLint* v) {
+  driver_->fn.glUniform4ivFn(location, count, v);
+}
+
+void GLApiBase::glUniform4uiFn(GLint location,
+                               GLuint v0,
+                               GLuint v1,
+                               GLuint v2,
+                               GLuint v3) {
+  driver_->fn.glUniform4uiFn(location, v0, v1, v2, v3);
+}
+
+void GLApiBase::glUniform4uivFn(GLint location,
+                                GLsizei count,
+                                const GLuint* v) {
+  driver_->fn.glUniform4uivFn(location, count, v);
+}
+
+void GLApiBase::glUniformBlockBindingFn(GLuint program,
+                                        GLuint uniformBlockIndex,
+                                        GLuint uniformBlockBinding) {
+  driver_->fn.glUniformBlockBindingFn(program, uniformBlockIndex,
+                                      uniformBlockBinding);
+}
+
+void GLApiBase::glUniformMatrix2fvFn(GLint location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLfloat* value) {
+  driver_->fn.glUniformMatrix2fvFn(location, count, transpose, value);
+}
+
+void GLApiBase::glUniformMatrix2x3fvFn(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat* value) {
+  driver_->fn.glUniformMatrix2x3fvFn(location, count, transpose, value);
+}
+
+void GLApiBase::glUniformMatrix2x4fvFn(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat* value) {
+  driver_->fn.glUniformMatrix2x4fvFn(location, count, transpose, value);
+}
+
+void GLApiBase::glUniformMatrix3fvFn(GLint location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLfloat* value) {
+  driver_->fn.glUniformMatrix3fvFn(location, count, transpose, value);
+}
+
+void GLApiBase::glUniformMatrix3x2fvFn(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat* value) {
+  driver_->fn.glUniformMatrix3x2fvFn(location, count, transpose, value);
+}
+
+void GLApiBase::glUniformMatrix3x4fvFn(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat* value) {
+  driver_->fn.glUniformMatrix3x4fvFn(location, count, transpose, value);
+}
+
+void GLApiBase::glUniformMatrix4fvFn(GLint location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLfloat* value) {
+  driver_->fn.glUniformMatrix4fvFn(location, count, transpose, value);
+}
+
+void GLApiBase::glUniformMatrix4x2fvFn(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat* value) {
+  driver_->fn.glUniformMatrix4x2fvFn(location, count, transpose, value);
+}
+
+void GLApiBase::glUniformMatrix4x3fvFn(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat* value) {
+  driver_->fn.glUniformMatrix4x3fvFn(location, count, transpose, value);
+}
+
+GLboolean GLApiBase::glUnmapBufferFn(GLenum target) {
+  return driver_->fn.glUnmapBufferFn(target);
+}
+
+void GLApiBase::glUseProgramFn(GLuint program) {
+  driver_->fn.glUseProgramFn(program);
+}
+
+void GLApiBase::glValidateProgramFn(GLuint program) {
+  driver_->fn.glValidateProgramFn(program);
+}
+
+void GLApiBase::glVertexAttrib1fFn(GLuint indx, GLfloat x) {
+  driver_->fn.glVertexAttrib1fFn(indx, x);
+}
+
+void GLApiBase::glVertexAttrib1fvFn(GLuint indx, const GLfloat* values) {
+  driver_->fn.glVertexAttrib1fvFn(indx, values);
+}
+
+void GLApiBase::glVertexAttrib2fFn(GLuint indx, GLfloat x, GLfloat y) {
+  driver_->fn.glVertexAttrib2fFn(indx, x, y);
+}
+
+void GLApiBase::glVertexAttrib2fvFn(GLuint indx, const GLfloat* values) {
+  driver_->fn.glVertexAttrib2fvFn(indx, values);
+}
+
+void GLApiBase::glVertexAttrib3fFn(GLuint indx,
+                                   GLfloat x,
+                                   GLfloat y,
+                                   GLfloat z) {
+  driver_->fn.glVertexAttrib3fFn(indx, x, y, z);
+}
+
+void GLApiBase::glVertexAttrib3fvFn(GLuint indx, const GLfloat* values) {
+  driver_->fn.glVertexAttrib3fvFn(indx, values);
+}
+
+void GLApiBase::glVertexAttrib4fFn(GLuint indx,
+                                   GLfloat x,
+                                   GLfloat y,
+                                   GLfloat z,
+                                   GLfloat w) {
+  driver_->fn.glVertexAttrib4fFn(indx, x, y, z, w);
+}
+
+void GLApiBase::glVertexAttrib4fvFn(GLuint indx, const GLfloat* values) {
+  driver_->fn.glVertexAttrib4fvFn(indx, values);
+}
+
+void GLApiBase::glVertexAttribDivisorANGLEFn(GLuint index, GLuint divisor) {
+  driver_->fn.glVertexAttribDivisorANGLEFn(index, divisor);
+}
+
+void GLApiBase::glVertexAttribI4iFn(GLuint indx,
+                                    GLint x,
+                                    GLint y,
+                                    GLint z,
+                                    GLint w) {
+  driver_->fn.glVertexAttribI4iFn(indx, x, y, z, w);
+}
+
+void GLApiBase::glVertexAttribI4ivFn(GLuint indx, const GLint* values) {
+  driver_->fn.glVertexAttribI4ivFn(indx, values);
+}
+
+void GLApiBase::glVertexAttribI4uiFn(GLuint indx,
+                                     GLuint x,
+                                     GLuint y,
+                                     GLuint z,
+                                     GLuint w) {
+  driver_->fn.glVertexAttribI4uiFn(indx, x, y, z, w);
+}
+
+void GLApiBase::glVertexAttribI4uivFn(GLuint indx, const GLuint* values) {
+  driver_->fn.glVertexAttribI4uivFn(indx, values);
+}
+
+void GLApiBase::glVertexAttribIPointerFn(GLuint indx,
+                                         GLint size,
+                                         GLenum type,
+                                         GLsizei stride,
+                                         const void* ptr) {
+  driver_->fn.glVertexAttribIPointerFn(indx, size, type, stride, ptr);
+}
+
+void GLApiBase::glVertexAttribPointerFn(GLuint indx,
+                                        GLint size,
+                                        GLenum type,
+                                        GLboolean normalized,
+                                        GLsizei stride,
+                                        const void* ptr) {
+  driver_->fn.glVertexAttribPointerFn(indx, size, type, normalized, stride,
+                                      ptr);
+}
+
+void GLApiBase::glViewportFn(GLint x, GLint y, GLsizei width, GLsizei height) {
+  driver_->fn.glViewportFn(x, y, width, height);
+}
+
+GLenum GLApiBase::glWaitSyncFn(GLsync sync,
+                               GLbitfield flags,
+                               GLuint64 timeout) {
+  return driver_->fn.glWaitSyncFn(sync, flags, timeout);
+}
+
+void TraceGLApi::glActiveTextureFn(GLenum texture) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glActiveTexture")
+  gl_api_->glActiveTextureFn(texture);
+}
+
+void TraceGLApi::glAttachShaderFn(GLuint program, GLuint shader) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glAttachShader")
+  gl_api_->glAttachShaderFn(program, shader);
+}
+
+void TraceGLApi::glBeginQueryFn(GLenum target, GLuint id) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBeginQuery")
+  gl_api_->glBeginQueryFn(target, id);
+}
+
+void TraceGLApi::glBeginQueryARBFn(GLenum target, GLuint id) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBeginQueryARB")
+  gl_api_->glBeginQueryARBFn(target, id);
+}
+
+void TraceGLApi::glBeginTransformFeedbackFn(GLenum primitiveMode) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBeginTransformFeedback")
+  gl_api_->glBeginTransformFeedbackFn(primitiveMode);
+}
+
+void TraceGLApi::glBindAttribLocationFn(GLuint program,
+                                        GLuint index,
+                                        const char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindAttribLocation")
+  gl_api_->glBindAttribLocationFn(program, index, name);
+}
+
+void TraceGLApi::glBindBufferFn(GLenum target, GLuint buffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindBuffer")
+  gl_api_->glBindBufferFn(target, buffer);
+}
+
+void TraceGLApi::glBindBufferBaseFn(GLenum target,
+                                    GLuint index,
+                                    GLuint buffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindBufferBase")
+  gl_api_->glBindBufferBaseFn(target, index, buffer);
+}
+
+void TraceGLApi::glBindBufferRangeFn(GLenum target,
+                                     GLuint index,
+                                     GLuint buffer,
+                                     GLintptr offset,
+                                     GLsizeiptr size) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindBufferRange")
+  gl_api_->glBindBufferRangeFn(target, index, buffer, offset, size);
+}
+
+void TraceGLApi::glBindFragDataLocationFn(GLuint program,
+                                          GLuint colorNumber,
+                                          const char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindFragDataLocation")
+  gl_api_->glBindFragDataLocationFn(program, colorNumber, name);
+}
+
+void TraceGLApi::glBindFragDataLocationIndexedFn(GLuint program,
+                                                 GLuint colorNumber,
+                                                 GLuint index,
+                                                 const char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glBindFragDataLocationIndexed")
+  gl_api_->glBindFragDataLocationIndexedFn(program, colorNumber, index, name);
+}
+
+void TraceGLApi::glBindFramebufferEXTFn(GLenum target, GLuint framebuffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindFramebufferEXT")
+  gl_api_->glBindFramebufferEXTFn(target, framebuffer);
+}
+
+void TraceGLApi::glBindRenderbufferEXTFn(GLenum target, GLuint renderbuffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindRenderbufferEXT")
+  gl_api_->glBindRenderbufferEXTFn(target, renderbuffer);
+}
+
+void TraceGLApi::glBindSamplerFn(GLuint unit, GLuint sampler) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindSampler")
+  gl_api_->glBindSamplerFn(unit, sampler);
+}
+
+void TraceGLApi::glBindTextureFn(GLenum target, GLuint texture) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindTexture")
+  gl_api_->glBindTextureFn(target, texture);
+}
+
+void TraceGLApi::glBindTransformFeedbackFn(GLenum target, GLuint id) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindTransformFeedback")
+  gl_api_->glBindTransformFeedbackFn(target, id);
+}
+
+void TraceGLApi::glBindVertexArrayOESFn(GLuint array) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBindVertexArrayOES")
+  gl_api_->glBindVertexArrayOESFn(array);
+}
+
+void TraceGLApi::glBlendBarrierKHRFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendBarrierKHR")
+  gl_api_->glBlendBarrierKHRFn();
+}
+
+void TraceGLApi::glBlendColorFn(GLclampf red,
+                                GLclampf green,
+                                GLclampf blue,
+                                GLclampf alpha) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendColor")
+  gl_api_->glBlendColorFn(red, green, blue, alpha);
+}
+
+void TraceGLApi::glBlendEquationFn(GLenum mode) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendEquation")
+  gl_api_->glBlendEquationFn(mode);
+}
+
+void TraceGLApi::glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendEquationSeparate")
+  gl_api_->glBlendEquationSeparateFn(modeRGB, modeAlpha);
+}
+
+void TraceGLApi::glBlendFuncFn(GLenum sfactor, GLenum dfactor) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendFunc")
+  gl_api_->glBlendFuncFn(sfactor, dfactor);
+}
+
+void TraceGLApi::glBlendFuncSeparateFn(GLenum srcRGB,
+                                       GLenum dstRGB,
+                                       GLenum srcAlpha,
+                                       GLenum dstAlpha) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendFuncSeparate")
+  gl_api_->glBlendFuncSeparateFn(srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+void TraceGLApi::glBlitFramebufferFn(GLint srcX0,
+                                     GLint srcY0,
+                                     GLint srcX1,
+                                     GLint srcY1,
+                                     GLint dstX0,
+                                     GLint dstY0,
+                                     GLint dstX1,
+                                     GLint dstY1,
+                                     GLbitfield mask,
+                                     GLenum filter) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlitFramebuffer")
+  gl_api_->glBlitFramebufferFn(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1,
+                               dstY1, mask, filter);
+}
+
+void TraceGLApi::glBlitFramebufferANGLEFn(GLint srcX0,
+                                          GLint srcY0,
+                                          GLint srcX1,
+                                          GLint srcY1,
+                                          GLint dstX0,
+                                          GLint dstY0,
+                                          GLint dstX1,
+                                          GLint dstY1,
+                                          GLbitfield mask,
+                                          GLenum filter) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlitFramebufferANGLE")
+  gl_api_->glBlitFramebufferANGLEFn(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                    dstX1, dstY1, mask, filter);
+}
+
+void TraceGLApi::glBlitFramebufferEXTFn(GLint srcX0,
+                                        GLint srcY0,
+                                        GLint srcX1,
+                                        GLint srcY1,
+                                        GLint dstX0,
+                                        GLint dstY0,
+                                        GLint dstX1,
+                                        GLint dstY1,
+                                        GLbitfield mask,
+                                        GLenum filter) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlitFramebufferEXT")
+  gl_api_->glBlitFramebufferEXTFn(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                  dstX1, dstY1, mask, filter);
+}
+
+void TraceGLApi::glBufferDataFn(GLenum target,
+                                GLsizeiptr size,
+                                const void* data,
+                                GLenum usage) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBufferData")
+  gl_api_->glBufferDataFn(target, size, data, usage);
+}
+
+void TraceGLApi::glBufferSubDataFn(GLenum target,
+                                   GLintptr offset,
+                                   GLsizeiptr size,
+                                   const void* data) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBufferSubData")
+  gl_api_->glBufferSubDataFn(target, offset, size, data);
+}
+
+GLenum TraceGLApi::glCheckFramebufferStatusEXTFn(GLenum target) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glCheckFramebufferStatusEXT")
+  return gl_api_->glCheckFramebufferStatusEXTFn(target);
+}
+
+void TraceGLApi::glClearFn(GLbitfield mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClear")
+  gl_api_->glClearFn(mask);
+}
+
+void TraceGLApi::glClearBufferfiFn(GLenum buffer,
+                                   GLint drawbuffer,
+                                   const GLfloat depth,
+                                   GLint stencil) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClearBufferfi")
+  gl_api_->glClearBufferfiFn(buffer, drawbuffer, depth, stencil);
+}
+
+void TraceGLApi::glClearBufferfvFn(GLenum buffer,
+                                   GLint drawbuffer,
+                                   const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClearBufferfv")
+  gl_api_->glClearBufferfvFn(buffer, drawbuffer, value);
+}
+
+void TraceGLApi::glClearBufferivFn(GLenum buffer,
+                                   GLint drawbuffer,
+                                   const GLint* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClearBufferiv")
+  gl_api_->glClearBufferivFn(buffer, drawbuffer, value);
+}
+
+void TraceGLApi::glClearBufferuivFn(GLenum buffer,
+                                    GLint drawbuffer,
+                                    const GLuint* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClearBufferuiv")
+  gl_api_->glClearBufferuivFn(buffer, drawbuffer, value);
+}
+
+void TraceGLApi::glClearColorFn(GLclampf red,
+                                GLclampf green,
+                                GLclampf blue,
+                                GLclampf alpha) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClearColor")
+  gl_api_->glClearColorFn(red, green, blue, alpha);
+}
+
+void TraceGLApi::glClearDepthFn(GLclampd depth) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClearDepth")
+  gl_api_->glClearDepthFn(depth);
+}
+
+void TraceGLApi::glClearDepthfFn(GLclampf depth) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClearDepthf")
+  gl_api_->glClearDepthfFn(depth);
+}
+
+void TraceGLApi::glClearStencilFn(GLint s) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClearStencil")
+  gl_api_->glClearStencilFn(s);
+}
+
+GLenum TraceGLApi::glClientWaitSyncFn(GLsync sync,
+                                      GLbitfield flags,
+                                      GLuint64 timeout) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glClientWaitSync")
+  return gl_api_->glClientWaitSyncFn(sync, flags, timeout);
+}
+
+void TraceGLApi::glColorMaskFn(GLboolean red,
+                               GLboolean green,
+                               GLboolean blue,
+                               GLboolean alpha) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glColorMask")
+  gl_api_->glColorMaskFn(red, green, blue, alpha);
+}
+
+void TraceGLApi::glCompileShaderFn(GLuint shader) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCompileShader")
+  gl_api_->glCompileShaderFn(shader);
+}
+
+void TraceGLApi::glCompressedTexImage2DFn(GLenum target,
+                                          GLint level,
+                                          GLenum internalformat,
+                                          GLsizei width,
+                                          GLsizei height,
+                                          GLint border,
+                                          GLsizei imageSize,
+                                          const void* data) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCompressedTexImage2D")
+  gl_api_->glCompressedTexImage2DFn(target, level, internalformat, width,
+                                    height, border, imageSize, data);
+}
+
+void TraceGLApi::glCompressedTexImage3DFn(GLenum target,
+                                          GLint level,
+                                          GLenum internalformat,
+                                          GLsizei width,
+                                          GLsizei height,
+                                          GLsizei depth,
+                                          GLint border,
+                                          GLsizei imageSize,
+                                          const void* data) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCompressedTexImage3D")
+  gl_api_->glCompressedTexImage3DFn(target, level, internalformat, width,
+                                    height, depth, border, imageSize, data);
+}
+
+void TraceGLApi::glCompressedTexSubImage2DFn(GLenum target,
+                                             GLint level,
+                                             GLint xoffset,
+                                             GLint yoffset,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLenum format,
+                                             GLsizei imageSize,
+                                             const void* data) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCompressedTexSubImage2D")
+  gl_api_->glCompressedTexSubImage2DFn(target, level, xoffset, yoffset, width,
+                                       height, format, imageSize, data);
+}
+
+void TraceGLApi::glCopyBufferSubDataFn(GLenum readTarget,
+                                       GLenum writeTarget,
+                                       GLintptr readOffset,
+                                       GLintptr writeOffset,
+                                       GLsizeiptr size) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCopyBufferSubData")
+  gl_api_->glCopyBufferSubDataFn(readTarget, writeTarget, readOffset,
+                                 writeOffset, size);
+}
+
+void TraceGLApi::glCopyTexImage2DFn(GLenum target,
+                                    GLint level,
+                                    GLenum internalformat,
+                                    GLint x,
+                                    GLint y,
+                                    GLsizei width,
+                                    GLsizei height,
+                                    GLint border) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCopyTexImage2D")
+  gl_api_->glCopyTexImage2DFn(target, level, internalformat, x, y, width,
+                              height, border);
+}
+
+void TraceGLApi::glCopyTexSubImage2DFn(GLenum target,
+                                       GLint level,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint x,
+                                       GLint y,
+                                       GLsizei width,
+                                       GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCopyTexSubImage2D")
+  gl_api_->glCopyTexSubImage2DFn(target, level, xoffset, yoffset, x, y, width,
+                                 height);
+}
+
+void TraceGLApi::glCopyTexSubImage3DFn(GLenum target,
+                                       GLint level,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint zoffset,
+                                       GLint x,
+                                       GLint y,
+                                       GLsizei width,
+                                       GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCopyTexSubImage3D")
+  gl_api_->glCopyTexSubImage3DFn(target, level, xoffset, yoffset, zoffset, x, y,
+                                 width, height);
+}
+
+GLuint TraceGLApi::glCreateProgramFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCreateProgram")
+  return gl_api_->glCreateProgramFn();
+}
+
+GLuint TraceGLApi::glCreateShaderFn(GLenum type) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCreateShader")
+  return gl_api_->glCreateShaderFn(type);
+}
+
+void TraceGLApi::glCullFaceFn(GLenum mode) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCullFace")
+  gl_api_->glCullFaceFn(mode);
+}
+
+void TraceGLApi::glDeleteBuffersARBFn(GLsizei n, const GLuint* buffers) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteBuffersARB")
+  gl_api_->glDeleteBuffersARBFn(n, buffers);
+}
+
+void TraceGLApi::glDeleteFencesAPPLEFn(GLsizei n, const GLuint* fences) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteFencesAPPLE")
+  gl_api_->glDeleteFencesAPPLEFn(n, fences);
+}
+
+void TraceGLApi::glDeleteFencesNVFn(GLsizei n, const GLuint* fences) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteFencesNV")
+  gl_api_->glDeleteFencesNVFn(n, fences);
+}
+
+void TraceGLApi::glDeleteFramebuffersEXTFn(GLsizei n,
+                                           const GLuint* framebuffers) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteFramebuffersEXT")
+  gl_api_->glDeleteFramebuffersEXTFn(n, framebuffers);
+}
+
+void TraceGLApi::glDeleteProgramFn(GLuint program) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteProgram")
+  gl_api_->glDeleteProgramFn(program);
+}
+
+void TraceGLApi::glDeleteQueriesFn(GLsizei n, const GLuint* ids) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteQueries")
+  gl_api_->glDeleteQueriesFn(n, ids);
+}
+
+void TraceGLApi::glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteQueriesARB")
+  gl_api_->glDeleteQueriesARBFn(n, ids);
+}
+
+void TraceGLApi::glDeleteRenderbuffersEXTFn(GLsizei n,
+                                            const GLuint* renderbuffers) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteRenderbuffersEXT")
+  gl_api_->glDeleteRenderbuffersEXTFn(n, renderbuffers);
+}
+
+void TraceGLApi::glDeleteSamplersFn(GLsizei n, const GLuint* samplers) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteSamplers")
+  gl_api_->glDeleteSamplersFn(n, samplers);
+}
+
+void TraceGLApi::glDeleteShaderFn(GLuint shader) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteShader")
+  gl_api_->glDeleteShaderFn(shader);
+}
+
+void TraceGLApi::glDeleteSyncFn(GLsync sync) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteSync")
+  gl_api_->glDeleteSyncFn(sync);
+}
+
+void TraceGLApi::glDeleteTexturesFn(GLsizei n, const GLuint* textures) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteTextures")
+  gl_api_->glDeleteTexturesFn(n, textures);
+}
+
+void TraceGLApi::glDeleteTransformFeedbacksFn(GLsizei n, const GLuint* ids) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteTransformFeedbacks")
+  gl_api_->glDeleteTransformFeedbacksFn(n, ids);
+}
+
+void TraceGLApi::glDeleteVertexArraysOESFn(GLsizei n, const GLuint* arrays) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteVertexArraysOES")
+  gl_api_->glDeleteVertexArraysOESFn(n, arrays);
+}
+
+void TraceGLApi::glDepthFuncFn(GLenum func) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDepthFunc")
+  gl_api_->glDepthFuncFn(func);
+}
+
+void TraceGLApi::glDepthMaskFn(GLboolean flag) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDepthMask")
+  gl_api_->glDepthMaskFn(flag);
+}
+
+void TraceGLApi::glDepthRangeFn(GLclampd zNear, GLclampd zFar) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDepthRange")
+  gl_api_->glDepthRangeFn(zNear, zFar);
+}
+
+void TraceGLApi::glDepthRangefFn(GLclampf zNear, GLclampf zFar) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDepthRangef")
+  gl_api_->glDepthRangefFn(zNear, zFar);
+}
+
+void TraceGLApi::glDetachShaderFn(GLuint program, GLuint shader) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDetachShader")
+  gl_api_->glDetachShaderFn(program, shader);
+}
+
+void TraceGLApi::glDisableFn(GLenum cap) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDisable")
+  gl_api_->glDisableFn(cap);
+}
+
+void TraceGLApi::glDisableVertexAttribArrayFn(GLuint index) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDisableVertexAttribArray")
+  gl_api_->glDisableVertexAttribArrayFn(index);
+}
+
+void TraceGLApi::glDiscardFramebufferEXTFn(GLenum target,
+                                           GLsizei numAttachments,
+                                           const GLenum* attachments) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDiscardFramebufferEXT")
+  gl_api_->glDiscardFramebufferEXTFn(target, numAttachments, attachments);
+}
+
+void TraceGLApi::glDrawArraysFn(GLenum mode, GLint first, GLsizei count) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDrawArrays")
+  gl_api_->glDrawArraysFn(mode, first, count);
+}
+
+void TraceGLApi::glDrawArraysInstancedANGLEFn(GLenum mode,
+                                              GLint first,
+                                              GLsizei count,
+                                              GLsizei primcount) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDrawArraysInstancedANGLE")
+  gl_api_->glDrawArraysInstancedANGLEFn(mode, first, count, primcount);
+}
+
+void TraceGLApi::glDrawBufferFn(GLenum mode) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDrawBuffer")
+  gl_api_->glDrawBufferFn(mode);
+}
+
+void TraceGLApi::glDrawBuffersARBFn(GLsizei n, const GLenum* bufs) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDrawBuffersARB")
+  gl_api_->glDrawBuffersARBFn(n, bufs);
+}
+
+void TraceGLApi::glDrawElementsFn(GLenum mode,
+                                  GLsizei count,
+                                  GLenum type,
+                                  const void* indices) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDrawElements")
+  gl_api_->glDrawElementsFn(mode, count, type, indices);
+}
+
+void TraceGLApi::glDrawElementsInstancedANGLEFn(GLenum mode,
+                                                GLsizei count,
+                                                GLenum type,
+                                                const void* indices,
+                                                GLsizei primcount) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glDrawElementsInstancedANGLE")
+  gl_api_->glDrawElementsInstancedANGLEFn(mode, count, type, indices,
+                                          primcount);
+}
+
+void TraceGLApi::glDrawRangeElementsFn(GLenum mode,
+                                       GLuint start,
+                                       GLuint end,
+                                       GLsizei count,
+                                       GLenum type,
+                                       const void* indices) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDrawRangeElements")
+  gl_api_->glDrawRangeElementsFn(mode, start, end, count, type, indices);
+}
+
+void TraceGLApi::glEGLImageTargetRenderbufferStorageOESFn(GLenum target,
+                                                          GLeglImageOES image) {
+  TRACE_EVENT_BINARY_EFFICIENT0(
+      "gpu", "TraceGLAPI::glEGLImageTargetRenderbufferStorageOES")
+  gl_api_->glEGLImageTargetRenderbufferStorageOESFn(target, image);
+}
+
+void TraceGLApi::glEGLImageTargetTexture2DOESFn(GLenum target,
+                                                GLeglImageOES image) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glEGLImageTargetTexture2DOES")
+  gl_api_->glEGLImageTargetTexture2DOESFn(target, image);
+}
+
+void TraceGLApi::glEnableFn(GLenum cap) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEnable")
+  gl_api_->glEnableFn(cap);
+}
+
+void TraceGLApi::glEnableVertexAttribArrayFn(GLuint index) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEnableVertexAttribArray")
+  gl_api_->glEnableVertexAttribArrayFn(index);
+}
+
+void TraceGLApi::glEndQueryFn(GLenum target) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEndQuery")
+  gl_api_->glEndQueryFn(target);
+}
+
+void TraceGLApi::glEndQueryARBFn(GLenum target) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEndQueryARB")
+  gl_api_->glEndQueryARBFn(target);
+}
+
+void TraceGLApi::glEndTransformFeedbackFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEndTransformFeedback")
+  gl_api_->glEndTransformFeedbackFn();
+}
+
+GLsync TraceGLApi::glFenceSyncFn(GLenum condition, GLbitfield flags) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFenceSync")
+  return gl_api_->glFenceSyncFn(condition, flags);
+}
+
+void TraceGLApi::glFinishFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFinish")
+  gl_api_->glFinishFn();
+}
+
+void TraceGLApi::glFinishFenceAPPLEFn(GLuint fence) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFinishFenceAPPLE")
+  gl_api_->glFinishFenceAPPLEFn(fence);
+}
+
+void TraceGLApi::glFinishFenceNVFn(GLuint fence) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFinishFenceNV")
+  gl_api_->glFinishFenceNVFn(fence);
+}
+
+void TraceGLApi::glFlushFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFlush")
+  gl_api_->glFlushFn();
+}
+
+void TraceGLApi::glFlushMappedBufferRangeFn(GLenum target,
+                                            GLintptr offset,
+                                            GLsizeiptr length) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFlushMappedBufferRange")
+  gl_api_->glFlushMappedBufferRangeFn(target, offset, length);
+}
+
+void TraceGLApi::glFramebufferRenderbufferEXTFn(GLenum target,
+                                                GLenum attachment,
+                                                GLenum renderbuffertarget,
+                                                GLuint renderbuffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glFramebufferRenderbufferEXT")
+  gl_api_->glFramebufferRenderbufferEXTFn(target, attachment,
+                                          renderbuffertarget, renderbuffer);
+}
+
+void TraceGLApi::glFramebufferTexture2DEXTFn(GLenum target,
+                                             GLenum attachment,
+                                             GLenum textarget,
+                                             GLuint texture,
+                                             GLint level) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFramebufferTexture2DEXT")
+  gl_api_->glFramebufferTexture2DEXTFn(target, attachment, textarget, texture,
+                                       level);
+}
+
+void TraceGLApi::glFramebufferTexture2DMultisampleEXTFn(GLenum target,
+                                                        GLenum attachment,
+                                                        GLenum textarget,
+                                                        GLuint texture,
+                                                        GLint level,
+                                                        GLsizei samples) {
+  TRACE_EVENT_BINARY_EFFICIENT0(
+      "gpu", "TraceGLAPI::glFramebufferTexture2DMultisampleEXT")
+  gl_api_->glFramebufferTexture2DMultisampleEXTFn(target, attachment, textarget,
+                                                  texture, level, samples);
+}
+
+void TraceGLApi::glFramebufferTexture2DMultisampleIMGFn(GLenum target,
+                                                        GLenum attachment,
+                                                        GLenum textarget,
+                                                        GLuint texture,
+                                                        GLint level,
+                                                        GLsizei samples) {
+  TRACE_EVENT_BINARY_EFFICIENT0(
+      "gpu", "TraceGLAPI::glFramebufferTexture2DMultisampleIMG")
+  gl_api_->glFramebufferTexture2DMultisampleIMGFn(target, attachment, textarget,
+                                                  texture, level, samples);
+}
+
+void TraceGLApi::glFramebufferTextureLayerFn(GLenum target,
+                                             GLenum attachment,
+                                             GLuint texture,
+                                             GLint level,
+                                             GLint layer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFramebufferTextureLayer")
+  gl_api_->glFramebufferTextureLayerFn(target, attachment, texture, level,
+                                       layer);
+}
+
+void TraceGLApi::glFrontFaceFn(GLenum mode) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glFrontFace")
+  gl_api_->glFrontFaceFn(mode);
+}
+
+void TraceGLApi::glGenBuffersARBFn(GLsizei n, GLuint* buffers) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenBuffersARB")
+  gl_api_->glGenBuffersARBFn(n, buffers);
+}
+
+void TraceGLApi::glGenerateMipmapEXTFn(GLenum target) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenerateMipmapEXT")
+  gl_api_->glGenerateMipmapEXTFn(target);
+}
+
+void TraceGLApi::glGenFencesAPPLEFn(GLsizei n, GLuint* fences) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenFencesAPPLE")
+  gl_api_->glGenFencesAPPLEFn(n, fences);
+}
+
+void TraceGLApi::glGenFencesNVFn(GLsizei n, GLuint* fences) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenFencesNV")
+  gl_api_->glGenFencesNVFn(n, fences);
+}
+
+void TraceGLApi::glGenFramebuffersEXTFn(GLsizei n, GLuint* framebuffers) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenFramebuffersEXT")
+  gl_api_->glGenFramebuffersEXTFn(n, framebuffers);
+}
+
+void TraceGLApi::glGenQueriesFn(GLsizei n, GLuint* ids) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenQueries")
+  gl_api_->glGenQueriesFn(n, ids);
+}
+
+void TraceGLApi::glGenQueriesARBFn(GLsizei n, GLuint* ids) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenQueriesARB")
+  gl_api_->glGenQueriesARBFn(n, ids);
+}
+
+void TraceGLApi::glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenRenderbuffersEXT")
+  gl_api_->glGenRenderbuffersEXTFn(n, renderbuffers);
+}
+
+void TraceGLApi::glGenSamplersFn(GLsizei n, GLuint* samplers) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenSamplers")
+  gl_api_->glGenSamplersFn(n, samplers);
+}
+
+void TraceGLApi::glGenTexturesFn(GLsizei n, GLuint* textures) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenTextures")
+  gl_api_->glGenTexturesFn(n, textures);
+}
+
+void TraceGLApi::glGenTransformFeedbacksFn(GLsizei n, GLuint* ids) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenTransformFeedbacks")
+  gl_api_->glGenTransformFeedbacksFn(n, ids);
+}
+
+void TraceGLApi::glGenVertexArraysOESFn(GLsizei n, GLuint* arrays) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenVertexArraysOES")
+  gl_api_->glGenVertexArraysOESFn(n, arrays);
+}
+
+void TraceGLApi::glGetActiveAttribFn(GLuint program,
+                                     GLuint index,
+                                     GLsizei bufsize,
+                                     GLsizei* length,
+                                     GLint* size,
+                                     GLenum* type,
+                                     char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetActiveAttrib")
+  gl_api_->glGetActiveAttribFn(program, index, bufsize, length, size, type,
+                               name);
+}
+
+void TraceGLApi::glGetActiveUniformFn(GLuint program,
+                                      GLuint index,
+                                      GLsizei bufsize,
+                                      GLsizei* length,
+                                      GLint* size,
+                                      GLenum* type,
+                                      char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetActiveUniform")
+  gl_api_->glGetActiveUniformFn(program, index, bufsize, length, size, type,
+                                name);
+}
+
+void TraceGLApi::glGetActiveUniformBlockivFn(GLuint program,
+                                             GLuint uniformBlockIndex,
+                                             GLenum pname,
+                                             GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetActiveUniformBlockiv")
+  gl_api_->glGetActiveUniformBlockivFn(program, uniformBlockIndex, pname,
+                                       params);
+}
+
+void TraceGLApi::glGetActiveUniformBlockNameFn(GLuint program,
+                                               GLuint uniformBlockIndex,
+                                               GLsizei bufSize,
+                                               GLsizei* length,
+                                               char* uniformBlockName) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glGetActiveUniformBlockName")
+  gl_api_->glGetActiveUniformBlockNameFn(program, uniformBlockIndex, bufSize,
+                                         length, uniformBlockName);
+}
+
+void TraceGLApi::glGetActiveUniformsivFn(GLuint program,
+                                         GLsizei uniformCount,
+                                         const GLuint* uniformIndices,
+                                         GLenum pname,
+                                         GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetActiveUniformsiv")
+  gl_api_->glGetActiveUniformsivFn(program, uniformCount, uniformIndices, pname,
+                                   params);
+}
+
+void TraceGLApi::glGetAttachedShadersFn(GLuint program,
+                                        GLsizei maxcount,
+                                        GLsizei* count,
+                                        GLuint* shaders) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetAttachedShaders")
+  gl_api_->glGetAttachedShadersFn(program, maxcount, count, shaders);
+}
+
+GLint TraceGLApi::glGetAttribLocationFn(GLuint program, const char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetAttribLocation")
+  return gl_api_->glGetAttribLocationFn(program, name);
+}
+
+void TraceGLApi::glGetBooleanvFn(GLenum pname, GLboolean* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetBooleanv")
+  gl_api_->glGetBooleanvFn(pname, params);
+}
+
+void TraceGLApi::glGetBufferParameterivFn(GLenum target,
+                                          GLenum pname,
+                                          GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetBufferParameteriv")
+  gl_api_->glGetBufferParameterivFn(target, pname, params);
+}
+
+GLenum TraceGLApi::glGetErrorFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetError")
+  return gl_api_->glGetErrorFn();
+}
+
+void TraceGLApi::glGetFenceivNVFn(GLuint fence, GLenum pname, GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetFenceivNV")
+  gl_api_->glGetFenceivNVFn(fence, pname, params);
+}
+
+void TraceGLApi::glGetFloatvFn(GLenum pname, GLfloat* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetFloatv")
+  gl_api_->glGetFloatvFn(pname, params);
+}
+
+GLint TraceGLApi::glGetFragDataLocationFn(GLuint program, const char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetFragDataLocation")
+  return gl_api_->glGetFragDataLocationFn(program, name);
+}
+
+void TraceGLApi::glGetFramebufferAttachmentParameterivEXTFn(GLenum target,
+                                                            GLenum attachment,
+                                                            GLenum pname,
+                                                            GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0(
+      "gpu", "TraceGLAPI::glGetFramebufferAttachmentParameterivEXT")
+  gl_api_->glGetFramebufferAttachmentParameterivEXTFn(target, attachment, pname,
+                                                      params);
+}
+
+GLenum TraceGLApi::glGetGraphicsResetStatusARBFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glGetGraphicsResetStatusARB")
+  return gl_api_->glGetGraphicsResetStatusARBFn();
+}
+
+void TraceGLApi::glGetInteger64i_vFn(GLenum target,
+                                     GLuint index,
+                                     GLint64* data) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetInteger64i_v")
+  gl_api_->glGetInteger64i_vFn(target, index, data);
+}
+
+void TraceGLApi::glGetInteger64vFn(GLenum pname, GLint64* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetInteger64v")
+  gl_api_->glGetInteger64vFn(pname, params);
+}
+
+void TraceGLApi::glGetIntegeri_vFn(GLenum target, GLuint index, GLint* data) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetIntegeri_v")
+  gl_api_->glGetIntegeri_vFn(target, index, data);
+}
+
+void TraceGLApi::glGetIntegervFn(GLenum pname, GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetIntegerv")
+  gl_api_->glGetIntegervFn(pname, params);
+}
+
+void TraceGLApi::glGetInternalformativFn(GLenum target,
+                                         GLenum internalformat,
+                                         GLenum pname,
+                                         GLsizei bufSize,
+                                         GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetInternalformativ")
+  gl_api_->glGetInternalformativFn(target, internalformat, pname, bufSize,
+                                   params);
+}
+
+void TraceGLApi::glGetProgramBinaryFn(GLuint program,
+                                      GLsizei bufSize,
+                                      GLsizei* length,
+                                      GLenum* binaryFormat,
+                                      GLvoid* binary) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetProgramBinary")
+  gl_api_->glGetProgramBinaryFn(program, bufSize, length, binaryFormat, binary);
+}
+
+void TraceGLApi::glGetProgramInfoLogFn(GLuint program,
+                                       GLsizei bufsize,
+                                       GLsizei* length,
+                                       char* infolog) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetProgramInfoLog")
+  gl_api_->glGetProgramInfoLogFn(program, bufsize, length, infolog);
+}
+
+void TraceGLApi::glGetProgramivFn(GLuint program, GLenum pname, GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetProgramiv")
+  gl_api_->glGetProgramivFn(program, pname, params);
+}
+
+void TraceGLApi::glGetQueryivFn(GLenum target, GLenum pname, GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryiv")
+  gl_api_->glGetQueryivFn(target, pname, params);
+}
+
+void TraceGLApi::glGetQueryivARBFn(GLenum target, GLenum pname, GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryivARB")
+  gl_api_->glGetQueryivARBFn(target, pname, params);
+}
+
+void TraceGLApi::glGetQueryObjecti64vFn(GLuint id,
+                                        GLenum pname,
+                                        GLint64* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryObjecti64v")
+  gl_api_->glGetQueryObjecti64vFn(id, pname, params);
+}
+
+void TraceGLApi::glGetQueryObjectivFn(GLuint id, GLenum pname, GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryObjectiv")
+  gl_api_->glGetQueryObjectivFn(id, pname, params);
+}
+
+void TraceGLApi::glGetQueryObjectivARBFn(GLuint id,
+                                         GLenum pname,
+                                         GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryObjectivARB")
+  gl_api_->glGetQueryObjectivARBFn(id, pname, params);
+}
+
+void TraceGLApi::glGetQueryObjectui64vFn(GLuint id,
+                                         GLenum pname,
+                                         GLuint64* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryObjectui64v")
+  gl_api_->glGetQueryObjectui64vFn(id, pname, params);
+}
+
+void TraceGLApi::glGetQueryObjectuivFn(GLuint id,
+                                       GLenum pname,
+                                       GLuint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryObjectuiv")
+  gl_api_->glGetQueryObjectuivFn(id, pname, params);
+}
+
+void TraceGLApi::glGetQueryObjectuivARBFn(GLuint id,
+                                          GLenum pname,
+                                          GLuint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryObjectuivARB")
+  gl_api_->glGetQueryObjectuivARBFn(id, pname, params);
+}
+
+void TraceGLApi::glGetRenderbufferParameterivEXTFn(GLenum target,
+                                                   GLenum pname,
+                                                   GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glGetRenderbufferParameterivEXT")
+  gl_api_->glGetRenderbufferParameterivEXTFn(target, pname, params);
+}
+
+void TraceGLApi::glGetSamplerParameterfvFn(GLuint sampler,
+                                           GLenum pname,
+                                           GLfloat* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetSamplerParameterfv")
+  gl_api_->glGetSamplerParameterfvFn(sampler, pname, params);
+}
+
+void TraceGLApi::glGetSamplerParameterivFn(GLuint sampler,
+                                           GLenum pname,
+                                           GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetSamplerParameteriv")
+  gl_api_->glGetSamplerParameterivFn(sampler, pname, params);
+}
+
+void TraceGLApi::glGetShaderInfoLogFn(GLuint shader,
+                                      GLsizei bufsize,
+                                      GLsizei* length,
+                                      char* infolog) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetShaderInfoLog")
+  gl_api_->glGetShaderInfoLogFn(shader, bufsize, length, infolog);
+}
+
+void TraceGLApi::glGetShaderivFn(GLuint shader, GLenum pname, GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetShaderiv")
+  gl_api_->glGetShaderivFn(shader, pname, params);
+}
+
+void TraceGLApi::glGetShaderPrecisionFormatFn(GLenum shadertype,
+                                              GLenum precisiontype,
+                                              GLint* range,
+                                              GLint* precision) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetShaderPrecisionFormat")
+  gl_api_->glGetShaderPrecisionFormatFn(shadertype, precisiontype, range,
+                                        precision);
+}
+
+void TraceGLApi::glGetShaderSourceFn(GLuint shader,
+                                     GLsizei bufsize,
+                                     GLsizei* length,
+                                     char* source) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetShaderSource")
+  gl_api_->glGetShaderSourceFn(shader, bufsize, length, source);
+}
+
+const GLubyte* TraceGLApi::glGetStringFn(GLenum name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetString")
+  return gl_api_->glGetStringFn(name);
+}
+
+void TraceGLApi::glGetSyncivFn(GLsync sync,
+                               GLenum pname,
+                               GLsizei bufSize,
+                               GLsizei* length,
+                               GLint* values) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetSynciv")
+  gl_api_->glGetSyncivFn(sync, pname, bufSize, length, values);
+}
+
+void TraceGLApi::glGetTexLevelParameterfvFn(GLenum target,
+                                            GLint level,
+                                            GLenum pname,
+                                            GLfloat* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetTexLevelParameterfv")
+  gl_api_->glGetTexLevelParameterfvFn(target, level, pname, params);
+}
+
+void TraceGLApi::glGetTexLevelParameterivFn(GLenum target,
+                                            GLint level,
+                                            GLenum pname,
+                                            GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetTexLevelParameteriv")
+  gl_api_->glGetTexLevelParameterivFn(target, level, pname, params);
+}
+
+void TraceGLApi::glGetTexParameterfvFn(GLenum target,
+                                       GLenum pname,
+                                       GLfloat* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetTexParameterfv")
+  gl_api_->glGetTexParameterfvFn(target, pname, params);
+}
+
+void TraceGLApi::glGetTexParameterivFn(GLenum target,
+                                       GLenum pname,
+                                       GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetTexParameteriv")
+  gl_api_->glGetTexParameterivFn(target, pname, params);
+}
+
+void TraceGLApi::glGetTransformFeedbackVaryingFn(GLuint program,
+                                                 GLuint index,
+                                                 GLsizei bufSize,
+                                                 GLsizei* length,
+                                                 GLenum* type,
+                                                 char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glGetTransformFeedbackVarying")
+  gl_api_->glGetTransformFeedbackVaryingFn(program, index, bufSize, length,
+                                           type, name);
+}
+
+void TraceGLApi::glGetTranslatedShaderSourceANGLEFn(GLuint shader,
+                                                    GLsizei bufsize,
+                                                    GLsizei* length,
+                                                    char* source) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glGetTranslatedShaderSourceANGLE")
+  gl_api_->glGetTranslatedShaderSourceANGLEFn(shader, bufsize, length, source);
+}
+
+GLuint TraceGLApi::glGetUniformBlockIndexFn(GLuint program,
+                                            const char* uniformBlockName) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetUniformBlockIndex")
+  return gl_api_->glGetUniformBlockIndexFn(program, uniformBlockName);
+}
+
+void TraceGLApi::glGetUniformfvFn(GLuint program,
+                                  GLint location,
+                                  GLfloat* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetUniformfv")
+  gl_api_->glGetUniformfvFn(program, location, params);
+}
+
+void TraceGLApi::glGetUniformIndicesFn(GLuint program,
+                                       GLsizei uniformCount,
+                                       const char* const* uniformNames,
+                                       GLuint* uniformIndices) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetUniformIndices")
+  gl_api_->glGetUniformIndicesFn(program, uniformCount, uniformNames,
+                                 uniformIndices);
+}
+
+void TraceGLApi::glGetUniformivFn(GLuint program,
+                                  GLint location,
+                                  GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetUniformiv")
+  gl_api_->glGetUniformivFn(program, location, params);
+}
+
+GLint TraceGLApi::glGetUniformLocationFn(GLuint program, const char* name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetUniformLocation")
+  return gl_api_->glGetUniformLocationFn(program, name);
+}
+
+void TraceGLApi::glGetVertexAttribfvFn(GLuint index,
+                                       GLenum pname,
+                                       GLfloat* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetVertexAttribfv")
+  gl_api_->glGetVertexAttribfvFn(index, pname, params);
+}
+
+void TraceGLApi::glGetVertexAttribivFn(GLuint index,
+                                       GLenum pname,
+                                       GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetVertexAttribiv")
+  gl_api_->glGetVertexAttribivFn(index, pname, params);
+}
+
+void TraceGLApi::glGetVertexAttribPointervFn(GLuint index,
+                                             GLenum pname,
+                                             void** pointer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetVertexAttribPointerv")
+  gl_api_->glGetVertexAttribPointervFn(index, pname, pointer);
+}
+
+void TraceGLApi::glHintFn(GLenum target, GLenum mode) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glHint")
+  gl_api_->glHintFn(target, mode);
+}
+
+void TraceGLApi::glInsertEventMarkerEXTFn(GLsizei length, const char* marker) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glInsertEventMarkerEXT")
+  gl_api_->glInsertEventMarkerEXTFn(length, marker);
+}
+
+void TraceGLApi::glInvalidateFramebufferFn(GLenum target,
+                                           GLsizei numAttachments,
+                                           const GLenum* attachments) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glInvalidateFramebuffer")
+  gl_api_->glInvalidateFramebufferFn(target, numAttachments, attachments);
+}
+
+void TraceGLApi::glInvalidateSubFramebufferFn(GLenum target,
+                                              GLsizei numAttachments,
+                                              const GLenum* attachments,
+                                              GLint x,
+                                              GLint y,
+                                              GLint width,
+                                              GLint height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glInvalidateSubFramebuffer")
+  gl_api_->glInvalidateSubFramebufferFn(target, numAttachments, attachments, x,
+                                        y, width, height);
+}
+
+GLboolean TraceGLApi::glIsBufferFn(GLuint buffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsBuffer")
+  return gl_api_->glIsBufferFn(buffer);
+}
+
+GLboolean TraceGLApi::glIsEnabledFn(GLenum cap) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsEnabled")
+  return gl_api_->glIsEnabledFn(cap);
+}
+
+GLboolean TraceGLApi::glIsFenceAPPLEFn(GLuint fence) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsFenceAPPLE")
+  return gl_api_->glIsFenceAPPLEFn(fence);
+}
+
+GLboolean TraceGLApi::glIsFenceNVFn(GLuint fence) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsFenceNV")
+  return gl_api_->glIsFenceNVFn(fence);
+}
+
+GLboolean TraceGLApi::glIsFramebufferEXTFn(GLuint framebuffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsFramebufferEXT")
+  return gl_api_->glIsFramebufferEXTFn(framebuffer);
+}
+
+GLboolean TraceGLApi::glIsProgramFn(GLuint program) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsProgram")
+  return gl_api_->glIsProgramFn(program);
+}
+
+GLboolean TraceGLApi::glIsQueryFn(GLuint query) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsQuery")
+  return gl_api_->glIsQueryFn(query);
+}
+
+GLboolean TraceGLApi::glIsQueryARBFn(GLuint query) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsQueryARB")
+  return gl_api_->glIsQueryARBFn(query);
+}
+
+GLboolean TraceGLApi::glIsRenderbufferEXTFn(GLuint renderbuffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsRenderbufferEXT")
+  return gl_api_->glIsRenderbufferEXTFn(renderbuffer);
+}
+
+GLboolean TraceGLApi::glIsSamplerFn(GLuint sampler) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsSampler")
+  return gl_api_->glIsSamplerFn(sampler);
+}
+
+GLboolean TraceGLApi::glIsShaderFn(GLuint shader) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsShader")
+  return gl_api_->glIsShaderFn(shader);
+}
+
+GLboolean TraceGLApi::glIsSyncFn(GLsync sync) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsSync")
+  return gl_api_->glIsSyncFn(sync);
+}
+
+GLboolean TraceGLApi::glIsTextureFn(GLuint texture) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsTexture")
+  return gl_api_->glIsTextureFn(texture);
+}
+
+GLboolean TraceGLApi::glIsTransformFeedbackFn(GLuint id) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsTransformFeedback")
+  return gl_api_->glIsTransformFeedbackFn(id);
+}
+
+GLboolean TraceGLApi::glIsVertexArrayOESFn(GLuint array) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsVertexArrayOES")
+  return gl_api_->glIsVertexArrayOESFn(array);
+}
+
+void TraceGLApi::glLineWidthFn(GLfloat width) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glLineWidth")
+  gl_api_->glLineWidthFn(width);
+}
+
+void TraceGLApi::glLinkProgramFn(GLuint program) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glLinkProgram")
+  gl_api_->glLinkProgramFn(program);
+}
+
+void* TraceGLApi::glMapBufferFn(GLenum target, GLenum access) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glMapBuffer")
+  return gl_api_->glMapBufferFn(target, access);
+}
+
+void* TraceGLApi::glMapBufferRangeFn(GLenum target,
+                                     GLintptr offset,
+                                     GLsizeiptr length,
+                                     GLbitfield access) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glMapBufferRange")
+  return gl_api_->glMapBufferRangeFn(target, offset, length, access);
+}
+
+void TraceGLApi::glMatrixLoadfEXTFn(GLenum matrixMode, const GLfloat* m) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glMatrixLoadfEXT")
+  gl_api_->glMatrixLoadfEXTFn(matrixMode, m);
+}
+
+void TraceGLApi::glMatrixLoadIdentityEXTFn(GLenum matrixMode) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glMatrixLoadIdentityEXT")
+  gl_api_->glMatrixLoadIdentityEXTFn(matrixMode);
+}
+
+void TraceGLApi::glPauseTransformFeedbackFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glPauseTransformFeedback")
+  gl_api_->glPauseTransformFeedbackFn();
+}
+
+void TraceGLApi::glPixelStoreiFn(GLenum pname, GLint param) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glPixelStorei")
+  gl_api_->glPixelStoreiFn(pname, param);
+}
+
+void TraceGLApi::glPointParameteriFn(GLenum pname, GLint param) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glPointParameteri")
+  gl_api_->glPointParameteriFn(pname, param);
+}
+
+void TraceGLApi::glPolygonOffsetFn(GLfloat factor, GLfloat units) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glPolygonOffset")
+  gl_api_->glPolygonOffsetFn(factor, units);
+}
+
+void TraceGLApi::glPopGroupMarkerEXTFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glPopGroupMarkerEXT")
+  gl_api_->glPopGroupMarkerEXTFn();
+}
+
+void TraceGLApi::glProgramBinaryFn(GLuint program,
+                                   GLenum binaryFormat,
+                                   const GLvoid* binary,
+                                   GLsizei length) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glProgramBinary")
+  gl_api_->glProgramBinaryFn(program, binaryFormat, binary, length);
+}
+
+void TraceGLApi::glProgramParameteriFn(GLuint program,
+                                       GLenum pname,
+                                       GLint value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glProgramParameteri")
+  gl_api_->glProgramParameteriFn(program, pname, value);
+}
+
+void TraceGLApi::glPushGroupMarkerEXTFn(GLsizei length, const char* marker) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glPushGroupMarkerEXT")
+  gl_api_->glPushGroupMarkerEXTFn(length, marker);
+}
+
+void TraceGLApi::glQueryCounterFn(GLuint id, GLenum target) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glQueryCounter")
+  gl_api_->glQueryCounterFn(id, target);
+}
+
+void TraceGLApi::glReadBufferFn(GLenum src) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glReadBuffer")
+  gl_api_->glReadBufferFn(src);
+}
+
+void TraceGLApi::glReadPixelsFn(GLint x,
+                                GLint y,
+                                GLsizei width,
+                                GLsizei height,
+                                GLenum format,
+                                GLenum type,
+                                void* pixels) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glReadPixels")
+  gl_api_->glReadPixelsFn(x, y, width, height, format, type, pixels);
+}
+
+void TraceGLApi::glReleaseShaderCompilerFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glReleaseShaderCompiler")
+  gl_api_->glReleaseShaderCompilerFn();
+}
+
+void TraceGLApi::glRenderbufferStorageEXTFn(GLenum target,
+                                            GLenum internalformat,
+                                            GLsizei width,
+                                            GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glRenderbufferStorageEXT")
+  gl_api_->glRenderbufferStorageEXTFn(target, internalformat, width, height);
+}
+
+void TraceGLApi::glRenderbufferStorageMultisampleFn(GLenum target,
+                                                    GLsizei samples,
+                                                    GLenum internalformat,
+                                                    GLsizei width,
+                                                    GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glRenderbufferStorageMultisample")
+  gl_api_->glRenderbufferStorageMultisampleFn(target, samples, internalformat,
+                                              width, height);
+}
+
+void TraceGLApi::glRenderbufferStorageMultisampleANGLEFn(GLenum target,
+                                                         GLsizei samples,
+                                                         GLenum internalformat,
+                                                         GLsizei width,
+                                                         GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0(
+      "gpu", "TraceGLAPI::glRenderbufferStorageMultisampleANGLE")
+  gl_api_->glRenderbufferStorageMultisampleANGLEFn(
+      target, samples, internalformat, width, height);
+}
+
+void TraceGLApi::glRenderbufferStorageMultisampleEXTFn(GLenum target,
+                                                       GLsizei samples,
+                                                       GLenum internalformat,
+                                                       GLsizei width,
+                                                       GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0(
+      "gpu", "TraceGLAPI::glRenderbufferStorageMultisampleEXT")
+  gl_api_->glRenderbufferStorageMultisampleEXTFn(target, samples,
+                                                 internalformat, width, height);
+}
+
+void TraceGLApi::glRenderbufferStorageMultisampleIMGFn(GLenum target,
+                                                       GLsizei samples,
+                                                       GLenum internalformat,
+                                                       GLsizei width,
+                                                       GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0(
+      "gpu", "TraceGLAPI::glRenderbufferStorageMultisampleIMG")
+  gl_api_->glRenderbufferStorageMultisampleIMGFn(target, samples,
+                                                 internalformat, width, height);
+}
+
+void TraceGLApi::glResumeTransformFeedbackFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glResumeTransformFeedback")
+  gl_api_->glResumeTransformFeedbackFn();
+}
+
+void TraceGLApi::glSampleCoverageFn(GLclampf value, GLboolean invert) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glSampleCoverage")
+  gl_api_->glSampleCoverageFn(value, invert);
+}
+
+void TraceGLApi::glSamplerParameterfFn(GLuint sampler,
+                                       GLenum pname,
+                                       GLfloat param) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glSamplerParameterf")
+  gl_api_->glSamplerParameterfFn(sampler, pname, param);
+}
+
+void TraceGLApi::glSamplerParameterfvFn(GLuint sampler,
+                                        GLenum pname,
+                                        const GLfloat* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glSamplerParameterfv")
+  gl_api_->glSamplerParameterfvFn(sampler, pname, params);
+}
+
+void TraceGLApi::glSamplerParameteriFn(GLuint sampler,
+                                       GLenum pname,
+                                       GLint param) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glSamplerParameteri")
+  gl_api_->glSamplerParameteriFn(sampler, pname, param);
+}
+
+void TraceGLApi::glSamplerParameterivFn(GLuint sampler,
+                                        GLenum pname,
+                                        const GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glSamplerParameteriv")
+  gl_api_->glSamplerParameterivFn(sampler, pname, params);
+}
+
+void TraceGLApi::glScissorFn(GLint x, GLint y, GLsizei width, GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glScissor")
+  gl_api_->glScissorFn(x, y, width, height);
+}
+
+void TraceGLApi::glSetFenceAPPLEFn(GLuint fence) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glSetFenceAPPLE")
+  gl_api_->glSetFenceAPPLEFn(fence);
+}
+
+void TraceGLApi::glSetFenceNVFn(GLuint fence, GLenum condition) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glSetFenceNV")
+  gl_api_->glSetFenceNVFn(fence, condition);
+}
+
+void TraceGLApi::glShaderBinaryFn(GLsizei n,
+                                  const GLuint* shaders,
+                                  GLenum binaryformat,
+                                  const void* binary,
+                                  GLsizei length) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glShaderBinary")
+  gl_api_->glShaderBinaryFn(n, shaders, binaryformat, binary, length);
+}
+
+void TraceGLApi::glShaderSourceFn(GLuint shader,
+                                  GLsizei count,
+                                  const char* const* str,
+                                  const GLint* length) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glShaderSource")
+  gl_api_->glShaderSourceFn(shader, count, str, length);
+}
+
+void TraceGLApi::glStencilFuncFn(GLenum func, GLint ref, GLuint mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glStencilFunc")
+  gl_api_->glStencilFuncFn(func, ref, mask);
+}
+
+void TraceGLApi::glStencilFuncSeparateFn(GLenum face,
+                                         GLenum func,
+                                         GLint ref,
+                                         GLuint mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glStencilFuncSeparate")
+  gl_api_->glStencilFuncSeparateFn(face, func, ref, mask);
+}
+
+void TraceGLApi::glStencilMaskFn(GLuint mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glStencilMask")
+  gl_api_->glStencilMaskFn(mask);
+}
+
+void TraceGLApi::glStencilMaskSeparateFn(GLenum face, GLuint mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glStencilMaskSeparate")
+  gl_api_->glStencilMaskSeparateFn(face, mask);
+}
+
+void TraceGLApi::glStencilOpFn(GLenum fail, GLenum zfail, GLenum zpass) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glStencilOp")
+  gl_api_->glStencilOpFn(fail, zfail, zpass);
+}
+
+void TraceGLApi::glStencilOpSeparateFn(GLenum face,
+                                       GLenum fail,
+                                       GLenum zfail,
+                                       GLenum zpass) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glStencilOpSeparate")
+  gl_api_->glStencilOpSeparateFn(face, fail, zfail, zpass);
+}
+
+GLboolean TraceGLApi::glTestFenceAPPLEFn(GLuint fence) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTestFenceAPPLE")
+  return gl_api_->glTestFenceAPPLEFn(fence);
+}
+
+GLboolean TraceGLApi::glTestFenceNVFn(GLuint fence) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTestFenceNV")
+  return gl_api_->glTestFenceNVFn(fence);
+}
+
+void TraceGLApi::glTexImage2DFn(GLenum target,
+                                GLint level,
+                                GLint internalformat,
+                                GLsizei width,
+                                GLsizei height,
+                                GLint border,
+                                GLenum format,
+                                GLenum type,
+                                const void* pixels) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexImage2D")
+  gl_api_->glTexImage2DFn(target, level, internalformat, width, height, border,
+                          format, type, pixels);
+}
+
+void TraceGLApi::glTexImage3DFn(GLenum target,
+                                GLint level,
+                                GLint internalformat,
+                                GLsizei width,
+                                GLsizei height,
+                                GLsizei depth,
+                                GLint border,
+                                GLenum format,
+                                GLenum type,
+                                const void* pixels) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexImage3D")
+  gl_api_->glTexImage3DFn(target, level, internalformat, width, height, depth,
+                          border, format, type, pixels);
+}
+
+void TraceGLApi::glTexParameterfFn(GLenum target, GLenum pname, GLfloat param) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexParameterf")
+  gl_api_->glTexParameterfFn(target, pname, param);
+}
+
+void TraceGLApi::glTexParameterfvFn(GLenum target,
+                                    GLenum pname,
+                                    const GLfloat* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexParameterfv")
+  gl_api_->glTexParameterfvFn(target, pname, params);
+}
+
+void TraceGLApi::glTexParameteriFn(GLenum target, GLenum pname, GLint param) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexParameteri")
+  gl_api_->glTexParameteriFn(target, pname, param);
+}
+
+void TraceGLApi::glTexParameterivFn(GLenum target,
+                                    GLenum pname,
+                                    const GLint* params) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexParameteriv")
+  gl_api_->glTexParameterivFn(target, pname, params);
+}
+
+void TraceGLApi::glTexStorage2DEXTFn(GLenum target,
+                                     GLsizei levels,
+                                     GLenum internalformat,
+                                     GLsizei width,
+                                     GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexStorage2DEXT")
+  gl_api_->glTexStorage2DEXTFn(target, levels, internalformat, width, height);
+}
+
+void TraceGLApi::glTexStorage3DFn(GLenum target,
+                                  GLsizei levels,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLsizei depth) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexStorage3D")
+  gl_api_->glTexStorage3DFn(target, levels, internalformat, width, height,
+                            depth);
+}
+
+void TraceGLApi::glTexSubImage2DFn(GLenum target,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLenum format,
+                                   GLenum type,
+                                   const void* pixels) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glTexSubImage2D")
+  gl_api_->glTexSubImage2DFn(target, level, xoffset, yoffset, width, height,
+                             format, type, pixels);
+}
+
+void TraceGLApi::glTransformFeedbackVaryingsFn(GLuint program,
+                                               GLsizei count,
+                                               const char* const* varyings,
+                                               GLenum bufferMode) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glTransformFeedbackVaryings")
+  gl_api_->glTransformFeedbackVaryingsFn(program, count, varyings, bufferMode);
+}
+
+void TraceGLApi::glUniform1fFn(GLint location, GLfloat x) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform1f")
+  gl_api_->glUniform1fFn(location, x);
+}
+
+void TraceGLApi::glUniform1fvFn(GLint location,
+                                GLsizei count,
+                                const GLfloat* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform1fv")
+  gl_api_->glUniform1fvFn(location, count, v);
+}
+
+void TraceGLApi::glUniform1iFn(GLint location, GLint x) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform1i")
+  gl_api_->glUniform1iFn(location, x);
+}
+
+void TraceGLApi::glUniform1ivFn(GLint location, GLsizei count, const GLint* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform1iv")
+  gl_api_->glUniform1ivFn(location, count, v);
+}
+
+void TraceGLApi::glUniform1uiFn(GLint location, GLuint v0) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform1ui")
+  gl_api_->glUniform1uiFn(location, v0);
+}
+
+void TraceGLApi::glUniform1uivFn(GLint location,
+                                 GLsizei count,
+                                 const GLuint* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform1uiv")
+  gl_api_->glUniform1uivFn(location, count, v);
+}
+
+void TraceGLApi::glUniform2fFn(GLint location, GLfloat x, GLfloat y) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform2f")
+  gl_api_->glUniform2fFn(location, x, y);
+}
+
+void TraceGLApi::glUniform2fvFn(GLint location,
+                                GLsizei count,
+                                const GLfloat* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform2fv")
+  gl_api_->glUniform2fvFn(location, count, v);
+}
+
+void TraceGLApi::glUniform2iFn(GLint location, GLint x, GLint y) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform2i")
+  gl_api_->glUniform2iFn(location, x, y);
+}
+
+void TraceGLApi::glUniform2ivFn(GLint location, GLsizei count, const GLint* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform2iv")
+  gl_api_->glUniform2ivFn(location, count, v);
+}
+
+void TraceGLApi::glUniform2uiFn(GLint location, GLuint v0, GLuint v1) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform2ui")
+  gl_api_->glUniform2uiFn(location, v0, v1);
+}
+
+void TraceGLApi::glUniform2uivFn(GLint location,
+                                 GLsizei count,
+                                 const GLuint* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform2uiv")
+  gl_api_->glUniform2uivFn(location, count, v);
+}
+
+void TraceGLApi::glUniform3fFn(GLint location,
+                               GLfloat x,
+                               GLfloat y,
+                               GLfloat z) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform3f")
+  gl_api_->glUniform3fFn(location, x, y, z);
+}
+
+void TraceGLApi::glUniform3fvFn(GLint location,
+                                GLsizei count,
+                                const GLfloat* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform3fv")
+  gl_api_->glUniform3fvFn(location, count, v);
+}
+
+void TraceGLApi::glUniform3iFn(GLint location, GLint x, GLint y, GLint z) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform3i")
+  gl_api_->glUniform3iFn(location, x, y, z);
+}
+
+void TraceGLApi::glUniform3ivFn(GLint location, GLsizei count, const GLint* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform3iv")
+  gl_api_->glUniform3ivFn(location, count, v);
+}
+
+void TraceGLApi::glUniform3uiFn(GLint location,
+                                GLuint v0,
+                                GLuint v1,
+                                GLuint v2) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform3ui")
+  gl_api_->glUniform3uiFn(location, v0, v1, v2);
+}
+
+void TraceGLApi::glUniform3uivFn(GLint location,
+                                 GLsizei count,
+                                 const GLuint* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform3uiv")
+  gl_api_->glUniform3uivFn(location, count, v);
+}
+
+void TraceGLApi::glUniform4fFn(GLint location,
+                               GLfloat x,
+                               GLfloat y,
+                               GLfloat z,
+                               GLfloat w) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform4f")
+  gl_api_->glUniform4fFn(location, x, y, z, w);
+}
+
+void TraceGLApi::glUniform4fvFn(GLint location,
+                                GLsizei count,
+                                const GLfloat* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform4fv")
+  gl_api_->glUniform4fvFn(location, count, v);
+}
+
+void TraceGLApi::glUniform4iFn(GLint location,
+                               GLint x,
+                               GLint y,
+                               GLint z,
+                               GLint w) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform4i")
+  gl_api_->glUniform4iFn(location, x, y, z, w);
+}
+
+void TraceGLApi::glUniform4ivFn(GLint location, GLsizei count, const GLint* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform4iv")
+  gl_api_->glUniform4ivFn(location, count, v);
+}
+
+void TraceGLApi::glUniform4uiFn(GLint location,
+                                GLuint v0,
+                                GLuint v1,
+                                GLuint v2,
+                                GLuint v3) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform4ui")
+  gl_api_->glUniform4uiFn(location, v0, v1, v2, v3);
+}
+
+void TraceGLApi::glUniform4uivFn(GLint location,
+                                 GLsizei count,
+                                 const GLuint* v) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniform4uiv")
+  gl_api_->glUniform4uivFn(location, count, v);
+}
+
+void TraceGLApi::glUniformBlockBindingFn(GLuint program,
+                                         GLuint uniformBlockIndex,
+                                         GLuint uniformBlockBinding) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformBlockBinding")
+  gl_api_->glUniformBlockBindingFn(program, uniformBlockIndex,
+                                   uniformBlockBinding);
+}
+
+void TraceGLApi::glUniformMatrix2fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix2fv")
+  gl_api_->glUniformMatrix2fvFn(location, count, transpose, value);
+}
+
+void TraceGLApi::glUniformMatrix2x3fvFn(GLint location,
+                                        GLsizei count,
+                                        GLboolean transpose,
+                                        const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix2x3fv")
+  gl_api_->glUniformMatrix2x3fvFn(location, count, transpose, value);
+}
+
+void TraceGLApi::glUniformMatrix2x4fvFn(GLint location,
+                                        GLsizei count,
+                                        GLboolean transpose,
+                                        const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix2x4fv")
+  gl_api_->glUniformMatrix2x4fvFn(location, count, transpose, value);
+}
+
+void TraceGLApi::glUniformMatrix3fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix3fv")
+  gl_api_->glUniformMatrix3fvFn(location, count, transpose, value);
+}
+
+void TraceGLApi::glUniformMatrix3x2fvFn(GLint location,
+                                        GLsizei count,
+                                        GLboolean transpose,
+                                        const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix3x2fv")
+  gl_api_->glUniformMatrix3x2fvFn(location, count, transpose, value);
+}
+
+void TraceGLApi::glUniformMatrix3x4fvFn(GLint location,
+                                        GLsizei count,
+                                        GLboolean transpose,
+                                        const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix3x4fv")
+  gl_api_->glUniformMatrix3x4fvFn(location, count, transpose, value);
+}
+
+void TraceGLApi::glUniformMatrix4fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix4fv")
+  gl_api_->glUniformMatrix4fvFn(location, count, transpose, value);
+}
+
+void TraceGLApi::glUniformMatrix4x2fvFn(GLint location,
+                                        GLsizei count,
+                                        GLboolean transpose,
+                                        const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix4x2fv")
+  gl_api_->glUniformMatrix4x2fvFn(location, count, transpose, value);
+}
+
+void TraceGLApi::glUniformMatrix4x3fvFn(GLint location,
+                                        GLsizei count,
+                                        GLboolean transpose,
+                                        const GLfloat* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUniformMatrix4x3fv")
+  gl_api_->glUniformMatrix4x3fvFn(location, count, transpose, value);
+}
+
+GLboolean TraceGLApi::glUnmapBufferFn(GLenum target) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUnmapBuffer")
+  return gl_api_->glUnmapBufferFn(target);
+}
+
+void TraceGLApi::glUseProgramFn(GLuint program) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glUseProgram")
+  gl_api_->glUseProgramFn(program);
+}
+
+void TraceGLApi::glValidateProgramFn(GLuint program) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glValidateProgram")
+  gl_api_->glValidateProgramFn(program);
+}
+
+void TraceGLApi::glVertexAttrib1fFn(GLuint indx, GLfloat x) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttrib1f")
+  gl_api_->glVertexAttrib1fFn(indx, x);
+}
+
+void TraceGLApi::glVertexAttrib1fvFn(GLuint indx, const GLfloat* values) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttrib1fv")
+  gl_api_->glVertexAttrib1fvFn(indx, values);
+}
+
+void TraceGLApi::glVertexAttrib2fFn(GLuint indx, GLfloat x, GLfloat y) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttrib2f")
+  gl_api_->glVertexAttrib2fFn(indx, x, y);
+}
+
+void TraceGLApi::glVertexAttrib2fvFn(GLuint indx, const GLfloat* values) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttrib2fv")
+  gl_api_->glVertexAttrib2fvFn(indx, values);
+}
+
+void TraceGLApi::glVertexAttrib3fFn(GLuint indx,
+                                    GLfloat x,
+                                    GLfloat y,
+                                    GLfloat z) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttrib3f")
+  gl_api_->glVertexAttrib3fFn(indx, x, y, z);
+}
+
+void TraceGLApi::glVertexAttrib3fvFn(GLuint indx, const GLfloat* values) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttrib3fv")
+  gl_api_->glVertexAttrib3fvFn(indx, values);
+}
+
+void TraceGLApi::glVertexAttrib4fFn(GLuint indx,
+                                    GLfloat x,
+                                    GLfloat y,
+                                    GLfloat z,
+                                    GLfloat w) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttrib4f")
+  gl_api_->glVertexAttrib4fFn(indx, x, y, z, w);
+}
+
+void TraceGLApi::glVertexAttrib4fvFn(GLuint indx, const GLfloat* values) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttrib4fv")
+  gl_api_->glVertexAttrib4fvFn(indx, values);
+}
+
+void TraceGLApi::glVertexAttribDivisorANGLEFn(GLuint index, GLuint divisor) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttribDivisorANGLE")
+  gl_api_->glVertexAttribDivisorANGLEFn(index, divisor);
+}
+
+void TraceGLApi::glVertexAttribI4iFn(GLuint indx,
+                                     GLint x,
+                                     GLint y,
+                                     GLint z,
+                                     GLint w) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttribI4i")
+  gl_api_->glVertexAttribI4iFn(indx, x, y, z, w);
+}
+
+void TraceGLApi::glVertexAttribI4ivFn(GLuint indx, const GLint* values) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttribI4iv")
+  gl_api_->glVertexAttribI4ivFn(indx, values);
+}
+
+void TraceGLApi::glVertexAttribI4uiFn(GLuint indx,
+                                      GLuint x,
+                                      GLuint y,
+                                      GLuint z,
+                                      GLuint w) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttribI4ui")
+  gl_api_->glVertexAttribI4uiFn(indx, x, y, z, w);
+}
+
+void TraceGLApi::glVertexAttribI4uivFn(GLuint indx, const GLuint* values) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttribI4uiv")
+  gl_api_->glVertexAttribI4uivFn(indx, values);
+}
+
+void TraceGLApi::glVertexAttribIPointerFn(GLuint indx,
+                                          GLint size,
+                                          GLenum type,
+                                          GLsizei stride,
+                                          const void* ptr) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttribIPointer")
+  gl_api_->glVertexAttribIPointerFn(indx, size, type, stride, ptr);
+}
+
+void TraceGLApi::glVertexAttribPointerFn(GLuint indx,
+                                         GLint size,
+                                         GLenum type,
+                                         GLboolean normalized,
+                                         GLsizei stride,
+                                         const void* ptr) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glVertexAttribPointer")
+  gl_api_->glVertexAttribPointerFn(indx, size, type, normalized, stride, ptr);
+}
+
+void TraceGLApi::glViewportFn(GLint x, GLint y, GLsizei width, GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glViewport")
+  gl_api_->glViewportFn(x, y, width, height);
+}
+
+GLenum TraceGLApi::glWaitSyncFn(GLsync sync,
+                                GLbitfield flags,
+                                GLuint64 timeout) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glWaitSync")
+  return gl_api_->glWaitSyncFn(sync, flags, timeout);
+}
+
+void NoContextGLApi::glActiveTextureFn(GLenum texture) {
+  NOTREACHED() << "Trying to call glActiveTexture() without current GL context";
+  LOG(ERROR) << "Trying to call glActiveTexture() without current GL context";
+}
+
+void NoContextGLApi::glAttachShaderFn(GLuint program, GLuint shader) {
+  NOTREACHED() << "Trying to call glAttachShader() without current GL context";
+  LOG(ERROR) << "Trying to call glAttachShader() without current GL context";
+}
+
+void NoContextGLApi::glBeginQueryFn(GLenum target, GLuint id) {
+  NOTREACHED() << "Trying to call glBeginQuery() without current GL context";
+  LOG(ERROR) << "Trying to call glBeginQuery() without current GL context";
+}
+
+void NoContextGLApi::glBeginQueryARBFn(GLenum target, GLuint id) {
+  NOTREACHED() << "Trying to call glBeginQueryARB() without current GL context";
+  LOG(ERROR) << "Trying to call glBeginQueryARB() without current GL context";
+}
+
+void NoContextGLApi::glBeginTransformFeedbackFn(GLenum primitiveMode) {
+  NOTREACHED()
+      << "Trying to call glBeginTransformFeedback() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBeginTransformFeedback() without current GL context";
+}
+
+void NoContextGLApi::glBindAttribLocationFn(GLuint program,
+                                            GLuint index,
+                                            const char* name) {
+  NOTREACHED()
+      << "Trying to call glBindAttribLocation() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBindAttribLocation() without current GL context";
+}
+
+void NoContextGLApi::glBindBufferFn(GLenum target, GLuint buffer) {
+  NOTREACHED() << "Trying to call glBindBuffer() without current GL context";
+  LOG(ERROR) << "Trying to call glBindBuffer() without current GL context";
+}
+
+void NoContextGLApi::glBindBufferBaseFn(GLenum target,
+                                        GLuint index,
+                                        GLuint buffer) {
+  NOTREACHED()
+      << "Trying to call glBindBufferBase() without current GL context";
+  LOG(ERROR) << "Trying to call glBindBufferBase() without current GL context";
+}
+
+void NoContextGLApi::glBindBufferRangeFn(GLenum target,
+                                         GLuint index,
+                                         GLuint buffer,
+                                         GLintptr offset,
+                                         GLsizeiptr size) {
+  NOTREACHED()
+      << "Trying to call glBindBufferRange() without current GL context";
+  LOG(ERROR) << "Trying to call glBindBufferRange() without current GL context";
+}
+
+void NoContextGLApi::glBindFragDataLocationFn(GLuint program,
+                                              GLuint colorNumber,
+                                              const char* name) {
+  NOTREACHED()
+      << "Trying to call glBindFragDataLocation() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBindFragDataLocation() without current GL context";
+}
+
+void NoContextGLApi::glBindFragDataLocationIndexedFn(GLuint program,
+                                                     GLuint colorNumber,
+                                                     GLuint index,
+                                                     const char* name) {
+  NOTREACHED() << "Trying to call glBindFragDataLocationIndexed() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glBindFragDataLocationIndexed() without "
+                "current GL context";
+}
+
+void NoContextGLApi::glBindFramebufferEXTFn(GLenum target, GLuint framebuffer) {
+  NOTREACHED()
+      << "Trying to call glBindFramebufferEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBindFramebufferEXT() without current GL context";
+}
+
+void NoContextGLApi::glBindRenderbufferEXTFn(GLenum target,
+                                             GLuint renderbuffer) {
+  NOTREACHED()
+      << "Trying to call glBindRenderbufferEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBindRenderbufferEXT() without current GL context";
+}
+
+void NoContextGLApi::glBindSamplerFn(GLuint unit, GLuint sampler) {
+  NOTREACHED() << "Trying to call glBindSampler() without current GL context";
+  LOG(ERROR) << "Trying to call glBindSampler() without current GL context";
+}
+
+void NoContextGLApi::glBindTextureFn(GLenum target, GLuint texture) {
+  NOTREACHED() << "Trying to call glBindTexture() without current GL context";
+  LOG(ERROR) << "Trying to call glBindTexture() without current GL context";
+}
+
+void NoContextGLApi::glBindTransformFeedbackFn(GLenum target, GLuint id) {
+  NOTREACHED()
+      << "Trying to call glBindTransformFeedback() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBindTransformFeedback() without current GL context";
+}
+
+void NoContextGLApi::glBindVertexArrayOESFn(GLuint array) {
+  NOTREACHED()
+      << "Trying to call glBindVertexArrayOES() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBindVertexArrayOES() without current GL context";
+}
+
+void NoContextGLApi::glBlendBarrierKHRFn(void) {
+  NOTREACHED()
+      << "Trying to call glBlendBarrierKHR() without current GL context";
+  LOG(ERROR) << "Trying to call glBlendBarrierKHR() without current GL context";
+}
+
+void NoContextGLApi::glBlendColorFn(GLclampf red,
+                                    GLclampf green,
+                                    GLclampf blue,
+                                    GLclampf alpha) {
+  NOTREACHED() << "Trying to call glBlendColor() without current GL context";
+  LOG(ERROR) << "Trying to call glBlendColor() without current GL context";
+}
+
+void NoContextGLApi::glBlendEquationFn(GLenum mode) {
+  NOTREACHED() << "Trying to call glBlendEquation() without current GL context";
+  LOG(ERROR) << "Trying to call glBlendEquation() without current GL context";
+}
+
+void NoContextGLApi::glBlendEquationSeparateFn(GLenum modeRGB,
+                                               GLenum modeAlpha) {
+  NOTREACHED()
+      << "Trying to call glBlendEquationSeparate() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBlendEquationSeparate() without current GL context";
+}
+
+void NoContextGLApi::glBlendFuncFn(GLenum sfactor, GLenum dfactor) {
+  NOTREACHED() << "Trying to call glBlendFunc() without current GL context";
+  LOG(ERROR) << "Trying to call glBlendFunc() without current GL context";
+}
+
+void NoContextGLApi::glBlendFuncSeparateFn(GLenum srcRGB,
+                                           GLenum dstRGB,
+                                           GLenum srcAlpha,
+                                           GLenum dstAlpha) {
+  NOTREACHED()
+      << "Trying to call glBlendFuncSeparate() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBlendFuncSeparate() without current GL context";
+}
+
+void NoContextGLApi::glBlitFramebufferFn(GLint srcX0,
+                                         GLint srcY0,
+                                         GLint srcX1,
+                                         GLint srcY1,
+                                         GLint dstX0,
+                                         GLint dstY0,
+                                         GLint dstX1,
+                                         GLint dstY1,
+                                         GLbitfield mask,
+                                         GLenum filter) {
+  NOTREACHED()
+      << "Trying to call glBlitFramebuffer() without current GL context";
+  LOG(ERROR) << "Trying to call glBlitFramebuffer() without current GL context";
+}
+
+void NoContextGLApi::glBlitFramebufferANGLEFn(GLint srcX0,
+                                              GLint srcY0,
+                                              GLint srcX1,
+                                              GLint srcY1,
+                                              GLint dstX0,
+                                              GLint dstY0,
+                                              GLint dstX1,
+                                              GLint dstY1,
+                                              GLbitfield mask,
+                                              GLenum filter) {
+  NOTREACHED()
+      << "Trying to call glBlitFramebufferANGLE() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBlitFramebufferANGLE() without current GL context";
+}
+
+void NoContextGLApi::glBlitFramebufferEXTFn(GLint srcX0,
+                                            GLint srcY0,
+                                            GLint srcX1,
+                                            GLint srcY1,
+                                            GLint dstX0,
+                                            GLint dstY0,
+                                            GLint dstX1,
+                                            GLint dstY1,
+                                            GLbitfield mask,
+                                            GLenum filter) {
+  NOTREACHED()
+      << "Trying to call glBlitFramebufferEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glBlitFramebufferEXT() without current GL context";
+}
+
+void NoContextGLApi::glBufferDataFn(GLenum target,
+                                    GLsizeiptr size,
+                                    const void* data,
+                                    GLenum usage) {
+  NOTREACHED() << "Trying to call glBufferData() without current GL context";
+  LOG(ERROR) << "Trying to call glBufferData() without current GL context";
+}
+
+void NoContextGLApi::glBufferSubDataFn(GLenum target,
+                                       GLintptr offset,
+                                       GLsizeiptr size,
+                                       const void* data) {
+  NOTREACHED() << "Trying to call glBufferSubData() without current GL context";
+  LOG(ERROR) << "Trying to call glBufferSubData() without current GL context";
+}
+
+GLenum NoContextGLApi::glCheckFramebufferStatusEXTFn(GLenum target) {
+  NOTREACHED() << "Trying to call glCheckFramebufferStatusEXT() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glCheckFramebufferStatusEXT() without current "
+                "GL context";
+  return static_cast<GLenum>(0);
+}
+
+void NoContextGLApi::glClearFn(GLbitfield mask) {
+  NOTREACHED() << "Trying to call glClear() without current GL context";
+  LOG(ERROR) << "Trying to call glClear() without current GL context";
+}
+
+void NoContextGLApi::glClearBufferfiFn(GLenum buffer,
+                                       GLint drawbuffer,
+                                       const GLfloat depth,
+                                       GLint stencil) {
+  NOTREACHED() << "Trying to call glClearBufferfi() without current GL context";
+  LOG(ERROR) << "Trying to call glClearBufferfi() without current GL context";
+}
+
+void NoContextGLApi::glClearBufferfvFn(GLenum buffer,
+                                       GLint drawbuffer,
+                                       const GLfloat* value) {
+  NOTREACHED() << "Trying to call glClearBufferfv() without current GL context";
+  LOG(ERROR) << "Trying to call glClearBufferfv() without current GL context";
+}
+
+void NoContextGLApi::glClearBufferivFn(GLenum buffer,
+                                       GLint drawbuffer,
+                                       const GLint* value) {
+  NOTREACHED() << "Trying to call glClearBufferiv() without current GL context";
+  LOG(ERROR) << "Trying to call glClearBufferiv() without current GL context";
+}
+
+void NoContextGLApi::glClearBufferuivFn(GLenum buffer,
+                                        GLint drawbuffer,
+                                        const GLuint* value) {
+  NOTREACHED()
+      << "Trying to call glClearBufferuiv() without current GL context";
+  LOG(ERROR) << "Trying to call glClearBufferuiv() without current GL context";
+}
+
+void NoContextGLApi::glClearColorFn(GLclampf red,
+                                    GLclampf green,
+                                    GLclampf blue,
+                                    GLclampf alpha) {
+  NOTREACHED() << "Trying to call glClearColor() without current GL context";
+  LOG(ERROR) << "Trying to call glClearColor() without current GL context";
+}
+
+void NoContextGLApi::glClearDepthFn(GLclampd depth) {
+  NOTREACHED() << "Trying to call glClearDepth() without current GL context";
+  LOG(ERROR) << "Trying to call glClearDepth() without current GL context";
+}
+
+void NoContextGLApi::glClearDepthfFn(GLclampf depth) {
+  NOTREACHED() << "Trying to call glClearDepthf() without current GL context";
+  LOG(ERROR) << "Trying to call glClearDepthf() without current GL context";
+}
+
+void NoContextGLApi::glClearStencilFn(GLint s) {
+  NOTREACHED() << "Trying to call glClearStencil() without current GL context";
+  LOG(ERROR) << "Trying to call glClearStencil() without current GL context";
+}
+
+GLenum NoContextGLApi::glClientWaitSyncFn(GLsync sync,
+                                          GLbitfield flags,
+                                          GLuint64 timeout) {
+  NOTREACHED()
+      << "Trying to call glClientWaitSync() without current GL context";
+  LOG(ERROR) << "Trying to call glClientWaitSync() without current GL context";
+  return static_cast<GLenum>(0);
+}
+
+void NoContextGLApi::glColorMaskFn(GLboolean red,
+                                   GLboolean green,
+                                   GLboolean blue,
+                                   GLboolean alpha) {
+  NOTREACHED() << "Trying to call glColorMask() without current GL context";
+  LOG(ERROR) << "Trying to call glColorMask() without current GL context";
+}
+
+void NoContextGLApi::glCompileShaderFn(GLuint shader) {
+  NOTREACHED() << "Trying to call glCompileShader() without current GL context";
+  LOG(ERROR) << "Trying to call glCompileShader() without current GL context";
+}
+
+void NoContextGLApi::glCompressedTexImage2DFn(GLenum target,
+                                              GLint level,
+                                              GLenum internalformat,
+                                              GLsizei width,
+                                              GLsizei height,
+                                              GLint border,
+                                              GLsizei imageSize,
+                                              const void* data) {
+  NOTREACHED()
+      << "Trying to call glCompressedTexImage2D() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glCompressedTexImage2D() without current GL context";
+}
+
+void NoContextGLApi::glCompressedTexImage3DFn(GLenum target,
+                                              GLint level,
+                                              GLenum internalformat,
+                                              GLsizei width,
+                                              GLsizei height,
+                                              GLsizei depth,
+                                              GLint border,
+                                              GLsizei imageSize,
+                                              const void* data) {
+  NOTREACHED()
+      << "Trying to call glCompressedTexImage3D() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glCompressedTexImage3D() without current GL context";
+}
+
+void NoContextGLApi::glCompressedTexSubImage2DFn(GLenum target,
+                                                 GLint level,
+                                                 GLint xoffset,
+                                                 GLint yoffset,
+                                                 GLsizei width,
+                                                 GLsizei height,
+                                                 GLenum format,
+                                                 GLsizei imageSize,
+                                                 const void* data) {
+  NOTREACHED() << "Trying to call glCompressedTexSubImage2D() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glCompressedTexSubImage2D() without current GL "
+                "context";
+}
+
+void NoContextGLApi::glCopyBufferSubDataFn(GLenum readTarget,
+                                           GLenum writeTarget,
+                                           GLintptr readOffset,
+                                           GLintptr writeOffset,
+                                           GLsizeiptr size) {
+  NOTREACHED()
+      << "Trying to call glCopyBufferSubData() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glCopyBufferSubData() without current GL context";
+}
+
+void NoContextGLApi::glCopyTexImage2DFn(GLenum target,
+                                        GLint level,
+                                        GLenum internalformat,
+                                        GLint x,
+                                        GLint y,
+                                        GLsizei width,
+                                        GLsizei height,
+                                        GLint border) {
+  NOTREACHED()
+      << "Trying to call glCopyTexImage2D() without current GL context";
+  LOG(ERROR) << "Trying to call glCopyTexImage2D() without current GL context";
+}
+
+void NoContextGLApi::glCopyTexSubImage2DFn(GLenum target,
+                                           GLint level,
+                                           GLint xoffset,
+                                           GLint yoffset,
+                                           GLint x,
+                                           GLint y,
+                                           GLsizei width,
+                                           GLsizei height) {
+  NOTREACHED()
+      << "Trying to call glCopyTexSubImage2D() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glCopyTexSubImage2D() without current GL context";
+}
+
+void NoContextGLApi::glCopyTexSubImage3DFn(GLenum target,
+                                           GLint level,
+                                           GLint xoffset,
+                                           GLint yoffset,
+                                           GLint zoffset,
+                                           GLint x,
+                                           GLint y,
+                                           GLsizei width,
+                                           GLsizei height) {
+  NOTREACHED()
+      << "Trying to call glCopyTexSubImage3D() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glCopyTexSubImage3D() without current GL context";
+}
+
+GLuint NoContextGLApi::glCreateProgramFn(void) {
+  NOTREACHED() << "Trying to call glCreateProgram() without current GL context";
+  LOG(ERROR) << "Trying to call glCreateProgram() without current GL context";
+  return 0U;
+}
+
+GLuint NoContextGLApi::glCreateShaderFn(GLenum type) {
+  NOTREACHED() << "Trying to call glCreateShader() without current GL context";
+  LOG(ERROR) << "Trying to call glCreateShader() without current GL context";
+  return 0U;
+}
+
+void NoContextGLApi::glCullFaceFn(GLenum mode) {
+  NOTREACHED() << "Trying to call glCullFace() without current GL context";
+  LOG(ERROR) << "Trying to call glCullFace() without current GL context";
+}
+
+void NoContextGLApi::glDeleteBuffersARBFn(GLsizei n, const GLuint* buffers) {
+  NOTREACHED()
+      << "Trying to call glDeleteBuffersARB() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glDeleteBuffersARB() without current GL context";
+}
+
+void NoContextGLApi::glDeleteFencesAPPLEFn(GLsizei n, const GLuint* fences) {
+  NOTREACHED()
+      << "Trying to call glDeleteFencesAPPLE() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glDeleteFencesAPPLE() without current GL context";
+}
+
+void NoContextGLApi::glDeleteFencesNVFn(GLsizei n, const GLuint* fences) {
+  NOTREACHED()
+      << "Trying to call glDeleteFencesNV() without current GL context";
+  LOG(ERROR) << "Trying to call glDeleteFencesNV() without current GL context";
+}
+
+void NoContextGLApi::glDeleteFramebuffersEXTFn(GLsizei n,
+                                               const GLuint* framebuffers) {
+  NOTREACHED()
+      << "Trying to call glDeleteFramebuffersEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glDeleteFramebuffersEXT() without current GL context";
+}
+
+void NoContextGLApi::glDeleteProgramFn(GLuint program) {
+  NOTREACHED() << "Trying to call glDeleteProgram() without current GL context";
+  LOG(ERROR) << "Trying to call glDeleteProgram() without current GL context";
+}
+
+void NoContextGLApi::glDeleteQueriesFn(GLsizei n, const GLuint* ids) {
+  NOTREACHED() << "Trying to call glDeleteQueries() without current GL context";
+  LOG(ERROR) << "Trying to call glDeleteQueries() without current GL context";
+}
+
+void NoContextGLApi::glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) {
+  NOTREACHED()
+      << "Trying to call glDeleteQueriesARB() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glDeleteQueriesARB() without current GL context";
+}
+
+void NoContextGLApi::glDeleteRenderbuffersEXTFn(GLsizei n,
+                                                const GLuint* renderbuffers) {
+  NOTREACHED()
+      << "Trying to call glDeleteRenderbuffersEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glDeleteRenderbuffersEXT() without current GL context";
+}
+
+void NoContextGLApi::glDeleteSamplersFn(GLsizei n, const GLuint* samplers) {
+  NOTREACHED()
+      << "Trying to call glDeleteSamplers() without current GL context";
+  LOG(ERROR) << "Trying to call glDeleteSamplers() without current GL context";
+}
+
+void NoContextGLApi::glDeleteShaderFn(GLuint shader) {
+  NOTREACHED() << "Trying to call glDeleteShader() without current GL context";
+  LOG(ERROR) << "Trying to call glDeleteShader() without current GL context";
+}
+
+void NoContextGLApi::glDeleteSyncFn(GLsync sync) {
+  NOTREACHED() << "Trying to call glDeleteSync() without current GL context";
+  LOG(ERROR) << "Trying to call glDeleteSync() without current GL context";
+}
+
+void NoContextGLApi::glDeleteTexturesFn(GLsizei n, const GLuint* textures) {
+  NOTREACHED()
+      << "Trying to call glDeleteTextures() without current GL context";
+  LOG(ERROR) << "Trying to call glDeleteTextures() without current GL context";
+}
+
+void NoContextGLApi::glDeleteTransformFeedbacksFn(GLsizei n,
+                                                  const GLuint* ids) {
+  NOTREACHED() << "Trying to call glDeleteTransformFeedbacks() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glDeleteTransformFeedbacks() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glDeleteVertexArraysOESFn(GLsizei n,
+                                               const GLuint* arrays) {
+  NOTREACHED()
+      << "Trying to call glDeleteVertexArraysOES() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glDeleteVertexArraysOES() without current GL context";
+}
+
+void NoContextGLApi::glDepthFuncFn(GLenum func) {
+  NOTREACHED() << "Trying to call glDepthFunc() without current GL context";
+  LOG(ERROR) << "Trying to call glDepthFunc() without current GL context";
+}
+
+void NoContextGLApi::glDepthMaskFn(GLboolean flag) {
+  NOTREACHED() << "Trying to call glDepthMask() without current GL context";
+  LOG(ERROR) << "Trying to call glDepthMask() without current GL context";
+}
+
+void NoContextGLApi::glDepthRangeFn(GLclampd zNear, GLclampd zFar) {
+  NOTREACHED() << "Trying to call glDepthRange() without current GL context";
+  LOG(ERROR) << "Trying to call glDepthRange() without current GL context";
+}
+
+void NoContextGLApi::glDepthRangefFn(GLclampf zNear, GLclampf zFar) {
+  NOTREACHED() << "Trying to call glDepthRangef() without current GL context";
+  LOG(ERROR) << "Trying to call glDepthRangef() without current GL context";
+}
+
+void NoContextGLApi::glDetachShaderFn(GLuint program, GLuint shader) {
+  NOTREACHED() << "Trying to call glDetachShader() without current GL context";
+  LOG(ERROR) << "Trying to call glDetachShader() without current GL context";
+}
+
+void NoContextGLApi::glDisableFn(GLenum cap) {
+  NOTREACHED() << "Trying to call glDisable() without current GL context";
+  LOG(ERROR) << "Trying to call glDisable() without current GL context";
+}
+
+void NoContextGLApi::glDisableVertexAttribArrayFn(GLuint index) {
+  NOTREACHED() << "Trying to call glDisableVertexAttribArray() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glDisableVertexAttribArray() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glDiscardFramebufferEXTFn(GLenum target,
+                                               GLsizei numAttachments,
+                                               const GLenum* attachments) {
+  NOTREACHED()
+      << "Trying to call glDiscardFramebufferEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glDiscardFramebufferEXT() without current GL context";
+}
+
+void NoContextGLApi::glDrawArraysFn(GLenum mode, GLint first, GLsizei count) {
+  NOTREACHED() << "Trying to call glDrawArrays() without current GL context";
+  LOG(ERROR) << "Trying to call glDrawArrays() without current GL context";
+}
+
+void NoContextGLApi::glDrawArraysInstancedANGLEFn(GLenum mode,
+                                                  GLint first,
+                                                  GLsizei count,
+                                                  GLsizei primcount) {
+  NOTREACHED() << "Trying to call glDrawArraysInstancedANGLE() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glDrawArraysInstancedANGLE() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glDrawBufferFn(GLenum mode) {
+  NOTREACHED() << "Trying to call glDrawBuffer() without current GL context";
+  LOG(ERROR) << "Trying to call glDrawBuffer() without current GL context";
+}
+
+void NoContextGLApi::glDrawBuffersARBFn(GLsizei n, const GLenum* bufs) {
+  NOTREACHED()
+      << "Trying to call glDrawBuffersARB() without current GL context";
+  LOG(ERROR) << "Trying to call glDrawBuffersARB() without current GL context";
+}
+
+void NoContextGLApi::glDrawElementsFn(GLenum mode,
+                                      GLsizei count,
+                                      GLenum type,
+                                      const void* indices) {
+  NOTREACHED() << "Trying to call glDrawElements() without current GL context";
+  LOG(ERROR) << "Trying to call glDrawElements() without current GL context";
+}
+
+void NoContextGLApi::glDrawElementsInstancedANGLEFn(GLenum mode,
+                                                    GLsizei count,
+                                                    GLenum type,
+                                                    const void* indices,
+                                                    GLsizei primcount) {
+  NOTREACHED() << "Trying to call glDrawElementsInstancedANGLE() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glDrawElementsInstancedANGLE() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glDrawRangeElementsFn(GLenum mode,
+                                           GLuint start,
+                                           GLuint end,
+                                           GLsizei count,
+                                           GLenum type,
+                                           const void* indices) {
+  NOTREACHED()
+      << "Trying to call glDrawRangeElements() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glDrawRangeElements() without current GL context";
+}
+
+void NoContextGLApi::glEGLImageTargetRenderbufferStorageOESFn(
+    GLenum target,
+    GLeglImageOES image) {
+  NOTREACHED() << "Trying to call glEGLImageTargetRenderbufferStorageOES() "
+                  "without current GL context";
+  LOG(ERROR) << "Trying to call glEGLImageTargetRenderbufferStorageOES() "
+                "without current GL context";
+}
+
+void NoContextGLApi::glEGLImageTargetTexture2DOESFn(GLenum target,
+                                                    GLeglImageOES image) {
+  NOTREACHED() << "Trying to call glEGLImageTargetTexture2DOES() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glEGLImageTargetTexture2DOES() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glEnableFn(GLenum cap) {
+  NOTREACHED() << "Trying to call glEnable() without current GL context";
+  LOG(ERROR) << "Trying to call glEnable() without current GL context";
+}
+
+void NoContextGLApi::glEnableVertexAttribArrayFn(GLuint index) {
+  NOTREACHED() << "Trying to call glEnableVertexAttribArray() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glEnableVertexAttribArray() without current GL "
+                "context";
+}
+
+void NoContextGLApi::glEndQueryFn(GLenum target) {
+  NOTREACHED() << "Trying to call glEndQuery() without current GL context";
+  LOG(ERROR) << "Trying to call glEndQuery() without current GL context";
+}
+
+void NoContextGLApi::glEndQueryARBFn(GLenum target) {
+  NOTREACHED() << "Trying to call glEndQueryARB() without current GL context";
+  LOG(ERROR) << "Trying to call glEndQueryARB() without current GL context";
+}
+
+void NoContextGLApi::glEndTransformFeedbackFn(void) {
+  NOTREACHED()
+      << "Trying to call glEndTransformFeedback() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glEndTransformFeedback() without current GL context";
+}
+
+GLsync NoContextGLApi::glFenceSyncFn(GLenum condition, GLbitfield flags) {
+  NOTREACHED() << "Trying to call glFenceSync() without current GL context";
+  LOG(ERROR) << "Trying to call glFenceSync() without current GL context";
+  return NULL;
+}
+
+void NoContextGLApi::glFinishFn(void) {
+  NOTREACHED() << "Trying to call glFinish() without current GL context";
+  LOG(ERROR) << "Trying to call glFinish() without current GL context";
+}
+
+void NoContextGLApi::glFinishFenceAPPLEFn(GLuint fence) {
+  NOTREACHED()
+      << "Trying to call glFinishFenceAPPLE() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glFinishFenceAPPLE() without current GL context";
+}
+
+void NoContextGLApi::glFinishFenceNVFn(GLuint fence) {
+  NOTREACHED() << "Trying to call glFinishFenceNV() without current GL context";
+  LOG(ERROR) << "Trying to call glFinishFenceNV() without current GL context";
+}
+
+void NoContextGLApi::glFlushFn(void) {
+  NOTREACHED() << "Trying to call glFlush() without current GL context";
+  LOG(ERROR) << "Trying to call glFlush() without current GL context";
+}
+
+void NoContextGLApi::glFlushMappedBufferRangeFn(GLenum target,
+                                                GLintptr offset,
+                                                GLsizeiptr length) {
+  NOTREACHED()
+      << "Trying to call glFlushMappedBufferRange() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glFlushMappedBufferRange() without current GL context";
+}
+
+void NoContextGLApi::glFramebufferRenderbufferEXTFn(GLenum target,
+                                                    GLenum attachment,
+                                                    GLenum renderbuffertarget,
+                                                    GLuint renderbuffer) {
+  NOTREACHED() << "Trying to call glFramebufferRenderbufferEXT() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glFramebufferRenderbufferEXT() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glFramebufferTexture2DEXTFn(GLenum target,
+                                                 GLenum attachment,
+                                                 GLenum textarget,
+                                                 GLuint texture,
+                                                 GLint level) {
+  NOTREACHED() << "Trying to call glFramebufferTexture2DEXT() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glFramebufferTexture2DEXT() without current GL "
+                "context";
+}
+
+void NoContextGLApi::glFramebufferTexture2DMultisampleEXTFn(GLenum target,
+                                                            GLenum attachment,
+                                                            GLenum textarget,
+                                                            GLuint texture,
+                                                            GLint level,
+                                                            GLsizei samples) {
+  NOTREACHED() << "Trying to call glFramebufferTexture2DMultisampleEXT() "
+                  "without current GL context";
+  LOG(ERROR) << "Trying to call glFramebufferTexture2DMultisampleEXT() without "
+                "current GL context";
+}
+
+void NoContextGLApi::glFramebufferTexture2DMultisampleIMGFn(GLenum target,
+                                                            GLenum attachment,
+                                                            GLenum textarget,
+                                                            GLuint texture,
+                                                            GLint level,
+                                                            GLsizei samples) {
+  NOTREACHED() << "Trying to call glFramebufferTexture2DMultisampleIMG() "
+                  "without current GL context";
+  LOG(ERROR) << "Trying to call glFramebufferTexture2DMultisampleIMG() without "
+                "current GL context";
+}
+
+void NoContextGLApi::glFramebufferTextureLayerFn(GLenum target,
+                                                 GLenum attachment,
+                                                 GLuint texture,
+                                                 GLint level,
+                                                 GLint layer) {
+  NOTREACHED() << "Trying to call glFramebufferTextureLayer() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glFramebufferTextureLayer() without current GL "
+                "context";
+}
+
+void NoContextGLApi::glFrontFaceFn(GLenum mode) {
+  NOTREACHED() << "Trying to call glFrontFace() without current GL context";
+  LOG(ERROR) << "Trying to call glFrontFace() without current GL context";
+}
+
+void NoContextGLApi::glGenBuffersARBFn(GLsizei n, GLuint* buffers) {
+  NOTREACHED() << "Trying to call glGenBuffersARB() without current GL context";
+  LOG(ERROR) << "Trying to call glGenBuffersARB() without current GL context";
+}
+
+void NoContextGLApi::glGenerateMipmapEXTFn(GLenum target) {
+  NOTREACHED()
+      << "Trying to call glGenerateMipmapEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGenerateMipmapEXT() without current GL context";
+}
+
+void NoContextGLApi::glGenFencesAPPLEFn(GLsizei n, GLuint* fences) {
+  NOTREACHED()
+      << "Trying to call glGenFencesAPPLE() without current GL context";
+  LOG(ERROR) << "Trying to call glGenFencesAPPLE() without current GL context";
+}
+
+void NoContextGLApi::glGenFencesNVFn(GLsizei n, GLuint* fences) {
+  NOTREACHED() << "Trying to call glGenFencesNV() without current GL context";
+  LOG(ERROR) << "Trying to call glGenFencesNV() without current GL context";
+}
+
+void NoContextGLApi::glGenFramebuffersEXTFn(GLsizei n, GLuint* framebuffers) {
+  NOTREACHED()
+      << "Trying to call glGenFramebuffersEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGenFramebuffersEXT() without current GL context";
+}
+
+void NoContextGLApi::glGenQueriesFn(GLsizei n, GLuint* ids) {
+  NOTREACHED() << "Trying to call glGenQueries() without current GL context";
+  LOG(ERROR) << "Trying to call glGenQueries() without current GL context";
+}
+
+void NoContextGLApi::glGenQueriesARBFn(GLsizei n, GLuint* ids) {
+  NOTREACHED() << "Trying to call glGenQueriesARB() without current GL context";
+  LOG(ERROR) << "Trying to call glGenQueriesARB() without current GL context";
+}
+
+void NoContextGLApi::glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) {
+  NOTREACHED()
+      << "Trying to call glGenRenderbuffersEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGenRenderbuffersEXT() without current GL context";
+}
+
+void NoContextGLApi::glGenSamplersFn(GLsizei n, GLuint* samplers) {
+  NOTREACHED() << "Trying to call glGenSamplers() without current GL context";
+  LOG(ERROR) << "Trying to call glGenSamplers() without current GL context";
+}
+
+void NoContextGLApi::glGenTexturesFn(GLsizei n, GLuint* textures) {
+  NOTREACHED() << "Trying to call glGenTextures() without current GL context";
+  LOG(ERROR) << "Trying to call glGenTextures() without current GL context";
+}
+
+void NoContextGLApi::glGenTransformFeedbacksFn(GLsizei n, GLuint* ids) {
+  NOTREACHED()
+      << "Trying to call glGenTransformFeedbacks() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGenTransformFeedbacks() without current GL context";
+}
+
+void NoContextGLApi::glGenVertexArraysOESFn(GLsizei n, GLuint* arrays) {
+  NOTREACHED()
+      << "Trying to call glGenVertexArraysOES() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGenVertexArraysOES() without current GL context";
+}
+
+void NoContextGLApi::glGetActiveAttribFn(GLuint program,
+                                         GLuint index,
+                                         GLsizei bufsize,
+                                         GLsizei* length,
+                                         GLint* size,
+                                         GLenum* type,
+                                         char* name) {
+  NOTREACHED()
+      << "Trying to call glGetActiveAttrib() without current GL context";
+  LOG(ERROR) << "Trying to call glGetActiveAttrib() without current GL context";
+}
+
+void NoContextGLApi::glGetActiveUniformFn(GLuint program,
+                                          GLuint index,
+                                          GLsizei bufsize,
+                                          GLsizei* length,
+                                          GLint* size,
+                                          GLenum* type,
+                                          char* name) {
+  NOTREACHED()
+      << "Trying to call glGetActiveUniform() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetActiveUniform() without current GL context";
+}
+
+void NoContextGLApi::glGetActiveUniformBlockivFn(GLuint program,
+                                                 GLuint uniformBlockIndex,
+                                                 GLenum pname,
+                                                 GLint* params) {
+  NOTREACHED() << "Trying to call glGetActiveUniformBlockiv() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glGetActiveUniformBlockiv() without current GL "
+                "context";
+}
+
+void NoContextGLApi::glGetActiveUniformBlockNameFn(GLuint program,
+                                                   GLuint uniformBlockIndex,
+                                                   GLsizei bufSize,
+                                                   GLsizei* length,
+                                                   char* uniformBlockName) {
+  NOTREACHED() << "Trying to call glGetActiveUniformBlockName() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glGetActiveUniformBlockName() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glGetActiveUniformsivFn(GLuint program,
+                                             GLsizei uniformCount,
+                                             const GLuint* uniformIndices,
+                                             GLenum pname,
+                                             GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetActiveUniformsiv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetActiveUniformsiv() without current GL context";
+}
+
+void NoContextGLApi::glGetAttachedShadersFn(GLuint program,
+                                            GLsizei maxcount,
+                                            GLsizei* count,
+                                            GLuint* shaders) {
+  NOTREACHED()
+      << "Trying to call glGetAttachedShaders() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetAttachedShaders() without current GL context";
+}
+
+GLint NoContextGLApi::glGetAttribLocationFn(GLuint program, const char* name) {
+  NOTREACHED()
+      << "Trying to call glGetAttribLocation() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetAttribLocation() without current GL context";
+  return 0;
+}
+
+void NoContextGLApi::glGetBooleanvFn(GLenum pname, GLboolean* params) {
+  NOTREACHED() << "Trying to call glGetBooleanv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetBooleanv() without current GL context";
+}
+
+void NoContextGLApi::glGetBufferParameterivFn(GLenum target,
+                                              GLenum pname,
+                                              GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetBufferParameteriv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetBufferParameteriv() without current GL context";
+}
+
+GLenum NoContextGLApi::glGetErrorFn(void) {
+  NOTREACHED() << "Trying to call glGetError() without current GL context";
+  LOG(ERROR) << "Trying to call glGetError() without current GL context";
+  return static_cast<GLenum>(0);
+}
+
+void NoContextGLApi::glGetFenceivNVFn(GLuint fence,
+                                      GLenum pname,
+                                      GLint* params) {
+  NOTREACHED() << "Trying to call glGetFenceivNV() without current GL context";
+  LOG(ERROR) << "Trying to call glGetFenceivNV() without current GL context";
+}
+
+void NoContextGLApi::glGetFloatvFn(GLenum pname, GLfloat* params) {
+  NOTREACHED() << "Trying to call glGetFloatv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetFloatv() without current GL context";
+}
+
+GLint NoContextGLApi::glGetFragDataLocationFn(GLuint program,
+                                              const char* name) {
+  NOTREACHED()
+      << "Trying to call glGetFragDataLocation() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetFragDataLocation() without current GL context";
+  return 0;
+}
+
+void NoContextGLApi::glGetFramebufferAttachmentParameterivEXTFn(
+    GLenum target,
+    GLenum attachment,
+    GLenum pname,
+    GLint* params) {
+  NOTREACHED() << "Trying to call glGetFramebufferAttachmentParameterivEXT() "
+                  "without current GL context";
+  LOG(ERROR) << "Trying to call glGetFramebufferAttachmentParameterivEXT() "
+                "without current GL context";
+}
+
+GLenum NoContextGLApi::glGetGraphicsResetStatusARBFn(void) {
+  NOTREACHED() << "Trying to call glGetGraphicsResetStatusARB() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glGetGraphicsResetStatusARB() without current "
+                "GL context";
+  return static_cast<GLenum>(0);
+}
+
+void NoContextGLApi::glGetInteger64i_vFn(GLenum target,
+                                         GLuint index,
+                                         GLint64* data) {
+  NOTREACHED()
+      << "Trying to call glGetInteger64i_v() without current GL context";
+  LOG(ERROR) << "Trying to call glGetInteger64i_v() without current GL context";
+}
+
+void NoContextGLApi::glGetInteger64vFn(GLenum pname, GLint64* params) {
+  NOTREACHED() << "Trying to call glGetInteger64v() without current GL context";
+  LOG(ERROR) << "Trying to call glGetInteger64v() without current GL context";
+}
+
+void NoContextGLApi::glGetIntegeri_vFn(GLenum target,
+                                       GLuint index,
+                                       GLint* data) {
+  NOTREACHED() << "Trying to call glGetIntegeri_v() without current GL context";
+  LOG(ERROR) << "Trying to call glGetIntegeri_v() without current GL context";
+}
+
+void NoContextGLApi::glGetIntegervFn(GLenum pname, GLint* params) {
+  NOTREACHED() << "Trying to call glGetIntegerv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetIntegerv() without current GL context";
+}
+
+void NoContextGLApi::glGetInternalformativFn(GLenum target,
+                                             GLenum internalformat,
+                                             GLenum pname,
+                                             GLsizei bufSize,
+                                             GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetInternalformativ() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetInternalformativ() without current GL context";
+}
+
+void NoContextGLApi::glGetProgramBinaryFn(GLuint program,
+                                          GLsizei bufSize,
+                                          GLsizei* length,
+                                          GLenum* binaryFormat,
+                                          GLvoid* binary) {
+  NOTREACHED()
+      << "Trying to call glGetProgramBinary() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetProgramBinary() without current GL context";
+}
+
+void NoContextGLApi::glGetProgramInfoLogFn(GLuint program,
+                                           GLsizei bufsize,
+                                           GLsizei* length,
+                                           char* infolog) {
+  NOTREACHED()
+      << "Trying to call glGetProgramInfoLog() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetProgramInfoLog() without current GL context";
+}
+
+void NoContextGLApi::glGetProgramivFn(GLuint program,
+                                      GLenum pname,
+                                      GLint* params) {
+  NOTREACHED() << "Trying to call glGetProgramiv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetProgramiv() without current GL context";
+}
+
+void NoContextGLApi::glGetQueryivFn(GLenum target,
+                                    GLenum pname,
+                                    GLint* params) {
+  NOTREACHED() << "Trying to call glGetQueryiv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetQueryiv() without current GL context";
+}
+
+void NoContextGLApi::glGetQueryivARBFn(GLenum target,
+                                       GLenum pname,
+                                       GLint* params) {
+  NOTREACHED() << "Trying to call glGetQueryivARB() without current GL context";
+  LOG(ERROR) << "Trying to call glGetQueryivARB() without current GL context";
+}
+
+void NoContextGLApi::glGetQueryObjecti64vFn(GLuint id,
+                                            GLenum pname,
+                                            GLint64* params) {
+  NOTREACHED()
+      << "Trying to call glGetQueryObjecti64v() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetQueryObjecti64v() without current GL context";
+}
+
+void NoContextGLApi::glGetQueryObjectivFn(GLuint id,
+                                          GLenum pname,
+                                          GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetQueryObjectiv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetQueryObjectiv() without current GL context";
+}
+
+void NoContextGLApi::glGetQueryObjectivARBFn(GLuint id,
+                                             GLenum pname,
+                                             GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetQueryObjectivARB() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetQueryObjectivARB() without current GL context";
+}
+
+void NoContextGLApi::glGetQueryObjectui64vFn(GLuint id,
+                                             GLenum pname,
+                                             GLuint64* params) {
+  NOTREACHED()
+      << "Trying to call glGetQueryObjectui64v() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetQueryObjectui64v() without current GL context";
+}
+
+void NoContextGLApi::glGetQueryObjectuivFn(GLuint id,
+                                           GLenum pname,
+                                           GLuint* params) {
+  NOTREACHED()
+      << "Trying to call glGetQueryObjectuiv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetQueryObjectuiv() without current GL context";
+}
+
+void NoContextGLApi::glGetQueryObjectuivARBFn(GLuint id,
+                                              GLenum pname,
+                                              GLuint* params) {
+  NOTREACHED()
+      << "Trying to call glGetQueryObjectuivARB() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetQueryObjectuivARB() without current GL context";
+}
+
+void NoContextGLApi::glGetRenderbufferParameterivEXTFn(GLenum target,
+                                                       GLenum pname,
+                                                       GLint* params) {
+  NOTREACHED() << "Trying to call glGetRenderbufferParameterivEXT() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glGetRenderbufferParameterivEXT() without "
+                "current GL context";
+}
+
+void NoContextGLApi::glGetSamplerParameterfvFn(GLuint sampler,
+                                               GLenum pname,
+                                               GLfloat* params) {
+  NOTREACHED()
+      << "Trying to call glGetSamplerParameterfv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetSamplerParameterfv() without current GL context";
+}
+
+void NoContextGLApi::glGetSamplerParameterivFn(GLuint sampler,
+                                               GLenum pname,
+                                               GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetSamplerParameteriv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetSamplerParameteriv() without current GL context";
+}
+
+void NoContextGLApi::glGetShaderInfoLogFn(GLuint shader,
+                                          GLsizei bufsize,
+                                          GLsizei* length,
+                                          char* infolog) {
+  NOTREACHED()
+      << "Trying to call glGetShaderInfoLog() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetShaderInfoLog() without current GL context";
+}
+
+void NoContextGLApi::glGetShaderivFn(GLuint shader,
+                                     GLenum pname,
+                                     GLint* params) {
+  NOTREACHED() << "Trying to call glGetShaderiv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetShaderiv() without current GL context";
+}
+
+void NoContextGLApi::glGetShaderPrecisionFormatFn(GLenum shadertype,
+                                                  GLenum precisiontype,
+                                                  GLint* range,
+                                                  GLint* precision) {
+  NOTREACHED() << "Trying to call glGetShaderPrecisionFormat() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glGetShaderPrecisionFormat() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glGetShaderSourceFn(GLuint shader,
+                                         GLsizei bufsize,
+                                         GLsizei* length,
+                                         char* source) {
+  NOTREACHED()
+      << "Trying to call glGetShaderSource() without current GL context";
+  LOG(ERROR) << "Trying to call glGetShaderSource() without current GL context";
+}
+
+const GLubyte* NoContextGLApi::glGetStringFn(GLenum name) {
+  NOTREACHED() << "Trying to call glGetString() without current GL context";
+  LOG(ERROR) << "Trying to call glGetString() without current GL context";
+  return NULL;
+}
+
+void NoContextGLApi::glGetSyncivFn(GLsync sync,
+                                   GLenum pname,
+                                   GLsizei bufSize,
+                                   GLsizei* length,
+                                   GLint* values) {
+  NOTREACHED() << "Trying to call glGetSynciv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetSynciv() without current GL context";
+}
+
+void NoContextGLApi::glGetTexLevelParameterfvFn(GLenum target,
+                                                GLint level,
+                                                GLenum pname,
+                                                GLfloat* params) {
+  NOTREACHED()
+      << "Trying to call glGetTexLevelParameterfv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetTexLevelParameterfv() without current GL context";
+}
+
+void NoContextGLApi::glGetTexLevelParameterivFn(GLenum target,
+                                                GLint level,
+                                                GLenum pname,
+                                                GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetTexLevelParameteriv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetTexLevelParameteriv() without current GL context";
+}
+
+void NoContextGLApi::glGetTexParameterfvFn(GLenum target,
+                                           GLenum pname,
+                                           GLfloat* params) {
+  NOTREACHED()
+      << "Trying to call glGetTexParameterfv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetTexParameterfv() without current GL context";
+}
+
+void NoContextGLApi::glGetTexParameterivFn(GLenum target,
+                                           GLenum pname,
+                                           GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetTexParameteriv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetTexParameteriv() without current GL context";
+}
+
+void NoContextGLApi::glGetTransformFeedbackVaryingFn(GLuint program,
+                                                     GLuint index,
+                                                     GLsizei bufSize,
+                                                     GLsizei* length,
+                                                     GLenum* type,
+                                                     char* name) {
+  NOTREACHED() << "Trying to call glGetTransformFeedbackVarying() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glGetTransformFeedbackVarying() without "
+                "current GL context";
+}
+
+void NoContextGLApi::glGetTranslatedShaderSourceANGLEFn(GLuint shader,
+                                                        GLsizei bufsize,
+                                                        GLsizei* length,
+                                                        char* source) {
+  NOTREACHED() << "Trying to call glGetTranslatedShaderSourceANGLE() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glGetTranslatedShaderSourceANGLE() without "
+                "current GL context";
+}
+
+GLuint NoContextGLApi::glGetUniformBlockIndexFn(GLuint program,
+                                                const char* uniformBlockName) {
+  NOTREACHED()
+      << "Trying to call glGetUniformBlockIndex() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetUniformBlockIndex() without current GL context";
+  return 0U;
+}
+
+void NoContextGLApi::glGetUniformfvFn(GLuint program,
+                                      GLint location,
+                                      GLfloat* params) {
+  NOTREACHED() << "Trying to call glGetUniformfv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetUniformfv() without current GL context";
+}
+
+void NoContextGLApi::glGetUniformIndicesFn(GLuint program,
+                                           GLsizei uniformCount,
+                                           const char* const* uniformNames,
+                                           GLuint* uniformIndices) {
+  NOTREACHED()
+      << "Trying to call glGetUniformIndices() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetUniformIndices() without current GL context";
+}
+
+void NoContextGLApi::glGetUniformivFn(GLuint program,
+                                      GLint location,
+                                      GLint* params) {
+  NOTREACHED() << "Trying to call glGetUniformiv() without current GL context";
+  LOG(ERROR) << "Trying to call glGetUniformiv() without current GL context";
+}
+
+GLint NoContextGLApi::glGetUniformLocationFn(GLuint program, const char* name) {
+  NOTREACHED()
+      << "Trying to call glGetUniformLocation() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetUniformLocation() without current GL context";
+  return 0;
+}
+
+void NoContextGLApi::glGetVertexAttribfvFn(GLuint index,
+                                           GLenum pname,
+                                           GLfloat* params) {
+  NOTREACHED()
+      << "Trying to call glGetVertexAttribfv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetVertexAttribfv() without current GL context";
+}
+
+void NoContextGLApi::glGetVertexAttribivFn(GLuint index,
+                                           GLenum pname,
+                                           GLint* params) {
+  NOTREACHED()
+      << "Trying to call glGetVertexAttribiv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glGetVertexAttribiv() without current GL context";
+}
+
+void NoContextGLApi::glGetVertexAttribPointervFn(GLuint index,
+                                                 GLenum pname,
+                                                 void** pointer) {
+  NOTREACHED() << "Trying to call glGetVertexAttribPointerv() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glGetVertexAttribPointerv() without current GL "
+                "context";
+}
+
+void NoContextGLApi::glHintFn(GLenum target, GLenum mode) {
+  NOTREACHED() << "Trying to call glHint() without current GL context";
+  LOG(ERROR) << "Trying to call glHint() without current GL context";
+}
+
+void NoContextGLApi::glInsertEventMarkerEXTFn(GLsizei length,
+                                              const char* marker) {
+  NOTREACHED()
+      << "Trying to call glInsertEventMarkerEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glInsertEventMarkerEXT() without current GL context";
+}
+
+void NoContextGLApi::glInvalidateFramebufferFn(GLenum target,
+                                               GLsizei numAttachments,
+                                               const GLenum* attachments) {
+  NOTREACHED()
+      << "Trying to call glInvalidateFramebuffer() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glInvalidateFramebuffer() without current GL context";
+}
+
+void NoContextGLApi::glInvalidateSubFramebufferFn(GLenum target,
+                                                  GLsizei numAttachments,
+                                                  const GLenum* attachments,
+                                                  GLint x,
+                                                  GLint y,
+                                                  GLint width,
+                                                  GLint height) {
+  NOTREACHED() << "Trying to call glInvalidateSubFramebuffer() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glInvalidateSubFramebuffer() without current "
+                "GL context";
+}
+
+GLboolean NoContextGLApi::glIsBufferFn(GLuint buffer) {
+  NOTREACHED() << "Trying to call glIsBuffer() without current GL context";
+  LOG(ERROR) << "Trying to call glIsBuffer() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsEnabledFn(GLenum cap) {
+  NOTREACHED() << "Trying to call glIsEnabled() without current GL context";
+  LOG(ERROR) << "Trying to call glIsEnabled() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsFenceAPPLEFn(GLuint fence) {
+  NOTREACHED() << "Trying to call glIsFenceAPPLE() without current GL context";
+  LOG(ERROR) << "Trying to call glIsFenceAPPLE() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsFenceNVFn(GLuint fence) {
+  NOTREACHED() << "Trying to call glIsFenceNV() without current GL context";
+  LOG(ERROR) << "Trying to call glIsFenceNV() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsFramebufferEXTFn(GLuint framebuffer) {
+  NOTREACHED()
+      << "Trying to call glIsFramebufferEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glIsFramebufferEXT() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsProgramFn(GLuint program) {
+  NOTREACHED() << "Trying to call glIsProgram() without current GL context";
+  LOG(ERROR) << "Trying to call glIsProgram() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsQueryFn(GLuint query) {
+  NOTREACHED() << "Trying to call glIsQuery() without current GL context";
+  LOG(ERROR) << "Trying to call glIsQuery() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsQueryARBFn(GLuint query) {
+  NOTREACHED() << "Trying to call glIsQueryARB() without current GL context";
+  LOG(ERROR) << "Trying to call glIsQueryARB() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsRenderbufferEXTFn(GLuint renderbuffer) {
+  NOTREACHED()
+      << "Trying to call glIsRenderbufferEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glIsRenderbufferEXT() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsSamplerFn(GLuint sampler) {
+  NOTREACHED() << "Trying to call glIsSampler() without current GL context";
+  LOG(ERROR) << "Trying to call glIsSampler() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsShaderFn(GLuint shader) {
+  NOTREACHED() << "Trying to call glIsShader() without current GL context";
+  LOG(ERROR) << "Trying to call glIsShader() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsSyncFn(GLsync sync) {
+  NOTREACHED() << "Trying to call glIsSync() without current GL context";
+  LOG(ERROR) << "Trying to call glIsSync() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsTextureFn(GLuint texture) {
+  NOTREACHED() << "Trying to call glIsTexture() without current GL context";
+  LOG(ERROR) << "Trying to call glIsTexture() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsTransformFeedbackFn(GLuint id) {
+  NOTREACHED()
+      << "Trying to call glIsTransformFeedback() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glIsTransformFeedback() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glIsVertexArrayOESFn(GLuint array) {
+  NOTREACHED()
+      << "Trying to call glIsVertexArrayOES() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glIsVertexArrayOES() without current GL context";
+  return GL_FALSE;
+}
+
+void NoContextGLApi::glLineWidthFn(GLfloat width) {
+  NOTREACHED() << "Trying to call glLineWidth() without current GL context";
+  LOG(ERROR) << "Trying to call glLineWidth() without current GL context";
+}
+
+void NoContextGLApi::glLinkProgramFn(GLuint program) {
+  NOTREACHED() << "Trying to call glLinkProgram() without current GL context";
+  LOG(ERROR) << "Trying to call glLinkProgram() without current GL context";
+}
+
+void* NoContextGLApi::glMapBufferFn(GLenum target, GLenum access) {
+  NOTREACHED() << "Trying to call glMapBuffer() without current GL context";
+  LOG(ERROR) << "Trying to call glMapBuffer() without current GL context";
+  return NULL;
+}
+
+void* NoContextGLApi::glMapBufferRangeFn(GLenum target,
+                                         GLintptr offset,
+                                         GLsizeiptr length,
+                                         GLbitfield access) {
+  NOTREACHED()
+      << "Trying to call glMapBufferRange() without current GL context";
+  LOG(ERROR) << "Trying to call glMapBufferRange() without current GL context";
+  return NULL;
+}
+
+void NoContextGLApi::glMatrixLoadfEXTFn(GLenum matrixMode, const GLfloat* m) {
+  NOTREACHED()
+      << "Trying to call glMatrixLoadfEXT() without current GL context";
+  LOG(ERROR) << "Trying to call glMatrixLoadfEXT() without current GL context";
+}
+
+void NoContextGLApi::glMatrixLoadIdentityEXTFn(GLenum matrixMode) {
+  NOTREACHED()
+      << "Trying to call glMatrixLoadIdentityEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glMatrixLoadIdentityEXT() without current GL context";
+}
+
+void NoContextGLApi::glPauseTransformFeedbackFn(void) {
+  NOTREACHED()
+      << "Trying to call glPauseTransformFeedback() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glPauseTransformFeedback() without current GL context";
+}
+
+void NoContextGLApi::glPixelStoreiFn(GLenum pname, GLint param) {
+  NOTREACHED() << "Trying to call glPixelStorei() without current GL context";
+  LOG(ERROR) << "Trying to call glPixelStorei() without current GL context";
+}
+
+void NoContextGLApi::glPointParameteriFn(GLenum pname, GLint param) {
+  NOTREACHED()
+      << "Trying to call glPointParameteri() without current GL context";
+  LOG(ERROR) << "Trying to call glPointParameteri() without current GL context";
+}
+
+void NoContextGLApi::glPolygonOffsetFn(GLfloat factor, GLfloat units) {
+  NOTREACHED() << "Trying to call glPolygonOffset() without current GL context";
+  LOG(ERROR) << "Trying to call glPolygonOffset() without current GL context";
+}
+
+void NoContextGLApi::glPopGroupMarkerEXTFn(void) {
+  NOTREACHED()
+      << "Trying to call glPopGroupMarkerEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glPopGroupMarkerEXT() without current GL context";
+}
+
+void NoContextGLApi::glProgramBinaryFn(GLuint program,
+                                       GLenum binaryFormat,
+                                       const GLvoid* binary,
+                                       GLsizei length) {
+  NOTREACHED() << "Trying to call glProgramBinary() without current GL context";
+  LOG(ERROR) << "Trying to call glProgramBinary() without current GL context";
+}
+
+void NoContextGLApi::glProgramParameteriFn(GLuint program,
+                                           GLenum pname,
+                                           GLint value) {
+  NOTREACHED()
+      << "Trying to call glProgramParameteri() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glProgramParameteri() without current GL context";
+}
+
+void NoContextGLApi::glPushGroupMarkerEXTFn(GLsizei length,
+                                            const char* marker) {
+  NOTREACHED()
+      << "Trying to call glPushGroupMarkerEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glPushGroupMarkerEXT() without current GL context";
+}
+
+void NoContextGLApi::glQueryCounterFn(GLuint id, GLenum target) {
+  NOTREACHED() << "Trying to call glQueryCounter() without current GL context";
+  LOG(ERROR) << "Trying to call glQueryCounter() without current GL context";
+}
+
+void NoContextGLApi::glReadBufferFn(GLenum src) {
+  NOTREACHED() << "Trying to call glReadBuffer() without current GL context";
+  LOG(ERROR) << "Trying to call glReadBuffer() without current GL context";
+}
+
+void NoContextGLApi::glReadPixelsFn(GLint x,
+                                    GLint y,
+                                    GLsizei width,
+                                    GLsizei height,
+                                    GLenum format,
+                                    GLenum type,
+                                    void* pixels) {
+  NOTREACHED() << "Trying to call glReadPixels() without current GL context";
+  LOG(ERROR) << "Trying to call glReadPixels() without current GL context";
+}
+
+void NoContextGLApi::glReleaseShaderCompilerFn(void) {
+  NOTREACHED()
+      << "Trying to call glReleaseShaderCompiler() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glReleaseShaderCompiler() without current GL context";
+}
+
+void NoContextGLApi::glRenderbufferStorageEXTFn(GLenum target,
+                                                GLenum internalformat,
+                                                GLsizei width,
+                                                GLsizei height) {
+  NOTREACHED()
+      << "Trying to call glRenderbufferStorageEXT() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glRenderbufferStorageEXT() without current GL context";
+}
+
+void NoContextGLApi::glRenderbufferStorageMultisampleFn(GLenum target,
+                                                        GLsizei samples,
+                                                        GLenum internalformat,
+                                                        GLsizei width,
+                                                        GLsizei height) {
+  NOTREACHED() << "Trying to call glRenderbufferStorageMultisample() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glRenderbufferStorageMultisample() without "
+                "current GL context";
+}
+
+void NoContextGLApi::glRenderbufferStorageMultisampleANGLEFn(
+    GLenum target,
+    GLsizei samples,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height) {
+  NOTREACHED() << "Trying to call glRenderbufferStorageMultisampleANGLE() "
+                  "without current GL context";
+  LOG(ERROR) << "Trying to call glRenderbufferStorageMultisampleANGLE() "
+                "without current GL context";
+}
+
+void NoContextGLApi::glRenderbufferStorageMultisampleEXTFn(
+    GLenum target,
+    GLsizei samples,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height) {
+  NOTREACHED() << "Trying to call glRenderbufferStorageMultisampleEXT() "
+                  "without current GL context";
+  LOG(ERROR) << "Trying to call glRenderbufferStorageMultisampleEXT() without "
+                "current GL context";
+}
+
+void NoContextGLApi::glRenderbufferStorageMultisampleIMGFn(
+    GLenum target,
+    GLsizei samples,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height) {
+  NOTREACHED() << "Trying to call glRenderbufferStorageMultisampleIMG() "
+                  "without current GL context";
+  LOG(ERROR) << "Trying to call glRenderbufferStorageMultisampleIMG() without "
+                "current GL context";
+}
+
+void NoContextGLApi::glResumeTransformFeedbackFn(void) {
+  NOTREACHED() << "Trying to call glResumeTransformFeedback() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glResumeTransformFeedback() without current GL "
+                "context";
+}
+
+void NoContextGLApi::glSampleCoverageFn(GLclampf value, GLboolean invert) {
+  NOTREACHED()
+      << "Trying to call glSampleCoverage() without current GL context";
+  LOG(ERROR) << "Trying to call glSampleCoverage() without current GL context";
+}
+
+void NoContextGLApi::glSamplerParameterfFn(GLuint sampler,
+                                           GLenum pname,
+                                           GLfloat param) {
+  NOTREACHED()
+      << "Trying to call glSamplerParameterf() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glSamplerParameterf() without current GL context";
+}
+
+void NoContextGLApi::glSamplerParameterfvFn(GLuint sampler,
+                                            GLenum pname,
+                                            const GLfloat* params) {
+  NOTREACHED()
+      << "Trying to call glSamplerParameterfv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glSamplerParameterfv() without current GL context";
+}
+
+void NoContextGLApi::glSamplerParameteriFn(GLuint sampler,
+                                           GLenum pname,
+                                           GLint param) {
+  NOTREACHED()
+      << "Trying to call glSamplerParameteri() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glSamplerParameteri() without current GL context";
+}
+
+void NoContextGLApi::glSamplerParameterivFn(GLuint sampler,
+                                            GLenum pname,
+                                            const GLint* params) {
+  NOTREACHED()
+      << "Trying to call glSamplerParameteriv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glSamplerParameteriv() without current GL context";
+}
+
+void NoContextGLApi::glScissorFn(GLint x,
+                                 GLint y,
+                                 GLsizei width,
+                                 GLsizei height) {
+  NOTREACHED() << "Trying to call glScissor() without current GL context";
+  LOG(ERROR) << "Trying to call glScissor() without current GL context";
+}
+
+void NoContextGLApi::glSetFenceAPPLEFn(GLuint fence) {
+  NOTREACHED() << "Trying to call glSetFenceAPPLE() without current GL context";
+  LOG(ERROR) << "Trying to call glSetFenceAPPLE() without current GL context";
+}
+
+void NoContextGLApi::glSetFenceNVFn(GLuint fence, GLenum condition) {
+  NOTREACHED() << "Trying to call glSetFenceNV() without current GL context";
+  LOG(ERROR) << "Trying to call glSetFenceNV() without current GL context";
+}
+
+void NoContextGLApi::glShaderBinaryFn(GLsizei n,
+                                      const GLuint* shaders,
+                                      GLenum binaryformat,
+                                      const void* binary,
+                                      GLsizei length) {
+  NOTREACHED() << "Trying to call glShaderBinary() without current GL context";
+  LOG(ERROR) << "Trying to call glShaderBinary() without current GL context";
+}
+
+void NoContextGLApi::glShaderSourceFn(GLuint shader,
+                                      GLsizei count,
+                                      const char* const* str,
+                                      const GLint* length) {
+  NOTREACHED() << "Trying to call glShaderSource() without current GL context";
+  LOG(ERROR) << "Trying to call glShaderSource() without current GL context";
+}
+
+void NoContextGLApi::glStencilFuncFn(GLenum func, GLint ref, GLuint mask) {
+  NOTREACHED() << "Trying to call glStencilFunc() without current GL context";
+  LOG(ERROR) << "Trying to call glStencilFunc() without current GL context";
+}
+
+void NoContextGLApi::glStencilFuncSeparateFn(GLenum face,
+                                             GLenum func,
+                                             GLint ref,
+                                             GLuint mask) {
+  NOTREACHED()
+      << "Trying to call glStencilFuncSeparate() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glStencilFuncSeparate() without current GL context";
+}
+
+void NoContextGLApi::glStencilMaskFn(GLuint mask) {
+  NOTREACHED() << "Trying to call glStencilMask() without current GL context";
+  LOG(ERROR) << "Trying to call glStencilMask() without current GL context";
+}
+
+void NoContextGLApi::glStencilMaskSeparateFn(GLenum face, GLuint mask) {
+  NOTREACHED()
+      << "Trying to call glStencilMaskSeparate() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glStencilMaskSeparate() without current GL context";
+}
+
+void NoContextGLApi::glStencilOpFn(GLenum fail, GLenum zfail, GLenum zpass) {
+  NOTREACHED() << "Trying to call glStencilOp() without current GL context";
+  LOG(ERROR) << "Trying to call glStencilOp() without current GL context";
+}
+
+void NoContextGLApi::glStencilOpSeparateFn(GLenum face,
+                                           GLenum fail,
+                                           GLenum zfail,
+                                           GLenum zpass) {
+  NOTREACHED()
+      << "Trying to call glStencilOpSeparate() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glStencilOpSeparate() without current GL context";
+}
+
+GLboolean NoContextGLApi::glTestFenceAPPLEFn(GLuint fence) {
+  NOTREACHED()
+      << "Trying to call glTestFenceAPPLE() without current GL context";
+  LOG(ERROR) << "Trying to call glTestFenceAPPLE() without current GL context";
+  return GL_FALSE;
+}
+
+GLboolean NoContextGLApi::glTestFenceNVFn(GLuint fence) {
+  NOTREACHED() << "Trying to call glTestFenceNV() without current GL context";
+  LOG(ERROR) << "Trying to call glTestFenceNV() without current GL context";
+  return GL_FALSE;
+}
+
+void NoContextGLApi::glTexImage2DFn(GLenum target,
+                                    GLint level,
+                                    GLint internalformat,
+                                    GLsizei width,
+                                    GLsizei height,
+                                    GLint border,
+                                    GLenum format,
+                                    GLenum type,
+                                    const void* pixels) {
+  NOTREACHED() << "Trying to call glTexImage2D() without current GL context";
+  LOG(ERROR) << "Trying to call glTexImage2D() without current GL context";
+}
+
+void NoContextGLApi::glTexImage3DFn(GLenum target,
+                                    GLint level,
+                                    GLint internalformat,
+                                    GLsizei width,
+                                    GLsizei height,
+                                    GLsizei depth,
+                                    GLint border,
+                                    GLenum format,
+                                    GLenum type,
+                                    const void* pixels) {
+  NOTREACHED() << "Trying to call glTexImage3D() without current GL context";
+  LOG(ERROR) << "Trying to call glTexImage3D() without current GL context";
+}
+
+void NoContextGLApi::glTexParameterfFn(GLenum target,
+                                       GLenum pname,
+                                       GLfloat param) {
+  NOTREACHED() << "Trying to call glTexParameterf() without current GL context";
+  LOG(ERROR) << "Trying to call glTexParameterf() without current GL context";
+}
+
+void NoContextGLApi::glTexParameterfvFn(GLenum target,
+                                        GLenum pname,
+                                        const GLfloat* params) {
+  NOTREACHED()
+      << "Trying to call glTexParameterfv() without current GL context";
+  LOG(ERROR) << "Trying to call glTexParameterfv() without current GL context";
+}
+
+void NoContextGLApi::glTexParameteriFn(GLenum target,
+                                       GLenum pname,
+                                       GLint param) {
+  NOTREACHED() << "Trying to call glTexParameteri() without current GL context";
+  LOG(ERROR) << "Trying to call glTexParameteri() without current GL context";
+}
+
+void NoContextGLApi::glTexParameterivFn(GLenum target,
+                                        GLenum pname,
+                                        const GLint* params) {
+  NOTREACHED()
+      << "Trying to call glTexParameteriv() without current GL context";
+  LOG(ERROR) << "Trying to call glTexParameteriv() without current GL context";
+}
+
+void NoContextGLApi::glTexStorage2DEXTFn(GLenum target,
+                                         GLsizei levels,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height) {
+  NOTREACHED()
+      << "Trying to call glTexStorage2DEXT() without current GL context";
+  LOG(ERROR) << "Trying to call glTexStorage2DEXT() without current GL context";
+}
+
+void NoContextGLApi::glTexStorage3DFn(GLenum target,
+                                      GLsizei levels,
+                                      GLenum internalformat,
+                                      GLsizei width,
+                                      GLsizei height,
+                                      GLsizei depth) {
+  NOTREACHED() << "Trying to call glTexStorage3D() without current GL context";
+  LOG(ERROR) << "Trying to call glTexStorage3D() without current GL context";
+}
+
+void NoContextGLApi::glTexSubImage2DFn(GLenum target,
+                                       GLint level,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLenum format,
+                                       GLenum type,
+                                       const void* pixels) {
+  NOTREACHED() << "Trying to call glTexSubImage2D() without current GL context";
+  LOG(ERROR) << "Trying to call glTexSubImage2D() without current GL context";
+}
+
+void NoContextGLApi::glTransformFeedbackVaryingsFn(GLuint program,
+                                                   GLsizei count,
+                                                   const char* const* varyings,
+                                                   GLenum bufferMode) {
+  NOTREACHED() << "Trying to call glTransformFeedbackVaryings() without "
+                  "current GL context";
+  LOG(ERROR) << "Trying to call glTransformFeedbackVaryings() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glUniform1fFn(GLint location, GLfloat x) {
+  NOTREACHED() << "Trying to call glUniform1f() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform1f() without current GL context";
+}
+
+void NoContextGLApi::glUniform1fvFn(GLint location,
+                                    GLsizei count,
+                                    const GLfloat* v) {
+  NOTREACHED() << "Trying to call glUniform1fv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform1fv() without current GL context";
+}
+
+void NoContextGLApi::glUniform1iFn(GLint location, GLint x) {
+  NOTREACHED() << "Trying to call glUniform1i() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform1i() without current GL context";
+}
+
+void NoContextGLApi::glUniform1ivFn(GLint location,
+                                    GLsizei count,
+                                    const GLint* v) {
+  NOTREACHED() << "Trying to call glUniform1iv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform1iv() without current GL context";
+}
+
+void NoContextGLApi::glUniform1uiFn(GLint location, GLuint v0) {
+  NOTREACHED() << "Trying to call glUniform1ui() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform1ui() without current GL context";
+}
+
+void NoContextGLApi::glUniform1uivFn(GLint location,
+                                     GLsizei count,
+                                     const GLuint* v) {
+  NOTREACHED() << "Trying to call glUniform1uiv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform1uiv() without current GL context";
+}
+
+void NoContextGLApi::glUniform2fFn(GLint location, GLfloat x, GLfloat y) {
+  NOTREACHED() << "Trying to call glUniform2f() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform2f() without current GL context";
+}
+
+void NoContextGLApi::glUniform2fvFn(GLint location,
+                                    GLsizei count,
+                                    const GLfloat* v) {
+  NOTREACHED() << "Trying to call glUniform2fv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform2fv() without current GL context";
+}
+
+void NoContextGLApi::glUniform2iFn(GLint location, GLint x, GLint y) {
+  NOTREACHED() << "Trying to call glUniform2i() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform2i() without current GL context";
+}
+
+void NoContextGLApi::glUniform2ivFn(GLint location,
+                                    GLsizei count,
+                                    const GLint* v) {
+  NOTREACHED() << "Trying to call glUniform2iv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform2iv() without current GL context";
+}
+
+void NoContextGLApi::glUniform2uiFn(GLint location, GLuint v0, GLuint v1) {
+  NOTREACHED() << "Trying to call glUniform2ui() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform2ui() without current GL context";
+}
+
+void NoContextGLApi::glUniform2uivFn(GLint location,
+                                     GLsizei count,
+                                     const GLuint* v) {
+  NOTREACHED() << "Trying to call glUniform2uiv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform2uiv() without current GL context";
+}
+
+void NoContextGLApi::glUniform3fFn(GLint location,
+                                   GLfloat x,
+                                   GLfloat y,
+                                   GLfloat z) {
+  NOTREACHED() << "Trying to call glUniform3f() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform3f() without current GL context";
+}
+
+void NoContextGLApi::glUniform3fvFn(GLint location,
+                                    GLsizei count,
+                                    const GLfloat* v) {
+  NOTREACHED() << "Trying to call glUniform3fv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform3fv() without current GL context";
+}
+
+void NoContextGLApi::glUniform3iFn(GLint location, GLint x, GLint y, GLint z) {
+  NOTREACHED() << "Trying to call glUniform3i() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform3i() without current GL context";
+}
+
+void NoContextGLApi::glUniform3ivFn(GLint location,
+                                    GLsizei count,
+                                    const GLint* v) {
+  NOTREACHED() << "Trying to call glUniform3iv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform3iv() without current GL context";
+}
+
+void NoContextGLApi::glUniform3uiFn(GLint location,
+                                    GLuint v0,
+                                    GLuint v1,
+                                    GLuint v2) {
+  NOTREACHED() << "Trying to call glUniform3ui() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform3ui() without current GL context";
+}
+
+void NoContextGLApi::glUniform3uivFn(GLint location,
+                                     GLsizei count,
+                                     const GLuint* v) {
+  NOTREACHED() << "Trying to call glUniform3uiv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform3uiv() without current GL context";
+}
+
+void NoContextGLApi::glUniform4fFn(GLint location,
+                                   GLfloat x,
+                                   GLfloat y,
+                                   GLfloat z,
+                                   GLfloat w) {
+  NOTREACHED() << "Trying to call glUniform4f() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform4f() without current GL context";
+}
+
+void NoContextGLApi::glUniform4fvFn(GLint location,
+                                    GLsizei count,
+                                    const GLfloat* v) {
+  NOTREACHED() << "Trying to call glUniform4fv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform4fv() without current GL context";
+}
+
+void NoContextGLApi::glUniform4iFn(GLint location,
+                                   GLint x,
+                                   GLint y,
+                                   GLint z,
+                                   GLint w) {
+  NOTREACHED() << "Trying to call glUniform4i() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform4i() without current GL context";
+}
+
+void NoContextGLApi::glUniform4ivFn(GLint location,
+                                    GLsizei count,
+                                    const GLint* v) {
+  NOTREACHED() << "Trying to call glUniform4iv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform4iv() without current GL context";
+}
+
+void NoContextGLApi::glUniform4uiFn(GLint location,
+                                    GLuint v0,
+                                    GLuint v1,
+                                    GLuint v2,
+                                    GLuint v3) {
+  NOTREACHED() << "Trying to call glUniform4ui() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform4ui() without current GL context";
+}
+
+void NoContextGLApi::glUniform4uivFn(GLint location,
+                                     GLsizei count,
+                                     const GLuint* v) {
+  NOTREACHED() << "Trying to call glUniform4uiv() without current GL context";
+  LOG(ERROR) << "Trying to call glUniform4uiv() without current GL context";
+}
+
+void NoContextGLApi::glUniformBlockBindingFn(GLuint program,
+                                             GLuint uniformBlockIndex,
+                                             GLuint uniformBlockBinding) {
+  NOTREACHED()
+      << "Trying to call glUniformBlockBinding() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformBlockBinding() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix2fvFn(GLint location,
+                                          GLsizei count,
+                                          GLboolean transpose,
+                                          const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix2fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix2fv() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix2x3fvFn(GLint location,
+                                            GLsizei count,
+                                            GLboolean transpose,
+                                            const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix2x3fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix2x3fv() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix2x4fvFn(GLint location,
+                                            GLsizei count,
+                                            GLboolean transpose,
+                                            const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix2x4fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix2x4fv() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix3fvFn(GLint location,
+                                          GLsizei count,
+                                          GLboolean transpose,
+                                          const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix3fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix3fv() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix3x2fvFn(GLint location,
+                                            GLsizei count,
+                                            GLboolean transpose,
+                                            const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix3x2fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix3x2fv() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix3x4fvFn(GLint location,
+                                            GLsizei count,
+                                            GLboolean transpose,
+                                            const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix3x4fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix3x4fv() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix4fvFn(GLint location,
+                                          GLsizei count,
+                                          GLboolean transpose,
+                                          const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix4fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix4fv() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix4x2fvFn(GLint location,
+                                            GLsizei count,
+                                            GLboolean transpose,
+                                            const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix4x2fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix4x2fv() without current GL context";
+}
+
+void NoContextGLApi::glUniformMatrix4x3fvFn(GLint location,
+                                            GLsizei count,
+                                            GLboolean transpose,
+                                            const GLfloat* value) {
+  NOTREACHED()
+      << "Trying to call glUniformMatrix4x3fv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glUniformMatrix4x3fv() without current GL context";
+}
+
+GLboolean NoContextGLApi::glUnmapBufferFn(GLenum target) {
+  NOTREACHED() << "Trying to call glUnmapBuffer() without current GL context";
+  LOG(ERROR) << "Trying to call glUnmapBuffer() without current GL context";
+  return GL_FALSE;
+}
+
+void NoContextGLApi::glUseProgramFn(GLuint program) {
+  NOTREACHED() << "Trying to call glUseProgram() without current GL context";
+  LOG(ERROR) << "Trying to call glUseProgram() without current GL context";
+}
+
+void NoContextGLApi::glValidateProgramFn(GLuint program) {
+  NOTREACHED()
+      << "Trying to call glValidateProgram() without current GL context";
+  LOG(ERROR) << "Trying to call glValidateProgram() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttrib1fFn(GLuint indx, GLfloat x) {
+  NOTREACHED()
+      << "Trying to call glVertexAttrib1f() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttrib1f() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttrib1fvFn(GLuint indx, const GLfloat* values) {
+  NOTREACHED()
+      << "Trying to call glVertexAttrib1fv() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttrib1fv() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttrib2fFn(GLuint indx, GLfloat x, GLfloat y) {
+  NOTREACHED()
+      << "Trying to call glVertexAttrib2f() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttrib2f() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttrib2fvFn(GLuint indx, const GLfloat* values) {
+  NOTREACHED()
+      << "Trying to call glVertexAttrib2fv() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttrib2fv() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttrib3fFn(GLuint indx,
+                                        GLfloat x,
+                                        GLfloat y,
+                                        GLfloat z) {
+  NOTREACHED()
+      << "Trying to call glVertexAttrib3f() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttrib3f() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttrib3fvFn(GLuint indx, const GLfloat* values) {
+  NOTREACHED()
+      << "Trying to call glVertexAttrib3fv() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttrib3fv() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttrib4fFn(GLuint indx,
+                                        GLfloat x,
+                                        GLfloat y,
+                                        GLfloat z,
+                                        GLfloat w) {
+  NOTREACHED()
+      << "Trying to call glVertexAttrib4f() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttrib4f() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttrib4fvFn(GLuint indx, const GLfloat* values) {
+  NOTREACHED()
+      << "Trying to call glVertexAttrib4fv() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttrib4fv() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttribDivisorANGLEFn(GLuint index,
+                                                  GLuint divisor) {
+  NOTREACHED() << "Trying to call glVertexAttribDivisorANGLE() without current "
+                  "GL context";
+  LOG(ERROR) << "Trying to call glVertexAttribDivisorANGLE() without current "
+                "GL context";
+}
+
+void NoContextGLApi::glVertexAttribI4iFn(GLuint indx,
+                                         GLint x,
+                                         GLint y,
+                                         GLint z,
+                                         GLint w) {
+  NOTREACHED()
+      << "Trying to call glVertexAttribI4i() without current GL context";
+  LOG(ERROR) << "Trying to call glVertexAttribI4i() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttribI4ivFn(GLuint indx, const GLint* values) {
+  NOTREACHED()
+      << "Trying to call glVertexAttribI4iv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glVertexAttribI4iv() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttribI4uiFn(GLuint indx,
+                                          GLuint x,
+                                          GLuint y,
+                                          GLuint z,
+                                          GLuint w) {
+  NOTREACHED()
+      << "Trying to call glVertexAttribI4ui() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glVertexAttribI4ui() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttribI4uivFn(GLuint indx, const GLuint* values) {
+  NOTREACHED()
+      << "Trying to call glVertexAttribI4uiv() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glVertexAttribI4uiv() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttribIPointerFn(GLuint indx,
+                                              GLint size,
+                                              GLenum type,
+                                              GLsizei stride,
+                                              const void* ptr) {
+  NOTREACHED()
+      << "Trying to call glVertexAttribIPointer() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glVertexAttribIPointer() without current GL context";
+}
+
+void NoContextGLApi::glVertexAttribPointerFn(GLuint indx,
+                                             GLint size,
+                                             GLenum type,
+                                             GLboolean normalized,
+                                             GLsizei stride,
+                                             const void* ptr) {
+  NOTREACHED()
+      << "Trying to call glVertexAttribPointer() without current GL context";
+  LOG(ERROR)
+      << "Trying to call glVertexAttribPointer() without current GL context";
+}
+
+void NoContextGLApi::glViewportFn(GLint x,
+                                  GLint y,
+                                  GLsizei width,
+                                  GLsizei height) {
+  NOTREACHED() << "Trying to call glViewport() without current GL context";
+  LOG(ERROR) << "Trying to call glViewport() without current GL context";
+}
+
+GLenum NoContextGLApi::glWaitSyncFn(GLsync sync,
+                                    GLbitfield flags,
+                                    GLuint64 timeout) {
+  NOTREACHED() << "Trying to call glWaitSync() without current GL context";
+  LOG(ERROR) << "Trying to call glWaitSync() without current GL context";
+  return static_cast<GLenum>(0);
+}
+
+}  // namespace gfx
diff --git a/ui/gl/gl_bindings_autogen_gl.h b/ui/gl/gl_bindings_autogen_gl.h
new file mode 100644
index 0000000..eb66b4a
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_gl.h
@@ -0,0 +1,2380 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
+#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
+
+namespace gfx {
+
+class GLContext;
+
+typedef void(GL_BINDING_CALL* glActiveTextureProc)(GLenum texture);
+typedef void(GL_BINDING_CALL* glAttachShaderProc)(GLuint program,
+                                                  GLuint shader);
+typedef void(GL_BINDING_CALL* glBeginQueryProc)(GLenum target, GLuint id);
+typedef void(GL_BINDING_CALL* glBeginQueryARBProc)(GLenum target, GLuint id);
+typedef void(GL_BINDING_CALL* glBeginTransformFeedbackProc)(
+    GLenum primitiveMode);
+typedef void(GL_BINDING_CALL* glBindAttribLocationProc)(GLuint program,
+                                                        GLuint index,
+                                                        const char* name);
+typedef void(GL_BINDING_CALL* glBindBufferProc)(GLenum target, GLuint buffer);
+typedef void(GL_BINDING_CALL* glBindBufferBaseProc)(GLenum target,
+                                                    GLuint index,
+                                                    GLuint buffer);
+typedef void(GL_BINDING_CALL* glBindBufferRangeProc)(GLenum target,
+                                                     GLuint index,
+                                                     GLuint buffer,
+                                                     GLintptr offset,
+                                                     GLsizeiptr size);
+typedef void(GL_BINDING_CALL* glBindFragDataLocationProc)(GLuint program,
+                                                          GLuint colorNumber,
+                                                          const char* name);
+typedef void(GL_BINDING_CALL* glBindFragDataLocationIndexedProc)(
+    GLuint program,
+    GLuint colorNumber,
+    GLuint index,
+    const char* name);
+typedef void(GL_BINDING_CALL* glBindFramebufferEXTProc)(GLenum target,
+                                                        GLuint framebuffer);
+typedef void(GL_BINDING_CALL* glBindRenderbufferEXTProc)(GLenum target,
+                                                         GLuint renderbuffer);
+typedef void(GL_BINDING_CALL* glBindSamplerProc)(GLuint unit, GLuint sampler);
+typedef void(GL_BINDING_CALL* glBindTextureProc)(GLenum target, GLuint texture);
+typedef void(GL_BINDING_CALL* glBindTransformFeedbackProc)(GLenum target,
+                                                           GLuint id);
+typedef void(GL_BINDING_CALL* glBindVertexArrayOESProc)(GLuint array);
+typedef void(GL_BINDING_CALL* glBlendBarrierKHRProc)(void);
+typedef void(GL_BINDING_CALL* glBlendColorProc)(GLclampf red,
+                                                GLclampf green,
+                                                GLclampf blue,
+                                                GLclampf alpha);
+typedef void(GL_BINDING_CALL* glBlendEquationProc)(GLenum mode);
+typedef void(GL_BINDING_CALL* glBlendEquationSeparateProc)(GLenum modeRGB,
+                                                           GLenum modeAlpha);
+typedef void(GL_BINDING_CALL* glBlendFuncProc)(GLenum sfactor, GLenum dfactor);
+typedef void(GL_BINDING_CALL* glBlendFuncSeparateProc)(GLenum srcRGB,
+                                                       GLenum dstRGB,
+                                                       GLenum srcAlpha,
+                                                       GLenum dstAlpha);
+typedef void(GL_BINDING_CALL* glBlitFramebufferProc)(GLint srcX0,
+                                                     GLint srcY0,
+                                                     GLint srcX1,
+                                                     GLint srcY1,
+                                                     GLint dstX0,
+                                                     GLint dstY0,
+                                                     GLint dstX1,
+                                                     GLint dstY1,
+                                                     GLbitfield mask,
+                                                     GLenum filter);
+typedef void(GL_BINDING_CALL* glBlitFramebufferANGLEProc)(GLint srcX0,
+                                                          GLint srcY0,
+                                                          GLint srcX1,
+                                                          GLint srcY1,
+                                                          GLint dstX0,
+                                                          GLint dstY0,
+                                                          GLint dstX1,
+                                                          GLint dstY1,
+                                                          GLbitfield mask,
+                                                          GLenum filter);
+typedef void(GL_BINDING_CALL* glBlitFramebufferEXTProc)(GLint srcX0,
+                                                        GLint srcY0,
+                                                        GLint srcX1,
+                                                        GLint srcY1,
+                                                        GLint dstX0,
+                                                        GLint dstY0,
+                                                        GLint dstX1,
+                                                        GLint dstY1,
+                                                        GLbitfield mask,
+                                                        GLenum filter);
+typedef void(GL_BINDING_CALL* glBufferDataProc)(GLenum target,
+                                                GLsizeiptr size,
+                                                const void* data,
+                                                GLenum usage);
+typedef void(GL_BINDING_CALL* glBufferSubDataProc)(GLenum target,
+                                                   GLintptr offset,
+                                                   GLsizeiptr size,
+                                                   const void* data);
+typedef GLenum(GL_BINDING_CALL* glCheckFramebufferStatusEXTProc)(GLenum target);
+typedef void(GL_BINDING_CALL* glClearProc)(GLbitfield mask);
+typedef void(GL_BINDING_CALL* glClearBufferfiProc)(GLenum buffer,
+                                                   GLint drawbuffer,
+                                                   const GLfloat depth,
+                                                   GLint stencil);
+typedef void(GL_BINDING_CALL* glClearBufferfvProc)(GLenum buffer,
+                                                   GLint drawbuffer,
+                                                   const GLfloat* value);
+typedef void(GL_BINDING_CALL* glClearBufferivProc)(GLenum buffer,
+                                                   GLint drawbuffer,
+                                                   const GLint* value);
+typedef void(GL_BINDING_CALL* glClearBufferuivProc)(GLenum buffer,
+                                                    GLint drawbuffer,
+                                                    const GLuint* value);
+typedef void(GL_BINDING_CALL* glClearColorProc)(GLclampf red,
+                                                GLclampf green,
+                                                GLclampf blue,
+                                                GLclampf alpha);
+typedef void(GL_BINDING_CALL* glClearDepthProc)(GLclampd depth);
+typedef void(GL_BINDING_CALL* glClearDepthfProc)(GLclampf depth);
+typedef void(GL_BINDING_CALL* glClearStencilProc)(GLint s);
+typedef GLenum(GL_BINDING_CALL* glClientWaitSyncProc)(GLsync sync,
+                                                      GLbitfield flags,
+                                                      GLuint64 timeout);
+typedef void(GL_BINDING_CALL* glColorMaskProc)(GLboolean red,
+                                               GLboolean green,
+                                               GLboolean blue,
+                                               GLboolean alpha);
+typedef void(GL_BINDING_CALL* glCompileShaderProc)(GLuint shader);
+typedef void(GL_BINDING_CALL* glCompressedTexImage2DProc)(GLenum target,
+                                                          GLint level,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height,
+                                                          GLint border,
+                                                          GLsizei imageSize,
+                                                          const void* data);
+typedef void(GL_BINDING_CALL* glCompressedTexImage3DProc)(GLenum target,
+                                                          GLint level,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height,
+                                                          GLsizei depth,
+                                                          GLint border,
+                                                          GLsizei imageSize,
+                                                          const void* data);
+typedef void(GL_BINDING_CALL* glCompressedTexSubImage2DProc)(GLenum target,
+                                                             GLint level,
+                                                             GLint xoffset,
+                                                             GLint yoffset,
+                                                             GLsizei width,
+                                                             GLsizei height,
+                                                             GLenum format,
+                                                             GLsizei imageSize,
+                                                             const void* data);
+typedef void(GL_BINDING_CALL* glCopyBufferSubDataProc)(GLenum readTarget,
+                                                       GLenum writeTarget,
+                                                       GLintptr readOffset,
+                                                       GLintptr writeOffset,
+                                                       GLsizeiptr size);
+typedef void(GL_BINDING_CALL* glCopyTexImage2DProc)(GLenum target,
+                                                    GLint level,
+                                                    GLenum internalformat,
+                                                    GLint x,
+                                                    GLint y,
+                                                    GLsizei width,
+                                                    GLsizei height,
+                                                    GLint border);
+typedef void(GL_BINDING_CALL* glCopyTexSubImage2DProc)(GLenum target,
+                                                       GLint level,
+                                                       GLint xoffset,
+                                                       GLint yoffset,
+                                                       GLint x,
+                                                       GLint y,
+                                                       GLsizei width,
+                                                       GLsizei height);
+typedef void(GL_BINDING_CALL* glCopyTexSubImage3DProc)(GLenum target,
+                                                       GLint level,
+                                                       GLint xoffset,
+                                                       GLint yoffset,
+                                                       GLint zoffset,
+                                                       GLint x,
+                                                       GLint y,
+                                                       GLsizei width,
+                                                       GLsizei height);
+typedef GLuint(GL_BINDING_CALL* glCreateProgramProc)(void);
+typedef GLuint(GL_BINDING_CALL* glCreateShaderProc)(GLenum type);
+typedef void(GL_BINDING_CALL* glCullFaceProc)(GLenum mode);
+typedef void(GL_BINDING_CALL* glDeleteBuffersARBProc)(GLsizei n,
+                                                      const GLuint* buffers);
+typedef void(GL_BINDING_CALL* glDeleteFencesAPPLEProc)(GLsizei n,
+                                                       const GLuint* fences);
+typedef void(GL_BINDING_CALL* glDeleteFencesNVProc)(GLsizei n,
+                                                    const GLuint* fences);
+typedef void(GL_BINDING_CALL* glDeleteFramebuffersEXTProc)(
+    GLsizei n,
+    const GLuint* framebuffers);
+typedef void(GL_BINDING_CALL* glDeleteProgramProc)(GLuint program);
+typedef void(GL_BINDING_CALL* glDeleteQueriesProc)(GLsizei n,
+                                                   const GLuint* ids);
+typedef void(GL_BINDING_CALL* glDeleteQueriesARBProc)(GLsizei n,
+                                                      const GLuint* ids);
+typedef void(GL_BINDING_CALL* glDeleteRenderbuffersEXTProc)(
+    GLsizei n,
+    const GLuint* renderbuffers);
+typedef void(GL_BINDING_CALL* glDeleteSamplersProc)(GLsizei n,
+                                                    const GLuint* samplers);
+typedef void(GL_BINDING_CALL* glDeleteShaderProc)(GLuint shader);
+typedef void(GL_BINDING_CALL* glDeleteSyncProc)(GLsync sync);
+typedef void(GL_BINDING_CALL* glDeleteTexturesProc)(GLsizei n,
+                                                    const GLuint* textures);
+typedef void(GL_BINDING_CALL* glDeleteTransformFeedbacksProc)(
+    GLsizei n,
+    const GLuint* ids);
+typedef void(GL_BINDING_CALL* glDeleteVertexArraysOESProc)(
+    GLsizei n,
+    const GLuint* arrays);
+typedef void(GL_BINDING_CALL* glDepthFuncProc)(GLenum func);
+typedef void(GL_BINDING_CALL* glDepthMaskProc)(GLboolean flag);
+typedef void(GL_BINDING_CALL* glDepthRangeProc)(GLclampd zNear, GLclampd zFar);
+typedef void(GL_BINDING_CALL* glDepthRangefProc)(GLclampf zNear, GLclampf zFar);
+typedef void(GL_BINDING_CALL* glDetachShaderProc)(GLuint program,
+                                                  GLuint shader);
+typedef void(GL_BINDING_CALL* glDisableProc)(GLenum cap);
+typedef void(GL_BINDING_CALL* glDisableVertexAttribArrayProc)(GLuint index);
+typedef void(GL_BINDING_CALL* glDiscardFramebufferEXTProc)(
+    GLenum target,
+    GLsizei numAttachments,
+    const GLenum* attachments);
+typedef void(GL_BINDING_CALL* glDrawArraysProc)(GLenum mode,
+                                                GLint first,
+                                                GLsizei count);
+typedef void(GL_BINDING_CALL* glDrawArraysInstancedANGLEProc)(
+    GLenum mode,
+    GLint first,
+    GLsizei count,
+    GLsizei primcount);
+typedef void(GL_BINDING_CALL* glDrawBufferProc)(GLenum mode);
+typedef void(GL_BINDING_CALL* glDrawBuffersARBProc)(GLsizei n,
+                                                    const GLenum* bufs);
+typedef void(GL_BINDING_CALL* glDrawElementsProc)(GLenum mode,
+                                                  GLsizei count,
+                                                  GLenum type,
+                                                  const void* indices);
+typedef void(GL_BINDING_CALL* glDrawElementsInstancedANGLEProc)(
+    GLenum mode,
+    GLsizei count,
+    GLenum type,
+    const void* indices,
+    GLsizei primcount);
+typedef void(GL_BINDING_CALL* glDrawRangeElementsProc)(GLenum mode,
+                                                       GLuint start,
+                                                       GLuint end,
+                                                       GLsizei count,
+                                                       GLenum type,
+                                                       const void* indices);
+typedef void(GL_BINDING_CALL* glEGLImageTargetRenderbufferStorageOESProc)(
+    GLenum target,
+    GLeglImageOES image);
+typedef void(GL_BINDING_CALL* glEGLImageTargetTexture2DOESProc)(
+    GLenum target,
+    GLeglImageOES image);
+typedef void(GL_BINDING_CALL* glEnableProc)(GLenum cap);
+typedef void(GL_BINDING_CALL* glEnableVertexAttribArrayProc)(GLuint index);
+typedef void(GL_BINDING_CALL* glEndQueryProc)(GLenum target);
+typedef void(GL_BINDING_CALL* glEndQueryARBProc)(GLenum target);
+typedef void(GL_BINDING_CALL* glEndTransformFeedbackProc)(void);
+typedef GLsync(GL_BINDING_CALL* glFenceSyncProc)(GLenum condition,
+                                                 GLbitfield flags);
+typedef void(GL_BINDING_CALL* glFinishProc)(void);
+typedef void(GL_BINDING_CALL* glFinishFenceAPPLEProc)(GLuint fence);
+typedef void(GL_BINDING_CALL* glFinishFenceNVProc)(GLuint fence);
+typedef void(GL_BINDING_CALL* glFlushProc)(void);
+typedef void(GL_BINDING_CALL* glFlushMappedBufferRangeProc)(GLenum target,
+                                                            GLintptr offset,
+                                                            GLsizeiptr length);
+typedef void(GL_BINDING_CALL* glFramebufferRenderbufferEXTProc)(
+    GLenum target,
+    GLenum attachment,
+    GLenum renderbuffertarget,
+    GLuint renderbuffer);
+typedef void(GL_BINDING_CALL* glFramebufferTexture2DEXTProc)(GLenum target,
+                                                             GLenum attachment,
+                                                             GLenum textarget,
+                                                             GLuint texture,
+                                                             GLint level);
+typedef void(GL_BINDING_CALL* glFramebufferTexture2DMultisampleEXTProc)(
+    GLenum target,
+    GLenum attachment,
+    GLenum textarget,
+    GLuint texture,
+    GLint level,
+    GLsizei samples);
+typedef void(GL_BINDING_CALL* glFramebufferTexture2DMultisampleIMGProc)(
+    GLenum target,
+    GLenum attachment,
+    GLenum textarget,
+    GLuint texture,
+    GLint level,
+    GLsizei samples);
+typedef void(GL_BINDING_CALL* glFramebufferTextureLayerProc)(GLenum target,
+                                                             GLenum attachment,
+                                                             GLuint texture,
+                                                             GLint level,
+                                                             GLint layer);
+typedef void(GL_BINDING_CALL* glFrontFaceProc)(GLenum mode);
+typedef void(GL_BINDING_CALL* glGenBuffersARBProc)(GLsizei n, GLuint* buffers);
+typedef void(GL_BINDING_CALL* glGenerateMipmapEXTProc)(GLenum target);
+typedef void(GL_BINDING_CALL* glGenFencesAPPLEProc)(GLsizei n, GLuint* fences);
+typedef void(GL_BINDING_CALL* glGenFencesNVProc)(GLsizei n, GLuint* fences);
+typedef void(GL_BINDING_CALL* glGenFramebuffersEXTProc)(GLsizei n,
+                                                        GLuint* framebuffers);
+typedef void(GL_BINDING_CALL* glGenQueriesProc)(GLsizei n, GLuint* ids);
+typedef void(GL_BINDING_CALL* glGenQueriesARBProc)(GLsizei n, GLuint* ids);
+typedef void(GL_BINDING_CALL* glGenRenderbuffersEXTProc)(GLsizei n,
+                                                         GLuint* renderbuffers);
+typedef void(GL_BINDING_CALL* glGenSamplersProc)(GLsizei n, GLuint* samplers);
+typedef void(GL_BINDING_CALL* glGenTexturesProc)(GLsizei n, GLuint* textures);
+typedef void(GL_BINDING_CALL* glGenTransformFeedbacksProc)(GLsizei n,
+                                                           GLuint* ids);
+typedef void(GL_BINDING_CALL* glGenVertexArraysOESProc)(GLsizei n,
+                                                        GLuint* arrays);
+typedef void(GL_BINDING_CALL* glGetActiveAttribProc)(GLuint program,
+                                                     GLuint index,
+                                                     GLsizei bufsize,
+                                                     GLsizei* length,
+                                                     GLint* size,
+                                                     GLenum* type,
+                                                     char* name);
+typedef void(GL_BINDING_CALL* glGetActiveUniformProc)(GLuint program,
+                                                      GLuint index,
+                                                      GLsizei bufsize,
+                                                      GLsizei* length,
+                                                      GLint* size,
+                                                      GLenum* type,
+                                                      char* name);
+typedef void(GL_BINDING_CALL* glGetActiveUniformBlockivProc)(
+    GLuint program,
+    GLuint uniformBlockIndex,
+    GLenum pname,
+    GLint* params);
+typedef void(GL_BINDING_CALL* glGetActiveUniformBlockNameProc)(
+    GLuint program,
+    GLuint uniformBlockIndex,
+    GLsizei bufSize,
+    GLsizei* length,
+    char* uniformBlockName);
+typedef void(GL_BINDING_CALL* glGetActiveUniformsivProc)(
+    GLuint program,
+    GLsizei uniformCount,
+    const GLuint* uniformIndices,
+    GLenum pname,
+    GLint* params);
+typedef void(GL_BINDING_CALL* glGetAttachedShadersProc)(GLuint program,
+                                                        GLsizei maxcount,
+                                                        GLsizei* count,
+                                                        GLuint* shaders);
+typedef GLint(GL_BINDING_CALL* glGetAttribLocationProc)(GLuint program,
+                                                        const char* name);
+typedef void(GL_BINDING_CALL* glGetBooleanvProc)(GLenum pname,
+                                                 GLboolean* params);
+typedef void(GL_BINDING_CALL* glGetBufferParameterivProc)(GLenum target,
+                                                          GLenum pname,
+                                                          GLint* params);
+typedef GLenum(GL_BINDING_CALL* glGetErrorProc)(void);
+typedef void(GL_BINDING_CALL* glGetFenceivNVProc)(GLuint fence,
+                                                  GLenum pname,
+                                                  GLint* params);
+typedef void(GL_BINDING_CALL* glGetFloatvProc)(GLenum pname, GLfloat* params);
+typedef GLint(GL_BINDING_CALL* glGetFragDataLocationProc)(GLuint program,
+                                                          const char* name);
+typedef void(GL_BINDING_CALL* glGetFramebufferAttachmentParameterivEXTProc)(
+    GLenum target,
+    GLenum attachment,
+    GLenum pname,
+    GLint* params);
+typedef GLenum(GL_BINDING_CALL* glGetGraphicsResetStatusARBProc)(void);
+typedef void(GL_BINDING_CALL* glGetInteger64i_vProc)(GLenum target,
+                                                     GLuint index,
+                                                     GLint64* data);
+typedef void(GL_BINDING_CALL* glGetInteger64vProc)(GLenum pname,
+                                                   GLint64* params);
+typedef void(GL_BINDING_CALL* glGetIntegeri_vProc)(GLenum target,
+                                                   GLuint index,
+                                                   GLint* data);
+typedef void(GL_BINDING_CALL* glGetIntegervProc)(GLenum pname, GLint* params);
+typedef void(GL_BINDING_CALL* glGetInternalformativProc)(GLenum target,
+                                                         GLenum internalformat,
+                                                         GLenum pname,
+                                                         GLsizei bufSize,
+                                                         GLint* params);
+typedef void(GL_BINDING_CALL* glGetProgramBinaryProc)(GLuint program,
+                                                      GLsizei bufSize,
+                                                      GLsizei* length,
+                                                      GLenum* binaryFormat,
+                                                      GLvoid* binary);
+typedef void(GL_BINDING_CALL* glGetProgramInfoLogProc)(GLuint program,
+                                                       GLsizei bufsize,
+                                                       GLsizei* length,
+                                                       char* infolog);
+typedef void(GL_BINDING_CALL* glGetProgramivProc)(GLuint program,
+                                                  GLenum pname,
+                                                  GLint* params);
+typedef void(GL_BINDING_CALL* glGetQueryivProc)(GLenum target,
+                                                GLenum pname,
+                                                GLint* params);
+typedef void(GL_BINDING_CALL* glGetQueryivARBProc)(GLenum target,
+                                                   GLenum pname,
+                                                   GLint* params);
+typedef void(GL_BINDING_CALL* glGetQueryObjecti64vProc)(GLuint id,
+                                                        GLenum pname,
+                                                        GLint64* params);
+typedef void(GL_BINDING_CALL* glGetQueryObjectivProc)(GLuint id,
+                                                      GLenum pname,
+                                                      GLint* params);
+typedef void(GL_BINDING_CALL* glGetQueryObjectivARBProc)(GLuint id,
+                                                         GLenum pname,
+                                                         GLint* params);
+typedef void(GL_BINDING_CALL* glGetQueryObjectui64vProc)(GLuint id,
+                                                         GLenum pname,
+                                                         GLuint64* params);
+typedef void(GL_BINDING_CALL* glGetQueryObjectuivProc)(GLuint id,
+                                                       GLenum pname,
+                                                       GLuint* params);
+typedef void(GL_BINDING_CALL* glGetQueryObjectuivARBProc)(GLuint id,
+                                                          GLenum pname,
+                                                          GLuint* params);
+typedef void(GL_BINDING_CALL* glGetRenderbufferParameterivEXTProc)(
+    GLenum target,
+    GLenum pname,
+    GLint* params);
+typedef void(GL_BINDING_CALL* glGetSamplerParameterfvProc)(GLuint sampler,
+                                                           GLenum pname,
+                                                           GLfloat* params);
+typedef void(GL_BINDING_CALL* glGetSamplerParameterivProc)(GLuint sampler,
+                                                           GLenum pname,
+                                                           GLint* params);
+typedef void(GL_BINDING_CALL* glGetShaderInfoLogProc)(GLuint shader,
+                                                      GLsizei bufsize,
+                                                      GLsizei* length,
+                                                      char* infolog);
+typedef void(GL_BINDING_CALL* glGetShaderivProc)(GLuint shader,
+                                                 GLenum pname,
+                                                 GLint* params);
+typedef void(GL_BINDING_CALL* glGetShaderPrecisionFormatProc)(
+    GLenum shadertype,
+    GLenum precisiontype,
+    GLint* range,
+    GLint* precision);
+typedef void(GL_BINDING_CALL* glGetShaderSourceProc)(GLuint shader,
+                                                     GLsizei bufsize,
+                                                     GLsizei* length,
+                                                     char* source);
+typedef const GLubyte*(GL_BINDING_CALL* glGetStringProc)(GLenum name);
+typedef void(GL_BINDING_CALL* glGetSyncivProc)(GLsync sync,
+                                               GLenum pname,
+                                               GLsizei bufSize,
+                                               GLsizei* length,
+                                               GLint* values);
+typedef void(GL_BINDING_CALL* glGetTexLevelParameterfvProc)(GLenum target,
+                                                            GLint level,
+                                                            GLenum pname,
+                                                            GLfloat* params);
+typedef void(GL_BINDING_CALL* glGetTexLevelParameterivProc)(GLenum target,
+                                                            GLint level,
+                                                            GLenum pname,
+                                                            GLint* params);
+typedef void(GL_BINDING_CALL* glGetTexParameterfvProc)(GLenum target,
+                                                       GLenum pname,
+                                                       GLfloat* params);
+typedef void(GL_BINDING_CALL* glGetTexParameterivProc)(GLenum target,
+                                                       GLenum pname,
+                                                       GLint* params);
+typedef void(GL_BINDING_CALL* glGetTransformFeedbackVaryingProc)(
+    GLuint program,
+    GLuint index,
+    GLsizei bufSize,
+    GLsizei* length,
+    GLenum* type,
+    char* name);
+typedef void(GL_BINDING_CALL* glGetTranslatedShaderSourceANGLEProc)(
+    GLuint shader,
+    GLsizei bufsize,
+    GLsizei* length,
+    char* source);
+typedef GLuint(GL_BINDING_CALL* glGetUniformBlockIndexProc)(
+    GLuint program,
+    const char* uniformBlockName);
+typedef void(GL_BINDING_CALL* glGetUniformfvProc)(GLuint program,
+                                                  GLint location,
+                                                  GLfloat* params);
+typedef void(GL_BINDING_CALL* glGetUniformIndicesProc)(
+    GLuint program,
+    GLsizei uniformCount,
+    const char* const* uniformNames,
+    GLuint* uniformIndices);
+typedef void(GL_BINDING_CALL* glGetUniformivProc)(GLuint program,
+                                                  GLint location,
+                                                  GLint* params);
+typedef GLint(GL_BINDING_CALL* glGetUniformLocationProc)(GLuint program,
+                                                         const char* name);
+typedef void(GL_BINDING_CALL* glGetVertexAttribfvProc)(GLuint index,
+                                                       GLenum pname,
+                                                       GLfloat* params);
+typedef void(GL_BINDING_CALL* glGetVertexAttribivProc)(GLuint index,
+                                                       GLenum pname,
+                                                       GLint* params);
+typedef void(GL_BINDING_CALL* glGetVertexAttribPointervProc)(GLuint index,
+                                                             GLenum pname,
+                                                             void** pointer);
+typedef void(GL_BINDING_CALL* glHintProc)(GLenum target, GLenum mode);
+typedef void(GL_BINDING_CALL* glInsertEventMarkerEXTProc)(GLsizei length,
+                                                          const char* marker);
+typedef void(GL_BINDING_CALL* glInvalidateFramebufferProc)(
+    GLenum target,
+    GLsizei numAttachments,
+    const GLenum* attachments);
+typedef void(GL_BINDING_CALL* glInvalidateSubFramebufferProc)(
+    GLenum target,
+    GLsizei numAttachments,
+    const GLenum* attachments,
+    GLint x,
+    GLint y,
+    GLint width,
+    GLint height);
+typedef GLboolean(GL_BINDING_CALL* glIsBufferProc)(GLuint buffer);
+typedef GLboolean(GL_BINDING_CALL* glIsEnabledProc)(GLenum cap);
+typedef GLboolean(GL_BINDING_CALL* glIsFenceAPPLEProc)(GLuint fence);
+typedef GLboolean(GL_BINDING_CALL* glIsFenceNVProc)(GLuint fence);
+typedef GLboolean(GL_BINDING_CALL* glIsFramebufferEXTProc)(GLuint framebuffer);
+typedef GLboolean(GL_BINDING_CALL* glIsProgramProc)(GLuint program);
+typedef GLboolean(GL_BINDING_CALL* glIsQueryProc)(GLuint query);
+typedef GLboolean(GL_BINDING_CALL* glIsQueryARBProc)(GLuint query);
+typedef GLboolean(GL_BINDING_CALL* glIsRenderbufferEXTProc)(
+    GLuint renderbuffer);
+typedef GLboolean(GL_BINDING_CALL* glIsSamplerProc)(GLuint sampler);
+typedef GLboolean(GL_BINDING_CALL* glIsShaderProc)(GLuint shader);
+typedef GLboolean(GL_BINDING_CALL* glIsSyncProc)(GLsync sync);
+typedef GLboolean(GL_BINDING_CALL* glIsTextureProc)(GLuint texture);
+typedef GLboolean(GL_BINDING_CALL* glIsTransformFeedbackProc)(GLuint id);
+typedef GLboolean(GL_BINDING_CALL* glIsVertexArrayOESProc)(GLuint array);
+typedef void(GL_BINDING_CALL* glLineWidthProc)(GLfloat width);
+typedef void(GL_BINDING_CALL* glLinkProgramProc)(GLuint program);
+typedef void*(GL_BINDING_CALL* glMapBufferProc)(GLenum target, GLenum access);
+typedef void*(GL_BINDING_CALL* glMapBufferRangeProc)(GLenum target,
+                                                     GLintptr offset,
+                                                     GLsizeiptr length,
+                                                     GLbitfield access);
+typedef void(GL_BINDING_CALL* glMatrixLoadfEXTProc)(GLenum matrixMode,
+                                                    const GLfloat* m);
+typedef void(GL_BINDING_CALL* glMatrixLoadIdentityEXTProc)(GLenum matrixMode);
+typedef void(GL_BINDING_CALL* glPauseTransformFeedbackProc)(void);
+typedef void(GL_BINDING_CALL* glPixelStoreiProc)(GLenum pname, GLint param);
+typedef void(GL_BINDING_CALL* glPointParameteriProc)(GLenum pname, GLint param);
+typedef void(GL_BINDING_CALL* glPolygonOffsetProc)(GLfloat factor,
+                                                   GLfloat units);
+typedef void(GL_BINDING_CALL* glPopGroupMarkerEXTProc)(void);
+typedef void(GL_BINDING_CALL* glProgramBinaryProc)(GLuint program,
+                                                   GLenum binaryFormat,
+                                                   const GLvoid* binary,
+                                                   GLsizei length);
+typedef void(GL_BINDING_CALL* glProgramParameteriProc)(GLuint program,
+                                                       GLenum pname,
+                                                       GLint value);
+typedef void(GL_BINDING_CALL* glPushGroupMarkerEXTProc)(GLsizei length,
+                                                        const char* marker);
+typedef void(GL_BINDING_CALL* glQueryCounterProc)(GLuint id, GLenum target);
+typedef void(GL_BINDING_CALL* glReadBufferProc)(GLenum src);
+typedef void(GL_BINDING_CALL* glReadPixelsProc)(GLint x,
+                                                GLint y,
+                                                GLsizei width,
+                                                GLsizei height,
+                                                GLenum format,
+                                                GLenum type,
+                                                void* pixels);
+typedef void(GL_BINDING_CALL* glReleaseShaderCompilerProc)(void);
+typedef void(GL_BINDING_CALL* glRenderbufferStorageEXTProc)(
+    GLenum target,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height);
+typedef void(GL_BINDING_CALL* glRenderbufferStorageMultisampleProc)(
+    GLenum target,
+    GLsizei samples,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height);
+typedef void(GL_BINDING_CALL* glRenderbufferStorageMultisampleANGLEProc)(
+    GLenum target,
+    GLsizei samples,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height);
+typedef void(GL_BINDING_CALL* glRenderbufferStorageMultisampleEXTProc)(
+    GLenum target,
+    GLsizei samples,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height);
+typedef void(GL_BINDING_CALL* glRenderbufferStorageMultisampleIMGProc)(
+    GLenum target,
+    GLsizei samples,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height);
+typedef void(GL_BINDING_CALL* glResumeTransformFeedbackProc)(void);
+typedef void(GL_BINDING_CALL* glSampleCoverageProc)(GLclampf value,
+                                                    GLboolean invert);
+typedef void(GL_BINDING_CALL* glSamplerParameterfProc)(GLuint sampler,
+                                                       GLenum pname,
+                                                       GLfloat param);
+typedef void(GL_BINDING_CALL* glSamplerParameterfvProc)(GLuint sampler,
+                                                        GLenum pname,
+                                                        const GLfloat* params);
+typedef void(GL_BINDING_CALL* glSamplerParameteriProc)(GLuint sampler,
+                                                       GLenum pname,
+                                                       GLint param);
+typedef void(GL_BINDING_CALL* glSamplerParameterivProc)(GLuint sampler,
+                                                        GLenum pname,
+                                                        const GLint* params);
+typedef void(GL_BINDING_CALL* glScissorProc)(GLint x,
+                                             GLint y,
+                                             GLsizei width,
+                                             GLsizei height);
+typedef void(GL_BINDING_CALL* glSetFenceAPPLEProc)(GLuint fence);
+typedef void(GL_BINDING_CALL* glSetFenceNVProc)(GLuint fence, GLenum condition);
+typedef void(GL_BINDING_CALL* glShaderBinaryProc)(GLsizei n,
+                                                  const GLuint* shaders,
+                                                  GLenum binaryformat,
+                                                  const void* binary,
+                                                  GLsizei length);
+typedef void(GL_BINDING_CALL* glShaderSourceProc)(GLuint shader,
+                                                  GLsizei count,
+                                                  const char* const* str,
+                                                  const GLint* length);
+typedef void(GL_BINDING_CALL* glStencilFuncProc)(GLenum func,
+                                                 GLint ref,
+                                                 GLuint mask);
+typedef void(GL_BINDING_CALL* glStencilFuncSeparateProc)(GLenum face,
+                                                         GLenum func,
+                                                         GLint ref,
+                                                         GLuint mask);
+typedef void(GL_BINDING_CALL* glStencilMaskProc)(GLuint mask);
+typedef void(GL_BINDING_CALL* glStencilMaskSeparateProc)(GLenum face,
+                                                         GLuint mask);
+typedef void(GL_BINDING_CALL* glStencilOpProc)(GLenum fail,
+                                               GLenum zfail,
+                                               GLenum zpass);
+typedef void(GL_BINDING_CALL* glStencilOpSeparateProc)(GLenum face,
+                                                       GLenum fail,
+                                                       GLenum zfail,
+                                                       GLenum zpass);
+typedef GLboolean(GL_BINDING_CALL* glTestFenceAPPLEProc)(GLuint fence);
+typedef GLboolean(GL_BINDING_CALL* glTestFenceNVProc)(GLuint fence);
+typedef void(GL_BINDING_CALL* glTexImage2DProc)(GLenum target,
+                                                GLint level,
+                                                GLint internalformat,
+                                                GLsizei width,
+                                                GLsizei height,
+                                                GLint border,
+                                                GLenum format,
+                                                GLenum type,
+                                                const void* pixels);
+typedef void(GL_BINDING_CALL* glTexImage3DProc)(GLenum target,
+                                                GLint level,
+                                                GLint internalformat,
+                                                GLsizei width,
+                                                GLsizei height,
+                                                GLsizei depth,
+                                                GLint border,
+                                                GLenum format,
+                                                GLenum type,
+                                                const void* pixels);
+typedef void(GL_BINDING_CALL* glTexParameterfProc)(GLenum target,
+                                                   GLenum pname,
+                                                   GLfloat param);
+typedef void(GL_BINDING_CALL* glTexParameterfvProc)(GLenum target,
+                                                    GLenum pname,
+                                                    const GLfloat* params);
+typedef void(GL_BINDING_CALL* glTexParameteriProc)(GLenum target,
+                                                   GLenum pname,
+                                                   GLint param);
+typedef void(GL_BINDING_CALL* glTexParameterivProc)(GLenum target,
+                                                    GLenum pname,
+                                                    const GLint* params);
+typedef void(GL_BINDING_CALL* glTexStorage2DEXTProc)(GLenum target,
+                                                     GLsizei levels,
+                                                     GLenum internalformat,
+                                                     GLsizei width,
+                                                     GLsizei height);
+typedef void(GL_BINDING_CALL* glTexStorage3DProc)(GLenum target,
+                                                  GLsizei levels,
+                                                  GLenum internalformat,
+                                                  GLsizei width,
+                                                  GLsizei height,
+                                                  GLsizei depth);
+typedef void(GL_BINDING_CALL* glTexSubImage2DProc)(GLenum target,
+                                                   GLint level,
+                                                   GLint xoffset,
+                                                   GLint yoffset,
+                                                   GLsizei width,
+                                                   GLsizei height,
+                                                   GLenum format,
+                                                   GLenum type,
+                                                   const void* pixels);
+typedef void(GL_BINDING_CALL* glTransformFeedbackVaryingsProc)(
+    GLuint program,
+    GLsizei count,
+    const char* const* varyings,
+    GLenum bufferMode);
+typedef void(GL_BINDING_CALL* glUniform1fProc)(GLint location, GLfloat x);
+typedef void(GL_BINDING_CALL* glUniform1fvProc)(GLint location,
+                                                GLsizei count,
+                                                const GLfloat* v);
+typedef void(GL_BINDING_CALL* glUniform1iProc)(GLint location, GLint x);
+typedef void(GL_BINDING_CALL* glUniform1ivProc)(GLint location,
+                                                GLsizei count,
+                                                const GLint* v);
+typedef void(GL_BINDING_CALL* glUniform1uiProc)(GLint location, GLuint v0);
+typedef void(GL_BINDING_CALL* glUniform1uivProc)(GLint location,
+                                                 GLsizei count,
+                                                 const GLuint* v);
+typedef void(GL_BINDING_CALL* glUniform2fProc)(GLint location,
+                                               GLfloat x,
+                                               GLfloat y);
+typedef void(GL_BINDING_CALL* glUniform2fvProc)(GLint location,
+                                                GLsizei count,
+                                                const GLfloat* v);
+typedef void(GL_BINDING_CALL* glUniform2iProc)(GLint location,
+                                               GLint x,
+                                               GLint y);
+typedef void(GL_BINDING_CALL* glUniform2ivProc)(GLint location,
+                                                GLsizei count,
+                                                const GLint* v);
+typedef void(GL_BINDING_CALL* glUniform2uiProc)(GLint location,
+                                                GLuint v0,
+                                                GLuint v1);
+typedef void(GL_BINDING_CALL* glUniform2uivProc)(GLint location,
+                                                 GLsizei count,
+                                                 const GLuint* v);
+typedef void(GL_BINDING_CALL* glUniform3fProc)(GLint location,
+                                               GLfloat x,
+                                               GLfloat y,
+                                               GLfloat z);
+typedef void(GL_BINDING_CALL* glUniform3fvProc)(GLint location,
+                                                GLsizei count,
+                                                const GLfloat* v);
+typedef void(GL_BINDING_CALL* glUniform3iProc)(GLint location,
+                                               GLint x,
+                                               GLint y,
+                                               GLint z);
+typedef void(GL_BINDING_CALL* glUniform3ivProc)(GLint location,
+                                                GLsizei count,
+                                                const GLint* v);
+typedef void(GL_BINDING_CALL* glUniform3uiProc)(GLint location,
+                                                GLuint v0,
+                                                GLuint v1,
+                                                GLuint v2);
+typedef void(GL_BINDING_CALL* glUniform3uivProc)(GLint location,
+                                                 GLsizei count,
+                                                 const GLuint* v);
+typedef void(GL_BINDING_CALL* glUniform4fProc)(GLint location,
+                                               GLfloat x,
+                                               GLfloat y,
+                                               GLfloat z,
+                                               GLfloat w);
+typedef void(GL_BINDING_CALL* glUniform4fvProc)(GLint location,
+                                                GLsizei count,
+                                                const GLfloat* v);
+typedef void(GL_BINDING_CALL* glUniform4iProc)(GLint location,
+                                               GLint x,
+                                               GLint y,
+                                               GLint z,
+                                               GLint w);
+typedef void(GL_BINDING_CALL* glUniform4ivProc)(GLint location,
+                                                GLsizei count,
+                                                const GLint* v);
+typedef void(GL_BINDING_CALL* glUniform4uiProc)(GLint location,
+                                                GLuint v0,
+                                                GLuint v1,
+                                                GLuint v2,
+                                                GLuint v3);
+typedef void(GL_BINDING_CALL* glUniform4uivProc)(GLint location,
+                                                 GLsizei count,
+                                                 const GLuint* v);
+typedef void(GL_BINDING_CALL* glUniformBlockBindingProc)(
+    GLuint program,
+    GLuint uniformBlockIndex,
+    GLuint uniformBlockBinding);
+typedef void(GL_BINDING_CALL* glUniformMatrix2fvProc)(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+typedef void(GL_BINDING_CALL* glUniformMatrix2x3fvProc)(GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat* value);
+typedef void(GL_BINDING_CALL* glUniformMatrix2x4fvProc)(GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat* value);
+typedef void(GL_BINDING_CALL* glUniformMatrix3fvProc)(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+typedef void(GL_BINDING_CALL* glUniformMatrix3x2fvProc)(GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat* value);
+typedef void(GL_BINDING_CALL* glUniformMatrix3x4fvProc)(GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat* value);
+typedef void(GL_BINDING_CALL* glUniformMatrix4fvProc)(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+typedef void(GL_BINDING_CALL* glUniformMatrix4x2fvProc)(GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat* value);
+typedef void(GL_BINDING_CALL* glUniformMatrix4x3fvProc)(GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat* value);
+typedef GLboolean(GL_BINDING_CALL* glUnmapBufferProc)(GLenum target);
+typedef void(GL_BINDING_CALL* glUseProgramProc)(GLuint program);
+typedef void(GL_BINDING_CALL* glValidateProgramProc)(GLuint program);
+typedef void(GL_BINDING_CALL* glVertexAttrib1fProc)(GLuint indx, GLfloat x);
+typedef void(GL_BINDING_CALL* glVertexAttrib1fvProc)(GLuint indx,
+                                                     const GLfloat* values);
+typedef void(GL_BINDING_CALL* glVertexAttrib2fProc)(GLuint indx,
+                                                    GLfloat x,
+                                                    GLfloat y);
+typedef void(GL_BINDING_CALL* glVertexAttrib2fvProc)(GLuint indx,
+                                                     const GLfloat* values);
+typedef void(GL_BINDING_CALL* glVertexAttrib3fProc)(GLuint indx,
+                                                    GLfloat x,
+                                                    GLfloat y,
+                                                    GLfloat z);
+typedef void(GL_BINDING_CALL* glVertexAttrib3fvProc)(GLuint indx,
+                                                     const GLfloat* values);
+typedef void(GL_BINDING_CALL* glVertexAttrib4fProc)(GLuint indx,
+                                                    GLfloat x,
+                                                    GLfloat y,
+                                                    GLfloat z,
+                                                    GLfloat w);
+typedef void(GL_BINDING_CALL* glVertexAttrib4fvProc)(GLuint indx,
+                                                     const GLfloat* values);
+typedef void(GL_BINDING_CALL* glVertexAttribDivisorANGLEProc)(GLuint index,
+                                                              GLuint divisor);
+typedef void(GL_BINDING_CALL* glVertexAttribI4iProc)(GLuint indx,
+                                                     GLint x,
+                                                     GLint y,
+                                                     GLint z,
+                                                     GLint w);
+typedef void(GL_BINDING_CALL* glVertexAttribI4ivProc)(GLuint indx,
+                                                      const GLint* values);
+typedef void(GL_BINDING_CALL* glVertexAttribI4uiProc)(GLuint indx,
+                                                      GLuint x,
+                                                      GLuint y,
+                                                      GLuint z,
+                                                      GLuint w);
+typedef void(GL_BINDING_CALL* glVertexAttribI4uivProc)(GLuint indx,
+                                                       const GLuint* values);
+typedef void(GL_BINDING_CALL* glVertexAttribIPointerProc)(GLuint indx,
+                                                          GLint size,
+                                                          GLenum type,
+                                                          GLsizei stride,
+                                                          const void* ptr);
+typedef void(GL_BINDING_CALL* glVertexAttribPointerProc)(GLuint indx,
+                                                         GLint size,
+                                                         GLenum type,
+                                                         GLboolean normalized,
+                                                         GLsizei stride,
+                                                         const void* ptr);
+typedef void(GL_BINDING_CALL* glViewportProc)(GLint x,
+                                              GLint y,
+                                              GLsizei width,
+                                              GLsizei height);
+typedef GLenum(GL_BINDING_CALL* glWaitSyncProc)(GLsync sync,
+                                                GLbitfield flags,
+                                                GLuint64 timeout);
+
+struct ExtensionsGL {
+  bool b_GL_ANGLE_framebuffer_blit;
+  bool b_GL_ANGLE_framebuffer_multisample;
+  bool b_GL_ANGLE_instanced_arrays;
+  bool b_GL_ANGLE_translated_shader_source;
+  bool b_GL_APPLE_fence;
+  bool b_GL_APPLE_vertex_array_object;
+  bool b_GL_ARB_ES2_compatibility;
+  bool b_GL_ARB_blend_func_extended;
+  bool b_GL_ARB_copy_buffer;
+  bool b_GL_ARB_draw_buffers;
+  bool b_GL_ARB_draw_instanced;
+  bool b_GL_ARB_framebuffer_object;
+  bool b_GL_ARB_get_program_binary;
+  bool b_GL_ARB_instanced_arrays;
+  bool b_GL_ARB_internalformat_query;
+  bool b_GL_ARB_invalidate_subdata;
+  bool b_GL_ARB_map_buffer_range;
+  bool b_GL_ARB_occlusion_query;
+  bool b_GL_ARB_robustness;
+  bool b_GL_ARB_sampler_objects;
+  bool b_GL_ARB_sync;
+  bool b_GL_ARB_texture_storage;
+  bool b_GL_ARB_timer_query;
+  bool b_GL_ARB_transform_feedback2;
+  bool b_GL_ARB_uniform_buffer_object;
+  bool b_GL_ARB_vertex_array_object;
+  bool b_GL_ARB_vertex_buffer_object;
+  bool b_GL_EXT_debug_marker;
+  bool b_GL_EXT_direct_state_access;
+  bool b_GL_EXT_discard_framebuffer;
+  bool b_GL_EXT_disjoint_timer_query;
+  bool b_GL_EXT_draw_buffers;
+  bool b_GL_EXT_framebuffer_blit;
+  bool b_GL_EXT_framebuffer_multisample;
+  bool b_GL_EXT_framebuffer_object;
+  bool b_GL_EXT_map_buffer_range;
+  bool b_GL_EXT_multisampled_render_to_texture;
+  bool b_GL_EXT_robustness;
+  bool b_GL_EXT_texture_storage;
+  bool b_GL_EXT_timer_query;
+  bool b_GL_IMG_multisampled_render_to_texture;
+  bool b_GL_KHR_blend_equation_advanced;
+  bool b_GL_KHR_robustness;
+  bool b_GL_NV_blend_equation_advanced;
+  bool b_GL_NV_fence;
+  bool b_GL_NV_path_rendering;
+  bool b_GL_OES_EGL_image;
+  bool b_GL_OES_get_program_binary;
+  bool b_GL_OES_mapbuffer;
+  bool b_GL_OES_vertex_array_object;
+};
+
+struct ProcsGL {
+  glActiveTextureProc glActiveTextureFn;
+  glAttachShaderProc glAttachShaderFn;
+  glBeginQueryProc glBeginQueryFn;
+  glBeginQueryARBProc glBeginQueryARBFn;
+  glBeginTransformFeedbackProc glBeginTransformFeedbackFn;
+  glBindAttribLocationProc glBindAttribLocationFn;
+  glBindBufferProc glBindBufferFn;
+  glBindBufferBaseProc glBindBufferBaseFn;
+  glBindBufferRangeProc glBindBufferRangeFn;
+  glBindFragDataLocationProc glBindFragDataLocationFn;
+  glBindFragDataLocationIndexedProc glBindFragDataLocationIndexedFn;
+  glBindFramebufferEXTProc glBindFramebufferEXTFn;
+  glBindRenderbufferEXTProc glBindRenderbufferEXTFn;
+  glBindSamplerProc glBindSamplerFn;
+  glBindTextureProc glBindTextureFn;
+  glBindTransformFeedbackProc glBindTransformFeedbackFn;
+  glBindVertexArrayOESProc glBindVertexArrayOESFn;
+  glBlendBarrierKHRProc glBlendBarrierKHRFn;
+  glBlendColorProc glBlendColorFn;
+  glBlendEquationProc glBlendEquationFn;
+  glBlendEquationSeparateProc glBlendEquationSeparateFn;
+  glBlendFuncProc glBlendFuncFn;
+  glBlendFuncSeparateProc glBlendFuncSeparateFn;
+  glBlitFramebufferProc glBlitFramebufferFn;
+  glBlitFramebufferANGLEProc glBlitFramebufferANGLEFn;
+  glBlitFramebufferEXTProc glBlitFramebufferEXTFn;
+  glBufferDataProc glBufferDataFn;
+  glBufferSubDataProc glBufferSubDataFn;
+  glCheckFramebufferStatusEXTProc glCheckFramebufferStatusEXTFn;
+  glClearProc glClearFn;
+  glClearBufferfiProc glClearBufferfiFn;
+  glClearBufferfvProc glClearBufferfvFn;
+  glClearBufferivProc glClearBufferivFn;
+  glClearBufferuivProc glClearBufferuivFn;
+  glClearColorProc glClearColorFn;
+  glClearDepthProc glClearDepthFn;
+  glClearDepthfProc glClearDepthfFn;
+  glClearStencilProc glClearStencilFn;
+  glClientWaitSyncProc glClientWaitSyncFn;
+  glColorMaskProc glColorMaskFn;
+  glCompileShaderProc glCompileShaderFn;
+  glCompressedTexImage2DProc glCompressedTexImage2DFn;
+  glCompressedTexImage3DProc glCompressedTexImage3DFn;
+  glCompressedTexSubImage2DProc glCompressedTexSubImage2DFn;
+  glCopyBufferSubDataProc glCopyBufferSubDataFn;
+  glCopyTexImage2DProc glCopyTexImage2DFn;
+  glCopyTexSubImage2DProc glCopyTexSubImage2DFn;
+  glCopyTexSubImage3DProc glCopyTexSubImage3DFn;
+  glCreateProgramProc glCreateProgramFn;
+  glCreateShaderProc glCreateShaderFn;
+  glCullFaceProc glCullFaceFn;
+  glDeleteBuffersARBProc glDeleteBuffersARBFn;
+  glDeleteFencesAPPLEProc glDeleteFencesAPPLEFn;
+  glDeleteFencesNVProc glDeleteFencesNVFn;
+  glDeleteFramebuffersEXTProc glDeleteFramebuffersEXTFn;
+  glDeleteProgramProc glDeleteProgramFn;
+  glDeleteQueriesProc glDeleteQueriesFn;
+  glDeleteQueriesARBProc glDeleteQueriesARBFn;
+  glDeleteRenderbuffersEXTProc glDeleteRenderbuffersEXTFn;
+  glDeleteSamplersProc glDeleteSamplersFn;
+  glDeleteShaderProc glDeleteShaderFn;
+  glDeleteSyncProc glDeleteSyncFn;
+  glDeleteTexturesProc glDeleteTexturesFn;
+  glDeleteTransformFeedbacksProc glDeleteTransformFeedbacksFn;
+  glDeleteVertexArraysOESProc glDeleteVertexArraysOESFn;
+  glDepthFuncProc glDepthFuncFn;
+  glDepthMaskProc glDepthMaskFn;
+  glDepthRangeProc glDepthRangeFn;
+  glDepthRangefProc glDepthRangefFn;
+  glDetachShaderProc glDetachShaderFn;
+  glDisableProc glDisableFn;
+  glDisableVertexAttribArrayProc glDisableVertexAttribArrayFn;
+  glDiscardFramebufferEXTProc glDiscardFramebufferEXTFn;
+  glDrawArraysProc glDrawArraysFn;
+  glDrawArraysInstancedANGLEProc glDrawArraysInstancedANGLEFn;
+  glDrawBufferProc glDrawBufferFn;
+  glDrawBuffersARBProc glDrawBuffersARBFn;
+  glDrawElementsProc glDrawElementsFn;
+  glDrawElementsInstancedANGLEProc glDrawElementsInstancedANGLEFn;
+  glDrawRangeElementsProc glDrawRangeElementsFn;
+  glEGLImageTargetRenderbufferStorageOESProc
+      glEGLImageTargetRenderbufferStorageOESFn;
+  glEGLImageTargetTexture2DOESProc glEGLImageTargetTexture2DOESFn;
+  glEnableProc glEnableFn;
+  glEnableVertexAttribArrayProc glEnableVertexAttribArrayFn;
+  glEndQueryProc glEndQueryFn;
+  glEndQueryARBProc glEndQueryARBFn;
+  glEndTransformFeedbackProc glEndTransformFeedbackFn;
+  glFenceSyncProc glFenceSyncFn;
+  glFinishProc glFinishFn;
+  glFinishFenceAPPLEProc glFinishFenceAPPLEFn;
+  glFinishFenceNVProc glFinishFenceNVFn;
+  glFlushProc glFlushFn;
+  glFlushMappedBufferRangeProc glFlushMappedBufferRangeFn;
+  glFramebufferRenderbufferEXTProc glFramebufferRenderbufferEXTFn;
+  glFramebufferTexture2DEXTProc glFramebufferTexture2DEXTFn;
+  glFramebufferTexture2DMultisampleEXTProc
+      glFramebufferTexture2DMultisampleEXTFn;
+  glFramebufferTexture2DMultisampleIMGProc
+      glFramebufferTexture2DMultisampleIMGFn;
+  glFramebufferTextureLayerProc glFramebufferTextureLayerFn;
+  glFrontFaceProc glFrontFaceFn;
+  glGenBuffersARBProc glGenBuffersARBFn;
+  glGenerateMipmapEXTProc glGenerateMipmapEXTFn;
+  glGenFencesAPPLEProc glGenFencesAPPLEFn;
+  glGenFencesNVProc glGenFencesNVFn;
+  glGenFramebuffersEXTProc glGenFramebuffersEXTFn;
+  glGenQueriesProc glGenQueriesFn;
+  glGenQueriesARBProc glGenQueriesARBFn;
+  glGenRenderbuffersEXTProc glGenRenderbuffersEXTFn;
+  glGenSamplersProc glGenSamplersFn;
+  glGenTexturesProc glGenTexturesFn;
+  glGenTransformFeedbacksProc glGenTransformFeedbacksFn;
+  glGenVertexArraysOESProc glGenVertexArraysOESFn;
+  glGetActiveAttribProc glGetActiveAttribFn;
+  glGetActiveUniformProc glGetActiveUniformFn;
+  glGetActiveUniformBlockivProc glGetActiveUniformBlockivFn;
+  glGetActiveUniformBlockNameProc glGetActiveUniformBlockNameFn;
+  glGetActiveUniformsivProc glGetActiveUniformsivFn;
+  glGetAttachedShadersProc glGetAttachedShadersFn;
+  glGetAttribLocationProc glGetAttribLocationFn;
+  glGetBooleanvProc glGetBooleanvFn;
+  glGetBufferParameterivProc glGetBufferParameterivFn;
+  glGetErrorProc glGetErrorFn;
+  glGetFenceivNVProc glGetFenceivNVFn;
+  glGetFloatvProc glGetFloatvFn;
+  glGetFragDataLocationProc glGetFragDataLocationFn;
+  glGetFramebufferAttachmentParameterivEXTProc
+      glGetFramebufferAttachmentParameterivEXTFn;
+  glGetGraphicsResetStatusARBProc glGetGraphicsResetStatusARBFn;
+  glGetInteger64i_vProc glGetInteger64i_vFn;
+  glGetInteger64vProc glGetInteger64vFn;
+  glGetIntegeri_vProc glGetIntegeri_vFn;
+  glGetIntegervProc glGetIntegervFn;
+  glGetInternalformativProc glGetInternalformativFn;
+  glGetProgramBinaryProc glGetProgramBinaryFn;
+  glGetProgramInfoLogProc glGetProgramInfoLogFn;
+  glGetProgramivProc glGetProgramivFn;
+  glGetQueryivProc glGetQueryivFn;
+  glGetQueryivARBProc glGetQueryivARBFn;
+  glGetQueryObjecti64vProc glGetQueryObjecti64vFn;
+  glGetQueryObjectivProc glGetQueryObjectivFn;
+  glGetQueryObjectivARBProc glGetQueryObjectivARBFn;
+  glGetQueryObjectui64vProc glGetQueryObjectui64vFn;
+  glGetQueryObjectuivProc glGetQueryObjectuivFn;
+  glGetQueryObjectuivARBProc glGetQueryObjectuivARBFn;
+  glGetRenderbufferParameterivEXTProc glGetRenderbufferParameterivEXTFn;
+  glGetSamplerParameterfvProc glGetSamplerParameterfvFn;
+  glGetSamplerParameterivProc glGetSamplerParameterivFn;
+  glGetShaderInfoLogProc glGetShaderInfoLogFn;
+  glGetShaderivProc glGetShaderivFn;
+  glGetShaderPrecisionFormatProc glGetShaderPrecisionFormatFn;
+  glGetShaderSourceProc glGetShaderSourceFn;
+  glGetStringProc glGetStringFn;
+  glGetSyncivProc glGetSyncivFn;
+  glGetTexLevelParameterfvProc glGetTexLevelParameterfvFn;
+  glGetTexLevelParameterivProc glGetTexLevelParameterivFn;
+  glGetTexParameterfvProc glGetTexParameterfvFn;
+  glGetTexParameterivProc glGetTexParameterivFn;
+  glGetTransformFeedbackVaryingProc glGetTransformFeedbackVaryingFn;
+  glGetTranslatedShaderSourceANGLEProc glGetTranslatedShaderSourceANGLEFn;
+  glGetUniformBlockIndexProc glGetUniformBlockIndexFn;
+  glGetUniformfvProc glGetUniformfvFn;
+  glGetUniformIndicesProc glGetUniformIndicesFn;
+  glGetUniformivProc glGetUniformivFn;
+  glGetUniformLocationProc glGetUniformLocationFn;
+  glGetVertexAttribfvProc glGetVertexAttribfvFn;
+  glGetVertexAttribivProc glGetVertexAttribivFn;
+  glGetVertexAttribPointervProc glGetVertexAttribPointervFn;
+  glHintProc glHintFn;
+  glInsertEventMarkerEXTProc glInsertEventMarkerEXTFn;
+  glInvalidateFramebufferProc glInvalidateFramebufferFn;
+  glInvalidateSubFramebufferProc glInvalidateSubFramebufferFn;
+  glIsBufferProc glIsBufferFn;
+  glIsEnabledProc glIsEnabledFn;
+  glIsFenceAPPLEProc glIsFenceAPPLEFn;
+  glIsFenceNVProc glIsFenceNVFn;
+  glIsFramebufferEXTProc glIsFramebufferEXTFn;
+  glIsProgramProc glIsProgramFn;
+  glIsQueryProc glIsQueryFn;
+  glIsQueryARBProc glIsQueryARBFn;
+  glIsRenderbufferEXTProc glIsRenderbufferEXTFn;
+  glIsSamplerProc glIsSamplerFn;
+  glIsShaderProc glIsShaderFn;
+  glIsSyncProc glIsSyncFn;
+  glIsTextureProc glIsTextureFn;
+  glIsTransformFeedbackProc glIsTransformFeedbackFn;
+  glIsVertexArrayOESProc glIsVertexArrayOESFn;
+  glLineWidthProc glLineWidthFn;
+  glLinkProgramProc glLinkProgramFn;
+  glMapBufferProc glMapBufferFn;
+  glMapBufferRangeProc glMapBufferRangeFn;
+  glMatrixLoadfEXTProc glMatrixLoadfEXTFn;
+  glMatrixLoadIdentityEXTProc glMatrixLoadIdentityEXTFn;
+  glPauseTransformFeedbackProc glPauseTransformFeedbackFn;
+  glPixelStoreiProc glPixelStoreiFn;
+  glPointParameteriProc glPointParameteriFn;
+  glPolygonOffsetProc glPolygonOffsetFn;
+  glPopGroupMarkerEXTProc glPopGroupMarkerEXTFn;
+  glProgramBinaryProc glProgramBinaryFn;
+  glProgramParameteriProc glProgramParameteriFn;
+  glPushGroupMarkerEXTProc glPushGroupMarkerEXTFn;
+  glQueryCounterProc glQueryCounterFn;
+  glReadBufferProc glReadBufferFn;
+  glReadPixelsProc glReadPixelsFn;
+  glReleaseShaderCompilerProc glReleaseShaderCompilerFn;
+  glRenderbufferStorageEXTProc glRenderbufferStorageEXTFn;
+  glRenderbufferStorageMultisampleProc glRenderbufferStorageMultisampleFn;
+  glRenderbufferStorageMultisampleANGLEProc
+      glRenderbufferStorageMultisampleANGLEFn;
+  glRenderbufferStorageMultisampleEXTProc glRenderbufferStorageMultisampleEXTFn;
+  glRenderbufferStorageMultisampleIMGProc glRenderbufferStorageMultisampleIMGFn;
+  glResumeTransformFeedbackProc glResumeTransformFeedbackFn;
+  glSampleCoverageProc glSampleCoverageFn;
+  glSamplerParameterfProc glSamplerParameterfFn;
+  glSamplerParameterfvProc glSamplerParameterfvFn;
+  glSamplerParameteriProc glSamplerParameteriFn;
+  glSamplerParameterivProc glSamplerParameterivFn;
+  glScissorProc glScissorFn;
+  glSetFenceAPPLEProc glSetFenceAPPLEFn;
+  glSetFenceNVProc glSetFenceNVFn;
+  glShaderBinaryProc glShaderBinaryFn;
+  glShaderSourceProc glShaderSourceFn;
+  glStencilFuncProc glStencilFuncFn;
+  glStencilFuncSeparateProc glStencilFuncSeparateFn;
+  glStencilMaskProc glStencilMaskFn;
+  glStencilMaskSeparateProc glStencilMaskSeparateFn;
+  glStencilOpProc glStencilOpFn;
+  glStencilOpSeparateProc glStencilOpSeparateFn;
+  glTestFenceAPPLEProc glTestFenceAPPLEFn;
+  glTestFenceNVProc glTestFenceNVFn;
+  glTexImage2DProc glTexImage2DFn;
+  glTexImage3DProc glTexImage3DFn;
+  glTexParameterfProc glTexParameterfFn;
+  glTexParameterfvProc glTexParameterfvFn;
+  glTexParameteriProc glTexParameteriFn;
+  glTexParameterivProc glTexParameterivFn;
+  glTexStorage2DEXTProc glTexStorage2DEXTFn;
+  glTexStorage3DProc glTexStorage3DFn;
+  glTexSubImage2DProc glTexSubImage2DFn;
+  glTransformFeedbackVaryingsProc glTransformFeedbackVaryingsFn;
+  glUniform1fProc glUniform1fFn;
+  glUniform1fvProc glUniform1fvFn;
+  glUniform1iProc glUniform1iFn;
+  glUniform1ivProc glUniform1ivFn;
+  glUniform1uiProc glUniform1uiFn;
+  glUniform1uivProc glUniform1uivFn;
+  glUniform2fProc glUniform2fFn;
+  glUniform2fvProc glUniform2fvFn;
+  glUniform2iProc glUniform2iFn;
+  glUniform2ivProc glUniform2ivFn;
+  glUniform2uiProc glUniform2uiFn;
+  glUniform2uivProc glUniform2uivFn;
+  glUniform3fProc glUniform3fFn;
+  glUniform3fvProc glUniform3fvFn;
+  glUniform3iProc glUniform3iFn;
+  glUniform3ivProc glUniform3ivFn;
+  glUniform3uiProc glUniform3uiFn;
+  glUniform3uivProc glUniform3uivFn;
+  glUniform4fProc glUniform4fFn;
+  glUniform4fvProc glUniform4fvFn;
+  glUniform4iProc glUniform4iFn;
+  glUniform4ivProc glUniform4ivFn;
+  glUniform4uiProc glUniform4uiFn;
+  glUniform4uivProc glUniform4uivFn;
+  glUniformBlockBindingProc glUniformBlockBindingFn;
+  glUniformMatrix2fvProc glUniformMatrix2fvFn;
+  glUniformMatrix2x3fvProc glUniformMatrix2x3fvFn;
+  glUniformMatrix2x4fvProc glUniformMatrix2x4fvFn;
+  glUniformMatrix3fvProc glUniformMatrix3fvFn;
+  glUniformMatrix3x2fvProc glUniformMatrix3x2fvFn;
+  glUniformMatrix3x4fvProc glUniformMatrix3x4fvFn;
+  glUniformMatrix4fvProc glUniformMatrix4fvFn;
+  glUniformMatrix4x2fvProc glUniformMatrix4x2fvFn;
+  glUniformMatrix4x3fvProc glUniformMatrix4x3fvFn;
+  glUnmapBufferProc glUnmapBufferFn;
+  glUseProgramProc glUseProgramFn;
+  glValidateProgramProc glValidateProgramFn;
+  glVertexAttrib1fProc glVertexAttrib1fFn;
+  glVertexAttrib1fvProc glVertexAttrib1fvFn;
+  glVertexAttrib2fProc glVertexAttrib2fFn;
+  glVertexAttrib2fvProc glVertexAttrib2fvFn;
+  glVertexAttrib3fProc glVertexAttrib3fFn;
+  glVertexAttrib3fvProc glVertexAttrib3fvFn;
+  glVertexAttrib4fProc glVertexAttrib4fFn;
+  glVertexAttrib4fvProc glVertexAttrib4fvFn;
+  glVertexAttribDivisorANGLEProc glVertexAttribDivisorANGLEFn;
+  glVertexAttribI4iProc glVertexAttribI4iFn;
+  glVertexAttribI4ivProc glVertexAttribI4ivFn;
+  glVertexAttribI4uiProc glVertexAttribI4uiFn;
+  glVertexAttribI4uivProc glVertexAttribI4uivFn;
+  glVertexAttribIPointerProc glVertexAttribIPointerFn;
+  glVertexAttribPointerProc glVertexAttribPointerFn;
+  glViewportProc glViewportFn;
+  glWaitSyncProc glWaitSyncFn;
+};
+
+class GL_EXPORT GLApi {
+ public:
+  GLApi();
+  virtual ~GLApi();
+
+  virtual void glActiveTextureFn(GLenum texture) = 0;
+  virtual void glAttachShaderFn(GLuint program, GLuint shader) = 0;
+  virtual void glBeginQueryFn(GLenum target, GLuint id) = 0;
+  virtual void glBeginQueryARBFn(GLenum target, GLuint id) = 0;
+  virtual void glBeginTransformFeedbackFn(GLenum primitiveMode) = 0;
+  virtual void glBindAttribLocationFn(GLuint program,
+                                      GLuint index,
+                                      const char* name) = 0;
+  virtual void glBindBufferFn(GLenum target, GLuint buffer) = 0;
+  virtual void glBindBufferBaseFn(GLenum target,
+                                  GLuint index,
+                                  GLuint buffer) = 0;
+  virtual void glBindBufferRangeFn(GLenum target,
+                                   GLuint index,
+                                   GLuint buffer,
+                                   GLintptr offset,
+                                   GLsizeiptr size) = 0;
+  virtual void glBindFragDataLocationFn(GLuint program,
+                                        GLuint colorNumber,
+                                        const char* name) = 0;
+  virtual void glBindFragDataLocationIndexedFn(GLuint program,
+                                               GLuint colorNumber,
+                                               GLuint index,
+                                               const char* name) = 0;
+  virtual void glBindFramebufferEXTFn(GLenum target, GLuint framebuffer) = 0;
+  virtual void glBindRenderbufferEXTFn(GLenum target, GLuint renderbuffer) = 0;
+  virtual void glBindSamplerFn(GLuint unit, GLuint sampler) = 0;
+  virtual void glBindTextureFn(GLenum target, GLuint texture) = 0;
+  virtual void glBindTransformFeedbackFn(GLenum target, GLuint id) = 0;
+  virtual void glBindVertexArrayOESFn(GLuint array) = 0;
+  virtual void glBlendBarrierKHRFn(void) = 0;
+  virtual void glBlendColorFn(GLclampf red,
+                              GLclampf green,
+                              GLclampf blue,
+                              GLclampf alpha) = 0;
+  virtual void glBlendEquationFn(GLenum mode) = 0;
+  virtual void glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) = 0;
+  virtual void glBlendFuncFn(GLenum sfactor, GLenum dfactor) = 0;
+  virtual void glBlendFuncSeparateFn(GLenum srcRGB,
+                                     GLenum dstRGB,
+                                     GLenum srcAlpha,
+                                     GLenum dstAlpha) = 0;
+  virtual void glBlitFramebufferFn(GLint srcX0,
+                                   GLint srcY0,
+                                   GLint srcX1,
+                                   GLint srcY1,
+                                   GLint dstX0,
+                                   GLint dstY0,
+                                   GLint dstX1,
+                                   GLint dstY1,
+                                   GLbitfield mask,
+                                   GLenum filter) = 0;
+  virtual void glBlitFramebufferANGLEFn(GLint srcX0,
+                                        GLint srcY0,
+                                        GLint srcX1,
+                                        GLint srcY1,
+                                        GLint dstX0,
+                                        GLint dstY0,
+                                        GLint dstX1,
+                                        GLint dstY1,
+                                        GLbitfield mask,
+                                        GLenum filter) = 0;
+  virtual void glBlitFramebufferEXTFn(GLint srcX0,
+                                      GLint srcY0,
+                                      GLint srcX1,
+                                      GLint srcY1,
+                                      GLint dstX0,
+                                      GLint dstY0,
+                                      GLint dstX1,
+                                      GLint dstY1,
+                                      GLbitfield mask,
+                                      GLenum filter) = 0;
+  virtual void glBufferDataFn(GLenum target,
+                              GLsizeiptr size,
+                              const void* data,
+                              GLenum usage) = 0;
+  virtual void glBufferSubDataFn(GLenum target,
+                                 GLintptr offset,
+                                 GLsizeiptr size,
+                                 const void* data) = 0;
+  virtual GLenum glCheckFramebufferStatusEXTFn(GLenum target) = 0;
+  virtual void glClearFn(GLbitfield mask) = 0;
+  virtual void glClearBufferfiFn(GLenum buffer,
+                                 GLint drawbuffer,
+                                 const GLfloat depth,
+                                 GLint stencil) = 0;
+  virtual void glClearBufferfvFn(GLenum buffer,
+                                 GLint drawbuffer,
+                                 const GLfloat* value) = 0;
+  virtual void glClearBufferivFn(GLenum buffer,
+                                 GLint drawbuffer,
+                                 const GLint* value) = 0;
+  virtual void glClearBufferuivFn(GLenum buffer,
+                                  GLint drawbuffer,
+                                  const GLuint* value) = 0;
+  virtual void glClearColorFn(GLclampf red,
+                              GLclampf green,
+                              GLclampf blue,
+                              GLclampf alpha) = 0;
+  virtual void glClearDepthFn(GLclampd depth) = 0;
+  virtual void glClearDepthfFn(GLclampf depth) = 0;
+  virtual void glClearStencilFn(GLint s) = 0;
+  virtual GLenum glClientWaitSyncFn(GLsync sync,
+                                    GLbitfield flags,
+                                    GLuint64 timeout) = 0;
+  virtual void glColorMaskFn(GLboolean red,
+                             GLboolean green,
+                             GLboolean blue,
+                             GLboolean alpha) = 0;
+  virtual void glCompileShaderFn(GLuint shader) = 0;
+  virtual void glCompressedTexImage2DFn(GLenum target,
+                                        GLint level,
+                                        GLenum internalformat,
+                                        GLsizei width,
+                                        GLsizei height,
+                                        GLint border,
+                                        GLsizei imageSize,
+                                        const void* data) = 0;
+  virtual void glCompressedTexImage3DFn(GLenum target,
+                                        GLint level,
+                                        GLenum internalformat,
+                                        GLsizei width,
+                                        GLsizei height,
+                                        GLsizei depth,
+                                        GLint border,
+                                        GLsizei imageSize,
+                                        const void* data) = 0;
+  virtual void glCompressedTexSubImage2DFn(GLenum target,
+                                           GLint level,
+                                           GLint xoffset,
+                                           GLint yoffset,
+                                           GLsizei width,
+                                           GLsizei height,
+                                           GLenum format,
+                                           GLsizei imageSize,
+                                           const void* data) = 0;
+  virtual void glCopyBufferSubDataFn(GLenum readTarget,
+                                     GLenum writeTarget,
+                                     GLintptr readOffset,
+                                     GLintptr writeOffset,
+                                     GLsizeiptr size) = 0;
+  virtual void glCopyTexImage2DFn(GLenum target,
+                                  GLint level,
+                                  GLenum internalformat,
+                                  GLint x,
+                                  GLint y,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLint border) = 0;
+  virtual void glCopyTexSubImage2DFn(GLenum target,
+                                     GLint level,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLint x,
+                                     GLint y,
+                                     GLsizei width,
+                                     GLsizei height) = 0;
+  virtual void glCopyTexSubImage3DFn(GLenum target,
+                                     GLint level,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLint zoffset,
+                                     GLint x,
+                                     GLint y,
+                                     GLsizei width,
+                                     GLsizei height) = 0;
+  virtual GLuint glCreateProgramFn(void) = 0;
+  virtual GLuint glCreateShaderFn(GLenum type) = 0;
+  virtual void glCullFaceFn(GLenum mode) = 0;
+  virtual void glDeleteBuffersARBFn(GLsizei n, const GLuint* buffers) = 0;
+  virtual void glDeleteFencesAPPLEFn(GLsizei n, const GLuint* fences) = 0;
+  virtual void glDeleteFencesNVFn(GLsizei n, const GLuint* fences) = 0;
+  virtual void glDeleteFramebuffersEXTFn(GLsizei n,
+                                         const GLuint* framebuffers) = 0;
+  virtual void glDeleteProgramFn(GLuint program) = 0;
+  virtual void glDeleteQueriesFn(GLsizei n, const GLuint* ids) = 0;
+  virtual void glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) = 0;
+  virtual void glDeleteRenderbuffersEXTFn(GLsizei n,
+                                          const GLuint* renderbuffers) = 0;
+  virtual void glDeleteSamplersFn(GLsizei n, const GLuint* samplers) = 0;
+  virtual void glDeleteShaderFn(GLuint shader) = 0;
+  virtual void glDeleteSyncFn(GLsync sync) = 0;
+  virtual void glDeleteTexturesFn(GLsizei n, const GLuint* textures) = 0;
+  virtual void glDeleteTransformFeedbacksFn(GLsizei n, const GLuint* ids) = 0;
+  virtual void glDeleteVertexArraysOESFn(GLsizei n, const GLuint* arrays) = 0;
+  virtual void glDepthFuncFn(GLenum func) = 0;
+  virtual void glDepthMaskFn(GLboolean flag) = 0;
+  virtual void glDepthRangeFn(GLclampd zNear, GLclampd zFar) = 0;
+  virtual void glDepthRangefFn(GLclampf zNear, GLclampf zFar) = 0;
+  virtual void glDetachShaderFn(GLuint program, GLuint shader) = 0;
+  virtual void glDisableFn(GLenum cap) = 0;
+  virtual void glDisableVertexAttribArrayFn(GLuint index) = 0;
+  virtual void glDiscardFramebufferEXTFn(GLenum target,
+                                         GLsizei numAttachments,
+                                         const GLenum* attachments) = 0;
+  virtual void glDrawArraysFn(GLenum mode, GLint first, GLsizei count) = 0;
+  virtual void glDrawArraysInstancedANGLEFn(GLenum mode,
+                                            GLint first,
+                                            GLsizei count,
+                                            GLsizei primcount) = 0;
+  virtual void glDrawBufferFn(GLenum mode) = 0;
+  virtual void glDrawBuffersARBFn(GLsizei n, const GLenum* bufs) = 0;
+  virtual void glDrawElementsFn(GLenum mode,
+                                GLsizei count,
+                                GLenum type,
+                                const void* indices) = 0;
+  virtual void glDrawElementsInstancedANGLEFn(GLenum mode,
+                                              GLsizei count,
+                                              GLenum type,
+                                              const void* indices,
+                                              GLsizei primcount) = 0;
+  virtual void glDrawRangeElementsFn(GLenum mode,
+                                     GLuint start,
+                                     GLuint end,
+                                     GLsizei count,
+                                     GLenum type,
+                                     const void* indices) = 0;
+  virtual void glEGLImageTargetRenderbufferStorageOESFn(
+      GLenum target,
+      GLeglImageOES image) = 0;
+  virtual void glEGLImageTargetTexture2DOESFn(GLenum target,
+                                              GLeglImageOES image) = 0;
+  virtual void glEnableFn(GLenum cap) = 0;
+  virtual void glEnableVertexAttribArrayFn(GLuint index) = 0;
+  virtual void glEndQueryFn(GLenum target) = 0;
+  virtual void glEndQueryARBFn(GLenum target) = 0;
+  virtual void glEndTransformFeedbackFn(void) = 0;
+  virtual GLsync glFenceSyncFn(GLenum condition, GLbitfield flags) = 0;
+  virtual void glFinishFn(void) = 0;
+  virtual void glFinishFenceAPPLEFn(GLuint fence) = 0;
+  virtual void glFinishFenceNVFn(GLuint fence) = 0;
+  virtual void glFlushFn(void) = 0;
+  virtual void glFlushMappedBufferRangeFn(GLenum target,
+                                          GLintptr offset,
+                                          GLsizeiptr length) = 0;
+  virtual void glFramebufferRenderbufferEXTFn(GLenum target,
+                                              GLenum attachment,
+                                              GLenum renderbuffertarget,
+                                              GLuint renderbuffer) = 0;
+  virtual void glFramebufferTexture2DEXTFn(GLenum target,
+                                           GLenum attachment,
+                                           GLenum textarget,
+                                           GLuint texture,
+                                           GLint level) = 0;
+  virtual void glFramebufferTexture2DMultisampleEXTFn(GLenum target,
+                                                      GLenum attachment,
+                                                      GLenum textarget,
+                                                      GLuint texture,
+                                                      GLint level,
+                                                      GLsizei samples) = 0;
+  virtual void glFramebufferTexture2DMultisampleIMGFn(GLenum target,
+                                                      GLenum attachment,
+                                                      GLenum textarget,
+                                                      GLuint texture,
+                                                      GLint level,
+                                                      GLsizei samples) = 0;
+  virtual void glFramebufferTextureLayerFn(GLenum target,
+                                           GLenum attachment,
+                                           GLuint texture,
+                                           GLint level,
+                                           GLint layer) = 0;
+  virtual void glFrontFaceFn(GLenum mode) = 0;
+  virtual void glGenBuffersARBFn(GLsizei n, GLuint* buffers) = 0;
+  virtual void glGenerateMipmapEXTFn(GLenum target) = 0;
+  virtual void glGenFencesAPPLEFn(GLsizei n, GLuint* fences) = 0;
+  virtual void glGenFencesNVFn(GLsizei n, GLuint* fences) = 0;
+  virtual void glGenFramebuffersEXTFn(GLsizei n, GLuint* framebuffers) = 0;
+  virtual void glGenQueriesFn(GLsizei n, GLuint* ids) = 0;
+  virtual void glGenQueriesARBFn(GLsizei n, GLuint* ids) = 0;
+  virtual void glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) = 0;
+  virtual void glGenSamplersFn(GLsizei n, GLuint* samplers) = 0;
+  virtual void glGenTexturesFn(GLsizei n, GLuint* textures) = 0;
+  virtual void glGenTransformFeedbacksFn(GLsizei n, GLuint* ids) = 0;
+  virtual void glGenVertexArraysOESFn(GLsizei n, GLuint* arrays) = 0;
+  virtual void glGetActiveAttribFn(GLuint program,
+                                   GLuint index,
+                                   GLsizei bufsize,
+                                   GLsizei* length,
+                                   GLint* size,
+                                   GLenum* type,
+                                   char* name) = 0;
+  virtual void glGetActiveUniformFn(GLuint program,
+                                    GLuint index,
+                                    GLsizei bufsize,
+                                    GLsizei* length,
+                                    GLint* size,
+                                    GLenum* type,
+                                    char* name) = 0;
+  virtual void glGetActiveUniformBlockivFn(GLuint program,
+                                           GLuint uniformBlockIndex,
+                                           GLenum pname,
+                                           GLint* params) = 0;
+  virtual void glGetActiveUniformBlockNameFn(GLuint program,
+                                             GLuint uniformBlockIndex,
+                                             GLsizei bufSize,
+                                             GLsizei* length,
+                                             char* uniformBlockName) = 0;
+  virtual void glGetActiveUniformsivFn(GLuint program,
+                                       GLsizei uniformCount,
+                                       const GLuint* uniformIndices,
+                                       GLenum pname,
+                                       GLint* params) = 0;
+  virtual void glGetAttachedShadersFn(GLuint program,
+                                      GLsizei maxcount,
+                                      GLsizei* count,
+                                      GLuint* shaders) = 0;
+  virtual GLint glGetAttribLocationFn(GLuint program, const char* name) = 0;
+  virtual void glGetBooleanvFn(GLenum pname, GLboolean* params) = 0;
+  virtual void glGetBufferParameterivFn(GLenum target,
+                                        GLenum pname,
+                                        GLint* params) = 0;
+  virtual GLenum glGetErrorFn(void) = 0;
+  virtual void glGetFenceivNVFn(GLuint fence, GLenum pname, GLint* params) = 0;
+  virtual void glGetFloatvFn(GLenum pname, GLfloat* params) = 0;
+  virtual GLint glGetFragDataLocationFn(GLuint program, const char* name) = 0;
+  virtual void glGetFramebufferAttachmentParameterivEXTFn(GLenum target,
+                                                          GLenum attachment,
+                                                          GLenum pname,
+                                                          GLint* params) = 0;
+  virtual GLenum glGetGraphicsResetStatusARBFn(void) = 0;
+  virtual void glGetInteger64i_vFn(GLenum target,
+                                   GLuint index,
+                                   GLint64* data) = 0;
+  virtual void glGetInteger64vFn(GLenum pname, GLint64* params) = 0;
+  virtual void glGetIntegeri_vFn(GLenum target, GLuint index, GLint* data) = 0;
+  virtual void glGetIntegervFn(GLenum pname, GLint* params) = 0;
+  virtual void glGetInternalformativFn(GLenum target,
+                                       GLenum internalformat,
+                                       GLenum pname,
+                                       GLsizei bufSize,
+                                       GLint* params) = 0;
+  virtual void glGetProgramBinaryFn(GLuint program,
+                                    GLsizei bufSize,
+                                    GLsizei* length,
+                                    GLenum* binaryFormat,
+                                    GLvoid* binary) = 0;
+  virtual void glGetProgramInfoLogFn(GLuint program,
+                                     GLsizei bufsize,
+                                     GLsizei* length,
+                                     char* infolog) = 0;
+  virtual void glGetProgramivFn(GLuint program,
+                                GLenum pname,
+                                GLint* params) = 0;
+  virtual void glGetQueryivFn(GLenum target, GLenum pname, GLint* params) = 0;
+  virtual void glGetQueryivARBFn(GLenum target,
+                                 GLenum pname,
+                                 GLint* params) = 0;
+  virtual void glGetQueryObjecti64vFn(GLuint id,
+                                      GLenum pname,
+                                      GLint64* params) = 0;
+  virtual void glGetQueryObjectivFn(GLuint id, GLenum pname, GLint* params) = 0;
+  virtual void glGetQueryObjectivARBFn(GLuint id,
+                                       GLenum pname,
+                                       GLint* params) = 0;
+  virtual void glGetQueryObjectui64vFn(GLuint id,
+                                       GLenum pname,
+                                       GLuint64* params) = 0;
+  virtual void glGetQueryObjectuivFn(GLuint id,
+                                     GLenum pname,
+                                     GLuint* params) = 0;
+  virtual void glGetQueryObjectuivARBFn(GLuint id,
+                                        GLenum pname,
+                                        GLuint* params) = 0;
+  virtual void glGetRenderbufferParameterivEXTFn(GLenum target,
+                                                 GLenum pname,
+                                                 GLint* params) = 0;
+  virtual void glGetSamplerParameterfvFn(GLuint sampler,
+                                         GLenum pname,
+                                         GLfloat* params) = 0;
+  virtual void glGetSamplerParameterivFn(GLuint sampler,
+                                         GLenum pname,
+                                         GLint* params) = 0;
+  virtual void glGetShaderInfoLogFn(GLuint shader,
+                                    GLsizei bufsize,
+                                    GLsizei* length,
+                                    char* infolog) = 0;
+  virtual void glGetShaderivFn(GLuint shader, GLenum pname, GLint* params) = 0;
+  virtual void glGetShaderPrecisionFormatFn(GLenum shadertype,
+                                            GLenum precisiontype,
+                                            GLint* range,
+                                            GLint* precision) = 0;
+  virtual void glGetShaderSourceFn(GLuint shader,
+                                   GLsizei bufsize,
+                                   GLsizei* length,
+                                   char* source) = 0;
+  virtual const GLubyte* glGetStringFn(GLenum name) = 0;
+  virtual void glGetSyncivFn(GLsync sync,
+                             GLenum pname,
+                             GLsizei bufSize,
+                             GLsizei* length,
+                             GLint* values) = 0;
+  virtual void glGetTexLevelParameterfvFn(GLenum target,
+                                          GLint level,
+                                          GLenum pname,
+                                          GLfloat* params) = 0;
+  virtual void glGetTexLevelParameterivFn(GLenum target,
+                                          GLint level,
+                                          GLenum pname,
+                                          GLint* params) = 0;
+  virtual void glGetTexParameterfvFn(GLenum target,
+                                     GLenum pname,
+                                     GLfloat* params) = 0;
+  virtual void glGetTexParameterivFn(GLenum target,
+                                     GLenum pname,
+                                     GLint* params) = 0;
+  virtual void glGetTransformFeedbackVaryingFn(GLuint program,
+                                               GLuint index,
+                                               GLsizei bufSize,
+                                               GLsizei* length,
+                                               GLenum* type,
+                                               char* name) = 0;
+  virtual void glGetTranslatedShaderSourceANGLEFn(GLuint shader,
+                                                  GLsizei bufsize,
+                                                  GLsizei* length,
+                                                  char* source) = 0;
+  virtual GLuint glGetUniformBlockIndexFn(GLuint program,
+                                          const char* uniformBlockName) = 0;
+  virtual void glGetUniformfvFn(GLuint program,
+                                GLint location,
+                                GLfloat* params) = 0;
+  virtual void glGetUniformIndicesFn(GLuint program,
+                                     GLsizei uniformCount,
+                                     const char* const* uniformNames,
+                                     GLuint* uniformIndices) = 0;
+  virtual void glGetUniformivFn(GLuint program,
+                                GLint location,
+                                GLint* params) = 0;
+  virtual GLint glGetUniformLocationFn(GLuint program, const char* name) = 0;
+  virtual void glGetVertexAttribfvFn(GLuint index,
+                                     GLenum pname,
+                                     GLfloat* params) = 0;
+  virtual void glGetVertexAttribivFn(GLuint index,
+                                     GLenum pname,
+                                     GLint* params) = 0;
+  virtual void glGetVertexAttribPointervFn(GLuint index,
+                                           GLenum pname,
+                                           void** pointer) = 0;
+  virtual void glHintFn(GLenum target, GLenum mode) = 0;
+  virtual void glInsertEventMarkerEXTFn(GLsizei length, const char* marker) = 0;
+  virtual void glInvalidateFramebufferFn(GLenum target,
+                                         GLsizei numAttachments,
+                                         const GLenum* attachments) = 0;
+  virtual void glInvalidateSubFramebufferFn(GLenum target,
+                                            GLsizei numAttachments,
+                                            const GLenum* attachments,
+                                            GLint x,
+                                            GLint y,
+                                            GLint width,
+                                            GLint height) = 0;
+  virtual GLboolean glIsBufferFn(GLuint buffer) = 0;
+  virtual GLboolean glIsEnabledFn(GLenum cap) = 0;
+  virtual GLboolean glIsFenceAPPLEFn(GLuint fence) = 0;
+  virtual GLboolean glIsFenceNVFn(GLuint fence) = 0;
+  virtual GLboolean glIsFramebufferEXTFn(GLuint framebuffer) = 0;
+  virtual GLboolean glIsProgramFn(GLuint program) = 0;
+  virtual GLboolean glIsQueryFn(GLuint query) = 0;
+  virtual GLboolean glIsQueryARBFn(GLuint query) = 0;
+  virtual GLboolean glIsRenderbufferEXTFn(GLuint renderbuffer) = 0;
+  virtual GLboolean glIsSamplerFn(GLuint sampler) = 0;
+  virtual GLboolean glIsShaderFn(GLuint shader) = 0;
+  virtual GLboolean glIsSyncFn(GLsync sync) = 0;
+  virtual GLboolean glIsTextureFn(GLuint texture) = 0;
+  virtual GLboolean glIsTransformFeedbackFn(GLuint id) = 0;
+  virtual GLboolean glIsVertexArrayOESFn(GLuint array) = 0;
+  virtual void glLineWidthFn(GLfloat width) = 0;
+  virtual void glLinkProgramFn(GLuint program) = 0;
+  virtual void* glMapBufferFn(GLenum target, GLenum access) = 0;
+  virtual void* glMapBufferRangeFn(GLenum target,
+                                   GLintptr offset,
+                                   GLsizeiptr length,
+                                   GLbitfield access) = 0;
+  virtual void glMatrixLoadfEXTFn(GLenum matrixMode, const GLfloat* m) = 0;
+  virtual void glMatrixLoadIdentityEXTFn(GLenum matrixMode) = 0;
+  virtual void glPauseTransformFeedbackFn(void) = 0;
+  virtual void glPixelStoreiFn(GLenum pname, GLint param) = 0;
+  virtual void glPointParameteriFn(GLenum pname, GLint param) = 0;
+  virtual void glPolygonOffsetFn(GLfloat factor, GLfloat units) = 0;
+  virtual void glPopGroupMarkerEXTFn(void) = 0;
+  virtual void glProgramBinaryFn(GLuint program,
+                                 GLenum binaryFormat,
+                                 const GLvoid* binary,
+                                 GLsizei length) = 0;
+  virtual void glProgramParameteriFn(GLuint program,
+                                     GLenum pname,
+                                     GLint value) = 0;
+  virtual void glPushGroupMarkerEXTFn(GLsizei length, const char* marker) = 0;
+  virtual void glQueryCounterFn(GLuint id, GLenum target) = 0;
+  virtual void glReadBufferFn(GLenum src) = 0;
+  virtual void glReadPixelsFn(GLint x,
+                              GLint y,
+                              GLsizei width,
+                              GLsizei height,
+                              GLenum format,
+                              GLenum type,
+                              void* pixels) = 0;
+  virtual void glReleaseShaderCompilerFn(void) = 0;
+  virtual void glRenderbufferStorageEXTFn(GLenum target,
+                                          GLenum internalformat,
+                                          GLsizei width,
+                                          GLsizei height) = 0;
+  virtual void glRenderbufferStorageMultisampleFn(GLenum target,
+                                                  GLsizei samples,
+                                                  GLenum internalformat,
+                                                  GLsizei width,
+                                                  GLsizei height) = 0;
+  virtual void glRenderbufferStorageMultisampleANGLEFn(GLenum target,
+                                                       GLsizei samples,
+                                                       GLenum internalformat,
+                                                       GLsizei width,
+                                                       GLsizei height) = 0;
+  virtual void glRenderbufferStorageMultisampleEXTFn(GLenum target,
+                                                     GLsizei samples,
+                                                     GLenum internalformat,
+                                                     GLsizei width,
+                                                     GLsizei height) = 0;
+  virtual void glRenderbufferStorageMultisampleIMGFn(GLenum target,
+                                                     GLsizei samples,
+                                                     GLenum internalformat,
+                                                     GLsizei width,
+                                                     GLsizei height) = 0;
+  virtual void glResumeTransformFeedbackFn(void) = 0;
+  virtual void glSampleCoverageFn(GLclampf value, GLboolean invert) = 0;
+  virtual void glSamplerParameterfFn(GLuint sampler,
+                                     GLenum pname,
+                                     GLfloat param) = 0;
+  virtual void glSamplerParameterfvFn(GLuint sampler,
+                                      GLenum pname,
+                                      const GLfloat* params) = 0;
+  virtual void glSamplerParameteriFn(GLuint sampler,
+                                     GLenum pname,
+                                     GLint param) = 0;
+  virtual void glSamplerParameterivFn(GLuint sampler,
+                                      GLenum pname,
+                                      const GLint* params) = 0;
+  virtual void glScissorFn(GLint x, GLint y, GLsizei width, GLsizei height) = 0;
+  virtual void glSetFenceAPPLEFn(GLuint fence) = 0;
+  virtual void glSetFenceNVFn(GLuint fence, GLenum condition) = 0;
+  virtual void glShaderBinaryFn(GLsizei n,
+                                const GLuint* shaders,
+                                GLenum binaryformat,
+                                const void* binary,
+                                GLsizei length) = 0;
+  virtual void glShaderSourceFn(GLuint shader,
+                                GLsizei count,
+                                const char* const* str,
+                                const GLint* length) = 0;
+  virtual void glStencilFuncFn(GLenum func, GLint ref, GLuint mask) = 0;
+  virtual void glStencilFuncSeparateFn(GLenum face,
+                                       GLenum func,
+                                       GLint ref,
+                                       GLuint mask) = 0;
+  virtual void glStencilMaskFn(GLuint mask) = 0;
+  virtual void glStencilMaskSeparateFn(GLenum face, GLuint mask) = 0;
+  virtual void glStencilOpFn(GLenum fail, GLenum zfail, GLenum zpass) = 0;
+  virtual void glStencilOpSeparateFn(GLenum face,
+                                     GLenum fail,
+                                     GLenum zfail,
+                                     GLenum zpass) = 0;
+  virtual GLboolean glTestFenceAPPLEFn(GLuint fence) = 0;
+  virtual GLboolean glTestFenceNVFn(GLuint fence) = 0;
+  virtual void glTexImage2DFn(GLenum target,
+                              GLint level,
+                              GLint internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLint border,
+                              GLenum format,
+                              GLenum type,
+                              const void* pixels) = 0;
+  virtual void glTexImage3DFn(GLenum target,
+                              GLint level,
+                              GLint internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth,
+                              GLint border,
+                              GLenum format,
+                              GLenum type,
+                              const void* pixels) = 0;
+  virtual void glTexParameterfFn(GLenum target,
+                                 GLenum pname,
+                                 GLfloat param) = 0;
+  virtual void glTexParameterfvFn(GLenum target,
+                                  GLenum pname,
+                                  const GLfloat* params) = 0;
+  virtual void glTexParameteriFn(GLenum target, GLenum pname, GLint param) = 0;
+  virtual void glTexParameterivFn(GLenum target,
+                                  GLenum pname,
+                                  const GLint* params) = 0;
+  virtual void glTexStorage2DEXTFn(GLenum target,
+                                   GLsizei levels,
+                                   GLenum internalformat,
+                                   GLsizei width,
+                                   GLsizei height) = 0;
+  virtual void glTexStorage3DFn(GLenum target,
+                                GLsizei levels,
+                                GLenum internalformat,
+                                GLsizei width,
+                                GLsizei height,
+                                GLsizei depth) = 0;
+  virtual void glTexSubImage2DFn(GLenum target,
+                                 GLint level,
+                                 GLint xoffset,
+                                 GLint yoffset,
+                                 GLsizei width,
+                                 GLsizei height,
+                                 GLenum format,
+                                 GLenum type,
+                                 const void* pixels) = 0;
+  virtual void glTransformFeedbackVaryingsFn(GLuint program,
+                                             GLsizei count,
+                                             const char* const* varyings,
+                                             GLenum bufferMode) = 0;
+  virtual void glUniform1fFn(GLint location, GLfloat x) = 0;
+  virtual void glUniform1fvFn(GLint location,
+                              GLsizei count,
+                              const GLfloat* v) = 0;
+  virtual void glUniform1iFn(GLint location, GLint x) = 0;
+  virtual void glUniform1ivFn(GLint location,
+                              GLsizei count,
+                              const GLint* v) = 0;
+  virtual void glUniform1uiFn(GLint location, GLuint v0) = 0;
+  virtual void glUniform1uivFn(GLint location,
+                               GLsizei count,
+                               const GLuint* v) = 0;
+  virtual void glUniform2fFn(GLint location, GLfloat x, GLfloat y) = 0;
+  virtual void glUniform2fvFn(GLint location,
+                              GLsizei count,
+                              const GLfloat* v) = 0;
+  virtual void glUniform2iFn(GLint location, GLint x, GLint y) = 0;
+  virtual void glUniform2ivFn(GLint location,
+                              GLsizei count,
+                              const GLint* v) = 0;
+  virtual void glUniform2uiFn(GLint location, GLuint v0, GLuint v1) = 0;
+  virtual void glUniform2uivFn(GLint location,
+                               GLsizei count,
+                               const GLuint* v) = 0;
+  virtual void glUniform3fFn(GLint location,
+                             GLfloat x,
+                             GLfloat y,
+                             GLfloat z) = 0;
+  virtual void glUniform3fvFn(GLint location,
+                              GLsizei count,
+                              const GLfloat* v) = 0;
+  virtual void glUniform3iFn(GLint location, GLint x, GLint y, GLint z) = 0;
+  virtual void glUniform3ivFn(GLint location,
+                              GLsizei count,
+                              const GLint* v) = 0;
+  virtual void glUniform3uiFn(GLint location,
+                              GLuint v0,
+                              GLuint v1,
+                              GLuint v2) = 0;
+  virtual void glUniform3uivFn(GLint location,
+                               GLsizei count,
+                               const GLuint* v) = 0;
+  virtual void glUniform4fFn(GLint location,
+                             GLfloat x,
+                             GLfloat y,
+                             GLfloat z,
+                             GLfloat w) = 0;
+  virtual void glUniform4fvFn(GLint location,
+                              GLsizei count,
+                              const GLfloat* v) = 0;
+  virtual void glUniform4iFn(GLint location,
+                             GLint x,
+                             GLint y,
+                             GLint z,
+                             GLint w) = 0;
+  virtual void glUniform4ivFn(GLint location,
+                              GLsizei count,
+                              const GLint* v) = 0;
+  virtual void glUniform4uiFn(GLint location,
+                              GLuint v0,
+                              GLuint v1,
+                              GLuint v2,
+                              GLuint v3) = 0;
+  virtual void glUniform4uivFn(GLint location,
+                               GLsizei count,
+                               const GLuint* v) = 0;
+  virtual void glUniformBlockBindingFn(GLuint program,
+                                       GLuint uniformBlockIndex,
+                                       GLuint uniformBlockBinding) = 0;
+  virtual void glUniformMatrix2fvFn(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat* value) = 0;
+  virtual void glUniformMatrix2x3fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) = 0;
+  virtual void glUniformMatrix2x4fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) = 0;
+  virtual void glUniformMatrix3fvFn(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat* value) = 0;
+  virtual void glUniformMatrix3x2fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) = 0;
+  virtual void glUniformMatrix3x4fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) = 0;
+  virtual void glUniformMatrix4fvFn(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat* value) = 0;
+  virtual void glUniformMatrix4x2fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) = 0;
+  virtual void glUniformMatrix4x3fvFn(GLint location,
+                                      GLsizei count,
+                                      GLboolean transpose,
+                                      const GLfloat* value) = 0;
+  virtual GLboolean glUnmapBufferFn(GLenum target) = 0;
+  virtual void glUseProgramFn(GLuint program) = 0;
+  virtual void glValidateProgramFn(GLuint program) = 0;
+  virtual void glVertexAttrib1fFn(GLuint indx, GLfloat x) = 0;
+  virtual void glVertexAttrib1fvFn(GLuint indx, const GLfloat* values) = 0;
+  virtual void glVertexAttrib2fFn(GLuint indx, GLfloat x, GLfloat y) = 0;
+  virtual void glVertexAttrib2fvFn(GLuint indx, const GLfloat* values) = 0;
+  virtual void glVertexAttrib3fFn(GLuint indx,
+                                  GLfloat x,
+                                  GLfloat y,
+                                  GLfloat z) = 0;
+  virtual void glVertexAttrib3fvFn(GLuint indx, const GLfloat* values) = 0;
+  virtual void glVertexAttrib4fFn(GLuint indx,
+                                  GLfloat x,
+                                  GLfloat y,
+                                  GLfloat z,
+                                  GLfloat w) = 0;
+  virtual void glVertexAttrib4fvFn(GLuint indx, const GLfloat* values) = 0;
+  virtual void glVertexAttribDivisorANGLEFn(GLuint index, GLuint divisor) = 0;
+  virtual void glVertexAttribI4iFn(GLuint indx,
+                                   GLint x,
+                                   GLint y,
+                                   GLint z,
+                                   GLint w) = 0;
+  virtual void glVertexAttribI4ivFn(GLuint indx, const GLint* values) = 0;
+  virtual void glVertexAttribI4uiFn(GLuint indx,
+                                    GLuint x,
+                                    GLuint y,
+                                    GLuint z,
+                                    GLuint w) = 0;
+  virtual void glVertexAttribI4uivFn(GLuint indx, const GLuint* values) = 0;
+  virtual void glVertexAttribIPointerFn(GLuint indx,
+                                        GLint size,
+                                        GLenum type,
+                                        GLsizei stride,
+                                        const void* ptr) = 0;
+  virtual void glVertexAttribPointerFn(GLuint indx,
+                                       GLint size,
+                                       GLenum type,
+                                       GLboolean normalized,
+                                       GLsizei stride,
+                                       const void* ptr) = 0;
+  virtual void glViewportFn(GLint x,
+                            GLint y,
+                            GLsizei width,
+                            GLsizei height) = 0;
+  virtual GLenum glWaitSyncFn(GLsync sync,
+                              GLbitfield flags,
+                              GLuint64 timeout) = 0;
+};
+
+}  // namespace gfx
+
+#define glActiveTexture ::gfx::g_current_gl_context->glActiveTextureFn
+#define glAttachShader ::gfx::g_current_gl_context->glAttachShaderFn
+#define glBeginQuery ::gfx::g_current_gl_context->glBeginQueryFn
+#define glBeginQueryARB ::gfx::g_current_gl_context->glBeginQueryARBFn
+#define glBeginTransformFeedback \
+  ::gfx::g_current_gl_context->glBeginTransformFeedbackFn
+#define glBindAttribLocation ::gfx::g_current_gl_context->glBindAttribLocationFn
+#define glBindBuffer ::gfx::g_current_gl_context->glBindBufferFn
+#define glBindBufferBase ::gfx::g_current_gl_context->glBindBufferBaseFn
+#define glBindBufferRange ::gfx::g_current_gl_context->glBindBufferRangeFn
+#define glBindFragDataLocation \
+  ::gfx::g_current_gl_context->glBindFragDataLocationFn
+#define glBindFragDataLocationIndexed \
+  ::gfx::g_current_gl_context->glBindFragDataLocationIndexedFn
+#define glBindFramebufferEXT ::gfx::g_current_gl_context->glBindFramebufferEXTFn
+#define glBindRenderbufferEXT \
+  ::gfx::g_current_gl_context->glBindRenderbufferEXTFn
+#define glBindSampler ::gfx::g_current_gl_context->glBindSamplerFn
+#define glBindTexture ::gfx::g_current_gl_context->glBindTextureFn
+#define glBindTransformFeedback \
+  ::gfx::g_current_gl_context->glBindTransformFeedbackFn
+#define glBindVertexArrayOES ::gfx::g_current_gl_context->glBindVertexArrayOESFn
+#define glBlendBarrierKHR ::gfx::g_current_gl_context->glBlendBarrierKHRFn
+#define glBlendColor ::gfx::g_current_gl_context->glBlendColorFn
+#define glBlendEquation ::gfx::g_current_gl_context->glBlendEquationFn
+#define glBlendEquationSeparate \
+  ::gfx::g_current_gl_context->glBlendEquationSeparateFn
+#define glBlendFunc ::gfx::g_current_gl_context->glBlendFuncFn
+#define glBlendFuncSeparate ::gfx::g_current_gl_context->glBlendFuncSeparateFn
+#define glBlitFramebuffer ::gfx::g_current_gl_context->glBlitFramebufferFn
+#define glBlitFramebufferANGLE \
+  ::gfx::g_current_gl_context->glBlitFramebufferANGLEFn
+#define glBlitFramebufferEXT ::gfx::g_current_gl_context->glBlitFramebufferEXTFn
+#define glBufferData ::gfx::g_current_gl_context->glBufferDataFn
+#define glBufferSubData ::gfx::g_current_gl_context->glBufferSubDataFn
+#define glCheckFramebufferStatusEXT \
+  ::gfx::g_current_gl_context->glCheckFramebufferStatusEXTFn
+#define glClear ::gfx::g_current_gl_context->glClearFn
+#define glClearBufferfi ::gfx::g_current_gl_context->glClearBufferfiFn
+#define glClearBufferfv ::gfx::g_current_gl_context->glClearBufferfvFn
+#define glClearBufferiv ::gfx::g_current_gl_context->glClearBufferivFn
+#define glClearBufferuiv ::gfx::g_current_gl_context->glClearBufferuivFn
+#define glClearColor ::gfx::g_current_gl_context->glClearColorFn
+#define glClearDepth ::gfx::g_current_gl_context->glClearDepthFn
+#define glClearDepthf ::gfx::g_current_gl_context->glClearDepthfFn
+#define glClearStencil ::gfx::g_current_gl_context->glClearStencilFn
+#define glClientWaitSync ::gfx::g_current_gl_context->glClientWaitSyncFn
+#define glColorMask ::gfx::g_current_gl_context->glColorMaskFn
+#define glCompileShader ::gfx::g_current_gl_context->glCompileShaderFn
+#define glCompressedTexImage2D \
+  ::gfx::g_current_gl_context->glCompressedTexImage2DFn
+#define glCompressedTexImage3D \
+  ::gfx::g_current_gl_context->glCompressedTexImage3DFn
+#define glCompressedTexSubImage2D \
+  ::gfx::g_current_gl_context->glCompressedTexSubImage2DFn
+#define glCopyBufferSubData ::gfx::g_current_gl_context->glCopyBufferSubDataFn
+#define glCopyTexImage2D ::gfx::g_current_gl_context->glCopyTexImage2DFn
+#define glCopyTexSubImage2D ::gfx::g_current_gl_context->glCopyTexSubImage2DFn
+#define glCopyTexSubImage3D ::gfx::g_current_gl_context->glCopyTexSubImage3DFn
+#define glCreateProgram ::gfx::g_current_gl_context->glCreateProgramFn
+#define glCreateShader ::gfx::g_current_gl_context->glCreateShaderFn
+#define glCullFace ::gfx::g_current_gl_context->glCullFaceFn
+#define glDeleteBuffersARB ::gfx::g_current_gl_context->glDeleteBuffersARBFn
+#define glDeleteFencesAPPLE ::gfx::g_current_gl_context->glDeleteFencesAPPLEFn
+#define glDeleteFencesNV ::gfx::g_current_gl_context->glDeleteFencesNVFn
+#define glDeleteFramebuffersEXT \
+  ::gfx::g_current_gl_context->glDeleteFramebuffersEXTFn
+#define glDeleteProgram ::gfx::g_current_gl_context->glDeleteProgramFn
+#define glDeleteQueries ::gfx::g_current_gl_context->glDeleteQueriesFn
+#define glDeleteQueriesARB ::gfx::g_current_gl_context->glDeleteQueriesARBFn
+#define glDeleteRenderbuffersEXT \
+  ::gfx::g_current_gl_context->glDeleteRenderbuffersEXTFn
+#define glDeleteSamplers ::gfx::g_current_gl_context->glDeleteSamplersFn
+#define glDeleteShader ::gfx::g_current_gl_context->glDeleteShaderFn
+#define glDeleteSync ::gfx::g_current_gl_context->glDeleteSyncFn
+#define glDeleteTextures ::gfx::g_current_gl_context->glDeleteTexturesFn
+#define glDeleteTransformFeedbacks \
+  ::gfx::g_current_gl_context->glDeleteTransformFeedbacksFn
+#define glDeleteVertexArraysOES \
+  ::gfx::g_current_gl_context->glDeleteVertexArraysOESFn
+#define glDepthFunc ::gfx::g_current_gl_context->glDepthFuncFn
+#define glDepthMask ::gfx::g_current_gl_context->glDepthMaskFn
+#define glDepthRange ::gfx::g_current_gl_context->glDepthRangeFn
+#define glDepthRangef ::gfx::g_current_gl_context->glDepthRangefFn
+#define glDetachShader ::gfx::g_current_gl_context->glDetachShaderFn
+#define glDisable ::gfx::g_current_gl_context->glDisableFn
+#define glDisableVertexAttribArray \
+  ::gfx::g_current_gl_context->glDisableVertexAttribArrayFn
+#define glDiscardFramebufferEXT \
+  ::gfx::g_current_gl_context->glDiscardFramebufferEXTFn
+#define glDrawArrays ::gfx::g_current_gl_context->glDrawArraysFn
+#define glDrawArraysInstancedANGLE \
+  ::gfx::g_current_gl_context->glDrawArraysInstancedANGLEFn
+#define glDrawBuffer ::gfx::g_current_gl_context->glDrawBufferFn
+#define glDrawBuffersARB ::gfx::g_current_gl_context->glDrawBuffersARBFn
+#define glDrawElements ::gfx::g_current_gl_context->glDrawElementsFn
+#define glDrawElementsInstancedANGLE \
+  ::gfx::g_current_gl_context->glDrawElementsInstancedANGLEFn
+#define glDrawRangeElements ::gfx::g_current_gl_context->glDrawRangeElementsFn
+#define glEGLImageTargetRenderbufferStorageOES \
+  ::gfx::g_current_gl_context->glEGLImageTargetRenderbufferStorageOESFn
+#define glEGLImageTargetTexture2DOES \
+  ::gfx::g_current_gl_context->glEGLImageTargetTexture2DOESFn
+#define glEnable ::gfx::g_current_gl_context->glEnableFn
+#define glEnableVertexAttribArray \
+  ::gfx::g_current_gl_context->glEnableVertexAttribArrayFn
+#define glEndQuery ::gfx::g_current_gl_context->glEndQueryFn
+#define glEndQueryARB ::gfx::g_current_gl_context->glEndQueryARBFn
+#define glEndTransformFeedback \
+  ::gfx::g_current_gl_context->glEndTransformFeedbackFn
+#define glFenceSync ::gfx::g_current_gl_context->glFenceSyncFn
+#define glFinish ::gfx::g_current_gl_context->glFinishFn
+#define glFinishFenceAPPLE ::gfx::g_current_gl_context->glFinishFenceAPPLEFn
+#define glFinishFenceNV ::gfx::g_current_gl_context->glFinishFenceNVFn
+#define glFlush ::gfx::g_current_gl_context->glFlushFn
+#define glFlushMappedBufferRange \
+  ::gfx::g_current_gl_context->glFlushMappedBufferRangeFn
+#define glFramebufferRenderbufferEXT \
+  ::gfx::g_current_gl_context->glFramebufferRenderbufferEXTFn
+#define glFramebufferTexture2DEXT \
+  ::gfx::g_current_gl_context->glFramebufferTexture2DEXTFn
+#define glFramebufferTexture2DMultisampleEXT \
+  ::gfx::g_current_gl_context->glFramebufferTexture2DMultisampleEXTFn
+#define glFramebufferTexture2DMultisampleIMG \
+  ::gfx::g_current_gl_context->glFramebufferTexture2DMultisampleIMGFn
+#define glFramebufferTextureLayer \
+  ::gfx::g_current_gl_context->glFramebufferTextureLayerFn
+#define glFrontFace ::gfx::g_current_gl_context->glFrontFaceFn
+#define glGenBuffersARB ::gfx::g_current_gl_context->glGenBuffersARBFn
+#define glGenerateMipmapEXT ::gfx::g_current_gl_context->glGenerateMipmapEXTFn
+#define glGenFencesAPPLE ::gfx::g_current_gl_context->glGenFencesAPPLEFn
+#define glGenFencesNV ::gfx::g_current_gl_context->glGenFencesNVFn
+#define glGenFramebuffersEXT ::gfx::g_current_gl_context->glGenFramebuffersEXTFn
+#define glGenQueries ::gfx::g_current_gl_context->glGenQueriesFn
+#define glGenQueriesARB ::gfx::g_current_gl_context->glGenQueriesARBFn
+#define glGenRenderbuffersEXT \
+  ::gfx::g_current_gl_context->glGenRenderbuffersEXTFn
+#define glGenSamplers ::gfx::g_current_gl_context->glGenSamplersFn
+#define glGenTextures ::gfx::g_current_gl_context->glGenTexturesFn
+#define glGenTransformFeedbacks \
+  ::gfx::g_current_gl_context->glGenTransformFeedbacksFn
+#define glGenVertexArraysOES ::gfx::g_current_gl_context->glGenVertexArraysOESFn
+#define glGetActiveAttrib ::gfx::g_current_gl_context->glGetActiveAttribFn
+#define glGetActiveUniform ::gfx::g_current_gl_context->glGetActiveUniformFn
+#define glGetActiveUniformBlockiv \
+  ::gfx::g_current_gl_context->glGetActiveUniformBlockivFn
+#define glGetActiveUniformBlockName \
+  ::gfx::g_current_gl_context->glGetActiveUniformBlockNameFn
+#define glGetActiveUniformsiv \
+  ::gfx::g_current_gl_context->glGetActiveUniformsivFn
+#define glGetAttachedShaders ::gfx::g_current_gl_context->glGetAttachedShadersFn
+#define glGetAttribLocation ::gfx::g_current_gl_context->glGetAttribLocationFn
+#define glGetBooleanv ::gfx::g_current_gl_context->glGetBooleanvFn
+#define glGetBufferParameteriv \
+  ::gfx::g_current_gl_context->glGetBufferParameterivFn
+#define glGetError ::gfx::g_current_gl_context->glGetErrorFn
+#define glGetFenceivNV ::gfx::g_current_gl_context->glGetFenceivNVFn
+#define glGetFloatv ::gfx::g_current_gl_context->glGetFloatvFn
+#define glGetFragDataLocation \
+  ::gfx::g_current_gl_context->glGetFragDataLocationFn
+#define glGetFramebufferAttachmentParameterivEXT \
+  ::gfx::g_current_gl_context->glGetFramebufferAttachmentParameterivEXTFn
+#define glGetGraphicsResetStatusARB \
+  ::gfx::g_current_gl_context->glGetGraphicsResetStatusARBFn
+#define glGetInteger64i_v ::gfx::g_current_gl_context->glGetInteger64i_vFn
+#define glGetInteger64v ::gfx::g_current_gl_context->glGetInteger64vFn
+#define glGetIntegeri_v ::gfx::g_current_gl_context->glGetIntegeri_vFn
+#define glGetIntegerv ::gfx::g_current_gl_context->glGetIntegervFn
+#define glGetInternalformativ \
+  ::gfx::g_current_gl_context->glGetInternalformativFn
+#define glGetProgramBinary ::gfx::g_current_gl_context->glGetProgramBinaryFn
+#define glGetProgramInfoLog ::gfx::g_current_gl_context->glGetProgramInfoLogFn
+#define glGetProgramiv ::gfx::g_current_gl_context->glGetProgramivFn
+#define glGetQueryiv ::gfx::g_current_gl_context->glGetQueryivFn
+#define glGetQueryivARB ::gfx::g_current_gl_context->glGetQueryivARBFn
+#define glGetQueryObjecti64v ::gfx::g_current_gl_context->glGetQueryObjecti64vFn
+#define glGetQueryObjectiv ::gfx::g_current_gl_context->glGetQueryObjectivFn
+#define glGetQueryObjectivARB \
+  ::gfx::g_current_gl_context->glGetQueryObjectivARBFn
+#define glGetQueryObjectui64v \
+  ::gfx::g_current_gl_context->glGetQueryObjectui64vFn
+#define glGetQueryObjectuiv ::gfx::g_current_gl_context->glGetQueryObjectuivFn
+#define glGetQueryObjectuivARB \
+  ::gfx::g_current_gl_context->glGetQueryObjectuivARBFn
+#define glGetRenderbufferParameterivEXT \
+  ::gfx::g_current_gl_context->glGetRenderbufferParameterivEXTFn
+#define glGetSamplerParameterfv \
+  ::gfx::g_current_gl_context->glGetSamplerParameterfvFn
+#define glGetSamplerParameteriv \
+  ::gfx::g_current_gl_context->glGetSamplerParameterivFn
+#define glGetShaderInfoLog ::gfx::g_current_gl_context->glGetShaderInfoLogFn
+#define glGetShaderiv ::gfx::g_current_gl_context->glGetShaderivFn
+#define glGetShaderPrecisionFormat \
+  ::gfx::g_current_gl_context->glGetShaderPrecisionFormatFn
+#define glGetShaderSource ::gfx::g_current_gl_context->glGetShaderSourceFn
+#define glGetString ::gfx::g_current_gl_context->glGetStringFn
+#define glGetSynciv ::gfx::g_current_gl_context->glGetSyncivFn
+#define glGetTexLevelParameterfv \
+  ::gfx::g_current_gl_context->glGetTexLevelParameterfvFn
+#define glGetTexLevelParameteriv \
+  ::gfx::g_current_gl_context->glGetTexLevelParameterivFn
+#define glGetTexParameterfv ::gfx::g_current_gl_context->glGetTexParameterfvFn
+#define glGetTexParameteriv ::gfx::g_current_gl_context->glGetTexParameterivFn
+#define glGetTransformFeedbackVarying \
+  ::gfx::g_current_gl_context->glGetTransformFeedbackVaryingFn
+#define glGetTranslatedShaderSourceANGLE \
+  ::gfx::g_current_gl_context->glGetTranslatedShaderSourceANGLEFn
+#define glGetUniformBlockIndex \
+  ::gfx::g_current_gl_context->glGetUniformBlockIndexFn
+#define glGetUniformfv ::gfx::g_current_gl_context->glGetUniformfvFn
+#define glGetUniformIndices ::gfx::g_current_gl_context->glGetUniformIndicesFn
+#define glGetUniformiv ::gfx::g_current_gl_context->glGetUniformivFn
+#define glGetUniformLocation ::gfx::g_current_gl_context->glGetUniformLocationFn
+#define glGetVertexAttribfv ::gfx::g_current_gl_context->glGetVertexAttribfvFn
+#define glGetVertexAttribiv ::gfx::g_current_gl_context->glGetVertexAttribivFn
+#define glGetVertexAttribPointerv \
+  ::gfx::g_current_gl_context->glGetVertexAttribPointervFn
+#define glHint ::gfx::g_current_gl_context->glHintFn
+#define glInsertEventMarkerEXT \
+  ::gfx::g_current_gl_context->glInsertEventMarkerEXTFn
+#define glInvalidateFramebuffer \
+  ::gfx::g_current_gl_context->glInvalidateFramebufferFn
+#define glInvalidateSubFramebuffer \
+  ::gfx::g_current_gl_context->glInvalidateSubFramebufferFn
+#define glIsBuffer ::gfx::g_current_gl_context->glIsBufferFn
+#define glIsEnabled ::gfx::g_current_gl_context->glIsEnabledFn
+#define glIsFenceAPPLE ::gfx::g_current_gl_context->glIsFenceAPPLEFn
+#define glIsFenceNV ::gfx::g_current_gl_context->glIsFenceNVFn
+#define glIsFramebufferEXT ::gfx::g_current_gl_context->glIsFramebufferEXTFn
+#define glIsProgram ::gfx::g_current_gl_context->glIsProgramFn
+#define glIsQuery ::gfx::g_current_gl_context->glIsQueryFn
+#define glIsQueryARB ::gfx::g_current_gl_context->glIsQueryARBFn
+#define glIsRenderbufferEXT ::gfx::g_current_gl_context->glIsRenderbufferEXTFn
+#define glIsSampler ::gfx::g_current_gl_context->glIsSamplerFn
+#define glIsShader ::gfx::g_current_gl_context->glIsShaderFn
+#define glIsSync ::gfx::g_current_gl_context->glIsSyncFn
+#define glIsTexture ::gfx::g_current_gl_context->glIsTextureFn
+#define glIsTransformFeedback \
+  ::gfx::g_current_gl_context->glIsTransformFeedbackFn
+#define glIsVertexArrayOES ::gfx::g_current_gl_context->glIsVertexArrayOESFn
+#define glLineWidth ::gfx::g_current_gl_context->glLineWidthFn
+#define glLinkProgram ::gfx::g_current_gl_context->glLinkProgramFn
+#define glMapBuffer ::gfx::g_current_gl_context->glMapBufferFn
+#define glMapBufferRange ::gfx::g_current_gl_context->glMapBufferRangeFn
+#define glMatrixLoadfEXT ::gfx::g_current_gl_context->glMatrixLoadfEXTFn
+#define glMatrixLoadIdentityEXT \
+  ::gfx::g_current_gl_context->glMatrixLoadIdentityEXTFn
+#define glPauseTransformFeedback \
+  ::gfx::g_current_gl_context->glPauseTransformFeedbackFn
+#define glPixelStorei ::gfx::g_current_gl_context->glPixelStoreiFn
+#define glPointParameteri ::gfx::g_current_gl_context->glPointParameteriFn
+#define glPolygonOffset ::gfx::g_current_gl_context->glPolygonOffsetFn
+#define glPopGroupMarkerEXT ::gfx::g_current_gl_context->glPopGroupMarkerEXTFn
+#define glProgramBinary ::gfx::g_current_gl_context->glProgramBinaryFn
+#define glProgramParameteri ::gfx::g_current_gl_context->glProgramParameteriFn
+#define glPushGroupMarkerEXT ::gfx::g_current_gl_context->glPushGroupMarkerEXTFn
+#define glQueryCounter ::gfx::g_current_gl_context->glQueryCounterFn
+#define glReadBuffer ::gfx::g_current_gl_context->glReadBufferFn
+#define glReadPixels ::gfx::g_current_gl_context->glReadPixelsFn
+#define glReleaseShaderCompiler \
+  ::gfx::g_current_gl_context->glReleaseShaderCompilerFn
+#define glRenderbufferStorageEXT \
+  ::gfx::g_current_gl_context->glRenderbufferStorageEXTFn
+#define glRenderbufferStorageMultisample \
+  ::gfx::g_current_gl_context->glRenderbufferStorageMultisampleFn
+#define glRenderbufferStorageMultisampleANGLE \
+  ::gfx::g_current_gl_context->glRenderbufferStorageMultisampleANGLEFn
+#define glRenderbufferStorageMultisampleEXT \
+  ::gfx::g_current_gl_context->glRenderbufferStorageMultisampleEXTFn
+#define glRenderbufferStorageMultisampleIMG \
+  ::gfx::g_current_gl_context->glRenderbufferStorageMultisampleIMGFn
+#define glResumeTransformFeedback \
+  ::gfx::g_current_gl_context->glResumeTransformFeedbackFn
+#define glSampleCoverage ::gfx::g_current_gl_context->glSampleCoverageFn
+#define glSamplerParameterf ::gfx::g_current_gl_context->glSamplerParameterfFn
+#define glSamplerParameterfv ::gfx::g_current_gl_context->glSamplerParameterfvFn
+#define glSamplerParameteri ::gfx::g_current_gl_context->glSamplerParameteriFn
+#define glSamplerParameteriv ::gfx::g_current_gl_context->glSamplerParameterivFn
+#define glScissor ::gfx::g_current_gl_context->glScissorFn
+#define glSetFenceAPPLE ::gfx::g_current_gl_context->glSetFenceAPPLEFn
+#define glSetFenceNV ::gfx::g_current_gl_context->glSetFenceNVFn
+#define glShaderBinary ::gfx::g_current_gl_context->glShaderBinaryFn
+#define glShaderSource ::gfx::g_current_gl_context->glShaderSourceFn
+#define glStencilFunc ::gfx::g_current_gl_context->glStencilFuncFn
+#define glStencilFuncSeparate \
+  ::gfx::g_current_gl_context->glStencilFuncSeparateFn
+#define glStencilMask ::gfx::g_current_gl_context->glStencilMaskFn
+#define glStencilMaskSeparate \
+  ::gfx::g_current_gl_context->glStencilMaskSeparateFn
+#define glStencilOp ::gfx::g_current_gl_context->glStencilOpFn
+#define glStencilOpSeparate ::gfx::g_current_gl_context->glStencilOpSeparateFn
+#define glTestFenceAPPLE ::gfx::g_current_gl_context->glTestFenceAPPLEFn
+#define glTestFenceNV ::gfx::g_current_gl_context->glTestFenceNVFn
+#define glTexImage2D ::gfx::g_current_gl_context->glTexImage2DFn
+#define glTexImage3D ::gfx::g_current_gl_context->glTexImage3DFn
+#define glTexParameterf ::gfx::g_current_gl_context->glTexParameterfFn
+#define glTexParameterfv ::gfx::g_current_gl_context->glTexParameterfvFn
+#define glTexParameteri ::gfx::g_current_gl_context->glTexParameteriFn
+#define glTexParameteriv ::gfx::g_current_gl_context->glTexParameterivFn
+#define glTexStorage2DEXT ::gfx::g_current_gl_context->glTexStorage2DEXTFn
+#define glTexStorage3D ::gfx::g_current_gl_context->glTexStorage3DFn
+#define glTexSubImage2D ::gfx::g_current_gl_context->glTexSubImage2DFn
+#define glTransformFeedbackVaryings \
+  ::gfx::g_current_gl_context->glTransformFeedbackVaryingsFn
+#define glUniform1f ::gfx::g_current_gl_context->glUniform1fFn
+#define glUniform1fv ::gfx::g_current_gl_context->glUniform1fvFn
+#define glUniform1i ::gfx::g_current_gl_context->glUniform1iFn
+#define glUniform1iv ::gfx::g_current_gl_context->glUniform1ivFn
+#define glUniform1ui ::gfx::g_current_gl_context->glUniform1uiFn
+#define glUniform1uiv ::gfx::g_current_gl_context->glUniform1uivFn
+#define glUniform2f ::gfx::g_current_gl_context->glUniform2fFn
+#define glUniform2fv ::gfx::g_current_gl_context->glUniform2fvFn
+#define glUniform2i ::gfx::g_current_gl_context->glUniform2iFn
+#define glUniform2iv ::gfx::g_current_gl_context->glUniform2ivFn
+#define glUniform2ui ::gfx::g_current_gl_context->glUniform2uiFn
+#define glUniform2uiv ::gfx::g_current_gl_context->glUniform2uivFn
+#define glUniform3f ::gfx::g_current_gl_context->glUniform3fFn
+#define glUniform3fv ::gfx::g_current_gl_context->glUniform3fvFn
+#define glUniform3i ::gfx::g_current_gl_context->glUniform3iFn
+#define glUniform3iv ::gfx::g_current_gl_context->glUniform3ivFn
+#define glUniform3ui ::gfx::g_current_gl_context->glUniform3uiFn
+#define glUniform3uiv ::gfx::g_current_gl_context->glUniform3uivFn
+#define glUniform4f ::gfx::g_current_gl_context->glUniform4fFn
+#define glUniform4fv ::gfx::g_current_gl_context->glUniform4fvFn
+#define glUniform4i ::gfx::g_current_gl_context->glUniform4iFn
+#define glUniform4iv ::gfx::g_current_gl_context->glUniform4ivFn
+#define glUniform4ui ::gfx::g_current_gl_context->glUniform4uiFn
+#define glUniform4uiv ::gfx::g_current_gl_context->glUniform4uivFn
+#define glUniformBlockBinding \
+  ::gfx::g_current_gl_context->glUniformBlockBindingFn
+#define glUniformMatrix2fv ::gfx::g_current_gl_context->glUniformMatrix2fvFn
+#define glUniformMatrix2x3fv ::gfx::g_current_gl_context->glUniformMatrix2x3fvFn
+#define glUniformMatrix2x4fv ::gfx::g_current_gl_context->glUniformMatrix2x4fvFn
+#define glUniformMatrix3fv ::gfx::g_current_gl_context->glUniformMatrix3fvFn
+#define glUniformMatrix3x2fv ::gfx::g_current_gl_context->glUniformMatrix3x2fvFn
+#define glUniformMatrix3x4fv ::gfx::g_current_gl_context->glUniformMatrix3x4fvFn
+#define glUniformMatrix4fv ::gfx::g_current_gl_context->glUniformMatrix4fvFn
+#define glUniformMatrix4x2fv ::gfx::g_current_gl_context->glUniformMatrix4x2fvFn
+#define glUniformMatrix4x3fv ::gfx::g_current_gl_context->glUniformMatrix4x3fvFn
+#define glUnmapBuffer ::gfx::g_current_gl_context->glUnmapBufferFn
+#define glUseProgram ::gfx::g_current_gl_context->glUseProgramFn
+#define glValidateProgram ::gfx::g_current_gl_context->glValidateProgramFn
+#define glVertexAttrib1f ::gfx::g_current_gl_context->glVertexAttrib1fFn
+#define glVertexAttrib1fv ::gfx::g_current_gl_context->glVertexAttrib1fvFn
+#define glVertexAttrib2f ::gfx::g_current_gl_context->glVertexAttrib2fFn
+#define glVertexAttrib2fv ::gfx::g_current_gl_context->glVertexAttrib2fvFn
+#define glVertexAttrib3f ::gfx::g_current_gl_context->glVertexAttrib3fFn
+#define glVertexAttrib3fv ::gfx::g_current_gl_context->glVertexAttrib3fvFn
+#define glVertexAttrib4f ::gfx::g_current_gl_context->glVertexAttrib4fFn
+#define glVertexAttrib4fv ::gfx::g_current_gl_context->glVertexAttrib4fvFn
+#define glVertexAttribDivisorANGLE \
+  ::gfx::g_current_gl_context->glVertexAttribDivisorANGLEFn
+#define glVertexAttribI4i ::gfx::g_current_gl_context->glVertexAttribI4iFn
+#define glVertexAttribI4iv ::gfx::g_current_gl_context->glVertexAttribI4ivFn
+#define glVertexAttribI4ui ::gfx::g_current_gl_context->glVertexAttribI4uiFn
+#define glVertexAttribI4uiv ::gfx::g_current_gl_context->glVertexAttribI4uivFn
+#define glVertexAttribIPointer \
+  ::gfx::g_current_gl_context->glVertexAttribIPointerFn
+#define glVertexAttribPointer \
+  ::gfx::g_current_gl_context->glVertexAttribPointerFn
+#define glViewport ::gfx::g_current_gl_context->glViewportFn
+#define glWaitSync ::gfx::g_current_gl_context->glWaitSyncFn
+
+#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
diff --git a/ui/gl/gl_bindings_autogen_glx.cc b/ui/gl/gl_bindings_autogen_glx.cc
new file mode 100644
index 0000000..617ff5f
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_glx.cc
@@ -0,0 +1,1463 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#include <string>
+
+#include "base/debug/trace_event.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_enums.h"
+#include "ui/gl/gl_glx_api_implementation.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_version_info.h"
+
+namespace gfx {
+
+static bool g_debugBindingsInitialized;
+DriverGLX g_driver_glx;
+
+void DriverGLX::InitializeStaticBindings() {
+  fn.glXBindTexImageEXTFn = reinterpret_cast<glXBindTexImageEXTProc>(
+      GetGLProcAddress("glXBindTexImageEXT"));
+  fn.glXChooseFBConfigFn = reinterpret_cast<glXChooseFBConfigProc>(
+      GetGLProcAddress("glXChooseFBConfig"));
+  fn.glXChooseVisualFn = reinterpret_cast<glXChooseVisualProc>(
+      GetGLProcAddress("glXChooseVisual"));
+  fn.glXCopyContextFn =
+      reinterpret_cast<glXCopyContextProc>(GetGLProcAddress("glXCopyContext"));
+  fn.glXCopySubBufferMESAFn = reinterpret_cast<glXCopySubBufferMESAProc>(
+      GetGLProcAddress("glXCopySubBufferMESA"));
+  fn.glXCreateContextFn = reinterpret_cast<glXCreateContextProc>(
+      GetGLProcAddress("glXCreateContext"));
+  fn.glXCreateContextAttribsARBFn =
+      reinterpret_cast<glXCreateContextAttribsARBProc>(
+          GetGLProcAddress("glXCreateContextAttribsARB"));
+  fn.glXCreateGLXPixmapFn = reinterpret_cast<glXCreateGLXPixmapProc>(
+      GetGLProcAddress("glXCreateGLXPixmap"));
+  fn.glXCreateNewContextFn = reinterpret_cast<glXCreateNewContextProc>(
+      GetGLProcAddress("glXCreateNewContext"));
+  fn.glXCreatePbufferFn = reinterpret_cast<glXCreatePbufferProc>(
+      GetGLProcAddress("glXCreatePbuffer"));
+  fn.glXCreatePixmapFn = reinterpret_cast<glXCreatePixmapProc>(
+      GetGLProcAddress("glXCreatePixmap"));
+  fn.glXCreateWindowFn = reinterpret_cast<glXCreateWindowProc>(
+      GetGLProcAddress("glXCreateWindow"));
+  fn.glXDestroyContextFn = reinterpret_cast<glXDestroyContextProc>(
+      GetGLProcAddress("glXDestroyContext"));
+  fn.glXDestroyGLXPixmapFn = reinterpret_cast<glXDestroyGLXPixmapProc>(
+      GetGLProcAddress("glXDestroyGLXPixmap"));
+  fn.glXDestroyPbufferFn = reinterpret_cast<glXDestroyPbufferProc>(
+      GetGLProcAddress("glXDestroyPbuffer"));
+  fn.glXDestroyPixmapFn = reinterpret_cast<glXDestroyPixmapProc>(
+      GetGLProcAddress("glXDestroyPixmap"));
+  fn.glXDestroyWindowFn = reinterpret_cast<glXDestroyWindowProc>(
+      GetGLProcAddress("glXDestroyWindow"));
+  fn.glXGetClientStringFn = reinterpret_cast<glXGetClientStringProc>(
+      GetGLProcAddress("glXGetClientString"));
+  fn.glXGetConfigFn =
+      reinterpret_cast<glXGetConfigProc>(GetGLProcAddress("glXGetConfig"));
+  fn.glXGetCurrentContextFn = reinterpret_cast<glXGetCurrentContextProc>(
+      GetGLProcAddress("glXGetCurrentContext"));
+  fn.glXGetCurrentDisplayFn = reinterpret_cast<glXGetCurrentDisplayProc>(
+      GetGLProcAddress("glXGetCurrentDisplay"));
+  fn.glXGetCurrentDrawableFn = reinterpret_cast<glXGetCurrentDrawableProc>(
+      GetGLProcAddress("glXGetCurrentDrawable"));
+  fn.glXGetCurrentReadDrawableFn =
+      reinterpret_cast<glXGetCurrentReadDrawableProc>(
+          GetGLProcAddress("glXGetCurrentReadDrawable"));
+  fn.glXGetFBConfigAttribFn = reinterpret_cast<glXGetFBConfigAttribProc>(
+      GetGLProcAddress("glXGetFBConfigAttrib"));
+  fn.glXGetFBConfigFromVisualSGIXFn =
+      reinterpret_cast<glXGetFBConfigFromVisualSGIXProc>(
+          GetGLProcAddress("glXGetFBConfigFromVisualSGIX"));
+  fn.glXGetFBConfigsFn = reinterpret_cast<glXGetFBConfigsProc>(
+      GetGLProcAddress("glXGetFBConfigs"));
+  fn.glXGetMscRateOMLFn = reinterpret_cast<glXGetMscRateOMLProc>(
+      GetGLProcAddress("glXGetMscRateOML"));
+  fn.glXGetSelectedEventFn = reinterpret_cast<glXGetSelectedEventProc>(
+      GetGLProcAddress("glXGetSelectedEvent"));
+  fn.glXGetSyncValuesOMLFn = reinterpret_cast<glXGetSyncValuesOMLProc>(
+      GetGLProcAddress("glXGetSyncValuesOML"));
+  fn.glXGetVisualFromFBConfigFn =
+      reinterpret_cast<glXGetVisualFromFBConfigProc>(
+          GetGLProcAddress("glXGetVisualFromFBConfig"));
+  fn.glXIsDirectFn =
+      reinterpret_cast<glXIsDirectProc>(GetGLProcAddress("glXIsDirect"));
+  fn.glXMakeContextCurrentFn = reinterpret_cast<glXMakeContextCurrentProc>(
+      GetGLProcAddress("glXMakeContextCurrent"));
+  fn.glXMakeCurrentFn =
+      reinterpret_cast<glXMakeCurrentProc>(GetGLProcAddress("glXMakeCurrent"));
+  fn.glXQueryContextFn = reinterpret_cast<glXQueryContextProc>(
+      GetGLProcAddress("glXQueryContext"));
+  fn.glXQueryDrawableFn = reinterpret_cast<glXQueryDrawableProc>(
+      GetGLProcAddress("glXQueryDrawable"));
+  fn.glXQueryExtensionFn = reinterpret_cast<glXQueryExtensionProc>(
+      GetGLProcAddress("glXQueryExtension"));
+  fn.glXQueryExtensionsStringFn =
+      reinterpret_cast<glXQueryExtensionsStringProc>(
+          GetGLProcAddress("glXQueryExtensionsString"));
+  fn.glXQueryServerStringFn = reinterpret_cast<glXQueryServerStringProc>(
+      GetGLProcAddress("glXQueryServerString"));
+  fn.glXQueryVersionFn = reinterpret_cast<glXQueryVersionProc>(
+      GetGLProcAddress("glXQueryVersion"));
+  fn.glXReleaseTexImageEXTFn = reinterpret_cast<glXReleaseTexImageEXTProc>(
+      GetGLProcAddress("glXReleaseTexImageEXT"));
+  fn.glXSelectEventFn =
+      reinterpret_cast<glXSelectEventProc>(GetGLProcAddress("glXSelectEvent"));
+  fn.glXSwapBuffersFn =
+      reinterpret_cast<glXSwapBuffersProc>(GetGLProcAddress("glXSwapBuffers"));
+  fn.glXSwapIntervalEXTFn = reinterpret_cast<glXSwapIntervalEXTProc>(
+      GetGLProcAddress("glXSwapIntervalEXT"));
+  fn.glXSwapIntervalMESAFn = reinterpret_cast<glXSwapIntervalMESAProc>(
+      GetGLProcAddress("glXSwapIntervalMESA"));
+  fn.glXUseXFontFn =
+      reinterpret_cast<glXUseXFontProc>(GetGLProcAddress("glXUseXFont"));
+  fn.glXWaitGLFn =
+      reinterpret_cast<glXWaitGLProc>(GetGLProcAddress("glXWaitGL"));
+  fn.glXWaitVideoSyncSGIFn = reinterpret_cast<glXWaitVideoSyncSGIProc>(
+      GetGLProcAddress("glXWaitVideoSyncSGI"));
+  fn.glXWaitXFn = reinterpret_cast<glXWaitXProc>(GetGLProcAddress("glXWaitX"));
+}
+
+void DriverGLX::InitializeDynamicBindings(GLContext* context) {
+  DCHECK(context && context->IsCurrent(NULL));
+  const GLVersionInfo* ver = context->GetVersionInfo();
+  ALLOW_UNUSED_LOCAL(ver);
+  std::string extensions = context->GetExtensions() + " ";
+  ALLOW_UNUSED_LOCAL(extensions);
+
+  ext.b_GLX_ARB_create_context =
+      extensions.find("GLX_ARB_create_context ") != std::string::npos;
+  ext.b_GLX_EXT_swap_control =
+      extensions.find("GLX_EXT_swap_control ") != std::string::npos;
+  ext.b_GLX_EXT_texture_from_pixmap =
+      extensions.find("GLX_EXT_texture_from_pixmap ") != std::string::npos;
+  ext.b_GLX_MESA_copy_sub_buffer =
+      extensions.find("GLX_MESA_copy_sub_buffer ") != std::string::npos;
+  ext.b_GLX_MESA_swap_control =
+      extensions.find("GLX_MESA_swap_control ") != std::string::npos;
+  ext.b_GLX_OML_sync_control =
+      extensions.find("GLX_OML_sync_control ") != std::string::npos;
+  ext.b_GLX_SGIX_fbconfig =
+      extensions.find("GLX_SGIX_fbconfig ") != std::string::npos;
+  ext.b_GLX_SGI_video_sync =
+      extensions.find("GLX_SGI_video_sync ") != std::string::npos;
+
+  if (g_debugBindingsInitialized)
+    InitializeDebugBindings();
+}
+
+extern "C" {
+
+static void GL_BINDING_CALL Debug_glXBindTexImageEXT(Display* dpy,
+                                                     GLXDrawable drawable,
+                                                     int buffer,
+                                                     int* attribList) {
+  GL_SERVICE_LOG("glXBindTexImageEXT"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << buffer << ", "
+                 << static_cast<const void*>(attribList) << ")");
+  g_driver_glx.debug_fn.glXBindTexImageEXTFn(dpy, drawable, buffer, attribList);
+}
+
+static GLXFBConfig* GL_BINDING_CALL
+Debug_glXChooseFBConfig(Display* dpy,
+                        int screen,
+                        const int* attribList,
+                        int* nitems) {
+  GL_SERVICE_LOG("glXChooseFBConfig"
+                 << "(" << static_cast<const void*>(dpy) << ", " << screen
+                 << ", " << static_cast<const void*>(attribList) << ", "
+                 << static_cast<const void*>(nitems) << ")");
+  GLXFBConfig* result = g_driver_glx.debug_fn.glXChooseFBConfigFn(
+      dpy, screen, attribList, nitems);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static XVisualInfo* GL_BINDING_CALL
+Debug_glXChooseVisual(Display* dpy, int screen, int* attribList) {
+  GL_SERVICE_LOG("glXChooseVisual"
+                 << "(" << static_cast<const void*>(dpy) << ", " << screen
+                 << ", " << static_cast<const void*>(attribList) << ")");
+  XVisualInfo* result =
+      g_driver_glx.debug_fn.glXChooseVisualFn(dpy, screen, attribList);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glXCopyContext(Display* dpy,
+                                                 GLXContext src,
+                                                 GLXContext dst,
+                                                 unsigned long mask) {
+  GL_SERVICE_LOG("glXCopyContext"
+                 << "(" << static_cast<const void*>(dpy) << ", " << src << ", "
+                 << dst << ", " << mask << ")");
+  g_driver_glx.debug_fn.glXCopyContextFn(dpy, src, dst, mask);
+}
+
+static void GL_BINDING_CALL Debug_glXCopySubBufferMESA(Display* dpy,
+                                                       GLXDrawable drawable,
+                                                       int x,
+                                                       int y,
+                                                       int width,
+                                                       int height) {
+  GL_SERVICE_LOG("glXCopySubBufferMESA"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << x << ", " << y << ", " << width << ", " << height
+                 << ")");
+  g_driver_glx.debug_fn.glXCopySubBufferMESAFn(dpy, drawable, x, y, width,
+                                               height);
+}
+
+static GLXContext GL_BINDING_CALL Debug_glXCreateContext(Display* dpy,
+                                                         XVisualInfo* vis,
+                                                         GLXContext shareList,
+                                                         int direct) {
+  GL_SERVICE_LOG("glXCreateContext"
+                 << "(" << static_cast<const void*>(dpy) << ", "
+                 << static_cast<const void*>(vis) << ", " << shareList << ", "
+                 << direct << ")");
+  GLXContext result =
+      g_driver_glx.debug_fn.glXCreateContextFn(dpy, vis, shareList, direct);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXContext GL_BINDING_CALL
+Debug_glXCreateContextAttribsARB(Display* dpy,
+                                 GLXFBConfig config,
+                                 GLXContext share_context,
+                                 int direct,
+                                 const int* attrib_list) {
+  GL_SERVICE_LOG("glXCreateContextAttribsARB"
+                 << "(" << static_cast<const void*>(dpy) << ", " << config
+                 << ", " << share_context << ", " << direct << ", "
+                 << static_cast<const void*>(attrib_list) << ")");
+  GLXContext result = g_driver_glx.debug_fn.glXCreateContextAttribsARBFn(
+      dpy, config, share_context, direct, attrib_list);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXPixmap GL_BINDING_CALL
+Debug_glXCreateGLXPixmap(Display* dpy, XVisualInfo* visual, Pixmap pixmap) {
+  GL_SERVICE_LOG("glXCreateGLXPixmap"
+                 << "(" << static_cast<const void*>(dpy) << ", "
+                 << static_cast<const void*>(visual) << ", " << pixmap << ")");
+  GLXPixmap result =
+      g_driver_glx.debug_fn.glXCreateGLXPixmapFn(dpy, visual, pixmap);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXContext GL_BINDING_CALL
+Debug_glXCreateNewContext(Display* dpy,
+                          GLXFBConfig config,
+                          int renderType,
+                          GLXContext shareList,
+                          int direct) {
+  GL_SERVICE_LOG("glXCreateNewContext"
+                 << "(" << static_cast<const void*>(dpy) << ", " << config
+                 << ", " << renderType << ", " << shareList << ", " << direct
+                 << ")");
+  GLXContext result = g_driver_glx.debug_fn.glXCreateNewContextFn(
+      dpy, config, renderType, shareList, direct);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXPbuffer GL_BINDING_CALL
+Debug_glXCreatePbuffer(Display* dpy,
+                       GLXFBConfig config,
+                       const int* attribList) {
+  GL_SERVICE_LOG("glXCreatePbuffer"
+                 << "(" << static_cast<const void*>(dpy) << ", " << config
+                 << ", " << static_cast<const void*>(attribList) << ")");
+  GLXPbuffer result =
+      g_driver_glx.debug_fn.glXCreatePbufferFn(dpy, config, attribList);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXPixmap GL_BINDING_CALL Debug_glXCreatePixmap(Display* dpy,
+                                                       GLXFBConfig config,
+                                                       Pixmap pixmap,
+                                                       const int* attribList) {
+  GL_SERVICE_LOG("glXCreatePixmap"
+                 << "(" << static_cast<const void*>(dpy) << ", " << config
+                 << ", " << pixmap << ", "
+                 << static_cast<const void*>(attribList) << ")");
+  GLXPixmap result =
+      g_driver_glx.debug_fn.glXCreatePixmapFn(dpy, config, pixmap, attribList);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXWindow GL_BINDING_CALL Debug_glXCreateWindow(Display* dpy,
+                                                       GLXFBConfig config,
+                                                       Window win,
+                                                       const int* attribList) {
+  GL_SERVICE_LOG("glXCreateWindow"
+                 << "(" << static_cast<const void*>(dpy) << ", " << config
+                 << ", " << win << ", " << static_cast<const void*>(attribList)
+                 << ")");
+  GLXWindow result =
+      g_driver_glx.debug_fn.glXCreateWindowFn(dpy, config, win, attribList);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glXDestroyContext(Display* dpy, GLXContext ctx) {
+  GL_SERVICE_LOG("glXDestroyContext"
+                 << "(" << static_cast<const void*>(dpy) << ", " << ctx << ")");
+  g_driver_glx.debug_fn.glXDestroyContextFn(dpy, ctx);
+}
+
+static void GL_BINDING_CALL
+Debug_glXDestroyGLXPixmap(Display* dpy, GLXPixmap pixmap) {
+  GL_SERVICE_LOG("glXDestroyGLXPixmap"
+                 << "(" << static_cast<const void*>(dpy) << ", " << pixmap
+                 << ")");
+  g_driver_glx.debug_fn.glXDestroyGLXPixmapFn(dpy, pixmap);
+}
+
+static void GL_BINDING_CALL
+Debug_glXDestroyPbuffer(Display* dpy, GLXPbuffer pbuf) {
+  GL_SERVICE_LOG("glXDestroyPbuffer"
+                 << "(" << static_cast<const void*>(dpy) << ", " << pbuf
+                 << ")");
+  g_driver_glx.debug_fn.glXDestroyPbufferFn(dpy, pbuf);
+}
+
+static void GL_BINDING_CALL
+Debug_glXDestroyPixmap(Display* dpy, GLXPixmap pixmap) {
+  GL_SERVICE_LOG("glXDestroyPixmap"
+                 << "(" << static_cast<const void*>(dpy) << ", " << pixmap
+                 << ")");
+  g_driver_glx.debug_fn.glXDestroyPixmapFn(dpy, pixmap);
+}
+
+static void GL_BINDING_CALL
+Debug_glXDestroyWindow(Display* dpy, GLXWindow window) {
+  GL_SERVICE_LOG("glXDestroyWindow"
+                 << "(" << static_cast<const void*>(dpy) << ", " << window
+                 << ")");
+  g_driver_glx.debug_fn.glXDestroyWindowFn(dpy, window);
+}
+
+static const char* GL_BINDING_CALL
+Debug_glXGetClientString(Display* dpy, int name) {
+  GL_SERVICE_LOG("glXGetClientString"
+                 << "(" << static_cast<const void*>(dpy) << ", " << name
+                 << ")");
+  const char* result = g_driver_glx.debug_fn.glXGetClientStringFn(dpy, name);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static int GL_BINDING_CALL
+Debug_glXGetConfig(Display* dpy, XVisualInfo* visual, int attrib, int* value) {
+  GL_SERVICE_LOG("glXGetConfig"
+                 << "(" << static_cast<const void*>(dpy) << ", "
+                 << static_cast<const void*>(visual) << ", " << attrib << ", "
+                 << static_cast<const void*>(value) << ")");
+  int result = g_driver_glx.debug_fn.glXGetConfigFn(dpy, visual, attrib, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXContext GL_BINDING_CALL Debug_glXGetCurrentContext(void) {
+  GL_SERVICE_LOG("glXGetCurrentContext"
+                 << "("
+                 << ")");
+  GLXContext result = g_driver_glx.debug_fn.glXGetCurrentContextFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static Display* GL_BINDING_CALL Debug_glXGetCurrentDisplay(void) {
+  GL_SERVICE_LOG("glXGetCurrentDisplay"
+                 << "("
+                 << ")");
+  Display* result = g_driver_glx.debug_fn.glXGetCurrentDisplayFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXDrawable GL_BINDING_CALL Debug_glXGetCurrentDrawable(void) {
+  GL_SERVICE_LOG("glXGetCurrentDrawable"
+                 << "("
+                 << ")");
+  GLXDrawable result = g_driver_glx.debug_fn.glXGetCurrentDrawableFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXDrawable GL_BINDING_CALL Debug_glXGetCurrentReadDrawable(void) {
+  GL_SERVICE_LOG("glXGetCurrentReadDrawable"
+                 << "("
+                 << ")");
+  GLXDrawable result = g_driver_glx.debug_fn.glXGetCurrentReadDrawableFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static int GL_BINDING_CALL Debug_glXGetFBConfigAttrib(Display* dpy,
+                                                      GLXFBConfig config,
+                                                      int attribute,
+                                                      int* value) {
+  GL_SERVICE_LOG("glXGetFBConfigAttrib"
+                 << "(" << static_cast<const void*>(dpy) << ", " << config
+                 << ", " << attribute << ", " << static_cast<const void*>(value)
+                 << ")");
+  int result = g_driver_glx.debug_fn.glXGetFBConfigAttribFn(dpy, config,
+                                                            attribute, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXFBConfig GL_BINDING_CALL
+Debug_glXGetFBConfigFromVisualSGIX(Display* dpy, XVisualInfo* visualInfo) {
+  GL_SERVICE_LOG("glXGetFBConfigFromVisualSGIX"
+                 << "(" << static_cast<const void*>(dpy) << ", "
+                 << static_cast<const void*>(visualInfo) << ")");
+  GLXFBConfig result =
+      g_driver_glx.debug_fn.glXGetFBConfigFromVisualSGIXFn(dpy, visualInfo);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLXFBConfig* GL_BINDING_CALL
+Debug_glXGetFBConfigs(Display* dpy, int screen, int* nelements) {
+  GL_SERVICE_LOG("glXGetFBConfigs"
+                 << "(" << static_cast<const void*>(dpy) << ", " << screen
+                 << ", " << static_cast<const void*>(nelements) << ")");
+  GLXFBConfig* result =
+      g_driver_glx.debug_fn.glXGetFBConfigsFn(dpy, screen, nelements);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static bool GL_BINDING_CALL Debug_glXGetMscRateOML(Display* dpy,
+                                                   GLXDrawable drawable,
+                                                   int32* numerator,
+                                                   int32* denominator) {
+  GL_SERVICE_LOG("glXGetMscRateOML"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << static_cast<const void*>(numerator) << ", "
+                 << static_cast<const void*>(denominator) << ")");
+  bool result = g_driver_glx.debug_fn.glXGetMscRateOMLFn(
+      dpy, drawable, numerator, denominator);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glXGetSelectedEvent(Display* dpy,
+                                                      GLXDrawable drawable,
+                                                      unsigned long* mask) {
+  GL_SERVICE_LOG("glXGetSelectedEvent"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << static_cast<const void*>(mask) << ")");
+  g_driver_glx.debug_fn.glXGetSelectedEventFn(dpy, drawable, mask);
+}
+
+static bool GL_BINDING_CALL Debug_glXGetSyncValuesOML(Display* dpy,
+                                                      GLXDrawable drawable,
+                                                      int64* ust,
+                                                      int64* msc,
+                                                      int64* sbc) {
+  GL_SERVICE_LOG("glXGetSyncValuesOML"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << static_cast<const void*>(ust) << ", "
+                 << static_cast<const void*>(msc) << ", "
+                 << static_cast<const void*>(sbc) << ")");
+  bool result =
+      g_driver_glx.debug_fn.glXGetSyncValuesOMLFn(dpy, drawable, ust, msc, sbc);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static XVisualInfo* GL_BINDING_CALL
+Debug_glXGetVisualFromFBConfig(Display* dpy, GLXFBConfig config) {
+  GL_SERVICE_LOG("glXGetVisualFromFBConfig"
+                 << "(" << static_cast<const void*>(dpy) << ", " << config
+                 << ")");
+  XVisualInfo* result =
+      g_driver_glx.debug_fn.glXGetVisualFromFBConfigFn(dpy, config);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static int GL_BINDING_CALL Debug_glXIsDirect(Display* dpy, GLXContext ctx) {
+  GL_SERVICE_LOG("glXIsDirect"
+                 << "(" << static_cast<const void*>(dpy) << ", " << ctx << ")");
+  int result = g_driver_glx.debug_fn.glXIsDirectFn(dpy, ctx);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static int GL_BINDING_CALL Debug_glXMakeContextCurrent(Display* dpy,
+                                                       GLXDrawable draw,
+                                                       GLXDrawable read,
+                                                       GLXContext ctx) {
+  GL_SERVICE_LOG("glXMakeContextCurrent"
+                 << "(" << static_cast<const void*>(dpy) << ", " << draw << ", "
+                 << read << ", " << ctx << ")");
+  int result =
+      g_driver_glx.debug_fn.glXMakeContextCurrentFn(dpy, draw, read, ctx);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static int GL_BINDING_CALL
+Debug_glXMakeCurrent(Display* dpy, GLXDrawable drawable, GLXContext ctx) {
+  GL_SERVICE_LOG("glXMakeCurrent"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << ctx << ")");
+  int result = g_driver_glx.debug_fn.glXMakeCurrentFn(dpy, drawable, ctx);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static int GL_BINDING_CALL
+Debug_glXQueryContext(Display* dpy, GLXContext ctx, int attribute, int* value) {
+  GL_SERVICE_LOG("glXQueryContext"
+                 << "(" << static_cast<const void*>(dpy) << ", " << ctx << ", "
+                 << attribute << ", " << static_cast<const void*>(value)
+                 << ")");
+  int result =
+      g_driver_glx.debug_fn.glXQueryContextFn(dpy, ctx, attribute, value);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glXQueryDrawable(Display* dpy,
+                                                   GLXDrawable draw,
+                                                   int attribute,
+                                                   unsigned int* value) {
+  GL_SERVICE_LOG("glXQueryDrawable"
+                 << "(" << static_cast<const void*>(dpy) << ", " << draw << ", "
+                 << attribute << ", " << static_cast<const void*>(value)
+                 << ")");
+  g_driver_glx.debug_fn.glXQueryDrawableFn(dpy, draw, attribute, value);
+}
+
+static int GL_BINDING_CALL
+Debug_glXQueryExtension(Display* dpy, int* errorb, int* event) {
+  GL_SERVICE_LOG("glXQueryExtension"
+                 << "(" << static_cast<const void*>(dpy) << ", "
+                 << static_cast<const void*>(errorb) << ", "
+                 << static_cast<const void*>(event) << ")");
+  int result = g_driver_glx.debug_fn.glXQueryExtensionFn(dpy, errorb, event);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static const char* GL_BINDING_CALL
+Debug_glXQueryExtensionsString(Display* dpy, int screen) {
+  GL_SERVICE_LOG("glXQueryExtensionsString"
+                 << "(" << static_cast<const void*>(dpy) << ", " << screen
+                 << ")");
+  const char* result =
+      g_driver_glx.debug_fn.glXQueryExtensionsStringFn(dpy, screen);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static const char* GL_BINDING_CALL
+Debug_glXQueryServerString(Display* dpy, int screen, int name) {
+  GL_SERVICE_LOG("glXQueryServerString"
+                 << "(" << static_cast<const void*>(dpy) << ", " << screen
+                 << ", " << name << ")");
+  const char* result =
+      g_driver_glx.debug_fn.glXQueryServerStringFn(dpy, screen, name);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static int GL_BINDING_CALL
+Debug_glXQueryVersion(Display* dpy, int* maj, int* min) {
+  GL_SERVICE_LOG("glXQueryVersion"
+                 << "(" << static_cast<const void*>(dpy) << ", "
+                 << static_cast<const void*>(maj) << ", "
+                 << static_cast<const void*>(min) << ")");
+  int result = g_driver_glx.debug_fn.glXQueryVersionFn(dpy, maj, min);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL
+Debug_glXReleaseTexImageEXT(Display* dpy, GLXDrawable drawable, int buffer) {
+  GL_SERVICE_LOG("glXReleaseTexImageEXT"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << buffer << ")");
+  g_driver_glx.debug_fn.glXReleaseTexImageEXTFn(dpy, drawable, buffer);
+}
+
+static void GL_BINDING_CALL
+Debug_glXSelectEvent(Display* dpy, GLXDrawable drawable, unsigned long mask) {
+  GL_SERVICE_LOG("glXSelectEvent"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << mask << ")");
+  g_driver_glx.debug_fn.glXSelectEventFn(dpy, drawable, mask);
+}
+
+static void GL_BINDING_CALL
+Debug_glXSwapBuffers(Display* dpy, GLXDrawable drawable) {
+  GL_SERVICE_LOG("glXSwapBuffers"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ")");
+  g_driver_glx.debug_fn.glXSwapBuffersFn(dpy, drawable);
+}
+
+static void GL_BINDING_CALL
+Debug_glXSwapIntervalEXT(Display* dpy, GLXDrawable drawable, int interval) {
+  GL_SERVICE_LOG("glXSwapIntervalEXT"
+                 << "(" << static_cast<const void*>(dpy) << ", " << drawable
+                 << ", " << interval << ")");
+  g_driver_glx.debug_fn.glXSwapIntervalEXTFn(dpy, drawable, interval);
+}
+
+static void GL_BINDING_CALL Debug_glXSwapIntervalMESA(unsigned int interval) {
+  GL_SERVICE_LOG("glXSwapIntervalMESA"
+                 << "(" << interval << ")");
+  g_driver_glx.debug_fn.glXSwapIntervalMESAFn(interval);
+}
+
+static void GL_BINDING_CALL
+Debug_glXUseXFont(Font font, int first, int count, int list) {
+  GL_SERVICE_LOG("glXUseXFont"
+                 << "(" << font << ", " << first << ", " << count << ", "
+                 << list << ")");
+  g_driver_glx.debug_fn.glXUseXFontFn(font, first, count, list);
+}
+
+static void GL_BINDING_CALL Debug_glXWaitGL(void) {
+  GL_SERVICE_LOG("glXWaitGL"
+                 << "("
+                 << ")");
+  g_driver_glx.debug_fn.glXWaitGLFn();
+}
+
+static int GL_BINDING_CALL
+Debug_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int* count) {
+  GL_SERVICE_LOG("glXWaitVideoSyncSGI"
+                 << "(" << divisor << ", " << remainder << ", "
+                 << static_cast<const void*>(count) << ")");
+  int result =
+      g_driver_glx.debug_fn.glXWaitVideoSyncSGIFn(divisor, remainder, count);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_glXWaitX(void) {
+  GL_SERVICE_LOG("glXWaitX"
+                 << "("
+                 << ")");
+  g_driver_glx.debug_fn.glXWaitXFn();
+}
+}  // extern "C"
+
+void DriverGLX::InitializeDebugBindings() {
+  if (!debug_fn.glXBindTexImageEXTFn) {
+    debug_fn.glXBindTexImageEXTFn = fn.glXBindTexImageEXTFn;
+    fn.glXBindTexImageEXTFn = Debug_glXBindTexImageEXT;
+  }
+  if (!debug_fn.glXChooseFBConfigFn) {
+    debug_fn.glXChooseFBConfigFn = fn.glXChooseFBConfigFn;
+    fn.glXChooseFBConfigFn = Debug_glXChooseFBConfig;
+  }
+  if (!debug_fn.glXChooseVisualFn) {
+    debug_fn.glXChooseVisualFn = fn.glXChooseVisualFn;
+    fn.glXChooseVisualFn = Debug_glXChooseVisual;
+  }
+  if (!debug_fn.glXCopyContextFn) {
+    debug_fn.glXCopyContextFn = fn.glXCopyContextFn;
+    fn.glXCopyContextFn = Debug_glXCopyContext;
+  }
+  if (!debug_fn.glXCopySubBufferMESAFn) {
+    debug_fn.glXCopySubBufferMESAFn = fn.glXCopySubBufferMESAFn;
+    fn.glXCopySubBufferMESAFn = Debug_glXCopySubBufferMESA;
+  }
+  if (!debug_fn.glXCreateContextFn) {
+    debug_fn.glXCreateContextFn = fn.glXCreateContextFn;
+    fn.glXCreateContextFn = Debug_glXCreateContext;
+  }
+  if (!debug_fn.glXCreateContextAttribsARBFn) {
+    debug_fn.glXCreateContextAttribsARBFn = fn.glXCreateContextAttribsARBFn;
+    fn.glXCreateContextAttribsARBFn = Debug_glXCreateContextAttribsARB;
+  }
+  if (!debug_fn.glXCreateGLXPixmapFn) {
+    debug_fn.glXCreateGLXPixmapFn = fn.glXCreateGLXPixmapFn;
+    fn.glXCreateGLXPixmapFn = Debug_glXCreateGLXPixmap;
+  }
+  if (!debug_fn.glXCreateNewContextFn) {
+    debug_fn.glXCreateNewContextFn = fn.glXCreateNewContextFn;
+    fn.glXCreateNewContextFn = Debug_glXCreateNewContext;
+  }
+  if (!debug_fn.glXCreatePbufferFn) {
+    debug_fn.glXCreatePbufferFn = fn.glXCreatePbufferFn;
+    fn.glXCreatePbufferFn = Debug_glXCreatePbuffer;
+  }
+  if (!debug_fn.glXCreatePixmapFn) {
+    debug_fn.glXCreatePixmapFn = fn.glXCreatePixmapFn;
+    fn.glXCreatePixmapFn = Debug_glXCreatePixmap;
+  }
+  if (!debug_fn.glXCreateWindowFn) {
+    debug_fn.glXCreateWindowFn = fn.glXCreateWindowFn;
+    fn.glXCreateWindowFn = Debug_glXCreateWindow;
+  }
+  if (!debug_fn.glXDestroyContextFn) {
+    debug_fn.glXDestroyContextFn = fn.glXDestroyContextFn;
+    fn.glXDestroyContextFn = Debug_glXDestroyContext;
+  }
+  if (!debug_fn.glXDestroyGLXPixmapFn) {
+    debug_fn.glXDestroyGLXPixmapFn = fn.glXDestroyGLXPixmapFn;
+    fn.glXDestroyGLXPixmapFn = Debug_glXDestroyGLXPixmap;
+  }
+  if (!debug_fn.glXDestroyPbufferFn) {
+    debug_fn.glXDestroyPbufferFn = fn.glXDestroyPbufferFn;
+    fn.glXDestroyPbufferFn = Debug_glXDestroyPbuffer;
+  }
+  if (!debug_fn.glXDestroyPixmapFn) {
+    debug_fn.glXDestroyPixmapFn = fn.glXDestroyPixmapFn;
+    fn.glXDestroyPixmapFn = Debug_glXDestroyPixmap;
+  }
+  if (!debug_fn.glXDestroyWindowFn) {
+    debug_fn.glXDestroyWindowFn = fn.glXDestroyWindowFn;
+    fn.glXDestroyWindowFn = Debug_glXDestroyWindow;
+  }
+  if (!debug_fn.glXGetClientStringFn) {
+    debug_fn.glXGetClientStringFn = fn.glXGetClientStringFn;
+    fn.glXGetClientStringFn = Debug_glXGetClientString;
+  }
+  if (!debug_fn.glXGetConfigFn) {
+    debug_fn.glXGetConfigFn = fn.glXGetConfigFn;
+    fn.glXGetConfigFn = Debug_glXGetConfig;
+  }
+  if (!debug_fn.glXGetCurrentContextFn) {
+    debug_fn.glXGetCurrentContextFn = fn.glXGetCurrentContextFn;
+    fn.glXGetCurrentContextFn = Debug_glXGetCurrentContext;
+  }
+  if (!debug_fn.glXGetCurrentDisplayFn) {
+    debug_fn.glXGetCurrentDisplayFn = fn.glXGetCurrentDisplayFn;
+    fn.glXGetCurrentDisplayFn = Debug_glXGetCurrentDisplay;
+  }
+  if (!debug_fn.glXGetCurrentDrawableFn) {
+    debug_fn.glXGetCurrentDrawableFn = fn.glXGetCurrentDrawableFn;
+    fn.glXGetCurrentDrawableFn = Debug_glXGetCurrentDrawable;
+  }
+  if (!debug_fn.glXGetCurrentReadDrawableFn) {
+    debug_fn.glXGetCurrentReadDrawableFn = fn.glXGetCurrentReadDrawableFn;
+    fn.glXGetCurrentReadDrawableFn = Debug_glXGetCurrentReadDrawable;
+  }
+  if (!debug_fn.glXGetFBConfigAttribFn) {
+    debug_fn.glXGetFBConfigAttribFn = fn.glXGetFBConfigAttribFn;
+    fn.glXGetFBConfigAttribFn = Debug_glXGetFBConfigAttrib;
+  }
+  if (!debug_fn.glXGetFBConfigFromVisualSGIXFn) {
+    debug_fn.glXGetFBConfigFromVisualSGIXFn = fn.glXGetFBConfigFromVisualSGIXFn;
+    fn.glXGetFBConfigFromVisualSGIXFn = Debug_glXGetFBConfigFromVisualSGIX;
+  }
+  if (!debug_fn.glXGetFBConfigsFn) {
+    debug_fn.glXGetFBConfigsFn = fn.glXGetFBConfigsFn;
+    fn.glXGetFBConfigsFn = Debug_glXGetFBConfigs;
+  }
+  if (!debug_fn.glXGetMscRateOMLFn) {
+    debug_fn.glXGetMscRateOMLFn = fn.glXGetMscRateOMLFn;
+    fn.glXGetMscRateOMLFn = Debug_glXGetMscRateOML;
+  }
+  if (!debug_fn.glXGetSelectedEventFn) {
+    debug_fn.glXGetSelectedEventFn = fn.glXGetSelectedEventFn;
+    fn.glXGetSelectedEventFn = Debug_glXGetSelectedEvent;
+  }
+  if (!debug_fn.glXGetSyncValuesOMLFn) {
+    debug_fn.glXGetSyncValuesOMLFn = fn.glXGetSyncValuesOMLFn;
+    fn.glXGetSyncValuesOMLFn = Debug_glXGetSyncValuesOML;
+  }
+  if (!debug_fn.glXGetVisualFromFBConfigFn) {
+    debug_fn.glXGetVisualFromFBConfigFn = fn.glXGetVisualFromFBConfigFn;
+    fn.glXGetVisualFromFBConfigFn = Debug_glXGetVisualFromFBConfig;
+  }
+  if (!debug_fn.glXIsDirectFn) {
+    debug_fn.glXIsDirectFn = fn.glXIsDirectFn;
+    fn.glXIsDirectFn = Debug_glXIsDirect;
+  }
+  if (!debug_fn.glXMakeContextCurrentFn) {
+    debug_fn.glXMakeContextCurrentFn = fn.glXMakeContextCurrentFn;
+    fn.glXMakeContextCurrentFn = Debug_glXMakeContextCurrent;
+  }
+  if (!debug_fn.glXMakeCurrentFn) {
+    debug_fn.glXMakeCurrentFn = fn.glXMakeCurrentFn;
+    fn.glXMakeCurrentFn = Debug_glXMakeCurrent;
+  }
+  if (!debug_fn.glXQueryContextFn) {
+    debug_fn.glXQueryContextFn = fn.glXQueryContextFn;
+    fn.glXQueryContextFn = Debug_glXQueryContext;
+  }
+  if (!debug_fn.glXQueryDrawableFn) {
+    debug_fn.glXQueryDrawableFn = fn.glXQueryDrawableFn;
+    fn.glXQueryDrawableFn = Debug_glXQueryDrawable;
+  }
+  if (!debug_fn.glXQueryExtensionFn) {
+    debug_fn.glXQueryExtensionFn = fn.glXQueryExtensionFn;
+    fn.glXQueryExtensionFn = Debug_glXQueryExtension;
+  }
+  if (!debug_fn.glXQueryExtensionsStringFn) {
+    debug_fn.glXQueryExtensionsStringFn = fn.glXQueryExtensionsStringFn;
+    fn.glXQueryExtensionsStringFn = Debug_glXQueryExtensionsString;
+  }
+  if (!debug_fn.glXQueryServerStringFn) {
+    debug_fn.glXQueryServerStringFn = fn.glXQueryServerStringFn;
+    fn.glXQueryServerStringFn = Debug_glXQueryServerString;
+  }
+  if (!debug_fn.glXQueryVersionFn) {
+    debug_fn.glXQueryVersionFn = fn.glXQueryVersionFn;
+    fn.glXQueryVersionFn = Debug_glXQueryVersion;
+  }
+  if (!debug_fn.glXReleaseTexImageEXTFn) {
+    debug_fn.glXReleaseTexImageEXTFn = fn.glXReleaseTexImageEXTFn;
+    fn.glXReleaseTexImageEXTFn = Debug_glXReleaseTexImageEXT;
+  }
+  if (!debug_fn.glXSelectEventFn) {
+    debug_fn.glXSelectEventFn = fn.glXSelectEventFn;
+    fn.glXSelectEventFn = Debug_glXSelectEvent;
+  }
+  if (!debug_fn.glXSwapBuffersFn) {
+    debug_fn.glXSwapBuffersFn = fn.glXSwapBuffersFn;
+    fn.glXSwapBuffersFn = Debug_glXSwapBuffers;
+  }
+  if (!debug_fn.glXSwapIntervalEXTFn) {
+    debug_fn.glXSwapIntervalEXTFn = fn.glXSwapIntervalEXTFn;
+    fn.glXSwapIntervalEXTFn = Debug_glXSwapIntervalEXT;
+  }
+  if (!debug_fn.glXSwapIntervalMESAFn) {
+    debug_fn.glXSwapIntervalMESAFn = fn.glXSwapIntervalMESAFn;
+    fn.glXSwapIntervalMESAFn = Debug_glXSwapIntervalMESA;
+  }
+  if (!debug_fn.glXUseXFontFn) {
+    debug_fn.glXUseXFontFn = fn.glXUseXFontFn;
+    fn.glXUseXFontFn = Debug_glXUseXFont;
+  }
+  if (!debug_fn.glXWaitGLFn) {
+    debug_fn.glXWaitGLFn = fn.glXWaitGLFn;
+    fn.glXWaitGLFn = Debug_glXWaitGL;
+  }
+  if (!debug_fn.glXWaitVideoSyncSGIFn) {
+    debug_fn.glXWaitVideoSyncSGIFn = fn.glXWaitVideoSyncSGIFn;
+    fn.glXWaitVideoSyncSGIFn = Debug_glXWaitVideoSyncSGI;
+  }
+  if (!debug_fn.glXWaitXFn) {
+    debug_fn.glXWaitXFn = fn.glXWaitXFn;
+    fn.glXWaitXFn = Debug_glXWaitX;
+  }
+  g_debugBindingsInitialized = true;
+}
+
+void DriverGLX::ClearBindings() {
+  memset(this, 0, sizeof(*this));
+}
+
+void GLXApiBase::glXBindTexImageEXTFn(Display* dpy,
+                                      GLXDrawable drawable,
+                                      int buffer,
+                                      int* attribList) {
+  driver_->fn.glXBindTexImageEXTFn(dpy, drawable, buffer, attribList);
+}
+
+GLXFBConfig* GLXApiBase::glXChooseFBConfigFn(Display* dpy,
+                                             int screen,
+                                             const int* attribList,
+                                             int* nitems) {
+  return driver_->fn.glXChooseFBConfigFn(dpy, screen, attribList, nitems);
+}
+
+XVisualInfo* GLXApiBase::glXChooseVisualFn(Display* dpy,
+                                           int screen,
+                                           int* attribList) {
+  return driver_->fn.glXChooseVisualFn(dpy, screen, attribList);
+}
+
+void GLXApiBase::glXCopyContextFn(Display* dpy,
+                                  GLXContext src,
+                                  GLXContext dst,
+                                  unsigned long mask) {
+  driver_->fn.glXCopyContextFn(dpy, src, dst, mask);
+}
+
+void GLXApiBase::glXCopySubBufferMESAFn(Display* dpy,
+                                        GLXDrawable drawable,
+                                        int x,
+                                        int y,
+                                        int width,
+                                        int height) {
+  driver_->fn.glXCopySubBufferMESAFn(dpy, drawable, x, y, width, height);
+}
+
+GLXContext GLXApiBase::glXCreateContextFn(Display* dpy,
+                                          XVisualInfo* vis,
+                                          GLXContext shareList,
+                                          int direct) {
+  return driver_->fn.glXCreateContextFn(dpy, vis, shareList, direct);
+}
+
+GLXContext GLXApiBase::glXCreateContextAttribsARBFn(Display* dpy,
+                                                    GLXFBConfig config,
+                                                    GLXContext share_context,
+                                                    int direct,
+                                                    const int* attrib_list) {
+  return driver_->fn.glXCreateContextAttribsARBFn(dpy, config, share_context,
+                                                  direct, attrib_list);
+}
+
+GLXPixmap GLXApiBase::glXCreateGLXPixmapFn(Display* dpy,
+                                           XVisualInfo* visual,
+                                           Pixmap pixmap) {
+  return driver_->fn.glXCreateGLXPixmapFn(dpy, visual, pixmap);
+}
+
+GLXContext GLXApiBase::glXCreateNewContextFn(Display* dpy,
+                                             GLXFBConfig config,
+                                             int renderType,
+                                             GLXContext shareList,
+                                             int direct) {
+  return driver_->fn.glXCreateNewContextFn(dpy, config, renderType, shareList,
+                                           direct);
+}
+
+GLXPbuffer GLXApiBase::glXCreatePbufferFn(Display* dpy,
+                                          GLXFBConfig config,
+                                          const int* attribList) {
+  return driver_->fn.glXCreatePbufferFn(dpy, config, attribList);
+}
+
+GLXPixmap GLXApiBase::glXCreatePixmapFn(Display* dpy,
+                                        GLXFBConfig config,
+                                        Pixmap pixmap,
+                                        const int* attribList) {
+  return driver_->fn.glXCreatePixmapFn(dpy, config, pixmap, attribList);
+}
+
+GLXWindow GLXApiBase::glXCreateWindowFn(Display* dpy,
+                                        GLXFBConfig config,
+                                        Window win,
+                                        const int* attribList) {
+  return driver_->fn.glXCreateWindowFn(dpy, config, win, attribList);
+}
+
+void GLXApiBase::glXDestroyContextFn(Display* dpy, GLXContext ctx) {
+  driver_->fn.glXDestroyContextFn(dpy, ctx);
+}
+
+void GLXApiBase::glXDestroyGLXPixmapFn(Display* dpy, GLXPixmap pixmap) {
+  driver_->fn.glXDestroyGLXPixmapFn(dpy, pixmap);
+}
+
+void GLXApiBase::glXDestroyPbufferFn(Display* dpy, GLXPbuffer pbuf) {
+  driver_->fn.glXDestroyPbufferFn(dpy, pbuf);
+}
+
+void GLXApiBase::glXDestroyPixmapFn(Display* dpy, GLXPixmap pixmap) {
+  driver_->fn.glXDestroyPixmapFn(dpy, pixmap);
+}
+
+void GLXApiBase::glXDestroyWindowFn(Display* dpy, GLXWindow window) {
+  driver_->fn.glXDestroyWindowFn(dpy, window);
+}
+
+const char* GLXApiBase::glXGetClientStringFn(Display* dpy, int name) {
+  return driver_->fn.glXGetClientStringFn(dpy, name);
+}
+
+int GLXApiBase::glXGetConfigFn(Display* dpy,
+                               XVisualInfo* visual,
+                               int attrib,
+                               int* value) {
+  return driver_->fn.glXGetConfigFn(dpy, visual, attrib, value);
+}
+
+GLXContext GLXApiBase::glXGetCurrentContextFn(void) {
+  return driver_->fn.glXGetCurrentContextFn();
+}
+
+Display* GLXApiBase::glXGetCurrentDisplayFn(void) {
+  return driver_->fn.glXGetCurrentDisplayFn();
+}
+
+GLXDrawable GLXApiBase::glXGetCurrentDrawableFn(void) {
+  return driver_->fn.glXGetCurrentDrawableFn();
+}
+
+GLXDrawable GLXApiBase::glXGetCurrentReadDrawableFn(void) {
+  return driver_->fn.glXGetCurrentReadDrawableFn();
+}
+
+int GLXApiBase::glXGetFBConfigAttribFn(Display* dpy,
+                                       GLXFBConfig config,
+                                       int attribute,
+                                       int* value) {
+  return driver_->fn.glXGetFBConfigAttribFn(dpy, config, attribute, value);
+}
+
+GLXFBConfig GLXApiBase::glXGetFBConfigFromVisualSGIXFn(
+    Display* dpy,
+    XVisualInfo* visualInfo) {
+  return driver_->fn.glXGetFBConfigFromVisualSGIXFn(dpy, visualInfo);
+}
+
+GLXFBConfig* GLXApiBase::glXGetFBConfigsFn(Display* dpy,
+                                           int screen,
+                                           int* nelements) {
+  return driver_->fn.glXGetFBConfigsFn(dpy, screen, nelements);
+}
+
+bool GLXApiBase::glXGetMscRateOMLFn(Display* dpy,
+                                    GLXDrawable drawable,
+                                    int32* numerator,
+                                    int32* denominator) {
+  return driver_->fn.glXGetMscRateOMLFn(dpy, drawable, numerator, denominator);
+}
+
+void GLXApiBase::glXGetSelectedEventFn(Display* dpy,
+                                       GLXDrawable drawable,
+                                       unsigned long* mask) {
+  driver_->fn.glXGetSelectedEventFn(dpy, drawable, mask);
+}
+
+bool GLXApiBase::glXGetSyncValuesOMLFn(Display* dpy,
+                                       GLXDrawable drawable,
+                                       int64* ust,
+                                       int64* msc,
+                                       int64* sbc) {
+  return driver_->fn.glXGetSyncValuesOMLFn(dpy, drawable, ust, msc, sbc);
+}
+
+XVisualInfo* GLXApiBase::glXGetVisualFromFBConfigFn(Display* dpy,
+                                                    GLXFBConfig config) {
+  return driver_->fn.glXGetVisualFromFBConfigFn(dpy, config);
+}
+
+int GLXApiBase::glXIsDirectFn(Display* dpy, GLXContext ctx) {
+  return driver_->fn.glXIsDirectFn(dpy, ctx);
+}
+
+int GLXApiBase::glXMakeContextCurrentFn(Display* dpy,
+                                        GLXDrawable draw,
+                                        GLXDrawable read,
+                                        GLXContext ctx) {
+  return driver_->fn.glXMakeContextCurrentFn(dpy, draw, read, ctx);
+}
+
+int GLXApiBase::glXMakeCurrentFn(Display* dpy,
+                                 GLXDrawable drawable,
+                                 GLXContext ctx) {
+  return driver_->fn.glXMakeCurrentFn(dpy, drawable, ctx);
+}
+
+int GLXApiBase::glXQueryContextFn(Display* dpy,
+                                  GLXContext ctx,
+                                  int attribute,
+                                  int* value) {
+  return driver_->fn.glXQueryContextFn(dpy, ctx, attribute, value);
+}
+
+void GLXApiBase::glXQueryDrawableFn(Display* dpy,
+                                    GLXDrawable draw,
+                                    int attribute,
+                                    unsigned int* value) {
+  driver_->fn.glXQueryDrawableFn(dpy, draw, attribute, value);
+}
+
+int GLXApiBase::glXQueryExtensionFn(Display* dpy, int* errorb, int* event) {
+  return driver_->fn.glXQueryExtensionFn(dpy, errorb, event);
+}
+
+const char* GLXApiBase::glXQueryExtensionsStringFn(Display* dpy, int screen) {
+  return driver_->fn.glXQueryExtensionsStringFn(dpy, screen);
+}
+
+const char* GLXApiBase::glXQueryServerStringFn(Display* dpy,
+                                               int screen,
+                                               int name) {
+  return driver_->fn.glXQueryServerStringFn(dpy, screen, name);
+}
+
+int GLXApiBase::glXQueryVersionFn(Display* dpy, int* maj, int* min) {
+  return driver_->fn.glXQueryVersionFn(dpy, maj, min);
+}
+
+void GLXApiBase::glXReleaseTexImageEXTFn(Display* dpy,
+                                         GLXDrawable drawable,
+                                         int buffer) {
+  driver_->fn.glXReleaseTexImageEXTFn(dpy, drawable, buffer);
+}
+
+void GLXApiBase::glXSelectEventFn(Display* dpy,
+                                  GLXDrawable drawable,
+                                  unsigned long mask) {
+  driver_->fn.glXSelectEventFn(dpy, drawable, mask);
+}
+
+void GLXApiBase::glXSwapBuffersFn(Display* dpy, GLXDrawable drawable) {
+  driver_->fn.glXSwapBuffersFn(dpy, drawable);
+}
+
+void GLXApiBase::glXSwapIntervalEXTFn(Display* dpy,
+                                      GLXDrawable drawable,
+                                      int interval) {
+  driver_->fn.glXSwapIntervalEXTFn(dpy, drawable, interval);
+}
+
+void GLXApiBase::glXSwapIntervalMESAFn(unsigned int interval) {
+  driver_->fn.glXSwapIntervalMESAFn(interval);
+}
+
+void GLXApiBase::glXUseXFontFn(Font font, int first, int count, int list) {
+  driver_->fn.glXUseXFontFn(font, first, count, list);
+}
+
+void GLXApiBase::glXWaitGLFn(void) {
+  driver_->fn.glXWaitGLFn();
+}
+
+int GLXApiBase::glXWaitVideoSyncSGIFn(int divisor,
+                                      int remainder,
+                                      unsigned int* count) {
+  return driver_->fn.glXWaitVideoSyncSGIFn(divisor, remainder, count);
+}
+
+void GLXApiBase::glXWaitXFn(void) {
+  driver_->fn.glXWaitXFn();
+}
+
+void TraceGLXApi::glXBindTexImageEXTFn(Display* dpy,
+                                       GLXDrawable drawable,
+                                       int buffer,
+                                       int* attribList) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXBindTexImageEXT")
+  glx_api_->glXBindTexImageEXTFn(dpy, drawable, buffer, attribList);
+}
+
+GLXFBConfig* TraceGLXApi::glXChooseFBConfigFn(Display* dpy,
+                                              int screen,
+                                              const int* attribList,
+                                              int* nitems) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXChooseFBConfig")
+  return glx_api_->glXChooseFBConfigFn(dpy, screen, attribList, nitems);
+}
+
+XVisualInfo* TraceGLXApi::glXChooseVisualFn(Display* dpy,
+                                            int screen,
+                                            int* attribList) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXChooseVisual")
+  return glx_api_->glXChooseVisualFn(dpy, screen, attribList);
+}
+
+void TraceGLXApi::glXCopyContextFn(Display* dpy,
+                                   GLXContext src,
+                                   GLXContext dst,
+                                   unsigned long mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCopyContext")
+  glx_api_->glXCopyContextFn(dpy, src, dst, mask);
+}
+
+void TraceGLXApi::glXCopySubBufferMESAFn(Display* dpy,
+                                         GLXDrawable drawable,
+                                         int x,
+                                         int y,
+                                         int width,
+                                         int height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCopySubBufferMESA")
+  glx_api_->glXCopySubBufferMESAFn(dpy, drawable, x, y, width, height);
+}
+
+GLXContext TraceGLXApi::glXCreateContextFn(Display* dpy,
+                                           XVisualInfo* vis,
+                                           GLXContext shareList,
+                                           int direct) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCreateContext")
+  return glx_api_->glXCreateContextFn(dpy, vis, shareList, direct);
+}
+
+GLXContext TraceGLXApi::glXCreateContextAttribsARBFn(Display* dpy,
+                                                     GLXFBConfig config,
+                                                     GLXContext share_context,
+                                                     int direct,
+                                                     const int* attrib_list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCreateContextAttribsARB")
+  return glx_api_->glXCreateContextAttribsARBFn(dpy, config, share_context,
+                                                direct, attrib_list);
+}
+
+GLXPixmap TraceGLXApi::glXCreateGLXPixmapFn(Display* dpy,
+                                            XVisualInfo* visual,
+                                            Pixmap pixmap) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCreateGLXPixmap")
+  return glx_api_->glXCreateGLXPixmapFn(dpy, visual, pixmap);
+}
+
+GLXContext TraceGLXApi::glXCreateNewContextFn(Display* dpy,
+                                              GLXFBConfig config,
+                                              int renderType,
+                                              GLXContext shareList,
+                                              int direct) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCreateNewContext")
+  return glx_api_->glXCreateNewContextFn(dpy, config, renderType, shareList,
+                                         direct);
+}
+
+GLXPbuffer TraceGLXApi::glXCreatePbufferFn(Display* dpy,
+                                           GLXFBConfig config,
+                                           const int* attribList) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCreatePbuffer")
+  return glx_api_->glXCreatePbufferFn(dpy, config, attribList);
+}
+
+GLXPixmap TraceGLXApi::glXCreatePixmapFn(Display* dpy,
+                                         GLXFBConfig config,
+                                         Pixmap pixmap,
+                                         const int* attribList) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCreatePixmap")
+  return glx_api_->glXCreatePixmapFn(dpy, config, pixmap, attribList);
+}
+
+GLXWindow TraceGLXApi::glXCreateWindowFn(Display* dpy,
+                                         GLXFBConfig config,
+                                         Window win,
+                                         const int* attribList) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXCreateWindow")
+  return glx_api_->glXCreateWindowFn(dpy, config, win, attribList);
+}
+
+void TraceGLXApi::glXDestroyContextFn(Display* dpy, GLXContext ctx) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXDestroyContext")
+  glx_api_->glXDestroyContextFn(dpy, ctx);
+}
+
+void TraceGLXApi::glXDestroyGLXPixmapFn(Display* dpy, GLXPixmap pixmap) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXDestroyGLXPixmap")
+  glx_api_->glXDestroyGLXPixmapFn(dpy, pixmap);
+}
+
+void TraceGLXApi::glXDestroyPbufferFn(Display* dpy, GLXPbuffer pbuf) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXDestroyPbuffer")
+  glx_api_->glXDestroyPbufferFn(dpy, pbuf);
+}
+
+void TraceGLXApi::glXDestroyPixmapFn(Display* dpy, GLXPixmap pixmap) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXDestroyPixmap")
+  glx_api_->glXDestroyPixmapFn(dpy, pixmap);
+}
+
+void TraceGLXApi::glXDestroyWindowFn(Display* dpy, GLXWindow window) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXDestroyWindow")
+  glx_api_->glXDestroyWindowFn(dpy, window);
+}
+
+const char* TraceGLXApi::glXGetClientStringFn(Display* dpy, int name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetClientString")
+  return glx_api_->glXGetClientStringFn(dpy, name);
+}
+
+int TraceGLXApi::glXGetConfigFn(Display* dpy,
+                                XVisualInfo* visual,
+                                int attrib,
+                                int* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetConfig")
+  return glx_api_->glXGetConfigFn(dpy, visual, attrib, value);
+}
+
+GLXContext TraceGLXApi::glXGetCurrentContextFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetCurrentContext")
+  return glx_api_->glXGetCurrentContextFn();
+}
+
+Display* TraceGLXApi::glXGetCurrentDisplayFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetCurrentDisplay")
+  return glx_api_->glXGetCurrentDisplayFn();
+}
+
+GLXDrawable TraceGLXApi::glXGetCurrentDrawableFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetCurrentDrawable")
+  return glx_api_->glXGetCurrentDrawableFn();
+}
+
+GLXDrawable TraceGLXApi::glXGetCurrentReadDrawableFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetCurrentReadDrawable")
+  return glx_api_->glXGetCurrentReadDrawableFn();
+}
+
+int TraceGLXApi::glXGetFBConfigAttribFn(Display* dpy,
+                                        GLXFBConfig config,
+                                        int attribute,
+                                        int* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetFBConfigAttrib")
+  return glx_api_->glXGetFBConfigAttribFn(dpy, config, attribute, value);
+}
+
+GLXFBConfig TraceGLXApi::glXGetFBConfigFromVisualSGIXFn(
+    Display* dpy,
+    XVisualInfo* visualInfo) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+                                "TraceGLAPI::glXGetFBConfigFromVisualSGIX")
+  return glx_api_->glXGetFBConfigFromVisualSGIXFn(dpy, visualInfo);
+}
+
+GLXFBConfig* TraceGLXApi::glXGetFBConfigsFn(Display* dpy,
+                                            int screen,
+                                            int* nelements) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetFBConfigs")
+  return glx_api_->glXGetFBConfigsFn(dpy, screen, nelements);
+}
+
+bool TraceGLXApi::glXGetMscRateOMLFn(Display* dpy,
+                                     GLXDrawable drawable,
+                                     int32* numerator,
+                                     int32* denominator) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetMscRateOML")
+  return glx_api_->glXGetMscRateOMLFn(dpy, drawable, numerator, denominator);
+}
+
+void TraceGLXApi::glXGetSelectedEventFn(Display* dpy,
+                                        GLXDrawable drawable,
+                                        unsigned long* mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetSelectedEvent")
+  glx_api_->glXGetSelectedEventFn(dpy, drawable, mask);
+}
+
+bool TraceGLXApi::glXGetSyncValuesOMLFn(Display* dpy,
+                                        GLXDrawable drawable,
+                                        int64* ust,
+                                        int64* msc,
+                                        int64* sbc) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetSyncValuesOML")
+  return glx_api_->glXGetSyncValuesOMLFn(dpy, drawable, ust, msc, sbc);
+}
+
+XVisualInfo* TraceGLXApi::glXGetVisualFromFBConfigFn(Display* dpy,
+                                                     GLXFBConfig config) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetVisualFromFBConfig")
+  return glx_api_->glXGetVisualFromFBConfigFn(dpy, config);
+}
+
+int TraceGLXApi::glXIsDirectFn(Display* dpy, GLXContext ctx) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXIsDirect")
+  return glx_api_->glXIsDirectFn(dpy, ctx);
+}
+
+int TraceGLXApi::glXMakeContextCurrentFn(Display* dpy,
+                                         GLXDrawable draw,
+                                         GLXDrawable read,
+                                         GLXContext ctx) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXMakeContextCurrent")
+  return glx_api_->glXMakeContextCurrentFn(dpy, draw, read, ctx);
+}
+
+int TraceGLXApi::glXMakeCurrentFn(Display* dpy,
+                                  GLXDrawable drawable,
+                                  GLXContext ctx) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXMakeCurrent")
+  return glx_api_->glXMakeCurrentFn(dpy, drawable, ctx);
+}
+
+int TraceGLXApi::glXQueryContextFn(Display* dpy,
+                                   GLXContext ctx,
+                                   int attribute,
+                                   int* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXQueryContext")
+  return glx_api_->glXQueryContextFn(dpy, ctx, attribute, value);
+}
+
+void TraceGLXApi::glXQueryDrawableFn(Display* dpy,
+                                     GLXDrawable draw,
+                                     int attribute,
+                                     unsigned int* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXQueryDrawable")
+  glx_api_->glXQueryDrawableFn(dpy, draw, attribute, value);
+}
+
+int TraceGLXApi::glXQueryExtensionFn(Display* dpy, int* errorb, int* event) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXQueryExtension")
+  return glx_api_->glXQueryExtensionFn(dpy, errorb, event);
+}
+
+const char* TraceGLXApi::glXQueryExtensionsStringFn(Display* dpy, int screen) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXQueryExtensionsString")
+  return glx_api_->glXQueryExtensionsStringFn(dpy, screen);
+}
+
+const char* TraceGLXApi::glXQueryServerStringFn(Display* dpy,
+                                                int screen,
+                                                int name) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXQueryServerString")
+  return glx_api_->glXQueryServerStringFn(dpy, screen, name);
+}
+
+int TraceGLXApi::glXQueryVersionFn(Display* dpy, int* maj, int* min) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXQueryVersion")
+  return glx_api_->glXQueryVersionFn(dpy, maj, min);
+}
+
+void TraceGLXApi::glXReleaseTexImageEXTFn(Display* dpy,
+                                          GLXDrawable drawable,
+                                          int buffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXReleaseTexImageEXT")
+  glx_api_->glXReleaseTexImageEXTFn(dpy, drawable, buffer);
+}
+
+void TraceGLXApi::glXSelectEventFn(Display* dpy,
+                                   GLXDrawable drawable,
+                                   unsigned long mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXSelectEvent")
+  glx_api_->glXSelectEventFn(dpy, drawable, mask);
+}
+
+void TraceGLXApi::glXSwapBuffersFn(Display* dpy, GLXDrawable drawable) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXSwapBuffers")
+  glx_api_->glXSwapBuffersFn(dpy, drawable);
+}
+
+void TraceGLXApi::glXSwapIntervalEXTFn(Display* dpy,
+                                       GLXDrawable drawable,
+                                       int interval) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXSwapIntervalEXT")
+  glx_api_->glXSwapIntervalEXTFn(dpy, drawable, interval);
+}
+
+void TraceGLXApi::glXSwapIntervalMESAFn(unsigned int interval) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXSwapIntervalMESA")
+  glx_api_->glXSwapIntervalMESAFn(interval);
+}
+
+void TraceGLXApi::glXUseXFontFn(Font font, int first, int count, int list) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXUseXFont")
+  glx_api_->glXUseXFontFn(font, first, count, list);
+}
+
+void TraceGLXApi::glXWaitGLFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXWaitGL")
+  glx_api_->glXWaitGLFn();
+}
+
+int TraceGLXApi::glXWaitVideoSyncSGIFn(int divisor,
+                                       int remainder,
+                                       unsigned int* count) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXWaitVideoSyncSGI")
+  return glx_api_->glXWaitVideoSyncSGIFn(divisor, remainder, count);
+}
+
+void TraceGLXApi::glXWaitXFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXWaitX")
+  glx_api_->glXWaitXFn();
+}
+
+}  // namespace gfx
diff --git a/ui/gl/gl_bindings_autogen_glx.h b/ui/gl/gl_bindings_autogen_glx.h
new file mode 100644
index 0000000..41baf29
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_glx.h
@@ -0,0 +1,424 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
+#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
+
+namespace gfx {
+
+class GLContext;
+
+typedef void(GL_BINDING_CALL* glXBindTexImageEXTProc)(Display* dpy,
+                                                      GLXDrawable drawable,
+                                                      int buffer,
+                                                      int* attribList);
+typedef GLXFBConfig*(GL_BINDING_CALL* glXChooseFBConfigProc)(
+    Display* dpy,
+    int screen,
+    const int* attribList,
+    int* nitems);
+typedef XVisualInfo*(GL_BINDING_CALL* glXChooseVisualProc)(Display* dpy,
+                                                           int screen,
+                                                           int* attribList);
+typedef void(GL_BINDING_CALL* glXCopyContextProc)(Display* dpy,
+                                                  GLXContext src,
+                                                  GLXContext dst,
+                                                  unsigned long mask);
+typedef void(GL_BINDING_CALL* glXCopySubBufferMESAProc)(Display* dpy,
+                                                        GLXDrawable drawable,
+                                                        int x,
+                                                        int y,
+                                                        int width,
+                                                        int height);
+typedef GLXContext(GL_BINDING_CALL* glXCreateContextProc)(Display* dpy,
+                                                          XVisualInfo* vis,
+                                                          GLXContext shareList,
+                                                          int direct);
+typedef GLXContext(GL_BINDING_CALL* glXCreateContextAttribsARBProc)(
+    Display* dpy,
+    GLXFBConfig config,
+    GLXContext share_context,
+    int direct,
+    const int* attrib_list);
+typedef GLXPixmap(GL_BINDING_CALL* glXCreateGLXPixmapProc)(Display* dpy,
+                                                           XVisualInfo* visual,
+                                                           Pixmap pixmap);
+typedef GLXContext(GL_BINDING_CALL* glXCreateNewContextProc)(
+    Display* dpy,
+    GLXFBConfig config,
+    int renderType,
+    GLXContext shareList,
+    int direct);
+typedef GLXPbuffer(GL_BINDING_CALL* glXCreatePbufferProc)(
+    Display* dpy,
+    GLXFBConfig config,
+    const int* attribList);
+typedef GLXPixmap(GL_BINDING_CALL* glXCreatePixmapProc)(Display* dpy,
+                                                        GLXFBConfig config,
+                                                        Pixmap pixmap,
+                                                        const int* attribList);
+typedef GLXWindow(GL_BINDING_CALL* glXCreateWindowProc)(Display* dpy,
+                                                        GLXFBConfig config,
+                                                        Window win,
+                                                        const int* attribList);
+typedef void(GL_BINDING_CALL* glXDestroyContextProc)(Display* dpy,
+                                                     GLXContext ctx);
+typedef void(GL_BINDING_CALL* glXDestroyGLXPixmapProc)(Display* dpy,
+                                                       GLXPixmap pixmap);
+typedef void(GL_BINDING_CALL* glXDestroyPbufferProc)(Display* dpy,
+                                                     GLXPbuffer pbuf);
+typedef void(GL_BINDING_CALL* glXDestroyPixmapProc)(Display* dpy,
+                                                    GLXPixmap pixmap);
+typedef void(GL_BINDING_CALL* glXDestroyWindowProc)(Display* dpy,
+                                                    GLXWindow window);
+typedef const char*(GL_BINDING_CALL* glXGetClientStringProc)(Display* dpy,
+                                                             int name);
+typedef int(GL_BINDING_CALL* glXGetConfigProc)(Display* dpy,
+                                               XVisualInfo* visual,
+                                               int attrib,
+                                               int* value);
+typedef GLXContext(GL_BINDING_CALL* glXGetCurrentContextProc)(void);
+typedef Display*(GL_BINDING_CALL* glXGetCurrentDisplayProc)(void);
+typedef GLXDrawable(GL_BINDING_CALL* glXGetCurrentDrawableProc)(void);
+typedef GLXDrawable(GL_BINDING_CALL* glXGetCurrentReadDrawableProc)(void);
+typedef int(GL_BINDING_CALL* glXGetFBConfigAttribProc)(Display* dpy,
+                                                       GLXFBConfig config,
+                                                       int attribute,
+                                                       int* value);
+typedef GLXFBConfig(GL_BINDING_CALL* glXGetFBConfigFromVisualSGIXProc)(
+    Display* dpy,
+    XVisualInfo* visualInfo);
+typedef GLXFBConfig*(GL_BINDING_CALL* glXGetFBConfigsProc)(Display* dpy,
+                                                           int screen,
+                                                           int* nelements);
+typedef bool(GL_BINDING_CALL* glXGetMscRateOMLProc)(Display* dpy,
+                                                    GLXDrawable drawable,
+                                                    int32* numerator,
+                                                    int32* denominator);
+typedef void(GL_BINDING_CALL* glXGetSelectedEventProc)(Display* dpy,
+                                                       GLXDrawable drawable,
+                                                       unsigned long* mask);
+typedef bool(GL_BINDING_CALL* glXGetSyncValuesOMLProc)(Display* dpy,
+                                                       GLXDrawable drawable,
+                                                       int64* ust,
+                                                       int64* msc,
+                                                       int64* sbc);
+typedef XVisualInfo*(GL_BINDING_CALL* glXGetVisualFromFBConfigProc)(
+    Display* dpy,
+    GLXFBConfig config);
+typedef int(GL_BINDING_CALL* glXIsDirectProc)(Display* dpy, GLXContext ctx);
+typedef int(GL_BINDING_CALL* glXMakeContextCurrentProc)(Display* dpy,
+                                                        GLXDrawable draw,
+                                                        GLXDrawable read,
+                                                        GLXContext ctx);
+typedef int(GL_BINDING_CALL* glXMakeCurrentProc)(Display* dpy,
+                                                 GLXDrawable drawable,
+                                                 GLXContext ctx);
+typedef int(GL_BINDING_CALL* glXQueryContextProc)(Display* dpy,
+                                                  GLXContext ctx,
+                                                  int attribute,
+                                                  int* value);
+typedef void(GL_BINDING_CALL* glXQueryDrawableProc)(Display* dpy,
+                                                    GLXDrawable draw,
+                                                    int attribute,
+                                                    unsigned int* value);
+typedef int(GL_BINDING_CALL* glXQueryExtensionProc)(Display* dpy,
+                                                    int* errorb,
+                                                    int* event);
+typedef const char*(GL_BINDING_CALL* glXQueryExtensionsStringProc)(Display* dpy,
+                                                                   int screen);
+typedef const char*(GL_BINDING_CALL* glXQueryServerStringProc)(Display* dpy,
+                                                               int screen,
+                                                               int name);
+typedef int(GL_BINDING_CALL* glXQueryVersionProc)(Display* dpy,
+                                                  int* maj,
+                                                  int* min);
+typedef void(GL_BINDING_CALL* glXReleaseTexImageEXTProc)(Display* dpy,
+                                                         GLXDrawable drawable,
+                                                         int buffer);
+typedef void(GL_BINDING_CALL* glXSelectEventProc)(Display* dpy,
+                                                  GLXDrawable drawable,
+                                                  unsigned long mask);
+typedef void(GL_BINDING_CALL* glXSwapBuffersProc)(Display* dpy,
+                                                  GLXDrawable drawable);
+typedef void(GL_BINDING_CALL* glXSwapIntervalEXTProc)(Display* dpy,
+                                                      GLXDrawable drawable,
+                                                      int interval);
+typedef void(GL_BINDING_CALL* glXSwapIntervalMESAProc)(unsigned int interval);
+typedef void(GL_BINDING_CALL* glXUseXFontProc)(Font font,
+                                               int first,
+                                               int count,
+                                               int list);
+typedef void(GL_BINDING_CALL* glXWaitGLProc)(void);
+typedef int(GL_BINDING_CALL* glXWaitVideoSyncSGIProc)(int divisor,
+                                                      int remainder,
+                                                      unsigned int* count);
+typedef void(GL_BINDING_CALL* glXWaitXProc)(void);
+
+struct ExtensionsGLX {
+  bool b_GLX_ARB_create_context;
+  bool b_GLX_EXT_swap_control;
+  bool b_GLX_EXT_texture_from_pixmap;
+  bool b_GLX_MESA_copy_sub_buffer;
+  bool b_GLX_MESA_swap_control;
+  bool b_GLX_OML_sync_control;
+  bool b_GLX_SGIX_fbconfig;
+  bool b_GLX_SGI_video_sync;
+};
+
+struct ProcsGLX {
+  glXBindTexImageEXTProc glXBindTexImageEXTFn;
+  glXChooseFBConfigProc glXChooseFBConfigFn;
+  glXChooseVisualProc glXChooseVisualFn;
+  glXCopyContextProc glXCopyContextFn;
+  glXCopySubBufferMESAProc glXCopySubBufferMESAFn;
+  glXCreateContextProc glXCreateContextFn;
+  glXCreateContextAttribsARBProc glXCreateContextAttribsARBFn;
+  glXCreateGLXPixmapProc glXCreateGLXPixmapFn;
+  glXCreateNewContextProc glXCreateNewContextFn;
+  glXCreatePbufferProc glXCreatePbufferFn;
+  glXCreatePixmapProc glXCreatePixmapFn;
+  glXCreateWindowProc glXCreateWindowFn;
+  glXDestroyContextProc glXDestroyContextFn;
+  glXDestroyGLXPixmapProc glXDestroyGLXPixmapFn;
+  glXDestroyPbufferProc glXDestroyPbufferFn;
+  glXDestroyPixmapProc glXDestroyPixmapFn;
+  glXDestroyWindowProc glXDestroyWindowFn;
+  glXGetClientStringProc glXGetClientStringFn;
+  glXGetConfigProc glXGetConfigFn;
+  glXGetCurrentContextProc glXGetCurrentContextFn;
+  glXGetCurrentDisplayProc glXGetCurrentDisplayFn;
+  glXGetCurrentDrawableProc glXGetCurrentDrawableFn;
+  glXGetCurrentReadDrawableProc glXGetCurrentReadDrawableFn;
+  glXGetFBConfigAttribProc glXGetFBConfigAttribFn;
+  glXGetFBConfigFromVisualSGIXProc glXGetFBConfigFromVisualSGIXFn;
+  glXGetFBConfigsProc glXGetFBConfigsFn;
+  glXGetMscRateOMLProc glXGetMscRateOMLFn;
+  glXGetSelectedEventProc glXGetSelectedEventFn;
+  glXGetSyncValuesOMLProc glXGetSyncValuesOMLFn;
+  glXGetVisualFromFBConfigProc glXGetVisualFromFBConfigFn;
+  glXIsDirectProc glXIsDirectFn;
+  glXMakeContextCurrentProc glXMakeContextCurrentFn;
+  glXMakeCurrentProc glXMakeCurrentFn;
+  glXQueryContextProc glXQueryContextFn;
+  glXQueryDrawableProc glXQueryDrawableFn;
+  glXQueryExtensionProc glXQueryExtensionFn;
+  glXQueryExtensionsStringProc glXQueryExtensionsStringFn;
+  glXQueryServerStringProc glXQueryServerStringFn;
+  glXQueryVersionProc glXQueryVersionFn;
+  glXReleaseTexImageEXTProc glXReleaseTexImageEXTFn;
+  glXSelectEventProc glXSelectEventFn;
+  glXSwapBuffersProc glXSwapBuffersFn;
+  glXSwapIntervalEXTProc glXSwapIntervalEXTFn;
+  glXSwapIntervalMESAProc glXSwapIntervalMESAFn;
+  glXUseXFontProc glXUseXFontFn;
+  glXWaitGLProc glXWaitGLFn;
+  glXWaitVideoSyncSGIProc glXWaitVideoSyncSGIFn;
+  glXWaitXProc glXWaitXFn;
+};
+
+class GL_EXPORT GLXApi {
+ public:
+  GLXApi();
+  virtual ~GLXApi();
+
+  virtual void glXBindTexImageEXTFn(Display* dpy,
+                                    GLXDrawable drawable,
+                                    int buffer,
+                                    int* attribList) = 0;
+  virtual GLXFBConfig* glXChooseFBConfigFn(Display* dpy,
+                                           int screen,
+                                           const int* attribList,
+                                           int* nitems) = 0;
+  virtual XVisualInfo* glXChooseVisualFn(Display* dpy,
+                                         int screen,
+                                         int* attribList) = 0;
+  virtual void glXCopyContextFn(Display* dpy,
+                                GLXContext src,
+                                GLXContext dst,
+                                unsigned long mask) = 0;
+  virtual void glXCopySubBufferMESAFn(Display* dpy,
+                                      GLXDrawable drawable,
+                                      int x,
+                                      int y,
+                                      int width,
+                                      int height) = 0;
+  virtual GLXContext glXCreateContextFn(Display* dpy,
+                                        XVisualInfo* vis,
+                                        GLXContext shareList,
+                                        int direct) = 0;
+  virtual GLXContext glXCreateContextAttribsARBFn(Display* dpy,
+                                                  GLXFBConfig config,
+                                                  GLXContext share_context,
+                                                  int direct,
+                                                  const int* attrib_list) = 0;
+  virtual GLXPixmap glXCreateGLXPixmapFn(Display* dpy,
+                                         XVisualInfo* visual,
+                                         Pixmap pixmap) = 0;
+  virtual GLXContext glXCreateNewContextFn(Display* dpy,
+                                           GLXFBConfig config,
+                                           int renderType,
+                                           GLXContext shareList,
+                                           int direct) = 0;
+  virtual GLXPbuffer glXCreatePbufferFn(Display* dpy,
+                                        GLXFBConfig config,
+                                        const int* attribList) = 0;
+  virtual GLXPixmap glXCreatePixmapFn(Display* dpy,
+                                      GLXFBConfig config,
+                                      Pixmap pixmap,
+                                      const int* attribList) = 0;
+  virtual GLXWindow glXCreateWindowFn(Display* dpy,
+                                      GLXFBConfig config,
+                                      Window win,
+                                      const int* attribList) = 0;
+  virtual void glXDestroyContextFn(Display* dpy, GLXContext ctx) = 0;
+  virtual void glXDestroyGLXPixmapFn(Display* dpy, GLXPixmap pixmap) = 0;
+  virtual void glXDestroyPbufferFn(Display* dpy, GLXPbuffer pbuf) = 0;
+  virtual void glXDestroyPixmapFn(Display* dpy, GLXPixmap pixmap) = 0;
+  virtual void glXDestroyWindowFn(Display* dpy, GLXWindow window) = 0;
+  virtual const char* glXGetClientStringFn(Display* dpy, int name) = 0;
+  virtual int glXGetConfigFn(Display* dpy,
+                             XVisualInfo* visual,
+                             int attrib,
+                             int* value) = 0;
+  virtual GLXContext glXGetCurrentContextFn(void) = 0;
+  virtual Display* glXGetCurrentDisplayFn(void) = 0;
+  virtual GLXDrawable glXGetCurrentDrawableFn(void) = 0;
+  virtual GLXDrawable glXGetCurrentReadDrawableFn(void) = 0;
+  virtual int glXGetFBConfigAttribFn(Display* dpy,
+                                     GLXFBConfig config,
+                                     int attribute,
+                                     int* value) = 0;
+  virtual GLXFBConfig glXGetFBConfigFromVisualSGIXFn(
+      Display* dpy,
+      XVisualInfo* visualInfo) = 0;
+  virtual GLXFBConfig* glXGetFBConfigsFn(Display* dpy,
+                                         int screen,
+                                         int* nelements) = 0;
+  virtual bool glXGetMscRateOMLFn(Display* dpy,
+                                  GLXDrawable drawable,
+                                  int32* numerator,
+                                  int32* denominator) = 0;
+  virtual void glXGetSelectedEventFn(Display* dpy,
+                                     GLXDrawable drawable,
+                                     unsigned long* mask) = 0;
+  virtual bool glXGetSyncValuesOMLFn(Display* dpy,
+                                     GLXDrawable drawable,
+                                     int64* ust,
+                                     int64* msc,
+                                     int64* sbc) = 0;
+  virtual XVisualInfo* glXGetVisualFromFBConfigFn(Display* dpy,
+                                                  GLXFBConfig config) = 0;
+  virtual int glXIsDirectFn(Display* dpy, GLXContext ctx) = 0;
+  virtual int glXMakeContextCurrentFn(Display* dpy,
+                                      GLXDrawable draw,
+                                      GLXDrawable read,
+                                      GLXContext ctx) = 0;
+  virtual int glXMakeCurrentFn(Display* dpy,
+                               GLXDrawable drawable,
+                               GLXContext ctx) = 0;
+  virtual int glXQueryContextFn(Display* dpy,
+                                GLXContext ctx,
+                                int attribute,
+                                int* value) = 0;
+  virtual void glXQueryDrawableFn(Display* dpy,
+                                  GLXDrawable draw,
+                                  int attribute,
+                                  unsigned int* value) = 0;
+  virtual int glXQueryExtensionFn(Display* dpy, int* errorb, int* event) = 0;
+  virtual const char* glXQueryExtensionsStringFn(Display* dpy, int screen) = 0;
+  virtual const char* glXQueryServerStringFn(Display* dpy,
+                                             int screen,
+                                             int name) = 0;
+  virtual int glXQueryVersionFn(Display* dpy, int* maj, int* min) = 0;
+  virtual void glXReleaseTexImageEXTFn(Display* dpy,
+                                       GLXDrawable drawable,
+                                       int buffer) = 0;
+  virtual void glXSelectEventFn(Display* dpy,
+                                GLXDrawable drawable,
+                                unsigned long mask) = 0;
+  virtual void glXSwapBuffersFn(Display* dpy, GLXDrawable drawable) = 0;
+  virtual void glXSwapIntervalEXTFn(Display* dpy,
+                                    GLXDrawable drawable,
+                                    int interval) = 0;
+  virtual void glXSwapIntervalMESAFn(unsigned int interval) = 0;
+  virtual void glXUseXFontFn(Font font, int first, int count, int list) = 0;
+  virtual void glXWaitGLFn(void) = 0;
+  virtual int glXWaitVideoSyncSGIFn(int divisor,
+                                    int remainder,
+                                    unsigned int* count) = 0;
+  virtual void glXWaitXFn(void) = 0;
+};
+
+}  // namespace gfx
+
+#define glXBindTexImageEXT ::gfx::g_current_glx_context->glXBindTexImageEXTFn
+#define glXChooseFBConfig ::gfx::g_current_glx_context->glXChooseFBConfigFn
+#define glXChooseVisual ::gfx::g_current_glx_context->glXChooseVisualFn
+#define glXCopyContext ::gfx::g_current_glx_context->glXCopyContextFn
+#define glXCopySubBufferMESA \
+  ::gfx::g_current_glx_context->glXCopySubBufferMESAFn
+#define glXCreateContext ::gfx::g_current_glx_context->glXCreateContextFn
+#define glXCreateContextAttribsARB \
+  ::gfx::g_current_glx_context->glXCreateContextAttribsARBFn
+#define glXCreateGLXPixmap ::gfx::g_current_glx_context->glXCreateGLXPixmapFn
+#define glXCreateNewContext ::gfx::g_current_glx_context->glXCreateNewContextFn
+#define glXCreatePbuffer ::gfx::g_current_glx_context->glXCreatePbufferFn
+#define glXCreatePixmap ::gfx::g_current_glx_context->glXCreatePixmapFn
+#define glXCreateWindow ::gfx::g_current_glx_context->glXCreateWindowFn
+#define glXDestroyContext ::gfx::g_current_glx_context->glXDestroyContextFn
+#define glXDestroyGLXPixmap ::gfx::g_current_glx_context->glXDestroyGLXPixmapFn
+#define glXDestroyPbuffer ::gfx::g_current_glx_context->glXDestroyPbufferFn
+#define glXDestroyPixmap ::gfx::g_current_glx_context->glXDestroyPixmapFn
+#define glXDestroyWindow ::gfx::g_current_glx_context->glXDestroyWindowFn
+#define glXGetClientString ::gfx::g_current_glx_context->glXGetClientStringFn
+#define glXGetConfig ::gfx::g_current_glx_context->glXGetConfigFn
+#define glXGetCurrentContext \
+  ::gfx::g_current_glx_context->glXGetCurrentContextFn
+#define glXGetCurrentDisplay \
+  ::gfx::g_current_glx_context->glXGetCurrentDisplayFn
+#define glXGetCurrentDrawable \
+  ::gfx::g_current_glx_context->glXGetCurrentDrawableFn
+#define glXGetCurrentReadDrawable \
+  ::gfx::g_current_glx_context->glXGetCurrentReadDrawableFn
+#define glXGetFBConfigAttrib \
+  ::gfx::g_current_glx_context->glXGetFBConfigAttribFn
+#define glXGetFBConfigFromVisualSGIX \
+  ::gfx::g_current_glx_context->glXGetFBConfigFromVisualSGIXFn
+#define glXGetFBConfigs ::gfx::g_current_glx_context->glXGetFBConfigsFn
+#define glXGetMscRateOML ::gfx::g_current_glx_context->glXGetMscRateOMLFn
+#define glXGetSelectedEvent ::gfx::g_current_glx_context->glXGetSelectedEventFn
+#define glXGetSyncValuesOML ::gfx::g_current_glx_context->glXGetSyncValuesOMLFn
+#define glXGetVisualFromFBConfig \
+  ::gfx::g_current_glx_context->glXGetVisualFromFBConfigFn
+#define glXIsDirect ::gfx::g_current_glx_context->glXIsDirectFn
+#define glXMakeContextCurrent \
+  ::gfx::g_current_glx_context->glXMakeContextCurrentFn
+#define glXMakeCurrent ::gfx::g_current_glx_context->glXMakeCurrentFn
+#define glXQueryContext ::gfx::g_current_glx_context->glXQueryContextFn
+#define glXQueryDrawable ::gfx::g_current_glx_context->glXQueryDrawableFn
+#define glXQueryExtension ::gfx::g_current_glx_context->glXQueryExtensionFn
+#define glXQueryExtensionsString \
+  ::gfx::g_current_glx_context->glXQueryExtensionsStringFn
+#define glXQueryServerString \
+  ::gfx::g_current_glx_context->glXQueryServerStringFn
+#define glXQueryVersion ::gfx::g_current_glx_context->glXQueryVersionFn
+#define glXReleaseTexImageEXT \
+  ::gfx::g_current_glx_context->glXReleaseTexImageEXTFn
+#define glXSelectEvent ::gfx::g_current_glx_context->glXSelectEventFn
+#define glXSwapBuffers ::gfx::g_current_glx_context->glXSwapBuffersFn
+#define glXSwapIntervalEXT ::gfx::g_current_glx_context->glXSwapIntervalEXTFn
+#define glXSwapIntervalMESA ::gfx::g_current_glx_context->glXSwapIntervalMESAFn
+#define glXUseXFont ::gfx::g_current_glx_context->glXUseXFontFn
+#define glXWaitGL ::gfx::g_current_glx_context->glXWaitGLFn
+#define glXWaitVideoSyncSGI ::gfx::g_current_glx_context->glXWaitVideoSyncSGIFn
+#define glXWaitX ::gfx::g_current_glx_context->glXWaitXFn
+
+#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
diff --git a/ui/gl/gl_bindings_autogen_mock.cc b/ui/gl/gl_bindings_autogen_mock.cc
new file mode 100644
index 0000000..f424696
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_mock.cc
@@ -0,0 +1,3225 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#include <string.h>
+
+#include "ui/gl/gl_mock.h"
+
+namespace gfx {
+
+// This is called mainly to prevent the compiler combining the code of mock
+// functions with identical contents, so that their function pointers will be
+// different.
+void MakeFunctionUnique(const char* func_name) {
+  VLOG(2) << "Calling mock " << func_name;
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glActiveTexture(GLenum texture) {
+  MakeFunctionUnique("glActiveTexture");
+  interface_->ActiveTexture(texture);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glAttachShader(GLuint program, GLuint shader) {
+  MakeFunctionUnique("glAttachShader");
+  interface_->AttachShader(program, shader);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBeginQuery(GLenum target, GLuint id) {
+  MakeFunctionUnique("glBeginQuery");
+  interface_->BeginQuery(target, id);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBeginQueryARB(GLenum target, GLuint id) {
+  MakeFunctionUnique("glBeginQueryARB");
+  interface_->BeginQueryARB(target, id);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBeginQueryEXT(GLenum target, GLuint id) {
+  MakeFunctionUnique("glBeginQueryEXT");
+  interface_->BeginQueryARB(target, id);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBeginTransformFeedback(GLenum primitiveMode) {
+  MakeFunctionUnique("glBeginTransformFeedback");
+  interface_->BeginTransformFeedback(primitiveMode);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindAttribLocation(GLuint program,
+                                           GLuint index,
+                                           const char* name) {
+  MakeFunctionUnique("glBindAttribLocation");
+  interface_->BindAttribLocation(program, index, name);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindBuffer(GLenum target, GLuint buffer) {
+  MakeFunctionUnique("glBindBuffer");
+  interface_->BindBuffer(target, buffer);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBindBufferBase(GLenum target,
+                                                            GLuint index,
+                                                            GLuint buffer) {
+  MakeFunctionUnique("glBindBufferBase");
+  interface_->BindBufferBase(target, index, buffer);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBindBufferRange(GLenum target,
+                                                             GLuint index,
+                                                             GLuint buffer,
+                                                             GLintptr offset,
+                                                             GLsizeiptr size) {
+  MakeFunctionUnique("glBindBufferRange");
+  interface_->BindBufferRange(target, index, buffer, offset, size);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindFragDataLocation(GLuint program,
+                                             GLuint colorNumber,
+                                             const char* name) {
+  MakeFunctionUnique("glBindFragDataLocation");
+  interface_->BindFragDataLocation(program, colorNumber, name);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindFragDataLocationIndexed(GLuint program,
+                                                    GLuint colorNumber,
+                                                    GLuint index,
+                                                    const char* name) {
+  MakeFunctionUnique("glBindFragDataLocationIndexed");
+  interface_->BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindFramebuffer(GLenum target, GLuint framebuffer) {
+  MakeFunctionUnique("glBindFramebuffer");
+  interface_->BindFramebufferEXT(target, framebuffer);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindFramebufferEXT(GLenum target, GLuint framebuffer) {
+  MakeFunctionUnique("glBindFramebufferEXT");
+  interface_->BindFramebufferEXT(target, framebuffer);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindRenderbuffer(GLenum target, GLuint renderbuffer) {
+  MakeFunctionUnique("glBindRenderbuffer");
+  interface_->BindRenderbufferEXT(target, renderbuffer);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindRenderbufferEXT(GLenum target,
+                                            GLuint renderbuffer) {
+  MakeFunctionUnique("glBindRenderbufferEXT");
+  interface_->BindRenderbufferEXT(target, renderbuffer);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindSampler(GLuint unit, GLuint sampler) {
+  MakeFunctionUnique("glBindSampler");
+  interface_->BindSampler(unit, sampler);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindTexture(GLenum target, GLuint texture) {
+  MakeFunctionUnique("glBindTexture");
+  interface_->BindTexture(target, texture);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindTransformFeedback(GLenum target, GLuint id) {
+  MakeFunctionUnique("glBindTransformFeedback");
+  interface_->BindTransformFeedback(target, id);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBindVertexArray(GLuint array) {
+  MakeFunctionUnique("glBindVertexArray");
+  interface_->BindVertexArrayOES(array);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBindVertexArrayAPPLE(GLuint array) {
+  MakeFunctionUnique("glBindVertexArrayAPPLE");
+  interface_->BindVertexArrayOES(array);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBindVertexArrayOES(GLuint array) {
+  MakeFunctionUnique("glBindVertexArrayOES");
+  interface_->BindVertexArrayOES(array);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlendBarrierKHR(void) {
+  MakeFunctionUnique("glBlendBarrierKHR");
+  interface_->BlendBarrierKHR();
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlendBarrierNV(void) {
+  MakeFunctionUnique("glBlendBarrierNV");
+  interface_->BlendBarrierKHR();
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlendColor(GLclampf red,
+                                                        GLclampf green,
+                                                        GLclampf blue,
+                                                        GLclampf alpha) {
+  MakeFunctionUnique("glBlendColor");
+  interface_->BlendColor(red, green, blue, alpha);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlendEquation(GLenum mode) {
+  MakeFunctionUnique("glBlendEquation");
+  interface_->BlendEquation(mode);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBlendEquationSeparate(GLenum modeRGB,
+                                              GLenum modeAlpha) {
+  MakeFunctionUnique("glBlendEquationSeparate");
+  interface_->BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBlendFunc(GLenum sfactor, GLenum dfactor) {
+  MakeFunctionUnique("glBlendFunc");
+  interface_->BlendFunc(sfactor, dfactor);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBlendFuncSeparate(GLenum srcRGB,
+                                          GLenum dstRGB,
+                                          GLenum srcAlpha,
+                                          GLenum dstAlpha) {
+  MakeFunctionUnique("glBlendFuncSeparate");
+  interface_->BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlitFramebuffer(GLint srcX0,
+                                                             GLint srcY0,
+                                                             GLint srcX1,
+                                                             GLint srcY1,
+                                                             GLint dstX0,
+                                                             GLint dstY0,
+                                                             GLint dstX1,
+                                                             GLint dstY1,
+                                                             GLbitfield mask,
+                                                             GLenum filter) {
+  MakeFunctionUnique("glBlitFramebuffer");
+  interface_->BlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                 dstX1, dstY1, mask, filter);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBlitFramebufferANGLE(GLint srcX0,
+                                             GLint srcY0,
+                                             GLint srcX1,
+                                             GLint srcY1,
+                                             GLint dstX0,
+                                             GLint dstY0,
+                                             GLint dstX1,
+                                             GLint dstY1,
+                                             GLbitfield mask,
+                                             GLenum filter) {
+  MakeFunctionUnique("glBlitFramebufferANGLE");
+  interface_->BlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                   dstX1, dstY1, mask, filter);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlitFramebufferEXT(GLint srcX0,
+                                                                GLint srcY0,
+                                                                GLint srcX1,
+                                                                GLint srcY1,
+                                                                GLint dstX0,
+                                                                GLint dstY0,
+                                                                GLint dstX1,
+                                                                GLint dstY1,
+                                                                GLbitfield mask,
+                                                                GLenum filter) {
+  MakeFunctionUnique("glBlitFramebufferEXT");
+  interface_->BlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                 dstX1, dstY1, mask, filter);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBufferData(GLenum target,
+                                                        GLsizeiptr size,
+                                                        const void* data,
+                                                        GLenum usage) {
+  MakeFunctionUnique("glBufferData");
+  interface_->BufferData(target, size, data, usage);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBufferSubData(GLenum target,
+                                                           GLintptr offset,
+                                                           GLsizeiptr size,
+                                                           const void* data) {
+  MakeFunctionUnique("glBufferSubData");
+  interface_->BufferSubData(target, offset, size, data);
+}
+
+GLenum GL_BINDING_CALL
+MockGLInterface::Mock_glCheckFramebufferStatus(GLenum target) {
+  MakeFunctionUnique("glCheckFramebufferStatus");
+  return interface_->CheckFramebufferStatusEXT(target);
+}
+
+GLenum GL_BINDING_CALL
+MockGLInterface::Mock_glCheckFramebufferStatusEXT(GLenum target) {
+  MakeFunctionUnique("glCheckFramebufferStatusEXT");
+  return interface_->CheckFramebufferStatusEXT(target);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glClear(GLbitfield mask) {
+  MakeFunctionUnique("glClear");
+  interface_->Clear(mask);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glClearBufferfi(GLenum buffer,
+                                                           GLint drawbuffer,
+                                                           const GLfloat depth,
+                                                           GLint stencil) {
+  MakeFunctionUnique("glClearBufferfi");
+  interface_->ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glClearBufferfv(GLenum buffer,
+                                      GLint drawbuffer,
+                                      const GLfloat* value) {
+  MakeFunctionUnique("glClearBufferfv");
+  interface_->ClearBufferfv(buffer, drawbuffer, value);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glClearBufferiv(GLenum buffer,
+                                                           GLint drawbuffer,
+                                                           const GLint* value) {
+  MakeFunctionUnique("glClearBufferiv");
+  interface_->ClearBufferiv(buffer, drawbuffer, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glClearBufferuiv(GLenum buffer,
+                                       GLint drawbuffer,
+                                       const GLuint* value) {
+  MakeFunctionUnique("glClearBufferuiv");
+  interface_->ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glClearColor(GLclampf red,
+                                                        GLclampf green,
+                                                        GLclampf blue,
+                                                        GLclampf alpha) {
+  MakeFunctionUnique("glClearColor");
+  interface_->ClearColor(red, green, blue, alpha);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glClearDepth(GLclampd depth) {
+  MakeFunctionUnique("glClearDepth");
+  interface_->ClearDepth(depth);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glClearDepthf(GLclampf depth) {
+  MakeFunctionUnique("glClearDepthf");
+  interface_->ClearDepthf(depth);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glClearStencil(GLint s) {
+  MakeFunctionUnique("glClearStencil");
+  interface_->ClearStencil(s);
+}
+
+GLenum GL_BINDING_CALL
+MockGLInterface::Mock_glClientWaitSync(GLsync sync,
+                                       GLbitfield flags,
+                                       GLuint64 timeout) {
+  MakeFunctionUnique("glClientWaitSync");
+  return interface_->ClientWaitSync(sync, flags, timeout);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glColorMask(GLboolean red,
+                                                       GLboolean green,
+                                                       GLboolean blue,
+                                                       GLboolean alpha) {
+  MakeFunctionUnique("glColorMask");
+  interface_->ColorMask(red, green, blue, alpha);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glCompileShader(GLuint shader) {
+  MakeFunctionUnique("glCompileShader");
+  interface_->CompileShader(shader);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glCompressedTexImage2D(GLenum target,
+                                             GLint level,
+                                             GLenum internalformat,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLint border,
+                                             GLsizei imageSize,
+                                             const void* data) {
+  MakeFunctionUnique("glCompressedTexImage2D");
+  interface_->CompressedTexImage2D(target, level, internalformat, width, height,
+                                   border, imageSize, data);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glCompressedTexImage3D(GLenum target,
+                                             GLint level,
+                                             GLenum internalformat,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLsizei depth,
+                                             GLint border,
+                                             GLsizei imageSize,
+                                             const void* data) {
+  MakeFunctionUnique("glCompressedTexImage3D");
+  interface_->CompressedTexImage3D(target, level, internalformat, width, height,
+                                   depth, border, imageSize, data);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glCompressedTexSubImage2D(GLenum target,
+                                                GLint level,
+                                                GLint xoffset,
+                                                GLint yoffset,
+                                                GLsizei width,
+                                                GLsizei height,
+                                                GLenum format,
+                                                GLsizei imageSize,
+                                                const void* data) {
+  MakeFunctionUnique("glCompressedTexSubImage2D");
+  interface_->CompressedTexSubImage2D(target, level, xoffset, yoffset, width,
+                                      height, format, imageSize, data);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glCopyBufferSubData(GLenum readTarget,
+                                          GLenum writeTarget,
+                                          GLintptr readOffset,
+                                          GLintptr writeOffset,
+                                          GLsizeiptr size) {
+  MakeFunctionUnique("glCopyBufferSubData");
+  interface_->CopyBufferSubData(readTarget, writeTarget, readOffset,
+                                writeOffset, size);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glCopyTexImage2D(GLenum target,
+                                       GLint level,
+                                       GLenum internalformat,
+                                       GLint x,
+                                       GLint y,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLint border) {
+  MakeFunctionUnique("glCopyTexImage2D");
+  interface_->CopyTexImage2D(target, level, internalformat, x, y, width, height,
+                             border);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glCopyTexSubImage2D(GLenum target,
+                                                               GLint level,
+                                                               GLint xoffset,
+                                                               GLint yoffset,
+                                                               GLint x,
+                                                               GLint y,
+                                                               GLsizei width,
+                                                               GLsizei height) {
+  MakeFunctionUnique("glCopyTexSubImage2D");
+  interface_->CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width,
+                                height);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glCopyTexSubImage3D(GLenum target,
+                                                               GLint level,
+                                                               GLint xoffset,
+                                                               GLint yoffset,
+                                                               GLint zoffset,
+                                                               GLint x,
+                                                               GLint y,
+                                                               GLsizei width,
+                                                               GLsizei height) {
+  MakeFunctionUnique("glCopyTexSubImage3D");
+  interface_->CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y,
+                                width, height);
+}
+
+GLuint GL_BINDING_CALL MockGLInterface::Mock_glCreateProgram(void) {
+  MakeFunctionUnique("glCreateProgram");
+  return interface_->CreateProgram();
+}
+
+GLuint GL_BINDING_CALL MockGLInterface::Mock_glCreateShader(GLenum type) {
+  MakeFunctionUnique("glCreateShader");
+  return interface_->CreateShader(type);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glCullFace(GLenum mode) {
+  MakeFunctionUnique("glCullFace");
+  interface_->CullFace(mode);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteBuffers(GLsizei n, const GLuint* buffers) {
+  MakeFunctionUnique("glDeleteBuffers");
+  interface_->DeleteBuffersARB(n, buffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteBuffersARB(GLsizei n, const GLuint* buffers) {
+  MakeFunctionUnique("glDeleteBuffersARB");
+  interface_->DeleteBuffersARB(n, buffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteFencesAPPLE(GLsizei n, const GLuint* fences) {
+  MakeFunctionUnique("glDeleteFencesAPPLE");
+  interface_->DeleteFencesAPPLE(n, fences);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteFencesNV(GLsizei n, const GLuint* fences) {
+  MakeFunctionUnique("glDeleteFencesNV");
+  interface_->DeleteFencesNV(n, fences);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteFramebuffers(GLsizei n,
+                                           const GLuint* framebuffers) {
+  MakeFunctionUnique("glDeleteFramebuffers");
+  interface_->DeleteFramebuffersEXT(n, framebuffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteFramebuffersEXT(GLsizei n,
+                                              const GLuint* framebuffers) {
+  MakeFunctionUnique("glDeleteFramebuffersEXT");
+  interface_->DeleteFramebuffersEXT(n, framebuffers);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDeleteProgram(GLuint program) {
+  MakeFunctionUnique("glDeleteProgram");
+  interface_->DeleteProgram(program);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteQueries(GLsizei n, const GLuint* ids) {
+  MakeFunctionUnique("glDeleteQueries");
+  interface_->DeleteQueries(n, ids);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteQueriesARB(GLsizei n, const GLuint* ids) {
+  MakeFunctionUnique("glDeleteQueriesARB");
+  interface_->DeleteQueriesARB(n, ids);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteQueriesEXT(GLsizei n, const GLuint* ids) {
+  MakeFunctionUnique("glDeleteQueriesEXT");
+  interface_->DeleteQueriesARB(n, ids);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteRenderbuffers(GLsizei n,
+                                            const GLuint* renderbuffers) {
+  MakeFunctionUnique("glDeleteRenderbuffers");
+  interface_->DeleteRenderbuffersEXT(n, renderbuffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteRenderbuffersEXT(GLsizei n,
+                                               const GLuint* renderbuffers) {
+  MakeFunctionUnique("glDeleteRenderbuffersEXT");
+  interface_->DeleteRenderbuffersEXT(n, renderbuffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteSamplers(GLsizei n, const GLuint* samplers) {
+  MakeFunctionUnique("glDeleteSamplers");
+  interface_->DeleteSamplers(n, samplers);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDeleteShader(GLuint shader) {
+  MakeFunctionUnique("glDeleteShader");
+  interface_->DeleteShader(shader);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDeleteSync(GLsync sync) {
+  MakeFunctionUnique("glDeleteSync");
+  interface_->DeleteSync(sync);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteTextures(GLsizei n, const GLuint* textures) {
+  MakeFunctionUnique("glDeleteTextures");
+  interface_->DeleteTextures(n, textures);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids) {
+  MakeFunctionUnique("glDeleteTransformFeedbacks");
+  interface_->DeleteTransformFeedbacks(n, ids);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteVertexArrays(GLsizei n, const GLuint* arrays) {
+  MakeFunctionUnique("glDeleteVertexArrays");
+  interface_->DeleteVertexArraysOES(n, arrays);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteVertexArraysAPPLE(GLsizei n,
+                                                const GLuint* arrays) {
+  MakeFunctionUnique("glDeleteVertexArraysAPPLE");
+  interface_->DeleteVertexArraysOES(n, arrays);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDeleteVertexArraysOES(GLsizei n, const GLuint* arrays) {
+  MakeFunctionUnique("glDeleteVertexArraysOES");
+  interface_->DeleteVertexArraysOES(n, arrays);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDepthFunc(GLenum func) {
+  MakeFunctionUnique("glDepthFunc");
+  interface_->DepthFunc(func);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDepthMask(GLboolean flag) {
+  MakeFunctionUnique("glDepthMask");
+  interface_->DepthMask(flag);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDepthRange(GLclampd zNear, GLclampd zFar) {
+  MakeFunctionUnique("glDepthRange");
+  interface_->DepthRange(zNear, zFar);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDepthRangef(GLclampf zNear, GLclampf zFar) {
+  MakeFunctionUnique("glDepthRangef");
+  interface_->DepthRangef(zNear, zFar);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDetachShader(GLuint program, GLuint shader) {
+  MakeFunctionUnique("glDetachShader");
+  interface_->DetachShader(program, shader);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDisable(GLenum cap) {
+  MakeFunctionUnique("glDisable");
+  interface_->Disable(cap);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDisableVertexAttribArray(GLuint index) {
+  MakeFunctionUnique("glDisableVertexAttribArray");
+  interface_->DisableVertexAttribArray(index);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDiscardFramebufferEXT(GLenum target,
+                                              GLsizei numAttachments,
+                                              const GLenum* attachments) {
+  MakeFunctionUnique("glDiscardFramebufferEXT");
+  interface_->DiscardFramebufferEXT(target, numAttachments, attachments);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
+  MakeFunctionUnique("glDrawArrays");
+  interface_->DrawArrays(mode, first, count);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawArraysInstanced(GLenum mode,
+                                            GLint first,
+                                            GLsizei count,
+                                            GLsizei primcount) {
+  MakeFunctionUnique("glDrawArraysInstanced");
+  interface_->DrawArraysInstancedANGLE(mode, first, count, primcount);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawArraysInstancedANGLE(GLenum mode,
+                                                 GLint first,
+                                                 GLsizei count,
+                                                 GLsizei primcount) {
+  MakeFunctionUnique("glDrawArraysInstancedANGLE");
+  interface_->DrawArraysInstancedANGLE(mode, first, count, primcount);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawArraysInstancedARB(GLenum mode,
+                                               GLint first,
+                                               GLsizei count,
+                                               GLsizei primcount) {
+  MakeFunctionUnique("glDrawArraysInstancedARB");
+  interface_->DrawArraysInstancedANGLE(mode, first, count, primcount);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDrawBuffer(GLenum mode) {
+  MakeFunctionUnique("glDrawBuffer");
+  interface_->DrawBuffer(mode);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawBuffers(GLsizei n, const GLenum* bufs) {
+  MakeFunctionUnique("glDrawBuffers");
+  interface_->DrawBuffersARB(n, bufs);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawBuffersARB(GLsizei n, const GLenum* bufs) {
+  MakeFunctionUnique("glDrawBuffersARB");
+  interface_->DrawBuffersARB(n, bufs);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawBuffersEXT(GLsizei n, const GLenum* bufs) {
+  MakeFunctionUnique("glDrawBuffersEXT");
+  interface_->DrawBuffersARB(n, bufs);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDrawElements(GLenum mode,
+                                                          GLsizei count,
+                                                          GLenum type,
+                                                          const void* indices) {
+  MakeFunctionUnique("glDrawElements");
+  interface_->DrawElements(mode, count, type, indices);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawElementsInstanced(GLenum mode,
+                                              GLsizei count,
+                                              GLenum type,
+                                              const void* indices,
+                                              GLsizei primcount) {
+  MakeFunctionUnique("glDrawElementsInstanced");
+  interface_->DrawElementsInstancedANGLE(mode, count, type, indices, primcount);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawElementsInstancedANGLE(GLenum mode,
+                                                   GLsizei count,
+                                                   GLenum type,
+                                                   const void* indices,
+                                                   GLsizei primcount) {
+  MakeFunctionUnique("glDrawElementsInstancedANGLE");
+  interface_->DrawElementsInstancedANGLE(mode, count, type, indices, primcount);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawElementsInstancedARB(GLenum mode,
+                                                 GLsizei count,
+                                                 GLenum type,
+                                                 const void* indices,
+                                                 GLsizei primcount) {
+  MakeFunctionUnique("glDrawElementsInstancedARB");
+  interface_->DrawElementsInstancedANGLE(mode, count, type, indices, primcount);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glDrawRangeElements(GLenum mode,
+                                          GLuint start,
+                                          GLuint end,
+                                          GLsizei count,
+                                          GLenum type,
+                                          const void* indices) {
+  MakeFunctionUnique("glDrawRangeElements");
+  interface_->DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glEGLImageTargetRenderbufferStorageOES(
+    GLenum target,
+    GLeglImageOES image) {
+  MakeFunctionUnique("glEGLImageTargetRenderbufferStorageOES");
+  interface_->EGLImageTargetRenderbufferStorageOES(target, image);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glEGLImageTargetTexture2DOES(GLenum target,
+                                                   GLeglImageOES image) {
+  MakeFunctionUnique("glEGLImageTargetTexture2DOES");
+  interface_->EGLImageTargetTexture2DOES(target, image);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glEnable(GLenum cap) {
+  MakeFunctionUnique("glEnable");
+  interface_->Enable(cap);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glEnableVertexAttribArray(GLuint index) {
+  MakeFunctionUnique("glEnableVertexAttribArray");
+  interface_->EnableVertexAttribArray(index);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glEndQuery(GLenum target) {
+  MakeFunctionUnique("glEndQuery");
+  interface_->EndQuery(target);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glEndQueryARB(GLenum target) {
+  MakeFunctionUnique("glEndQueryARB");
+  interface_->EndQueryARB(target);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glEndQueryEXT(GLenum target) {
+  MakeFunctionUnique("glEndQueryEXT");
+  interface_->EndQueryARB(target);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glEndTransformFeedback(void) {
+  MakeFunctionUnique("glEndTransformFeedback");
+  interface_->EndTransformFeedback();
+}
+
+GLsync GL_BINDING_CALL
+MockGLInterface::Mock_glFenceSync(GLenum condition, GLbitfield flags) {
+  MakeFunctionUnique("glFenceSync");
+  return interface_->FenceSync(condition, flags);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glFinish(void) {
+  MakeFunctionUnique("glFinish");
+  interface_->Finish();
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glFinishFenceAPPLE(GLuint fence) {
+  MakeFunctionUnique("glFinishFenceAPPLE");
+  interface_->FinishFenceAPPLE(fence);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glFinishFenceNV(GLuint fence) {
+  MakeFunctionUnique("glFinishFenceNV");
+  interface_->FinishFenceNV(fence);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glFlush(void) {
+  MakeFunctionUnique("glFlush");
+  interface_->Flush();
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glFlushMappedBufferRange(GLenum target,
+                                               GLintptr offset,
+                                               GLsizeiptr length) {
+  MakeFunctionUnique("glFlushMappedBufferRange");
+  interface_->FlushMappedBufferRange(target, offset, length);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glFramebufferRenderbuffer(GLenum target,
+                                                GLenum attachment,
+                                                GLenum renderbuffertarget,
+                                                GLuint renderbuffer) {
+  MakeFunctionUnique("glFramebufferRenderbuffer");
+  interface_->FramebufferRenderbufferEXT(target, attachment, renderbuffertarget,
+                                         renderbuffer);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glFramebufferRenderbufferEXT(GLenum target,
+                                                   GLenum attachment,
+                                                   GLenum renderbuffertarget,
+                                                   GLuint renderbuffer) {
+  MakeFunctionUnique("glFramebufferRenderbufferEXT");
+  interface_->FramebufferRenderbufferEXT(target, attachment, renderbuffertarget,
+                                         renderbuffer);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glFramebufferTexture2D(GLenum target,
+                                             GLenum attachment,
+                                             GLenum textarget,
+                                             GLuint texture,
+                                             GLint level) {
+  MakeFunctionUnique("glFramebufferTexture2D");
+  interface_->FramebufferTexture2DEXT(target, attachment, textarget, texture,
+                                      level);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glFramebufferTexture2DEXT(GLenum target,
+                                                GLenum attachment,
+                                                GLenum textarget,
+                                                GLuint texture,
+                                                GLint level) {
+  MakeFunctionUnique("glFramebufferTexture2DEXT");
+  interface_->FramebufferTexture2DEXT(target, attachment, textarget, texture,
+                                      level);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glFramebufferTexture2DMultisampleEXT(GLenum target,
+                                                           GLenum attachment,
+                                                           GLenum textarget,
+                                                           GLuint texture,
+                                                           GLint level,
+                                                           GLsizei samples) {
+  MakeFunctionUnique("glFramebufferTexture2DMultisampleEXT");
+  interface_->FramebufferTexture2DMultisampleEXT(target, attachment, textarget,
+                                                 texture, level, samples);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glFramebufferTexture2DMultisampleIMG(GLenum target,
+                                                           GLenum attachment,
+                                                           GLenum textarget,
+                                                           GLuint texture,
+                                                           GLint level,
+                                                           GLsizei samples) {
+  MakeFunctionUnique("glFramebufferTexture2DMultisampleIMG");
+  interface_->FramebufferTexture2DMultisampleIMG(target, attachment, textarget,
+                                                 texture, level, samples);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glFramebufferTextureLayer(GLenum target,
+                                                GLenum attachment,
+                                                GLuint texture,
+                                                GLint level,
+                                                GLint layer) {
+  MakeFunctionUnique("glFramebufferTextureLayer");
+  interface_->FramebufferTextureLayer(target, attachment, texture, level,
+                                      layer);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glFrontFace(GLenum mode) {
+  MakeFunctionUnique("glFrontFace");
+  interface_->FrontFace(mode);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenBuffers(GLsizei n, GLuint* buffers) {
+  MakeFunctionUnique("glGenBuffers");
+  interface_->GenBuffersARB(n, buffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenBuffersARB(GLsizei n, GLuint* buffers) {
+  MakeFunctionUnique("glGenBuffersARB");
+  interface_->GenBuffersARB(n, buffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenFencesAPPLE(GLsizei n, GLuint* fences) {
+  MakeFunctionUnique("glGenFencesAPPLE");
+  interface_->GenFencesAPPLE(n, fences);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenFencesNV(GLsizei n, GLuint* fences) {
+  MakeFunctionUnique("glGenFencesNV");
+  interface_->GenFencesNV(n, fences);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenFramebuffers(GLsizei n, GLuint* framebuffers) {
+  MakeFunctionUnique("glGenFramebuffers");
+  interface_->GenFramebuffersEXT(n, framebuffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenFramebuffersEXT(GLsizei n, GLuint* framebuffers) {
+  MakeFunctionUnique("glGenFramebuffersEXT");
+  interface_->GenFramebuffersEXT(n, framebuffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenQueries(GLsizei n, GLuint* ids) {
+  MakeFunctionUnique("glGenQueries");
+  interface_->GenQueries(n, ids);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenQueriesARB(GLsizei n, GLuint* ids) {
+  MakeFunctionUnique("glGenQueriesARB");
+  interface_->GenQueriesARB(n, ids);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenQueriesEXT(GLsizei n, GLuint* ids) {
+  MakeFunctionUnique("glGenQueriesEXT");
+  interface_->GenQueriesARB(n, ids);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) {
+  MakeFunctionUnique("glGenRenderbuffers");
+  interface_->GenRenderbuffersEXT(n, renderbuffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenRenderbuffersEXT(GLsizei n, GLuint* renderbuffers) {
+  MakeFunctionUnique("glGenRenderbuffersEXT");
+  interface_->GenRenderbuffersEXT(n, renderbuffers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenSamplers(GLsizei n, GLuint* samplers) {
+  MakeFunctionUnique("glGenSamplers");
+  interface_->GenSamplers(n, samplers);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenTextures(GLsizei n, GLuint* textures) {
+  MakeFunctionUnique("glGenTextures");
+  interface_->GenTextures(n, textures);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenTransformFeedbacks(GLsizei n, GLuint* ids) {
+  MakeFunctionUnique("glGenTransformFeedbacks");
+  interface_->GenTransformFeedbacks(n, ids);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenVertexArrays(GLsizei n, GLuint* arrays) {
+  MakeFunctionUnique("glGenVertexArrays");
+  interface_->GenVertexArraysOES(n, arrays);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenVertexArraysAPPLE(GLsizei n, GLuint* arrays) {
+  MakeFunctionUnique("glGenVertexArraysAPPLE");
+  interface_->GenVertexArraysOES(n, arrays);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGenVertexArraysOES(GLsizei n, GLuint* arrays) {
+  MakeFunctionUnique("glGenVertexArraysOES");
+  interface_->GenVertexArraysOES(n, arrays);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGenerateMipmap(GLenum target) {
+  MakeFunctionUnique("glGenerateMipmap");
+  interface_->GenerateMipmapEXT(target);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGenerateMipmapEXT(GLenum target) {
+  MakeFunctionUnique("glGenerateMipmapEXT");
+  interface_->GenerateMipmapEXT(target);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetActiveAttrib(GLuint program,
+                                                             GLuint index,
+                                                             GLsizei bufsize,
+                                                             GLsizei* length,
+                                                             GLint* size,
+                                                             GLenum* type,
+                                                             char* name) {
+  MakeFunctionUnique("glGetActiveAttrib");
+  interface_->GetActiveAttrib(program, index, bufsize, length, size, type,
+                              name);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetActiveUniform(GLuint program,
+                                                              GLuint index,
+                                                              GLsizei bufsize,
+                                                              GLsizei* length,
+                                                              GLint* size,
+                                                              GLenum* type,
+                                                              char* name) {
+  MakeFunctionUnique("glGetActiveUniform");
+  interface_->GetActiveUniform(program, index, bufsize, length, size, type,
+                               name);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetActiveUniformBlockName(GLuint program,
+                                                  GLuint uniformBlockIndex,
+                                                  GLsizei bufSize,
+                                                  GLsizei* length,
+                                                  char* uniformBlockName) {
+  MakeFunctionUnique("glGetActiveUniformBlockName");
+  interface_->GetActiveUniformBlockName(program, uniformBlockIndex, bufSize,
+                                        length, uniformBlockName);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetActiveUniformBlockiv(GLuint program,
+                                                GLuint uniformBlockIndex,
+                                                GLenum pname,
+                                                GLint* params) {
+  MakeFunctionUnique("glGetActiveUniformBlockiv");
+  interface_->GetActiveUniformBlockiv(program, uniformBlockIndex, pname,
+                                      params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetActiveUniformsiv(GLuint program,
+                                            GLsizei uniformCount,
+                                            const GLuint* uniformIndices,
+                                            GLenum pname,
+                                            GLint* params) {
+  MakeFunctionUnique("glGetActiveUniformsiv");
+  interface_->GetActiveUniformsiv(program, uniformCount, uniformIndices, pname,
+                                  params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetAttachedShaders(GLuint program,
+                                           GLsizei maxcount,
+                                           GLsizei* count,
+                                           GLuint* shaders) {
+  MakeFunctionUnique("glGetAttachedShaders");
+  interface_->GetAttachedShaders(program, maxcount, count, shaders);
+}
+
+GLint GL_BINDING_CALL
+MockGLInterface::Mock_glGetAttribLocation(GLuint program, const char* name) {
+  MakeFunctionUnique("glGetAttribLocation");
+  return interface_->GetAttribLocation(program, name);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetBooleanv(GLenum pname, GLboolean* params) {
+  MakeFunctionUnique("glGetBooleanv");
+  interface_->GetBooleanv(pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetBufferParameteriv(GLenum target,
+                                             GLenum pname,
+                                             GLint* params) {
+  MakeFunctionUnique("glGetBufferParameteriv");
+  interface_->GetBufferParameteriv(target, pname, params);
+}
+
+GLenum GL_BINDING_CALL MockGLInterface::Mock_glGetError(void) {
+  MakeFunctionUnique("glGetError");
+  return interface_->GetError();
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetFenceivNV(GLuint fence,
+                                                          GLenum pname,
+                                                          GLint* params) {
+  MakeFunctionUnique("glGetFenceivNV");
+  interface_->GetFenceivNV(fence, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetFloatv(GLenum pname, GLfloat* params) {
+  MakeFunctionUnique("glGetFloatv");
+  interface_->GetFloatv(pname, params);
+}
+
+GLint GL_BINDING_CALL
+MockGLInterface::Mock_glGetFragDataLocation(GLuint program, const char* name) {
+  MakeFunctionUnique("glGetFragDataLocation");
+  return interface_->GetFragDataLocation(program, name);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetFramebufferAttachmentParameteriv(GLenum target,
+                                                            GLenum attachment,
+                                                            GLenum pname,
+                                                            GLint* params) {
+  MakeFunctionUnique("glGetFramebufferAttachmentParameteriv");
+  interface_->GetFramebufferAttachmentParameterivEXT(target, attachment, pname,
+                                                     params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetFramebufferAttachmentParameterivEXT(
+    GLenum target,
+    GLenum attachment,
+    GLenum pname,
+    GLint* params) {
+  MakeFunctionUnique("glGetFramebufferAttachmentParameterivEXT");
+  interface_->GetFramebufferAttachmentParameterivEXT(target, attachment, pname,
+                                                     params);
+}
+
+GLenum GL_BINDING_CALL MockGLInterface::Mock_glGetGraphicsResetStatus(void) {
+  MakeFunctionUnique("glGetGraphicsResetStatus");
+  return interface_->GetGraphicsResetStatusARB();
+}
+
+GLenum GL_BINDING_CALL MockGLInterface::Mock_glGetGraphicsResetStatusARB(void) {
+  MakeFunctionUnique("glGetGraphicsResetStatusARB");
+  return interface_->GetGraphicsResetStatusARB();
+}
+
+GLenum GL_BINDING_CALL MockGLInterface::Mock_glGetGraphicsResetStatusEXT(void) {
+  MakeFunctionUnique("glGetGraphicsResetStatusEXT");
+  return interface_->GetGraphicsResetStatusARB();
+}
+
+GLenum GL_BINDING_CALL MockGLInterface::Mock_glGetGraphicsResetStatusKHR(void) {
+  MakeFunctionUnique("glGetGraphicsResetStatusKHR");
+  return interface_->GetGraphicsResetStatusARB();
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetInteger64i_v(GLenum target,
+                                                             GLuint index,
+                                                             GLint64* data) {
+  MakeFunctionUnique("glGetInteger64i_v");
+  interface_->GetInteger64i_v(target, index, data);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetInteger64v(GLenum pname, GLint64* params) {
+  MakeFunctionUnique("glGetInteger64v");
+  interface_->GetInteger64v(pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetIntegeri_v(GLenum target,
+                                                           GLuint index,
+                                                           GLint* data) {
+  MakeFunctionUnique("glGetIntegeri_v");
+  interface_->GetIntegeri_v(target, index, data);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetIntegerv(GLenum pname, GLint* params) {
+  MakeFunctionUnique("glGetIntegerv");
+  interface_->GetIntegerv(pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetInternalformativ(GLenum target,
+                                            GLenum internalformat,
+                                            GLenum pname,
+                                            GLsizei bufSize,
+                                            GLint* params) {
+  MakeFunctionUnique("glGetInternalformativ");
+  interface_->GetInternalformativ(target, internalformat, pname, bufSize,
+                                  params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetProgramBinary(GLuint program,
+                                         GLsizei bufSize,
+                                         GLsizei* length,
+                                         GLenum* binaryFormat,
+                                         GLvoid* binary) {
+  MakeFunctionUnique("glGetProgramBinary");
+  interface_->GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetProgramBinaryOES(GLuint program,
+                                            GLsizei bufSize,
+                                            GLsizei* length,
+                                            GLenum* binaryFormat,
+                                            GLvoid* binary) {
+  MakeFunctionUnique("glGetProgramBinaryOES");
+  interface_->GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetProgramInfoLog(GLuint program,
+                                                               GLsizei bufsize,
+                                                               GLsizei* length,
+                                                               char* infolog) {
+  MakeFunctionUnique("glGetProgramInfoLog");
+  interface_->GetProgramInfoLog(program, bufsize, length, infolog);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetProgramiv(GLuint program,
+                                                          GLenum pname,
+                                                          GLint* params) {
+  MakeFunctionUnique("glGetProgramiv");
+  interface_->GetProgramiv(program, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetQueryObjecti64v(GLuint id,
+                                           GLenum pname,
+                                           GLint64* params) {
+  MakeFunctionUnique("glGetQueryObjecti64v");
+  interface_->GetQueryObjecti64v(id, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetQueryObjectiv(GLuint id,
+                                                              GLenum pname,
+                                                              GLint* params) {
+  MakeFunctionUnique("glGetQueryObjectiv");
+  interface_->GetQueryObjectiv(id, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetQueryObjectivARB(GLuint id,
+                                            GLenum pname,
+                                            GLint* params) {
+  MakeFunctionUnique("glGetQueryObjectivARB");
+  interface_->GetQueryObjectivARB(id, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetQueryObjectivEXT(GLuint id,
+                                            GLenum pname,
+                                            GLint* params) {
+  MakeFunctionUnique("glGetQueryObjectivEXT");
+  interface_->GetQueryObjectivARB(id, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetQueryObjectui64v(GLuint id,
+                                            GLenum pname,
+                                            GLuint64* params) {
+  MakeFunctionUnique("glGetQueryObjectui64v");
+  interface_->GetQueryObjectui64v(id, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetQueryObjectui64vEXT(GLuint id,
+                                               GLenum pname,
+                                               GLuint64* params) {
+  MakeFunctionUnique("glGetQueryObjectui64vEXT");
+  interface_->GetQueryObjectui64v(id, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetQueryObjectuiv(GLuint id,
+                                                               GLenum pname,
+                                                               GLuint* params) {
+  MakeFunctionUnique("glGetQueryObjectuiv");
+  interface_->GetQueryObjectuiv(id, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetQueryObjectuivARB(GLuint id,
+                                             GLenum pname,
+                                             GLuint* params) {
+  MakeFunctionUnique("glGetQueryObjectuivARB");
+  interface_->GetQueryObjectuivARB(id, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetQueryObjectuivEXT(GLuint id,
+                                             GLenum pname,
+                                             GLuint* params) {
+  MakeFunctionUnique("glGetQueryObjectuivEXT");
+  interface_->GetQueryObjectuivARB(id, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetQueryiv(GLenum target, GLenum pname, GLint* params) {
+  MakeFunctionUnique("glGetQueryiv");
+  interface_->GetQueryiv(target, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetQueryivARB(GLenum target,
+                                                           GLenum pname,
+                                                           GLint* params) {
+  MakeFunctionUnique("glGetQueryivARB");
+  interface_->GetQueryivARB(target, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetQueryivEXT(GLenum target,
+                                                           GLenum pname,
+                                                           GLint* params) {
+  MakeFunctionUnique("glGetQueryivEXT");
+  interface_->GetQueryivARB(target, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetRenderbufferParameteriv(GLenum target,
+                                                   GLenum pname,
+                                                   GLint* params) {
+  MakeFunctionUnique("glGetRenderbufferParameteriv");
+  interface_->GetRenderbufferParameterivEXT(target, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetRenderbufferParameterivEXT(GLenum target,
+                                                      GLenum pname,
+                                                      GLint* params) {
+  MakeFunctionUnique("glGetRenderbufferParameterivEXT");
+  interface_->GetRenderbufferParameterivEXT(target, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetSamplerParameterfv(GLuint sampler,
+                                              GLenum pname,
+                                              GLfloat* params) {
+  MakeFunctionUnique("glGetSamplerParameterfv");
+  interface_->GetSamplerParameterfv(sampler, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetSamplerParameteriv(GLuint sampler,
+                                              GLenum pname,
+                                              GLint* params) {
+  MakeFunctionUnique("glGetSamplerParameteriv");
+  interface_->GetSamplerParameteriv(sampler, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetShaderInfoLog(GLuint shader,
+                                                              GLsizei bufsize,
+                                                              GLsizei* length,
+                                                              char* infolog) {
+  MakeFunctionUnique("glGetShaderInfoLog");
+  interface_->GetShaderInfoLog(shader, bufsize, length, infolog);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetShaderPrecisionFormat(GLenum shadertype,
+                                                 GLenum precisiontype,
+                                                 GLint* range,
+                                                 GLint* precision) {
+  MakeFunctionUnique("glGetShaderPrecisionFormat");
+  interface_->GetShaderPrecisionFormat(shadertype, precisiontype, range,
+                                       precision);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetShaderSource(GLuint shader,
+                                                             GLsizei bufsize,
+                                                             GLsizei* length,
+                                                             char* source) {
+  MakeFunctionUnique("glGetShaderSource");
+  interface_->GetShaderSource(shader, bufsize, length, source);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetShaderiv(GLuint shader,
+                                                         GLenum pname,
+                                                         GLint* params) {
+  MakeFunctionUnique("glGetShaderiv");
+  interface_->GetShaderiv(shader, pname, params);
+}
+
+const GLubyte* GL_BINDING_CALL MockGLInterface::Mock_glGetString(GLenum name) {
+  MakeFunctionUnique("glGetString");
+  return interface_->GetString(name);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetSynciv(GLsync sync,
+                                                       GLenum pname,
+                                                       GLsizei bufSize,
+                                                       GLsizei* length,
+                                                       GLint* values) {
+  MakeFunctionUnique("glGetSynciv");
+  interface_->GetSynciv(sync, pname, bufSize, length, values);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetTexLevelParameterfv(GLenum target,
+                                               GLint level,
+                                               GLenum pname,
+                                               GLfloat* params) {
+  MakeFunctionUnique("glGetTexLevelParameterfv");
+  interface_->GetTexLevelParameterfv(target, level, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetTexLevelParameteriv(GLenum target,
+                                               GLint level,
+                                               GLenum pname,
+                                               GLint* params) {
+  MakeFunctionUnique("glGetTexLevelParameteriv");
+  interface_->GetTexLevelParameteriv(target, level, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetTexParameterfv(GLenum target,
+                                          GLenum pname,
+                                          GLfloat* params) {
+  MakeFunctionUnique("glGetTexParameterfv");
+  interface_->GetTexParameterfv(target, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetTexParameteriv(GLenum target,
+                                                               GLenum pname,
+                                                               GLint* params) {
+  MakeFunctionUnique("glGetTexParameteriv");
+  interface_->GetTexParameteriv(target, pname, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetTransformFeedbackVarying(GLuint program,
+                                                    GLuint index,
+                                                    GLsizei bufSize,
+                                                    GLsizei* length,
+                                                    GLenum* type,
+                                                    char* name) {
+  MakeFunctionUnique("glGetTransformFeedbackVarying");
+  interface_->GetTransformFeedbackVarying(program, index, bufSize, length, type,
+                                          name);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetTranslatedShaderSourceANGLE(GLuint shader,
+                                                       GLsizei bufsize,
+                                                       GLsizei* length,
+                                                       char* source) {
+  MakeFunctionUnique("glGetTranslatedShaderSourceANGLE");
+  interface_->GetTranslatedShaderSourceANGLE(shader, bufsize, length, source);
+}
+
+GLuint GL_BINDING_CALL
+MockGLInterface::Mock_glGetUniformBlockIndex(GLuint program,
+                                             const char* uniformBlockName) {
+  MakeFunctionUnique("glGetUniformBlockIndex");
+  return interface_->GetUniformBlockIndex(program, uniformBlockName);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetUniformIndices(GLuint program,
+                                          GLsizei uniformCount,
+                                          const char* const* uniformNames,
+                                          GLuint* uniformIndices) {
+  MakeFunctionUnique("glGetUniformIndices");
+  interface_->GetUniformIndices(program, uniformCount, uniformNames,
+                                uniformIndices);
+}
+
+GLint GL_BINDING_CALL
+MockGLInterface::Mock_glGetUniformLocation(GLuint program, const char* name) {
+  MakeFunctionUnique("glGetUniformLocation");
+  return interface_->GetUniformLocation(program, name);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetUniformfv(GLuint program,
+                                                          GLint location,
+                                                          GLfloat* params) {
+  MakeFunctionUnique("glGetUniformfv");
+  interface_->GetUniformfv(program, location, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetUniformiv(GLuint program,
+                                                          GLint location,
+                                                          GLint* params) {
+  MakeFunctionUnique("glGetUniformiv");
+  interface_->GetUniformiv(program, location, params);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetVertexAttribPointerv(GLuint index,
+                                                GLenum pname,
+                                                void** pointer) {
+  MakeFunctionUnique("glGetVertexAttribPointerv");
+  interface_->GetVertexAttribPointerv(index, pname, pointer);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glGetVertexAttribfv(GLuint index,
+                                          GLenum pname,
+                                          GLfloat* params) {
+  MakeFunctionUnique("glGetVertexAttribfv");
+  interface_->GetVertexAttribfv(index, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glGetVertexAttribiv(GLuint index,
+                                                               GLenum pname,
+                                                               GLint* params) {
+  MakeFunctionUnique("glGetVertexAttribiv");
+  interface_->GetVertexAttribiv(index, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glHint(GLenum target, GLenum mode) {
+  MakeFunctionUnique("glHint");
+  interface_->Hint(target, mode);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glInsertEventMarkerEXT(GLsizei length,
+                                             const char* marker) {
+  MakeFunctionUnique("glInsertEventMarkerEXT");
+  interface_->InsertEventMarkerEXT(length, marker);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glInvalidateFramebuffer(GLenum target,
+                                              GLsizei numAttachments,
+                                              const GLenum* attachments) {
+  MakeFunctionUnique("glInvalidateFramebuffer");
+  interface_->InvalidateFramebuffer(target, numAttachments, attachments);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glInvalidateSubFramebuffer(GLenum target,
+                                                 GLsizei numAttachments,
+                                                 const GLenum* attachments,
+                                                 GLint x,
+                                                 GLint y,
+                                                 GLint width,
+                                                 GLint height) {
+  MakeFunctionUnique("glInvalidateSubFramebuffer");
+  interface_->InvalidateSubFramebuffer(target, numAttachments, attachments, x,
+                                       y, width, height);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsBuffer(GLuint buffer) {
+  MakeFunctionUnique("glIsBuffer");
+  return interface_->IsBuffer(buffer);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsEnabled(GLenum cap) {
+  MakeFunctionUnique("glIsEnabled");
+  return interface_->IsEnabled(cap);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsFenceAPPLE(GLuint fence) {
+  MakeFunctionUnique("glIsFenceAPPLE");
+  return interface_->IsFenceAPPLE(fence);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsFenceNV(GLuint fence) {
+  MakeFunctionUnique("glIsFenceNV");
+  return interface_->IsFenceNV(fence);
+}
+
+GLboolean GL_BINDING_CALL
+MockGLInterface::Mock_glIsFramebuffer(GLuint framebuffer) {
+  MakeFunctionUnique("glIsFramebuffer");
+  return interface_->IsFramebufferEXT(framebuffer);
+}
+
+GLboolean GL_BINDING_CALL
+MockGLInterface::Mock_glIsFramebufferEXT(GLuint framebuffer) {
+  MakeFunctionUnique("glIsFramebufferEXT");
+  return interface_->IsFramebufferEXT(framebuffer);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsProgram(GLuint program) {
+  MakeFunctionUnique("glIsProgram");
+  return interface_->IsProgram(program);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsQuery(GLuint query) {
+  MakeFunctionUnique("glIsQuery");
+  return interface_->IsQuery(query);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsQueryARB(GLuint query) {
+  MakeFunctionUnique("glIsQueryARB");
+  return interface_->IsQueryARB(query);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsQueryEXT(GLuint query) {
+  MakeFunctionUnique("glIsQueryEXT");
+  return interface_->IsQueryARB(query);
+}
+
+GLboolean GL_BINDING_CALL
+MockGLInterface::Mock_glIsRenderbuffer(GLuint renderbuffer) {
+  MakeFunctionUnique("glIsRenderbuffer");
+  return interface_->IsRenderbufferEXT(renderbuffer);
+}
+
+GLboolean GL_BINDING_CALL
+MockGLInterface::Mock_glIsRenderbufferEXT(GLuint renderbuffer) {
+  MakeFunctionUnique("glIsRenderbufferEXT");
+  return interface_->IsRenderbufferEXT(renderbuffer);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsSampler(GLuint sampler) {
+  MakeFunctionUnique("glIsSampler");
+  return interface_->IsSampler(sampler);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsShader(GLuint shader) {
+  MakeFunctionUnique("glIsShader");
+  return interface_->IsShader(shader);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsSync(GLsync sync) {
+  MakeFunctionUnique("glIsSync");
+  return interface_->IsSync(sync);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsTexture(GLuint texture) {
+  MakeFunctionUnique("glIsTexture");
+  return interface_->IsTexture(texture);
+}
+
+GLboolean GL_BINDING_CALL
+MockGLInterface::Mock_glIsTransformFeedback(GLuint id) {
+  MakeFunctionUnique("glIsTransformFeedback");
+  return interface_->IsTransformFeedback(id);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsVertexArray(GLuint array) {
+  MakeFunctionUnique("glIsVertexArray");
+  return interface_->IsVertexArrayOES(array);
+}
+
+GLboolean GL_BINDING_CALL
+MockGLInterface::Mock_glIsVertexArrayAPPLE(GLuint array) {
+  MakeFunctionUnique("glIsVertexArrayAPPLE");
+  return interface_->IsVertexArrayOES(array);
+}
+
+GLboolean GL_BINDING_CALL
+MockGLInterface::Mock_glIsVertexArrayOES(GLuint array) {
+  MakeFunctionUnique("glIsVertexArrayOES");
+  return interface_->IsVertexArrayOES(array);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glLineWidth(GLfloat width) {
+  MakeFunctionUnique("glLineWidth");
+  interface_->LineWidth(width);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glLinkProgram(GLuint program) {
+  MakeFunctionUnique("glLinkProgram");
+  interface_->LinkProgram(program);
+}
+
+void* GL_BINDING_CALL
+MockGLInterface::Mock_glMapBuffer(GLenum target, GLenum access) {
+  MakeFunctionUnique("glMapBuffer");
+  return interface_->MapBuffer(target, access);
+}
+
+void* GL_BINDING_CALL
+MockGLInterface::Mock_glMapBufferOES(GLenum target, GLenum access) {
+  MakeFunctionUnique("glMapBufferOES");
+  return interface_->MapBuffer(target, access);
+}
+
+void* GL_BINDING_CALL
+MockGLInterface::Mock_glMapBufferRange(GLenum target,
+                                       GLintptr offset,
+                                       GLsizeiptr length,
+                                       GLbitfield access) {
+  MakeFunctionUnique("glMapBufferRange");
+  return interface_->MapBufferRange(target, offset, length, access);
+}
+
+void* GL_BINDING_CALL
+MockGLInterface::Mock_glMapBufferRangeEXT(GLenum target,
+                                          GLintptr offset,
+                                          GLsizeiptr length,
+                                          GLbitfield access) {
+  MakeFunctionUnique("glMapBufferRangeEXT");
+  return interface_->MapBufferRange(target, offset, length, access);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glMatrixLoadIdentityEXT(GLenum matrixMode) {
+  MakeFunctionUnique("glMatrixLoadIdentityEXT");
+  interface_->MatrixLoadIdentityEXT(matrixMode);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glMatrixLoadfEXT(GLenum matrixMode, const GLfloat* m) {
+  MakeFunctionUnique("glMatrixLoadfEXT");
+  interface_->MatrixLoadfEXT(matrixMode, m);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glPauseTransformFeedback(void) {
+  MakeFunctionUnique("glPauseTransformFeedback");
+  interface_->PauseTransformFeedback();
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glPixelStorei(GLenum pname, GLint param) {
+  MakeFunctionUnique("glPixelStorei");
+  interface_->PixelStorei(pname, param);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glPointParameteri(GLenum pname, GLint param) {
+  MakeFunctionUnique("glPointParameteri");
+  interface_->PointParameteri(pname, param);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glPolygonOffset(GLfloat factor, GLfloat units) {
+  MakeFunctionUnique("glPolygonOffset");
+  interface_->PolygonOffset(factor, units);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glPopGroupMarkerEXT(void) {
+  MakeFunctionUnique("glPopGroupMarkerEXT");
+  interface_->PopGroupMarkerEXT();
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glProgramBinary(GLuint program,
+                                                           GLenum binaryFormat,
+                                                           const GLvoid* binary,
+                                                           GLsizei length) {
+  MakeFunctionUnique("glProgramBinary");
+  interface_->ProgramBinary(program, binaryFormat, binary, length);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glProgramBinaryOES(GLuint program,
+                                         GLenum binaryFormat,
+                                         const GLvoid* binary,
+                                         GLsizei length) {
+  MakeFunctionUnique("glProgramBinaryOES");
+  interface_->ProgramBinary(program, binaryFormat, binary, length);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glProgramParameteri(GLuint program,
+                                                               GLenum pname,
+                                                               GLint value) {
+  MakeFunctionUnique("glProgramParameteri");
+  interface_->ProgramParameteri(program, pname, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glPushGroupMarkerEXT(GLsizei length, const char* marker) {
+  MakeFunctionUnique("glPushGroupMarkerEXT");
+  interface_->PushGroupMarkerEXT(length, marker);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glQueryCounter(GLuint id, GLenum target) {
+  MakeFunctionUnique("glQueryCounter");
+  interface_->QueryCounter(id, target);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glQueryCounterEXT(GLuint id, GLenum target) {
+  MakeFunctionUnique("glQueryCounterEXT");
+  interface_->QueryCounter(id, target);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glReadBuffer(GLenum src) {
+  MakeFunctionUnique("glReadBuffer");
+  interface_->ReadBuffer(src);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glReadPixels(GLint x,
+                                                        GLint y,
+                                                        GLsizei width,
+                                                        GLsizei height,
+                                                        GLenum format,
+                                                        GLenum type,
+                                                        void* pixels) {
+  MakeFunctionUnique("glReadPixels");
+  interface_->ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glReleaseShaderCompiler(void) {
+  MakeFunctionUnique("glReleaseShaderCompiler");
+  interface_->ReleaseShaderCompiler();
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glRenderbufferStorage(GLenum target,
+                                            GLenum internalformat,
+                                            GLsizei width,
+                                            GLsizei height) {
+  MakeFunctionUnique("glRenderbufferStorage");
+  interface_->RenderbufferStorageEXT(target, internalformat, width, height);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glRenderbufferStorageEXT(GLenum target,
+                                               GLenum internalformat,
+                                               GLsizei width,
+                                               GLsizei height) {
+  MakeFunctionUnique("glRenderbufferStorageEXT");
+  interface_->RenderbufferStorageEXT(target, internalformat, width, height);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glRenderbufferStorageMultisample(GLenum target,
+                                                       GLsizei samples,
+                                                       GLenum internalformat,
+                                                       GLsizei width,
+                                                       GLsizei height) {
+  MakeFunctionUnique("glRenderbufferStorageMultisample");
+  interface_->RenderbufferStorageMultisampleEXT(target, samples, internalformat,
+                                                width, height);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glRenderbufferStorageMultisampleANGLE(
+    GLenum target,
+    GLsizei samples,
+    GLenum internalformat,
+    GLsizei width,
+    GLsizei height) {
+  MakeFunctionUnique("glRenderbufferStorageMultisampleANGLE");
+  interface_->RenderbufferStorageMultisampleANGLE(
+      target, samples, internalformat, width, height);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glRenderbufferStorageMultisampleEXT(GLenum target,
+                                                          GLsizei samples,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height) {
+  MakeFunctionUnique("glRenderbufferStorageMultisampleEXT");
+  interface_->RenderbufferStorageMultisampleEXT(target, samples, internalformat,
+                                                width, height);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glRenderbufferStorageMultisampleIMG(GLenum target,
+                                                          GLsizei samples,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height) {
+  MakeFunctionUnique("glRenderbufferStorageMultisampleIMG");
+  interface_->RenderbufferStorageMultisampleIMG(target, samples, internalformat,
+                                                width, height);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glResumeTransformFeedback(void) {
+  MakeFunctionUnique("glResumeTransformFeedback");
+  interface_->ResumeTransformFeedback();
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glSampleCoverage(GLclampf value, GLboolean invert) {
+  MakeFunctionUnique("glSampleCoverage");
+  interface_->SampleCoverage(value, invert);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glSamplerParameterf(GLuint sampler,
+                                                               GLenum pname,
+                                                               GLfloat param) {
+  MakeFunctionUnique("glSamplerParameterf");
+  interface_->SamplerParameterf(sampler, pname, param);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glSamplerParameterfv(GLuint sampler,
+                                           GLenum pname,
+                                           const GLfloat* params) {
+  MakeFunctionUnique("glSamplerParameterfv");
+  interface_->SamplerParameterfv(sampler, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glSamplerParameteri(GLuint sampler,
+                                                               GLenum pname,
+                                                               GLint param) {
+  MakeFunctionUnique("glSamplerParameteri");
+  interface_->SamplerParameteri(sampler, pname, param);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glSamplerParameteriv(GLuint sampler,
+                                           GLenum pname,
+                                           const GLint* params) {
+  MakeFunctionUnique("glSamplerParameteriv");
+  interface_->SamplerParameteriv(sampler, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glScissor(GLint x,
+                                                     GLint y,
+                                                     GLsizei width,
+                                                     GLsizei height) {
+  MakeFunctionUnique("glScissor");
+  interface_->Scissor(x, y, width, height);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glSetFenceAPPLE(GLuint fence) {
+  MakeFunctionUnique("glSetFenceAPPLE");
+  interface_->SetFenceAPPLE(fence);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glSetFenceNV(GLuint fence, GLenum condition) {
+  MakeFunctionUnique("glSetFenceNV");
+  interface_->SetFenceNV(fence, condition);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glShaderBinary(GLsizei n,
+                                                          const GLuint* shaders,
+                                                          GLenum binaryformat,
+                                                          const void* binary,
+                                                          GLsizei length) {
+  MakeFunctionUnique("glShaderBinary");
+  interface_->ShaderBinary(n, shaders, binaryformat, binary, length);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glShaderSource(GLuint shader,
+                                     GLsizei count,
+                                     const char* const* str,
+                                     const GLint* length) {
+  MakeFunctionUnique("glShaderSource");
+  interface_->ShaderSource(shader, count, str, length);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glStencilFunc(GLenum func, GLint ref, GLuint mask) {
+  MakeFunctionUnique("glStencilFunc");
+  interface_->StencilFunc(func, ref, mask);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glStencilFuncSeparate(GLenum face,
+                                                                 GLenum func,
+                                                                 GLint ref,
+                                                                 GLuint mask) {
+  MakeFunctionUnique("glStencilFuncSeparate");
+  interface_->StencilFuncSeparate(face, func, ref, mask);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glStencilMask(GLuint mask) {
+  MakeFunctionUnique("glStencilMask");
+  interface_->StencilMask(mask);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glStencilMaskSeparate(GLenum face, GLuint mask) {
+  MakeFunctionUnique("glStencilMaskSeparate");
+  interface_->StencilMaskSeparate(face, mask);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) {
+  MakeFunctionUnique("glStencilOp");
+  interface_->StencilOp(fail, zfail, zpass);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glStencilOpSeparate(GLenum face,
+                                                               GLenum fail,
+                                                               GLenum zfail,
+                                                               GLenum zpass) {
+  MakeFunctionUnique("glStencilOpSeparate");
+  interface_->StencilOpSeparate(face, fail, zfail, zpass);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glTestFenceAPPLE(GLuint fence) {
+  MakeFunctionUnique("glTestFenceAPPLE");
+  return interface_->TestFenceAPPLE(fence);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glTestFenceNV(GLuint fence) {
+  MakeFunctionUnique("glTestFenceNV");
+  return interface_->TestFenceNV(fence);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glTexImage2D(GLenum target,
+                                                        GLint level,
+                                                        GLint internalformat,
+                                                        GLsizei width,
+                                                        GLsizei height,
+                                                        GLint border,
+                                                        GLenum format,
+                                                        GLenum type,
+                                                        const void* pixels) {
+  MakeFunctionUnique("glTexImage2D");
+  interface_->TexImage2D(target, level, internalformat, width, height, border,
+                         format, type, pixels);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glTexImage3D(GLenum target,
+                                                        GLint level,
+                                                        GLint internalformat,
+                                                        GLsizei width,
+                                                        GLsizei height,
+                                                        GLsizei depth,
+                                                        GLint border,
+                                                        GLenum format,
+                                                        GLenum type,
+                                                        const void* pixels) {
+  MakeFunctionUnique("glTexImage3D");
+  interface_->TexImage3D(target, level, internalformat, width, height, depth,
+                         border, format, type, pixels);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glTexParameterf(GLenum target,
+                                                           GLenum pname,
+                                                           GLfloat param) {
+  MakeFunctionUnique("glTexParameterf");
+  interface_->TexParameterf(target, pname, param);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glTexParameterfv(GLenum target,
+                                       GLenum pname,
+                                       const GLfloat* params) {
+  MakeFunctionUnique("glTexParameterfv");
+  interface_->TexParameterfv(target, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glTexParameteri(GLenum target,
+                                                           GLenum pname,
+                                                           GLint param) {
+  MakeFunctionUnique("glTexParameteri");
+  interface_->TexParameteri(target, pname, param);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glTexParameteriv(GLenum target,
+                                       GLenum pname,
+                                       const GLint* params) {
+  MakeFunctionUnique("glTexParameteriv");
+  interface_->TexParameteriv(target, pname, params);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glTexStorage2D(GLenum target,
+                                                          GLsizei levels,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height) {
+  MakeFunctionUnique("glTexStorage2D");
+  interface_->TexStorage2DEXT(target, levels, internalformat, width, height);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glTexStorage2DEXT(GLenum target,
+                                        GLsizei levels,
+                                        GLenum internalformat,
+                                        GLsizei width,
+                                        GLsizei height) {
+  MakeFunctionUnique("glTexStorage2DEXT");
+  interface_->TexStorage2DEXT(target, levels, internalformat, width, height);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glTexStorage3D(GLenum target,
+                                                          GLsizei levels,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height,
+                                                          GLsizei depth) {
+  MakeFunctionUnique("glTexStorage3D");
+  interface_->TexStorage3D(target, levels, internalformat, width, height,
+                           depth);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glTexSubImage2D(GLenum target,
+                                                           GLint level,
+                                                           GLint xoffset,
+                                                           GLint yoffset,
+                                                           GLsizei width,
+                                                           GLsizei height,
+                                                           GLenum format,
+                                                           GLenum type,
+                                                           const void* pixels) {
+  MakeFunctionUnique("glTexSubImage2D");
+  interface_->TexSubImage2D(target, level, xoffset, yoffset, width, height,
+                            format, type, pixels);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glTransformFeedbackVaryings(GLuint program,
+                                                  GLsizei count,
+                                                  const char* const* varyings,
+                                                  GLenum bufferMode) {
+  MakeFunctionUnique("glTransformFeedbackVaryings");
+  interface_->TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniform1f(GLint location, GLfloat x) {
+  MakeFunctionUnique("glUniform1f");
+  interface_->Uniform1f(location, x);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform1fv(GLint location,
+                                                        GLsizei count,
+                                                        const GLfloat* v) {
+  MakeFunctionUnique("glUniform1fv");
+  interface_->Uniform1fv(location, count, v);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniform1i(GLint location, GLint x) {
+  MakeFunctionUnique("glUniform1i");
+  interface_->Uniform1i(location, x);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform1iv(GLint location,
+                                                        GLsizei count,
+                                                        const GLint* v) {
+  MakeFunctionUnique("glUniform1iv");
+  interface_->Uniform1iv(location, count, v);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniform1ui(GLint location, GLuint v0) {
+  MakeFunctionUnique("glUniform1ui");
+  interface_->Uniform1ui(location, v0);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform1uiv(GLint location,
+                                                         GLsizei count,
+                                                         const GLuint* v) {
+  MakeFunctionUnique("glUniform1uiv");
+  interface_->Uniform1uiv(location, count, v);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniform2f(GLint location, GLfloat x, GLfloat y) {
+  MakeFunctionUnique("glUniform2f");
+  interface_->Uniform2f(location, x, y);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform2fv(GLint location,
+                                                        GLsizei count,
+                                                        const GLfloat* v) {
+  MakeFunctionUnique("glUniform2fv");
+  interface_->Uniform2fv(location, count, v);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniform2i(GLint location, GLint x, GLint y) {
+  MakeFunctionUnique("glUniform2i");
+  interface_->Uniform2i(location, x, y);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform2iv(GLint location,
+                                                        GLsizei count,
+                                                        const GLint* v) {
+  MakeFunctionUnique("glUniform2iv");
+  interface_->Uniform2iv(location, count, v);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniform2ui(GLint location, GLuint v0, GLuint v1) {
+  MakeFunctionUnique("glUniform2ui");
+  interface_->Uniform2ui(location, v0, v1);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform2uiv(GLint location,
+                                                         GLsizei count,
+                                                         const GLuint* v) {
+  MakeFunctionUnique("glUniform2uiv");
+  interface_->Uniform2uiv(location, count, v);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform3f(GLint location,
+                                                       GLfloat x,
+                                                       GLfloat y,
+                                                       GLfloat z) {
+  MakeFunctionUnique("glUniform3f");
+  interface_->Uniform3f(location, x, y, z);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform3fv(GLint location,
+                                                        GLsizei count,
+                                                        const GLfloat* v) {
+  MakeFunctionUnique("glUniform3fv");
+  interface_->Uniform3fv(location, count, v);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniform3i(GLint location, GLint x, GLint y, GLint z) {
+  MakeFunctionUnique("glUniform3i");
+  interface_->Uniform3i(location, x, y, z);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform3iv(GLint location,
+                                                        GLsizei count,
+                                                        const GLint* v) {
+  MakeFunctionUnique("glUniform3iv");
+  interface_->Uniform3iv(location, count, v);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform3ui(GLint location,
+                                                        GLuint v0,
+                                                        GLuint v1,
+                                                        GLuint v2) {
+  MakeFunctionUnique("glUniform3ui");
+  interface_->Uniform3ui(location, v0, v1, v2);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform3uiv(GLint location,
+                                                         GLsizei count,
+                                                         const GLuint* v) {
+  MakeFunctionUnique("glUniform3uiv");
+  interface_->Uniform3uiv(location, count, v);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform4f(GLint location,
+                                                       GLfloat x,
+                                                       GLfloat y,
+                                                       GLfloat z,
+                                                       GLfloat w) {
+  MakeFunctionUnique("glUniform4f");
+  interface_->Uniform4f(location, x, y, z, w);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform4fv(GLint location,
+                                                        GLsizei count,
+                                                        const GLfloat* v) {
+  MakeFunctionUnique("glUniform4fv");
+  interface_->Uniform4fv(location, count, v);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform4i(GLint location,
+                                                       GLint x,
+                                                       GLint y,
+                                                       GLint z,
+                                                       GLint w) {
+  MakeFunctionUnique("glUniform4i");
+  interface_->Uniform4i(location, x, y, z, w);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform4iv(GLint location,
+                                                        GLsizei count,
+                                                        const GLint* v) {
+  MakeFunctionUnique("glUniform4iv");
+  interface_->Uniform4iv(location, count, v);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform4ui(GLint location,
+                                                        GLuint v0,
+                                                        GLuint v1,
+                                                        GLuint v2,
+                                                        GLuint v3) {
+  MakeFunctionUnique("glUniform4ui");
+  interface_->Uniform4ui(location, v0, v1, v2, v3);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUniform4uiv(GLint location,
+                                                         GLsizei count,
+                                                         const GLuint* v) {
+  MakeFunctionUnique("glUniform4uiv");
+  interface_->Uniform4uiv(location, count, v);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformBlockBinding(GLuint program,
+                                            GLuint uniformBlockIndex,
+                                            GLuint uniformBlockBinding) {
+  MakeFunctionUnique("glUniformBlockBinding");
+  interface_->UniformBlockBinding(program, uniformBlockIndex,
+                                  uniformBlockBinding);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix2fv(GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix2fv");
+  interface_->UniformMatrix2fv(location, count, transpose, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix2x3fv(GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix2x3fv");
+  interface_->UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix2x4fv(GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix2x4fv");
+  interface_->UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix3fv(GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix3fv");
+  interface_->UniformMatrix3fv(location, count, transpose, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix3x2fv(GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix3x2fv");
+  interface_->UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix3x4fv(GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix3x4fv");
+  interface_->UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix4fv(GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix4fv");
+  interface_->UniformMatrix4fv(location, count, transpose, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix4x2fv(GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix4x2fv");
+  interface_->UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glUniformMatrix4x3fv(GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat* value) {
+  MakeFunctionUnique("glUniformMatrix4x3fv");
+  interface_->UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glUnmapBuffer(GLenum target) {
+  MakeFunctionUnique("glUnmapBuffer");
+  return interface_->UnmapBuffer(target);
+}
+
+GLboolean GL_BINDING_CALL
+MockGLInterface::Mock_glUnmapBufferOES(GLenum target) {
+  MakeFunctionUnique("glUnmapBufferOES");
+  return interface_->UnmapBuffer(target);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glUseProgram(GLuint program) {
+  MakeFunctionUnique("glUseProgram");
+  interface_->UseProgram(program);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glValidateProgram(GLuint program) {
+  MakeFunctionUnique("glValidateProgram");
+  interface_->ValidateProgram(program);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttrib1f(GLuint indx, GLfloat x) {
+  MakeFunctionUnique("glVertexAttrib1f");
+  interface_->VertexAttrib1f(indx, x);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttrib1fv(GLuint indx, const GLfloat* values) {
+  MakeFunctionUnique("glVertexAttrib1fv");
+  interface_->VertexAttrib1fv(indx, values);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) {
+  MakeFunctionUnique("glVertexAttrib2f");
+  interface_->VertexAttrib2f(indx, x, y);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttrib2fv(GLuint indx, const GLfloat* values) {
+  MakeFunctionUnique("glVertexAttrib2fv");
+  interface_->VertexAttrib2fv(indx, values);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glVertexAttrib3f(GLuint indx,
+                                                            GLfloat x,
+                                                            GLfloat y,
+                                                            GLfloat z) {
+  MakeFunctionUnique("glVertexAttrib3f");
+  interface_->VertexAttrib3f(indx, x, y, z);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttrib3fv(GLuint indx, const GLfloat* values) {
+  MakeFunctionUnique("glVertexAttrib3fv");
+  interface_->VertexAttrib3fv(indx, values);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glVertexAttrib4f(GLuint indx,
+                                                            GLfloat x,
+                                                            GLfloat y,
+                                                            GLfloat z,
+                                                            GLfloat w) {
+  MakeFunctionUnique("glVertexAttrib4f");
+  interface_->VertexAttrib4f(indx, x, y, z, w);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttrib4fv(GLuint indx, const GLfloat* values) {
+  MakeFunctionUnique("glVertexAttrib4fv");
+  interface_->VertexAttrib4fv(indx, values);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttribDivisor(GLuint index, GLuint divisor) {
+  MakeFunctionUnique("glVertexAttribDivisor");
+  interface_->VertexAttribDivisorANGLE(index, divisor);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttribDivisorANGLE(GLuint index, GLuint divisor) {
+  MakeFunctionUnique("glVertexAttribDivisorANGLE");
+  interface_->VertexAttribDivisorANGLE(index, divisor);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttribDivisorARB(GLuint index, GLuint divisor) {
+  MakeFunctionUnique("glVertexAttribDivisorARB");
+  interface_->VertexAttribDivisorANGLE(index, divisor);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glVertexAttribI4i(GLuint indx,
+                                                             GLint x,
+                                                             GLint y,
+                                                             GLint z,
+                                                             GLint w) {
+  MakeFunctionUnique("glVertexAttribI4i");
+  interface_->VertexAttribI4i(indx, x, y, z, w);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttribI4iv(GLuint indx, const GLint* values) {
+  MakeFunctionUnique("glVertexAttribI4iv");
+  interface_->VertexAttribI4iv(indx, values);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glVertexAttribI4ui(GLuint indx,
+                                                              GLuint x,
+                                                              GLuint y,
+                                                              GLuint z,
+                                                              GLuint w) {
+  MakeFunctionUnique("glVertexAttribI4ui");
+  interface_->VertexAttribI4ui(indx, x, y, z, w);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttribI4uiv(GLuint indx, const GLuint* values) {
+  MakeFunctionUnique("glVertexAttribI4uiv");
+  interface_->VertexAttribI4uiv(indx, values);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttribIPointer(GLuint indx,
+                                             GLint size,
+                                             GLenum type,
+                                             GLsizei stride,
+                                             const void* ptr) {
+  MakeFunctionUnique("glVertexAttribIPointer");
+  interface_->VertexAttribIPointer(indx, size, type, stride, ptr);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glVertexAttribPointer(GLuint indx,
+                                            GLint size,
+                                            GLenum type,
+                                            GLboolean normalized,
+                                            GLsizei stride,
+                                            const void* ptr) {
+  MakeFunctionUnique("glVertexAttribPointer");
+  interface_->VertexAttribPointer(indx, size, type, normalized, stride, ptr);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glViewport(GLint x,
+                                                      GLint y,
+                                                      GLsizei width,
+                                                      GLsizei height) {
+  MakeFunctionUnique("glViewport");
+  interface_->Viewport(x, y, width, height);
+}
+
+GLenum GL_BINDING_CALL MockGLInterface::Mock_glWaitSync(GLsync sync,
+                                                        GLbitfield flags,
+                                                        GLuint64 timeout) {
+  MakeFunctionUnique("glWaitSync");
+  return interface_->WaitSync(sync, flags, timeout);
+}
+
+static void MockInvalidFunction() {
+  NOTREACHED();
+}
+
+void* GL_BINDING_CALL MockGLInterface::GetGLProcAddress(const char* name) {
+  if (strcmp(name, "glActiveTexture") == 0)
+    return reinterpret_cast<void*>(Mock_glActiveTexture);
+  if (strcmp(name, "glAttachShader") == 0)
+    return reinterpret_cast<void*>(Mock_glAttachShader);
+  if (strcmp(name, "glBeginQuery") == 0)
+    return reinterpret_cast<void*>(Mock_glBeginQuery);
+  if (strcmp(name, "glBeginQueryARB") == 0)
+    return reinterpret_cast<void*>(Mock_glBeginQueryARB);
+  if (strcmp(name, "glBeginQueryEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glBeginQueryEXT);
+  if (strcmp(name, "glBeginTransformFeedback") == 0)
+    return reinterpret_cast<void*>(Mock_glBeginTransformFeedback);
+  if (strcmp(name, "glBindAttribLocation") == 0)
+    return reinterpret_cast<void*>(Mock_glBindAttribLocation);
+  if (strcmp(name, "glBindBuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glBindBuffer);
+  if (strcmp(name, "glBindBufferBase") == 0)
+    return reinterpret_cast<void*>(Mock_glBindBufferBase);
+  if (strcmp(name, "glBindBufferRange") == 0)
+    return reinterpret_cast<void*>(Mock_glBindBufferRange);
+  if (strcmp(name, "glBindFragDataLocation") == 0)
+    return reinterpret_cast<void*>(Mock_glBindFragDataLocation);
+  if (strcmp(name, "glBindFragDataLocationIndexed") == 0)
+    return reinterpret_cast<void*>(Mock_glBindFragDataLocationIndexed);
+  if (strcmp(name, "glBindFramebuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glBindFramebuffer);
+  if (strcmp(name, "glBindFramebufferEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glBindFramebufferEXT);
+  if (strcmp(name, "glBindRenderbuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glBindRenderbuffer);
+  if (strcmp(name, "glBindRenderbufferEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glBindRenderbufferEXT);
+  if (strcmp(name, "glBindSampler") == 0)
+    return reinterpret_cast<void*>(Mock_glBindSampler);
+  if (strcmp(name, "glBindTexture") == 0)
+    return reinterpret_cast<void*>(Mock_glBindTexture);
+  if (strcmp(name, "glBindTransformFeedback") == 0)
+    return reinterpret_cast<void*>(Mock_glBindTransformFeedback);
+  if (strcmp(name, "glBindVertexArray") == 0)
+    return reinterpret_cast<void*>(Mock_glBindVertexArray);
+  if (strcmp(name, "glBindVertexArrayAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glBindVertexArrayAPPLE);
+  if (strcmp(name, "glBindVertexArrayOES") == 0)
+    return reinterpret_cast<void*>(Mock_glBindVertexArrayOES);
+  if (strcmp(name, "glBlendBarrierKHR") == 0)
+    return reinterpret_cast<void*>(Mock_glBlendBarrierKHR);
+  if (strcmp(name, "glBlendBarrierNV") == 0)
+    return reinterpret_cast<void*>(Mock_glBlendBarrierNV);
+  if (strcmp(name, "glBlendColor") == 0)
+    return reinterpret_cast<void*>(Mock_glBlendColor);
+  if (strcmp(name, "glBlendEquation") == 0)
+    return reinterpret_cast<void*>(Mock_glBlendEquation);
+  if (strcmp(name, "glBlendEquationSeparate") == 0)
+    return reinterpret_cast<void*>(Mock_glBlendEquationSeparate);
+  if (strcmp(name, "glBlendFunc") == 0)
+    return reinterpret_cast<void*>(Mock_glBlendFunc);
+  if (strcmp(name, "glBlendFuncSeparate") == 0)
+    return reinterpret_cast<void*>(Mock_glBlendFuncSeparate);
+  if (strcmp(name, "glBlitFramebuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glBlitFramebuffer);
+  if (strcmp(name, "glBlitFramebufferANGLE") == 0)
+    return reinterpret_cast<void*>(Mock_glBlitFramebufferANGLE);
+  if (strcmp(name, "glBlitFramebufferEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glBlitFramebufferEXT);
+  if (strcmp(name, "glBufferData") == 0)
+    return reinterpret_cast<void*>(Mock_glBufferData);
+  if (strcmp(name, "glBufferSubData") == 0)
+    return reinterpret_cast<void*>(Mock_glBufferSubData);
+  if (strcmp(name, "glCheckFramebufferStatus") == 0)
+    return reinterpret_cast<void*>(Mock_glCheckFramebufferStatus);
+  if (strcmp(name, "glCheckFramebufferStatusEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glCheckFramebufferStatusEXT);
+  if (strcmp(name, "glClear") == 0)
+    return reinterpret_cast<void*>(Mock_glClear);
+  if (strcmp(name, "glClearBufferfi") == 0)
+    return reinterpret_cast<void*>(Mock_glClearBufferfi);
+  if (strcmp(name, "glClearBufferfv") == 0)
+    return reinterpret_cast<void*>(Mock_glClearBufferfv);
+  if (strcmp(name, "glClearBufferiv") == 0)
+    return reinterpret_cast<void*>(Mock_glClearBufferiv);
+  if (strcmp(name, "glClearBufferuiv") == 0)
+    return reinterpret_cast<void*>(Mock_glClearBufferuiv);
+  if (strcmp(name, "glClearColor") == 0)
+    return reinterpret_cast<void*>(Mock_glClearColor);
+  if (strcmp(name, "glClearDepth") == 0)
+    return reinterpret_cast<void*>(Mock_glClearDepth);
+  if (strcmp(name, "glClearDepthf") == 0)
+    return reinterpret_cast<void*>(Mock_glClearDepthf);
+  if (strcmp(name, "glClearStencil") == 0)
+    return reinterpret_cast<void*>(Mock_glClearStencil);
+  if (strcmp(name, "glClientWaitSync") == 0)
+    return reinterpret_cast<void*>(Mock_glClientWaitSync);
+  if (strcmp(name, "glColorMask") == 0)
+    return reinterpret_cast<void*>(Mock_glColorMask);
+  if (strcmp(name, "glCompileShader") == 0)
+    return reinterpret_cast<void*>(Mock_glCompileShader);
+  if (strcmp(name, "glCompressedTexImage2D") == 0)
+    return reinterpret_cast<void*>(Mock_glCompressedTexImage2D);
+  if (strcmp(name, "glCompressedTexImage3D") == 0)
+    return reinterpret_cast<void*>(Mock_glCompressedTexImage3D);
+  if (strcmp(name, "glCompressedTexSubImage2D") == 0)
+    return reinterpret_cast<void*>(Mock_glCompressedTexSubImage2D);
+  if (strcmp(name, "glCopyBufferSubData") == 0)
+    return reinterpret_cast<void*>(Mock_glCopyBufferSubData);
+  if (strcmp(name, "glCopyTexImage2D") == 0)
+    return reinterpret_cast<void*>(Mock_glCopyTexImage2D);
+  if (strcmp(name, "glCopyTexSubImage2D") == 0)
+    return reinterpret_cast<void*>(Mock_glCopyTexSubImage2D);
+  if (strcmp(name, "glCopyTexSubImage3D") == 0)
+    return reinterpret_cast<void*>(Mock_glCopyTexSubImage3D);
+  if (strcmp(name, "glCreateProgram") == 0)
+    return reinterpret_cast<void*>(Mock_glCreateProgram);
+  if (strcmp(name, "glCreateShader") == 0)
+    return reinterpret_cast<void*>(Mock_glCreateShader);
+  if (strcmp(name, "glCullFace") == 0)
+    return reinterpret_cast<void*>(Mock_glCullFace);
+  if (strcmp(name, "glDeleteBuffers") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteBuffers);
+  if (strcmp(name, "glDeleteBuffersARB") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteBuffersARB);
+  if (strcmp(name, "glDeleteFencesAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteFencesAPPLE);
+  if (strcmp(name, "glDeleteFencesNV") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteFencesNV);
+  if (strcmp(name, "glDeleteFramebuffers") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteFramebuffers);
+  if (strcmp(name, "glDeleteFramebuffersEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteFramebuffersEXT);
+  if (strcmp(name, "glDeleteProgram") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteProgram);
+  if (strcmp(name, "glDeleteQueries") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteQueries);
+  if (strcmp(name, "glDeleteQueriesARB") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteQueriesARB);
+  if (strcmp(name, "glDeleteQueriesEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteQueriesEXT);
+  if (strcmp(name, "glDeleteRenderbuffers") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteRenderbuffers);
+  if (strcmp(name, "glDeleteRenderbuffersEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteRenderbuffersEXT);
+  if (strcmp(name, "glDeleteSamplers") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteSamplers);
+  if (strcmp(name, "glDeleteShader") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteShader);
+  if (strcmp(name, "glDeleteSync") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteSync);
+  if (strcmp(name, "glDeleteTextures") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteTextures);
+  if (strcmp(name, "glDeleteTransformFeedbacks") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteTransformFeedbacks);
+  if (strcmp(name, "glDeleteVertexArrays") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteVertexArrays);
+  if (strcmp(name, "glDeleteVertexArraysAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteVertexArraysAPPLE);
+  if (strcmp(name, "glDeleteVertexArraysOES") == 0)
+    return reinterpret_cast<void*>(Mock_glDeleteVertexArraysOES);
+  if (strcmp(name, "glDepthFunc") == 0)
+    return reinterpret_cast<void*>(Mock_glDepthFunc);
+  if (strcmp(name, "glDepthMask") == 0)
+    return reinterpret_cast<void*>(Mock_glDepthMask);
+  if (strcmp(name, "glDepthRange") == 0)
+    return reinterpret_cast<void*>(Mock_glDepthRange);
+  if (strcmp(name, "glDepthRangef") == 0)
+    return reinterpret_cast<void*>(Mock_glDepthRangef);
+  if (strcmp(name, "glDetachShader") == 0)
+    return reinterpret_cast<void*>(Mock_glDetachShader);
+  if (strcmp(name, "glDisable") == 0)
+    return reinterpret_cast<void*>(Mock_glDisable);
+  if (strcmp(name, "glDisableVertexAttribArray") == 0)
+    return reinterpret_cast<void*>(Mock_glDisableVertexAttribArray);
+  if (strcmp(name, "glDiscardFramebufferEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glDiscardFramebufferEXT);
+  if (strcmp(name, "glDrawArrays") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawArrays);
+  if (strcmp(name, "glDrawArraysInstanced") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawArraysInstanced);
+  if (strcmp(name, "glDrawArraysInstancedANGLE") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawArraysInstancedANGLE);
+  if (strcmp(name, "glDrawArraysInstancedARB") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawArraysInstancedARB);
+  if (strcmp(name, "glDrawBuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawBuffer);
+  if (strcmp(name, "glDrawBuffers") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawBuffers);
+  if (strcmp(name, "glDrawBuffersARB") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawBuffersARB);
+  if (strcmp(name, "glDrawBuffersEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawBuffersEXT);
+  if (strcmp(name, "glDrawElements") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawElements);
+  if (strcmp(name, "glDrawElementsInstanced") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawElementsInstanced);
+  if (strcmp(name, "glDrawElementsInstancedANGLE") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawElementsInstancedANGLE);
+  if (strcmp(name, "glDrawElementsInstancedARB") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawElementsInstancedARB);
+  if (strcmp(name, "glDrawRangeElements") == 0)
+    return reinterpret_cast<void*>(Mock_glDrawRangeElements);
+  if (strcmp(name, "glEGLImageTargetRenderbufferStorageOES") == 0)
+    return reinterpret_cast<void*>(Mock_glEGLImageTargetRenderbufferStorageOES);
+  if (strcmp(name, "glEGLImageTargetTexture2DOES") == 0)
+    return reinterpret_cast<void*>(Mock_glEGLImageTargetTexture2DOES);
+  if (strcmp(name, "glEnable") == 0)
+    return reinterpret_cast<void*>(Mock_glEnable);
+  if (strcmp(name, "glEnableVertexAttribArray") == 0)
+    return reinterpret_cast<void*>(Mock_glEnableVertexAttribArray);
+  if (strcmp(name, "glEndQuery") == 0)
+    return reinterpret_cast<void*>(Mock_glEndQuery);
+  if (strcmp(name, "glEndQueryARB") == 0)
+    return reinterpret_cast<void*>(Mock_glEndQueryARB);
+  if (strcmp(name, "glEndQueryEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glEndQueryEXT);
+  if (strcmp(name, "glEndTransformFeedback") == 0)
+    return reinterpret_cast<void*>(Mock_glEndTransformFeedback);
+  if (strcmp(name, "glFenceSync") == 0)
+    return reinterpret_cast<void*>(Mock_glFenceSync);
+  if (strcmp(name, "glFinish") == 0)
+    return reinterpret_cast<void*>(Mock_glFinish);
+  if (strcmp(name, "glFinishFenceAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glFinishFenceAPPLE);
+  if (strcmp(name, "glFinishFenceNV") == 0)
+    return reinterpret_cast<void*>(Mock_glFinishFenceNV);
+  if (strcmp(name, "glFlush") == 0)
+    return reinterpret_cast<void*>(Mock_glFlush);
+  if (strcmp(name, "glFlushMappedBufferRange") == 0)
+    return reinterpret_cast<void*>(Mock_glFlushMappedBufferRange);
+  if (strcmp(name, "glFramebufferRenderbuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glFramebufferRenderbuffer);
+  if (strcmp(name, "glFramebufferRenderbufferEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glFramebufferRenderbufferEXT);
+  if (strcmp(name, "glFramebufferTexture2D") == 0)
+    return reinterpret_cast<void*>(Mock_glFramebufferTexture2D);
+  if (strcmp(name, "glFramebufferTexture2DEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glFramebufferTexture2DEXT);
+  if (strcmp(name, "glFramebufferTexture2DMultisampleEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glFramebufferTexture2DMultisampleEXT);
+  if (strcmp(name, "glFramebufferTexture2DMultisampleIMG") == 0)
+    return reinterpret_cast<void*>(Mock_glFramebufferTexture2DMultisampleIMG);
+  if (strcmp(name, "glFramebufferTextureLayer") == 0)
+    return reinterpret_cast<void*>(Mock_glFramebufferTextureLayer);
+  if (strcmp(name, "glFrontFace") == 0)
+    return reinterpret_cast<void*>(Mock_glFrontFace);
+  if (strcmp(name, "glGenBuffers") == 0)
+    return reinterpret_cast<void*>(Mock_glGenBuffers);
+  if (strcmp(name, "glGenBuffersARB") == 0)
+    return reinterpret_cast<void*>(Mock_glGenBuffersARB);
+  if (strcmp(name, "glGenFencesAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glGenFencesAPPLE);
+  if (strcmp(name, "glGenFencesNV") == 0)
+    return reinterpret_cast<void*>(Mock_glGenFencesNV);
+  if (strcmp(name, "glGenFramebuffers") == 0)
+    return reinterpret_cast<void*>(Mock_glGenFramebuffers);
+  if (strcmp(name, "glGenFramebuffersEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGenFramebuffersEXT);
+  if (strcmp(name, "glGenQueries") == 0)
+    return reinterpret_cast<void*>(Mock_glGenQueries);
+  if (strcmp(name, "glGenQueriesARB") == 0)
+    return reinterpret_cast<void*>(Mock_glGenQueriesARB);
+  if (strcmp(name, "glGenQueriesEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGenQueriesEXT);
+  if (strcmp(name, "glGenRenderbuffers") == 0)
+    return reinterpret_cast<void*>(Mock_glGenRenderbuffers);
+  if (strcmp(name, "glGenRenderbuffersEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGenRenderbuffersEXT);
+  if (strcmp(name, "glGenSamplers") == 0)
+    return reinterpret_cast<void*>(Mock_glGenSamplers);
+  if (strcmp(name, "glGenTextures") == 0)
+    return reinterpret_cast<void*>(Mock_glGenTextures);
+  if (strcmp(name, "glGenTransformFeedbacks") == 0)
+    return reinterpret_cast<void*>(Mock_glGenTransformFeedbacks);
+  if (strcmp(name, "glGenVertexArrays") == 0)
+    return reinterpret_cast<void*>(Mock_glGenVertexArrays);
+  if (strcmp(name, "glGenVertexArraysAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glGenVertexArraysAPPLE);
+  if (strcmp(name, "glGenVertexArraysOES") == 0)
+    return reinterpret_cast<void*>(Mock_glGenVertexArraysOES);
+  if (strcmp(name, "glGenerateMipmap") == 0)
+    return reinterpret_cast<void*>(Mock_glGenerateMipmap);
+  if (strcmp(name, "glGenerateMipmapEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGenerateMipmapEXT);
+  if (strcmp(name, "glGetActiveAttrib") == 0)
+    return reinterpret_cast<void*>(Mock_glGetActiveAttrib);
+  if (strcmp(name, "glGetActiveUniform") == 0)
+    return reinterpret_cast<void*>(Mock_glGetActiveUniform);
+  if (strcmp(name, "glGetActiveUniformBlockName") == 0)
+    return reinterpret_cast<void*>(Mock_glGetActiveUniformBlockName);
+  if (strcmp(name, "glGetActiveUniformBlockiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetActiveUniformBlockiv);
+  if (strcmp(name, "glGetActiveUniformsiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetActiveUniformsiv);
+  if (strcmp(name, "glGetAttachedShaders") == 0)
+    return reinterpret_cast<void*>(Mock_glGetAttachedShaders);
+  if (strcmp(name, "glGetAttribLocation") == 0)
+    return reinterpret_cast<void*>(Mock_glGetAttribLocation);
+  if (strcmp(name, "glGetBooleanv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetBooleanv);
+  if (strcmp(name, "glGetBufferParameteriv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetBufferParameteriv);
+  if (strcmp(name, "glGetError") == 0)
+    return reinterpret_cast<void*>(Mock_glGetError);
+  if (strcmp(name, "glGetFenceivNV") == 0)
+    return reinterpret_cast<void*>(Mock_glGetFenceivNV);
+  if (strcmp(name, "glGetFloatv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetFloatv);
+  if (strcmp(name, "glGetFragDataLocation") == 0)
+    return reinterpret_cast<void*>(Mock_glGetFragDataLocation);
+  if (strcmp(name, "glGetFramebufferAttachmentParameteriv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetFramebufferAttachmentParameteriv);
+  if (strcmp(name, "glGetFramebufferAttachmentParameterivEXT") == 0)
+    return reinterpret_cast<void*>(
+        Mock_glGetFramebufferAttachmentParameterivEXT);
+  if (strcmp(name, "glGetGraphicsResetStatus") == 0)
+    return reinterpret_cast<void*>(Mock_glGetGraphicsResetStatus);
+  if (strcmp(name, "glGetGraphicsResetStatusARB") == 0)
+    return reinterpret_cast<void*>(Mock_glGetGraphicsResetStatusARB);
+  if (strcmp(name, "glGetGraphicsResetStatusEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGetGraphicsResetStatusEXT);
+  if (strcmp(name, "glGetGraphicsResetStatusKHR") == 0)
+    return reinterpret_cast<void*>(Mock_glGetGraphicsResetStatusKHR);
+  if (strcmp(name, "glGetInteger64i_v") == 0)
+    return reinterpret_cast<void*>(Mock_glGetInteger64i_v);
+  if (strcmp(name, "glGetInteger64v") == 0)
+    return reinterpret_cast<void*>(Mock_glGetInteger64v);
+  if (strcmp(name, "glGetIntegeri_v") == 0)
+    return reinterpret_cast<void*>(Mock_glGetIntegeri_v);
+  if (strcmp(name, "glGetIntegerv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetIntegerv);
+  if (strcmp(name, "glGetInternalformativ") == 0)
+    return reinterpret_cast<void*>(Mock_glGetInternalformativ);
+  if (strcmp(name, "glGetProgramBinary") == 0)
+    return reinterpret_cast<void*>(Mock_glGetProgramBinary);
+  if (strcmp(name, "glGetProgramBinaryOES") == 0)
+    return reinterpret_cast<void*>(Mock_glGetProgramBinaryOES);
+  if (strcmp(name, "glGetProgramInfoLog") == 0)
+    return reinterpret_cast<void*>(Mock_glGetProgramInfoLog);
+  if (strcmp(name, "glGetProgramiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetProgramiv);
+  if (strcmp(name, "glGetQueryObjecti64v") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjecti64v);
+  if (strcmp(name, "glGetQueryObjectiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjectiv);
+  if (strcmp(name, "glGetQueryObjectivARB") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjectivARB);
+  if (strcmp(name, "glGetQueryObjectivEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjectivEXT);
+  if (strcmp(name, "glGetQueryObjectui64v") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjectui64v);
+  if (strcmp(name, "glGetQueryObjectui64vEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjectui64vEXT);
+  if (strcmp(name, "glGetQueryObjectuiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjectuiv);
+  if (strcmp(name, "glGetQueryObjectuivARB") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjectuivARB);
+  if (strcmp(name, "glGetQueryObjectuivEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryObjectuivEXT);
+  if (strcmp(name, "glGetQueryiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryiv);
+  if (strcmp(name, "glGetQueryivARB") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryivARB);
+  if (strcmp(name, "glGetQueryivEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGetQueryivEXT);
+  if (strcmp(name, "glGetRenderbufferParameteriv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetRenderbufferParameteriv);
+  if (strcmp(name, "glGetRenderbufferParameterivEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glGetRenderbufferParameterivEXT);
+  if (strcmp(name, "glGetSamplerParameterfv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetSamplerParameterfv);
+  if (strcmp(name, "glGetSamplerParameteriv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetSamplerParameteriv);
+  if (strcmp(name, "glGetShaderInfoLog") == 0)
+    return reinterpret_cast<void*>(Mock_glGetShaderInfoLog);
+  if (strcmp(name, "glGetShaderPrecisionFormat") == 0)
+    return reinterpret_cast<void*>(Mock_glGetShaderPrecisionFormat);
+  if (strcmp(name, "glGetShaderSource") == 0)
+    return reinterpret_cast<void*>(Mock_glGetShaderSource);
+  if (strcmp(name, "glGetShaderiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetShaderiv);
+  if (strcmp(name, "glGetString") == 0)
+    return reinterpret_cast<void*>(Mock_glGetString);
+  if (strcmp(name, "glGetSynciv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetSynciv);
+  if (strcmp(name, "glGetTexLevelParameterfv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetTexLevelParameterfv);
+  if (strcmp(name, "glGetTexLevelParameteriv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetTexLevelParameteriv);
+  if (strcmp(name, "glGetTexParameterfv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetTexParameterfv);
+  if (strcmp(name, "glGetTexParameteriv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetTexParameteriv);
+  if (strcmp(name, "glGetTransformFeedbackVarying") == 0)
+    return reinterpret_cast<void*>(Mock_glGetTransformFeedbackVarying);
+  if (strcmp(name, "glGetTranslatedShaderSourceANGLE") == 0)
+    return reinterpret_cast<void*>(Mock_glGetTranslatedShaderSourceANGLE);
+  if (strcmp(name, "glGetUniformBlockIndex") == 0)
+    return reinterpret_cast<void*>(Mock_glGetUniformBlockIndex);
+  if (strcmp(name, "glGetUniformIndices") == 0)
+    return reinterpret_cast<void*>(Mock_glGetUniformIndices);
+  if (strcmp(name, "glGetUniformLocation") == 0)
+    return reinterpret_cast<void*>(Mock_glGetUniformLocation);
+  if (strcmp(name, "glGetUniformfv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetUniformfv);
+  if (strcmp(name, "glGetUniformiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetUniformiv);
+  if (strcmp(name, "glGetVertexAttribPointerv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetVertexAttribPointerv);
+  if (strcmp(name, "glGetVertexAttribfv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetVertexAttribfv);
+  if (strcmp(name, "glGetVertexAttribiv") == 0)
+    return reinterpret_cast<void*>(Mock_glGetVertexAttribiv);
+  if (strcmp(name, "glHint") == 0)
+    return reinterpret_cast<void*>(Mock_glHint);
+  if (strcmp(name, "glInsertEventMarkerEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glInsertEventMarkerEXT);
+  if (strcmp(name, "glInvalidateFramebuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glInvalidateFramebuffer);
+  if (strcmp(name, "glInvalidateSubFramebuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glInvalidateSubFramebuffer);
+  if (strcmp(name, "glIsBuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glIsBuffer);
+  if (strcmp(name, "glIsEnabled") == 0)
+    return reinterpret_cast<void*>(Mock_glIsEnabled);
+  if (strcmp(name, "glIsFenceAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glIsFenceAPPLE);
+  if (strcmp(name, "glIsFenceNV") == 0)
+    return reinterpret_cast<void*>(Mock_glIsFenceNV);
+  if (strcmp(name, "glIsFramebuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glIsFramebuffer);
+  if (strcmp(name, "glIsFramebufferEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glIsFramebufferEXT);
+  if (strcmp(name, "glIsProgram") == 0)
+    return reinterpret_cast<void*>(Mock_glIsProgram);
+  if (strcmp(name, "glIsQuery") == 0)
+    return reinterpret_cast<void*>(Mock_glIsQuery);
+  if (strcmp(name, "glIsQueryARB") == 0)
+    return reinterpret_cast<void*>(Mock_glIsQueryARB);
+  if (strcmp(name, "glIsQueryEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glIsQueryEXT);
+  if (strcmp(name, "glIsRenderbuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glIsRenderbuffer);
+  if (strcmp(name, "glIsRenderbufferEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glIsRenderbufferEXT);
+  if (strcmp(name, "glIsSampler") == 0)
+    return reinterpret_cast<void*>(Mock_glIsSampler);
+  if (strcmp(name, "glIsShader") == 0)
+    return reinterpret_cast<void*>(Mock_glIsShader);
+  if (strcmp(name, "glIsSync") == 0)
+    return reinterpret_cast<void*>(Mock_glIsSync);
+  if (strcmp(name, "glIsTexture") == 0)
+    return reinterpret_cast<void*>(Mock_glIsTexture);
+  if (strcmp(name, "glIsTransformFeedback") == 0)
+    return reinterpret_cast<void*>(Mock_glIsTransformFeedback);
+  if (strcmp(name, "glIsVertexArray") == 0)
+    return reinterpret_cast<void*>(Mock_glIsVertexArray);
+  if (strcmp(name, "glIsVertexArrayAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glIsVertexArrayAPPLE);
+  if (strcmp(name, "glIsVertexArrayOES") == 0)
+    return reinterpret_cast<void*>(Mock_glIsVertexArrayOES);
+  if (strcmp(name, "glLineWidth") == 0)
+    return reinterpret_cast<void*>(Mock_glLineWidth);
+  if (strcmp(name, "glLinkProgram") == 0)
+    return reinterpret_cast<void*>(Mock_glLinkProgram);
+  if (strcmp(name, "glMapBuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glMapBuffer);
+  if (strcmp(name, "glMapBufferOES") == 0)
+    return reinterpret_cast<void*>(Mock_glMapBufferOES);
+  if (strcmp(name, "glMapBufferRange") == 0)
+    return reinterpret_cast<void*>(Mock_glMapBufferRange);
+  if (strcmp(name, "glMapBufferRangeEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glMapBufferRangeEXT);
+  if (strcmp(name, "glMatrixLoadIdentityEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glMatrixLoadIdentityEXT);
+  if (strcmp(name, "glMatrixLoadfEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glMatrixLoadfEXT);
+  if (strcmp(name, "glPauseTransformFeedback") == 0)
+    return reinterpret_cast<void*>(Mock_glPauseTransformFeedback);
+  if (strcmp(name, "glPixelStorei") == 0)
+    return reinterpret_cast<void*>(Mock_glPixelStorei);
+  if (strcmp(name, "glPointParameteri") == 0)
+    return reinterpret_cast<void*>(Mock_glPointParameteri);
+  if (strcmp(name, "glPolygonOffset") == 0)
+    return reinterpret_cast<void*>(Mock_glPolygonOffset);
+  if (strcmp(name, "glPopGroupMarkerEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glPopGroupMarkerEXT);
+  if (strcmp(name, "glProgramBinary") == 0)
+    return reinterpret_cast<void*>(Mock_glProgramBinary);
+  if (strcmp(name, "glProgramBinaryOES") == 0)
+    return reinterpret_cast<void*>(Mock_glProgramBinaryOES);
+  if (strcmp(name, "glProgramParameteri") == 0)
+    return reinterpret_cast<void*>(Mock_glProgramParameteri);
+  if (strcmp(name, "glPushGroupMarkerEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glPushGroupMarkerEXT);
+  if (strcmp(name, "glQueryCounter") == 0)
+    return reinterpret_cast<void*>(Mock_glQueryCounter);
+  if (strcmp(name, "glQueryCounterEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glQueryCounterEXT);
+  if (strcmp(name, "glReadBuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glReadBuffer);
+  if (strcmp(name, "glReadPixels") == 0)
+    return reinterpret_cast<void*>(Mock_glReadPixels);
+  if (strcmp(name, "glReleaseShaderCompiler") == 0)
+    return reinterpret_cast<void*>(Mock_glReleaseShaderCompiler);
+  if (strcmp(name, "glRenderbufferStorage") == 0)
+    return reinterpret_cast<void*>(Mock_glRenderbufferStorage);
+  if (strcmp(name, "glRenderbufferStorageEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glRenderbufferStorageEXT);
+  if (strcmp(name, "glRenderbufferStorageMultisample") == 0)
+    return reinterpret_cast<void*>(Mock_glRenderbufferStorageMultisample);
+  if (strcmp(name, "glRenderbufferStorageMultisampleANGLE") == 0)
+    return reinterpret_cast<void*>(Mock_glRenderbufferStorageMultisampleANGLE);
+  if (strcmp(name, "glRenderbufferStorageMultisampleEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glRenderbufferStorageMultisampleEXT);
+  if (strcmp(name, "glRenderbufferStorageMultisampleIMG") == 0)
+    return reinterpret_cast<void*>(Mock_glRenderbufferStorageMultisampleIMG);
+  if (strcmp(name, "glResumeTransformFeedback") == 0)
+    return reinterpret_cast<void*>(Mock_glResumeTransformFeedback);
+  if (strcmp(name, "glSampleCoverage") == 0)
+    return reinterpret_cast<void*>(Mock_glSampleCoverage);
+  if (strcmp(name, "glSamplerParameterf") == 0)
+    return reinterpret_cast<void*>(Mock_glSamplerParameterf);
+  if (strcmp(name, "glSamplerParameterfv") == 0)
+    return reinterpret_cast<void*>(Mock_glSamplerParameterfv);
+  if (strcmp(name, "glSamplerParameteri") == 0)
+    return reinterpret_cast<void*>(Mock_glSamplerParameteri);
+  if (strcmp(name, "glSamplerParameteriv") == 0)
+    return reinterpret_cast<void*>(Mock_glSamplerParameteriv);
+  if (strcmp(name, "glScissor") == 0)
+    return reinterpret_cast<void*>(Mock_glScissor);
+  if (strcmp(name, "glSetFenceAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glSetFenceAPPLE);
+  if (strcmp(name, "glSetFenceNV") == 0)
+    return reinterpret_cast<void*>(Mock_glSetFenceNV);
+  if (strcmp(name, "glShaderBinary") == 0)
+    return reinterpret_cast<void*>(Mock_glShaderBinary);
+  if (strcmp(name, "glShaderSource") == 0)
+    return reinterpret_cast<void*>(Mock_glShaderSource);
+  if (strcmp(name, "glStencilFunc") == 0)
+    return reinterpret_cast<void*>(Mock_glStencilFunc);
+  if (strcmp(name, "glStencilFuncSeparate") == 0)
+    return reinterpret_cast<void*>(Mock_glStencilFuncSeparate);
+  if (strcmp(name, "glStencilMask") == 0)
+    return reinterpret_cast<void*>(Mock_glStencilMask);
+  if (strcmp(name, "glStencilMaskSeparate") == 0)
+    return reinterpret_cast<void*>(Mock_glStencilMaskSeparate);
+  if (strcmp(name, "glStencilOp") == 0)
+    return reinterpret_cast<void*>(Mock_glStencilOp);
+  if (strcmp(name, "glStencilOpSeparate") == 0)
+    return reinterpret_cast<void*>(Mock_glStencilOpSeparate);
+  if (strcmp(name, "glTestFenceAPPLE") == 0)
+    return reinterpret_cast<void*>(Mock_glTestFenceAPPLE);
+  if (strcmp(name, "glTestFenceNV") == 0)
+    return reinterpret_cast<void*>(Mock_glTestFenceNV);
+  if (strcmp(name, "glTexImage2D") == 0)
+    return reinterpret_cast<void*>(Mock_glTexImage2D);
+  if (strcmp(name, "glTexImage3D") == 0)
+    return reinterpret_cast<void*>(Mock_glTexImage3D);
+  if (strcmp(name, "glTexParameterf") == 0)
+    return reinterpret_cast<void*>(Mock_glTexParameterf);
+  if (strcmp(name, "glTexParameterfv") == 0)
+    return reinterpret_cast<void*>(Mock_glTexParameterfv);
+  if (strcmp(name, "glTexParameteri") == 0)
+    return reinterpret_cast<void*>(Mock_glTexParameteri);
+  if (strcmp(name, "glTexParameteriv") == 0)
+    return reinterpret_cast<void*>(Mock_glTexParameteriv);
+  if (strcmp(name, "glTexStorage2D") == 0)
+    return reinterpret_cast<void*>(Mock_glTexStorage2D);
+  if (strcmp(name, "glTexStorage2DEXT") == 0)
+    return reinterpret_cast<void*>(Mock_glTexStorage2DEXT);
+  if (strcmp(name, "glTexStorage3D") == 0)
+    return reinterpret_cast<void*>(Mock_glTexStorage3D);
+  if (strcmp(name, "glTexSubImage2D") == 0)
+    return reinterpret_cast<void*>(Mock_glTexSubImage2D);
+  if (strcmp(name, "glTransformFeedbackVaryings") == 0)
+    return reinterpret_cast<void*>(Mock_glTransformFeedbackVaryings);
+  if (strcmp(name, "glUniform1f") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform1f);
+  if (strcmp(name, "glUniform1fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform1fv);
+  if (strcmp(name, "glUniform1i") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform1i);
+  if (strcmp(name, "glUniform1iv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform1iv);
+  if (strcmp(name, "glUniform1ui") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform1ui);
+  if (strcmp(name, "glUniform1uiv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform1uiv);
+  if (strcmp(name, "glUniform2f") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform2f);
+  if (strcmp(name, "glUniform2fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform2fv);
+  if (strcmp(name, "glUniform2i") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform2i);
+  if (strcmp(name, "glUniform2iv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform2iv);
+  if (strcmp(name, "glUniform2ui") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform2ui);
+  if (strcmp(name, "glUniform2uiv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform2uiv);
+  if (strcmp(name, "glUniform3f") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform3f);
+  if (strcmp(name, "glUniform3fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform3fv);
+  if (strcmp(name, "glUniform3i") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform3i);
+  if (strcmp(name, "glUniform3iv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform3iv);
+  if (strcmp(name, "glUniform3ui") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform3ui);
+  if (strcmp(name, "glUniform3uiv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform3uiv);
+  if (strcmp(name, "glUniform4f") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform4f);
+  if (strcmp(name, "glUniform4fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform4fv);
+  if (strcmp(name, "glUniform4i") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform4i);
+  if (strcmp(name, "glUniform4iv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform4iv);
+  if (strcmp(name, "glUniform4ui") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform4ui);
+  if (strcmp(name, "glUniform4uiv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniform4uiv);
+  if (strcmp(name, "glUniformBlockBinding") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformBlockBinding);
+  if (strcmp(name, "glUniformMatrix2fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix2fv);
+  if (strcmp(name, "glUniformMatrix2x3fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix2x3fv);
+  if (strcmp(name, "glUniformMatrix2x4fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix2x4fv);
+  if (strcmp(name, "glUniformMatrix3fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix3fv);
+  if (strcmp(name, "glUniformMatrix3x2fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix3x2fv);
+  if (strcmp(name, "glUniformMatrix3x4fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix3x4fv);
+  if (strcmp(name, "glUniformMatrix4fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix4fv);
+  if (strcmp(name, "glUniformMatrix4x2fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix4x2fv);
+  if (strcmp(name, "glUniformMatrix4x3fv") == 0)
+    return reinterpret_cast<void*>(Mock_glUniformMatrix4x3fv);
+  if (strcmp(name, "glUnmapBuffer") == 0)
+    return reinterpret_cast<void*>(Mock_glUnmapBuffer);
+  if (strcmp(name, "glUnmapBufferOES") == 0)
+    return reinterpret_cast<void*>(Mock_glUnmapBufferOES);
+  if (strcmp(name, "glUseProgram") == 0)
+    return reinterpret_cast<void*>(Mock_glUseProgram);
+  if (strcmp(name, "glValidateProgram") == 0)
+    return reinterpret_cast<void*>(Mock_glValidateProgram);
+  if (strcmp(name, "glVertexAttrib1f") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttrib1f);
+  if (strcmp(name, "glVertexAttrib1fv") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttrib1fv);
+  if (strcmp(name, "glVertexAttrib2f") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttrib2f);
+  if (strcmp(name, "glVertexAttrib2fv") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttrib2fv);
+  if (strcmp(name, "glVertexAttrib3f") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttrib3f);
+  if (strcmp(name, "glVertexAttrib3fv") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttrib3fv);
+  if (strcmp(name, "glVertexAttrib4f") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttrib4f);
+  if (strcmp(name, "glVertexAttrib4fv") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttrib4fv);
+  if (strcmp(name, "glVertexAttribDivisor") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribDivisor);
+  if (strcmp(name, "glVertexAttribDivisorANGLE") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribDivisorANGLE);
+  if (strcmp(name, "glVertexAttribDivisorARB") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribDivisorARB);
+  if (strcmp(name, "glVertexAttribI4i") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribI4i);
+  if (strcmp(name, "glVertexAttribI4iv") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribI4iv);
+  if (strcmp(name, "glVertexAttribI4ui") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribI4ui);
+  if (strcmp(name, "glVertexAttribI4uiv") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribI4uiv);
+  if (strcmp(name, "glVertexAttribIPointer") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribIPointer);
+  if (strcmp(name, "glVertexAttribPointer") == 0)
+    return reinterpret_cast<void*>(Mock_glVertexAttribPointer);
+  if (strcmp(name, "glViewport") == 0)
+    return reinterpret_cast<void*>(Mock_glViewport);
+  if (strcmp(name, "glWaitSync") == 0)
+    return reinterpret_cast<void*>(Mock_glWaitSync);
+  return reinterpret_cast<void*>(&MockInvalidFunction);
+}
+
+}  // namespace gfx
diff --git a/ui/gl/gl_bindings_autogen_mock.h b/ui/gl/gl_bindings_autogen_mock.h
new file mode 100644
index 0000000..2ed1095
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_mock.h
@@ -0,0 +1,880 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+static void GL_BINDING_CALL Mock_glActiveTexture(GLenum texture);
+static void GL_BINDING_CALL Mock_glAttachShader(GLuint program, GLuint shader);
+static void GL_BINDING_CALL Mock_glBeginQuery(GLenum target, GLuint id);
+static void GL_BINDING_CALL Mock_glBeginQueryARB(GLenum target, GLuint id);
+static void GL_BINDING_CALL Mock_glBeginQueryEXT(GLenum target, GLuint id);
+static void GL_BINDING_CALL Mock_glBeginTransformFeedback(GLenum primitiveMode);
+static void GL_BINDING_CALL
+Mock_glBindAttribLocation(GLuint program, GLuint index, const char* name);
+static void GL_BINDING_CALL Mock_glBindBuffer(GLenum target, GLuint buffer);
+static void GL_BINDING_CALL
+Mock_glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+static void GL_BINDING_CALL Mock_glBindBufferRange(GLenum target,
+                                                   GLuint index,
+                                                   GLuint buffer,
+                                                   GLintptr offset,
+                                                   GLsizeiptr size);
+static void GL_BINDING_CALL Mock_glBindFragDataLocation(GLuint program,
+                                                        GLuint colorNumber,
+                                                        const char* name);
+static void GL_BINDING_CALL
+Mock_glBindFragDataLocationIndexed(GLuint program,
+                                   GLuint colorNumber,
+                                   GLuint index,
+                                   const char* name);
+static void GL_BINDING_CALL
+Mock_glBindFramebuffer(GLenum target, GLuint framebuffer);
+static void GL_BINDING_CALL
+Mock_glBindFramebufferEXT(GLenum target, GLuint framebuffer);
+static void GL_BINDING_CALL
+Mock_glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+static void GL_BINDING_CALL
+Mock_glBindRenderbufferEXT(GLenum target, GLuint renderbuffer);
+static void GL_BINDING_CALL Mock_glBindSampler(GLuint unit, GLuint sampler);
+static void GL_BINDING_CALL Mock_glBindTexture(GLenum target, GLuint texture);
+static void GL_BINDING_CALL
+Mock_glBindTransformFeedback(GLenum target, GLuint id);
+static void GL_BINDING_CALL Mock_glBindVertexArray(GLuint array);
+static void GL_BINDING_CALL Mock_glBindVertexArrayAPPLE(GLuint array);
+static void GL_BINDING_CALL Mock_glBindVertexArrayOES(GLuint array);
+static void GL_BINDING_CALL Mock_glBlendBarrierKHR(void);
+static void GL_BINDING_CALL Mock_glBlendBarrierNV(void);
+static void GL_BINDING_CALL
+Mock_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+static void GL_BINDING_CALL Mock_glBlendEquation(GLenum mode);
+static void GL_BINDING_CALL
+Mock_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+static void GL_BINDING_CALL Mock_glBlendFunc(GLenum sfactor, GLenum dfactor);
+static void GL_BINDING_CALL Mock_glBlendFuncSeparate(GLenum srcRGB,
+                                                     GLenum dstRGB,
+                                                     GLenum srcAlpha,
+                                                     GLenum dstAlpha);
+static void GL_BINDING_CALL Mock_glBlitFramebuffer(GLint srcX0,
+                                                   GLint srcY0,
+                                                   GLint srcX1,
+                                                   GLint srcY1,
+                                                   GLint dstX0,
+                                                   GLint dstY0,
+                                                   GLint dstX1,
+                                                   GLint dstY1,
+                                                   GLbitfield mask,
+                                                   GLenum filter);
+static void GL_BINDING_CALL Mock_glBlitFramebufferANGLE(GLint srcX0,
+                                                        GLint srcY0,
+                                                        GLint srcX1,
+                                                        GLint srcY1,
+                                                        GLint dstX0,
+                                                        GLint dstY0,
+                                                        GLint dstX1,
+                                                        GLint dstY1,
+                                                        GLbitfield mask,
+                                                        GLenum filter);
+static void GL_BINDING_CALL Mock_glBlitFramebufferEXT(GLint srcX0,
+                                                      GLint srcY0,
+                                                      GLint srcX1,
+                                                      GLint srcY1,
+                                                      GLint dstX0,
+                                                      GLint dstY0,
+                                                      GLint dstX1,
+                                                      GLint dstY1,
+                                                      GLbitfield mask,
+                                                      GLenum filter);
+static void GL_BINDING_CALL Mock_glBufferData(GLenum target,
+                                              GLsizeiptr size,
+                                              const void* data,
+                                              GLenum usage);
+static void GL_BINDING_CALL Mock_glBufferSubData(GLenum target,
+                                                 GLintptr offset,
+                                                 GLsizeiptr size,
+                                                 const void* data);
+static GLenum GL_BINDING_CALL Mock_glCheckFramebufferStatus(GLenum target);
+static GLenum GL_BINDING_CALL Mock_glCheckFramebufferStatusEXT(GLenum target);
+static void GL_BINDING_CALL Mock_glClear(GLbitfield mask);
+static void GL_BINDING_CALL Mock_glClearBufferfi(GLenum buffer,
+                                                 GLint drawbuffer,
+                                                 const GLfloat depth,
+                                                 GLint stencil);
+static void GL_BINDING_CALL
+Mock_glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value);
+static void GL_BINDING_CALL
+Mock_glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value);
+static void GL_BINDING_CALL
+Mock_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value);
+static void GL_BINDING_CALL
+Mock_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+static void GL_BINDING_CALL Mock_glClearDepth(GLclampd depth);
+static void GL_BINDING_CALL Mock_glClearDepthf(GLclampf depth);
+static void GL_BINDING_CALL Mock_glClearStencil(GLint s);
+static GLenum GL_BINDING_CALL
+Mock_glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+static void GL_BINDING_CALL Mock_glColorMask(GLboolean red,
+                                             GLboolean green,
+                                             GLboolean blue,
+                                             GLboolean alpha);
+static void GL_BINDING_CALL Mock_glCompileShader(GLuint shader);
+static void GL_BINDING_CALL Mock_glCompressedTexImage2D(GLenum target,
+                                                        GLint level,
+                                                        GLenum internalformat,
+                                                        GLsizei width,
+                                                        GLsizei height,
+                                                        GLint border,
+                                                        GLsizei imageSize,
+                                                        const void* data);
+static void GL_BINDING_CALL Mock_glCompressedTexImage3D(GLenum target,
+                                                        GLint level,
+                                                        GLenum internalformat,
+                                                        GLsizei width,
+                                                        GLsizei height,
+                                                        GLsizei depth,
+                                                        GLint border,
+                                                        GLsizei imageSize,
+                                                        const void* data);
+static void GL_BINDING_CALL Mock_glCompressedTexSubImage2D(GLenum target,
+                                                           GLint level,
+                                                           GLint xoffset,
+                                                           GLint yoffset,
+                                                           GLsizei width,
+                                                           GLsizei height,
+                                                           GLenum format,
+                                                           GLsizei imageSize,
+                                                           const void* data);
+static void GL_BINDING_CALL Mock_glCopyBufferSubData(GLenum readTarget,
+                                                     GLenum writeTarget,
+                                                     GLintptr readOffset,
+                                                     GLintptr writeOffset,
+                                                     GLsizeiptr size);
+static void GL_BINDING_CALL Mock_glCopyTexImage2D(GLenum target,
+                                                  GLint level,
+                                                  GLenum internalformat,
+                                                  GLint x,
+                                                  GLint y,
+                                                  GLsizei width,
+                                                  GLsizei height,
+                                                  GLint border);
+static void GL_BINDING_CALL Mock_glCopyTexSubImage2D(GLenum target,
+                                                     GLint level,
+                                                     GLint xoffset,
+                                                     GLint yoffset,
+                                                     GLint x,
+                                                     GLint y,
+                                                     GLsizei width,
+                                                     GLsizei height);
+static void GL_BINDING_CALL Mock_glCopyTexSubImage3D(GLenum target,
+                                                     GLint level,
+                                                     GLint xoffset,
+                                                     GLint yoffset,
+                                                     GLint zoffset,
+                                                     GLint x,
+                                                     GLint y,
+                                                     GLsizei width,
+                                                     GLsizei height);
+static GLuint GL_BINDING_CALL Mock_glCreateProgram(void);
+static GLuint GL_BINDING_CALL Mock_glCreateShader(GLenum type);
+static void GL_BINDING_CALL Mock_glCullFace(GLenum mode);
+static void GL_BINDING_CALL
+Mock_glDeleteBuffers(GLsizei n, const GLuint* buffers);
+static void GL_BINDING_CALL
+Mock_glDeleteBuffersARB(GLsizei n, const GLuint* buffers);
+static void GL_BINDING_CALL
+Mock_glDeleteFencesAPPLE(GLsizei n, const GLuint* fences);
+static void GL_BINDING_CALL
+Mock_glDeleteFencesNV(GLsizei n, const GLuint* fences);
+static void GL_BINDING_CALL
+Mock_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers);
+static void GL_BINDING_CALL
+Mock_glDeleteFramebuffersEXT(GLsizei n, const GLuint* framebuffers);
+static void GL_BINDING_CALL Mock_glDeleteProgram(GLuint program);
+static void GL_BINDING_CALL Mock_glDeleteQueries(GLsizei n, const GLuint* ids);
+static void GL_BINDING_CALL
+Mock_glDeleteQueriesARB(GLsizei n, const GLuint* ids);
+static void GL_BINDING_CALL
+Mock_glDeleteQueriesEXT(GLsizei n, const GLuint* ids);
+static void GL_BINDING_CALL
+Mock_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers);
+static void GL_BINDING_CALL
+Mock_glDeleteRenderbuffersEXT(GLsizei n, const GLuint* renderbuffers);
+static void GL_BINDING_CALL
+Mock_glDeleteSamplers(GLsizei n, const GLuint* samplers);
+static void GL_BINDING_CALL Mock_glDeleteShader(GLuint shader);
+static void GL_BINDING_CALL Mock_glDeleteSync(GLsync sync);
+static void GL_BINDING_CALL
+Mock_glDeleteTextures(GLsizei n, const GLuint* textures);
+static void GL_BINDING_CALL
+Mock_glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids);
+static void GL_BINDING_CALL
+Mock_glDeleteVertexArrays(GLsizei n, const GLuint* arrays);
+static void GL_BINDING_CALL
+Mock_glDeleteVertexArraysAPPLE(GLsizei n, const GLuint* arrays);
+static void GL_BINDING_CALL
+Mock_glDeleteVertexArraysOES(GLsizei n, const GLuint* arrays);
+static void GL_BINDING_CALL Mock_glDepthFunc(GLenum func);
+static void GL_BINDING_CALL Mock_glDepthMask(GLboolean flag);
+static void GL_BINDING_CALL Mock_glDepthRange(GLclampd zNear, GLclampd zFar);
+static void GL_BINDING_CALL Mock_glDepthRangef(GLclampf zNear, GLclampf zFar);
+static void GL_BINDING_CALL Mock_glDetachShader(GLuint program, GLuint shader);
+static void GL_BINDING_CALL Mock_glDisable(GLenum cap);
+static void GL_BINDING_CALL Mock_glDisableVertexAttribArray(GLuint index);
+static void GL_BINDING_CALL
+Mock_glDiscardFramebufferEXT(GLenum target,
+                             GLsizei numAttachments,
+                             const GLenum* attachments);
+static void GL_BINDING_CALL
+Mock_glDrawArrays(GLenum mode, GLint first, GLsizei count);
+static void GL_BINDING_CALL Mock_glDrawArraysInstanced(GLenum mode,
+                                                       GLint first,
+                                                       GLsizei count,
+                                                       GLsizei primcount);
+static void GL_BINDING_CALL Mock_glDrawArraysInstancedANGLE(GLenum mode,
+                                                            GLint first,
+                                                            GLsizei count,
+                                                            GLsizei primcount);
+static void GL_BINDING_CALL Mock_glDrawArraysInstancedARB(GLenum mode,
+                                                          GLint first,
+                                                          GLsizei count,
+                                                          GLsizei primcount);
+static void GL_BINDING_CALL Mock_glDrawBuffer(GLenum mode);
+static void GL_BINDING_CALL Mock_glDrawBuffers(GLsizei n, const GLenum* bufs);
+static void GL_BINDING_CALL
+Mock_glDrawBuffersARB(GLsizei n, const GLenum* bufs);
+static void GL_BINDING_CALL
+Mock_glDrawBuffersEXT(GLsizei n, const GLenum* bufs);
+static void GL_BINDING_CALL Mock_glDrawElements(GLenum mode,
+                                                GLsizei count,
+                                                GLenum type,
+                                                const void* indices);
+static void GL_BINDING_CALL Mock_glDrawElementsInstanced(GLenum mode,
+                                                         GLsizei count,
+                                                         GLenum type,
+                                                         const void* indices,
+                                                         GLsizei primcount);
+static void GL_BINDING_CALL
+Mock_glDrawElementsInstancedANGLE(GLenum mode,
+                                  GLsizei count,
+                                  GLenum type,
+                                  const void* indices,
+                                  GLsizei primcount);
+static void GL_BINDING_CALL Mock_glDrawElementsInstancedARB(GLenum mode,
+                                                            GLsizei count,
+                                                            GLenum type,
+                                                            const void* indices,
+                                                            GLsizei primcount);
+static void GL_BINDING_CALL Mock_glDrawRangeElements(GLenum mode,
+                                                     GLuint start,
+                                                     GLuint end,
+                                                     GLsizei count,
+                                                     GLenum type,
+                                                     const void* indices);
+static void GL_BINDING_CALL
+Mock_glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image);
+static void GL_BINDING_CALL
+Mock_glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image);
+static void GL_BINDING_CALL Mock_glEnable(GLenum cap);
+static void GL_BINDING_CALL Mock_glEnableVertexAttribArray(GLuint index);
+static void GL_BINDING_CALL Mock_glEndQuery(GLenum target);
+static void GL_BINDING_CALL Mock_glEndQueryARB(GLenum target);
+static void GL_BINDING_CALL Mock_glEndQueryEXT(GLenum target);
+static void GL_BINDING_CALL Mock_glEndTransformFeedback(void);
+static GLsync GL_BINDING_CALL
+Mock_glFenceSync(GLenum condition, GLbitfield flags);
+static void GL_BINDING_CALL Mock_glFinish(void);
+static void GL_BINDING_CALL Mock_glFinishFenceAPPLE(GLuint fence);
+static void GL_BINDING_CALL Mock_glFinishFenceNV(GLuint fence);
+static void GL_BINDING_CALL Mock_glFlush(void);
+static void GL_BINDING_CALL Mock_glFlushMappedBufferRange(GLenum target,
+                                                          GLintptr offset,
+                                                          GLsizeiptr length);
+static void GL_BINDING_CALL
+Mock_glFramebufferRenderbuffer(GLenum target,
+                               GLenum attachment,
+                               GLenum renderbuffertarget,
+                               GLuint renderbuffer);
+static void GL_BINDING_CALL
+Mock_glFramebufferRenderbufferEXT(GLenum target,
+                                  GLenum attachment,
+                                  GLenum renderbuffertarget,
+                                  GLuint renderbuffer);
+static void GL_BINDING_CALL Mock_glFramebufferTexture2D(GLenum target,
+                                                        GLenum attachment,
+                                                        GLenum textarget,
+                                                        GLuint texture,
+                                                        GLint level);
+static void GL_BINDING_CALL Mock_glFramebufferTexture2DEXT(GLenum target,
+                                                           GLenum attachment,
+                                                           GLenum textarget,
+                                                           GLuint texture,
+                                                           GLint level);
+static void GL_BINDING_CALL
+Mock_glFramebufferTexture2DMultisampleEXT(GLenum target,
+                                          GLenum attachment,
+                                          GLenum textarget,
+                                          GLuint texture,
+                                          GLint level,
+                                          GLsizei samples);
+static void GL_BINDING_CALL
+Mock_glFramebufferTexture2DMultisampleIMG(GLenum target,
+                                          GLenum attachment,
+                                          GLenum textarget,
+                                          GLuint texture,
+                                          GLint level,
+                                          GLsizei samples);
+static void GL_BINDING_CALL Mock_glFramebufferTextureLayer(GLenum target,
+                                                           GLenum attachment,
+                                                           GLuint texture,
+                                                           GLint level,
+                                                           GLint layer);
+static void GL_BINDING_CALL Mock_glFrontFace(GLenum mode);
+static void GL_BINDING_CALL Mock_glGenBuffers(GLsizei n, GLuint* buffers);
+static void GL_BINDING_CALL Mock_glGenBuffersARB(GLsizei n, GLuint* buffers);
+static void GL_BINDING_CALL Mock_glGenFencesAPPLE(GLsizei n, GLuint* fences);
+static void GL_BINDING_CALL Mock_glGenFencesNV(GLsizei n, GLuint* fences);
+static void GL_BINDING_CALL
+Mock_glGenFramebuffers(GLsizei n, GLuint* framebuffers);
+static void GL_BINDING_CALL
+Mock_glGenFramebuffersEXT(GLsizei n, GLuint* framebuffers);
+static void GL_BINDING_CALL Mock_glGenQueries(GLsizei n, GLuint* ids);
+static void GL_BINDING_CALL Mock_glGenQueriesARB(GLsizei n, GLuint* ids);
+static void GL_BINDING_CALL Mock_glGenQueriesEXT(GLsizei n, GLuint* ids);
+static void GL_BINDING_CALL
+Mock_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers);
+static void GL_BINDING_CALL
+Mock_glGenRenderbuffersEXT(GLsizei n, GLuint* renderbuffers);
+static void GL_BINDING_CALL Mock_glGenSamplers(GLsizei n, GLuint* samplers);
+static void GL_BINDING_CALL Mock_glGenTextures(GLsizei n, GLuint* textures);
+static void GL_BINDING_CALL
+Mock_glGenTransformFeedbacks(GLsizei n, GLuint* ids);
+static void GL_BINDING_CALL Mock_glGenVertexArrays(GLsizei n, GLuint* arrays);
+static void GL_BINDING_CALL
+Mock_glGenVertexArraysAPPLE(GLsizei n, GLuint* arrays);
+static void GL_BINDING_CALL
+Mock_glGenVertexArraysOES(GLsizei n, GLuint* arrays);
+static void GL_BINDING_CALL Mock_glGenerateMipmap(GLenum target);
+static void GL_BINDING_CALL Mock_glGenerateMipmapEXT(GLenum target);
+static void GL_BINDING_CALL Mock_glGetActiveAttrib(GLuint program,
+                                                   GLuint index,
+                                                   GLsizei bufsize,
+                                                   GLsizei* length,
+                                                   GLint* size,
+                                                   GLenum* type,
+                                                   char* name);
+static void GL_BINDING_CALL Mock_glGetActiveUniform(GLuint program,
+                                                    GLuint index,
+                                                    GLsizei bufsize,
+                                                    GLsizei* length,
+                                                    GLint* size,
+                                                    GLenum* type,
+                                                    char* name);
+static void GL_BINDING_CALL
+Mock_glGetActiveUniformBlockName(GLuint program,
+                                 GLuint uniformBlockIndex,
+                                 GLsizei bufSize,
+                                 GLsizei* length,
+                                 char* uniformBlockName);
+static void GL_BINDING_CALL
+Mock_glGetActiveUniformBlockiv(GLuint program,
+                               GLuint uniformBlockIndex,
+                               GLenum pname,
+                               GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetActiveUniformsiv(GLuint program,
+                           GLsizei uniformCount,
+                           const GLuint* uniformIndices,
+                           GLenum pname,
+                           GLint* params);
+static void GL_BINDING_CALL Mock_glGetAttachedShaders(GLuint program,
+                                                      GLsizei maxcount,
+                                                      GLsizei* count,
+                                                      GLuint* shaders);
+static GLint GL_BINDING_CALL
+Mock_glGetAttribLocation(GLuint program, const char* name);
+static void GL_BINDING_CALL Mock_glGetBooleanv(GLenum pname, GLboolean* params);
+static void GL_BINDING_CALL
+Mock_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
+static GLenum GL_BINDING_CALL Mock_glGetError(void);
+static void GL_BINDING_CALL
+Mock_glGetFenceivNV(GLuint fence, GLenum pname, GLint* params);
+static void GL_BINDING_CALL Mock_glGetFloatv(GLenum pname, GLfloat* params);
+static GLint GL_BINDING_CALL
+Mock_glGetFragDataLocation(GLuint program, const char* name);
+static void GL_BINDING_CALL
+Mock_glGetFramebufferAttachmentParameteriv(GLenum target,
+                                           GLenum attachment,
+                                           GLenum pname,
+                                           GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetFramebufferAttachmentParameterivEXT(GLenum target,
+                                              GLenum attachment,
+                                              GLenum pname,
+                                              GLint* params);
+static GLenum GL_BINDING_CALL Mock_glGetGraphicsResetStatus(void);
+static GLenum GL_BINDING_CALL Mock_glGetGraphicsResetStatusARB(void);
+static GLenum GL_BINDING_CALL Mock_glGetGraphicsResetStatusEXT(void);
+static GLenum GL_BINDING_CALL Mock_glGetGraphicsResetStatusKHR(void);
+static void GL_BINDING_CALL
+Mock_glGetInteger64i_v(GLenum target, GLuint index, GLint64* data);
+static void GL_BINDING_CALL Mock_glGetInteger64v(GLenum pname, GLint64* params);
+static void GL_BINDING_CALL
+Mock_glGetIntegeri_v(GLenum target, GLuint index, GLint* data);
+static void GL_BINDING_CALL Mock_glGetIntegerv(GLenum pname, GLint* params);
+static void GL_BINDING_CALL Mock_glGetInternalformativ(GLenum target,
+                                                       GLenum internalformat,
+                                                       GLenum pname,
+                                                       GLsizei bufSize,
+                                                       GLint* params);
+static void GL_BINDING_CALL Mock_glGetProgramBinary(GLuint program,
+                                                    GLsizei bufSize,
+                                                    GLsizei* length,
+                                                    GLenum* binaryFormat,
+                                                    GLvoid* binary);
+static void GL_BINDING_CALL Mock_glGetProgramBinaryOES(GLuint program,
+                                                       GLsizei bufSize,
+                                                       GLsizei* length,
+                                                       GLenum* binaryFormat,
+                                                       GLvoid* binary);
+static void GL_BINDING_CALL Mock_glGetProgramInfoLog(GLuint program,
+                                                     GLsizei bufsize,
+                                                     GLsizei* length,
+                                                     char* infolog);
+static void GL_BINDING_CALL
+Mock_glGetProgramiv(GLuint program, GLenum pname, GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjectiv(GLuint id, GLenum pname, GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjectivARB(GLuint id, GLenum pname, GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjectivEXT(GLuint id, GLenum pname, GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryiv(GLenum target, GLenum pname, GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryivARB(GLenum target, GLenum pname, GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetQueryivEXT(GLenum target, GLenum pname, GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);
+static void GL_BINDING_CALL Mock_glGetRenderbufferParameterivEXT(GLenum target,
+                                                                 GLenum pname,
+                                                                 GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params);
+static void GL_BINDING_CALL
+Mock_glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params);
+static void GL_BINDING_CALL Mock_glGetShaderInfoLog(GLuint shader,
+                                                    GLsizei bufsize,
+                                                    GLsizei* length,
+                                                    char* infolog);
+static void GL_BINDING_CALL
+Mock_glGetShaderPrecisionFormat(GLenum shadertype,
+                                GLenum precisiontype,
+                                GLint* range,
+                                GLint* precision);
+static void GL_BINDING_CALL Mock_glGetShaderSource(GLuint shader,
+                                                   GLsizei bufsize,
+                                                   GLsizei* length,
+                                                   char* source);
+static void GL_BINDING_CALL
+Mock_glGetShaderiv(GLuint shader, GLenum pname, GLint* params);
+static const GLubyte* GL_BINDING_CALL Mock_glGetString(GLenum name);
+static void GL_BINDING_CALL Mock_glGetSynciv(GLsync sync,
+                                             GLenum pname,
+                                             GLsizei bufSize,
+                                             GLsizei* length,
+                                             GLint* values);
+static void GL_BINDING_CALL Mock_glGetTexLevelParameterfv(GLenum target,
+                                                          GLint level,
+                                                          GLenum pname,
+                                                          GLfloat* params);
+static void GL_BINDING_CALL Mock_glGetTexLevelParameteriv(GLenum target,
+                                                          GLint level,
+                                                          GLenum pname,
+                                                          GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params);
+static void GL_BINDING_CALL
+Mock_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params);
+static void GL_BINDING_CALL Mock_glGetTransformFeedbackVarying(GLuint program,
+                                                               GLuint index,
+                                                               GLsizei bufSize,
+                                                               GLsizei* length,
+                                                               GLenum* type,
+                                                               char* name);
+static void GL_BINDING_CALL
+Mock_glGetTranslatedShaderSourceANGLE(GLuint shader,
+                                      GLsizei bufsize,
+                                      GLsizei* length,
+                                      char* source);
+static GLuint GL_BINDING_CALL
+Mock_glGetUniformBlockIndex(GLuint program, const char* uniformBlockName);
+static void GL_BINDING_CALL
+Mock_glGetUniformIndices(GLuint program,
+                         GLsizei uniformCount,
+                         const char* const* uniformNames,
+                         GLuint* uniformIndices);
+static GLint GL_BINDING_CALL
+Mock_glGetUniformLocation(GLuint program, const char* name);
+static void GL_BINDING_CALL
+Mock_glGetUniformfv(GLuint program, GLint location, GLfloat* params);
+static void GL_BINDING_CALL
+Mock_glGetUniformiv(GLuint program, GLint location, GLint* params);
+static void GL_BINDING_CALL
+Mock_glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer);
+static void GL_BINDING_CALL
+Mock_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
+static void GL_BINDING_CALL
+Mock_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
+static void GL_BINDING_CALL Mock_glHint(GLenum target, GLenum mode);
+static void GL_BINDING_CALL
+Mock_glInsertEventMarkerEXT(GLsizei length, const char* marker);
+static void GL_BINDING_CALL
+Mock_glInvalidateFramebuffer(GLenum target,
+                             GLsizei numAttachments,
+                             const GLenum* attachments);
+static void GL_BINDING_CALL
+Mock_glInvalidateSubFramebuffer(GLenum target,
+                                GLsizei numAttachments,
+                                const GLenum* attachments,
+                                GLint x,
+                                GLint y,
+                                GLint width,
+                                GLint height);
+static GLboolean GL_BINDING_CALL Mock_glIsBuffer(GLuint buffer);
+static GLboolean GL_BINDING_CALL Mock_glIsEnabled(GLenum cap);
+static GLboolean GL_BINDING_CALL Mock_glIsFenceAPPLE(GLuint fence);
+static GLboolean GL_BINDING_CALL Mock_glIsFenceNV(GLuint fence);
+static GLboolean GL_BINDING_CALL Mock_glIsFramebuffer(GLuint framebuffer);
+static GLboolean GL_BINDING_CALL Mock_glIsFramebufferEXT(GLuint framebuffer);
+static GLboolean GL_BINDING_CALL Mock_glIsProgram(GLuint program);
+static GLboolean GL_BINDING_CALL Mock_glIsQuery(GLuint query);
+static GLboolean GL_BINDING_CALL Mock_glIsQueryARB(GLuint query);
+static GLboolean GL_BINDING_CALL Mock_glIsQueryEXT(GLuint query);
+static GLboolean GL_BINDING_CALL Mock_glIsRenderbuffer(GLuint renderbuffer);
+static GLboolean GL_BINDING_CALL Mock_glIsRenderbufferEXT(GLuint renderbuffer);
+static GLboolean GL_BINDING_CALL Mock_glIsSampler(GLuint sampler);
+static GLboolean GL_BINDING_CALL Mock_glIsShader(GLuint shader);
+static GLboolean GL_BINDING_CALL Mock_glIsSync(GLsync sync);
+static GLboolean GL_BINDING_CALL Mock_glIsTexture(GLuint texture);
+static GLboolean GL_BINDING_CALL Mock_glIsTransformFeedback(GLuint id);
+static GLboolean GL_BINDING_CALL Mock_glIsVertexArray(GLuint array);
+static GLboolean GL_BINDING_CALL Mock_glIsVertexArrayAPPLE(GLuint array);
+static GLboolean GL_BINDING_CALL Mock_glIsVertexArrayOES(GLuint array);
+static void GL_BINDING_CALL Mock_glLineWidth(GLfloat width);
+static void GL_BINDING_CALL Mock_glLinkProgram(GLuint program);
+static void* GL_BINDING_CALL Mock_glMapBuffer(GLenum target, GLenum access);
+static void* GL_BINDING_CALL Mock_glMapBufferOES(GLenum target, GLenum access);
+static void* GL_BINDING_CALL Mock_glMapBufferRange(GLenum target,
+                                                   GLintptr offset,
+                                                   GLsizeiptr length,
+                                                   GLbitfield access);
+static void* GL_BINDING_CALL Mock_glMapBufferRangeEXT(GLenum target,
+                                                      GLintptr offset,
+                                                      GLsizeiptr length,
+                                                      GLbitfield access);
+static void GL_BINDING_CALL Mock_glMatrixLoadIdentityEXT(GLenum matrixMode);
+static void GL_BINDING_CALL
+Mock_glMatrixLoadfEXT(GLenum matrixMode, const GLfloat* m);
+static void GL_BINDING_CALL Mock_glPauseTransformFeedback(void);
+static void GL_BINDING_CALL Mock_glPixelStorei(GLenum pname, GLint param);
+static void GL_BINDING_CALL Mock_glPointParameteri(GLenum pname, GLint param);
+static void GL_BINDING_CALL Mock_glPolygonOffset(GLfloat factor, GLfloat units);
+static void GL_BINDING_CALL Mock_glPopGroupMarkerEXT(void);
+static void GL_BINDING_CALL Mock_glProgramBinary(GLuint program,
+                                                 GLenum binaryFormat,
+                                                 const GLvoid* binary,
+                                                 GLsizei length);
+static void GL_BINDING_CALL Mock_glProgramBinaryOES(GLuint program,
+                                                    GLenum binaryFormat,
+                                                    const GLvoid* binary,
+                                                    GLsizei length);
+static void GL_BINDING_CALL
+Mock_glProgramParameteri(GLuint program, GLenum pname, GLint value);
+static void GL_BINDING_CALL
+Mock_glPushGroupMarkerEXT(GLsizei length, const char* marker);
+static void GL_BINDING_CALL Mock_glQueryCounter(GLuint id, GLenum target);
+static void GL_BINDING_CALL Mock_glQueryCounterEXT(GLuint id, GLenum target);
+static void GL_BINDING_CALL Mock_glReadBuffer(GLenum src);
+static void GL_BINDING_CALL Mock_glReadPixels(GLint x,
+                                              GLint y,
+                                              GLsizei width,
+                                              GLsizei height,
+                                              GLenum format,
+                                              GLenum type,
+                                              void* pixels);
+static void GL_BINDING_CALL Mock_glReleaseShaderCompiler(void);
+static void GL_BINDING_CALL Mock_glRenderbufferStorage(GLenum target,
+                                                       GLenum internalformat,
+                                                       GLsizei width,
+                                                       GLsizei height);
+static void GL_BINDING_CALL Mock_glRenderbufferStorageEXT(GLenum target,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height);
+static void GL_BINDING_CALL
+Mock_glRenderbufferStorageMultisample(GLenum target,
+                                      GLsizei samples,
+                                      GLenum internalformat,
+                                      GLsizei width,
+                                      GLsizei height);
+static void GL_BINDING_CALL
+Mock_glRenderbufferStorageMultisampleANGLE(GLenum target,
+                                           GLsizei samples,
+                                           GLenum internalformat,
+                                           GLsizei width,
+                                           GLsizei height);
+static void GL_BINDING_CALL
+Mock_glRenderbufferStorageMultisampleEXT(GLenum target,
+                                         GLsizei samples,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height);
+static void GL_BINDING_CALL
+Mock_glRenderbufferStorageMultisampleIMG(GLenum target,
+                                         GLsizei samples,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height);
+static void GL_BINDING_CALL Mock_glResumeTransformFeedback(void);
+static void GL_BINDING_CALL
+Mock_glSampleCoverage(GLclampf value, GLboolean invert);
+static void GL_BINDING_CALL
+Mock_glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+static void GL_BINDING_CALL
+Mock_glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* params);
+static void GL_BINDING_CALL
+Mock_glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+static void GL_BINDING_CALL
+Mock_glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* params);
+static void GL_BINDING_CALL
+Mock_glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+static void GL_BINDING_CALL Mock_glSetFenceAPPLE(GLuint fence);
+static void GL_BINDING_CALL Mock_glSetFenceNV(GLuint fence, GLenum condition);
+static void GL_BINDING_CALL Mock_glShaderBinary(GLsizei n,
+                                                const GLuint* shaders,
+                                                GLenum binaryformat,
+                                                const void* binary,
+                                                GLsizei length);
+static void GL_BINDING_CALL Mock_glShaderSource(GLuint shader,
+                                                GLsizei count,
+                                                const char* const* str,
+                                                const GLint* length);
+static void GL_BINDING_CALL
+Mock_glStencilFunc(GLenum func, GLint ref, GLuint mask);
+static void GL_BINDING_CALL
+Mock_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+static void GL_BINDING_CALL Mock_glStencilMask(GLuint mask);
+static void GL_BINDING_CALL
+Mock_glStencilMaskSeparate(GLenum face, GLuint mask);
+static void GL_BINDING_CALL
+Mock_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+static void GL_BINDING_CALL
+Mock_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+static GLboolean GL_BINDING_CALL Mock_glTestFenceAPPLE(GLuint fence);
+static GLboolean GL_BINDING_CALL Mock_glTestFenceNV(GLuint fence);
+static void GL_BINDING_CALL Mock_glTexImage2D(GLenum target,
+                                              GLint level,
+                                              GLint internalformat,
+                                              GLsizei width,
+                                              GLsizei height,
+                                              GLint border,
+                                              GLenum format,
+                                              GLenum type,
+                                              const void* pixels);
+static void GL_BINDING_CALL Mock_glTexImage3D(GLenum target,
+                                              GLint level,
+                                              GLint internalformat,
+                                              GLsizei width,
+                                              GLsizei height,
+                                              GLsizei depth,
+                                              GLint border,
+                                              GLenum format,
+                                              GLenum type,
+                                              const void* pixels);
+static void GL_BINDING_CALL
+Mock_glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+static void GL_BINDING_CALL
+Mock_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params);
+static void GL_BINDING_CALL
+Mock_glTexParameteri(GLenum target, GLenum pname, GLint param);
+static void GL_BINDING_CALL
+Mock_glTexParameteriv(GLenum target, GLenum pname, const GLint* params);
+static void GL_BINDING_CALL Mock_glTexStorage2D(GLenum target,
+                                                GLsizei levels,
+                                                GLenum internalformat,
+                                                GLsizei width,
+                                                GLsizei height);
+static void GL_BINDING_CALL Mock_glTexStorage2DEXT(GLenum target,
+                                                   GLsizei levels,
+                                                   GLenum internalformat,
+                                                   GLsizei width,
+                                                   GLsizei height);
+static void GL_BINDING_CALL Mock_glTexStorage3D(GLenum target,
+                                                GLsizei levels,
+                                                GLenum internalformat,
+                                                GLsizei width,
+                                                GLsizei height,
+                                                GLsizei depth);
+static void GL_BINDING_CALL Mock_glTexSubImage2D(GLenum target,
+                                                 GLint level,
+                                                 GLint xoffset,
+                                                 GLint yoffset,
+                                                 GLsizei width,
+                                                 GLsizei height,
+                                                 GLenum format,
+                                                 GLenum type,
+                                                 const void* pixels);
+static void GL_BINDING_CALL
+Mock_glTransformFeedbackVaryings(GLuint program,
+                                 GLsizei count,
+                                 const char* const* varyings,
+                                 GLenum bufferMode);
+static void GL_BINDING_CALL Mock_glUniform1f(GLint location, GLfloat x);
+static void GL_BINDING_CALL
+Mock_glUniform1fv(GLint location, GLsizei count, const GLfloat* v);
+static void GL_BINDING_CALL Mock_glUniform1i(GLint location, GLint x);
+static void GL_BINDING_CALL
+Mock_glUniform1iv(GLint location, GLsizei count, const GLint* v);
+static void GL_BINDING_CALL Mock_glUniform1ui(GLint location, GLuint v0);
+static void GL_BINDING_CALL
+Mock_glUniform1uiv(GLint location, GLsizei count, const GLuint* v);
+static void GL_BINDING_CALL
+Mock_glUniform2f(GLint location, GLfloat x, GLfloat y);
+static void GL_BINDING_CALL
+Mock_glUniform2fv(GLint location, GLsizei count, const GLfloat* v);
+static void GL_BINDING_CALL Mock_glUniform2i(GLint location, GLint x, GLint y);
+static void GL_BINDING_CALL
+Mock_glUniform2iv(GLint location, GLsizei count, const GLint* v);
+static void GL_BINDING_CALL
+Mock_glUniform2ui(GLint location, GLuint v0, GLuint v1);
+static void GL_BINDING_CALL
+Mock_glUniform2uiv(GLint location, GLsizei count, const GLuint* v);
+static void GL_BINDING_CALL
+Mock_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
+static void GL_BINDING_CALL
+Mock_glUniform3fv(GLint location, GLsizei count, const GLfloat* v);
+static void GL_BINDING_CALL
+Mock_glUniform3i(GLint location, GLint x, GLint y, GLint z);
+static void GL_BINDING_CALL
+Mock_glUniform3iv(GLint location, GLsizei count, const GLint* v);
+static void GL_BINDING_CALL
+Mock_glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+static void GL_BINDING_CALL
+Mock_glUniform3uiv(GLint location, GLsizei count, const GLuint* v);
+static void GL_BINDING_CALL
+Mock_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+static void GL_BINDING_CALL
+Mock_glUniform4fv(GLint location, GLsizei count, const GLfloat* v);
+static void GL_BINDING_CALL
+Mock_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
+static void GL_BINDING_CALL
+Mock_glUniform4iv(GLint location, GLsizei count, const GLint* v);
+static void GL_BINDING_CALL
+Mock_glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+static void GL_BINDING_CALL
+Mock_glUniform4uiv(GLint location, GLsizei count, const GLuint* v);
+static void GL_BINDING_CALL
+Mock_glUniformBlockBinding(GLuint program,
+                           GLuint uniformBlockIndex,
+                           GLuint uniformBlockBinding);
+static void GL_BINDING_CALL Mock_glUniformMatrix2fv(GLint location,
+                                                    GLsizei count,
+                                                    GLboolean transpose,
+                                                    const GLfloat* value);
+static void GL_BINDING_CALL Mock_glUniformMatrix2x3fv(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+static void GL_BINDING_CALL Mock_glUniformMatrix2x4fv(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+static void GL_BINDING_CALL Mock_glUniformMatrix3fv(GLint location,
+                                                    GLsizei count,
+                                                    GLboolean transpose,
+                                                    const GLfloat* value);
+static void GL_BINDING_CALL Mock_glUniformMatrix3x2fv(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+static void GL_BINDING_CALL Mock_glUniformMatrix3x4fv(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+static void GL_BINDING_CALL Mock_glUniformMatrix4fv(GLint location,
+                                                    GLsizei count,
+                                                    GLboolean transpose,
+                                                    const GLfloat* value);
+static void GL_BINDING_CALL Mock_glUniformMatrix4x2fv(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+static void GL_BINDING_CALL Mock_glUniformMatrix4x3fv(GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat* value);
+static GLboolean GL_BINDING_CALL Mock_glUnmapBuffer(GLenum target);
+static GLboolean GL_BINDING_CALL Mock_glUnmapBufferOES(GLenum target);
+static void GL_BINDING_CALL Mock_glUseProgram(GLuint program);
+static void GL_BINDING_CALL Mock_glValidateProgram(GLuint program);
+static void GL_BINDING_CALL Mock_glVertexAttrib1f(GLuint indx, GLfloat x);
+static void GL_BINDING_CALL
+Mock_glVertexAttrib1fv(GLuint indx, const GLfloat* values);
+static void GL_BINDING_CALL
+Mock_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
+static void GL_BINDING_CALL
+Mock_glVertexAttrib2fv(GLuint indx, const GLfloat* values);
+static void GL_BINDING_CALL
+Mock_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+static void GL_BINDING_CALL
+Mock_glVertexAttrib3fv(GLuint indx, const GLfloat* values);
+static void GL_BINDING_CALL
+Mock_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+static void GL_BINDING_CALL
+Mock_glVertexAttrib4fv(GLuint indx, const GLfloat* values);
+static void GL_BINDING_CALL
+Mock_glVertexAttribDivisor(GLuint index, GLuint divisor);
+static void GL_BINDING_CALL
+Mock_glVertexAttribDivisorANGLE(GLuint index, GLuint divisor);
+static void GL_BINDING_CALL
+Mock_glVertexAttribDivisorARB(GLuint index, GLuint divisor);
+static void GL_BINDING_CALL
+Mock_glVertexAttribI4i(GLuint indx, GLint x, GLint y, GLint z, GLint w);
+static void GL_BINDING_CALL
+Mock_glVertexAttribI4iv(GLuint indx, const GLint* values);
+static void GL_BINDING_CALL
+Mock_glVertexAttribI4ui(GLuint indx, GLuint x, GLuint y, GLuint z, GLuint w);
+static void GL_BINDING_CALL
+Mock_glVertexAttribI4uiv(GLuint indx, const GLuint* values);
+static void GL_BINDING_CALL Mock_glVertexAttribIPointer(GLuint indx,
+                                                        GLint size,
+                                                        GLenum type,
+                                                        GLsizei stride,
+                                                        const void* ptr);
+static void GL_BINDING_CALL Mock_glVertexAttribPointer(GLuint indx,
+                                                       GLint size,
+                                                       GLenum type,
+                                                       GLboolean normalized,
+                                                       GLsizei stride,
+                                                       const void* ptr);
+static void GL_BINDING_CALL
+Mock_glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+static GLenum GL_BINDING_CALL
+Mock_glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
diff --git a/ui/gl/gl_bindings_autogen_osmesa.cc b/ui/gl/gl_bindings_autogen_osmesa.cc
new file mode 100644
index 0000000..c0c3ed2
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_osmesa.cc
@@ -0,0 +1,372 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#include <string>
+
+#include "base/debug/trace_event.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_enums.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_osmesa_api_implementation.h"
+#include "ui/gl/gl_version_info.h"
+
+namespace gfx {
+
+static bool g_debugBindingsInitialized;
+DriverOSMESA g_driver_osmesa;
+
+void DriverOSMESA::InitializeStaticBindings() {
+  fn.OSMesaColorClampFn = reinterpret_cast<OSMesaColorClampProc>(
+      GetGLProcAddress("OSMesaColorClamp"));
+  fn.OSMesaCreateContextFn = reinterpret_cast<OSMesaCreateContextProc>(
+      GetGLProcAddress("OSMesaCreateContext"));
+  fn.OSMesaCreateContextExtFn = reinterpret_cast<OSMesaCreateContextExtProc>(
+      GetGLProcAddress("OSMesaCreateContextExt"));
+  fn.OSMesaDestroyContextFn = reinterpret_cast<OSMesaDestroyContextProc>(
+      GetGLProcAddress("OSMesaDestroyContext"));
+  fn.OSMesaGetColorBufferFn = reinterpret_cast<OSMesaGetColorBufferProc>(
+      GetGLProcAddress("OSMesaGetColorBuffer"));
+  fn.OSMesaGetCurrentContextFn = reinterpret_cast<OSMesaGetCurrentContextProc>(
+      GetGLProcAddress("OSMesaGetCurrentContext"));
+  fn.OSMesaGetDepthBufferFn = reinterpret_cast<OSMesaGetDepthBufferProc>(
+      GetGLProcAddress("OSMesaGetDepthBuffer"));
+  fn.OSMesaGetIntegervFn = reinterpret_cast<OSMesaGetIntegervProc>(
+      GetGLProcAddress("OSMesaGetIntegerv"));
+  fn.OSMesaGetProcAddressFn = reinterpret_cast<OSMesaGetProcAddressProc>(
+      GetGLProcAddress("OSMesaGetProcAddress"));
+  fn.OSMesaMakeCurrentFn = reinterpret_cast<OSMesaMakeCurrentProc>(
+      GetGLProcAddress("OSMesaMakeCurrent"));
+  fn.OSMesaPixelStoreFn = reinterpret_cast<OSMesaPixelStoreProc>(
+      GetGLProcAddress("OSMesaPixelStore"));
+}
+
+void DriverOSMESA::InitializeDynamicBindings(GLContext* context) {
+  DCHECK(context && context->IsCurrent(NULL));
+  const GLVersionInfo* ver = context->GetVersionInfo();
+  ALLOW_UNUSED_LOCAL(ver);
+  std::string extensions = context->GetExtensions() + " ";
+  ALLOW_UNUSED_LOCAL(extensions);
+
+  if (g_debugBindingsInitialized)
+    InitializeDebugBindings();
+}
+
+extern "C" {
+
+static void GL_BINDING_CALL Debug_OSMesaColorClamp(GLboolean enable) {
+  GL_SERVICE_LOG("OSMesaColorClamp"
+                 << "(" << GLEnums::GetStringBool(enable) << ")");
+  g_driver_osmesa.debug_fn.OSMesaColorClampFn(enable);
+}
+
+static OSMesaContext GL_BINDING_CALL
+Debug_OSMesaCreateContext(GLenum format, OSMesaContext sharelist) {
+  GL_SERVICE_LOG("OSMesaCreateContext"
+                 << "(" << GLEnums::GetStringEnum(format) << ", " << sharelist
+                 << ")");
+  OSMesaContext result =
+      g_driver_osmesa.debug_fn.OSMesaCreateContextFn(format, sharelist);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static OSMesaContext GL_BINDING_CALL
+Debug_OSMesaCreateContextExt(GLenum format,
+                             GLint depthBits,
+                             GLint stencilBits,
+                             GLint accumBits,
+                             OSMesaContext sharelist) {
+  GL_SERVICE_LOG("OSMesaCreateContextExt"
+                 << "(" << GLEnums::GetStringEnum(format) << ", " << depthBits
+                 << ", " << stencilBits << ", " << accumBits << ", "
+                 << sharelist << ")");
+  OSMesaContext result = g_driver_osmesa.debug_fn.OSMesaCreateContextExtFn(
+      format, depthBits, stencilBits, accumBits, sharelist);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_OSMesaDestroyContext(OSMesaContext ctx) {
+  GL_SERVICE_LOG("OSMesaDestroyContext"
+                 << "(" << ctx << ")");
+  g_driver_osmesa.debug_fn.OSMesaDestroyContextFn(ctx);
+}
+
+static GLboolean GL_BINDING_CALL Debug_OSMesaGetColorBuffer(OSMesaContext c,
+                                                            GLint* width,
+                                                            GLint* height,
+                                                            GLint* format,
+                                                            void** buffer) {
+  GL_SERVICE_LOG("OSMesaGetColorBuffer"
+                 << "(" << c << ", " << static_cast<const void*>(width) << ", "
+                 << static_cast<const void*>(height) << ", "
+                 << static_cast<const void*>(format) << ", " << buffer << ")");
+  GLboolean result = g_driver_osmesa.debug_fn.OSMesaGetColorBufferFn(
+      c, width, height, format, buffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static OSMesaContext GL_BINDING_CALL Debug_OSMesaGetCurrentContext(void) {
+  GL_SERVICE_LOG("OSMesaGetCurrentContext"
+                 << "("
+                 << ")");
+  OSMesaContext result = g_driver_osmesa.debug_fn.OSMesaGetCurrentContextFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL
+Debug_OSMesaGetDepthBuffer(OSMesaContext c,
+                           GLint* width,
+                           GLint* height,
+                           GLint* bytesPerValue,
+                           void** buffer) {
+  GL_SERVICE_LOG("OSMesaGetDepthBuffer"
+                 << "(" << c << ", " << static_cast<const void*>(width) << ", "
+                 << static_cast<const void*>(height) << ", "
+                 << static_cast<const void*>(bytesPerValue) << ", " << buffer
+                 << ")");
+  GLboolean result = g_driver_osmesa.debug_fn.OSMesaGetDepthBufferFn(
+      c, width, height, bytesPerValue, buffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_OSMesaGetIntegerv(GLint pname, GLint* value) {
+  GL_SERVICE_LOG("OSMesaGetIntegerv"
+                 << "(" << pname << ", " << static_cast<const void*>(value)
+                 << ")");
+  g_driver_osmesa.debug_fn.OSMesaGetIntegervFn(pname, value);
+}
+
+static OSMESAproc GL_BINDING_CALL
+Debug_OSMesaGetProcAddress(const char* funcName) {
+  GL_SERVICE_LOG("OSMesaGetProcAddress"
+                 << "(" << funcName << ")");
+  OSMESAproc result = g_driver_osmesa.debug_fn.OSMesaGetProcAddressFn(funcName);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static GLboolean GL_BINDING_CALL Debug_OSMesaMakeCurrent(OSMesaContext ctx,
+                                                         void* buffer,
+                                                         GLenum type,
+                                                         GLsizei width,
+                                                         GLsizei height) {
+  GL_SERVICE_LOG("OSMesaMakeCurrent"
+                 << "(" << ctx << ", " << static_cast<const void*>(buffer)
+                 << ", " << GLEnums::GetStringEnum(type) << ", " << width
+                 << ", " << height << ")");
+  GLboolean result = g_driver_osmesa.debug_fn.OSMesaMakeCurrentFn(
+      ctx, buffer, type, width, height);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static void GL_BINDING_CALL Debug_OSMesaPixelStore(GLint pname, GLint value) {
+  GL_SERVICE_LOG("OSMesaPixelStore"
+                 << "(" << pname << ", " << value << ")");
+  g_driver_osmesa.debug_fn.OSMesaPixelStoreFn(pname, value);
+}
+}  // extern "C"
+
+void DriverOSMESA::InitializeDebugBindings() {
+  if (!debug_fn.OSMesaColorClampFn) {
+    debug_fn.OSMesaColorClampFn = fn.OSMesaColorClampFn;
+    fn.OSMesaColorClampFn = Debug_OSMesaColorClamp;
+  }
+  if (!debug_fn.OSMesaCreateContextFn) {
+    debug_fn.OSMesaCreateContextFn = fn.OSMesaCreateContextFn;
+    fn.OSMesaCreateContextFn = Debug_OSMesaCreateContext;
+  }
+  if (!debug_fn.OSMesaCreateContextExtFn) {
+    debug_fn.OSMesaCreateContextExtFn = fn.OSMesaCreateContextExtFn;
+    fn.OSMesaCreateContextExtFn = Debug_OSMesaCreateContextExt;
+  }
+  if (!debug_fn.OSMesaDestroyContextFn) {
+    debug_fn.OSMesaDestroyContextFn = fn.OSMesaDestroyContextFn;
+    fn.OSMesaDestroyContextFn = Debug_OSMesaDestroyContext;
+  }
+  if (!debug_fn.OSMesaGetColorBufferFn) {
+    debug_fn.OSMesaGetColorBufferFn = fn.OSMesaGetColorBufferFn;
+    fn.OSMesaGetColorBufferFn = Debug_OSMesaGetColorBuffer;
+  }
+  if (!debug_fn.OSMesaGetCurrentContextFn) {
+    debug_fn.OSMesaGetCurrentContextFn = fn.OSMesaGetCurrentContextFn;
+    fn.OSMesaGetCurrentContextFn = Debug_OSMesaGetCurrentContext;
+  }
+  if (!debug_fn.OSMesaGetDepthBufferFn) {
+    debug_fn.OSMesaGetDepthBufferFn = fn.OSMesaGetDepthBufferFn;
+    fn.OSMesaGetDepthBufferFn = Debug_OSMesaGetDepthBuffer;
+  }
+  if (!debug_fn.OSMesaGetIntegervFn) {
+    debug_fn.OSMesaGetIntegervFn = fn.OSMesaGetIntegervFn;
+    fn.OSMesaGetIntegervFn = Debug_OSMesaGetIntegerv;
+  }
+  if (!debug_fn.OSMesaGetProcAddressFn) {
+    debug_fn.OSMesaGetProcAddressFn = fn.OSMesaGetProcAddressFn;
+    fn.OSMesaGetProcAddressFn = Debug_OSMesaGetProcAddress;
+  }
+  if (!debug_fn.OSMesaMakeCurrentFn) {
+    debug_fn.OSMesaMakeCurrentFn = fn.OSMesaMakeCurrentFn;
+    fn.OSMesaMakeCurrentFn = Debug_OSMesaMakeCurrent;
+  }
+  if (!debug_fn.OSMesaPixelStoreFn) {
+    debug_fn.OSMesaPixelStoreFn = fn.OSMesaPixelStoreFn;
+    fn.OSMesaPixelStoreFn = Debug_OSMesaPixelStore;
+  }
+  g_debugBindingsInitialized = true;
+}
+
+void DriverOSMESA::ClearBindings() {
+  memset(this, 0, sizeof(*this));
+}
+
+void OSMESAApiBase::OSMesaColorClampFn(GLboolean enable) {
+  driver_->fn.OSMesaColorClampFn(enable);
+}
+
+OSMesaContext OSMESAApiBase::OSMesaCreateContextFn(GLenum format,
+                                                   OSMesaContext sharelist) {
+  return driver_->fn.OSMesaCreateContextFn(format, sharelist);
+}
+
+OSMesaContext OSMESAApiBase::OSMesaCreateContextExtFn(GLenum format,
+                                                      GLint depthBits,
+                                                      GLint stencilBits,
+                                                      GLint accumBits,
+                                                      OSMesaContext sharelist) {
+  return driver_->fn.OSMesaCreateContextExtFn(format, depthBits, stencilBits,
+                                              accumBits, sharelist);
+}
+
+void OSMESAApiBase::OSMesaDestroyContextFn(OSMesaContext ctx) {
+  driver_->fn.OSMesaDestroyContextFn(ctx);
+}
+
+GLboolean OSMESAApiBase::OSMesaGetColorBufferFn(OSMesaContext c,
+                                                GLint* width,
+                                                GLint* height,
+                                                GLint* format,
+                                                void** buffer) {
+  return driver_->fn.OSMesaGetColorBufferFn(c, width, height, format, buffer);
+}
+
+OSMesaContext OSMESAApiBase::OSMesaGetCurrentContextFn(void) {
+  return driver_->fn.OSMesaGetCurrentContextFn();
+}
+
+GLboolean OSMESAApiBase::OSMesaGetDepthBufferFn(OSMesaContext c,
+                                                GLint* width,
+                                                GLint* height,
+                                                GLint* bytesPerValue,
+                                                void** buffer) {
+  return driver_->fn.OSMesaGetDepthBufferFn(c, width, height, bytesPerValue,
+                                            buffer);
+}
+
+void OSMESAApiBase::OSMesaGetIntegervFn(GLint pname, GLint* value) {
+  driver_->fn.OSMesaGetIntegervFn(pname, value);
+}
+
+OSMESAproc OSMESAApiBase::OSMesaGetProcAddressFn(const char* funcName) {
+  return driver_->fn.OSMesaGetProcAddressFn(funcName);
+}
+
+GLboolean OSMESAApiBase::OSMesaMakeCurrentFn(OSMesaContext ctx,
+                                             void* buffer,
+                                             GLenum type,
+                                             GLsizei width,
+                                             GLsizei height) {
+  return driver_->fn.OSMesaMakeCurrentFn(ctx, buffer, type, width, height);
+}
+
+void OSMESAApiBase::OSMesaPixelStoreFn(GLint pname, GLint value) {
+  driver_->fn.OSMesaPixelStoreFn(pname, value);
+}
+
+void TraceOSMESAApi::OSMesaColorClampFn(GLboolean enable) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaColorClamp")
+  osmesa_api_->OSMesaColorClampFn(enable);
+}
+
+OSMesaContext TraceOSMESAApi::OSMesaCreateContextFn(GLenum format,
+                                                    OSMesaContext sharelist) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaCreateContext")
+  return osmesa_api_->OSMesaCreateContextFn(format, sharelist);
+}
+
+OSMesaContext TraceOSMESAApi::OSMesaCreateContextExtFn(
+    GLenum format,
+    GLint depthBits,
+    GLint stencilBits,
+    GLint accumBits,
+    OSMesaContext sharelist) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaCreateContextExt")
+  return osmesa_api_->OSMesaCreateContextExtFn(format, depthBits, stencilBits,
+                                               accumBits, sharelist);
+}
+
+void TraceOSMESAApi::OSMesaDestroyContextFn(OSMesaContext ctx) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaDestroyContext")
+  osmesa_api_->OSMesaDestroyContextFn(ctx);
+}
+
+GLboolean TraceOSMESAApi::OSMesaGetColorBufferFn(OSMesaContext c,
+                                                 GLint* width,
+                                                 GLint* height,
+                                                 GLint* format,
+                                                 void** buffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaGetColorBuffer")
+  return osmesa_api_->OSMesaGetColorBufferFn(c, width, height, format, buffer);
+}
+
+OSMesaContext TraceOSMESAApi::OSMesaGetCurrentContextFn(void) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaGetCurrentContext")
+  return osmesa_api_->OSMesaGetCurrentContextFn();
+}
+
+GLboolean TraceOSMESAApi::OSMesaGetDepthBufferFn(OSMesaContext c,
+                                                 GLint* width,
+                                                 GLint* height,
+                                                 GLint* bytesPerValue,
+                                                 void** buffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaGetDepthBuffer")
+  return osmesa_api_->OSMesaGetDepthBufferFn(c, width, height, bytesPerValue,
+                                             buffer);
+}
+
+void TraceOSMESAApi::OSMesaGetIntegervFn(GLint pname, GLint* value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaGetIntegerv")
+  osmesa_api_->OSMesaGetIntegervFn(pname, value);
+}
+
+OSMESAproc TraceOSMESAApi::OSMesaGetProcAddressFn(const char* funcName) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaGetProcAddress")
+  return osmesa_api_->OSMesaGetProcAddressFn(funcName);
+}
+
+GLboolean TraceOSMESAApi::OSMesaMakeCurrentFn(OSMesaContext ctx,
+                                              void* buffer,
+                                              GLenum type,
+                                              GLsizei width,
+                                              GLsizei height) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaMakeCurrent")
+  return osmesa_api_->OSMesaMakeCurrentFn(ctx, buffer, type, width, height);
+}
+
+void TraceOSMESAApi::OSMesaPixelStoreFn(GLint pname, GLint value) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::OSMesaPixelStore")
+  osmesa_api_->OSMesaPixelStoreFn(pname, value);
+}
+
+}  // namespace gfx
diff --git a/ui/gl/gl_bindings_autogen_osmesa.h b/ui/gl/gl_bindings_autogen_osmesa.h
new file mode 100644
index 0000000..8a6bb66
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_osmesa.h
@@ -0,0 +1,123 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
+#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
+
+namespace gfx {
+
+class GLContext;
+
+typedef void(GL_BINDING_CALL* OSMesaColorClampProc)(GLboolean enable);
+typedef OSMesaContext(GL_BINDING_CALL* OSMesaCreateContextProc)(
+    GLenum format,
+    OSMesaContext sharelist);
+typedef OSMesaContext(GL_BINDING_CALL* OSMesaCreateContextExtProc)(
+    GLenum format,
+    GLint depthBits,
+    GLint stencilBits,
+    GLint accumBits,
+    OSMesaContext sharelist);
+typedef void(GL_BINDING_CALL* OSMesaDestroyContextProc)(OSMesaContext ctx);
+typedef GLboolean(GL_BINDING_CALL* OSMesaGetColorBufferProc)(OSMesaContext c,
+                                                             GLint* width,
+                                                             GLint* height,
+                                                             GLint* format,
+                                                             void** buffer);
+typedef OSMesaContext(GL_BINDING_CALL* OSMesaGetCurrentContextProc)(void);
+typedef GLboolean(GL_BINDING_CALL* OSMesaGetDepthBufferProc)(
+    OSMesaContext c,
+    GLint* width,
+    GLint* height,
+    GLint* bytesPerValue,
+    void** buffer);
+typedef void(GL_BINDING_CALL* OSMesaGetIntegervProc)(GLint pname, GLint* value);
+typedef OSMESAproc(GL_BINDING_CALL* OSMesaGetProcAddressProc)(
+    const char* funcName);
+typedef GLboolean(GL_BINDING_CALL* OSMesaMakeCurrentProc)(OSMesaContext ctx,
+                                                          void* buffer,
+                                                          GLenum type,
+                                                          GLsizei width,
+                                                          GLsizei height);
+typedef void(GL_BINDING_CALL* OSMesaPixelStoreProc)(GLint pname, GLint value);
+
+struct ExtensionsOSMESA {};
+
+struct ProcsOSMESA {
+  OSMesaColorClampProc OSMesaColorClampFn;
+  OSMesaCreateContextProc OSMesaCreateContextFn;
+  OSMesaCreateContextExtProc OSMesaCreateContextExtFn;
+  OSMesaDestroyContextProc OSMesaDestroyContextFn;
+  OSMesaGetColorBufferProc OSMesaGetColorBufferFn;
+  OSMesaGetCurrentContextProc OSMesaGetCurrentContextFn;
+  OSMesaGetDepthBufferProc OSMesaGetDepthBufferFn;
+  OSMesaGetIntegervProc OSMesaGetIntegervFn;
+  OSMesaGetProcAddressProc OSMesaGetProcAddressFn;
+  OSMesaMakeCurrentProc OSMesaMakeCurrentFn;
+  OSMesaPixelStoreProc OSMesaPixelStoreFn;
+};
+
+class GL_EXPORT OSMESAApi {
+ public:
+  OSMESAApi();
+  virtual ~OSMESAApi();
+
+  virtual void OSMesaColorClampFn(GLboolean enable) = 0;
+  virtual OSMesaContext OSMesaCreateContextFn(GLenum format,
+                                              OSMesaContext sharelist) = 0;
+  virtual OSMesaContext OSMesaCreateContextExtFn(GLenum format,
+                                                 GLint depthBits,
+                                                 GLint stencilBits,
+                                                 GLint accumBits,
+                                                 OSMesaContext sharelist) = 0;
+  virtual void OSMesaDestroyContextFn(OSMesaContext ctx) = 0;
+  virtual GLboolean OSMesaGetColorBufferFn(OSMesaContext c,
+                                           GLint* width,
+                                           GLint* height,
+                                           GLint* format,
+                                           void** buffer) = 0;
+  virtual OSMesaContext OSMesaGetCurrentContextFn(void) = 0;
+  virtual GLboolean OSMesaGetDepthBufferFn(OSMesaContext c,
+                                           GLint* width,
+                                           GLint* height,
+                                           GLint* bytesPerValue,
+                                           void** buffer) = 0;
+  virtual void OSMesaGetIntegervFn(GLint pname, GLint* value) = 0;
+  virtual OSMESAproc OSMesaGetProcAddressFn(const char* funcName) = 0;
+  virtual GLboolean OSMesaMakeCurrentFn(OSMesaContext ctx,
+                                        void* buffer,
+                                        GLenum type,
+                                        GLsizei width,
+                                        GLsizei height) = 0;
+  virtual void OSMesaPixelStoreFn(GLint pname, GLint value) = 0;
+};
+
+}  // namespace gfx
+
+#define OSMesaColorClamp ::gfx::g_current_osmesa_context->OSMesaColorClampFn
+#define OSMesaCreateContext \
+  ::gfx::g_current_osmesa_context->OSMesaCreateContextFn
+#define OSMesaCreateContextExt \
+  ::gfx::g_current_osmesa_context->OSMesaCreateContextExtFn
+#define OSMesaDestroyContext \
+  ::gfx::g_current_osmesa_context->OSMesaDestroyContextFn
+#define OSMesaGetColorBuffer \
+  ::gfx::g_current_osmesa_context->OSMesaGetColorBufferFn
+#define OSMesaGetCurrentContext \
+  ::gfx::g_current_osmesa_context->OSMesaGetCurrentContextFn
+#define OSMesaGetDepthBuffer \
+  ::gfx::g_current_osmesa_context->OSMesaGetDepthBufferFn
+#define OSMesaGetIntegerv ::gfx::g_current_osmesa_context->OSMesaGetIntegervFn
+#define OSMesaGetProcAddress \
+  ::gfx::g_current_osmesa_context->OSMesaGetProcAddressFn
+#define OSMesaMakeCurrent ::gfx::g_current_osmesa_context->OSMesaMakeCurrentFn
+#define OSMesaPixelStore ::gfx::g_current_osmesa_context->OSMesaPixelStoreFn
+
+#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
diff --git a/ui/gl/gl_bindings_autogen_wgl.cc b/ui/gl/gl_bindings_autogen_wgl.cc
new file mode 100644
index 0000000..a28aaf6
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_wgl.cc
@@ -0,0 +1,537 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#include <string>
+
+#include "base/debug/trace_event.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_enums.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_version_info.h"
+#include "ui/gl/gl_wgl_api_implementation.h"
+
+namespace gfx {
+
+static bool g_debugBindingsInitialized;
+DriverWGL g_driver_wgl;
+
+void DriverWGL::InitializeStaticBindings() {
+  fn.wglChoosePixelFormatARBFn = reinterpret_cast<wglChoosePixelFormatARBProc>(
+      GetGLProcAddress("wglChoosePixelFormatARB"));
+  fn.wglCopyContextFn =
+      reinterpret_cast<wglCopyContextProc>(GetGLProcAddress("wglCopyContext"));
+  fn.wglCreateContextFn = reinterpret_cast<wglCreateContextProc>(
+      GetGLProcAddress("wglCreateContext"));
+  fn.wglCreateLayerContextFn = reinterpret_cast<wglCreateLayerContextProc>(
+      GetGLProcAddress("wglCreateLayerContext"));
+  fn.wglCreatePbufferARBFn = reinterpret_cast<wglCreatePbufferARBProc>(
+      GetGLProcAddress("wglCreatePbufferARB"));
+  fn.wglDeleteContextFn = reinterpret_cast<wglDeleteContextProc>(
+      GetGLProcAddress("wglDeleteContext"));
+  fn.wglDestroyPbufferARBFn = reinterpret_cast<wglDestroyPbufferARBProc>(
+      GetGLProcAddress("wglDestroyPbufferARB"));
+  fn.wglGetCurrentContextFn = reinterpret_cast<wglGetCurrentContextProc>(
+      GetGLProcAddress("wglGetCurrentContext"));
+  fn.wglGetCurrentDCFn = reinterpret_cast<wglGetCurrentDCProc>(
+      GetGLProcAddress("wglGetCurrentDC"));
+  fn.wglGetExtensionsStringARBFn =
+      reinterpret_cast<wglGetExtensionsStringARBProc>(
+          GetGLProcAddress("wglGetExtensionsStringARB"));
+  fn.wglGetExtensionsStringEXTFn =
+      reinterpret_cast<wglGetExtensionsStringEXTProc>(
+          GetGLProcAddress("wglGetExtensionsStringEXT"));
+  fn.wglGetPbufferDCARBFn = reinterpret_cast<wglGetPbufferDCARBProc>(
+      GetGLProcAddress("wglGetPbufferDCARB"));
+  fn.wglMakeCurrentFn =
+      reinterpret_cast<wglMakeCurrentProc>(GetGLProcAddress("wglMakeCurrent"));
+  fn.wglQueryPbufferARBFn = reinterpret_cast<wglQueryPbufferARBProc>(
+      GetGLProcAddress("wglQueryPbufferARB"));
+  fn.wglReleasePbufferDCARBFn = reinterpret_cast<wglReleasePbufferDCARBProc>(
+      GetGLProcAddress("wglReleasePbufferDCARB"));
+  fn.wglShareListsFn =
+      reinterpret_cast<wglShareListsProc>(GetGLProcAddress("wglShareLists"));
+  fn.wglSwapIntervalEXTFn = reinterpret_cast<wglSwapIntervalEXTProc>(
+      GetGLProcAddress("wglSwapIntervalEXT"));
+  fn.wglSwapLayerBuffersFn = reinterpret_cast<wglSwapLayerBuffersProc>(
+      GetGLProcAddress("wglSwapLayerBuffers"));
+}
+
+void DriverWGL::InitializeDynamicBindings(GLContext* context) {
+  DCHECK(context && context->IsCurrent(NULL));
+  const GLVersionInfo* ver = context->GetVersionInfo();
+  ALLOW_UNUSED_LOCAL(ver);
+  std::string extensions = context->GetExtensions() + " ";
+  ALLOW_UNUSED_LOCAL(extensions);
+
+  ext.b_WGL_ARB_extensions_string =
+      extensions.find("WGL_ARB_extensions_string ") != std::string::npos;
+  ext.b_WGL_ARB_pbuffer =
+      extensions.find("WGL_ARB_pbuffer ") != std::string::npos;
+  ext.b_WGL_ARB_pixel_format =
+      extensions.find("WGL_ARB_pixel_format ") != std::string::npos;
+  ext.b_WGL_EXT_extensions_string =
+      extensions.find("WGL_EXT_extensions_string ") != std::string::npos;
+  ext.b_WGL_EXT_swap_control =
+      extensions.find("WGL_EXT_swap_control ") != std::string::npos;
+
+  if (g_debugBindingsInitialized)
+    InitializeDebugBindings();
+}
+
+extern "C" {
+
+static BOOL GL_BINDING_CALL
+Debug_wglChoosePixelFormatARB(HDC dc,
+                              const int* int_attrib_list,
+                              const float* float_attrib_list,
+                              UINT max_formats,
+                              int* formats,
+                              UINT* num_formats) {
+  GL_SERVICE_LOG("wglChoosePixelFormatARB"
+                 << "(" << dc << ", "
+                 << static_cast<const void*>(int_attrib_list) << ", "
+                 << static_cast<const void*>(float_attrib_list) << ", "
+                 << max_formats << ", " << static_cast<const void*>(formats)
+                 << ", " << static_cast<const void*>(num_formats) << ")");
+  BOOL result = g_driver_wgl.debug_fn.wglChoosePixelFormatARBFn(
+      dc, int_attrib_list, float_attrib_list, max_formats, formats,
+      num_formats);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static BOOL GL_BINDING_CALL
+Debug_wglCopyContext(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask) {
+  GL_SERVICE_LOG("wglCopyContext"
+                 << "(" << hglrcSrc << ", " << hglrcDst << ", " << mask << ")");
+  BOOL result =
+      g_driver_wgl.debug_fn.wglCopyContextFn(hglrcSrc, hglrcDst, mask);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static HGLRC GL_BINDING_CALL Debug_wglCreateContext(HDC hdc) {
+  GL_SERVICE_LOG("wglCreateContext"
+                 << "(" << hdc << ")");
+  HGLRC result = g_driver_wgl.debug_fn.wglCreateContextFn(hdc);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static HGLRC GL_BINDING_CALL
+Debug_wglCreateLayerContext(HDC hdc, int iLayerPlane) {
+  GL_SERVICE_LOG("wglCreateLayerContext"
+                 << "(" << hdc << ", " << iLayerPlane << ")");
+  HGLRC result =
+      g_driver_wgl.debug_fn.wglCreateLayerContextFn(hdc, iLayerPlane);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static HPBUFFERARB GL_BINDING_CALL
+Debug_wglCreatePbufferARB(HDC hDC,
+                          int iPixelFormat,
+                          int iWidth,
+                          int iHeight,
+                          const int* piAttribList) {
+  GL_SERVICE_LOG("wglCreatePbufferARB"
+                 << "(" << hDC << ", " << iPixelFormat << ", " << iWidth << ", "
+                 << iHeight << ", " << static_cast<const void*>(piAttribList)
+                 << ")");
+  HPBUFFERARB result = g_driver_wgl.debug_fn.wglCreatePbufferARBFn(
+      hDC, iPixelFormat, iWidth, iHeight, piAttribList);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static BOOL GL_BINDING_CALL Debug_wglDeleteContext(HGLRC hglrc) {
+  GL_SERVICE_LOG("wglDeleteContext"
+                 << "(" << hglrc << ")");
+  BOOL result = g_driver_wgl.debug_fn.wglDeleteContextFn(hglrc);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static BOOL GL_BINDING_CALL Debug_wglDestroyPbufferARB(HPBUFFERARB hPbuffer) {
+  GL_SERVICE_LOG("wglDestroyPbufferARB"
+                 << "(" << hPbuffer << ")");
+  BOOL result = g_driver_wgl.debug_fn.wglDestroyPbufferARBFn(hPbuffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static HGLRC GL_BINDING_CALL Debug_wglGetCurrentContext() {
+  GL_SERVICE_LOG("wglGetCurrentContext"
+                 << "("
+                 << ")");
+  HGLRC result = g_driver_wgl.debug_fn.wglGetCurrentContextFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static HDC GL_BINDING_CALL Debug_wglGetCurrentDC() {
+  GL_SERVICE_LOG("wglGetCurrentDC"
+                 << "("
+                 << ")");
+  HDC result = g_driver_wgl.debug_fn.wglGetCurrentDCFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static const char* GL_BINDING_CALL Debug_wglGetExtensionsStringARB(HDC hDC) {
+  GL_SERVICE_LOG("wglGetExtensionsStringARB"
+                 << "(" << hDC << ")");
+  const char* result = g_driver_wgl.debug_fn.wglGetExtensionsStringARBFn(hDC);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static const char* GL_BINDING_CALL Debug_wglGetExtensionsStringEXT() {
+  GL_SERVICE_LOG("wglGetExtensionsStringEXT"
+                 << "("
+                 << ")");
+  const char* result = g_driver_wgl.debug_fn.wglGetExtensionsStringEXTFn();
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static HDC GL_BINDING_CALL Debug_wglGetPbufferDCARB(HPBUFFERARB hPbuffer) {
+  GL_SERVICE_LOG("wglGetPbufferDCARB"
+                 << "(" << hPbuffer << ")");
+  HDC result = g_driver_wgl.debug_fn.wglGetPbufferDCARBFn(hPbuffer);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static BOOL GL_BINDING_CALL Debug_wglMakeCurrent(HDC hdc, HGLRC hglrc) {
+  GL_SERVICE_LOG("wglMakeCurrent"
+                 << "(" << hdc << ", " << hglrc << ")");
+  BOOL result = g_driver_wgl.debug_fn.wglMakeCurrentFn(hdc, hglrc);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static BOOL GL_BINDING_CALL
+Debug_wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAttribute, int* piValue) {
+  GL_SERVICE_LOG("wglQueryPbufferARB"
+                 << "(" << hPbuffer << ", " << iAttribute << ", "
+                 << static_cast<const void*>(piValue) << ")");
+  BOOL result =
+      g_driver_wgl.debug_fn.wglQueryPbufferARBFn(hPbuffer, iAttribute, piValue);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static int GL_BINDING_CALL
+Debug_wglReleasePbufferDCARB(HPBUFFERARB hPbuffer, HDC hDC) {
+  GL_SERVICE_LOG("wglReleasePbufferDCARB"
+                 << "(" << hPbuffer << ", " << hDC << ")");
+  int result = g_driver_wgl.debug_fn.wglReleasePbufferDCARBFn(hPbuffer, hDC);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static BOOL GL_BINDING_CALL Debug_wglShareLists(HGLRC hglrc1, HGLRC hglrc2) {
+  GL_SERVICE_LOG("wglShareLists"
+                 << "(" << hglrc1 << ", " << hglrc2 << ")");
+  BOOL result = g_driver_wgl.debug_fn.wglShareListsFn(hglrc1, hglrc2);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static BOOL GL_BINDING_CALL Debug_wglSwapIntervalEXT(int interval) {
+  GL_SERVICE_LOG("wglSwapIntervalEXT"
+                 << "(" << interval << ")");
+  BOOL result = g_driver_wgl.debug_fn.wglSwapIntervalEXTFn(interval);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+
+static BOOL GL_BINDING_CALL Debug_wglSwapLayerBuffers(HDC hdc, UINT fuPlanes) {
+  GL_SERVICE_LOG("wglSwapLayerBuffers"
+                 << "(" << hdc << ", " << fuPlanes << ")");
+  BOOL result = g_driver_wgl.debug_fn.wglSwapLayerBuffersFn(hdc, fuPlanes);
+  GL_SERVICE_LOG("GL_RESULT: " << result);
+  return result;
+}
+}  // extern "C"
+
+void DriverWGL::InitializeDebugBindings() {
+  if (!debug_fn.wglChoosePixelFormatARBFn) {
+    debug_fn.wglChoosePixelFormatARBFn = fn.wglChoosePixelFormatARBFn;
+    fn.wglChoosePixelFormatARBFn = Debug_wglChoosePixelFormatARB;
+  }
+  if (!debug_fn.wglCopyContextFn) {
+    debug_fn.wglCopyContextFn = fn.wglCopyContextFn;
+    fn.wglCopyContextFn = Debug_wglCopyContext;
+  }
+  if (!debug_fn.wglCreateContextFn) {
+    debug_fn.wglCreateContextFn = fn.wglCreateContextFn;
+    fn.wglCreateContextFn = Debug_wglCreateContext;
+  }
+  if (!debug_fn.wglCreateLayerContextFn) {
+    debug_fn.wglCreateLayerContextFn = fn.wglCreateLayerContextFn;
+    fn.wglCreateLayerContextFn = Debug_wglCreateLayerContext;
+  }
+  if (!debug_fn.wglCreatePbufferARBFn) {
+    debug_fn.wglCreatePbufferARBFn = fn.wglCreatePbufferARBFn;
+    fn.wglCreatePbufferARBFn = Debug_wglCreatePbufferARB;
+  }
+  if (!debug_fn.wglDeleteContextFn) {
+    debug_fn.wglDeleteContextFn = fn.wglDeleteContextFn;
+    fn.wglDeleteContextFn = Debug_wglDeleteContext;
+  }
+  if (!debug_fn.wglDestroyPbufferARBFn) {
+    debug_fn.wglDestroyPbufferARBFn = fn.wglDestroyPbufferARBFn;
+    fn.wglDestroyPbufferARBFn = Debug_wglDestroyPbufferARB;
+  }
+  if (!debug_fn.wglGetCurrentContextFn) {
+    debug_fn.wglGetCurrentContextFn = fn.wglGetCurrentContextFn;
+    fn.wglGetCurrentContextFn = Debug_wglGetCurrentContext;
+  }
+  if (!debug_fn.wglGetCurrentDCFn) {
+    debug_fn.wglGetCurrentDCFn = fn.wglGetCurrentDCFn;
+    fn.wglGetCurrentDCFn = Debug_wglGetCurrentDC;
+  }
+  if (!debug_fn.wglGetExtensionsStringARBFn) {
+    debug_fn.wglGetExtensionsStringARBFn = fn.wglGetExtensionsStringARBFn;
+    fn.wglGetExtensionsStringARBFn = Debug_wglGetExtensionsStringARB;
+  }
+  if (!debug_fn.wglGetExtensionsStringEXTFn) {
+    debug_fn.wglGetExtensionsStringEXTFn = fn.wglGetExtensionsStringEXTFn;
+    fn.wglGetExtensionsStringEXTFn = Debug_wglGetExtensionsStringEXT;
+  }
+  if (!debug_fn.wglGetPbufferDCARBFn) {
+    debug_fn.wglGetPbufferDCARBFn = fn.wglGetPbufferDCARBFn;
+    fn.wglGetPbufferDCARBFn = Debug_wglGetPbufferDCARB;
+  }
+  if (!debug_fn.wglMakeCurrentFn) {
+    debug_fn.wglMakeCurrentFn = fn.wglMakeCurrentFn;
+    fn.wglMakeCurrentFn = Debug_wglMakeCurrent;
+  }
+  if (!debug_fn.wglQueryPbufferARBFn) {
+    debug_fn.wglQueryPbufferARBFn = fn.wglQueryPbufferARBFn;
+    fn.wglQueryPbufferARBFn = Debug_wglQueryPbufferARB;
+  }
+  if (!debug_fn.wglReleasePbufferDCARBFn) {
+    debug_fn.wglReleasePbufferDCARBFn = fn.wglReleasePbufferDCARBFn;
+    fn.wglReleasePbufferDCARBFn = Debug_wglReleasePbufferDCARB;
+  }
+  if (!debug_fn.wglShareListsFn) {
+    debug_fn.wglShareListsFn = fn.wglShareListsFn;
+    fn.wglShareListsFn = Debug_wglShareLists;
+  }
+  if (!debug_fn.wglSwapIntervalEXTFn) {
+    debug_fn.wglSwapIntervalEXTFn = fn.wglSwapIntervalEXTFn;
+    fn.wglSwapIntervalEXTFn = Debug_wglSwapIntervalEXT;
+  }
+  if (!debug_fn.wglSwapLayerBuffersFn) {
+    debug_fn.wglSwapLayerBuffersFn = fn.wglSwapLayerBuffersFn;
+    fn.wglSwapLayerBuffersFn = Debug_wglSwapLayerBuffers;
+  }
+  g_debugBindingsInitialized = true;
+}
+
+void DriverWGL::ClearBindings() {
+  memset(this, 0, sizeof(*this));
+}
+
+BOOL WGLApiBase::wglChoosePixelFormatARBFn(HDC dc,
+                                           const int* int_attrib_list,
+                                           const float* float_attrib_list,
+                                           UINT max_formats,
+                                           int* formats,
+                                           UINT* num_formats) {
+  return driver_->fn.wglChoosePixelFormatARBFn(dc, int_attrib_list,
+                                               float_attrib_list, max_formats,
+                                               formats, num_formats);
+}
+
+BOOL WGLApiBase::wglCopyContextFn(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask) {
+  return driver_->fn.wglCopyContextFn(hglrcSrc, hglrcDst, mask);
+}
+
+HGLRC WGLApiBase::wglCreateContextFn(HDC hdc) {
+  return driver_->fn.wglCreateContextFn(hdc);
+}
+
+HGLRC WGLApiBase::wglCreateLayerContextFn(HDC hdc, int iLayerPlane) {
+  return driver_->fn.wglCreateLayerContextFn(hdc, iLayerPlane);
+}
+
+HPBUFFERARB WGLApiBase::wglCreatePbufferARBFn(HDC hDC,
+                                              int iPixelFormat,
+                                              int iWidth,
+                                              int iHeight,
+                                              const int* piAttribList) {
+  return driver_->fn.wglCreatePbufferARBFn(hDC, iPixelFormat, iWidth, iHeight,
+                                           piAttribList);
+}
+
+BOOL WGLApiBase::wglDeleteContextFn(HGLRC hglrc) {
+  return driver_->fn.wglDeleteContextFn(hglrc);
+}
+
+BOOL WGLApiBase::wglDestroyPbufferARBFn(HPBUFFERARB hPbuffer) {
+  return driver_->fn.wglDestroyPbufferARBFn(hPbuffer);
+}
+
+HGLRC WGLApiBase::wglGetCurrentContextFn() {
+  return driver_->fn.wglGetCurrentContextFn();
+}
+
+HDC WGLApiBase::wglGetCurrentDCFn() {
+  return driver_->fn.wglGetCurrentDCFn();
+}
+
+const char* WGLApiBase::wglGetExtensionsStringARBFn(HDC hDC) {
+  return driver_->fn.wglGetExtensionsStringARBFn(hDC);
+}
+
+const char* WGLApiBase::wglGetExtensionsStringEXTFn() {
+  return driver_->fn.wglGetExtensionsStringEXTFn();
+}
+
+HDC WGLApiBase::wglGetPbufferDCARBFn(HPBUFFERARB hPbuffer) {
+  return driver_->fn.wglGetPbufferDCARBFn(hPbuffer);
+}
+
+BOOL WGLApiBase::wglMakeCurrentFn(HDC hdc, HGLRC hglrc) {
+  return driver_->fn.wglMakeCurrentFn(hdc, hglrc);
+}
+
+BOOL WGLApiBase::wglQueryPbufferARBFn(HPBUFFERARB hPbuffer,
+                                      int iAttribute,
+                                      int* piValue) {
+  return driver_->fn.wglQueryPbufferARBFn(hPbuffer, iAttribute, piValue);
+}
+
+int WGLApiBase::wglReleasePbufferDCARBFn(HPBUFFERARB hPbuffer, HDC hDC) {
+  return driver_->fn.wglReleasePbufferDCARBFn(hPbuffer, hDC);
+}
+
+BOOL WGLApiBase::wglShareListsFn(HGLRC hglrc1, HGLRC hglrc2) {
+  return driver_->fn.wglShareListsFn(hglrc1, hglrc2);
+}
+
+BOOL WGLApiBase::wglSwapIntervalEXTFn(int interval) {
+  return driver_->fn.wglSwapIntervalEXTFn(interval);
+}
+
+BOOL WGLApiBase::wglSwapLayerBuffersFn(HDC hdc, UINT fuPlanes) {
+  return driver_->fn.wglSwapLayerBuffersFn(hdc, fuPlanes);
+}
+
+BOOL TraceWGLApi::wglChoosePixelFormatARBFn(HDC dc,
+                                            const int* int_attrib_list,
+                                            const float* float_attrib_list,
+                                            UINT max_formats,
+                                            int* formats,
+                                            UINT* num_formats) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglChoosePixelFormatARB")
+  return wgl_api_->wglChoosePixelFormatARBFn(dc, int_attrib_list,
+                                             float_attrib_list, max_formats,
+                                             formats, num_formats);
+}
+
+BOOL TraceWGLApi::wglCopyContextFn(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglCopyContext")
+  return wgl_api_->wglCopyContextFn(hglrcSrc, hglrcDst, mask);
+}
+
+HGLRC TraceWGLApi::wglCreateContextFn(HDC hdc) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglCreateContext")
+  return wgl_api_->wglCreateContextFn(hdc);
+}
+
+HGLRC TraceWGLApi::wglCreateLayerContextFn(HDC hdc, int iLayerPlane) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglCreateLayerContext")
+  return wgl_api_->wglCreateLayerContextFn(hdc, iLayerPlane);
+}
+
+HPBUFFERARB TraceWGLApi::wglCreatePbufferARBFn(HDC hDC,
+                                               int iPixelFormat,
+                                               int iWidth,
+                                               int iHeight,
+                                               const int* piAttribList) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglCreatePbufferARB")
+  return wgl_api_->wglCreatePbufferARBFn(hDC, iPixelFormat, iWidth, iHeight,
+                                         piAttribList);
+}
+
+BOOL TraceWGLApi::wglDeleteContextFn(HGLRC hglrc) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglDeleteContext")
+  return wgl_api_->wglDeleteContextFn(hglrc);
+}
+
+BOOL TraceWGLApi::wglDestroyPbufferARBFn(HPBUFFERARB hPbuffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglDestroyPbufferARB")
+  return wgl_api_->wglDestroyPbufferARBFn(hPbuffer);
+}
+
+HGLRC TraceWGLApi::wglGetCurrentContextFn() {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglGetCurrentContext")
+  return wgl_api_->wglGetCurrentContextFn();
+}
+
+HDC TraceWGLApi::wglGetCurrentDCFn() {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglGetCurrentDC")
+  return wgl_api_->wglGetCurrentDCFn();
+}
+
+const char* TraceWGLApi::wglGetExtensionsStringARBFn(HDC hDC) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglGetExtensionsStringARB")
+  return wgl_api_->wglGetExtensionsStringARBFn(hDC);
+}
+
+const char* TraceWGLApi::wglGetExtensionsStringEXTFn() {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglGetExtensionsStringEXT")
+  return wgl_api_->wglGetExtensionsStringEXTFn();
+}
+
+HDC TraceWGLApi::wglGetPbufferDCARBFn(HPBUFFERARB hPbuffer) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglGetPbufferDCARB")
+  return wgl_api_->wglGetPbufferDCARBFn(hPbuffer);
+}
+
+BOOL TraceWGLApi::wglMakeCurrentFn(HDC hdc, HGLRC hglrc) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglMakeCurrent")
+  return wgl_api_->wglMakeCurrentFn(hdc, hglrc);
+}
+
+BOOL TraceWGLApi::wglQueryPbufferARBFn(HPBUFFERARB hPbuffer,
+                                       int iAttribute,
+                                       int* piValue) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglQueryPbufferARB")
+  return wgl_api_->wglQueryPbufferARBFn(hPbuffer, iAttribute, piValue);
+}
+
+int TraceWGLApi::wglReleasePbufferDCARBFn(HPBUFFERARB hPbuffer, HDC hDC) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglReleasePbufferDCARB")
+  return wgl_api_->wglReleasePbufferDCARBFn(hPbuffer, hDC);
+}
+
+BOOL TraceWGLApi::wglShareListsFn(HGLRC hglrc1, HGLRC hglrc2) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglShareLists")
+  return wgl_api_->wglShareListsFn(hglrc1, hglrc2);
+}
+
+BOOL TraceWGLApi::wglSwapIntervalEXTFn(int interval) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglSwapIntervalEXT")
+  return wgl_api_->wglSwapIntervalEXTFn(interval);
+}
+
+BOOL TraceWGLApi::wglSwapLayerBuffersFn(HDC hdc, UINT fuPlanes) {
+  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::wglSwapLayerBuffers")
+  return wgl_api_->wglSwapLayerBuffersFn(hdc, fuPlanes);
+}
+
+}  // namespace gfx
diff --git a/ui/gl/gl_bindings_autogen_wgl.h b/ui/gl/gl_bindings_autogen_wgl.h
new file mode 100644
index 0000000..b7a2040
--- /dev/null
+++ b/ui/gl/gl_bindings_autogen_wgl.h
@@ -0,0 +1,147 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
+#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
+
+namespace gfx {
+
+class GLContext;
+
+typedef BOOL(GL_BINDING_CALL* wglChoosePixelFormatARBProc)(
+    HDC dc,
+    const int* int_attrib_list,
+    const float* float_attrib_list,
+    UINT max_formats,
+    int* formats,
+    UINT* num_formats);
+typedef BOOL(GL_BINDING_CALL* wglCopyContextProc)(HGLRC hglrcSrc,
+                                                  HGLRC hglrcDst,
+                                                  UINT mask);
+typedef HGLRC(GL_BINDING_CALL* wglCreateContextProc)(HDC hdc);
+typedef HGLRC(GL_BINDING_CALL* wglCreateLayerContextProc)(HDC hdc,
+                                                          int iLayerPlane);
+typedef HPBUFFERARB(GL_BINDING_CALL* wglCreatePbufferARBProc)(
+    HDC hDC,
+    int iPixelFormat,
+    int iWidth,
+    int iHeight,
+    const int* piAttribList);
+typedef BOOL(GL_BINDING_CALL* wglDeleteContextProc)(HGLRC hglrc);
+typedef BOOL(GL_BINDING_CALL* wglDestroyPbufferARBProc)(HPBUFFERARB hPbuffer);
+typedef HGLRC(GL_BINDING_CALL* wglGetCurrentContextProc)();
+typedef HDC(GL_BINDING_CALL* wglGetCurrentDCProc)();
+typedef const char*(GL_BINDING_CALL* wglGetExtensionsStringARBProc)(HDC hDC);
+typedef const char*(GL_BINDING_CALL* wglGetExtensionsStringEXTProc)();
+typedef HDC(GL_BINDING_CALL* wglGetPbufferDCARBProc)(HPBUFFERARB hPbuffer);
+typedef BOOL(GL_BINDING_CALL* wglMakeCurrentProc)(HDC hdc, HGLRC hglrc);
+typedef BOOL(GL_BINDING_CALL* wglQueryPbufferARBProc)(HPBUFFERARB hPbuffer,
+                                                      int iAttribute,
+                                                      int* piValue);
+typedef int(GL_BINDING_CALL* wglReleasePbufferDCARBProc)(HPBUFFERARB hPbuffer,
+                                                         HDC hDC);
+typedef BOOL(GL_BINDING_CALL* wglShareListsProc)(HGLRC hglrc1, HGLRC hglrc2);
+typedef BOOL(GL_BINDING_CALL* wglSwapIntervalEXTProc)(int interval);
+typedef BOOL(GL_BINDING_CALL* wglSwapLayerBuffersProc)(HDC hdc, UINT fuPlanes);
+
+struct ExtensionsWGL {
+  bool b_WGL_ARB_extensions_string;
+  bool b_WGL_ARB_pbuffer;
+  bool b_WGL_ARB_pixel_format;
+  bool b_WGL_EXT_extensions_string;
+  bool b_WGL_EXT_swap_control;
+};
+
+struct ProcsWGL {
+  wglChoosePixelFormatARBProc wglChoosePixelFormatARBFn;
+  wglCopyContextProc wglCopyContextFn;
+  wglCreateContextProc wglCreateContextFn;
+  wglCreateLayerContextProc wglCreateLayerContextFn;
+  wglCreatePbufferARBProc wglCreatePbufferARBFn;
+  wglDeleteContextProc wglDeleteContextFn;
+  wglDestroyPbufferARBProc wglDestroyPbufferARBFn;
+  wglGetCurrentContextProc wglGetCurrentContextFn;
+  wglGetCurrentDCProc wglGetCurrentDCFn;
+  wglGetExtensionsStringARBProc wglGetExtensionsStringARBFn;
+  wglGetExtensionsStringEXTProc wglGetExtensionsStringEXTFn;
+  wglGetPbufferDCARBProc wglGetPbufferDCARBFn;
+  wglMakeCurrentProc wglMakeCurrentFn;
+  wglQueryPbufferARBProc wglQueryPbufferARBFn;
+  wglReleasePbufferDCARBProc wglReleasePbufferDCARBFn;
+  wglShareListsProc wglShareListsFn;
+  wglSwapIntervalEXTProc wglSwapIntervalEXTFn;
+  wglSwapLayerBuffersProc wglSwapLayerBuffersFn;
+};
+
+class GL_EXPORT WGLApi {
+ public:
+  WGLApi();
+  virtual ~WGLApi();
+
+  virtual BOOL wglChoosePixelFormatARBFn(HDC dc,
+                                         const int* int_attrib_list,
+                                         const float* float_attrib_list,
+                                         UINT max_formats,
+                                         int* formats,
+                                         UINT* num_formats) = 0;
+  virtual BOOL wglCopyContextFn(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask) = 0;
+  virtual HGLRC wglCreateContextFn(HDC hdc) = 0;
+  virtual HGLRC wglCreateLayerContextFn(HDC hdc, int iLayerPlane) = 0;
+  virtual HPBUFFERARB wglCreatePbufferARBFn(HDC hDC,
+                                            int iPixelFormat,
+                                            int iWidth,
+                                            int iHeight,
+                                            const int* piAttribList) = 0;
+  virtual BOOL wglDeleteContextFn(HGLRC hglrc) = 0;
+  virtual BOOL wglDestroyPbufferARBFn(HPBUFFERARB hPbuffer) = 0;
+  virtual HGLRC wglGetCurrentContextFn() = 0;
+  virtual HDC wglGetCurrentDCFn() = 0;
+  virtual const char* wglGetExtensionsStringARBFn(HDC hDC) = 0;
+  virtual const char* wglGetExtensionsStringEXTFn() = 0;
+  virtual HDC wglGetPbufferDCARBFn(HPBUFFERARB hPbuffer) = 0;
+  virtual BOOL wglMakeCurrentFn(HDC hdc, HGLRC hglrc) = 0;
+  virtual BOOL wglQueryPbufferARBFn(HPBUFFERARB hPbuffer,
+                                    int iAttribute,
+                                    int* piValue) = 0;
+  virtual int wglReleasePbufferDCARBFn(HPBUFFERARB hPbuffer, HDC hDC) = 0;
+  virtual BOOL wglShareListsFn(HGLRC hglrc1, HGLRC hglrc2) = 0;
+  virtual BOOL wglSwapIntervalEXTFn(int interval) = 0;
+  virtual BOOL wglSwapLayerBuffersFn(HDC hdc, UINT fuPlanes) = 0;
+};
+
+}  // namespace gfx
+
+#define wglChoosePixelFormatARB \
+  ::gfx::g_current_wgl_context->wglChoosePixelFormatARBFn
+#define wglCopyContext ::gfx::g_current_wgl_context->wglCopyContextFn
+#define wglCreateContext ::gfx::g_current_wgl_context->wglCreateContextFn
+#define wglCreateLayerContext \
+  ::gfx::g_current_wgl_context->wglCreateLayerContextFn
+#define wglCreatePbufferARB ::gfx::g_current_wgl_context->wglCreatePbufferARBFn
+#define wglDeleteContext ::gfx::g_current_wgl_context->wglDeleteContextFn
+#define wglDestroyPbufferARB \
+  ::gfx::g_current_wgl_context->wglDestroyPbufferARBFn
+#define wglGetCurrentContext \
+  ::gfx::g_current_wgl_context->wglGetCurrentContextFn
+#define wglGetCurrentDC ::gfx::g_current_wgl_context->wglGetCurrentDCFn
+#define wglGetExtensionsStringARB \
+  ::gfx::g_current_wgl_context->wglGetExtensionsStringARBFn
+#define wglGetExtensionsStringEXT \
+  ::gfx::g_current_wgl_context->wglGetExtensionsStringEXTFn
+#define wglGetPbufferDCARB ::gfx::g_current_wgl_context->wglGetPbufferDCARBFn
+#define wglMakeCurrent ::gfx::g_current_wgl_context->wglMakeCurrentFn
+#define wglQueryPbufferARB ::gfx::g_current_wgl_context->wglQueryPbufferARBFn
+#define wglReleasePbufferDCARB \
+  ::gfx::g_current_wgl_context->wglReleasePbufferDCARBFn
+#define wglShareLists ::gfx::g_current_wgl_context->wglShareListsFn
+#define wglSwapIntervalEXT ::gfx::g_current_wgl_context->wglSwapIntervalEXTFn
+#define wglSwapLayerBuffers ::gfx::g_current_wgl_context->wglSwapLayerBuffersFn
+
+#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
diff --git a/ui/gl/gl_context_ozone.cc b/ui/gl/gl_context_ozone.cc
new file mode 100644
index 0000000..776e114
--- /dev/null
+++ b/ui/gl/gl_context_ozone.cc
@@ -0,0 +1,47 @@
+// Copyright (c) 2013 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.
+
+#include "ui/gl/gl_context.h"
+
+#include "base/logging.h"
+#include "base/memory/ref_counted.h"
+#include "base/sys_info.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context_egl.h"
+#include "ui/gl/gl_context_osmesa.h"
+#include "ui/gl/gl_context_stub.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_surface.h"
+
+namespace gfx {
+
+// static
+scoped_refptr<GLContext> GLContext::CreateGLContext(
+    GLShareGroup* share_group,
+    GLSurface* compatible_surface,
+    GpuPreference gpu_preference) {
+
+  switch (GetGLImplementation()) {
+    case kGLImplementationMockGL:
+      return scoped_refptr<GLContext>(new GLContextStub());
+    case kGLImplementationOSMesaGL: {
+      scoped_refptr<GLContext> context(new GLContextOSMesa(share_group));
+      if (!context->Initialize(compatible_surface, gpu_preference))
+        return NULL;
+      return context;
+    }
+    case kGLImplementationEGLGLES2: {
+      scoped_refptr<GLContext> context(new GLContextEGL(share_group));
+      if (!context->Initialize(compatible_surface, gpu_preference))
+        return NULL;
+      return context;
+    }
+    default:
+      NOTREACHED();
+      return NULL;
+  }
+}
+
+}  // namespace gfx
+
diff --git a/ui/gl/gl_enums.cc b/ui/gl/gl_enums.cc
new file mode 100644
index 0000000..d43681e
--- /dev/null
+++ b/ui/gl/gl_enums.cc
@@ -0,0 +1,40 @@
+// Copyright 2014 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.
+
+#include <sstream>
+#include <GLES2/gl2.h>
+
+#include "ui/gl/gl_enums.h"
+
+namespace gfx {
+
+std::string GLEnums::GetStringEnum(uint32 value) {
+  const EnumToString* entry = enum_to_string_table_;
+  const EnumToString* end = entry + enum_to_string_table_len_;
+  for (;entry < end; ++entry) {
+    if (value == entry->value) {
+      return entry->name;
+    }
+  }
+  std::stringstream ss;
+  ss.fill('0');
+  ss.width(value < 0x10000 ? 4 : 8);
+  ss << std::hex << value;
+  return "0x" + ss.str();
+}
+
+std::string GLEnums::GetStringError(uint32 value) {
+  if (value == GL_NONE)
+    return "GL_NONE";
+  return GetStringEnum(value);
+}
+
+std::string GLEnums::GetStringBool(uint32 value) {
+  return value ? "GL_TRUE" : "GL_FALSE";
+}
+
+#include "ui/gl/gl_enums_implementation_autogen.h"
+
+}  // namespace gfx
+
diff --git a/ui/gl/gl_enums.h b/ui/gl/gl_enums.h
new file mode 100644
index 0000000..30dee6c
--- /dev/null
+++ b/ui/gl/gl_enums.h
@@ -0,0 +1,34 @@
+// Copyright 2014 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.
+
+#ifndef UI_GL_GL_ENUMS_H_
+#define UI_GL_GL_ENUMS_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "ui/gl/gl_export.h"
+
+namespace gfx {
+
+class GL_EXPORT GLEnums {
+ public:
+  struct EnumToString {
+    uint32_t value;
+    const char* name;
+  };
+
+  static std::string GetStringEnum(uint32_t value);
+  static std::string GetStringBool(uint32_t value);
+  static std::string GetStringError(uint32_t value);
+
+ private:
+  static const EnumToString* const enum_to_string_table_;
+  static const size_t enum_to_string_table_len_;
+};
+
+}  // namespace gfx
+
+#endif  // UI_GL_GL_ENUMS_H_
+
diff --git a/ui/gl/gl_enums_implementation_autogen.h b/ui/gl/gl_enums_implementation_autogen.h
new file mode 100644
index 0000000..5872db9
--- /dev/null
+++ b/ui/gl/gl_enums_implementation_autogen.h
@@ -0,0 +1,4445 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+static const GLEnums::EnumToString enum_to_string_table[] = {
+    {
+     0x8D77,
+     "GL_RGB16UI",
+    },
+    {
+     0x8D76,
+     "GL_RGBA16UI",
+    },
+    {
+     0x9260,
+     "GL_GCCSO_SHADER_BINARY_FJ",
+    },
+    {
+     0x9009,
+     "GL_TEXTURE_CUBE_MAP_ARRAY_EXT",
+    },
+    {
+     0x8D71,
+     "GL_RGB32UI",
+    },
+    {
+     0x8D70,
+     "GL_RGBA32UI",
+    },
+    {
+     0x8C76,
+     "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH",
+    },
+    {
+     0x8825,
+     "GL_DRAW_BUFFER0_EXT",
+    },
+    {
+     0x8D94,
+     "GL_RED_INTEGER",
+    },
+    {
+     0x0BC1,
+     "GL_ALPHA_TEST_FUNC_QCOM",
+    },
+    {
+     0x884C,
+     "GL_TEXTURE_COMPARE_MODE_EXT",
+    },
+    {
+     0x0BC2,
+     "GL_ALPHA_TEST_REF_QCOM",
+    },
+    {
+     0x78EF,
+     "GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM",
+    },
+    {
+     0x884D,
+     "GL_TEXTURE_COMPARE_FUNC_EXT",
+    },
+    {
+     0x884E,
+     "GL_COMPARE_REF_TO_TEXTURE_EXT",
+    },
+    {
+     0x8E76,
+     "GL_TESS_GEN_MODE_EXT",
+    },
+    {
+     0x8E77,
+     "GL_TESS_GEN_SPACING_EXT",
+    },
+    {
+     0x000D,
+     "GL_TRIANGLE_STRIP_ADJACENCY_EXT",
+    },
+    {
+     0x000E,
+     "GL_PATCHES_EXT",
+    },
+    {
+     0x000B,
+     "GL_LINE_STRIP_ADJACENCY_EXT",
+    },
+    {
+     0x000C,
+     "GL_TRIANGLES_ADJACENCY_EXT",
+    },
+    {
+     0x000A,
+     "GL_LINES_ADJACENCY_EXT",
+    },
+    {
+     0x92CF,
+     "GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT",
+    },
+    {
+     0x93A1,
+     "GL_BGRA8_EXT",
+    },
+    {
+     0x813C,
+     "GL_TEXTURE_BASE_LEVEL",
+    },
+    {
+     0,
+     "GL_FALSE",
+    },
+    {
+     0x00400000,
+     "GL_STENCIL_BUFFER_BIT6_QCOM",
+    },
+    {
+     0x9500,
+     "GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL",
+    },
+    {
+     0x78F2,
+     "GL_SCANOUT_CHROMIUM",
+    },
+    {
+     0x9138,
+     "GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG",
+    },
+    {
+     0x8FC4,
+     "GL_SHADER_BINARY_VIV",
+    },
+    {
+     0x9130,
+     "GL_SGX_PROGRAM_BINARY_IMG",
+    },
+    {
+     0x9133,
+     "GL_RENDERBUFFER_SAMPLES_IMG",
+    },
+    {
+     0x82E0,
+     "GL_BUFFER_KHR",
+    },
+    {
+     0x9135,
+     "GL_MAX_SAMPLES_IMG",
+    },
+    {
+     0x9134,
+     "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG",
+    },
+    {
+     0x9137,
+     "GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG",
+    },
+    {
+     0x9136,
+     "GL_TEXTURE_SAMPLES_IMG",
+    },
+    {
+     0x8D88,
+     "GL_RGBA16I",
+    },
+    {
+     0x8D89,
+     "GL_RGB16I",
+    },
+    {
+     0x00000020,
+     "GL_COLOR_BUFFER_BIT5_QCOM",
+    },
+    {
+     0x0008,
+     "GL_MAP_INVALIDATE_BUFFER_BIT_EXT",
+    },
+    {
+     0x0BC0,
+     "GL_ALPHA_TEST_QCOM",
+    },
+    {
+     0x0006,
+     "GL_TRIANGLE_FAN",
+    },
+    {
+     0x0007,
+     "GL_QUADS_EXT",
+    },
+    {
+     0x0004,
+     "GL_TRIANGLES",
+    },
+    {
+     0x0005,
+     "GL_TRIANGLE_STRIP",
+    },
+    {
+     0x0002,
+     "GL_LINE_LOOP",
+    },
+    {
+     0x0003,
+     "GL_LINE_STRIP",
+    },
+    {
+     0x0000,
+     "GL_POINTS",
+    },
+    {
+     0x0001,
+     "GL_LINES",
+    },
+    {
+     0x8D7D,
+     "GL_RGB8UI",
+    },
+    {
+     0x93F0,
+     "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG",
+    },
+    {
+     0x93F1,
+     "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG",
+    },
+    {
+     0x0D04,
+     "GL_PACK_SKIP_PIXELS",
+    },
+    {
+     0x900E,
+     "GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT",
+    },
+    {
+     0x900D,
+     "GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT",
+    },
+    {
+     0x8C7F,
+     "GL_TRANSFORM_FEEDBACK_BUFFER_MODE",
+    },
+    {
+     0x900F,
+     "GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT",
+    },
+    {
+     0x900A,
+     "GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT",
+    },
+    {
+     0x900C,
+     "GL_SAMPLER_CUBE_MAP_ARRAY_EXT",
+    },
+    {
+     0x88B8,
+     "GL_READ_ONLY",
+    },
+    {
+     0x88B9,
+     "GL_WRITE_ONLY_OES",
+    },
+    {
+     0x8211,
+     "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT",
+    },
+    {
+     0x8210,
+     "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT",
+    },
+    {
+     0x8741,
+     "GL_PROGRAM_BINARY_LENGTH_OES",
+    },
+    {
+     0x8740,
+     "GL_Z400_BINARY_AMD",
+    },
+    {
+     0x8215,
+     "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE",
+    },
+    {
+     0x8C4D,
+     "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV",
+    },
+    {
+     0x8192,
+     "GL_GENERATE_MIPMAP_HINT",
+    },
+    {
+     0x8E79,
+     "GL_TESS_GEN_POINT_MODE_EXT",
+    },
+    {
+     0x8A54,
+     "GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT",
+    },
+    {
+     0x8A55,
+     "GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT",
+    },
+    {
+     0x8A56,
+     "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT",
+    },
+    {
+     0x8A57,
+     "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT",
+    },
+    {
+     0x8A51,
+     "GL_RGB_RAW_422_APPLE",
+    },
+    {
+     0x87F9,
+     "GL_3DC_X_AMD",
+    },
+    {
+     0x8A53,
+     "GL_SYNC_OBJECT_APPLE",
+    },
+    {
+     0x8DF8,
+     "GL_SHADER_BINARY_FORMATS",
+    },
+    {
+     0x8DF9,
+     "GL_NUM_SHADER_BINARY_FORMATS",
+    },
+    {
+     0x826D,
+     "GL_DEBUG_GROUP_STACK_DEPTH_KHR",
+    },
+    {
+     0x8E75,
+     "GL_TESS_CONTROL_OUTPUT_VERTICES_EXT",
+    },
+    {
+     0x826B,
+     "GL_DEBUG_SEVERITY_NOTIFICATION_KHR",
+    },
+    {
+     0x826C,
+     "GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR",
+    },
+    {
+     0x8B59,
+     "GL_BOOL_VEC4",
+    },
+    {
+     0x826A,
+     "GL_DEBUG_TYPE_POP_GROUP_KHR",
+    },
+    {
+     0x8B57,
+     "GL_BOOL_VEC2",
+    },
+    {
+     0x8DF1,
+     "GL_MEDIUM_FLOAT",
+    },
+    {
+     0x8B55,
+     "GL_INT_VEC4",
+    },
+    {
+     0x8B54,
+     "GL_INT_VEC3",
+    },
+    {
+     0x8DF4,
+     "GL_MEDIUM_INT",
+    },
+    {
+     0x8DF5,
+     "GL_HIGH_INT",
+    },
+    {
+     0x8B51,
+     "GL_FLOAT_VEC3",
+    },
+    {
+     0x8B50,
+     "GL_FLOAT_VEC2",
+    },
+    {
+     0x806D,
+     "GL_UNPACK_SKIP_IMAGES",
+    },
+    {
+     0x806E,
+     "GL_UNPACK_IMAGE_HEIGHT",
+    },
+    {
+     0x806F,
+     "GL_TEXTURE_3D_OES",
+    },
+    {
+     0x92E7,
+     "GL_IS_PER_PATCH_EXT",
+    },
+    {
+     0x92E0,
+     "GL_DEBUG_OUTPUT_KHR",
+    },
+    {
+     0x806A,
+     "GL_TEXTURE_BINDING_3D_OES",
+    },
+    {
+     0x8D8E,
+     "GL_RGBA8I",
+    },
+    {
+     0x8CE3,
+     "GL_COLOR_ATTACHMENT3_EXT",
+    },
+    {
+     0x9274,
+     "GL_COMPRESSED_RGB8_ETC2",
+    },
+    {
+     0x1904,
+     "GL_GREEN_NV",
+    },
+    {
+     0x928D,
+     "GL_DST_OUT_NV",
+    },
+    {
+     0x8069,
+     "GL_TEXTURE_BINDING_2D",
+    },
+    {
+     0x8A2E,
+     "GL_MAX_COMBINED_UNIFORM_BLOCKS",
+    },
+    {
+     0x8F96,
+     "GL_RGB8_SNORM",
+    },
+    {
+     0x8F95,
+     "GL_RG8_SNORM",
+    },
+    {
+     0x8260,
+     "GL_UNDEFINED_VERTEX_EXT",
+    },
+    {
+     0x8261,
+     "GL_NO_RESET_NOTIFICATION_KHR",
+    },
+    {
+     0x0D02,
+     "GL_PACK_ROW_LENGTH",
+    },
+    {
+     0x8DFA,
+     "GL_SHADER_COMPILER",
+    },
+    {
+     0x8DFB,
+     "GL_MAX_VERTEX_UNIFORM_VECTORS",
+    },
+    {
+     0x8DFC,
+     "GL_MAX_VARYING_VECTORS",
+    },
+    {
+     0x8B5C,
+     "GL_FLOAT_MAT4",
+    },
+    {
+     0x8B5B,
+     "GL_FLOAT_MAT3",
+    },
+    {
+     0x8268,
+     "GL_DEBUG_TYPE_MARKER_KHR",
+    },
+    {
+     0x8269,
+     "GL_DEBUG_TYPE_PUSH_GROUP_KHR",
+    },
+    {
+     0x8A43,
+     "GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES",
+    },
+    {
+     0x1905,
+     "GL_BLUE_NV",
+    },
+    {
+     0x87FF,
+     "GL_PROGRAM_BINARY_FORMATS_OES",
+    },
+    {
+     0x87FE,
+     "GL_NUM_PROGRAM_BINARY_FORMATS_OES",
+    },
+    {
+     0x8A41,
+     "GL_UNIFORM_BLOCK_NAME_LENGTH",
+    },
+    {
+     0x2600,
+     "GL_NEAREST",
+    },
+    {
+     0x2601,
+     "GL_LINEAR",
+    },
+    {
+     0x8C03,
+     "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG",
+    },
+    {
+     0x821B,
+     "GL_MAJOR_VERSION",
+    },
+    {
+     0x821A,
+     "GL_DEPTH_STENCIL_ATTACHMENT",
+    },
+    {
+     0x8A40,
+     "GL_UNIFORM_BLOCK_DATA_SIZE",
+    },
+    {
+     0x9242,
+     "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM",
+    },
+    {
+     0x821D,
+     "GL_NUM_EXTENSIONS",
+    },
+    {
+     0x88BB,
+     "GL_BUFFER_ACCESS_OES",
+    },
+    {
+     0x88BC,
+     "GL_BUFFER_MAPPED_OES",
+    },
+    {
+     0x88BD,
+     "GL_BUFFER_MAP_POINTER_OES",
+    },
+    {
+     0x88BF,
+     "GL_TIME_ELAPSED_EXT",
+    },
+    {
+     0x8A46,
+     "GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER",
+    },
+    {
+     0x6003,
+     "GL_GET_ERROR_QUERY_CHROMIUM",
+    },
+    {
+     0x8F94,
+     "GL_R8_SNORM",
+    },
+    {
+     0x0C10,
+     "GL_SCISSOR_BOX",
+    },
+    {
+     0x0C11,
+     "GL_SCISSOR_TEST",
+    },
+    {
+     0x1700,
+     "GL_PATH_MODELVIEW_CHROMIUM",
+    },
+    {
+     0x80000000,
+     "GL_MULTISAMPLE_BUFFER_BIT7_QCOM",
+    },
+    {
+     0x94F8,
+     "GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL",
+    },
+    {
+     0x8A48,
+     "GL_TEXTURE_SRGB_DECODE_EXT",
+    },
+    {
+     0x300E,
+     "GL_CONTEXT_LOST",
+    },
+    {
+     0x02000000,
+     "GL_MULTISAMPLE_BUFFER_BIT1_QCOM",
+    },
+    {
+     0x8C2F,
+     "GL_ANY_SAMPLES_PASSED_EXT",
+    },
+    {
+     0x8BD2,
+     "GL_TEXTURE_WIDTH_QCOM",
+    },
+    {
+     0x8C2D,
+     "GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT",
+    },
+    {
+     0x8C2C,
+     "GL_TEXTURE_BINDING_BUFFER_EXT",
+    },
+    {
+     0x8C2B,
+     "GL_MAX_TEXTURE_BUFFER_SIZE_EXT",
+    },
+    {
+     0x8C2A,
+     "GL_TEXTURE_BUFFER_EXT",
+    },
+    {
+     0x8BD7,
+     "GL_TEXTURE_TYPE_QCOM",
+    },
+    {
+     0x8B8D,
+     "GL_CURRENT_PROGRAM",
+    },
+    {
+     0x8BD9,
+     "GL_TEXTURE_NUM_LEVELS_QCOM",
+    },
+    {
+     0x00200000,
+     "GL_STENCIL_BUFFER_BIT5_QCOM",
+    },
+    {
+     0x8D9F,
+     "GL_INT_2_10_10_10_REV",
+    },
+    {
+     0x8B8A,
+     "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH",
+    },
+    {
+     0x8B8B,
+     "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES",
+    },
+    {
+     0x8B8C,
+     "GL_SHADING_LANGUAGE_VERSION",
+    },
+    {
+     0x8BDA,
+     "GL_TEXTURE_TARGET_QCOM",
+    },
+    {
+     0x8BDB,
+     "GL_TEXTURE_OBJECT_VALID_QCOM",
+    },
+    {
+     0x8BDC,
+     "GL_STATE_RESTORE",
+    },
+    {
+     0x8B88,
+     "GL_SHADER_SOURCE_LENGTH",
+    },
+    {
+     0x8B89,
+     "GL_ACTIVE_ATTRIBUTES",
+    },
+    {
+     0x93C9,
+     "GL_COMPRESSED_RGBA_ASTC_6x6x6_OES",
+    },
+    {
+     0x93C8,
+     "GL_COMPRESSED_RGBA_ASTC_6x6x5_OES",
+    },
+    {
+     0x8B84,
+     "GL_INFO_LOG_LENGTH",
+    },
+    {
+     0x8B85,
+     "GL_ATTACHED_SHADERS",
+    },
+    {
+     0x8B86,
+     "GL_ACTIVE_UNIFORMS",
+    },
+    {
+     0x8B87,
+     "GL_ACTIVE_UNIFORM_MAX_LENGTH",
+    },
+    {
+     0x8B80,
+     "GL_DELETE_STATUS",
+    },
+    {
+     0x8B81,
+     "GL_COMPILE_STATUS",
+    },
+    {
+     0x8B82,
+     "GL_LINK_STATUS",
+    },
+    {
+     0x8B83,
+     "GL_VALIDATE_STATUS",
+    },
+    {
+     0x9380,
+     "GL_NUM_SAMPLE_COUNTS",
+    },
+    {
+     0x8D48,
+     "GL_STENCIL_INDEX8",
+    },
+    {
+     0x8D46,
+     "GL_STENCIL_INDEX1_OES",
+    },
+    {
+     0x8D47,
+     "GL_STENCIL_INDEX4_OES",
+    },
+    {
+     0x8D44,
+     "GL_RENDERBUFFER_INTERNAL_FORMAT",
+    },
+    {
+     0x00000100,
+     "GL_DEPTH_BUFFER_BIT",
+    },
+    {
+     0x8D42,
+     "GL_RENDERBUFFER_WIDTH",
+    },
+    {
+     0x8D43,
+     "GL_RENDERBUFFER_HEIGHT",
+    },
+    {
+     0x8D40,
+     "GL_FRAMEBUFFER",
+    },
+    {
+     0x8D41,
+     "GL_RENDERBUFFER",
+    },
+    {
+     0x8A3A,
+     "GL_UNIFORM_BLOCK_INDEX",
+    },
+    {
+     0x0BD0,
+     "GL_DITHER",
+    },
+    {
+     0x93D3,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR",
+    },
+    {
+     0x9144,
+     "GL_MAX_DEBUG_LOGGED_MESSAGES_KHR",
+    },
+    {
+     0x1801,
+     "GL_DEPTH_EXT",
+    },
+    {
+     0x1800,
+     "GL_COLOR_EXT",
+    },
+    {
+     0x1802,
+     "GL_STENCIL_EXT",
+    },
+    {
+     0x9288,
+     "GL_SRC_OVER_NV",
+    },
+    {
+     0x9120,
+     "GL_BUFFER_MAP_LENGTH",
+    },
+    {
+     0x0B21,
+     "GL_LINE_WIDTH",
+    },
+    {
+     0x9308,
+     "GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT",
+    },
+    {
+     0x81A5,
+     "GL_DEPTH_COMPONENT16",
+    },
+    {
+     0x81A6,
+     "GL_DEPTH_COMPONENT24_OES",
+    },
+    {
+     0x81A7,
+     "GL_DEPTH_COMPONENT32_OES",
+    },
+    {
+     0x88FD,
+     "GL_VERTEX_ATTRIB_ARRAY_INTEGER",
+    },
+    {
+     0x88FE,
+     "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE",
+    },
+    {
+     0x88FF,
+     "GL_MAX_ARRAY_TEXTURE_LAYERS",
+    },
+    {
+     0x8B6A,
+     "GL_FLOAT_MAT4x3_NV",
+    },
+    {
+     0x93D0,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR",
+    },
+    {
+     0x9143,
+     "GL_MAX_DEBUG_MESSAGE_LENGTH_KHR",
+    },
+    {
+     0x8DFD,
+     "GL_MAX_FRAGMENT_UNIFORM_VECTORS",
+    },
+    {
+     0x9145,
+     "GL_DEBUG_LOGGED_MESSAGES_KHR",
+    },
+    {
+     0x9146,
+     "GL_DEBUG_SEVERITY_HIGH_KHR",
+    },
+    {
+     0x9147,
+     "GL_DEBUG_SEVERITY_MEDIUM_KHR",
+    },
+    {
+     0x9148,
+     "GL_DEBUG_SEVERITY_LOW_KHR",
+    },
+    {
+     0x8F63,
+     "GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT",
+    },
+    {
+     0x8F60,
+     "GL_MALI_SHADER_BINARY_ARM",
+    },
+    {
+     0x8F61,
+     "GL_MALI_PROGRAM_BINARY_ARM",
+    },
+    {
+     0x8F66,
+     "GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM",
+    },
+    {
+     0x8F67,
+     "GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT",
+    },
+    {
+     0x8F64,
+     "GL_SHADER_PIXEL_LOCAL_STORAGE_EXT",
+    },
+    {
+     0x8F65,
+     "GL_FETCH_PER_SAMPLE_ARM",
+    },
+    {
+     0x92D3,
+     "GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT",
+    },
+    {
+     0x87EE,
+     "GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD",
+    },
+    {
+     0x822B,
+     "GL_RG8_EXT",
+    },
+    {
+     0x822F,
+     "GL_RG16F_EXT",
+    },
+    {
+     0x822D,
+     "GL_R16F_EXT",
+    },
+    {
+     0x822E,
+     "GL_R32F_EXT",
+    },
+    {
+     1,
+     "GL_ES_VERSION_2_0",
+    },
+    {
+     0x84F9,
+     "GL_DEPTH_STENCIL_OES",
+    },
+    {
+     0x82DB,
+     "GL_TEXTURE_VIEW_MIN_LEVEL_EXT",
+    },
+    {
+     0x8368,
+     "GL_UNSIGNED_INT_2_10_10_10_REV_EXT",
+    },
+    {
+     0x8819,
+     "GL_LUMINANCE_ALPHA32F_EXT",
+    },
+    {
+     0x8818,
+     "GL_LUMINANCE32F_EXT",
+    },
+    {
+     0x82DF,
+     "GL_TEXTURE_IMMUTABLE_LEVELS",
+    },
+    {
+     0x8363,
+     "GL_UNSIGNED_SHORT_5_6_5",
+    },
+    {
+     0x9051,
+     "GL_IMAGE_BUFFER_EXT",
+    },
+    {
+     0x84F2,
+     "GL_ALL_COMPLETED_NV",
+    },
+    {
+     0x8E5A,
+     "GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT",
+    },
+    {
+     0x84F4,
+     "GL_FENCE_CONDITION_NV",
+    },
+    {
+     0x8366,
+     "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT",
+    },
+    {
+     0x8365,
+     "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT",
+    },
+    {
+     0x84F7,
+     "GL_COMMANDS_COMPLETED_CHROMIUM",
+    },
+    {
+     0x8F9C,
+     "GL_SIGNED_NORMALIZED",
+    },
+    {
+     0x92D5,
+     "GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT",
+    },
+    {
+     0x881E,
+     "GL_LUMINANCE16F_EXT",
+    },
+    {
+     0x84FA,
+     "GL_UNSIGNED_INT_24_8_OES",
+    },
+    {
+     0x92D4,
+     "GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT",
+    },
+    {
+     0x881A,
+     "GL_RGBA16F_EXT",
+    },
+    {
+     0x84FE,
+     "GL_TEXTURE_MAX_ANISOTROPY_EXT",
+    },
+    {
+     0x0901,
+     "GL_CCW",
+    },
+    {
+     0x0900,
+     "GL_CW",
+    },
+    {
+     0x9317,
+     "GL_MAX_FRAMEBUFFER_LAYERS_EXT",
+    },
+    {
+     0x8229,
+     "GL_R8_EXT",
+    },
+    {
+     0x8230,
+     "GL_RG32F_EXT",
+    },
+    {
+     0x9312,
+     "GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT",
+    },
+    {
+     0x9283,
+     "GL_DISJOINT_NV",
+    },
+    {
+     0x8221,
+     "GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED",
+    },
+    {
+     0x8227,
+     "GL_RG_EXT",
+    },
+    {
+     0x8B66,
+     "GL_FLOAT_MAT2x4_NV",
+    },
+    {
+     0x8B67,
+     "GL_FLOAT_MAT3x2_NV",
+    },
+    {
+     0x8E1E,
+     "GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT",
+    },
+    {
+     0x8B62,
+     "GL_SAMPLER_2D_SHADOW_EXT",
+    },
+    {
+     0x8B63,
+     "GL_SAMPLER_2D_RECT_ARB",
+    },
+    {
+     0x8B60,
+     "GL_SAMPLER_CUBE",
+    },
+    {
+     0x00001000,
+     "GL_DEPTH_BUFFER_BIT4_QCOM",
+    },
+    {
+     0x8B68,
+     "GL_FLOAT_MAT3x4_NV",
+    },
+    {
+     0x83F0,
+     "GL_COMPRESSED_RGB_S3TC_DXT1_EXT",
+    },
+    {
+     0x8D6A,
+     "GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT",
+    },
+    {
+     0x00000080,
+     "GL_COLOR_BUFFER_BIT7_QCOM",
+    },
+    {
+     0x88F0,
+     "GL_DEPTH24_STENCIL8_OES",
+    },
+    {
+     0x8E1F,
+     "GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT",
+    },
+    {
+     0x80A0,
+     "GL_SAMPLE_COVERAGE",
+    },
+    {
+     0x928F,
+     "GL_DST_ATOP_NV",
+    },
+    {
+     0x8213,
+     "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE",
+    },
+    {
+     0x80A9,
+     "GL_SAMPLES",
+    },
+    {
+     0x80A8,
+     "GL_SAMPLE_BUFFERS",
+    },
+    {
+     0x0D55,
+     "GL_ALPHA_BITS",
+    },
+    {
+     0x0D54,
+     "GL_BLUE_BITS",
+    },
+    {
+     0x0D57,
+     "GL_STENCIL_BITS",
+    },
+    {
+     0x0D56,
+     "GL_DEPTH_BITS",
+    },
+    {
+     0x8CD5,
+     "GL_FRAMEBUFFER_COMPLETE",
+    },
+    {
+     0x0D50,
+     "GL_SUBPIXEL_BITS",
+    },
+    {
+     0x0D53,
+     "GL_GREEN_BITS",
+    },
+    {
+     0x0D52,
+     "GL_RED_BITS",
+    },
+    {
+     0x8037,
+     "GL_POLYGON_OFFSET_FILL",
+    },
+    {
+     0x928C,
+     "GL_SRC_OUT_NV",
+    },
+    {
+     0x8034,
+     "GL_UNSIGNED_SHORT_5_5_5_1",
+    },
+    {
+     0x8033,
+     "GL_UNSIGNED_SHORT_4_4_4_4",
+    },
+    {
+     0x928B,
+     "GL_DST_IN_NV",
+    },
+    {
+     0x0305,
+     "GL_ONE_MINUS_DST_ALPHA",
+    },
+    {
+     0x0304,
+     "GL_DST_ALPHA",
+    },
+    {
+     0x0307,
+     "GL_ONE_MINUS_DST_COLOR",
+    },
+    {
+     0x0306,
+     "GL_DST_COLOR",
+    },
+    {
+     0x0301,
+     "GL_ONE_MINUS_SRC_COLOR",
+    },
+    {
+     0x0300,
+     "GL_SRC_COLOR",
+    },
+    {
+     0x0303,
+     "GL_ONE_MINUS_SRC_ALPHA",
+    },
+    {
+     0x0302,
+     "GL_SRC_ALPHA",
+    },
+    {
+     0x8212,
+     "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE",
+    },
+    {
+     0x0308,
+     "GL_SRC_ALPHA_SATURATE",
+    },
+    {
+     0x2A00,
+     "GL_POLYGON_OFFSET_UNITS",
+    },
+    {
+     0xFFFFFFFF,
+     "GL_ALL_SHADER_BITS_EXT",
+    },
+    {
+     0x82DC,
+     "GL_TEXTURE_VIEW_NUM_LEVELS_EXT",
+    },
+    {
+     0x8C29,
+     "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT",
+    },
+    {
+     0x82DD,
+     "GL_TEXTURE_VIEW_MIN_LAYER_EXT",
+    },
+    {
+     0x00800000,
+     "GL_STENCIL_BUFFER_BIT7_QCOM",
+    },
+    {
+     0x82DE,
+     "GL_TEXTURE_VIEW_NUM_LAYERS_EXT",
+    },
+    {
+     0x00020000,
+     "GL_STENCIL_BUFFER_BIT1_QCOM",
+    },
+    {
+     0x8D00,
+     "GL_DEPTH_ATTACHMENT",
+    },
+    {
+     0x8FA0,
+     "GL_PERFMON_GLOBAL_MODE_QCOM",
+    },
+    {
+     0x8815,
+     "GL_RGB32F_EXT",
+    },
+    {
+     0x8A35,
+     "GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH",
+    },
+    {
+     0x8814,
+     "GL_RGBA32F_EXT",
+    },
+    {
+     0x9277,
+     "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",
+    },
+    {
+     0x6004,
+     "GL_COMMANDS_ISSUED_CHROMIUM",
+    },
+    {
+     0x813D,
+     "GL_TEXTURE_MAX_LEVEL_APPLE",
+    },
+    {
+     0x8816,
+     "GL_ALPHA32F_EXT",
+    },
+    {
+     0x813B,
+     "GL_TEXTURE_MAX_LOD",
+    },
+    {
+     0x8CDD,
+     "GL_FRAMEBUFFER_UNSUPPORTED",
+    },
+    {
+     0x8CDF,
+     "GL_MAX_COLOR_ATTACHMENTS_EXT",
+    },
+    {
+     0x90F3,
+     "GL_CONTEXT_ROBUST_ACCESS_KHR",
+    },
+    {
+     0x90F2,
+     "GL_MAX_MULTIVIEW_BUFFERS_EXT",
+    },
+    {
+     0x90F1,
+     "GL_MULTIVIEW_EXT",
+    },
+    {
+     0x90F0,
+     "GL_COLOR_ATTACHMENT_EXT",
+    },
+    {
+     0x803C,
+     "GL_ALPHA8_OES",
+    },
+    {
+     0x8904,
+     "GL_MIN_PROGRAM_TEXEL_OFFSET",
+    },
+    {
+     0x84F5,
+     "GL_TEXTURE_RECTANGLE_ARB",
+    },
+    {
+     0x882A,
+     "GL_DRAW_BUFFER5_EXT",
+    },
+    {
+     0x8E7F,
+     "GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT",
+    },
+    {
+     0x80AA,
+     "GL_SAMPLE_COVERAGE_VALUE",
+    },
+    {
+     0x84F6,
+     "GL_TEXTURE_BINDING_RECTANGLE_ARB",
+    },
+    {
+     0x80AB,
+     "GL_SAMPLE_COVERAGE_INVERT",
+    },
+    {
+     0x8E7D,
+     "GL_MAX_PATCH_VERTICES_EXT",
+    },
+    {
+     0x6005,
+     "GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM",
+    },
+    {
+     0x9105,
+     "GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES",
+    },
+    {
+     0x8E7E,
+     "GL_MAX_TESS_GEN_LEVEL_EXT",
+    },
+    {
+     0x9102,
+     "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES",
+    },
+    {
+     0x8C40,
+     "GL_SRGB_EXT",
+    },
+    {
+     0x8236,
+     "GL_R32UI",
+    },
+    {
+     0x8E7B,
+     "GL_FRACTIONAL_ODD_EXT",
+    },
+    {
+     0x00000040,
+     "GL_COLOR_BUFFER_BIT6_QCOM",
+    },
+    {
+     0x882B,
+     "GL_DRAW_BUFFER6_EXT",
+    },
+    {
+     0x8E7C,
+     "GL_FRACTIONAL_EVEN_EXT",
+    },
+    {
+     0x8C8E,
+     "GL_TRANSFORM_FEEDBACK_BUFFER",
+    },
+    {
+     0x8C8D,
+     "GL_SEPARATE_ATTRIBS",
+    },
+    {
+     0x8C8F,
+     "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING",
+    },
+    {
+     0x8C8A,
+     "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS",
+    },
+    {
+     0x8C8C,
+     "GL_INTERLEAVED_ATTRIBS",
+    },
+    {
+     0x8C8B,
+     "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS",
+    },
+    {
+     0x8C17,
+     "GL_UNSIGNED_NORMALIZED_EXT",
+    },
+    {
+     0x8A3E,
+     "GL_UNIFORM_IS_ROW_MAJOR",
+    },
+    {
+     0x8E7A,
+     "GL_ISOLINES_EXT",
+    },
+    {
+     0x6006,
+     "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM",
+    },
+    {
+     0x8D99,
+     "GL_RGBA_INTEGER",
+    },
+    {
+     0x8D98,
+     "GL_RGB_INTEGER",
+    },
+    {
+     0x8A4A,
+     "GL_SKIP_DECODE_EXT",
+    },
+    {
+     0x8A4F,
+     "GL_PROGRAM_PIPELINE_OBJECT_EXT",
+    },
+    {
+     0x882C,
+     "GL_DRAW_BUFFER7_EXT",
+    },
+    {
+     0x0010,
+     "GL_MAP_FLUSH_EXPLICIT_BIT_EXT",
+    },
+    {
+     0x8918,
+     "GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT",
+    },
+    {
+     0x8919,
+     "GL_SAMPLER_BINDING",
+    },
+    {
+     0x92CD,
+     "GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT",
+    },
+    {
+     0x92CE,
+     "GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT",
+    },
+    {
+     0x8C85,
+     "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE",
+    },
+    {
+     0x8D7C,
+     "GL_RGBA8UI",
+    },
+    {
+     0x6007,
+     "GL_LATENCY_QUERY_CHROMIUM",
+    },
+    {
+     0x8D83,
+     "GL_RGB32I",
+    },
+    {
+     0x8916,
+     "GL_GEOMETRY_LINKED_VERTICES_OUT_EXT",
+    },
+    {
+     0x8917,
+     "GL_GEOMETRY_LINKED_INPUT_TYPE_EXT",
+    },
+    {
+     0x881F,
+     "GL_LUMINANCE_ALPHA16F_EXT",
+    },
+    {
+     0x84FD,
+     "GL_MAX_TEXTURE_LOD_BIAS",
+    },
+    {
+     0x882D,
+     "GL_DRAW_BUFFER8_EXT",
+    },
+    {
+     0x0BA6,
+     "GL_PATH_MODELVIEW_MATRIX_CHROMIUM",
+    },
+    {
+     0x8A42,
+     "GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS",
+    },
+    {
+     0x8F37,
+     "GL_COPY_WRITE_BUFFER_NV",
+    },
+    {
+     0x8F36,
+     "GL_COPY_READ_BUFFER_NV",
+    },
+    {
+     0x84FF,
+     "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT",
+    },
+    {
+     0x8A3C,
+     "GL_UNIFORM_ARRAY_STRIDE",
+    },
+    {
+     0x8A44,
+     "GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER",
+    },
+    {
+     0x6000,
+     "GL_TEXTURE_POOL_CHROMIUM",
+    },
+    {
+     0x0B74,
+     "GL_DEPTH_FUNC",
+    },
+    {
+     0x8A49,
+     "GL_DECODE_EXT",
+    },
+    {
+     0x881B,
+     "GL_RGB16F_EXT",
+    },
+    {
+     0x0B71,
+     "GL_DEPTH_TEST",
+    },
+    {
+     0x0B70,
+     "GL_DEPTH_RANGE",
+    },
+    {
+     0x0B73,
+     "GL_DEPTH_CLEAR_VALUE",
+    },
+    {
+     0x0B72,
+     "GL_DEPTH_WRITEMASK",
+    },
+    {
+     0x8BD5,
+     "GL_TEXTURE_INTERNAL_FORMAT_QCOM",
+    },
+    {
+     0x85BA,
+     "GL_UNSIGNED_SHORT_8_8_APPLE",
+    },
+    {
+     0x8C87,
+     "GL_PRIMITIVES_GENERATED_EXT",
+    },
+    {
+     0x8C80,
+     "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS",
+    },
+    {
+     0x8C83,
+     "GL_TRANSFORM_FEEDBACK_VARYINGS",
+    },
+    {
+     0x8D69,
+     "GL_PRIMITIVE_RESTART_FIXED_INDEX",
+    },
+    {
+     0x882E,
+     "GL_DRAW_BUFFER9_EXT",
+    },
+    {
+     0x8A32,
+     "GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT",
+    },
+    {
+     0x8A31,
+     "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS",
+    },
+    {
+     0x8C89,
+     "GL_RASTERIZER_DISCARD",
+    },
+    {
+     0x8C88,
+     "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN",
+    },
+    {
+     0x8C1A,
+     "GL_TEXTURE_2D_ARRAY",
+    },
+    {
+     0x910D,
+     "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
+    },
+    {
+     0x8E80,
+     "GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT",
+    },
+    {
+     0x910B,
+     "GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
+    },
+    {
+     0x910C,
+     "GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
+    },
+    {
+     0x94FA,
+     "GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL",
+    },
+    {
+     0x8073,
+     "GL_MAX_3D_TEXTURE_SIZE_OES",
+    },
+    {
+     0x8072,
+     "GL_TEXTURE_WRAP_R_OES",
+    },
+    {
+     0x9289,
+     "GL_DST_OVER_NV",
+    },
+    {
+     0x882F,
+     "GL_DRAW_BUFFER10_EXT",
+    },
+    {
+     0x8074,
+     "GL_VERTEX_ARRAY_KHR",
+    },
+    {
+     0x80E1,
+     "GL_BGRA_EXT",
+    },
+    {
+     0x8ED7,
+     "GL_COVERAGE_AUTOMATIC_NV",
+    },
+    {
+     0x8ED6,
+     "GL_COVERAGE_EDGE_FRAGMENTS_NV",
+    },
+    {
+     0x8ED5,
+     "GL_COVERAGE_ALL_FRAGMENTS_NV",
+    },
+    {
+     0x8ED4,
+     "GL_COVERAGE_SAMPLES_NV",
+    },
+    {
+     0x8ED3,
+     "GL_COVERAGE_BUFFERS_NV",
+    },
+    {
+     0x8ED2,
+     "GL_COVERAGE_ATTACHMENT_NV",
+    },
+    {
+     0x8ED1,
+     "GL_COVERAGE_COMPONENT4_NV",
+    },
+    {
+     0x8ED0,
+     "GL_COVERAGE_COMPONENT_NV",
+    },
+    {
+     0x8217,
+     "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE",
+    },
+    {
+     0x8E89,
+     "GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT",
+    },
+    {
+     0x8216,
+     "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE",
+    },
+    {
+     0x8A36,
+     "GL_ACTIVE_UNIFORM_BLOCKS",
+    },
+    {
+     0x8A37,
+     "GL_UNIFORM_TYPE",
+    },
+    {
+     0x8A34,
+     "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT",
+    },
+    {
+     0x3006,
+     "GL_CLIP_DISTANCE6_APPLE",
+    },
+    {
+     0x800B,
+     "GL_FUNC_REVERSE_SUBTRACT",
+    },
+    {
+     0x8A33,
+     "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS",
+    },
+    {
+     0x00000400,
+     "GL_STENCIL_BUFFER_BIT",
+    },
+    {
+     0x800A,
+     "GL_FUNC_SUBTRACT",
+    },
+    {
+     0x8214,
+     "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE",
+    },
+    {
+     0x8A38,
+     "GL_UNIFORM_SIZE",
+    },
+    {
+     0x8A39,
+     "GL_UNIFORM_NAME_LENGTH",
+    },
+    {
+     0x8E2C,
+     "GL_DEPTH_COMPONENT16_NONLINEAR_NV",
+    },
+    {
+     0x889F,
+     "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
+    },
+    {
+     0x8219,
+     "GL_FRAMEBUFFER_UNDEFINED_OES",
+    },
+    {
+     0x8E23,
+     "GL_TRANSFORM_FEEDBACK_PAUSED",
+    },
+    {
+     0x8E22,
+     "GL_TRANSFORM_FEEDBACK",
+    },
+    {
+     0x8E25,
+     "GL_TRANSFORM_FEEDBACK_BINDING",
+    },
+    {
+     0x9054,
+     "GL_IMAGE_CUBE_MAP_ARRAY_EXT",
+    },
+    {
+     0x8E28,
+     "GL_TIMESTAMP_EXT",
+    },
+    {
+     0x8006,
+     "GL_FUNC_ADD",
+    },
+    {
+     0x8007,
+     "GL_MIN_EXT",
+    },
+    {
+     0x8004,
+     "GL_ONE_MINUS_CONSTANT_ALPHA",
+    },
+    {
+     0x8005,
+     "GL_BLEND_COLOR",
+    },
+    {
+     0x8002,
+     "GL_ONE_MINUS_CONSTANT_COLOR",
+    },
+    {
+     0x8003,
+     "GL_CONSTANT_ALPHA",
+    },
+    {
+     0x8001,
+     "GL_CONSTANT_COLOR",
+    },
+    {
+     0x0204,
+     "GL_GREATER",
+    },
+    {
+     0x0205,
+     "GL_NOTEQUAL",
+    },
+    {
+     0x0206,
+     "GL_GEQUAL",
+    },
+    {
+     0x0207,
+     "GL_ALWAYS",
+    },
+    {
+     0x0200,
+     "GL_NEVER",
+    },
+    {
+     0x0201,
+     "GL_LESS",
+    },
+    {
+     0x0202,
+     "GL_EQUAL",
+    },
+    {
+     0x0203,
+     "GL_LEQUAL",
+    },
+    {
+     0x8BD6,
+     "GL_TEXTURE_FORMAT_QCOM",
+    },
+    {
+     0x8228,
+     "GL_RG_INTEGER",
+    },
+    {
+     0x2901,
+     "GL_REPEAT",
+    },
+    {
+     0x9067,
+     "GL_UNSIGNED_INT_IMAGE_BUFFER_EXT",
+    },
+    {
+     0x92A0,
+     "GL_EXCLUSION_KHR",
+    },
+    {
+     0x93D8,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR",
+    },
+    {
+     0x93D9,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR",
+    },
+    {
+     0x8FB2,
+     "GL_GPU_OPTIMIZED_QCOM",
+    },
+    {
+     0x190A,
+     "GL_LUMINANCE_ALPHA",
+    },
+    {
+     0x8FB0,
+     "GL_BINNING_CONTROL_HINT_QCOM",
+    },
+    {
+     0x905C,
+     "GL_INT_IMAGE_BUFFER_EXT",
+    },
+    {
+     0x1E00,
+     "GL_KEEP",
+    },
+    {
+     0x1E01,
+     "GL_REPLACE",
+    },
+    {
+     0x1E02,
+     "GL_INCR",
+    },
+    {
+     0x1E03,
+     "GL_DECR",
+    },
+    {
+     0x93D6,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR",
+    },
+    {
+     0x93D7,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR",
+    },
+    {
+     0x93D4,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR",
+    },
+    {
+     0x93D5,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR",
+    },
+    {
+     0x886D,
+     "GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT",
+    },
+    {
+     0x0BE2,
+     "GL_BLEND",
+    },
+    {
+     0x84CB,
+     "GL_TEXTURE11",
+    },
+    {
+     0x8D55,
+     "GL_RENDERBUFFER_STENCIL_SIZE",
+    },
+    {
+     0x8D54,
+     "GL_RENDERBUFFER_DEPTH_SIZE",
+    },
+    {
+     0x8D57,
+     "GL_MAX_SAMPLES_ANGLE",
+    },
+    {
+     0x8D56,
+     "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE",
+    },
+    {
+     0x8D51,
+     "GL_RENDERBUFFER_GREEN_SIZE",
+    },
+    {
+     0x8D50,
+     "GL_RENDERBUFFER_RED_SIZE",
+    },
+    {
+     0x8D53,
+     "GL_RENDERBUFFER_ALPHA_SIZE",
+    },
+    {
+     0x8D52,
+     "GL_RENDERBUFFER_BLUE_SIZE",
+    },
+    {
+     0x92A6,
+     "GL_VIVIDLIGHT_NV",
+    },
+    {
+     0x8A2A,
+     "GL_UNIFORM_BUFFER_SIZE",
+    },
+    {
+     0x8DCC,
+     "GL_INT_SAMPLER_CUBE",
+    },
+    {
+     0x78F1,
+     "GL_MAP_CHROMIUM",
+    },
+    {
+     0x00080000,
+     "GL_STENCIL_BUFFER_BIT3_QCOM",
+    },
+    {
+     0x92A7,
+     "GL_LINEARLIGHT_NV",
+    },
+    {
+     0x8DCF,
+     "GL_INT_SAMPLER_2D_ARRAY",
+    },
+    {
+     0x886A,
+     "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED",
+    },
+    {
+     0x8C41,
+     "GL_SRGB8_NV",
+    },
+    {
+     0x0C01,
+     "GL_DRAW_BUFFER_EXT",
+    },
+    {
+     0x886C,
+     "GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT",
+    },
+    {
+     0x90CB,
+     "GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT",
+    },
+    {
+     0x8DCA,
+     "GL_INT_SAMPLER_2D",
+    },
+    {
+     0x93C7,
+     "GL_COMPRESSED_RGBA_ASTC_6x5x5_OES",
+    },
+    {
+     0x8B5F,
+     "GL_SAMPLER_3D_OES",
+    },
+    {
+     0x8B95,
+     "GL_PALETTE8_RGB8_OES",
+    },
+    {
+     0x9250,
+     "GL_SHADER_BINARY_DMP",
+    },
+    {
+     0x9251,
+     "GL_SMAPHS30_PROGRAM_BINARY_DMP",
+    },
+    {
+     0x9252,
+     "GL_SMAPHS_PROGRAM_BINARY_DMP",
+    },
+    {
+     0x9253,
+     "GL_DMP_PROGRAM_BINARY_DMP",
+    },
+    {
+     0x8DC8,
+     "GL_UNSIGNED_INT_VEC4",
+    },
+    {
+     0x3000,
+     "GL_CLIP_DISTANCE0_APPLE",
+    },
+    {
+     0x8C92,
+     "GL_ATC_RGB_AMD",
+    },
+    {
+     0x8DC1,
+     "GL_SAMPLER_2D_ARRAY",
+    },
+    {
+     0x9154,
+     "GL_VERTEX_ARRAY_OBJECT_EXT",
+    },
+    {
+     0x9153,
+     "GL_QUERY_OBJECT_EXT",
+    },
+    {
+     0x8864,
+     "GL_QUERY_COUNTER_BITS_EXT",
+    },
+    {
+     0x9151,
+     "GL_BUFFER_OBJECT_EXT",
+    },
+    {
+     0x8C93,
+     "GL_ATC_RGBA_EXPLICIT_ALPHA_AMD",
+    },
+    {
+     0x00000002,
+     "GL_CONTEXT_FLAG_DEBUG_BIT_KHR",
+    },
+    {
+     0x8A3F,
+     "GL_UNIFORM_BLOCK_BINDING",
+    },
+    {
+     0x00000000,
+     "GL_PERFQUERY_SINGLE_CONTEXT_INTEL",
+    },
+    {
+     0x00000001,
+     "GL_SYNC_FLUSH_COMMANDS_BIT_APPLE",
+    },
+    {
+     0x9248,
+     "GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM",
+    },
+    {
+     0x00000004,
+     "GL_GEOMETRY_SHADER_BIT_EXT",
+    },
+    {
+     0x1702,
+     "GL_TEXTURE",
+    },
+    {
+     0x3003,
+     "GL_CLIP_DISTANCE3_APPLE",
+    },
+    {
+     0x00000008,
+     "GL_TESS_CONTROL_SHADER_BIT_EXT",
+    },
+    {
+     0x8B58,
+     "GL_BOOL_VEC3",
+    },
+    {
+     0x8A3D,
+     "GL_UNIFORM_MATRIX_STRIDE",
+    },
+    {
+     0x8828,
+     "GL_DRAW_BUFFER3_EXT",
+    },
+    {
+     0x8DF0,
+     "GL_LOW_FLOAT",
+    },
+    {
+     0x1906,
+     "GL_ALPHA",
+    },
+    {
+     0x1907,
+     "GL_RGB",
+    },
+    {
+     0x8FBB,
+     "GL_GPU_DISJOINT_EXT",
+    },
+    {
+     0x1901,
+     "GL_STENCIL_INDEX_OES",
+    },
+    {
+     0x1902,
+     "GL_DEPTH_COMPONENT",
+    },
+    {
+     0x8B56,
+     "GL_BOOL",
+    },
+    {
+     0x93DB,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR",
+    },
+    {
+     0x8B9B,
+     "GL_IMPLEMENTATION_COLOR_READ_FORMAT",
+    },
+    {
+     0x8B9A,
+     "GL_IMPLEMENTATION_COLOR_READ_TYPE",
+    },
+    {
+     0x93DA,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR",
+    },
+    {
+     0x1908,
+     "GL_RGBA",
+    },
+    {
+     0x8DF2,
+     "GL_HIGH_FLOAT",
+    },
+    {
+     0x93DD,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR",
+    },
+    {
+     0x8827,
+     "GL_DRAW_BUFFER2_EXT",
+    },
+    {
+     0x9243,
+     "GL_UNPACK_COLORSPACE_CONVERSION_CHROMIUM",
+    },
+    {
+     0x8DF3,
+     "GL_LOW_INT",
+    },
+    {
+     0x82E8,
+     "GL_MAX_LABEL_LENGTH_KHR",
+    },
+    {
+     0x82E6,
+     "GL_SAMPLER_KHR",
+    },
+    {
+     0x0C02,
+     "GL_READ_BUFFER_EXT",
+    },
+    {
+     0x82E3,
+     "GL_QUERY_KHR",
+    },
+    {
+     0x82E2,
+     "GL_PROGRAM_KHR",
+    },
+    {
+     0x82E1,
+     "GL_SHADER_KHR",
+    },
+    {
+     0x8B52,
+     "GL_FLOAT_VEC4",
+    },
+    {
+     0x8239,
+     "GL_RG16I",
+    },
+    {
+     0x8238,
+     "GL_RG8UI",
+    },
+    {
+     0x9240,
+     "GL_UNPACK_FLIP_Y_CHROMIUM",
+    },
+    {
+     0x8DF6,
+     "GL_UNSIGNED_INT_10_10_10_2_OES",
+    },
+    {
+     0x8A30,
+     "GL_MAX_UNIFORM_BLOCK_SIZE",
+    },
+    {
+     0x9273,
+     "GL_COMPRESSED_SIGNED_RG11_EAC",
+    },
+    {
+     0x8231,
+     "GL_R8I",
+    },
+    {
+     0x8866,
+     "GL_QUERY_RESULT_EXT",
+    },
+    {
+     0x8233,
+     "GL_R16I",
+    },
+    {
+     0x8DF7,
+     "GL_INT_10_10_10_2_OES",
+    },
+    {
+     0x8235,
+     "GL_R32I",
+    },
+    {
+     0x8234,
+     "GL_R16UI",
+    },
+    {
+     0x8237,
+     "GL_RG8I",
+    },
+    {
+     0x9246,
+     "GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM",
+    },
+    {
+     0x8B69,
+     "GL_FLOAT_MAT4x2_NV",
+    },
+    {
+     0x812D,
+     "GL_CLAMP_TO_BORDER_EXT",
+    },
+    {
+     0x812F,
+     "GL_CLAMP_TO_EDGE",
+    },
+    {
+     0x92A4,
+     "GL_LINEARDODGE_NV",
+    },
+    {
+     0x8DD8,
+     "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT",
+    },
+    {
+     0x8DD9,
+     "GL_GEOMETRY_SHADER_EXT",
+    },
+    {
+     0x86A3,
+     "GL_COMPRESSED_TEXTURE_FORMATS",
+    },
+    {
+     0x8DD4,
+     "GL_UNSIGNED_INT_SAMPLER_CUBE",
+    },
+    {
+     0x9244,
+     "GL_BIND_GENERATES_RESOURCE_CHROMIUM",
+    },
+    {
+     0x8DD2,
+     "GL_UNSIGNED_INT_SAMPLER_2D",
+    },
+    {
+     0x8DD3,
+     "GL_UNSIGNED_INT_SAMPLER_3D",
+    },
+    {
+     0x8DD0,
+     "GL_INT_SAMPLER_BUFFER_EXT",
+    },
+    {
+     0x86A2,
+     "GL_NUM_COMPRESSED_TEXTURE_FORMATS",
+    },
+    {
+     0x0CF3,
+     "GL_UNPACK_SKIP_ROWS_EXT",
+    },
+    {
+     0x0CF2,
+     "GL_UNPACK_ROW_LENGTH_EXT",
+    },
+    {
+     0x140C,
+     "GL_FIXED",
+    },
+    {
+     0x140B,
+     "GL_HALF_FLOAT",
+    },
+    {
+     0x8008,
+     "GL_MAX_EXT",
+    },
+    {
+     0x0CF5,
+     "GL_UNPACK_ALIGNMENT",
+    },
+    {
+     0x8867,
+     "GL_QUERY_RESULT_AVAILABLE_EXT",
+    },
+    {
+     0x8D82,
+     "GL_RGBA32I",
+    },
+    {
+     0x8009,
+     "GL_BLEND_EQUATION",
+    },
+    {
+     0x911F,
+     "GL_BUFFER_ACCESS_FLAGS",
+    },
+    {
+     0x1401,
+     "GL_UNSIGNED_BYTE",
+    },
+    {
+     0x1400,
+     "GL_BYTE",
+    },
+    {
+     0x1403,
+     "GL_UNSIGNED_SHORT",
+    },
+    {
+     0x1402,
+     "GL_SHORT",
+    },
+    {
+     0x1405,
+     "GL_UNSIGNED_INT",
+    },
+    {
+     0x1404,
+     "GL_INT",
+    },
+    {
+     0x1406,
+     "GL_FLOAT",
+    },
+    {
+     0x8C1D,
+     "GL_TEXTURE_BINDING_2D_ARRAY",
+    },
+    {
+     0x8DDF,
+     "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT",
+    },
+    {
+     0x8043,
+     "GL_LUMINANCE4_ALPHA4_OES",
+    },
+    {
+     0x8040,
+     "GL_LUMINANCE8_OES",
+    },
+    {
+     0x8045,
+     "GL_LUMINANCE8_ALPHA8_OES",
+    },
+    {
+     0x8CD1,
+     "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",
+    },
+    {
+     0x00040000,
+     "GL_STENCIL_BUFFER_BIT2_QCOM",
+    },
+    {
+     0x8CD0,
+     "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
+    },
+    {
+     0x823A,
+     "GL_RG16UI",
+    },
+    {
+     0x8CE4,
+     "GL_COLOR_ATTACHMENT4_EXT",
+    },
+    {
+     0x823B,
+     "GL_RG32I",
+    },
+    {
+     0x8CD3,
+     "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
+    },
+    {
+     0x846E,
+     "GL_ALIASED_LINE_WIDTH_RANGE",
+    },
+    {
+     0x0B90,
+     "GL_STENCIL_TEST",
+    },
+    {
+     0x8CD2,
+     "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",
+    },
+    {
+     0x881C,
+     "GL_ALPHA16F_EXT",
+    },
+    {
+     0x928E,
+     "GL_SRC_ATOP_NV",
+    },
+    {
+     0x8CD4,
+     "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES",
+    },
+    {
+     0x9113,
+     "GL_SYNC_CONDITION_APPLE",
+    },
+    {
+     0x8CD7,
+     "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
+    },
+    {
+     0x08000000,
+     "GL_MULTISAMPLE_BUFFER_BIT3_QCOM",
+    },
+    {
+     0x93A4,
+     "GL_PACK_REVERSE_ROW_ORDER_ANGLE",
+    },
+    {
+     0x8038,
+     "GL_POLYGON_OFFSET_FACTOR",
+    },
+    {
+     0x94F9,
+     "GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL",
+    },
+    {
+     0x851A,
+     "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z",
+    },
+    {
+     0x851C,
+     "GL_MAX_CUBE_MAP_TEXTURE_SIZE",
+    },
+    {
+     0x8CD9,
+     "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS",
+    },
+    {
+     0x84CC,
+     "GL_TEXTURE12",
+    },
+    {
+     0x0BA2,
+     "GL_VIEWPORT",
+    },
+    {
+     0x84CA,
+     "GL_TEXTURE10",
+    },
+    {
+     0x0BA7,
+     "GL_PATH_PROJECTION_MATRIX_CHROMIUM",
+    },
+    {
+     0x84CF,
+     "GL_TEXTURE15",
+    },
+    {
+     0x84CE,
+     "GL_TEXTURE14",
+    },
+    {
+     0x84CD,
+     "GL_TEXTURE13",
+    },
+    {
+     0x83F9,
+     "GL_PERFQUERY_DONOT_FLUSH_INTEL",
+    },
+    {
+     0x9115,
+     "GL_SYNC_FLAGS_APPLE",
+    },
+    {
+     0x9286,
+     "GL_SRC_NV",
+    },
+    {
+     0x83F3,
+     "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE",
+    },
+    {
+     0x83F2,
+     "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE",
+    },
+    {
+     0x83F1,
+     "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT",
+    },
+    {
+     0x9114,
+     "GL_SYNC_STATUS_APPLE",
+    },
+    {
+     0x8C0A,
+     "GL_SGX_BINARY_IMG",
+    },
+    {
+     0x93BB,
+     "GL_COMPRESSED_RGBA_ASTC_10x10_KHR",
+    },
+    {
+     0x911C,
+     "GL_CONDITION_SATISFIED_APPLE",
+    },
+    {
+     0x911B,
+     "GL_TIMEOUT_EXPIRED_APPLE",
+    },
+    {
+     0x911A,
+     "GL_ALREADY_SIGNALED_APPLE",
+    },
+    {
+     0x9284,
+     "GL_CONJOINT_NV",
+    },
+    {
+     0x9124,
+     "GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT",
+    },
+    {
+     0x911D,
+     "GL_WAIT_FAILED_APPLE",
+    },
+    {
+     0x929A,
+     "GL_COLORBURN_KHR",
+    },
+    {
+     0x929B,
+     "GL_HARDLIGHT_KHR",
+    },
+    {
+     0x929C,
+     "GL_SOFTLIGHT_KHR",
+    },
+    {
+     0x846D,
+     "GL_ALIASED_POINT_SIZE_RANGE",
+    },
+    {
+     0x929E,
+     "GL_DIFFERENCE_KHR",
+    },
+    {
+     0x929F,
+     "GL_MINUS_NV",
+    },
+    {
+     0x9282,
+     "GL_UNCORRELATED_NV",
+    },
+    {
+     0x9298,
+     "GL_LIGHTEN_KHR",
+    },
+    {
+     0x9299,
+     "GL_COLORDODGE_KHR",
+    },
+    {
+     0x9111,
+     "GL_MAX_SERVER_WAIT_TIMEOUT_APPLE",
+    },
+    {
+     0x93A6,
+     "GL_PROGRAM_BINARY_ANGLE",
+    },
+    {
+     0x9117,
+     "GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE",
+    },
+    {
+     0x93A0,
+     "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE",
+    },
+    {
+     0x93A3,
+     "GL_FRAMEBUFFER_ATTACHMENT_ANGLE",
+    },
+    {
+     0x93A2,
+     "GL_TEXTURE_USAGE_ANGLE",
+    },
+    {
+     0x8802,
+     "GL_STENCIL_BACK_PASS_DEPTH_FAIL",
+    },
+    {
+     0x9119,
+     "GL_SIGNALED_APPLE",
+    },
+    {
+     0x9118,
+     "GL_UNSIGNALED_APPLE",
+    },
+    {
+     0x9294,
+     "GL_MULTIPLY_KHR",
+    },
+    {
+     0x9295,
+     "GL_SCREEN_KHR",
+    },
+    {
+     0x9296,
+     "GL_OVERLAY_KHR",
+    },
+    {
+     0x9297,
+     "GL_DARKEN_KHR",
+    },
+    {
+     0x0020,
+     "GL_MAP_UNSYNCHRONIZED_BIT_EXT",
+    },
+    {
+     0x8E78,
+     "GL_TESS_GEN_VERTEX_ORDER_EXT",
+    },
+    {
+     0x8C01,
+     "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG",
+    },
+    {
+     0x8C00,
+     "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG",
+    },
+    {
+     0x8A52,
+     "GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT",
+    },
+    {
+     0x8C02,
+     "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG",
+    },
+    {
+     0x84C9,
+     "GL_TEXTURE9",
+    },
+    {
+     0x84C8,
+     "GL_TEXTURE8",
+    },
+    {
+     0x8869,
+     "GL_MAX_VERTEX_ATTRIBS",
+    },
+    {
+     0x84C3,
+     "GL_TEXTURE3",
+    },
+    {
+     0x84C2,
+     "GL_TEXTURE2",
+    },
+    {
+     0x84C1,
+     "GL_TEXTURE1",
+    },
+    {
+     0x84C0,
+     "GL_TEXTURE0",
+    },
+    {
+     0x84C7,
+     "GL_TEXTURE7",
+    },
+    {
+     0x84C6,
+     "GL_TEXTURE6",
+    },
+    {
+     0x84C5,
+     "GL_TEXTURE5",
+    },
+    {
+     0x8803,
+     "GL_STENCIL_BACK_PASS_DEPTH_PASS",
+    },
+    {
+     0x928A,
+     "GL_SRC_IN_NV",
+    },
+    {
+     0x8518,
+     "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y",
+    },
+    {
+     0x8519,
+     "GL_TEXTURE_CUBE_MAP_POSITIVE_Z",
+    },
+    {
+     0x8514,
+     "GL_TEXTURE_BINDING_CUBE_MAP",
+    },
+    {
+     0x8515,
+     "GL_TEXTURE_CUBE_MAP_POSITIVE_X",
+    },
+    {
+     0x8516,
+     "GL_TEXTURE_CUBE_MAP_NEGATIVE_X",
+    },
+    {
+     0x8517,
+     "GL_TEXTURE_CUBE_MAP_POSITIVE_Y",
+    },
+    {
+     0x8218,
+     "GL_FRAMEBUFFER_DEFAULT",
+    },
+    {
+     0x8513,
+     "GL_TEXTURE_CUBE_MAP",
+    },
+    {
+     0x8626,
+     "GL_CURRENT_VERTEX_ATTRIB",
+    },
+    {
+     0x92B1,
+     "GL_PLUS_CLAMPED_NV",
+    },
+    {
+     0x92B0,
+     "GL_HSL_LUMINOSITY_KHR",
+    },
+    {
+     0x92B3,
+     "GL_MINUS_CLAMPED_NV",
+    },
+    {
+     0x92B2,
+     "GL_PLUS_CLAMPED_ALPHA_NV",
+    },
+    {
+     0x8765,
+     "GL_BUFFER_USAGE",
+    },
+    {
+     0x8764,
+     "GL_BUFFER_SIZE",
+    },
+    {
+     0x8B99,
+     "GL_PALETTE8_RGB5_A1_OES",
+    },
+    {
+     0x0503,
+     "GL_STACK_OVERFLOW_KHR",
+    },
+    {
+     0x0502,
+     "GL_INVALID_OPERATION",
+    },
+    {
+     0x0501,
+     "GL_INVALID_VALUE",
+    },
+    {
+     0x0500,
+     "GL_INVALID_ENUM",
+    },
+    {
+     0x0507,
+     "GL_CONTEXT_LOST_KHR",
+    },
+    {
+     0x0506,
+     "GL_INVALID_FRAMEBUFFER_OPERATION",
+    },
+    {
+     0x0505,
+     "GL_OUT_OF_MEMORY",
+    },
+    {
+     0x0504,
+     "GL_STACK_UNDERFLOW_KHR",
+    },
+    {
+     0x0CF4,
+     "GL_UNPACK_SKIP_PIXELS_EXT",
+    },
+    {
+     0x0B44,
+     "GL_CULL_FACE",
+    },
+    {
+     0x8B5E,
+     "GL_SAMPLER_2D",
+    },
+    {
+     0x0B46,
+     "GL_FRONT_FACE",
+    },
+    {
+     0x8FB3,
+     "GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM",
+    },
+    {
+     0x824A,
+     "GL_DEBUG_SOURCE_APPLICATION_KHR",
+    },
+    {
+     0x824B,
+     "GL_DEBUG_SOURCE_OTHER_KHR",
+    },
+    {
+     0x824C,
+     "GL_DEBUG_TYPE_ERROR_KHR",
+    },
+    {
+     0x824D,
+     "GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR",
+    },
+    {
+     0x824E,
+     "GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR",
+    },
+    {
+     0x824F,
+     "GL_DEBUG_TYPE_PORTABILITY_KHR",
+    },
+    {
+     0x8DD7,
+     "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY",
+    },
+    {
+     0x8B31,
+     "GL_VERTEX_SHADER",
+    },
+    {
+     0x8B30,
+     "GL_FRAGMENT_SHADER",
+    },
+    {
+     0x8FB1,
+     "GL_CPU_OPTIMIZED_QCOM",
+    },
+    {
+     0x93D2,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR",
+    },
+    {
+     0x82FB,
+     "GL_CONTEXT_RELEASE_BEHAVIOR_KHR",
+    },
+    {
+     0x8B5A,
+     "GL_FLOAT_MAT2",
+    },
+    {
+     0x84D8,
+     "GL_TEXTURE24",
+    },
+    {
+     0x84D9,
+     "GL_TEXTURE25",
+    },
+    {
+     0x84D6,
+     "GL_TEXTURE22",
+    },
+    {
+     0x84D7,
+     "GL_TEXTURE23",
+    },
+    {
+     0x84D4,
+     "GL_TEXTURE20",
+    },
+    {
+     0x0D05,
+     "GL_PACK_ALIGNMENT",
+    },
+    {
+     0x84D2,
+     "GL_TEXTURE18",
+    },
+    {
+     0x84D3,
+     "GL_TEXTURE19",
+    },
+    {
+     0x84D0,
+     "GL_TEXTURE16",
+    },
+    {
+     0x84D1,
+     "GL_TEXTURE17",
+    },
+    {
+     0x93D1,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR",
+    },
+    {
+     0x84DF,
+     "GL_TEXTURE31",
+    },
+    {
+     0x8B97,
+     "GL_PALETTE8_R5_G6_B5_OES",
+    },
+    {
+     0x84DD,
+     "GL_TEXTURE29",
+    },
+    {
+     0x84DE,
+     "GL_TEXTURE30",
+    },
+    {
+     0x84DB,
+     "GL_TEXTURE27",
+    },
+    {
+     0x84DC,
+     "GL_TEXTURE28",
+    },
+    {
+     0x6002,
+     "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM",
+    },
+    {
+     0x84DA,
+     "GL_TEXTURE26",
+    },
+    {
+     0x8242,
+     "GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR",
+    },
+    {
+     0x8243,
+     "GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR",
+    },
+    {
+     0x8244,
+     "GL_DEBUG_CALLBACK_FUNCTION_KHR",
+    },
+    {
+     0x8245,
+     "GL_DEBUG_CALLBACK_USER_PARAM_KHR",
+    },
+    {
+     0x8246,
+     "GL_DEBUG_SOURCE_API_KHR",
+    },
+    {
+     0x8247,
+     "GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR",
+    },
+    {
+     0x8248,
+     "GL_DEBUG_SOURCE_SHADER_COMPILER_KHR",
+    },
+    {
+     0x8249,
+     "GL_DEBUG_SOURCE_THIRD_PARTY_KHR",
+    },
+    {
+     0x88ED,
+     "GL_PIXEL_PACK_BUFFER_BINDING",
+    },
+    {
+     0x8B94,
+     "GL_PALETTE4_RGB5_A1_OES",
+    },
+    {
+     0x94F4,
+     "GL_PERFQUERY_COUNTER_RAW_INTEL",
+    },
+    {
+     0x823C,
+     "GL_RG32UI",
+    },
+    {
+     0x8A29,
+     "GL_UNIFORM_BUFFER_START",
+    },
+    {
+     0x8A28,
+     "GL_UNIFORM_BUFFER_BINDING",
+    },
+    {
+     0x92BE,
+     "GL_PRIMITIVE_BOUNDING_BOX_EXT",
+    },
+    {
+     0x8645,
+     "GL_VERTEX_ATTRIB_ARRAY_POINTER",
+    },
+    {
+     0x8865,
+     "GL_CURRENT_QUERY_EXT",
+    },
+    {
+     0x8E5B,
+     "GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES",
+    },
+    {
+     0x8E5C,
+     "GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES",
+    },
+    {
+     0x8E5D,
+     "GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES",
+    },
+    {
+     0x906A,
+     "GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT",
+    },
+    {
+     0x906F,
+     "GL_RGB10_A2UI",
+    },
+    {
+     0x8E72,
+     "GL_PATCH_VERTICES_EXT",
+    },
+    {
+     0x8BD3,
+     "GL_TEXTURE_HEIGHT_QCOM",
+    },
+    {
+     0x87FA,
+     "GL_3DC_XY_AMD",
+    },
+    {
+     0x84C4,
+     "GL_TEXTURE4",
+    },
+    {
+     0x821C,
+     "GL_MINOR_VERSION",
+    },
+    {
+     0x8E8A,
+     "GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT",
+    },
+    {
+     0x85B5,
+     "GL_VERTEX_ARRAY_BINDING_OES",
+    },
+    {
+     0x8253,
+     "GL_GUILTY_CONTEXT_RESET_KHR",
+    },
+    {
+     0x8D6B,
+     "GL_MAX_ELEMENT_INDEX",
+    },
+    {
+     0x8D6C,
+     "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT",
+    },
+    {
+     0x92A1,
+     "GL_CONTRAST_NV",
+    },
+    {
+     0x8252,
+     "GL_LOSE_CONTEXT_ON_RESET_KHR",
+    },
+    {
+     0x8C4C,
+     "GL_COMPRESSED_SRGB_S3TC_DXT1_NV",
+    },
+    {
+     0x8C4E,
+     "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV",
+    },
+    {
+     0x8251,
+     "GL_DEBUG_TYPE_OTHER_KHR",
+    },
+    {
+     0x8C4F,
+     "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV",
+    },
+    {
+     0x9309,
+     "GL_REFERENCED_BY_GEOMETRY_SHADER_EXT",
+    },
+    {
+     0x93E9,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES",
+    },
+    {
+     0x93E8,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES",
+    },
+    {
+     0x8C43,
+     "GL_SRGB8_ALPHA8_EXT",
+    },
+    {
+     0x8C42,
+     "GL_SRGB_ALPHA_EXT",
+    },
+    {
+     0x8C45,
+     "GL_SLUMINANCE8_ALPHA8_NV",
+    },
+    {
+     0x8C44,
+     "GL_SLUMINANCE_ALPHA_NV",
+    },
+    {
+     0x8C47,
+     "GL_SLUMINANCE8_NV",
+    },
+    {
+     0x8C46,
+     "GL_SLUMINANCE_NV",
+    },
+    {
+     0x93E1,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES",
+    },
+    {
+     0x93E0,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES",
+    },
+    {
+     0x93E3,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES",
+    },
+    {
+     0x93E2,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES",
+    },
+    {
+     0x93E5,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES",
+    },
+    {
+     0x93E4,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES",
+    },
+    {
+     0x93E7,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES",
+    },
+    {
+     0x93E6,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES",
+    },
+    {
+     0x8D68,
+     "GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES",
+    },
+    {
+     0x8E82,
+     "GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT",
+    },
+    {
+     0x8E81,
+     "GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT",
+    },
+    {
+     0x85BB,
+     "GL_UNSIGNED_SHORT_8_8_REV_APPLE",
+    },
+    {
+     0x8E87,
+     "GL_TESS_EVALUATION_SHADER_EXT",
+    },
+    {
+     0x8E86,
+     "GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT",
+    },
+    {
+     0x8E85,
+     "GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT",
+    },
+    {
+     0x8E84,
+     "GL_MAX_TESS_PATCH_COMPONENTS_EXT",
+    },
+    {
+     0x8D61,
+     "GL_HALF_FLOAT_OES",
+    },
+    {
+     0x8D62,
+     "GL_RGB565",
+    },
+    {
+     0x8E88,
+     "GL_TESS_CONTROL_SHADER_EXT",
+    },
+    {
+     0x8D64,
+     "GL_ETC1_RGB8_OES",
+    },
+    {
+     0x8D65,
+     "GL_TEXTURE_EXTERNAL_OES",
+    },
+    {
+     0x8D66,
+     "GL_SAMPLER_EXTERNAL_OES",
+    },
+    {
+     0x8D67,
+     "GL_TEXTURE_BINDING_EXTERNAL_OES",
+    },
+    {
+     0x10000000,
+     "GL_MULTISAMPLE_BUFFER_BIT4_QCOM",
+    },
+    {
+     0x04000000,
+     "GL_MULTISAMPLE_BUFFER_BIT2_QCOM",
+    },
+    {
+     0x90D7,
+     "GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT",
+    },
+    {
+     0x90D9,
+     "GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT",
+    },
+    {
+     0x90D8,
+     "GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT",
+    },
+    {
+     0x8CEE,
+     "GL_COLOR_ATTACHMENT14_EXT",
+    },
+    {
+     0x8DC7,
+     "GL_UNSIGNED_INT_VEC3",
+    },
+    {
+     0x1701,
+     "GL_PATH_PROJECTION_CHROMIUM",
+    },
+    {
+     0x2800,
+     "GL_TEXTURE_MAG_FILTER",
+    },
+    {
+     0x2801,
+     "GL_TEXTURE_MIN_FILTER",
+    },
+    {
+     0x2802,
+     "GL_TEXTURE_WRAP_S",
+    },
+    {
+     0x2803,
+     "GL_TEXTURE_WRAP_T",
+    },
+    {
+     0x8DCB,
+     "GL_INT_SAMPLER_3D",
+    },
+    {
+     0x3007,
+     "GL_CLIP_DISTANCE7_APPLE",
+    },
+    {
+     0x2703,
+     "GL_LINEAR_MIPMAP_LINEAR",
+    },
+    {
+     0x3005,
+     "GL_CLIP_DISTANCE5_APPLE",
+    },
+    {
+     0x3004,
+     "GL_CLIP_DISTANCE4_APPLE",
+    },
+    {
+     0x8B98,
+     "GL_PALETTE8_RGBA4_OES",
+    },
+    {
+     0x3002,
+     "GL_CLIP_DISTANCE2_APPLE",
+    },
+    {
+     0x3001,
+     "GL_CLIP_DISTANCE1_APPLE",
+    },
+    {
+     0x2702,
+     "GL_NEAREST_MIPMAP_LINEAR",
+    },
+    {
+     0x1F03,
+     "GL_EXTENSIONS",
+    },
+    {
+     0x1F02,
+     "GL_VERSION",
+    },
+    {
+     0x1F01,
+     "GL_RENDERER",
+    },
+    {
+     0x1F00,
+     "GL_VENDOR",
+    },
+    {
+     0x9247,
+     "GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM",
+    },
+    {
+     0x2701,
+     "GL_LINEAR_MIPMAP_NEAREST",
+    },
+    {
+     0x9245,
+     "GL_OVERLAY_TRANSFORM_NONE_CHROMIUM",
+    },
+    {
+     0x92B4,
+     "GL_INVERT_OVG_NV",
+    },
+    {
+     0x9249,
+     "GL_OVERLAY_TRANSFORM_ROTATE_180_CHROMIUM",
+    },
+    {
+     0x0B94,
+     "GL_STENCIL_FAIL",
+    },
+    {
+     0x8B4A,
+     "GL_MAX_VERTEX_UNIFORM_COMPONENTS",
+    },
+    {
+     0x8B4B,
+     "GL_MAX_VARYING_COMPONENTS",
+    },
+    {
+     0x8B4C,
+     "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS",
+    },
+    {
+     0x8B4D,
+     "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS",
+    },
+    {
+     0x8B4F,
+     "GL_SHADER_TYPE",
+    },
+    {
+     0x9122,
+     "GL_MAX_VERTEX_OUTPUT_COMPONENTS",
+    },
+    {
+     0x9123,
+     "GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT",
+    },
+    {
+     0x83FB,
+     "GL_PERFQUERY_WAIT_INTEL",
+    },
+    {
+     0x9121,
+     "GL_BUFFER_MAP_OFFSET",
+    },
+    {
+     0x00004000,
+     "GL_COLOR_BUFFER_BIT",
+    },
+    {
+     0x9125,
+     "GL_MAX_FRAGMENT_INPUT_COMPONENTS",
+    },
+    {
+     0x00000010,
+     "GL_TESS_EVALUATION_SHADER_BIT_EXT",
+    },
+    {
+     0x8834,
+     "GL_DRAW_BUFFER15_EXT",
+    },
+    {
+     0x8833,
+     "GL_DRAW_BUFFER14_EXT",
+    },
+    {
+     0x8832,
+     "GL_DRAW_BUFFER13_EXT",
+    },
+    {
+     0x8831,
+     "GL_DRAW_BUFFER12_EXT",
+    },
+    {
+     0x8830,
+     "GL_DRAW_BUFFER11_EXT",
+    },
+    {
+     0x8DC5,
+     "GL_SAMPLER_CUBE_SHADOW_NV",
+    },
+    {
+     0x94FF,
+     "GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL",
+    },
+    {
+     0x94FE,
+     "GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL",
+    },
+    {
+     0x94FD,
+     "GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL",
+    },
+    {
+     0x94FC,
+     "GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL",
+    },
+    {
+     0x94FB,
+     "GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL",
+    },
+    {
+     0x93B8,
+     "GL_COMPRESSED_RGBA_ASTC_10x5_KHR",
+    },
+    {
+     0x8B65,
+     "GL_FLOAT_MAT2x3_NV",
+    },
+    {
+     0x9241,
+     "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM",
+    },
+    {
+     0x00010000,
+     "GL_STENCIL_BUFFER_BIT0_QCOM",
+    },
+    {
+     0x83FA,
+     "GL_PERFQUERY_FLUSH_INTEL",
+    },
+    {
+     0x0D03,
+     "GL_PACK_SKIP_ROWS",
+    },
+    {
+     0x84F3,
+     "GL_FENCE_STATUS_NV",
+    },
+    {
+     0x88E6,
+     "GL_STATIC_COPY",
+    },
+    {
+     0x0B93,
+     "GL_STENCIL_VALUE_MASK",
+    },
+    {
+     0x0B92,
+     "GL_STENCIL_FUNC",
+    },
+    {
+     0x0B91,
+     "GL_STENCIL_CLEAR_VALUE",
+    },
+    {
+     0x883D,
+     "GL_BLEND_EQUATION_ALPHA",
+    },
+    {
+     0x0B97,
+     "GL_STENCIL_REF",
+    },
+    {
+     0x0B96,
+     "GL_STENCIL_PASS_DEPTH_PASS",
+    },
+    {
+     0x0B95,
+     "GL_STENCIL_PASS_DEPTH_FAIL",
+    },
+    {
+     0x2700,
+     "GL_NEAREST_MIPMAP_NEAREST",
+    },
+    {
+     0x94F5,
+     "GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL",
+    },
+    {
+     0x0B98,
+     "GL_STENCIL_WRITEMASK",
+    },
+    {
+     0x94F3,
+     "GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL",
+    },
+    {
+     0x94F2,
+     "GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL",
+    },
+    {
+     0x94F1,
+     "GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL",
+    },
+    {
+     0x94F0,
+     "GL_PERFQUERY_COUNTER_EVENT_INTEL",
+    },
+    {
+     0x8B40,
+     "GL_PROGRAM_OBJECT_EXT",
+    },
+    {
+     0x1004,
+     "GL_TEXTURE_BORDER_COLOR_EXT",
+    },
+    {
+     0x8A2D,
+     "GL_MAX_FRAGMENT_UNIFORM_BLOCKS",
+    },
+    {
+     0x8B48,
+     "GL_SHADER_OBJECT_EXT",
+    },
+    {
+     0x8B49,
+     "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS",
+    },
+    {
+     0x813A,
+     "GL_TEXTURE_MIN_LOD",
+    },
+    {
+     0x8DE1,
+     "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT",
+    },
+    {
+     0x8DE0,
+     "GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT",
+    },
+    {
+     0x924C,
+     "GL_MOUSE_POSITION_CHROMIUM",
+    },
+    {
+     0x924B,
+     "GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM",
+    },
+    {
+     0x924A,
+     "GL_OVERLAY_TRANSFORM_ROTATE_270_CHROMIUM",
+    },
+    {
+     0x8A2F,
+     "GL_MAX_UNIFORM_BUFFER_BINDINGS",
+    },
+    {
+     0x20000000,
+     "GL_MULTISAMPLE_BUFFER_BIT5_QCOM",
+    },
+    {
+     64,
+     "GL_MAILBOX_SIZE_CHROMIUM",
+    },
+    {
+     0x0DE1,
+     "GL_TEXTURE_2D",
+    },
+    {
+     0x8A2C,
+     "GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT",
+    },
+    {
+     0x80C9,
+     "GL_BLEND_SRC_RGB",
+    },
+    {
+     0x80C8,
+     "GL_BLEND_DST_RGB",
+    },
+    {
+     0x912F,
+     "GL_TEXTURE_IMMUTABLE_FORMAT_EXT",
+    },
+    {
+     0x8A2B,
+     "GL_MAX_VERTEX_UNIFORM_BLOCKS",
+    },
+    {
+     0x88EC,
+     "GL_PIXEL_UNPACK_BUFFER",
+    },
+    {
+     0x8D8F,
+     "GL_RGB8I",
+    },
+    {
+     0x8059,
+     "GL_RGB10_A2_EXT",
+    },
+    {
+     0x8058,
+     "GL_RGBA8_OES",
+    },
+    {
+     0x8B93,
+     "GL_PALETTE4_RGBA4_OES",
+    },
+    {
+     0x88EB,
+     "GL_PIXEL_PACK_BUFFER",
+    },
+    {
+     0x8E83,
+     "GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT",
+    },
+    {
+     0x8051,
+     "GL_RGB8_OES",
+    },
+    {
+     0x8CAD,
+     "GL_DEPTH32F_STENCIL8",
+    },
+    {
+     0x8052,
+     "GL_RGB10_EXT",
+    },
+    {
+     0x8CAB,
+     "GL_RENDERBUFFER_SAMPLES_ANGLE",
+    },
+    {
+     0x8CAC,
+     "GL_DEPTH_COMPONENT32F",
+    },
+    {
+     0x8057,
+     "GL_RGB5_A1",
+    },
+    {
+     0x8056,
+     "GL_RGBA4",
+    },
+    {
+     0x8232,
+     "GL_R8UI",
+    },
+    {
+     0x150A,
+     "GL_INVERT",
+    },
+    {
+     0x01000000,
+     "GL_MULTISAMPLE_BUFFER_BIT0_QCOM",
+    },
+    {
+     0x78ED,
+     "GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM",
+    },
+    {
+     0x78EE,
+     "GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM",
+    },
+    {
+     0x6001,
+     "GL_TEXTURE_POOL_MANAGED_CHROMIUM",
+    },
+    {
+     0x0B45,
+     "GL_CULL_FACE_MODE",
+    },
+    {
+     0x8B92,
+     "GL_PALETTE4_R5_G6_B5_OES",
+    },
+    {
+     0x00100000,
+     "GL_STENCIL_BUFFER_BIT4_QCOM",
+    },
+    {
+     0x8E4E,
+     "GL_LAST_VERTEX_CONVENTION_EXT",
+    },
+    {
+     0x8E4D,
+     "GL_FIRST_VERTEX_CONVENTION_EXT",
+    },
+    {
+     0x8E24,
+     "GL_TRANSFORM_FEEDBACK_ACTIVE",
+    },
+    {
+     0x8E45,
+     "GL_TEXTURE_SWIZZLE_A",
+    },
+    {
+     0x8E44,
+     "GL_TEXTURE_SWIZZLE_B",
+    },
+    {
+     0x8E43,
+     "GL_TEXTURE_SWIZZLE_G",
+    },
+    {
+     0x8E42,
+     "GL_TEXTURE_SWIZZLE_R",
+    },
+    {
+     0x8D20,
+     "GL_STENCIL_ATTACHMENT",
+    },
+    {
+     0x8B91,
+     "GL_PALETTE4_RGBA8_OES",
+    },
+    {
+     0x00000200,
+     "GL_DEPTH_BUFFER_BIT1_QCOM",
+    },
+    {
+     0x00008000,
+     "GL_COVERAGE_BUFFER_BIT_NV",
+    },
+    {
+     0x1506,
+     "GL_XOR_NV",
+    },
+    {
+     0x8CA8,
+     "GL_READ_FRAMEBUFFER_ANGLE",
+    },
+    {
+     0x8CA9,
+     "GL_DRAW_FRAMEBUFFER_ANGLE",
+    },
+    {
+     0x8CA6,
+     "GL_FRAMEBUFFER_BINDING",
+    },
+    {
+     0x8CA7,
+     "GL_RENDERBUFFER_BINDING",
+    },
+    {
+     0x8CA4,
+     "GL_STENCIL_BACK_VALUE_MASK",
+    },
+    {
+     0x8CA5,
+     "GL_STENCIL_BACK_WRITEMASK",
+    },
+    {
+     0x8B90,
+     "GL_PALETTE4_RGB8_OES",
+    },
+    {
+     0x8CA3,
+     "GL_STENCIL_BACK_REF",
+    },
+    {
+     0x80E8,
+     "GL_MAX_ELEMENTS_VERTICES",
+    },
+    {
+     0x80CB,
+     "GL_BLEND_SRC_ALPHA",
+    },
+    {
+     0x80CA,
+     "GL_BLEND_DST_ALPHA",
+    },
+    {
+     0x8CE7,
+     "GL_COLOR_ATTACHMENT7_EXT",
+    },
+    {
+     0x93B0,
+     "GL_COMPRESSED_RGBA_ASTC_4x4_KHR",
+    },
+    {
+     0x93B1,
+     "GL_COMPRESSED_RGBA_ASTC_5x4_KHR",
+    },
+    {
+     0x93B2,
+     "GL_COMPRESSED_RGBA_ASTC_5x5_KHR",
+    },
+    {
+     0x93B3,
+     "GL_COMPRESSED_RGBA_ASTC_6x5_KHR",
+    },
+    {
+     0x93B4,
+     "GL_COMPRESSED_RGBA_ASTC_6x6_KHR",
+    },
+    {
+     0x93B5,
+     "GL_COMPRESSED_RGBA_ASTC_8x5_KHR",
+    },
+    {
+     0x93B6,
+     "GL_COMPRESSED_RGBA_ASTC_8x6_KHR",
+    },
+    {
+     0x93B7,
+     "GL_COMPRESSED_RGBA_ASTC_8x8_KHR",
+    },
+    {
+     0x8CD6,
+     "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT",
+    },
+    {
+     0x93B9,
+     "GL_COMPRESSED_RGBA_ASTC_10x6_KHR",
+    },
+    {
+     0x80E9,
+     "GL_MAX_ELEMENTS_INDICES",
+    },
+    {
+     0x8CE5,
+     "GL_COLOR_ATTACHMENT5_EXT",
+    },
+    {
+     0x8C84,
+     "GL_TRANSFORM_FEEDBACK_BUFFER_START",
+    },
+    {
+     0x8DC2,
+     "GL_SAMPLER_BUFFER_EXT",
+    },
+    {
+     0x8C36,
+     "GL_SAMPLE_SHADING_OES",
+    },
+    {
+     0x8C37,
+     "GL_MIN_SAMPLE_SHADING_VALUE_OES",
+    },
+    {
+     0x8F97,
+     "GL_RGBA8_SNORM",
+    },
+    {
+     0x8CE9,
+     "GL_COLOR_ATTACHMENT9_EXT",
+    },
+    {
+     0x8DAD,
+     "GL_FLOAT_32_UNSIGNED_INT_24_8_REV",
+    },
+    {
+     0x8B96,
+     "GL_PALETTE8_RGBA8_OES",
+    },
+    {
+     0x8872,
+     "GL_MAX_TEXTURE_IMAGE_UNITS",
+    },
+    {
+     0x8DC6,
+     "GL_UNSIGNED_INT_VEC2",
+    },
+    {
+     0x8905,
+     "GL_MAX_PROGRAM_TEXEL_OFFSET",
+    },
+    {
+     0x8508,
+     "GL_DECR_WRAP",
+    },
+    {
+     0x92AD,
+     "GL_HSL_HUE_KHR",
+    },
+    {
+     0x92AE,
+     "GL_HSL_SATURATION_KHR",
+    },
+    {
+     0x92AF,
+     "GL_HSL_COLOR_KHR",
+    },
+    {
+     0x8BD4,
+     "GL_TEXTURE_DEPTH_QCOM",
+    },
+    {
+     0x8DC4,
+     "GL_SAMPLER_2D_ARRAY_SHADOW_NV",
+    },
+    {
+     0x8507,
+     "GL_INCR_WRAP",
+    },
+    {
+     0x82FC,
+     "GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR",
+    },
+    {
+     0x8895,
+     "GL_ELEMENT_ARRAY_BUFFER_BINDING",
+    },
+    {
+     0x8894,
+     "GL_ARRAY_BUFFER_BINDING",
+    },
+    {
+     0x92A3,
+     "GL_INVERT_RGB_NV",
+    },
+    {
+     0x905F,
+     "GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT",
+    },
+    {
+     0x92A5,
+     "GL_LINEARBURN_NV",
+    },
+    {
+     0x8893,
+     "GL_ELEMENT_ARRAY_BUFFER",
+    },
+    {
+     0x8892,
+     "GL_ARRAY_BUFFER",
+    },
+    {
+     0x92A8,
+     "GL_PINLIGHT_NV",
+    },
+    {
+     0x92A9,
+     "GL_HARDMIX_NV",
+    },
+    {
+     0x9112,
+     "GL_OBJECT_TYPE_APPLE",
+    },
+    {
+     0x90CC,
+     "GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT",
+    },
+    {
+     0x90CD,
+     "GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT",
+    },
+    {
+     0x919F,
+     "GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT",
+    },
+    {
+     0x919E,
+     "GL_TEXTURE_BUFFER_SIZE_EXT",
+    },
+    {
+     0x919D,
+     "GL_TEXTURE_BUFFER_OFFSET_EXT",
+    },
+    {
+     0x8BD8,
+     "GL_TEXTURE_IMAGE_VALID_QCOM",
+    },
+    {
+     0x9278,
+     "GL_COMPRESSED_RGBA8_ETC2_EAC",
+    },
+    {
+     0x9279,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",
+    },
+    {
+     0x8DA7,
+     "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT",
+    },
+    {
+     0x9272,
+     "GL_COMPRESSED_RG11_EAC",
+    },
+    {
+     0x8DA8,
+     "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT",
+    },
+    {
+     0x9270,
+     "GL_COMPRESSED_R11_EAC",
+    },
+    {
+     0x9271,
+     "GL_COMPRESSED_SIGNED_R11_EAC",
+    },
+    {
+     0x9276,
+     "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",
+    },
+    {
+     0x887F,
+     "GL_GEOMETRY_SHADER_INVOCATIONS_EXT",
+    },
+    {
+     0x8A3B,
+     "GL_UNIFORM_OFFSET",
+    },
+    {
+     0x9275,
+     "GL_COMPRESSED_SRGB8_ETC2",
+    },
+    {
+     0x84D5,
+     "GL_TEXTURE21",
+    },
+    {
+     0x8C3A,
+     "GL_R11F_G11F_B10F_APPLE",
+    },
+    {
+     0x8C3B,
+     "GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE",
+    },
+    {
+     0x8C3D,
+     "GL_RGB9_E5_APPLE",
+    },
+    {
+     0x8C3E,
+     "GL_UNSIGNED_INT_5_9_9_9_REV_APPLE",
+    },
+    {
+     0x9287,
+     "GL_DST_NV",
+    },
+    {
+     0x93BA,
+     "GL_COMPRESSED_RGBA_ASTC_10x8_KHR",
+    },
+    {
+     0x9285,
+     "GL_BLEND_ADVANCED_COHERENT_KHR",
+    },
+    {
+     0x93BC,
+     "GL_COMPRESSED_RGBA_ASTC_12x10_KHR",
+    },
+    {
+     0x93BD,
+     "GL_COMPRESSED_RGBA_ASTC_12x12_KHR",
+    },
+    {
+     0x84E8,
+     "GL_MAX_RENDERBUFFER_SIZE",
+    },
+    {
+     0x9281,
+     "GL_BLEND_OVERLAP_NV",
+    },
+    {
+     0x9280,
+     "GL_BLEND_PREMULTIPLIED_SRC_NV",
+    },
+    {
+     0x00002000,
+     "GL_DEPTH_BUFFER_BIT5_QCOM",
+    },
+    {
+     0x8370,
+     "GL_MIRRORED_REPEAT",
+    },
+    {
+     0x84E0,
+     "GL_ACTIVE_TEXTURE",
+    },
+    {
+     0x8800,
+     "GL_STENCIL_BACK_FUNC",
+    },
+    {
+     0x8801,
+     "GL_STENCIL_BACK_FAIL",
+    },
+    {
+     0x0D33,
+     "GL_MAX_TEXTURE_SIZE",
+    },
+    {
+     0x0D32,
+     "GL_MAX_CLIP_DISTANCES_APPLE",
+    },
+    {
+     0x8624,
+     "GL_VERTEX_ATTRIB_ARRAY_STRIDE",
+    },
+    {
+     0x8625,
+     "GL_VERTEX_ATTRIB_ARRAY_TYPE",
+    },
+    {
+     0x8622,
+     "GL_VERTEX_ATTRIB_ARRAY_ENABLED",
+    },
+    {
+     0x8623,
+     "GL_VERTEX_ATTRIB_ARRAY_SIZE",
+    },
+    {
+     0x8DB9,
+     "GL_FRAMEBUFFER_SRGB_EXT",
+    },
+    {
+     0x9307,
+     "GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT",
+    },
+    {
+     0x8259,
+     "GL_ACTIVE_PROGRAM_EXT",
+    },
+    {
+     0x8258,
+     "GL_PROGRAM_SEPARABLE_EXT",
+    },
+    {
+     0x8257,
+     "GL_PROGRAM_BINARY_RETRIEVABLE_HINT",
+    },
+    {
+     0x8256,
+     "GL_RESET_NOTIFICATION_STRATEGY_KHR",
+    },
+    {
+     0x8255,
+     "GL_UNKNOWN_CONTEXT_RESET_KHR",
+    },
+    {
+     0x8254,
+     "GL_INNOCENT_CONTEXT_RESET_KHR",
+    },
+    {
+     0x1100,
+     "GL_DONT_CARE",
+    },
+    {
+     0x1101,
+     "GL_FASTEST",
+    },
+    {
+     0x1102,
+     "GL_NICEST",
+    },
+    {
+     0x8250,
+     "GL_DEBUG_TYPE_PERFORMANCE_KHR",
+    },
+    {
+     0x8CEB,
+     "GL_COLOR_ATTACHMENT11_EXT",
+    },
+    {
+     0x8CEC,
+     "GL_COLOR_ATTACHMENT12_EXT",
+    },
+    {
+     0x0408,
+     "GL_FRONT_AND_BACK",
+    },
+    {
+     0x8CEA,
+     "GL_COLOR_ATTACHMENT10_EXT",
+    },
+    {
+     0x8CEF,
+     "GL_COLOR_ATTACHMENT15_EXT",
+    },
+    {
+     0x8CED,
+     "GL_COLOR_ATTACHMENT13_EXT",
+    },
+    {
+     0x8829,
+     "GL_DRAW_BUFFER4_EXT",
+    },
+    {
+     0x0404,
+     "GL_FRONT",
+    },
+    {
+     0x0405,
+     "GL_BACK",
+    },
+    {
+     0x88E1,
+     "GL_STREAM_READ",
+    },
+    {
+     0x88E0,
+     "GL_STREAM_DRAW",
+    },
+    {
+     0x88E2,
+     "GL_STREAM_COPY",
+    },
+    {
+     0x88E5,
+     "GL_STATIC_READ",
+    },
+    {
+     0x88E4,
+     "GL_STATIC_DRAW",
+    },
+    {
+     0x93C6,
+     "GL_COMPRESSED_RGBA_ASTC_5x5x5_OES",
+    },
+    {
+     0x88E9,
+     "GL_DYNAMIC_READ",
+    },
+    {
+     0x88E8,
+     "GL_DYNAMIC_DRAW",
+    },
+    {
+     0x9291,
+     "GL_PLUS_NV",
+    },
+    {
+     0x8CAA,
+     "GL_READ_FRAMEBUFFER_BINDING_ANGLE",
+    },
+    {
+     0x93C5,
+     "GL_COMPRESSED_RGBA_ASTC_5x5x4_OES",
+    },
+    {
+     0x40000000,
+     "GL_MULTISAMPLE_BUFFER_BIT6_QCOM",
+    },
+    {
+     0x88EA,
+     "GL_DYNAMIC_COPY",
+    },
+    {
+     0x9116,
+     "GL_SYNC_FENCE_APPLE",
+    },
+    {
+     0x93C4,
+     "GL_COMPRESSED_RGBA_ASTC_5x4x4_OES",
+    },
+    {
+     0x88EE,
+     "GL_ETC1_SRGB8_NV",
+    },
+    {
+     0x78EC,
+     "GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM",
+    },
+    {
+     0x88EF,
+     "GL_PIXEL_UNPACK_BUFFER_BINDING",
+    },
+    {
+     0x93C3,
+     "GL_COMPRESSED_RGBA_ASTC_4x4x4_OES",
+    },
+    {
+     0x00000800,
+     "GL_DEPTH_BUFFER_BIT3_QCOM",
+    },
+    {
+     0x1903,
+     "GL_RED_EXT",
+    },
+    {
+     0x93C2,
+     "GL_COMPRESSED_RGBA_ASTC_4x4x3_OES",
+    },
+    {
+     0x8CE2,
+     "GL_COLOR_ATTACHMENT2_EXT",
+    },
+    {
+     0x8BC1,
+     "GL_COUNTER_RANGE_AMD",
+    },
+    {
+     0x8CE0,
+     "GL_COLOR_ATTACHMENT0",
+    },
+    {
+     0x8CE1,
+     "GL_COLOR_ATTACHMENT1_EXT",
+    },
+    {
+     0x8CE6,
+     "GL_COLOR_ATTACHMENT6_EXT",
+    },
+    {
+     0x93C1,
+     "GL_COMPRESSED_RGBA_ASTC_4x3x3_OES",
+    },
+    {
+     0x8A1F,
+     "GL_RGB_422_APPLE",
+    },
+    {
+     0x93DC,
+     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR",
+    },
+    {
+     0x9292,
+     "GL_PLUS_DARKER_NV",
+    },
+    {
+     0x8CE8,
+     "GL_COLOR_ATTACHMENT8_EXT",
+    },
+    {
+     0x93C0,
+     "GL_COMPRESSED_RGBA_ASTC_3x3x3_OES",
+    },
+    {
+     0x0C23,
+     "GL_COLOR_WRITEMASK",
+    },
+    {
+     0x0C22,
+     "GL_COLOR_CLEAR_VALUE",
+    },
+    {
+     0x8A11,
+     "GL_UNIFORM_BUFFER",
+    },
+    {
+     0x8823,
+     "GL_WRITEONLY_RENDERING_QCOM",
+    },
+    {
+     0x8824,
+     "GL_MAX_DRAW_BUFFERS_EXT",
+    },
+    {
+     0x825E,
+     "GL_LAYER_PROVOKING_VERTEX_EXT",
+    },
+    {
+     0x825A,
+     "GL_PROGRAM_PIPELINE_BINDING_EXT",
+    },
+    {
+     0x1909,
+     "GL_LUMINANCE",
+    },
+    {
+     0x0D3A,
+     "GL_MAX_VIEWPORT_DIMS",
+    },
+    {
+     0x8B53,
+     "GL_INT_VEC2",
+    },
+    {
+     0x8826,
+     "GL_DRAW_BUFFER1_EXT",
+    },
+    {
+     0x809E,
+     "GL_SAMPLE_ALPHA_TO_COVERAGE",
+    },
+    {
+     0x8BC0,
+     "GL_COUNTER_TYPE_AMD",
+    },
+    {
+     0x8BC3,
+     "GL_PERCENTAGE_AMD",
+    },
+    {
+     0x8BC2,
+     "GL_UNSIGNED_INT64_AMD",
+    },
+    {
+     0x8BC5,
+     "GL_PERFMON_RESULT_SIZE_AMD",
+    },
+    {
+     0x8BC4,
+     "GL_PERFMON_RESULT_AVAILABLE_AMD",
+    },
+    {
+     0x8BC6,
+     "GL_PERFMON_RESULT_AMD",
+    },
+};
+
+const GLEnums::EnumToString* const GLEnums::enum_to_string_table_ =
+    enum_to_string_table;
+const size_t GLEnums::enum_to_string_table_len_ =
+    sizeof(enum_to_string_table) / sizeof(enum_to_string_table[0]);
diff --git a/ui/gl/gl_implementation_ozone.cc b/ui/gl/gl_implementation_ozone.cc
new file mode 100644
index 0000000..43b3b04
--- /dev/null
+++ b/ui/gl/gl_implementation_ozone.cc
@@ -0,0 +1,121 @@
+// 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.
+
+#include "base/bind.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context_stub_with_extensions.h"
+#include "ui/gl/gl_egl_api_implementation.h"
+#include "ui/gl/gl_gl_api_implementation.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_implementation_osmesa.h"
+#include "ui/gl/gl_osmesa_api_implementation.h"
+#include "ui/ozone/public/ozone_platform.h"
+#include "ui/ozone/public/surface_factory_ozone.h"
+
+namespace gfx {
+
+namespace {
+
+void GL_BINDING_CALL MarshalClearDepthToClearDepthf(GLclampd depth) {
+  glClearDepthf(static_cast<GLclampf>(depth));
+}
+
+void GL_BINDING_CALL MarshalDepthRangeToDepthRangef(GLclampd z_near,
+                                                    GLclampd z_far) {
+  glDepthRangef(static_cast<GLclampf>(z_near), static_cast<GLclampf>(z_far));
+}
+
+}  // namespace
+
+void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) {
+  impls->push_back(kGLImplementationEGLGLES2);
+  impls->push_back(kGLImplementationOSMesaGL);
+}
+
+bool InitializeStaticGLBindings(GLImplementation implementation) {
+  // Prevent reinitialization with a different implementation. Once the gpu
+  // unit tests have initialized with kGLImplementationMock, we don't want to
+  // later switch to another GL implementation.
+  DCHECK_EQ(kGLImplementationNone, GetGLImplementation());
+  ui::OzonePlatform::InitializeForGPU();
+
+  switch (implementation) {
+    case kGLImplementationOSMesaGL:
+      return InitializeStaticGLBindingsOSMesaGL();
+    case kGLImplementationEGLGLES2:
+      if (!ui::SurfaceFactoryOzone::GetInstance()->LoadEGLGLES2Bindings(
+              base::Bind(&AddGLNativeLibrary),
+              base::Bind(&SetGLGetProcAddressProc)))
+        return false;
+      SetGLImplementation(kGLImplementationEGLGLES2);
+      InitializeStaticGLBindingsGL();
+      InitializeStaticGLBindingsEGL();
+
+      // These two functions take single precision float rather than double
+      // precision float parameters in GLES.
+      ::gfx::g_driver_gl.fn.glClearDepthFn = MarshalClearDepthToClearDepthf;
+      ::gfx::g_driver_gl.fn.glDepthRangeFn = MarshalDepthRangeToDepthRangef;
+      break;
+    case kGLImplementationMockGL: {
+      SetGLImplementation(kGLImplementationMockGL);
+      InitializeStaticGLBindingsGL();
+      break;
+    }
+    default:
+      NOTIMPLEMENTED()
+          << "Unsupported GL type for Ozone surface implementation";
+      return false;
+  }
+
+  return true;
+}
+
+bool InitializeDynamicGLBindings(GLImplementation implementation,
+                                 GLContext* context) {
+  switch (implementation) {
+    case kGLImplementationOSMesaGL:
+      InitializeDynamicGLBindingsGL(context);
+      InitializeDynamicGLBindingsOSMESA(context);
+      break;
+    case kGLImplementationEGLGLES2:
+      InitializeDynamicGLBindingsGL(context);
+      InitializeDynamicGLBindingsEGL(context);
+      break;
+    case kGLImplementationMockGL:
+      if (!context) {
+        scoped_refptr<GLContextStubWithExtensions> mock_context(
+            new GLContextStubWithExtensions());
+        mock_context->SetGLVersionString("3.0");
+        InitializeDynamicGLBindingsGL(mock_context.get());
+      } else
+        InitializeDynamicGLBindingsGL(context);
+      break;
+    default:
+      return false;
+  }
+
+  return true;
+}
+
+void InitializeDebugGLBindings() {
+}
+
+void ClearGLBindings() {
+  ClearGLBindingsEGL();
+  ClearGLBindingsGL();
+  SetGLImplementation(kGLImplementationNone);
+  UnloadGLNativeLibraries();
+}
+
+bool GetGLWindowSystemBindingInfo(GLWindowSystemBindingInfo* info) {
+  switch (GetGLImplementation()) {
+    case kGLImplementationEGLGLES2:
+      return GetGLWindowSystemBindingInfoEGL(info);
+    default:
+      return false;
+  }
+  return false;
+}
+
+}  // namespace gfx
diff --git a/ui/gl/gl_mock_autogen_gl.h b/ui/gl/gl_mock_autogen_gl.h
new file mode 100644
index 0000000..470de01
--- /dev/null
+++ b/ui/gl/gl_mock_autogen_gl.h
@@ -0,0 +1,709 @@
+// Copyright 2014 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 auto-generated from
+// ui/gl/generate_bindings.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+MOCK_METHOD1(ActiveTexture, void(GLenum texture));
+MOCK_METHOD2(AttachShader, void(GLuint program, GLuint shader));
+MOCK_METHOD2(BeginQuery, void(GLenum target, GLuint id));
+MOCK_METHOD2(BeginQueryARB, void(GLenum target, GLuint id));
+MOCK_METHOD1(BeginTransformFeedback, void(GLenum primitiveMode));
+MOCK_METHOD3(BindAttribLocation,
+             void(GLuint program, GLuint index, const char* name));
+MOCK_METHOD2(BindBuffer, void(GLenum target, GLuint buffer));
+MOCK_METHOD3(BindBufferBase, void(GLenum target, GLuint index, GLuint buffer));
+MOCK_METHOD5(BindBufferRange,
+             void(GLenum target,
+                  GLuint index,
+                  GLuint buffer,
+                  GLintptr offset,
+                  GLsizeiptr size));
+MOCK_METHOD3(BindFragDataLocation,
+             void(GLuint program, GLuint colorNumber, const char* name));
+MOCK_METHOD4(
+    BindFragDataLocationIndexed,
+    void(GLuint program, GLuint colorNumber, GLuint index, const char* name));
+MOCK_METHOD2(BindFramebufferEXT, void(GLenum target, GLuint framebuffer));
+MOCK_METHOD2(BindRenderbufferEXT, void(GLenum target, GLuint renderbuffer));
+MOCK_METHOD2(BindSampler, void(GLuint unit, GLuint sampler));
+MOCK_METHOD2(BindTexture, void(GLenum target, GLuint texture));
+MOCK_METHOD2(BindTransformFeedback, void(GLenum target, GLuint id));
+MOCK_METHOD1(BindVertexArrayOES, void(GLuint array));
+MOCK_METHOD0(BlendBarrierKHR, void());
+MOCK_METHOD4(BlendColor,
+             void(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha));
+MOCK_METHOD1(BlendEquation, void(GLenum mode));
+MOCK_METHOD2(BlendEquationSeparate, void(GLenum modeRGB, GLenum modeAlpha));
+MOCK_METHOD2(BlendFunc, void(GLenum sfactor, GLenum dfactor));
+MOCK_METHOD4(
+    BlendFuncSeparate,
+    void(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha));
+MOCK_METHOD10(BlitFramebuffer,
+              void(GLint srcX0,
+                   GLint srcY0,
+                   GLint srcX1,
+                   GLint srcY1,
+                   GLint dstX0,
+                   GLint dstY0,
+                   GLint dstX1,
+                   GLint dstY1,
+                   GLbitfield mask,
+                   GLenum filter));
+MOCK_METHOD10(BlitFramebufferANGLE,
+              void(GLint srcX0,
+                   GLint srcY0,
+                   GLint srcX1,
+                   GLint srcY1,
+                   GLint dstX0,
+                   GLint dstY0,
+                   GLint dstX1,
+                   GLint dstY1,
+                   GLbitfield mask,
+                   GLenum filter));
+MOCK_METHOD10(BlitFramebufferEXT,
+              void(GLint srcX0,
+                   GLint srcY0,
+                   GLint srcX1,
+                   GLint srcY1,
+                   GLint dstX0,
+                   GLint dstY0,
+                   GLint dstX1,
+                   GLint dstY1,
+                   GLbitfield mask,
+                   GLenum filter));
+MOCK_METHOD4(
+    BufferData,
+    void(GLenum target, GLsizeiptr size, const void* data, GLenum usage));
+MOCK_METHOD4(
+    BufferSubData,
+    void(GLenum target, GLintptr offset, GLsizeiptr size, const void* data));
+MOCK_METHOD1(CheckFramebufferStatusEXT, GLenum(GLenum target));
+MOCK_METHOD1(Clear, void(GLbitfield mask));
+MOCK_METHOD4(
+    ClearBufferfi,
+    void(GLenum buffer, GLint drawbuffer, const GLfloat depth, GLint stencil));
+MOCK_METHOD3(ClearBufferfv,
+             void(GLenum buffer, GLint drawbuffer, const GLfloat* value));
+MOCK_METHOD3(ClearBufferiv,
+             void(GLenum buffer, GLint drawbuffer, const GLint* value));
+MOCK_METHOD3(ClearBufferuiv,
+             void(GLenum buffer, GLint drawbuffer, const GLuint* value));
+MOCK_METHOD4(ClearColor,
+             void(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha));
+MOCK_METHOD1(ClearDepth, void(GLclampd depth));
+MOCK_METHOD1(ClearDepthf, void(GLclampf depth));
+MOCK_METHOD1(ClearStencil, void(GLint s));
+MOCK_METHOD3(ClientWaitSync,
+             GLenum(GLsync sync, GLbitfield flags, GLuint64 timeout));
+MOCK_METHOD4(
+    ColorMask,
+    void(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha));
+MOCK_METHOD1(CompileShader, void(GLuint shader));
+MOCK_METHOD8(CompressedTexImage2D,
+             void(GLenum target,
+                  GLint level,
+                  GLenum internalformat,
+                  GLsizei width,
+                  GLsizei height,
+                  GLint border,
+                  GLsizei imageSize,
+                  const void* data));
+MOCK_METHOD9(CompressedTexImage3D,
+             void(GLenum target,
+                  GLint level,
+                  GLenum internalformat,
+                  GLsizei width,
+                  GLsizei height,
+                  GLsizei depth,
+                  GLint border,
+                  GLsizei imageSize,
+                  const void* data));
+MOCK_METHOD9(CompressedTexSubImage2D,
+             void(GLenum target,
+                  GLint level,
+                  GLint xoffset,
+                  GLint yoffset,
+                  GLsizei width,
+                  GLsizei height,
+                  GLenum format,
+                  GLsizei imageSize,
+                  const void* data));
+MOCK_METHOD5(CopyBufferSubData,
+             void(GLenum readTarget,
+                  GLenum writeTarget,
+                  GLintptr readOffset,
+                  GLintptr writeOffset,
+                  GLsizeiptr size));
+MOCK_METHOD8(CopyTexImage2D,
+             void(GLenum target,
+                  GLint level,
+                  GLenum internalformat,
+                  GLint x,
+                  GLint y,
+                  GLsizei width,
+                  GLsizei height,
+                  GLint border));
+MOCK_METHOD8(CopyTexSubImage2D,
+             void(GLenum target,
+                  GLint level,
+                  GLint xoffset,
+                  GLint yoffset,
+                  GLint x,
+                  GLint y,
+                  GLsizei width,
+                  GLsizei height));
+MOCK_METHOD9(CopyTexSubImage3D,
+             void(GLenum target,
+                  GLint level,
+                  GLint xoffset,
+                  GLint yoffset,
+                  GLint zoffset,
+                  GLint x,
+                  GLint y,
+                  GLsizei width,
+                  GLsizei height));
+MOCK_METHOD0(CreateProgram, GLuint());
+MOCK_METHOD1(CreateShader, GLuint(GLenum type));
+MOCK_METHOD1(CullFace, void(GLenum mode));
+MOCK_METHOD2(DeleteBuffersARB, void(GLsizei n, const GLuint* buffers));
+MOCK_METHOD2(DeleteFencesAPPLE, void(GLsizei n, const GLuint* fences));
+MOCK_METHOD2(DeleteFencesNV, void(GLsizei n, const GLuint* fences));
+MOCK_METHOD2(DeleteFramebuffersEXT,
+             void(GLsizei n, const GLuint* framebuffers));
+MOCK_METHOD1(DeleteProgram, void(GLuint program));
+MOCK_METHOD2(DeleteQueries, void(GLsizei n, const GLuint* ids));
+MOCK_METHOD2(DeleteQueriesARB, void(GLsizei n, const GLuint* ids));
+MOCK_METHOD2(DeleteRenderbuffersEXT,
+             void(GLsizei n, const GLuint* renderbuffers));
+MOCK_METHOD2(DeleteSamplers, void(GLsizei n, const GLuint* samplers));
+MOCK_METHOD1(DeleteShader, void(GLuint shader));
+MOCK_METHOD1(DeleteSync, void(GLsync sync));
+MOCK_METHOD2(DeleteTextures, void(GLsizei n, const GLuint* textures));
+MOCK_METHOD2(DeleteTransformFeedbacks, void(GLsizei n, const GLuint* ids));
+MOCK_METHOD2(DeleteVertexArraysOES, void(GLsizei n, const GLuint* arrays));
+MOCK_METHOD1(DepthFunc, void(GLenum func));
+MOCK_METHOD1(DepthMask, void(GLboolean flag));
+MOCK_METHOD2(DepthRange, void(GLclampd zNear, GLclampd zFar));
+MOCK_METHOD2(DepthRangef, void(GLclampf zNear, GLclampf zFar));
+MOCK_METHOD2(DetachShader, void(GLuint program, GLuint shader));
+MOCK_METHOD1(Disable, void(GLenum cap));
+MOCK_METHOD1(DisableVertexAttribArray, void(GLuint index));
+MOCK_METHOD3(DiscardFramebufferEXT,
+             void(GLenum target,
+                  GLsizei numAttachments,
+                  const GLenum* attachments));
+MOCK_METHOD3(DrawArrays, void(GLenum mode, GLint first, GLsizei count));
+MOCK_METHOD4(DrawArraysInstancedANGLE,
+             void(GLenum mode, GLint first, GLsizei count, GLsizei primcount));
+MOCK_METHOD1(DrawBuffer, void(GLenum mode));
+MOCK_METHOD2(DrawBuffersARB, void(GLsizei n, const GLenum* bufs));
+MOCK_METHOD4(
+    DrawElements,
+    void(GLenum mode, GLsizei count, GLenum type, const void* indices));
+MOCK_METHOD5(DrawElementsInstancedANGLE,
+             void(GLenum mode,
+                  GLsizei count,
+                  GLenum type,
+                  const void* indices,
+                  GLsizei primcount));
+MOCK_METHOD6(DrawRangeElements,
+             void(GLenum mode,
+                  GLuint start,
+                  GLuint end,
+                  GLsizei count,
+                  GLenum type,
+                  const void* indices));
+MOCK_METHOD2(EGLImageTargetRenderbufferStorageOES,
+             void(GLenum target, GLeglImageOES image));
+MOCK_METHOD2(EGLImageTargetTexture2DOES,
+             void(GLenum target, GLeglImageOES image));
+MOCK_METHOD1(Enable, void(GLenum cap));
+MOCK_METHOD1(EnableVertexAttribArray, void(GLuint index));
+MOCK_METHOD1(EndQuery, void(GLenum target));
+MOCK_METHOD1(EndQueryARB, void(GLenum target));
+MOCK_METHOD0(EndTransformFeedback, void());
+MOCK_METHOD2(FenceSync, GLsync(GLenum condition, GLbitfield flags));
+MOCK_METHOD0(Finish, void());
+MOCK_METHOD1(FinishFenceAPPLE, void(GLuint fence));
+MOCK_METHOD1(FinishFenceNV, void(GLuint fence));
+MOCK_METHOD0(Flush, void());
+MOCK_METHOD3(FlushMappedBufferRange,
+             void(GLenum target, GLintptr offset, GLsizeiptr length));
+MOCK_METHOD4(FramebufferRenderbufferEXT,
+             void(GLenum target,
+                  GLenum attachment,
+                  GLenum renderbuffertarget,
+                  GLuint renderbuffer));
+MOCK_METHOD5(FramebufferTexture2DEXT,
+             void(GLenum target,
+                  GLenum attachment,
+                  GLenum textarget,
+                  GLuint texture,
+                  GLint level));
+MOCK_METHOD6(FramebufferTexture2DMultisampleEXT,
+             void(GLenum target,
+                  GLenum attachment,
+                  GLenum textarget,
+                  GLuint texture,
+                  GLint level,
+                  GLsizei samples));
+MOCK_METHOD6(FramebufferTexture2DMultisampleIMG,
+             void(GLenum target,
+                  GLenum attachment,
+                  GLenum textarget,
+                  GLuint texture,
+                  GLint level,
+                  GLsizei samples));
+MOCK_METHOD5(FramebufferTextureLayer,
+             void(GLenum target,
+                  GLenum attachment,
+                  GLuint texture,
+                  GLint level,
+                  GLint layer));
+MOCK_METHOD1(FrontFace, void(GLenum mode));
+MOCK_METHOD2(GenBuffersARB, void(GLsizei n, GLuint* buffers));
+MOCK_METHOD1(GenerateMipmapEXT, void(GLenum target));
+MOCK_METHOD2(GenFencesAPPLE, void(GLsizei n, GLuint* fences));
+MOCK_METHOD2(GenFencesNV, void(GLsizei n, GLuint* fences));
+MOCK_METHOD2(GenFramebuffersEXT, void(GLsizei n, GLuint* framebuffers));
+MOCK_METHOD2(GenQueries, void(GLsizei n, GLuint* ids));
+MOCK_METHOD2(GenQueriesARB, void(GLsizei n, GLuint* ids));
+MOCK_METHOD2(GenRenderbuffersEXT, void(GLsizei n, GLuint* renderbuffers));
+MOCK_METHOD2(GenSamplers, void(GLsizei n, GLuint* samplers));
+MOCK_METHOD2(GenTextures, void(GLsizei n, GLuint* textures));
+MOCK_METHOD2(GenTransformFeedbacks, void(GLsizei n, GLuint* ids));
+MOCK_METHOD2(GenVertexArraysOES, void(GLsizei n, GLuint* arrays));
+MOCK_METHOD7(GetActiveAttrib,
+             void(GLuint program,
+                  GLuint index,
+                  GLsizei bufsize,
+                  GLsizei* length,
+                  GLint* size,
+                  GLenum* type,
+                  char* name));
+MOCK_METHOD7(GetActiveUniform,
+             void(GLuint program,
+                  GLuint index,
+                  GLsizei bufsize,
+                  GLsizei* length,
+                  GLint* size,
+                  GLenum* type,
+                  char* name));
+MOCK_METHOD4(GetActiveUniformBlockiv,
+             void(GLuint program,
+                  GLuint uniformBlockIndex,
+                  GLenum pname,
+                  GLint* params));
+MOCK_METHOD5(GetActiveUniformBlockName,
+             void(GLuint program,
+                  GLuint uniformBlockIndex,
+                  GLsizei bufSize,
+                  GLsizei* length,
+                  char* uniformBlockName));
+MOCK_METHOD5(GetActiveUniformsiv,
+             void(GLuint program,
+                  GLsizei uniformCount,
+                  const GLuint* uniformIndices,
+                  GLenum pname,
+                  GLint* params));
+MOCK_METHOD4(
+    GetAttachedShaders,
+    void(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders));
+MOCK_METHOD2(GetAttribLocation, GLint(GLuint program, const char* name));
+MOCK_METHOD2(GetBooleanv, void(GLenum pname, GLboolean* params));
+MOCK_METHOD3(GetBufferParameteriv,
+             void(GLenum target, GLenum pname, GLint* params));
+MOCK_METHOD0(GetError, GLenum());
+MOCK_METHOD3(GetFenceivNV, void(GLuint fence, GLenum pname, GLint* params));
+MOCK_METHOD2(GetFloatv, void(GLenum pname, GLfloat* params));
+MOCK_METHOD2(GetFragDataLocation, GLint(GLuint program, const char* name));
+MOCK_METHOD4(
+    GetFramebufferAttachmentParameterivEXT,
+    void(GLenum target, GLenum attachment, GLenum pname, GLint* params));
+MOCK_METHOD0(GetGraphicsResetStatusARB, GLenum());
+MOCK_METHOD3(GetInteger64i_v, void(GLenum target, GLuint index, GLint64* data));
+MOCK_METHOD2(GetInteger64v, void(GLenum pname, GLint64* params));
+MOCK_METHOD3(GetIntegeri_v, void(GLenum target, GLuint index, GLint* data));
+MOCK_METHOD2(GetIntegerv, void(GLenum pname, GLint* params));
+MOCK_METHOD5(GetInternalformativ,
+             void(GLenum target,
+                  GLenum internalformat,
+                  GLenum pname,
+                  GLsizei bufSize,
+                  GLint* params));
+MOCK_METHOD5(GetProgramBinary,
+             void(GLuint program,
+                  GLsizei bufSize,
+                  GLsizei* length,
+                  GLenum* binaryFormat,
+                  GLvoid* binary));
+MOCK_METHOD4(
+    GetProgramInfoLog,
+    void(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog));
+MOCK_METHOD3(GetProgramiv, void(GLuint program, GLenum pname, GLint* params));
+MOCK_METHOD3(GetQueryiv, void(GLenum target, GLenum pname, GLint* params));
+MOCK_METHOD3(GetQueryivARB, void(GLenum target, GLenum pname, GLint* params));
+MOCK_METHOD3(GetQueryObjecti64v,
+             void(GLuint id, GLenum pname, GLint64* params));
+MOCK_METHOD3(GetQueryObjectiv, void(GLuint id, GLenum pname, GLint* params));
+MOCK_METHOD3(GetQueryObjectivARB, void(GLuint id, GLenum pname, GLint* params));
+MOCK_METHOD3(GetQueryObjectui64v,
+             void(GLuint id, GLenum pname, GLuint64* params));
+MOCK_METHOD3(GetQueryObjectuiv, void(GLuint id, GLenum pname, GLuint* params));
+MOCK_METHOD3(GetQueryObjectuivARB,
+             void(GLuint id, GLenum pname, GLuint* params));
+MOCK_METHOD3(GetRenderbufferParameterivEXT,
+             void(GLenum target, GLenum pname, GLint* params));
+MOCK_METHOD3(GetSamplerParameterfv,
+             void(GLuint sampler, GLenum pname, GLfloat* params));
+MOCK_METHOD3(GetSamplerParameteriv,
+             void(GLuint sampler, GLenum pname, GLint* params));
+MOCK_METHOD4(
+    GetShaderInfoLog,
+    void(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog));
+MOCK_METHOD3(GetShaderiv, void(GLuint shader, GLenum pname, GLint* params));
+MOCK_METHOD4(GetShaderPrecisionFormat,
+             void(GLenum shadertype,
+                  GLenum precisiontype,
+                  GLint* range,
+                  GLint* precision));
+MOCK_METHOD4(
+    GetShaderSource,
+    void(GLuint shader, GLsizei bufsize, GLsizei* length, char* source));
+MOCK_METHOD1(GetString, const GLubyte*(GLenum name));
+MOCK_METHOD5(GetSynciv,
+             void(GLsync sync,
+                  GLenum pname,
+                  GLsizei bufSize,
+                  GLsizei* length,
+                  GLint* values));
+MOCK_METHOD4(GetTexLevelParameterfv,
+             void(GLenum target, GLint level, GLenum pname, GLfloat* params));
+MOCK_METHOD4(GetTexLevelParameteriv,
+             void(GLenum target, GLint level, GLenum pname, GLint* params));
+MOCK_METHOD3(GetTexParameterfv,
+             void(GLenum target, GLenum pname, GLfloat* params));
+MOCK_METHOD3(GetTexParameteriv,
+             void(GLenum target, GLenum pname, GLint* params));
+MOCK_METHOD6(GetTransformFeedbackVarying,
+             void(GLuint program,
+                  GLuint index,
+                  GLsizei bufSize,
+                  GLsizei* length,
+                  GLenum* type,
+                  char* name));
+MOCK_METHOD4(
+    GetTranslatedShaderSourceANGLE,
+    void(GLuint shader, GLsizei bufsize, GLsizei* length, char* source));
+MOCK_METHOD2(GetUniformBlockIndex,
+             GLuint(GLuint program, const char* uniformBlockName));
+MOCK_METHOD3(GetUniformfv,
+             void(GLuint program, GLint location, GLfloat* params));
+MOCK_METHOD4(GetUniformIndices,
+             void(GLuint program,
+                  GLsizei uniformCount,
+                  const char* const* uniformNames,
+                  GLuint* uniformIndices));
+MOCK_METHOD3(GetUniformiv, void(GLuint program, GLint location, GLint* params));
+MOCK_METHOD2(GetUniformLocation, GLint(GLuint program, const char* name));
+MOCK_METHOD3(GetVertexAttribfv,
+             void(GLuint index, GLenum pname, GLfloat* params));
+MOCK_METHOD3(GetVertexAttribiv,
+             void(GLuint index, GLenum pname, GLint* params));
+MOCK_METHOD3(GetVertexAttribPointerv,
+             void(GLuint index, GLenum pname, void** pointer));
+MOCK_METHOD2(Hint, void(GLenum target, GLenum mode));
+MOCK_METHOD2(InsertEventMarkerEXT, void(GLsizei length, const char* marker));
+MOCK_METHOD3(InvalidateFramebuffer,
+             void(GLenum target,
+                  GLsizei numAttachments,
+                  const GLenum* attachments));
+MOCK_METHOD7(InvalidateSubFramebuffer,
+             void(GLenum target,
+                  GLsizei numAttachments,
+                  const GLenum* attachments,
+                  GLint x,
+                  GLint y,
+                  GLint width,
+                  GLint height));
+MOCK_METHOD1(IsBuffer, GLboolean(GLuint buffer));
+MOCK_METHOD1(IsEnabled, GLboolean(GLenum cap));
+MOCK_METHOD1(IsFenceAPPLE, GLboolean(GLuint fence));
+MOCK_METHOD1(IsFenceNV, GLboolean(GLuint fence));
+MOCK_METHOD1(IsFramebufferEXT, GLboolean(GLuint framebuffer));
+MOCK_METHOD1(IsProgram, GLboolean(GLuint program));
+MOCK_METHOD1(IsQuery, GLboolean(GLuint query));
+MOCK_METHOD1(IsQueryARB, GLboolean(GLuint query));
+MOCK_METHOD1(IsRenderbufferEXT, GLboolean(GLuint renderbuffer));
+MOCK_METHOD1(IsSampler, GLboolean(GLuint sampler));
+MOCK_METHOD1(IsShader, GLboolean(GLuint shader));
+MOCK_METHOD1(IsSync, GLboolean(GLsync sync));
+MOCK_METHOD1(IsTexture, GLboolean(GLuint texture));
+MOCK_METHOD1(IsTransformFeedback, GLboolean(GLuint id));
+MOCK_METHOD1(IsVertexArrayOES, GLboolean(GLuint array));
+MOCK_METHOD1(LineWidth, void(GLfloat width));
+MOCK_METHOD1(LinkProgram, void(GLuint program));
+MOCK_METHOD2(MapBuffer, void*(GLenum target, GLenum access));
+MOCK_METHOD4(MapBufferRange,
+             void*(GLenum target,
+                   GLintptr offset,
+                   GLsizeiptr length,
+                   GLbitfield access));
+MOCK_METHOD2(MatrixLoadfEXT, void(GLenum matrixMode, const GLfloat* m));
+MOCK_METHOD1(MatrixLoadIdentityEXT, void(GLenum matrixMode));
+MOCK_METHOD0(PauseTransformFeedback, void());
+MOCK_METHOD2(PixelStorei, void(GLenum pname, GLint param));
+MOCK_METHOD2(PointParameteri, void(GLenum pname, GLint param));
+MOCK_METHOD2(PolygonOffset, void(GLfloat factor, GLfloat units));
+MOCK_METHOD0(PopGroupMarkerEXT, void());
+MOCK_METHOD4(ProgramBinary,
+             void(GLuint program,
+                  GLenum binaryFormat,
+                  const GLvoid* binary,
+                  GLsizei length));
+MOCK_METHOD3(ProgramParameteri,
+             void(GLuint program, GLenum pname, GLint value));
+MOCK_METHOD2(PushGroupMarkerEXT, void(GLsizei length, const char* marker));
+MOCK_METHOD2(QueryCounter, void(GLuint id, GLenum target));
+MOCK_METHOD1(ReadBuffer, void(GLenum src));
+MOCK_METHOD7(ReadPixels,
+             void(GLint x,
+                  GLint y,
+                  GLsizei width,
+                  GLsizei height,
+                  GLenum format,
+                  GLenum type,
+                  void* pixels));
+MOCK_METHOD0(ReleaseShaderCompiler, void());
+MOCK_METHOD4(
+    RenderbufferStorageEXT,
+    void(GLenum target, GLenum internalformat, GLsizei width, GLsizei height));
+MOCK_METHOD5(RenderbufferStorageMultisample,
+             void(GLenum target,
+                  GLsizei samples,
+                  GLenum internalformat,
+                  GLsizei width,
+                  GLsizei height));
+MOCK_METHOD5(RenderbufferStorageMultisampleANGLE,
+             void(GLenum target,
+                  GLsizei samples,
+                  GLenum internalformat,
+                  GLsizei width,
+                  GLsizei height));
+MOCK_METHOD5(RenderbufferStorageMultisampleEXT,
+             void(GLenum target,
+                  GLsizei samples,
+                  GLenum internalformat,
+                  GLsizei width,
+                  GLsizei height));
+MOCK_METHOD5(RenderbufferStorageMultisampleIMG,
+             void(GLenum target,
+                  GLsizei samples,
+                  GLenum internalformat,
+                  GLsizei width,
+                  GLsizei height));
+MOCK_METHOD0(ResumeTransformFeedback, void());
+MOCK_METHOD2(SampleCoverage, void(GLclampf value, GLboolean invert));
+MOCK_METHOD3(SamplerParameterf,
+             void(GLuint sampler, GLenum pname, GLfloat param));
+MOCK_METHOD3(SamplerParameterfv,
+             void(GLuint sampler, GLenum pname, const GLfloat* params));
+MOCK_METHOD3(SamplerParameteri,
+             void(GLuint sampler, GLenum pname, GLint param));
+MOCK_METHOD3(SamplerParameteriv,
+             void(GLuint sampler, GLenum pname, const GLint* params));
+MOCK_METHOD4(Scissor, void(GLint x, GLint y, GLsizei width, GLsizei height));
+MOCK_METHOD1(SetFenceAPPLE, void(GLuint fence));
+MOCK_METHOD2(SetFenceNV, void(GLuint fence, GLenum condition));
+MOCK_METHOD5(ShaderBinary,
+             void(GLsizei n,
+                  const GLuint* shaders,
+                  GLenum binaryformat,
+                  const void* binary,
+                  GLsizei length));
+MOCK_METHOD4(ShaderSource,
+             void(GLuint shader,
+                  GLsizei count,
+                  const char* const* str,
+                  const GLint* length));
+MOCK_METHOD3(StencilFunc, void(GLenum func, GLint ref, GLuint mask));
+MOCK_METHOD4(StencilFuncSeparate,
+             void(GLenum face, GLenum func, GLint ref, GLuint mask));
+MOCK_METHOD1(StencilMask, void(GLuint mask));
+MOCK_METHOD2(StencilMaskSeparate, void(GLenum face, GLuint mask));
+MOCK_METHOD3(StencilOp, void(GLenum fail, GLenum zfail, GLenum zpass));
+MOCK_METHOD4(StencilOpSeparate,
+             void(GLenum face, GLenum fail, GLenum zfail, GLenum zpass));
+MOCK_METHOD1(TestFenceAPPLE, GLboolean(GLuint fence));
+MOCK_METHOD1(TestFenceNV, GLboolean(GLuint fence));
+MOCK_METHOD9(TexImage2D,
+             void(GLenum target,
+                  GLint level,
+                  GLint internalformat,
+                  GLsizei width,
+                  GLsizei height,
+                  GLint border,
+                  GLenum format,
+                  GLenum type,
+                  const void* pixels));
+MOCK_METHOD10(TexImage3D,
+              void(GLenum target,
+                   GLint level,
+                   GLint internalformat,
+                   GLsizei width,
+                   GLsizei height,
+                   GLsizei depth,
+                   GLint border,
+                   GLenum format,
+                   GLenum type,
+                   const void* pixels));
+MOCK_METHOD3(TexParameterf, void(GLenum target, GLenum pname, GLfloat param));
+MOCK_METHOD3(TexParameterfv,
+             void(GLenum target, GLenum pname, const GLfloat* params));
+MOCK_METHOD3(TexParameteri, void(GLenum target, GLenum pname, GLint param));
+MOCK_METHOD3(TexParameteriv,
+             void(GLenum target, GLenum pname, const GLint* params));
+MOCK_METHOD5(TexStorage2DEXT,
+             void(GLenum target,
+                  GLsizei levels,
+                  GLenum internalformat,
+                  GLsizei width,
+                  GLsizei height));
+MOCK_METHOD6(TexStorage3D,
+             void(GLenum target,
+                  GLsizei levels,
+                  GLenum internalformat,
+                  GLsizei width,
+                  GLsizei height,
+                  GLsizei depth));
+MOCK_METHOD9(TexSubImage2D,
+             void(GLenum target,
+                  GLint level,
+                  GLint xoffset,
+                  GLint yoffset,
+                  GLsizei width,
+                  GLsizei height,
+                  GLenum format,
+                  GLenum type,
+                  const void* pixels));
+MOCK_METHOD4(TransformFeedbackVaryings,
+             void(GLuint program,
+                  GLsizei count,
+                  const char* const* varyings,
+                  GLenum bufferMode));
+MOCK_METHOD2(Uniform1f, void(GLint location, GLfloat x));
+MOCK_METHOD3(Uniform1fv, void(GLint location, GLsizei count, const GLfloat* v));
+MOCK_METHOD2(Uniform1i, void(GLint location, GLint x));
+MOCK_METHOD3(Uniform1iv, void(GLint location, GLsizei count, const GLint* v));
+MOCK_METHOD2(Uniform1ui, void(GLint location, GLuint v0));
+MOCK_METHOD3(Uniform1uiv, void(GLint location, GLsizei count, const GLuint* v));
+MOCK_METHOD3(Uniform2f, void(GLint location, GLfloat x, GLfloat y));
+MOCK_METHOD3(Uniform2fv, void(GLint location, GLsizei count, const GLfloat* v));
+MOCK_METHOD3(Uniform2i, void(GLint location, GLint x, GLint y));
+MOCK_METHOD3(Uniform2iv, void(GLint location, GLsizei count, const GLint* v));
+MOCK_METHOD3(Uniform2ui, void(GLint location, GLuint v0, GLuint v1));
+MOCK_METHOD3(Uniform2uiv, void(GLint location, GLsizei count, const GLuint* v));
+MOCK_METHOD4(Uniform3f, void(GLint location, GLfloat x, GLfloat y, GLfloat z));
+MOCK_METHOD3(Uniform3fv, void(GLint location, GLsizei count, const GLfloat* v));
+MOCK_METHOD4(Uniform3i, void(GLint location, GLint x, GLint y, GLint z));
+MOCK_METHOD3(Uniform3iv, void(GLint location, GLsizei count, const GLint* v));
+MOCK_METHOD4(Uniform3ui, void(GLint location, GLuint v0, GLuint v1, GLuint v2));
+MOCK_METHOD3(Uniform3uiv, void(GLint location, GLsizei count, const GLuint* v));
+MOCK_METHOD5(Uniform4f,
+             void(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w));
+MOCK_METHOD3(Uniform4fv, void(GLint location, GLsizei count, const GLfloat* v));
+MOCK_METHOD5(Uniform4i,
+             void(GLint location, GLint x, GLint y, GLint z, GLint w));
+MOCK_METHOD3(Uniform4iv, void(GLint location, GLsizei count, const GLint* v));
+MOCK_METHOD5(Uniform4ui,
+             void(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3));
+MOCK_METHOD3(Uniform4uiv, void(GLint location, GLsizei count, const GLuint* v));
+MOCK_METHOD3(UniformBlockBinding,
+             void(GLuint program,
+                  GLuint uniformBlockIndex,
+                  GLuint uniformBlockBinding));
+MOCK_METHOD4(UniformMatrix2fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD4(UniformMatrix2x3fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD4(UniformMatrix2x4fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD4(UniformMatrix3fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD4(UniformMatrix3x2fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD4(UniformMatrix3x4fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD4(UniformMatrix4fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD4(UniformMatrix4x2fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD4(UniformMatrix4x3fv,
+             void(GLint location,
+                  GLsizei count,
+                  GLboolean transpose,
+                  const GLfloat* value));
+MOCK_METHOD1(UnmapBuffer, GLboolean(GLenum target));
+MOCK_METHOD1(UseProgram, void(GLuint program));
+MOCK_METHOD1(ValidateProgram, void(GLuint program));
+MOCK_METHOD2(VertexAttrib1f, void(GLuint indx, GLfloat x));
+MOCK_METHOD2(VertexAttrib1fv, void(GLuint indx, const GLfloat* values));
+MOCK_METHOD3(VertexAttrib2f, void(GLuint indx, GLfloat x, GLfloat y));
+MOCK_METHOD2(VertexAttrib2fv, void(GLuint indx, const GLfloat* values));
+MOCK_METHOD4(VertexAttrib3f,
+             void(GLuint indx, GLfloat x, GLfloat y, GLfloat z));
+MOCK_METHOD2(VertexAttrib3fv, void(GLuint indx, const GLfloat* values));
+MOCK_METHOD5(VertexAttrib4f,
+             void(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w));
+MOCK_METHOD2(VertexAttrib4fv, void(GLuint indx, const GLfloat* values));
+MOCK_METHOD2(VertexAttribDivisorANGLE, void(GLuint index, GLuint divisor));
+MOCK_METHOD5(VertexAttribI4i,
+             void(GLuint indx, GLint x, GLint y, GLint z, GLint w));
+MOCK_METHOD2(VertexAttribI4iv, void(GLuint indx, const GLint* values));
+MOCK_METHOD5(VertexAttribI4ui,
+             void(GLuint indx, GLuint x, GLuint y, GLuint z, GLuint w));
+MOCK_METHOD2(VertexAttribI4uiv, void(GLuint indx, const GLuint* values));
+MOCK_METHOD5(VertexAttribIPointer,
+             void(GLuint indx,
+                  GLint size,
+                  GLenum type,
+                  GLsizei stride,
+                  const void* ptr));
+MOCK_METHOD6(VertexAttribPointer,
+             void(GLuint indx,
+                  GLint size,
+                  GLenum type,
+                  GLboolean normalized,
+                  GLsizei stride,
+                  const void* ptr));
+MOCK_METHOD4(Viewport, void(GLint x, GLint y, GLsizei width, GLsizei height));
+MOCK_METHOD3(WaitSync, GLenum(GLsync sync, GLbitfield flags, GLuint64 timeout));
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc
index 5e849ac..1b670e1 100644
--- a/ui/gl/gl_surface_egl.cc
+++ b/ui/gl/gl_surface_egl.cc
@@ -29,6 +29,10 @@
 }
 #endif
 
+#if defined (USE_OZONE)
+#include "ui/ozone/public/surface_factory_ozone.h"
+#endif
+
 #if !defined(EGL_FIXED_SIZE_ANGLE)
 #define EGL_FIXED_SIZE_ANGLE 0x3201
 #endif
diff --git a/ui/gl/gl_surface_ozone.cc b/ui/gl/gl_surface_ozone.cc
new file mode 100644
index 0000000..eecd064
--- /dev/null
+++ b/ui/gl/gl_surface_ozone.cc
@@ -0,0 +1,266 @@
+// Copyright 2014 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.
+
+#include "ui/gl/gl_surface.h"
+
+#include "base/logging.h"
+#include "base/memory/ref_counted.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_image.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_surface_egl.h"
+#include "ui/gl/gl_surface_osmesa.h"
+#include "ui/gl/gl_surface_stub.h"
+#include "ui/gl/scoped_make_current.h"
+#include "ui/ozone/public/surface_factory_ozone.h"
+#include "ui/ozone/public/surface_ozone_egl.h"
+
+namespace gfx {
+
+namespace {
+
+// A thin wrapper around GLSurfaceEGL that owns the EGLNativeWindow
+class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL {
+ public:
+  GLSurfaceOzoneEGL(scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface,
+                    AcceleratedWidget widget)
+      : NativeViewGLSurfaceEGL(ozone_surface->GetNativeWindow()),
+        ozone_surface_(ozone_surface.Pass()),
+        widget_(widget) {}
+
+  bool Initialize() override {
+    return Initialize(ozone_surface_->CreateVSyncProvider());
+  }
+  bool Resize(const gfx::Size& size) override {
+    if (!ozone_surface_->ResizeNativeWindow(size)) {
+      if (!ReinitializeNativeSurface() ||
+          !ozone_surface_->ResizeNativeWindow(size))
+        return false;
+    }
+
+    return NativeViewGLSurfaceEGL::Resize(size);
+  }
+  bool SwapBuffers() override {
+    if (!NativeViewGLSurfaceEGL::SwapBuffers())
+      return false;
+
+    return ozone_surface_->OnSwapBuffers();
+  }
+  bool ScheduleOverlayPlane(int z_order,
+                            OverlayTransform transform,
+                            GLImage* image,
+                            const Rect& bounds_rect,
+                            const RectF& crop_rect) override {
+    return image->ScheduleOverlayPlane(
+        widget_, z_order, transform, bounds_rect, crop_rect);
+  }
+
+ private:
+  using NativeViewGLSurfaceEGL::Initialize;
+
+  ~GLSurfaceOzoneEGL() override {
+    Destroy();  // EGL surface must be destroyed before SurfaceOzone
+  }
+
+  bool ReinitializeNativeSurface() {
+    scoped_ptr<ui::ScopedMakeCurrent> scoped_make_current;
+    GLContext* current_context = GLContext::GetCurrent();
+    bool was_current =
+        current_context && current_context->IsCurrent(this);
+    if (was_current) {
+      scoped_make_current.reset(
+          new ui::ScopedMakeCurrent(current_context, this));
+    }
+
+    Destroy();
+    ozone_surface_ =
+        ui::SurfaceFactoryOzone::GetInstance()->CreateEGLSurfaceForWidget(
+            widget_).Pass();
+    if (!ozone_surface_) {
+      LOG(ERROR) << "Failed to create native surface.";
+      return false;
+    }
+
+    window_ = ozone_surface_->GetNativeWindow();
+    if (!Initialize()) {
+      LOG(ERROR) << "Failed to initialize.";
+      return false;
+    }
+
+    return true;
+  }
+
+  // The native surface. Deleting this is allowed to free the EGLNativeWindow.
+  scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface_;
+  AcceleratedWidget widget_;
+
+  DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneEGL);
+};
+
+class GL_EXPORT GLSurfaceOzoneSurfaceless : public SurfacelessEGL {
+ public:
+  GLSurfaceOzoneSurfaceless(scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface,
+                            AcceleratedWidget widget)
+      : SurfacelessEGL(gfx::Size()),
+        ozone_surface_(ozone_surface.Pass()),
+        widget_(widget) {}
+
+  bool Initialize() override {
+    if (!SurfacelessEGL::Initialize())
+      return false;
+    vsync_provider_ = ozone_surface_->CreateVSyncProvider();
+    if (!vsync_provider_)
+      return false;
+    return true;
+  }
+  bool Resize(const gfx::Size& size) override {
+    if (!ozone_surface_->ResizeNativeWindow(size))
+      return false;
+
+    return SurfacelessEGL::Resize(size);
+  }
+  bool SwapBuffers() override {
+    // TODO: this should be replaced by a fence when supported by the driver.
+    glFlush();
+    return ozone_surface_->OnSwapBuffers();
+  }
+  bool ScheduleOverlayPlane(int z_order,
+                            OverlayTransform transform,
+                            GLImage* image,
+                            const Rect& bounds_rect,
+                            const RectF& crop_rect) override {
+    return image->ScheduleOverlayPlane(
+        widget_, z_order, transform, bounds_rect, crop_rect);
+  }
+  bool IsOffscreen() override { return false; }
+  VSyncProvider* GetVSyncProvider() override { return vsync_provider_.get(); }
+  bool SupportsPostSubBuffer() override { return true; }
+  bool PostSubBuffer(int x, int y, int width, int height) override {
+    // The actual sub buffer handling is handled at higher layers.
+    SwapBuffers();
+    return true;
+  }
+  bool SwapBuffersAsync(const SwapCompletionCallback& callback) override {
+    // TODO: this should be replaced by a fence when supported by the driver.
+    glFlush();
+    return ozone_surface_->OnSwapBuffersAsync(callback);
+  }
+  bool PostSubBufferAsync(int x,
+                          int y,
+                          int width,
+                          int height,
+                          const SwapCompletionCallback& callback) override {
+    return SwapBuffersAsync(callback);
+  }
+
+ private:
+  ~GLSurfaceOzoneSurfaceless() override {
+    Destroy();  // EGL surface must be destroyed before SurfaceOzone
+  }
+
+  // The native surface. Deleting this is allowed to free the EGLNativeWindow.
+  scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface_;
+  AcceleratedWidget widget_;
+  scoped_ptr<VSyncProvider> vsync_provider_;
+
+  DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfaceless);
+};
+
+}  // namespace
+
+// static
+bool GLSurface::InitializeOneOffInternal() {
+  switch (GetGLImplementation()) {
+    case kGLImplementationEGLGLES2:
+      if (!GLSurfaceEGL::InitializeOneOff()) {
+        LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed.";
+        return false;
+      }
+
+      return true;
+    case kGLImplementationOSMesaGL:
+    case kGLImplementationMockGL:
+      return true;
+    default:
+      return false;
+  }
+}
+
+// static
+scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface(
+    gfx::AcceleratedWidget window) {
+  if (GetGLImplementation() == kGLImplementationOSMesaGL) {
+    scoped_refptr<GLSurface> surface(new GLSurfaceOSMesaHeadless());
+    if (!surface->Initialize())
+      return NULL;
+    return surface;
+  }
+  DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2);
+  if (window != kNullAcceleratedWidget) {
+    scoped_refptr<GLSurface> surface;
+    if (GLSurfaceEGL::IsEGLSurfacelessContextSupported() &&
+        ui::SurfaceFactoryOzone::GetInstance()
+            ->CanShowPrimaryPlaneAsOverlay()) {
+      scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone =
+          ui::SurfaceFactoryOzone::GetInstance()
+              ->CreateSurfacelessEGLSurfaceForWidget(window);
+      if (!surface_ozone)
+        return NULL;
+      surface = new GLSurfaceOzoneSurfaceless(surface_ozone.Pass(), window);
+    } else {
+      scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone =
+          ui::SurfaceFactoryOzone::GetInstance()->CreateEGLSurfaceForWidget(
+              window);
+      if (!surface_ozone)
+        return NULL;
+
+      surface = new GLSurfaceOzoneEGL(surface_ozone.Pass(), window);
+    }
+    if (!surface->Initialize())
+      return NULL;
+    return surface;
+  } else {
+    scoped_refptr<GLSurface> surface = new GLSurfaceStub();
+    if (surface->Initialize())
+      return surface;
+  }
+  return NULL;
+}
+
+// static
+scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface(
+    const gfx::Size& size) {
+  switch (GetGLImplementation()) {
+    case kGLImplementationOSMesaGL: {
+      scoped_refptr<GLSurface> surface(
+          new GLSurfaceOSMesa(OSMesaSurfaceFormatBGRA, size));
+      if (!surface->Initialize())
+        return NULL;
+
+      return surface;
+    }
+    case kGLImplementationEGLGLES2: {
+      scoped_refptr<GLSurface> surface;
+      if (GLSurfaceEGL::IsEGLSurfacelessContextSupported() &&
+          (size.width() == 0 && size.height() == 0)) {
+        surface = new SurfacelessEGL(size);
+      } else
+        surface = new PbufferGLSurfaceEGL(size);
+
+      if (!surface->Initialize())
+        return NULL;
+      return surface;
+    }
+    default:
+      NOTREACHED();
+      return NULL;
+  }
+}
+
+EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() {
+  return ui::SurfaceFactoryOzone::GetInstance()->GetNativeDisplay();
+}
+
+}  // namespace gfx