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

#ifndef LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_
#define LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_

#include "common/angleutils.h"
#include "libANGLE/renderer/gl/functionsgl_typedefs.h"

#include <set>

namespace gl
{
struct Version;
}  // namespace gl

namespace rx
{
class DispatchTableGL : angle::NonCopyable
{
  public:
    // clang-format off
    // 1.0
    PFNGLBLENDFUNCPROC blendFunc = nullptr;
    PFNGLCLEARPROC clear = nullptr;
    PFNGLCLEARCOLORPROC clearColor = nullptr;
    PFNGLCLEARDEPTHPROC clearDepth = nullptr;
    PFNGLCLEARSTENCILPROC clearStencil = nullptr;
    PFNGLCOLORMASKPROC colorMask = nullptr;
    PFNGLCULLFACEPROC cullFace = nullptr;
    PFNGLDEPTHFUNCPROC depthFunc = nullptr;
    PFNGLDEPTHMASKPROC depthMask = nullptr;
    PFNGLDEPTHRANGEPROC depthRange = nullptr;
    PFNGLDISABLEPROC disable = nullptr;
    PFNGLDRAWBUFFERPROC drawBuffer = nullptr;
    PFNGLENABLEPROC enable = nullptr;
    PFNGLFINISHPROC finish = nullptr;
    PFNGLFLUSHPROC flush = nullptr;
    PFNGLFRONTFACEPROC frontFace = nullptr;
    PFNGLGETBOOLEANVPROC getBooleanv = nullptr;
    PFNGLGETDOUBLEVPROC getDoublev = nullptr;
    PFNGLGETERRORPROC getError = nullptr;
    PFNGLGETFLOATVPROC getFloatv = nullptr;
    PFNGLGETINTEGERVPROC getIntegerv = nullptr;
    PFNGLGETSTRINGPROC getString = nullptr;
    PFNGLGETTEXIMAGEPROC getTexImage = nullptr;
    PFNGLGETTEXLEVELPARAMETERFVPROC getTexLevelParameterfv = nullptr;
    PFNGLGETTEXLEVELPARAMETERIVPROC getTexLevelParameteriv = nullptr;
    PFNGLGETTEXPARAMETERFVPROC getTexParameterfv = nullptr;
    PFNGLGETTEXPARAMETERIVPROC getTexParameteriv = nullptr;
    PFNGLHINTPROC hint = nullptr;
    PFNGLISENABLEDPROC isEnabled = nullptr;
    PFNGLLINEWIDTHPROC lineWidth = nullptr;
    PFNGLLOGICOPPROC logicOp = nullptr;
    PFNGLPIXELSTOREFPROC pixelStoref = nullptr;
    PFNGLPIXELSTOREIPROC pixelStorei = nullptr;
    PFNGLPOINTSIZEPROC pointSize = nullptr;
    PFNGLPOLYGONMODEPROC polygonMode = nullptr;
    PFNGLREADBUFFERPROC readBuffer = nullptr;
    PFNGLREADPIXELSPROC readPixels = nullptr;
    PFNGLSCISSORPROC scissor = nullptr;
    PFNGLSTENCILFUNCPROC stencilFunc = nullptr;
    PFNGLSTENCILMASKPROC stencilMask = nullptr;
    PFNGLSTENCILOPPROC stencilOp = nullptr;
    PFNGLTEXIMAGE1DPROC texImage1D = nullptr;
    PFNGLTEXIMAGE2DPROC texImage2D = nullptr;
    PFNGLTEXPARAMETERFPROC texParameterf = nullptr;
    PFNGLTEXPARAMETERFVPROC texParameterfv = nullptr;
    PFNGLTEXPARAMETERIPROC texParameteri = nullptr;
    PFNGLTEXPARAMETERIVPROC texParameteriv = nullptr;
    PFNGLVIEWPORTPROC viewport = nullptr;

    // 1.1
    PFNGLBINDTEXTUREPROC bindTexture = nullptr;
    PFNGLCOPYTEXIMAGE1DPROC copyTexImage1D = nullptr;
    PFNGLCOPYTEXIMAGE2DPROC copyTexImage2D = nullptr;
    PFNGLCOPYTEXSUBIMAGE1DPROC copyTexSubImage1D = nullptr;
    PFNGLCOPYTEXSUBIMAGE2DPROC copyTexSubImage2D = nullptr;
    PFNGLDELETETEXTURESPROC deleteTextures = nullptr;
    PFNGLDRAWARRAYSPROC drawArrays = nullptr;
    PFNGLDRAWELEMENTSPROC drawElements = nullptr;
    PFNGLGENTEXTURESPROC genTextures = nullptr;
    PFNGLISTEXTUREPROC isTexture = nullptr;
    PFNGLPOLYGONOFFSETPROC polygonOffset = nullptr;
    PFNGLTEXSUBIMAGE1DPROC texSubImage1D = nullptr;
    PFNGLTEXSUBIMAGE2DPROC texSubImage2D = nullptr;

    // 1.2
    PFNGLBLENDCOLORPROC blendColor = nullptr;
    PFNGLBLENDEQUATIONPROC blendEquation = nullptr;
    PFNGLCOPYTEXSUBIMAGE3DPROC copyTexSubImage3D = nullptr;
    PFNGLDRAWRANGEELEMENTSPROC drawRangeElements = nullptr;
    PFNGLTEXIMAGE3DPROC texImage3D = nullptr;
    PFNGLTEXSUBIMAGE3DPROC texSubImage3D = nullptr;

    // 1.2 Extensions
    PFNGLDELETEFENCESNVPROC deleteFencesNV = nullptr;
    PFNGLFINISHFENCENVPROC finishFenceNV = nullptr;
    PFNGLGENFENCESNVPROC genFencesNV = nullptr;
    PFNGLGETFENCEIVNVPROC getFenceivNV = nullptr;
    PFNGLISFENCENVPROC isFenceNV = nullptr;
    PFNGLSETFENCENVPROC setFenceNV = nullptr;
    PFNGLTESTFENCENVPROC testFenceNV = nullptr;

    // 1.3
    PFNGLACTIVETEXTUREPROC activeTexture = nullptr;
    PFNGLCOMPRESSEDTEXIMAGE1DPROC compressedTexImage1D = nullptr;
    PFNGLCOMPRESSEDTEXIMAGE2DPROC compressedTexImage2D = nullptr;
    PFNGLCOMPRESSEDTEXIMAGE3DPROC compressedTexImage3D = nullptr;
    PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC compressedTexSubImage1D = nullptr;
    PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC compressedTexSubImage2D = nullptr;
    PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC compressedTexSubImage3D = nullptr;
    PFNGLGETCOMPRESSEDTEXIMAGEPROC getCompressedTexImage = nullptr;
    PFNGLSAMPLECOVERAGEPROC sampleCoverage = nullptr;

    // 1.4
    PFNGLBLENDFUNCSEPARATEPROC blendFuncSeparate = nullptr;
    PFNGLMULTIDRAWARRAYSPROC multiDrawArrays = nullptr;
    PFNGLMULTIDRAWELEMENTSPROC multiDrawElements = nullptr;
    PFNGLPOINTPARAMETERFPROC pointParameterf = nullptr;
    PFNGLPOINTPARAMETERFVPROC pointParameterfv = nullptr;
    PFNGLPOINTPARAMETERIPROC pointParameteri = nullptr;
    PFNGLPOINTPARAMETERIVPROC pointParameteriv = nullptr;

    // 1.5
    PFNGLBEGINQUERYPROC beginQuery = nullptr;
    PFNGLBINDBUFFERPROC bindBuffer = nullptr;
    PFNGLBUFFERDATAPROC bufferData = nullptr;
    PFNGLBUFFERSUBDATAPROC bufferSubData = nullptr;
    PFNGLDELETEBUFFERSPROC deleteBuffers = nullptr;
    PFNGLDELETEQUERIESPROC deleteQueries = nullptr;
    PFNGLENDQUERYPROC endQuery = nullptr;
    PFNGLGENBUFFERSPROC genBuffers = nullptr;
    PFNGLGENQUERIESPROC genQueries = nullptr;
    PFNGLGETBUFFERPARAMETERIVPROC getBufferParameteriv = nullptr;
    PFNGLGETBUFFERPOINTERVPROC getBufferPointerv = nullptr;
    PFNGLGETBUFFERSUBDATAPROC getBufferSubData = nullptr;
    PFNGLGETQUERYOBJECTIVPROC getQueryObjectiv = nullptr;
    PFNGLGETQUERYOBJECTUIVPROC getQueryObjectuiv = nullptr;
    PFNGLGETQUERYIVPROC getQueryiv = nullptr;
    PFNGLISBUFFERPROC isBuffer = nullptr;
    PFNGLISQUERYPROC isQuery = nullptr;
    PFNGLMAPBUFFERPROC mapBuffer = nullptr;
    PFNGLUNMAPBUFFERPROC unmapBuffer = nullptr;

