Add an auto-generated dispatch table for GL bindings.

This will more easily allow us to extend our implementation to make a
NULL or "stub" set of bindings. It also exposes a lot more function
permutations via extension variations.

It might improve the loading speed for bindings obtained via
extensions. Instead of generating a list every time an extension is
checked, we use a single std::set for a fast query. However because
more extensions are checked for more entry points, it might not make
a huge difference.

This also fixes an issue where the "real" ANGLE GL headers were being
propagated to the entry point dispatch table definitions, instead of
being in a totally isolated file. This patch adds the missing typedefs
to our proxy headers.

It also fixes the naming of a few entry points which was inconsistent
with the spec. It also makes an XML adjustment to GL_NV_path_rendering
to accomodate a hole in the spec where glLoadMatrixfEXT was not ever
defined in OpenGL ES. A spec oddity with the TexStorage extension is
not resolved - in this case, some methods are only exposed if other
extensions are present, but this information is missing from gl.xml.

BUG=angleproject:2188

Change-Id: I0fd61dd32de6fadd55fa6bd79295833392d51104
Reviewed-on: https://chromium-review.googlesource.com/726949
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
diff --git a/src/libANGLE/Version.h b/src/libANGLE/Version.h
index 4c9730c..7bd4184 100644
--- a/src/libANGLE/Version.h
+++ b/src/libANGLE/Version.h
@@ -9,18 +9,16 @@
 #ifndef LIBANGLE_VERSION_H_
 #define LIBANGLE_VERSION_H_
 
-#include <angle_gl.h>
-
 namespace gl
 {
 
 struct Version
 {
     constexpr Version();
-    constexpr Version(GLuint major, GLuint minor);
+    constexpr Version(unsigned int major, unsigned int minor);
 
-    GLuint major;
-    GLuint minor;
+    unsigned int major;
+    unsigned int minor;
 };
 
 bool operator==(const Version &a, const Version &b);
diff --git a/src/libANGLE/Version.inl b/src/libANGLE/Version.inl
index 4952097..c980548 100644
--- a/src/libANGLE/Version.inl
+++ b/src/libANGLE/Version.inl
@@ -20,7 +20,7 @@
 #undef major
 #undef minor
 
-constexpr Version::Version(GLuint major_, GLuint minor_)
+constexpr Version::Version(unsigned int major_, unsigned int minor_)
     : major(major_),
       minor(minor_)
 {
@@ -56,4 +56,4 @@
     return std::tie(a.major, a.minor) > std::tie(b.major, b.minor);
 }
 
-}
+}  // namespace gl
diff --git a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp
new file mode 100644
index 0000000..418f3a4
--- /dev/null
+++ b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp
@@ -0,0 +1,2733 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_gl_dispatch_table.py using data from gl_bindings_data.json and gl.xml.
+//
+// Copyright 2017 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// DispatchTableGL_autogen.cpp:
+//   Initialize the native bindings for ANGLE's OpenGL back-end.
+
+#include "libANGLE/renderer/gl/DispatchTableGL_autogen.h"
+
+#include "libANGLE/Version.h"
+#include "libANGLE/renderer/gl/FunctionsGL.h"
+
+// Check for nullptr so extensions do not overwrite core imports.
+#define ASSIGN(NAME, FP) \
+    if (!FP)             \
+    *reinterpret_cast<void **>(&FP) = loadProcAddress(NAME)
+
+namespace rx
+{
+
+void DispatchTableGL::initProcsDesktopGL(const gl::Version &version,
+                                         const std::set<std::string> &extensions)
+{
+    if (version >= gl::Version(1, 0))
+    {
+        ASSIGN("glBlendFunc", blendFunc);
+        ASSIGN("glClear", clear);
+        ASSIGN("glClearColor", clearColor);
+        ASSIGN("glClearDepth", clearDepth);
+        ASSIGN("glClearStencil", clearStencil);
+        ASSIGN("glColorMask", colorMask);
+        ASSIGN("glCullFace", cullFace);
+        ASSIGN("glDepthFunc", depthFunc);
+        ASSIGN("glDepthMask", depthMask);
+        ASSIGN("glDepthRange", depthRange);
+        ASSIGN("glDisable", disable);
+        ASSIGN("glDrawBuffer", drawBuffer);
+        ASSIGN("glEnable", enable);
+        ASSIGN("glFinish", finish);
+        ASSIGN("glFlush", flush);
+        ASSIGN("glFrontFace", frontFace);
+        ASSIGN("glGetBooleanv", getBooleanv);
+        ASSIGN("glGetDoublev", getDoublev);
+        ASSIGN("glGetError", getError);
+        ASSIGN("glGetFloatv", getFloatv);
+        ASSIGN("glGetIntegerv", getIntegerv);
+        ASSIGN("glGetString", getString);
+        ASSIGN("glGetTexImage", getTexImage);
+        ASSIGN("glGetTexLevelParameterfv", getTexLevelParameterfv);
+        ASSIGN("glGetTexLevelParameteriv", getTexLevelParameteriv);
+        ASSIGN("glGetTexParameterfv", getTexParameterfv);
+        ASSIGN("glGetTexParameteriv", getTexParameteriv);
+        ASSIGN("glHint", hint);
+        ASSIGN("glIsEnabled", isEnabled);
+        ASSIGN("glLineWidth", lineWidth);
+        ASSIGN("glLogicOp", logicOp);
+        ASSIGN("glPixelStoref", pixelStoref);
+        ASSIGN("glPixelStorei", pixelStorei);
+        ASSIGN("glPointSize", pointSize);
+        ASSIGN("glPolygonMode", polygonMode);
+        ASSIGN("glReadBuffer", readBuffer);
+        ASSIGN("glReadPixels", readPixels);
+        ASSIGN("glScissor", scissor);
+        ASSIGN("glStencilFunc", stencilFunc);
+        ASSIGN("glStencilMask", stencilMask);
+        ASSIGN("glStencilOp", stencilOp);
+        ASSIGN("glTexImage1D", texImage1D);
+        ASSIGN("glTexImage2D", texImage2D);
+        ASSIGN("glTexParameterf", texParameterf);
+        ASSIGN("glTexParameterfv", texParameterfv);
+        ASSIGN("glTexParameteri", texParameteri);
+        ASSIGN("glTexParameteriv", texParameteriv);
+        ASSIGN("glViewport", viewport);
+    }
+
+    if (version >= gl::Version(1, 1))
+    {
+        ASSIGN("glBindTexture", bindTexture);
+        ASSIGN("glCopyTexImage1D", copyTexImage1D);
+        ASSIGN("glCopyTexImage2D", copyTexImage2D);
+        ASSIGN("glCopyTexSubImage1D", copyTexSubImage1D);
+        ASSIGN("glCopyTexSubImage2D", copyTexSubImage2D);
+        ASSIGN("glDeleteTextures", deleteTextures);
+        ASSIGN("glDrawArrays", drawArrays);
+        ASSIGN("glDrawElements", drawElements);
+        ASSIGN("glGenTextures", genTextures);
+        ASSIGN("glIsTexture", isTexture);
+        ASSIGN("glPolygonOffset", polygonOffset);
+        ASSIGN("glTexSubImage1D", texSubImage1D);
+        ASSIGN("glTexSubImage2D", texSubImage2D);
+    }
+
+    if (version >= gl::Version(1, 2))
+    {
+        ASSIGN("glCopyTexSubImage3D", copyTexSubImage3D);
+        ASSIGN("glDrawRangeElements", drawRangeElements);
+        ASSIGN("glTexImage3D", texImage3D);
+        ASSIGN("glTexSubImage3D", texSubImage3D);
+    }
+
+    if (version >= gl::Version(1, 3))
+    {
+        ASSIGN("glActiveTexture", activeTexture);
+        ASSIGN("glCompressedTexImage1D", compressedTexImage1D);
+        ASSIGN("glCompressedTexImage2D", compressedTexImage2D);
+        ASSIGN("glCompressedTexImage3D", compressedTexImage3D);
+        ASSIGN("glCompressedTexSubImage1D", compressedTexSubImage1D);
+        ASSIGN("glCompressedTexSubImage2D", compressedTexSubImage2D);
+        ASSIGN("glCompressedTexSubImage3D", compressedTexSubImage3D);
+        ASSIGN("glGetCompressedTexImage", getCompressedTexImage);
+        ASSIGN("glSampleCoverage", sampleCoverage);
+    }
+
+    if (version >= gl::Version(1, 4))
+    {
+        ASSIGN("glBlendColor", blendColor);
+        ASSIGN("glBlendEquation", blendEquation);
+        ASSIGN("glBlendFuncSeparate", blendFuncSeparate);
+        ASSIGN("glMultiDrawArrays", multiDrawArrays);
+        ASSIGN("glMultiDrawElements", multiDrawElements);
+        ASSIGN("glPointParameterf", pointParameterf);
+        ASSIGN("glPointParameterfv", pointParameterfv);
+        ASSIGN("glPointParameteri", pointParameteri);
+        ASSIGN("glPointParameteriv", pointParameteriv);
+    }
+
+    if (version >= gl::Version(1, 5))
+    {
+        ASSIGN("glBeginQuery", beginQuery);
+        ASSIGN("glBindBuffer", bindBuffer);
+        ASSIGN("glBufferData", bufferData);
+        ASSIGN("glBufferSubData", bufferSubData);
+        ASSIGN("glDeleteBuffers", deleteBuffers);
+        ASSIGN("glDeleteQueries", deleteQueries);
+        ASSIGN("glEndQuery", endQuery);
+        ASSIGN("glGenBuffers", genBuffers);
+        ASSIGN("glGenQueries", genQueries);
+        ASSIGN("glGetBufferParameteriv", getBufferParameteriv);
+        ASSIGN("glGetBufferPointerv", getBufferPointerv);
+        ASSIGN("glGetBufferSubData", getBufferSubData);
+        ASSIGN("glGetQueryObjectiv", getQueryObjectiv);
+        ASSIGN("glGetQueryObjectuiv", getQueryObjectuiv);
+        ASSIGN("glGetQueryiv", getQueryiv);
+        ASSIGN("glIsBuffer", isBuffer);
+        ASSIGN("glIsQuery", isQuery);
+        ASSIGN("glMapBuffer", mapBuffer);
+        ASSIGN("glUnmapBuffer", unmapBuffer);
+    }
+
+    if (version >= gl::Version(2, 0))
+    {
+        ASSIGN("glAttachShader", attachShader);
+        ASSIGN("glBindAttribLocation", bindAttribLocation);
+        ASSIGN("glBlendEquationSeparate", blendEquationSeparate);
+        ASSIGN("glCompileShader", compileShader);
+        ASSIGN("glCreateProgram", createProgram);
+        ASSIGN("glCreateShader", createShader);
+        ASSIGN("glDeleteProgram", deleteProgram);
+        ASSIGN("glDeleteShader", deleteShader);
+        ASSIGN("glDetachShader", detachShader);
+        ASSIGN("glDisableVertexAttribArray", disableVertexAttribArray);
+        ASSIGN("glDrawBuffers", drawBuffers);
+        ASSIGN("glEnableVertexAttribArray", enableVertexAttribArray);
+        ASSIGN("glGetActiveAttrib", getActiveAttrib);
+        ASSIGN("glGetActiveUniform", getActiveUniform);
+        ASSIGN("glGetAttachedShaders", getAttachedShaders);
+        ASSIGN("glGetAttribLocation", getAttribLocation);
+        ASSIGN("glGetProgramInfoLog", getProgramInfoLog);
+        ASSIGN("glGetProgramiv", getProgramiv);
+        ASSIGN("glGetShaderInfoLog", getShaderInfoLog);
+        ASSIGN("glGetShaderSource", getShaderSource);
+        ASSIGN("glGetShaderiv", getShaderiv);
+        ASSIGN("glGetUniformLocation", getUniformLocation);
+        ASSIGN("glGetUniformfv", getUniformfv);
+        ASSIGN("glGetUniformiv", getUniformiv);
+        ASSIGN("glGetVertexAttribPointerv", getVertexAttribPointerv);
+        ASSIGN("glGetVertexAttribdv", getVertexAttribdv);
+        ASSIGN("glGetVertexAttribfv", getVertexAttribfv);
+        ASSIGN("glGetVertexAttribiv", getVertexAttribiv);
+        ASSIGN("glIsProgram", isProgram);
+        ASSIGN("glIsShader", isShader);
+        ASSIGN("glLinkProgram", linkProgram);
+        ASSIGN("glShaderSource", shaderSource);
+        ASSIGN("glStencilFuncSeparate", stencilFuncSeparate);
+        ASSIGN("glStencilMaskSeparate", stencilMaskSeparate);
+        ASSIGN("glStencilOpSeparate", stencilOpSeparate);
+        ASSIGN("glUniform1f", uniform1f);
+        ASSIGN("glUniform1fv", uniform1fv);
+        ASSIGN("glUniform1i", uniform1i);
+        ASSIGN("glUniform1iv", uniform1iv);
+        ASSIGN("glUniform2f", uniform2f);
+        ASSIGN("glUniform2fv", uniform2fv);
+        ASSIGN("glUniform2i", uniform2i);
+        ASSIGN("glUniform2iv", uniform2iv);
+        ASSIGN("glUniform3f", uniform3f);
+        ASSIGN("glUniform3fv", uniform3fv);
+        ASSIGN("glUniform3i", uniform3i);
+        ASSIGN("glUniform3iv", uniform3iv);
+        ASSIGN("glUniform4f", uniform4f);
+        ASSIGN("glUniform4fv", uniform4fv);
+        ASSIGN("glUniform4i", uniform4i);
+        ASSIGN("glUniform4iv", uniform4iv);
+        ASSIGN("glUniformMatrix2fv", uniformMatrix2fv);
+        ASSIGN("glUniformMatrix3fv", uniformMatrix3fv);
+        ASSIGN("glUniformMatrix4fv", uniformMatrix4fv);
+        ASSIGN("glUseProgram", useProgram);
+        ASSIGN("glValidateProgram", validateProgram);
+        ASSIGN("glVertexAttrib1d", vertexAttrib1d);
+        ASSIGN("glVertexAttrib1dv", vertexAttrib1dv);
+        ASSIGN("glVertexAttrib1f", vertexAttrib1f);
+        ASSIGN("glVertexAttrib1fv", vertexAttrib1fv);
+        ASSIGN("glVertexAttrib1s", vertexAttrib1s);
+        ASSIGN("glVertexAttrib1sv", vertexAttrib1sv);
+        ASSIGN("glVertexAttrib2d", vertexAttrib2d);
+        ASSIGN("glVertexAttrib2dv", vertexAttrib2dv);
+        ASSIGN("glVertexAttrib2f", vertexAttrib2f);
+        ASSIGN("glVertexAttrib2fv", vertexAttrib2fv);
+        ASSIGN("glVertexAttrib2s", vertexAttrib2s);
+        ASSIGN("glVertexAttrib2sv", vertexAttrib2sv);
+        ASSIGN("glVertexAttrib3d", vertexAttrib3d);
+        ASSIGN("glVertexAttrib3dv", vertexAttrib3dv);
+        ASSIGN("glVertexAttrib3f", vertexAttrib3f);
+        ASSIGN("glVertexAttrib3fv", vertexAttrib3fv);
+        ASSIGN("glVertexAttrib3s", vertexAttrib3s);
+        ASSIGN("glVertexAttrib3sv", vertexAttrib3sv);
+        ASSIGN("glVertexAttrib4Nbv", vertexAttrib4Nbv);
+        ASSIGN("glVertexAttrib4Niv", vertexAttrib4Niv);
+        ASSIGN("glVertexAttrib4Nsv", vertexAttrib4Nsv);
+        ASSIGN("glVertexAttrib4Nub", vertexAttrib4Nub);
+        ASSIGN("glVertexAttrib4Nubv", vertexAttrib4Nubv);
+        ASSIGN("glVertexAttrib4Nuiv", vertexAttrib4Nuiv);
+        ASSIGN("glVertexAttrib4Nusv", vertexAttrib4Nusv);
+        ASSIGN("glVertexAttrib4bv", vertexAttrib4bv);
+        ASSIGN("glVertexAttrib4d", vertexAttrib4d);
+        ASSIGN("glVertexAttrib4dv", vertexAttrib4dv);
+        ASSIGN("glVertexAttrib4f", vertexAttrib4f);
+        ASSIGN("glVertexAttrib4fv", vertexAttrib4fv);
+        ASSIGN("glVertexAttrib4iv", vertexAttrib4iv);
+        ASSIGN("glVertexAttrib4s", vertexAttrib4s);
+        ASSIGN("glVertexAttrib4sv", vertexAttrib4sv);
+        ASSIGN("glVertexAttrib4ubv", vertexAttrib4ubv);
+        ASSIGN("glVertexAttrib4uiv", vertexAttrib4uiv);
+        ASSIGN("glVertexAttrib4usv", vertexAttrib4usv);
+        ASSIGN("glVertexAttribPointer", vertexAttribPointer);
+    }
+
+    if (version >= gl::Version(2, 1))
+    {
+        ASSIGN("glUniformMatrix2x3fv", uniformMatrix2x3fv);
+        ASSIGN("glUniformMatrix2x4fv", uniformMatrix2x4fv);
+        ASSIGN("glUniformMatrix3x2fv", uniformMatrix3x2fv);
+        ASSIGN("glUniformMatrix3x4fv", uniformMatrix3x4fv);
+        ASSIGN("glUniformMatrix4x2fv", uniformMatrix4x2fv);
+        ASSIGN("glUniformMatrix4x3fv", uniformMatrix4x3fv);
+    }
+
+    if (version >= gl::Version(3, 0))
+    {
+        ASSIGN("glBeginConditionalRender", beginConditionalRender);
+        ASSIGN("glBeginTransformFeedback", beginTransformFeedback);
+        ASSIGN("glBindBufferBase", bindBufferBase);
+        ASSIGN("glBindBufferRange", bindBufferRange);
+        ASSIGN("glBindFragDataLocation", bindFragDataLocation);
+        ASSIGN("glBindFramebuffer", bindFramebuffer);
+        ASSIGN("glBindRenderbuffer", bindRenderbuffer);
+        ASSIGN("glBindVertexArray", bindVertexArray);
+        ASSIGN("glBlitFramebuffer", blitFramebuffer);
+        ASSIGN("glCheckFramebufferStatus", checkFramebufferStatus);
+        ASSIGN("glClampColor", clampColor);
+        ASSIGN("glClearBufferfi", clearBufferfi);
+        ASSIGN("glClearBufferfv", clearBufferfv);
+        ASSIGN("glClearBufferiv", clearBufferiv);
+        ASSIGN("glClearBufferuiv", clearBufferuiv);
+        ASSIGN("glColorMaski", colorMaski);
+        ASSIGN("glDeleteFramebuffers", deleteFramebuffers);
+        ASSIGN("glDeleteRenderbuffers", deleteRenderbuffers);
+        ASSIGN("glDeleteVertexArrays", deleteVertexArrays);
+        ASSIGN("glDisablei", disablei);
+        ASSIGN("glEnablei", enablei);
+        ASSIGN("glEndConditionalRender", endConditionalRender);
+        ASSIGN("glEndTransformFeedback", endTransformFeedback);
+        ASSIGN("glFlushMappedBufferRange", flushMappedBufferRange);
+        ASSIGN("glFramebufferRenderbuffer", framebufferRenderbuffer);
+        ASSIGN("glFramebufferTexture1D", framebufferTexture1D);
+        ASSIGN("glFramebufferTexture2D", framebufferTexture2D);
+        ASSIGN("glFramebufferTexture3D", framebufferTexture3D);
+        ASSIGN("glFramebufferTextureLayer", framebufferTextureLayer);
+        ASSIGN("glGenFramebuffers", genFramebuffers);
+        ASSIGN("glGenRenderbuffers", genRenderbuffers);
+        ASSIGN("glGenVertexArrays", genVertexArrays);
+        ASSIGN("glGenerateMipmap", generateMipmap);
+        ASSIGN("glGetBooleani_v", getBooleani_v);
+        ASSIGN("glGetFragDataLocation", getFragDataLocation);
+        ASSIGN("glGetFramebufferAttachmentParameteriv", getFramebufferAttachmentParameteriv);
+        ASSIGN("glGetIntegeri_v", getIntegeri_v);
+        ASSIGN("glGetRenderbufferParameteriv", getRenderbufferParameteriv);
+        ASSIGN("glGetStringi", getStringi);
+        ASSIGN("glGetTexParameterIiv", getTexParameterIiv);
+        ASSIGN("glGetTexParameterIuiv", getTexParameterIuiv);
+        ASSIGN("glGetTransformFeedbackVarying", getTransformFeedbackVarying);
+        ASSIGN("glGetUniformuiv", getUniformuiv);
+        ASSIGN("glGetVertexAttribIiv", getVertexAttribIiv);
+        ASSIGN("glGetVertexAttribIuiv", getVertexAttribIuiv);
+        ASSIGN("glIsEnabledi", isEnabledi);
+        ASSIGN("glIsFramebuffer", isFramebuffer);
+        ASSIGN("glIsRenderbuffer", isRenderbuffer);
+        ASSIGN("glIsVertexArray", isVertexArray);
+        ASSIGN("glMapBufferRange", mapBufferRange);
+        ASSIGN("glRenderbufferStorage", renderbufferStorage);
+        ASSIGN("glRenderbufferStorageMultisample", renderbufferStorageMultisample);
+        ASSIGN("glTexParameterIiv", texParameterIiv);
+        ASSIGN("glTexParameterIuiv", texParameterIuiv);
+        ASSIGN("glTransformFeedbackVaryings", transformFeedbackVaryings);
+        ASSIGN("glUniform1ui", uniform1ui);
+        ASSIGN("glUniform1uiv", uniform1uiv);
+        ASSIGN("glUniform2ui", uniform2ui);
+        ASSIGN("glUniform2uiv", uniform2uiv);
+        ASSIGN("glUniform3ui", uniform3ui);
+        ASSIGN("glUniform3uiv", uniform3uiv);
+        ASSIGN("glUniform4ui", uniform4ui);
+        ASSIGN("glUniform4uiv", uniform4uiv);
+        ASSIGN("glVertexAttribI1i", vertexAttribI1i);
+        ASSIGN("glVertexAttribI1iv", vertexAttribI1iv);
+        ASSIGN("glVertexAttribI1ui", vertexAttribI1ui);
+        ASSIGN("glVertexAttribI1uiv", vertexAttribI1uiv);
+        ASSIGN("glVertexAttribI2i", vertexAttribI2i);
+        ASSIGN("glVertexAttribI2iv", vertexAttribI2iv);
+        ASSIGN("glVertexAttribI2ui", vertexAttribI2ui);
+        ASSIGN("glVertexAttribI2uiv", vertexAttribI2uiv);
+        ASSIGN("glVertexAttribI3i", vertexAttribI3i);
+        ASSIGN("glVertexAttribI3iv", vertexAttribI3iv);
+        ASSIGN("glVertexAttribI3ui", vertexAttribI3ui);
+        ASSIGN("glVertexAttribI3uiv", vertexAttribI3uiv);
+        ASSIGN("glVertexAttribI4bv", vertexAttribI4bv);
+        ASSIGN("glVertexAttribI4i", vertexAttribI4i);
+        ASSIGN("glVertexAttribI4iv", vertexAttribI4iv);
+        ASSIGN("glVertexAttribI4sv", vertexAttribI4sv);
+        ASSIGN("glVertexAttribI4ubv", vertexAttribI4ubv);
+        ASSIGN("glVertexAttribI4ui", vertexAttribI4ui);
+        ASSIGN("glVertexAttribI4uiv", vertexAttribI4uiv);
+        ASSIGN("glVertexAttribI4usv", vertexAttribI4usv);
+        ASSIGN("glVertexAttribIPointer", vertexAttribIPointer);
+    }
+
+    if (version >= gl::Version(3, 1))
+    {
+        ASSIGN("glCopyBufferSubData", copyBufferSubData);
+        ASSIGN("glDrawArraysInstanced", drawArraysInstanced);
+        ASSIGN("glDrawElementsInstanced", drawElementsInstanced);
+        ASSIGN("glGetActiveUniformBlockName", getActiveUniformBlockName);
+        ASSIGN("glGetActiveUniformBlockiv", getActiveUniformBlockiv);
+        ASSIGN("glGetActiveUniformName", getActiveUniformName);
+        ASSIGN("glGetActiveUniformsiv", getActiveUniformsiv);
+        ASSIGN("glGetUniformBlockIndex", getUniformBlockIndex);
+        ASSIGN("glGetUniformIndices", getUniformIndices);
+        ASSIGN("glPrimitiveRestartIndex", primitiveRestartIndex);
+        ASSIGN("glTexBuffer", texBuffer);
+        ASSIGN("glUniformBlockBinding", uniformBlockBinding);
+    }
+
+    if (version >= gl::Version(3, 2))
+    {
+        ASSIGN("glClientWaitSync", clientWaitSync);
+        ASSIGN("glDeleteSync", deleteSync);
+        ASSIGN("glDrawElementsBaseVertex", drawElementsBaseVertex);
+        ASSIGN("glDrawElementsInstancedBaseVertex", drawElementsInstancedBaseVertex);
+        ASSIGN("glDrawRangeElementsBaseVertex", drawRangeElementsBaseVertex);
+        ASSIGN("glFenceSync", fenceSync);
+        ASSIGN("glFramebufferTexture", framebufferTexture);
+        ASSIGN("glGetBufferParameteri64v", getBufferParameteri64v);
+        ASSIGN("glGetInteger64i_v", getInteger64i_v);
+        ASSIGN("glGetInteger64v", getInteger64v);
+        ASSIGN("glGetMultisamplefv", getMultisamplefv);
+        ASSIGN("glGetSynciv", getSynciv);
+        ASSIGN("glIsSync", isSync);
+        ASSIGN("glMultiDrawElementsBaseVertex", multiDrawElementsBaseVertex);
+        ASSIGN("glProvokingVertex", provokingVertex);
+        ASSIGN("glSampleMaski", sampleMaski);
+        ASSIGN("glTexImage2DMultisample", texImage2DMultisample);
+        ASSIGN("glTexImage3DMultisample", texImage3DMultisample);
+        ASSIGN("glWaitSync", waitSync);
+    }
+
+    if (version >= gl::Version(3, 3))
+    {
+        ASSIGN("glBindFragDataLocationIndexed", bindFragDataLocationIndexed);
+        ASSIGN("glBindSampler", bindSampler);
+        ASSIGN("glDeleteSamplers", deleteSamplers);
+        ASSIGN("glGenSamplers", genSamplers);
+        ASSIGN("glGetFragDataIndex", getFragDataIndex);
+        ASSIGN("glGetQueryObjecti64v", getQueryObjecti64v);
+        ASSIGN("glGetQueryObjectui64v", getQueryObjectui64v);
+        ASSIGN("glGetSamplerParameterIiv", getSamplerParameterIiv);
+        ASSIGN("glGetSamplerParameterIuiv", getSamplerParameterIuiv);
+        ASSIGN("glGetSamplerParameterfv", getSamplerParameterfv);
+        ASSIGN("glGetSamplerParameteriv", getSamplerParameteriv);
+        ASSIGN("glIsSampler", isSampler);
+        ASSIGN("glQueryCounter", queryCounter);
+        ASSIGN("glSamplerParameterIiv", samplerParameterIiv);
+        ASSIGN("glSamplerParameterIuiv", samplerParameterIuiv);
+        ASSIGN("glSamplerParameterf", samplerParameterf);
+        ASSIGN("glSamplerParameterfv", samplerParameterfv);
+        ASSIGN("glSamplerParameteri", samplerParameteri);
+        ASSIGN("glSamplerParameteriv", samplerParameteriv);
+        ASSIGN("glVertexAttribDivisor", vertexAttribDivisor);
+        ASSIGN("glVertexAttribP1ui", vertexAttribP1ui);
+        ASSIGN("glVertexAttribP1uiv", vertexAttribP1uiv);
+        ASSIGN("glVertexAttribP2ui", vertexAttribP2ui);
+        ASSIGN("glVertexAttribP2uiv", vertexAttribP2uiv);
+        ASSIGN("glVertexAttribP3ui", vertexAttribP3ui);
+        ASSIGN("glVertexAttribP3uiv", vertexAttribP3uiv);
+        ASSIGN("glVertexAttribP4ui", vertexAttribP4ui);
+        ASSIGN("glVertexAttribP4uiv", vertexAttribP4uiv);
+    }
+
+    if (version >= gl::Version(4, 0))
+    {
+        ASSIGN("glBeginQueryIndexed", beginQueryIndexed);
+        ASSIGN("glBindTransformFeedback", bindTransformFeedback);
+        ASSIGN("glBlendEquationSeparatei", blendEquationSeparatei);
+        ASSIGN("glBlendEquationi", blendEquationi);
+        ASSIGN("glBlendFuncSeparatei", blendFuncSeparatei);
+        ASSIGN("glBlendFunci", blendFunci);
+        ASSIGN("glDeleteTransformFeedbacks", deleteTransformFeedbacks);
+        ASSIGN("glDrawArraysIndirect", drawArraysIndirect);
+        ASSIGN("glDrawElementsIndirect", drawElementsIndirect);
+        ASSIGN("glDrawTransformFeedback", drawTransformFeedback);
+        ASSIGN("glDrawTransformFeedbackStream", drawTransformFeedbackStream);
+        ASSIGN("glEndQueryIndexed", endQueryIndexed);
+        ASSIGN("glGenTransformFeedbacks", genTransformFeedbacks);
+        ASSIGN("glGetActiveSubroutineName", getActiveSubroutineName);
+        ASSIGN("glGetActiveSubroutineUniformName", getActiveSubroutineUniformName);
+        ASSIGN("glGetActiveSubroutineUniformiv", getActiveSubroutineUniformiv);
+        ASSIGN("glGetProgramStageiv", getProgramStageiv);
+        ASSIGN("glGetQueryIndexediv", getQueryIndexediv);
+        ASSIGN("glGetSubroutineIndex", getSubroutineIndex);
+        ASSIGN("glGetSubroutineUniformLocation", getSubroutineUniformLocation);
+        ASSIGN("glGetUniformSubroutineuiv", getUniformSubroutineuiv);
+        ASSIGN("glGetUniformdv", getUniformdv);
+        ASSIGN("glIsTransformFeedback", isTransformFeedback);
+        ASSIGN("glMinSampleShading", minSampleShading);
+        ASSIGN("glPatchParameterfv", patchParameterfv);
+        ASSIGN("glPatchParameteri", patchParameteri);
+        ASSIGN("glPauseTransformFeedback", pauseTransformFeedback);
+        ASSIGN("glResumeTransformFeedback", resumeTransformFeedback);
+        ASSIGN("glUniform1d", uniform1d);
+        ASSIGN("glUniform1dv", uniform1dv);
+        ASSIGN("glUniform2d", uniform2d);
+        ASSIGN("glUniform2dv", uniform2dv);
+        ASSIGN("glUniform3d", uniform3d);
+        ASSIGN("glUniform3dv", uniform3dv);
+        ASSIGN("glUniform4d", uniform4d);
+        ASSIGN("glUniform4dv", uniform4dv);
+        ASSIGN("glUniformMatrix2dv", uniformMatrix2dv);
+        ASSIGN("glUniformMatrix2x3dv", uniformMatrix2x3dv);
+        ASSIGN("glUniformMatrix2x4dv", uniformMatrix2x4dv);
+        ASSIGN("glUniformMatrix3dv", uniformMatrix3dv);
+        ASSIGN("glUniformMatrix3x2dv", uniformMatrix3x2dv);
+        ASSIGN("glUniformMatrix3x4dv", uniformMatrix3x4dv);
+        ASSIGN("glUniformMatrix4dv", uniformMatrix4dv);
+        ASSIGN("glUniformMatrix4x2dv", uniformMatrix4x2dv);
+        ASSIGN("glUniformMatrix4x3dv", uniformMatrix4x3dv);
+        ASSIGN("glUniformSubroutinesuiv", uniformSubroutinesuiv);
+    }
+
+    if (version >= gl::Version(4, 1))
+    {
+        ASSIGN("glActiveShaderProgram", activeShaderProgram);
+        ASSIGN("glBindProgramPipeline", bindProgramPipeline);
+        ASSIGN("glClearDepthf", clearDepthf);
+        ASSIGN("glCreateShaderProgramv", createShaderProgramv);
+        ASSIGN("glDeleteProgramPipelines", deleteProgramPipelines);
+        ASSIGN("glDepthRangeArrayv", depthRangeArrayv);
+        ASSIGN("glDepthRangeIndexed", depthRangeIndexed);
+        ASSIGN("glDepthRangef", depthRangef);
+        ASSIGN("glGenProgramPipelines", genProgramPipelines);
+        ASSIGN("glGetDoublei_v", getDoublei_v);
+        ASSIGN("glGetFloati_v", getFloati_v);
+        ASSIGN("glGetProgramBinary", getProgramBinary);
+        ASSIGN("glGetProgramPipelineInfoLog", getProgramPipelineInfoLog);
+        ASSIGN("glGetProgramPipelineiv", getProgramPipelineiv);
+        ASSIGN("glGetShaderPrecisionFormat", getShaderPrecisionFormat);
+        ASSIGN("glGetVertexAttribLdv", getVertexAttribLdv);
+        ASSIGN("glIsProgramPipeline", isProgramPipeline);
+        ASSIGN("glProgramBinary", programBinary);
+        ASSIGN("glProgramParameteri", programParameteri);
+        ASSIGN("glProgramUniform1d", programUniform1d);
+        ASSIGN("glProgramUniform1dv", programUniform1dv);
+        ASSIGN("glProgramUniform1f", programUniform1f);
+        ASSIGN("glProgramUniform1fv", programUniform1fv);
+        ASSIGN("glProgramUniform1i", programUniform1i);
+        ASSIGN("glProgramUniform1iv", programUniform1iv);
+        ASSIGN("glProgramUniform1ui", programUniform1ui);
+        ASSIGN("glProgramUniform1uiv", programUniform1uiv);
+        ASSIGN("glProgramUniform2d", programUniform2d);
+        ASSIGN("glProgramUniform2dv", programUniform2dv);
+        ASSIGN("glProgramUniform2f", programUniform2f);
+        ASSIGN("glProgramUniform2fv", programUniform2fv);
+        ASSIGN("glProgramUniform2i", programUniform2i);
+        ASSIGN("glProgramUniform2iv", programUniform2iv);
+        ASSIGN("glProgramUniform2ui", programUniform2ui);
+        ASSIGN("glProgramUniform2uiv", programUniform2uiv);
+        ASSIGN("glProgramUniform3d", programUniform3d);
+        ASSIGN("glProgramUniform3dv", programUniform3dv);
+        ASSIGN("glProgramUniform3f", programUniform3f);
+        ASSIGN("glProgramUniform3fv", programUniform3fv);
+        ASSIGN("glProgramUniform3i", programUniform3i);
+        ASSIGN("glProgramUniform3iv", programUniform3iv);
+        ASSIGN("glProgramUniform3ui", programUniform3ui);
+        ASSIGN("glProgramUniform3uiv", programUniform3uiv);
+        ASSIGN("glProgramUniform4d", programUniform4d);
+        ASSIGN("glProgramUniform4dv", programUniform4dv);
+        ASSIGN("glProgramUniform4f", programUniform4f);
+        ASSIGN("glProgramUniform4fv", programUniform4fv);
+        ASSIGN("glProgramUniform4i", programUniform4i);
+        ASSIGN("glProgramUniform4iv", programUniform4iv);
+        ASSIGN("glProgramUniform4ui", programUniform4ui);
+        ASSIGN("glProgramUniform4uiv", programUniform4uiv);
+        ASSIGN("glProgramUniformMatrix2dv", programUniformMatrix2dv);
+        ASSIGN("glProgramUniformMatrix2fv", programUniformMatrix2fv);
+        ASSIGN("glProgramUniformMatrix2x3dv", programUniformMatrix2x3dv);
+        ASSIGN("glProgramUniformMatrix2x3fv", programUniformMatrix2x3fv);
+        ASSIGN("glProgramUniformMatrix2x4dv", programUniformMatrix2x4dv);
+        ASSIGN("glProgramUniformMatrix2x4fv", programUniformMatrix2x4fv);
+        ASSIGN("glProgramUniformMatrix3dv", programUniformMatrix3dv);
+        ASSIGN("glProgramUniformMatrix3fv", programUniformMatrix3fv);
+        ASSIGN("glProgramUniformMatrix3x2dv", programUniformMatrix3x2dv);
+        ASSIGN("glProgramUniformMatrix3x2fv", programUniformMatrix3x2fv);
+        ASSIGN("glProgramUniformMatrix3x4dv", programUniformMatrix3x4dv);
+        ASSIGN("glProgramUniformMatrix3x4fv", programUniformMatrix3x4fv);
+        ASSIGN("glProgramUniformMatrix4dv", programUniformMatrix4dv);
+        ASSIGN("glProgramUniformMatrix4fv", programUniformMatrix4fv);
+        ASSIGN("glProgramUniformMatrix4x2dv", programUniformMatrix4x2dv);
+        ASSIGN("glProgramUniformMatrix4x2fv", programUniformMatrix4x2fv);
+        ASSIGN("glProgramUniformMatrix4x3dv", programUniformMatrix4x3dv);
+        ASSIGN("glProgramUniformMatrix4x3fv", programUniformMatrix4x3fv);
+        ASSIGN("glReleaseShaderCompiler", releaseShaderCompiler);
+        ASSIGN("glScissorArrayv", scissorArrayv);
+        ASSIGN("glScissorIndexed", scissorIndexed);
+        ASSIGN("glScissorIndexedv", scissorIndexedv);
+        ASSIGN("glShaderBinary", shaderBinary);
+        ASSIGN("glUseProgramStages", useProgramStages);
+        ASSIGN("glValidateProgramPipeline", validateProgramPipeline);
+        ASSIGN("glVertexAttribL1d", vertexAttribL1d);
+        ASSIGN("glVertexAttribL1dv", vertexAttribL1dv);
+        ASSIGN("glVertexAttribL2d", vertexAttribL2d);
+        ASSIGN("glVertexAttribL2dv", vertexAttribL2dv);
+        ASSIGN("glVertexAttribL3d", vertexAttribL3d);
+        ASSIGN("glVertexAttribL3dv", vertexAttribL3dv);
+        ASSIGN("glVertexAttribL4d", vertexAttribL4d);
+        ASSIGN("glVertexAttribL4dv", vertexAttribL4dv);
+        ASSIGN("glVertexAttribLPointer", vertexAttribLPointer);
+        ASSIGN("glViewportArrayv", viewportArrayv);
+        ASSIGN("glViewportIndexedf", viewportIndexedf);
+        ASSIGN("glViewportIndexedfv", viewportIndexedfv);
+    }
+
+    if (version >= gl::Version(4, 2))
+    {
+        ASSIGN("glBindImageTexture", bindImageTexture);
+        ASSIGN("glDrawArraysInstancedBaseInstance", drawArraysInstancedBaseInstance);
+        ASSIGN("glDrawElementsInstancedBaseInstance", drawElementsInstancedBaseInstance);
+        ASSIGN("glDrawElementsInstancedBaseVertexBaseInstance",
+               drawElementsInstancedBaseVertexBaseInstance);
+        ASSIGN("glDrawTransformFeedbackInstanced", drawTransformFeedbackInstanced);
+        ASSIGN("glDrawTransformFeedbackStreamInstanced", drawTransformFeedbackStreamInstanced);
+        ASSIGN("glGetActiveAtomicCounterBufferiv", getActiveAtomicCounterBufferiv);
+        ASSIGN("glGetInternalformativ", getInternalformativ);
+        ASSIGN("glMemoryBarrier", memoryBarrier);
+        ASSIGN("glTexStorage1D", texStorage1D);
+        ASSIGN("glTexStorage2D", texStorage2D);
+        ASSIGN("glTexStorage3D", texStorage3D);
+    }
+
+    if (version >= gl::Version(4, 3))
+    {
+        ASSIGN("glBindVertexBuffer", bindVertexBuffer);
+        ASSIGN("glClearBufferData", clearBufferData);
+        ASSIGN("glClearBufferSubData", clearBufferSubData);
+        ASSIGN("glCopyImageSubData", copyImageSubData);
+        ASSIGN("glDebugMessageCallback", debugMessageCallback);
+        ASSIGN("glDebugMessageControl", debugMessageControl);
+        ASSIGN("glDebugMessageInsert", debugMessageInsert);
+        ASSIGN("glDispatchCompute", dispatchCompute);
+        ASSIGN("glDispatchComputeIndirect", dispatchComputeIndirect);
+        ASSIGN("glFramebufferParameteri", framebufferParameteri);
+        ASSIGN("glGetDebugMessageLog", getDebugMessageLog);
+        ASSIGN("glGetFramebufferParameteriv", getFramebufferParameteriv);
+        ASSIGN("glGetInternalformati64v", getInternalformati64v);
+        ASSIGN("glGetObjectLabel", getObjectLabel);
+        ASSIGN("glGetObjectPtrLabel", getObjectPtrLabel);
+        ASSIGN("glGetPointerv", getPointerv);
+        ASSIGN("glGetProgramInterfaceiv", getProgramInterfaceiv);
+        ASSIGN("glGetProgramResourceIndex", getProgramResourceIndex);
+        ASSIGN("glGetProgramResourceLocation", getProgramResourceLocation);
+        ASSIGN("glGetProgramResourceLocationIndex", getProgramResourceLocationIndex);
+        ASSIGN("glGetProgramResourceName", getProgramResourceName);
+        ASSIGN("glGetProgramResourceiv", getProgramResourceiv);
+        ASSIGN("glInvalidateBufferData", invalidateBufferData);
+        ASSIGN("glInvalidateBufferSubData", invalidateBufferSubData);
+        ASSIGN("glInvalidateFramebuffer", invalidateFramebuffer);
+        ASSIGN("glInvalidateSubFramebuffer", invalidateSubFramebuffer);
+        ASSIGN("glInvalidateTexImage", invalidateTexImage);
+        ASSIGN("glInvalidateTexSubImage", invalidateTexSubImage);
+        ASSIGN("glMultiDrawArraysIndirect", multiDrawArraysIndirect);
+        ASSIGN("glMultiDrawElementsIndirect", multiDrawElementsIndirect);
+        ASSIGN("glObjectLabel", objectLabel);
+        ASSIGN("glObjectPtrLabel", objectPtrLabel);
+        ASSIGN("glPopDebugGroup", popDebugGroup);
+        ASSIGN("glPushDebugGroup", pushDebugGroup);
+        ASSIGN("glShaderStorageBlockBinding", shaderStorageBlockBinding);
+        ASSIGN("glTexBufferRange", texBufferRange);
+        ASSIGN("glTexStorage2DMultisample", texStorage2DMultisample);
+        ASSIGN("glTexStorage3DMultisample", texStorage3DMultisample);
+        ASSIGN("glTextureView", textureView);
+        ASSIGN("glVertexAttribBinding", vertexAttribBinding);
+        ASSIGN("glVertexAttribFormat", vertexAttribFormat);
+        ASSIGN("glVertexAttribIFormat", vertexAttribIFormat);
+        ASSIGN("glVertexAttribLFormat", vertexAttribLFormat);
+        ASSIGN("glVertexBindingDivisor", vertexBindingDivisor);
+    }
+
+    if (version >= gl::Version(4, 4))
+    {
+        ASSIGN("glBindBuffersBase", bindBuffersBase);
+        ASSIGN("glBindBuffersRange", bindBuffersRange);
+        ASSIGN("glBindImageTextures", bindImageTextures);
+        ASSIGN("glBindSamplers", bindSamplers);
+        ASSIGN("glBindTextures", bindTextures);
+        ASSIGN("glBindVertexBuffers", bindVertexBuffers);
+        ASSIGN("glBufferStorage", bufferStorage);
+        ASSIGN("glClearTexImage", clearTexImage);
+        ASSIGN("glClearTexSubImage", clearTexSubImage);
+    }
+
+    if (version >= gl::Version(4, 5))
+    {
+        ASSIGN("glBindTextureUnit", bindTextureUnit);
+        ASSIGN("glBlitNamedFramebuffer", blitNamedFramebuffer);
+        ASSIGN("glCheckNamedFramebufferStatus", checkNamedFramebufferStatus);
+        ASSIGN("glClearNamedBufferData", clearNamedBufferData);
+        ASSIGN("glClearNamedBufferSubData", clearNamedBufferSubData);
+        ASSIGN("glClearNamedFramebufferfi", clearNamedFramebufferfi);
+        ASSIGN("glClearNamedFramebufferfv", clearNamedFramebufferfv);
+        ASSIGN("glClearNamedFramebufferiv", clearNamedFramebufferiv);
+        ASSIGN("glClearNamedFramebufferuiv", clearNamedFramebufferuiv);
+        ASSIGN("glClipControl", clipControl);
+        ASSIGN("glCompressedTextureSubImage1D", compressedTextureSubImage1D);
+        ASSIGN("glCompressedTextureSubImage2D", compressedTextureSubImage2D);
+        ASSIGN("glCompressedTextureSubImage3D", compressedTextureSubImage3D);
+        ASSIGN("glCopyNamedBufferSubData", copyNamedBufferSubData);
+        ASSIGN("glCopyTextureSubImage1D", copyTextureSubImage1D);
+        ASSIGN("glCopyTextureSubImage2D", copyTextureSubImage2D);
+        ASSIGN("glCopyTextureSubImage3D", copyTextureSubImage3D);
+        ASSIGN("glCreateBuffers", createBuffers);
+        ASSIGN("glCreateFramebuffers", createFramebuffers);
+        ASSIGN("glCreateProgramPipelines", createProgramPipelines);
+        ASSIGN("glCreateQueries", createQueries);
+        ASSIGN("glCreateRenderbuffers", createRenderbuffers);
+        ASSIGN("glCreateSamplers", createSamplers);
+        ASSIGN("glCreateTextures", createTextures);
+        ASSIGN("glCreateTransformFeedbacks", createTransformFeedbacks);
+        ASSIGN("glCreateVertexArrays", createVertexArrays);
+        ASSIGN("glDisableVertexArrayAttrib", disableVertexArrayAttrib);
+        ASSIGN("glEnableVertexArrayAttrib", enableVertexArrayAttrib);
+        ASSIGN("glFlushMappedNamedBufferRange", flushMappedNamedBufferRange);
+        ASSIGN("glGenerateTextureMipmap", generateTextureMipmap);
+        ASSIGN("glGetCompressedTextureImage", getCompressedTextureImage);
+        ASSIGN("glGetCompressedTextureSubImage", getCompressedTextureSubImage);
+        ASSIGN("glGetGraphicsResetStatus", getGraphicsResetStatus);
+        ASSIGN("glGetNamedBufferParameteri64v", getNamedBufferParameteri64v);
+        ASSIGN("glGetNamedBufferParameteriv", getNamedBufferParameteriv);
+        ASSIGN("glGetNamedBufferPointerv", getNamedBufferPointerv);
+        ASSIGN("glGetNamedBufferSubData", getNamedBufferSubData);
+        ASSIGN("glGetNamedFramebufferAttachmentParameteriv",
+               getNamedFramebufferAttachmentParameteriv);
+        ASSIGN("glGetNamedFramebufferParameteriv", getNamedFramebufferParameteriv);
+        ASSIGN("glGetNamedRenderbufferParameteriv", getNamedRenderbufferParameteriv);
+        ASSIGN("glGetQueryBufferObjecti64v", getQueryBufferObjecti64v);
+        ASSIGN("glGetQueryBufferObjectiv", getQueryBufferObjectiv);
+        ASSIGN("glGetQueryBufferObjectui64v", getQueryBufferObjectui64v);
+        ASSIGN("glGetQueryBufferObjectuiv", getQueryBufferObjectuiv);
+        ASSIGN("glGetTextureImage", getTextureImage);
+        ASSIGN("glGetTextureLevelParameterfv", getTextureLevelParameterfv);
+        ASSIGN("glGetTextureLevelParameteriv", getTextureLevelParameteriv);
+        ASSIGN("glGetTextureParameterIiv", getTextureParameterIiv);
+        ASSIGN("glGetTextureParameterIuiv", getTextureParameterIuiv);
+        ASSIGN("glGetTextureParameterfv", getTextureParameterfv);
+        ASSIGN("glGetTextureParameteriv", getTextureParameteriv);
+        ASSIGN("glGetTextureSubImage", getTextureSubImage);
+        ASSIGN("glGetTransformFeedbacki64_v", getTransformFeedbacki64_v);
+        ASSIGN("glGetTransformFeedbacki_v", getTransformFeedbacki_v);
+        ASSIGN("glGetTransformFeedbackiv", getTransformFeedbackiv);
+        ASSIGN("glGetVertexArrayIndexed64iv", getVertexArrayIndexed64iv);
+        ASSIGN("glGetVertexArrayIndexediv", getVertexArrayIndexediv);
+        ASSIGN("glGetVertexArrayiv", getVertexArrayiv);
+        ASSIGN("glGetnCompressedTexImage", getnCompressedTexImage);
+        ASSIGN("glGetnTexImage", getnTexImage);
+        ASSIGN("glGetnUniformdv", getnUniformdv);
+        ASSIGN("glGetnUniformfv", getnUniformfv);
+        ASSIGN("glGetnUniformiv", getnUniformiv);
+        ASSIGN("glGetnUniformuiv", getnUniformuiv);
+        ASSIGN("glInvalidateNamedFramebufferData", invalidateNamedFramebufferData);
+        ASSIGN("glInvalidateNamedFramebufferSubData", invalidateNamedFramebufferSubData);
+        ASSIGN("glMapNamedBuffer", mapNamedBuffer);
+        ASSIGN("glMapNamedBufferRange", mapNamedBufferRange);
+        ASSIGN("glMemoryBarrierByRegion", memoryBarrierByRegion);
+        ASSIGN("glNamedBufferData", namedBufferData);
+        ASSIGN("glNamedBufferStorage", namedBufferStorage);
+        ASSIGN("glNamedBufferSubData", namedBufferSubData);
+        ASSIGN("glNamedFramebufferDrawBuffer", namedFramebufferDrawBuffer);
+        ASSIGN("glNamedFramebufferDrawBuffers", namedFramebufferDrawBuffers);
+        ASSIGN("glNamedFramebufferParameteri", namedFramebufferParameteri);
+        ASSIGN("glNamedFramebufferReadBuffer", namedFramebufferReadBuffer);
+        ASSIGN("glNamedFramebufferRenderbuffer", namedFramebufferRenderbuffer);
+        ASSIGN("glNamedFramebufferTexture", namedFramebufferTexture);
+        ASSIGN("glNamedFramebufferTextureLayer", namedFramebufferTextureLayer);
+        ASSIGN("glNamedRenderbufferStorage", namedRenderbufferStorage);
+        ASSIGN("glNamedRenderbufferStorageMultisample", namedRenderbufferStorageMultisample);
+        ASSIGN("glReadnPixels", readnPixels);
+        ASSIGN("glTextureBarrier", textureBarrier);
+        ASSIGN("glTextureBuffer", textureBuffer);
+        ASSIGN("glTextureBufferRange", textureBufferRange);
+        ASSIGN("glTextureParameterIiv", textureParameterIiv);
+        ASSIGN("glTextureParameterIuiv", textureParameterIuiv);
+        ASSIGN("glTextureParameterf", textureParameterf);
+        ASSIGN("glTextureParameterfv", textureParameterfv);
+        ASSIGN("glTextureParameteri", textureParameteri);
+        ASSIGN("glTextureParameteriv", textureParameteriv);
+        ASSIGN("glTextureStorage1D", textureStorage1D);
+        ASSIGN("glTextureStorage2D", textureStorage2D);
+        ASSIGN("glTextureStorage2DMultisample", textureStorage2DMultisample);
+        ASSIGN("glTextureStorage3D", textureStorage3D);
+        ASSIGN("glTextureStorage3DMultisample", textureStorage3DMultisample);
+        ASSIGN("glTextureSubImage1D", textureSubImage1D);
+        ASSIGN("glTextureSubImage2D", textureSubImage2D);
+        ASSIGN("glTextureSubImage3D", textureSubImage3D);
+        ASSIGN("glTransformFeedbackBufferBase", transformFeedbackBufferBase);
+        ASSIGN("glTransformFeedbackBufferRange", transformFeedbackBufferRange);
+        ASSIGN("glUnmapNamedBuffer", unmapNamedBuffer);
+        ASSIGN("glVertexArrayAttribBinding", vertexArrayAttribBinding);
+        ASSIGN("glVertexArrayAttribFormat", vertexArrayAttribFormat);
+        ASSIGN("glVertexArrayAttribIFormat", vertexArrayAttribIFormat);
+        ASSIGN("glVertexArrayAttribLFormat", vertexArrayAttribLFormat);
+        ASSIGN("glVertexArrayBindingDivisor", vertexArrayBindingDivisor);
+        ASSIGN("glVertexArrayElementBuffer", vertexArrayElementBuffer);
+        ASSIGN("glVertexArrayVertexBuffer", vertexArrayVertexBuffer);
+        ASSIGN("glVertexArrayVertexBuffers", vertexArrayVertexBuffers);
+    }
+
+    if (extensions.count("GL_ARB_ES2_compatibility") != 0)
+    {
+        ASSIGN("glClearDepthf", clearDepthf);
+        ASSIGN("glDepthRangef", depthRangef);
+        ASSIGN("glGetShaderPrecisionFormat", getShaderPrecisionFormat);
+        ASSIGN("glReleaseShaderCompiler", releaseShaderCompiler);
+        ASSIGN("glShaderBinary", shaderBinary);
+    }
+
+    if (extensions.count("GL_ARB_ES3_1_compatibility") != 0)
+    {
+        ASSIGN("glMemoryBarrierByRegion", memoryBarrierByRegion);
+    }
+
+    if (extensions.count("GL_ARB_ES3_2_compatibility") != 0)
+    {
+        ASSIGN("glPrimitiveBoundingBoxARB", primitiveBoundingBox);
+    }
+
+    if (extensions.count("GL_ARB_base_instance") != 0)
+    {
+        ASSIGN("glDrawArraysInstancedBaseInstance", drawArraysInstancedBaseInstance);
+        ASSIGN("glDrawElementsInstancedBaseInstance", drawElementsInstancedBaseInstance);
+        ASSIGN("glDrawElementsInstancedBaseVertexBaseInstance",
+               drawElementsInstancedBaseVertexBaseInstance);
+    }
+
+    if (extensions.count("GL_ARB_blend_func_extended") != 0)
+    {
+        ASSIGN("glBindFragDataLocationIndexed", bindFragDataLocationIndexed);
+        ASSIGN("glGetFragDataIndex", getFragDataIndex);
+    }
+
+    if (extensions.count("GL_ARB_buffer_storage") != 0)
+    {
+        ASSIGN("glBufferStorage", bufferStorage);
+    }
+
+    if (extensions.count("GL_ARB_clear_buffer_object") != 0)
+    {
+        ASSIGN("glClearBufferData", clearBufferData);
+        ASSIGN("glClearBufferSubData", clearBufferSubData);
+    }
+
+    if (extensions.count("GL_ARB_clear_texture") != 0)
+    {
+        ASSIGN("glClearTexImage", clearTexImage);
+        ASSIGN("glClearTexSubImage", clearTexSubImage);
+    }
+
+    if (extensions.count("GL_ARB_clip_control") != 0)
+    {
+        ASSIGN("glClipControl", clipControl);
+    }
+
+    if (extensions.count("GL_ARB_color_buffer_float") != 0)
+    {
+        ASSIGN("glClampColorARB", clampColor);
+    }
+
+    if (extensions.count("GL_ARB_compute_shader") != 0)
+    {
+        ASSIGN("glDispatchCompute", dispatchCompute);
+        ASSIGN("glDispatchComputeIndirect", dispatchComputeIndirect);
+    }
+
+    if (extensions.count("GL_ARB_copy_buffer") != 0)
+    {
+        ASSIGN("glCopyBufferSubData", copyBufferSubData);
+    }
+
+    if (extensions.count("GL_ARB_copy_image") != 0)
+    {
+        ASSIGN("glCopyImageSubData", copyImageSubData);
+    }
+
+    if (extensions.count("GL_ARB_debug_output") != 0)
+    {
+        ASSIGN("glDebugMessageCallbackARB", debugMessageCallback);
+        ASSIGN("glDebugMessageControlARB", debugMessageControl);
+        ASSIGN("glDebugMessageInsertARB", debugMessageInsert);
+        ASSIGN("glGetDebugMessageLogARB", getDebugMessageLog);
+    }
+
+    if (extensions.count("GL_ARB_direct_state_access") != 0)
+    {
+        ASSIGN("glBindTextureUnit", bindTextureUnit);
+        ASSIGN("glBlitNamedFramebuffer", blitNamedFramebuffer);
+        ASSIGN("glCheckNamedFramebufferStatus", checkNamedFramebufferStatus);
+        ASSIGN("glClearNamedBufferData", clearNamedBufferData);
+        ASSIGN("glClearNamedBufferSubData", clearNamedBufferSubData);
+        ASSIGN("glClearNamedFramebufferfi", clearNamedFramebufferfi);
+        ASSIGN("glClearNamedFramebufferfv", clearNamedFramebufferfv);
+        ASSIGN("glClearNamedFramebufferiv", clearNamedFramebufferiv);
+        ASSIGN("glClearNamedFramebufferuiv", clearNamedFramebufferuiv);
+        ASSIGN("glCompressedTextureSubImage1D", compressedTextureSubImage1D);
+        ASSIGN("glCompressedTextureSubImage2D", compressedTextureSubImage2D);
+        ASSIGN("glCompressedTextureSubImage3D", compressedTextureSubImage3D);
+        ASSIGN("glCopyNamedBufferSubData", copyNamedBufferSubData);
+        ASSIGN("glCopyTextureSubImage1D", copyTextureSubImage1D);
+        ASSIGN("glCopyTextureSubImage2D", copyTextureSubImage2D);
+        ASSIGN("glCopyTextureSubImage3D", copyTextureSubImage3D);
+        ASSIGN("glCreateBuffers", createBuffers);
+        ASSIGN("glCreateFramebuffers", createFramebuffers);
+        ASSIGN("glCreateProgramPipelines", createProgramPipelines);
+        ASSIGN("glCreateQueries", createQueries);
+        ASSIGN("glCreateRenderbuffers", createRenderbuffers);
+        ASSIGN("glCreateSamplers", createSamplers);
+        ASSIGN("glCreateTextures", createTextures);
+        ASSIGN("glCreateTransformFeedbacks", createTransformFeedbacks);
+        ASSIGN("glCreateVertexArrays", createVertexArrays);
+        ASSIGN("glDisableVertexArrayAttrib", disableVertexArrayAttrib);
+        ASSIGN("glEnableVertexArrayAttrib", enableVertexArrayAttrib);
+        ASSIGN("glFlushMappedNamedBufferRange", flushMappedNamedBufferRange);
+        ASSIGN("glGenerateTextureMipmap", generateTextureMipmap);
+        ASSIGN("glGetCompressedTextureImage", getCompressedTextureImage);
+        ASSIGN("glGetNamedBufferParameteri64v", getNamedBufferParameteri64v);
+        ASSIGN("glGetNamedBufferParameteriv", getNamedBufferParameteriv);
+        ASSIGN("glGetNamedBufferPointerv", getNamedBufferPointerv);
+        ASSIGN("glGetNamedBufferSubData", getNamedBufferSubData);
+        ASSIGN("glGetNamedFramebufferAttachmentParameteriv",
+               getNamedFramebufferAttachmentParameteriv);
+        ASSIGN("glGetNamedFramebufferParameteriv", getNamedFramebufferParameteriv);
+        ASSIGN("glGetNamedRenderbufferParameteriv", getNamedRenderbufferParameteriv);
+        ASSIGN("glGetQueryBufferObjecti64v", getQueryBufferObjecti64v);
+        ASSIGN("glGetQueryBufferObjectiv", getQueryBufferObjectiv);
+        ASSIGN("glGetQueryBufferObjectui64v", getQueryBufferObjectui64v);
+        ASSIGN("glGetQueryBufferObjectuiv", getQueryBufferObjectuiv);
+        ASSIGN("glGetTextureImage", getTextureImage);
+        ASSIGN("glGetTextureLevelParameterfv", getTextureLevelParameterfv);
+        ASSIGN("glGetTextureLevelParameteriv", getTextureLevelParameteriv);
+        ASSIGN("glGetTextureParameterIiv", getTextureParameterIiv);
+        ASSIGN("glGetTextureParameterIuiv", getTextureParameterIuiv);
+        ASSIGN("glGetTextureParameterfv", getTextureParameterfv);
+        ASSIGN("glGetTextureParameteriv", getTextureParameteriv);
+        ASSIGN("glGetTransformFeedbacki64_v", getTransformFeedbacki64_v);
+        ASSIGN("glGetTransformFeedbacki_v", getTransformFeedbacki_v);
+        ASSIGN("glGetTransformFeedbackiv", getTransformFeedbackiv);
+        ASSIGN("glGetVertexArrayIndexed64iv", getVertexArrayIndexed64iv);
+        ASSIGN("glGetVertexArrayIndexediv", getVertexArrayIndexediv);
+        ASSIGN("glGetVertexArrayiv", getVertexArrayiv);
+        ASSIGN("glInvalidateNamedFramebufferData", invalidateNamedFramebufferData);
+        ASSIGN("glInvalidateNamedFramebufferSubData", invalidateNamedFramebufferSubData);
+        ASSIGN("glMapNamedBuffer", mapNamedBuffer);
+        ASSIGN("glMapNamedBufferRange", mapNamedBufferRange);
+        ASSIGN("glNamedBufferData", namedBufferData);
+        ASSIGN("glNamedBufferStorage", namedBufferStorage);
+        ASSIGN("glNamedBufferSubData", namedBufferSubData);
+        ASSIGN("glNamedFramebufferDrawBuffer", namedFramebufferDrawBuffer);
+        ASSIGN("glNamedFramebufferDrawBuffers", namedFramebufferDrawBuffers);
+        ASSIGN("glNamedFramebufferParameteri", namedFramebufferParameteri);
+        ASSIGN("glNamedFramebufferReadBuffer", namedFramebufferReadBuffer);
+        ASSIGN("glNamedFramebufferRenderbuffer", namedFramebufferRenderbuffer);
+        ASSIGN("glNamedFramebufferTexture", namedFramebufferTexture);
+        ASSIGN("glNamedFramebufferTextureLayer", namedFramebufferTextureLayer);
+        ASSIGN("glNamedRenderbufferStorage", namedRenderbufferStorage);
+        ASSIGN("glNamedRenderbufferStorageMultisample", namedRenderbufferStorageMultisample);
+        ASSIGN("glTextureBuffer", textureBuffer);
+        ASSIGN("glTextureBufferRange", textureBufferRange);
+        ASSIGN("glTextureParameterIiv", textureParameterIiv);
+        ASSIGN("glTextureParameterIuiv", textureParameterIuiv);
+        ASSIGN("glTextureParameterf", textureParameterf);
+        ASSIGN("glTextureParameterfv", textureParameterfv);
+        ASSIGN("glTextureParameteri", textureParameteri);
+        ASSIGN("glTextureParameteriv", textureParameteriv);
+        ASSIGN("glTextureStorage1D", textureStorage1D);
+        ASSIGN("glTextureStorage2D", textureStorage2D);
+        ASSIGN("glTextureStorage2DMultisample", textureStorage2DMultisample);
+        ASSIGN("glTextureStorage3D", textureStorage3D);
+        ASSIGN("glTextureStorage3DMultisample", textureStorage3DMultisample);
+        ASSIGN("glTextureSubImage1D", textureSubImage1D);
+        ASSIGN("glTextureSubImage2D", textureSubImage2D);
+        ASSIGN("glTextureSubImage3D", textureSubImage3D);
+        ASSIGN("glTransformFeedbackBufferBase", transformFeedbackBufferBase);
+        ASSIGN("glTransformFeedbackBufferRange", transformFeedbackBufferRange);
+        ASSIGN("glUnmapNamedBuffer", unmapNamedBuffer);
+        ASSIGN("glVertexArrayAttribBinding", vertexArrayAttribBinding);
+        ASSIGN("glVertexArrayAttribFormat", vertexArrayAttribFormat);
+        ASSIGN("glVertexArrayAttribIFormat", vertexArrayAttribIFormat);
+        ASSIGN("glVertexArrayAttribLFormat", vertexArrayAttribLFormat);
+        ASSIGN("glVertexArrayBindingDivisor", vertexArrayBindingDivisor);
+        ASSIGN("glVertexArrayElementBuffer", vertexArrayElementBuffer);
+        ASSIGN("glVertexArrayVertexBuffer", vertexArrayVertexBuffer);
+        ASSIGN("glVertexArrayVertexBuffers", vertexArrayVertexBuffers);
+    }
+
+    if (extensions.count("GL_ARB_draw_buffers") != 0)
+    {
+        ASSIGN("glDrawBuffersARB", drawBuffers);
+    }
+
+    if (extensions.count("GL_ARB_draw_buffers_blend") != 0)
+    {
+        ASSIGN("glBlendEquationSeparateiARB", blendEquationSeparatei);
+        ASSIGN("glBlendEquationiARB", blendEquationi);
+        ASSIGN("glBlendFuncSeparateiARB", blendFuncSeparatei);
+        ASSIGN("glBlendFunciARB", blendFunci);
+    }
+
+    if (extensions.count("GL_ARB_draw_elements_base_vertex") != 0)
+    {
+        ASSIGN("glDrawElementsBaseVertex", drawElementsBaseVertex);
+        ASSIGN("glDrawElementsInstancedBaseVertex", drawElementsInstancedBaseVertex);
+        ASSIGN("glDrawRangeElementsBaseVertex", drawRangeElementsBaseVertex);
+        ASSIGN("glMultiDrawElementsBaseVertex", multiDrawElementsBaseVertex);
+    }
+
+    if (extensions.count("GL_ARB_draw_indirect") != 0)
+    {
+        ASSIGN("glDrawArraysIndirect", drawArraysIndirect);
+        ASSIGN("glDrawElementsIndirect", drawElementsIndirect);
+    }
+
+    if (extensions.count("GL_ARB_draw_instanced") != 0)
+    {
+        ASSIGN("glDrawArraysInstancedARB", drawArraysInstanced);
+        ASSIGN("glDrawElementsInstancedARB", drawElementsInstanced);
+    }
+
+    if (extensions.count("GL_ARB_fragment_program") != 0)
+    {
+        ASSIGN("glGetProgramivARB", getProgramiv);
+        ASSIGN("glIsProgramARB", isProgram);
+    }
+
+    if (extensions.count("GL_ARB_framebuffer_no_attachments") != 0)
+    {
+        ASSIGN("glFramebufferParameteri", framebufferParameteri);
+        ASSIGN("glGetFramebufferParameteriv", getFramebufferParameteriv);
+    }
+
+    if (extensions.count("GL_ARB_framebuffer_object") != 0)
+    {
+        ASSIGN("glBindFramebuffer", bindFramebuffer);
+        ASSIGN("glBindRenderbuffer", bindRenderbuffer);
+        ASSIGN("glBlitFramebuffer", blitFramebuffer);
+        ASSIGN("glCheckFramebufferStatus", checkFramebufferStatus);
+        ASSIGN("glDeleteFramebuffers", deleteFramebuffers);
+        ASSIGN("glDeleteRenderbuffers", deleteRenderbuffers);
+        ASSIGN("glFramebufferRenderbuffer", framebufferRenderbuffer);
+        ASSIGN("glFramebufferTexture1D", framebufferTexture1D);
+        ASSIGN("glFramebufferTexture2D", framebufferTexture2D);
+        ASSIGN("glFramebufferTexture3D", framebufferTexture3D);
+        ASSIGN("glFramebufferTextureLayer", framebufferTextureLayer);
+        ASSIGN("glGenFramebuffers", genFramebuffers);
+        ASSIGN("glGenRenderbuffers", genRenderbuffers);
+        ASSIGN("glGenerateMipmap", generateMipmap);
+        ASSIGN("glGetFramebufferAttachmentParameteriv", getFramebufferAttachmentParameteriv);
+        ASSIGN("glGetRenderbufferParameteriv", getRenderbufferParameteriv);
+        ASSIGN("glIsFramebuffer", isFramebuffer);
+        ASSIGN("glIsRenderbuffer", isRenderbuffer);
+        ASSIGN("glRenderbufferStorage", renderbufferStorage);
+        ASSIGN("glRenderbufferStorageMultisample", renderbufferStorageMultisample);
+    }
+
+    if (extensions.count("GL_ARB_geometry_shader4") != 0)
+    {
+        ASSIGN("glFramebufferTextureARB", framebufferTexture);
+        ASSIGN("glFramebufferTextureLayerARB", framebufferTextureLayer);
+        ASSIGN("glProgramParameteriARB", programParameteri);
+    }
+
+    if (extensions.count("GL_ARB_get_program_binary") != 0)
+    {
+        ASSIGN("glGetProgramBinary", getProgramBinary);
+        ASSIGN("glProgramBinary", programBinary);
+        ASSIGN("glProgramParameteri", programParameteri);
+    }
+
+    if (extensions.count("GL_ARB_get_texture_sub_image") != 0)
+    {
+        ASSIGN("glGetCompressedTextureSubImage", getCompressedTextureSubImage);
+        ASSIGN("glGetTextureSubImage", getTextureSubImage);
+    }
+
+    if (extensions.count("GL_ARB_gpu_shader_fp64") != 0)
+    {
+        ASSIGN("glGetUniformdv", getUniformdv);
+        ASSIGN("glUniform1d", uniform1d);
+        ASSIGN("glUniform1dv", uniform1dv);
+        ASSIGN("glUniform2d", uniform2d);
+        ASSIGN("glUniform2dv", uniform2dv);
+        ASSIGN("glUniform3d", uniform3d);
+        ASSIGN("glUniform3dv", uniform3dv);
+        ASSIGN("glUniform4d", uniform4d);
+        ASSIGN("glUniform4dv", uniform4dv);
+        ASSIGN("glUniformMatrix2dv", uniformMatrix2dv);
+        ASSIGN("glUniformMatrix2x3dv", uniformMatrix2x3dv);
+        ASSIGN("glUniformMatrix2x4dv", uniformMatrix2x4dv);
+        ASSIGN("glUniformMatrix3dv", uniformMatrix3dv);
+        ASSIGN("glUniformMatrix3x2dv", uniformMatrix3x2dv);
+        ASSIGN("glUniformMatrix3x4dv", uniformMatrix3x4dv);
+        ASSIGN("glUniformMatrix4dv", uniformMatrix4dv);
+        ASSIGN("glUniformMatrix4x2dv", uniformMatrix4x2dv);
+        ASSIGN("glUniformMatrix4x3dv", uniformMatrix4x3dv);
+    }
+
+    if (extensions.count("GL_ARB_imaging") != 0)
+    {
+        ASSIGN("glBlendColor", blendColor);
+        ASSIGN("glBlendEquation", blendEquation);
+    }
+
+    if (extensions.count("GL_ARB_instanced_arrays") != 0)
+    {
+        ASSIGN("glVertexAttribDivisorARB", vertexAttribDivisor);
+    }
+
+    if (extensions.count("GL_ARB_internalformat_query") != 0)
+    {
+        ASSIGN("glGetInternalformativ", getInternalformativ);
+    }
+
+    if (extensions.count("GL_ARB_internalformat_query2") != 0)
+    {
+        ASSIGN("glGetInternalformati64v", getInternalformati64v);
+    }
+
+    if (extensions.count("GL_ARB_invalidate_subdata") != 0)
+    {
+        ASSIGN("glInvalidateBufferData", invalidateBufferData);
+        ASSIGN("glInvalidateBufferSubData", invalidateBufferSubData);
+        ASSIGN("glInvalidateFramebuffer", invalidateFramebuffer);
+        ASSIGN("glInvalidateSubFramebuffer", invalidateSubFramebuffer);
+        ASSIGN("glInvalidateTexImage", invalidateTexImage);
+        ASSIGN("glInvalidateTexSubImage", invalidateTexSubImage);
+    }
+
+    if (extensions.count("GL_ARB_map_buffer_range") != 0)
+    {
+        ASSIGN("glFlushMappedBufferRange", flushMappedBufferRange);
+        ASSIGN("glMapBufferRange", mapBufferRange);
+    }
+
+    if (extensions.count("GL_ARB_multi_bind") != 0)
+    {
+        ASSIGN("glBindBuffersBase", bindBuffersBase);
+        ASSIGN("glBindBuffersRange", bindBuffersRange);
+        ASSIGN("glBindImageTextures", bindImageTextures);
+        ASSIGN("glBindSamplers", bindSamplers);
+        ASSIGN("glBindTextures", bindTextures);
+        ASSIGN("glBindVertexBuffers", bindVertexBuffers);
+    }
+
+    if (extensions.count("GL_ARB_multi_draw_indirect") != 0)
+    {
+        ASSIGN("glMultiDrawArraysIndirect", multiDrawArraysIndirect);
+        ASSIGN("glMultiDrawElementsIndirect", multiDrawElementsIndirect);
+    }
+
+    if (extensions.count("GL_ARB_multisample") != 0)
+    {
+        ASSIGN("glSampleCoverageARB", sampleCoverage);
+    }
+
+    if (extensions.count("GL_ARB_multitexture") != 0)
+    {
+        ASSIGN("glActiveTextureARB", activeTexture);
+    }
+
+    if (extensions.count("GL_ARB_occlusion_query") != 0)
+    {
+        ASSIGN("glBeginQueryARB", beginQuery);
+        ASSIGN("glDeleteQueriesARB", deleteQueries);
+        ASSIGN("glEndQueryARB", endQuery);
+        ASSIGN("glGenQueriesARB", genQueries);
+        ASSIGN("glGetQueryObjectivARB", getQueryObjectiv);
+        ASSIGN("glGetQueryObjectuivARB", getQueryObjectuiv);
+        ASSIGN("glGetQueryivARB", getQueryiv);
+        ASSIGN("glIsQueryARB", isQuery);
+    }
+
+    if (extensions.count("GL_ARB_point_parameters") != 0)
+    {
+        ASSIGN("glPointParameterfARB", pointParameterf);
+        ASSIGN("glPointParameterfvARB", pointParameterfv);
+    }
+
+    if (extensions.count("GL_ARB_program_interface_query") != 0)
+    {
+        ASSIGN("glGetProgramInterfaceiv", getProgramInterfaceiv);
+        ASSIGN("glGetProgramResourceIndex", getProgramResourceIndex);
+        ASSIGN("glGetProgramResourceLocation", getProgramResourceLocation);
+        ASSIGN("glGetProgramResourceLocationIndex", getProgramResourceLocationIndex);
+        ASSIGN("glGetProgramResourceName", getProgramResourceName);
+        ASSIGN("glGetProgramResourceiv", getProgramResourceiv);
+    }
+
+    if (extensions.count("GL_ARB_provoking_vertex") != 0)
+    {
+        ASSIGN("glProvokingVertex", provokingVertex);
+    }
+
+    if (extensions.count("GL_ARB_robustness") != 0)
+    {
+        ASSIGN("glGetGraphicsResetStatusARB", getGraphicsResetStatus);
+        ASSIGN("glGetnCompressedTexImageARB", getnCompressedTexImage);
+        ASSIGN("glGetnTexImageARB", getnTexImage);
+        ASSIGN("glGetnUniformdvARB", getnUniformdv);
+        ASSIGN("glGetnUniformfvARB", getnUniformfv);
+        ASSIGN("glGetnUniformivARB", getnUniformiv);
+        ASSIGN("glGetnUniformuivARB", getnUniformuiv);
+        ASSIGN("glReadnPixelsARB", readnPixels);
+    }
+
+    if (extensions.count("GL_ARB_sample_shading") != 0)
+    {
+        ASSIGN("glMinSampleShadingARB", minSampleShading);
+    }
+
+    if (extensions.count("GL_ARB_sampler_objects") != 0)
+    {
+        ASSIGN("glBindSampler", bindSampler);
+        ASSIGN("glDeleteSamplers", deleteSamplers);
+        ASSIGN("glGenSamplers", genSamplers);
+        ASSIGN("glGetSamplerParameterIiv", getSamplerParameterIiv);
+        ASSIGN("glGetSamplerParameterIuiv", getSamplerParameterIuiv);
+        ASSIGN("glGetSamplerParameterfv", getSamplerParameterfv);
+        ASSIGN("glGetSamplerParameteriv", getSamplerParameteriv);
+        ASSIGN("glIsSampler", isSampler);
+        ASSIGN("glSamplerParameterIiv", samplerParameterIiv);
+        ASSIGN("glSamplerParameterIuiv", samplerParameterIuiv);
+        ASSIGN("glSamplerParameterf", samplerParameterf);
+        ASSIGN("glSamplerParameterfv", samplerParameterfv);
+        ASSIGN("glSamplerParameteri", samplerParameteri);
+        ASSIGN("glSamplerParameteriv", samplerParameteriv);
+    }
+
+    if (extensions.count("GL_ARB_separate_shader_objects") != 0)
+    {
+        ASSIGN("glActiveShaderProgram", activeShaderProgram);
+        ASSIGN("glBindProgramPipeline", bindProgramPipeline);
+        ASSIGN("glCreateShaderProgramv", createShaderProgramv);
+        ASSIGN("glDeleteProgramPipelines", deleteProgramPipelines);
+        ASSIGN("glGenProgramPipelines", genProgramPipelines);
+        ASSIGN("glGetProgramPipelineInfoLog", getProgramPipelineInfoLog);
+        ASSIGN("glGetProgramPipelineiv", getProgramPipelineiv);
+        ASSIGN("glIsProgramPipeline", isProgramPipeline);
+        ASSIGN("glProgramUniform1d", programUniform1d);
+        ASSIGN("glProgramUniform1dv", programUniform1dv);
+        ASSIGN("glProgramUniform1f", programUniform1f);
+        ASSIGN("glProgramUniform1fv", programUniform1fv);
+        ASSIGN("glProgramUniform1i", programUniform1i);
+        ASSIGN("glProgramUniform1iv", programUniform1iv);
+        ASSIGN("glProgramUniform1ui", programUniform1ui);
+        ASSIGN("glProgramUniform1uiv", programUniform1uiv);
+        ASSIGN("glProgramUniform2d", programUniform2d);
+        ASSIGN("glProgramUniform2dv", programUniform2dv);
+        ASSIGN("glProgramUniform2f", programUniform2f);
+        ASSIGN("glProgramUniform2fv", programUniform2fv);
+        ASSIGN("glProgramUniform2i", programUniform2i);
+        ASSIGN("glProgramUniform2iv", programUniform2iv);
+        ASSIGN("glProgramUniform2ui", programUniform2ui);
+        ASSIGN("glProgramUniform2uiv", programUniform2uiv);
+        ASSIGN("glProgramUniform3d", programUniform3d);
+        ASSIGN("glProgramUniform3dv", programUniform3dv);
+        ASSIGN("glProgramUniform3f", programUniform3f);
+        ASSIGN("glProgramUniform3fv", programUniform3fv);
+        ASSIGN("glProgramUniform3i", programUniform3i);
+        ASSIGN("glProgramUniform3iv", programUniform3iv);
+        ASSIGN("glProgramUniform3ui", programUniform3ui);
+        ASSIGN("glProgramUniform3uiv", programUniform3uiv);
+        ASSIGN("glProgramUniform4d", programUniform4d);
+        ASSIGN("glProgramUniform4dv", programUniform4dv);
+        ASSIGN("glProgramUniform4f", programUniform4f);
+        ASSIGN("glProgramUniform4fv", programUniform4fv);
+        ASSIGN("glProgramUniform4i", programUniform4i);
+        ASSIGN("glProgramUniform4iv", programUniform4iv);
+        ASSIGN("glProgramUniform4ui", programUniform4ui);
+        ASSIGN("glProgramUniform4uiv", programUniform4uiv);
+        ASSIGN("glProgramUniformMatrix2dv", programUniformMatrix2dv);
+        ASSIGN("glProgramUniformMatrix2fv", programUniformMatrix2fv);
+        ASSIGN("glProgramUniformMatrix2x3dv", programUniformMatrix2x3dv);
+        ASSIGN("glProgramUniformMatrix2x3fv", programUniformMatrix2x3fv);
+        ASSIGN("glProgramUniformMatrix2x4dv", programUniformMatrix2x4dv);
+        ASSIGN("glProgramUniformMatrix2x4fv", programUniformMatrix2x4fv);
+        ASSIGN("glProgramUniformMatrix3dv", programUniformMatrix3dv);
+        ASSIGN("glProgramUniformMatrix3fv", programUniformMatrix3fv);
+        ASSIGN("glProgramUniformMatrix3x2dv", programUniformMatrix3x2dv);
+        ASSIGN("glProgramUniformMatrix3x2fv", programUniformMatrix3x2fv);
+        ASSIGN("glProgramUniformMatrix3x4dv", programUniformMatrix3x4dv);
+        ASSIGN("glProgramUniformMatrix3x4fv", programUniformMatrix3x4fv);
+        ASSIGN("glProgramUniformMatrix4dv", programUniformMatrix4dv);
+        ASSIGN("glProgramUniformMatrix4fv", programUniformMatrix4fv);
+        ASSIGN("glProgramUniformMatrix4x2dv", programUniformMatrix4x2dv);
+        ASSIGN("glProgramUniformMatrix4x2fv", programUniformMatrix4x2fv);
+        ASSIGN("glProgramUniformMatrix4x3dv", programUniformMatrix4x3dv);
+        ASSIGN("glProgramUniformMatrix4x3fv", programUniformMatrix4x3fv);
+        ASSIGN("glUseProgramStages", useProgramStages);
+        ASSIGN("glValidateProgramPipeline", validateProgramPipeline);
+    }
+
+    if (extensions.count("GL_ARB_shader_atomic_counters") != 0)
+    {
+        ASSIGN("glGetActiveAtomicCounterBufferiv", getActiveAtomicCounterBufferiv);
+    }
+
+    if (extensions.count("GL_ARB_shader_image_load_store") != 0)
+    {
+        ASSIGN("glBindImageTexture", bindImageTexture);
+        ASSIGN("glMemoryBarrier", memoryBarrier);
+    }
+
+    if (extensions.count("GL_ARB_shader_objects") != 0)
+    {
+        ASSIGN("glCompileShaderARB", compileShader);
+        ASSIGN("glGetActiveUniformARB", getActiveUniform);
+        ASSIGN("glGetShaderSourceARB", getShaderSource);
+        ASSIGN("glGetUniformLocationARB", getUniformLocation);
+        ASSIGN("glGetUniformfvARB", getUniformfv);
+        ASSIGN("glGetUniformivARB", getUniformiv);
+        ASSIGN("glLinkProgramARB", linkProgram);
+        ASSIGN("glShaderSourceARB", shaderSource);
+        ASSIGN("glUniform1fARB", uniform1f);
+        ASSIGN("glUniform1fvARB", uniform1fv);
+        ASSIGN("glUniform1iARB", uniform1i);
+        ASSIGN("glUniform1ivARB", uniform1iv);
+        ASSIGN("glUniform2fARB", uniform2f);
+        ASSIGN("glUniform2fvARB", uniform2fv);
+        ASSIGN("glUniform2iARB", uniform2i);
+        ASSIGN("glUniform2ivARB", uniform2iv);
+        ASSIGN("glUniform3fARB", uniform3f);
+        ASSIGN("glUniform3fvARB", uniform3fv);
+        ASSIGN("glUniform3iARB", uniform3i);
+        ASSIGN("glUniform3ivARB", uniform3iv);
+        ASSIGN("glUniform4fARB", uniform4f);
+        ASSIGN("glUniform4fvARB", uniform4fv);
+        ASSIGN("glUniform4iARB", uniform4i);
+        ASSIGN("glUniform4ivARB", uniform4iv);
+        ASSIGN("glUniformMatrix2fvARB", uniformMatrix2fv);
+        ASSIGN("glUniformMatrix3fvARB", uniformMatrix3fv);
+        ASSIGN("glUniformMatrix4fvARB", uniformMatrix4fv);
+        ASSIGN("glValidateProgramARB", validateProgram);
+    }
+
+    if (extensions.count("GL_ARB_shader_storage_buffer_object") != 0)
+    {
+        ASSIGN("glShaderStorageBlockBinding", shaderStorageBlockBinding);
+    }
+
+    if (extensions.count("GL_ARB_shader_subroutine") != 0)
+    {
+        ASSIGN("glGetActiveSubroutineName", getActiveSubroutineName);
+        ASSIGN("glGetActiveSubroutineUniformName", getActiveSubroutineUniformName);
+        ASSIGN("glGetActiveSubroutineUniformiv", getActiveSubroutineUniformiv);
+        ASSIGN("glGetProgramStageiv", getProgramStageiv);
+        ASSIGN("glGetSubroutineIndex", getSubroutineIndex);
+        ASSIGN("glGetSubroutineUniformLocation", getSubroutineUniformLocation);
+        ASSIGN("glGetUniformSubroutineuiv", getUniformSubroutineuiv);
+        ASSIGN("glUniformSubroutinesuiv", uniformSubroutinesuiv);
+    }
+
+    if (extensions.count("GL_ARB_sync") != 0)
+    {
+        ASSIGN("glClientWaitSync", clientWaitSync);
+        ASSIGN("glDeleteSync", deleteSync);
+        ASSIGN("glFenceSync", fenceSync);
+        ASSIGN("glGetInteger64v", getInteger64v);
+        ASSIGN("glGetSynciv", getSynciv);
+        ASSIGN("glIsSync", isSync);
+        ASSIGN("glWaitSync", waitSync);
+    }
+
+    if (extensions.count("GL_ARB_tessellation_shader") != 0)
+    {
+        ASSIGN("glPatchParameterfv", patchParameterfv);
+        ASSIGN("glPatchParameteri", patchParameteri);
+    }
+
+    if (extensions.count("GL_ARB_texture_barrier") != 0)
+    {
+        ASSIGN("glTextureBarrier", textureBarrier);
+    }
+
+    if (extensions.count("GL_ARB_texture_buffer_object") != 0)
+    {
+        ASSIGN("glTexBufferARB", texBuffer);
+    }
+
+    if (extensions.count("GL_ARB_texture_buffer_range") != 0)
+    {
+        ASSIGN("glTexBufferRange", texBufferRange);
+    }
+
+    if (extensions.count("GL_ARB_texture_compression") != 0)
+    {
+        ASSIGN("glCompressedTexImage1DARB", compressedTexImage1D);
+        ASSIGN("glCompressedTexImage2DARB", compressedTexImage2D);
+        ASSIGN("glCompressedTexImage3DARB", compressedTexImage3D);
+        ASSIGN("glCompressedTexSubImage1DARB", compressedTexSubImage1D);
+        ASSIGN("glCompressedTexSubImage2DARB", compressedTexSubImage2D);
+        ASSIGN("glCompressedTexSubImage3DARB", compressedTexSubImage3D);
+        ASSIGN("glGetCompressedTexImageARB", getCompressedTexImage);
+    }
+
+    if (extensions.count("GL_ARB_texture_multisample") != 0)
+    {
+        ASSIGN("glGetMultisamplefv", getMultisamplefv);
+        ASSIGN("glSampleMaski", sampleMaski);
+        ASSIGN("glTexImage2DMultisample", texImage2DMultisample);
+        ASSIGN("glTexImage3DMultisample", texImage3DMultisample);
+    }
+
+    if (extensions.count("GL_ARB_texture_storage") != 0)
+    {
+        ASSIGN("glTexStorage1D", texStorage1D);
+        ASSIGN("glTexStorage2D", texStorage2D);
+        ASSIGN("glTexStorage3D", texStorage3D);
+    }
+
+    if (extensions.count("GL_ARB_texture_storage_multisample") != 0)
+    {
+        ASSIGN("glTexStorage2DMultisample", texStorage2DMultisample);
+        ASSIGN("glTexStorage3DMultisample", texStorage3DMultisample);
+    }
+
+    if (extensions.count("GL_ARB_texture_view") != 0)
+    {
+        ASSIGN("glTextureView", textureView);
+    }
+
+    if (extensions.count("GL_ARB_timer_query") != 0)
+    {
+        ASSIGN("glGetQueryObjecti64v", getQueryObjecti64v);
+        ASSIGN("glGetQueryObjectui64v", getQueryObjectui64v);
+        ASSIGN("glQueryCounter", queryCounter);
+    }
+
+    if (extensions.count("GL_ARB_transform_feedback2") != 0)
+    {
+        ASSIGN("glBindTransformFeedback", bindTransformFeedback);
+        ASSIGN("glDeleteTransformFeedbacks", deleteTransformFeedbacks);
+        ASSIGN("glDrawTransformFeedback", drawTransformFeedback);
+        ASSIGN("glGenTransformFeedbacks", genTransformFeedbacks);
+        ASSIGN("glIsTransformFeedback", isTransformFeedback);
+        ASSIGN("glPauseTransformFeedback", pauseTransformFeedback);
+        ASSIGN("glResumeTransformFeedback", resumeTransformFeedback);
+    }
+
+    if (extensions.count("GL_ARB_transform_feedback3") != 0)
+    {
+        ASSIGN("glBeginQueryIndexed", beginQueryIndexed);
+        ASSIGN("glDrawTransformFeedbackStream", drawTransformFeedbackStream);
+        ASSIGN("glEndQueryIndexed", endQueryIndexed);
+        ASSIGN("glGetQueryIndexediv", getQueryIndexediv);
+    }
+
+    if (extensions.count("GL_ARB_transform_feedback_instanced") != 0)
+    {
+        ASSIGN("glDrawTransformFeedbackInstanced", drawTransformFeedbackInstanced);
+        ASSIGN("glDrawTransformFeedbackStreamInstanced", drawTransformFeedbackStreamInstanced);
+    }
+
+    if (extensions.count("GL_ARB_uniform_buffer_object") != 0)
+    {
+        ASSIGN("glBindBufferBase", bindBufferBase);
+        ASSIGN("glBindBufferRange", bindBufferRange);
+        ASSIGN("glGetActiveUniformBlockName", getActiveUniformBlockName);
+        ASSIGN("glGetActiveUniformBlockiv", getActiveUniformBlockiv);
+        ASSIGN("glGetActiveUniformName", getActiveUniformName);
+        ASSIGN("glGetActiveUniformsiv", getActiveUniformsiv);
+        ASSIGN("glGetIntegeri_v", getIntegeri_v);
+        ASSIGN("glGetUniformBlockIndex", getUniformBlockIndex);
+        ASSIGN("glGetUniformIndices", getUniformIndices);
+        ASSIGN("glUniformBlockBinding", uniformBlockBinding);
+    }
+
+    if (extensions.count("GL_ARB_vertex_array_object") != 0)
+    {
+        ASSIGN("glBindVertexArray", bindVertexArray);
+        ASSIGN("glDeleteVertexArrays", deleteVertexArrays);
+        ASSIGN("glGenVertexArrays", genVertexArrays);
+        ASSIGN("glIsVertexArray", isVertexArray);
+    }
+
+    if (extensions.count("GL_ARB_vertex_attrib_64bit") != 0)
+    {
+        ASSIGN("glGetVertexAttribLdv", getVertexAttribLdv);
+        ASSIGN("glVertexAttribL1d", vertexAttribL1d);
+        ASSIGN("glVertexAttribL1dv", vertexAttribL1dv);
+        ASSIGN("glVertexAttribL2d", vertexAttribL2d);
+        ASSIGN("glVertexAttribL2dv", vertexAttribL2dv);
+        ASSIGN("glVertexAttribL3d", vertexAttribL3d);
+        ASSIGN("glVertexAttribL3dv", vertexAttribL3dv);
+        ASSIGN("glVertexAttribL4d", vertexAttribL4d);
+        ASSIGN("glVertexAttribL4dv", vertexAttribL4dv);
+        ASSIGN("glVertexAttribLPointer", vertexAttribLPointer);
+    }
+
+    if (extensions.count("GL_ARB_vertex_attrib_binding") != 0)
+    {
+        ASSIGN("glBindVertexBuffer", bindVertexBuffer);
+        ASSIGN("glVertexAttribBinding", vertexAttribBinding);
+        ASSIGN("glVertexAttribFormat", vertexAttribFormat);
+        ASSIGN("glVertexAttribIFormat", vertexAttribIFormat);
+        ASSIGN("glVertexAttribLFormat", vertexAttribLFormat);
+        ASSIGN("glVertexBindingDivisor", vertexBindingDivisor);
+    }
+
+    if (extensions.count("GL_ARB_vertex_buffer_object") != 0)
+    {
+        ASSIGN("glBindBufferARB", bindBuffer);
+        ASSIGN("glBufferDataARB", bufferData);
+        ASSIGN("glBufferSubDataARB", bufferSubData);
+        ASSIGN("glDeleteBuffersARB", deleteBuffers);
+        ASSIGN("glGenBuffersARB", genBuffers);
+        ASSIGN("glGetBufferParameterivARB", getBufferParameteriv);
+        ASSIGN("glGetBufferPointervARB", getBufferPointerv);
+        ASSIGN("glGetBufferSubDataARB", getBufferSubData);
+        ASSIGN("glIsBufferARB", isBuffer);
+        ASSIGN("glMapBufferARB", mapBuffer);
+        ASSIGN("glUnmapBufferARB", unmapBuffer);
+    }
+
+    if (extensions.count("GL_ARB_vertex_program") != 0)
+    {
+        ASSIGN("glDisableVertexAttribArrayARB", disableVertexAttribArray);
+        ASSIGN("glEnableVertexAttribArrayARB", enableVertexAttribArray);
+        ASSIGN("glGetProgramivARB", getProgramiv);
+        ASSIGN("glGetVertexAttribPointervARB", getVertexAttribPointerv);
+        ASSIGN("glGetVertexAttribdvARB", getVertexAttribdv);
+        ASSIGN("glGetVertexAttribfvARB", getVertexAttribfv);
+        ASSIGN("glGetVertexAttribivARB", getVertexAttribiv);
+        ASSIGN("glIsProgramARB", isProgram);
+        ASSIGN("glVertexAttrib1dARB", vertexAttrib1d);
+        ASSIGN("glVertexAttrib1dvARB", vertexAttrib1dv);
+        ASSIGN("glVertexAttrib1fARB", vertexAttrib1f);
+        ASSIGN("glVertexAttrib1fvARB", vertexAttrib1fv);
+        ASSIGN("glVertexAttrib1sARB", vertexAttrib1s);
+        ASSIGN("glVertexAttrib1svARB", vertexAttrib1sv);
+        ASSIGN("glVertexAttrib2dARB", vertexAttrib2d);
+        ASSIGN("glVertexAttrib2dvARB", vertexAttrib2dv);
+        ASSIGN("glVertexAttrib2fARB", vertexAttrib2f);
+        ASSIGN("glVertexAttrib2fvARB", vertexAttrib2fv);
+        ASSIGN("glVertexAttrib2sARB", vertexAttrib2s);
+        ASSIGN("glVertexAttrib2svARB", vertexAttrib2sv);
+        ASSIGN("glVertexAttrib3dARB", vertexAttrib3d);
+        ASSIGN("glVertexAttrib3dvARB", vertexAttrib3dv);
+        ASSIGN("glVertexAttrib3fARB", vertexAttrib3f);
+        ASSIGN("glVertexAttrib3fvARB", vertexAttrib3fv);
+        ASSIGN("glVertexAttrib3sARB", vertexAttrib3s);
+        ASSIGN("glVertexAttrib3svARB", vertexAttrib3sv);
+        ASSIGN("glVertexAttrib4NbvARB", vertexAttrib4Nbv);
+        ASSIGN("glVertexAttrib4NivARB", vertexAttrib4Niv);
+        ASSIGN("glVertexAttrib4NsvARB", vertexAttrib4Nsv);
+        ASSIGN("glVertexAttrib4NubARB", vertexAttrib4Nub);
+        ASSIGN("glVertexAttrib4NubvARB", vertexAttrib4Nubv);
+        ASSIGN("glVertexAttrib4NuivARB", vertexAttrib4Nuiv);
+        ASSIGN("glVertexAttrib4NusvARB", vertexAttrib4Nusv);
+        ASSIGN("glVertexAttrib4bvARB", vertexAttrib4bv);
+        ASSIGN("glVertexAttrib4dARB", vertexAttrib4d);
+        ASSIGN("glVertexAttrib4dvARB", vertexAttrib4dv);
+        ASSIGN("glVertexAttrib4fARB", vertexAttrib4f);
+        ASSIGN("glVertexAttrib4fvARB", vertexAttrib4fv);
+        ASSIGN("glVertexAttrib4ivARB", vertexAttrib4iv);
+        ASSIGN("glVertexAttrib4sARB", vertexAttrib4s);
+        ASSIGN("glVertexAttrib4svARB", vertexAttrib4sv);
+        ASSIGN("glVertexAttrib4ubvARB", vertexAttrib4ubv);
+        ASSIGN("glVertexAttrib4uivARB", vertexAttrib4uiv);
+        ASSIGN("glVertexAttrib4usvARB", vertexAttrib4usv);
+        ASSIGN("glVertexAttribPointerARB", vertexAttribPointer);
+    }
+
+    if (extensions.count("GL_ARB_vertex_shader") != 0)
+    {
+        ASSIGN("glBindAttribLocationARB", bindAttribLocation);
+        ASSIGN("glDisableVertexAttribArrayARB", disableVertexAttribArray);
+        ASSIGN("glEnableVertexAttribArrayARB", enableVertexAttribArray);
+        ASSIGN("glGetActiveAttribARB", getActiveAttrib);
+        ASSIGN("glGetAttribLocationARB", getAttribLocation);
+        ASSIGN("glGetVertexAttribPointervARB", getVertexAttribPointerv);
+        ASSIGN("glGetVertexAttribdvARB", getVertexAttribdv);
+        ASSIGN("glGetVertexAttribfvARB", getVertexAttribfv);
+        ASSIGN("glGetVertexAttribivARB", getVertexAttribiv);
+        ASSIGN("glVertexAttrib1dARB", vertexAttrib1d);
+        ASSIGN("glVertexAttrib1dvARB", vertexAttrib1dv);
+        ASSIGN("glVertexAttrib1fARB", vertexAttrib1f);
+        ASSIGN("glVertexAttrib1fvARB", vertexAttrib1fv);
+        ASSIGN("glVertexAttrib1sARB", vertexAttrib1s);
+        ASSIGN("glVertexAttrib1svARB", vertexAttrib1sv);
+        ASSIGN("glVertexAttrib2dARB", vertexAttrib2d);
+        ASSIGN("glVertexAttrib2dvARB", vertexAttrib2dv);
+        ASSIGN("glVertexAttrib2fARB", vertexAttrib2f);
+        ASSIGN("glVertexAttrib2fvARB", vertexAttrib2fv);
+        ASSIGN("glVertexAttrib2sARB", vertexAttrib2s);
+        ASSIGN("glVertexAttrib2svARB", vertexAttrib2sv);
+        ASSIGN("glVertexAttrib3dARB", vertexAttrib3d);
+        ASSIGN("glVertexAttrib3dvARB", vertexAttrib3dv);
+        ASSIGN("glVertexAttrib3fARB", vertexAttrib3f);
+        ASSIGN("glVertexAttrib3fvARB", vertexAttrib3fv);
+        ASSIGN("glVertexAttrib3sARB", vertexAttrib3s);
+        ASSIGN("glVertexAttrib3svARB", vertexAttrib3sv);
+        ASSIGN("glVertexAttrib4NbvARB", vertexAttrib4Nbv);
+        ASSIGN("glVertexAttrib4NivARB", vertexAttrib4Niv);
+        ASSIGN("glVertexAttrib4NsvARB", vertexAttrib4Nsv);
+        ASSIGN("glVertexAttrib4NubARB", vertexAttrib4Nub);
+        ASSIGN("glVertexAttrib4NubvARB", vertexAttrib4Nubv);
+        ASSIGN("glVertexAttrib4NuivARB", vertexAttrib4Nuiv);
+        ASSIGN("glVertexAttrib4NusvARB", vertexAttrib4Nusv);
+        ASSIGN("glVertexAttrib4bvARB", vertexAttrib4bv);
+        ASSIGN("glVertexAttrib4dARB", vertexAttrib4d);
+        ASSIGN("glVertexAttrib4dvARB", vertexAttrib4dv);
+        ASSIGN("glVertexAttrib4fARB", vertexAttrib4f);
+        ASSIGN("glVertexAttrib4fvARB", vertexAttrib4fv);
+        ASSIGN("glVertexAttrib4ivARB", vertexAttrib4iv);
+        ASSIGN("glVertexAttrib4sARB", vertexAttrib4s);
+        ASSIGN("glVertexAttrib4svARB", vertexAttrib4sv);
+        ASSIGN("glVertexAttrib4ubvARB", vertexAttrib4ubv);
+        ASSIGN("glVertexAttrib4uivARB", vertexAttrib4uiv);
+        ASSIGN("glVertexAttrib4usvARB", vertexAttrib4usv);
+        ASSIGN("glVertexAttribPointerARB", vertexAttribPointer);
+    }
+
+    if (extensions.count("GL_ARB_vertex_type_2_10_10_10_rev") != 0)
+    {
+        ASSIGN("glVertexAttribP1ui", vertexAttribP1ui);
+        ASSIGN("glVertexAttribP1uiv", vertexAttribP1uiv);
+        ASSIGN("glVertexAttribP2ui", vertexAttribP2ui);
+        ASSIGN("glVertexAttribP2uiv", vertexAttribP2uiv);
+        ASSIGN("glVertexAttribP3ui", vertexAttribP3ui);
+        ASSIGN("glVertexAttribP3uiv", vertexAttribP3uiv);
+        ASSIGN("glVertexAttribP4ui", vertexAttribP4ui);
+        ASSIGN("glVertexAttribP4uiv", vertexAttribP4uiv);
+    }
+
+    if (extensions.count("GL_ARB_viewport_array") != 0)
+    {
+        ASSIGN("glDepthRangeArrayv", depthRangeArrayv);
+        ASSIGN("glDepthRangeIndexed", depthRangeIndexed);
+        ASSIGN("glGetDoublei_v", getDoublei_v);
+        ASSIGN("glGetFloati_v", getFloati_v);
+        ASSIGN("glScissorArrayv", scissorArrayv);
+        ASSIGN("glScissorIndexed", scissorIndexed);
+        ASSIGN("glScissorIndexedv", scissorIndexedv);
+        ASSIGN("glViewportArrayv", viewportArrayv);
+        ASSIGN("glViewportIndexedf", viewportIndexedf);
+        ASSIGN("glViewportIndexedfv", viewportIndexedfv);
+    }
+
+    if (extensions.count("GL_EXT_blend_color") != 0)
+    {
+        ASSIGN("glBlendColorEXT", blendColor);
+    }
+
+    if (extensions.count("GL_EXT_blend_equation_separate") != 0)
+    {
+        ASSIGN("glBlendEquationSeparateEXT", blendEquationSeparate);
+    }
+
+    if (extensions.count("GL_EXT_blend_func_separate") != 0)
+    {
+        ASSIGN("glBlendFuncSeparateEXT", blendFuncSeparate);
+    }
+
+    if (extensions.count("GL_EXT_copy_texture") != 0)
+    {
+        ASSIGN("glCopyTexImage1DEXT", copyTexImage1D);
+        ASSIGN("glCopyTexImage2DEXT", copyTexImage2D);
+        ASSIGN("glCopyTexSubImage1DEXT", copyTexSubImage1D);
+        ASSIGN("glCopyTexSubImage2DEXT", copyTexSubImage2D);
+        ASSIGN("glCopyTexSubImage3DEXT", copyTexSubImage3D);
+    }
+
+    if (extensions.count("GL_EXT_direct_state_access") != 0)
+    {
+        ASSIGN("glCheckNamedFramebufferStatusEXT", checkNamedFramebufferStatus);
+        ASSIGN("glClearNamedBufferDataEXT", clearNamedBufferData);
+        ASSIGN("glClearNamedBufferSubDataEXT", clearNamedBufferSubData);
+        ASSIGN("glCompressedTextureSubImage1DEXT", compressedTextureSubImage1D);
+        ASSIGN("glCompressedTextureSubImage2DEXT", compressedTextureSubImage2D);
+        ASSIGN("glCompressedTextureSubImage3DEXT", compressedTextureSubImage3D);
+        ASSIGN("glCopyTextureSubImage1DEXT", copyTextureSubImage1D);
+        ASSIGN("glCopyTextureSubImage2DEXT", copyTextureSubImage2D);
+        ASSIGN("glCopyTextureSubImage3DEXT", copyTextureSubImage3D);
+        ASSIGN("glDisableVertexArrayAttribEXT", disableVertexArrayAttrib);
+        ASSIGN("glEnableVertexArrayAttribEXT", enableVertexArrayAttrib);
+        ASSIGN("glFlushMappedNamedBufferRangeEXT", flushMappedNamedBufferRange);
+        ASSIGN("glGenerateTextureMipmapEXT", generateTextureMipmap);
+        ASSIGN("glGetCompressedTextureImageEXT", getCompressedTextureImage);
+        ASSIGN("glGetDoublei_vEXT", getDoublei_v);
+        ASSIGN("glGetFloati_vEXT", getFloati_v);
+        ASSIGN("glGetFramebufferParameterivEXT", getFramebufferParameteriv);
+        ASSIGN("glGetNamedBufferParameterivEXT", getNamedBufferParameteriv);
+        ASSIGN("glGetNamedBufferPointervEXT", getNamedBufferPointerv);
+        ASSIGN("glGetNamedBufferSubDataEXT", getNamedBufferSubData);
+        ASSIGN("glGetNamedFramebufferAttachmentParameterivEXT",
+               getNamedFramebufferAttachmentParameteriv);
+        ASSIGN("glGetNamedFramebufferParameterivEXT", getNamedFramebufferParameteriv);
+        ASSIGN("glGetNamedRenderbufferParameterivEXT", getNamedRenderbufferParameteriv);
+        ASSIGN("glGetTextureImageEXT", getTextureImage);
+        ASSIGN("glGetTextureLevelParameterfvEXT", getTextureLevelParameterfv);
+        ASSIGN("glGetTextureLevelParameterivEXT", getTextureLevelParameteriv);
+        ASSIGN("glGetTextureParameterIivEXT", getTextureParameterIiv);
+        ASSIGN("glGetTextureParameterIuivEXT", getTextureParameterIuiv);
+        ASSIGN("glGetTextureParameterfvEXT", getTextureParameterfv);
+        ASSIGN("glGetTextureParameterivEXT", getTextureParameteriv);
+        ASSIGN("glMapNamedBufferEXT", mapNamedBuffer);
+        ASSIGN("glMapNamedBufferRangeEXT", mapNamedBufferRange);
+        ASSIGN("glNamedBufferDataEXT", namedBufferData);
+        ASSIGN("glNamedBufferStorageEXT", namedBufferStorage);
+        ASSIGN("glNamedBufferSubDataEXT", namedBufferSubData);
+        ASSIGN("glNamedFramebufferParameteriEXT", namedFramebufferParameteri);
+        ASSIGN("glNamedFramebufferRenderbufferEXT", namedFramebufferRenderbuffer);
+        ASSIGN("glNamedFramebufferTextureEXT", namedFramebufferTexture);
+        ASSIGN("glNamedFramebufferTextureLayerEXT", namedFramebufferTextureLayer);
+        ASSIGN("glNamedRenderbufferStorageEXT", namedRenderbufferStorage);
+        ASSIGN("glNamedRenderbufferStorageMultisampleEXT", namedRenderbufferStorageMultisample);
+        ASSIGN("glProgramUniform1dEXT", programUniform1d);
+        ASSIGN("glProgramUniform1dvEXT", programUniform1dv);
+        ASSIGN("glProgramUniform2dEXT", programUniform2d);
+        ASSIGN("glProgramUniform2dvEXT", programUniform2dv);
+        ASSIGN("glProgramUniform3dEXT", programUniform3d);
+        ASSIGN("glProgramUniform3dvEXT", programUniform3dv);
+        ASSIGN("glProgramUniform4dEXT", programUniform4d);
+        ASSIGN("glProgramUniform4dvEXT", programUniform4dv);
+        ASSIGN("glProgramUniformMatrix2dvEXT", programUniformMatrix2dv);
+        ASSIGN("glProgramUniformMatrix2x3dvEXT", programUniformMatrix2x3dv);
+        ASSIGN("glProgramUniformMatrix2x4dvEXT", programUniformMatrix2x4dv);
+        ASSIGN("glProgramUniformMatrix3dvEXT", programUniformMatrix3dv);
+        ASSIGN("glProgramUniformMatrix3x2dvEXT", programUniformMatrix3x2dv);
+        ASSIGN("glProgramUniformMatrix3x4dvEXT", programUniformMatrix3x4dv);
+        ASSIGN("glProgramUniformMatrix4dvEXT", programUniformMatrix4dv);
+        ASSIGN("glProgramUniformMatrix4x2dvEXT", programUniformMatrix4x2dv);
+        ASSIGN("glProgramUniformMatrix4x3dvEXT", programUniformMatrix4x3dv);
+        ASSIGN("glTextureBufferEXT", textureBuffer);
+        ASSIGN("glTextureBufferRangeEXT", textureBufferRange);
+        ASSIGN("glTextureParameterIivEXT", textureParameterIiv);
+        ASSIGN("glTextureParameterIuivEXT", textureParameterIuiv);
+        ASSIGN("glTextureParameterfEXT", textureParameterf);
+        ASSIGN("glTextureParameterfvEXT", textureParameterfv);
+        ASSIGN("glTextureParameteriEXT", textureParameteri);
+        ASSIGN("glTextureParameterivEXT", textureParameteriv);
+        ASSIGN("glTextureStorage1DEXT", textureStorage1D);
+        ASSIGN("glTextureStorage2DEXT", textureStorage2D);
+        ASSIGN("glTextureStorage2DMultisampleEXT", textureStorage2DMultisample);
+        ASSIGN("glTextureStorage3DEXT", textureStorage3D);
+        ASSIGN("glTextureStorage3DMultisampleEXT", textureStorage3DMultisample);
+        ASSIGN("glTextureSubImage1DEXT", textureSubImage1D);
+        ASSIGN("glTextureSubImage2DEXT", textureSubImage2D);
+        ASSIGN("glTextureSubImage3DEXT", textureSubImage3D);
+        ASSIGN("glUnmapNamedBufferEXT", unmapNamedBuffer);
+    }
+
+    if (extensions.count("GL_EXT_draw_range_elements") != 0)
+    {
+        ASSIGN("glDrawRangeElementsEXT", drawRangeElements);
+    }
+
+    if (extensions.count("GL_EXT_framebuffer_blit") != 0)
+    {
+        ASSIGN("glBlitFramebufferEXT", blitFramebuffer);
+    }
+
+    if (extensions.count("GL_EXT_framebuffer_multisample") != 0)
+    {
+        ASSIGN("glRenderbufferStorageMultisampleEXT", renderbufferStorageMultisample);
+    }
+
+    if (extensions.count("GL_EXT_framebuffer_object") != 0)
+    {
+        ASSIGN("glBindFramebufferEXT", bindFramebuffer);
+        ASSIGN("glBindRenderbufferEXT", bindRenderbuffer);
+        ASSIGN("glCheckFramebufferStatusEXT", checkFramebufferStatus);
+        ASSIGN("glDeleteFramebuffersEXT", deleteFramebuffers);
+        ASSIGN("glDeleteRenderbuffersEXT", deleteRenderbuffers);
+        ASSIGN("glFramebufferRenderbufferEXT", framebufferRenderbuffer);
+        ASSIGN("glFramebufferTexture1DEXT", framebufferTexture1D);
+        ASSIGN("glFramebufferTexture2DEXT", framebufferTexture2D);
+        ASSIGN("glFramebufferTexture3DEXT", framebufferTexture3D);
+        ASSIGN("glGenFramebuffersEXT", genFramebuffers);
+        ASSIGN("glGenRenderbuffersEXT", genRenderbuffers);
+        ASSIGN("glGenerateMipmapEXT", generateMipmap);
+        ASSIGN("glGetFramebufferAttachmentParameterivEXT", getFramebufferAttachmentParameteriv);
+        ASSIGN("glGetRenderbufferParameterivEXT", getRenderbufferParameteriv);
+        ASSIGN("glIsFramebufferEXT", isFramebuffer);
+        ASSIGN("glIsRenderbufferEXT", isRenderbuffer);
+        ASSIGN("glRenderbufferStorageEXT", renderbufferStorage);
+    }
+
+    if (extensions.count("GL_EXT_gpu_shader4") != 0)
+    {
+        ASSIGN("glBindFragDataLocationEXT", bindFragDataLocation);
+        ASSIGN("glGetFragDataLocationEXT", getFragDataLocation);
+        ASSIGN("glGetUniformuivEXT", getUniformuiv);
+        ASSIGN("glUniform1uiEXT", uniform1ui);
+        ASSIGN("glUniform1uivEXT", uniform1uiv);
+        ASSIGN("glUniform2uiEXT", uniform2ui);
+        ASSIGN("glUniform2uivEXT", uniform2uiv);
+        ASSIGN("glUniform3uiEXT", uniform3ui);
+        ASSIGN("glUniform3uivEXT", uniform3uiv);
+        ASSIGN("glUniform4uiEXT", uniform4ui);
+        ASSIGN("glUniform4uivEXT", uniform4uiv);
+    }
+
+    if (extensions.count("GL_EXT_point_parameters") != 0)
+    {
+        ASSIGN("glPointParameterfEXT", pointParameterf);
+        ASSIGN("glPointParameterfvEXT", pointParameterfv);
+    }
+
+    if (extensions.count("GL_EXT_polygon_offset") != 0)
+    {
+        ASSIGN("glPolygonOffsetEXT", polygonOffset);
+    }
+
+    if (extensions.count("GL_EXT_provoking_vertex") != 0)
+    {
+        ASSIGN("glProvokingVertexEXT", provokingVertex);
+    }
+
+    if (extensions.count("GL_EXT_shader_image_load_store") != 0)
+    {
+        ASSIGN("glBindImageTextureEXT", bindImageTexture);
+        ASSIGN("glMemoryBarrierEXT", memoryBarrier);
+    }
+
+    if (extensions.count("GL_EXT_subtexture") != 0)
+    {
+        ASSIGN("glTexSubImage1DEXT", texSubImage1D);
+        ASSIGN("glTexSubImage2DEXT", texSubImage2D);
+    }
+
+    if (extensions.count("GL_EXT_texture3D") != 0)
+    {
+        ASSIGN("glTexImage3DEXT", texImage3D);
+        ASSIGN("glTexSubImage3DEXT", texSubImage3D);
+    }
+
+    if (extensions.count("GL_EXT_texture_array") != 0)
+    {
+        ASSIGN("glFramebufferTextureLayerEXT", framebufferTextureLayer);
+    }
+
+    if (extensions.count("GL_EXT_texture_buffer_object") != 0)
+    {
+        ASSIGN("glTexBufferEXT", texBuffer);
+    }
+
+    if (extensions.count("GL_EXT_texture_integer") != 0)
+    {
+        ASSIGN("glGetTexParameterIivEXT", getTexParameterIiv);
+        ASSIGN("glGetTexParameterIuivEXT", getTexParameterIuiv);
+        ASSIGN("glTexParameterIivEXT", texParameterIiv);
+        ASSIGN("glTexParameterIuivEXT", texParameterIuiv);
+    }
+
+    if (extensions.count("GL_EXT_texture_object") != 0)
+    {
+        ASSIGN("glBindTextureEXT", bindTexture);
+        ASSIGN("glDeleteTexturesEXT", deleteTextures);
+        ASSIGN("glGenTexturesEXT", genTextures);
+        ASSIGN("glIsTextureEXT", isTexture);
+    }
+
+    if (extensions.count("GL_EXT_timer_query") != 0)
+    {
+        ASSIGN("glGetQueryObjecti64vEXT", getQueryObjecti64v);
+        ASSIGN("glGetQueryObjectui64vEXT", getQueryObjectui64v);
+    }
+
+    if (extensions.count("GL_EXT_transform_feedback") != 0)
+    {
+        ASSIGN("glBeginTransformFeedbackEXT", beginTransformFeedback);
+        ASSIGN("glBindBufferBaseEXT", bindBufferBase);
+        ASSIGN("glBindBufferRangeEXT", bindBufferRange);
+        ASSIGN("glEndTransformFeedbackEXT", endTransformFeedback);
+        ASSIGN("glGetTransformFeedbackVaryingEXT", getTransformFeedbackVarying);
+        ASSIGN("glTransformFeedbackVaryingsEXT", transformFeedbackVaryings);
+    }
+
+    if (extensions.count("GL_EXT_vertex_array") != 0)
+    {
+        ASSIGN("glDrawArraysEXT", drawArrays);
+        ASSIGN("glGetPointervEXT", getPointerv);
+    }
+
+    if (extensions.count("GL_EXT_vertex_attrib_64bit") != 0)
+    {
+        ASSIGN("glGetVertexAttribLdvEXT", getVertexAttribLdv);
+        ASSIGN("glVertexAttribL1dEXT", vertexAttribL1d);
+        ASSIGN("glVertexAttribL1dvEXT", vertexAttribL1dv);
+        ASSIGN("glVertexAttribL2dEXT", vertexAttribL2d);
+        ASSIGN("glVertexAttribL2dvEXT", vertexAttribL2dv);
+        ASSIGN("glVertexAttribL3dEXT", vertexAttribL3d);
+        ASSIGN("glVertexAttribL3dvEXT", vertexAttribL3dv);
+        ASSIGN("glVertexAttribL4dEXT", vertexAttribL4d);
+        ASSIGN("glVertexAttribL4dvEXT", vertexAttribL4dv);
+        ASSIGN("glVertexAttribLPointerEXT", vertexAttribLPointer);
+    }
+
+    if (extensions.count("GL_KHR_debug") != 0)
+    {
+        ASSIGN("glDebugMessageCallback", debugMessageCallback);
+        ASSIGN("glDebugMessageControl", debugMessageControl);
+        ASSIGN("glDebugMessageInsert", debugMessageInsert);
+        ASSIGN("glGetDebugMessageLog", getDebugMessageLog);
+        ASSIGN("glGetObjectLabel", getObjectLabel);
+        ASSIGN("glGetObjectPtrLabel", getObjectPtrLabel);
+        ASSIGN("glGetPointerv", getPointerv);
+        ASSIGN("glObjectLabel", objectLabel);
+        ASSIGN("glObjectPtrLabel", objectPtrLabel);
+        ASSIGN("glPopDebugGroup", popDebugGroup);
+        ASSIGN("glPushDebugGroup", pushDebugGroup);
+    }
+
+    if (extensions.count("GL_KHR_robustness") != 0)
+    {
+        ASSIGN("glGetGraphicsResetStatus", getGraphicsResetStatus);
+        ASSIGN("glGetnUniformfv", getnUniformfv);
+        ASSIGN("glGetnUniformiv", getnUniformiv);
+        ASSIGN("glGetnUniformuiv", getnUniformuiv);
+        ASSIGN("glReadnPixels", readnPixels);
+    }
+
+    if (extensions.count("GL_NV_geometry_program4") != 0)
+    {
+        ASSIGN("glFramebufferTextureEXT", framebufferTexture);
+        ASSIGN("glFramebufferTextureLayerEXT", framebufferTextureLayer);
+    }
+
+    if (extensions.count("GL_NV_vertex_program4") != 0)
+    {
+        ASSIGN("glGetVertexAttribIivEXT", getVertexAttribIiv);
+        ASSIGN("glGetVertexAttribIuivEXT", getVertexAttribIuiv);
+        ASSIGN("glVertexAttribI1iEXT", vertexAttribI1i);
+        ASSIGN("glVertexAttribI1ivEXT", vertexAttribI1iv);
+        ASSIGN("glVertexAttribI1uiEXT", vertexAttribI1ui);
+        ASSIGN("glVertexAttribI1uivEXT", vertexAttribI1uiv);
+        ASSIGN("glVertexAttribI2iEXT", vertexAttribI2i);
+        ASSIGN("glVertexAttribI2ivEXT", vertexAttribI2iv);
+        ASSIGN("glVertexAttribI2uiEXT", vertexAttribI2ui);
+        ASSIGN("glVertexAttribI2uivEXT", vertexAttribI2uiv);
+        ASSIGN("glVertexAttribI3iEXT", vertexAttribI3i);
+        ASSIGN("glVertexAttribI3ivEXT", vertexAttribI3iv);
+        ASSIGN("glVertexAttribI3uiEXT", vertexAttribI3ui);
+        ASSIGN("glVertexAttribI3uivEXT", vertexAttribI3uiv);
+        ASSIGN("glVertexAttribI4bvEXT", vertexAttribI4bv);
+        ASSIGN("glVertexAttribI4iEXT", vertexAttribI4i);
+        ASSIGN("glVertexAttribI4ivEXT", vertexAttribI4iv);
+        ASSIGN("glVertexAttribI4svEXT", vertexAttribI4sv);
+        ASSIGN("glVertexAttribI4ubvEXT", vertexAttribI4ubv);
+        ASSIGN("glVertexAttribI4uiEXT", vertexAttribI4ui);
+        ASSIGN("glVertexAttribI4uivEXT", vertexAttribI4uiv);
+        ASSIGN("glVertexAttribI4usvEXT", vertexAttribI4usv);
+        ASSIGN("glVertexAttribIPointerEXT", vertexAttribIPointer);
+    }
+
+    if (extensions.count("GL_OES_single_precision") != 0)
+    {
+        ASSIGN("glClearDepthfOES", clearDepthf);
+        ASSIGN("glDepthRangefOES", depthRangef);
+    }
+}
+
+void DispatchTableGL::initProcsGLES(const gl::Version &version,
+                                    const std::set<std::string> &extensions)
+{
+    if (version >= gl::Version(2, 0))
+    {
+        ASSIGN("glActiveTexture", activeTexture);
+        ASSIGN("glAttachShader", attachShader);
+        ASSIGN("glBindAttribLocation", bindAttribLocation);
+        ASSIGN("glBindBuffer", bindBuffer);
+        ASSIGN("glBindFramebuffer", bindFramebuffer);
+        ASSIGN("glBindRenderbuffer", bindRenderbuffer);
+        ASSIGN("glBindTexture", bindTexture);
+        ASSIGN("glBlendColor", blendColor);
+        ASSIGN("glBlendEquation", blendEquation);
+        ASSIGN("glBlendEquationSeparate", blendEquationSeparate);
+        ASSIGN("glBlendFunc", blendFunc);
+        ASSIGN("glBlendFuncSeparate", blendFuncSeparate);
+        ASSIGN("glBufferData", bufferData);
+        ASSIGN("glBufferSubData", bufferSubData);
+        ASSIGN("glCheckFramebufferStatus", checkFramebufferStatus);
+        ASSIGN("glClear", clear);
+        ASSIGN("glClearColor", clearColor);
+        ASSIGN("glClearDepthf", clearDepthf);
+        ASSIGN("glClearStencil", clearStencil);
+        ASSIGN("glColorMask", colorMask);
+        ASSIGN("glCompileShader", compileShader);
+        ASSIGN("glCompressedTexImage2D", compressedTexImage2D);
+        ASSIGN("glCompressedTexSubImage2D", compressedTexSubImage2D);
+        ASSIGN("glCopyTexImage2D", copyTexImage2D);
+        ASSIGN("glCopyTexSubImage2D", copyTexSubImage2D);
+        ASSIGN("glCreateProgram", createProgram);
+        ASSIGN("glCreateShader", createShader);
+        ASSIGN("glCullFace", cullFace);
+        ASSIGN("glDeleteBuffers", deleteBuffers);
+        ASSIGN("glDeleteFramebuffers", deleteFramebuffers);
+        ASSIGN("glDeleteProgram", deleteProgram);
+        ASSIGN("glDeleteRenderbuffers", deleteRenderbuffers);
+        ASSIGN("glDeleteShader", deleteShader);
+        ASSIGN("glDeleteTextures", deleteTextures);
+        ASSIGN("glDepthFunc", depthFunc);
+        ASSIGN("glDepthMask", depthMask);
+        ASSIGN("glDepthRangef", depthRangef);
+        ASSIGN("glDetachShader", detachShader);
+        ASSIGN("glDisable", disable);
+        ASSIGN("glDisableVertexAttribArray", disableVertexAttribArray);
+        ASSIGN("glDrawArrays", drawArrays);
+        ASSIGN("glDrawElements", drawElements);
+        ASSIGN("glEnable", enable);
+        ASSIGN("glEnableVertexAttribArray", enableVertexAttribArray);
+        ASSIGN("glFinish", finish);
+        ASSIGN("glFlush", flush);
+        ASSIGN("glFramebufferRenderbuffer", framebufferRenderbuffer);
+        ASSIGN("glFramebufferTexture2D", framebufferTexture2D);
+        ASSIGN("glFrontFace", frontFace);
+        ASSIGN("glGenBuffers", genBuffers);
+        ASSIGN("glGenFramebuffers", genFramebuffers);
+        ASSIGN("glGenRenderbuffers", genRenderbuffers);
+        ASSIGN("glGenTextures", genTextures);
+        ASSIGN("glGenerateMipmap", generateMipmap);
+        ASSIGN("glGetActiveAttrib", getActiveAttrib);
+        ASSIGN("glGetActiveUniform", getActiveUniform);
+        ASSIGN("glGetAttachedShaders", getAttachedShaders);
+        ASSIGN("glGetAttribLocation", getAttribLocation);
+        ASSIGN("glGetBooleanv", getBooleanv);
+        ASSIGN("glGetBufferParameteriv", getBufferParameteriv);
+        ASSIGN("glGetError", getError);
+        ASSIGN("glGetFloatv", getFloatv);
+        ASSIGN("glGetFramebufferAttachmentParameteriv", getFramebufferAttachmentParameteriv);
+        ASSIGN("glGetIntegerv", getIntegerv);
+        ASSIGN("glGetProgramInfoLog", getProgramInfoLog);
+        ASSIGN("glGetProgramiv", getProgramiv);
+        ASSIGN("glGetRenderbufferParameteriv", getRenderbufferParameteriv);
+        ASSIGN("glGetShaderInfoLog", getShaderInfoLog);
+        ASSIGN("glGetShaderPrecisionFormat", getShaderPrecisionFormat);
+        ASSIGN("glGetShaderSource", getShaderSource);
+        ASSIGN("glGetShaderiv", getShaderiv);
+        ASSIGN("glGetString", getString);
+        ASSIGN("glGetTexParameterfv", getTexParameterfv);
+        ASSIGN("glGetTexParameteriv", getTexParameteriv);
+        ASSIGN("glGetUniformLocation", getUniformLocation);
+        ASSIGN("glGetUniformfv", getUniformfv);
+        ASSIGN("glGetUniformiv", getUniformiv);
+        ASSIGN("glGetVertexAttribPointerv", getVertexAttribPointerv);
+        ASSIGN("glGetVertexAttribfv", getVertexAttribfv);
+        ASSIGN("glGetVertexAttribiv", getVertexAttribiv);
+        ASSIGN("glHint", hint);
+        ASSIGN("glIsBuffer", isBuffer);
+        ASSIGN("glIsEnabled", isEnabled);
+        ASSIGN("glIsFramebuffer", isFramebuffer);
+        ASSIGN("glIsProgram", isProgram);
+        ASSIGN("glIsRenderbuffer", isRenderbuffer);
+        ASSIGN("glIsShader", isShader);
+        ASSIGN("glIsTexture", isTexture);
+        ASSIGN("glLineWidth", lineWidth);
+        ASSIGN("glLinkProgram", linkProgram);
+        ASSIGN("glPixelStorei", pixelStorei);
+        ASSIGN("glPolygonOffset", polygonOffset);
+        ASSIGN("glReadPixels", readPixels);
+        ASSIGN("glReleaseShaderCompiler", releaseShaderCompiler);
+        ASSIGN("glRenderbufferStorage", renderbufferStorage);
+        ASSIGN("glSampleCoverage", sampleCoverage);
+        ASSIGN("glScissor", scissor);
+        ASSIGN("glShaderBinary", shaderBinary);
+        ASSIGN("glShaderSource", shaderSource);
+        ASSIGN("glStencilFunc", stencilFunc);
+        ASSIGN("glStencilFuncSeparate", stencilFuncSeparate);
+        ASSIGN("glStencilMask", stencilMask);
+        ASSIGN("glStencilMaskSeparate", stencilMaskSeparate);
+        ASSIGN("glStencilOp", stencilOp);
+        ASSIGN("glStencilOpSeparate", stencilOpSeparate);
+        ASSIGN("glTexImage2D", texImage2D);
+        ASSIGN("glTexParameterf", texParameterf);
+        ASSIGN("glTexParameterfv", texParameterfv);
+        ASSIGN("glTexParameteri", texParameteri);
+        ASSIGN("glTexParameteriv", texParameteriv);
+        ASSIGN("glTexSubImage2D", texSubImage2D);
+        ASSIGN("glUniform1f", uniform1f);
+        ASSIGN("glUniform1fv", uniform1fv);
+        ASSIGN("glUniform1i", uniform1i);
+        ASSIGN("glUniform1iv", uniform1iv);
+        ASSIGN("glUniform2f", uniform2f);
+        ASSIGN("glUniform2fv", uniform2fv);
+        ASSIGN("glUniform2i", uniform2i);
+        ASSIGN("glUniform2iv", uniform2iv);
+        ASSIGN("glUniform3f", uniform3f);
+        ASSIGN("glUniform3fv", uniform3fv);
+        ASSIGN("glUniform3i", uniform3i);
+        ASSIGN("glUniform3iv", uniform3iv);
+        ASSIGN("glUniform4f", uniform4f);
+        ASSIGN("glUniform4fv", uniform4fv);
+        ASSIGN("glUniform4i", uniform4i);
+        ASSIGN("glUniform4iv", uniform4iv);
+        ASSIGN("glUniformMatrix2fv", uniformMatrix2fv);
+        ASSIGN("glUniformMatrix3fv", uniformMatrix3fv);
+        ASSIGN("glUniformMatrix4fv", uniformMatrix4fv);
+        ASSIGN("glUseProgram", useProgram);
+        ASSIGN("glValidateProgram", validateProgram);
+        ASSIGN("glVertexAttrib1f", vertexAttrib1f);
+        ASSIGN("glVertexAttrib1fv", vertexAttrib1fv);
+        ASSIGN("glVertexAttrib2f", vertexAttrib2f);
+        ASSIGN("glVertexAttrib2fv", vertexAttrib2fv);
+        ASSIGN("glVertexAttrib3f", vertexAttrib3f);
+        ASSIGN("glVertexAttrib3fv", vertexAttrib3fv);
+        ASSIGN("glVertexAttrib4f", vertexAttrib4f);
+        ASSIGN("glVertexAttrib4fv", vertexAttrib4fv);
+        ASSIGN("glVertexAttribPointer", vertexAttribPointer);
+        ASSIGN("glViewport", viewport);
+    }
+
+    if (version >= gl::Version(3, 0))
+    {
+        ASSIGN("glBeginQuery", beginQuery);
+        ASSIGN("glBeginTransformFeedback", beginTransformFeedback);
+        ASSIGN("glBindBufferBase", bindBufferBase);
+        ASSIGN("glBindBufferRange", bindBufferRange);
+        ASSIGN("glBindSampler", bindSampler);
+        ASSIGN("glBindTransformFeedback", bindTransformFeedback);
+        ASSIGN("glBindVertexArray", bindVertexArray);
+        ASSIGN("glBlitFramebuffer", blitFramebuffer);
+        ASSIGN("glClearBufferfi", clearBufferfi);
+        ASSIGN("glClearBufferfv", clearBufferfv);
+        ASSIGN("glClearBufferiv", clearBufferiv);
+        ASSIGN("glClearBufferuiv", clearBufferuiv);
+        ASSIGN("glClientWaitSync", clientWaitSync);
+        ASSIGN("glCompressedTexImage3D", compressedTexImage3D);
+        ASSIGN("glCompressedTexSubImage3D", compressedTexSubImage3D);
+        ASSIGN("glCopyBufferSubData", copyBufferSubData);
+        ASSIGN("glCopyTexSubImage3D", copyTexSubImage3D);
+        ASSIGN("glDeleteQueries", deleteQueries);
+        ASSIGN("glDeleteSamplers", deleteSamplers);
+        ASSIGN("glDeleteSync", deleteSync);
+        ASSIGN("glDeleteTransformFeedbacks", deleteTransformFeedbacks);
+        ASSIGN("glDeleteVertexArrays", deleteVertexArrays);
+        ASSIGN("glDrawArraysInstanced", drawArraysInstanced);
+        ASSIGN("glDrawBuffers", drawBuffers);
+        ASSIGN("glDrawElementsInstanced", drawElementsInstanced);
+        ASSIGN("glDrawRangeElements", drawRangeElements);
+        ASSIGN("glEndQuery", endQuery);
+        ASSIGN("glEndTransformFeedback", endTransformFeedback);
+        ASSIGN("glFenceSync", fenceSync);
+        ASSIGN("glFlushMappedBufferRange", flushMappedBufferRange);
+        ASSIGN("glFramebufferTextureLayer", framebufferTextureLayer);
+        ASSIGN("glGenQueries", genQueries);
+        ASSIGN("glGenSamplers", genSamplers);
+        ASSIGN("glGenTransformFeedbacks", genTransformFeedbacks);
+        ASSIGN("glGenVertexArrays", genVertexArrays);
+        ASSIGN("glGetActiveUniformBlockName", getActiveUniformBlockName);
+        ASSIGN("glGetActiveUniformBlockiv", getActiveUniformBlockiv);
+        ASSIGN("glGetActiveUniformsiv", getActiveUniformsiv);
+        ASSIGN("glGetBufferParameteri64v", getBufferParameteri64v);
+        ASSIGN("glGetBufferPointerv", getBufferPointerv);
+        ASSIGN("glGetFragDataLocation", getFragDataLocation);
+        ASSIGN("glGetInteger64i_v", getInteger64i_v);
+        ASSIGN("glGetInteger64v", getInteger64v);
+        ASSIGN("glGetIntegeri_v", getIntegeri_v);
+        ASSIGN("glGetInternalformativ", getInternalformativ);
+        ASSIGN("glGetProgramBinary", getProgramBinary);
+        ASSIGN("glGetQueryObjectuiv", getQueryObjectuiv);
+        ASSIGN("glGetQueryiv", getQueryiv);
+        ASSIGN("glGetSamplerParameterfv", getSamplerParameterfv);
+        ASSIGN("glGetSamplerParameteriv", getSamplerParameteriv);
+        ASSIGN("glGetStringi", getStringi);
+        ASSIGN("glGetSynciv", getSynciv);
+        ASSIGN("glGetTransformFeedbackVarying", getTransformFeedbackVarying);
+        ASSIGN("glGetUniformBlockIndex", getUniformBlockIndex);
+        ASSIGN("glGetUniformIndices", getUniformIndices);
+        ASSIGN("glGetUniformuiv", getUniformuiv);
+        ASSIGN("glGetVertexAttribIiv", getVertexAttribIiv);
+        ASSIGN("glGetVertexAttribIuiv", getVertexAttribIuiv);
+        ASSIGN("glInvalidateFramebuffer", invalidateFramebuffer);
+        ASSIGN("glInvalidateSubFramebuffer", invalidateSubFramebuffer);
+        ASSIGN("glIsQuery", isQuery);
+        ASSIGN("glIsSampler", isSampler);
+        ASSIGN("glIsSync", isSync);
+        ASSIGN("glIsTransformFeedback", isTransformFeedback);
+        ASSIGN("glIsVertexArray", isVertexArray);
+        ASSIGN("glMapBufferRange", mapBufferRange);
+        ASSIGN("glPauseTransformFeedback", pauseTransformFeedback);
+        ASSIGN("glProgramBinary", programBinary);
+        ASSIGN("glProgramParameteri", programParameteri);
+        ASSIGN("glReadBuffer", readBuffer);
+        ASSIGN("glRenderbufferStorageMultisample", renderbufferStorageMultisample);
+        ASSIGN("glResumeTransformFeedback", resumeTransformFeedback);
+        ASSIGN("glSamplerParameterf", samplerParameterf);
+        ASSIGN("glSamplerParameterfv", samplerParameterfv);
+        ASSIGN("glSamplerParameteri", samplerParameteri);
+        ASSIGN("glSamplerParameteriv", samplerParameteriv);
+        ASSIGN("glTexImage3D", texImage3D);
+        ASSIGN("glTexStorage2D", texStorage2D);
+        ASSIGN("glTexStorage3D", texStorage3D);
+        ASSIGN("glTexSubImage3D", texSubImage3D);
+        ASSIGN("glTransformFeedbackVaryings", transformFeedbackVaryings);
+        ASSIGN("glUniform1ui", uniform1ui);
+        ASSIGN("glUniform1uiv", uniform1uiv);
+        ASSIGN("glUniform2ui", uniform2ui);
+        ASSIGN("glUniform2uiv", uniform2uiv);
+        ASSIGN("glUniform3ui", uniform3ui);
+        ASSIGN("glUniform3uiv", uniform3uiv);
+        ASSIGN("glUniform4ui", uniform4ui);
+        ASSIGN("glUniform4uiv", uniform4uiv);
+        ASSIGN("glUniformBlockBinding", uniformBlockBinding);
+        ASSIGN("glUniformMatrix2x3fv", uniformMatrix2x3fv);
+        ASSIGN("glUniformMatrix2x4fv", uniformMatrix2x4fv);
+        ASSIGN("glUniformMatrix3x2fv", uniformMatrix3x2fv);
+        ASSIGN("glUniformMatrix3x4fv", uniformMatrix3x4fv);
+        ASSIGN("glUniformMatrix4x2fv", uniformMatrix4x2fv);
+        ASSIGN("glUniformMatrix4x3fv", uniformMatrix4x3fv);
+        ASSIGN("glUnmapBuffer", unmapBuffer);
+        ASSIGN("glVertexAttribDivisor", vertexAttribDivisor);
+        ASSIGN("glVertexAttribI4i", vertexAttribI4i);
+        ASSIGN("glVertexAttribI4iv", vertexAttribI4iv);
+        ASSIGN("glVertexAttribI4ui", vertexAttribI4ui);
+        ASSIGN("glVertexAttribI4uiv", vertexAttribI4uiv);
+        ASSIGN("glVertexAttribIPointer", vertexAttribIPointer);
+        ASSIGN("glWaitSync", waitSync);
+    }
+
+    if (version >= gl::Version(3, 1))
+    {
+        ASSIGN("glActiveShaderProgram", activeShaderProgram);
+        ASSIGN("glBindImageTexture", bindImageTexture);
+        ASSIGN("glBindProgramPipeline", bindProgramPipeline);
+        ASSIGN("glBindVertexBuffer", bindVertexBuffer);
+        ASSIGN("glCreateShaderProgramv", createShaderProgramv);
+        ASSIGN("glDeleteProgramPipelines", deleteProgramPipelines);
+        ASSIGN("glDispatchCompute", dispatchCompute);
+        ASSIGN("glDispatchComputeIndirect", dispatchComputeIndirect);
+        ASSIGN("glDrawArraysIndirect", drawArraysIndirect);
+        ASSIGN("glDrawElementsIndirect", drawElementsIndirect);
+        ASSIGN("glFramebufferParameteri", framebufferParameteri);
+        ASSIGN("glGenProgramPipelines", genProgramPipelines);
+        ASSIGN("glGetBooleani_v", getBooleani_v);
+        ASSIGN("glGetFramebufferParameteriv", getFramebufferParameteriv);
+        ASSIGN("glGetMultisamplefv", getMultisamplefv);
+        ASSIGN("glGetProgramInterfaceiv", getProgramInterfaceiv);
+        ASSIGN("glGetProgramPipelineInfoLog", getProgramPipelineInfoLog);
+        ASSIGN("glGetProgramPipelineiv", getProgramPipelineiv);
+        ASSIGN("glGetProgramResourceIndex", getProgramResourceIndex);
+        ASSIGN("glGetProgramResourceLocation", getProgramResourceLocation);
+        ASSIGN("glGetProgramResourceName", getProgramResourceName);
+        ASSIGN("glGetProgramResourceiv", getProgramResourceiv);
+        ASSIGN("glGetTexLevelParameterfv", getTexLevelParameterfv);
+        ASSIGN("glGetTexLevelParameteriv", getTexLevelParameteriv);
+        ASSIGN("glIsProgramPipeline", isProgramPipeline);
+        ASSIGN("glMemoryBarrier", memoryBarrier);
+        ASSIGN("glMemoryBarrierByRegion", memoryBarrierByRegion);
+        ASSIGN("glProgramUniform1f", programUniform1f);
+        ASSIGN("glProgramUniform1fv", programUniform1fv);
+        ASSIGN("glProgramUniform1i", programUniform1i);
+        ASSIGN("glProgramUniform1iv", programUniform1iv);
+        ASSIGN("glProgramUniform1ui", programUniform1ui);
+        ASSIGN("glProgramUniform1uiv", programUniform1uiv);
+        ASSIGN("glProgramUniform2f", programUniform2f);
+        ASSIGN("glProgramUniform2fv", programUniform2fv);
+        ASSIGN("glProgramUniform2i", programUniform2i);
+        ASSIGN("glProgramUniform2iv", programUniform2iv);
+        ASSIGN("glProgramUniform2ui", programUniform2ui);
+        ASSIGN("glProgramUniform2uiv", programUniform2uiv);
+        ASSIGN("glProgramUniform3f", programUniform3f);
+        ASSIGN("glProgramUniform3fv", programUniform3fv);
+        ASSIGN("glProgramUniform3i", programUniform3i);
+        ASSIGN("glProgramUniform3iv", programUniform3iv);
+        ASSIGN("glProgramUniform3ui", programUniform3ui);
+        ASSIGN("glProgramUniform3uiv", programUniform3uiv);
+        ASSIGN("glProgramUniform4f", programUniform4f);
+        ASSIGN("glProgramUniform4fv", programUniform4fv);
+        ASSIGN("glProgramUniform4i", programUniform4i);
+        ASSIGN("glProgramUniform4iv", programUniform4iv);
+        ASSIGN("glProgramUniform4ui", programUniform4ui);
+        ASSIGN("glProgramUniform4uiv", programUniform4uiv);
+        ASSIGN("glProgramUniformMatrix2fv", programUniformMatrix2fv);
+        ASSIGN("glProgramUniformMatrix2x3fv", programUniformMatrix2x3fv);
+        ASSIGN("glProgramUniformMatrix2x4fv", programUniformMatrix2x4fv);
+        ASSIGN("glProgramUniformMatrix3fv", programUniformMatrix3fv);
+        ASSIGN("glProgramUniformMatrix3x2fv", programUniformMatrix3x2fv);
+        ASSIGN("glProgramUniformMatrix3x4fv", programUniformMatrix3x4fv);
+        ASSIGN("glProgramUniformMatrix4fv", programUniformMatrix4fv);
+        ASSIGN("glProgramUniformMatrix4x2fv", programUniformMatrix4x2fv);
+        ASSIGN("glProgramUniformMatrix4x3fv", programUniformMatrix4x3fv);
+        ASSIGN("glSampleMaski", sampleMaski);
+        ASSIGN("glTexStorage2DMultisample", texStorage2DMultisample);
+        ASSIGN("glUseProgramStages", useProgramStages);
+        ASSIGN("glValidateProgramPipeline", validateProgramPipeline);
+        ASSIGN("glVertexAttribBinding", vertexAttribBinding);
+        ASSIGN("glVertexAttribFormat", vertexAttribFormat);
+        ASSIGN("glVertexAttribIFormat", vertexAttribIFormat);
+        ASSIGN("glVertexBindingDivisor", vertexBindingDivisor);
+    }
+
+    if (version >= gl::Version(3, 2))
+    {
+        ASSIGN("glBlendBarrier", blendBarrier);
+        ASSIGN("glBlendEquationSeparatei", blendEquationSeparatei);
+        ASSIGN("glBlendEquationi", blendEquationi);
+        ASSIGN("glBlendFuncSeparatei", blendFuncSeparatei);
+        ASSIGN("glBlendFunci", blendFunci);
+        ASSIGN("glColorMaski", colorMaski);
+        ASSIGN("glCopyImageSubData", copyImageSubData);
+        ASSIGN("glDebugMessageCallback", debugMessageCallback);
+        ASSIGN("glDebugMessageControl", debugMessageControl);
+        ASSIGN("glDebugMessageInsert", debugMessageInsert);
+        ASSIGN("glDisablei", disablei);
+        ASSIGN("glDrawElementsBaseVertex", drawElementsBaseVertex);
+        ASSIGN("glDrawElementsInstancedBaseVertex", drawElementsInstancedBaseVertex);
+        ASSIGN("glDrawRangeElementsBaseVertex", drawRangeElementsBaseVertex);
+        ASSIGN("glEnablei", enablei);
+        ASSIGN("glFramebufferTexture", framebufferTexture);
+        ASSIGN("glGetDebugMessageLog", getDebugMessageLog);
+        ASSIGN("glGetGraphicsResetStatus", getGraphicsResetStatus);
+        ASSIGN("glGetObjectLabel", getObjectLabel);
+        ASSIGN("glGetObjectPtrLabel", getObjectPtrLabel);
+        ASSIGN("glGetPointerv", getPointerv);
+        ASSIGN("glGetSamplerParameterIiv", getSamplerParameterIiv);
+        ASSIGN("glGetSamplerParameterIuiv", getSamplerParameterIuiv);
+        ASSIGN("glGetTexParameterIiv", getTexParameterIiv);
+        ASSIGN("glGetTexParameterIuiv", getTexParameterIuiv);
+        ASSIGN("glGetnUniformfv", getnUniformfv);
+        ASSIGN("glGetnUniformiv", getnUniformiv);
+        ASSIGN("glGetnUniformuiv", getnUniformuiv);
+        ASSIGN("glIsEnabledi", isEnabledi);
+        ASSIGN("glMinSampleShading", minSampleShading);
+        ASSIGN("glObjectLabel", objectLabel);
+        ASSIGN("glObjectPtrLabel", objectPtrLabel);
+        ASSIGN("glPatchParameteri", patchParameteri);
+        ASSIGN("glPopDebugGroup", popDebugGroup);
+        ASSIGN("glPrimitiveBoundingBox", primitiveBoundingBox);
+        ASSIGN("glPushDebugGroup", pushDebugGroup);
+        ASSIGN("glReadnPixels", readnPixels);
+        ASSIGN("glSamplerParameterIiv", samplerParameterIiv);
+        ASSIGN("glSamplerParameterIuiv", samplerParameterIuiv);
+        ASSIGN("glTexBuffer", texBuffer);
+        ASSIGN("glTexBufferRange", texBufferRange);
+        ASSIGN("glTexParameterIiv", texParameterIiv);
+        ASSIGN("glTexParameterIuiv", texParameterIuiv);
+        ASSIGN("glTexStorage3DMultisample", texStorage3DMultisample);
+    }
+
+    if (extensions.count("GL_EXT_base_instance") != 0)
+    {
+        ASSIGN("glDrawArraysInstancedBaseInstanceEXT", drawArraysInstancedBaseInstance);
+        ASSIGN("glDrawElementsInstancedBaseInstanceEXT", drawElementsInstancedBaseInstance);
+        ASSIGN("glDrawElementsInstancedBaseVertexBaseInstanceEXT",
+               drawElementsInstancedBaseVertexBaseInstance);
+    }
+
+    if (extensions.count("GL_EXT_blend_func_extended") != 0)
+    {
+        ASSIGN("glBindFragDataLocationEXT", bindFragDataLocation);
+        ASSIGN("glBindFragDataLocationIndexedEXT", bindFragDataLocationIndexed);
+        ASSIGN("glGetFragDataIndexEXT", getFragDataIndex);
+        ASSIGN("glGetProgramResourceLocationIndexEXT", getProgramResourceLocationIndex);
+    }
+
+    if (extensions.count("GL_EXT_buffer_storage") != 0)
+    {
+        ASSIGN("glBufferStorageEXT", bufferStorage);
+    }
+
+    if (extensions.count("GL_EXT_clear_texture") != 0)
+    {
+        ASSIGN("glClearTexImageEXT", clearTexImage);
+        ASSIGN("glClearTexSubImageEXT", clearTexSubImage);
+    }
+
+    if (extensions.count("GL_EXT_copy_image") != 0)
+    {
+        ASSIGN("glCopyImageSubDataEXT", copyImageSubData);
+    }
+
+    if (extensions.count("GL_EXT_discard_framebuffer") != 0)
+    {
+        ASSIGN("glDiscardFramebufferEXT", discardFramebufferEXT);
+    }
+
+    if (extensions.count("GL_EXT_disjoint_timer_query") != 0)
+    {
+        ASSIGN("glBeginQueryEXT", beginQuery);
+        ASSIGN("glDeleteQueriesEXT", deleteQueries);
+        ASSIGN("glEndQueryEXT", endQuery);
+        ASSIGN("glGenQueriesEXT", genQueries);
+        ASSIGN("glGetQueryObjecti64vEXT", getQueryObjecti64v);
+        ASSIGN("glGetQueryObjectivEXT", getQueryObjectiv);
+        ASSIGN("glGetQueryObjectui64vEXT", getQueryObjectui64v);
+        ASSIGN("glGetQueryObjectuivEXT", getQueryObjectuiv);
+        ASSIGN("glGetQueryivEXT", getQueryiv);
+        ASSIGN("glIsQueryEXT", isQuery);
+        ASSIGN("glQueryCounterEXT", queryCounter);
+    }
+
+    if (extensions.count("GL_EXT_draw_buffers") != 0)
+    {
+        ASSIGN("glDrawBuffersEXT", drawBuffers);
+    }
+
+    if (extensions.count("GL_EXT_draw_buffers_indexed") != 0)
+    {
+        ASSIGN("glBlendEquationSeparateiEXT", blendEquationSeparatei);
+        ASSIGN("glBlendEquationiEXT", blendEquationi);
+        ASSIGN("glBlendFuncSeparateiEXT", blendFuncSeparatei);
+        ASSIGN("glBlendFunciEXT", blendFunci);
+        ASSIGN("glColorMaskiEXT", colorMaski);
+        ASSIGN("glDisableiEXT", disablei);
+        ASSIGN("glEnableiEXT", enablei);
+        ASSIGN("glIsEnablediEXT", isEnabledi);
+    }
+
+    if (extensions.count("GL_EXT_draw_elements_base_vertex") != 0)
+    {
+        ASSIGN("glDrawElementsBaseVertexEXT", drawElementsBaseVertex);
+        ASSIGN("glDrawElementsInstancedBaseVertexEXT", drawElementsInstancedBaseVertex);
+        ASSIGN("glDrawRangeElementsBaseVertexEXT", drawRangeElementsBaseVertex);
+        ASSIGN("glMultiDrawElementsBaseVertexEXT", multiDrawElementsBaseVertex);
+    }
+
+    if (extensions.count("GL_EXT_draw_transform_feedback") != 0)
+    {
+        ASSIGN("glDrawTransformFeedbackEXT", drawTransformFeedback);
+        ASSIGN("glDrawTransformFeedbackInstancedEXT", drawTransformFeedbackInstanced);
+    }
+
+    if (extensions.count("GL_EXT_geometry_shader") != 0)
+    {
+        ASSIGN("glFramebufferTextureEXT", framebufferTexture);
+    }
+
+    if (extensions.count("GL_EXT_instanced_arrays") != 0)
+    {
+        ASSIGN("glVertexAttribDivisorEXT", vertexAttribDivisor);
+    }
+
+    if (extensions.count("GL_EXT_map_buffer_range") != 0)
+    {
+        ASSIGN("glFlushMappedBufferRangeEXT", flushMappedBufferRange);
+        ASSIGN("glMapBufferRangeEXT", mapBufferRange);
+    }
+
+    if (extensions.count("GL_EXT_multi_draw_indirect") != 0)
+    {
+        ASSIGN("glMultiDrawArraysIndirectEXT", multiDrawArraysIndirect);
+        ASSIGN("glMultiDrawElementsIndirectEXT", multiDrawElementsIndirect);
+    }
+
+    if (extensions.count("GL_EXT_multisampled_render_to_texture") != 0)
+    {
+        ASSIGN("glRenderbufferStorageMultisampleEXT", renderbufferStorageMultisample);
+    }
+
+    if (extensions.count("GL_EXT_multiview_draw_buffers") != 0)
+    {
+        ASSIGN("glGetIntegeri_vEXT", getIntegeri_v);
+    }
+
+    if (extensions.count("GL_EXT_occlusion_query_boolean") != 0)
+    {
+        ASSIGN("glBeginQueryEXT", beginQuery);
+        ASSIGN("glDeleteQueriesEXT", deleteQueries);
+        ASSIGN("glEndQueryEXT", endQuery);
+        ASSIGN("glGenQueriesEXT", genQueries);
+        ASSIGN("glGetQueryObjectuivEXT", getQueryObjectuiv);
+        ASSIGN("glGetQueryivEXT", getQueryiv);
+        ASSIGN("glIsQueryEXT", isQuery);
+    }
+
+    if (extensions.count("GL_EXT_primitive_bounding_box") != 0)
+    {
+        ASSIGN("glPrimitiveBoundingBoxEXT", primitiveBoundingBox);
+    }
+
+    if (extensions.count("GL_EXT_robustness") != 0)
+    {
+        ASSIGN("glGetGraphicsResetStatusEXT", getGraphicsResetStatus);
+        ASSIGN("glGetnUniformfvEXT", getnUniformfv);
+        ASSIGN("glGetnUniformivEXT", getnUniformiv);
+        ASSIGN("glReadnPixelsEXT", readnPixels);
+    }
+
+    if (extensions.count("GL_EXT_tessellation_shader") != 0)
+    {
+        ASSIGN("glPatchParameteriEXT", patchParameteri);
+    }
+
+    if (extensions.count("GL_EXT_texture_border_clamp") != 0)
+    {
+        ASSIGN("glGetSamplerParameterIivEXT", getSamplerParameterIiv);
+        ASSIGN("glGetSamplerParameterIuivEXT", getSamplerParameterIuiv);
+        ASSIGN("glGetTexParameterIivEXT", getTexParameterIiv);
+        ASSIGN("glGetTexParameterIuivEXT", getTexParameterIuiv);
+        ASSIGN("glSamplerParameterIivEXT", samplerParameterIiv);
+        ASSIGN("glSamplerParameterIuivEXT", samplerParameterIuiv);
+        ASSIGN("glTexParameterIivEXT", texParameterIiv);
+        ASSIGN("glTexParameterIuivEXT", texParameterIuiv);
+    }
+
+    if (extensions.count("GL_EXT_texture_buffer") != 0)
+    {
+        ASSIGN("glTexBufferEXT", texBuffer);
+        ASSIGN("glTexBufferRangeEXT", texBufferRange);
+    }
+
+    if (extensions.count("GL_EXT_texture_storage") != 0)
+    {
+        ASSIGN("glTexStorage1DEXT", texStorage1D);
+        ASSIGN("glTexStorage2DEXT", texStorage2D);
+        ASSIGN("glTexStorage3DEXT", texStorage3D);
+        ASSIGN("glTextureStorage1DEXT", textureStorage1D);
+        ASSIGN("glTextureStorage2DEXT", textureStorage2D);
+        ASSIGN("glTextureStorage3DEXT", textureStorage3D);
+    }
+
+    if (extensions.count("GL_EXT_texture_view") != 0)
+    {
+        ASSIGN("glTextureViewEXT", textureView);
+    }
+
+    if (extensions.count("GL_KHR_debug") != 0)
+    {
+        ASSIGN("glDebugMessageCallbackKHR", debugMessageCallback);
+        ASSIGN("glDebugMessageControlKHR", debugMessageControl);
+        ASSIGN("glDebugMessageInsertKHR", debugMessageInsert);
+        ASSIGN("glGetDebugMessageLogKHR", getDebugMessageLog);
+        ASSIGN("glGetObjectLabelKHR", getObjectLabel);
+        ASSIGN("glGetObjectPtrLabelKHR", getObjectPtrLabel);
+        ASSIGN("glGetPointervKHR", getPointerv);
+        ASSIGN("glObjectLabelKHR", objectLabel);
+        ASSIGN("glObjectPtrLabelKHR", objectPtrLabel);
+        ASSIGN("glPopDebugGroupKHR", popDebugGroup);
+        ASSIGN("glPushDebugGroupKHR", pushDebugGroup);
+    }
+
+    if (extensions.count("GL_KHR_robustness") != 0)
+    {
+        ASSIGN("glGetGraphicsResetStatusKHR", getGraphicsResetStatus);
+        ASSIGN("glGetnUniformfvKHR", getnUniformfv);
+        ASSIGN("glGetnUniformivKHR", getnUniformiv);
+        ASSIGN("glGetnUniformuivKHR", getnUniformuiv);
+        ASSIGN("glReadnPixelsKHR", readnPixels);
+    }
+
+    if (extensions.count("GL_OES_EGL_image") != 0)
+    {
+        ASSIGN("glEGLImageTargetRenderbufferStorageOES", eGLImageTargetRenderbufferStorageOES);
+        ASSIGN("glEGLImageTargetTexture2DOES", eGLImageTargetTexture2DOES);
+    }
+
+    if (extensions.count("GL_OES_copy_image") != 0)
+    {
+        ASSIGN("glCopyImageSubDataOES", copyImageSubData);
+    }
+
+    if (extensions.count("GL_OES_draw_buffers_indexed") != 0)
+    {
+        ASSIGN("glBlendEquationSeparateiOES", blendEquationSeparatei);
+        ASSIGN("glBlendEquationiOES", blendEquationi);
+        ASSIGN("glBlendFuncSeparateiOES", blendFuncSeparatei);
+        ASSIGN("glBlendFunciOES", blendFunci);
+        ASSIGN("glColorMaskiOES", colorMaski);
+        ASSIGN("glDisableiOES", disablei);
+        ASSIGN("glEnableiOES", enablei);
+        ASSIGN("glIsEnablediOES", isEnabledi);
+    }
+
+    if (extensions.count("GL_OES_draw_elements_base_vertex") != 0)
+    {
+        ASSIGN("glDrawElementsBaseVertexOES", drawElementsBaseVertex);
+        ASSIGN("glDrawElementsInstancedBaseVertexOES", drawElementsInstancedBaseVertex);
+        ASSIGN("glDrawRangeElementsBaseVertexOES", drawRangeElementsBaseVertex);
+        ASSIGN("glMultiDrawElementsBaseVertexOES", multiDrawElementsBaseVertex);
+    }
+
+    if (extensions.count("GL_OES_geometry_shader") != 0)
+    {
+        ASSIGN("glFramebufferTextureOES", framebufferTexture);
+    }
+
+    if (extensions.count("GL_OES_get_program_binary") != 0)
+    {
+        ASSIGN("glGetProgramBinaryOES", getProgramBinary);
+        ASSIGN("glProgramBinaryOES", programBinary);
+    }
+
+    if (extensions.count("GL_OES_mapbuffer") != 0)
+    {
+        ASSIGN("glGetBufferPointervOES", getBufferPointerv);
+        ASSIGN("glMapBufferOES", mapBuffer);
+        ASSIGN("glUnmapBufferOES", unmapBuffer);
+    }
+
+    if (extensions.count("GL_OES_primitive_bounding_box") != 0)
+    {
+        ASSIGN("glPrimitiveBoundingBoxOES", primitiveBoundingBox);
+    }
+
+    if (extensions.count("GL_OES_sample_shading") != 0)
+    {
+        ASSIGN("glMinSampleShadingOES", minSampleShading);
+    }
+
+    if (extensions.count("GL_OES_tessellation_shader") != 0)
+    {
+        ASSIGN("glPatchParameteriOES", patchParameteri);
+    }
+
+    if (extensions.count("GL_OES_texture_3D") != 0)
+    {
+        ASSIGN("glCompressedTexImage3DOES", compressedTexImage3D);
+        ASSIGN("glCompressedTexSubImage3DOES", compressedTexSubImage3D);
+        ASSIGN("glCopyTexSubImage3DOES", copyTexSubImage3D);
+        ASSIGN("glFramebufferTexture3DOES", framebufferTexture3D);
+        ASSIGN("glTexImage3DOES", texImage3D);
+        ASSIGN("glTexSubImage3DOES", texSubImage3D);
+    }
+
+    if (extensions.count("GL_OES_texture_border_clamp") != 0)
+    {
+        ASSIGN("glGetSamplerParameterIivOES", getSamplerParameterIiv);
+        ASSIGN("glGetSamplerParameterIuivOES", getSamplerParameterIuiv);
+        ASSIGN("glGetTexParameterIivOES", getTexParameterIiv);
+        ASSIGN("glGetTexParameterIuivOES", getTexParameterIuiv);
+        ASSIGN("glSamplerParameterIivOES", samplerParameterIiv);
+        ASSIGN("glSamplerParameterIuivOES", samplerParameterIuiv);
+        ASSIGN("glTexParameterIivOES", texParameterIiv);
+        ASSIGN("glTexParameterIuivOES", texParameterIuiv);
+    }
+
+    if (extensions.count("GL_OES_texture_buffer") != 0)
+    {
+        ASSIGN("glTexBufferOES", texBuffer);
+        ASSIGN("glTexBufferRangeOES", texBufferRange);
+    }
+
+    if (extensions.count("GL_OES_texture_storage_multisample_2d_array") != 0)
+    {
+        ASSIGN("glTexStorage3DMultisampleOES", texStorage3DMultisample);
+    }
+
+    if (extensions.count("GL_OES_texture_view") != 0)
+    {
+        ASSIGN("glTextureViewOES", textureView);
+    }
+
+    if (extensions.count("GL_OES_vertex_array_object") != 0)
+    {
+        ASSIGN("glBindVertexArrayOES", bindVertexArray);
+        ASSIGN("glDeleteVertexArraysOES", deleteVertexArrays);
+        ASSIGN("glGenVertexArraysOES", genVertexArrays);
+        ASSIGN("glIsVertexArrayOES", isVertexArray);
+    }
+
+    if (extensions.count("GL_OES_viewport_array") != 0)
+    {
+        ASSIGN("glDisableiOES", disablei);
+        ASSIGN("glEnableiOES", enablei);
+        ASSIGN("glGetFloati_vOES", getFloati_v);
+        ASSIGN("glIsEnablediOES", isEnabledi);
+        ASSIGN("glScissorArrayvOES", scissorArrayv);
+        ASSIGN("glScissorIndexedOES", scissorIndexed);
+        ASSIGN("glScissorIndexedvOES", scissorIndexedv);
+        ASSIGN("glViewportArrayvOES", viewportArrayv);
+        ASSIGN("glViewportIndexedfOES", viewportIndexedf);
+        ASSIGN("glViewportIndexedfvOES", viewportIndexedfv);
+    }
+}
+
+void DispatchTableGL::initProcsSharedExtensions(const std::set<std::string> &extensions)
+{
+    if (extensions.count("GL_EXT_blend_minmax") != 0)
+    {
+        ASSIGN("glBlendEquationEXT", blendEquation);
+    }
+
+    if (extensions.count("GL_EXT_debug_label") != 0)
+    {
+        ASSIGN("glGetObjectLabelEXT", getObjectLabel);
+    }
+
+    if (extensions.count("GL_EXT_draw_instanced") != 0)
+    {
+        ASSIGN("glDrawArraysInstancedEXT", drawArraysInstanced);
+        ASSIGN("glDrawElementsInstancedEXT", drawElementsInstanced);
+    }
+
+    if (extensions.count("GL_EXT_multi_draw_arrays") != 0)
+    {
+        ASSIGN("glMultiDrawArraysEXT", multiDrawArrays);
+        ASSIGN("glMultiDrawElementsEXT", multiDrawElements);
+    }
+
+    if (extensions.count("GL_EXT_separate_shader_objects") != 0)
+    {
+        ASSIGN("glActiveShaderProgramEXT", activeShaderProgram);
+        ASSIGN("glBindProgramPipelineEXT", bindProgramPipeline);
+        ASSIGN("glCreateShaderProgramvEXT", createShaderProgramv);
+        ASSIGN("glDeleteProgramPipelinesEXT", deleteProgramPipelines);
+        ASSIGN("glGenProgramPipelinesEXT", genProgramPipelines);
+        ASSIGN("glGetProgramPipelineInfoLogEXT", getProgramPipelineInfoLog);
+        ASSIGN("glGetProgramPipelineivEXT", getProgramPipelineiv);
+        ASSIGN("glIsProgramPipelineEXT", isProgramPipeline);
+        ASSIGN("glProgramParameteriEXT", programParameteri);
+        ASSIGN("glProgramUniform1fEXT", programUniform1f);
+        ASSIGN("glProgramUniform1fvEXT", programUniform1fv);
+        ASSIGN("glProgramUniform1iEXT", programUniform1i);
+        ASSIGN("glProgramUniform1ivEXT", programUniform1iv);
+        ASSIGN("glProgramUniform1uiEXT", programUniform1ui);
+        ASSIGN("glProgramUniform1uivEXT", programUniform1uiv);
+        ASSIGN("glProgramUniform2fEXT", programUniform2f);
+        ASSIGN("glProgramUniform2fvEXT", programUniform2fv);
+        ASSIGN("glProgramUniform2iEXT", programUniform2i);
+        ASSIGN("glProgramUniform2ivEXT", programUniform2iv);
+        ASSIGN("glProgramUniform2uiEXT", programUniform2ui);
+        ASSIGN("glProgramUniform2uivEXT", programUniform2uiv);
+        ASSIGN("glProgramUniform3fEXT", programUniform3f);
+        ASSIGN("glProgramUniform3fvEXT", programUniform3fv);
+        ASSIGN("glProgramUniform3iEXT", programUniform3i);
+        ASSIGN("glProgramUniform3ivEXT", programUniform3iv);
+        ASSIGN("glProgramUniform3uiEXT", programUniform3ui);
+        ASSIGN("glProgramUniform3uivEXT", programUniform3uiv);
+        ASSIGN("glProgramUniform4fEXT", programUniform4f);
+        ASSIGN("glProgramUniform4fvEXT", programUniform4fv);
+        ASSIGN("glProgramUniform4iEXT", programUniform4i);
+        ASSIGN("glProgramUniform4ivEXT", programUniform4iv);
+        ASSIGN("glProgramUniform4uiEXT", programUniform4ui);
+        ASSIGN("glProgramUniform4uivEXT", programUniform4uiv);
+        ASSIGN("glProgramUniformMatrix2fvEXT", programUniformMatrix2fv);
+        ASSIGN("glProgramUniformMatrix2x3fvEXT", programUniformMatrix2x3fv);
+        ASSIGN("glProgramUniformMatrix2x4fvEXT", programUniformMatrix2x4fv);
+        ASSIGN("glProgramUniformMatrix3fvEXT", programUniformMatrix3fv);
+        ASSIGN("glProgramUniformMatrix3x2fvEXT", programUniformMatrix3x2fv);
+        ASSIGN("glProgramUniformMatrix3x4fvEXT", programUniformMatrix3x4fv);
+        ASSIGN("glProgramUniformMatrix4fvEXT", programUniformMatrix4fv);
+        ASSIGN("glProgramUniformMatrix4fvEXT", programUniformMatrix4fv);
+        ASSIGN("glProgramUniformMatrix4x2fvEXT", programUniformMatrix4x2fv);
+        ASSIGN("glProgramUniformMatrix4x3fvEXT", programUniformMatrix4x3fv);
+        ASSIGN("glUseProgramStagesEXT", useProgramStages);
+        ASSIGN("glValidateProgramPipelineEXT", validateProgramPipeline);
+    }
+
+    if (extensions.count("GL_NV_fence") != 0)
+    {
+        ASSIGN("glDeleteFencesNV", deleteFencesNV);
+        ASSIGN("glFinishFenceNV", finishFenceNV);
+        ASSIGN("glGenFencesNV", genFencesNV);
+        ASSIGN("glGetFenceivNV", getFenceivNV);
+        ASSIGN("glIsFenceNV", isFenceNV);
+        ASSIGN("glSetFenceNV", setFenceNV);
+        ASSIGN("glTestFenceNV", testFenceNV);
+    }
+
+    if (extensions.count("GL_NV_framebuffer_mixed_samples") != 0)
+    {
+        ASSIGN("glCoverageModulationNV", coverageModulationNV);
+    }
+
+    if (extensions.count("GL_NV_internalformat_sample_query") != 0)
+    {
+        ASSIGN("glGetInternalformatSampleivNV", getInternalformatSampleivNV);
+    }
+
+    if (extensions.count("GL_NV_path_rendering") != 0)
+    {
+        ASSIGN("glCoverFillPathInstancedNV", coverFillPathInstancedNV);
+        ASSIGN("glCoverFillPathNV", coverFillPathNV);
+        ASSIGN("glCoverStrokePathInstancedNV", coverStrokePathInstancedNV);
+        ASSIGN("glCoverStrokePathNV", coverStrokePathNV);
+        ASSIGN("glDeletePathsNV", deletePathsNV);
+        ASSIGN("glGenPathsNV", genPathsNV);
+        ASSIGN("glGetPathParameterfvNV", getPathParameterfvNV);
+        ASSIGN("glGetPathParameterivNV", getPathParameterivNV);
+        ASSIGN("glIsPathNV", isPathNV);
+        ASSIGN("glMatrixLoadfEXT", matrixLoadfEXT);
+        ASSIGN("glPathCommandsNV", pathCommandsNV);
+        ASSIGN("glPathParameterfNV", pathParameterfNV);
+        ASSIGN("glPathParameteriNV", pathParameteriNV);
+        ASSIGN("glPathStencilFuncNV", pathStencilFuncNV);
+        ASSIGN("glProgramPathFragmentInputGenNV", programPathFragmentInputGenNV);
+        ASSIGN("glStencilFillPathInstancedNV", stencilFillPathInstancedNV);
+        ASSIGN("glStencilFillPathNV", stencilFillPathNV);
+        ASSIGN("glStencilStrokePathInstancedNV", stencilStrokePathInstancedNV);
+        ASSIGN("glStencilStrokePathNV", stencilStrokePathNV);
+        ASSIGN("glStencilThenCoverFillPathInstancedNV", stencilThenCoverFillPathInstancedNV);
+        ASSIGN("glStencilThenCoverFillPathNV", stencilThenCoverFillPathNV);
+        ASSIGN("glStencilThenCoverStrokePathInstancedNV", stencilThenCoverStrokePathInstancedNV);
+        ASSIGN("glStencilThenCoverStrokePathNV", stencilThenCoverStrokePathNV);
+    }
+}
+
+}  // namespace rx
diff --git a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h
new file mode 100644
index 0000000..fafc949
--- /dev/null
+++ b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h
@@ -0,0 +1,779 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_gl_dispatch_table.py using data from gl_bindings_data.json and gl.xml.
+//
+// Copyright 2017 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// DispatchTableGL_autogen.h:
+//   Defines the native binding interface for ANGLE's OpenGL back-end.
+
+#ifndef LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_
+#define LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_
+
+#include "common/angleutils.h"
+#include "libANGLE/renderer/gl/functionsgl_typedefs.h"
+
+#include <set>
+
+namespace gl
+{
+struct Version;
+}  // namespace gl
+
+namespace rx
+{
+class DispatchTableGL : angle::NonCopyable
+{
+  public:
+    // 1.0
+    PFNGLBLENDFUNCPROC blendFunc                           = nullptr;
+    PFNGLCLEARPROC clear                                   = nullptr;
+    PFNGLCLEARCOLORPROC clearColor                         = nullptr;
+    PFNGLCLEARDEPTHPROC clearDepth                         = nullptr;
+    PFNGLCLEARSTENCILPROC clearStencil                     = nullptr;
+    PFNGLCOLORMASKPROC colorMask                           = nullptr;
+    PFNGLCULLFACEPROC cullFace                             = nullptr;
+    PFNGLDEPTHFUNCPROC depthFunc                           = nullptr;
+    PFNGLDEPTHMASKPROC depthMask                           = nullptr;
+    PFNGLDEPTHRANGEPROC depthRange                         = nullptr;
+    PFNGLDISABLEPROC disable                               = nullptr;
+    PFNGLDRAWBUFFERPROC drawBuffer                         = nullptr;
+    PFNGLENABLEPROC enable                                 = nullptr;
+    PFNGLFINISHPROC finish                                 = nullptr;
+    PFNGLFLUSHPROC flush                                   = nullptr;
+    PFNGLFRONTFACEPROC frontFace                           = nullptr;
+    PFNGLGETBOOLEANVPROC getBooleanv                       = nullptr;
+    PFNGLGETDOUBLEVPROC getDoublev                         = nullptr;
+    PFNGLGETERRORPROC getError                             = nullptr;
+    PFNGLGETFLOATVPROC getFloatv                           = nullptr;
+    PFNGLGETINTEGERVPROC getIntegerv                       = nullptr;
+    PFNGLGETSTRINGPROC getString                           = nullptr;
+    PFNGLGETTEXIMAGEPROC getTexImage                       = nullptr;
+    PFNGLGETTEXLEVELPARAMETERFVPROC getTexLevelParameterfv = nullptr;
+    PFNGLGETTEXLEVELPARAMETERIVPROC getTexLevelParameteriv = nullptr;
+    PFNGLGETTEXPARAMETERFVPROC getTexParameterfv           = nullptr;
+    PFNGLGETTEXPARAMETERIVPROC getTexParameteriv           = nullptr;
+    PFNGLHINTPROC hint                                     = nullptr;
+    PFNGLISENABLEDPROC isEnabled                           = nullptr;
+    PFNGLLINEWIDTHPROC lineWidth                           = nullptr;
+    PFNGLLOGICOPPROC logicOp                               = nullptr;
+    PFNGLPIXELSTOREFPROC pixelStoref                       = nullptr;
+    PFNGLPIXELSTOREIPROC pixelStorei                       = nullptr;
+    PFNGLPOINTSIZEPROC pointSize                           = nullptr;
+    PFNGLPOLYGONMODEPROC polygonMode                       = nullptr;
+    PFNGLREADBUFFERPROC readBuffer                         = nullptr;
+    PFNGLREADPIXELSPROC readPixels                         = nullptr;
+    PFNGLSCISSORPROC scissor                               = nullptr;
+    PFNGLSTENCILFUNCPROC stencilFunc                       = nullptr;
+    PFNGLSTENCILMASKPROC stencilMask                       = nullptr;
+    PFNGLSTENCILOPPROC stencilOp                           = nullptr;
+    PFNGLTEXIMAGE1DPROC texImage1D                         = nullptr;
+    PFNGLTEXIMAGE2DPROC texImage2D                         = nullptr;
+    PFNGLTEXPARAMETERFPROC texParameterf                   = nullptr;
+    PFNGLTEXPARAMETERFVPROC texParameterfv                 = nullptr;
+    PFNGLTEXPARAMETERIPROC texParameteri                   = nullptr;
+    PFNGLTEXPARAMETERIVPROC texParameteriv                 = nullptr;
+    PFNGLVIEWPORTPROC viewport                             = nullptr;
+
+    // 1.1
+    PFNGLBINDTEXTUREPROC bindTexture             = nullptr;
+    PFNGLCOPYTEXIMAGE1DPROC copyTexImage1D       = nullptr;
+    PFNGLCOPYTEXIMAGE2DPROC copyTexImage2D       = nullptr;
+    PFNGLCOPYTEXSUBIMAGE1DPROC copyTexSubImage1D = nullptr;
+    PFNGLCOPYTEXSUBIMAGE2DPROC copyTexSubImage2D = nullptr;
+    PFNGLDELETETEXTURESPROC deleteTextures       = nullptr;
+    PFNGLDRAWARRAYSPROC drawArrays               = nullptr;
+    PFNGLDRAWELEMENTSPROC drawElements           = nullptr;
+    PFNGLGENTEXTURESPROC genTextures             = nullptr;
+    PFNGLISTEXTUREPROC isTexture                 = nullptr;
+    PFNGLPOLYGONOFFSETPROC polygonOffset         = nullptr;
+    PFNGLTEXSUBIMAGE1DPROC texSubImage1D         = nullptr;
+    PFNGLTEXSUBIMAGE2DPROC texSubImage2D         = nullptr;
+
+    // 1.2
+    PFNGLBLENDCOLORPROC blendColor               = nullptr;
+    PFNGLBLENDEQUATIONPROC blendEquation         = nullptr;
+    PFNGLCOPYTEXSUBIMAGE3DPROC copyTexSubImage3D = nullptr;
+    PFNGLDRAWRANGEELEMENTSPROC drawRangeElements = nullptr;
+    PFNGLTEXIMAGE3DPROC texImage3D               = nullptr;
+    PFNGLTEXSUBIMAGE3DPROC texSubImage3D         = nullptr;
+
+    // 1.2 Extensions
+    PFNGLDELETEFENCESNVPROC deleteFencesNV = nullptr;
+    PFNGLFINISHFENCENVPROC finishFenceNV   = nullptr;
+    PFNGLGENFENCESNVPROC genFencesNV       = nullptr;
+    PFNGLGETFENCEIVNVPROC getFenceivNV     = nullptr;
+    PFNGLISFENCENVPROC isFenceNV           = nullptr;
+    PFNGLSETFENCENVPROC setFenceNV         = nullptr;
+    PFNGLTESTFENCENVPROC testFenceNV       = nullptr;
+
+    // 1.3
+    PFNGLACTIVETEXTUREPROC activeTexture                     = nullptr;
+    PFNGLCOMPRESSEDTEXIMAGE1DPROC compressedTexImage1D       = nullptr;
+    PFNGLCOMPRESSEDTEXIMAGE2DPROC compressedTexImage2D       = nullptr;
+    PFNGLCOMPRESSEDTEXIMAGE3DPROC compressedTexImage3D       = nullptr;
+    PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC compressedTexSubImage1D = nullptr;
+    PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC compressedTexSubImage2D = nullptr;
+    PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC compressedTexSubImage3D = nullptr;
+    PFNGLGETCOMPRESSEDTEXIMAGEPROC getCompressedTexImage     = nullptr;
+    PFNGLSAMPLECOVERAGEPROC sampleCoverage                   = nullptr;
+
+    // 1.4
+    PFNGLBLENDFUNCSEPARATEPROC blendFuncSeparate = nullptr;
+    PFNGLMULTIDRAWARRAYSPROC multiDrawArrays     = nullptr;
+    PFNGLMULTIDRAWELEMENTSPROC multiDrawElements = nullptr;
+    PFNGLPOINTPARAMETERFPROC pointParameterf     = nullptr;
+    PFNGLPOINTPARAMETERFVPROC pointParameterfv   = nullptr;
+    PFNGLPOINTPARAMETERIPROC pointParameteri     = nullptr;
+    PFNGLPOINTPARAMETERIVPROC pointParameteriv   = nullptr;
+
+    // 1.5
+    PFNGLBEGINQUERYPROC beginQuery                     = nullptr;
+    PFNGLBINDBUFFERPROC bindBuffer                     = nullptr;
+    PFNGLBUFFERDATAPROC bufferData                     = nullptr;
+    PFNGLBUFFERSUBDATAPROC bufferSubData               = nullptr;
+    PFNGLDELETEBUFFERSPROC deleteBuffers               = nullptr;
+    PFNGLDELETEQUERIESPROC deleteQueries               = nullptr;
+    PFNGLENDQUERYPROC endQuery                         = nullptr;
+    PFNGLGENBUFFERSPROC genBuffers                     = nullptr;
+    PFNGLGENQUERIESPROC genQueries                     = nullptr;
+    PFNGLGETBUFFERPARAMETERIVPROC getBufferParameteriv = nullptr;
+    PFNGLGETBUFFERPOINTERVPROC getBufferPointerv       = nullptr;
+    PFNGLGETBUFFERSUBDATAPROC getBufferSubData         = nullptr;
+    PFNGLGETQUERYOBJECTIVPROC getQueryObjectiv         = nullptr;
+    PFNGLGETQUERYOBJECTUIVPROC getQueryObjectuiv       = nullptr;
+    PFNGLGETQUERYIVPROC getQueryiv                     = nullptr;
+    PFNGLISBUFFERPROC isBuffer                         = nullptr;
+    PFNGLISQUERYPROC isQuery                           = nullptr;
+    PFNGLMAPBUFFERPROC mapBuffer                       = nullptr;
+    PFNGLUNMAPBUFFERPROC unmapBuffer                   = nullptr;
+
+    // 2.0
+    PFNGLATTACHSHADERPROC attachShader                         = nullptr;
+    PFNGLBINDATTRIBLOCATIONPROC bindAttribLocation             = nullptr;
+    PFNGLBLENDEQUATIONSEPARATEPROC blendEquationSeparate       = nullptr;
+    PFNGLCOMPILESHADERPROC compileShader                       = nullptr;
+    PFNGLCREATEPROGRAMPROC createProgram                       = nullptr;
+    PFNGLCREATESHADERPROC createShader                         = nullptr;
+    PFNGLDELETEPROGRAMPROC deleteProgram                       = nullptr;
+    PFNGLDELETESHADERPROC deleteShader                         = nullptr;
+    PFNGLDETACHSHADERPROC detachShader                         = nullptr;
+    PFNGLDISABLEVERTEXATTRIBARRAYPROC disableVertexAttribArray = nullptr;
+    PFNGLDRAWBUFFERSPROC drawBuffers                           = nullptr;
+    PFNGLENABLEVERTEXATTRIBARRAYPROC enableVertexAttribArray   = nullptr;
+    PFNGLGETACTIVEATTRIBPROC getActiveAttrib                   = nullptr;
+    PFNGLGETACTIVEUNIFORMPROC getActiveUniform                 = nullptr;
+    PFNGLGETATTACHEDSHADERSPROC getAttachedShaders             = nullptr;
+    PFNGLGETATTRIBLOCATIONPROC getAttribLocation               = nullptr;
+    PFNGLGETPROGRAMINFOLOGPROC getProgramInfoLog               = nullptr;
+    PFNGLGETPROGRAMIVPROC getProgramiv                         = nullptr;
+    PFNGLGETSHADERINFOLOGPROC getShaderInfoLog                 = nullptr;
+    PFNGLGETSHADERSOURCEPROC getShaderSource                   = nullptr;
+    PFNGLGETSHADERIVPROC getShaderiv                           = nullptr;
+    PFNGLGETUNIFORMLOCATIONPROC getUniformLocation             = nullptr;
+    PFNGLGETUNIFORMFVPROC getUniformfv                         = nullptr;
+    PFNGLGETUNIFORMIVPROC getUniformiv                         = nullptr;
+    PFNGLGETVERTEXATTRIBPOINTERVPROC getVertexAttribPointerv   = nullptr;
+    PFNGLGETVERTEXATTRIBDVPROC getVertexAttribdv               = nullptr;
+    PFNGLGETVERTEXATTRIBFVPROC getVertexAttribfv               = nullptr;
+    PFNGLGETVERTEXATTRIBIVPROC getVertexAttribiv               = nullptr;
+    PFNGLISPROGRAMPROC isProgram                               = nullptr;
+    PFNGLISSHADERPROC isShader                                 = nullptr;
+    PFNGLLINKPROGRAMPROC linkProgram                           = nullptr;
+    PFNGLSHADERSOURCEPROC shaderSource                         = nullptr;
+    PFNGLSTENCILFUNCSEPARATEPROC stencilFuncSeparate           = nullptr;
+    PFNGLSTENCILMASKSEPARATEPROC stencilMaskSeparate           = nullptr;
+    PFNGLSTENCILOPSEPARATEPROC stencilOpSeparate               = nullptr;
+    PFNGLUNIFORM1FPROC uniform1f                               = nullptr;
+    PFNGLUNIFORM1FVPROC uniform1fv                             = nullptr;
+    PFNGLUNIFORM1IPROC uniform1i                               = nullptr;
+    PFNGLUNIFORM1IVPROC uniform1iv                             = nullptr;
+    PFNGLUNIFORM2FPROC uniform2f                               = nullptr;
+    PFNGLUNIFORM2FVPROC uniform2fv                             = nullptr;
+    PFNGLUNIFORM2IPROC uniform2i                               = nullptr;
+    PFNGLUNIFORM2IVPROC uniform2iv                             = nullptr;
+    PFNGLUNIFORM3FPROC uniform3f                               = nullptr;
+    PFNGLUNIFORM3FVPROC uniform3fv                             = nullptr;
+    PFNGLUNIFORM3IPROC uniform3i                               = nullptr;
+    PFNGLUNIFORM3IVPROC uniform3iv                             = nullptr;
+    PFNGLUNIFORM4FPROC uniform4f                               = nullptr;
+    PFNGLUNIFORM4FVPROC uniform4fv                             = nullptr;
+    PFNGLUNIFORM4IPROC uniform4i                               = nullptr;
+    PFNGLUNIFORM4IVPROC uniform4iv                             = nullptr;
+    PFNGLUNIFORMMATRIX2FVPROC uniformMatrix2fv                 = nullptr;
+    PFNGLUNIFORMMATRIX3FVPROC uniformMatrix3fv                 = nullptr;
+    PFNGLUNIFORMMATRIX4FVPROC uniformMatrix4fv                 = nullptr;
+    PFNGLUSEPROGRAMPROC useProgram                             = nullptr;
+    PFNGLVALIDATEPROGRAMPROC validateProgram                   = nullptr;
+    PFNGLVERTEXATTRIB1DPROC vertexAttrib1d                     = nullptr;
+    PFNGLVERTEXATTRIB1DVPROC vertexAttrib1dv                   = nullptr;
+    PFNGLVERTEXATTRIB1FPROC vertexAttrib1f                     = nullptr;
+    PFNGLVERTEXATTRIB1FVPROC vertexAttrib1fv                   = nullptr;
+    PFNGLVERTEXATTRIB1SPROC vertexAttrib1s                     = nullptr;
+    PFNGLVERTEXATTRIB1SVPROC vertexAttrib1sv                   = nullptr;
+    PFNGLVERTEXATTRIB2DPROC vertexAttrib2d                     = nullptr;
+    PFNGLVERTEXATTRIB2DVPROC vertexAttrib2dv                   = nullptr;
+    PFNGLVERTEXATTRIB2FPROC vertexAttrib2f                     = nullptr;
+    PFNGLVERTEXATTRIB2FVPROC vertexAttrib2fv                   = nullptr;
+    PFNGLVERTEXATTRIB2SPROC vertexAttrib2s                     = nullptr;
+    PFNGLVERTEXATTRIB2SVPROC vertexAttrib2sv                   = nullptr;
+    PFNGLVERTEXATTRIB3DPROC vertexAttrib3d                     = nullptr;
+    PFNGLVERTEXATTRIB3DVPROC vertexAttrib3dv                   = nullptr;
+    PFNGLVERTEXATTRIB3FPROC vertexAttrib3f                     = nullptr;
+    PFNGLVERTEXATTRIB3FVPROC vertexAttrib3fv                   = nullptr;
+    PFNGLVERTEXATTRIB3SPROC vertexAttrib3s                     = nullptr;
+    PFNGLVERTEXATTRIB3SVPROC vertexAttrib3sv                   = nullptr;
+    PFNGLVERTEXATTRIB4NBVPROC vertexAttrib4Nbv                 = nullptr;
+    PFNGLVERTEXATTRIB4NIVPROC vertexAttrib4Niv                 = nullptr;
+    PFNGLVERTEXATTRIB4NSVPROC vertexAttrib4Nsv                 = nullptr;
+    PFNGLVERTEXATTRIB4NUBPROC vertexAttrib4Nub                 = nullptr;
+    PFNGLVERTEXATTRIB4NUBVPROC vertexAttrib4Nubv               = nullptr;
+    PFNGLVERTEXATTRIB4NUIVPROC vertexAttrib4Nuiv               = nullptr;
+    PFNGLVERTEXATTRIB4NUSVPROC vertexAttrib4Nusv               = nullptr;
+    PFNGLVERTEXATTRIB4BVPROC vertexAttrib4bv                   = nullptr;
+    PFNGLVERTEXATTRIB4DPROC vertexAttrib4d                     = nullptr;
+    PFNGLVERTEXATTRIB4DVPROC vertexAttrib4dv                   = nullptr;
+    PFNGLVERTEXATTRIB4FPROC vertexAttrib4f                     = nullptr;
+    PFNGLVERTEXATTRIB4FVPROC vertexAttrib4fv                   = nullptr;
+    PFNGLVERTEXATTRIB4IVPROC vertexAttrib4iv                   = nullptr;
+    PFNGLVERTEXATTRIB4SPROC vertexAttrib4s                     = nullptr;
+    PFNGLVERTEXATTRIB4SVPROC vertexAttrib4sv                   = nullptr;
+    PFNGLVERTEXATTRIB4UBVPROC vertexAttrib4ubv                 = nullptr;
+    PFNGLVERTEXATTRIB4UIVPROC vertexAttrib4uiv                 = nullptr;
+    PFNGLVERTEXATTRIB4USVPROC vertexAttrib4usv                 = nullptr;
+    PFNGLVERTEXATTRIBPOINTERPROC vertexAttribPointer           = nullptr;
+
+    // 2.1
+    PFNGLUNIFORMMATRIX2X3FVPROC uniformMatrix2x3fv = nullptr;
+    PFNGLUNIFORMMATRIX2X4FVPROC uniformMatrix2x4fv = nullptr;
+    PFNGLUNIFORMMATRIX3X2FVPROC uniformMatrix3x2fv = nullptr;
+    PFNGLUNIFORMMATRIX3X4FVPROC uniformMatrix3x4fv = nullptr;
+    PFNGLUNIFORMMATRIX4X2FVPROC uniformMatrix4x2fv = nullptr;
+    PFNGLUNIFORMMATRIX4X3FVPROC uniformMatrix4x3fv = nullptr;
+
+    // 3.0
+    PFNGLBEGINCONDITIONALRENDERPROC beginConditionalRender                           = nullptr;
+    PFNGLBEGINTRANSFORMFEEDBACKPROC beginTransformFeedback                           = nullptr;
+    PFNGLBINDBUFFERBASEPROC bindBufferBase                                           = nullptr;
+    PFNGLBINDBUFFERRANGEPROC bindBufferRange                                         = nullptr;
+    PFNGLBINDFRAGDATALOCATIONPROC bindFragDataLocation                               = nullptr;
+    PFNGLBINDFRAMEBUFFERPROC bindFramebuffer                                         = nullptr;
+    PFNGLBINDRENDERBUFFERPROC bindRenderbuffer                                       = nullptr;
+    PFNGLBINDVERTEXARRAYPROC bindVertexArray                                         = nullptr;
+    PFNGLBLITFRAMEBUFFERPROC blitFramebuffer                                         = nullptr;
+    PFNGLCHECKFRAMEBUFFERSTATUSPROC checkFramebufferStatus                           = nullptr;
+    PFNGLCLAMPCOLORPROC clampColor                                                   = nullptr;
+    PFNGLCLEARBUFFERFIPROC clearBufferfi                                             = nullptr;
+    PFNGLCLEARBUFFERFVPROC clearBufferfv                                             = nullptr;
+    PFNGLCLEARBUFFERIVPROC clearBufferiv                                             = nullptr;
+    PFNGLCLEARBUFFERUIVPROC clearBufferuiv                                           = nullptr;
+    PFNGLCOLORMASKIPROC colorMaski                                                   = nullptr;
+    PFNGLDELETEFRAMEBUFFERSPROC deleteFramebuffers                                   = nullptr;
+    PFNGLDELETERENDERBUFFERSPROC deleteRenderbuffers                                 = nullptr;
+    PFNGLDELETEVERTEXARRAYSPROC deleteVertexArrays                                   = nullptr;
+    PFNGLDISABLEIPROC disablei                                                       = nullptr;
+    PFNGLENABLEIPROC enablei                                                         = nullptr;
+    PFNGLENDCONDITIONALRENDERPROC endConditionalRender                               = nullptr;
+    PFNGLENDTRANSFORMFEEDBACKPROC endTransformFeedback                               = nullptr;
+    PFNGLFLUSHMAPPEDBUFFERRANGEPROC flushMappedBufferRange                           = nullptr;
+    PFNGLFRAMEBUFFERRENDERBUFFERPROC framebufferRenderbuffer                         = nullptr;
+    PFNGLFRAMEBUFFERTEXTURE1DPROC framebufferTexture1D                               = nullptr;
+    PFNGLFRAMEBUFFERTEXTURE2DPROC framebufferTexture2D                               = nullptr;
+    PFNGLFRAMEBUFFERTEXTURE3DPROC framebufferTexture3D                               = nullptr;
+    PFNGLFRAMEBUFFERTEXTURELAYERPROC framebufferTextureLayer                         = nullptr;
+    PFNGLGENFRAMEBUFFERSPROC genFramebuffers                                         = nullptr;
+    PFNGLGENRENDERBUFFERSPROC genRenderbuffers                                       = nullptr;
+    PFNGLGENVERTEXARRAYSPROC genVertexArrays                                         = nullptr;
+    PFNGLGENERATEMIPMAPPROC generateMipmap                                           = nullptr;
+    PFNGLGETBOOLEANI_VPROC getBooleani_v                                             = nullptr;
+    PFNGLGETFRAGDATALOCATIONPROC getFragDataLocation                                 = nullptr;
+    PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC getFramebufferAttachmentParameteriv = nullptr;
+    PFNGLGETINTEGERI_VPROC getIntegeri_v                                             = nullptr;
+    PFNGLGETRENDERBUFFERPARAMETERIVPROC getRenderbufferParameteriv                   = nullptr;
+    PFNGLGETSTRINGIPROC getStringi                                                   = nullptr;
+    PFNGLGETTEXPARAMETERIIVPROC getTexParameterIiv                                   = nullptr;
+    PFNGLGETTEXPARAMETERIUIVPROC getTexParameterIuiv                                 = nullptr;
+    PFNGLGETTRANSFORMFEEDBACKVARYINGPROC getTransformFeedbackVarying                 = nullptr;
+    PFNGLGETUNIFORMUIVPROC getUniformuiv                                             = nullptr;
+    PFNGLGETVERTEXATTRIBIIVPROC getVertexAttribIiv                                   = nullptr;
+    PFNGLGETVERTEXATTRIBIUIVPROC getVertexAttribIuiv                                 = nullptr;
+    PFNGLISENABLEDIPROC isEnabledi                                                   = nullptr;
+    PFNGLISFRAMEBUFFERPROC isFramebuffer                                             = nullptr;
+    PFNGLISRENDERBUFFERPROC isRenderbuffer                                           = nullptr;
+    PFNGLISVERTEXARRAYPROC isVertexArray                                             = nullptr;
+    PFNGLMAPBUFFERRANGEPROC mapBufferRange                                           = nullptr;
+    PFNGLRENDERBUFFERSTORAGEPROC renderbufferStorage                                 = nullptr;
+    PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC renderbufferStorageMultisample           = nullptr;
+    PFNGLTEXPARAMETERIIVPROC texParameterIiv                                         = nullptr;
+    PFNGLTEXPARAMETERIUIVPROC texParameterIuiv                                       = nullptr;
+    PFNGLTRANSFORMFEEDBACKVARYINGSPROC transformFeedbackVaryings                     = nullptr;
+    PFNGLUNIFORM1UIPROC uniform1ui                                                   = nullptr;
+    PFNGLUNIFORM1UIVPROC uniform1uiv                                                 = nullptr;
+    PFNGLUNIFORM2UIPROC uniform2ui                                                   = nullptr;
+    PFNGLUNIFORM2UIVPROC uniform2uiv                                                 = nullptr;
+    PFNGLUNIFORM3UIPROC uniform3ui                                                   = nullptr;
+    PFNGLUNIFORM3UIVPROC uniform3uiv                                                 = nullptr;
+    PFNGLUNIFORM4UIPROC uniform4ui                                                   = nullptr;
+    PFNGLUNIFORM4UIVPROC uniform4uiv                                                 = nullptr;
+    PFNGLVERTEXATTRIBI1IPROC vertexAttribI1i                                         = nullptr;
+    PFNGLVERTEXATTRIBI1IVPROC vertexAttribI1iv                                       = nullptr;
+    PFNGLVERTEXATTRIBI1UIPROC vertexAttribI1ui                                       = nullptr;
+    PFNGLVERTEXATTRIBI1UIVPROC vertexAttribI1uiv                                     = nullptr;
+    PFNGLVERTEXATTRIBI2IPROC vertexAttribI2i                                         = nullptr;
+    PFNGLVERTEXATTRIBI2IVPROC vertexAttribI2iv                                       = nullptr;
+    PFNGLVERTEXATTRIBI2UIPROC vertexAttribI2ui                                       = nullptr;
+    PFNGLVERTEXATTRIBI2UIVPROC vertexAttribI2uiv                                     = nullptr;
+    PFNGLVERTEXATTRIBI3IPROC vertexAttribI3i                                         = nullptr;
+    PFNGLVERTEXATTRIBI3IVPROC vertexAttribI3iv                                       = nullptr;
+    PFNGLVERTEXATTRIBI3UIPROC vertexAttribI3ui                                       = nullptr;
+    PFNGLVERTEXATTRIBI3UIVPROC vertexAttribI3uiv                                     = nullptr;
+    PFNGLVERTEXATTRIBI4BVPROC vertexAttribI4bv                                       = nullptr;
+    PFNGLVERTEXATTRIBI4IPROC vertexAttribI4i                                         = nullptr;
+    PFNGLVERTEXATTRIBI4IVPROC vertexAttribI4iv                                       = nullptr;
+    PFNGLVERTEXATTRIBI4SVPROC vertexAttribI4sv                                       = nullptr;
+    PFNGLVERTEXATTRIBI4UBVPROC vertexAttribI4ubv                                     = nullptr;
+    PFNGLVERTEXATTRIBI4UIPROC vertexAttribI4ui                                       = nullptr;
+    PFNGLVERTEXATTRIBI4UIVPROC vertexAttribI4uiv                                     = nullptr;
+    PFNGLVERTEXATTRIBI4USVPROC vertexAttribI4usv                                     = nullptr;
+    PFNGLVERTEXATTRIBIPOINTERPROC vertexAttribIPointer                               = nullptr;
+
+    // 3.1
+    PFNGLCOPYBUFFERSUBDATAPROC copyBufferSubData                 = nullptr;
+    PFNGLDRAWARRAYSINSTANCEDPROC drawArraysInstanced             = nullptr;
+    PFNGLDRAWELEMENTSINSTANCEDPROC drawElementsInstanced         = nullptr;
+    PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC getActiveUniformBlockName = nullptr;
+    PFNGLGETACTIVEUNIFORMBLOCKIVPROC getActiveUniformBlockiv     = nullptr;
+    PFNGLGETACTIVEUNIFORMNAMEPROC getActiveUniformName           = nullptr;
+    PFNGLGETACTIVEUNIFORMSIVPROC getActiveUniformsiv             = nullptr;
+    PFNGLGETUNIFORMBLOCKINDEXPROC getUniformBlockIndex           = nullptr;
+    PFNGLGETUNIFORMINDICESPROC getUniformIndices                 = nullptr;
+    PFNGLPRIMITIVERESTARTINDEXPROC primitiveRestartIndex         = nullptr;
+    PFNGLTEXBUFFERPROC texBuffer                                 = nullptr;
+    PFNGLUNIFORMBLOCKBINDINGPROC uniformBlockBinding             = nullptr;
+
+    // 3.2
+    PFNGLCLIENTWAITSYNCPROC clientWaitSync                                   = nullptr;
+    PFNGLDELETESYNCPROC deleteSync                                           = nullptr;
+    PFNGLDRAWELEMENTSBASEVERTEXPROC drawElementsBaseVertex                   = nullptr;
+    PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC drawElementsInstancedBaseVertex = nullptr;
+    PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC drawRangeElementsBaseVertex         = nullptr;
+    PFNGLFENCESYNCPROC fenceSync                                             = nullptr;
+    PFNGLFRAMEBUFFERTEXTUREPROC framebufferTexture                           = nullptr;
+    PFNGLGETBUFFERPARAMETERI64VPROC getBufferParameteri64v                   = nullptr;
+    PFNGLGETINTEGER64I_VPROC getInteger64i_v                                 = nullptr;
+    PFNGLGETINTEGER64VPROC getInteger64v                                     = nullptr;
+    PFNGLGETMULTISAMPLEFVPROC getMultisamplefv                               = nullptr;
+    PFNGLGETSYNCIVPROC getSynciv                                             = nullptr;
+    PFNGLISSYNCPROC isSync                                                   = nullptr;
+    PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC multiDrawElementsBaseVertex         = nullptr;
+    PFNGLPROVOKINGVERTEXPROC provokingVertex                                 = nullptr;
+    PFNGLSAMPLEMASKIPROC sampleMaski                                         = nullptr;
+    PFNGLTEXIMAGE2DMULTISAMPLEPROC texImage2DMultisample                     = nullptr;
+    PFNGLTEXIMAGE3DMULTISAMPLEPROC texImage3DMultisample                     = nullptr;
+    PFNGLWAITSYNCPROC waitSync                                               = nullptr;
+
+    // 3.3
+    PFNGLBINDFRAGDATALOCATIONINDEXEDPROC bindFragDataLocationIndexed = nullptr;
+    PFNGLBINDSAMPLERPROC bindSampler                                 = nullptr;
+    PFNGLDELETESAMPLERSPROC deleteSamplers                           = nullptr;
+    PFNGLGENSAMPLERSPROC genSamplers                                 = nullptr;
+    PFNGLGETFRAGDATAINDEXPROC getFragDataIndex                       = nullptr;
+    PFNGLGETQUERYOBJECTI64VPROC getQueryObjecti64v                   = nullptr;
+    PFNGLGETQUERYOBJECTUI64VPROC getQueryObjectui64v                 = nullptr;
+    PFNGLGETSAMPLERPARAMETERIIVPROC getSamplerParameterIiv           = nullptr;
+    PFNGLGETSAMPLERPARAMETERIUIVPROC getSamplerParameterIuiv         = nullptr;
+    PFNGLGETSAMPLERPARAMETERFVPROC getSamplerParameterfv             = nullptr;
+    PFNGLGETSAMPLERPARAMETERIVPROC getSamplerParameteriv             = nullptr;
+    PFNGLISSAMPLERPROC isSampler                                     = nullptr;
+    PFNGLQUERYCOUNTERPROC queryCounter                               = nullptr;
+    PFNGLSAMPLERPARAMETERIIVPROC samplerParameterIiv                 = nullptr;
+    PFNGLSAMPLERPARAMETERIUIVPROC samplerParameterIuiv               = nullptr;
+    PFNGLSAMPLERPARAMETERFPROC samplerParameterf                     = nullptr;
+    PFNGLSAMPLERPARAMETERFVPROC samplerParameterfv                   = nullptr;
+    PFNGLSAMPLERPARAMETERIPROC samplerParameteri                     = nullptr;
+    PFNGLSAMPLERPARAMETERIVPROC samplerParameteriv                   = nullptr;
+    PFNGLVERTEXATTRIBDIVISORPROC vertexAttribDivisor                 = nullptr;
+    PFNGLVERTEXATTRIBP1UIPROC vertexAttribP1ui                       = nullptr;
+    PFNGLVERTEXATTRIBP1UIVPROC vertexAttribP1uiv                     = nullptr;
+    PFNGLVERTEXATTRIBP2UIPROC vertexAttribP2ui                       = nullptr;
+    PFNGLVERTEXATTRIBP2UIVPROC vertexAttribP2uiv                     = nullptr;
+    PFNGLVERTEXATTRIBP3UIPROC vertexAttribP3ui                       = nullptr;
+    PFNGLVERTEXATTRIBP3UIVPROC vertexAttribP3uiv                     = nullptr;
+    PFNGLVERTEXATTRIBP4UIPROC vertexAttribP4ui                       = nullptr;
+    PFNGLVERTEXATTRIBP4UIVPROC vertexAttribP4uiv                     = nullptr;
+
+    // 4.0
+    PFNGLBEGINQUERYINDEXEDPROC beginQueryIndexed                           = nullptr;
+    PFNGLBINDTRANSFORMFEEDBACKPROC bindTransformFeedback                   = nullptr;
+    PFNGLBLENDEQUATIONSEPARATEIPROC blendEquationSeparatei                 = nullptr;
+    PFNGLBLENDEQUATIONIPROC blendEquationi                                 = nullptr;
+    PFNGLBLENDFUNCSEPARATEIPROC blendFuncSeparatei                         = nullptr;
+    PFNGLBLENDFUNCIPROC blendFunci                                         = nullptr;
+    PFNGLDELETETRANSFORMFEEDBACKSPROC deleteTransformFeedbacks             = nullptr;
+    PFNGLDRAWARRAYSINDIRECTPROC drawArraysIndirect                         = nullptr;
+    PFNGLDRAWELEMENTSINDIRECTPROC drawElementsIndirect                     = nullptr;
+    PFNGLDRAWTRANSFORMFEEDBACKPROC drawTransformFeedback                   = nullptr;
+    PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC drawTransformFeedbackStream       = nullptr;
+    PFNGLENDQUERYINDEXEDPROC endQueryIndexed                               = nullptr;
+    PFNGLGENTRANSFORMFEEDBACKSPROC genTransformFeedbacks                   = nullptr;
+    PFNGLGETACTIVESUBROUTINENAMEPROC getActiveSubroutineName               = nullptr;
+    PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC getActiveSubroutineUniformName = nullptr;
+    PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC getActiveSubroutineUniformiv     = nullptr;
+    PFNGLGETPROGRAMSTAGEIVPROC getProgramStageiv                           = nullptr;
+    PFNGLGETQUERYINDEXEDIVPROC getQueryIndexediv                           = nullptr;
+    PFNGLGETSUBROUTINEINDEXPROC getSubroutineIndex                         = nullptr;
+    PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC getSubroutineUniformLocation     = nullptr;
+    PFNGLGETUNIFORMSUBROUTINEUIVPROC getUniformSubroutineuiv               = nullptr;
+    PFNGLGETUNIFORMDVPROC getUniformdv                                     = nullptr;
+    PFNGLISTRANSFORMFEEDBACKPROC isTransformFeedback                       = nullptr;
+    PFNGLMINSAMPLESHADINGPROC minSampleShading                             = nullptr;
+    PFNGLPATCHPARAMETERFVPROC patchParameterfv                             = nullptr;
+    PFNGLPATCHPARAMETERIPROC patchParameteri                               = nullptr;
+    PFNGLPAUSETRANSFORMFEEDBACKPROC pauseTransformFeedback                 = nullptr;
+    PFNGLRESUMETRANSFORMFEEDBACKPROC resumeTransformFeedback               = nullptr;
+    PFNGLUNIFORM1DPROC uniform1d                                           = nullptr;
+    PFNGLUNIFORM1DVPROC uniform1dv                                         = nullptr;
+    PFNGLUNIFORM2DPROC uniform2d                                           = nullptr;
+    PFNGLUNIFORM2DVPROC uniform2dv                                         = nullptr;
+    PFNGLUNIFORM3DPROC uniform3d                                           = nullptr;
+    PFNGLUNIFORM3DVPROC uniform3dv                                         = nullptr;
+    PFNGLUNIFORM4DPROC uniform4d                                           = nullptr;
+    PFNGLUNIFORM4DVPROC uniform4dv                                         = nullptr;
+    PFNGLUNIFORMMATRIX2DVPROC uniformMatrix2dv                             = nullptr;
+    PFNGLUNIFORMMATRIX2X3DVPROC uniformMatrix2x3dv                         = nullptr;
+    PFNGLUNIFORMMATRIX2X4DVPROC uniformMatrix2x4dv                         = nullptr;
+    PFNGLUNIFORMMATRIX3DVPROC uniformMatrix3dv                             = nullptr;
+    PFNGLUNIFORMMATRIX3X2DVPROC uniformMatrix3x2dv                         = nullptr;
+    PFNGLUNIFORMMATRIX3X4DVPROC uniformMatrix3x4dv                         = nullptr;
+    PFNGLUNIFORMMATRIX4DVPROC uniformMatrix4dv                             = nullptr;
+    PFNGLUNIFORMMATRIX4X2DVPROC uniformMatrix4x2dv                         = nullptr;
+    PFNGLUNIFORMMATRIX4X3DVPROC uniformMatrix4x3dv                         = nullptr;
+    PFNGLUNIFORMSUBROUTINESUIVPROC uniformSubroutinesuiv                   = nullptr;
+
+    // 4.1
+    PFNGLACTIVESHADERPROGRAMPROC activeShaderProgram             = nullptr;
+    PFNGLBINDPROGRAMPIPELINEPROC bindProgramPipeline             = nullptr;
+    PFNGLCLEARDEPTHFPROC clearDepthf                             = nullptr;
+    PFNGLCREATESHADERPROGRAMVPROC createShaderProgramv           = nullptr;
+    PFNGLDELETEPROGRAMPIPELINESPROC deleteProgramPipelines       = nullptr;
+    PFNGLDEPTHRANGEARRAYVPROC depthRangeArrayv                   = nullptr;
+    PFNGLDEPTHRANGEINDEXEDPROC depthRangeIndexed                 = nullptr;
+    PFNGLDEPTHRANGEFPROC depthRangef                             = nullptr;
+    PFNGLGENPROGRAMPIPELINESPROC genProgramPipelines             = nullptr;
+    PFNGLGETDOUBLEI_VPROC getDoublei_v                           = nullptr;
+    PFNGLGETFLOATI_VPROC getFloati_v                             = nullptr;
+    PFNGLGETPROGRAMBINARYPROC getProgramBinary                   = nullptr;
+    PFNGLGETPROGRAMPIPELINEINFOLOGPROC getProgramPipelineInfoLog = nullptr;
+    PFNGLGETPROGRAMPIPELINEIVPROC getProgramPipelineiv           = nullptr;
+    PFNGLGETSHADERPRECISIONFORMATPROC getShaderPrecisionFormat   = nullptr;
+    PFNGLGETVERTEXATTRIBLDVPROC getVertexAttribLdv               = nullptr;
+    PFNGLISPROGRAMPIPELINEPROC isProgramPipeline                 = nullptr;
+    PFNGLPROGRAMBINARYPROC programBinary                         = nullptr;
+    PFNGLPROGRAMPARAMETERIPROC programParameteri                 = nullptr;
+    PFNGLPROGRAMUNIFORM1DPROC programUniform1d                   = nullptr;
+    PFNGLPROGRAMUNIFORM1DVPROC programUniform1dv                 = nullptr;
+    PFNGLPROGRAMUNIFORM1FPROC programUniform1f                   = nullptr;
+    PFNGLPROGRAMUNIFORM1FVPROC programUniform1fv                 = nullptr;
+    PFNGLPROGRAMUNIFORM1IPROC programUniform1i                   = nullptr;
+    PFNGLPROGRAMUNIFORM1IVPROC programUniform1iv                 = nullptr;
+    PFNGLPROGRAMUNIFORM1UIPROC programUniform1ui                 = nullptr;
+    PFNGLPROGRAMUNIFORM1UIVPROC programUniform1uiv               = nullptr;
+    PFNGLPROGRAMUNIFORM2DPROC programUniform2d                   = nullptr;
+    PFNGLPROGRAMUNIFORM2DVPROC programUniform2dv                 = nullptr;
+    PFNGLPROGRAMUNIFORM2FPROC programUniform2f                   = nullptr;
+    PFNGLPROGRAMUNIFORM2FVPROC programUniform2fv                 = nullptr;
+    PFNGLPROGRAMUNIFORM2IPROC programUniform2i                   = nullptr;
+    PFNGLPROGRAMUNIFORM2IVPROC programUniform2iv                 = nullptr;
+    PFNGLPROGRAMUNIFORM2UIPROC programUniform2ui                 = nullptr;
+    PFNGLPROGRAMUNIFORM2UIVPROC programUniform2uiv               = nullptr;
+    PFNGLPROGRAMUNIFORM3DPROC programUniform3d                   = nullptr;
+    PFNGLPROGRAMUNIFORM3DVPROC programUniform3dv                 = nullptr;
+    PFNGLPROGRAMUNIFORM3FPROC programUniform3f                   = nullptr;
+    PFNGLPROGRAMUNIFORM3FVPROC programUniform3fv                 = nullptr;
+    PFNGLPROGRAMUNIFORM3IPROC programUniform3i                   = nullptr;
+    PFNGLPROGRAMUNIFORM3IVPROC programUniform3iv                 = nullptr;
+    PFNGLPROGRAMUNIFORM3UIPROC programUniform3ui                 = nullptr;
+    PFNGLPROGRAMUNIFORM3UIVPROC programUniform3uiv               = nullptr;
+    PFNGLPROGRAMUNIFORM4DPROC programUniform4d                   = nullptr;
+    PFNGLPROGRAMUNIFORM4DVPROC programUniform4dv                 = nullptr;
+    PFNGLPROGRAMUNIFORM4FPROC programUniform4f                   = nullptr;
+    PFNGLPROGRAMUNIFORM4FVPROC programUniform4fv                 = nullptr;
+    PFNGLPROGRAMUNIFORM4IPROC programUniform4i                   = nullptr;
+    PFNGLPROGRAMUNIFORM4IVPROC programUniform4iv                 = nullptr;
+    PFNGLPROGRAMUNIFORM4UIPROC programUniform4ui                 = nullptr;
+    PFNGLPROGRAMUNIFORM4UIVPROC programUniform4uiv               = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX2DVPROC programUniformMatrix2dv     = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX2FVPROC programUniformMatrix2fv     = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC programUniformMatrix2x3dv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC programUniformMatrix2x3fv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC programUniformMatrix2x4dv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC programUniformMatrix2x4fv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX3DVPROC programUniformMatrix3dv     = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX3FVPROC programUniformMatrix3fv     = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC programUniformMatrix3x2dv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC programUniformMatrix3x2fv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC programUniformMatrix3x4dv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC programUniformMatrix3x4fv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX4DVPROC programUniformMatrix4dv     = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX4FVPROC programUniformMatrix4fv     = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC programUniformMatrix4x2dv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC programUniformMatrix4x2fv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC programUniformMatrix4x3dv = nullptr;
+    PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC programUniformMatrix4x3fv = nullptr;
+    PFNGLRELEASESHADERCOMPILERPROC releaseShaderCompiler         = nullptr;
+    PFNGLSCISSORARRAYVPROC scissorArrayv                         = nullptr;
+    PFNGLSCISSORINDEXEDPROC scissorIndexed                       = nullptr;
+    PFNGLSCISSORINDEXEDVPROC scissorIndexedv                     = nullptr;
+    PFNGLSHADERBINARYPROC shaderBinary                           = nullptr;
+    PFNGLUSEPROGRAMSTAGESPROC useProgramStages                   = nullptr;
+    PFNGLVALIDATEPROGRAMPIPELINEPROC validateProgramPipeline     = nullptr;
+    PFNGLVERTEXATTRIBL1DPROC vertexAttribL1d                     = nullptr;
+    PFNGLVERTEXATTRIBL1DVPROC vertexAttribL1dv                   = nullptr;
+    PFNGLVERTEXATTRIBL2DPROC vertexAttribL2d                     = nullptr;
+    PFNGLVERTEXATTRIBL2DVPROC vertexAttribL2dv                   = nullptr;
+    PFNGLVERTEXATTRIBL3DPROC vertexAttribL3d                     = nullptr;
+    PFNGLVERTEXATTRIBL3DVPROC vertexAttribL3dv                   = nullptr;
+    PFNGLVERTEXATTRIBL4DPROC vertexAttribL4d                     = nullptr;
+    PFNGLVERTEXATTRIBL4DVPROC vertexAttribL4dv                   = nullptr;
+    PFNGLVERTEXATTRIBLPOINTERPROC vertexAttribLPointer           = nullptr;
+    PFNGLVIEWPORTARRAYVPROC viewportArrayv                       = nullptr;
+    PFNGLVIEWPORTINDEXEDFPROC viewportIndexedf                   = nullptr;
+    PFNGLVIEWPORTINDEXEDFVPROC viewportIndexedfv                 = nullptr;
+
+    // 4.2
+    PFNGLBINDIMAGETEXTUREPROC bindImageTexture                                   = nullptr;
+    PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC drawArraysInstancedBaseInstance     = nullptr;
+    PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC drawElementsInstancedBaseInstance = nullptr;
+    PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC
+        drawElementsInstancedBaseVertexBaseInstance                                    = nullptr;
+    PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC drawTransformFeedbackInstanced             = nullptr;
+    PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC drawTransformFeedbackStreamInstanced = nullptr;
+    PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC getActiveAtomicCounterBufferiv             = nullptr;
+    PFNGLGETINTERNALFORMATIVPROC getInternalformativ                                   = nullptr;
+    PFNGLMEMORYBARRIERPROC memoryBarrier                                               = nullptr;
+    PFNGLTEXSTORAGE1DPROC texStorage1D                                                 = nullptr;
+    PFNGLTEXSTORAGE2DPROC texStorage2D                                                 = nullptr;
+    PFNGLTEXSTORAGE3DPROC texStorage3D                                                 = nullptr;
+
+    // 4.3
+    PFNGLBINDVERTEXBUFFERPROC bindVertexBuffer                               = nullptr;
+    PFNGLCLEARBUFFERDATAPROC clearBufferData                                 = nullptr;
+    PFNGLCLEARBUFFERSUBDATAPROC clearBufferSubData                           = nullptr;
+    PFNGLCOPYIMAGESUBDATAPROC copyImageSubData                               = nullptr;
+    PFNGLCOVERAGEMODULATIONNVPROC coverageModulationNV                       = nullptr;
+    PFNGLDEBUGMESSAGECALLBACKPROC debugMessageCallback                       = nullptr;
+    PFNGLDEBUGMESSAGECONTROLPROC debugMessageControl                         = nullptr;
+    PFNGLDEBUGMESSAGEINSERTPROC debugMessageInsert                           = nullptr;
+    PFNGLDISPATCHCOMPUTEPROC dispatchCompute                                 = nullptr;
+    PFNGLDISPATCHCOMPUTEINDIRECTPROC dispatchComputeIndirect                 = nullptr;
+    PFNGLFRAMEBUFFERPARAMETERIPROC framebufferParameteri                     = nullptr;
+    PFNGLGETDEBUGMESSAGELOGPROC getDebugMessageLog                           = nullptr;
+    PFNGLGETFRAMEBUFFERPARAMETERIVPROC getFramebufferParameteriv             = nullptr;
+    PFNGLGETINTERNALFORMATI64VPROC getInternalformati64v                     = nullptr;
+    PFNGLGETOBJECTLABELPROC getObjectLabel                                   = nullptr;
+    PFNGLGETOBJECTPTRLABELPROC getObjectPtrLabel                             = nullptr;
+    PFNGLGETPOINTERVPROC getPointerv                                         = nullptr;
+    PFNGLGETPROGRAMINTERFACEIVPROC getProgramInterfaceiv                     = nullptr;
+    PFNGLGETPROGRAMRESOURCEINDEXPROC getProgramResourceIndex                 = nullptr;
+    PFNGLGETPROGRAMRESOURCELOCATIONPROC getProgramResourceLocation           = nullptr;
+    PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC getProgramResourceLocationIndex = nullptr;
+    PFNGLGETPROGRAMRESOURCENAMEPROC getProgramResourceName                   = nullptr;
+    PFNGLGETPROGRAMRESOURCEIVPROC getProgramResourceiv                       = nullptr;
+    PFNGLINVALIDATEBUFFERDATAPROC invalidateBufferData                       = nullptr;
+    PFNGLINVALIDATEBUFFERSUBDATAPROC invalidateBufferSubData                 = nullptr;
+    PFNGLINVALIDATEFRAMEBUFFERPROC invalidateFramebuffer                     = nullptr;
+    PFNGLINVALIDATESUBFRAMEBUFFERPROC invalidateSubFramebuffer               = nullptr;
+    PFNGLINVALIDATETEXIMAGEPROC invalidateTexImage                           = nullptr;
+    PFNGLINVALIDATETEXSUBIMAGEPROC invalidateTexSubImage                     = nullptr;
+    PFNGLMULTIDRAWARRAYSINDIRECTPROC multiDrawArraysIndirect                 = nullptr;
+    PFNGLMULTIDRAWELEMENTSINDIRECTPROC multiDrawElementsIndirect             = nullptr;
+    PFNGLOBJECTLABELPROC objectLabel                                         = nullptr;
+    PFNGLOBJECTPTRLABELPROC objectPtrLabel                                   = nullptr;
+    PFNGLPOPDEBUGGROUPPROC popDebugGroup                                     = nullptr;
+    PFNGLPUSHDEBUGGROUPPROC pushDebugGroup                                   = nullptr;
+    PFNGLSHADERSTORAGEBLOCKBINDINGPROC shaderStorageBlockBinding             = nullptr;
+    PFNGLTEXBUFFERRANGEPROC texBufferRange                                   = nullptr;
+    PFNGLTEXSTORAGE2DMULTISAMPLEPROC texStorage2DMultisample                 = nullptr;
+    PFNGLTEXSTORAGE3DMULTISAMPLEPROC texStorage3DMultisample                 = nullptr;
+    PFNGLTEXTUREVIEWPROC textureView                                         = nullptr;
+    PFNGLVERTEXATTRIBBINDINGPROC vertexAttribBinding                         = nullptr;
+    PFNGLVERTEXATTRIBFORMATPROC vertexAttribFormat                           = nullptr;
+    PFNGLVERTEXATTRIBIFORMATPROC vertexAttribIFormat                         = nullptr;
+    PFNGLVERTEXATTRIBLFORMATPROC vertexAttribLFormat                         = nullptr;
+    PFNGLVERTEXBINDINGDIVISORPROC vertexBindingDivisor                       = nullptr;
+
+    // 4.4
+    PFNGLBINDBUFFERSBASEPROC bindBuffersBase     = nullptr;
+    PFNGLBINDBUFFERSRANGEPROC bindBuffersRange   = nullptr;
+    PFNGLBINDIMAGETEXTURESPROC bindImageTextures = nullptr;
+    PFNGLBINDSAMPLERSPROC bindSamplers           = nullptr;
+    PFNGLBINDTEXTURESPROC bindTextures           = nullptr;
+    PFNGLBINDVERTEXBUFFERSPROC bindVertexBuffers = nullptr;
+    PFNGLBUFFERSTORAGEPROC bufferStorage         = nullptr;
+    PFNGLCLEARTEXIMAGEPROC clearTexImage         = nullptr;
+    PFNGLCLEARTEXSUBIMAGEPROC clearTexSubImage   = nullptr;
+
+    // 4.5
+    PFNGLBINDTEXTUREUNITPROC bindTextureUnit                           = nullptr;
+    PFNGLBLITNAMEDFRAMEBUFFERPROC blitNamedFramebuffer                 = nullptr;
+    PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC checkNamedFramebufferStatus   = nullptr;
+    PFNGLCLEARNAMEDBUFFERDATAPROC clearNamedBufferData                 = nullptr;
+    PFNGLCLEARNAMEDBUFFERSUBDATAPROC clearNamedBufferSubData           = nullptr;
+    PFNGLCLEARNAMEDFRAMEBUFFERFIPROC clearNamedFramebufferfi           = nullptr;
+    PFNGLCLEARNAMEDFRAMEBUFFERFVPROC clearNamedFramebufferfv           = nullptr;
+    PFNGLCLEARNAMEDFRAMEBUFFERIVPROC clearNamedFramebufferiv           = nullptr;
+    PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC clearNamedFramebufferuiv         = nullptr;
+    PFNGLCLIPCONTROLPROC clipControl                                   = nullptr;
+    PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC compressedTextureSubImage1D   = nullptr;
+    PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC compressedTextureSubImage2D   = nullptr;
+    PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC compressedTextureSubImage3D   = nullptr;
+    PFNGLCOPYNAMEDBUFFERSUBDATAPROC copyNamedBufferSubData             = nullptr;
+    PFNGLCOPYTEXTURESUBIMAGE1DPROC copyTextureSubImage1D               = nullptr;
+    PFNGLCOPYTEXTURESUBIMAGE2DPROC copyTextureSubImage2D               = nullptr;
+    PFNGLCOPYTEXTURESUBIMAGE3DPROC copyTextureSubImage3D               = nullptr;
+    PFNGLCREATEBUFFERSPROC createBuffers                               = nullptr;
+    PFNGLCREATEFRAMEBUFFERSPROC createFramebuffers                     = nullptr;
+    PFNGLCREATEPROGRAMPIPELINESPROC createProgramPipelines             = nullptr;
+    PFNGLCREATEQUERIESPROC createQueries                               = nullptr;
+    PFNGLCREATERENDERBUFFERSPROC createRenderbuffers                   = nullptr;
+    PFNGLCREATESAMPLERSPROC createSamplers                             = nullptr;
+    PFNGLCREATETEXTURESPROC createTextures                             = nullptr;
+    PFNGLCREATETRANSFORMFEEDBACKSPROC createTransformFeedbacks         = nullptr;
+    PFNGLCREATEVERTEXARRAYSPROC createVertexArrays                     = nullptr;
+    PFNGLDISABLEVERTEXARRAYATTRIBPROC disableVertexArrayAttrib         = nullptr;
+    PFNGLENABLEVERTEXARRAYATTRIBPROC enableVertexArrayAttrib           = nullptr;
+    PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC flushMappedNamedBufferRange   = nullptr;
+    PFNGLGENERATETEXTUREMIPMAPPROC generateTextureMipmap               = nullptr;
+    PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC getCompressedTextureImage       = nullptr;
+    PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC getCompressedTextureSubImage = nullptr;
+    PFNGLGETGRAPHICSRESETSTATUSPROC getGraphicsResetStatus             = nullptr;
+    PFNGLGETNAMEDBUFFERPARAMETERI64VPROC getNamedBufferParameteri64v   = nullptr;
+    PFNGLGETNAMEDBUFFERPARAMETERIVPROC getNamedBufferParameteriv       = nullptr;
+    PFNGLGETNAMEDBUFFERPOINTERVPROC getNamedBufferPointerv             = nullptr;
+    PFNGLGETNAMEDBUFFERSUBDATAPROC getNamedBufferSubData               = nullptr;
+    PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC getNamedFramebufferAttachmentParameteriv =
+        nullptr;
+    PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC getNamedFramebufferParameteriv           = nullptr;
+    PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC getNamedRenderbufferParameteriv         = nullptr;
+    PFNGLGETQUERYBUFFEROBJECTI64VPROC getQueryBufferObjecti64v                       = nullptr;
+    PFNGLGETQUERYBUFFEROBJECTIVPROC getQueryBufferObjectiv                           = nullptr;
+    PFNGLGETQUERYBUFFEROBJECTUI64VPROC getQueryBufferObjectui64v                     = nullptr;
+    PFNGLGETQUERYBUFFEROBJECTUIVPROC getQueryBufferObjectuiv                         = nullptr;
+    PFNGLGETTEXTUREIMAGEPROC getTextureImage                                         = nullptr;
+    PFNGLGETTEXTURELEVELPARAMETERFVPROC getTextureLevelParameterfv                   = nullptr;
+    PFNGLGETTEXTURELEVELPARAMETERIVPROC getTextureLevelParameteriv                   = nullptr;
+    PFNGLGETTEXTUREPARAMETERIIVPROC getTextureParameterIiv                           = nullptr;
+    PFNGLGETTEXTUREPARAMETERIUIVPROC getTextureParameterIuiv                         = nullptr;
+    PFNGLGETTEXTUREPARAMETERFVPROC getTextureParameterfv                             = nullptr;
+    PFNGLGETTEXTUREPARAMETERIVPROC getTextureParameteriv                             = nullptr;
+    PFNGLGETTEXTURESUBIMAGEPROC getTextureSubImage                                   = nullptr;
+    PFNGLGETTRANSFORMFEEDBACKI64_VPROC getTransformFeedbacki64_v                     = nullptr;
+    PFNGLGETTRANSFORMFEEDBACKI_VPROC getTransformFeedbacki_v                         = nullptr;
+    PFNGLGETTRANSFORMFEEDBACKIVPROC getTransformFeedbackiv                           = nullptr;
+    PFNGLGETVERTEXARRAYINDEXED64IVPROC getVertexArrayIndexed64iv                     = nullptr;
+    PFNGLGETVERTEXARRAYINDEXEDIVPROC getVertexArrayIndexediv                         = nullptr;
+    PFNGLGETVERTEXARRAYIVPROC getVertexArrayiv                                       = nullptr;
+    PFNGLGETNCOMPRESSEDTEXIMAGEPROC getnCompressedTexImage                           = nullptr;
+    PFNGLGETNTEXIMAGEPROC getnTexImage                                               = nullptr;
+    PFNGLGETNUNIFORMDVPROC getnUniformdv                                             = nullptr;
+    PFNGLGETNUNIFORMFVPROC getnUniformfv                                             = nullptr;
+    PFNGLGETNUNIFORMIVPROC getnUniformiv                                             = nullptr;
+    PFNGLGETNUNIFORMUIVPROC getnUniformuiv                                           = nullptr;
+    PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC invalidateNamedFramebufferData           = nullptr;
+    PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC invalidateNamedFramebufferSubData     = nullptr;
+    PFNGLMAPNAMEDBUFFERPROC mapNamedBuffer                                           = nullptr;
+    PFNGLMAPNAMEDBUFFERRANGEPROC mapNamedBufferRange                                 = nullptr;
+    PFNGLMEMORYBARRIERBYREGIONPROC memoryBarrierByRegion                             = nullptr;
+    PFNGLNAMEDBUFFERDATAPROC namedBufferData                                         = nullptr;
+    PFNGLNAMEDBUFFERSTORAGEPROC namedBufferStorage                                   = nullptr;
+    PFNGLNAMEDBUFFERSUBDATAPROC namedBufferSubData                                   = nullptr;
+    PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC namedFramebufferDrawBuffer                   = nullptr;
+    PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC namedFramebufferDrawBuffers                 = nullptr;
+    PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC namedFramebufferParameteri                   = nullptr;
+    PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC namedFramebufferReadBuffer                   = nullptr;
+    PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC namedFramebufferRenderbuffer               = nullptr;
+    PFNGLNAMEDFRAMEBUFFERTEXTUREPROC namedFramebufferTexture                         = nullptr;
+    PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC namedFramebufferTextureLayer               = nullptr;
+    PFNGLNAMEDRENDERBUFFERSTORAGEPROC namedRenderbufferStorage                       = nullptr;
+    PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC namedRenderbufferStorageMultisample = nullptr;
+    PFNGLREADNPIXELSPROC readnPixels                                                 = nullptr;
+    PFNGLTEXTUREBARRIERPROC textureBarrier                                           = nullptr;
+    PFNGLTEXTUREBUFFERPROC textureBuffer                                             = nullptr;
+    PFNGLTEXTUREBUFFERRANGEPROC textureBufferRange                                   = nullptr;
+    PFNGLTEXTUREPARAMETERIIVPROC textureParameterIiv                                 = nullptr;
+    PFNGLTEXTUREPARAMETERIUIVPROC textureParameterIuiv                               = nullptr;
+    PFNGLTEXTUREPARAMETERFPROC textureParameterf                                     = nullptr;
+    PFNGLTEXTUREPARAMETERFVPROC textureParameterfv                                   = nullptr;
+    PFNGLTEXTUREPARAMETERIPROC textureParameteri                                     = nullptr;
+    PFNGLTEXTUREPARAMETERIVPROC textureParameteriv                                   = nullptr;
+    PFNGLTEXTURESTORAGE1DPROC textureStorage1D                                       = nullptr;
+    PFNGLTEXTURESTORAGE2DPROC textureStorage2D                                       = nullptr;
+    PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC textureStorage2DMultisample                 = nullptr;
+    PFNGLTEXTURESTORAGE3DPROC textureStorage3D                                       = nullptr;
+    PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC textureStorage3DMultisample                 = nullptr;
+    PFNGLTEXTURESUBIMAGE1DPROC textureSubImage1D                                     = nullptr;
+    PFNGLTEXTURESUBIMAGE2DPROC textureSubImage2D                                     = nullptr;
+    PFNGLTEXTURESUBIMAGE3DPROC textureSubImage3D                                     = nullptr;
+    PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC transformFeedbackBufferBase                 = nullptr;
+    PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC transformFeedbackBufferRange               = nullptr;
+    PFNGLUNMAPNAMEDBUFFERPROC unmapNamedBuffer                                       = nullptr;
+    PFNGLVERTEXARRAYATTRIBBINDINGPROC vertexArrayAttribBinding                       = nullptr;
+    PFNGLVERTEXARRAYATTRIBFORMATPROC vertexArrayAttribFormat                         = nullptr;
+    PFNGLVERTEXARRAYATTRIBIFORMATPROC vertexArrayAttribIFormat                       = nullptr;
+    PFNGLVERTEXARRAYATTRIBLFORMATPROC vertexArrayAttribLFormat                       = nullptr;
+    PFNGLVERTEXARRAYBINDINGDIVISORPROC vertexArrayBindingDivisor                     = nullptr;
+    PFNGLVERTEXARRAYELEMENTBUFFERPROC vertexArrayElementBuffer                       = nullptr;
+    PFNGLVERTEXARRAYVERTEXBUFFERPROC vertexArrayVertexBuffer                         = nullptr;
+    PFNGLVERTEXARRAYVERTEXBUFFERSPROC vertexArrayVertexBuffers                       = nullptr;
+
+    // ES 3.2
+    PFNGLBLENDBARRIERPROC blendBarrier                 = nullptr;
+    PFNGLPRIMITIVEBOUNDINGBOXPROC primitiveBoundingBox = nullptr;
+
+    // GL_EXT_discard_framebuffer
+    PFNGLDISCARDFRAMEBUFFEREXTPROC discardFramebufferEXT = nullptr;
+
+    // GL_NV_internalformat_sample_query
+    PFNGLGETINTERNALFORMATSAMPLEIVNVPROC getInternalformatSampleivNV = nullptr;
+
+    // GL_OES_EGL_image
+    PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC eGLImageTargetRenderbufferStorageOES = nullptr;
+    PFNGLEGLIMAGETARGETTEXTURE2DOESPROC eGLImageTargetTexture2DOES                     = nullptr;
+
+    // NV_path_rendering (originally written against 3.2 compatibility profile)
+    PFNGLCOVERFILLPATHINSTANCEDNVPROC coverFillPathInstancedNV                           = nullptr;
+    PFNGLCOVERFILLPATHNVPROC coverFillPathNV                                             = nullptr;
+    PFNGLCOVERSTROKEPATHINSTANCEDNVPROC coverStrokePathInstancedNV                       = nullptr;
+    PFNGLCOVERSTROKEPATHNVPROC coverStrokePathNV                                         = nullptr;
+    PFNGLDELETEPATHSNVPROC deletePathsNV                                                 = nullptr;
+    PFNGLGENPATHSNVPROC genPathsNV                                                       = nullptr;
+    PFNGLGETPATHPARAMETERFVNVPROC getPathParameterfvNV                                   = nullptr;
+    PFNGLGETPATHPARAMETERIVNVPROC getPathParameterivNV                                   = nullptr;
+    PFNGLISPATHNVPROC isPathNV                                                           = nullptr;
+    PFNGLMATRIXLOADFEXTPROC matrixLoadfEXT                                               = nullptr;
+    PFNGLPATHCOMMANDSNVPROC pathCommandsNV                                               = nullptr;
+    PFNGLPATHPARAMETERFNVPROC pathParameterfNV                                           = nullptr;
+    PFNGLPATHPARAMETERINVPROC pathParameteriNV                                           = nullptr;
+    PFNGLPATHSTENCILFUNCNVPROC pathStencilFuncNV                                         = nullptr;
+    PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC programPathFragmentInputGenNV                 = nullptr;
+    PFNGLSTENCILFILLPATHINSTANCEDNVPROC stencilFillPathInstancedNV                       = nullptr;
+    PFNGLSTENCILFILLPATHNVPROC stencilFillPathNV                                         = nullptr;
+    PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC stencilStrokePathInstancedNV                   = nullptr;
+    PFNGLSTENCILSTROKEPATHNVPROC stencilStrokePathNV                                     = nullptr;
+    PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC stencilThenCoverFillPathInstancedNV     = nullptr;
+    PFNGLSTENCILTHENCOVERFILLPATHNVPROC stencilThenCoverFillPathNV                       = nullptr;
+    PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC stencilThenCoverStrokePathInstancedNV = nullptr;
+    PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC stencilThenCoverStrokePathNV                   = nullptr;
+
+  protected:
+    virtual void *loadProcAddress(const std::string &function) const = 0;
+
+    void initProcsDesktopGL(const gl::Version &version, const std::set<std::string> &extensions);
+    void initProcsGLES(const gl::Version &version, const std::set<std::string> &extensions);
+    void initProcsSharedExtensions(const std::set<std::string> &extensions);
+};
+
+}  // namespace rx
+
+#endif  // LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_
diff --git a/src/libANGLE/renderer/gl/FramebufferGL.cpp b/src/libANGLE/renderer/gl/FramebufferGL.cpp
index 1343b0d..b2ff033 100644
--- a/src/libANGLE/renderer/gl/FramebufferGL.cpp
+++ b/src/libANGLE/renderer/gl/FramebufferGL.cpp
@@ -250,11 +250,11 @@
         mFunctions->invalidateFramebuffer(GL_FRAMEBUFFER, static_cast<GLsizei>(count),
                                           finalAttachmentsPtr);
     }
-    else if (mFunctions->discardFramebuffer)
+    else if (mFunctions->discardFramebufferEXT)
     {
         mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
-        mFunctions->discardFramebuffer(GL_FRAMEBUFFER, static_cast<GLsizei>(count),
-                                       finalAttachmentsPtr);
+        mFunctions->discardFramebufferEXT(GL_FRAMEBUFFER, static_cast<GLsizei>(count),
+                                          finalAttachmentsPtr);
     }
 
     return gl::NoError();
diff --git a/src/libANGLE/renderer/gl/FunctionsGL.cpp b/src/libANGLE/renderer/gl/FunctionsGL.cpp
index 21ea375..234d336 100644
--- a/src/libANGLE/renderer/gl/FunctionsGL.cpp
+++ b/src/libANGLE/renderer/gl/FunctionsGL.cpp
@@ -55,742 +55,9 @@
     return result;
 }
 
-static void AssignGLExtensionEntryPoint(const std::vector<std::string> &extensions,
-                                        const char *requiredExtensionString,
-                                        void *function,
-                                        void **outFunction)
-{
-    std::vector<std::string> requiredExtensions;
-    angle::SplitStringAlongWhitespace(requiredExtensionString, &requiredExtensions);
-    for (const std::string& requiredExtension : requiredExtensions)
-    {
-        if (std::find(extensions.begin(), extensions.end(), requiredExtension) == extensions.end())
-        {
-            return;
-        }
-    }
-
-    *outFunction = function;
-}
-
-#define ASSIGN_WITH_EXT(EXT, NAME, FP)                                  \
-    AssignGLExtensionEntryPoint(extensions, EXT, loadProcAddress(NAME), \
-                                reinterpret_cast<void **>(&FP))
 #define ASSIGN(NAME, FP) *reinterpret_cast<void **>(&FP) = loadProcAddress(NAME)
 
-FunctionsGL::FunctionsGL()
-    : version(),
-      standard(),
-      extensions(),
-
-      blendFunc(nullptr),
-      clear(nullptr),
-      clearColor(nullptr),
-      clearDepth(nullptr),
-      clearStencil(nullptr),
-      colorMask(nullptr),
-      cullFace(nullptr),
-      depthFunc(nullptr),
-      depthMask(nullptr),
-      depthRange(nullptr),
-      disable(nullptr),
-      drawBuffer(nullptr),
-      enable(nullptr),
-      finish(nullptr),
-      flush(nullptr),
-      frontFace(nullptr),
-      getBooleanv(nullptr),
-      getDoublev(nullptr),
-      getError(nullptr),
-      getFloatv(nullptr),
-      getIntegerv(nullptr),
-      getString(nullptr),
-      getTexImage(nullptr),
-      getTexLevelParameterfv(nullptr),
-      getTexLevelParameteriv(nullptr),
-      getTexParameterfv(nullptr),
-      getTexParameteriv(nullptr),
-      hint(nullptr),
-      isEnabled(nullptr),
-      lineWidth(nullptr),
-      logicOp(nullptr),
-      pixelStoref(nullptr),
-      pixelStorei(nullptr),
-      pointSize(nullptr),
-      polygonMode(nullptr),
-      readBuffer(nullptr),
-      readPixels(nullptr),
-      scissor(nullptr),
-      stencilFunc(nullptr),
-      stencilMask(nullptr),
-      stencilOp(nullptr),
-      texImage1D(nullptr),
-      texImage2D(nullptr),
-      texParameterf(nullptr),
-      texParameterfv(nullptr),
-      texParameteri(nullptr),
-      texParameteriv(nullptr),
-      viewport(nullptr),
-
-      bindTexture(nullptr),
-      copyTexImage1D(nullptr),
-      copyTexImage2D(nullptr),
-      copyTexSubImage1D(nullptr),
-      copyTexSubImage2D(nullptr),
-      deleteTextures(nullptr),
-      drawArrays(nullptr),
-      drawElements(nullptr),
-      genTextures(nullptr),
-      isTexture(nullptr),
-      polygonOffset(nullptr),
-      texSubImage1D(nullptr),
-      texSubImage2D(nullptr),
-
-      blendColor(nullptr),
-      blendEquation(nullptr),
-      copyTexSubImage3D(nullptr),
-      drawRangeElements(nullptr),
-      texImage3D(nullptr),
-      texSubImage3D(nullptr),
-
-      deleteFencesNV(nullptr),
-      genFencesNV(nullptr),
-      isFenceNV(nullptr),
-      testFenceNV(nullptr),
-      getFenceivNV(nullptr),
-      finishFenceNV(nullptr),
-      setFenceNV(nullptr),
-
-      activeTexture(nullptr),
-      compressedTexImage1D(nullptr),
-      compressedTexImage2D(nullptr),
-      compressedTexImage3D(nullptr),
-      compressedTexSubImage1D(nullptr),
-      compressedTexSubImage2D(nullptr),
-      compressedTexSubImage3D(nullptr),
-      getCompressedTexImage(nullptr),
-      sampleCoverage(nullptr),
-
-      blendFuncSeparate(nullptr),
-      multiDrawArrays(nullptr),
-      multiDrawElements(nullptr),
-      pointParameterf(nullptr),
-      pointParameterfv(nullptr),
-      pointParameteri(nullptr),
-      pointParameteriv(nullptr),
-
-      beginQuery(nullptr),
-      bindBuffer(nullptr),
-      bufferData(nullptr),
-      bufferSubData(nullptr),
-      deleteBuffers(nullptr),
-      deleteQueries(nullptr),
-      endQuery(nullptr),
-      genBuffers(nullptr),
-      genQueries(nullptr),
-      getBufferParameteriv(nullptr),
-      getBufferPointerv(nullptr),
-      getBufferSubData(nullptr),
-      getQueryObjectiv(nullptr),
-      getQueryObjectuiv(nullptr),
-      getQueryiv(nullptr),
-      isBuffer(nullptr),
-      isQuery(nullptr),
-      mapBuffer(nullptr),
-      unmapBuffer(nullptr),
-
-      attachShader(nullptr),
-      bindAttribLocation(nullptr),
-      blendEquationSeparate(nullptr),
-      compileShader(nullptr),
-      createProgram(nullptr),
-      createShader(nullptr),
-      deleteProgram(nullptr),
-      deleteShader(nullptr),
-      detachShader(nullptr),
-      disableVertexAttribArray(nullptr),
-      drawBuffers(nullptr),
-      enableVertexAttribArray(nullptr),
-      getActiveAttrib(nullptr),
-      getActiveUniform(nullptr),
-      getAttachedShaders(nullptr),
-      getAttribLocation(nullptr),
-      getProgramInfoLog(nullptr),
-      getProgramiv(nullptr),
-      getShaderInfoLog(nullptr),
-      getShaderSource(nullptr),
-      getShaderiv(nullptr),
-      getUniformLocation(nullptr),
-      getUniformfv(nullptr),
-      getUniformiv(nullptr),
-      getVertexAttribPointerv(nullptr),
-      getVertexAttribdv(nullptr),
-      getVertexAttribfv(nullptr),
-      getVertexAttribiv(nullptr),
-      isProgram(nullptr),
-      isShader(nullptr),
-      linkProgram(nullptr),
-      shaderSource(nullptr),
-      stencilFuncSeparate(nullptr),
-      stencilMaskSeparate(nullptr),
-      stencilOpSeparate(nullptr),
-      uniform1f(nullptr),
-      uniform1fv(nullptr),
-      uniform1i(nullptr),
-      uniform1iv(nullptr),
-      uniform2f(nullptr),
-      uniform2fv(nullptr),
-      uniform2i(nullptr),
-      uniform2iv(nullptr),
-      uniform3f(nullptr),
-      uniform3fv(nullptr),
-      uniform3i(nullptr),
-      uniform3iv(nullptr),
-      uniform4f(nullptr),
-      uniform4fv(nullptr),
-      uniform4i(nullptr),
-      uniform4iv(nullptr),
-      uniformMatrix2fv(nullptr),
-      uniformMatrix3fv(nullptr),
-      uniformMatrix4fv(nullptr),
-      useProgram(nullptr),
-      validateProgram(nullptr),
-      vertexAttrib1d(nullptr),
-      vertexAttrib1dv(nullptr),
-      vertexAttrib1f(nullptr),
-      vertexAttrib1fv(nullptr),
-      vertexAttrib1s(nullptr),
-      vertexAttrib1sv(nullptr),
-      vertexAttrib2d(nullptr),
-      vertexAttrib2dv(nullptr),
-      vertexAttrib2f(nullptr),
-      vertexAttrib2fv(nullptr),
-      vertexAttrib2s(nullptr),
-      vertexAttrib2sv(nullptr),
-      vertexAttrib3d(nullptr),
-      vertexAttrib3dv(nullptr),
-      vertexAttrib3f(nullptr),
-      vertexAttrib3fv(nullptr),
-      vertexAttrib3s(nullptr),
-      vertexAttrib3sv(nullptr),
-      vertexAttrib4Nbv(nullptr),
-      vertexAttrib4Niv(nullptr),
-      vertexAttrib4Nsv(nullptr),
-      vertexAttrib4Nub(nullptr),
-      vertexAttrib4Nubv(nullptr),
-      vertexAttrib4Nuiv(nullptr),
-      vertexAttrib4Nusv(nullptr),
-      vertexAttrib4bv(nullptr),
-      vertexAttrib4d(nullptr),
-      vertexAttrib4dv(nullptr),
-      vertexAttrib4f(nullptr),
-      vertexAttrib4fv(nullptr),
-      vertexAttrib4iv(nullptr),
-      vertexAttrib4s(nullptr),
-      vertexAttrib4sv(nullptr),
-      vertexAttrib4ubv(nullptr),
-      vertexAttrib4uiv(nullptr),
-      vertexAttrib4usv(nullptr),
-      vertexAttribPointer(nullptr),
-
-      uniformMatrix2x3fv(nullptr),
-      uniformMatrix2x4fv(nullptr),
-      uniformMatrix3x2fv(nullptr),
-      uniformMatrix3x4fv(nullptr),
-      uniformMatrix4x2fv(nullptr),
-      uniformMatrix4x3fv(nullptr),
-
-      beginConditionalRender(nullptr),
-      beginTransformFeedback(nullptr),
-      bindBufferBase(nullptr),
-      bindBufferRange(nullptr),
-      bindFragDataLocation(nullptr),
-      bindFramebuffer(nullptr),
-      bindRenderbuffer(nullptr),
-      bindVertexArray(nullptr),
-      blitFramebuffer(nullptr),
-      checkFramebufferStatus(nullptr),
-      clampColor(nullptr),
-      clearBufferfi(nullptr),
-      clearBufferfv(nullptr),
-      clearBufferiv(nullptr),
-      clearBufferuiv(nullptr),
-      colorMaski(nullptr),
-      deleteFramebuffers(nullptr),
-      deleteRenderbuffers(nullptr),
-      deleteVertexArrays(nullptr),
-      disablei(nullptr),
-      enablei(nullptr),
-      endConditionalRender(nullptr),
-      endTransformFeedback(nullptr),
-      flushMappedBufferRange(nullptr),
-      framebufferRenderbuffer(nullptr),
-      framebufferTexture1D(nullptr),
-      framebufferTexture2D(nullptr),
-      framebufferTexture3D(nullptr),
-      framebufferTextureLayer(nullptr),
-      genFramebuffers(nullptr),
-      genRenderbuffers(nullptr),
-      genVertexArrays(nullptr),
-      generateMipmap(nullptr),
-      getBooleani_v(nullptr),
-      getFragDataLocation(nullptr),
-      getFramebufferAttachmentParameteriv(nullptr),
-      getIntegeri_v(nullptr),
-      getRenderbufferParameteriv(nullptr),
-      getStringi(nullptr),
-      getTexParameterIiv(nullptr),
-      getTexParameterIuiv(nullptr),
-      getTransformFeedbackVarying(nullptr),
-      getUniformuiv(nullptr),
-      getVertexAttribIiv(nullptr),
-      getVertexAttribIuiv(nullptr),
-      isEnabledi(nullptr),
-      isFramebuffer(nullptr),
-      isRenderbuffer(nullptr),
-      isVertexArray(nullptr),
-      mapBufferRange(nullptr),
-      renderbufferStorage(nullptr),
-      renderbufferStorageMultisample(nullptr),
-      texParameterIiv(nullptr),
-      texParameterIuiv(nullptr),
-      transformFeedbackVaryings(nullptr),
-      uniform1ui(nullptr),
-      uniform1uiv(nullptr),
-      uniform2ui(nullptr),
-      uniform2uiv(nullptr),
-      uniform3ui(nullptr),
-      uniform3uiv(nullptr),
-      uniform4ui(nullptr),
-      uniform4uiv(nullptr),
-      vertexAttribI1i(nullptr),
-      vertexAttribI1iv(nullptr),
-      vertexAttribI1ui(nullptr),
-      vertexAttribI1uiv(nullptr),
-      vertexAttribI2i(nullptr),
-      vertexAttribI2iv(nullptr),
-      vertexAttribI2ui(nullptr),
-      vertexAttribI2uiv(nullptr),
-      vertexAttribI3i(nullptr),
-      vertexAttribI3iv(nullptr),
-      vertexAttribI3ui(nullptr),
-      vertexAttribI3uiv(nullptr),
-      vertexAttribI4bv(nullptr),
-      vertexAttribI4i(nullptr),
-      vertexAttribI4iv(nullptr),
-      vertexAttribI4sv(nullptr),
-      vertexAttribI4ubv(nullptr),
-      vertexAttribI4ui(nullptr),
-      vertexAttribI4uiv(nullptr),
-      vertexAttribI4usv(nullptr),
-      vertexAttribIPointer(nullptr),
-
-      copyBufferSubData(nullptr),
-      drawArraysInstanced(nullptr),
-      drawElementsInstanced(nullptr),
-      getActiveUniformBlockName(nullptr),
-      getActiveUniformBlockiv(nullptr),
-      getActiveUniformName(nullptr),
-      getActiveUniformsiv(nullptr),
-      getUniformBlockIndex(nullptr),
-      getUniformIndices(nullptr),
-      primitiveRestartIndex(nullptr),
-      texBuffer(nullptr),
-      uniformBlockBinding(nullptr),
-
-      clientWaitSync(nullptr),
-      deleteSync(nullptr),
-      drawElementsBaseVertex(nullptr),
-      drawElementsInstancedBaseVertex(nullptr),
-      drawRangeElementsBaseVertex(nullptr),
-      fenceSync(nullptr),
-      framebufferTexture(nullptr),
-      getBufferParameteri64v(nullptr),
-      getInteger64i_v(nullptr),
-      getInteger64v(nullptr),
-      getMultisamplefv(nullptr),
-      getSynciv(nullptr),
-      isSync(nullptr),
-      multiDrawElementsBaseVertex(nullptr),
-      provokingVertex(nullptr),
-      sampleMaski(nullptr),
-      texImage2DMultisample(nullptr),
-      texImage3DMultisample(nullptr),
-      waitSync(nullptr),
-
-      matrixLoadEXT(nullptr),
-      genPathsNV(nullptr),
-      delPathsNV(nullptr),
-      pathCommandsNV(nullptr),
-      setPathParameterfNV(nullptr),
-      setPathParameteriNV(nullptr),
-      getPathParameterfNV(nullptr),
-      getPathParameteriNV(nullptr),
-      pathStencilFuncNV(nullptr),
-      stencilFillPathNV(nullptr),
-      stencilStrokePathNV(nullptr),
-      coverFillPathNV(nullptr),
-      coverStrokePathNV(nullptr),
-      stencilThenCoverFillPathNV(nullptr),
-      stencilThenCoverStrokePathNV(nullptr),
-      coverFillPathInstancedNV(nullptr),
-      coverStrokePathInstancedNV(nullptr),
-      stencilFillPathInstancedNV(nullptr),
-      stencilStrokePathInstancedNV(nullptr),
-      stencilThenCoverFillPathInstancedNV(nullptr),
-      stencilThenCoverStrokePathInstancedNV(nullptr),
-      programPathFragmentInputGenNV(nullptr),
-
-      bindFragDataLocationIndexed(nullptr),
-      bindSampler(nullptr),
-      deleteSamplers(nullptr),
-      genSamplers(nullptr),
-      getFragDataIndex(nullptr),
-      getQueryObjecti64v(nullptr),
-      getQueryObjectui64v(nullptr),
-      getSamplerParameterIiv(nullptr),
-      getSamplerParameterIuiv(nullptr),
-      getSamplerParameterfv(nullptr),
-      getSamplerParameteriv(nullptr),
-      isSampler(nullptr),
-      queryCounter(nullptr),
-      samplerParameterIiv(nullptr),
-      samplerParameterIuiv(nullptr),
-      samplerParameterf(nullptr),
-      samplerParameterfv(nullptr),
-      samplerParameteri(nullptr),
-      samplerParameteriv(nullptr),
-      vertexAttribDivisor(nullptr),
-      vertexAttribP1ui(nullptr),
-      vertexAttribP1uiv(nullptr),
-      vertexAttribP2ui(nullptr),
-      vertexAttribP2uiv(nullptr),
-      vertexAttribP3ui(nullptr),
-      vertexAttribP3uiv(nullptr),
-      vertexAttribP4ui(nullptr),
-      vertexAttribP4uiv(nullptr),
-
-      beginQueryIndexed(nullptr),
-      bindTransformFeedback(nullptr),
-      blendEquationSeparatei(nullptr),
-      blendEquationi(nullptr),
-      blendFuncSeparatei(nullptr),
-      blendFunci(nullptr),
-      deleteTransformFeedbacks(nullptr),
-      drawArraysIndirect(nullptr),
-      drawElementsIndirect(nullptr),
-      drawTransformFeedback(nullptr),
-      drawTransformFeedbackStream(nullptr),
-      endQueryIndexed(nullptr),
-      genTransformFeedbacks(nullptr),
-      getActiveSubroutineName(nullptr),
-      getActiveSubroutineUniformName(nullptr),
-      getActiveSubroutineUniformiv(nullptr),
-      getProgramStageiv(nullptr),
-      getQueryIndexediv(nullptr),
-      getSubroutineIndex(nullptr),
-      getSubroutineUniformLocation(nullptr),
-      getUniformSubroutineuiv(nullptr),
-      getUniformdv(nullptr),
-      isTransformFeedback(nullptr),
-      minSampleShading(nullptr),
-      patchParameterfv(nullptr),
-      patchParameteri(nullptr),
-      pauseTransformFeedback(nullptr),
-      resumeTransformFeedback(nullptr),
-      uniform1d(nullptr),
-      uniform1dv(nullptr),
-      uniform2d(nullptr),
-      uniform2dv(nullptr),
-      uniform3d(nullptr),
-      uniform3dv(nullptr),
-      uniform4d(nullptr),
-      uniform4dv(nullptr),
-      uniformMatrix2dv(nullptr),
-      uniformMatrix2x3dv(nullptr),
-      uniformMatrix2x4dv(nullptr),
-      uniformMatrix3dv(nullptr),
-      uniformMatrix3x2dv(nullptr),
-      uniformMatrix3x4dv(nullptr),
-      uniformMatrix4dv(nullptr),
-      uniformMatrix4x2dv(nullptr),
-      uniformMatrix4x3dv(nullptr),
-      uniformSubroutinesuiv(nullptr),
-
-      activeShaderProgram(nullptr),
-      bindProgramPipeline(nullptr),
-      clearDepthf(nullptr),
-      createShaderProgramv(nullptr),
-      deleteProgramPipelines(nullptr),
-      depthRangeArrayv(nullptr),
-      depthRangeIndexed(nullptr),
-      depthRangef(nullptr),
-      genProgramPipelines(nullptr),
-      getDoublei_v(nullptr),
-      getFloati_v(nullptr),
-      getProgramBinary(nullptr),
-      getProgramPipelineInfoLog(nullptr),
-      getProgramPipelineiv(nullptr),
-      getShaderPrecisionFormat(nullptr),
-      getVertexAttribLdv(nullptr),
-      isProgramPipeline(nullptr),
-      programBinary(nullptr),
-      programParameteri(nullptr),
-      programUniform1d(nullptr),
-      programUniform1dv(nullptr),
-      programUniform1f(nullptr),
-      programUniform1fv(nullptr),
-      programUniform1i(nullptr),
-      programUniform1iv(nullptr),
-      programUniform1ui(nullptr),
-      programUniform1uiv(nullptr),
-      programUniform2d(nullptr),
-      programUniform2dv(nullptr),
-      programUniform2f(nullptr),
-      programUniform2fv(nullptr),
-      programUniform2i(nullptr),
-      programUniform2iv(nullptr),
-      programUniform2ui(nullptr),
-      programUniform2uiv(nullptr),
-      programUniform3d(nullptr),
-      programUniform3dv(nullptr),
-      programUniform3f(nullptr),
-      programUniform3fv(nullptr),
-      programUniform3i(nullptr),
-      programUniform3iv(nullptr),
-      programUniform3ui(nullptr),
-      programUniform3uiv(nullptr),
-      programUniform4d(nullptr),
-      programUniform4dv(nullptr),
-      programUniform4f(nullptr),
-      programUniform4fv(nullptr),
-      programUniform4i(nullptr),
-      programUniform4iv(nullptr),
-      programUniform4ui(nullptr),
-      programUniform4uiv(nullptr),
-      programUniformMatrix2dv(nullptr),
-      programUniformMatrix2fv(nullptr),
-      programUniformMatrix2x3dv(nullptr),
-      programUniformMatrix2x3fv(nullptr),
-      programUniformMatrix2x4dv(nullptr),
-      programUniformMatrix2x4fv(nullptr),
-      programUniformMatrix3dv(nullptr),
-      programUniformMatrix3fv(nullptr),
-      programUniformMatrix3x2dv(nullptr),
-      programUniformMatrix3x2fv(nullptr),
-      programUniformMatrix3x4dv(nullptr),
-      programUniformMatrix3x4fv(nullptr),
-      programUniformMatrix4dv(nullptr),
-      programUniformMatrix4fv(nullptr),
-      programUniformMatrix4x2dv(nullptr),
-      programUniformMatrix4x2fv(nullptr),
-      programUniformMatrix4x3dv(nullptr),
-      programUniformMatrix4x3fv(nullptr),
-      releaseShaderCompiler(nullptr),
-      scissorArrayv(nullptr),
-      scissorIndexed(nullptr),
-      scissorIndexedv(nullptr),
-      shaderBinary(nullptr),
-      useProgramStages(nullptr),
-      validateProgramPipeline(nullptr),
-      vertexAttribL1d(nullptr),
-      vertexAttribL1dv(nullptr),
-      vertexAttribL2d(nullptr),
-      vertexAttribL2dv(nullptr),
-      vertexAttribL3d(nullptr),
-      vertexAttribL3dv(nullptr),
-      vertexAttribL4d(nullptr),
-      vertexAttribL4dv(nullptr),
-      vertexAttribLPointer(nullptr),
-      viewportArrayv(nullptr),
-      viewportIndexedf(nullptr),
-      viewportIndexedfv(nullptr),
-
-      bindImageTexture(nullptr),
-      drawArraysInstancedBaseInstance(nullptr),
-      drawElementsInstancedBaseInstance(nullptr),
-      drawElementsInstancedBaseVertexBaseInstance(nullptr),
-      drawTransformFeedbackInstanced(nullptr),
-      drawTransformFeedbackStreamInstanced(nullptr),
-      getActiveAtomicCounterBufferiv(nullptr),
-      getInternalformativ(nullptr),
-      memoryBarrier(nullptr),
-      texStorage1D(nullptr),
-      texStorage2D(nullptr),
-      texStorage3D(nullptr),
-
-      bindVertexBuffer(nullptr),
-      clearBufferData(nullptr),
-      clearBufferSubData(nullptr),
-      copyImageSubData(nullptr),
-      debugMessageCallback(nullptr),
-      debugMessageControl(nullptr),
-      debugMessageInsert(nullptr),
-      dispatchCompute(nullptr),
-      dispatchComputeIndirect(nullptr),
-      framebufferParameteri(nullptr),
-      getDebugMessageLog(nullptr),
-      getFramebufferParameteriv(nullptr),
-      getInternalformati64v(nullptr),
-      getPointerv(nullptr),
-      getObjectLabel(nullptr),
-      getObjectPtrLabel(nullptr),
-      getProgramInterfaceiv(nullptr),
-      getProgramResourceIndex(nullptr),
-      getProgramResourceLocation(nullptr),
-      getProgramResourceLocationIndex(nullptr),
-      getProgramResourceName(nullptr),
-      getProgramResourceiv(nullptr),
-      invalidateBufferData(nullptr),
-      invalidateBufferSubData(nullptr),
-      invalidateFramebuffer(nullptr),
-      invalidateSubFramebuffer(nullptr),
-      invalidateTexImage(nullptr),
-      invalidateTexSubImage(nullptr),
-      multiDrawArraysIndirect(nullptr),
-      multiDrawElementsIndirect(nullptr),
-      objectLabel(nullptr),
-      objectPtrLabel(nullptr),
-      popDebugGroup(nullptr),
-      pushDebugGroup(nullptr),
-      shaderStorageBlockBinding(nullptr),
-      texBufferRange(nullptr),
-      texStorage2DMultisample(nullptr),
-      texStorage3DMultisample(nullptr),
-      textureView(nullptr),
-      vertexAttribBinding(nullptr),
-      vertexAttribFormat(nullptr),
-      vertexAttribIFormat(nullptr),
-      vertexAttribLFormat(nullptr),
-      vertexBindingDivisor(nullptr),
-      coverageModulationNV(nullptr),
-
-      bindBuffersBase(nullptr),
-      bindBuffersRange(nullptr),
-      bindImageTextures(nullptr),
-      bindSamplers(nullptr),
-      bindTextures(nullptr),
-      bindVertexBuffers(nullptr),
-      bufferStorage(nullptr),
-      clearTexImage(nullptr),
-      clearTexSubImage(nullptr),
-
-      bindTextureUnit(nullptr),
-      blitNamedFramebuffer(nullptr),
-      checkNamedFramebufferStatus(nullptr),
-      clearNamedBufferData(nullptr),
-      clearNamedBufferSubData(nullptr),
-      clearNamedFramebufferfi(nullptr),
-      clearNamedFramebufferfv(nullptr),
-      clearNamedFramebufferiv(nullptr),
-      clearNamedFramebufferuiv(nullptr),
-      clipControl(nullptr),
-      compressedTextureSubImage1D(nullptr),
-      compressedTextureSubImage2D(nullptr),
-      compressedTextureSubImage3D(nullptr),
-      copyNamedBufferSubData(nullptr),
-      copyTextureSubImage1D(nullptr),
-      copyTextureSubImage2D(nullptr),
-      copyTextureSubImage3D(nullptr),
-      createBuffers(nullptr),
-      createFramebuffers(nullptr),
-      createProgramPipelines(nullptr),
-      createQueries(nullptr),
-      createRenderbuffers(nullptr),
-      createSamplers(nullptr),
-      createTextures(nullptr),
-      createTransformFeedbacks(nullptr),
-      createVertexArrays(nullptr),
-      disableVertexArrayAttrib(nullptr),
-      enableVertexArrayAttrib(nullptr),
-      flushMappedNamedBufferRange(nullptr),
-      generateTextureMipmap(nullptr),
-      getCompressedTextureImage(nullptr),
-      getCompressedTextureSubImage(nullptr),
-      getGraphicsResetStatus(nullptr),
-      getNamedBufferParameteri64v(nullptr),
-      getNamedBufferParameteriv(nullptr),
-      getNamedBufferPointerv(nullptr),
-      getNamedBufferSubData(nullptr),
-      getNamedFramebufferAttachmentParameteriv(nullptr),
-      getNamedFramebufferParameteriv(nullptr),
-      getNamedRenderbufferParameteriv(nullptr),
-      getQueryBufferObjecti64v(nullptr),
-      getQueryBufferObjectiv(nullptr),
-      getQueryBufferObjectui64v(nullptr),
-      getQueryBufferObjectuiv(nullptr),
-      getTextureImage(nullptr),
-      getTextureLevelParameterfv(nullptr),
-      getTextureLevelParameteriv(nullptr),
-      getTextureParameterIiv(nullptr),
-      getTextureParameterIuiv(nullptr),
-      getTextureParameterfv(nullptr),
-      getTextureParameteriv(nullptr),
-      getTextureSubImage(nullptr),
-      getTransformFeedbacki64_v(nullptr),
-      getTransformFeedbacki_v(nullptr),
-      getTransformFeedbackiv(nullptr),
-      getVertexArrayIndexed64iv(nullptr),
-      getVertexArrayIndexediv(nullptr),
-      getVertexArrayiv(nullptr),
-      getnCompressedTexImage(nullptr),
-      getnTexImage(nullptr),
-      getnUniformdv(nullptr),
-      getnUniformfv(nullptr),
-      getnUniformiv(nullptr),
-      getnUniformuiv(nullptr),
-      invalidateNamedFramebufferData(nullptr),
-      invalidateNamedFramebufferSubData(nullptr),
-      mapNamedBuffer(nullptr),
-      mapNamedBufferRange(nullptr),
-      memoryBarrierByRegion(nullptr),
-      namedBufferData(nullptr),
-      namedBufferStorage(nullptr),
-      namedBufferSubData(nullptr),
-      namedFramebufferDrawBuffer(nullptr),
-      namedFramebufferDrawBuffers(nullptr),
-      namedFramebufferParameteri(nullptr),
-      namedFramebufferReadBuffer(nullptr),
-      namedFramebufferRenderbuffer(nullptr),
-      namedFramebufferTexture(nullptr),
-      namedFramebufferTextureLayer(nullptr),
-      namedRenderbufferStorage(nullptr),
-      namedRenderbufferStorageMultisample(nullptr),
-      readnPixels(nullptr),
-      textureBarrier(nullptr),
-      textureBuffer(nullptr),
-      textureBufferRange(nullptr),
-      textureParameterIiv(nullptr),
-      textureParameterIuiv(nullptr),
-      textureParameterf(nullptr),
-      textureParameterfv(nullptr),
-      textureParameteri(nullptr),
-      textureParameteriv(nullptr),
-      textureStorage1D(nullptr),
-      textureStorage2D(nullptr),
-      textureStorage2DMultisample(nullptr),
-      textureStorage3D(nullptr),
-      textureStorage3DMultisample(nullptr),
-      textureSubImage1D(nullptr),
-      textureSubImage2D(nullptr),
-      textureSubImage3D(nullptr),
-      transformFeedbackBufferBase(nullptr),
-      transformFeedbackBufferRange(nullptr),
-      unmapNamedBuffer(nullptr),
-      vertexArrayAttribBinding(nullptr),
-      vertexArrayAttribFormat(nullptr),
-      vertexArrayAttribIFormat(nullptr),
-      vertexArrayAttribLFormat(nullptr),
-      vertexArrayBindingDivisor(nullptr),
-      vertexArrayElementBuffer(nullptr),
-      vertexArrayVertexBuffer(nullptr),
-      vertexArrayVertexBuffers(nullptr),
-      blendBarrier(nullptr),
-      primitiveBoundingBox(nullptr),
-      eglImageTargetRenderbufferStorageOES(nullptr),
-      eglImageTargetTexture2DOES(nullptr),
-      discardFramebuffer(nullptr),
-      getInternalformatSampleivNV(nullptr)
+FunctionsGL::FunctionsGL() : version(), standard(), extensions()
 {
 }
 
@@ -813,1496 +80,50 @@
     }
     else
     {
-        const char *exts = reinterpret_cast<const char*>(getString(GL_EXTENSIONS));
+        const char *exts = reinterpret_cast<const char *>(getString(GL_EXTENSIONS));
         angle::SplitStringAlongWhitespace(std::string(exts), &extensions);
     }
 
+    std::set<std::string> extensionSet;
+    for (const auto &extension : extensions)
+    {
+        extensionSet.insert(extension);
+    }
+
+    // Note:
+    // Even though extensions are written against specific versions of GL, many drivers expose the
+    // extensions in even older versions.  Always try loading the extensions regardless of GL
+    // version.
+
     // Load the entry points
     switch (standard)
     {
         case STANDARD_GL_DESKTOP:
-            initializeProcsDesktopGL();
+        {
+            // Check the context profile
+            profile = 0;
+            if (isAtLeastGL(gl::Version(3, 2)))
+            {
+                getIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
+            }
+
+            initProcsDesktopGL(version, extensionSet);
             break;
+        }
 
         case STANDARD_GL_ES:
-            initializeProcsGLES();
+            // No profiles in GLES
+            profile = 0;
+
+            initProcsGLES(version, extensionSet);
             break;
 
         default:
             UNREACHABLE();
             break;
     }
-}
 
-void FunctionsGL::initializeProcsDesktopGL()
-{
-    // Check the context profile
-    profile = 0;
-    if (isAtLeastGL(gl::Version(3, 2)))
-    {
-        getIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
-    }
-
-    // clang-format off
-
-    // Load extensions
-    // Even though extensions are written against specific versions of GL, many drivers expose the extensions
-    // in even older versions.  Always try loading the extensions regardless of GL version.
-
-    // GL_NV_internalformat_sample_query
-    ASSIGN_WITH_EXT("GL_NV_internalformat_sample_query", "glGetInternalformatSampleivNV", getInternalformatSampleivNV);
-
-    // GL_ARB_program_interface_query (loading only functions relevant to GL_NV_path_rendering here)
-    ASSIGN_WITH_EXT("GL_ARB_program_interface_query", "glGetProgramInterfaceiv", getProgramInterfaceiv);
-    ASSIGN_WITH_EXT("GL_ARB_program_interface_query", "glGetProgramResourceName", getProgramResourceName);
-    ASSIGN_WITH_EXT("GL_ARB_program_interface_query", "glGetProgramResourceiv", getProgramResourceiv);
-
-    // GL_NV_path_rendering
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glMatrixLoadfEXT", matrixLoadEXT);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glGenPathsNV", genPathsNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glDeletePathsNV", delPathsNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glPathCommandsNV", pathCommandsNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glIsPathNV", isPathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glPathParameterfNV", setPathParameterfNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glPathParameteriNV", setPathParameteriNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glGetPathParameterfvNV", getPathParameterfNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glGetPathParameterivNV", getPathParameteriNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glPathStencilFuncNV", pathStencilFuncNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilFillPathNV", stencilFillPathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilStrokePathNV", stencilStrokePathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glCoverFillPathNV", coverFillPathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glCoverStrokePathNV", coverStrokePathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilThenCoverFillPathNV", stencilThenCoverFillPathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilThenCoverStrokePathNV", stencilThenCoverStrokePathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glCoverFillPathInstancedNV", coverFillPathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glCoverStrokePathInstancedNV", coverStrokePathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilFillPathInstancedNV", stencilFillPathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilStrokePathInstancedNV", stencilStrokePathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilThenCoverFillPathInstancedNV", stencilThenCoverFillPathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilThenCoverStrokePathInstancedNV", stencilThenCoverStrokePathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glProgramPathFragmentInputGenNV", programPathFragmentInputGenNV);
-
-    // GL_NV_framebuffer_mixed_samples
-    ASSIGN_WITH_EXT("GL_NV_framebuffer_mixed_samples", "glCoverageModulationNV", coverageModulationNV);
-
-    // GL_NV_fence
-    ASSIGN_WITH_EXT("GL_NV_fence", "glDeleteFencesNV", deleteFencesNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glGenFencesNV", genFencesNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glIsFenceNV", isFenceNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glTestFenceNV", testFenceNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glGetFenceivNV", getFenceivNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glFinishFenceNV", finishFenceNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glSetFenceNV", setFenceNV);
-
-    // GL_EXT_texture_storage
-    ASSIGN_WITH_EXT("GL_EXT_texture_storage", "glTexStorage1DEXT", texStorage1D);
-    ASSIGN_WITH_EXT("GL_EXT_texture_storage", "glTexStorage2DEXT", texStorage2D);
-    ASSIGN_WITH_EXT("GL_EXT_texture_storage GL_EXT_texture3D", "glTexStorage3DEXT", texStorage3D);
-    ASSIGN_WITH_EXT("GL_EXT_texture_storage GL_EXT_texture3D", "glTextureStorage1DEXT", textureStorage1D);
-    ASSIGN_WITH_EXT("GL_EXT_texture_storage GL_EXT_direct_state_access", "glTextureStorage2DEXT", textureStorage2D);
-    ASSIGN_WITH_EXT("GL_EXT_texture_storage GL_EXT_direct_state_access GL_EXT_texture3D", "glTextureStorage3DEXT", textureStorage3D);
-
-    // GL_ARB_vertex_array_object
-    ASSIGN_WITH_EXT("GL_ARB_vertex_array_object", "glBindVertexArray", bindVertexArray);
-    ASSIGN_WITH_EXT("GL_ARB_vertex_array_object", "glDeleteVertexArrays", deleteVertexArrays);
-    ASSIGN_WITH_EXT("GL_ARB_vertex_array_object", "glGenVertexArrays", genVertexArrays);
-    ASSIGN_WITH_EXT("GL_ARB_vertex_array_object", "glIsVertexArray", isVertexArray);
-
-    // GL_ARB_vertex_attrib_binding
-    ASSIGN_WITH_EXT("GL_ARB_vertex_attrib_binding", "glBindVertexBuffer", bindVertexBuffer);
-    ASSIGN_WITH_EXT("GL_ARB_vertex_attrib_binding", "glVertexAttribFormat", vertexAttribFormat);
-    ASSIGN_WITH_EXT("GL_ARB_vertex_attrib_binding", "glVertexAttribIFormat", vertexAttribIFormat);
-    ASSIGN_WITH_EXT("GL_ARB_vertex_attrib_binding", "glVertexAttribLFormat", vertexAttribLFormat);
-    ASSIGN_WITH_EXT("GL_ARB_vertex_attrib_binding", "glVertexAttribBinding", vertexAttribBinding);
-    ASSIGN_WITH_EXT("GL_ARB_vertex_attrib_binding", "glVertexBindingDivisor", vertexBindingDivisor);
-
-    // GL_ARB_sync
-    ASSIGN_WITH_EXT("GL_ARB_sync", "glClientWaitSync", clientWaitSync);
-    ASSIGN_WITH_EXT("GL_ARB_sync", "glDeleteSync", deleteSync);
-    ASSIGN_WITH_EXT("GL_ARB_sync", "glFenceSync", fenceSync);
-    ASSIGN_WITH_EXT("GL_ARB_sync", "glGetInteger64i_v", getInteger64i_v);
-    ASSIGN_WITH_EXT("GL_ARB_sync", "glGetInteger64v", getInteger64v);
-    ASSIGN_WITH_EXT("GL_ARB_sync", "glGetSynciv", getSynciv);
-    ASSIGN_WITH_EXT("GL_ARB_sync", "glIsSync", isSync);
-    ASSIGN_WITH_EXT("GL_ARB_sync", "glWaitSync", waitSync);
-
-    // GL_EXT_framebuffer_object
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glIsRenderbufferEXT", isRenderbuffer);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glBindRenderbufferEXT", bindRenderbuffer);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glDeleteRenderbuffersEXT", deleteRenderbuffers);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glGenRenderbuffersEXT", genRenderbuffers);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glRenderbufferStorageEXT", renderbufferStorage);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glGetRenderbufferParameterivEXT", getRenderbufferParameteriv);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glIsFramebufferEXT", isFramebuffer);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glBindFramebufferEXT", bindFramebuffer);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glDeleteFramebuffersEXT", deleteFramebuffers);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glGenFramebuffersEXT", genFramebuffers);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glCheckFramebufferStatusEXT", checkFramebufferStatus);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glFramebufferTexture1DEXT", framebufferTexture1D);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glFramebufferTexture2DEXT", framebufferTexture2D);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glFramebufferTexture3DEXT", framebufferTexture3D);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glFramebufferRenderbufferEXT", framebufferRenderbuffer);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glGetFramebufferAttachmentParameterivEXT", getFramebufferAttachmentParameteriv);
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_object", "glGenerateMipmapEXT", generateMipmap);
-
-    // GL_EXT_framebuffer_blit
-    ASSIGN_WITH_EXT("GL_EXT_framebuffer_blit", "glBlitFramebufferEXT", blitFramebuffer);
-
-    // GL_KHR_debug
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glDebugMessageControl", debugMessageControl);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glDebugMessageInsert", debugMessageInsert);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glDebugMessageCallback", debugMessageCallback);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glGetDebugMessageLog", getDebugMessageLog);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glGetPointerv", getPointerv);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glPushDebugGroup", pushDebugGroup);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glPopDebugGroup", popDebugGroup);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glObjectLabel", objectLabel);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glGetObjectLabel", getObjectLabel);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glObjectPtrLabel", objectPtrLabel);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glGetObjectPtrLabel", getObjectPtrLabel);
-
-    // GL_ARB_internalformat_query
-    ASSIGN_WITH_EXT("GL_ARB_internalformat_query", "glGetInternalformativ", getInternalformativ);
-
-    // GL_ARB_ES2_compatibility
-    ASSIGN_WITH_EXT("GL_ARB_ES2_compatibility", "glReleaseShaderCompiler", releaseShaderCompiler);
-    ASSIGN_WITH_EXT("GL_ARB_ES2_compatibility", "glShaderBinary", shaderBinary);
-    ASSIGN_WITH_EXT("GL_ARB_ES2_compatibility", "glGetShaderPrecisionFormat", getShaderPrecisionFormat);
-    ASSIGN_WITH_EXT("GL_ARB_ES2_compatibility", "glDepthRangef", depthRangef);
-    ASSIGN_WITH_EXT("GL_ARB_ES2_compatibility", "glClearDepthf", clearDepthf);
-
-    // GL_ARB_instanced_arrays
-    ASSIGN_WITH_EXT("GL_ARB_instanced_arrays", "glVertexAttribDivisorARB", vertexAttribDivisor);
-
-    // GL_EXT_draw_instanced
-    ASSIGN_WITH_EXT("GL_EXT_draw_instanced", "glDrawArraysInstancedEXT", drawArraysInstanced);
-    ASSIGN_WITH_EXT("GL_EXT_draw_instanced", "glDrawElementsInstancedEXT", drawElementsInstanced);
-
-    // GL_ARB_draw_instanced
-    ASSIGN_WITH_EXT("GL_ARB_draw_instanced", "glDrawArraysInstancedARB", drawArraysInstanced);
-    ASSIGN_WITH_EXT("GL_ARB_draw_instanced", "glDrawElementsInstancedARB", drawElementsInstanced);
-
-    // GL_ARB_sampler_objects
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glGenSamplers", genSamplers);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glDeleteSamplers", deleteSamplers);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glIsSampler", isSampler);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glBindSampler", bindSampler);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glSamplerParameteri", samplerParameteri);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glSamplerParameterf", samplerParameterf);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glSamplerParameteriv", samplerParameteriv);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glSamplerParameterfv", samplerParameterfv);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glSamplerParameterIiv", samplerParameterIiv);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glSamplerParameterIuiv", samplerParameterIuiv);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glGetSamplerParameteriv", getSamplerParameteriv);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glGetSamplerParameterfv", getSamplerParameterfv);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glGetSamplerParameterIiv", getSamplerParameterIiv);
-    ASSIGN_WITH_EXT("GL_ARB_sampler_objects", "glGetSamplerParameterIuiv", getSamplerParameterIuiv);
-
-    // GL_ARB_occlusion_query
-    ASSIGN_WITH_EXT("GL_ARB_occlusion_query", "glGenQueriesARB", genQueries);
-    ASSIGN_WITH_EXT("GL_ARB_occlusion_query", "glDeleteQueriesARB", deleteQueries);
-    ASSIGN_WITH_EXT("GL_ARB_occlusion_query", "glIsQueryARB", isQuery);
-    ASSIGN_WITH_EXT("GL_ARB_occlusion_query", "glBeginQueryARB", beginQuery);
-    ASSIGN_WITH_EXT("GL_ARB_occlusion_query", "glEndQueryARB", endQuery);
-    ASSIGN_WITH_EXT("GL_ARB_occlusion_query", "glGetQueryivARB", getQueryiv);
-    ASSIGN_WITH_EXT("GL_ARB_occlusion_query", "glGetQueryObjectivARB", getQueryObjectiv);
-    ASSIGN_WITH_EXT("GL_ARB_occlusion_query", "glGetQueryObjectuivARB", getQueryObjectuiv);
-
-    // EXT_transform_feedback
-    ASSIGN_WITH_EXT("EXT_transform_feedback", "glBindBufferRangeEXT", bindBufferRange);
-    ASSIGN_WITH_EXT("EXT_transform_feedback", "glBindBufferBaseEXT", bindBufferBase);
-    ASSIGN_WITH_EXT("EXT_transform_feedback", "glBeginTransformFeedbackEXT", beginTransformFeedback);
-    ASSIGN_WITH_EXT("EXT_transform_feedback", "glEndTransformFeedbackEXT", endTransformFeedback);
-    ASSIGN_WITH_EXT("EXT_transform_feedback", "glTransformFeedbackVaryingsEXT", transformFeedbackVaryings);
-    ASSIGN_WITH_EXT("EXT_transform_feedback", "glGetTransformFeedbackVaryingEXT", getTransformFeedbackVarying);
-
-    // GL_ARB_transform_feedback2
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback2", "glBindTransformFeedback", bindTransformFeedback);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback2", "glDeleteTransformFeedbacks", deleteTransformFeedbacks);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback2", "glGenTransformFeedbacks", genTransformFeedbacks);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback2", "glIsTransformFeedback", isTransformFeedback);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback2", "glPauseTransformFeedback", pauseTransformFeedback);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback2", "glResumeTransformFeedback", resumeTransformFeedback);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback2", "glDrawTransformFeedback", drawTransformFeedback);
-
-    // GL_ARB_transform_feedback3
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback3", "glDrawTransformFeedbackStream", drawTransformFeedbackStream);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback3", "glBeginQueryIndexed", beginQueryIndexed);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback3", "glEndQueryIndexed", endQueryIndexed);
-    ASSIGN_WITH_EXT("GL_ARB_transform_feedback3", "glGetQueryIndexediv", getQueryIndexediv);
-
-    // GL_ARB_get_program_binary
-    ASSIGN_WITH_EXT("GL_ARB_get_program_binary", "glGetProgramBinary", getProgramBinary);
-    ASSIGN_WITH_EXT("GL_ARB_get_program_binary", "glProgramBinary", programBinary);
-    ASSIGN_WITH_EXT("GL_ARB_get_program_binary", "glProgramParameteri", programParameteri);
-
-    // GL_ARB_robustness
-    ASSIGN_WITH_EXT("GL_ARB_robustness", "glGetGraphicsResetStatusARB", getGraphicsResetStatus);
-
-    // GL_KHR_robustness
-    ASSIGN_WITH_EXT("GL_KHR_robustness", "glGetGraphicsResetStatus", getGraphicsResetStatus);
-
-    // GL_ARB_invalidate_subdata
-    ASSIGN_WITH_EXT("GL_ARB_invalidate_subdata", "glInvalidateTexSubImage", invalidateTexSubImage);
-    ASSIGN_WITH_EXT("GL_ARB_invalidate_subdata", "glInvalidateTexImage", invalidateTexImage);
-    ASSIGN_WITH_EXT("GL_ARB_invalidate_subdata", "glInvalidateBufferSubData", invalidateBufferSubData);
-    ASSIGN_WITH_EXT("GL_ARB_invalidate_subdata", "glInvalidateBufferData", invalidateBufferData);
-    ASSIGN_WITH_EXT("GL_ARB_invalidate_subdata", "glInvalidateFramebuffer", invalidateFramebuffer);
-    ASSIGN_WITH_EXT("GL_ARB_invalidate_subdata", "glInvalidateSubFramebuffer", invalidateSubFramebuffer);
-
-    // 1.0
-    if (isAtLeastGL(gl::Version(1, 0)))
-    {
-        ASSIGN("glBlendFunc", blendFunc);
-        ASSIGN("glClear", clear);
-        ASSIGN("glClearColor", clearColor);
-        ASSIGN("glClearDepth", clearDepth);
-        ASSIGN("glClearStencil", clearStencil);
-        ASSIGN("glColorMask", colorMask);
-        ASSIGN("glCullFace", cullFace);
-        ASSIGN("glDepthFunc", depthFunc);
-        ASSIGN("glDepthMask", depthMask);
-        ASSIGN("glDepthRange", depthRange);
-        ASSIGN("glDisable", disable);
-        ASSIGN("glDrawBuffer", drawBuffer);
-        ASSIGN("glEnable", enable);
-        ASSIGN("glFinish", finish);
-        ASSIGN("glFlush", flush);
-        ASSIGN("glFrontFace", frontFace);
-        ASSIGN("glGetBooleanv", getBooleanv);
-        ASSIGN("glGetDoublev", getDoublev);
-        ASSIGN("glGetError", getError);
-        ASSIGN("glGetFloatv", getFloatv);
-        ASSIGN("glGetIntegerv", getIntegerv);
-        ASSIGN("glGetString", getString);
-        ASSIGN("glGetTexImage", getTexImage);
-        ASSIGN("glGetTexLevelParameterfv", getTexLevelParameterfv);
-        ASSIGN("glGetTexLevelParameteriv", getTexLevelParameteriv);
-        ASSIGN("glGetTexParameterfv", getTexParameterfv);
-        ASSIGN("glGetTexParameteriv", getTexParameteriv);
-        ASSIGN("glHint", hint);
-        ASSIGN("glIsEnabled", isEnabled);
-        ASSIGN("glLineWidth", lineWidth);
-        ASSIGN("glLogicOp", logicOp);
-        ASSIGN("glPixelStoref", pixelStoref);
-        ASSIGN("glPixelStorei", pixelStorei);
-        ASSIGN("glPointSize", pointSize);
-        ASSIGN("glPolygonMode", polygonMode);
-        ASSIGN("glReadBuffer", readBuffer);
-        ASSIGN("glReadPixels", readPixels);
-        ASSIGN("glScissor", scissor);
-        ASSIGN("glStencilFunc", stencilFunc);
-        ASSIGN("glStencilMask", stencilMask);
-        ASSIGN("glStencilOp", stencilOp);
-        ASSIGN("glTexImage1D", texImage1D);
-        ASSIGN("glTexImage2D", texImage2D);
-        ASSIGN("glTexParameterf", texParameterf);
-        ASSIGN("glTexParameterfv", texParameterfv);
-        ASSIGN("glTexParameteri", texParameteri);
-        ASSIGN("glTexParameteriv", texParameteriv);
-        ASSIGN("glViewport", viewport);
-    }
-
-    // 1.1
-    if (isAtLeastGL(gl::Version(1, 1)))
-    {
-        ASSIGN("glBindTexture", bindTexture);
-        ASSIGN("glCopyTexImage1D", copyTexImage1D);
-        ASSIGN("glCopyTexImage2D", copyTexImage2D);
-        ASSIGN("glCopyTexSubImage1D", copyTexSubImage1D);
-        ASSIGN("glCopyTexSubImage2D", copyTexSubImage2D);
-        ASSIGN("glDeleteTextures", deleteTextures);
-        ASSIGN("glDrawArrays", drawArrays);
-        ASSIGN("glDrawElements", drawElements);
-        ASSIGN("glGenTextures", genTextures);
-        ASSIGN("glIsTexture", isTexture);
-        ASSIGN("glPolygonOffset", polygonOffset);
-        ASSIGN("glTexSubImage1D", texSubImage1D);
-        ASSIGN("glTexSubImage2D", texSubImage2D);
-    }
-
-    // 1.2
-    if (isAtLeastGL(gl::Version(1, 2)))
-    {
-        ASSIGN("glBlendColor", blendColor);
-        ASSIGN("glBlendEquation", blendEquation);
-        ASSIGN("glCopyTexSubImage3D", copyTexSubImage3D);
-        ASSIGN("glDrawRangeElements", drawRangeElements);
-        ASSIGN("glTexImage3D", texImage3D);
-        ASSIGN("glTexSubImage3D", texSubImage3D);
-    }
-
-    // 1.3
-    if (isAtLeastGL(gl::Version(1, 3)))
-    {
-        ASSIGN("glActiveTexture", activeTexture);
-        ASSIGN("glCompressedTexImage1D", compressedTexImage1D);
-        ASSIGN("glCompressedTexImage2D", compressedTexImage2D);
-        ASSIGN("glCompressedTexImage3D", compressedTexImage3D);
-        ASSIGN("glCompressedTexSubImage1D", compressedTexSubImage1D);
-        ASSIGN("glCompressedTexSubImage2D", compressedTexSubImage2D);
-        ASSIGN("glCompressedTexSubImage3D", compressedTexSubImage3D);
-        ASSIGN("glGetCompressedTexImage", getCompressedTexImage);
-        ASSIGN("glSampleCoverage", sampleCoverage);
-    }
-
-    // 1.4
-    if (isAtLeastGL(gl::Version(1, 4)))
-    {
-        ASSIGN("glBlendFuncSeparate", blendFuncSeparate);
-        ASSIGN("glMultiDrawArrays", multiDrawArrays);
-        ASSIGN("glMultiDrawElements", multiDrawElements);
-        ASSIGN("glPointParameterf", pointParameterf);
-        ASSIGN("glPointParameterfv", pointParameterfv);
-        ASSIGN("glPointParameteri", pointParameteri);
-        ASSIGN("glPointParameteriv", pointParameteriv);
-    }
-
-    // 1.5
-    if (isAtLeastGL(gl::Version(1, 5)))
-    {
-        ASSIGN("glBeginQuery", beginQuery);
-        ASSIGN("glBindBuffer", bindBuffer);
-        ASSIGN("glBufferData", bufferData);
-        ASSIGN("glBufferSubData", bufferSubData);
-        ASSIGN("glDeleteBuffers", deleteBuffers);
-        ASSIGN("glDeleteQueries", deleteQueries);
-        ASSIGN("glEndQuery", endQuery);
-        ASSIGN("glGenBuffers", genBuffers);
-        ASSIGN("glGenQueries", genQueries);
-        ASSIGN("glGetBufferParameteriv", getBufferParameteriv);
-        ASSIGN("glGetBufferPointerv", getBufferPointerv);
-        ASSIGN("glGetBufferSubData", getBufferSubData);
-        ASSIGN("glGetQueryObjectiv", getQueryObjectiv);
-        ASSIGN("glGetQueryObjectuiv", getQueryObjectuiv);
-        ASSIGN("glGetQueryiv", getQueryiv);
-        ASSIGN("glIsBuffer", isBuffer);
-        ASSIGN("glIsQuery", isQuery);
-        ASSIGN("glMapBuffer", mapBuffer);
-        ASSIGN("glUnmapBuffer", unmapBuffer);
-    }
-
-    // 2.0
-    if (isAtLeastGL(gl::Version(2, 0)))
-    {
-        ASSIGN("glAttachShader", attachShader);
-        ASSIGN("glBindAttribLocation", bindAttribLocation);
-        ASSIGN("glBlendEquationSeparate", blendEquationSeparate);
-        ASSIGN("glCompileShader", compileShader);
-        ASSIGN("glCreateProgram", createProgram);
-        ASSIGN("glCreateShader", createShader);
-        ASSIGN("glDeleteProgram", deleteProgram);
-        ASSIGN("glDeleteShader", deleteShader);
-        ASSIGN("glDetachShader", detachShader);
-        ASSIGN("glDisableVertexAttribArray", disableVertexAttribArray);
-        ASSIGN("glDrawBuffers", drawBuffers);
-        ASSIGN("glEnableVertexAttribArray", enableVertexAttribArray);
-        ASSIGN("glGetActiveAttrib", getActiveAttrib);
-        ASSIGN("glGetActiveUniform", getActiveUniform);
-        ASSIGN("glGetAttachedShaders", getAttachedShaders);
-        ASSIGN("glGetAttribLocation", getAttribLocation);
-        ASSIGN("glGetProgramInfoLog", getProgramInfoLog);
-        ASSIGN("glGetProgramiv", getProgramiv);
-        ASSIGN("glGetShaderInfoLog", getShaderInfoLog);
-        ASSIGN("glGetShaderSource", getShaderSource);
-        ASSIGN("glGetShaderiv", getShaderiv);
-        ASSIGN("glGetUniformLocation", getUniformLocation);
-        ASSIGN("glGetUniformfv", getUniformfv);
-        ASSIGN("glGetUniformiv", getUniformiv);
-        ASSIGN("glGetVertexAttribPointerv", getVertexAttribPointerv);
-        ASSIGN("glGetVertexAttribdv", getVertexAttribdv);
-        ASSIGN("glGetVertexAttribfv", getVertexAttribfv);
-        ASSIGN("glGetVertexAttribiv", getVertexAttribiv);
-        ASSIGN("glIsProgram", isProgram);
-        ASSIGN("glIsShader", isShader);
-        ASSIGN("glLinkProgram", linkProgram);
-        ASSIGN("glShaderSource", shaderSource);
-        ASSIGN("glStencilFuncSeparate", stencilFuncSeparate);
-        ASSIGN("glStencilMaskSeparate", stencilMaskSeparate);
-        ASSIGN("glStencilOpSeparate", stencilOpSeparate);
-        ASSIGN("glUniform1f", uniform1f);
-        ASSIGN("glUniform1fv", uniform1fv);
-        ASSIGN("glUniform1i", uniform1i);
-        ASSIGN("glUniform1iv", uniform1iv);
-        ASSIGN("glUniform2f", uniform2f);
-        ASSIGN("glUniform2fv", uniform2fv);
-        ASSIGN("glUniform2i", uniform2i);
-        ASSIGN("glUniform2iv", uniform2iv);
-        ASSIGN("glUniform3f", uniform3f);
-        ASSIGN("glUniform3fv", uniform3fv);
-        ASSIGN("glUniform3i", uniform3i);
-        ASSIGN("glUniform3iv", uniform3iv);
-        ASSIGN("glUniform4f", uniform4f);
-        ASSIGN("glUniform4fv", uniform4fv);
-        ASSIGN("glUniform4i", uniform4i);
-        ASSIGN("glUniform4iv", uniform4iv);
-        ASSIGN("glUniformMatrix2fv", uniformMatrix2fv);
-        ASSIGN("glUniformMatrix3fv", uniformMatrix3fv);
-        ASSIGN("glUniformMatrix4fv", uniformMatrix4fv);
-        ASSIGN("glUseProgram", useProgram);
-        ASSIGN("glValidateProgram", validateProgram);
-        ASSIGN("glVertexAttrib1d", vertexAttrib1d);
-        ASSIGN("glVertexAttrib1dv", vertexAttrib1dv);
-        ASSIGN("glVertexAttrib1f", vertexAttrib1f);
-        ASSIGN("glVertexAttrib1fv", vertexAttrib1fv);
-        ASSIGN("glVertexAttrib1s", vertexAttrib1s);
-        ASSIGN("glVertexAttrib1sv", vertexAttrib1sv);
-        ASSIGN("glVertexAttrib2d", vertexAttrib2d);
-        ASSIGN("glVertexAttrib2dv", vertexAttrib2dv);
-        ASSIGN("glVertexAttrib2f", vertexAttrib2f);
-        ASSIGN("glVertexAttrib2fv", vertexAttrib2fv);
-        ASSIGN("glVertexAttrib2s", vertexAttrib2s);
-        ASSIGN("glVertexAttrib2sv", vertexAttrib2sv);
-        ASSIGN("glVertexAttrib3d", vertexAttrib3d);
-        ASSIGN("glVertexAttrib3dv", vertexAttrib3dv);
-        ASSIGN("glVertexAttrib3f", vertexAttrib3f);
-        ASSIGN("glVertexAttrib3fv", vertexAttrib3fv);
-        ASSIGN("glVertexAttrib3s", vertexAttrib3s);
-        ASSIGN("glVertexAttrib3sv", vertexAttrib3sv);
-        ASSIGN("glVertexAttrib4Nbv", vertexAttrib4Nbv);
-        ASSIGN("glVertexAttrib4Niv", vertexAttrib4Niv);
-        ASSIGN("glVertexAttrib4Nsv", vertexAttrib4Nsv);
-        ASSIGN("glVertexAttrib4Nub", vertexAttrib4Nub);
-        ASSIGN("glVertexAttrib4Nubv", vertexAttrib4Nubv);
-        ASSIGN("glVertexAttrib4Nuiv", vertexAttrib4Nuiv);
-        ASSIGN("glVertexAttrib4Nusv", vertexAttrib4Nusv);
-        ASSIGN("glVertexAttrib4bv", vertexAttrib4bv);
-        ASSIGN("glVertexAttrib4d", vertexAttrib4d);
-        ASSIGN("glVertexAttrib4dv", vertexAttrib4dv);
-        ASSIGN("glVertexAttrib4f", vertexAttrib4f);
-        ASSIGN("glVertexAttrib4fv", vertexAttrib4fv);
-        ASSIGN("glVertexAttrib4iv", vertexAttrib4iv);
-        ASSIGN("glVertexAttrib4s", vertexAttrib4s);
-        ASSIGN("glVertexAttrib4sv", vertexAttrib4sv);
-        ASSIGN("glVertexAttrib4ubv", vertexAttrib4ubv);
-        ASSIGN("glVertexAttrib4uiv", vertexAttrib4uiv);
-        ASSIGN("glVertexAttrib4usv", vertexAttrib4usv);
-        ASSIGN("glVertexAttribPointer", vertexAttribPointer);
-    }
-
-    // 2.1
-    if (isAtLeastGL(gl::Version(2, 1)))
-    {
-        ASSIGN("glUniformMatrix2x3fv", uniformMatrix2x3fv);
-        ASSIGN("glUniformMatrix2x4fv", uniformMatrix2x4fv);
-        ASSIGN("glUniformMatrix3x2fv", uniformMatrix3x2fv);
-        ASSIGN("glUniformMatrix3x4fv", uniformMatrix3x4fv);
-        ASSIGN("glUniformMatrix4x2fv", uniformMatrix4x2fv);
-        ASSIGN("glUniformMatrix4x3fv", uniformMatrix4x3fv);
-    }
-
-    // 3.0
-    if (isAtLeastGL(gl::Version(3, 0)))
-    {
-        ASSIGN("glBeginConditionalRender", beginConditionalRender);
-        ASSIGN("glBeginTransformFeedback", beginTransformFeedback);
-        ASSIGN("glBindBufferBase", bindBufferBase);
-        ASSIGN("glBindBufferRange", bindBufferRange);
-        ASSIGN("glBindFragDataLocation", bindFragDataLocation);
-        ASSIGN("glBindFramebuffer", bindFramebuffer);
-        ASSIGN("glBindRenderbuffer", bindRenderbuffer);
-        ASSIGN("glBindVertexArray", bindVertexArray);
-        ASSIGN("glBlitFramebuffer", blitFramebuffer);
-        ASSIGN("glCheckFramebufferStatus", checkFramebufferStatus);
-        ASSIGN("glClampColor", clampColor);
-        ASSIGN("glClearBufferfi", clearBufferfi);
-        ASSIGN("glClearBufferfv", clearBufferfv);
-        ASSIGN("glClearBufferiv", clearBufferiv);
-        ASSIGN("glClearBufferuiv", clearBufferuiv);
-        ASSIGN("glColorMaski", colorMaski);
-        ASSIGN("glDeleteFramebuffers", deleteFramebuffers);
-        ASSIGN("glDeleteRenderbuffers", deleteRenderbuffers);
-        ASSIGN("glDeleteVertexArrays", deleteVertexArrays);
-        ASSIGN("glDisablei", disablei);
-        ASSIGN("glEnablei", enablei);
-        ASSIGN("glEndConditionalRender", endConditionalRender);
-        ASSIGN("glEndTransformFeedback", endTransformFeedback);
-        ASSIGN("glFlushMappedBufferRange", flushMappedBufferRange);
-        ASSIGN("glFramebufferRenderbuffer", framebufferRenderbuffer);
-        ASSIGN("glFramebufferTexture1D", framebufferTexture1D);
-        ASSIGN("glFramebufferTexture2D", framebufferTexture2D);
-        ASSIGN("glFramebufferTexture3D", framebufferTexture3D);
-        ASSIGN("glFramebufferTextureLayer", framebufferTextureLayer);
-        ASSIGN("glGenFramebuffers", genFramebuffers);
-        ASSIGN("glGenRenderbuffers", genRenderbuffers);
-        ASSIGN("glGenVertexArrays", genVertexArrays);
-        ASSIGN("glGenerateMipmap", generateMipmap);
-        ASSIGN("glGetBooleani_v", getBooleani_v);
-        ASSIGN("glGetFragDataLocation", getFragDataLocation);
-        ASSIGN("glGetFramebufferAttachmentParameteriv", getFramebufferAttachmentParameteriv);
-        ASSIGN("glGetIntegeri_v", getIntegeri_v);
-        ASSIGN("glGetRenderbufferParameteriv", getRenderbufferParameteriv);
-        ASSIGN("glGetStringi", getStringi);
-        ASSIGN("glGetTexParameterIiv", getTexParameterIiv);
-        ASSIGN("glGetTexParameterIuiv", getTexParameterIuiv);
-        ASSIGN("glGetTransformFeedbackVarying", getTransformFeedbackVarying);
-        ASSIGN("glGetUniformuiv", getUniformuiv);
-        ASSIGN("glGetVertexAttribIiv", getVertexAttribIiv);
-        ASSIGN("glGetVertexAttribIuiv", getVertexAttribIuiv);
-        ASSIGN("glIsEnabledi", isEnabledi);
-        ASSIGN("glIsFramebuffer", isFramebuffer);
-        ASSIGN("glIsRenderbuffer", isRenderbuffer);
-        ASSIGN("glIsVertexArray", isVertexArray);
-        ASSIGN("glMapBufferRange", mapBufferRange);
-        ASSIGN("glRenderbufferStorage", renderbufferStorage);
-        ASSIGN("glRenderbufferStorageMultisample", renderbufferStorageMultisample);
-        ASSIGN("glTexParameterIiv", texParameterIiv);
-        ASSIGN("glTexParameterIuiv", texParameterIuiv);
-        ASSIGN("glTransformFeedbackVaryings", transformFeedbackVaryings);
-        ASSIGN("glUniform1ui", uniform1ui);
-        ASSIGN("glUniform1uiv", uniform1uiv);
-        ASSIGN("glUniform2ui", uniform2ui);
-        ASSIGN("glUniform2uiv", uniform2uiv);
-        ASSIGN("glUniform3ui", uniform3ui);
-        ASSIGN("glUniform3uiv", uniform3uiv);
-        ASSIGN("glUniform4ui", uniform4ui);
-        ASSIGN("glUniform4uiv", uniform4uiv);
-        ASSIGN("glVertexAttribI1i", vertexAttribI1i);
-        ASSIGN("glVertexAttribI1iv", vertexAttribI1iv);
-        ASSIGN("glVertexAttribI1ui", vertexAttribI1ui);
-        ASSIGN("glVertexAttribI1uiv", vertexAttribI1uiv);
-        ASSIGN("glVertexAttribI2i", vertexAttribI2i);
-        ASSIGN("glVertexAttribI2iv", vertexAttribI2iv);
-        ASSIGN("glVertexAttribI2ui", vertexAttribI2ui);
-        ASSIGN("glVertexAttribI2uiv", vertexAttribI2uiv);
-        ASSIGN("glVertexAttribI3i", vertexAttribI3i);
-        ASSIGN("glVertexAttribI3iv", vertexAttribI3iv);
-        ASSIGN("glVertexAttribI3ui", vertexAttribI3ui);
-        ASSIGN("glVertexAttribI3uiv", vertexAttribI3uiv);
-        ASSIGN("glVertexAttribI4bv", vertexAttribI4bv);
-        ASSIGN("glVertexAttribI4i", vertexAttribI4i);
-        ASSIGN("glVertexAttribI4iv", vertexAttribI4iv);
-        ASSIGN("glVertexAttribI4sv", vertexAttribI4sv);
-        ASSIGN("glVertexAttribI4ubv", vertexAttribI4ubv);
-        ASSIGN("glVertexAttribI4ui", vertexAttribI4ui);
-        ASSIGN("glVertexAttribI4uiv", vertexAttribI4uiv);
-        ASSIGN("glVertexAttribI4usv", vertexAttribI4usv);
-        ASSIGN("glVertexAttribIPointer", vertexAttribIPointer);
-    }
-
-    // 3.1
-    if (isAtLeastGL(gl::Version(3, 1)))
-    {
-        ASSIGN("glCopyBufferSubData", copyBufferSubData);
-        ASSIGN("glDrawArraysInstanced", drawArraysInstanced);
-        ASSIGN("glDrawElementsInstanced", drawElementsInstanced);
-        ASSIGN("glGetActiveUniformBlockName", getActiveUniformBlockName);
-        ASSIGN("glGetActiveUniformBlockiv", getActiveUniformBlockiv);
-        ASSIGN("glGetActiveUniformName", getActiveUniformName);
-        ASSIGN("glGetActiveUniformsiv", getActiveUniformsiv);
-        ASSIGN("glGetUniformBlockIndex", getUniformBlockIndex);
-        ASSIGN("glGetUniformIndices", getUniformIndices);
-        ASSIGN("glPrimitiveRestartIndex", primitiveRestartIndex);
-        ASSIGN("glTexBuffer", texBuffer);
-        ASSIGN("glUniformBlockBinding", uniformBlockBinding);
-    }
-
-    // 3.2
-    if (isAtLeastGL(gl::Version(3, 2)))
-    {
-        ASSIGN("glClientWaitSync", clientWaitSync);
-        ASSIGN("glDeleteSync", deleteSync);
-        ASSIGN("glDrawElementsBaseVertex", drawElementsBaseVertex);
-        ASSIGN("glDrawElementsInstancedBaseVertex", drawElementsInstancedBaseVertex);
-        ASSIGN("glDrawRangeElementsBaseVertex", drawRangeElementsBaseVertex);
-        ASSIGN("glFenceSync", fenceSync);
-        ASSIGN("glFramebufferTexture", framebufferTexture);
-        ASSIGN("glGetBufferParameteri64v", getBufferParameteri64v);
-        ASSIGN("glGetInteger64i_v", getInteger64i_v);
-        ASSIGN("glGetInteger64v", getInteger64v);
-        ASSIGN("glGetMultisamplefv", getMultisamplefv);
-        ASSIGN("glGetSynciv", getSynciv);
-        ASSIGN("glIsSync", isSync);
-        ASSIGN("glMultiDrawElementsBaseVertex", multiDrawElementsBaseVertex);
-        ASSIGN("glProvokingVertex", provokingVertex);
-        ASSIGN("glSampleMaski", sampleMaski);
-        ASSIGN("glTexImage2DMultisample", texImage2DMultisample);
-        ASSIGN("glTexImage3DMultisample", texImage3DMultisample);
-        ASSIGN("glWaitSync", waitSync);
-    }
-
-    // 3.3
-    if (isAtLeastGL(gl::Version(3, 3)))
-    {
-        ASSIGN("glBindFragDataLocationIndexed", bindFragDataLocationIndexed);
-        ASSIGN("glBindSampler", bindSampler);
-        ASSIGN("glDeleteSamplers", deleteSamplers);
-        ASSIGN("glGenSamplers", genSamplers);
-        ASSIGN("glGetFragDataIndex", getFragDataIndex);
-        ASSIGN("glGetQueryObjecti64v", getQueryObjecti64v);
-        ASSIGN("glGetQueryObjectui64v", getQueryObjectui64v);
-        ASSIGN("glGetSamplerParameterIiv", getSamplerParameterIiv);
-        ASSIGN("glGetSamplerParameterIuiv", getSamplerParameterIuiv);
-        ASSIGN("glGetSamplerParameterfv", getSamplerParameterfv);
-        ASSIGN("glGetSamplerParameteriv", getSamplerParameteriv);
-        ASSIGN("glIsSampler", isSampler);
-        ASSIGN("glQueryCounter", queryCounter);
-        ASSIGN("glSamplerParameterIiv", samplerParameterIiv);
-        ASSIGN("glSamplerParameterIuiv", samplerParameterIuiv);
-        ASSIGN("glSamplerParameterf", samplerParameterf);
-        ASSIGN("glSamplerParameterfv", samplerParameterfv);
-        ASSIGN("glSamplerParameteri", samplerParameteri);
-        ASSIGN("glSamplerParameteriv", samplerParameteriv);
-        ASSIGN("glVertexAttribDivisor", vertexAttribDivisor);
-        ASSIGN("glVertexAttribP1ui", vertexAttribP1ui);
-        ASSIGN("glVertexAttribP1uiv", vertexAttribP1uiv);
-        ASSIGN("glVertexAttribP2ui", vertexAttribP2ui);
-        ASSIGN("glVertexAttribP2uiv", vertexAttribP2uiv);
-        ASSIGN("glVertexAttribP3ui", vertexAttribP3ui);
-        ASSIGN("glVertexAttribP3uiv", vertexAttribP3uiv);
-        ASSIGN("glVertexAttribP4ui", vertexAttribP4ui);
-        ASSIGN("glVertexAttribP4uiv", vertexAttribP4uiv);
-    }
-
-    // 4.0
-    if (isAtLeastGL(gl::Version(4, 0)))
-    {
-        ASSIGN("glBeginQueryIndexed", beginQueryIndexed);
-        ASSIGN("glBindTransformFeedback", bindTransformFeedback);
-        ASSIGN("glBlendEquationSeparatei", blendEquationSeparatei);
-        ASSIGN("glBlendEquationi", blendEquationi);
-        ASSIGN("glBlendFuncSeparatei", blendFuncSeparatei);
-        ASSIGN("glBlendFunci", blendFunci);
-        ASSIGN("glDeleteTransformFeedbacks", deleteTransformFeedbacks);
-        ASSIGN("glDrawArraysIndirect", drawArraysIndirect);
-        ASSIGN("glDrawElementsIndirect", drawElementsIndirect);
-        ASSIGN("glDrawTransformFeedback", drawTransformFeedback);
-        ASSIGN("glDrawTransformFeedbackStream", drawTransformFeedbackStream);
-        ASSIGN("glEndQueryIndexed", endQueryIndexed);
-        ASSIGN("glGenTransformFeedbacks", genTransformFeedbacks);
-        ASSIGN("glGetActiveSubroutineName", getActiveSubroutineName);
-        ASSIGN("glGetActiveSubroutineUniformName", getActiveSubroutineUniformName);
-        ASSIGN("glGetActiveSubroutineUniformiv", getActiveSubroutineUniformiv);
-        ASSIGN("glGetProgramStageiv", getProgramStageiv);
-        ASSIGN("glGetQueryIndexediv", getQueryIndexediv);
-        ASSIGN("glGetSubroutineIndex", getSubroutineIndex);
-        ASSIGN("glGetSubroutineUniformLocation", getSubroutineUniformLocation);
-        ASSIGN("glGetUniformSubroutineuiv", getUniformSubroutineuiv);
-        ASSIGN("glGetUniformdv", getUniformdv);
-        ASSIGN("glIsTransformFeedback", isTransformFeedback);
-        ASSIGN("glMinSampleShading", minSampleShading);
-        ASSIGN("glPatchParameterfv", patchParameterfv);
-        ASSIGN("glPatchParameteri", patchParameteri);
-        ASSIGN("glPauseTransformFeedback", pauseTransformFeedback);
-        ASSIGN("glResumeTransformFeedback", resumeTransformFeedback);
-        ASSIGN("glUniform1d", uniform1d);
-        ASSIGN("glUniform1dv", uniform1dv);
-        ASSIGN("glUniform2d", uniform2d);
-        ASSIGN("glUniform2dv", uniform2dv);
-        ASSIGN("glUniform3d", uniform3d);
-        ASSIGN("glUniform3dv", uniform3dv);
-        ASSIGN("glUniform4d", uniform4d);
-        ASSIGN("glUniform4dv", uniform4dv);
-        ASSIGN("glUniformMatrix2dv", uniformMatrix2dv);
-        ASSIGN("glUniformMatrix2x3dv", uniformMatrix2x3dv);
-        ASSIGN("glUniformMatrix2x4dv", uniformMatrix2x4dv);
-        ASSIGN("glUniformMatrix3dv", uniformMatrix3dv);
-        ASSIGN("glUniformMatrix3x2dv", uniformMatrix3x2dv);
-        ASSIGN("glUniformMatrix3x4dv", uniformMatrix3x4dv);
-        ASSIGN("glUniformMatrix4dv", uniformMatrix4dv);
-        ASSIGN("glUniformMatrix4x2dv", uniformMatrix4x2dv);
-        ASSIGN("glUniformMatrix4x3dv", uniformMatrix4x3dv);
-        ASSIGN("glUniformSubroutinesuiv", uniformSubroutinesuiv);
-    }
-
-    // 4.1
-    if (isAtLeastGL(gl::Version(4, 1)))
-    {
-        ASSIGN("glActiveShaderProgram", activeShaderProgram);
-        ASSIGN("glBindProgramPipeline", bindProgramPipeline);
-        ASSIGN("glClearDepthf", clearDepthf);
-        ASSIGN("glCreateShaderProgramv", createShaderProgramv);
-        ASSIGN("glDeleteProgramPipelines", deleteProgramPipelines);
-        ASSIGN("glDepthRangeArrayv", depthRangeArrayv);
-        ASSIGN("glDepthRangeIndexed", depthRangeIndexed);
-        ASSIGN("glDepthRangef", depthRangef);
-        ASSIGN("glGenProgramPipelines", genProgramPipelines);
-        ASSIGN("glGetDoublei_v", getDoublei_v);
-        ASSIGN("glGetFloati_v", getFloati_v);
-        ASSIGN("glGetProgramBinary", getProgramBinary);
-        ASSIGN("glGetProgramPipelineInfoLog", getProgramPipelineInfoLog);
-        ASSIGN("glGetProgramPipelineiv", getProgramPipelineiv);
-        ASSIGN("glGetShaderPrecisionFormat", getShaderPrecisionFormat);
-        ASSIGN("glGetVertexAttribLdv", getVertexAttribLdv);
-        ASSIGN("glIsProgramPipeline", isProgramPipeline);
-        ASSIGN("glProgramBinary", programBinary);
-        ASSIGN("glProgramParameteri", programParameteri);
-        ASSIGN("glProgramUniform1d", programUniform1d);
-        ASSIGN("glProgramUniform1dv", programUniform1dv);
-        ASSIGN("glProgramUniform1f", programUniform1f);
-        ASSIGN("glProgramUniform1fv", programUniform1fv);
-        ASSIGN("glProgramUniform1i", programUniform1i);
-        ASSIGN("glProgramUniform1iv", programUniform1iv);
-        ASSIGN("glProgramUniform1ui", programUniform1ui);
-        ASSIGN("glProgramUniform1uiv", programUniform1uiv);
-        ASSIGN("glProgramUniform2d", programUniform2d);
-        ASSIGN("glProgramUniform2dv", programUniform2dv);
-        ASSIGN("glProgramUniform2f", programUniform2f);
-        ASSIGN("glProgramUniform2fv", programUniform2fv);
-        ASSIGN("glProgramUniform2i", programUniform2i);
-        ASSIGN("glProgramUniform2iv", programUniform2iv);
-        ASSIGN("glProgramUniform2ui", programUniform2ui);
-        ASSIGN("glProgramUniform2uiv", programUniform2uiv);
-        ASSIGN("glProgramUniform3d", programUniform3d);
-        ASSIGN("glProgramUniform3dv", programUniform3dv);
-        ASSIGN("glProgramUniform3f", programUniform3f);
-        ASSIGN("glProgramUniform3fv", programUniform3fv);
-        ASSIGN("glProgramUniform3i", programUniform3i);
-        ASSIGN("glProgramUniform3iv", programUniform3iv);
-        ASSIGN("glProgramUniform3ui", programUniform3ui);
-        ASSIGN("glProgramUniform3uiv", programUniform3uiv);
-        ASSIGN("glProgramUniform4d", programUniform4d);
-        ASSIGN("glProgramUniform4dv", programUniform4dv);
-        ASSIGN("glProgramUniform4f", programUniform4f);
-        ASSIGN("glProgramUniform4fv", programUniform4fv);
-        ASSIGN("glProgramUniform4i", programUniform4i);
-        ASSIGN("glProgramUniform4iv", programUniform4iv);
-        ASSIGN("glProgramUniform4ui", programUniform4ui);
-        ASSIGN("glProgramUniform4uiv", programUniform4uiv);
-        ASSIGN("glProgramUniformMatrix2dv", programUniformMatrix2dv);
-        ASSIGN("glProgramUniformMatrix2fv", programUniformMatrix2fv);
-        ASSIGN("glProgramUniformMatrix2x3dv", programUniformMatrix2x3dv);
-        ASSIGN("glProgramUniformMatrix2x3fv", programUniformMatrix2x3fv);
-        ASSIGN("glProgramUniformMatrix2x4dv", programUniformMatrix2x4dv);
-        ASSIGN("glProgramUniformMatrix2x4fv", programUniformMatrix2x4fv);
-        ASSIGN("glProgramUniformMatrix3dv", programUniformMatrix3dv);
-        ASSIGN("glProgramUniformMatrix3fv", programUniformMatrix3fv);
-        ASSIGN("glProgramUniformMatrix3x2dv", programUniformMatrix3x2dv);
-        ASSIGN("glProgramUniformMatrix3x2fv", programUniformMatrix3x2fv);
-        ASSIGN("glProgramUniformMatrix3x4dv", programUniformMatrix3x4dv);
-        ASSIGN("glProgramUniformMatrix3x4fv", programUniformMatrix3x4fv);
-        ASSIGN("glProgramUniformMatrix4dv", programUniformMatrix4dv);
-        ASSIGN("glProgramUniformMatrix4fv", programUniformMatrix4fv);
-        ASSIGN("glProgramUniformMatrix4x2dv", programUniformMatrix4x2dv);
-        ASSIGN("glProgramUniformMatrix4x2fv", programUniformMatrix4x2fv);
-        ASSIGN("glProgramUniformMatrix4x3dv", programUniformMatrix4x3dv);
-        ASSIGN("glProgramUniformMatrix4x3fv", programUniformMatrix4x3fv);
-        ASSIGN("glReleaseShaderCompiler", releaseShaderCompiler);
-        ASSIGN("glScissorArrayv", scissorArrayv);
-        ASSIGN("glScissorIndexed", scissorIndexed);
-        ASSIGN("glScissorIndexedv", scissorIndexedv);
-        ASSIGN("glShaderBinary", shaderBinary);
-        ASSIGN("glUseProgramStages", useProgramStages);
-        ASSIGN("glValidateProgramPipeline", validateProgramPipeline);
-        ASSIGN("glVertexAttribL1d", vertexAttribL1d);
-        ASSIGN("glVertexAttribL1dv", vertexAttribL1dv);
-        ASSIGN("glVertexAttribL2d", vertexAttribL2d);
-        ASSIGN("glVertexAttribL2dv", vertexAttribL2dv);
-        ASSIGN("glVertexAttribL3d", vertexAttribL3d);
-        ASSIGN("glVertexAttribL3dv", vertexAttribL3dv);
-        ASSIGN("glVertexAttribL4d", vertexAttribL4d);
-        ASSIGN("glVertexAttribL4dv", vertexAttribL4dv);
-        ASSIGN("glVertexAttribLPointer", vertexAttribLPointer);
-        ASSIGN("glViewportArrayv", viewportArrayv);
-        ASSIGN("glViewportIndexedf", viewportIndexedf);
-        ASSIGN("glViewportIndexedfv", viewportIndexedfv);
-    }
-
-    // 4.2
-    if (isAtLeastGL(gl::Version(4, 2)))
-    {
-        ASSIGN("glBindImageTexture", bindImageTexture);
-        ASSIGN("glDrawArraysInstancedBaseInstance", drawArraysInstancedBaseInstance);
-        ASSIGN("glDrawElementsInstancedBaseInstance", drawElementsInstancedBaseInstance);
-        ASSIGN("glDrawElementsInstancedBaseVertexBaseInstance", drawElementsInstancedBaseVertexBaseInstance);
-        ASSIGN("glDrawTransformFeedbackInstanced", drawTransformFeedbackInstanced);
-        ASSIGN("glDrawTransformFeedbackStreamInstanced", drawTransformFeedbackStreamInstanced);
-        ASSIGN("glGetActiveAtomicCounterBufferiv", getActiveAtomicCounterBufferiv);
-        ASSIGN("glGetInternalformativ", getInternalformativ);
-        ASSIGN("glMemoryBarrier", memoryBarrier);
-        ASSIGN("glTexStorage1D", texStorage1D);
-        ASSIGN("glTexStorage2D", texStorage2D);
-        ASSIGN("glTexStorage3D", texStorage3D);
-    }
-
-    // 4.3
-    if (isAtLeastGL(gl::Version(4, 3)))
-    {
-        ASSIGN("glBindVertexBuffer", bindVertexBuffer);
-        ASSIGN("glClearBufferData", clearBufferData);
-        ASSIGN("glClearBufferSubData", clearBufferSubData);
-        ASSIGN("glCopyImageSubData", copyImageSubData);
-        ASSIGN("glDebugMessageCallback", debugMessageCallback);
-        ASSIGN("glDebugMessageControl", debugMessageControl);
-        ASSIGN("glDebugMessageInsert", debugMessageInsert);
-        ASSIGN("glDispatchCompute", dispatchCompute);
-        ASSIGN("glDispatchComputeIndirect", dispatchComputeIndirect);
-        ASSIGN("glFramebufferParameteri", framebufferParameteri);
-        ASSIGN("glGetDebugMessageLog", getDebugMessageLog);
-        ASSIGN("glGetFramebufferParameteriv", getFramebufferParameteriv);
-        ASSIGN("glGetInternalformati64v", getInternalformati64v);
-        ASSIGN("glGetPointerv", getPointerv);
-        ASSIGN("glGetObjectLabel", getObjectLabel);
-        ASSIGN("glGetObjectPtrLabel", getObjectPtrLabel);
-        ASSIGN("glGetProgramInterfaceiv", getProgramInterfaceiv);
-        ASSIGN("glGetProgramResourceIndex", getProgramResourceIndex);
-        ASSIGN("glGetProgramResourceLocation", getProgramResourceLocation);
-        ASSIGN("glGetProgramResourceLocationIndex", getProgramResourceLocationIndex);
-        ASSIGN("glGetProgramResourceName", getProgramResourceName);
-        ASSIGN("glGetProgramResourceiv", getProgramResourceiv);
-        ASSIGN("glInvalidateBufferData", invalidateBufferData);
-        ASSIGN("glInvalidateBufferSubData", invalidateBufferSubData);
-        ASSIGN("glInvalidateFramebuffer", invalidateFramebuffer);
-        ASSIGN("glInvalidateSubFramebuffer", invalidateSubFramebuffer);
-        ASSIGN("glInvalidateTexImage", invalidateTexImage);
-        ASSIGN("glInvalidateTexSubImage", invalidateTexSubImage);
-        ASSIGN("glMultiDrawArraysIndirect", multiDrawArraysIndirect);
-        ASSIGN("glMultiDrawElementsIndirect", multiDrawElementsIndirect);
-        ASSIGN("glObjectLabel", objectLabel);
-        ASSIGN("glObjectPtrLabel", objectPtrLabel);
-        ASSIGN("glPopDebugGroup", popDebugGroup);
-        ASSIGN("glPushDebugGroup", pushDebugGroup);
-        ASSIGN("glShaderStorageBlockBinding", shaderStorageBlockBinding);
-        ASSIGN("glTexBufferRange", texBufferRange);
-        ASSIGN("glTexStorage2DMultisample", texStorage2DMultisample);
-        ASSIGN("glTexStorage3DMultisample", texStorage3DMultisample);
-        ASSIGN("glTextureView", textureView);
-        ASSIGN("glVertexAttribBinding", vertexAttribBinding);
-        ASSIGN("glVertexAttribFormat", vertexAttribFormat);
-        ASSIGN("glVertexAttribIFormat", vertexAttribIFormat);
-        ASSIGN("glVertexAttribLFormat", vertexAttribLFormat);
-        ASSIGN("glVertexBindingDivisor", vertexBindingDivisor);
-    }
-
-    // 4.4
-    if (isAtLeastGL(gl::Version(4, 4)))
-    {
-        ASSIGN("glBindBuffersBase", bindBuffersBase);
-        ASSIGN("glBindBuffersRange", bindBuffersRange);
-        ASSIGN("glBindImageTextures", bindImageTextures);
-        ASSIGN("glBindSamplers", bindSamplers);
-        ASSIGN("glBindTextures", bindTextures);
-        ASSIGN("glBindVertexBuffers", bindVertexBuffers);
-        ASSIGN("glBufferStorage", bufferStorage);
-        ASSIGN("glClearTexImage", clearTexImage);
-        ASSIGN("glClearTexSubImage", clearTexSubImage);
-    }
-
-    // 4.5
-    if (isAtLeastGL(gl::Version(4, 5)))
-    {
-        ASSIGN("glBindTextureUnit", bindTextureUnit);
-        ASSIGN("glBlitNamedFramebuffer", blitNamedFramebuffer);
-        ASSIGN("glCheckNamedFramebufferStatus", checkNamedFramebufferStatus);
-        ASSIGN("glClearNamedBufferData", clearNamedBufferData);
-        ASSIGN("glClearNamedBufferSubData", clearNamedBufferSubData);
-        ASSIGN("glClearNamedFramebufferfi", clearNamedFramebufferfi);
-        ASSIGN("glClearNamedFramebufferfv", clearNamedFramebufferfv);
-        ASSIGN("glClearNamedFramebufferiv", clearNamedFramebufferiv);
-        ASSIGN("glClearNamedFramebufferuiv", clearNamedFramebufferuiv);
-        ASSIGN("glClipControl", clipControl);
-        ASSIGN("glCompressedTextureSubImage1D", compressedTextureSubImage1D);
-        ASSIGN("glCompressedTextureSubImage2D", compressedTextureSubImage2D);
-        ASSIGN("glCompressedTextureSubImage3D", compressedTextureSubImage3D);
-        ASSIGN("glCopyNamedBufferSubData", copyNamedBufferSubData);
-        ASSIGN("glCopyTextureSubImage1D", copyTextureSubImage1D);
-        ASSIGN("glCopyTextureSubImage2D", copyTextureSubImage2D);
-        ASSIGN("glCopyTextureSubImage3D", copyTextureSubImage3D);
-        ASSIGN("glCreateBuffers", createBuffers);
-        ASSIGN("glCreateFramebuffers", createFramebuffers);
-        ASSIGN("glCreateProgramPipelines", createProgramPipelines);
-        ASSIGN("glCreateQueries", createQueries);
-        ASSIGN("glCreateRenderbuffers", createRenderbuffers);
-        ASSIGN("glCreateSamplers", createSamplers);
-        ASSIGN("glCreateTextures", createTextures);
-        ASSIGN("glCreateTransformFeedbacks", createTransformFeedbacks);
-        ASSIGN("glCreateVertexArrays", createVertexArrays);
-        ASSIGN("glDisableVertexArrayAttrib", disableVertexArrayAttrib);
-        ASSIGN("glEnableVertexArrayAttrib", enableVertexArrayAttrib);
-        ASSIGN("glFlushMappedNamedBufferRange", flushMappedNamedBufferRange);
-        ASSIGN("glGenerateTextureMipmap", generateTextureMipmap);
-        ASSIGN("glGetCompressedTextureImage", getCompressedTextureImage);
-        ASSIGN("glGetCompressedTextureSubImage", getCompressedTextureSubImage);
-        ASSIGN("glGetGraphicsResetStatus", getGraphicsResetStatus);
-        ASSIGN("glGetNamedBufferParameteri64v", getNamedBufferParameteri64v);
-        ASSIGN("glGetNamedBufferParameteriv", getNamedBufferParameteriv);
-        ASSIGN("glGetNamedBufferPointerv", getNamedBufferPointerv);
-        ASSIGN("glGetNamedBufferSubData", getNamedBufferSubData);
-        ASSIGN("glGetNamedFramebufferAttachmentParameteriv", getNamedFramebufferAttachmentParameteriv);
-        ASSIGN("glGetNamedFramebufferParameteriv", getNamedFramebufferParameteriv);
-        ASSIGN("glGetNamedRenderbufferParameteriv", getNamedRenderbufferParameteriv);
-        ASSIGN("glGetQueryBufferObjecti64v", getQueryBufferObjecti64v);
-        ASSIGN("glGetQueryBufferObjectiv", getQueryBufferObjectiv);
-        ASSIGN("glGetQueryBufferObjectui64v", getQueryBufferObjectui64v);
-        ASSIGN("glGetQueryBufferObjectuiv", getQueryBufferObjectuiv);
-        ASSIGN("glGetTextureImage", getTextureImage);
-        ASSIGN("glGetTextureLevelParameterfv", getTextureLevelParameterfv);
-        ASSIGN("glGetTextureLevelParameteriv", getTextureLevelParameteriv);
-        ASSIGN("glGetTextureParameterIiv", getTextureParameterIiv);
-        ASSIGN("glGetTextureParameterIuiv", getTextureParameterIuiv);
-        ASSIGN("glGetTextureParameterfv", getTextureParameterfv);
-        ASSIGN("glGetTextureParameteriv", getTextureParameteriv);
-        ASSIGN("glGetTextureSubImage", getTextureSubImage);
-        ASSIGN("glGetTransformFeedbacki64_v", getTransformFeedbacki64_v);
-        ASSIGN("glGetTransformFeedbacki_v", getTransformFeedbacki_v);
-        ASSIGN("glGetTransformFeedbackiv", getTransformFeedbackiv);
-        ASSIGN("glGetVertexArrayIndexed64iv", getVertexArrayIndexed64iv);
-        ASSIGN("glGetVertexArrayIndexediv", getVertexArrayIndexediv);
-        ASSIGN("glGetVertexArrayiv", getVertexArrayiv);
-        ASSIGN("glGetnCompressedTexImage", getnCompressedTexImage);
-        ASSIGN("glGetnTexImage", getnTexImage);
-        ASSIGN("glGetnUniformdv", getnUniformdv);
-        ASSIGN("glGetnUniformfv", getnUniformfv);
-        ASSIGN("glGetnUniformiv", getnUniformiv);
-        ASSIGN("glGetnUniformuiv", getnUniformuiv);
-        ASSIGN("glInvalidateNamedFramebufferData", invalidateNamedFramebufferData);
-        ASSIGN("glInvalidateNamedFramebufferSubData", invalidateNamedFramebufferSubData);
-        ASSIGN("glMapNamedBuffer", mapNamedBuffer);
-        ASSIGN("glMapNamedBufferRange", mapNamedBufferRange);
-        ASSIGN("glMemoryBarrierByRegion", memoryBarrierByRegion);
-        ASSIGN("glNamedBufferData", namedBufferData);
-        ASSIGN("glNamedBufferStorage", namedBufferStorage);
-        ASSIGN("glNamedBufferSubData", namedBufferSubData);
-        ASSIGN("glNamedFramebufferDrawBuffer", namedFramebufferDrawBuffer);
-        ASSIGN("glNamedFramebufferDrawBuffers", namedFramebufferDrawBuffers);
-        ASSIGN("glNamedFramebufferParameteri", namedFramebufferParameteri);
-        ASSIGN("glNamedFramebufferReadBuffer", namedFramebufferReadBuffer);
-        ASSIGN("glNamedFramebufferRenderbuffer", namedFramebufferRenderbuffer);
-        ASSIGN("glNamedFramebufferTexture", namedFramebufferTexture);
-        ASSIGN("glNamedFramebufferTextureLayer", namedFramebufferTextureLayer);
-        ASSIGN("glNamedRenderbufferStorage", namedRenderbufferStorage);
-        ASSIGN("glNamedRenderbufferStorageMultisample", namedRenderbufferStorageMultisample);
-        ASSIGN("glReadnPixels", readnPixels);
-        ASSIGN("glTextureBarrier", textureBarrier);
-        ASSIGN("glTextureBuffer", textureBuffer);
-        ASSIGN("glTextureBufferRange", textureBufferRange);
-        ASSIGN("glTextureParameterIiv", textureParameterIiv);
-        ASSIGN("glTextureParameterIuiv", textureParameterIuiv);
-        ASSIGN("glTextureParameterf", textureParameterf);
-        ASSIGN("glTextureParameterfv", textureParameterfv);
-        ASSIGN("glTextureParameteri", textureParameteri);
-        ASSIGN("glTextureParameteriv", textureParameteriv);
-        ASSIGN("glTextureStorage1D", textureStorage1D);
-        ASSIGN("glTextureStorage2D", textureStorage2D);
-        ASSIGN("glTextureStorage2DMultisample", textureStorage2DMultisample);
-        ASSIGN("glTextureStorage3D", textureStorage3D);
-        ASSIGN("glTextureStorage3DMultisample", textureStorage3DMultisample);
-        ASSIGN("glTextureSubImage1D", textureSubImage1D);
-        ASSIGN("glTextureSubImage2D", textureSubImage2D);
-        ASSIGN("glTextureSubImage3D", textureSubImage3D);
-        ASSIGN("glTransformFeedbackBufferBase", transformFeedbackBufferBase);
-        ASSIGN("glTransformFeedbackBufferRange", transformFeedbackBufferRange);
-        ASSIGN("glUnmapNamedBuffer", unmapNamedBuffer);
-        ASSIGN("glVertexArrayAttribBinding", vertexArrayAttribBinding);
-        ASSIGN("glVertexArrayAttribFormat", vertexArrayAttribFormat);
-        ASSIGN("glVertexArrayAttribIFormat", vertexArrayAttribIFormat);
-        ASSIGN("glVertexArrayAttribLFormat", vertexArrayAttribLFormat);
-        ASSIGN("glVertexArrayBindingDivisor", vertexArrayBindingDivisor);
-        ASSIGN("glVertexArrayElementBuffer", vertexArrayElementBuffer);
-        ASSIGN("glVertexArrayVertexBuffer", vertexArrayVertexBuffer);
-        ASSIGN("glVertexArrayVertexBuffers", vertexArrayVertexBuffers);
-    }
-
-    // clang-format on
-}
-
-void FunctionsGL::initializeProcsGLES()
-{
-    // No profiles in GLES
-    profile = 0;
-
-    // clang-format off
-
-    // GL_NV_internalformat_sample_query
-    ASSIGN_WITH_EXT("GL_NV_internalformat_sample_query", "glGetInternalformatSampleivNV", getInternalformatSampleivNV);
-
-    // GL_NV_path_rendering
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glMatrixLoadfEXT", matrixLoadEXT);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glGenPathsNV", genPathsNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glDeletePathsNV", delPathsNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glPathCommandsNV", pathCommandsNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glIsPathNV", isPathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glPathParameterfNV", setPathParameterfNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glPathParameteriNV", setPathParameteriNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glGetPathParameterfvNV", getPathParameterfNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glGetPathParameterivNV", getPathParameteriNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glPathStencilFuncNV", pathStencilFuncNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilFillPathNV", stencilFillPathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilStrokePathNV", stencilStrokePathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glCoverFillPathNV", coverFillPathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glCoverStrokePathNV", coverStrokePathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilThenCoverFillPathNV", stencilThenCoverFillPathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilThenCoverStrokePathNV", stencilThenCoverStrokePathNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glCoverFillPathInstancedNV", coverFillPathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glCoverStrokePathInstancedNV", coverStrokePathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilFillPathInstancedNV", stencilFillPathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilStrokePathInstancedNV", stencilStrokePathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilThenCoverFillPathInstancedNV", stencilThenCoverFillPathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glStencilThenCoverStrokePathInstancedNV", stencilThenCoverStrokePathInstancedNV);
-    ASSIGN_WITH_EXT("GL_NV_path_rendering", "glProgramPathFragmentInputGenNV", programPathFragmentInputGenNV);
-
-    // GL_OES_texture_3D
-    ASSIGN_WITH_EXT("GL_OES_texture_3D", "glTexImage3DOES", texImage3D);
-    ASSIGN_WITH_EXT("GL_OES_texture_3D", "glTexSubImage3DOES", texSubImage3D);
-    ASSIGN_WITH_EXT("GL_OES_texture_3D", "glCopyTexSubImage3DOES", copyTexSubImage3D);
-
-    // GL_NV_framebuffer_mixed_samples
-    ASSIGN_WITH_EXT("GL_NV_framebuffer_mixed_samples", "glCoverageModulationNV", coverageModulationNV);
-
-    // GL_NV_fence
-    ASSIGN_WITH_EXT("GL_NV_fence", "glDeleteFencesNV", deleteFencesNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glGenFencesNV", genFencesNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glIsFenceNV", isFenceNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glTestFenceNV", testFenceNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glGetFenceivNV", getFenceivNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glFinishFenceNV", finishFenceNV);
-    ASSIGN_WITH_EXT("GL_NV_fence", "glSetFenceNV", setFenceNV);
-
-    // GL_EXT_texture_storage
-    ASSIGN_WITH_EXT("GL_EXT_texture_storage", "glTexStorage2DEXT", texStorage2D);
-    ASSIGN_WITH_EXT("GL_EXT_texture_storage GL_OES_texture3D", "glTexStorage3DEXT", texStorage3D);
-
-    // GL_OES_vertex_array_object
-    ASSIGN_WITH_EXT("GL_OES_vertex_array_object", "glBindVertexArray", bindVertexArray);
-    ASSIGN_WITH_EXT("GL_OES_vertex_array_object", "glDeleteVertexArrays", deleteVertexArrays);
-    ASSIGN_WITH_EXT("GL_OES_vertex_array_object", "glGenVertexArrays", genVertexArrays);
-    ASSIGN_WITH_EXT("GL_OES_vertex_array_object", "glIsVertexArray", isVertexArray);
-
-    // GL_EXT_map_buffer_range
-    ASSIGN_WITH_EXT("GL_EXT_map_buffer_range", "glMapBufferRangeEXT", mapBufferRange);
-    ASSIGN_WITH_EXT("GL_EXT_map_buffer_range", "glFlushMappedBufferRangeEXT", flushMappedBufferRange);
-    ASSIGN_WITH_EXT("GL_EXT_map_buffer_range", "glUnmapBufferOES", unmapBuffer);
-
-    // GL_OES_mapbuffer
-    ASSIGN_WITH_EXT("GL_OES_mapbuffer", "glMapBufferOES", mapBuffer);
-    ASSIGN_WITH_EXT("GL_OES_mapbuffer", "glUnmapBufferOES", unmapBuffer);
-
-    // GL_KHR_debug
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glDebugMessageControlKHR", debugMessageControl);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glDebugMessageInsertKHR", debugMessageInsert);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glDebugMessageCallbackKHR", debugMessageCallback);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glGetDebugMessageLogKHR", getDebugMessageLog);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glGetPointervKHR", getPointerv);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glPushDebugGroupKHR", pushDebugGroup);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glPopDebugGroupKHR", popDebugGroup);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glObjectLabelKHR", objectLabel);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glGetObjectLabelKHR", getObjectLabel);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glObjectPtrLabelKHR", objectPtrLabel);
-    ASSIGN_WITH_EXT("GL_KHR_debug", "glGetObjectPtrLabelKHR", getObjectPtrLabel);
-
-    // GL_EXT_draw_instanced
-    ASSIGN_WITH_EXT("GL_EXT_draw_instanced", "glVertexAttribDivisorEXT", vertexAttribDivisor);
-    ASSIGN_WITH_EXT("GL_EXT_draw_instanced", "glDrawArraysInstancedEXT", drawArraysInstanced);
-    ASSIGN_WITH_EXT("GL_EXT_draw_instanced", "glDrawElementsInstancedEXT", drawElementsInstanced);
-
-    // GL_EXT_occlusion_query_boolean
-    ASSIGN_WITH_EXT("GL_EXT_occlusion_query_boolean", "glGenQueriesEXT", genQueries);
-    ASSIGN_WITH_EXT("GL_EXT_occlusion_query_boolean", "glDeleteQueriesEXT", deleteQueries);
-    ASSIGN_WITH_EXT("GL_EXT_occlusion_query_boolean", "glIsQueryEXT", isQuery);
-    ASSIGN_WITH_EXT("GL_EXT_occlusion_query_boolean", "glBeginQueryEXT", beginQuery);
-    ASSIGN_WITH_EXT("GL_EXT_occlusion_query_boolean", "glEndQueryEXT", endQuery);
-    ASSIGN_WITH_EXT("GL_EXT_occlusion_query_boolean", "glGetQueryivEXT", getQueryiv);
-    ASSIGN_WITH_EXT("GL_EXT_occlusion_query_boolean", "glGetQueryObjectuivEXT", getQueryObjectuiv);
-
-    // GL_EXT_disjoint_timer_query
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glGenQueriesEXT", genQueries);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glDeleteQueriesEXT", deleteQueries);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glIsQueryEXT", isQuery);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glBeginQueryEXT", beginQuery);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glEndQueryEXT", endQuery);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glQueryCounterEXT", queryCounter);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glGetQueryivEXT", getQueryiv);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glGetQueryObjectivEXT", getQueryObjectiv);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glGetQueryObjectuivEXT", getQueryObjectuiv);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glGetQueryObjecti64vEXT", getQueryObjecti64v);
-    ASSIGN_WITH_EXT("GL_EXT_disjoint_timer_query", "glGetQueryObjectui64vEXT", getQueryObjectui64v);
-
-    // GL_OES_EGL_image
-    ASSIGN_WITH_EXT("GL_OES_EGL_image", "glEGLImageTargetRenderbufferStorageOES", eglImageTargetRenderbufferStorageOES);
-    ASSIGN_WITH_EXT("GL_OES_EGL_image", "glEGLImageTargetTexture2DOES", eglImageTargetTexture2DOES);
-
-    // GL_OES_get_program_binary
-    ASSIGN_WITH_EXT("GL_OES_get_program_binary", "glGetProgramBinaryOES", getProgramBinary);
-    ASSIGN_WITH_EXT("GL_OES_get_program_binary", "glProgramBinaryOES", programBinary);
-
-    // GL_EXT_robustness
-    ASSIGN_WITH_EXT("GL_EXT_robustness", "glGetGraphicsResetStatusEXT", getGraphicsResetStatus);
-
-    // GL_KHR_robustness
-    ASSIGN_WITH_EXT("GL_KHR_robustness", "glGetGraphicsResetStatusKHR", getGraphicsResetStatus);
-
-    // GL_EXT_discard_framebuffer
-    ASSIGN_WITH_EXT("GL_EXT_discard_framebuffer", "glDiscardFramebufferEXT", discardFramebuffer);
-
-    // 2.0
-    if (isAtLeastGLES(gl::Version(2, 0)))
-    {
-        ASSIGN("glActiveTexture", activeTexture);
-        ASSIGN("glAttachShader", attachShader);
-        ASSIGN("glBindAttribLocation", bindAttribLocation);
-        ASSIGN("glBindBuffer", bindBuffer);
-        ASSIGN("glBindFramebuffer", bindFramebuffer);
-        ASSIGN("glBindRenderbuffer", bindRenderbuffer);
-        ASSIGN("glBindTexture", bindTexture);
-        ASSIGN("glBlendColor", blendColor);
-        ASSIGN("glBlendEquation", blendEquation);
-        ASSIGN("glBlendEquationSeparate", blendEquationSeparate);
-        ASSIGN("glBlendFunc", blendFunc);
-        ASSIGN("glBlendFuncSeparate", blendFuncSeparate);
-        ASSIGN("glBufferData", bufferData);
-        ASSIGN("glBufferSubData", bufferSubData);
-        ASSIGN("glCheckFramebufferStatus", checkFramebufferStatus);
-        ASSIGN("glClear", clear);
-        ASSIGN("glClearColor", clearColor);
-        ASSIGN("glClearDepthf", clearDepthf);
-        ASSIGN("glClearStencil", clearStencil);
-        ASSIGN("glColorMask", colorMask);
-        ASSIGN("glCompileShader", compileShader);
-        ASSIGN("glCompressedTexImage2D", compressedTexImage2D);
-        ASSIGN("glCompressedTexSubImage2D", compressedTexSubImage2D);
-        ASSIGN("glCopyTexImage2D", copyTexImage2D);
-        ASSIGN("glCopyTexSubImage2D", copyTexSubImage2D);
-        ASSIGN("glCreateProgram", createProgram);
-        ASSIGN("glCreateShader", createShader);
-        ASSIGN("glCullFace", cullFace);
-        ASSIGN("glDeleteBuffers", deleteBuffers);
-        ASSIGN("glDeleteFramebuffers", deleteFramebuffers);
-        ASSIGN("glDeleteProgram", deleteProgram);
-        ASSIGN("glDeleteRenderbuffers", deleteRenderbuffers);
-        ASSIGN("glDeleteShader", deleteShader);
-        ASSIGN("glDeleteTextures", deleteTextures);
-        ASSIGN("glDepthFunc", depthFunc);
-        ASSIGN("glDepthMask", depthMask);
-        ASSIGN("glDepthRangef", depthRangef);
-        ASSIGN("glDetachShader", detachShader);
-        ASSIGN("glDisable", disable);
-        ASSIGN("glDisableVertexAttribArray", disableVertexAttribArray);
-        ASSIGN("glDrawArrays", drawArrays);
-        ASSIGN("glDrawElements", drawElements);
-        ASSIGN("glEnable", enable);
-        ASSIGN("glEnableVertexAttribArray", enableVertexAttribArray);
-        ASSIGN("glFinish", finish);
-        ASSIGN("glFlush", flush);
-        ASSIGN("glFramebufferRenderbuffer", framebufferRenderbuffer);
-        ASSIGN("glFramebufferTexture2D", framebufferTexture2D);
-        ASSIGN("glFrontFace", frontFace);
-        ASSIGN("glGenBuffers", genBuffers);
-        ASSIGN("glGenerateMipmap", generateMipmap);
-        ASSIGN("glGenFramebuffers", genFramebuffers);
-        ASSIGN("glGenRenderbuffers", genRenderbuffers);
-        ASSIGN("glGenTextures", genTextures);
-        ASSIGN("glGetActiveAttrib", getActiveAttrib);
-        ASSIGN("glGetActiveUniform", getActiveUniform);
-        ASSIGN("glGetAttachedShaders", getAttachedShaders);
-        ASSIGN("glGetAttribLocation", getAttribLocation);
-        ASSIGN("glGetBooleanv", getBooleanv);
-        ASSIGN("glGetBufferParameteriv", getBufferParameteriv);
-        ASSIGN("glGetError", getError);
-        ASSIGN("glGetFloatv", getFloatv);
-        ASSIGN("glGetFramebufferAttachmentParameteriv", getFramebufferAttachmentParameteriv);
-        ASSIGN("glGetIntegerv", getIntegerv);
-        ASSIGN("glGetProgramiv", getProgramiv);
-        ASSIGN("glGetProgramInfoLog", getProgramInfoLog);
-        ASSIGN("glGetRenderbufferParameteriv", getRenderbufferParameteriv);
-        ASSIGN("glGetShaderiv", getShaderiv);
-        ASSIGN("glGetShaderInfoLog", getShaderInfoLog);
-        ASSIGN("glGetShaderPrecisionFormat", getShaderPrecisionFormat);
-        ASSIGN("glGetShaderSource", getShaderSource);
-        ASSIGN("glGetString", getString);
-        ASSIGN("glGetTexParameterfv", getTexParameterfv);
-        ASSIGN("glGetTexParameteriv", getTexParameteriv);
-        ASSIGN("glGetUniformfv", getUniformfv);
-        ASSIGN("glGetUniformiv", getUniformiv);
-        ASSIGN("glGetUniformLocation", getUniformLocation);
-        ASSIGN("glGetVertexAttribfv", getVertexAttribfv);
-        ASSIGN("glGetVertexAttribiv", getVertexAttribiv);
-        ASSIGN("glGetVertexAttribPointerv", getVertexAttribPointerv);
-        ASSIGN("glHint", hint);
-        ASSIGN("glIsBuffer", isBuffer);
-        ASSIGN("glIsEnabled", isEnabled);
-        ASSIGN("glIsFramebuffer", isFramebuffer);
-        ASSIGN("glIsProgram", isProgram);
-        ASSIGN("glIsRenderbuffer", isRenderbuffer);
-        ASSIGN("glIsShader", isShader);
-        ASSIGN("glIsTexture", isTexture);
-        ASSIGN("glLineWidth", lineWidth);
-        ASSIGN("glLinkProgram", linkProgram);
-        ASSIGN("glPixelStorei", pixelStorei);
-        ASSIGN("glPolygonOffset", polygonOffset);
-        ASSIGN("glReadPixels", readPixels);
-        ASSIGN("glReleaseShaderCompiler", releaseShaderCompiler);
-        ASSIGN("glRenderbufferStorage", renderbufferStorage);
-        ASSIGN("glSampleCoverage", sampleCoverage);
-        ASSIGN("glScissor", scissor);
-        ASSIGN("glShaderBinary", shaderBinary);
-        ASSIGN("glShaderSource", shaderSource);
-        ASSIGN("glStencilFunc", stencilFunc);
-        ASSIGN("glStencilFuncSeparate", stencilFuncSeparate);
-        ASSIGN("glStencilMask", stencilMask);
-        ASSIGN("glStencilMaskSeparate", stencilMaskSeparate);
-        ASSIGN("glStencilOp", stencilOp);
-        ASSIGN("glStencilOpSeparate", stencilOpSeparate);
-        ASSIGN("glTexImage2D", texImage2D);
-        ASSIGN("glTexParameterf", texParameterf);
-        ASSIGN("glTexParameterfv", texParameterfv);
-        ASSIGN("glTexParameteri", texParameteri);
-        ASSIGN("glTexParameteriv", texParameteriv);
-        ASSIGN("glTexSubImage2D", texSubImage2D);
-        ASSIGN("glUniform1f", uniform1f);
-        ASSIGN("glUniform1fv", uniform1fv);
-        ASSIGN("glUniform1i", uniform1i);
-        ASSIGN("glUniform1iv", uniform1iv);
-        ASSIGN("glUniform2f", uniform2f);
-        ASSIGN("glUniform2fv", uniform2fv);
-        ASSIGN("glUniform2i", uniform2i);
-        ASSIGN("glUniform2iv", uniform2iv);
-        ASSIGN("glUniform3f", uniform3f);
-        ASSIGN("glUniform3fv", uniform3fv);
-        ASSIGN("glUniform3i", uniform3i);
-        ASSIGN("glUniform3iv", uniform3iv);
-        ASSIGN("glUniform4f", uniform4f);
-        ASSIGN("glUniform4fv", uniform4fv);
-        ASSIGN("glUniform4i", uniform4i);
-        ASSIGN("glUniform4iv", uniform4iv);
-        ASSIGN("glUniformMatrix2fv", uniformMatrix2fv);
-        ASSIGN("glUniformMatrix3fv", uniformMatrix3fv);
-        ASSIGN("glUniformMatrix4fv", uniformMatrix4fv);
-        ASSIGN("glUseProgram", useProgram);
-        ASSIGN("glValidateProgram", validateProgram);
-        ASSIGN("glVertexAttrib1f", vertexAttrib1f);
-        ASSIGN("glVertexAttrib1fv", vertexAttrib1fv);
-        ASSIGN("glVertexAttrib2f", vertexAttrib2f);
-        ASSIGN("glVertexAttrib2fv", vertexAttrib2fv);
-        ASSIGN("glVertexAttrib3f", vertexAttrib3f);
-        ASSIGN("glVertexAttrib3fv", vertexAttrib3fv);
-        ASSIGN("glVertexAttrib4f", vertexAttrib4f);
-        ASSIGN("glVertexAttrib4fv", vertexAttrib4fv);
-        ASSIGN("glVertexAttribPointer", vertexAttribPointer);
-        ASSIGN("glViewport", viewport);
-    }
-
-    // 3.0
-    if (isAtLeastGLES(gl::Version(3, 0)))
-    {
-        ASSIGN("glReadBuffer", readBuffer);
-        ASSIGN("glDrawRangeElements", drawRangeElements);
-        ASSIGN("glTexImage3D", texImage3D);
-        ASSIGN("glTexSubImage3D", texSubImage3D);
-        ASSIGN("glCopyTexSubImage3D", copyTexSubImage3D);
-        ASSIGN("glCompressedTexImage3D", compressedTexImage3D);
-        ASSIGN("glCompressedTexSubImage3D", compressedTexSubImage3D);
-        ASSIGN("glGenQueries", genQueries);
-        ASSIGN("glDeleteQueries", deleteQueries);
-        ASSIGN("glIsQuery", isQuery);
-        ASSIGN("glBeginQuery", beginQuery);
-        ASSIGN("glEndQuery", endQuery);
-        ASSIGN("glGetQueryiv", getQueryiv);
-        ASSIGN("glGetQueryObjectuiv", getQueryObjectuiv);
-        ASSIGN("glUnmapBuffer", unmapBuffer);
-        ASSIGN("glGetBufferPointerv", getBufferPointerv);
-        ASSIGN("glDrawBuffers", drawBuffers);
-        ASSIGN("glUniformMatrix2x3fv", uniformMatrix2x3fv);
-        ASSIGN("glUniformMatrix3x2fv", uniformMatrix3x2fv);
-        ASSIGN("glUniformMatrix2x4fv", uniformMatrix2x4fv);
-        ASSIGN("glUniformMatrix4x2fv", uniformMatrix4x2fv);
-        ASSIGN("glUniformMatrix3x4fv", uniformMatrix3x4fv);
-        ASSIGN("glUniformMatrix4x3fv", uniformMatrix4x3fv);
-        ASSIGN("glBlitFramebuffer", blitFramebuffer);
-        ASSIGN("glRenderbufferStorageMultisample", renderbufferStorageMultisample);
-        ASSIGN("glFramebufferTextureLayer", framebufferTextureLayer);
-        ASSIGN("glMapBufferRange", mapBufferRange);
-        ASSIGN("glFlushMappedBufferRange", flushMappedBufferRange);
-        ASSIGN("glBindVertexArray", bindVertexArray);
-        ASSIGN("glDeleteVertexArrays", deleteVertexArrays);
-        ASSIGN("glGenVertexArrays", genVertexArrays);
-        ASSIGN("glIsVertexArray", isVertexArray);
-        ASSIGN("glGetIntegeri_v", getIntegeri_v);
-        ASSIGN("glBeginTransformFeedback", beginTransformFeedback);
-        ASSIGN("glEndTransformFeedback", endTransformFeedback);
-        ASSIGN("glBindBufferRange", bindBufferRange);
-        ASSIGN("glBindBufferBase", bindBufferBase);
-        ASSIGN("glTransformFeedbackVaryings", transformFeedbackVaryings);
-        ASSIGN("glGetTransformFeedbackVarying", getTransformFeedbackVarying);
-        ASSIGN("glVertexAttribIPointer", vertexAttribIPointer);
-        ASSIGN("glGetVertexAttribIiv", getVertexAttribIiv);
-        ASSIGN("glGetVertexAttribIuiv", getVertexAttribIuiv);
-        ASSIGN("glVertexAttribI4i", vertexAttribI4i);
-        ASSIGN("glVertexAttribI4ui", vertexAttribI4ui);
-        ASSIGN("glVertexAttribI4iv", vertexAttribI4iv);
-        ASSIGN("glVertexAttribI4uiv", vertexAttribI4uiv);
-        ASSIGN("glGetUniformuiv", getUniformuiv);
-        ASSIGN("glGetFragDataLocation", getFragDataLocation);
-        ASSIGN("glUniform1ui", uniform1ui);
-        ASSIGN("glUniform2ui", uniform2ui);
-        ASSIGN("glUniform3ui", uniform3ui);
-        ASSIGN("glUniform4ui", uniform4ui);
-        ASSIGN("glUniform1uiv", uniform1uiv);
-        ASSIGN("glUniform2uiv", uniform2uiv);
-        ASSIGN("glUniform3uiv", uniform3uiv);
-        ASSIGN("glUniform4uiv", uniform4uiv);
-        ASSIGN("glClearBufferiv", clearBufferiv);
-        ASSIGN("glClearBufferuiv", clearBufferuiv);
-        ASSIGN("glClearBufferfv", clearBufferfv);
-        ASSIGN("glClearBufferfi", clearBufferfi);
-        ASSIGN("glGetStringi", getStringi);
-        ASSIGN("glCopyBufferSubData", copyBufferSubData);
-        ASSIGN("glGetUniformIndices", getUniformIndices);
-        ASSIGN("glGetActiveUniformsiv", getActiveUniformsiv);
-        ASSIGN("glGetUniformBlockIndex", getUniformBlockIndex);
-        ASSIGN("glGetActiveUniformBlockiv", getActiveUniformBlockiv);
-        ASSIGN("glGetActiveUniformBlockName", getActiveUniformBlockName);
-        ASSIGN("glUniformBlockBinding", uniformBlockBinding);
-        ASSIGN("glDrawArraysInstanced", drawArraysInstanced);
-        ASSIGN("glDrawElementsInstanced", drawElementsInstanced);
-        ASSIGN("glFenceSync", fenceSync);
-        ASSIGN("glIsSync", isSync);
-        ASSIGN("glDeleteSync", deleteSync);
-        ASSIGN("glClientWaitSync", clientWaitSync);
-        ASSIGN("glWaitSync", waitSync);
-        ASSIGN("glGetInteger64v", getInteger64v);
-        ASSIGN("glGetSynciv", getSynciv);
-        ASSIGN("glGetInteger64i_v", getInteger64i_v);
-        ASSIGN("glGetBufferParameteri64v", getBufferParameteri64v);
-        ASSIGN("glGenSamplers", genSamplers);
-        ASSIGN("glDeleteSamplers", deleteSamplers);
-        ASSIGN("glIsSampler", isSampler);
-        ASSIGN("glBindSampler", bindSampler);
-        ASSIGN("glSamplerParameteri", samplerParameteri);
-        ASSIGN("glSamplerParameteriv", samplerParameteriv);
-        ASSIGN("glSamplerParameterf", samplerParameterf);
-        ASSIGN("glSamplerParameterfv", samplerParameterfv);
-        ASSIGN("glGetSamplerParameteriv", getSamplerParameteriv);
-        ASSIGN("glGetSamplerParameterfv", getSamplerParameterfv);
-        ASSIGN("glVertexAttribDivisor", vertexAttribDivisor);
-        ASSIGN("glBindTransformFeedback", bindTransformFeedback);
-        ASSIGN("glDeleteTransformFeedbacks", deleteTransformFeedbacks);
-        ASSIGN("glGenTransformFeedbacks", genTransformFeedbacks);
-        ASSIGN("glIsTransformFeedback", isTransformFeedback);
-        ASSIGN("glPauseTransformFeedback", pauseTransformFeedback);
-        ASSIGN("glResumeTransformFeedback", resumeTransformFeedback);
-        ASSIGN("glGetProgramBinary", getProgramBinary);
-        ASSIGN("glProgramBinary", programBinary);
-        ASSIGN("glProgramParameteri", programParameteri);
-        ASSIGN("glInvalidateFramebuffer", invalidateFramebuffer);
-        ASSIGN("glInvalidateSubFramebuffer", invalidateSubFramebuffer);
-        ASSIGN("glTexStorage2D", texStorage2D);
-        ASSIGN("glTexStorage3D", texStorage3D);
-        ASSIGN("glGetInternalformativ", getInternalformativ);
-    }
-
-    // 3.1
-    if (isAtLeastGLES(gl::Version(3, 1)))
-    {
-        ASSIGN("glDispatchCompute", dispatchCompute);
-        ASSIGN("glDispatchComputeIndirect", dispatchComputeIndirect);
-        ASSIGN("glDrawArraysIndirect", drawArraysIndirect);
-        ASSIGN("glDrawElementsIndirect", drawElementsIndirect);
-        ASSIGN("glFramebufferParameteri", framebufferParameteri);
-        ASSIGN("glGetFramebufferParameteriv", getFramebufferParameteriv);
-        ASSIGN("glGetProgramInterfaceiv", getProgramInterfaceiv);
-        ASSIGN("glGetProgramResourceIndex", getProgramResourceIndex);
-        ASSIGN("glGetProgramResourceName", getProgramResourceName);
-        ASSIGN("glGetProgramResourceiv", getProgramResourceiv);
-        ASSIGN("glGetProgramResourceLocation", getProgramResourceLocation);
-        ASSIGN("glUseProgramStages", useProgramStages);
-        ASSIGN("glActiveShaderProgram", activeShaderProgram);
-        ASSIGN("glCreateShaderProgramv", createShaderProgramv);
-        ASSIGN("glBindProgramPipeline", bindProgramPipeline);
-        ASSIGN("glDeleteProgramPipelines", deleteProgramPipelines);
-        ASSIGN("glGenProgramPipelines", genProgramPipelines);
-        ASSIGN("glIsProgramPipeline", isProgramPipeline);
-        ASSIGN("glGetProgramPipelineiv", getProgramPipelineiv);
-        ASSIGN("glProgramUniform1i", programUniform1i);
-        ASSIGN("glProgramUniform2i", programUniform2i);
-        ASSIGN("glProgramUniform3i", programUniform3i);
-        ASSIGN("glProgramUniform4i", programUniform4i);
-        ASSIGN("glProgramUniform1ui", programUniform1ui);
-        ASSIGN("glProgramUniform2ui", programUniform2ui);
-        ASSIGN("glProgramUniform3ui", programUniform3ui);
-        ASSIGN("glProgramUniform4ui", programUniform4ui);
-        ASSIGN("glProgramUniform1f", programUniform1f);
-        ASSIGN("glProgramUniform2f", programUniform2f);
-        ASSIGN("glProgramUniform3f", programUniform3f);
-        ASSIGN("glProgramUniform4f", programUniform4f);
-        ASSIGN("glProgramUniform1iv", programUniform1iv);
-        ASSIGN("glProgramUniform2iv", programUniform2iv);
-        ASSIGN("glProgramUniform3iv", programUniform3iv);
-        ASSIGN("glProgramUniform4iv", programUniform4iv);
-        ASSIGN("glProgramUniform1uiv", programUniform1uiv);
-        ASSIGN("glProgramUniform2uiv", programUniform2uiv);
-        ASSIGN("glProgramUniform3uiv", programUniform3uiv);
-        ASSIGN("glProgramUniform4uiv", programUniform4uiv);
-        ASSIGN("glProgramUniform1fv", programUniform1fv);
-        ASSIGN("glProgramUniform2fv", programUniform2fv);
-        ASSIGN("glProgramUniform3fv", programUniform3fv);
-        ASSIGN("glProgramUniform4fv", programUniform4fv);
-        ASSIGN("glProgramUniformMatrix2fv", programUniformMatrix2fv);
-        ASSIGN("glProgramUniformMatrix3fv", programUniformMatrix3fv);
-        ASSIGN("glProgramUniformMatrix4fv", programUniformMatrix4fv);
-        ASSIGN("glProgramUniformMatrix2x3fv", programUniformMatrix2x3fv);
-        ASSIGN("glProgramUniformMatrix3x2fv", programUniformMatrix3x2fv);
-        ASSIGN("glProgramUniformMatrix2x4fv", programUniformMatrix2x4fv);
-        ASSIGN("glProgramUniformMatrix4x2fv", programUniformMatrix4x2fv);
-        ASSIGN("glProgramUniformMatrix3x4fv", programUniformMatrix3x4fv);
-        ASSIGN("glProgramUniformMatrix4x3fv", programUniformMatrix4x3fv);
-        ASSIGN("glValidateProgramPipeline", validateProgramPipeline);
-        ASSIGN("glGetProgramPipelineInfoLog", getProgramPipelineInfoLog);
-        ASSIGN("glBindImageTexture", bindImageTexture);
-        ASSIGN("glGetBooleani_v", getBooleani_v);
-        ASSIGN("glMemoryBarrier", memoryBarrier);
-        ASSIGN("glMemoryBarrierByRegion", memoryBarrierByRegion);
-        ASSIGN("glTexStorage2DMultisample", texStorage2DMultisample);
-        ASSIGN("glGetMultisamplefv", getMultisamplefv);
-        ASSIGN("glSampleMaski", sampleMaski);
-        ASSIGN("glGetTexLevelParameteriv", getTexLevelParameteriv);
-        ASSIGN("glGetTexLevelParameterfv", getTexLevelParameterfv);
-        ASSIGN("glBindVertexBuffer", bindVertexBuffer);
-        ASSIGN("glVertexAttribFormat", vertexAttribFormat);
-        ASSIGN("glVertexAttribIFormat", vertexAttribIFormat);
-        ASSIGN("glVertexAttribBinding", vertexAttribBinding);
-        ASSIGN("glVertexBindingDivisor", vertexBindingDivisor);
-    }
-
-    // 3.2
-    if (isAtLeastGLES(gl::Version(3, 2)))
-    {
-        ASSIGN("glBlendBarrier", blendBarrier);
-        ASSIGN("glCopyImageSubData", copyImageSubData);
-        ASSIGN("glDebugMessageControl", debugMessageControl);
-        ASSIGN("glDebugMessageInsert", debugMessageInsert);
-        ASSIGN("glDebugMessageCallback", debugMessageCallback);
-        ASSIGN("glGetDebugMessageLog", getDebugMessageLog);
-        ASSIGN("glPushDebugGroup", pushDebugGroup);
-        ASSIGN("glPopDebugGroup", popDebugGroup);
-        ASSIGN("glObjectLabel", objectLabel);
-        ASSIGN("glGetObjectLabel", getObjectLabel);
-        ASSIGN("glObjectPtrLabel", objectPtrLabel);
-        ASSIGN("glGetObjectPtrLabel", getObjectPtrLabel);
-        ASSIGN("glGetPointerv", getPointerv);
-        ASSIGN("glEnablei", enablei);
-        ASSIGN("glDisablei", disablei);
-        ASSIGN("glBlendEquationi", blendEquationi);
-        ASSIGN("glBlendEquationSeparatei", blendEquationSeparatei);
-        ASSIGN("glBlendFunci", blendFunci);
-        ASSIGN("glBlendFuncSeparatei", blendFuncSeparatei);
-        ASSIGN("glColorMaski", colorMaski);
-        ASSIGN("glIsEnabledi", isEnabledi);
-        ASSIGN("glDrawElementsBaseVertex", drawElementsBaseVertex);
-        ASSIGN("glDrawRangeElementsBaseVertex", drawRangeElementsBaseVertex);
-        ASSIGN("glDrawElementsInstancedBaseVertex", drawElementsInstancedBaseVertex);
-        ASSIGN("glFramebufferTexture", framebufferTexture);
-        ASSIGN("glPrimitiveBoundingBox", primitiveBoundingBox);
-        ASSIGN("glGetGraphicsResetStatus", getGraphicsResetStatus);
-        ASSIGN("glReadnPixels", readnPixels);
-        ASSIGN("glGetnUniformfv", getnUniformfv);
-        ASSIGN("glGetnUniformiv", getnUniformiv);
-        ASSIGN("glGetnUniformuiv", getnUniformuiv);
-        ASSIGN("glMinSampleShading", minSampleShading);
-        ASSIGN("glPatchParameteri", patchParameteri);
-        ASSIGN("glTexParameterIiv", texParameterIiv);
-        ASSIGN("glTexParameterIuiv", texParameterIuiv);
-        ASSIGN("glGetTexParameterIiv", getTexParameterIiv);
-        ASSIGN("glGetTexParameterIuiv", getTexParameterIuiv);
-        ASSIGN("glSamplerParameterIiv", samplerParameterIiv);
-        ASSIGN("glSamplerParameterIuiv", samplerParameterIuiv);
-        ASSIGN("glGetSamplerParameterIiv", getSamplerParameterIiv);
-        ASSIGN("glGetSamplerParameterIuiv", getSamplerParameterIuiv);
-        ASSIGN("glTexBuffer", texBuffer);
-        ASSIGN("glTexBufferRange", texBufferRange);
-        ASSIGN("glTexStorage3DMultisample", texStorage3DMultisample);
-    }
-
-    // clang-format on
+    initProcsSharedExtensions(extensionSet);
 }
 
 bool FunctionsGL::isAtLeastGL(const gl::Version &glVersion) const
diff --git a/src/libANGLE/renderer/gl/FunctionsGL.h b/src/libANGLE/renderer/gl/FunctionsGL.h
index 03513c2..2307df0 100644
--- a/src/libANGLE/renderer/gl/FunctionsGL.h
+++ b/src/libANGLE/renderer/gl/FunctionsGL.h
@@ -11,6 +11,7 @@
 
 #include "common/debug.h"
 #include "libANGLE/Version.h"
+#include "libANGLE/renderer/gl/DispatchTableGL_autogen.h"
 #include "libANGLE/renderer/gl/functionsgl_enums.h"
 #include "libANGLE/renderer/gl/functionsgl_typedefs.h"
 
@@ -23,7 +24,7 @@
     STANDARD_GL_ES,
 };
 
-class FunctionsGL
+class FunctionsGL : public DispatchTableGL
 {
   public:
     FunctionsGL();
@@ -45,753 +46,8 @@
     bool hasExtension(const std::string &ext) const;
     bool hasGLExtension(const std::string &ext) const;
     bool hasGLESExtension(const std::string &ext) const;
-
-    // Entry Points
-    // 1.0
-    PFNGLBLENDFUNCPROC blendFunc;
-    PFNGLCLEARPROC clear;
-    PFNGLCLEARCOLORPROC clearColor;
-    PFNGLCLEARDEPTHPROC clearDepth;
-    PFNGLCLEARSTENCILPROC clearStencil;
-    PFNGLCOLORMASKPROC colorMask;
-    PFNGLCULLFACEPROC cullFace;
-    PFNGLDEPTHFUNCPROC depthFunc;
-    PFNGLDEPTHMASKPROC depthMask;
-    PFNGLDEPTHRANGEPROC depthRange;
-    PFNGLDISABLEPROC disable;
-    PFNGLDRAWBUFFERPROC drawBuffer;
-    PFNGLENABLEPROC enable;
-    PFNGLFINISHPROC finish;
-    PFNGLFLUSHPROC flush;
-    PFNGLFRONTFACEPROC frontFace;
-    PFNGLGETBOOLEANVPROC getBooleanv;
-    PFNGLGETDOUBLEVPROC getDoublev;
-    PFNGLGETERRORPROC getError;
-    PFNGLGETFLOATVPROC getFloatv;
-    PFNGLGETINTEGERVPROC getIntegerv;
-    PFNGLGETSTRINGPROC getString;
-    PFNGLGETTEXIMAGEPROC getTexImage;
-    PFNGLGETTEXLEVELPARAMETERFVPROC getTexLevelParameterfv;
-    PFNGLGETTEXLEVELPARAMETERIVPROC getTexLevelParameteriv;
-    PFNGLGETTEXPARAMETERFVPROC getTexParameterfv;
-    PFNGLGETTEXPARAMETERIVPROC getTexParameteriv;
-    PFNGLHINTPROC hint;
-    PFNGLISENABLEDPROC isEnabled;
-    PFNGLLINEWIDTHPROC lineWidth;
-    PFNGLLOGICOPPROC logicOp;
-    PFNGLPIXELSTOREFPROC pixelStoref;
-    PFNGLPIXELSTOREIPROC pixelStorei;
-    PFNGLPOINTSIZEPROC pointSize;
-    PFNGLPOLYGONMODEPROC polygonMode;
-    PFNGLREADBUFFERPROC readBuffer;
-    PFNGLREADPIXELSPROC readPixels;
-    PFNGLSCISSORPROC scissor;
-    PFNGLSTENCILFUNCPROC stencilFunc;
-    PFNGLSTENCILMASKPROC stencilMask;
-    PFNGLSTENCILOPPROC stencilOp;
-    PFNGLTEXIMAGE1DPROC texImage1D;
-    PFNGLTEXIMAGE2DPROC texImage2D;
-    PFNGLTEXPARAMETERFPROC texParameterf;
-    PFNGLTEXPARAMETERFVPROC texParameterfv;
-    PFNGLTEXPARAMETERIPROC texParameteri;
-    PFNGLTEXPARAMETERIVPROC texParameteriv;
-    PFNGLVIEWPORTPROC viewport;
-
-    // 1.1
-    PFNGLBINDTEXTUREPROC bindTexture;
-    PFNGLCOPYTEXIMAGE1DPROC copyTexImage1D;
-    PFNGLCOPYTEXIMAGE2DPROC copyTexImage2D;
-    PFNGLCOPYTEXSUBIMAGE1DPROC copyTexSubImage1D;
-    PFNGLCOPYTEXSUBIMAGE2DPROC copyTexSubImage2D;
-    PFNGLDELETETEXTURESPROC deleteTextures;
-    PFNGLDRAWARRAYSPROC drawArrays;
-    PFNGLDRAWELEMENTSPROC drawElements;
-    PFNGLGENTEXTURESPROC genTextures;
-    PFNGLISTEXTUREPROC isTexture;
-    PFNGLPOLYGONOFFSETPROC polygonOffset;
-    PFNGLTEXSUBIMAGE1DPROC texSubImage1D;
-    PFNGLTEXSUBIMAGE2DPROC texSubImage2D;
-
-    // 1.2
-    PFNGLBLENDCOLORPROC blendColor;
-    PFNGLBLENDEQUATIONPROC blendEquation;
-    PFNGLCOPYTEXSUBIMAGE3DPROC copyTexSubImage3D;
-    PFNGLDRAWRANGEELEMENTSPROC drawRangeElements;
-    PFNGLTEXIMAGE3DPROC texImage3D;
-    PFNGLTEXSUBIMAGE3DPROC texSubImage3D;
-
-    // 1.2 Extensions
-    PFNGLDELETEFENCESNVPROC deleteFencesNV;
-    PFNGLGENFENCESNVPROC genFencesNV;
-    PFNGLISFENCENVPROC isFenceNV;
-    PFNGLTESTFENCENVPROC testFenceNV;
-    PFNGLGETFENCEIVNVPROC getFenceivNV;
-    PFNGLFINISHFENCENVPROC finishFenceNV;
-    PFNGLSETFENCENVPROC setFenceNV;
-
-    // 1.3
-    PFNGLACTIVETEXTUREPROC activeTexture;
-    PFNGLCOMPRESSEDTEXIMAGE1DPROC compressedTexImage1D;
-    PFNGLCOMPRESSEDTEXIMAGE2DPROC compressedTexImage2D;
-    PFNGLCOMPRESSEDTEXIMAGE3DPROC compressedTexImage3D;
-    PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC compressedTexSubImage1D;
-    PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC compressedTexSubImage2D;
-    PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC compressedTexSubImage3D;
-    PFNGLGETCOMPRESSEDTEXIMAGEPROC getCompressedTexImage;
-    PFNGLSAMPLECOVERAGEPROC sampleCoverage;
-
-    // 1.4
-    PFNGLBLENDFUNCSEPARATEPROC blendFuncSeparate;
-    PFNGLMULTIDRAWARRAYSPROC multiDrawArrays;
-    PFNGLMULTIDRAWELEMENTSPROC multiDrawElements;
-    PFNGLPOINTPARAMETERFPROC pointParameterf;
-    PFNGLPOINTPARAMETERFVPROC pointParameterfv;
-    PFNGLPOINTPARAMETERIPROC pointParameteri;
-    PFNGLPOINTPARAMETERIVPROC pointParameteriv;
-
-    // 1.5
-    PFNGLBEGINQUERYPROC beginQuery;
-    PFNGLBINDBUFFERPROC bindBuffer;
-    PFNGLBUFFERDATAPROC bufferData;
-    PFNGLBUFFERSUBDATAPROC bufferSubData;
-    PFNGLDELETEBUFFERSPROC deleteBuffers;
-    PFNGLDELETEQUERIESPROC deleteQueries;
-    PFNGLENDQUERYPROC endQuery;
-    PFNGLGENBUFFERSPROC genBuffers;
-    PFNGLGENQUERIESPROC genQueries;
-    PFNGLGETBUFFERPARAMETERIVPROC getBufferParameteriv;
-    PFNGLGETBUFFERPOINTERVPROC getBufferPointerv;
-    PFNGLGETBUFFERSUBDATAPROC getBufferSubData;
-    PFNGLGETQUERYOBJECTIVPROC getQueryObjectiv;
-    PFNGLGETQUERYOBJECTUIVPROC getQueryObjectuiv;
-    PFNGLGETQUERYIVPROC getQueryiv;
-    PFNGLISBUFFERPROC isBuffer;
-    PFNGLISQUERYPROC isQuery;
-    PFNGLMAPBUFFERPROC mapBuffer;
-    PFNGLUNMAPBUFFERPROC unmapBuffer;
-
-    // 2.0
-    PFNGLATTACHSHADERPROC attachShader;
-    PFNGLBINDATTRIBLOCATIONPROC bindAttribLocation;
-    PFNGLBLENDEQUATIONSEPARATEPROC blendEquationSeparate;
-    PFNGLCOMPILESHADERPROC compileShader;
-    PFNGLCREATEPROGRAMPROC createProgram;
-    PFNGLCREATESHADERPROC createShader;
-    PFNGLDELETEPROGRAMPROC deleteProgram;
-    PFNGLDELETESHADERPROC deleteShader;
-    PFNGLDETACHSHADERPROC detachShader;
-    PFNGLDISABLEVERTEXATTRIBARRAYPROC disableVertexAttribArray;
-    PFNGLDRAWBUFFERSPROC drawBuffers;
-    PFNGLENABLEVERTEXATTRIBARRAYPROC enableVertexAttribArray;
-    PFNGLGETACTIVEATTRIBPROC getActiveAttrib;
-    PFNGLGETACTIVEUNIFORMPROC getActiveUniform;
-    PFNGLGETATTACHEDSHADERSPROC getAttachedShaders;
-    PFNGLGETATTRIBLOCATIONPROC getAttribLocation;
-    PFNGLGETPROGRAMINFOLOGPROC getProgramInfoLog;
-    PFNGLGETPROGRAMIVPROC getProgramiv;
-    PFNGLGETSHADERINFOLOGPROC getShaderInfoLog;
-    PFNGLGETSHADERSOURCEPROC getShaderSource;
-    PFNGLGETSHADERIVPROC getShaderiv;
-    PFNGLGETUNIFORMLOCATIONPROC getUniformLocation;
-    PFNGLGETUNIFORMFVPROC getUniformfv;
-    PFNGLGETUNIFORMIVPROC getUniformiv;
-    PFNGLGETVERTEXATTRIBPOINTERVPROC getVertexAttribPointerv;
-    PFNGLGETVERTEXATTRIBDVPROC getVertexAttribdv;
-    PFNGLGETVERTEXATTRIBFVPROC getVertexAttribfv;
-    PFNGLGETVERTEXATTRIBIVPROC getVertexAttribiv;
-    PFNGLISPROGRAMPROC isProgram;
-    PFNGLISSHADERPROC isShader;
-    PFNGLLINKPROGRAMPROC linkProgram;
-    PFNGLSHADERSOURCEPROC shaderSource;
-    PFNGLSTENCILFUNCSEPARATEPROC stencilFuncSeparate;
-    PFNGLSTENCILMASKSEPARATEPROC stencilMaskSeparate;
-    PFNGLSTENCILOPSEPARATEPROC stencilOpSeparate;
-    PFNGLUNIFORM1FPROC uniform1f;
-    PFNGLUNIFORM1FVPROC uniform1fv;
-    PFNGLUNIFORM1IPROC uniform1i;
-    PFNGLUNIFORM1IVPROC uniform1iv;
-    PFNGLUNIFORM2FPROC uniform2f;
-    PFNGLUNIFORM2FVPROC uniform2fv;
-    PFNGLUNIFORM2IPROC uniform2i;
-    PFNGLUNIFORM2IVPROC uniform2iv;
-    PFNGLUNIFORM3FPROC uniform3f;
-    PFNGLUNIFORM3FVPROC uniform3fv;
-    PFNGLUNIFORM3IPROC uniform3i;
-    PFNGLUNIFORM3IVPROC uniform3iv;
-    PFNGLUNIFORM4FPROC uniform4f;
-    PFNGLUNIFORM4FVPROC uniform4fv;
-    PFNGLUNIFORM4IPROC uniform4i;
-    PFNGLUNIFORM4IVPROC uniform4iv;
-    PFNGLUNIFORMMATRIX2FVPROC uniformMatrix2fv;
-    PFNGLUNIFORMMATRIX3FVPROC uniformMatrix3fv;
-    PFNGLUNIFORMMATRIX4FVPROC uniformMatrix4fv;
-    PFNGLUSEPROGRAMPROC useProgram;
-    PFNGLVALIDATEPROGRAMPROC validateProgram;
-    PFNGLVERTEXATTRIB1DPROC vertexAttrib1d;
-    PFNGLVERTEXATTRIB1DVPROC vertexAttrib1dv;
-    PFNGLVERTEXATTRIB1FPROC vertexAttrib1f;
-    PFNGLVERTEXATTRIB1FVPROC vertexAttrib1fv;
-    PFNGLVERTEXATTRIB1SPROC vertexAttrib1s;
-    PFNGLVERTEXATTRIB1SVPROC vertexAttrib1sv;
-    PFNGLVERTEXATTRIB2DPROC vertexAttrib2d;
-    PFNGLVERTEXATTRIB2DVPROC vertexAttrib2dv;
-    PFNGLVERTEXATTRIB2FPROC vertexAttrib2f;
-    PFNGLVERTEXATTRIB2FVPROC vertexAttrib2fv;
-    PFNGLVERTEXATTRIB2SPROC vertexAttrib2s;
-    PFNGLVERTEXATTRIB2SVPROC vertexAttrib2sv;
-    PFNGLVERTEXATTRIB3DPROC vertexAttrib3d;
-    PFNGLVERTEXATTRIB3DVPROC vertexAttrib3dv;
-    PFNGLVERTEXATTRIB3FPROC vertexAttrib3f;
-    PFNGLVERTEXATTRIB3FVPROC vertexAttrib3fv;
-    PFNGLVERTEXATTRIB3SPROC vertexAttrib3s;
-    PFNGLVERTEXATTRIB3SVPROC vertexAttrib3sv;
-    PFNGLVERTEXATTRIB4NBVPROC vertexAttrib4Nbv;
-    PFNGLVERTEXATTRIB4NIVPROC vertexAttrib4Niv;
-    PFNGLVERTEXATTRIB4NSVPROC vertexAttrib4Nsv;
-    PFNGLVERTEXATTRIB4NUBPROC vertexAttrib4Nub;
-    PFNGLVERTEXATTRIB4NUBVPROC vertexAttrib4Nubv;
-    PFNGLVERTEXATTRIB4NUIVPROC vertexAttrib4Nuiv;
-    PFNGLVERTEXATTRIB4NUSVPROC vertexAttrib4Nusv;
-    PFNGLVERTEXATTRIB4BVPROC vertexAttrib4bv;
-    PFNGLVERTEXATTRIB4DPROC vertexAttrib4d;
-    PFNGLVERTEXATTRIB4DVPROC vertexAttrib4dv;
-    PFNGLVERTEXATTRIB4FPROC vertexAttrib4f;
-    PFNGLVERTEXATTRIB4FVPROC vertexAttrib4fv;
-    PFNGLVERTEXATTRIB4IVPROC vertexAttrib4iv;
-    PFNGLVERTEXATTRIB4SPROC vertexAttrib4s;
-    PFNGLVERTEXATTRIB4SVPROC vertexAttrib4sv;
-    PFNGLVERTEXATTRIB4UBVPROC vertexAttrib4ubv;
-    PFNGLVERTEXATTRIB4UIVPROC vertexAttrib4uiv;
-    PFNGLVERTEXATTRIB4USVPROC vertexAttrib4usv;
-    PFNGLVERTEXATTRIBPOINTERPROC vertexAttribPointer;
-
-    // 2.1
-    PFNGLUNIFORMMATRIX2X3FVPROC uniformMatrix2x3fv;
-    PFNGLUNIFORMMATRIX2X4FVPROC uniformMatrix2x4fv;
-    PFNGLUNIFORMMATRIX3X2FVPROC uniformMatrix3x2fv;
-    PFNGLUNIFORMMATRIX3X4FVPROC uniformMatrix3x4fv;
-    PFNGLUNIFORMMATRIX4X2FVPROC uniformMatrix4x2fv;
-    PFNGLUNIFORMMATRIX4X3FVPROC uniformMatrix4x3fv;
-
-    // 3.0
-    PFNGLBEGINCONDITIONALRENDERPROC beginConditionalRender;
-    PFNGLBEGINTRANSFORMFEEDBACKPROC beginTransformFeedback;
-    PFNGLBINDBUFFERBASEPROC bindBufferBase;
-    PFNGLBINDBUFFERRANGEPROC bindBufferRange;
-    PFNGLBINDFRAGDATALOCATIONPROC bindFragDataLocation;
-    PFNGLBINDFRAMEBUFFERPROC bindFramebuffer;
-    PFNGLBINDRENDERBUFFERPROC bindRenderbuffer;
-    PFNGLBINDVERTEXARRAYPROC bindVertexArray;
-    PFNGLBLITFRAMEBUFFERPROC blitFramebuffer;
-    PFNGLCHECKFRAMEBUFFERSTATUSPROC checkFramebufferStatus;
-    PFNGLCLAMPCOLORPROC clampColor;
-    PFNGLCLEARBUFFERFIPROC clearBufferfi;
-    PFNGLCLEARBUFFERFVPROC clearBufferfv;
-    PFNGLCLEARBUFFERIVPROC clearBufferiv;
-    PFNGLCLEARBUFFERUIVPROC clearBufferuiv;
-    PFNGLCOLORMASKIPROC colorMaski;
-    PFNGLDELETEFRAMEBUFFERSPROC deleteFramebuffers;
-    PFNGLDELETERENDERBUFFERSPROC deleteRenderbuffers;
-    PFNGLDELETEVERTEXARRAYSPROC deleteVertexArrays;
-    PFNGLDISABLEIPROC disablei;
-    PFNGLENABLEIPROC enablei;
-    PFNGLENDCONDITIONALRENDERPROC endConditionalRender;
-    PFNGLENDTRANSFORMFEEDBACKPROC endTransformFeedback;
-    PFNGLFLUSHMAPPEDBUFFERRANGEPROC flushMappedBufferRange;
-    PFNGLFRAMEBUFFERRENDERBUFFERPROC framebufferRenderbuffer;
-    PFNGLFRAMEBUFFERTEXTURE1DPROC framebufferTexture1D;
-    PFNGLFRAMEBUFFERTEXTURE2DPROC framebufferTexture2D;
-    PFNGLFRAMEBUFFERTEXTURE3DPROC framebufferTexture3D;
-    PFNGLFRAMEBUFFERTEXTURELAYERPROC framebufferTextureLayer;
-    PFNGLGENFRAMEBUFFERSPROC genFramebuffers;
-    PFNGLGENRENDERBUFFERSPROC genRenderbuffers;
-    PFNGLGENVERTEXARRAYSPROC genVertexArrays;
-    PFNGLGENERATEMIPMAPPROC generateMipmap;
-    PFNGLGETBOOLEANI_VPROC getBooleani_v;
-    PFNGLGETFRAGDATALOCATIONPROC getFragDataLocation;
-    PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC getFramebufferAttachmentParameteriv;
-    PFNGLGETINTEGERI_VPROC getIntegeri_v;
-    PFNGLGETRENDERBUFFERPARAMETERIVPROC getRenderbufferParameteriv;
-    PFNGLGETSTRINGIPROC getStringi;
-    PFNGLGETTEXPARAMETERIIVPROC getTexParameterIiv;
-    PFNGLGETTEXPARAMETERIUIVPROC getTexParameterIuiv;
-    PFNGLGETTRANSFORMFEEDBACKVARYINGPROC getTransformFeedbackVarying;
-    PFNGLGETUNIFORMUIVPROC getUniformuiv;
-    PFNGLGETVERTEXATTRIBIIVPROC getVertexAttribIiv;
-    PFNGLGETVERTEXATTRIBIUIVPROC getVertexAttribIuiv;
-    PFNGLISENABLEDIPROC isEnabledi;
-    PFNGLISFRAMEBUFFERPROC isFramebuffer;
-    PFNGLISRENDERBUFFERPROC isRenderbuffer;
-    PFNGLISVERTEXARRAYPROC isVertexArray;
-    PFNGLMAPBUFFERRANGEPROC mapBufferRange;
-    PFNGLRENDERBUFFERSTORAGEPROC renderbufferStorage;
-    PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC renderbufferStorageMultisample;
-    PFNGLTEXPARAMETERIIVPROC texParameterIiv;
-    PFNGLTEXPARAMETERIUIVPROC texParameterIuiv;
-    PFNGLTRANSFORMFEEDBACKVARYINGSPROC transformFeedbackVaryings;
-    PFNGLUNIFORM1UIPROC uniform1ui;
-    PFNGLUNIFORM1UIVPROC uniform1uiv;
-    PFNGLUNIFORM2UIPROC uniform2ui;
-    PFNGLUNIFORM2UIVPROC uniform2uiv;
-    PFNGLUNIFORM3UIPROC uniform3ui;
-    PFNGLUNIFORM3UIVPROC uniform3uiv;
-    PFNGLUNIFORM4UIPROC uniform4ui;
-    PFNGLUNIFORM4UIVPROC uniform4uiv;
-    PFNGLVERTEXATTRIBI1IPROC vertexAttribI1i;
-    PFNGLVERTEXATTRIBI1IVPROC vertexAttribI1iv;
-    PFNGLVERTEXATTRIBI1UIPROC vertexAttribI1ui;
-    PFNGLVERTEXATTRIBI1UIVPROC vertexAttribI1uiv;
-    PFNGLVERTEXATTRIBI2IPROC vertexAttribI2i;
-    PFNGLVERTEXATTRIBI2IVPROC vertexAttribI2iv;
-    PFNGLVERTEXATTRIBI2UIPROC vertexAttribI2ui;
-    PFNGLVERTEXATTRIBI2UIVPROC vertexAttribI2uiv;
-    PFNGLVERTEXATTRIBI3IPROC vertexAttribI3i;
-    PFNGLVERTEXATTRIBI3IVPROC vertexAttribI3iv;
-    PFNGLVERTEXATTRIBI3UIPROC vertexAttribI3ui;
-    PFNGLVERTEXATTRIBI3UIVPROC vertexAttribI3uiv;
-    PFNGLVERTEXATTRIBI4BVPROC vertexAttribI4bv;
-    PFNGLVERTEXATTRIBI4IPROC vertexAttribI4i;
-    PFNGLVERTEXATTRIBI4IVPROC vertexAttribI4iv;
-    PFNGLVERTEXATTRIBI4SVPROC vertexAttribI4sv;
-    PFNGLVERTEXATTRIBI4UBVPROC vertexAttribI4ubv;
-    PFNGLVERTEXATTRIBI4UIPROC vertexAttribI4ui;
-    PFNGLVERTEXATTRIBI4UIVPROC vertexAttribI4uiv;
-    PFNGLVERTEXATTRIBI4USVPROC vertexAttribI4usv;
-    PFNGLVERTEXATTRIBIPOINTERPROC vertexAttribIPointer;
-
-    // 3.1
-    PFNGLCOPYBUFFERSUBDATAPROC copyBufferSubData;
-    PFNGLDRAWARRAYSINSTANCEDPROC drawArraysInstanced;
-    PFNGLDRAWELEMENTSINSTANCEDPROC drawElementsInstanced;
-    PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC getActiveUniformBlockName;
-    PFNGLGETACTIVEUNIFORMBLOCKIVPROC getActiveUniformBlockiv;
-    PFNGLGETACTIVEUNIFORMNAMEPROC getActiveUniformName;
-    PFNGLGETACTIVEUNIFORMSIVPROC getActiveUniformsiv;
-    PFNGLGETUNIFORMBLOCKINDEXPROC getUniformBlockIndex;
-    PFNGLGETUNIFORMINDICESPROC getUniformIndices;
-    PFNGLPRIMITIVERESTARTINDEXPROC primitiveRestartIndex;
-    PFNGLTEXBUFFERPROC texBuffer;
-    PFNGLUNIFORMBLOCKBINDINGPROC uniformBlockBinding;
-
-    // 3.2
-    PFNGLCLIENTWAITSYNCPROC clientWaitSync;
-    PFNGLDELETESYNCPROC deleteSync;
-    PFNGLDRAWELEMENTSBASEVERTEXPROC drawElementsBaseVertex;
-    PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC drawElementsInstancedBaseVertex;
-    PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC drawRangeElementsBaseVertex;
-    PFNGLFENCESYNCPROC fenceSync;
-    PFNGLFRAMEBUFFERTEXTUREPROC framebufferTexture;
-    PFNGLGETBUFFERPARAMETERI64VPROC getBufferParameteri64v;
-    PFNGLGETINTEGER64I_VPROC getInteger64i_v;
-    PFNGLGETINTEGER64VPROC getInteger64v;
-    PFNGLGETMULTISAMPLEFVPROC getMultisamplefv;
-    PFNGLGETSYNCIVPROC getSynciv;
-    PFNGLISSYNCPROC isSync;
-    PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC multiDrawElementsBaseVertex;
-    PFNGLPROVOKINGVERTEXPROC provokingVertex;
-    PFNGLSAMPLEMASKIPROC sampleMaski;
-    PFNGLTEXIMAGE2DMULTISAMPLEPROC texImage2DMultisample;
-    PFNGLTEXIMAGE3DMULTISAMPLEPROC texImage3DMultisample;
-    PFNGLWAITSYNCPROC waitSync;
-
-    // NV_path_rendering (originally written against 3.2 compatibility profile)
-    PFNGLMATRIXLOADFEXTPROC matrixLoadEXT;
-    PFNGLGENPATHSNVPROC genPathsNV;
-    PFNGLDELETEPATHSNVPROC delPathsNV;
-    PFNGLPATHCOMMANDSNVPROC pathCommandsNV;
-    PFNGLISPATHNVPROC isPathNV;
-    PFNGLPATHPARAMETERFNVPROC setPathParameterfNV;
-    PFNGLPATHPARAMETERINVPROC setPathParameteriNV;
-    PFNGLGETPATHPARAMETERFVNVPROC getPathParameterfNV;
-    PFNGLGETPATHPARAMETERIVNVPROC getPathParameteriNV;
-    PFNGLPATHSTENCILFUNCNVPROC pathStencilFuncNV;
-    PFNGLSTENCILFILLPATHNVPROC stencilFillPathNV;
-    PFNGLSTENCILSTROKEPATHNVPROC stencilStrokePathNV;
-    PFNGLCOVERFILLPATHNVPROC coverFillPathNV;
-    PFNGLCOVERSTROKEPATHNVPROC coverStrokePathNV;
-    PFNGLSTENCILTHENCOVERFILLPATHNVPROC stencilThenCoverFillPathNV;
-    PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC stencilThenCoverStrokePathNV;
-    PFNGLCOVERFILLPATHINSTANCEDNVPROC coverFillPathInstancedNV;
-    PFNGLCOVERSTROKEPATHINSTANCEDNVPROC coverStrokePathInstancedNV;
-    PFNGLSTENCILFILLPATHINSTANCEDNVPROC stencilFillPathInstancedNV;
-    PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC stencilStrokePathInstancedNV;
-    PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC stencilThenCoverFillPathInstancedNV;
-    PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC stencilThenCoverStrokePathInstancedNV;
-    PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC programPathFragmentInputGenNV;
-
-    // 3.3
-    PFNGLBINDFRAGDATALOCATIONINDEXEDPROC bindFragDataLocationIndexed;
-    PFNGLBINDSAMPLERPROC bindSampler;
-    PFNGLDELETESAMPLERSPROC deleteSamplers;
-    PFNGLGENSAMPLERSPROC genSamplers;
-    PFNGLGETFRAGDATAINDEXPROC getFragDataIndex;
-    PFNGLGETQUERYOBJECTI64VPROC getQueryObjecti64v;
-    PFNGLGETQUERYOBJECTUI64VPROC getQueryObjectui64v;
-    PFNGLGETSAMPLERPARAMETERIIVPROC getSamplerParameterIiv;
-    PFNGLGETSAMPLERPARAMETERIUIVPROC getSamplerParameterIuiv;
-    PFNGLGETSAMPLERPARAMETERFVPROC getSamplerParameterfv;
-    PFNGLGETSAMPLERPARAMETERIVPROC getSamplerParameteriv;
-    PFNGLISSAMPLERPROC isSampler;
-    PFNGLQUERYCOUNTERPROC queryCounter;
-    PFNGLSAMPLERPARAMETERIIVPROC samplerParameterIiv;
-    PFNGLSAMPLERPARAMETERIUIVPROC samplerParameterIuiv;
-    PFNGLSAMPLERPARAMETERFPROC samplerParameterf;
-    PFNGLSAMPLERPARAMETERFVPROC samplerParameterfv;
-    PFNGLSAMPLERPARAMETERIPROC samplerParameteri;
-    PFNGLSAMPLERPARAMETERIVPROC samplerParameteriv;
-    PFNGLVERTEXATTRIBDIVISORPROC vertexAttribDivisor;
-    PFNGLVERTEXATTRIBP1UIPROC vertexAttribP1ui;
-    PFNGLVERTEXATTRIBP1UIVPROC vertexAttribP1uiv;
-    PFNGLVERTEXATTRIBP2UIPROC vertexAttribP2ui;
-    PFNGLVERTEXATTRIBP2UIVPROC vertexAttribP2uiv;
-    PFNGLVERTEXATTRIBP3UIPROC vertexAttribP3ui;
-    PFNGLVERTEXATTRIBP3UIVPROC vertexAttribP3uiv;
-    PFNGLVERTEXATTRIBP4UIPROC vertexAttribP4ui;
-    PFNGLVERTEXATTRIBP4UIVPROC vertexAttribP4uiv;
-
-    // 4.0
-    PFNGLBEGINQUERYINDEXEDPROC beginQueryIndexed;
-    PFNGLBINDTRANSFORMFEEDBACKPROC bindTransformFeedback;
-    PFNGLBLENDEQUATIONSEPARATEIPROC blendEquationSeparatei;
-    PFNGLBLENDEQUATIONIPROC blendEquationi;
-    PFNGLBLENDFUNCSEPARATEIPROC blendFuncSeparatei;
-    PFNGLBLENDFUNCIPROC blendFunci;
-    PFNGLDELETETRANSFORMFEEDBACKSPROC deleteTransformFeedbacks;
-    PFNGLDRAWARRAYSINDIRECTPROC drawArraysIndirect;
-    PFNGLDRAWELEMENTSINDIRECTPROC drawElementsIndirect;
-    PFNGLDRAWTRANSFORMFEEDBACKPROC drawTransformFeedback;
-    PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC drawTransformFeedbackStream;
-    PFNGLENDQUERYINDEXEDPROC endQueryIndexed;
-    PFNGLGENTRANSFORMFEEDBACKSPROC genTransformFeedbacks;
-    PFNGLGETACTIVESUBROUTINENAMEPROC getActiveSubroutineName;
-    PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC getActiveSubroutineUniformName;
-    PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC getActiveSubroutineUniformiv;
-    PFNGLGETPROGRAMSTAGEIVPROC getProgramStageiv;
-    PFNGLGETQUERYINDEXEDIVPROC getQueryIndexediv;
-    PFNGLGETSUBROUTINEINDEXPROC getSubroutineIndex;
-    PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC getSubroutineUniformLocation;
-    PFNGLGETUNIFORMSUBROUTINEUIVPROC getUniformSubroutineuiv;
-    PFNGLGETUNIFORMDVPROC getUniformdv;
-    PFNGLISTRANSFORMFEEDBACKPROC isTransformFeedback;
-    PFNGLMINSAMPLESHADINGPROC minSampleShading;
-    PFNGLPATCHPARAMETERFVPROC patchParameterfv;
-    PFNGLPATCHPARAMETERIPROC patchParameteri;
-    PFNGLPAUSETRANSFORMFEEDBACKPROC pauseTransformFeedback;
-    PFNGLRESUMETRANSFORMFEEDBACKPROC resumeTransformFeedback;
-    PFNGLUNIFORM1DPROC uniform1d;
-    PFNGLUNIFORM1DVPROC uniform1dv;
-    PFNGLUNIFORM2DPROC uniform2d;
-    PFNGLUNIFORM2DVPROC uniform2dv;
-    PFNGLUNIFORM3DPROC uniform3d;
-    PFNGLUNIFORM3DVPROC uniform3dv;
-    PFNGLUNIFORM4DPROC uniform4d;
-    PFNGLUNIFORM4DVPROC uniform4dv;
-    PFNGLUNIFORMMATRIX2DVPROC uniformMatrix2dv;
-    PFNGLUNIFORMMATRIX2X3DVPROC uniformMatrix2x3dv;
-    PFNGLUNIFORMMATRIX2X4DVPROC uniformMatrix2x4dv;
-    PFNGLUNIFORMMATRIX3DVPROC uniformMatrix3dv;
-    PFNGLUNIFORMMATRIX3X2DVPROC uniformMatrix3x2dv;
-    PFNGLUNIFORMMATRIX3X4DVPROC uniformMatrix3x4dv;
-    PFNGLUNIFORMMATRIX4DVPROC uniformMatrix4dv;
-    PFNGLUNIFORMMATRIX4X2DVPROC uniformMatrix4x2dv;
-    PFNGLUNIFORMMATRIX4X3DVPROC uniformMatrix4x3dv;
-    PFNGLUNIFORMSUBROUTINESUIVPROC uniformSubroutinesuiv;
-
-    // 4.1
-    PFNGLACTIVESHADERPROGRAMPROC activeShaderProgram;
-    PFNGLBINDPROGRAMPIPELINEPROC bindProgramPipeline;
-    PFNGLCLEARDEPTHFPROC clearDepthf;
-    PFNGLCREATESHADERPROGRAMVPROC createShaderProgramv;
-    PFNGLDELETEPROGRAMPIPELINESPROC deleteProgramPipelines;
-    PFNGLDEPTHRANGEARRAYVPROC depthRangeArrayv;
-    PFNGLDEPTHRANGEINDEXEDPROC depthRangeIndexed;
-    PFNGLDEPTHRANGEFPROC depthRangef;
-    PFNGLGENPROGRAMPIPELINESPROC genProgramPipelines;
-    PFNGLGETDOUBLEI_VPROC getDoublei_v;
-    PFNGLGETFLOATI_VPROC getFloati_v;
-    PFNGLGETPROGRAMBINARYPROC getProgramBinary;
-    PFNGLGETPROGRAMPIPELINEINFOLOGPROC getProgramPipelineInfoLog;
-    PFNGLGETPROGRAMPIPELINEIVPROC getProgramPipelineiv;
-    PFNGLGETSHADERPRECISIONFORMATPROC getShaderPrecisionFormat;
-    PFNGLGETVERTEXATTRIBLDVPROC getVertexAttribLdv;
-    PFNGLISPROGRAMPIPELINEPROC isProgramPipeline;
-    PFNGLPROGRAMBINARYPROC programBinary;
-    PFNGLPROGRAMPARAMETERIPROC programParameteri;
-    PFNGLPROGRAMUNIFORM1DPROC programUniform1d;
-    PFNGLPROGRAMUNIFORM1DVPROC programUniform1dv;
-    PFNGLPROGRAMUNIFORM1FPROC programUniform1f;
-    PFNGLPROGRAMUNIFORM1FVPROC programUniform1fv;
-    PFNGLPROGRAMUNIFORM1IPROC programUniform1i;
-    PFNGLPROGRAMUNIFORM1IVPROC programUniform1iv;
-    PFNGLPROGRAMUNIFORM1UIPROC programUniform1ui;
-    PFNGLPROGRAMUNIFORM1UIVPROC programUniform1uiv;
-    PFNGLPROGRAMUNIFORM2DPROC programUniform2d;
-    PFNGLPROGRAMUNIFORM2DVPROC programUniform2dv;
-    PFNGLPROGRAMUNIFORM2FPROC programUniform2f;
-    PFNGLPROGRAMUNIFORM2FVPROC programUniform2fv;
-    PFNGLPROGRAMUNIFORM2IPROC programUniform2i;
-    PFNGLPROGRAMUNIFORM2IVPROC programUniform2iv;
-    PFNGLPROGRAMUNIFORM2UIPROC programUniform2ui;
-    PFNGLPROGRAMUNIFORM2UIVPROC programUniform2uiv;
-    PFNGLPROGRAMUNIFORM3DPROC programUniform3d;
-    PFNGLPROGRAMUNIFORM3DVPROC programUniform3dv;
-    PFNGLPROGRAMUNIFORM3FPROC programUniform3f;
-    PFNGLPROGRAMUNIFORM3FVPROC programUniform3fv;
-    PFNGLPROGRAMUNIFORM3IPROC programUniform3i;
-    PFNGLPROGRAMUNIFORM3IVPROC programUniform3iv;
-    PFNGLPROGRAMUNIFORM3UIPROC programUniform3ui;
-    PFNGLPROGRAMUNIFORM3UIVPROC programUniform3uiv;
-    PFNGLPROGRAMUNIFORM4DPROC programUniform4d;
-    PFNGLPROGRAMUNIFORM4DVPROC programUniform4dv;
-    PFNGLPROGRAMUNIFORM4FPROC programUniform4f;
-    PFNGLPROGRAMUNIFORM4FVPROC programUniform4fv;
-    PFNGLPROGRAMUNIFORM4IPROC programUniform4i;
-    PFNGLPROGRAMUNIFORM4IVPROC programUniform4iv;
-    PFNGLPROGRAMUNIFORM4UIPROC programUniform4ui;
-    PFNGLPROGRAMUNIFORM4UIVPROC programUniform4uiv;
-    PFNGLPROGRAMUNIFORMMATRIX2DVPROC programUniformMatrix2dv;
-    PFNGLPROGRAMUNIFORMMATRIX2FVPROC programUniformMatrix2fv;
-    PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC programUniformMatrix2x3dv;
-    PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC programUniformMatrix2x3fv;
-    PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC programUniformMatrix2x4dv;
-    PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC programUniformMatrix2x4fv;
-    PFNGLPROGRAMUNIFORMMATRIX3DVPROC programUniformMatrix3dv;
-    PFNGLPROGRAMUNIFORMMATRIX3FVPROC programUniformMatrix3fv;
-    PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC programUniformMatrix3x2dv;
-    PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC programUniformMatrix3x2fv;
-    PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC programUniformMatrix3x4dv;
-    PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC programUniformMatrix3x4fv;
-    PFNGLPROGRAMUNIFORMMATRIX4DVPROC programUniformMatrix4dv;
-    PFNGLPROGRAMUNIFORMMATRIX4FVPROC programUniformMatrix4fv;
-    PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC programUniformMatrix4x2dv;
-    PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC programUniformMatrix4x2fv;
-    PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC programUniformMatrix4x3dv;
-    PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC programUniformMatrix4x3fv;
-    PFNGLRELEASESHADERCOMPILERPROC releaseShaderCompiler;
-    PFNGLSCISSORARRAYVPROC scissorArrayv;
-    PFNGLSCISSORINDEXEDPROC scissorIndexed;
-    PFNGLSCISSORINDEXEDVPROC scissorIndexedv;
-    PFNGLSHADERBINARYPROC shaderBinary;
-    PFNGLUSEPROGRAMSTAGESPROC useProgramStages;
-    PFNGLVALIDATEPROGRAMPIPELINEPROC validateProgramPipeline;
-    PFNGLVERTEXATTRIBL1DPROC vertexAttribL1d;
-    PFNGLVERTEXATTRIBL1DVPROC vertexAttribL1dv;
-    PFNGLVERTEXATTRIBL2DPROC vertexAttribL2d;
-    PFNGLVERTEXATTRIBL2DVPROC vertexAttribL2dv;
-    PFNGLVERTEXATTRIBL3DPROC vertexAttribL3d;
-    PFNGLVERTEXATTRIBL3DVPROC vertexAttribL3dv;
-    PFNGLVERTEXATTRIBL4DPROC vertexAttribL4d;
-    PFNGLVERTEXATTRIBL4DVPROC vertexAttribL4dv;
-    PFNGLVERTEXATTRIBLPOINTERPROC vertexAttribLPointer;
-    PFNGLVIEWPORTARRAYVPROC viewportArrayv;
-    PFNGLVIEWPORTINDEXEDFPROC viewportIndexedf;
-    PFNGLVIEWPORTINDEXEDFVPROC viewportIndexedfv;
-
-    // 4.2
-    PFNGLBINDIMAGETEXTUREPROC bindImageTexture;
-    PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC drawArraysInstancedBaseInstance;
-    PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC drawElementsInstancedBaseInstance;
-    PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC drawElementsInstancedBaseVertexBaseInstance;
-    PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC drawTransformFeedbackInstanced;
-    PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC drawTransformFeedbackStreamInstanced;
-    PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC getActiveAtomicCounterBufferiv;
-    PFNGLGETINTERNALFORMATIVPROC getInternalformativ;
-    PFNGLMEMORYBARRIERPROC memoryBarrier;
-    PFNGLTEXSTORAGE1DPROC texStorage1D;
-    PFNGLTEXSTORAGE2DPROC texStorage2D;
-    PFNGLTEXSTORAGE3DPROC texStorage3D;
-
-    // 4.3
-    PFNGLBINDVERTEXBUFFERPROC bindVertexBuffer;
-    PFNGLCLEARBUFFERDATAPROC clearBufferData;
-    PFNGLCLEARBUFFERSUBDATAPROC clearBufferSubData;
-    PFNGLCOPYIMAGESUBDATAPROC copyImageSubData;
-    PFNGLDEBUGMESSAGECALLBACKPROC debugMessageCallback;
-    PFNGLDEBUGMESSAGECONTROLPROC debugMessageControl;
-    PFNGLDEBUGMESSAGEINSERTPROC debugMessageInsert;
-    PFNGLDISPATCHCOMPUTEPROC dispatchCompute;
-    PFNGLDISPATCHCOMPUTEINDIRECTPROC dispatchComputeIndirect;
-    PFNGLFRAMEBUFFERPARAMETERIPROC framebufferParameteri;
-    PFNGLGETDEBUGMESSAGELOGPROC getDebugMessageLog;
-    PFNGLGETFRAMEBUFFERPARAMETERIVPROC getFramebufferParameteriv;
-    PFNGLGETINTERNALFORMATI64VPROC getInternalformati64v;
-    PFNGLGETPOINTERVPROC getPointerv;
-    PFNGLGETOBJECTLABELPROC getObjectLabel;
-    PFNGLGETOBJECTPTRLABELPROC getObjectPtrLabel;
-    PFNGLGETPROGRAMINTERFACEIVPROC getProgramInterfaceiv;
-    PFNGLGETPROGRAMRESOURCEINDEXPROC getProgramResourceIndex;
-    PFNGLGETPROGRAMRESOURCELOCATIONPROC getProgramResourceLocation;
-    PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC getProgramResourceLocationIndex;
-    PFNGLGETPROGRAMRESOURCENAMEPROC getProgramResourceName;
-    PFNGLGETPROGRAMRESOURCEIVPROC getProgramResourceiv;
-    PFNGLINVALIDATEBUFFERDATAPROC invalidateBufferData;
-    PFNGLINVALIDATEBUFFERSUBDATAPROC invalidateBufferSubData;
-    PFNGLINVALIDATEFRAMEBUFFERPROC invalidateFramebuffer;
-    PFNGLINVALIDATESUBFRAMEBUFFERPROC invalidateSubFramebuffer;
-    PFNGLINVALIDATETEXIMAGEPROC invalidateTexImage;
-    PFNGLINVALIDATETEXSUBIMAGEPROC invalidateTexSubImage;
-    PFNGLMULTIDRAWARRAYSINDIRECTPROC multiDrawArraysIndirect;
-    PFNGLMULTIDRAWELEMENTSINDIRECTPROC multiDrawElementsIndirect;
-    PFNGLOBJECTLABELPROC objectLabel;
-    PFNGLOBJECTPTRLABELPROC objectPtrLabel;
-    PFNGLPOPDEBUGGROUPPROC popDebugGroup;
-    PFNGLPUSHDEBUGGROUPPROC pushDebugGroup;
-    PFNGLSHADERSTORAGEBLOCKBINDINGPROC shaderStorageBlockBinding;
-    PFNGLTEXBUFFERRANGEPROC texBufferRange;
-    PFNGLTEXSTORAGE2DMULTISAMPLEPROC texStorage2DMultisample;
-    PFNGLTEXSTORAGE3DMULTISAMPLEPROC texStorage3DMultisample;
-    PFNGLTEXTUREVIEWPROC textureView;
-    PFNGLVERTEXATTRIBBINDINGPROC vertexAttribBinding;
-    PFNGLVERTEXATTRIBFORMATPROC vertexAttribFormat;
-    PFNGLVERTEXATTRIBIFORMATPROC vertexAttribIFormat;
-    PFNGLVERTEXATTRIBLFORMATPROC vertexAttribLFormat;
-    PFNGLVERTEXBINDINGDIVISORPROC vertexBindingDivisor;
-    PFNGLCOVERAGEMODULATIONNVPROC coverageModulationNV;
-
-    // 4.4
-    PFNGLBINDBUFFERSBASEPROC bindBuffersBase;
-    PFNGLBINDBUFFERSRANGEPROC bindBuffersRange;
-    PFNGLBINDIMAGETEXTURESPROC bindImageTextures;
-    PFNGLBINDSAMPLERSPROC bindSamplers;
-    PFNGLBINDTEXTURESPROC bindTextures;
-    PFNGLBINDVERTEXBUFFERSPROC bindVertexBuffers;
-    PFNGLBUFFERSTORAGEPROC bufferStorage;
-    PFNGLCLEARTEXIMAGEPROC clearTexImage;
-    PFNGLCLEARTEXSUBIMAGEPROC clearTexSubImage;
-
-    // 4.5
-    PFNGLBINDTEXTUREUNITPROC bindTextureUnit;
-    PFNGLBLITNAMEDFRAMEBUFFERPROC blitNamedFramebuffer;
-    PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC checkNamedFramebufferStatus;
-    PFNGLCLEARNAMEDBUFFERDATAPROC clearNamedBufferData;
-    PFNGLCLEARNAMEDBUFFERSUBDATAPROC clearNamedBufferSubData;
-    PFNGLCLEARNAMEDFRAMEBUFFERFIPROC clearNamedFramebufferfi;
-    PFNGLCLEARNAMEDFRAMEBUFFERFVPROC clearNamedFramebufferfv;
-    PFNGLCLEARNAMEDFRAMEBUFFERIVPROC clearNamedFramebufferiv;
-    PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC clearNamedFramebufferuiv;
-    PFNGLCLIPCONTROLPROC clipControl;
-    PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC compressedTextureSubImage1D;
-    PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC compressedTextureSubImage2D;
-    PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC compressedTextureSubImage3D;
-    PFNGLCOPYNAMEDBUFFERSUBDATAPROC copyNamedBufferSubData;
-    PFNGLCOPYTEXTURESUBIMAGE1DPROC copyTextureSubImage1D;
-    PFNGLCOPYTEXTURESUBIMAGE2DPROC copyTextureSubImage2D;
-    PFNGLCOPYTEXTURESUBIMAGE3DPROC copyTextureSubImage3D;
-    PFNGLCREATEBUFFERSPROC createBuffers;
-    PFNGLCREATEFRAMEBUFFERSPROC createFramebuffers;
-    PFNGLCREATEPROGRAMPIPELINESPROC createProgramPipelines;
-    PFNGLCREATEQUERIESPROC createQueries;
-    PFNGLCREATERENDERBUFFERSPROC createRenderbuffers;
-    PFNGLCREATESAMPLERSPROC createSamplers;
-    PFNGLCREATETEXTURESPROC createTextures;
-    PFNGLCREATETRANSFORMFEEDBACKSPROC createTransformFeedbacks;
-    PFNGLCREATEVERTEXARRAYSPROC createVertexArrays;
-    PFNGLDISABLEVERTEXARRAYATTRIBPROC disableVertexArrayAttrib;
-    PFNGLENABLEVERTEXARRAYATTRIBPROC enableVertexArrayAttrib;
-    PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC flushMappedNamedBufferRange;
-    PFNGLGENERATETEXTUREMIPMAPPROC generateTextureMipmap;
-    PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC getCompressedTextureImage;
-    PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC getCompressedTextureSubImage;
-    PFNGLGETGRAPHICSRESETSTATUSPROC getGraphicsResetStatus;
-    PFNGLGETNAMEDBUFFERPARAMETERI64VPROC getNamedBufferParameteri64v;
-    PFNGLGETNAMEDBUFFERPARAMETERIVPROC getNamedBufferParameteriv;
-    PFNGLGETNAMEDBUFFERPOINTERVPROC getNamedBufferPointerv;
-    PFNGLGETNAMEDBUFFERSUBDATAPROC getNamedBufferSubData;
-    PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC getNamedFramebufferAttachmentParameteriv;
-    PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC getNamedFramebufferParameteriv;
-    PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC getNamedRenderbufferParameteriv;
-    PFNGLGETQUERYBUFFEROBJECTI64VPROC getQueryBufferObjecti64v;
-    PFNGLGETQUERYBUFFEROBJECTIVPROC getQueryBufferObjectiv;
-    PFNGLGETQUERYBUFFEROBJECTUI64VPROC getQueryBufferObjectui64v;
-    PFNGLGETQUERYBUFFEROBJECTUIVPROC getQueryBufferObjectuiv;
-    PFNGLGETTEXTUREIMAGEPROC getTextureImage;
-    PFNGLGETTEXTURELEVELPARAMETERFVPROC getTextureLevelParameterfv;
-    PFNGLGETTEXTURELEVELPARAMETERIVPROC getTextureLevelParameteriv;
-    PFNGLGETTEXTUREPARAMETERIIVPROC getTextureParameterIiv;
-    PFNGLGETTEXTUREPARAMETERIUIVPROC getTextureParameterIuiv;
-    PFNGLGETTEXTUREPARAMETERFVPROC getTextureParameterfv;
-    PFNGLGETTEXTUREPARAMETERIVPROC getTextureParameteriv;
-    PFNGLGETTEXTURESUBIMAGEPROC getTextureSubImage;
-    PFNGLGETTRANSFORMFEEDBACKI64_VPROC getTransformFeedbacki64_v;
-    PFNGLGETTRANSFORMFEEDBACKI_VPROC getTransformFeedbacki_v;
-    PFNGLGETTRANSFORMFEEDBACKIVPROC getTransformFeedbackiv;
-    PFNGLGETVERTEXARRAYINDEXED64IVPROC getVertexArrayIndexed64iv;
-    PFNGLGETVERTEXARRAYINDEXEDIVPROC getVertexArrayIndexediv;
-    PFNGLGETVERTEXARRAYIVPROC getVertexArrayiv;
-    PFNGLGETNCOMPRESSEDTEXIMAGEPROC getnCompressedTexImage;
-    PFNGLGETNTEXIMAGEPROC getnTexImage;
-    PFNGLGETNUNIFORMDVPROC getnUniformdv;
-    PFNGLGETNUNIFORMFVPROC getnUniformfv;
-    PFNGLGETNUNIFORMIVPROC getnUniformiv;
-    PFNGLGETNUNIFORMUIVPROC getnUniformuiv;
-    PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC invalidateNamedFramebufferData;
-    PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC invalidateNamedFramebufferSubData;
-    PFNGLMAPNAMEDBUFFERPROC mapNamedBuffer;
-    PFNGLMAPNAMEDBUFFERRANGEPROC mapNamedBufferRange;
-    PFNGLMEMORYBARRIERBYREGIONPROC memoryBarrierByRegion;
-    PFNGLNAMEDBUFFERDATAPROC namedBufferData;
-    PFNGLNAMEDBUFFERSTORAGEPROC namedBufferStorage;
-    PFNGLNAMEDBUFFERSUBDATAPROC namedBufferSubData;
-    PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC namedFramebufferDrawBuffer;
-    PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC namedFramebufferDrawBuffers;
-    PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC namedFramebufferParameteri;
-    PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC namedFramebufferReadBuffer;
-    PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC namedFramebufferRenderbuffer;
-    PFNGLNAMEDFRAMEBUFFERTEXTUREPROC namedFramebufferTexture;
-    PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC namedFramebufferTextureLayer;
-    PFNGLNAMEDRENDERBUFFERSTORAGEPROC namedRenderbufferStorage;
-    PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC namedRenderbufferStorageMultisample;
-    PFNGLREADNPIXELSPROC readnPixels;
-    PFNGLTEXTUREBARRIERPROC textureBarrier;
-    PFNGLTEXTUREBUFFERPROC textureBuffer;
-    PFNGLTEXTUREBUFFERRANGEPROC textureBufferRange;
-    PFNGLTEXTUREPARAMETERIIVPROC textureParameterIiv;
-    PFNGLTEXTUREPARAMETERIUIVPROC textureParameterIuiv;
-    PFNGLTEXTUREPARAMETERFPROC textureParameterf;
-    PFNGLTEXTUREPARAMETERFVPROC textureParameterfv;
-    PFNGLTEXTUREPARAMETERIPROC textureParameteri;
-    PFNGLTEXTUREPARAMETERIVPROC textureParameteriv;
-    PFNGLTEXTURESTORAGE1DPROC textureStorage1D;
-    PFNGLTEXTURESTORAGE2DPROC textureStorage2D;
-    PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC textureStorage2DMultisample;
-    PFNGLTEXTURESTORAGE3DPROC textureStorage3D;
-    PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC textureStorage3DMultisample;
-    PFNGLTEXTURESUBIMAGE1DPROC textureSubImage1D;
-    PFNGLTEXTURESUBIMAGE2DPROC textureSubImage2D;
-    PFNGLTEXTURESUBIMAGE3DPROC textureSubImage3D;
-    PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC transformFeedbackBufferBase;
-    PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC transformFeedbackBufferRange;
-    PFNGLUNMAPNAMEDBUFFERPROC unmapNamedBuffer;
-    PFNGLVERTEXARRAYATTRIBBINDINGPROC vertexArrayAttribBinding;
-    PFNGLVERTEXARRAYATTRIBFORMATPROC vertexArrayAttribFormat;
-    PFNGLVERTEXARRAYATTRIBIFORMATPROC vertexArrayAttribIFormat;
-    PFNGLVERTEXARRAYATTRIBLFORMATPROC vertexArrayAttribLFormat;
-    PFNGLVERTEXARRAYBINDINGDIVISORPROC vertexArrayBindingDivisor;
-    PFNGLVERTEXARRAYELEMENTBUFFERPROC vertexArrayElementBuffer;
-    PFNGLVERTEXARRAYVERTEXBUFFERPROC vertexArrayVertexBuffer;
-    PFNGLVERTEXARRAYVERTEXBUFFERSPROC vertexArrayVertexBuffers;
-
-    // ES 3.2
-    PFNGLBLENDBARRIERPROC blendBarrier;
-    PFNGLPRIMITIVEBOUNDINGBOXPROC primitiveBoundingBox;
-
-    // GL_OES_EGL_image
-    PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC eglImageTargetRenderbufferStorageOES;
-    PFNGLEGLIMAGETARGETTEXTURE2DOESPROC eglImageTargetTexture2DOES;
-
-    // GL_EXT_discard_framebuffer
-    PFNGLDISCARDFRAMEBUFFEREXTPROC discardFramebuffer;
-
-    // GL_NV_internalformat_sample_query
-    PFNGLGETINTERNALFORMATSAMPLEIVNVPROC getInternalformatSampleivNV;
-
-  private:
-    void initializeProcsDesktopGL();
-    void initializeProcsGLES();
-
-    virtual void *loadProcAddress(const std::string &function) = 0;
 };
 
-}
+}  // namespace rx
 
 #endif // LIBANGLE_RENDERER_GL_FUNCTIONSGL_H_
diff --git a/src/libANGLE/renderer/gl/PathGL.cpp b/src/libANGLE/renderer/gl/PathGL.cpp
index 5348674..0891d1b 100644
--- a/src/libANGLE/renderer/gl/PathGL.cpp
+++ b/src/libANGLE/renderer/gl/PathGL.cpp
@@ -32,7 +32,7 @@
 
 void PathGL::setPathParameter(GLenum pname, GLfloat value)
 {
-    mFunctions->setPathParameterfNV(mPathID, pname, value);
+    mFunctions->pathParameterfNV(mPathID, pname, value);
 }
 
 }  // rx
diff --git a/src/libANGLE/renderer/gl/StateManagerGL.cpp b/src/libANGLE/renderer/gl/StateManagerGL.cpp
index 1f9d468..e007060 100644
--- a/src/libANGLE/renderer/gl/StateManagerGL.cpp
+++ b/src/libANGLE/renderer/gl/StateManagerGL.cpp
@@ -2162,7 +2162,7 @@
     if (memcmp(mPathMatrixMV, m, sizeof(mPathMatrixMV)) != 0)
     {
         memcpy(mPathMatrixMV, m, sizeof(mPathMatrixMV));
-        mFunctions->matrixLoadEXT(GL_PATH_MODELVIEW_CHROMIUM, m);
+        mFunctions->matrixLoadfEXT(GL_PATH_MODELVIEW_CHROMIUM, m);
 
         mLocalDirtyBits.set(gl::State::DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
     }
@@ -2173,7 +2173,7 @@
     if (memcmp(mPathMatrixProj, m, sizeof(mPathMatrixProj)) != 0)
     {
         memcpy(mPathMatrixProj, m, sizeof(mPathMatrixProj));
-        mFunctions->matrixLoadEXT(GL_PATH_PROJECTION_CHROMIUM, m);
+        mFunctions->matrixLoadfEXT(GL_PATH_PROJECTION_CHROMIUM, m);
 
         mLocalDirtyBits.set(gl::State::DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
     }
diff --git a/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm b/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
index f94f813..9ac4f32 100644
--- a/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
+++ b/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
@@ -36,7 +36,7 @@
     ~FunctionsGLCGL() override { dlclose(mDylibHandle); }
 
   private:
-    void *loadProcAddress(const std::string &function) override
+    void *loadProcAddress(const std::string &function) const override
     {
         return dlsym(mDylibHandle, function.c_str());
     }
diff --git a/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp b/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
index 20fffc7..ec301fa 100644
--- a/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
@@ -200,7 +200,7 @@
     ~FunctionsGLEGL() override {}
 
   private:
-    void *loadProcAddress(const std::string &function) override
+    void *loadProcAddress(const std::string &function) const override
     {
         return mEGL.getProcAddress(function.c_str());
     }
diff --git a/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp b/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
index f8f5c02..8cc62cd 100644
--- a/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
+++ b/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
@@ -218,7 +218,7 @@
 
     gl->genRenderbuffers(1, &mColorBuffer);
     sm->bindRenderbuffer(GL_RENDERBUFFER, mColorBuffer);
-    gl->eglImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mImage);
+    gl->eGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mImage);
 
     sm->bindFramebuffer(GL_FRAMEBUFFER, mGLFB);
     gl->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER,
@@ -263,7 +263,7 @@
 
 void DisplayOzone::Buffer::bindTexImage()
 {
-    mDisplay->mFunctionsGL->eglImageTargetTexture2DOES(GL_TEXTURE_2D, mImage);
+    mDisplay->mFunctionsGL->eGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage);
 }
 
 GLuint DisplayOzone::Buffer::getTexture()
@@ -280,7 +280,7 @@
     gl->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     gl->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     ASSERT(mImage != EGL_NO_IMAGE_KHR);
-    gl->eglImageTargetTexture2DOES(GL_TEXTURE_2D, mImage);
+    gl->eGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage);
     return mTexture;
 }
 
diff --git a/src/libANGLE/renderer/gl/functionsgl_typedefs.h b/src/libANGLE/renderer/gl/functionsgl_typedefs.h
index daf7ff7..0329cac 100644
--- a/src/libANGLE/renderer/gl/functionsgl_typedefs.h
+++ b/src/libANGLE/renderer/gl/functionsgl_typedefs.h
@@ -753,6 +753,143 @@
 typedef void (INTERNAL_GL_APIENTRY *PFNGLVERTEXARRAYVERTEXBUFFERPROC)(GLuint, GLuint, GLuint, GLintptr, GLsizei);
 typedef void (INTERNAL_GL_APIENTRY *PFNGLVERTEXARRAYVERTEXBUFFERSPROC)(GLuint, GLuint, GLsizei, const GLuint *, const GLintptr *, const GLsizei *);
 
+// GL_EXT_discard_framebuffer
+typedef void(INTERNAL_GL_APIENTRY *PFNGLDISCARDFRAMEBUFFEREXTPROC)(GLenum target,
+                                                                   GLsizei numAttachments,
+                                                                   const GLenum *attachments);
+
+// GL_OES_EGL_image
+typedef void *GLeglImageOES;
+typedef void(INTERNAL_GL_APIENTRY *PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)(GLenum target,
+                                                                        GLeglImageOES image);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC)(
+    GLenum target,
+    GLeglImageOES image);
+
+// NV_path_rendering (originally written against 3.2 compatibility profile)
+typedef void(INTERNAL_GL_APIENTRY *PFNGLMATRIXLOADFEXTPROC)(GLenum matrixMode, const GLfloat *m);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLMATRIXLOADFNVPROC)(GLenum matrixMode, const GLfloat *m);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLMATRIXLOADIDENTITYNVPROC)(GLenum matrixMode);
+typedef GLuint(INTERNAL_GL_APIENTRY *PFNGLGENPATHSNVPROC)(GLsizei range);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLDELETEPATHSNVPROC)(GLuint path, GLsizei range);
+typedef GLboolean(INTERNAL_GL_APIENTRY *PFNGLISPATHNVPROC)(GLuint path);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLPATHCOMMANDSNVPROC)(GLuint path,
+                                                            GLsizei numCommands,
+                                                            const GLubyte *commands,
+                                                            GLsizei numCoords,
+                                                            GLenum coordType,
+                                                            const void *coords);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLPATHPARAMETERINVPROC)(GLuint path,
+                                                              GLenum pname,
+                                                              GLint value);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLPATHPARAMETERFNVPROC)(GLuint path,
+                                                              GLenum pname,
+                                                              GLfloat value);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLGETPATHPARAMETERIVNVPROC)(GLuint path,
+                                                                  GLenum pname,
+                                                                  GLint *value);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLGETPATHPARAMETERFVNVPROC)(GLuint path,
+                                                                  GLenum pname,
+                                                                  GLfloat *value);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLPATHSTENCILFUNCNVPROC)(GLenum func, GLint ref, GLuint mask);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLSTENCILFILLPATHNVPROC)(GLuint path,
+                                                               GLenum fillMode,
+                                                               GLuint mask);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLSTENCILSTROKEPATHNVPROC)(GLuint path,
+                                                                 GLint reference,
+                                                                 GLuint mask);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLCOVERFILLPATHNVPROC)(GLuint path, GLenum coverMode);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLCOVERSTROKEPATHNVPROC)(GLuint path, GLenum coverMode);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLSTENCILTHENCOVERFILLPATHNVPROC)(GLuint path,
+                                                                        GLenum fillMode,
+                                                                        GLuint mask,
+                                                                        GLenum coverMode);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)(GLuint path,
+                                                                          GLint reference,
+                                                                          GLuint mask,
+                                                                          GLenum coverMode);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLCOVERFILLPATHINSTANCEDNVPROC)(
+    GLsizei numPaths,
+    GLenum pathNameType,
+    const void *paths,
+    GLuint pathBase,
+    GLenum coverMode,
+    GLenum transformType,
+    const GLfloat *transformValues);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)(
+    GLsizei numPaths,
+    GLenum pathNameType,
+    const void *paths,
+    GLuint pathBase,
+    GLenum coverMode,
+    GLenum transformType,
+    const GLfloat *transformValues);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLSTENCILFILLPATHINSTANCEDNVPROC)(
+    GLsizei numPaths,
+    GLenum pathNameType,
+    const void *paths,
+    GLuint pathBase,
+    GLenum fillMode,
+    GLuint mask,
+    GLenum transformType,
+    const GLfloat *transformValues);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)(
+    GLsizei numPaths,
+    GLenum pathNameType,
+    const void *paths,
+    GLuint pathBase,
+    GLint reference,
+    GLuint mask,
+    GLenum transformType,
+    const GLfloat *transformValues);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)(
+    GLsizei numPaths,
+    GLenum pathNameType,
+    const void *paths,
+    GLuint pathBase,
+    GLenum fillMode,
+    GLuint mask,
+    GLenum coverMode,
+    GLenum transformType,
+    const GLfloat *transformValues);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)(
+    GLsizei numPaths,
+    GLenum pathNameType,
+    const void *paths,
+    GLuint pathBase,
+    GLint reference,
+    GLuint mask,
+    GLenum coverMode,
+    GLenum transformType,
+    const GLfloat *transformValues);
+
+typedef void(INTERNAL_GL_APIENTRY *PFNGLBINDFRAGMENTINPUTLOCATIONNVPROC)(GLuint program,
+                                                                         GLint location,
+                                                                         const GLchar *name);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)(GLuint program,
+                                                                           GLint location,
+                                                                           GLenum genMode,
+                                                                           GLint components,
+                                                                           const GLfloat *coeffs);
+
+// ES 3.2
+typedef void(INTERNAL_GL_APIENTRY *PFNGLBLENDBARRIERPROC)(void);
+typedef void(INTERNAL_GL_APIENTRY *PFNGLPRIMITIVEBOUNDINGBOXPROC)(GLfloat minX,
+                                                                  GLfloat minY,
+                                                                  GLfloat minZ,
+                                                                  GLfloat minW,
+                                                                  GLfloat maxX,
+                                                                  GLfloat maxY,
+                                                                  GLfloat maxZ,
+                                                                  GLfloat maxW);
+
+// GL_NV_internalformat_sample_query
+typedef void(INTERNAL_GL_APIENTRY *PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)(GLenum target,
+                                                                         GLenum internalformat,
+                                                                         GLsizei samples,
+                                                                         GLenum pname,
+                                                                         GLsizei bufSize,
+                                                                         GLint *params);
 }
 
 #endif // LIBANGLE_RENDERER_GL_FUNCTIONSGLTYPEDEFS_H_
diff --git a/src/libANGLE/renderer/gl/generate_gl_dispatch_table.py b/src/libANGLE/renderer/gl/generate_gl_dispatch_table.py
new file mode 100644
index 0000000..8b60cfb
--- /dev/null
+++ b/src/libANGLE/renderer/gl/generate_gl_dispatch_table.py
@@ -0,0 +1,301 @@
+#!/usr/bin/python
+# Copyright 2017 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# generate_gl_dispatch_table.py:
+#  Generation script for OpenGL bindings with ANGLE.
+
+import sys
+import os
+import xml.etree.ElementTree as etree
+from datetime import date
+
+# Set the CWD to the script directory.
+os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))
+
+sys.path.append('..')
+import angle_format
+
+def safe_append(the_dict, key, element):
+    if key not in the_dict:
+        the_dict[key] = []
+    the_dict[key].append(element)
+
+gl_xml_path = os.path.join('..', '..', '..', '..', 'scripts', 'gl.xml')
+dispatch_header_path = 'DispatchTableGL_autogen.h'
+dispatch_source_path = 'DispatchTableGL_autogen.cpp'
+
+# Load the JSON and XML data.
+data_source_name = 'gl_bindings_data.json'
+json_data = angle_format.load_json(data_source_name)
+xml_root = etree.parse(gl_xml_path).getroot()
+
+api_feature_info = {}
+
+core_removed_eps = []
+for core_removed_ep in xml_root.findall('feature/remove'):
+    assert(core_removed_ep.attrib['profile'] == 'core')
+    for command in core_removed_ep.findall('./command'):
+        core_removed_eps.append(command.attrib['name'])
+
+for feature in xml_root.findall('feature'):
+    api = feature.attrib['api']
+    name = feature.attrib['name']
+    number = feature.attrib['number']
+
+    # OpenGL ES 3.x versions are listed as api 'gles2'
+    if api != 'gl' and api != 'gles2':
+        continue
+
+    for command in feature.findall('./require/command'):
+        command_name = command.attrib['name']
+        safe_append(api_feature_info, command_name, (api, name, number))
+
+gl_extension_commands = {}
+gles2_extension_commands = {}
+both_extension_commands = {}
+
+for extension in xml_root.findall('extensions/extension'):
+    extension_name = extension.attrib['name']
+    support = extension.attrib['supported'].split('|')
+    for command in extension.findall('./require/command'):
+        command_name = command.attrib['name']
+        if 'gl' in support and 'gles2' in support:
+            # Special case for KHR extensions, since in GLES they are suffixed.
+            if '_KHR_' in extension_name:
+                safe_append(gl_extension_commands, command_name, extension_name)
+                safe_append(gles2_extension_commands, command_name, extension_name)
+            else:
+                safe_append(both_extension_commands, command_name, extension_name)
+        elif 'gl' in support:
+            safe_append(gl_extension_commands, command_name, extension_name)
+        elif 'gles2' in support:
+            safe_append(gles2_extension_commands, command_name, extension_name)
+
+gl_requirements = {}
+gles2_requirements = {}
+gl_extension_requirements = {}
+gles2_extension_requirements = {}
+both_extension_requirements = {}
+
+for comment, entry_points in json_data.iteritems():
+    for entry_point_no_prefix in entry_points:
+        entry_point = "gl" + entry_point_no_prefix
+
+        gl_required = None
+        gles2_required = None
+
+        if entry_point in api_feature_info:
+            for api, name, number in api_feature_info[entry_point]:
+                major, minor = number.split(".")
+                reqs = (major, minor)
+                if api == 'gl':
+                    if not gl_required:
+                        gl_required = reqs
+                    elif entry_point in core_removed_eps:
+                        print('Upgrade ' + entry_point + ' to ' + str(reqs) + ' instead of ' + str(gl_required))
+                        gl_required = reqs
+                    else:
+                        print('Keep ' + entry_point + ' at ' + str(gl_required) + ' instead of ' + str(reqs))
+                elif api == 'gles2':
+                    if not gles2_required:
+                        gles2_required = reqs
+                    else:
+                        print("Duplicate for " + entry_point + ": " + str(reqs) + " and " + str(gles2_required))
+                else:
+                    raise Exception('Bad api type: ' + api)
+
+        if gl_required:
+            safe_append(gl_requirements, gl_required, entry_point)
+
+        if gles2_required:
+            safe_append(gles2_requirements, gles2_required, entry_point)
+
+        # Special case for finding extensions that overlap with core functions.
+
+        extension = False
+
+        for ep in [entry_point, entry_point + "EXT", entry_point + "ARB", entry_point + "OES"]:
+            if ep in both_extension_commands:
+                extension = True
+                for extension in both_extension_commands[ep]:
+                    safe_append(both_extension_requirements, extension, (entry_point, ep))
+
+            else:
+                if ep in gl_extension_commands:
+                    extension = True
+                    for extension in gl_extension_commands[ep]:
+                        safe_append(gl_extension_requirements, extension, (entry_point, ep))
+
+                if ep in gles2_extension_commands:
+                    extension = True
+                    for extension in gles2_extension_commands[ep]:
+                        full_ep = ep
+                        if '_KHR_' in extension:
+                            full_ep += 'KHR'
+                        safe_append(gles2_extension_requirements, extension, (entry_point, full_ep))
+
+        if not (gl_required or gles2_required or extension):
+            raise Exception('Entry point ' + entry_point + ' not found in the xml.')
+
+# Template for the header declaration of the dispatch table.
+dispatch_table_header_template = """// GENERATED FILE - DO NOT EDIT.
+// Generated by {script_name} using data from {data_source_name} and gl.xml.
+//
+// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// {file_name}:
+//   Defines the native binding interface for ANGLE's OpenGL back-end.
+
+#ifndef LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_
+#define LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_
+
+#include "common/angleutils.h"
+#include "libANGLE/renderer/gl/functionsgl_typedefs.h"
+
+#include <set>
+
+namespace gl
+{{
+struct Version;
+}}  // namespace gl
+
+namespace rx
+{{
+class DispatchTableGL : angle::NonCopyable
+{{
+  public:
+{table_data}
+
+  protected:
+    virtual void *loadProcAddress(const std::string &function) const = 0;
+
+    void initProcsDesktopGL(const gl::Version &version, const std::set<std::string> &extensions);
+    void initProcsGLES(const gl::Version &version, const std::set<std::string> &extensions);
+    void initProcsSharedExtensions(const std::set<std::string> &extensions);
+}};
+
+}}  // namespace rx
+
+#endif  // LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_
+"""
+
+def first_lower(str):
+    return str[:1].lower() + str[1:]
+
+def format_ep_decl(entry_point):
+    return "    PFNGL" + entry_point.upper() + "PROC " + first_lower(entry_point) + " = nullptr;"
+
+table_data = []
+for comment, entry_points in sorted(json_data.iteritems()):
+    formatted = ["    // " + comment]
+    formatted += [format_ep_decl(entry_point) for entry_point in sorted(entry_points)]
+
+    table_data.append("\n".join(formatted))
+
+dispatch_table_header = dispatch_table_header_template.format(
+    script_name = os.path.basename(sys.argv[0]),
+    data_source_name = data_source_name,
+    year = date.today().year,
+    file_name = dispatch_header_path,
+    table_data = "\n\n".join(table_data))
+
+with open(dispatch_header_path, "w") as out:
+    out.write(dispatch_table_header)
+
+# Template for the initialization file of the dispatch table.
+dispatch_table_source_template = """// GENERATED FILE - DO NOT EDIT.
+// Generated by {script_name} using data from {data_source_name} and gl.xml.
+//
+// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// {file_name}:
+//   Initialize the native bindings for ANGLE's OpenGL back-end.
+
+#include "libANGLE/renderer/gl/DispatchTableGL_autogen.h"
+
+#include "libANGLE/Version.h"
+#include "libANGLE/renderer/gl/FunctionsGL.h"
+
+// Check for nullptr so extensions do not overwrite core imports.
+#define ASSIGN(NAME, FP) if (!FP) *reinterpret_cast<void **>(&FP) = loadProcAddress(NAME)
+
+namespace rx
+{{
+
+void DispatchTableGL::initProcsDesktopGL(const gl::Version &version, const std::set<std::string> &extensions)
+{{
+{gl_data}
+
+{gl_extensions_data}
+}}
+
+void DispatchTableGL::initProcsGLES(const gl::Version &version, const std::set<std::string> &extensions)
+{{
+{gles2_data}
+
+{gles2_extensions_data}
+}}
+
+void DispatchTableGL::initProcsSharedExtensions(const std::set<std::string> &extensions)
+{{
+{both_extensions_data}
+}}
+
+}}  // namespace rx
+"""
+
+def format_assign_ep(entry_point, ep):
+    return '        ASSIGN("' + ep + '", ' + first_lower(entry_point[2:]) + ');'
+
+def format_requirements_lines(required, entry_points):
+    major, minor = required
+    lines = ['    if (version >= gl::Version(' + major + ', ' + minor + '))', '    {']
+    lines += [format_assign_ep(entry_point, entry_point) for entry_point in sorted(entry_points)]
+    lines += ['    }']
+    return '\n'.join(lines)
+
+def format_extension_requirements_lines(extension, entry_points, api):
+    lines = ['    if (extensions.count("' + extension + '") != 0)', '    {']
+    lines += [format_assign_ep(entry_point, ep) for entry_point, ep in sorted(entry_points)]
+    lines += ['    }']
+    return '\n'.join(lines)
+
+gl_data = []
+for gl_required, entry_points in sorted(gl_requirements.iteritems()):
+    gl_data.append(format_requirements_lines(gl_required, entry_points))
+
+gl_extensions_data = []
+for extension, entry_points in sorted(gl_extension_requirements.iteritems()):
+    gl_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gl"))
+
+gles2_data = []
+for gles2_required, entry_points in sorted(gles2_requirements.iteritems()):
+    gles2_data.append(format_requirements_lines(gles2_required, entry_points))
+
+gles2_extensions_data = []
+for extension, entry_points in sorted(gles2_extension_requirements.iteritems()):
+    gles2_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gles2"))
+
+both_extensions_data = []
+for extension, entry_points in sorted(both_extension_requirements.iteritems()):
+    both_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gles2|gl"))
+
+dispatch_table_source = dispatch_table_source_template.format(
+    script_name = os.path.basename(sys.argv[0]),
+    data_source_name = data_source_name,
+    year = date.today().year,
+    file_name = dispatch_source_path,
+    gl_data = "\n\n".join(gl_data),
+    gl_extensions_data = "\n\n".join(gl_extensions_data),
+    gles2_data = "\n\n".join(gles2_data),
+    gles2_extensions_data = "\n\n".join(gles2_extensions_data),
+    both_extensions_data = "\n\n".join(both_extensions_data))
+
+with open(dispatch_source_path, "w") as out:
+    out.write(dispatch_table_source)
diff --git a/src/libANGLE/renderer/gl/gl_bindings_data.json b/src/libANGLE/renderer/gl/gl_bindings_data.json
new file mode 100644
index 0000000..d4e0a2f
--- /dev/null
+++ b/src/libANGLE/renderer/gl/gl_bindings_data.json
@@ -0,0 +1,787 @@
+{
+    "1.0":
+    [
+        "BlendFunc",
+        "Clear",
+        "ClearColor",
+        "ClearDepth",
+        "ClearStencil",
+        "ColorMask",
+        "CullFace",
+        "DepthFunc",
+        "DepthMask",
+        "DepthRange",
+        "Disable",
+        "DrawBuffer",
+        "Enable",
+        "Finish",
+        "Flush",
+        "FrontFace",
+        "GetBooleanv",
+        "GetDoublev",
+        "GetError",
+        "GetFloatv",
+        "GetIntegerv",
+        "GetString",
+        "GetTexImage",
+        "GetTexLevelParameterfv",
+        "GetTexLevelParameteriv",
+        "GetTexParameterfv",
+        "GetTexParameteriv",
+        "Hint",
+        "IsEnabled",
+        "LineWidth",
+        "LogicOp",
+        "PixelStoref",
+        "PixelStorei",
+        "PointSize",
+        "PolygonMode",
+        "ReadBuffer",
+        "ReadPixels",
+        "Scissor",
+        "StencilFunc",
+        "StencilMask",
+        "StencilOp",
+        "TexImage1D",
+        "TexImage2D",
+        "TexParameterf",
+        "TexParameterfv",
+        "TexParameteri",
+        "TexParameteriv",
+        "Viewport"
+    ],
+
+    "1.1":
+    [
+        "BindTexture",
+        "CopyTexImage1D",
+        "CopyTexImage2D",
+        "CopyTexSubImage1D",
+        "CopyTexSubImage2D",
+        "DeleteTextures",
+        "DrawArrays",
+        "DrawElements",
+        "GenTextures",
+        "IsTexture",
+        "PolygonOffset",
+        "TexSubImage1D",
+        "TexSubImage2D"
+    ],
+
+    "1.2":
+    [
+        "BlendColor",
+        "BlendEquation",
+        "CopyTexSubImage3D",
+        "DrawRangeElements",
+        "TexImage3D",
+        "TexSubImage3D"
+    ],
+
+    "1.2 Extensions":
+    [
+        "DeleteFencesNV",
+        "GenFencesNV",
+        "IsFenceNV",
+        "TestFenceNV",
+        "GetFenceivNV",
+        "FinishFenceNV",
+        "SetFenceNV"
+    ],
+
+    "1.3":
+    [
+        "ActiveTexture",
+        "CompressedTexImage1D",
+        "CompressedTexImage2D",
+        "CompressedTexImage3D",
+        "CompressedTexSubImage1D",
+        "CompressedTexSubImage2D",
+        "CompressedTexSubImage3D",
+        "GetCompressedTexImage",
+        "SampleCoverage"
+    ],
+
+    "1.4":
+    [
+        "BlendFuncSeparate",
+        "MultiDrawArrays",
+        "MultiDrawElements",
+        "PointParameterf",
+        "PointParameterfv",
+        "PointParameteri",
+        "PointParameteriv"
+    ],
+
+    "1.5":
+    [
+        "BeginQuery",
+        "BindBuffer",
+        "BufferData",
+        "BufferSubData",
+        "DeleteBuffers",
+        "DeleteQueries",
+        "EndQuery",
+        "GenBuffers",
+        "GenQueries",
+        "GetBufferParameteriv",
+        "GetBufferPointerv",
+        "GetBufferSubData",
+        "GetQueryObjectiv",
+        "GetQueryObjectuiv",
+        "GetQueryiv",
+        "IsBuffer",
+        "IsQuery",
+        "MapBuffer",
+        "UnmapBuffer"
+    ],
+
+    "2.0":
+    [
+        "AttachShader",
+        "BindAttribLocation",
+        "BlendEquationSeparate",
+        "CompileShader",
+        "CreateProgram",
+        "CreateShader",
+        "DeleteProgram",
+        "DeleteShader",
+        "DetachShader",
+        "DisableVertexAttribArray",
+        "DrawBuffers",
+        "EnableVertexAttribArray",
+        "GetActiveAttrib",
+        "GetActiveUniform",
+        "GetAttachedShaders",
+        "GetAttribLocation",
+        "GetProgramInfoLog",
+        "GetProgramiv",
+        "GetShaderInfoLog",
+        "GetShaderSource",
+        "GetShaderiv",
+        "GetUniformLocation",
+        "GetUniformfv",
+        "GetUniformiv",
+        "GetVertexAttribPointerv",
+        "GetVertexAttribdv",
+        "GetVertexAttribfv",
+        "GetVertexAttribiv",
+        "IsProgram",
+        "IsShader",
+        "LinkProgram",
+        "ShaderSource",
+        "StencilFuncSeparate",
+        "StencilMaskSeparate",
+        "StencilOpSeparate",
+        "Uniform1f",
+        "Uniform1fv",
+        "Uniform1i",
+        "Uniform1iv",
+        "Uniform2f",
+        "Uniform2fv",
+        "Uniform2i",
+        "Uniform2iv",
+        "Uniform3f",
+        "Uniform3fv",
+        "Uniform3i",
+        "Uniform3iv",
+        "Uniform4f",
+        "Uniform4fv",
+        "Uniform4i",
+        "Uniform4iv",
+        "UniformMatrix2fv",
+        "UniformMatrix3fv",
+        "UniformMatrix4fv",
+        "UseProgram",
+        "ValidateProgram",
+        "VertexAttrib1d",
+        "VertexAttrib1dv",
+        "VertexAttrib1f",
+        "VertexAttrib1fv",
+        "VertexAttrib1s",
+        "VertexAttrib1sv",
+        "VertexAttrib2d",
+        "VertexAttrib2dv",
+        "VertexAttrib2f",
+        "VertexAttrib2fv",
+        "VertexAttrib2s",
+        "VertexAttrib2sv",
+        "VertexAttrib3d",
+        "VertexAttrib3dv",
+        "VertexAttrib3f",
+        "VertexAttrib3fv",
+        "VertexAttrib3s",
+        "VertexAttrib3sv",
+        "VertexAttrib4Nbv",
+        "VertexAttrib4Niv",
+        "VertexAttrib4Nsv",
+        "VertexAttrib4Nub",
+        "VertexAttrib4Nubv",
+        "VertexAttrib4Nuiv",
+        "VertexAttrib4Nusv",
+        "VertexAttrib4bv",
+        "VertexAttrib4d",
+        "VertexAttrib4dv",
+        "VertexAttrib4f",
+        "VertexAttrib4fv",
+        "VertexAttrib4iv",
+        "VertexAttrib4s",
+        "VertexAttrib4sv",
+        "VertexAttrib4ubv",
+        "VertexAttrib4uiv",
+        "VertexAttrib4usv",
+        "VertexAttribPointer"
+    ],
+
+    "2.1":
+    [
+        "UniformMatrix2x3fv",
+        "UniformMatrix2x4fv",
+        "UniformMatrix3x2fv",
+        "UniformMatrix3x4fv",
+        "UniformMatrix4x2fv",
+        "UniformMatrix4x3fv"
+    ],
+
+    "3.0":
+    [
+        "BeginConditionalRender",
+        "BeginTransformFeedback",
+        "BindBufferBase",
+        "BindBufferRange",
+        "BindFragDataLocation",
+        "BindFramebuffer",
+        "BindRenderbuffer",
+        "BindVertexArray",
+        "BlitFramebuffer",
+        "CheckFramebufferStatus",
+        "ClampColor",
+        "ClearBufferfi",
+        "ClearBufferfv",
+        "ClearBufferiv",
+        "ClearBufferuiv",
+        "ColorMaski",
+        "DeleteFramebuffers",
+        "DeleteRenderbuffers",
+        "DeleteVertexArrays",
+        "Disablei",
+        "Enablei",
+        "EndConditionalRender",
+        "EndTransformFeedback",
+        "FlushMappedBufferRange",
+        "FramebufferRenderbuffer",
+        "FramebufferTexture1D",
+        "FramebufferTexture2D",
+        "FramebufferTexture3D",
+        "FramebufferTextureLayer",
+        "GenFramebuffers",
+        "GenRenderbuffers",
+        "GenVertexArrays",
+        "GenerateMipmap",
+        "GetBooleani_v",
+        "GetFragDataLocation",
+        "GetFramebufferAttachmentParameteriv",
+        "GetIntegeri_v",
+        "GetRenderbufferParameteriv",
+        "GetStringi",
+        "GetTexParameterIiv",
+        "GetTexParameterIuiv",
+        "GetTransformFeedbackVarying",
+        "GetUniformuiv",
+        "GetVertexAttribIiv",
+        "GetVertexAttribIuiv",
+        "IsEnabledi",
+        "IsFramebuffer",
+        "IsRenderbuffer",
+        "IsVertexArray",
+        "MapBufferRange",
+        "RenderbufferStorage",
+        "RenderbufferStorageMultisample",
+        "TexParameterIiv",
+        "TexParameterIuiv",
+        "TransformFeedbackVaryings",
+        "Uniform1ui",
+        "Uniform1uiv",
+        "Uniform2ui",
+        "Uniform2uiv",
+        "Uniform3ui",
+        "Uniform3uiv",
+        "Uniform4ui",
+        "Uniform4uiv",
+        "VertexAttribI1i",
+        "VertexAttribI1iv",
+        "VertexAttribI1ui",
+        "VertexAttribI1uiv",
+        "VertexAttribI2i",
+        "VertexAttribI2iv",
+        "VertexAttribI2ui",
+        "VertexAttribI2uiv",
+        "VertexAttribI3i",
+        "VertexAttribI3iv",
+        "VertexAttribI3ui",
+        "VertexAttribI3uiv",
+        "VertexAttribI4bv",
+        "VertexAttribI4i",
+        "VertexAttribI4iv",
+        "VertexAttribI4sv",
+        "VertexAttribI4ubv",
+        "VertexAttribI4ui",
+        "VertexAttribI4uiv",
+        "VertexAttribI4usv",
+        "VertexAttribIPointer"
+    ],
+
+    "3.1":
+    [
+        "CopyBufferSubData",
+        "DrawArraysInstanced",
+        "DrawElementsInstanced",
+        "GetActiveUniformBlockName",
+        "GetActiveUniformBlockiv",
+        "GetActiveUniformName",
+        "GetActiveUniformsiv",
+        "GetUniformBlockIndex",
+        "GetUniformIndices",
+        "PrimitiveRestartIndex",
+        "TexBuffer",
+        "UniformBlockBinding"
+    ],
+
+    "3.2":
+    [
+        "ClientWaitSync",
+        "DeleteSync",
+        "DrawElementsBaseVertex",
+        "DrawElementsInstancedBaseVertex",
+        "DrawRangeElementsBaseVertex",
+        "FenceSync",
+        "FramebufferTexture",
+        "GetBufferParameteri64v",
+        "GetInteger64i_v",
+        "GetInteger64v",
+        "GetMultisamplefv",
+        "GetSynciv",
+        "IsSync",
+        "MultiDrawElementsBaseVertex",
+        "ProvokingVertex",
+        "SampleMaski",
+        "TexImage2DMultisample",
+        "TexImage3DMultisample",
+        "WaitSync"
+    ],
+
+    "NV_path_rendering (originally written against 3.2 compatibility profile)":
+    [
+        "MatrixLoadfEXT",
+        "GenPathsNV",
+        "DeletePathsNV",
+        "PathCommandsNV",
+        "IsPathNV",
+        "PathParameterfNV",
+        "PathParameteriNV",
+        "GetPathParameterfvNV",
+        "GetPathParameterivNV",
+        "PathStencilFuncNV",
+        "StencilFillPathNV",
+        "StencilStrokePathNV",
+        "CoverFillPathNV",
+        "CoverStrokePathNV",
+        "StencilThenCoverFillPathNV",
+        "StencilThenCoverStrokePathNV",
+        "CoverFillPathInstancedNV",
+        "CoverStrokePathInstancedNV",
+        "StencilFillPathInstancedNV",
+        "StencilStrokePathInstancedNV",
+        "StencilThenCoverFillPathInstancedNV",
+        "StencilThenCoverStrokePathInstancedNV",
+        "ProgramPathFragmentInputGenNV"
+    ],
+
+    "3.3":
+    [
+        "BindFragDataLocationIndexed",
+        "BindSampler",
+        "DeleteSamplers",
+        "GenSamplers",
+        "GetFragDataIndex",
+        "GetQueryObjecti64v",
+        "GetQueryObjectui64v",
+        "GetSamplerParameterIiv",
+        "GetSamplerParameterIuiv",
+        "GetSamplerParameterfv",
+        "GetSamplerParameteriv",
+        "IsSampler",
+        "QueryCounter",
+        "SamplerParameterIiv",
+        "SamplerParameterIuiv",
+        "SamplerParameterf",
+        "SamplerParameterfv",
+        "SamplerParameteri",
+        "SamplerParameteriv",
+        "VertexAttribDivisor",
+        "VertexAttribP1ui",
+        "VertexAttribP1uiv",
+        "VertexAttribP2ui",
+        "VertexAttribP2uiv",
+        "VertexAttribP3ui",
+        "VertexAttribP3uiv",
+        "VertexAttribP4ui",
+        "VertexAttribP4uiv"
+    ],
+
+    "4.0":
+    [
+        "BeginQueryIndexed",
+        "BindTransformFeedback",
+        "BlendEquationSeparatei",
+        "BlendEquationi",
+        "BlendFuncSeparatei",
+        "BlendFunci",
+        "DeleteTransformFeedbacks",
+        "DrawArraysIndirect",
+        "DrawElementsIndirect",
+        "DrawTransformFeedback",
+        "DrawTransformFeedbackStream",
+        "EndQueryIndexed",
+        "GenTransformFeedbacks",
+        "GetActiveSubroutineName",
+        "GetActiveSubroutineUniformName",
+        "GetActiveSubroutineUniformiv",
+        "GetProgramStageiv",
+        "GetQueryIndexediv",
+        "GetSubroutineIndex",
+        "GetSubroutineUniformLocation",
+        "GetUniformSubroutineuiv",
+        "GetUniformdv",
+        "IsTransformFeedback",
+        "MinSampleShading",
+        "PatchParameterfv",
+        "PatchParameteri",
+        "PauseTransformFeedback",
+        "ResumeTransformFeedback",
+        "Uniform1d",
+        "Uniform1dv",
+        "Uniform2d",
+        "Uniform2dv",
+        "Uniform3d",
+        "Uniform3dv",
+        "Uniform4d",
+        "Uniform4dv",
+        "UniformMatrix2dv",
+        "UniformMatrix2x3dv",
+        "UniformMatrix2x4dv",
+        "UniformMatrix3dv",
+        "UniformMatrix3x2dv",
+        "UniformMatrix3x4dv",
+        "UniformMatrix4dv",
+        "UniformMatrix4x2dv",
+        "UniformMatrix4x3dv",
+        "UniformSubroutinesuiv"
+    ],
+
+    "4.1":
+    [
+        "ActiveShaderProgram",
+        "BindProgramPipeline",
+        "ClearDepthf",
+        "CreateShaderProgramv",
+        "DeleteProgramPipelines",
+        "DepthRangeArrayv",
+        "DepthRangeIndexed",
+        "DepthRangef",
+        "GenProgramPipelines",
+        "GetDoublei_v",
+        "GetFloati_v",
+        "GetProgramBinary",
+        "GetProgramPipelineInfoLog",
+        "GetProgramPipelineiv",
+        "GetShaderPrecisionFormat",
+        "GetVertexAttribLdv",
+        "IsProgramPipeline",
+        "ProgramBinary",
+        "ProgramParameteri",
+        "ProgramUniform1d",
+        "ProgramUniform1dv",
+        "ProgramUniform1f",
+        "ProgramUniform1fv",
+        "ProgramUniform1i",
+        "ProgramUniform1iv",
+        "ProgramUniform1ui",
+        "ProgramUniform1uiv",
+        "ProgramUniform2d",
+        "ProgramUniform2dv",
+        "ProgramUniform2f",
+        "ProgramUniform2fv",
+        "ProgramUniform2i",
+        "ProgramUniform2iv",
+        "ProgramUniform2ui",
+        "ProgramUniform2uiv",
+        "ProgramUniform3d",
+        "ProgramUniform3dv",
+        "ProgramUniform3f",
+        "ProgramUniform3fv",
+        "ProgramUniform3i",
+        "ProgramUniform3iv",
+        "ProgramUniform3ui",
+        "ProgramUniform3uiv",
+        "ProgramUniform4d",
+        "ProgramUniform4dv",
+        "ProgramUniform4f",
+        "ProgramUniform4fv",
+        "ProgramUniform4i",
+        "ProgramUniform4iv",
+        "ProgramUniform4ui",
+        "ProgramUniform4uiv",
+        "ProgramUniformMatrix2dv",
+        "ProgramUniformMatrix2fv",
+        "ProgramUniformMatrix2x3dv",
+        "ProgramUniformMatrix2x3fv",
+        "ProgramUniformMatrix2x4dv",
+        "ProgramUniformMatrix2x4fv",
+        "ProgramUniformMatrix3dv",
+        "ProgramUniformMatrix3fv",
+        "ProgramUniformMatrix3x2dv",
+        "ProgramUniformMatrix3x2fv",
+        "ProgramUniformMatrix3x4dv",
+        "ProgramUniformMatrix3x4fv",
+        "ProgramUniformMatrix4dv",
+        "ProgramUniformMatrix4fv",
+        "ProgramUniformMatrix4x2dv",
+        "ProgramUniformMatrix4x2fv",
+        "ProgramUniformMatrix4x3dv",
+        "ProgramUniformMatrix4x3fv",
+        "ReleaseShaderCompiler",
+        "ScissorArrayv",
+        "ScissorIndexed",
+        "ScissorIndexedv",
+        "ShaderBinary",
+        "UseProgramStages",
+        "ValidateProgramPipeline",
+        "VertexAttribL1d",
+        "VertexAttribL1dv",
+        "VertexAttribL2d",
+        "VertexAttribL2dv",
+        "VertexAttribL3d",
+        "VertexAttribL3dv",
+        "VertexAttribL4d",
+        "VertexAttribL4dv",
+        "VertexAttribLPointer",
+        "ViewportArrayv",
+        "ViewportIndexedf",
+        "ViewportIndexedfv"
+    ],
+
+    "4.2":
+    [
+        "BindImageTexture",
+        "DrawArraysInstancedBaseInstance",
+        "DrawElementsInstancedBaseInstance",
+        "DrawElementsInstancedBaseVertexBaseInstance",
+        "DrawTransformFeedbackInstanced",
+        "DrawTransformFeedbackStreamInstanced",
+        "GetActiveAtomicCounterBufferiv",
+        "GetInternalformativ",
+        "MemoryBarrier",
+        "TexStorage1D",
+        "TexStorage2D",
+        "TexStorage3D"
+    ],
+
+    "4.3":
+    [
+        "BindVertexBuffer",
+        "ClearBufferData",
+        "ClearBufferSubData",
+        "CopyImageSubData",
+        "DebugMessageCallback",
+        "DebugMessageControl",
+        "DebugMessageInsert",
+        "DispatchCompute",
+        "DispatchComputeIndirect",
+        "FramebufferParameteri",
+        "GetDebugMessageLog",
+        "GetFramebufferParameteriv",
+        "GetInternalformati64v",
+        "GetPointerv",
+        "GetObjectLabel",
+        "GetObjectPtrLabel",
+        "GetProgramInterfaceiv",
+        "GetProgramResourceIndex",
+        "GetProgramResourceLocation",
+        "GetProgramResourceLocationIndex",
+        "GetProgramResourceName",
+        "GetProgramResourceiv",
+        "InvalidateBufferData",
+        "InvalidateBufferSubData",
+        "InvalidateFramebuffer",
+        "InvalidateSubFramebuffer",
+        "InvalidateTexImage",
+        "InvalidateTexSubImage",
+        "MultiDrawArraysIndirect",
+        "MultiDrawElementsIndirect",
+        "ObjectLabel",
+        "ObjectPtrLabel",
+        "PopDebugGroup",
+        "PushDebugGroup",
+        "ShaderStorageBlockBinding",
+        "TexBufferRange",
+        "TexStorage2DMultisample",
+        "TexStorage3DMultisample",
+        "TextureView",
+        "VertexAttribBinding",
+        "VertexAttribFormat",
+        "VertexAttribIFormat",
+        "VertexAttribLFormat",
+        "VertexBindingDivisor",
+        "CoverageModulationNV"
+    ],
+
+    "4.4":
+    [
+        "BindBuffersBase",
+        "BindBuffersRange",
+        "BindImageTextures",
+        "BindSamplers",
+        "BindTextures",
+        "BindVertexBuffers",
+        "BufferStorage",
+        "ClearTexImage",
+        "ClearTexSubImage"
+    ],
+
+    "4.5":
+    [
+        "BindTextureUnit",
+        "BlitNamedFramebuffer",
+        "CheckNamedFramebufferStatus",
+        "ClearNamedBufferData",
+        "ClearNamedBufferSubData",
+        "ClearNamedFramebufferfi",
+        "ClearNamedFramebufferfv",
+        "ClearNamedFramebufferiv",
+        "ClearNamedFramebufferuiv",
+        "ClipControl",
+        "CompressedTextureSubImage1D",
+        "CompressedTextureSubImage2D",
+        "CompressedTextureSubImage3D",
+        "CopyNamedBufferSubData",
+        "CopyTextureSubImage1D",
+        "CopyTextureSubImage2D",
+        "CopyTextureSubImage3D",
+        "CreateBuffers",
+        "CreateFramebuffers",
+        "CreateProgramPipelines",
+        "CreateQueries",
+        "CreateRenderbuffers",
+        "CreateSamplers",
+        "CreateTextures",
+        "CreateTransformFeedbacks",
+        "CreateVertexArrays",
+        "DisableVertexArrayAttrib",
+        "EnableVertexArrayAttrib",
+        "FlushMappedNamedBufferRange",
+        "GenerateTextureMipmap",
+        "GetCompressedTextureImage",
+        "GetCompressedTextureSubImage",
+        "GetGraphicsResetStatus",
+        "GetNamedBufferParameteri64v",
+        "GetNamedBufferParameteriv",
+        "GetNamedBufferPointerv",
+        "GetNamedBufferSubData",
+        "GetNamedFramebufferAttachmentParameteriv",
+        "GetNamedFramebufferParameteriv",
+        "GetNamedRenderbufferParameteriv",
+        "GetQueryBufferObjecti64v",
+        "GetQueryBufferObjectiv",
+        "GetQueryBufferObjectui64v",
+        "GetQueryBufferObjectuiv",
+        "GetTextureImage",
+        "GetTextureLevelParameterfv",
+        "GetTextureLevelParameteriv",
+        "GetTextureParameterIiv",
+        "GetTextureParameterIuiv",
+        "GetTextureParameterfv",
+        "GetTextureParameteriv",
+        "GetTextureSubImage",
+        "GetTransformFeedbacki64_v",
+        "GetTransformFeedbacki_v",
+        "GetTransformFeedbackiv",
+        "GetVertexArrayIndexed64iv",
+        "GetVertexArrayIndexediv",
+        "GetVertexArrayiv",
+        "GetnCompressedTexImage",
+        "GetnTexImage",
+        "GetnUniformdv",
+        "GetnUniformfv",
+        "GetnUniformiv",
+        "GetnUniformuiv",
+        "InvalidateNamedFramebufferData",
+        "InvalidateNamedFramebufferSubData",
+        "MapNamedBuffer",
+        "MapNamedBufferRange",
+        "MemoryBarrierByRegion",
+        "NamedBufferData",
+        "NamedBufferStorage",
+        "NamedBufferSubData",
+        "NamedFramebufferDrawBuffer",
+        "NamedFramebufferDrawBuffers",
+        "NamedFramebufferParameteri",
+        "NamedFramebufferReadBuffer",
+        "NamedFramebufferRenderbuffer",
+        "NamedFramebufferTexture",
+        "NamedFramebufferTextureLayer",
+        "NamedRenderbufferStorage",
+        "NamedRenderbufferStorageMultisample",
+        "ReadnPixels",
+        "TextureBarrier",
+        "TextureBuffer",
+        "TextureBufferRange",
+        "TextureParameterIiv",
+        "TextureParameterIuiv",
+        "TextureParameterf",
+        "TextureParameterfv",
+        "TextureParameteri",
+        "TextureParameteriv",
+        "TextureStorage1D",
+        "TextureStorage2D",
+        "TextureStorage2DMultisample",
+        "TextureStorage3D",
+        "TextureStorage3DMultisample",
+        "TextureSubImage1D",
+        "TextureSubImage2D",
+        "TextureSubImage3D",
+        "TransformFeedbackBufferBase",
+        "TransformFeedbackBufferRange",
+        "UnmapNamedBuffer",
+        "VertexArrayAttribBinding",
+        "VertexArrayAttribFormat",
+        "VertexArrayAttribIFormat",
+        "VertexArrayAttribLFormat",
+        "VertexArrayBindingDivisor",
+        "VertexArrayElementBuffer",
+        "VertexArrayVertexBuffer",
+        "VertexArrayVertexBuffers"
+    ],
+
+    "ES 3.2":
+    [
+        "BlendBarrier",
+        "PrimitiveBoundingBox"
+    ],
+
+    "GL_OES_EGL_image":
+    [
+        "EGLImageTargetRenderbufferStorageOES",
+        "EGLImageTargetTexture2DOES"
+    ],
+
+    "GL_EXT_discard_framebuffer":
+    [
+        "DiscardFramebufferEXT"
+    ],
+
+    "GL_NV_internalformat_sample_query":
+    [
+        "GetInternalformatSampleivNV"
+    ]
+}
diff --git a/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp b/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
index d4929de..c97d327 100644
--- a/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
+++ b/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
@@ -49,7 +49,7 @@
     ~FunctionsGLGLX() override {}
 
   private:
-    void *loadProcAddress(const std::string &function) override
+    void *loadProcAddress(const std::string &function) const override
     {
         return reinterpret_cast<void*>(mGetProc(function.c_str()));
     }
diff --git a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
index 169eb5d..cb9db8a 100644
--- a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
@@ -44,7 +44,7 @@
     ~FunctionsGLWindows() override {}
 
   private:
-    void *loadProcAddress(const std::string &function) override
+    void *loadProcAddress(const std::string &function) const override
     {
         void *proc = reinterpret_cast<void*>(mGetProcAddressWGL(function.c_str()));
         if (!proc)
diff --git a/src/libGLESv2.gypi b/src/libGLESv2.gypi
index 055e5ef..7b4fa2f 100644
--- a/src/libGLESv2.gypi
+++ b/src/libGLESv2.gypi
@@ -574,6 +574,8 @@
             'libANGLE/renderer/gl/CompilerGL.h',
             'libANGLE/renderer/gl/ContextGL.cpp',
             'libANGLE/renderer/gl/ContextGL.h',
+            'libANGLE/renderer/gl/DispatchTableGL_autogen.cpp',
+            'libANGLE/renderer/gl/DispatchTableGL_autogen.h',
             'libANGLE/renderer/gl/DisplayGL.cpp',
             'libANGLE/renderer/gl/DisplayGL.h',
             'libANGLE/renderer/gl/FenceNVGL.cpp',