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