    // 2.0
    PFNGLATTACHSHADERPROC attachShader = nullptr;
    PFNGLBINDATTRIBLOCATIONPROC bindAttribLocation = nullptr;
    PFNGLBLENDEQUATIONSEPARATEPROC blendEquationSeparate = nullptr;
    PFNGLCOMPILESHADERPROC compileShader = nullptr;
    PFNGLCREATEPROGRAMPROC createProgram = nullptr;
    PFNGLCREATESHADERPROC createShader = nullptr;
    PFNGLDELETEPROGRAMPROC deleteProgram = nullptr;
    PFNGLDELETESHADERPROC deleteShader = nullptr;
    PFNGLDETACHSHADERPROC detachShader = nullptr;
    PFNGLDISABLEVERTEXATTRIBARRAYPROC disableVertexAttribArray = nullptr;
    PFNGLDRAWBUFFERSPROC drawBuffers = nullptr;
    PFNGLENABLEVERTEXATTRIBARRAYPROC enableVertexAttribArray = nullptr;
    PFNGLGETACTIVEATTRIBPROC getActiveAttrib = nullptr;
    PFNGLGETACTIVEUNIFORMPROC getActiveUniform = nullptr;
    PFNGLGETATTACHEDSHADERSPROC getAttachedShaders = nullptr;
    PFNGLGETATTRIBLOCATIONPROC getAttribLocation = nullptr;
    PFNGLGETPROGRAMINFOLOGPROC getProgramInfoLog = nullptr;
    PFNGLGETPROGRAMIVPROC getProgramiv = nullptr;
    PFNGLGETSHADERINFOLOGPROC getShaderInfoLog = nullptr;
    PFNGLGETSHADERSOURCEPROC getShaderSource = nullptr;
    PFNGLGETSHADERIVPROC getShaderiv = nullptr;
    PFNGLGETUNIFORMLOCATIONPROC getUniformLocation = nullptr;
    PFNGLGETUNIFORMFVPROC getUniformfv = nullptr;
    PFNGLGETUNIFORMIVPROC getUniformiv = nullptr;
    PFNGLGETVERTEXATTRIBPOINTERVPROC getVertexAttribPointerv = nullptr;
    PFNGLGETVERTEXATTRIBDVPROC getVertexAttribdv = nullptr;
    PFNGLGETVERTEXATTRIBFVPROC getVertexAttribfv = nullptr;
    PFNGLGETVERTEXATTRIBIVPROC getVertexAttribiv = nullptr;
    PFNGLISPROGRAMPROC isProgram = nullptr;
    PFNGLISSHADERPROC isShader = nullptr;
    PFNGLLINKPROGRAMPROC linkProgram = nullptr;
    PFNGLSHADERSOURCEPROC shaderSource = nullptr;
    PFNGLSTENCILFUNCSEPARATEPROC stencilFuncSeparate = nullptr;
    PFNGLSTENCILMASKSEPARATEPROC stencilMaskSeparate = nullptr;
    PFNGLSTENCILOPSEPARATEPROC stencilOpSeparate = nullptr;
    PFNGLUNIFORM1FPROC uniform1f = nullptr;
    PFNGLUNIFORM1FVPROC uniform1fv = nullptr;
    PFNGLUNIFORM1IPROC uniform1i = nullptr;
    PFNGLUNIFORM1IVPROC uniform1iv = nullptr;
    PFNGLUNIFORM2FPROC uniform2f = nullptr;
    PFNGLUNIFORM2FVPROC uniform2fv = nullptr;
    PFNGLUNIFORM2IPROC uniform2i = nullptr;
    PFNGLUNIFORM2IVPROC uniform2iv = nullptr;
    PFNGLUNIFORM3FPROC uniform3f = nullptr;
    PFNGLUNIFORM3FVPROC uniform3fv = nullptr;
    PFNGLUNIFORM3IPROC uniform3i = nullptr;
    PFNGLUNIFORM3IVPROC uniform3iv = nullptr;
    PFNGLUNIFORM4FPROC uniform4f = nullptr;
    PFNGLUNIFORM4FVPROC uniform4fv = nullptr;
    PFNGLUNIFORM4IPROC uniform4i = nullptr;
    PFNGLUNIFORM4IVPROC uniform4iv = nullptr;
    PFNGLUNIFORMMATRIX2FVPROC uniformMatrix2fv = nullptr;
    PFNGLUNIFORMMATRIX3FVPROC uniformMatrix3fv = nullptr;
    PFNGLUNIFORMMATRIX4FVPROC uniformMatrix4fv = nullptr;
    PFNGLUSEPROGRAMPROC useProgram = nullptr;
    PFNGLVALIDATEPROGRAMPROC validateProgram = nullptr;
    PFNGLVERTEXATTRIB1DPROC vertexAttrib1d = nullptr;
    PFNGLVERTEXATTRIB1DVPROC vertexAttrib1dv = nullptr;
    PFNGLVERTEXATTRIB1FPROC vertexAttrib1f = nullptr;
    PFNGLVERTEXATTRIB1FVPROC vertexAttrib1fv = nullptr;
    PFNGLVERTEXATTRIB1SPROC vertexAttrib1s = nullptr;
    PFNGLVERTEXATTRIB1SVPROC vertexAttrib1sv = nullptr;
    PFNGLVERTEXATTRIB2DPROC vertexAttrib2d = nullptr;
    PFNGLVERTEXATTRIB2DVPROC vertexAttrib2dv = nullptr;
    PFNGLVERTEXATTRIB2FPROC vertexAttrib2f = nullptr;
    PFNGLVERTEXATTRIB2FVPROC vertexAttrib2fv = nullptr;
    PFNGLVERTEXATTRIB2SPROC vertexAttrib2s = nullptr;
    PFNGLVERTEXATTRIB2SVPROC vertexAttrib2sv = nullptr;
    PFNGLVERTEXATTRIB3DPROC vertexAttrib3d = nullptr;
    PFNGLVERTEXATTRIB3DVPROC vertexAttrib3dv = nullptr;
    PFNGLVERTEXATTRIB3FPROC vertexAttrib3f = nullptr;
    PFNGLVERTEXATTRIB3FVPROC vertexAttrib3fv = nullptr;
    PFNGLVERTEXATTRIB3SPROC vertexAttrib3s = nullptr;
    PFNGLVERTEXATTRIB3SVPROC vertexAttrib3sv = nullptr;
    PFNGLVERTEXATTRIB4NBVPROC vertexAttrib4Nbv = nullptr;
    PFNGLVERTEXATTRIB4NIVPROC vertexAttrib4Niv = nullptr;
    PFNGLVERTEXATTRIB4NSVPROC vertexAttrib4Nsv = nullptr;
    PFNGLVERTEXATTRIB4NUBPROC vertexAttrib4Nub = nullptr;
    PFNGLVERTEXATTRIB4NUBVPROC vertexAttrib4Nubv = nullptr;
    PFNGLVERTEXATTRIB4NUIVPROC vertexAttrib4Nuiv = nullptr;
    PFNGLVERTEXATTRIB4NUSVPROC vertexAttrib4Nusv = nullptr;
    PFNGLVERTEXATTRIB4BVPROC vertexAttrib4bv = nullptr;
    PFNGLVERTEXATTRIB4DPROC vertexAttrib4d = nullptr;
    PFNGLVERTEXATTRIB4DVPROC vertexAttrib4dv = nullptr;
    PFNGLVERTEXATTRIB4FPROC vertexAttrib4f = nullptr;
    PFNGLVERTEXATTRIB4FVPROC vertexAttrib4fv = nullptr;
    PFNGLVERTEXATTRIB4IVPROC vertexAttrib4iv = nullptr;
    PFNGLVERTEXATTRIB4SPROC vertexAttrib4s = nullptr;
    PFNGLVERTEXATTRIB4SVPROC vertexAttrib4sv = nullptr;
    PFNGLVERTEXATTRIB4UBVPROC vertexAttrib4ubv = nullptr;
    PFNGLVERTEXATTRIB4UIVPROC vertexAttrib4uiv = nullptr;
    PFNGLVERTEXATTRIB4USVPROC vertexAttrib4usv = nullptr;
    PFNGLVERTEXATTRIBPOINTERPROC vertexAttribPointer = nullptr;

