// GENERATED FILE - DO NOT EDIT.
// Generated by generate_gl_dispatch_table.py using data from gl_bindings_data.json and gl.xml.
//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// DispatchTableGL_autogen.cpp:
//   Initialize the native bindings for ANGLE's OpenGL back-end.

#include "libANGLE/renderer/gl/DispatchTableGL_autogen.h"

#include "libANGLE/Version.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"

// Check for nullptr so extensions do not overwrite core imports.
#define ASSIGN(NAME, FP) \
    if (!FP)             \
    *reinterpret_cast<void **>(&FP) = loadProcAddress(NAME)

namespace rx
{

void DispatchTableGL::initProcsDesktopGL(const gl::Version &version,
                                         const std::set<std::string> &extensions)
{
    if (version >= gl::Version(1, 0))
    {
        ASSIGN("glBlendFunc", blendFunc);
        ASSIGN("glClear", clear);
        ASSIGN("glClearColor", clearColor);
        ASSIGN("glClearDepth", clearDepth);
        ASSIGN("glClearStencil", clearStencil);
        ASSIGN("glColorMask", colorMask);
        ASSIGN("glCullFace", cullFace);
        ASSIGN("glDepthFunc", depthFunc);
        ASSIGN("glDepthMask", depthMask);
        ASSIGN("glDepthRange", depthRange);
        ASSIGN("glDisable", disable);
        ASSIGN("glDrawBuffer", drawBuffer);
        ASSIGN("glEnable", enable);
        ASSIGN("glFinish", finish);
        ASSIGN("glFlush", flush);
        ASSIGN("glFrontFace", frontFace);
        ASSIGN("glGetBooleanv", getBooleanv);
        ASSIGN("glGetDoublev", getDoublev);
        ASSIGN("glGetError", getError);
        ASSIGN("glGetFloatv", getFloatv);
        ASSIGN("glGetIntegerv", getIntegerv);
        ASSIGN("glGetString", getString);
        ASSIGN("glGetTexImage", getTexImage);
        ASSIGN("glGetTexLevelParameterfv", getTexLevelParameterfv);
        ASSIGN("glGetTexLevelParameteriv", getTexLevelParameteriv);
        ASSIGN("glGetTexParameterfv", getTexParameterfv);
        ASSIGN("glGetTexParameteriv", getTexParameteriv);
        ASSIGN("glHint", hint);
        ASSIGN("glIsEnabled", isEnabled);
        ASSIGN("glLineWidth", lineWidth);
        ASSIGN("glLogicOp", logicOp);
        ASSIGN("glPixelStoref", pixelStoref);
        ASSIGN("glPixelStorei", pixelStorei);
        ASSIGN("glPointSize", pointSize);
        ASSIGN("glPolygonMode", polygonMode);
        ASSIGN("glReadBuffer", readBuffer);
        ASSIGN("glReadPixels", readPixels);
        ASSIGN("glScissor", scissor);
        ASSIGN("glStencilFunc", stencilFunc);
        ASSIGN("glStencilMask", stencilMask);
        ASSIGN("glStencilOp", stencilOp);
        ASSIGN("glTexImage1D", texImage1D);
        ASSIGN("glTexImage2D", texImage2D);
        ASSIGN("glTexParameterf", texParameterf);
        ASSIGN("glTexParameterfv", texParameterfv);
        ASSIGN("glTexParameteri", texParameteri);
        ASSIGN("glTexParameteriv", texParameteriv);
        ASSIGN("glViewport", viewport);
    }

    if (version >= gl::Version(1, 1))
    {
        ASSIGN("glBindTexture", bindTexture);
        ASSIGN("glCopyTexImage1D", copyTexImage1D);
        ASSIGN("glCopyTexImage2D", copyTexImage2D);
        ASSIGN("glCopyTexSubImage1D", copyTexSubImage1D);
        ASSIGN("glCopyTexSubImage2D", copyTexSubImage2D);
        ASSIGN("glDeleteTextures", deleteTextures);
        ASSIGN("glDrawArrays", drawArrays);
        ASSIGN("glDrawElements", drawElements);
        ASSIGN("glGenTextures", genTextures);
        ASSIGN("glIsTexture", isTexture);
        ASSIGN("glPolygonOffset", polygonOffset);
        ASSIGN("glTexSubImage1D", texSubImage1D);
        ASSIGN("glTexSubImage2D", texSubImage2D);
    }

    if (version >= gl::Version(1, 2))
    {
        ASSIGN("glCopyTexSubImage3D", copyTexSubImage3D);
        ASSIGN("glDrawRangeElements", drawRangeElements);
        ASSIGN("glTexImage3D", texImage3D);
        ASSIGN("glTexSubImage3D", texSubImage3D);
    }

    if (version >= gl::Version(1, 3))
    {
        ASSIGN("glActiveTexture", activeTexture);
        ASSIGN("glCompressedTexImage1D", compressedTexImage1D);
        ASSIGN("glCompressedTexImage2D", compressedTexImage2D);
        ASSIGN("glCompressedTexImage3D", compressedTexImage3D);
        ASSIGN("glCompressedTexSubImage1D", compressedTexSubImage1D);
        ASSIGN("glCompressedTexSubImage2D", compressedTexSubImage2D);
        ASSIGN("glCompressedTexSubImage3D", compressedTexSubImage3D);
        ASSIGN("glGetCompressedTexImage", getCompressedTexImage);
        ASSIGN("glSampleCoverage", sampleCoverage);
    }

    if (version >= gl::Version(1, 4))
    {
        ASSIGN("glBlendColor", blendColor);
        ASSIGN("glBlendEquation", blendEquation);
        ASSIGN("glBlendFuncSeparate", blendFuncSeparate);
        ASSIGN("glMultiDrawArrays", multiDrawArrays);
        ASSIGN("glMultiDrawElements", multiDrawElements);
        ASSIGN("glPointParameterf", pointParameterf);
        ASSIGN("glPointParameterfv", pointParameterfv);
        ASSIGN("glPointParameteri", pointParameteri);
        ASSIGN("glPointParameteriv", pointParameteriv);
    }

    if (version >= gl::Version(1, 5))
    {
        ASSIGN("glBeginQuery", beginQuery);
        ASSIGN("glBindBuffer", bindBuffer);
        ASSIGN("glBufferData", bufferData);
        ASSIGN("glBufferSubData", bufferSubData);
        ASSIGN("glDeleteBuffers", deleteBuffers);
        ASSIGN("glDeleteQueries", deleteQueries);
        ASSIGN("glEndQuery", endQuery);
        ASSIGN("glGenBuffers", genBuffers);
        ASSIGN("glGenQueries", genQueries);
        ASSIGN("glGetBufferParameteriv", getBufferParameteriv);
        ASSIGN("glGetBufferPointerv", getBufferPointerv);
        ASSIGN("glGetBufferSubData", getBufferSubData);
        ASSIGN("glGetQueryObjectiv", getQueryObjectiv);
        ASSIGN("glGetQueryObjectuiv", getQueryObjectuiv);
        ASSIGN("glGetQueryiv", getQueryiv);
        ASSIGN("glIsBuffer", isBuffer);
        ASSIGN("glIsQuery", isQuery);
        ASSIGN("glMapBuffer", mapBuffer);
        ASSIGN("glUnmapBuffer", unmapBuffer);
    }

    if (version >= gl::Version(2, 0))
    {
        ASSIGN("glAttachShader", attachShader);
        ASSIGN("glBindAttribLocation", bindAttribLocation);
        ASSIGN("glBlendEquationSeparate", blendEquationSeparate);
        ASSIGN("glCompileShader", compileShader);
        ASSIGN("glCreateProgram", createProgram);
        ASSIGN("glCreateShader", createShader);
        ASSIGN("glDeleteProgram", deleteProgram);
        ASSIGN("glDeleteShader", deleteShader);
        ASSIGN("glDetachShader", detachShader);
        ASSIGN("glDisableVertexAttribArray", disableVertexAttribArray);
        ASSIGN("glDrawBuffers", drawBuffers);
        ASSIGN("glEnableVertexAttribArray", enableVertexAttribArray);
        ASSIGN("glGetActiveAttrib", getActiveAttrib);
        ASSIGN("glGetActiveUniform", getActiveUniform);
        ASSIGN("glGetAttachedShaders", getAttachedShaders);
        ASSIGN("glGetAttribLocation", getAttribLocation);
        ASSIGN("glGetProgramInfoLog", getProgramInfoLog);
        ASSIGN("glGetProgramiv", getProgramiv);
        ASSIGN("glGetShaderInfoLog", getShaderInfoLog);
        ASSIGN("glGetShaderSource", getShaderSource);
        ASSIGN("glGetShaderiv", getShaderiv);
        ASSIGN("glGetUniformLocation", getUniformLocation);
        ASSIGN("glGetUniformfv", getUniformfv);
        ASSIGN("glGetUniformiv", getUniformiv);
        ASSIGN("glGetVertexAttribPointerv", getVertexAttribPointerv);
        ASSIGN("glGetVertexAttribdv", getVertexAttribdv);
        ASSIGN("glGetVertexAttribfv", getVertexAttribfv);
        ASSIGN("glGetVertexAttribiv", getVertexAttribiv);
        ASSIGN("glIsProgram", isProgram);
        ASSIGN("glIsShader", isShader);
        ASSIGN("glLinkProgram", linkProgram);
        ASSIGN("glShaderSource", shaderSource);
        ASSIGN("glStencilFuncSeparate", stencilFuncSeparate);
        ASSIGN("glStencilMaskSeparate", stencilMaskSeparate);
        ASSIGN("glStencilOpSeparate", stencilOpSeparate);
        ASSIGN("glUniform1f", uniform1f);
        ASSIGN("glUniform1fv", uniform1fv);
        ASSIGN("glUniform1i", uniform1i);
        ASSIGN("glUniform1iv", uniform1iv);
        ASSIGN("glUniform2f", uniform2f);
        ASSIGN("glUniform2fv", uniform2fv);
        ASSIGN("glUniform2i", uniform2i);
        ASSIGN("glUniform2iv", uniform2iv);
        ASSIGN("glUniform3f", uniform3f);
        ASSIGN("glUniform3fv", uniform3fv);
        ASSIGN("glUniform3i", uniform3i);
        ASSIGN("glUniform3iv", uniform3iv);
        ASSIGN("glUniform4f", uniform4f);
        ASSIGN("glUniform4fv", uniform4fv);
        ASSIGN("glUniform4i", uniform4i);
        ASSIGN("glUniform4iv", uniform4iv);
        ASSIGN("glUniformMatrix2fv", uniformMatrix2fv);
        ASSIGN("glUniformMatrix3fv", uniformMatrix3fv);
        ASSIGN("glUniformMatrix4fv", uniformMatrix4fv);
        ASSIGN("glUseProgram", useProgram);
        ASSIGN("glValidateProgram", validateProgram);
        ASSIGN("glVertexAttrib1d", vertexAttrib1d);
        ASSIGN("glVertexAttrib1dv", vertexAttrib1dv);
        ASSIGN("glVertexAttrib1f", vertexAttrib1f);
        ASSIGN("glVertexAttrib1fv", vertexAttrib1fv);
        ASSIGN("glVertexAttrib1s", vertexAttrib1s);
        ASSIGN("glVertexAttrib1sv", vertexAttrib1sv);
        ASSIGN("glVertexAttrib2d", vertexAttrib2d);
        ASSIGN("glVertexAttrib2dv", vertexAttrib2dv);
        ASSIGN("glVertexAttrib2f", vertexAttrib2f);
        ASSIGN("glVertexAttrib2fv", vertexAttrib2fv);
        ASSIGN("glVertexAttrib2s", vertexAttrib2s);
        ASSIGN("glVertexAttrib2sv", vertexAttrib2sv);
        ASSIGN("glVertexAttrib3d", vertexAttrib3d);
        ASSIGN("glVertexAttrib3dv", vertexAttrib3dv);
        ASSIGN("glVertexAttrib3f", vertexAttrib3f);
        ASSIGN("glVertexAttrib3fv", vertexAttrib3fv);
        ASSIGN("glVertexAttrib3s", vertexAttrib3s);
        ASSIGN("glVertexAttrib3sv", vertexAttrib3sv);
        ASSIGN("glVertexAttrib4Nbv", vertexAttrib4Nbv);
        ASSIGN("glVertexAttrib4Niv", vertexAttrib4Niv);
        ASSIGN("glVertexAttrib4Nsv", vertexAttrib4Nsv);
        ASSIGN("glVertexAttrib4Nub", vertexAttrib4Nub);
        ASSIGN("glVertexAttrib4Nubv", vertexAttrib4Nubv);
        ASSIGN("glVertexAttrib4Nuiv", vertexAttrib4Nuiv);
        ASSIGN("glVertexAttrib4Nusv", vertexAttrib4Nusv);
        ASSIGN("glVertexAttrib4bv", vertexAttrib4bv);
        ASSIGN("glVertexAttrib4d", vertexAttrib4d);
        ASSIGN("glVertexAttrib4dv", vertexAttrib4dv);
        ASSIGN("glVertexAttrib4f", vertexAttrib4f);
        ASSIGN("glVertexAttrib4fv", vertexAttrib4fv);
        ASSIGN("glVertexAttrib4iv", vertexAttrib4iv);
        ASSIGN("glVertexAttrib4s", vertexAttrib4s);
        ASSIGN("glVertexAttrib4sv", vertexAttrib4sv);
        ASSIGN("glVertexAttrib4ubv", vertexAttrib4ubv);
        ASSIGN("glVertexAttrib4uiv", vertexAttrib4uiv);
        ASSIGN("glVertexAttrib4usv", vertexAttrib4usv);
        ASSIGN("glVertexAttribPointer", vertexAttribPointer);
    }

    if (version >= gl::Version(2, 1))
    {
        ASSIGN("glUniformMatrix2x3fv", uniformMatrix2x3fv);
        ASSIGN("glUniformMatrix2x4fv", uniformMatrix2x4fv);
        ASSIGN("glUniformMatrix3x2fv", uniformMatrix3x2fv);
        ASSIGN("glUniformMatrix3x4fv", uniformMatrix3x4fv);
        ASSIGN("glUniformMatrix4x2fv", uniformMatrix4x2fv);
        ASSIGN("glUniformMatrix4x3fv", uniformMatrix4x3fv);
    }

    if (version >= gl::Version(3, 0))
    {
        ASSIGN("glBeginConditionalRender", beginConditionalRender);
        ASSIGN("glBeginTransformFeedback", beginTransformFeedback);
        ASSIGN("glBindBufferBase", bindBufferBase);
        ASSIGN("glBindBufferRange", bindBufferRange);
        ASSIGN("glBindFragDataLocation", bindFragDataLocation);
        ASSIGN("glBindFramebuffer", bindFramebuffer);
        ASSIGN("glBindRenderbuffer", bindRenderbuffer);
        ASSIGN("glBindVertexArray", bindVertexArray);
        ASSIGN("glBlitFramebuffer", blitFramebuffer);
        ASSIGN("glCheckFramebufferStatus", checkFramebufferStatus);
        ASSIGN("glClampColor", clampColor);
        ASSIGN("glClearBufferfi", clearBufferfi);
        ASSIGN("glClearBufferfv", clearBufferfv);
        ASSIGN("glClearBufferiv", clearBufferiv);
        ASSIGN("glClearBufferuiv", clearBufferuiv);
        ASSIGN("glColorMaski", colorMaski);
        ASSIGN("glDeleteFramebuffers", deleteFramebuffers);
        ASSIGN("glDeleteRenderbuffers", deleteRenderbuffers);
        ASSIGN("glDeleteVertexArrays", deleteVertexArrays);
        ASSIGN("glDisablei", disablei);
        ASSIGN("glEnablei", enablei);
        ASSIGN("glEndConditionalRender", endConditionalRender);
        ASSIGN("glEndTransformFeedback", endTransformFeedback);
        ASSIGN("glFlushMappedBufferRange", flushMappedBufferRange);
        ASSIGN("glFramebufferRenderbuffer", framebufferRenderbuffer);
        ASSIGN("glFramebufferTexture1D", framebufferTexture1D);
        ASSIGN("glFramebufferTexture2D", framebufferTexture2D);
        ASSIGN("glFramebufferTexture3D", framebufferTexture3D);
        ASSIGN("glFramebufferTextureLayer", framebufferTextureLayer);
        ASSIGN("glGenFramebuffers", genFramebuffers);
        ASSIGN("glGenRenderbuffers", genRenderbuffers);
        ASSIGN("glGenVertexArrays", genVertexArrays);
        ASSIGN("glGenerateMipmap", generateMipmap);
        ASSIGN("glGetBooleani_v", getBooleani_v);
        ASSIGN("glGetFragDataLocation", getFragDataLocation);
        ASSIGN("glGetFramebufferAttachmentParameteriv", getFramebufferAttachmentParameteriv);
        ASSIGN("glGetIntegeri_v", getIntegeri_v);
        ASSIGN("glGetRenderbufferParameteriv", getRenderbufferParameteriv);
        ASSIGN("glGetStringi", getStringi);
        ASSIGN("glGetTexParameterIiv", getTexParameterIiv);
        ASSIGN("glGetTexParameterIuiv", getTexParameterIuiv);
        ASSIGN("glGetTransformFeedbackVarying", getTransformFeedbackVarying);
        ASSIGN("glGetUniformuiv", getUniformuiv);
        ASSIGN("glGetVertexAttribIiv", getVertexAttribIiv);
        ASSIGN("glGetVertexAttribIuiv", getVertexAttribIuiv);
        ASSIGN("glIsEnabledi", isEnabledi);
        ASSIGN("glIsFramebuffer", isFramebuffer);
        ASSIGN("glIsRenderbuffer", isRenderbuffer);
        ASSIGN("glIsVertexArray", isVertexArray);
        ASSIGN("glMapBufferRange", mapBufferRange);
        ASSIGN("glRenderbufferStorage", renderbufferStorage);
        ASSIGN("glRenderbufferStorageMultisample", renderbufferStorageMultisample);
        ASSIGN("glTexParameterIiv", texParameterIiv);
        ASSIGN("glTexParameterIuiv", texParameterIuiv);
        ASSIGN("glTransformFeedbackVaryings", transformFeedbackVaryings);
        ASSIGN("glUniform1ui", uniform1ui);
        ASSIGN("glUniform1uiv", uniform1uiv);
        ASSIGN("glUniform2ui", uniform2ui);
        ASSIGN("glUniform2uiv", uniform2uiv);
        ASSIGN("glUniform3ui", uniform3ui);
        ASSIGN("glUniform3uiv", uniform3uiv);
        ASSIGN("glUniform4ui", uniform4ui);
        ASSIGN("glUniform4uiv", uniform4uiv);
        ASSIGN("glVertexAttribI1i", vertexAttribI1i);
        ASSIGN("glVertexAttribI1iv", vertexAttribI1iv);
        ASSIGN("glVertexAttribI1ui", vertexAttribI1ui);
        ASSIGN("glVertexAttribI1uiv", vertexAttribI1uiv);
        ASSIGN("glVertexAttribI2i", vertexAttribI2i);
        ASSIGN("glVertexAttribI2iv", vertexAttribI2iv);
        ASSIGN("glVertexAttribI2ui", vertexAttribI2ui);
        ASSIGN("glVertexAttribI2uiv", vertexAttribI2uiv);
        ASSIGN("glVertexAttribI3i", vertexAttribI3i);
        ASSIGN("glVertexAttribI3iv", vertexAttribI3iv);
        ASSIGN("glVertexAttribI3ui", vertexAttribI3ui);
        ASSIGN("glVertexAttribI3uiv", vertexAttribI3uiv);
        ASSIGN("glVertexAttribI4bv", vertexAttribI4bv);
        ASSIGN("glVertexAttribI4i", vertexAttribI4i);
        ASSIGN("glVertexAttribI4iv", vertexAttribI4iv);
        ASSIGN("glVertexAttribI4sv", vertexAttribI4sv);
        ASSIGN("glVertexAttribI4ubv", vertexAttribI4ubv);
        ASSIGN("glVertexAttribI4ui", vertexAttribI4ui);
        ASSIGN("glVertexAttribI4uiv", vertexAttribI4uiv);
        ASSIGN("glVertexAttribI4usv", vertexAttribI4usv);
        ASSIGN("glVertexAttribIPointer", vertexAttribIPointer);
    }

    if (version >= gl::Version(3, 1))
    {
        ASSIGN("glCopyBufferSubData", copyBufferSubData);
        ASSIGN("glDrawArraysInstanced", drawArraysInstanced);
        ASSIGN("glDrawElementsInstanced", drawElementsInstanced);
        ASSIGN("glGetActiveUniformBlockName", getActiveUniformBlockName);
        ASSIGN("glGetActiveUniformBlockiv", getActiveUniformBlockiv);
        ASSIGN("glGetActiveUniformName", getActiveUniformName);
        ASSIGN("glGetActiveUniformsiv", getActiveUniformsiv);
        ASSIGN("glGetUniformBlockIndex", getUniformBlockIndex);
        ASSIGN("glGetUniformIndices", getUniformIndices);
        ASSIGN("glPrimitiveRestartIndex", primitiveRestartIndex);
        ASSIGN("glTexBuffer", texBuffer);
        ASSIGN("glUniformBlockBinding", uniformBlockBinding);
    }

    if (version >= gl::Version(3, 2))
    {
        ASSIGN("glClientWaitSync", clientWaitSync);
        ASSIGN("glDeleteSync", deleteSync);
        ASSIGN("glDrawElementsBaseVertex", drawElementsBaseVertex);
        ASSIGN("glDrawElementsInstancedBaseVertex", drawElementsInstancedBaseVertex);
        ASSIGN("glDrawRangeElementsBaseVertex", drawRangeElementsBaseVertex);
        ASSIGN("glFenceSync", fenceSync);
        ASSIGN("glFramebufferTexture", framebufferTexture);
        ASSIGN("glGetBufferParameteri64v", getBufferParameteri64v);
        ASSIGN("glGetInteger64i_v", getInteger64i_v);
        ASSIGN("glGetInteger64v", getInteger64v);
        ASSIGN("glGetMultisamplefv", getMultisamplefv);
        ASSIGN("glGetSynciv", getSynciv);
        ASSIGN("glIsSync", isSync);
        ASSIGN("glMultiDrawElementsBaseVertex", multiDrawElementsBaseVertex);
        ASSIGN("glProvokingVertex", provokingVertex);
        ASSIGN("glSampleMaski", sampleMaski);
        ASSIGN("glTexImage2DMultisample", texImage2DMultisample);
        ASSIGN("glTexImage3DMultisample", texImage3DMultisample);
        ASSIGN("glWaitSync", waitSync);
    }

    if (version >= gl::Version(3, 3))
    {
        ASSIGN("glBindFragDataLocationIndexed", bindFragDataLocationIndexed);
        ASSIGN("glBindSampler", bindSampler);
        ASSIGN("glDeleteSamplers", deleteSamplers);
        ASSIGN("glGenSamplers", genSamplers);
        ASSIGN("glGetFragDataIndex", getFragDataIndex);
        ASSIGN("glGetQueryObjecti64v", getQueryObjecti64v);
        ASSIGN("glGetQueryObjectui64v", getQueryObjectui64v);
        ASSIGN("glGetSamplerParameterIiv", getSamplerParameterIiv);
        ASSIGN("glGetSamplerParameterIuiv", getSamplerParameterIuiv);
        ASSIGN("glGetSamplerParameterfv", getSamplerParameterfv);
        ASSIGN("glGetSamplerParameteriv", getSamplerParameteriv);
        ASSIGN("glIsSampler", isSampler);
        ASSIGN("glQueryCounter", queryCounter);
        ASSIGN("glSamplerParameterIiv", samplerParameterIiv);
        ASSIGN("glSamplerParameterIuiv", samplerParameterIuiv);
        ASSIGN("glSamplerParameterf", samplerParameterf);
        ASSIGN("glSamplerParameterfv", samplerParameterfv);
        ASSIGN("glSamplerParameteri", samplerParameteri);
        ASSIGN("glSamplerParameteriv", samplerParameteriv);
        ASSIGN("glVertexAttribDivisor", vertexAttribDivisor);
        ASSIGN("glVertexAttribP1ui", vertexAttribP1ui);
        ASSIGN("glVertexAttribP1uiv", vertexAttribP1uiv);
        ASSIGN("glVertexAttribP2ui", vertexAttribP2ui);
        ASSIGN("glVertexAttribP2uiv", vertexAttribP2uiv);
        ASSIGN("glVertexAttribP3ui", vertexAttribP3ui);
        ASSIGN("glVertexAttribP3uiv", vertexAttribP3uiv);
        ASSIGN("glVertexAttribP4ui", vertexAttribP4ui);
        ASSIGN("glVertexAttribP4uiv", vertexAttribP4uiv);
    }

    if (version >= gl::Version(4, 0))
    {
        ASSIGN("glBeginQueryIndexed", beginQueryIndexed);
        ASSIGN("glBindTransformFeedback", bindTransformFeedback);
        ASSIGN("glBlendEquationSeparatei", blendEquationSeparatei);
        ASSIGN("glBlendEquationi", blendEquationi);
        ASSIGN("glBlendFuncSeparatei", blendFuncSeparatei);
        ASSIGN("glBlendFunci", blendFunci);
        ASSIGN("glDeleteTransformFeedbacks", deleteTransformFeedbacks);
        ASSIGN("glDrawArraysIndirect", drawArraysIndirect);
        ASSIGN("glDrawElementsIndirect", drawElementsIndirect);
        ASSIGN("glDrawTransformFeedback", drawTransformFeedback);
        ASSIGN("glDrawTransformFeedbackStream", drawTransformFeedbackStream);
        ASSIGN("glEndQueryIndexed", endQueryIndexed);
        ASSIGN("glGenTransformFeedbacks", genTransformFeedbacks);
        ASSIGN("glGetActiveSubroutineName", getActiveSubroutineName);
        ASSIGN("glGetActiveSubroutineUniformName", getActiveSubroutineUniformName);
        ASSIGN("glGetActiveSubroutineUniformiv", getActiveSubroutineUniformiv);
        ASSIGN("glGetProgramStageiv", getProgramStageiv);
        ASSIGN("glGetQueryIndexediv", getQueryIndexediv);
        ASSIGN("glGetSubroutineIndex", getSubroutineIndex);
        ASSIGN("glGetSubroutineUniformLocation", getSubroutineUniformLocation);
        ASSIGN("glGetUniformSubroutineuiv", getUniformSubroutineuiv);
        ASSIGN("glGetUniformdv", getUniformdv);
        ASSIGN("glIsTransformFeedback", isTransformFeedback);
        ASSIGN("glMinSampleShading", minSampleShading);
        ASSIGN("glPatchParameterfv", patchParameterfv);
        ASSIGN("glPatchParameteri", patchParameteri);
        ASSIGN("glPauseTransformFeedback", pauseTransformFeedback);
        ASSIGN("glResumeTransformFeedback", resumeTransformFeedback);
        ASSIGN("glUniform1d", uniform1d);
        ASSIGN("glUniform1dv", uniform1dv);
        ASSIGN("glUniform2d", uniform2d);
        ASSIGN("glUniform2dv", uniform2dv);
        ASSIGN("glUniform3d", uniform3d);
        ASSIGN("glUniform3dv", uniform3dv);
        ASSIGN("glUniform4d", uniform4d);
        ASSIGN("glUniform4dv", uniform4dv);
        ASSIGN("glUniformMatrix2dv", uniformMatrix2dv);
        ASSIGN("glUniformMatrix2x3dv", uniformMatrix2x3dv);
        ASSIGN("glUniformMatrix2x4dv", uniformMatrix2x4dv);
        ASSIGN("glUniformMatrix3dv", uniformMatrix3dv);
        ASSIGN("glUniformMatrix3x2dv", uniformMatrix3x2dv);
        ASSIGN("glUniformMatrix3x4dv", uniformMatrix3x4dv);
        ASSIGN("glUniformMatrix4dv", uniformMatrix4dv);
        ASSIGN("glUniformMatrix4x2dv", uniformMatrix4x2dv);
        ASSIGN("glUniformMatrix4x3dv", uniformMatrix4x3dv);
        ASSIGN("glUniformSubroutinesuiv", uniformSubroutinesuiv);
    }

    if (version >= gl::Version(4, 1))
    {
        ASSIGN("glActiveShaderProgram", activeShaderProgram);
        ASSIGN("glBindProgramPipeline", bindProgramPipeline);
        ASSIGN("glClearDepthf", clearDepthf);
        ASSIGN("glCreateShaderProgramv", createShaderProgramv);
        ASSIGN("glDeleteProgramPipelines", deleteProgramPipelines);
        ASSIGN("glDepthRangeArrayv", depthRangeArrayv);
        ASSIGN("glDepthRangeIndexed", depthRangeIndexed);
        ASSIGN("glDepthRangef", depthRangef);
        ASSIGN("glGenProgramPipelines", genProgramPipelines);
        ASSIGN("glGetDoublei_v", getDoublei_v);
        ASSIGN("glGetFloati_v", getFloati_v);
        ASSIGN("glGetProgramBinary", getProgramBinary);
        ASSIGN("glGetProgramPipelineInfoLog", getProgramPipelineInfoLog);
        ASSIGN("glGetProgramPipelineiv", getProgramPipelineiv);
        ASSIGN("glGetShaderPrecisionFormat", getShaderPrecisionFormat);
        ASSIGN("glGetVertexAttribLdv", getVertexAttribLdv);
        ASSIGN("glIsProgramPipeline", isProgramPipeline);
        ASSIGN("glProgramBinary", programBinary);
        ASSIGN("glProgramParameteri", programParameteri);
        ASSIGN("glProgramUniform1d", programUniform1d);
        ASSIGN("glProgramUniform1dv", programUniform1dv);
        ASSIGN("glProgramUniform1f", programUniform1f);
        ASSIGN("glProgramUniform1fv", programUniform1fv);
        ASSIGN("glProgramUniform1i", programUniform1i);
        ASSIGN("glProgramUniform1iv", programUniform1iv);
        ASSIGN("glProgramUniform1ui", programUniform1ui);
        ASSIGN("glProgramUniform1uiv", programUniform1uiv);
        ASSIGN("glProgramUniform2d", programUniform2d);
        ASSIGN("glProgramUniform2dv", programUniform2dv);
        ASSIGN("glProgramUniform2f", programUniform2f);
        ASSIGN("glProgramUniform2fv", programUniform2fv);
        ASSIGN("glProgramUniform2i", programUniform2i);
        ASSIGN("glProgramUniform2iv", programUniform2iv);
        ASSIGN("glProgramUniform2ui", programUniform2ui);
        ASSIGN("glProgramUniform2uiv", programUniform2uiv);
        ASSIGN("glProgramUniform3d", programUniform3d);
        ASSIGN("glProgramUniform3dv", programUniform3dv);
        ASSIGN("glProgramUniform3f", programUniform3f);
        ASSIGN("glProgramUniform3fv", programUniform3fv);
        ASSIGN("glProgramUniform3i", programUniform3i);
        ASSIGN("glProgramUniform3iv", programUniform3iv);
        ASSIGN("glProgramUniform3ui", programUniform3ui);
        ASSIGN("glProgramUniform3uiv", programUniform3uiv);
        ASSIGN("glProgramUniform4d", programUniform4d);
        ASSIGN("glProgramUniform4dv", programUniform4dv);
        ASSIGN("glProgramUniform4f", programUniform4f);
        ASSIGN("glProgramUniform4fv", programUniform4fv);
        ASSIGN("glProgramUniform4i", programUniform4i);
        ASSIGN("glProgramUniform4iv", programUniform4iv);
        ASSIGN("glProgramUniform4ui", programUniform4ui);
        ASSIGN("glProgramUniform4uiv", programUniform4uiv);
        ASSIGN("glProgramUniformMatrix2dv", programUniformMatrix2dv);
        ASSIGN("glProgramUniformMatrix2fv", programUniformMatrix2fv);
        ASSIGN("glProgramUniformMatrix2x3dv", programUniformMatrix2x3dv);
        ASSIGN("glProgramUniformMatrix2x3fv", programUniformMatrix2x3fv);
        ASSIGN("glProgramUniformMatrix2x4dv", programUniformMatrix2x4dv);
        ASSIGN("glProgramUniformMatrix2x4fv", programUniformMatrix2x4fv);
        ASSIGN("glProgramUniformMatrix3dv", programUniformMatrix3dv);
        ASSIGN("glProgramUniformMatrix3fv", programUniformMatrix3fv);
        ASSIGN("glProgramUniformMatrix3x2dv", programUniformMatrix3x2dv);
        ASSIGN("glProgramUniformMatrix3x2fv", programUniformMatrix3x2fv);
        ASSIGN("glProgramUniformMatrix3x4dv", programUniformMatrix3x4dv);
        ASSIGN("glProgramUniformMatrix3x4fv", programUniformMatrix3x4fv);
        ASSIGN("glProgramUniformMatrix4dv", programUniformMatrix4dv);
        ASSIGN("glProgramUniformMatrix4fv", programUniformMatrix4fv);
        ASSIGN("glProgramUniformMatrix4x2dv", programUniformMatrix4x2dv);
        ASSIGN("glProgramUniformMatrix4x2fv", programUniformMatrix4x2fv);
        ASSIGN("glProgramUniformMatrix4x3dv", programUniformMatrix4x3dv);
        ASSIGN("glProgramUniformMatrix4x3fv", programUniformMatrix4x3fv);
        ASSIGN("glReleaseShaderCompiler", releaseShaderCompiler);
        ASSIGN("glScissorArrayv", scissorArrayv);
        ASSIGN("glScissorIndexed", scissorIndexed);
        ASSIGN("glScissorIndexedv", scissorIndexedv);
        ASSIGN("glShaderBinary", shaderBinary);
        ASSIGN("glUseProgramStages", useProgramStages);
        ASSIGN("glValidateProgramPipeline", validateProgramPipeline);
        ASSIGN("glVertexAttribL1d", vertexAttribL1d);
        ASSIGN("glVertexAttribL1dv", vertexAttribL1dv);
        ASSIGN("glVertexAttribL2d", vertexAttribL2d);
        ASSIGN("glVertexAttribL2dv", vertexAttribL2dv);
        ASSIGN("glVertexAttribL3d", vertexAttribL3d);
        ASSIGN("glVertexAttribL3dv", vertexAttribL3dv);
        ASSIGN("glVertexAttribL4d", vertexAttribL4d);
        ASSIGN("glVertexAttribL4dv", vertexAttribL4dv);
        ASSIGN("glVertexAttribLPointer", vertexAttribLPointer);
        ASSIGN("glViewportArrayv", viewportArrayv);
        ASSIGN("glViewportIndexedf", viewportIndexedf);
        ASSIGN("glViewportIndexedfv", viewportIndexedfv);
    }

    if (version >= gl::Version(4, 2))
    {
        ASSIGN("glBindImageTexture", bindImageTexture);
        ASSIGN("glDrawArraysInstancedBaseInstance", drawArraysInstancedBaseInstance);
        ASSIGN("glDrawElementsInstancedBaseInstance", drawElementsInstancedBaseInstance);
        ASSIGN("glDrawElementsInstancedBaseVertexBaseInstance",
               drawElementsInstancedBaseVertexBaseInstance);
        ASSIGN("glDrawTransformFeedbackInstanced", drawTransformFeedbackInstanced);
        ASSIGN("glDrawTransformFeedbackStreamInstanced", drawTransformFeedbackStreamInstanced);
        ASSIGN("glGetActiveAtomicCounterBufferiv", getActiveAtomicCounterBufferiv);
        ASSIGN("glGetInternalformativ", getInternalformativ);
        ASSIGN("glMemoryBarrier", memoryBarrier);
        ASSIGN("glTexStorage1D", texStorage1D);
        ASSIGN("glTexStorage2D", texStorage2D);
        ASSIGN("glTexStorage3D", texStorage3D);
    }

    if (version >= gl::Version(4, 3))
    {
        ASSIGN("glBindVertexBuffer", bindVertexBuffer);
        ASSIGN("glClearBufferData", clearBufferData);
        ASSIGN("glClearBufferSubData", clearBufferSubData);
        ASSIGN("glCopyImageSubData", copyImageSubData);
        ASSIGN("glDebugMessageCallback", debugMessageCallback);
        ASSIGN("glDebugMessageControl", debugMessageControl);
        ASSIGN("glDebugMessageInsert", debugMessageInsert);
        ASSIGN("glDispatchCompute", dispatchCompute);
        ASSIGN("glDispatchComputeIndirect", dispatchComputeIndirect);
        ASSIGN("glFramebufferParameteri", framebufferParameteri);
        ASSIGN("glGetDebugMessageLog", getDebugMessageLog);
        ASSIGN("glGetFramebufferParameteriv", getFramebufferParameteriv);
        ASSIGN("glGetInternalformati64v", getInternalformati64v);
        ASSIGN("glGetObjectLabel", getObjectLabel);
        ASSIGN("glGetObjectPtrLabel", getObjectPtrLabel);
        ASSIGN("glGetPointerv", getPointerv);
        ASSIGN("glGetProgramInterfaceiv", getProgramInterfaceiv);
        ASSIGN("glGetProgramResourceIndex", getProgramResourceIndex);
        ASSIGN("glGetProgramResourceLocation", getProgramResourceLocation);
        ASSIGN("glGetProgramResourceLocationIndex", getProgramResourceLocationIndex);
        ASSIGN("glGetProgramResourceName", getProgramResourceName);
        ASSIGN("glGetProgramResourceiv", getProgramResourceiv);
        ASSIGN("glInvalidateBufferData", invalidateBufferData);
        ASSIGN("glInvalidateBufferSubData", invalidateBufferSubData);
        ASSIGN("glInvalidateFramebuffer", invalidateFramebuffer);
        ASSIGN("glInvalidateSubFramebuffer", invalidateSubFramebuffer);
        ASSIGN("glInvalidateTexImage", invalidateTexImage);
        ASSIGN("glInvalidateTexSubImage", invalidateTexSubImage);
        ASSIGN("glMultiDrawArraysIndirect", multiDrawArraysIndirect);
        ASSIGN("glMultiDrawElementsIndirect", multiDrawElementsIndirect);
        ASSIGN("glObjectLabel", objectLabel);
        ASSIGN("glObjectPtrLabel", objectPtrLabel);
        ASSIGN("glPopDebugGroup", popDebugGroup);
        ASSIGN("glPushDebugGroup", pushDebugGroup);
        ASSIGN("glShaderStorageBlockBinding", shaderStorageBlockBinding);
        ASSIGN("glTexBufferRange", texBufferRange);
        ASSIGN("glTexStorage2DMultisample", texStorage2DMultisample);
        ASSIGN("glTexStorage3DMultisample", texStorage3DMultisample);
        ASSIGN("glTextureView", textureView);
        ASSIGN("glVertexAttribBinding", vertexAttribBinding);
        ASSIGN("glVertexAttribFormat", vertexAttribFormat);
        ASSIGN("glVertexAttribIFormat", vertexAttribIFormat);
        ASSIGN("glVertexAttribLFormat", vertexAttribLFormat);
        ASSIGN("glVertexBindingDivisor", vertexBindingDivisor);
    }

    if (version >= gl::Version(4, 4))
    {
        ASSIGN("glBindBuffersBase", bindBuffersBase);
        ASSIGN("glBindBuffersRange", bindBuffersRange);
        ASSIGN("glBindImageTextures", bindImageTextures);
        ASSIGN("glBindSamplers", bindSamplers);
        ASSIGN("glBindTextures", bindTextures);
        ASSIGN("glBindVertexBuffers", bindVertexBuffers);
        ASSIGN("glBufferStorage", bufferStorage);
        ASSIGN("glClearTexImage", clearTexImage);
        ASSIGN("glClearTexSubImage", clearTexSubImage);
    }

    if (version >= gl::Version(4, 5))
    {
        ASSIGN("glBindTextureUnit", bindTextureUnit);
        ASSIGN("glBlitNamedFramebuffer", blitNamedFramebuffer);
        ASSIGN("glCheckNamedFramebufferStatus", checkNamedFramebufferStatus);
        ASSIGN("glClearNamedBufferData", clearNamedBufferData);
        ASSIGN("glClearNamedBufferSubData", clearNamedBufferSubData);
        ASSIGN("glClearNamedFramebufferfi", clearNamedFramebufferfi);
        ASSIGN("glClearNamedFramebufferfv", clearNamedFramebufferfv);
        ASSIGN("glClearNamedFramebufferiv", clearNamedFramebufferiv);
        ASSIGN("glClearNamedFramebufferuiv", clearNamedFramebufferuiv);
        ASSIGN("glClipControl", clipControl);
        ASSIGN("glCompressedTextureSubImage1D", compressedTextureSubImage1D);
        ASSIGN("glCompressedTextureSubImage2D", compressedTextureSubImage2D);
        ASSIGN("glCompressedTextureSubImage3D", compressedTextureSubImage3D);
        ASSIGN("glCopyNamedBufferSubData", copyNamedBufferSubData);
        ASSIGN("glCopyTextureSubImage1D", copyTextureSubImage1D);
        ASSIGN("glCopyTextureSubImage2D", copyTextureSubImage2D);
        ASSIGN("glCopyTextureSubImage3D", copyTextureSubImage3D);
        ASSIGN("glCreateBuffers", createBuffers);
        ASSIGN("glCreateFramebuffers", createFramebuffers);
        ASSIGN("glCreateProgramPipelines", createProgramPipelines);
        ASSIGN("glCreateQueries", createQueries);
        ASSIGN("glCreateRenderbuffers", createRenderbuffers);
        ASSIGN("glCreateSamplers", createSamplers);
        ASSIGN("glCreateTextures", createTextures);
        ASSIGN("glCreateTransformFeedbacks", createTransformFeedbacks);
        ASSIGN("glCreateVertexArrays", createVertexArrays);
        ASSIGN("glDisableVertexArrayAttrib", disableVertexArrayAttrib);
        ASSIGN("glEnableVertexArrayAttrib", enableVertexArrayAttrib);
        ASSIGN("glFlushMappedNamedBufferRange", flushMappedNamedBufferRange);
        ASSIGN("glGenerateTextureMipmap", generateTextureMipmap);
        ASSIGN("glGetCompressedTextureImage", getCompressedTextureImage);
        ASSIGN("glGetCompressedTextureSubImage", getCompressedTextureSubImage);
        ASSIGN("glGetGraphicsResetStatus", getGraphicsResetStatus);
        ASSIGN("glGetNamedBufferParameteri64v", getNamedBufferParameteri64v);
        ASSIGN("glGetNamedBufferParameteriv", getNamedBufferParameteriv);
        ASSIGN("glGetNamedBufferPointerv", getNamedBufferPointerv);
        ASSIGN("glGetNamedBufferSubData", getNamedBufferSubData);
        ASSIGN("glGetNamedFramebufferAttachmentParameteriv",
               getNamedFramebufferAttachmentParameteriv);
        ASSIGN("glGetNamedFramebufferParameteriv", getNamedFramebufferParameteriv);
        ASSIGN("glGetNamedRenderbufferParameteriv", getNamedRenderbufferParameteriv);
        ASSIGN("glGetQueryBufferObjecti64v", getQueryBufferObjecti64v);
        ASSIGN("glGetQueryBufferObjectiv", getQueryBufferObjectiv);
        ASSIGN("glGetQueryBufferObjectui64v", getQueryBufferObjectui64v);
        ASSIGN("glGetQueryBufferObjectuiv", getQueryBufferObjectuiv);
        ASSIGN("glGetTextureImage", getTextureImage);
        ASSIGN("glGetTextureLevelParameterfv", getTextureLevelParameterfv);
        ASSIGN("glGetTextureLevelParameteriv", getTextureLevelParameteriv);
        ASSIGN("glGetTextureParameterIiv", getTextureParameterIiv);
        ASSIGN("glGetTextureParameterIuiv", getTextureParameterIuiv);
        ASSIGN("glGetTextureParameterfv", getTextureParameterfv);
        ASSIGN("glGetTextureParameteriv", getTextureParameteriv);
        ASSIGN("glGetTextureSubImage", getTextureSubImage);
        ASSIGN("glGetTransformFeedbacki64_v", getTransformFeedbacki64_v);
        ASSIGN("glGetTransformFeedbacki_v", getTransformFeedbacki_v);
        ASSIGN("glGetTransformFeedbackiv", getTransformFeedbackiv);
        ASSIGN("glGetVertexArrayIndexed64iv", getVertexArrayIndexed64iv);
        ASSIGN("glGetVertexArrayIndexediv", getVertexArrayIndexediv);
        ASSIGN("glGetVertexArrayiv", getVertexArrayiv);
        ASSIGN("glGetnCompressedTexImage", getnCompressedTexImage);
        ASSIGN("glGetnTexImage", getnTexImage);
        ASSIGN("glGetnUniformdv", getnUniformdv);
        ASSIGN("glGetnUniformfv", getnUniformfv);
        ASSIGN("glGetnUniformiv", getnUniformiv);
        ASSIGN("glGetnUniformuiv", getnUniformuiv);
        ASSIGN("glInvalidateNamedFramebufferData", invalidateNamedFramebufferData);
        ASSIGN("glInvalidateNamedFramebufferSubData", invalidateNamedFramebufferSubData);
        ASSIGN("glMapNamedBuffer", mapNamedBuffer);
        ASSIGN("glMapNamedBufferRange", mapNamedBufferRange);
        ASSIGN("glMemoryBarrierByRegion", memoryBarrierByRegion);
        ASSIGN("glNamedBufferData", namedBufferData);
        ASSIGN("glNamedBufferStorage", namedBufferStorage);
        ASSIGN("glNamedBufferSubData", namedBufferSubData);
        ASSIGN("glNamedFramebufferDrawBuffer", namedFramebufferDrawBuffer);
        ASSIGN("glNamedFramebufferDrawBuffers", namedFramebufferDrawBuffers);
        ASSIGN("glNamedFramebufferParameteri", namedFramebufferParameteri);
        ASSIGN("glNamedFramebufferReadBuffer", namedFramebufferReadBuffer);
        ASSIGN("glNamedFramebufferRenderbuffer", namedFramebufferRenderbuffer);
        ASSIGN("glNamedFramebufferTexture", namedFramebufferTexture);
        ASSIGN("glNamedFramebufferTextureLayer", namedFramebufferTextureLayer);
        ASSIGN("glNamedRenderbufferStorage", namedRenderbufferStorage);
        ASSIGN("glNamedRenderbufferStorageMultisample", namedRenderbufferStorageMultisample);
        ASSIGN("glReadnPixels", readnPixels);
        ASSIGN("glTextureBarrier", textureBarrier);
        ASSIGN("glTextureBuffer", textureBuffer);
        ASSIGN("glTextureBufferRange", textureBufferRange);
        ASSIGN("glTextureParameterIiv", textureParameterIiv);
        ASSIGN("glTextureParameterIuiv", textureParameterIuiv);
        ASSIGN("glTextureParameterf", textureParameterf);
        ASSIGN("glTextureParameterfv", textureParameterfv);
        ASSIGN("glTextureParameteri", textureParameteri);
        ASSIGN("glTextureParameteriv", textureParameteriv);
        ASSIGN("glTextureStorage1D", textureStorage1D);
        ASSIGN("glTextureStorage2D", textureStorage2D);
        ASSIGN("glTextureStorage2DMultisample", textureStorage2DMultisample);
        ASSIGN("glTextureStorage3D", textureStorage3D);
        ASSIGN("glTextureStorage3DMultisample", textureStorage3DMultisample);
        ASSIGN("glTextureSubImage1D", textureSubImage1D);
        ASSIGN("glTextureSubImage2D", textureSubImage2D);
        ASSIGN("glTextureSubImage3D", textureSubImage3D);
        ASSIGN("glTransformFeedbackBufferBase", transformFeedbackBufferBase);
        ASSIGN("glTransformFeedbackBufferRange", transformFeedbackBufferRange);
        ASSIGN("glUnmapNamedBuffer", unmapNamedBuffer);
        ASSIGN("glVertexArrayAttribBinding", vertexArrayAttribBinding);
        ASSIGN("glVertexArrayAttribFormat", vertexArrayAttribFormat);
        ASSIGN("glVertexArrayAttribIFormat", vertexArrayAttribIFormat);
        ASSIGN("glVertexArrayAttribLFormat", vertexArrayAttribLFormat);
        ASSIGN("glVertexArrayBindingDivisor", vertexArrayBindingDivisor);
        ASSIGN("glVertexArrayElementBuffer", vertexArrayElementBuffer);
        ASSIGN("glVertexArrayVertexBuffer", vertexArrayVertexBuffer);
        ASSIGN("glVertexArrayVertexBuffers", vertexArrayVertexBuffers);
    }

    if (extensions.count("GL_ARB_ES2_compatibility") != 0)
    {
        ASSIGN("glClearDepthf", clearDepthf);
        ASSIGN("glDepthRangef", depthRangef);
        ASSIGN("glGetShaderPrecisionFormat", getShaderPrecisionFormat);
        ASSIGN("glReleaseShaderCompiler", releaseShaderCompiler);
        ASSIGN("glShaderBinary", shaderBinary);
    }

    if (extensions.count("GL_ARB_ES3_1_compatibility") != 0)
    {
        ASSIGN("glMemoryBarrierByRegion", memoryBarrierByRegion);
    }

    if (extensions.count("GL_ARB_ES3_2_compatibility") != 0)
    {
        ASSIGN("glPrimitiveBoundingBoxARB", primitiveBoundingBox);
    }

    if (extensions.count("GL_ARB_base_instance") != 0)
    {
        ASSIGN("glDrawArraysInstancedBaseInstance", drawArraysInstancedBaseInstance);
        ASSIGN("glDrawElementsInstancedBaseInstance", drawElementsInstancedBaseInstance);
        ASSIGN("glDrawElementsInstancedBaseVertexBaseInstance",
               drawElementsInstancedBaseVertexBaseInstance);
    }

    if (extensions.count("GL_ARB_blend_func_extended") != 0)
    {
        ASSIGN("glBindFragDataLocationIndexed", bindFragDataLocationIndexed);
        ASSIGN("glGetFragDataIndex", getFragDataIndex);
    }

    if (extensions.count("GL_ARB_buffer_storage") != 0)
    {
        ASSIGN("glBufferStorage", bufferStorage);
    }

    if (extensions.count("GL_ARB_clear_buffer_object") != 0)
    {
        ASSIGN("glClearBufferData", clearBufferData);
        ASSIGN("glClearBufferSubData", clearBufferSubData);
    }

    if (extensions.count("GL_ARB_clear_texture") != 0)
    {
        ASSIGN("glClearTexImage", clearTexImage);
        ASSIGN("glClearTexSubImage", clearTexSubImage);
    }

    if (extensions.count("GL_ARB_clip_control") != 0)
    {
        ASSIGN("glClipControl", clipControl);
    }

    if (extensions.count("GL_ARB_color_buffer_float") != 0)
    {
        ASSIGN("glClampColorARB", clampColor);
    }

    if (extensions.count("GL_ARB_compute_shader") != 0)
    {
        ASSIGN("glDispatchCompute", dispatchCompute);
        ASSIGN("glDispatchComputeIndirect", dispatchComputeIndirect);
    }

    if (extensions.count("GL_ARB_copy_buffer") != 0)
    {
        ASSIGN("glCopyBufferSubData", copyBufferSubData);
    }

    if (extensions.count("GL_ARB_copy_image") != 0)
    {
        ASSIGN("glCopyImageSubData", copyImageSubData);
    }

    if (extensions.count("GL_ARB_debug_output") != 0)
    {
        ASSIGN("glDebugMessageCallbackARB", debugMessageCallback);
        ASSIGN("glDebugMessageControlARB", debugMessageControl);
        ASSIGN("glDebugMessageInsertARB", debugMessageInsert);
        ASSIGN("glGetDebugMessageLogARB", getDebugMessageLog);
    }

    if (extensions.count("GL_ARB_direct_state_access") != 0)
    {
        ASSIGN("glBindTextureUnit", bindTextureUnit);
        ASSIGN("glBlitNamedFramebuffer", blitNamedFramebuffer);
        ASSIGN("glCheckNamedFramebufferStatus", checkNamedFramebufferStatus);
        ASSIGN("glClearNamedBufferData", clearNamedBufferData);
        ASSIGN("glClearNamedBufferSubData", clearNamedBufferSubData);
        ASSIGN("glClearNamedFramebufferfi", clearNamedFramebufferfi);
        ASSIGN("glClearNamedFramebufferfv", clearNamedFramebufferfv);
        ASSIGN("glClearNamedFramebufferiv", clearNamedFramebufferiv);
        ASSIGN("glClearNamedFramebufferuiv", clearNamedFramebufferuiv);
        ASSIGN("glCompressedTextureSubImage1D", compressedTextureSubImage1D);
        ASSIGN("glCompressedTextureSubImage2D", compressedTextureSubImage2D);
        ASSIGN("glCompressedTextureSubImage3D", compressedTextureSubImage3D);
        ASSIGN("glCopyNamedBufferSubData", copyNamedBufferSubData);
        ASSIGN("glCopyTextureSubImage1D", copyTextureSubImage1D);
        ASSIGN("glCopyTextureSubImage2D", copyTextureSubImage2D);
        ASSIGN("glCopyTextureSubImage3D", copyTextureSubImage3D);
        ASSIGN("glCreateBuffers", createBuffers);
        ASSIGN("glCreateFramebuffers", createFramebuffers);
        ASSIGN("glCreateProgramPipelines", createProgramPipelines);
        ASSIGN("glCreateQueries", createQueries);
        ASSIGN("glCreateRenderbuffers", createRenderbuffers);
        ASSIGN("glCreateSamplers", createSamplers);
        ASSIGN("glCreateTextures", createTextures);
        ASSIGN("glCreateTransformFeedbacks", createTransformFeedbacks);
        ASSIGN("glCreateVertexArrays", createVertexArrays);
        ASSIGN("glDisableVertexArrayAttrib", disableVertexArrayAttrib);
        ASSIGN("glEnableVertexArrayAttrib", enableVertexArrayAttrib);
        ASSIGN("glFlushMappedNamedBufferRange", flushMappedNamedBufferRange);
        ASSIGN("glGenerateTextureMipmap", generateTextureMipmap);
        ASSIGN("glGetCompressedTextureImage", getCompressedTextureImage);
        ASSIGN("glGetNamedBufferParameteri64v", getNamedBufferParameteri64v);
        ASSIGN("glGetNamedBufferParameteriv", getNamedBufferParameteriv);
        ASSIGN("glGetNamedBufferPointerv", getNamedBufferPointerv);
        ASSIGN("glGetNamedBufferSubData", getNamedBufferSubData);
        ASSIGN("glGetNamedFramebufferAttachmentParameteriv",
               getNamedFramebufferAttachmentParameteriv);
        ASSIGN("glGetNamedFramebufferParameteriv", getNamedFramebufferParameteriv);
        ASSIGN("glGetNamedRenderbufferParameteriv", getNamedRenderbufferParameteriv);
        ASSIGN("glGetQueryBufferObjecti64v", getQueryBufferObjecti64v);
        ASSIGN("glGetQueryBufferObjectiv", getQueryBufferObjectiv);
        ASSIGN("glGetQueryBufferObjectui64v", getQueryBufferObjectui64v);
        ASSIGN("glGetQueryBufferObjectuiv", getQueryBufferObjectuiv);
        ASSIGN("glGetTextureImage", getTextureImage);
        ASSIGN("glGetTextureLevelParameterfv", getTextureLevelParameterfv);
        ASSIGN("glGetTextureLevelParameteriv", getTextureLevelParameteriv);
        ASSIGN("glGetTextureParameterIiv", getTextureParameterIiv);
        ASSIGN("glGetTextureParameterIuiv", getTextureParameterIuiv);
        ASSIGN("glGetTextureParameterfv", getTextureParameterfv);
        ASSIGN("glGetTextureParameteriv", getTextureParameteriv);
        ASSIGN("glGetTransformFeedbacki64_v", getTransformFeedbacki64_v);
        ASSIGN("glGetTransformFeedbacki_v", getTransformFeedbacki_v);
        ASSIGN("glGetTransformFeedbackiv", getTransformFeedbackiv);
        ASSIGN("glGetVertexArrayIndexed64iv", getVertexArrayIndexed64iv);
        ASSIGN("glGetVertexArrayIndexediv", getVertexArrayIndexediv);
        ASSIGN("glGetVertexArrayiv", getVertexArrayiv);
        ASSIGN("glInvalidateNamedFramebufferData", invalidateNamedFramebufferData);
        ASSIGN("glInvalidateNamedFramebufferSubData", invalidateNamedFramebufferSubData);
        ASSIGN("glMapNamedBuffer", mapNamedBuffer);
        ASSIGN("glMapNamedBufferRange", mapNamedBufferRange);
        ASSIGN("glNamedBufferData", namedBufferData);
        ASSIGN("glNamedBufferStorage", namedBufferStorage);
        ASSIGN("glNamedBufferSubData", namedBufferSubData);
        ASSIGN("glNamedFramebufferDrawBuffer", namedFramebufferDrawBuffer);
        ASSIGN("glNamedFramebufferDrawBuffers", namedFramebufferDrawBuffers);
        ASSIGN("glNamedFramebufferParameteri", namedFramebufferParameteri);
        ASSIGN("glNamedFramebufferReadBuffer", namedFramebufferReadBuffer);
        ASSIGN("glNamedFramebufferRenderbuffer", namedFramebufferRenderbuffer);
        ASSIGN("glNamedFramebufferTexture", namedFramebufferTexture);
        ASSIGN("glNamedFramebufferTextureLayer", namedFramebufferTextureLayer);
        ASSIGN("glNamedRenderbufferStorage", namedRenderbufferStorage);
        ASSIGN("glNamedRenderbufferStorageMultisample", namedRenderbufferStorageMultisample);
        ASSIGN("glTextureBuffer", textureBuffer);
        ASSIGN("glTextureBufferRange", textureBufferRange);
        ASSIGN("glTextureParameterIiv", textureParameterIiv);
        ASSIGN("glTextureParameterIuiv", textureParameterIuiv);
        ASSIGN("glTextureParameterf", textureParameterf);
        ASSIGN("glTextureParameterfv", textureParameterfv);
        ASSIGN("glTextureParameteri", textureParameteri);
        ASSIGN("glTextureParameteriv", textureParameteriv);
        ASSIGN("glTextureStorage1D", textureStorage1D);
        ASSIGN("glTextureStorage2D", textureStorage2D);
        ASSIGN("glTextureStorage2DMultisample", textureStorage2DMultisample);
        ASSIGN("glTextureStorage3D", textureStorage3D);
        ASSIGN("glTextureStorage3DMultisample", textureStorage3DMultisample);
        ASSIGN("glTextureSubImage1D", textureSubImage1D);
        ASSIGN("glTextureSubImage2D", textureSubImage2D);
        ASSIGN("glTextureSubImage3D", textureSubImage3D);
        ASSIGN("glTransformFeedbackBufferBase", transformFeedbackBufferBase);
        ASSIGN("glTransformFeedbackBufferRange", transformFeedbackBufferRange);
        ASSIGN("glUnmapNamedBuffer", unmapNamedBuffer);
        ASSIGN("glVertexArrayAttribBinding", vertexArrayAttribBinding);
        ASSIGN("glVertexArrayAttribFormat", vertexArrayAttribFormat);
        ASSIGN("glVertexArrayAttribIFormat", vertexArrayAttribIFormat);
        ASSIGN("glVertexArrayAttribLFormat", vertexArrayAttribLFormat);
        ASSIGN("glVertexArrayBindingDivisor", vertexArrayBindingDivisor);
        ASSIGN("glVertexArrayElementBuffer", vertexArrayElementBuffer);
        ASSIGN("glVertexArrayVertexBuffer", vertexArrayVertexBuffer);
        ASSIGN("glVertexArrayVertexBuffers", vertexArrayVertexBuffers);
    }

    if (extensions.count("GL_ARB_draw_buffers") != 0)
    {
        ASSIGN("glDrawBuffersARB", drawBuffers);
    }

    if (extensions.count("GL_ARB_draw_buffers_blend") != 0)
    {
        ASSIGN("glBlendEquationSeparateiARB", blendEquationSeparatei);
        ASSIGN("glBlendEquationiARB", blendEquationi);
        ASSIGN("glBlendFuncSeparateiARB", blendFuncSeparatei);
        ASSIGN("glBlendFunciARB", blendFunci);
    }

    if (extensions.count("GL_ARB_draw_elements_base_vertex") != 0)
    {
        ASSIGN("glDrawElementsBaseVertex", drawElementsBaseVertex);
        ASSIGN("glDrawElementsInstancedBaseVertex", drawElementsInstancedBaseVertex);
        ASSIGN("glDrawRangeElementsBaseVertex", drawRangeElementsBaseVertex);
        ASSIGN("glMultiDrawElementsBaseVertex", multiDrawElementsBaseVertex);
    }

    if (extensions.count("GL_ARB_draw_indirect") != 0)
    {
        ASSIGN("glDrawArraysIndirect", drawArraysIndirect);
        ASSIGN("glDrawElementsIndirect", drawElementsIndirect);
    }

    if (extensions.count("GL_ARB_draw_instanced") != 0)
    {
        ASSIGN("glDrawArraysInstancedARB", drawArraysInstanced);
        ASSIGN("glDrawElementsInstancedARB", drawElementsInstanced);
    }

    if (extensions.count("GL_ARB_fragment_program") != 0)
    {
        ASSIGN("glGetProgramivARB", getProgramiv);
        ASSIGN("glIsProgramARB", isProgram);
    }

    if (extensions.count("GL_ARB_framebuffer_no_attachments") != 0)
    {
        ASSIGN("glFramebufferParameteri", framebufferParameteri);
        ASSIGN("glGetFramebufferParameteriv", getFramebufferParameteriv);
    }

    if (extensions.count("GL_ARB_framebuffer_object") != 0)
    {
        ASSIGN("glBindFramebuffer", bindFramebuffer);
        ASSIGN("glBindRenderbuffer", bindRenderbuffer);
        ASSIGN("glBlitFramebuffer", blitFramebuffer);
        ASSIGN("glCheckFramebufferStatus", checkFramebufferStatus);
        ASSIGN("glDeleteFramebuffers", deleteFramebuffers);
        ASSIGN("glDeleteRenderbuffers", deleteRenderbuffers);
        ASSIGN("glFramebufferRenderbuffer", framebufferRenderbuffer);
        ASSIGN("glFramebufferTexture1D", framebufferTexture1D);
        ASSIGN("glFramebufferTexture2D", framebufferTexture2D);
        ASSIGN("glFramebufferTexture3D", framebufferTexture3D);
        ASSIGN("glFramebufferTextureLayer", framebufferTextureLayer);
        ASSIGN("glGenFramebuffers", genFramebuffers);
        ASSIGN("glGenRenderbuffers", genRenderbuffers);
        ASSIGN("glGenerateMipmap", generateMipmap);
        ASSIGN("glGetFramebufferAttachmentParameteriv", getFramebufferAttachmentParameteriv);
        ASSIGN("glGetRenderbufferParameteriv", getRenderbufferParameteriv);
        ASSIGN("glIsFramebuffer", isFramebuffer);
        ASSIGN("glIsRenderbuffer", isRenderbuffer);
        ASSIGN("glRenderbufferStorage", renderbufferStorage);
        ASSIGN("glRenderbufferStorageMultisample", renderbufferStorageMultisample);
    }

    if (extensions.count("GL_ARB_geometry_shader4") != 0)
    {
        ASSIGN("glFramebufferTextureARB", framebufferTexture);
        ASSIGN("glFramebufferTextureLayerARB", framebufferTextureLayer);
        ASSIGN("glProgramParameteriARB", programParameteri);
    }

    if (extensions.count("GL_ARB_get_program_binary") != 0)
    {
        ASSIGN("glGetProgramBinary", getProgramBinary);
        ASSIGN("glProgramBinary", programBinary);
        ASSIGN("glProgramParameteri", programParameteri);
    }

    if (extensions.count("GL_ARB_get_texture_sub_image") != 0)
    {
        ASSIGN("glGetCompressedTextureSubImage", getCompressedTextureSubImage);
        ASSIGN("glGetTextureSubImage", getTextureSubImage);
    }

    if (extensions.count("GL_ARB_gpu_shader_fp64") != 0)
    {
        ASSIGN("glGetUniformdv", getUniformdv);
        ASSIGN("glUniform1d", uniform1d);
        ASSIGN("glUniform1dv", uniform1dv);
        ASSIGN("glUniform2d", uniform2d);
        ASSIGN("glUniform2dv", uniform2dv);
        ASSIGN("glUniform3d", uniform3d);
        ASSIGN("glUniform3dv", uniform3dv);
        ASSIGN("glUniform4d", uniform4d);
        ASSIGN("glUniform4dv", uniform4dv);
        ASSIGN("glUniformMatrix2dv", uniformMatrix2dv);
        ASSIGN("glUniformMatrix2x3dv", uniformMatrix2x3dv);
        ASSIGN("glUniformMatrix2x4dv", uniformMatrix2x4dv);
        ASSIGN("glUniformMatrix3dv", uniformMatrix3dv);
        ASSIGN("glUniformMatrix3x2dv", uniformMatrix3x2dv);
        ASSIGN("glUniformMatrix3x4dv", uniformMatrix3x4dv);
        ASSIGN("glUniformMatrix4dv", uniformMatrix4dv);
        ASSIGN("glUniformMatrix4x2dv", uniformMatrix4x2dv);
        ASSIGN("glUniformMatrix4x3dv", uniformMatrix4x3dv);
    }

    if (extensions.count("GL_ARB_imaging") != 0)
    {
        ASSIGN("glBlendColor", blendColor);
        ASSIGN("glBlendEquation", blendEquation);
    }

    if (extensions.count("GL_ARB_instanced_arrays") != 0)
    {
        ASSIGN("glVertexAttribDivisorARB", vertexAttribDivisor);
    }

    if (extensions.count("GL_ARB_internalformat_query") != 0)
    {
        ASSIGN("glGetInternalformativ", getInternalformativ);
    }

    if (extensions.count("GL_ARB_internalformat_query2") != 0)
    {
        ASSIGN("glGetInternalformati64v", getInternalformati64v);
    }

    if (extensions.count("GL_ARB_invalidate_subdata") != 0)
    {
        ASSIGN("glInvalidateBufferData", invalidateBufferData);
        ASSIGN("glInvalidateBufferSubData", invalidateBufferSubData);
        ASSIGN("glInvalidateFramebuffer", invalidateFramebuffer);
        ASSIGN("glInvalidateSubFramebuffer", invalidateSubFramebuffer);
        ASSIGN("glInvalidateTexImage", invalidateTexImage);
        ASSIGN("glInvalidateTexSubImage", invalidateTexSubImage);
    }

    if (extensions.count("GL_ARB_map_buffer_range") != 0)
    {
        ASSIGN("glFlushMappedBufferRange", flushMappedBufferRange);
        ASSIGN("glMapBufferRange", mapBufferRange);
    }

    if (extensions.count("GL_ARB_multi_bind") != 0)
    {
        ASSIGN("glBindBuffersBase", bindBuffersBase);
        ASSIGN("glBindBuffersRange", bindBuffersRange);
        ASSIGN("glBindImageTextures", bindImageTextures);
        ASSIGN("glBindSamplers", bindSamplers);
        ASSIGN("glBindTextures", bindTextures);
        ASSIGN("glBindVertexBuffers", bindVertexBuffers);
    }

    if (extensions.count("GL_ARB_multi_draw_indirect") != 0)
    {
        ASSIGN("glMultiDrawArraysIndirect", multiDrawArraysIndirect);
        ASSIGN("glMultiDrawElementsIndirect", multiDrawElementsIndirect);
    }

    if (extensions.count("GL_ARB_multisample") != 0)
    {
        ASSIGN("glSampleCoverageARB", sampleCoverage);
    }

    if (extensions.count("GL_ARB_multitexture") != 0)
    {
        ASSIGN("glActiveTextureARB", activeTexture);
    }

    if (extensions.count("GL_ARB_occlusion_query") != 0)
    {
        ASSIGN("glBeginQueryARB", beginQuery);
        ASSIGN("glDeleteQueriesARB", deleteQueries);
        ASSIGN("glEndQueryARB", endQuery);
        ASSIGN("glGenQueriesARB", genQueries);
        ASSIGN("glGetQueryObjectivARB", getQueryObjectiv);
        ASSIGN("glGetQueryObjectuivARB", getQueryObjectuiv);
        ASSIGN("glGetQueryivARB", getQueryiv);
        ASSIGN("glIsQueryARB", isQuery);
    }

    if (extensions.count("GL_ARB_point_parameters") != 0)
    {
        ASSIGN("glPointParameterfARB", pointParameterf);
        ASSIGN("glPointParameterfvARB", pointParameterfv);
    }

    if (extensions.count("GL_ARB_program_interface_query") != 0)
    {
        ASSIGN("glGetProgramInterfaceiv", getProgramInterfaceiv);
        ASSIGN("glGetProgramResourceIndex", getProgramResourceIndex);
        ASSIGN("glGetProgramResourceLocation", getProgramResourceLocation);
        ASSIGN("glGetProgramResourceLocationIndex", getProgramResourceLocationIndex);
        ASSIGN("glGetProgramResourceName", getProgramResourceName);
        ASSIGN("glGetProgramResourceiv", getProgramResourceiv);
    }

    if (extensions.count("GL_ARB_provoking_vertex") != 0)
    {
        ASSIGN("glProvokingVertex", provokingVertex);
    }

    if (extensions.count("GL_ARB_robustness") != 0)
    {
        ASSIGN("glGetGraphicsResetStatusARB", getGraphicsResetStatus);
        ASSIGN("glGetnCompressedTexImageARB", getnCompressedTexImage);
        ASSIGN("glGetnTexImageARB", getnTexImage);
        ASSIGN("glGetnUniformdvARB", getnUniformdv);
        ASSIGN("glGetnUniformfvARB", getnUniformfv);
        ASSIGN("glGetnUniformivARB", getnUniformiv);
        ASSIGN("glGetnUniformuivARB", getnUniformuiv);
        ASSIGN("glReadnPixelsARB", readnPixels);
    }

    if (extensions.count("GL_ARB_sample_shading") != 0)
    {
        ASSIGN("glMinSampleShadingARB", minSampleShading);
    }

    if (extensions.count("GL_ARB_sampler_objects") != 0)
    {
        ASSIGN("glBindSampler", bindSampler);
        ASSIGN("glDeleteSamplers", deleteSamplers);
        ASSIGN("glGenSamplers", genSamplers);
        ASSIGN("glGetSamplerParameterIiv", getSamplerParameterIiv);
        ASSIGN("glGetSamplerParameterIuiv", getSamplerParameterIuiv);
        ASSIGN("glGetSamplerParameterfv", getSamplerParameterfv);
        ASSIGN("glGetSamplerParameteriv", getSamplerParameteriv);
        ASSIGN("glIsSampler", isSampler);
        ASSIGN("glSamplerParameterIiv", samplerParameterIiv);
        ASSIGN("glSamplerParameterIuiv", samplerParameterIuiv);
        ASSIGN("glSamplerParameterf", samplerParameterf);
        ASSIGN("glSamplerParameterfv", samplerParameterfv);
        ASSIGN("glSamplerParameteri", samplerParameteri);
        ASSIGN("glSamplerParameteriv", samplerParameteriv);
    }

    if (extensions.count("GL_ARB_separate_shader_objects") != 0)
    {
        ASSIGN("glActiveShaderProgram", activeShaderProgram);
        ASSIGN("glBindProgramPipeline", bindProgramPipeline);
        ASSIGN("glCreateShaderProgramv", createShaderProgramv);
        ASSIGN("glDeleteProgramPipelines", deleteProgramPipelines);
        ASSIGN("glGenProgramPipelines", genProgramPipelines);
        ASSIGN("glGetProgramPipelineInfoLog", getProgramPipelineInfoLog);
        ASSIGN("glGetProgramPipelineiv", getProgramPipelineiv);
        ASSIGN("glIsProgramPipeline", isProgramPipeline);
        ASSIGN("glProgramUniform1d", programUniform1d);
        ASSIGN("glProgramUniform1dv", programUniform1dv);
        ASSIGN("glProgramUniform1f", programUniform1f);
        ASSIGN("glProgramUniform1fv", programUniform1fv);
        ASSIGN("glProgramUniform1i", programUniform1i);
        ASSIGN("glProgramUniform1iv", programUniform1iv);
        ASSIGN("glProgramUniform1ui", programUniform1ui);
        ASSIGN("glProgramUniform1uiv", programUniform1uiv);
        ASSIGN("glProgramUniform2d", programUniform2d);
        ASSIGN("glProgramUniform2dv", programUniform2dv);
        ASSIGN("glProgramUniform2f", programUniform2f);
        ASSIGN("glProgramUniform2fv", programUniform2fv);
        ASSIGN("glProgramUniform2i", programUniform2i);
        ASSIGN("glProgramUniform2iv", programUniform2iv);
        ASSIGN("glProgramUniform2ui", programUniform2ui);
        ASSIGN("glProgramUniform2uiv", programUniform2uiv);
        ASSIGN("glProgramUniform3d", programUniform3d);
        ASSIGN("glProgramUniform3dv", programUniform3dv);
        ASSIGN("glProgramUniform3f", programUniform3f);
        ASSIGN("glProgramUniform3fv", programUniform3fv);
        ASSIGN("glProgramUniform3i", programUniform3i);
        ASSIGN("glProgramUniform3iv", programUniform3iv);
        ASSIGN("glProgramUniform3ui", programUniform3ui);
        ASSIGN("glProgramUniform3uiv", programUniform3uiv);
        ASSIGN("glProgramUniform4d", programUniform4d);
        ASSIGN("glProgramUniform4dv", programUniform4dv);
        ASSIGN("glProgramUniform4f", programUniform4f);
        ASSIGN("glProgramUniform4fv", programUniform4fv);
        ASSIGN("glProgramUniform4i", programUniform4i);
        ASSIGN("glProgramUniform4iv", programUniform4iv);
        ASSIGN("glProgramUniform4ui", programUniform4ui);
        ASSIGN("glProgramUniform4uiv", programUniform4uiv);
        ASSIGN("glProgramUniformMatrix2dv", programUniformMatrix2dv);
        ASSIGN("glProgramUniformMatrix2fv", programUniformMatrix2fv);
        ASSIGN("glProgramUniformMatrix2x3dv", programUniformMatrix2x3dv);
        ASSIGN("glProgramUniformMatrix2x3fv", programUniformMatrix2x3fv);
        ASSIGN("glProgramUniformMatrix2x4dv", programUniformMatrix2x4dv);
        ASSIGN("glProgramUniformMatrix2x4fv", programUniformMatrix2x4fv);
        ASSIGN("glProgramUniformMatrix3dv", programUniformMatrix3dv);
        ASSIGN("glProgramUniformMatrix3fv", programUniformMatrix3fv);
        ASSIGN("glProgramUniformMatrix3x2dv", programUniformMatrix3x2dv);
        ASSIGN("glProgramUniformMatrix3x2fv", programUniformMatrix3x2fv);
        ASSIGN("glProgramUniformMatrix3x4dv", programUniformMatrix3x4dv);
        ASSIGN("glProgramUniformMatrix3x4fv", programUniformMatrix3x4fv);
        ASSIGN("glProgramUniformMatrix4dv", programUniformMatrix4dv);
        ASSIGN("glProgramUniformMatrix4fv", programUniformMatrix4fv);
        ASSIGN("glProgramUniformMatrix4x2dv", programUniformMatrix4x2dv);
        ASSIGN("glProgramUniformMatrix4x2fv", programUniformMatrix4x2fv);
        ASSIGN("glProgramUniformMatrix4x3dv", programUniformMatrix4x3dv);
        ASSIGN("glProgramUniformMatrix4x3fv", programUniformMatrix4x3fv);
        ASSIGN("glUseProgramStages", useProgramStages);
        ASSIGN("glValidateProgramPipeline", validateProgramPipeline);
    }

    if (extensions.count("GL_ARB_shader_atomic_counters") != 0)
    {
        ASSIGN("glGetActiveAtomicCounterBufferiv", getActiveAtomicCounterBufferiv);
    }

    if (extensions.count("GL_ARB_shader_image_load_store") != 0)
    {
        ASSIGN("glBindImageTexture", bindImageTexture);
        ASSIGN("glMemoryBarrier", memoryBarrier);
    }

    if (extensions.count("GL_ARB_shader_objects") != 0)
    {
        ASSIGN("glCompileShaderARB", compileShader);
        ASSIGN("glGetActiveUniformARB", getActiveUniform);
        ASSIGN("glGetShaderSourceARB", getShaderSource);
        ASSIGN("glGetUniformLocationARB", getUniformLocation);
        ASSIGN("glGetUniformfvARB", getUniformfv);
        ASSIGN("glGetUniformivARB", getUniformiv);
        ASSIGN("glLinkProgramARB", linkProgram);
        ASSIGN("glShaderSourceARB", shaderSource);
        ASSIGN("glUniform1fARB", uniform1f);
        ASSIGN("glUniform1fvARB", uniform1fv);
        ASSIGN("glUniform1iARB", uniform1i);
        ASSIGN("glUniform1ivARB", uniform1iv);
        ASSIGN("glUniform2fARB", uniform2f);
        ASSIGN("glUniform2fvARB", uniform2fv);
        ASSIGN("glUniform2iARB", uniform2i);
        ASSIGN("glUniform2ivARB", uniform2iv);
        ASSIGN("glUniform3fARB", uniform3f);
        ASSIGN("glUniform3fvARB", uniform3fv);
        ASSIGN("glUniform3iARB", uniform3i);
        ASSIGN("glUniform3ivARB", uniform3iv);
        ASSIGN("glUniform4fARB", uniform4f);
        ASSIGN("glUniform4fvARB", uniform4fv);
        ASSIGN("glUniform4iARB", uniform4i);
        ASSIGN("glUniform4ivARB", uniform4iv);
        ASSIGN("glUniformMatrix2fvARB", uniformMatrix2fv);
        ASSIGN("glUniformMatrix3fvARB", uniformMatrix3fv);
        ASSIGN("glUniformMatrix4fvARB", uniformMatrix4fv);
        ASSIGN("glValidateProgramARB", validateProgram);
    }

    if (extensions.count("GL_ARB_shader_storage_buffer_object") != 0)
    {
        ASSIGN("glShaderStorageBlockBinding", shaderStorageBlockBinding);
    }

    if (extensions.count("GL_ARB_shader_subroutine") != 0)
    {
        ASSIGN("glGetActiveSubroutineName", getActiveSubroutineName);
        ASSIGN("glGetActiveSubroutineUniformName", getActiveSubroutineUniformName);
        ASSIGN("glGetActiveSubroutineUniformiv", getActiveSubroutineUniformiv);
        ASSIGN("glGetProgramStageiv", getProgramStageiv);
        ASSIGN("glGetSubroutineIndex", getSubroutineIndex);
        ASSIGN("glGetSubroutineUniformLocation", getSubroutineUniformLocation);
        ASSIGN("glGetUniformSubroutineuiv", getUniformSubroutineuiv);
        ASSIGN("glUniformSubroutinesuiv", uniformSubroutinesuiv);
    }

    if (extensions.count("GL_ARB_sync") != 0)
    {
        ASSIGN("glClientWaitSync", clientWaitSync);
        ASSIGN("glDeleteSync", deleteSync);
        ASSIGN("glFenceSync", fenceSync);
        ASSIGN("glGetInteger64v", getInteger64v);
        ASSIGN("glGetSynciv", getSynciv);
        ASSIGN("glIsSync", isSync);
        ASSIGN("glWaitSync", waitSync);
    }

    if (extensions.count("GL_ARB_tessellation_shader") != 0)
    {
        ASSIGN("glPatchParameterfv", patchParameterfv);
        ASSIGN("glPatchParameteri", patchParameteri);
    }

    if (extensions.count("GL_ARB_texture_barrier") != 0)
    {
        ASSIGN("glTextureBarrier", textureBarrier);
    }

    if (extensions.count("GL_ARB_texture_buffer_object") != 0)
    {
        ASSIGN("glTexBufferARB", texBuffer);
    }

    if (extensions.count("GL_ARB_texture_buffer_range") != 0)
    {
        ASSIGN("glTexBufferRange", texBufferRange);
    }

    if (extensions.count("GL_ARB_texture_compression") != 0)
    {
        ASSIGN("glCompressedTexImage1DARB", compressedTexImage1D);
        ASSIGN("glCompressedTexImage2DARB", compressedTexImage2D);
        ASSIGN("glCompressedTexImage3DARB", compressedTexImage3D);
        ASSIGN("glCompressedTexSubImage1DARB", compressedTexSubImage1D);
        ASSIGN("glCompressedTexSubImage2DARB", compressedTexSubImage2D);
        ASSIGN("glCompressedTexSubImage3DARB", compressedTexSubImage3D);
        ASSIGN("glGetCompressedTexImageARB", getCompressedTexImage);
    }

    if (extensions.count("GL_ARB_texture_multisample") != 0)
    {
        ASSIGN("glGetMultisamplefv", getMultisamplefv);
        ASSIGN("glSampleMaski", sampleMaski);
        ASSIGN("glTexImage2DMultisample", texImage2DMultisample);
        ASSIGN("glTexImage3DMultisample", texImage3DMultisample);
    }

    if (extensions.count("GL_ARB_texture_storage") != 0)
    {
        ASSIGN("glTexStorage1D", texStorage1D);
        ASSIGN("glTexStorage2D", texStorage2D);
        ASSIGN("glTexStorage3D", texStorage3D);
    }

    if (extensions.count("GL_ARB_texture_storage_multisample") != 0)
    {
        ASSIGN("glTexStorage2DMultisample", texStorage2DMultisample);
        ASSIGN("glTexStorage3DMultisample", texStorage3DMultisample);
    }

    if (extensions.count("GL_ARB_texture_view") != 0)
    {
        ASSIGN("glTextureView", textureView);
    }

    if (extensions.count("GL_ARB_timer_query") != 0)
    {
        ASSIGN("glGetQueryObjecti64v", getQueryObjecti64v);
        ASSIGN("glGetQueryObjectui64v", getQueryObjectui64v);
        ASSIGN("glQueryCounter", queryCounter);
    }

    if (extensions.count("GL_ARB_transform_feedback2") != 0)
    {
        ASSIGN("glBindTransformFeedback", bindTransformFeedback);
        ASSIGN("glDeleteTransformFeedbacks", deleteTransformFeedbacks);
        ASSIGN("glDrawTransformFeedback", drawTransformFeedback);
        ASSIGN("glGenTransformFeedbacks", genTransformFeedbacks);
        ASSIGN("glIsTransformFeedback", isTransformFeedback);
        ASSIGN("glPauseTransformFeedback", pauseTransformFeedback);
        ASSIGN("glResumeTransformFeedback", resumeTransformFeedback);
    }

    if (extensions.count("GL_ARB_transform_feedback3") != 0)
    {
        ASSIGN("glBeginQueryIndexed", beginQueryIndexed);
        ASSIGN("glDrawTransformFeedbackStream", drawTransformFeedbackStream);
        ASSIGN("glEndQueryIndexed", endQueryIndexed);
        ASSIGN("glGetQueryIndexediv", getQueryIndexediv);
    }

    if (extensions.count("GL_ARB_transform_feedback_instanced") != 0)
    {
        ASSIGN("glDrawTransformFeedbackInstanced", drawTransformFeedbackInstanced);
        ASSIGN("glDrawTransformFeedbackStreamInstanced", drawTransformFeedbackStreamInstanced);
    }

    if (extensions.count("GL_ARB_uniform_buffer_object") != 0)
    {
        ASSIGN("glBindBufferBase", bindBufferBase);
        ASSIGN("glBindBufferRange", bindBufferRange);
        ASSIGN("glGetActiveUniformBlockName", getActiveUniformBlockName);
        ASSIGN("glGetActiveUniformBlockiv", getActiveUniformBlockiv);
        ASSIGN("glGetActiveUniformName", getActiveUniformName);
        ASSIGN("glGetActiveUniformsiv", getActiveUniformsiv);
        ASSIGN("glGetIntegeri_v", getIntegeri_v);
        ASSIGN("glGetUniformBlockIndex", getUniformBlockIndex);
        ASSIGN("glGetUniformIndices", getUniformIndices);
        ASSIGN("glUniformBlockBinding", uniformBlockBinding);
    }

    if (extensions.count("GL_ARB_vertex_array_object") != 0)
    {
        ASSIGN("glBindVertexArray", bindVertexArray);
        ASSIGN("glDeleteVertexArrays", deleteVertexArrays);
        ASSIGN("glGenVertexArrays", genVertexArrays);
        ASSIGN("glIsVertexArray", isVertexArray);
    }

    if (extensions.count("GL_ARB_vertex_attrib_64bit") != 0)
    {
        ASSIGN("glGetVertexAttribLdv", getVertexAttribLdv);
        ASSIGN("glVertexAttribL1d", vertexAttribL1d);
        ASSIGN("glVertexAttribL1dv", vertexAttribL1dv);
        ASSIGN("glVertexAttribL2d", vertexAttribL2d);
        ASSIGN("glVertexAttribL2dv", vertexAttribL2dv);
        ASSIGN("glVertexAttribL3d", vertexAttribL3d);
        ASSIGN("glVertexAttribL3dv", vertexAttribL3dv);
        ASSIGN("glVertexAttribL4d", vertexAttribL4d);
        ASSIGN("glVertexAttribL4dv", vertexAttribL4dv);
        ASSIGN("glVertexAttribLPointer", vertexAttribLPointer);
    }

    if (extensions.count("GL_ARB_vertex_attrib_binding") != 0)
    {
        ASSIGN("glBindVertexBuffer", bindVertexBuffer);
        ASSIGN("glVertexAttribBinding", vertexAttribBinding);
        ASSIGN("glVertexAttribFormat", vertexAttribFormat);
        ASSIGN("glVertexAttribIFormat", vertexAttribIFormat);
        ASSIGN("glVertexAttribLFormat", vertexAttribLFormat);
        ASSIGN("glVertexBindingDivisor", vertexBindingDivisor);
    }

    if (extensions.count("GL_ARB_vertex_buffer_object") != 0)
    {
        ASSIGN("glBindBufferARB", bindBuffer);
        ASSIGN("glBufferDataARB", bufferData);
        ASSIGN("glBufferSubDataARB", bufferSubData);
        ASSIGN("glDeleteBuffersARB", deleteBuffers);
        ASSIGN("glGenBuffersARB", genBuffers);
        ASSIGN("glGetBufferParameterivARB", getBufferParameteriv);
        ASSIGN("glGetBufferPointervARB", getBufferPointerv);
        ASSIGN("glGetBufferSubDataARB", getBufferSubData);
        ASSIGN("glIsBufferARB", isBuffer);
        ASSIGN("glMapBufferARB", mapBuffer);
        ASSIGN("glUnmapBufferARB", unmapBuffer);
    }

    if (extensions.count("GL_ARB_vertex_program") != 0)
    {
        ASSIGN("glDisableVertexAttribArrayARB", disableVertexAttribArray);
        ASSIGN("glEnableVertexAttribArrayARB", enableVertexAttribArray);
        ASSIGN("glGetProgramivARB", getProgramiv);
        ASSIGN("glGetVertexAttribPointervARB", getVertexAttribPointerv);
        ASSIGN("glGetVertexAttribdvARB", getVertexAttribdv);
        ASSIGN("glGetVertexAttribfvARB", getVertexAttribfv);
        ASSIGN("glGetVertexAttribivARB", getVertexAttribiv);
        ASSIGN("glIsProgramARB", isProgram);
        ASSIGN("glVertexAttrib1dARB", vertexAttrib1d);
        ASSIGN("glVertexAttrib1dvARB", vertexAttrib1dv);
        ASSIGN("glVertexAttrib1fARB", vertexAttrib1f);
        ASSIGN("glVertexAttrib1fvARB", vertexAttrib1fv);
        ASSIGN("glVertexAttrib1sARB", vertexAttrib1s);
        ASSIGN("glVertexAttrib1svARB", vertexAttrib1sv);
        ASSIGN("glVertexAttrib2dARB", vertexAttrib2d);
        ASSIGN("glVertexAttrib2dvARB", vertexAttrib2dv);
        ASSIGN("glVertexAttrib2fARB", vertexAttrib2f);
        ASSIGN("glVertexAttrib2fvARB", vertexAttrib2fv);
        ASSIGN("glVertexAttrib2sARB", vertexAttrib2s);
        ASSIGN("glVertexAttrib2svARB", vertexAttrib2sv);
        ASSIGN("glVertexAttrib3dARB", vertexAttrib3d);
        ASSIGN("glVertexAttrib3dvARB", vertexAttrib3dv);
        ASSIGN("glVertexAttrib3fARB", vertexAttrib3f);
        ASSIGN("glVertexAttrib3fvARB", vertexAttrib3fv);
        ASSIGN("glVertexAttrib3sARB", vertexAttrib3s);
        ASSIGN("glVertexAttrib3svARB", vertexAttrib3sv);
        ASSIGN("glVertexAttrib4NbvARB", vertexAttrib4Nbv);
        ASSIGN("glVertexAttrib4NivARB", vertexAttrib4Niv);
        ASSIGN("glVertexAttrib4NsvARB", vertexAttrib4Nsv);
        ASSIGN("glVertexAttrib4NubARB", vertexAttrib4Nub);
        ASSIGN("glVertexAttrib4NubvARB", vertexAttrib4Nubv);
        ASSIGN("glVertexAttrib4NuivARB", vertexAttrib4Nuiv);
        ASSIGN("glVertexAttrib4NusvARB", vertexAttrib4Nusv);
        ASSIGN("glVertexAttrib4bvARB", vertexAttrib4bv);
        ASSIGN("glVertexAttrib4dARB", vertexAttrib4d);
        ASSIGN("glVertexAttrib4dvARB", vertexAttrib4dv);
        ASSIGN("glVertexAttrib4fARB", vertexAttrib4f);
        ASSIGN("glVertexAttrib4fvARB", vertexAttrib4fv);
        ASSIGN("glVertexAttrib4ivARB", vertexAttrib4iv);
        ASSIGN("glVertexAttrib4sARB", vertexAttrib4s);
        ASSIGN("glVertexAttrib4svARB", vertexAttrib4sv);
        ASSIGN("glVertexAttrib4ubvARB", vertexAttrib4ubv);
        ASSIGN("glVertexAttrib4uivARB", vertexAttrib4uiv);
        ASSIGN("glVertexAttrib4usvARB", vertexAttrib4usv);
        ASSIGN("glVertexAttribPointerARB", vertexAttribPointer);
    }

    if (extensions.count("GL_ARB_vertex_shader") != 0)
    {
        ASSIGN("glBindAttribLocationARB", bindAttribLocation);
        ASSIGN("glDisableVertexAttribArrayARB", disableVertexAttribArray);
        ASSIGN("glEnableVertexAttribArrayARB", enableVertexAttribArray);
        ASSIGN("glGetActiveAttribARB", getActiveAttrib);
        ASSIGN("glGetAttribLocationARB", getAttribLocation);
        ASSIGN("glGetVertexAttribPointervARB", getVertexAttribPointerv);
        ASSIGN("glGetVertexAttribdvARB", getVertexAttribdv);
        ASSIGN("glGetVertexAttribfvARB", getVertexAttribfv);
        ASSIGN("glGetVertexAttribivARB", getVertexAttribiv);
        ASSIGN("glVertexAttrib1dARB", vertexAttrib1d);
        ASSIGN("glVertexAttrib1dvARB", vertexAttrib1dv);
        ASSIGN("glVertexAttrib1fARB", vertexAttrib1f);
        ASSIGN("glVertexAttrib1fvARB", vertexAttrib1fv);
        ASSIGN("glVertexAttrib1sARB", vertexAttrib1s);
        ASSIGN("glVertexAttrib1svARB", vertexAttrib1sv);
        ASSIGN("glVertexAttrib2dARB", vertexAttrib2d);
        ASSIGN("glVertexAttrib2dvARB", vertexAttrib2dv);
        ASSIGN("glVertexAttrib2fARB", vertexAttrib2f);
        ASSIGN("glVertexAttrib2fvARB", vertexAttrib2fv);
        ASSIGN("glVertexAttrib2sARB", vertexAttrib2s);
        ASSIGN("glVertexAttrib2svARB", vertexAttrib2sv);
        ASSIGN("glVertexAttrib3dARB", vertexAttrib3d);
        ASSIGN("glVertexAttrib3dvARB", vertexAttrib3dv);
        ASSIGN("glVertexAttrib3fARB", vertexAttrib3f);
        ASSIGN("glVertexAttrib3fvARB", vertexAttrib3fv);
        ASSIGN("glVertexAttrib3sARB", vertexAttrib3s);
        ASSIGN("glVertexAttrib3svARB", vertexAttrib3sv);
        ASSIGN("glVertexAttrib4NbvARB", vertexAttrib4Nbv);
        ASSIGN("glVertexAttrib4NivARB", vertexAttrib4Niv);
        ASSIGN("glVertexAttrib4NsvARB", vertexAttrib4Nsv);
        ASSIGN("glVertexAttrib4NubARB", vertexAttrib4Nub);
        ASSIGN("glVertexAttrib4NubvARB", vertexAttrib4Nubv);
        ASSIGN("glVertexAttrib4NuivARB", vertexAttrib4Nuiv);
        ASSIGN("glVertexAttrib4NusvARB", vertexAttrib4Nusv);
        ASSIGN("glVertexAttrib4bvARB", vertexAttrib4bv);
        ASSIGN("glVertexAttrib4dARB", vertexAttrib4d);
        ASSIGN("glVertexAttrib4dvARB", vertexAttrib4dv);
        ASSIGN("glVertexAttrib4fARB", vertexAttrib4f);
        ASSIGN("glVertexAttrib4fvARB", vertexAttrib4fv);
        ASSIGN("glVertexAttrib4ivARB", vertexAttrib4iv);
        ASSIGN("glVertexAttrib4sARB", vertexAttrib4s);
        ASSIGN("glVertexAttrib4svARB", vertexAttrib4sv);
        ASSIGN("glVertexAttrib4ubvARB", vertexAttrib4ubv);
        ASSIGN("glVertexAttrib4uivARB", vertexAttrib4uiv);
        ASSIGN("glVertexAttrib4usvARB", vertexAttrib4usv);
        ASSIGN("glVertexAttribPointerARB", vertexAttribPointer);
    }

    if (extensions.count("GL_ARB_vertex_type_2_10_10_10_rev") != 0)
    {
        ASSIGN("glVertexAttribP1ui", vertexAttribP1ui);
        ASSIGN("glVertexAttribP1uiv", vertexAttribP1uiv);
        ASSIGN("glVertexAttribP2ui", vertexAttribP2ui);
        ASSIGN("glVertexAttribP2uiv", vertexAttribP2uiv);
        ASSIGN("glVertexAttribP3ui", vertexAttribP3ui);
        ASSIGN("glVertexAttribP3uiv", vertexAttribP3uiv);
        ASSIGN("glVertexAttribP4ui", vertexAttribP4ui);
        ASSIGN("glVertexAttribP4uiv", vertexAttribP4uiv);
    }

    if (extensions.count("GL_ARB_viewport_array") != 0)
    {
        ASSIGN("glDepthRangeArrayv", depthRangeArrayv);
        ASSIGN("glDepthRangeIndexed", depthRangeIndexed);
        ASSIGN("glGetDoublei_v", getDoublei_v);
        ASSIGN("glGetFloati_v", getFloati_v);
        ASSIGN("glScissorArrayv", scissorArrayv);
        ASSIGN("glScissorIndexed", scissorIndexed);
        ASSIGN("glScissorIndexedv", scissorIndexedv);
        ASSIGN("glViewportArrayv", viewportArrayv);
        ASSIGN("glViewportIndexedf", viewportIndexedf);
        ASSIGN("glViewportIndexedfv", viewportIndexedfv);
    }

    if (extensions.count("GL_EXT_blend_color") != 0)
    {
        ASSIGN("glBlendColorEXT", blendColor);
    }

    if (extensions.count("GL_EXT_blend_equation_separate") != 0)
    {
        ASSIGN("glBlendEquationSeparateEXT", blendEquationSeparate);
    }

    if (extensions.count("GL_EXT_blend_func_separate") != 0)
    {
        ASSIGN("glBlendFuncSeparateEXT", blendFuncSeparate);
    }

    if (extensions.count("GL_EXT_copy_texture") != 0)
    {
        ASSIGN("glCopyTexImage1DEXT", copyTexImage1D);
        ASSIGN("glCopyTexImage2DEXT", copyTexImage2D);
        ASSIGN("glCopyTexSubImage1DEXT", copyTexSubImage1D);
        ASSIGN("glCopyTexSubImage2DEXT", copyTexSubImage2D);
        ASSIGN("glCopyTexSubImage3DEXT", copyTexSubImage3D);
    }

    if (extensions.count("GL_EXT_direct_state_access") != 0)
    {
        ASSIGN("glCheckNamedFramebufferStatusEXT", checkNamedFramebufferStatus);
        ASSIGN("glClearNamedBufferDataEXT", clearNamedBufferData);
        ASSIGN("glClearNamedBufferSubDataEXT", clearNamedBufferSubData);
        ASSIGN("glCompressedTextureSubImage1DEXT", compressedTextureSubImage1D);
        ASSIGN("glCompressedTextureSubImage2DEXT", compressedTextureSubImage2D);
        ASSIGN("glCompressedTextureSubImage3DEXT", compressedTextureSubImage3D);
        ASSIGN("glCopyTextureSubImage1DEXT", copyTextureSubImage1D);
        ASSIGN("glCopyTextureSubImage2DEXT", copyTextureSubImage2D);
        ASSIGN("glCopyTextureSubImage3DEXT", copyTextureSubImage3D);
        ASSIGN("glDisableVertexArrayAttribEXT", disableVertexArrayAttrib);
        ASSIGN("glEnableVertexArrayAttribEXT", enableVertexArrayAttrib);
        ASSIGN("glFlushMappedNamedBufferRangeEXT", flushMappedNamedBufferRange);
        ASSIGN("glGenerateTextureMipmapEXT", generateTextureMipmap);
        ASSIGN("glGetCompressedTextureImageEXT", getCompressedTextureImage);
        ASSIGN("glGetDoublei_vEXT", getDoublei_v);
        ASSIGN("glGetFloati_vEXT", getFloati_v);
        ASSIGN("glGetFramebufferParameterivEXT", getFramebufferParameteriv);
        ASSIGN("glGetNamedBufferParameterivEXT", getNamedBufferParameteriv);
        ASSIGN("glGetNamedBufferPointervEXT", getNamedBufferPointerv);
        ASSIGN("glGetNamedBufferSubDataEXT", getNamedBufferSubData);
        ASSIGN("glGetNamedFramebufferAttachmentParameterivEXT",
               getNamedFramebufferAttachmentParameteriv);
        ASSIGN("glGetNamedFramebufferParameterivEXT", getNamedFramebufferParameteriv);
        ASSIGN("glGetNamedRenderbufferParameterivEXT", getNamedRenderbufferParameteriv);
        ASSIGN("glGetTextureImageEXT", getTextureImage);
        ASSIGN("glGetTextureLevelParameterfvEXT", getTextureLevelParameterfv);
        ASSIGN("glGetTextureLevelParameterivEXT", getTextureLevelParameteriv);
        ASSIGN("glGetTextureParameterIivEXT", getTextureParameterIiv);
        ASSIGN("glGetTextureParameterIuivEXT", getTextureParameterIuiv);
        ASSIGN("glGetTextureParameterfvEXT", getTextureParameterfv);
        ASSIGN("glGetTextureParameterivEXT", getTextureParameteriv);
        ASSIGN("glMapNamedBufferEXT", mapNamedBuffer);
        ASSIGN("glMapNamedBufferRangeEXT", mapNamedBufferRange);
        ASSIGN("glNamedBufferDataEXT", namedBufferData);
        ASSIGN("glNamedBufferStorageEXT", namedBufferStorage);
        ASSIGN("glNamedBufferSubDataEXT", namedBufferSubData);
        ASSIGN("glNamedFramebufferParameteriEXT", namedFramebufferParameteri);
        ASSIGN("glNamedFramebufferRenderbufferEXT", namedFramebufferRenderbuffer);
        ASSIGN("glNamedFramebufferTextureEXT", namedFramebufferTexture);
        ASSIGN("glNamedFramebufferTextureLayerEXT", namedFramebufferTextureLayer);
        ASSIGN("glNamedRenderbufferStorageEXT", namedRenderbufferStorage);
        ASSIGN("glNamedRenderbufferStorageMultisampleEXT", namedRenderbufferStorageMultisample);
        ASSIGN("glProgramUniform1dEXT", programUniform1d);
        ASSIGN("glProgramUniform1dvEXT", programUniform1dv);
        ASSIGN("glProgramUniform2dEXT", programUniform2d);
        ASSIGN("glProgramUniform2dvEXT", programUniform2dv);
        ASSIGN("glProgramUniform3dEXT", programUniform3d);
        ASSIGN("glProgramUniform3dvEXT", programUniform3dv);
        ASSIGN("glProgramUniform4dEXT", programUniform4d);
        ASSIGN("glProgramUniform4dvEXT", programUniform4dv);
        ASSIGN("glProgramUniformMatrix2dvEXT", programUniformMatrix2dv);
        ASSIGN("glProgramUniformMatrix2x3dvEXT", programUniformMatrix2x3dv);
        ASSIGN("glProgramUniformMatrix2x4dvEXT", programUniformMatrix2x4dv);
        ASSIGN("glProgramUniformMatrix3dvEXT", programUniformMatrix3dv);
        ASSIGN("glProgramUniformMatrix3x2dvEXT", programUniformMatrix3x2dv);
        ASSIGN("glProgramUniformMatrix3x4dvEXT", programUniformMatrix3x4dv);
        ASSIGN("glProgramUniformMatrix4dvEXT", programUniformMatrix4dv);
        ASSIGN("glProgramUniformMatrix4x2dvEXT", programUniformMatrix4x2dv);
        ASSIGN("glProgramUniformMatrix4x3dvEXT", programUniformMatrix4x3dv);
        ASSIGN("glTextureBufferEXT", textureBuffer);
        ASSIGN("glTextureBufferRangeEXT", textureBufferRange);
        ASSIGN("glTextureParameterIivEXT", textureParameterIiv);
        ASSIGN("glTextureParameterIuivEXT", textureParameterIuiv);
        ASSIGN("glTextureParameterfEXT", textureParameterf);
        ASSIGN("glTextureParameterfvEXT", textureParameterfv);
        ASSIGN("glTextureParameteriEXT", textureParameteri);
        ASSIGN("glTextureParameterivEXT", textureParameteriv);
        ASSIGN("glTextureStorage1DEXT", textureStorage1D);
        ASSIGN("glTextureStorage2DEXT", textureStorage2D);
        ASSIGN("glTextureStorage2DMultisampleEXT", textureStorage2DMultisample);
        ASSIGN("glTextureStorage3DEXT", textureStorage3D);
        ASSIGN("glTextureStorage3DMultisampleEXT", textureStorage3DMultisample);
        ASSIGN("glTextureSubImage1DEXT", textureSubImage1D);
        ASSIGN("glTextureSubImage2DEXT", textureSubImage2D);
        ASSIGN("glTextureSubImage3DEXT", textureSubImage3D);
        ASSIGN("glUnmapNamedBufferEXT", unmapNamedBuffer);
    }

    if (extensions.count("GL_EXT_draw_range_elements") != 0)
    {
        ASSIGN("glDrawRangeElementsEXT", drawRangeElements);
    }

    if (extensions.count("GL_EXT_framebuffer_blit") != 0)
    {
        ASSIGN("glBlitFramebufferEXT", blitFramebuffer);
    }

    if (extensions.count("GL_EXT_framebuffer_multisample") != 0)
    {
        ASSIGN("glRenderbufferStorageMultisampleEXT", renderbufferStorageMultisample);
    }

    if (extensions.count("GL_EXT_framebuffer_object") != 0)
    {
        ASSIGN("glBindFramebufferEXT", bindFramebuffer);
        ASSIGN("glBindRenderbufferEXT", bindRenderbuffer);
        ASSIGN("glCheckFramebufferStatusEXT", checkFramebufferStatus);
        ASSIGN("glDeleteFramebuffersEXT", deleteFramebuffers);
        ASSIGN("glDeleteRenderbuffersEXT", deleteRenderbuffers);
        ASSIGN("glFramebufferRenderbufferEXT", framebufferRenderbuffer);
        ASSIGN("glFramebufferTexture1DEXT", framebufferTexture1D);
        ASSIGN("glFramebufferTexture2DEXT", framebufferTexture2D);
        ASSIGN("glFramebufferTexture3DEXT", framebufferTexture3D);
        ASSIGN("glGenFramebuffersEXT", genFramebuffers);
        ASSIGN("glGenRenderbuffersEXT", genRenderbuffers);
        ASSIGN("glGenerateMipmapEXT", generateMipmap);
        ASSIGN("glGetFramebufferAttachmentParameterivEXT", getFramebufferAttachmentParameteriv);
        ASSIGN("glGetRenderbufferParameterivEXT", getRenderbufferParameteriv);
        ASSIGN("glIsFramebufferEXT", isFramebuffer);
        ASSIGN("glIsRenderbufferEXT", isRenderbuffer);
        ASSIGN("glRenderbufferStorageEXT", renderbufferStorage);
    }

    if (extensions.count("GL_EXT_gpu_shader4") != 0)
    {
        ASSIGN("glBindFragDataLocationEXT", bindFragDataLocation);
        ASSIGN("glGetFragDataLocationEXT", getFragDataLocation);
        ASSIGN("glGetUniformuivEXT", getUniformuiv);
        ASSIGN("glUniform1uiEXT", uniform1ui);
        ASSIGN("glUniform1uivEXT", uniform1uiv);
        ASSIGN("glUniform2uiEXT", uniform2ui);
        ASSIGN("glUniform2uivEXT", uniform2uiv);
        ASSIGN("glUniform3uiEXT", uniform3ui);
        ASSIGN("glUniform3uivEXT", uniform3uiv);
        ASSIGN("glUniform4uiEXT", uniform4ui);
        ASSIGN("glUniform4uivEXT", uniform4uiv);
    }

    if (extensions.count("GL_EXT_point_parameters") != 0)
    {
        ASSIGN("glPointParameterfEXT", pointParameterf);
        ASSIGN("glPointParameterfvEXT", pointParameterfv);
    }

    if (extensions.count("GL_EXT_polygon_offset") != 0)
    {
        ASSIGN("glPolygonOffsetEXT", polygonOffset);
    }

    if (extensions.count("GL_EXT_provoking_vertex") != 0)
    {
        ASSIGN("glProvokingVertexEXT", provokingVertex);
    }

    if (extensions.count("GL_EXT_shader_image_load_store") != 0)
    {
        ASSIGN("glBindImageTextureEXT", bindImageTexture);
        ASSIGN("glMemoryBarrierEXT", memoryBarrier);
    }

    if (extensions.count("GL_EXT_subtexture") != 0)
    {
        ASSIGN("glTexSubImage1DEXT", texSubImage1D);
        ASSIGN("glTexSubImage2DEXT", texSubImage2D);
    }

    if (extensions.count("GL_EXT_texture3D") != 0)
    {
        ASSIGN("glTexImage3DEXT", texImage3D);
        ASSIGN("glTexSubImage3DEXT", texSubImage3D);
    }

    if (extensions.count("GL_EXT_texture_array") != 0)
    {
        ASSIGN("glFramebufferTextureLayerEXT", framebufferTextureLayer);
    }

    if (extensions.count("GL_EXT_texture_buffer_object") != 0)
    {
        ASSIGN("glTexBufferEXT", texBuffer);
    }

    if (extensions.count("GL_EXT_texture_integer") != 0)
    {
        ASSIGN("glGetTexParameterIivEXT", getTexParameterIiv);
        ASSIGN("glGetTexParameterIuivEXT", getTexParameterIuiv);
        ASSIGN("glTexParameterIivEXT", texParameterIiv);
        ASSIGN("glTexParameterIuivEXT", texParameterIuiv);
    }

    if (extensions.count("GL_EXT_texture_object") != 0)
    {
        ASSIGN("glBindTextureEXT", bindTexture);
        ASSIGN("glDeleteTexturesEXT", deleteTextures);
        ASSIGN("glGenTexturesEXT", genTextures);
        ASSIGN("glIsTextureEXT", isTexture);
    }

    if (extensions.count("GL_EXT_timer_query") != 0)
    {
        ASSIGN("glGetQueryObjecti64vEXT", getQueryObjecti64v);
        ASSIGN("glGetQueryObjectui64vEXT", getQueryObjectui64v);
    }

    if (extensions.count("GL_EXT_transform_feedback") != 0)
    {
        ASSIGN("glBeginTransformFeedbackEXT", beginTransformFeedback);
        ASSIGN("glBindBufferBaseEXT", bindBufferBase);
        ASSIGN("glBindBufferRangeEXT", bindBufferRange);
        ASSIGN("glEndTransformFeedbackEXT", endTransformFeedback);
        ASSIGN("glGetTransformFeedbackVaryingEXT", getTransformFeedbackVarying);
        ASSIGN("glTransformFeedbackVaryingsEXT", transformFeedbackVaryings);
    }

    if (extensions.count("GL_EXT_vertex_array") != 0)
    {
        ASSIGN("glDrawArraysEXT", drawArrays);
        ASSIGN("glGetPointervEXT", getPointerv);
    }

    if (extensions.count("GL_EXT_vertex_attrib_64bit") != 0)
    {
        ASSIGN("glGetVertexAttribLdvEXT", getVertexAttribLdv);
        ASSIGN("glVertexAttribL1dEXT", vertexAttribL1d);
        ASSIGN("glVertexAttribL1dvEXT", vertexAttribL1dv);
        ASSIGN("glVertexAttribL2dEXT", vertexAttribL2d);
        ASSIGN("glVertexAttribL2dvEXT", vertexAttribL2dv);
        ASSIGN("glVertexAttribL3dEXT", vertexAttribL3d);
        ASSIGN("glVertexAttribL3dvEXT", vertexAttribL3dv);
        ASSIGN("glVertexAttribL4dEXT", vertexAttribL4d);
        ASSIGN("glVertexAttribL4dvEXT", vertexAttribL4dv);
        ASSIGN("glVertexAttribLPointerEXT", vertexAttribLPointer);
    }

    if (extensions.count("GL_KHR_debug") != 0)
    {
        ASSIGN("glDebugMessageCallback", debugMessageCallback);
        ASSIGN("glDebugMessageControl", debugMessageControl);
        ASSIGN("glDebugMessageInsert", debugMessageInsert);
        ASSIGN("glGetDebugMessageLog", getDebugMessageLog);
        ASSIGN("glGetObjectLabel", getObjectLabel);
        ASSIGN("glGetObjectPtrLabel", getObjectPtrLabel);
        ASSIGN("glGetPointerv", getPointerv);
        ASSIGN("glObjectLabel", objectLabel);
        ASSIGN("glObjectPtrLabel", objectPtrLabel);
        ASSIGN("glPopDebugGroup", popDebugGroup);
        ASSIGN("glPushDebugGroup", pushDebugGroup);
    }

    if (extensions.count("GL_KHR_robustness") != 0)
    {
        ASSIGN("glGetGraphicsResetStatus", getGraphicsResetStatus);
        ASSIGN("glGetnUniformfv", getnUniformfv);
        ASSIGN("glGetnUniformiv", getnUniformiv);
        ASSIGN("glGetnUniformuiv", getnUniformuiv);
        ASSIGN("glReadnPixels", readnPixels);
    }

    if (extensions.count("GL_NV_geometry_program4") != 0)
    {
        ASSIGN("glFramebufferTextureEXT", framebufferTexture);
        ASSIGN("glFramebufferTextureLayerEXT", framebufferTextureLayer);
    }

    if (extensions.count("GL_NV_vertex_program4") != 0)
    {
        ASSIGN("glGetVertexAttribIivEXT", getVertexAttribIiv);
        ASSIGN("glGetVertexAttribIuivEXT", getVertexAttribIuiv);
        ASSIGN("glVertexAttribI1iEXT", vertexAttribI1i);
        ASSIGN("glVertexAttribI1ivEXT", vertexAttribI1iv);
        ASSIGN("glVertexAttribI1uiEXT", vertexAttribI1ui);
        ASSIGN("glVertexAttribI1uivEXT", vertexAttribI1uiv);
        ASSIGN("glVertexAttribI2iEXT", vertexAttribI2i);
        ASSIGN("glVertexAttribI2ivEXT", vertexAttribI2iv);
        ASSIGN("glVertexAttribI2uiEXT", vertexAttribI2ui);
        ASSIGN("glVertexAttribI2uivEXT", vertexAttribI2uiv);
        ASSIGN("glVertexAttribI3iEXT", vertexAttribI3i);
        ASSIGN("glVertexAttribI3ivEXT", vertexAttribI3iv);
        ASSIGN("glVertexAttribI3uiEXT", vertexAttribI3ui);
        ASSIGN("glVertexAttribI3uivEXT", vertexAttribI3uiv);
        ASSIGN("glVertexAttribI4bvEXT", vertexAttribI4bv);
        ASSIGN("glVertexAttribI4iEXT", vertexAttribI4i);
        ASSIGN("glVertexAttribI4ivEXT", vertexAttribI4iv);
        ASSIGN("glVertexAttribI4svEXT", vertexAttribI4sv);
        ASSIGN("glVertexAttribI4ubvEXT", vertexAttribI4ubv);
        ASSIGN("glVertexAttribI4uiEXT", vertexAttribI4ui);
        ASSIGN("glVertexAttribI4uivEXT", vertexAttribI4uiv);
        ASSIGN("glVertexAttribI4usvEXT", vertexAttribI4usv);
        ASSIGN("glVertexAttribIPointerEXT", vertexAttribIPointer);
    }

    if (extensions.count("GL_OES_single_precision") != 0)
    {
        ASSIGN("glClearDepthfOES", clearDepthf);
        ASSIGN("glDepthRangefOES", depthRangef);
    }
}

void DispatchTableGL::initProcsGLES(const gl::Version &version,
                                    const std::set<std::string> &extensions)
{
    if (version >= gl::Version(2, 0))
    {
        ASSIGN("glActiveTexture", activeTexture);
        ASSIGN("glAttachShader", attachShader);
        ASSIGN("glBindAttribLocation", bindAttribLocation);
        ASSIGN("glBindBuffer", bindBuffer);
        ASSIGN("glBindFramebuffer", bindFramebuffer);
        ASSIGN("glBindRenderbuffer", bindRenderbuffer);
        ASSIGN("glBindTexture", bindTexture);
        ASSIGN("glBlendColor", blendColor);
        ASSIGN("glBlendEquation", blendEquation);
        ASSIGN("glBlendEquationSeparate", blendEquationSeparate);
        ASSIGN("glBlendFunc", blendFunc);
        ASSIGN("glBlendFuncSeparate", blendFuncSeparate);
        ASSIGN("glBufferData", bufferData);
        ASSIGN("glBufferSubData", bufferSubData);
        ASSIGN("glCheckFramebufferStatus", checkFramebufferStatus);
        ASSIGN("glClear", clear);
        ASSIGN("glClearColor", clearColor);
        ASSIGN("glClearDepthf", clearDepthf);
        ASSIGN("glClearStencil", clearStencil);
        ASSIGN("glColorMask", colorMask);
        ASSIGN("glCompileShader", compileShader);
        ASSIGN("glCompressedTexImage2D", compressedTexImage2D);
        ASSIGN("glCompressedTexSubImage2D", compressedTexSubImage2D);
        ASSIGN("glCopyTexImage2D", copyTexImage2D);
        ASSIGN("glCopyTexSubImage2D", copyTexSubImage2D);
        ASSIGN("glCreateProgram", createProgram);
        ASSIGN("glCreateShader", createShader);
        ASSIGN("glCullFace", cullFace);
        ASSIGN("glDeleteBuffers", deleteBuffers);
        ASSIGN("glDeleteFramebuffers", deleteFramebuffers);
        ASSIGN("glDeleteProgram", deleteProgram);
        ASSIGN("glDeleteRenderbuffers", deleteRenderbuffers);
        ASSIGN("glDeleteShader", deleteShader);
        ASSIGN("glDeleteTextures", deleteTextures);
        ASSIGN("glDepthFunc", depthFunc);
        ASSIGN("glDepthMask", depthMask);
        ASSIGN("glDepthRangef", depthRangef);
        ASSIGN("glDetachShader", detachShader);
        ASSIGN("glDisable", disable);
        ASSIGN("glDisableVertexAttribArray", disableVertexAttribArray);
        ASSIGN("glDrawArrays", drawArrays);
        ASSIGN("glDrawElements", drawElements);
        ASSIGN("glEnable", enable);
        ASSIGN("glEnableVertexAttribArray", enableVertexAttribArray);
        ASSIGN("glFinish", finish);
        ASSIGN("glFlush", flush);
        ASSIGN("glFramebufferRenderbuffer", framebufferRenderbuffer);
        ASSIGN("glFramebufferTexture2D", framebufferTexture2D);
        ASSIGN("glFrontFace", frontFace);
        ASSIGN("glGenBuffers", genBuffers);
        ASSIGN("glGenFramebuffers", genFramebuffers);
        ASSIGN("glGenRenderbuffers", genRenderbuffers);
        ASSIGN("glGenTextures", genTextures);
        ASSIGN("glGenerateMipmap", generateMipmap);
        ASSIGN("glGetActiveAttrib", getActiveAttrib);
        ASSIGN("glGetActiveUniform", getActiveUniform);
        ASSIGN("glGetAttachedShaders", getAttachedShaders);
        ASSIGN("glGetAttribLocation", getAttribLocation);
        ASSIGN("glGetBooleanv", getBooleanv);
        ASSIGN("glGetBufferParameteriv", getBufferParameteriv);
        ASSIGN("glGetError", getError);
        ASSIGN("glGetFloatv", getFloatv);
        ASSIGN("glGetFramebufferAttachmentParameteriv", getFramebufferAttachmentParameteriv);
        ASSIGN("glGetIntegerv", getIntegerv);
        ASSIGN("glGetProgramInfoLog", getProgramInfoLog);
        ASSIGN("glGetProgramiv", getProgramiv);
        ASSIGN("glGetRenderbufferParameteriv", getRenderbufferParameteriv);
        ASSIGN("glGetShaderInfoLog", getShaderInfoLog);
        ASSIGN("glGetShaderPrecisionFormat", getShaderPrecisionFormat);
        ASSIGN("glGetShaderSource", getShaderSource);
        ASSIGN("glGetShaderiv", getShaderiv);
        ASSIGN("glGetString", getString);
        ASSIGN("glGetTexParameterfv", getTexParameterfv);
        ASSIGN("glGetTexParameteriv", getTexParameteriv);
        ASSIGN("glGetUniformLocation", getUniformLocation);
        ASSIGN("glGetUniformfv", getUniformfv);
        ASSIGN("glGetUniformiv", getUniformiv);
        ASSIGN("glGetVertexAttribPointerv", getVertexAttribPointerv);
        ASSIGN("glGetVertexAttribfv", getVertexAttribfv);
        ASSIGN("glGetVertexAttribiv", getVertexAttribiv);
        ASSIGN("glHint", hint);
        ASSIGN("glIsBuffer", isBuffer);
        ASSIGN("glIsEnabled", isEnabled);
        ASSIGN("glIsFramebuffer", isFramebuffer);
        ASSIGN("glIsProgram", isProgram);
        ASSIGN("glIsRenderbuffer", isRenderbuffer);
        ASSIGN("glIsShader", isShader);
        ASSIGN("glIsTexture", isTexture);
        ASSIGN("glLineWidth", lineWidth);
        ASSIGN("glLinkProgram", linkProgram);
        ASSIGN("glPixelStorei", pixelStorei);
        ASSIGN("glPolygonOffset", polygonOffset);
        ASSIGN("glReadPixels", readPixels);
        ASSIGN("glReleaseShaderCompiler", releaseShaderCompiler);
        ASSIGN("glRenderbufferStorage", renderbufferStorage);
        ASSIGN("glSampleCoverage", sampleCoverage);
        ASSIGN("glScissor", scissor);
        ASSIGN("glShaderBinary", shaderBinary);
        ASSIGN("glShaderSource", shaderSource);
        ASSIGN("glStencilFunc", stencilFunc);
        ASSIGN("glStencilFuncSeparate", stencilFuncSeparate);
        ASSIGN("glStencilMask", stencilMask);
        ASSIGN("glStencilMaskSeparate", stencilMaskSeparate);
        ASSIGN("glStencilOp", stencilOp);
        ASSIGN("glStencilOpSeparate", stencilOpSeparate);
        ASSIGN("glTexImage2D", texImage2D);
        ASSIGN("glTexParameterf", texParameterf);
        ASSIGN("glTexParameterfv", texParameterfv);
        ASSIGN("glTexParameteri", texParameteri);
        ASSIGN("glTexParameteriv", texParameteriv);
        ASSIGN("glTexSubImage2D", texSubImage2D);
        ASSIGN("glUniform1f", uniform1f);
        ASSIGN("glUniform1fv", uniform1fv);
        ASSIGN("glUniform1i", uniform1i);
        ASSIGN("glUniform1iv", uniform1iv);
        ASSIGN("glUniform2f", uniform2f);
        ASSIGN("glUniform2fv", uniform2fv);
        ASSIGN("glUniform2i", uniform2i);
        ASSIGN("glUniform2iv", uniform2iv);
        ASSIGN("glUniform3f", uniform3f);
        ASSIGN("glUniform3fv", uniform3fv);
        ASSIGN("glUniform3i", uniform3i);
        ASSIGN("glUniform3iv", uniform3iv);
        ASSIGN("glUniform4f", uniform4f);
        ASSIGN("glUniform4fv", uniform4fv);
        ASSIGN("glUniform4i", uniform4i);
        ASSIGN("glUniform4iv", uniform4iv);
        ASSIGN("glUniformMatrix2fv", uniformMatrix2fv);
        ASSIGN("glUniformMatrix3fv", uniformMatrix3fv);
        ASSIGN("glUniformMatrix4fv", uniformMatrix4fv);
        ASSIGN("glUseProgram", useProgram);
        ASSIGN("glValidateProgram", validateProgram);
        ASSIGN("glVertexAttrib1f", vertexAttrib1f);
        ASSIGN("glVertexAttrib1fv", vertexAttrib1fv);
        ASSIGN("glVertexAttrib2f", vertexAttrib2f);
        ASSIGN("glVertexAttrib2fv", vertexAttrib2fv);
        ASSIGN("glVertexAttrib3f", vertexAttrib3f);
        ASSIGN("glVertexAttrib3fv", vertexAttrib3fv);
        ASSIGN("glVertexAttrib4f", vertexAttrib4f);
        ASSIGN("glVertexAttrib4fv", vertexAttrib4fv);
        ASSIGN("glVertexAttribPointer", vertexAttribPointer);
        ASSIGN("glViewport", viewport);
    }

    if (version >= gl::Version(3, 0))
    {
        ASSIGN("glBeginQuery", beginQuery);
        ASSIGN("glBeginTransformFeedback", beginTransformFeedback);
        ASSIGN("glBindBufferBase", bindBufferBase);
        ASSIGN("glBindBufferRange", bindBufferRange);
        ASSIGN("glBindSampler", bindSampler);
        ASSIGN("glBindTransformFeedback", bindTransformFeedback);
        ASSIGN("glBindVertexArray", bindVertexArray);
        ASSIGN("glBlitFramebuffer", blitFramebuffer);
        ASSIGN("glClearBufferfi", clearBufferfi);
        ASSIGN("glClearBufferfv", clearBufferfv);
        ASSIGN("glClearBufferiv", clearBufferiv);
        ASSIGN("glClearBufferuiv", clearBufferuiv);
        ASSIGN("glClientWaitSync", clientWaitSync);
        ASSIGN("glCompressedTexImage3D", compressedTexImage3D);
        ASSIGN("glCompressedTexSubImage3D", compressedTexSubImage3D);
        ASSIGN("glCopyBufferSubData", copyBufferSubData);
        ASSIGN("glCopyTexSubImage3D", copyTexSubImage3D);
        ASSIGN("glDeleteQueries", deleteQueries);
        ASSIGN("glDeleteSamplers", deleteSamplers);
        ASSIGN("glDeleteSync", deleteSync);
        ASSIGN("glDeleteTransformFeedbacks", deleteTransformFeedbacks);
        ASSIGN("glDeleteVertexArrays", deleteVertexArrays);
        ASSIGN("glDrawArraysInstanced", drawArraysInstanced);
        ASSIGN("glDrawBuffers", drawBuffers);
        ASSIGN("glDrawElementsInstanced", drawElementsInstanced);
        ASSIGN("glDrawRangeElements", drawRangeElements);
        ASSIGN("glEndQuery", endQuery);
        ASSIGN("glEndTransformFeedback", endTransformFeedback);
        ASSIGN("glFenceSync", fenceSync);
        ASSIGN("glFlushMappedBufferRange", flushMappedBufferRange);
        ASSIGN("glFramebufferTextureLayer", framebufferTextureLayer);
        ASSIGN("glGenQueries", genQueries);
        ASSIGN("glGenSamplers", genSamplers);
        ASSIGN("glGenTransformFeedbacks", genTransformFeedbacks);
        ASSIGN("glGenVertexArrays", genVertexArrays);
        ASSIGN("glGetActiveUniformBlockName", getActiveUniformBlockName);
        ASSIGN("glGetActiveUniformBlockiv", getActiveUniformBlockiv);
        ASSIGN("glGetActiveUniformsiv", getActiveUniformsiv);
        ASSIGN("glGetBufferParameteri64v", getBufferParameteri64v);
        ASSIGN("glGetBufferPointerv", getBufferPointerv);
        ASSIGN("glGetFragDataLocation", getFragDataLocation);
        ASSIGN("glGetInteger64i_v", getInteger64i_v);
        ASSIGN("glGetInteger64v", getInteger64v);
        ASSIGN("glGetIntegeri_v", getIntegeri_v);
        ASSIGN("glGetInternalformativ", getInternalformativ);
        ASSIGN("glGetProgramBinary", getProgramBinary);
        ASSIGN("glGetQueryObjectuiv", getQueryObjectuiv);
        ASSIGN("glGetQueryiv", getQueryiv);
        ASSIGN("glGetSamplerParameterfv", getSamplerParameterfv);
        ASSIGN("glGetSamplerParameteriv", getSamplerParameteriv);
        ASSIGN("glGetStringi", getStringi);
        ASSIGN("glGetSynciv", getSynciv);
        ASSIGN("glGetTransformFeedbackVarying", getTransformFeedbackVarying);
        ASSIGN("glGetUniformBlockIndex", getUniformBlockIndex);
        ASSIGN("glGetUniformIndices", getUniformIndices);
        ASSIGN("glGetUniformuiv", getUniformuiv);
        ASSIGN("glGetVertexAttribIiv", getVertexAttribIiv);
        ASSIGN("glGetVertexAttribIuiv", getVertexAttribIuiv);
        ASSIGN("glInvalidateFramebuffer", invalidateFramebuffer);
        ASSIGN("glInvalidateSubFramebuffer", invalidateSubFramebuffer);
        ASSIGN("glIsQuery", isQuery);
        ASSIGN("glIsSampler", isSampler);
        ASSIGN("glIsSync", isSync);
        ASSIGN("glIsTransformFeedback", isTransformFeedback);
        ASSIGN("glIsVertexArray", isVertexArray);
        ASSIGN("glMapBufferRange", mapBufferRange);
        ASSIGN("glPauseTransformFeedback", pauseTransformFeedback);
        ASSIGN("glProgramBinary", programBinary);
        ASSIGN("glProgramParameteri", programParameteri);
        ASSIGN("glReadBuffer", readBuffer);
        ASSIGN("glRenderbufferStorageMultisample", renderbufferStorageMultisample);
        ASSIGN("glResumeTransformFeedback", resumeTransformFeedback);
        ASSIGN("glSamplerParameterf", samplerParameterf);
        ASSIGN("glSamplerParameterfv", samplerParameterfv);
        ASSIGN("glSamplerParameteri", samplerParameteri);
        ASSIGN("glSamplerParameteriv", samplerParameteriv);
        ASSIGN("glTexImage3D", texImage3D);
        ASSIGN("glTexStorage2D", texStorage2D);
        ASSIGN("glTexStorage3D", texStorage3D);
        ASSIGN("glTexSubImage3D", texSubImage3D);
        ASSIGN("glTransformFeedbackVaryings", transformFeedbackVaryings);
        ASSIGN("glUniform1ui", uniform1ui);
        ASSIGN("glUniform1uiv", uniform1uiv);
        ASSIGN("glUniform2ui", uniform2ui);
        ASSIGN("glUniform2uiv", uniform2uiv);
        ASSIGN("glUniform3ui", uniform3ui);
        ASSIGN("glUniform3uiv", uniform3uiv);
        ASSIGN("glUniform4ui", uniform4ui);
        ASSIGN("glUniform4uiv", uniform4uiv);
        ASSIGN("glUniformBlockBinding", uniformBlockBinding);
        ASSIGN("glUniformMatrix2x3fv", uniformMatrix2x3fv);
        ASSIGN("glUniformMatrix2x4fv", uniformMatrix2x4fv);
        ASSIGN("glUniformMatrix3x2fv", uniformMatrix3x2fv);
        ASSIGN("glUniformMatrix3x4fv", uniformMatrix3x4fv);
        ASSIGN("glUniformMatrix4x2fv", uniformMatrix4x2fv);
        ASSIGN("glUniformMatrix4x3fv", uniformMatrix4x3fv);
        ASSIGN("glUnmapBuffer", unmapBuffer);
        ASSIGN("glVertexAttribDivisor", vertexAttribDivisor);
        ASSIGN("glVertexAttribI4i", vertexAttribI4i);
        ASSIGN("glVertexAttribI4iv", vertexAttribI4iv);
        ASSIGN("glVertexAttribI4ui", vertexAttribI4ui);
        ASSIGN("glVertexAttribI4uiv", vertexAttribI4uiv);
        ASSIGN("glVertexAttribIPointer", vertexAttribIPointer);
        ASSIGN("glWaitSync", waitSync);
    }

    if (version >= gl::Version(3, 1))
    {
        ASSIGN("glActiveShaderProgram", activeShaderProgram);
        ASSIGN("glBindImageTexture", bindImageTexture);
        ASSIGN("glBindProgramPipeline", bindProgramPipeline);
        ASSIGN("glBindVertexBuffer", bindVertexBuffer);
        ASSIGN("glCreateShaderProgramv", createShaderProgramv);
        ASSIGN("glDeleteProgramPipelines", deleteProgramPipelines);
        ASSIGN("glDispatchCompute", dispatchCompute);
        ASSIGN("glDispatchComputeIndirect", dispatchComputeIndirect);
        ASSIGN("glDrawArraysIndirect", drawArraysIndirect);
        ASSIGN("glDrawElementsIndirect", drawElementsIndirect);
        ASSIGN("glFramebufferParameteri", framebufferParameteri);
        ASSIGN("glGenProgramPipelines", genProgramPipelines);
        ASSIGN("glGetBooleani_v", getBooleani_v);
        ASSIGN("glGetFramebufferParameteriv", getFramebufferParameteriv);
        ASSIGN("glGetMultisamplefv", getMultisamplefv);
        ASSIGN("glGetProgramInterfaceiv", getProgramInterfaceiv);
        ASSIGN("glGetProgramPipelineInfoLog", getProgramPipelineInfoLog);
        ASSIGN("glGetProgramPipelineiv", getProgramPipelineiv);
        ASSIGN("glGetProgramResourceIndex", getProgramResourceIndex);
        ASSIGN("glGetProgramResourceLocation", getProgramResourceLocation);
        ASSIGN("glGetProgramResourceName", getProgramResourceName);
        ASSIGN("glGetProgramResourceiv", getProgramResourceiv);
        ASSIGN("glGetTexLevelParameterfv", getTexLevelParameterfv);
        ASSIGN("glGetTexLevelParameteriv", getTexLevelParameteriv);
        ASSIGN("glIsProgramPipeline", isProgramPipeline);
        ASSIGN("glMemoryBarrier", memoryBarrier);
        ASSIGN("glMemoryBarrierByRegion", memoryBarrierByRegion);
        ASSIGN("glProgramUniform1f", programUniform1f);
        ASSIGN("glProgramUniform1fv", programUniform1fv);
        ASSIGN("glProgramUniform1i", programUniform1i);
        ASSIGN("glProgramUniform1iv", programUniform1iv);
        ASSIGN("glProgramUniform1ui", programUniform1ui);
        ASSIGN("glProgramUniform1uiv", programUniform1uiv);
        ASSIGN("glProgramUniform2f", programUniform2f);
        ASSIGN("glProgramUniform2fv", programUniform2fv);
        ASSIGN("glProgramUniform2i", programUniform2i);
        ASSIGN("glProgramUniform2iv", programUniform2iv);
        ASSIGN("glProgramUniform2ui", programUniform2ui);
        ASSIGN("glProgramUniform2uiv", programUniform2uiv);
        ASSIGN("glProgramUniform3f", programUniform3f);
        ASSIGN("glProgramUniform3fv", programUniform3fv);
        ASSIGN("glProgramUniform3i", programUniform3i);
        ASSIGN("glProgramUniform3iv", programUniform3iv);
        ASSIGN("glProgramUniform3ui", programUniform3ui);
        ASSIGN("glProgramUniform3uiv", programUniform3uiv);
        ASSIGN("glProgramUniform4f", programUniform4f);
        ASSIGN("glProgramUniform4fv", programUniform4fv);
        ASSIGN("glProgramUniform4i", programUniform4i);
        ASSIGN("glProgramUniform4iv", programUniform4iv);
        ASSIGN("glProgramUniform4ui", programUniform4ui);
        ASSIGN("glProgramUniform4uiv", programUniform4uiv);
        ASSIGN("glProgramUniformMatrix2fv", programUniformMatrix2fv);
        ASSIGN("glProgramUniformMatrix2x3fv", programUniformMatrix2x3fv);
        ASSIGN("glProgramUniformMatrix2x4fv", programUniformMatrix2x4fv);
        ASSIGN("glProgramUniformMatrix3fv", programUniformMatrix3fv);
        ASSIGN("glProgramUniformMatrix3x2fv", programUniformMatrix3x2fv);
        ASSIGN("glProgramUniformMatrix3x4fv", programUniformMatrix3x4fv);
        ASSIGN("glProgramUniformMatrix4fv", programUniformMatrix4fv);
        ASSIGN("glProgramUniformMatrix4x2fv", programUniformMatrix4x2fv);
        ASSIGN("glProgramUniformMatrix4x3fv", programUniformMatrix4x3fv);
        ASSIGN("glSampleMaski", sampleMaski);
        ASSIGN("glTexStorage2DMultisample", texStorage2DMultisample);
        ASSIGN("glUseProgramStages", useProgramStages);
        ASSIGN("glValidateProgramPipeline", validateProgramPipeline);
        ASSIGN("glVertexAttribBinding", vertexAttribBinding);
        ASSIGN("glVertexAttribFormat", vertexAttribFormat);
        ASSIGN("glVertexAttribIFormat", vertexAttribIFormat);
        ASSIGN("glVertexBindingDivisor", vertexBindingDivisor);
    }

    if (version >= gl::Version(3, 2))
    {
        ASSIGN("glBlendBarrier", blendBarrier);
        ASSIGN("glBlendEquationSeparatei", blendEquationSeparatei);
        ASSIGN("glBlendEquationi", blendEquationi);
        ASSIGN("glBlendFuncSeparatei", blendFuncSeparatei);
        ASSIGN("glBlendFunci", blendFunci);
        ASSIGN("glColorMaski", colorMaski);
        ASSIGN("glCopyImageSubData", copyImageSubData);
        ASSIGN("glDebugMessageCallback", debugMessageCallback);
        ASSIGN("glDebugMessageControl", debugMessageControl);
        ASSIGN("glDebugMessageInsert", debugMessageInsert);
        ASSIGN("glDisablei", disablei);
        ASSIGN("glDrawElementsBaseVertex", drawElementsBaseVertex);
        ASSIGN("glDrawElementsInstancedBaseVertex", drawElementsInstancedBaseVertex);
        ASSIGN("glDrawRangeElementsBaseVertex", drawRangeElementsBaseVertex);
        ASSIGN("glEnablei", enablei);
        ASSIGN("glFramebufferTexture", framebufferTexture);
        ASSIGN("glGetDebugMessageLog", getDebugMessageLog);
        ASSIGN("glGetGraphicsResetStatus", getGraphicsResetStatus);
        ASSIGN("glGetObjectLabel", getObjectLabel);
        ASSIGN("glGetObjectPtrLabel", getObjectPtrLabel);
        ASSIGN("glGetPointerv", getPointerv);
        ASSIGN("glGetSamplerParameterIiv", getSamplerParameterIiv);
        ASSIGN("glGetSamplerParameterIuiv", getSamplerParameterIuiv);
        ASSIGN("glGetTexParameterIiv", getTexParameterIiv);
        ASSIGN("glGetTexParameterIuiv", getTexParameterIuiv);
        ASSIGN("glGetnUniformfv", getnUniformfv);
        ASSIGN("glGetnUniformiv", getnUniformiv);
        ASSIGN("glGetnUniformuiv", getnUniformuiv);
        ASSIGN("glIsEnabledi", isEnabledi);
        ASSIGN("glMinSampleShading", minSampleShading);
        ASSIGN("glObjectLabel", objectLabel);
        ASSIGN("glObjectPtrLabel", objectPtrLabel);
        ASSIGN("glPatchParameteri", patchParameteri);
        ASSIGN("glPopDebugGroup", popDebugGroup);
        ASSIGN("glPrimitiveBoundingBox", primitiveBoundingBox);
        ASSIGN("glPushDebugGroup", pushDebugGroup);
        ASSIGN("glReadnPixels", readnPixels);
        ASSIGN("glSamplerParameterIiv", samplerParameterIiv);
        ASSIGN("glSamplerParameterIuiv", samplerParameterIuiv);
        ASSIGN("glTexBuffer", texBuffer);
        ASSIGN("glTexBufferRange", texBufferRange);
        ASSIGN("glTexParameterIiv", texParameterIiv);
        ASSIGN("glTexParameterIuiv", texParameterIuiv);
        ASSIGN("glTexStorage3DMultisample", texStorage3DMultisample);
    }

    if (extensions.count("GL_EXT_base_instance") != 0)
    {
        ASSIGN("glDrawArraysInstancedBaseInstanceEXT", drawArraysInstancedBaseInstance);
        ASSIGN("glDrawElementsInstancedBaseInstanceEXT", drawElementsInstancedBaseInstance);
        ASSIGN("glDrawElementsInstancedBaseVertexBaseInstanceEXT",
               drawElementsInstancedBaseVertexBaseInstance);
    }

    if (extensions.count("GL_EXT_blend_func_extended") != 0)
    {
        ASSIGN("glBindFragDataLocationEXT", bindFragDataLocation);
        ASSIGN("glBindFragDataLocationIndexedEXT", bindFragDataLocationIndexed);
        ASSIGN("glGetFragDataIndexEXT", getFragDataIndex);
        ASSIGN("glGetProgramResourceLocationIndexEXT", getProgramResourceLocationIndex);
    }

    if (extensions.count("GL_EXT_buffer_storage") != 0)
    {
        ASSIGN("glBufferStorageEXT", bufferStorage);
    }

    if (extensions.count("GL_EXT_clear_texture") != 0)
    {
        ASSIGN("glClearTexImageEXT", clearTexImage);
        ASSIGN("glClearTexSubImageEXT", clearTexSubImage);
    }

    if (extensions.count("GL_EXT_copy_image") != 0)
    {
        ASSIGN("glCopyImageSubDataEXT", copyImageSubData);
    }

    if (extensions.count("GL_EXT_discard_framebuffer") != 0)
    {
        ASSIGN("glDiscardFramebufferEXT", discardFramebufferEXT);
    }

    if (extensions.count("GL_EXT_disjoint_timer_query") != 0)
    {
        ASSIGN("glBeginQueryEXT", beginQuery);
        ASSIGN("glDeleteQueriesEXT", deleteQueries);
        ASSIGN("glEndQueryEXT", endQuery);
        ASSIGN("glGenQueriesEXT", genQueries);
        ASSIGN("glGetQueryObjecti64vEXT", getQueryObjecti64v);
        ASSIGN("glGetQueryObjectivEXT", getQueryObjectiv);
        ASSIGN("glGetQueryObjectui64vEXT", getQueryObjectui64v);
        ASSIGN("glGetQueryObjectuivEXT", getQueryObjectuiv);
        ASSIGN("glGetQueryivEXT", getQueryiv);
        ASSIGN("glIsQueryEXT", isQuery);
        ASSIGN("glQueryCounterEXT", queryCounter);
    }

    if (extensions.count("GL_EXT_draw_buffers") != 0)
    {
        ASSIGN("glDrawBuffersEXT", drawBuffers);
    }

    if (extensions.count("GL_EXT_draw_buffers_indexed") != 0)
    {
        ASSIGN("glBlendEquationSeparateiEXT", blendEquationSeparatei);
        ASSIGN("glBlendEquationiEXT", blendEquationi);
        ASSIGN("glBlendFuncSeparateiEXT", blendFuncSeparatei);
        ASSIGN("glBlendFunciEXT", blendFunci);
        ASSIGN("glColorMaskiEXT", colorMaski);
        ASSIGN("glDisableiEXT", disablei);
        ASSIGN("glEnableiEXT", enablei);
        ASSIGN("glIsEnablediEXT", isEnabledi);
    }

    if (extensions.count("GL_EXT_draw_elements_base_vertex") != 0)
    {
        ASSIGN("glDrawElementsBaseVertexEXT", drawElementsBaseVertex);
        ASSIGN("glDrawElementsInstancedBaseVertexEXT", drawElementsInstancedBaseVertex);
        ASSIGN("glDrawRangeElementsBaseVertexEXT", drawRangeElementsBaseVertex);
        ASSIGN("glMultiDrawElementsBaseVertexEXT", multiDrawElementsBaseVertex);
    }

    if (extensions.count("GL_EXT_draw_transform_feedback") != 0)
    {
        ASSIGN("glDrawTransformFeedbackEXT", drawTransformFeedback);
        ASSIGN("glDrawTransformFeedbackInstancedEXT", drawTransformFeedbackInstanced);
    }

    if (extensions.count("GL_EXT_geometry_shader") != 0)
    {
        ASSIGN("glFramebufferTextureEXT", framebufferTexture);
    }

    if (extensions.count("GL_EXT_instanced_arrays") != 0)
    {
        ASSIGN("glVertexAttribDivisorEXT", vertexAttribDivisor);
    }

    if (extensions.count("GL_EXT_map_buffer_range") != 0)
    {
        ASSIGN("glFlushMappedBufferRangeEXT", flushMappedBufferRange);
        ASSIGN("glMapBufferRangeEXT", mapBufferRange);
    }

    if (extensions.count("GL_EXT_multi_draw_indirect") != 0)
    {
        ASSIGN("glMultiDrawArraysIndirectEXT", multiDrawArraysIndirect);
        ASSIGN("glMultiDrawElementsIndirectEXT", multiDrawElementsIndirect);
    }

    if (extensions.count("GL_EXT_multisampled_render_to_texture") != 0)
    {
        ASSIGN("glRenderbufferStorageMultisampleEXT", renderbufferStorageMultisample);
    }

    if (extensions.count("GL_EXT_multiview_draw_buffers") != 0)
    {
        ASSIGN("glGetIntegeri_vEXT", getIntegeri_v);
    }

    if (extensions.count("GL_EXT_occlusion_query_boolean") != 0)
    {
        ASSIGN("glBeginQueryEXT", beginQuery);
        ASSIGN("glDeleteQueriesEXT", deleteQueries);
        ASSIGN("glEndQueryEXT", endQuery);
        ASSIGN("glGenQueriesEXT", genQueries);
        ASSIGN("glGetQueryObjectuivEXT", getQueryObjectuiv);
        ASSIGN("glGetQueryivEXT", getQueryiv);
        ASSIGN("glIsQueryEXT", isQuery);
    }

    if (extensions.count("GL_EXT_primitive_bounding_box") != 0)
    {
        ASSIGN("glPrimitiveBoundingBoxEXT", primitiveBoundingBox);
    }

    if (extensions.count("GL_EXT_robustness") != 0)
    {
        ASSIGN("glGetGraphicsResetStatusEXT", getGraphicsResetStatus);
        ASSIGN("glGetnUniformfvEXT", getnUniformfv);
        ASSIGN("glGetnUniformivEXT", getnUniformiv);
        ASSIGN("glReadnPixelsEXT", readnPixels);
    }

    if (extensions.count("GL_EXT_tessellation_shader") != 0)
    {
        ASSIGN("glPatchParameteriEXT", patchParameteri);
    }

    if (extensions.count("GL_EXT_texture_border_clamp") != 0)
    {
        ASSIGN("glGetSamplerParameterIivEXT", getSamplerParameterIiv);
        ASSIGN("glGetSamplerParameterIuivEXT", getSamplerParameterIuiv);
        ASSIGN("glGetTexParameterIivEXT", getTexParameterIiv);
        ASSIGN("glGetTexParameterIuivEXT", getTexParameterIuiv);
        ASSIGN("glSamplerParameterIivEXT", samplerParameterIiv);
        ASSIGN("glSamplerParameterIuivEXT", samplerParameterIuiv);
        ASSIGN("glTexParameterIivEXT", texParameterIiv);
        ASSIGN("glTexParameterIuivEXT", texParameterIuiv);
    }

    if (extensions.count("GL_EXT_texture_buffer") != 0)
    {
        ASSIGN("glTexBufferEXT", texBuffer);
        ASSIGN("glTexBufferRangeEXT", texBufferRange);
    }

    if (extensions.count("GL_EXT_texture_storage") != 0)
    {
        ASSIGN("glTexStorage1DEXT", texStorage1D);
        ASSIGN("glTexStorage2DEXT", texStorage2D);
        ASSIGN("glTexStorage3DEXT", texStorage3D);
        ASSIGN("glTextureStorage1DEXT", textureStorage1D);
        ASSIGN("glTextureStorage2DEXT", textureStorage2D);
        ASSIGN("glTextureStorage3DEXT", textureStorage3D);
    }

    if (extensions.count("GL_EXT_texture_view") != 0)
    {
        ASSIGN("glTextureViewEXT", textureView);
    }

    if (extensions.count("GL_KHR_debug") != 0)
    {
        ASSIGN("glDebugMessageCallbackKHR", debugMessageCallback);
        ASSIGN("glDebugMessageControlKHR", debugMessageControl);
        ASSIGN("glDebugMessageInsertKHR", debugMessageInsert);
        ASSIGN("glGetDebugMessageLogKHR", getDebugMessageLog);
        ASSIGN("glGetObjectLabelKHR", getObjectLabel);
        ASSIGN("glGetObjectPtrLabelKHR", getObjectPtrLabel);
        ASSIGN("glGetPointervKHR", getPointerv);
        ASSIGN("glObjectLabelKHR", objectLabel);
        ASSIGN("glObjectPtrLabelKHR", objectPtrLabel);
        ASSIGN("glPopDebugGroupKHR", popDebugGroup);
        ASSIGN("glPushDebugGroupKHR", pushDebugGroup);
    }

    if (extensions.count("GL_KHR_robustness") != 0)
    {
        ASSIGN("glGetGraphicsResetStatusKHR", getGraphicsResetStatus);
        ASSIGN("glGetnUniformfvKHR", getnUniformfv);
        ASSIGN("glGetnUniformivKHR", getnUniformiv);
        ASSIGN("glGetnUniformuivKHR", getnUniformuiv);
        ASSIGN("glReadnPixelsKHR", readnPixels);
    }

    if (extensions.count("GL_OES_EGL_image") != 0)
    {
        ASSIGN("glEGLImageTargetRenderbufferStorageOES", eGLImageTargetRenderbufferStorageOES);
        ASSIGN("glEGLImageTargetTexture2DOES", eGLImageTargetTexture2DOES);
    }

    if (extensions.count("GL_OES_copy_image") != 0)
    {
        ASSIGN("glCopyImageSubDataOES", copyImageSubData);
    }

    if (extensions.count("GL_OES_draw_buffers_indexed") != 0)
    {
        ASSIGN("glBlendEquationSeparateiOES", blendEquationSeparatei);
        ASSIGN("glBlendEquationiOES", blendEquationi);
        ASSIGN("glBlendFuncSeparateiOES", blendFuncSeparatei);
        ASSIGN("glBlendFunciOES", blendFunci);
        ASSIGN("glColorMaskiOES", colorMaski);
        ASSIGN("glDisableiOES", disablei);
        ASSIGN("glEnableiOES", enablei);
        ASSIGN("glIsEnablediOES", isEnabledi);
    }

    if (extensions.count("GL_OES_draw_elements_base_vertex") != 0)
    {
        ASSIGN("glDrawElementsBaseVertexOES", drawElementsBaseVertex);
        ASSIGN("glDrawElementsInstancedBaseVertexOES", drawElementsInstancedBaseVertex);
        ASSIGN("glDrawRangeElementsBaseVertexOES", drawRangeElementsBaseVertex);
        ASSIGN("glMultiDrawElementsBaseVertexOES", multiDrawElementsBaseVertex);
    }

    if (extensions.count("GL_OES_geometry_shader") != 0)
    {
        ASSIGN("glFramebufferTextureOES", framebufferTexture);
    }

    if (extensions.count("GL_OES_get_program_binary") != 0)
    {
        ASSIGN("glGetProgramBinaryOES", getProgramBinary);
        ASSIGN("glProgramBinaryOES", programBinary);
    }

    if (extensions.count("GL_OES_mapbuffer") != 0)
    {
        ASSIGN("glGetBufferPointervOES", getBufferPointerv);
        ASSIGN("glMapBufferOES", mapBuffer);
        ASSIGN("glUnmapBufferOES", unmapBuffer);
    }

    if (extensions.count("GL_OES_primitive_bounding_box") != 0)
    {
        ASSIGN("glPrimitiveBoundingBoxOES", primitiveBoundingBox);
    }

    if (extensions.count("GL_OES_sample_shading") != 0)
    {
        ASSIGN("glMinSampleShadingOES", minSampleShading);
    }

    if (extensions.count("GL_OES_tessellation_shader") != 0)
    {
        ASSIGN("glPatchParameteriOES", patchParameteri);
    }

    if (extensions.count("GL_OES_texture_3D") != 0)
    {
        ASSIGN("glCompressedTexImage3DOES", compressedTexImage3D);
        ASSIGN("glCompressedTexSubImage3DOES", compressedTexSubImage3D);
        ASSIGN("glCopyTexSubImage3DOES", copyTexSubImage3D);
        ASSIGN("glFramebufferTexture3DOES", framebufferTexture3D);
        ASSIGN("glTexImage3DOES", texImage3D);
        ASSIGN("glTexSubImage3DOES", texSubImage3D);
    }

    if (extensions.count("GL_OES_texture_border_clamp") != 0)
    {
        ASSIGN("glGetSamplerParameterIivOES", getSamplerParameterIiv);
        ASSIGN("glGetSamplerParameterIuivOES", getSamplerParameterIuiv);
        ASSIGN("glGetTexParameterIivOES", getTexParameterIiv);
        ASSIGN("glGetTexParameterIuivOES", getTexParameterIuiv);
        ASSIGN("glSamplerParameterIivOES", samplerParameterIiv);
        ASSIGN("glSamplerParameterIuivOES", samplerParameterIuiv);
        ASSIGN("glTexParameterIivOES", texParameterIiv);
        ASSIGN("glTexParameterIuivOES", texParameterIuiv);
    }

    if (extensions.count("GL_OES_texture_buffer") != 0)
    {
        ASSIGN("glTexBufferOES", texBuffer);
        ASSIGN("glTexBufferRangeOES", texBufferRange);
    }

    if (extensions.count("GL_OES_texture_storage_multisample_2d_array") != 0)
    {
        ASSIGN("glTexStorage3DMultisampleOES", texStorage3DMultisample);
    }

    if (extensions.count("GL_OES_texture_view") != 0)
    {
        ASSIGN("glTextureViewOES", textureView);
    }

    if (extensions.count("GL_OES_vertex_array_object") != 0)
    {
        ASSIGN("glBindVertexArrayOES", bindVertexArray);
        ASSIGN("glDeleteVertexArraysOES", deleteVertexArrays);
        ASSIGN("glGenVertexArraysOES", genVertexArrays);
        ASSIGN("glIsVertexArrayOES", isVertexArray);
    }

    if (extensions.count("GL_OES_viewport_array") != 0)
    {
        ASSIGN("glDisableiOES", disablei);
        ASSIGN("glEnableiOES", enablei);
        ASSIGN("glGetFloati_vOES", getFloati_v);
        ASSIGN("glIsEnablediOES", isEnabledi);
        ASSIGN("glScissorArrayvOES", scissorArrayv);
        ASSIGN("glScissorIndexedOES", scissorIndexed);
        ASSIGN("glScissorIndexedvOES", scissorIndexedv);
        ASSIGN("glViewportArrayvOES", viewportArrayv);
        ASSIGN("glViewportIndexedfOES", viewportIndexedf);
        ASSIGN("glViewportIndexedfvOES", viewportIndexedfv);
    }
}

void DispatchTableGL::initProcsSharedExtensions(const std::set<std::string> &extensions)
{
    if (extensions.count("GL_EXT_blend_minmax") != 0)
    {
        ASSIGN("glBlendEquationEXT", blendEquation);
    }

    if (extensions.count("GL_EXT_debug_label") != 0)
    {
        ASSIGN("glGetObjectLabelEXT", getObjectLabel);
    }

    if (extensions.count("GL_EXT_draw_instanced") != 0)
    {
        ASSIGN("glDrawArraysInstancedEXT", drawArraysInstanced);
        ASSIGN("glDrawElementsInstancedEXT", drawElementsInstanced);
    }

    if (extensions.count("GL_EXT_multi_draw_arrays") != 0)
    {
        ASSIGN("glMultiDrawArraysEXT", multiDrawArrays);
        ASSIGN("glMultiDrawElementsEXT", multiDrawElements);
    }

    if (extensions.count("GL_EXT_separate_shader_objects") != 0)
    {
        ASSIGN("glActiveShaderProgramEXT", activeShaderProgram);
        ASSIGN("glBindProgramPipelineEXT", bindProgramPipeline);
        ASSIGN("glCreateShaderProgramvEXT", createShaderProgramv);
        ASSIGN("glDeleteProgramPipelinesEXT", deleteProgramPipelines);
        ASSIGN("glGenProgramPipelinesEXT", genProgramPipelines);
        ASSIGN("glGetProgramPipelineInfoLogEXT", getProgramPipelineInfoLog);
        ASSIGN("glGetProgramPipelineivEXT", getProgramPipelineiv);
        ASSIGN("glIsProgramPipelineEXT", isProgramPipeline);
        ASSIGN("glProgramParameteriEXT", programParameteri);
        ASSIGN("glProgramUniform1fEXT", programUniform1f);
        ASSIGN("glProgramUniform1fvEXT", programUniform1fv);
        ASSIGN("glProgramUniform1iEXT", programUniform1i);
        ASSIGN("glProgramUniform1ivEXT", programUniform1iv);
        ASSIGN("glProgramUniform1uiEXT", programUniform1ui);
        ASSIGN("glProgramUniform1uivEXT", programUniform1uiv);
        ASSIGN("glProgramUniform2fEXT", programUniform2f);
        ASSIGN("glProgramUniform2fvEXT", programUniform2fv);
        ASSIGN("glProgramUniform2iEXT", programUniform2i);
        ASSIGN("glProgramUniform2ivEXT", programUniform2iv);
        ASSIGN("glProgramUniform2uiEXT", programUniform2ui);
        ASSIGN("glProgramUniform2uivEXT", programUniform2uiv);
        ASSIGN("glProgramUniform3fEXT", programUniform3f);
        ASSIGN("glProgramUniform3fvEXT", programUniform3fv);
        ASSIGN("glProgramUniform3iEXT", programUniform3i);
        ASSIGN("glProgramUniform3ivEXT", programUniform3iv);
        ASSIGN("glProgramUniform3uiEXT", programUniform3ui);
        ASSIGN("glProgramUniform3uivEXT", programUniform3uiv);
        ASSIGN("glProgramUniform4fEXT", programUniform4f);
        ASSIGN("glProgramUniform4fvEXT", programUniform4fv);
        ASSIGN("glProgramUniform4iEXT", programUniform4i);
        ASSIGN("glProgramUniform4ivEXT", programUniform4iv);
        ASSIGN("glProgramUniform4uiEXT", programUniform4ui);
        ASSIGN("glProgramUniform4uivEXT", programUniform4uiv);
        ASSIGN("glProgramUniformMatrix2fvEXT", programUniformMatrix2fv);
        ASSIGN("glProgramUniformMatrix2x3fvEXT", programUniformMatrix2x3fv);
        ASSIGN("glProgramUniformMatrix2x4fvEXT", programUniformMatrix2x4fv);
        ASSIGN("glProgramUniformMatrix3fvEXT", programUniformMatrix3fv);
        ASSIGN("glProgramUniformMatrix3x2fvEXT", programUniformMatrix3x2fv);
        ASSIGN("glProgramUniformMatrix3x4fvEXT", programUniformMatrix3x4fv);
        ASSIGN("glProgramUniformMatrix4fvEXT", programUniformMatrix4fv);
        ASSIGN("glProgramUniformMatrix4fvEXT", programUniformMatrix4fv);
        ASSIGN("glProgramUniformMatrix4x2fvEXT", programUniformMatrix4x2fv);
        ASSIGN("glProgramUniformMatrix4x3fvEXT", programUniformMatrix4x3fv);
        ASSIGN("glUseProgramStagesEXT", useProgramStages);
        ASSIGN("glValidateProgramPipelineEXT", validateProgramPipeline);
    }

    if (extensions.count("GL_NV_fence") != 0)
    {
        ASSIGN("glDeleteFencesNV", deleteFencesNV);
        ASSIGN("glFinishFenceNV", finishFenceNV);
        ASSIGN("glGenFencesNV", genFencesNV);
        ASSIGN("glGetFenceivNV", getFenceivNV);
        ASSIGN("glIsFenceNV", isFenceNV);
        ASSIGN("glSetFenceNV", setFenceNV);
        ASSIGN("glTestFenceNV", testFenceNV);
    }

    if (extensions.count("GL_NV_framebuffer_mixed_samples") != 0)
    {
        ASSIGN("glCoverageModulationNV", coverageModulationNV);
    }

    if (extensions.count("GL_NV_internalformat_sample_query") != 0)
    {
        ASSIGN("glGetInternalformatSampleivNV", getInternalformatSampleivNV);
    }

    if (extensions.count("GL_NV_path_rendering") != 0)
    {
        ASSIGN("glCoverFillPathInstancedNV", coverFillPathInstancedNV);
        ASSIGN("glCoverFillPathNV", coverFillPathNV);
        ASSIGN("glCoverStrokePathInstancedNV", coverStrokePathInstancedNV);
        ASSIGN("glCoverStrokePathNV", coverStrokePathNV);
        ASSIGN("glDeletePathsNV", deletePathsNV);
        ASSIGN("glGenPathsNV", genPathsNV);
        ASSIGN("glGetPathParameterfvNV", getPathParameterfvNV);
        ASSIGN("glGetPathParameterivNV", getPathParameterivNV);
        ASSIGN("glIsPathNV", isPathNV);
        ASSIGN("glMatrixLoadfEXT", matrixLoadfEXT);
        ASSIGN("glPathCommandsNV", pathCommandsNV);
        ASSIGN("glPathParameterfNV", pathParameterfNV);
        ASSIGN("glPathParameteriNV", pathParameteriNV);
        ASSIGN("glPathStencilFuncNV", pathStencilFuncNV);
        ASSIGN("glProgramPathFragmentInputGenNV", programPathFragmentInputGenNV);
        ASSIGN("glStencilFillPathInstancedNV", stencilFillPathInstancedNV);
        ASSIGN("glStencilFillPathNV", stencilFillPathNV);
        ASSIGN("glStencilStrokePathInstancedNV", stencilStrokePathInstancedNV);
        ASSIGN("glStencilStrokePathNV", stencilStrokePathNV);
        ASSIGN("glStencilThenCoverFillPathInstancedNV", stencilThenCoverFillPathInstancedNV);
        ASSIGN("glStencilThenCoverFillPathNV", stencilThenCoverFillPathNV);
        ASSIGN("glStencilThenCoverStrokePathInstancedNV", stencilThenCoverStrokePathInstancedNV);
        ASSIGN("glStencilThenCoverStrokePathNV", stencilThenCoverStrokePathNV);
    }
}

}  // namespace rx