    // 2.1
    PFNGLUNIFORMMATRIX2X3FVPROC uniformMatrix2x3fv = nullptr;
    PFNGLUNIFORMMATRIX2X4FVPROC uniformMatrix2x4fv = nullptr;
    PFNGLUNIFORMMATRIX3X2FVPROC uniformMatrix3x2fv = nullptr;
    PFNGLUNIFORMMATRIX3X4FVPROC uniformMatrix3x4fv = nullptr;
    PFNGLUNIFORMMATRIX4X2FVPROC uniformMatrix4x2fv = nullptr;
    PFNGLUNIFORMMATRIX4X3FVPROC uniformMatrix4x3fv = nullptr;

    // 3.0
    PFNGLBEGINCONDITIONALRENDERPROC beginConditionalRender = nullptr;
    PFNGLBEGINTRANSFORMFEEDBACKPROC beginTransformFeedback = nullptr;
    PFNGLBINDBUFFERBASEPROC bindBufferBase = nullptr;
    PFNGLBINDBUFFERRANGEPROC bindBufferRange = nullptr;
    PFNGLBINDFRAGDATALOCATIONPROC bindFragDataLocation = nullptr;
    PFNGLBINDFRAMEBUFFERPROC bindFramebuffer = nullptr;
    PFNGLBINDRENDERBUFFERPROC bindRenderbuffer = nullptr;
    PFNGLBINDVERTEXARRAYPROC bindVertexArray = nullptr;
    PFNGLBLITFRAMEBUFFERPROC blitFramebuffer = nullptr;
    PFNGLCHECKFRAMEBUFFERSTATUSPROC checkFramebufferStatus = nullptr;
    PFNGLCLAMPCOLORPROC clampColor = nullptr;
    PFNGLCLEARBUFFERFIPROC clearBufferfi = nullptr;
    PFNGLCLEARBUFFERFVPROC clearBufferfv = nullptr;
    PFNGLCLEARBUFFERIVPROC clearBufferiv = nullptr;
    PFNGLCLEARBUFFERUIVPROC clearBufferuiv = nullptr;
    PFNGLCOLORMASKIPROC colorMaski = nullptr;
    PFNGLDELETEFRAMEBUFFERSPROC deleteFramebuffers = nullptr;
    PFNGLDELETERENDERBUFFERSPROC deleteRenderbuffers = nullptr;
    PFNGLDELETEVERTEXARRAYSPROC deleteVertexArrays = nullptr;
    PFNGLDISABLEIPROC disablei = nullptr;
    PFNGLENABLEIPROC enablei = nullptr;
    PFNGLENDCONDITIONALRENDERPROC endConditionalRender = nullptr;
    PFNGLENDTRANSFORMFEEDBACKPROC endTransformFeedback = nullptr;
    PFNGLFLUSHMAPPEDBUFFERRANGEPROC flushMappedBufferRange = nullptr;
    PFNGLFRAMEBUFFERRENDERBUFFERPROC framebufferRenderbuffer = nullptr;
    PFNGLFRAMEBUFFERTEXTURE1DPROC framebufferTexture1D = nullptr;
    PFNGLFRAMEBUFFERTEXTURE2DPROC framebufferTexture2D = nullptr;
    PFNGLFRAMEBUFFERTEXTURE3DPROC framebufferTexture3D = nullptr;
    PFNGLFRAMEBUFFERTEXTURELAYERPROC framebufferTextureLayer = nullptr;
    PFNGLGENFRAMEBUFFERSPROC genFramebuffers = nullptr;
    PFNGLGENRENDERBUFFERSPROC genRenderbuffers = nullptr;
    PFNGLGENVERTEXARRAYSPROC genVertexArrays = nullptr;
    PFNGLGENERATEMIPMAPPROC generateMipmap = nullptr;
    PFNGLGETBOOLEANI_VPROC getBooleani_v = nullptr;
    PFNGLGETFRAGDATALOCATIONPROC getFragDataLocation = nullptr;
    PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC getFramebufferAttachmentParameteriv = nullptr;
    PFNGLGETINTEGERI_VPROC getIntegeri_v = nullptr;
    PFNGLGETRENDERBUFFERPARAMETERIVPROC getRenderbufferParameteriv = nullptr;
    PFNGLGETSTRINGIPROC getStringi = nullptr;
    PFNGLGETTEXPARAMETERIIVPROC getTexParameterIiv = nullptr;
    PFNGLGETTEXPARAMETERIUIVPROC getTexParameterIuiv = nullptr;
    PFNGLGETTRANSFORMFEEDBACKVARYINGPROC getTransformFeedbackVarying = nullptr;
    PFNGLGETUNIFORMUIVPROC getUniformuiv = nullptr;
    PFNGLGETVERTEXATTRIBIIVPROC getVertexAttribIiv = nullptr;
    PFNGLGETVERTEXATTRIBIUIVPROC getVertexAttribIuiv = nullptr;
    PFNGLISENABLEDIPROC isEnabledi = nullptr;
    PFNGLISFRAMEBUFFERPROC isFramebuffer = nullptr;
    PFNGLISRENDERBUFFERPROC isRenderbuffer = nullptr;
    PFNGLISVERTEXARRAYPROC isVertexArray = nullptr;
    PFNGLMAPBUFFERRANGEPROC mapBufferRange = nullptr;
    PFNGLRENDERBUFFERSTORAGEPROC renderbufferStorage = nullptr;
    PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC renderbufferStorageMultisample = nullptr;
    PFNGLTEXPARAMETERIIVPROC texParameterIiv = nullptr;
    PFNGLTEXPARAMETERIUIVPROC texParameterIuiv = nullptr;
    PFNGLTRANSFORMFEEDBACKVARYINGSPROC transformFeedbackVaryings = nullptr;
    PFNGLUNIFORM1UIPROC uniform1ui = nullptr;
    PFNGLUNIFORM1UIVPROC uniform1uiv = nullptr;
    PFNGLUNIFORM2UIPROC uniform2ui = nullptr;
    PFNGLUNIFORM2UIVPROC uniform2uiv = nullptr;
    PFNGLUNIFORM3UIPROC uniform3ui = nullptr;
    PFNGLUNIFORM3UIVPROC uniform3uiv = nullptr;
    PFNGLUNIFORM4UIPROC uniform4ui = nullptr;
    PFNGLUNIFORM4UIVPROC uniform4uiv = nullptr;
    PFNGLVERTEXATTRIBI1IPROC vertexAttribI1i = nullptr;
    PFNGLVERTEXATTRIBI1IVPROC vertexAttribI1iv = nullptr;
    PFNGLVERTEXATTRIBI1UIPROC vertexAttribI1ui = nullptr;
    PFNGLVERTEXATTRIBI1UIVPROC vertexAttribI1uiv = nullptr;
    PFNGLVERTEXATTRIBI2IPROC vertexAttribI2i = nullptr;
    PFNGLVERTEXATTRIBI2IVPROC vertexAttribI2iv = nullptr;
    PFNGLVERTEXATTRIBI2UIPROC vertexAttribI2ui = nullptr;
    PFNGLVERTEXATTRIBI2UIVPROC vertexAttribI2uiv = nullptr;
    PFNGLVERTEXATTRIBI3IPROC vertexAttribI3i = nullptr;
    PFNGLVERTEXATTRIBI3IVPROC vertexAttribI3iv = nullptr;
    PFNGLVERTEXATTRIBI3UIPROC vertexAttribI3ui = nullptr;
    PFNGLVERTEXATTRIBI3UIVPROC vertexAttribI3uiv = nullptr;
    PFNGLVERTEXATTRIBI4BVPROC vertexAttribI4bv = nullptr;
    PFNGLVERTEXATTRIBI4IPROC vertexAttribI4i = nullptr;
    PFNGLVERTEXATTRIBI4IVPROC vertexAttribI4iv = nullptr;
    PFNGLVERTEXATTRIBI4SVPROC vertexAttribI4sv = nullptr;
    PFNGLVERTEXATTRIBI4UBVPROC vertexAttribI4ubv = nullptr;
    PFNGLVERTEXATTRIBI4UIPROC vertexAttribI4ui = nullptr;
    PFNGLVERTEXATTRIBI4UIVPROC vertexAttribI4uiv = nullptr;
    PFNGLVERTEXATTRIBI4USVPROC vertexAttribI4usv = nullptr;
    PFNGLVERTEXATTRIBIPOINTERPROC vertexAttribIPointer = nullptr;

    // 3.1
    PFNGLCOPYBUFFERSUBDATAPROC copyBufferSubData = nullptr;
    PFNGLDRAWARRAYSINSTANCEDPROC drawArraysInstanced = nullptr;
    PFNGLDRAWELEMENTSINSTANCEDPROC drawElementsInstanced = nullptr;
    PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC getActiveUniformBlockName = nullptr;
    PFNGLGETACTIVEUNIFORMBLOCKIVPROC getActiveUniformBlockiv = nullptr;
    PFNGLGETACTIVEUNIFORMNAMEPROC getActiveUniformName = nullptr;
    PFNGLGETACTIVEUNIFORMSIVPROC getActiveUniformsiv = nullptr;
    PFNGLGETUNIFORMBLOCKINDEXPROC getUniformBlockIndex = nullptr;
    PFNGLGETUNIFORMINDICESPROC getUniformIndices = nullptr;
    PFNGLPRIMITIVERESTARTINDEXPROC primitiveRestartIndex = nullptr;
    PFNGLTEXBUFFERPROC texBuffer = nullptr;
    PFNGLUNIFORMBLOCKBINDINGPROC uniformBlockBinding = nullptr;

    // 3.2
    PFNGLCLIENTWAITSYNCPROC clientWaitSync = nullptr;
    PFNGLDELETESYNCPROC deleteSync = nullptr;
    PFNGLDRAWELEMENTSBASEVERTEXPROC drawElementsBaseVertex = nullptr;
    PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC drawElementsInstancedBaseVertex = nullptr;
    PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC drawRangeElementsBaseVertex = nullptr;
    PFNGLFENCESYNCPROC fenceSync = nullptr;
    PFNGLFRAMEBUFFERTEXTUREPROC framebufferTexture = nullptr;
    PFNGLGETBUFFERPARAMETERI64VPROC getBufferParameteri64v = nullptr;
    PFNGLGETINTEGER64I_VPROC getInteger64i_v = nullptr;
    PFNGLGETINTEGER64VPROC getInteger64v = nullptr;
    PFNGLGETMULTISAMPLEFVPROC getMultisamplefv = nullptr;
    PFNGLGETSYNCIVPROC getSynciv = nullptr;
    PFNGLISSYNCPROC isSync = nullptr;
    PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC multiDrawElementsBaseVertex = nullptr;
    PFNGLPROVOKINGVERTEXPROC provokingVertex = nullptr;
    PFNGLSAMPLEMASKIPROC sampleMaski = nullptr;
    PFNGLTEXIMAGE2DMULTISAMPLEPROC texImage2DMultisample = nullptr;
    PFNGLTEXIMAGE3DMULTISAMPLEPROC texImage3DMultisample = nullptr;
    PFNGLWAITSYNCPROC waitSync = nullptr;

    // 3.3
    PFNGLBINDFRAGDATALOCATIONINDEXEDPROC bindFragDataLocationIndexed = nullptr;
    PFNGLBINDSAMPLERPROC bindSampler = nullptr;
    PFNGLDELETESAMPLERSPROC deleteSamplers = nullptr;
    PFNGLGENSAMPLERSPROC genSamplers = nullptr;
    PFNGLGETFRAGDATAINDEXPROC getFragDataIndex = nullptr;
    PFNGLGETQUERYOBJECTI64VPROC getQueryObjecti64v = nullptr;
    PFNGLGETQUERYOBJECTUI64VPROC getQueryObjectui64v = nullptr;
    PFNGLGETSAMPLERPARAMETERIIVPROC getSamplerParameterIiv = nullptr;
    PFNGLGETSAMPLERPARAMETERIUIVPROC getSamplerParameterIuiv = nullptr;
    PFNGLGETSAMPLERPARAMETERFVPROC getSamplerParameterfv = nullptr;
    PFNGLGETSAMPLERPARAMETERIVPROC getSamplerParameteriv = nullptr;
    PFNGLISSAMPLERPROC isSampler = nullptr;
    PFNGLQUERYCOUNTERPROC queryCounter = nullptr;
    PFNGLSAMPLERPARAMETERIIVPROC samplerParameterIiv = nullptr;
    PFNGLSAMPLERPARAMETERIUIVPROC samplerParameterIuiv = nullptr;
    PFNGLSAMPLERPARAMETERFPROC samplerParameterf = nullptr;
    PFNGLSAMPLERPARAMETERFVPROC samplerParameterfv = nullptr;
    PFNGLSAMPLERPARAMETERIPROC samplerParameteri = nullptr;
    PFNGLSAMPLERPARAMETERIVPROC samplerParameteriv = nullptr;
    PFNGLVERTEXATTRIBDIVISORPROC vertexAttribDivisor = nullptr;
    PFNGLVERTEXATTRIBP1UIPROC vertexAttribP1ui = nullptr;
    PFNGLVERTEXATTRIBP1UIVPROC vertexAttribP1uiv = nullptr;
    PFNGLVERTEXATTRIBP2UIPROC vertexAttribP2ui = nullptr;
    PFNGLVERTEXATTRIBP2UIVPROC vertexAttribP2uiv = nullptr;
    PFNGLVERTEXATTRIBP3UIPROC vertexAttribP3ui = nullptr;
    PFNGLVERTEXATTRIBP3UIVPROC vertexAttribP3uiv = nullptr;
    PFNGLVERTEXATTRIBP4UIPROC vertexAttribP4ui = nullptr;
    PFNGLVERTEXATTRIBP4UIVPROC vertexAttribP4uiv = nullptr;

    // 4.0
    PFNGLBEGINQUERYINDEXEDPROC beginQueryIndexed = nullptr;
    PFNGLBINDTRANSFORMFEEDBACKPROC bindTransformFeedback = nullptr;
    PFNGLBLENDEQUATIONSEPARATEIPROC blendEquationSeparatei = nullptr;
    PFNGLBLENDEQUATIONIPROC blendEquationi = nullptr;
    PFNGLBLENDFUNCSEPARATEIPROC blendFuncSeparatei = nullptr;
    PFNGLBLENDFUNCIPROC blendFunci = nullptr;
    PFNGLDELETETRANSFORMFEEDBACKSPROC deleteTransformFeedbacks = nullptr;
    PFNGLDRAWARRAYSINDIRECTPROC drawArraysIndirect = nullptr;
    PFNGLDRAWELEMENTSINDIRECTPROC drawElementsIndirect = nullptr;
    PFNGLDRAWTRANSFORMFEEDBACKPROC drawTransformFeedback = nullptr;
    PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC drawTransformFeedbackStream = nullptr;
    PFNGLENDQUERYINDEXEDPROC endQueryIndexed = nullptr;
    PFNGLGENTRANSFORMFEEDBACKSPROC genTransformFeedbacks = nullptr;
    PFNGLGETACTIVESUBROUTINENAMEPROC getActiveSubroutineName = nullptr;
    PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC getActiveSubroutineUniformName = nullptr;
    PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC getActiveSubroutineUniformiv = nullptr;
    PFNGLGETPROGRAMSTAGEIVPROC getProgramStageiv = nullptr;
    PFNGLGETQUERYINDEXEDIVPROC getQueryIndexediv = nullptr;
    PFNGLGETSUBROUTINEINDEXPROC getSubroutineIndex = nullptr;
    PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC getSubroutineUniformLocation = nullptr;
    PFNGLGETUNIFORMSUBROUTINEUIVPROC getUniformSubroutineuiv = nullptr;
    PFNGLGETUNIFORMDVPROC getUniformdv = nullptr;
    PFNGLISTRANSFORMFEEDBACKPROC isTransformFeedback = nullptr;
    PFNGLMINSAMPLESHADINGPROC minSampleShading = nullptr;
    PFNGLPATCHPARAMETERFVPROC patchParameterfv = nullptr;
    PFNGLPATCHPARAMETERIPROC patchParameteri = nullptr;
    PFNGLPAUSETRANSFORMFEEDBACKPROC pauseTransformFeedback = nullptr;
    PFNGLRESUMETRANSFORMFEEDBACKPROC resumeTransformFeedback = nullptr;
    PFNGLUNIFORM1DPROC uniform1d = nullptr;
    PFNGLUNIFORM1DVPROC uniform1dv = nullptr;
    PFNGLUNIFORM2DPROC uniform2d = nullptr;
    PFNGLUNIFORM2DVPROC uniform2dv = nullptr;
    PFNGLUNIFORM3DPROC uniform3d = nullptr;
    PFNGLUNIFORM3DVPROC uniform3dv = nullptr;
    PFNGLUNIFORM4DPROC uniform4d = nullptr;
    PFNGLUNIFORM4DVPROC uniform4dv = nullptr;
    PFNGLUNIFORMMATRIX2DVPROC uniformMatrix2dv = nullptr;
    PFNGLUNIFORMMATRIX2X3DVPROC uniformMatrix2x3dv = nullptr;
    PFNGLUNIFORMMATRIX2X4DVPROC uniformMatrix2x4dv = nullptr;
    PFNGLUNIFORMMATRIX3DVPROC uniformMatrix3dv = nullptr;
    PFNGLUNIFORMMATRIX3X2DVPROC uniformMatrix3x2dv = nullptr;
    PFNGLUNIFORMMATRIX3X4DVPROC uniformMatrix3x4dv = nullptr;
    PFNGLUNIFORMMATRIX4DVPROC uniformMatrix4dv = nullptr;
    PFNGLUNIFORMMATRIX4X2DVPROC uniformMatrix4x2dv = nullptr;
    PFNGLUNIFORMMATRIX4X3DVPROC uniformMatrix4x3dv = nullptr;
    PFNGLUNIFORMSUBROUTINESUIVPROC uniformSubroutinesuiv = nullptr;

    // 4.1
    PFNGLACTIVESHADERPROGRAMPROC activeShaderProgram = nullptr;
    PFNGLBINDPROGRAMPIPELINEPROC bindProgramPipeline = nullptr;
    PFNGLCLEARDEPTHFPROC clearDepthf = nullptr;
    PFNGLCREATESHADERPROGRAMVPROC createShaderProgramv = nullptr;
    PFNGLDELETEPROGRAMPIPELINESPROC deleteProgramPipelines = nullptr;
    PFNGLDEPTHRANGEARRAYVPROC depthRangeArrayv = nullptr;
    PFNGLDEPTHRANGEINDEXEDPROC depthRangeIndexed = nullptr;
    PFNGLDEPTHRANGEFPROC depthRangef = nullptr;
    PFNGLGENPROGRAMPIPELINESPROC genProgramPipelines = nullptr;
    PFNGLGETDOUBLEI_VPROC getDoublei_v = nullptr;
    PFNGLGETFLOATI_VPROC getFloati_v = nullptr;
    PFNGLGETPROGRAMBINARYPROC getProgramBinary = nullptr;
    PFNGLGETPROGRAMPIPELINEINFOLOGPROC getProgramPipelineInfoLog = nullptr;
    PFNGLGETPROGRAMPIPELINEIVPROC getProgramPipelineiv = nullptr;
    PFNGLGETSHADERPRECISIONFORMATPROC getShaderPrecisionFormat = nullptr;
    PFNGLGETVERTEXATTRIBLDVPROC getVertexAttribLdv = nullptr;
    PFNGLISPROGRAMPIPELINEPROC isProgramPipeline = nullptr;
    PFNGLPROGRAMBINARYPROC programBinary = nullptr;
    PFNGLPROGRAMPARAMETERIPROC programParameteri = nullptr;
    PFNGLPROGRAMUNIFORM1DPROC programUniform1d = nullptr;
    PFNGLPROGRAMUNIFORM1DVPROC programUniform1dv = nullptr;
    PFNGLPROGRAMUNIFORM1FPROC programUniform1f = nullptr;
    PFNGLPROGRAMUNIFORM1FVPROC programUniform1fv = nullptr;
    PFNGLPROGRAMUNIFORM1IPROC programUniform1i = nullptr;
    PFNGLPROGRAMUNIFORM1IVPROC programUniform1iv = nullptr;
    PFNGLPROGRAMUNIFORM1UIPROC programUniform1ui = nullptr;
    PFNGLPROGRAMUNIFORM1UIVPROC programUniform1uiv = nullptr;
    PFNGLPROGRAMUNIFORM2DPROC programUniform2d = nullptr;
    PFNGLPROGRAMUNIFORM2DVPROC programUniform2dv = nullptr;
    PFNGLPROGRAMUNIFORM2FPROC programUniform2f = nullptr;
    PFNGLPROGRAMUNIFORM2FVPROC programUniform2fv = nullptr;
    PFNGLPROGRAMUNIFORM2IPROC programUniform2i = nullptr;
    PFNGLPROGRAMUNIFORM2IVPROC programUniform2iv = nullptr;
    PFNGLPROGRAMUNIFORM2UIPROC programUniform2ui = nullptr;
    PFNGLPROGRAMUNIFORM2UIVPROC programUniform2uiv = nullptr;
    PFNGLPROGRAMUNIFORM3DPROC programUniform3d = nullptr;
    PFNGLPROGRAMUNIFORM3DVPROC programUniform3dv = nullptr;
    PFNGLPROGRAMUNIFORM3FPROC programUniform3f = nullptr;
    PFNGLPROGRAMUNIFORM3FVPROC programUniform3fv = nullptr;
    PFNGLPROGRAMUNIFORM3IPROC programUniform3i = nullptr;
    PFNGLPROGRAMUNIFORM3IVPROC programUniform3iv = nullptr;
    PFNGLPROGRAMUNIFORM3UIPROC programUniform3ui = nullptr;
    PFNGLPROGRAMUNIFORM3UIVPROC programUniform3uiv = nullptr;
    PFNGLPROGRAMUNIFORM4DPROC programUniform4d = nullptr;
    PFNGLPROGRAMUNIFORM4DVPROC programUniform4dv = nullptr;
    PFNGLPROGRAMUNIFORM4FPROC programUniform4f = nullptr;
    PFNGLPROGRAMUNIFORM4FVPROC programUniform4fv = nullptr;
    PFNGLPROGRAMUNIFORM4IPROC programUniform4i = nullptr;
    PFNGLPROGRAMUNIFORM4IVPROC programUniform4iv = nullptr;
    PFNGLPROGRAMUNIFORM4UIPROC programUniform4ui = nullptr;
    PFNGLPROGRAMUNIFORM4UIVPROC programUniform4uiv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX2DVPROC programUniformMatrix2dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX2FVPROC programUniformMatrix2fv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC programUniformMatrix2x3dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC programUniformMatrix2x3fv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC programUniformMatrix2x4dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC programUniformMatrix2x4fv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX3DVPROC programUniformMatrix3dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX3FVPROC programUniformMatrix3fv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC programUniformMatrix3x2dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC programUniformMatrix3x2fv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC programUniformMatrix3x4dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC programUniformMatrix3x4fv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX4DVPROC programUniformMatrix4dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX4FVPROC programUniformMatrix4fv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC programUniformMatrix4x2dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC programUniformMatrix4x2fv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC programUniformMatrix4x3dv = nullptr;
    PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC programUniformMatrix4x3fv = nullptr;
    PFNGLRELEASESHADERCOMPILERPROC releaseShaderCompiler = nullptr;
    PFNGLSCISSORARRAYVPROC scissorArrayv = nullptr;
    PFNGLSCISSORINDEXEDPROC scissorIndexed = nullptr;
    PFNGLSCISSORINDEXEDVPROC scissorIndexedv = nullptr;
    PFNGLSHADERBINARYPROC shaderBinary = nullptr;
    PFNGLUSEPROGRAMSTAGESPROC useProgramStages = nullptr;
    PFNGLVALIDATEPROGRAMPIPELINEPROC validateProgramPipeline = nullptr;
    PFNGLVERTEXATTRIBL1DPROC vertexAttribL1d = nullptr;
    PFNGLVERTEXATTRIBL1DVPROC vertexAttribL1dv = nullptr;
    PFNGLVERTEXATTRIBL2DPROC vertexAttribL2d = nullptr;
    PFNGLVERTEXATTRIBL2DVPROC vertexAttribL2dv = nullptr;
    PFNGLVERTEXATTRIBL3DPROC vertexAttribL3d = nullptr;
    PFNGLVERTEXATTRIBL3DVPROC vertexAttribL3dv = nullptr;
    PFNGLVERTEXATTRIBL4DPROC vertexAttribL4d = nullptr;
    PFNGLVERTEXATTRIBL4DVPROC vertexAttribL4dv = nullptr;
    PFNGLVERTEXATTRIBLPOINTERPROC vertexAttribLPointer = nullptr;
    PFNGLVIEWPORTARRAYVPROC viewportArrayv = nullptr;
    PFNGLVIEWPORTINDEXEDFPROC viewportIndexedf = nullptr;
    PFNGLVIEWPORTINDEXEDFVPROC viewportIndexedfv = nullptr;

    // 4.2
    PFNGLBINDIMAGETEXTUREPROC bindImageTexture = nullptr;
    PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC drawArraysInstancedBaseInstance = nullptr;
    PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC drawElementsInstancedBaseInstance = nullptr;
    PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC drawElementsInstancedBaseVertexBaseInstance = nullptr;
    PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC drawTransformFeedbackInstanced = nullptr;
    PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC drawTransformFeedbackStreamInstanced = nullptr;
    PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC getActiveAtomicCounterBufferiv = nullptr;
    PFNGLGETINTERNALFORMATIVPROC getInternalformativ = nullptr;
    PFNGLMEMORYBARRIERPROC memoryBarrier = nullptr;
    PFNGLTEXSTORAGE1DPROC texStorage1D = nullptr;
    PFNGLTEXSTORAGE2DPROC texStorage2D = nullptr;
    PFNGLTEXSTORAGE3DPROC texStorage3D = nullptr;

    // 4.3
    PFNGLBINDVERTEXBUFFERPROC bindVertexBuffer = nullptr;
    PFNGLCLEARBUFFERDATAPROC clearBufferData = nullptr;
    PFNGLCLEARBUFFERSUBDATAPROC clearBufferSubData = nullptr;
    PFNGLCOPYIMAGESUBDATAPROC copyImageSubData = nullptr;
    PFNGLCOVERAGEMODULATIONNVPROC coverageModulationNV = nullptr;
    PFNGLDEBUGMESSAGECALLBACKPROC debugMessageCallback = nullptr;
    PFNGLDEBUGMESSAGECONTROLPROC debugMessageControl = nullptr;
    PFNGLDEBUGMESSAGEINSERTPROC debugMessageInsert = nullptr;
    PFNGLDISPATCHCOMPUTEPROC dispatchCompute = nullptr;
    PFNGLDISPATCHCOMPUTEINDIRECTPROC dispatchComputeIndirect = nullptr;
    PFNGLFRAMEBUFFERPARAMETERIPROC framebufferParameteri = nullptr;
    PFNGLGETDEBUGMESSAGELOGPROC getDebugMessageLog = nullptr;
    PFNGLGETFRAMEBUFFERPARAMETERIVPROC getFramebufferParameteriv = nullptr;
    PFNGLGETINTERNALFORMATI64VPROC getInternalformati64v = nullptr;
    PFNGLGETOBJECTLABELPROC getObjectLabel = nullptr;
    PFNGLGETOBJECTPTRLABELPROC getObjectPtrLabel = nullptr;
    PFNGLGETPOINTERVPROC getPointerv = nullptr;
    PFNGLGETPROGRAMINTERFACEIVPROC getProgramInterfaceiv = nullptr;
    PFNGLGETPROGRAMRESOURCEINDEXPROC getProgramResourceIndex = nullptr;
    PFNGLGETPROGRAMRESOURCELOCATIONPROC getProgramResourceLocation = nullptr;
    PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC getProgramResourceLocationIndex = nullptr;
    PFNGLGETPROGRAMRESOURCENAMEPROC getProgramResourceName = nullptr;
    PFNGLGETPROGRAMRESOURCEIVPROC getProgramResourceiv = nullptr;
    PFNGLINVALIDATEBUFFERDATAPROC invalidateBufferData = nullptr;
    PFNGLINVALIDATEBUFFERSUBDATAPROC invalidateBufferSubData = nullptr;
    PFNGLINVALIDATEFRAMEBUFFERPROC invalidateFramebuffer = nullptr;
    PFNGLINVALIDATESUBFRAMEBUFFERPROC invalidateSubFramebuffer = nullptr;
    PFNGLINVALIDATETEXIMAGEPROC invalidateTexImage = nullptr;
    PFNGLINVALIDATETEXSUBIMAGEPROC invalidateTexSubImage = nullptr;
    PFNGLMULTIDRAWARRAYSINDIRECTPROC multiDrawArraysIndirect = nullptr;
    PFNGLMULTIDRAWELEMENTSINDIRECTPROC multiDrawElementsIndirect = nullptr;
    PFNGLOBJECTLABELPROC objectLabel = nullptr;
    PFNGLOBJECTPTRLABELPROC objectPtrLabel = nullptr;
    PFNGLPOPDEBUGGROUPPROC popDebugGroup = nullptr;
    PFNGLPUSHDEBUGGROUPPROC pushDebugGroup = nullptr;
    PFNGLSHADERSTORAGEBLOCKBINDINGPROC shaderStorageBlockBinding = nullptr;
    PFNGLTEXBUFFERRANGEPROC texBufferRange = nullptr;
    PFNGLTEXSTORAGE2DMULTISAMPLEPROC texStorage2DMultisample = nullptr;
    PFNGLTEXSTORAGE3DMULTISAMPLEPROC texStorage3DMultisample = nullptr;
    PFNGLTEXTUREVIEWPROC textureView = nullptr;
    PFNGLVERTEXATTRIBBINDINGPROC vertexAttribBinding = nullptr;
    PFNGLVERTEXATTRIBFORMATPROC vertexAttribFormat = nullptr;
    PFNGLVERTEXATTRIBIFORMATPROC vertexAttribIFormat = nullptr;
    PFNGLVERTEXATTRIBLFORMATPROC vertexAttribLFormat = nullptr;
    PFNGLVERTEXBINDINGDIVISORPROC vertexBindingDivisor = nullptr;

    // 4.4
    PFNGLBINDBUFFERSBASEPROC bindBuffersBase = nullptr;
    PFNGLBINDBUFFERSRANGEPROC bindBuffersRange = nullptr;
    PFNGLBINDIMAGETEXTURESPROC bindImageTextures = nullptr;
    PFNGLBINDSAMPLERSPROC bindSamplers = nullptr;
    PFNGLBINDTEXTURESPROC bindTextures = nullptr;
    PFNGLBINDVERTEXBUFFERSPROC bindVertexBuffers = nullptr;
    PFNGLBUFFERSTORAGEPROC bufferStorage = nullptr;
    PFNGLCLEARTEXIMAGEPROC clearTexImage = nullptr;
    PFNGLCLEARTEXSUBIMAGEPROC clearTexSubImage = nullptr;

    // 4.5
    PFNGLBINDTEXTUREUNITPROC bindTextureUnit = nullptr;
    PFNGLBLITNAMEDFRAMEBUFFERPROC blitNamedFramebuffer = nullptr;
    PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC checkNamedFramebufferStatus = nullptr;
    PFNGLCLEARNAMEDBUFFERDATAPROC clearNamedBufferData = nullptr;
    PFNGLCLEARNAMEDBUFFERSUBDATAPROC clearNamedBufferSubData = nullptr;
    PFNGLCLEARNAMEDFRAMEBUFFERFIPROC clearNamedFramebufferfi = nullptr;
    PFNGLCLEARNAMEDFRAMEBUFFERFVPROC clearNamedFramebufferfv = nullptr;
    PFNGLCLEARNAMEDFRAMEBUFFERIVPROC clearNamedFramebufferiv = nullptr;
    PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC clearNamedFramebufferuiv = nullptr;
    PFNGLCLIPCONTROLPROC clipControl = nullptr;
    PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC compressedTextureSubImage1D = nullptr;
    PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC compressedTextureSubImage2D = nullptr;
    PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC compressedTextureSubImage3D = nullptr;
    PFNGLCOPYNAMEDBUFFERSUBDATAPROC copyNamedBufferSubData = nullptr;
    PFNGLCOPYTEXTURESUBIMAGE1DPROC copyTextureSubImage1D = nullptr;
    PFNGLCOPYTEXTURESUBIMAGE2DPROC copyTextureSubImage2D = nullptr;
    PFNGLCOPYTEXTURESUBIMAGE3DPROC copyTextureSubImage3D = nullptr;
    PFNGLCREATEBUFFERSPROC createBuffers = nullptr;
    PFNGLCREATEFRAMEBUFFERSPROC createFramebuffers = nullptr;
    PFNGLCREATEPROGRAMPIPELINESPROC createProgramPipelines = nullptr;
    PFNGLCREATEQUERIESPROC createQueries = nullptr;
    PFNGLCREATERENDERBUFFERSPROC createRenderbuffers = nullptr;
    PFNGLCREATESAMPLERSPROC createSamplers = nullptr;
    PFNGLCREATETEXTURESPROC createTextures = nullptr;
    PFNGLCREATETRANSFORMFEEDBACKSPROC createTransformFeedbacks = nullptr;
    PFNGLCREATEVERTEXARRAYSPROC createVertexArrays = nullptr;
    PFNGLDISABLEVERTEXARRAYATTRIBPROC disableVertexArrayAttrib = nullptr;
    PFNGLENABLEVERTEXARRAYATTRIBPROC enableVertexArrayAttrib = nullptr;
    PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC flushMappedNamedBufferRange = nullptr;
    PFNGLGENERATETEXTUREMIPMAPPROC generateTextureMipmap = nullptr;
    PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC getCompressedTextureImage = nullptr;
    PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC getCompressedTextureSubImage = nullptr;
    PFNGLGETGRAPHICSRESETSTATUSPROC getGraphicsResetStatus = nullptr;
    PFNGLGETNAMEDBUFFERPARAMETERI64VPROC getNamedBufferParameteri64v = nullptr;
    PFNGLGETNAMEDBUFFERPARAMETERIVPROC getNamedBufferParameteriv = nullptr;
    PFNGLGETNAMEDBUFFERPOINTERVPROC getNamedBufferPointerv = nullptr;
    PFNGLGETNAMEDBUFFERSUBDATAPROC getNamedBufferSubData = nullptr;
    PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC getNamedFramebufferAttachmentParameteriv = nullptr;
    PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC getNamedFramebufferParameteriv = nullptr;
    PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC getNamedRenderbufferParameteriv = nullptr;
    PFNGLGETQUERYBUFFEROBJECTI64VPROC getQueryBufferObjecti64v = nullptr;
    PFNGLGETQUERYBUFFEROBJECTIVPROC getQueryBufferObjectiv = nullptr;
    PFNGLGETQUERYBUFFEROBJECTUI64VPROC getQueryBufferObjectui64v = nullptr;
    PFNGLGETQUERYBUFFEROBJECTUIVPROC getQueryBufferObjectuiv = nullptr;
    PFNGLGETTEXTUREIMAGEPROC getTextureImage = nullptr;
    PFNGLGETTEXTURELEVELPARAMETERFVPROC getTextureLevelParameterfv = nullptr;
    PFNGLGETTEXTURELEVELPARAMETERIVPROC getTextureLevelParameteriv = nullptr;
    PFNGLGETTEXTUREPARAMETERIIVPROC getTextureParameterIiv = nullptr;
    PFNGLGETTEXTUREPARAMETERIUIVPROC getTextureParameterIuiv = nullptr;
    PFNGLGETTEXTUREPARAMETERFVPROC getTextureParameterfv = nullptr;
    PFNGLGETTEXTUREPARAMETERIVPROC getTextureParameteriv = nullptr;
    PFNGLGETTEXTURESUBIMAGEPROC getTextureSubImage = nullptr;
    PFNGLGETTRANSFORMFEEDBACKI64_VPROC getTransformFeedbacki64_v = nullptr;
    PFNGLGETTRANSFORMFEEDBACKI_VPROC getTransformFeedbacki_v = nullptr;
    PFNGLGETTRANSFORMFEEDBACKIVPROC getTransformFeedbackiv = nullptr;
    PFNGLGETVERTEXARRAYINDEXED64IVPROC getVertexArrayIndexed64iv = nullptr;
    PFNGLGETVERTEXARRAYINDEXEDIVPROC getVertexArrayIndexediv = nullptr;
    PFNGLGETVERTEXARRAYIVPROC getVertexArrayiv = nullptr;
    PFNGLGETNCOMPRESSEDTEXIMAGEPROC getnCompressedTexImage = nullptr;
    PFNGLGETNTEXIMAGEPROC getnTexImage = nullptr;
    PFNGLGETNUNIFORMDVPROC getnUniformdv = nullptr;
    PFNGLGETNUNIFORMFVPROC getnUniformfv = nullptr;
    PFNGLGETNUNIFORMIVPROC getnUniformiv = nullptr;
    PFNGLGETNUNIFORMUIVPROC getnUniformuiv = nullptr;
    PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC invalidateNamedFramebufferData = nullptr;
    PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC invalidateNamedFramebufferSubData = nullptr;
    PFNGLMAPNAMEDBUFFERPROC mapNamedBuffer = nullptr;
    PFNGLMAPNAMEDBUFFERRANGEPROC mapNamedBufferRange = nullptr;
    PFNGLMEMORYBARRIERBYREGIONPROC memoryBarrierByRegion = nullptr;
    PFNGLNAMEDBUFFERDATAPROC namedBufferData = nullptr;
    PFNGLNAMEDBUFFERSTORAGEPROC namedBufferStorage = nullptr;
    PFNGLNAMEDBUFFERSUBDATAPROC namedBufferSubData = nullptr;
    PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC namedFramebufferDrawBuffer = nullptr;
    PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC namedFramebufferDrawBuffers = nullptr;
    PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC namedFramebufferParameteri = nullptr;
    PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC namedFramebufferReadBuffer = nullptr;
    PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC namedFramebufferRenderbuffer = nullptr;
    PFNGLNAMEDFRAMEBUFFERTEXTUREPROC namedFramebufferTexture = nullptr;
    PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC namedFramebufferTextureLayer = nullptr;
    PFNGLNAMEDRENDERBUFFERSTORAGEPROC namedRenderbufferStorage = nullptr;
    PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC namedRenderbufferStorageMultisample = nullptr;
    PFNGLREADNPIXELSPROC readnPixels = nullptr;
    PFNGLTEXTUREBARRIERPROC textureBarrier = nullptr;
    PFNGLTEXTUREBUFFERPROC textureBuffer = nullptr;
    PFNGLTEXTUREBUFFERRANGEPROC textureBufferRange = nullptr;
    PFNGLTEXTUREPARAMETERIIVPROC textureParameterIiv = nullptr;
    PFNGLTEXTUREPARAMETERIUIVPROC textureParameterIuiv = nullptr;
    PFNGLTEXTUREPARAMETERFPROC textureParameterf = nullptr;
    PFNGLTEXTUREPARAMETERFVPROC textureParameterfv = nullptr;
    PFNGLTEXTUREPARAMETERIPROC textureParameteri = nullptr;
    PFNGLTEXTUREPARAMETERIVPROC textureParameteriv = nullptr;
    PFNGLTEXTURESTORAGE1DPROC textureStorage1D = nullptr;
    PFNGLTEXTURESTORAGE2DPROC textureStorage2D = nullptr;
    PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC textureStorage2DMultisample = nullptr;
    PFNGLTEXTURESTORAGE3DPROC textureStorage3D = nullptr;
    PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC textureStorage3DMultisample = nullptr;
    PFNGLTEXTURESUBIMAGE1DPROC textureSubImage1D = nullptr;
    PFNGLTEXTURESUBIMAGE2DPROC textureSubImage2D = nullptr;
    PFNGLTEXTURESUBIMAGE3DPROC textureSubImage3D = nullptr;
    PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC transformFeedbackBufferBase = nullptr;
    PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC transformFeedbackBufferRange = nullptr;
    PFNGLUNMAPNAMEDBUFFERPROC unmapNamedBuffer = nullptr;
    PFNGLVERTEXARRAYATTRIBBINDINGPROC vertexArrayAttribBinding = nullptr;
    PFNGLVERTEXARRAYATTRIBFORMATPROC vertexArrayAttribFormat = nullptr;
    PFNGLVERTEXARRAYATTRIBIFORMATPROC vertexArrayAttribIFormat = nullptr;
    PFNGLVERTEXARRAYATTRIBLFORMATPROC vertexArrayAttribLFormat = nullptr;
    PFNGLVERTEXARRAYBINDINGDIVISORPROC vertexArrayBindingDivisor = nullptr;
    PFNGLVERTEXARRAYELEMENTBUFFERPROC vertexArrayElementBuffer = nullptr;
    PFNGLVERTEXARRAYVERTEXBUFFERPROC vertexArrayVertexBuffer = nullptr;
    PFNGLVERTEXARRAYVERTEXBUFFERSPROC vertexArrayVertexBuffers = nullptr;

    // ES 3.2
    PFNGLBLENDBARRIERPROC blendBarrier = nullptr;
    PFNGLPRIMITIVEBOUNDINGBOXPROC primitiveBoundingBox = nullptr;

    // GL_ARB_parallel_shader_compile
    PFNGLMAXSHADERCOMPILERTHREADSARBPROC maxShaderCompilerThreadsARB = nullptr;

    // GL_EXT_debug_marker
    PFNGLINSERTEVENTMARKEREXTPROC insertEventMarkerEXT = nullptr;
    PFNGLPOPGROUPMARKEREXTPROC popGroupMarkerEXT = nullptr;
    PFNGLPUSHGROUPMARKEREXTPROC pushGroupMarkerEXT = nullptr;

    // GL_EXT_discard_framebuffer
    PFNGLDISCARDFRAMEBUFFEREXTPROC discardFramebufferEXT = nullptr;

    // GL_EXT_framebuffer_blit
    PFNGLBLITFRAMEBUFFEREXTPROC blitFramebufferEXT = nullptr;

    // GL_EXT_memory_object
    PFNGLBUFFERSTORAGEMEMEXTPROC bufferStorageMemEXT = nullptr;
    PFNGLCREATEMEMORYOBJECTSEXTPROC createMemoryObjectsEXT = nullptr;
    PFNGLDELETEMEMORYOBJECTSEXTPROC deleteMemoryObjectsEXT = nullptr;
    PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC getMemoryObjectParameterivEXT = nullptr;
    PFNGLGETUNSIGNEDBYTEI_VEXTPROC getUnsignedBytei_vEXT = nullptr;
    PFNGLGETUNSIGNEDBYTEVEXTPROC getUnsignedBytevEXT = nullptr;
    PFNGLISMEMORYOBJECTEXTPROC isMemoryObjectEXT = nullptr;
    PFNGLMEMORYOBJECTPARAMETERIVEXTPROC memoryObjectParameterivEXT = nullptr;
    PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC namedBufferStorageMemEXT = nullptr;
    PFNGLTEXSTORAGEMEM2DEXTPROC texStorageMem2DEXT = nullptr;
    PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC texStorageMem2DMultisampleEXT = nullptr;
    PFNGLTEXSTORAGEMEM3DEXTPROC texStorageMem3DEXT = nullptr;
    PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC texStorageMem3DMultisampleEXT = nullptr;
    PFNGLTEXTURESTORAGEMEM2DEXTPROC textureStorageMem2DEXT = nullptr;
    PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC textureStorageMem2DMultisampleEXT = nullptr;
    PFNGLTEXTURESTORAGEMEM3DEXTPROC textureStorageMem3DEXT = nullptr;
    PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC textureStorageMem3DMultisampleEXT = nullptr;

    // GL_EXT_memory_object_fd
    PFNGLIMPORTMEMORYFDEXTPROC importMemoryFdEXT = nullptr;

    // GL_EXT_memory_object_win32
    PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC importMemoryWin32HandleEXT = nullptr;
    PFNGLIMPORTMEMORYWIN32NAMEEXTPROC importMemoryWin32NameEXT = nullptr;

    // GL_EXT_multisampled_render_to_texture
    PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC framebufferTexture2DMultisampleEXT = nullptr;
    PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC renderbufferStorageMultisampleEXT = nullptr;

    // GL_EXT_polygon_offset_clamp
    PFNGLPOLYGONOFFSETCLAMPEXTPROC polygonOffsetClampEXT = nullptr;

    // GL_EXT_semaphore
    PFNGLDELETESEMAPHORESEXTPROC deleteSemaphoresEXT = nullptr;
    PFNGLGENSEMAPHORESEXTPROC genSemaphoresEXT = nullptr;
    PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC getSemaphoreParameterui64vEXT = nullptr;
    PFNGLISSEMAPHOREEXTPROC isSemaphoreEXT = nullptr;
    PFNGLSEMAPHOREPARAMETERUI64VEXTPROC semaphoreParameterui64vEXT = nullptr;
    PFNGLSIGNALSEMAPHOREEXTPROC signalSemaphoreEXT = nullptr;
    PFNGLWAITSEMAPHOREEXTPROC waitSemaphoreEXT = nullptr;

    // GL_EXT_semaphore_fd
    PFNGLIMPORTSEMAPHOREFDEXTPROC importSemaphoreFdEXT = nullptr;

    // GL_EXT_semaphore_win32
    PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC importSemaphoreWin32HandleEXT = nullptr;
    PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC importSemaphoreWin32NameEXT = nullptr;

    // GL_EXT_shader_framebuffer_fetch_non_coherent
    PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC framebufferFetchBarrierEXT = nullptr;

    // GL_EXT_texture_buffer
    PFNGLTEXBUFFEREXTPROC texBufferEXT = nullptr;
    PFNGLTEXBUFFERRANGEEXTPROC texBufferRangeEXT = nullptr;

    // GL_IMG_multisampled_render_to_texture
    PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC framebufferTexture2DMultisampleIMG = nullptr;
    PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC renderbufferStorageMultisampleIMG = nullptr;

    // GL_KHR_parallel_shader_compile
    PFNGLMAXSHADERCOMPILERTHREADSKHRPROC maxShaderCompilerThreadsKHR = nullptr;

    // GL_MESA_framebuffer_flip_y
    PFNGLFRAMEBUFFERPARAMETERIMESAPROC framebufferParameteriMESA = nullptr;

    // GL_NV_framebuffer_blit
    PFNGLBLITFRAMEBUFFERNVPROC blitFramebufferNV = nullptr;

    // GL_NV_internalformat_sample_query
    PFNGLGETINTERNALFORMATSAMPLEIVNVPROC getInternalformatSampleivNV = nullptr;

    // GL_NV_polygon_mode
    PFNGLPOLYGONMODENVPROC polygonModeNV = nullptr;

    // GL_OES_EGL_image
    PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC eGLImageTargetRenderbufferStorageOES = nullptr;
    PFNGLEGLIMAGETARGETTEXTURE2DOESPROC eGLImageTargetTexture2DOES = nullptr;

    // GL_OES_texture_buffer
    PFNGLTEXBUFFEROESPROC texBufferOES = nullptr;
    PFNGLTEXBUFFERRANGEOESPROC texBufferRangeOES = nullptr;

    // GL_OVR_multiview
    PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC framebufferTextureMultiviewOVR = nullptr;
    PFNGLNAMEDFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC namedFramebufferTextureMultiviewOVR = nullptr;

    // GL_QCOM_tiled_rendering
    PFNGLENDTILINGQCOMPROC endTilingQCOM = nullptr;
    PFNGLSTARTTILINGQCOMPROC startTilingQCOM = nullptr;
    // clang-format on

    DispatchTableGL();
    virtual ~DispatchTableGL() = default;

  protected:
    virtual void *loadProcAddress(const std::string &function) const = 0;

    void initProcsDesktopGL(const gl::Version &version, const std::set<std::string> &extensions);
    void initProcsGLES(const gl::Version &version, const std::set<std::string> &extensions);
    void initProcsSharedExtensions(const std::set<std::string> &extensions);
};

}  // namespace rx

#endif  // LIBGLESV2_RENDERER_GL_DISPATCH_TABLE_GL_AUTOGEN_H_
