// GENERATED FILE - DO NOT EDIT.
// Generated by generate_gl_dispatch_table.py using data from gl_bindings_data.json and gl.xml.
//
// Copyright 2019 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.
//
// null_functions.cpp:
//   Defines the NULL/Stub bindings for the OpenGL back-end.

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

namespace rx
{
void INTERNAL_GL_APIENTRY glActiveShaderProgramNULL(GLuint pipeline, GLuint program) {}

void INTERNAL_GL_APIENTRY glActiveTextureNULL(GLenum texture) {}

void INTERNAL_GL_APIENTRY glAttachShaderNULL(GLuint program, GLuint shader) {}

void INTERNAL_GL_APIENTRY glBeginConditionalRenderNULL(GLuint id, GLenum mode) {}

void INTERNAL_GL_APIENTRY glBeginQueryNULL(GLenum target, GLuint id) {}

void INTERNAL_GL_APIENTRY glBeginQueryIndexedNULL(GLenum target, GLuint index, GLuint id) {}

void INTERNAL_GL_APIENTRY glBeginTransformFeedbackNULL(GLenum primitiveMode) {}

void INTERNAL_GL_APIENTRY glBindAttribLocationNULL(GLuint program, GLuint index, const GLchar *name)
{}

void INTERNAL_GL_APIENTRY glBindBufferNULL(GLenum target, GLuint buffer) {}

void INTERNAL_GL_APIENTRY glBindBufferBaseNULL(GLenum target, GLuint index, GLuint buffer) {}

void INTERNAL_GL_APIENTRY
glBindBufferRangeNULL(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
{}

void INTERNAL_GL_APIENTRY glBindBuffersBaseNULL(GLenum target,
                                                GLuint first,
                                                GLsizei count,
                                                const GLuint *buffers)
{}

void INTERNAL_GL_APIENTRY glBindBuffersRangeNULL(GLenum target,
                                                 GLuint first,
                                                 GLsizei count,
                                                 const GLuint *buffers,
                                                 const GLintptr *offsets,
                                                 const GLsizeiptr *sizes)
{}

void INTERNAL_GL_APIENTRY glBindFragDataLocationNULL(GLuint program,
                                                     GLuint color,
                                                     const GLchar *name)
{}

void INTERNAL_GL_APIENTRY glBindFragDataLocationIndexedNULL(GLuint program,
                                                            GLuint colorNumber,
                                                            GLuint index,
                                                            const GLchar *name)
{}

void INTERNAL_GL_APIENTRY glBindFramebufferNULL(GLenum target, GLuint framebuffer) {}

void INTERNAL_GL_APIENTRY glBindImageTextureNULL(GLuint unit,
                                                 GLuint texture,
                                                 GLint level,
                                                 GLboolean layered,
                                                 GLint layer,
                                                 GLenum access,
                                                 GLenum format)
{}

void INTERNAL_GL_APIENTRY glBindImageTexturesNULL(GLuint first,
                                                  GLsizei count,
                                                  const GLuint *textures)
{}

void INTERNAL_GL_APIENTRY glBindProgramPipelineNULL(GLuint pipeline) {}

void INTERNAL_GL_APIENTRY glBindRenderbufferNULL(GLenum target, GLuint renderbuffer) {}

void INTERNAL_GL_APIENTRY glBindSamplerNULL(GLuint unit, GLuint sampler) {}

void INTERNAL_GL_APIENTRY glBindSamplersNULL(GLuint first, GLsizei count, const GLuint *samplers) {}

void INTERNAL_GL_APIENTRY glBindTextureNULL(GLenum target, GLuint texture) {}

void INTERNAL_GL_APIENTRY glBindTextureUnitNULL(GLuint unit, GLuint texture) {}

void INTERNAL_GL_APIENTRY glBindTexturesNULL(GLuint first, GLsizei count, const GLuint *textures) {}

void INTERNAL_GL_APIENTRY glBindTransformFeedbackNULL(GLenum target, GLuint id) {}

void INTERNAL_GL_APIENTRY glBindVertexArrayNULL(GLuint array) {}

void INTERNAL_GL_APIENTRY glBindVertexBufferNULL(GLuint bindingindex,
                                                 GLuint buffer,
                                                 GLintptr offset,
                                                 GLsizei stride)
{}

void INTERNAL_GL_APIENTRY glBindVertexBuffersNULL(GLuint first,
                                                  GLsizei count,
                                                  const GLuint *buffers,
                                                  const GLintptr *offsets,
                                                  const GLsizei *strides)
{}

void INTERNAL_GL_APIENTRY glBlendBarrierNULL() {}

void INTERNAL_GL_APIENTRY glBlendColorNULL(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{}

void INTERNAL_GL_APIENTRY glBlendEquationNULL(GLenum mode) {}

void INTERNAL_GL_APIENTRY glBlendEquationSeparateNULL(GLenum modeRGB, GLenum modeAlpha) {}

void INTERNAL_GL_APIENTRY glBlendEquationSeparateiNULL(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
{}

void INTERNAL_GL_APIENTRY glBlendEquationiNULL(GLuint buf, GLenum mode) {}

void INTERNAL_GL_APIENTRY glBlendFuncNULL(GLenum sfactor, GLenum dfactor) {}

void INTERNAL_GL_APIENTRY glBlendFuncSeparateNULL(GLenum sfactorRGB,
                                                  GLenum dfactorRGB,
                                                  GLenum sfactorAlpha,
                                                  GLenum dfactorAlpha)
{}

void INTERNAL_GL_APIENTRY
glBlendFuncSeparateiNULL(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
{}

void INTERNAL_GL_APIENTRY glBlendFunciNULL(GLuint buf, GLenum src, GLenum dst) {}

void INTERNAL_GL_APIENTRY glBlitFramebufferNULL(GLint srcX0,
                                                GLint srcY0,
                                                GLint srcX1,
                                                GLint srcY1,
                                                GLint dstX0,
                                                GLint dstY0,
                                                GLint dstX1,
                                                GLint dstY1,
                                                GLbitfield mask,
                                                GLenum filter)
{}

void INTERNAL_GL_APIENTRY glBlitNamedFramebufferNULL(GLuint readFramebuffer,
                                                     GLuint drawFramebuffer,
                                                     GLint srcX0,
                                                     GLint srcY0,
                                                     GLint srcX1,
                                                     GLint srcY1,
                                                     GLint dstX0,
                                                     GLint dstY0,
                                                     GLint dstX1,
                                                     GLint dstY1,
                                                     GLbitfield mask,
                                                     GLenum filter)
{}

void INTERNAL_GL_APIENTRY glBufferDataNULL(GLenum target,
                                           GLsizeiptr size,
                                           const void *data,
                                           GLenum usage)
{}

void INTERNAL_GL_APIENTRY glBufferStorageNULL(GLenum target,
                                              GLsizeiptr size,
                                              const void *data,
                                              GLbitfield flags)
{}

void INTERNAL_GL_APIENTRY glBufferStorageMemEXTNULL(GLenum target,
                                                    GLsizeiptr size,
                                                    GLuint memory,
                                                    GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glBufferSubDataNULL(GLenum target,
                                              GLintptr offset,
                                              GLsizeiptr size,
                                              const void *data)
{}

GLenum INTERNAL_GL_APIENTRY glCheckFramebufferStatusNULL(GLenum target)
{
    return static_cast<GLenum>(0);
}

GLenum INTERNAL_GL_APIENTRY glCheckNamedFramebufferStatusNULL(GLuint framebuffer, GLenum target)
{
    return static_cast<GLenum>(0);
}

void INTERNAL_GL_APIENTRY glClampColorNULL(GLenum target, GLenum clamp) {}

void INTERNAL_GL_APIENTRY glClearNULL(GLbitfield mask) {}

void INTERNAL_GL_APIENTRY glClearBufferDataNULL(GLenum target,
                                                GLenum internalformat,
                                                GLenum format,
                                                GLenum type,
                                                const void *data)
{}

void INTERNAL_GL_APIENTRY glClearBufferSubDataNULL(GLenum target,
                                                   GLenum internalformat,
                                                   GLintptr offset,
                                                   GLsizeiptr size,
                                                   GLenum format,
                                                   GLenum type,
                                                   const void *data)
{}

void INTERNAL_GL_APIENTRY glClearBufferfiNULL(GLenum buffer,
                                              GLint drawbuffer,
                                              GLfloat depth,
                                              GLint stencil)
{}

void INTERNAL_GL_APIENTRY glClearBufferfvNULL(GLenum buffer, GLint drawbuffer, const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glClearBufferivNULL(GLenum buffer, GLint drawbuffer, const GLint *value)
{}

void INTERNAL_GL_APIENTRY glClearBufferuivNULL(GLenum buffer, GLint drawbuffer, const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glClearColorNULL(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{}

void INTERNAL_GL_APIENTRY glClearDepthNULL(GLdouble depth) {}

void INTERNAL_GL_APIENTRY glClearDepthfNULL(GLfloat d) {}

void INTERNAL_GL_APIENTRY glClearNamedBufferDataNULL(GLuint buffer,
                                                     GLenum internalformat,
                                                     GLenum format,
                                                     GLenum type,
                                                     const void *data)
{}

void INTERNAL_GL_APIENTRY glClearNamedBufferSubDataNULL(GLuint buffer,
                                                        GLenum internalformat,
                                                        GLintptr offset,
                                                        GLsizeiptr size,
                                                        GLenum format,
                                                        GLenum type,
                                                        const void *data)
{}

void INTERNAL_GL_APIENTRY glClearNamedFramebufferfiNULL(GLuint framebuffer,
                                                        GLenum buffer,
                                                        GLint drawbuffer,
                                                        GLfloat depth,
                                                        GLint stencil)
{}

void INTERNAL_GL_APIENTRY glClearNamedFramebufferfvNULL(GLuint framebuffer,
                                                        GLenum buffer,
                                                        GLint drawbuffer,
                                                        const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glClearNamedFramebufferivNULL(GLuint framebuffer,
                                                        GLenum buffer,
                                                        GLint drawbuffer,
                                                        const GLint *value)
{}

void INTERNAL_GL_APIENTRY glClearNamedFramebufferuivNULL(GLuint framebuffer,
                                                         GLenum buffer,
                                                         GLint drawbuffer,
                                                         const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glClearStencilNULL(GLint s) {}

void INTERNAL_GL_APIENTRY
glClearTexImageNULL(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
{}

void INTERNAL_GL_APIENTRY glClearTexSubImageNULL(GLuint texture,
                                                 GLint level,
                                                 GLint xoffset,
                                                 GLint yoffset,
                                                 GLint zoffset,
                                                 GLsizei width,
                                                 GLsizei height,
                                                 GLsizei depth,
                                                 GLenum format,
                                                 GLenum type,
                                                 const void *data)
{}

GLenum INTERNAL_GL_APIENTRY glClientWaitSyncNULL(GLsync sync, GLbitfield flags, GLuint64 timeout)
{
    return static_cast<GLenum>(0);
}

void INTERNAL_GL_APIENTRY glClipControlNULL(GLenum origin, GLenum depth) {}

void INTERNAL_GL_APIENTRY glColorMaskNULL(GLboolean red,
                                          GLboolean green,
                                          GLboolean blue,
                                          GLboolean alpha)
{}

void INTERNAL_GL_APIENTRY
glColorMaskiNULL(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
{}

void INTERNAL_GL_APIENTRY glCompileShaderNULL(GLuint shader) {}

void INTERNAL_GL_APIENTRY glCompressedTexImage1DNULL(GLenum target,
                                                     GLint level,
                                                     GLenum internalformat,
                                                     GLsizei width,
                                                     GLint border,
                                                     GLsizei imageSize,
                                                     const void *data)
{}

void INTERNAL_GL_APIENTRY glCompressedTexImage2DNULL(GLenum target,
                                                     GLint level,
                                                     GLenum internalformat,
                                                     GLsizei width,
                                                     GLsizei height,
                                                     GLint border,
                                                     GLsizei imageSize,
                                                     const void *data)
{}

void INTERNAL_GL_APIENTRY glCompressedTexImage3DNULL(GLenum target,
                                                     GLint level,
                                                     GLenum internalformat,
                                                     GLsizei width,
                                                     GLsizei height,
                                                     GLsizei depth,
                                                     GLint border,
                                                     GLsizei imageSize,
                                                     const void *data)
{}

void INTERNAL_GL_APIENTRY glCompressedTexSubImage1DNULL(GLenum target,
                                                        GLint level,
                                                        GLint xoffset,
                                                        GLsizei width,
                                                        GLenum format,
                                                        GLsizei imageSize,
                                                        const void *data)
{}

void INTERNAL_GL_APIENTRY glCompressedTexSubImage2DNULL(GLenum target,
                                                        GLint level,
                                                        GLint xoffset,
                                                        GLint yoffset,
                                                        GLsizei width,
                                                        GLsizei height,
                                                        GLenum format,
                                                        GLsizei imageSize,
                                                        const void *data)
{}

void INTERNAL_GL_APIENTRY glCompressedTexSubImage3DNULL(GLenum target,
                                                        GLint level,
                                                        GLint xoffset,
                                                        GLint yoffset,
                                                        GLint zoffset,
                                                        GLsizei width,
                                                        GLsizei height,
                                                        GLsizei depth,
                                                        GLenum format,
                                                        GLsizei imageSize,
                                                        const void *data)
{}

void INTERNAL_GL_APIENTRY glCompressedTextureSubImage1DNULL(GLuint texture,
                                                            GLint level,
                                                            GLint xoffset,
                                                            GLsizei width,
                                                            GLenum format,
                                                            GLsizei imageSize,
                                                            const void *data)
{}

void INTERNAL_GL_APIENTRY glCompressedTextureSubImage2DNULL(GLuint texture,
                                                            GLint level,
                                                            GLint xoffset,
                                                            GLint yoffset,
                                                            GLsizei width,
                                                            GLsizei height,
                                                            GLenum format,
                                                            GLsizei imageSize,
                                                            const void *data)
{}

void INTERNAL_GL_APIENTRY glCompressedTextureSubImage3DNULL(GLuint texture,
                                                            GLint level,
                                                            GLint xoffset,
                                                            GLint yoffset,
                                                            GLint zoffset,
                                                            GLsizei width,
                                                            GLsizei height,
                                                            GLsizei depth,
                                                            GLenum format,
                                                            GLsizei imageSize,
                                                            const void *data)
{}

void INTERNAL_GL_APIENTRY glCopyBufferSubDataNULL(GLenum readTarget,
                                                  GLenum writeTarget,
                                                  GLintptr readOffset,
                                                  GLintptr writeOffset,
                                                  GLsizeiptr size)
{}

void INTERNAL_GL_APIENTRY glCopyImageSubDataNULL(GLuint srcName,
                                                 GLenum srcTarget,
                                                 GLint srcLevel,
                                                 GLint srcX,
                                                 GLint srcY,
                                                 GLint srcZ,
                                                 GLuint dstName,
                                                 GLenum dstTarget,
                                                 GLint dstLevel,
                                                 GLint dstX,
                                                 GLint dstY,
                                                 GLint dstZ,
                                                 GLsizei srcWidth,
                                                 GLsizei srcHeight,
                                                 GLsizei srcDepth)
{}

void INTERNAL_GL_APIENTRY glCopyNamedBufferSubDataNULL(GLuint readBuffer,
                                                       GLuint writeBuffer,
                                                       GLintptr readOffset,
                                                       GLintptr writeOffset,
                                                       GLsizeiptr size)
{}

void INTERNAL_GL_APIENTRY glCopyTexImage1DNULL(GLenum target,
                                               GLint level,
                                               GLenum internalformat,
                                               GLint x,
                                               GLint y,
                                               GLsizei width,
                                               GLint border)
{}

void INTERNAL_GL_APIENTRY glCopyTexImage2DNULL(GLenum target,
                                               GLint level,
                                               GLenum internalformat,
                                               GLint x,
                                               GLint y,
                                               GLsizei width,
                                               GLsizei height,
                                               GLint border)
{}

void INTERNAL_GL_APIENTRY
glCopyTexSubImage1DNULL(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{}

void INTERNAL_GL_APIENTRY glCopyTexSubImage2DNULL(GLenum target,
                                                  GLint level,
                                                  GLint xoffset,
                                                  GLint yoffset,
                                                  GLint x,
                                                  GLint y,
                                                  GLsizei width,
                                                  GLsizei height)
{}

void INTERNAL_GL_APIENTRY glCopyTexSubImage3DNULL(GLenum target,
                                                  GLint level,
                                                  GLint xoffset,
                                                  GLint yoffset,
                                                  GLint zoffset,
                                                  GLint x,
                                                  GLint y,
                                                  GLsizei width,
                                                  GLsizei height)
{}

void INTERNAL_GL_APIENTRY glCopyTextureSubImage1DNULL(GLuint texture,
                                                      GLint level,
                                                      GLint xoffset,
                                                      GLint x,
                                                      GLint y,
                                                      GLsizei width)
{}

void INTERNAL_GL_APIENTRY glCopyTextureSubImage2DNULL(GLuint texture,
                                                      GLint level,
                                                      GLint xoffset,
                                                      GLint yoffset,
                                                      GLint x,
                                                      GLint y,
                                                      GLsizei width,
                                                      GLsizei height)
{}

void INTERNAL_GL_APIENTRY glCopyTextureSubImage3DNULL(GLuint texture,
                                                      GLint level,
                                                      GLint xoffset,
                                                      GLint yoffset,
                                                      GLint zoffset,
                                                      GLint x,
                                                      GLint y,
                                                      GLsizei width,
                                                      GLsizei height)
{}

void INTERNAL_GL_APIENTRY glCoverFillPathInstancedNVNULL(GLsizei numPaths,
                                                         GLenum pathNameType,
                                                         const void *paths,
                                                         GLuint pathBase,
                                                         GLenum coverMode,
                                                         GLenum transformType,
                                                         const GLfloat *transformValues)
{}

void INTERNAL_GL_APIENTRY glCoverFillPathNVNULL(GLuint path, GLenum coverMode) {}

void INTERNAL_GL_APIENTRY glCoverStrokePathInstancedNVNULL(GLsizei numPaths,
                                                           GLenum pathNameType,
                                                           const void *paths,
                                                           GLuint pathBase,
                                                           GLenum coverMode,
                                                           GLenum transformType,
                                                           const GLfloat *transformValues)
{}

void INTERNAL_GL_APIENTRY glCoverStrokePathNVNULL(GLuint path, GLenum coverMode) {}

void INTERNAL_GL_APIENTRY glCoverageModulationNVNULL(GLenum components) {}

void INTERNAL_GL_APIENTRY glCreateBuffersNULL(GLsizei n, GLuint *buffers) {}

void INTERNAL_GL_APIENTRY glCreateFramebuffersNULL(GLsizei n, GLuint *framebuffers) {}

void INTERNAL_GL_APIENTRY glCreateMemoryObjectsEXTNULL(GLsizei n, GLuint *memoryObjects) {}

GLuint INTERNAL_GL_APIENTRY glCreateProgramNULL()
{
    return static_cast<GLuint>(0);
}

void INTERNAL_GL_APIENTRY glCreateProgramPipelinesNULL(GLsizei n, GLuint *pipelines) {}

void INTERNAL_GL_APIENTRY glCreateQueriesNULL(GLenum target, GLsizei n, GLuint *ids) {}

void INTERNAL_GL_APIENTRY glCreateRenderbuffersNULL(GLsizei n, GLuint *renderbuffers) {}

void INTERNAL_GL_APIENTRY glCreateSamplersNULL(GLsizei n, GLuint *samplers) {}

GLuint INTERNAL_GL_APIENTRY glCreateShaderNULL(GLenum type)
{
    return static_cast<GLuint>(0);
}

GLuint INTERNAL_GL_APIENTRY glCreateShaderProgramvNULL(GLenum type,
                                                       GLsizei count,
                                                       const GLchar *const *strings)
{
    return static_cast<GLuint>(0);
}

void INTERNAL_GL_APIENTRY glCreateTexturesNULL(GLenum target, GLsizei n, GLuint *textures) {}

void INTERNAL_GL_APIENTRY glCreateTransformFeedbacksNULL(GLsizei n, GLuint *ids) {}

void INTERNAL_GL_APIENTRY glCreateVertexArraysNULL(GLsizei n, GLuint *arrays) {}

void INTERNAL_GL_APIENTRY glCullFaceNULL(GLenum mode) {}

void INTERNAL_GL_APIENTRY glDebugMessageCallbackNULL(GLDEBUGPROC callback, const void *userParam) {}

void INTERNAL_GL_APIENTRY glDebugMessageControlNULL(GLenum source,
                                                    GLenum type,
                                                    GLenum severity,
                                                    GLsizei count,
                                                    const GLuint *ids,
                                                    GLboolean enabled)
{}

void INTERNAL_GL_APIENTRY glDebugMessageInsertNULL(GLenum source,
                                                   GLenum type,
                                                   GLuint id,
                                                   GLenum severity,
                                                   GLsizei length,
                                                   const GLchar *buf)
{}

void INTERNAL_GL_APIENTRY glDeleteBuffersNULL(GLsizei n, const GLuint *buffers) {}

void INTERNAL_GL_APIENTRY glDeleteFencesNVNULL(GLsizei n, const GLuint *fences) {}

void INTERNAL_GL_APIENTRY glDeleteFramebuffersNULL(GLsizei n, const GLuint *framebuffers) {}

void INTERNAL_GL_APIENTRY glDeleteMemoryObjectsEXTNULL(GLsizei n, const GLuint *memoryObjects) {}

void INTERNAL_GL_APIENTRY glDeletePathsNVNULL(GLuint path, GLsizei range) {}

void INTERNAL_GL_APIENTRY glDeleteProgramNULL(GLuint program) {}

void INTERNAL_GL_APIENTRY glDeleteProgramPipelinesNULL(GLsizei n, const GLuint *pipelines) {}

void INTERNAL_GL_APIENTRY glDeleteQueriesNULL(GLsizei n, const GLuint *ids) {}

void INTERNAL_GL_APIENTRY glDeleteRenderbuffersNULL(GLsizei n, const GLuint *renderbuffers) {}

void INTERNAL_GL_APIENTRY glDeleteSamplersNULL(GLsizei count, const GLuint *samplers) {}

void INTERNAL_GL_APIENTRY glDeleteSemaphoresEXTNULL(GLsizei n, const GLuint *semaphores) {}

void INTERNAL_GL_APIENTRY glDeleteShaderNULL(GLuint shader) {}

void INTERNAL_GL_APIENTRY glDeleteSyncNULL(GLsync sync) {}

void INTERNAL_GL_APIENTRY glDeleteTexturesNULL(GLsizei n, const GLuint *textures) {}

void INTERNAL_GL_APIENTRY glDeleteTransformFeedbacksNULL(GLsizei n, const GLuint *ids) {}

void INTERNAL_GL_APIENTRY glDeleteVertexArraysNULL(GLsizei n, const GLuint *arrays) {}

void INTERNAL_GL_APIENTRY glDepthFuncNULL(GLenum func) {}

void INTERNAL_GL_APIENTRY glDepthMaskNULL(GLboolean flag) {}

void INTERNAL_GL_APIENTRY glDepthRangeNULL(GLdouble n, GLdouble f) {}

void INTERNAL_GL_APIENTRY glDepthRangeArrayvNULL(GLuint first, GLsizei count, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY glDepthRangeIndexedNULL(GLuint index, GLdouble n, GLdouble f) {}

void INTERNAL_GL_APIENTRY glDepthRangefNULL(GLfloat n, GLfloat f) {}

void INTERNAL_GL_APIENTRY glDetachShaderNULL(GLuint program, GLuint shader) {}

void INTERNAL_GL_APIENTRY glDisableNULL(GLenum cap) {}

void INTERNAL_GL_APIENTRY glDisableVertexArrayAttribNULL(GLuint vaobj, GLuint index) {}

void INTERNAL_GL_APIENTRY glDisableVertexAttribArrayNULL(GLuint index) {}

void INTERNAL_GL_APIENTRY glDisableiNULL(GLenum target, GLuint index) {}

void INTERNAL_GL_APIENTRY glDiscardFramebufferEXTNULL(GLenum target,
                                                      GLsizei numAttachments,
                                                      const GLenum *attachments)
{}

void INTERNAL_GL_APIENTRY glDispatchComputeNULL(GLuint num_groups_x,
                                                GLuint num_groups_y,
                                                GLuint num_groups_z)
{}

void INTERNAL_GL_APIENTRY glDispatchComputeIndirectNULL(GLintptr indirect) {}

void INTERNAL_GL_APIENTRY glDrawArraysNULL(GLenum mode, GLint first, GLsizei count) {}

void INTERNAL_GL_APIENTRY glDrawArraysIndirectNULL(GLenum mode, const void *indirect) {}

void INTERNAL_GL_APIENTRY glDrawArraysInstancedNULL(GLenum mode,
                                                    GLint first,
                                                    GLsizei count,
                                                    GLsizei instancecount)
{}

void INTERNAL_GL_APIENTRY glDrawArraysInstancedBaseInstanceNULL(GLenum mode,
                                                                GLint first,
                                                                GLsizei count,
                                                                GLsizei instancecount,
                                                                GLuint baseinstance)
{}

void INTERNAL_GL_APIENTRY glDrawBufferNULL(GLenum buf) {}

void INTERNAL_GL_APIENTRY glDrawBuffersNULL(GLsizei n, const GLenum *bufs) {}

void INTERNAL_GL_APIENTRY glDrawElementsNULL(GLenum mode,
                                             GLsizei count,
                                             GLenum type,
                                             const void *indices)
{}

void INTERNAL_GL_APIENTRY glDrawElementsBaseVertexNULL(GLenum mode,
                                                       GLsizei count,
                                                       GLenum type,
                                                       const void *indices,
                                                       GLint basevertex)
{}

void INTERNAL_GL_APIENTRY glDrawElementsIndirectNULL(GLenum mode, GLenum type, const void *indirect)
{}

void INTERNAL_GL_APIENTRY glDrawElementsInstancedNULL(GLenum mode,
                                                      GLsizei count,
                                                      GLenum type,
                                                      const void *indices,
                                                      GLsizei instancecount)
{}

void INTERNAL_GL_APIENTRY glDrawElementsInstancedBaseInstanceNULL(GLenum mode,
                                                                  GLsizei count,
                                                                  GLenum type,
                                                                  const void *indices,
                                                                  GLsizei instancecount,
                                                                  GLuint baseinstance)
{}

void INTERNAL_GL_APIENTRY glDrawElementsInstancedBaseVertexNULL(GLenum mode,
                                                                GLsizei count,
                                                                GLenum type,
                                                                const void *indices,
                                                                GLsizei instancecount,
                                                                GLint basevertex)
{}

void INTERNAL_GL_APIENTRY glDrawElementsInstancedBaseVertexBaseInstanceNULL(GLenum mode,
                                                                            GLsizei count,
                                                                            GLenum type,
                                                                            const void *indices,
                                                                            GLsizei instancecount,
                                                                            GLint basevertex,
                                                                            GLuint baseinstance)
{}

void INTERNAL_GL_APIENTRY glDrawRangeElementsNULL(GLenum mode,
                                                  GLuint start,
                                                  GLuint end,
                                                  GLsizei count,
                                                  GLenum type,
                                                  const void *indices)
{}

void INTERNAL_GL_APIENTRY glDrawRangeElementsBaseVertexNULL(GLenum mode,
                                                            GLuint start,
                                                            GLuint end,
                                                            GLsizei count,
                                                            GLenum type,
                                                            const void *indices,
                                                            GLint basevertex)
{}

void INTERNAL_GL_APIENTRY glDrawTransformFeedbackNULL(GLenum mode, GLuint id) {}

void INTERNAL_GL_APIENTRY glDrawTransformFeedbackInstancedNULL(GLenum mode,
                                                               GLuint id,
                                                               GLsizei instancecount)
{}

void INTERNAL_GL_APIENTRY glDrawTransformFeedbackStreamNULL(GLenum mode, GLuint id, GLuint stream)
{}

void INTERNAL_GL_APIENTRY glDrawTransformFeedbackStreamInstancedNULL(GLenum mode,
                                                                     GLuint id,
                                                                     GLuint stream,
                                                                     GLsizei instancecount)
{}

void INTERNAL_GL_APIENTRY glEGLImageTargetRenderbufferStorageOESNULL(GLenum target,
                                                                     GLeglImageOES image)
{}

void INTERNAL_GL_APIENTRY glEGLImageTargetTexture2DOESNULL(GLenum target, GLeglImageOES image) {}

void INTERNAL_GL_APIENTRY glEnableNULL(GLenum cap) {}

void INTERNAL_GL_APIENTRY glEnableVertexArrayAttribNULL(GLuint vaobj, GLuint index) {}

void INTERNAL_GL_APIENTRY glEnableVertexAttribArrayNULL(GLuint index) {}

void INTERNAL_GL_APIENTRY glEnableiNULL(GLenum target, GLuint index) {}

void INTERNAL_GL_APIENTRY glEndConditionalRenderNULL() {}

void INTERNAL_GL_APIENTRY glEndQueryNULL(GLenum target) {}

void INTERNAL_GL_APIENTRY glEndQueryIndexedNULL(GLenum target, GLuint index) {}

void INTERNAL_GL_APIENTRY glEndTransformFeedbackNULL() {}

GLsync INTERNAL_GL_APIENTRY glFenceSyncNULL(GLenum condition, GLbitfield flags)
{
    return static_cast<GLsync>(0);
}

void INTERNAL_GL_APIENTRY glFinishNULL() {}

void INTERNAL_GL_APIENTRY glFinishFenceNVNULL(GLuint fence) {}

void INTERNAL_GL_APIENTRY glFlushNULL() {}

void INTERNAL_GL_APIENTRY glFlushMappedBufferRangeNULL(GLenum target,
                                                       GLintptr offset,
                                                       GLsizeiptr length)
{}

void INTERNAL_GL_APIENTRY glFlushMappedNamedBufferRangeNULL(GLuint buffer,
                                                            GLintptr offset,
                                                            GLsizeiptr length)
{}

void INTERNAL_GL_APIENTRY glFramebufferParameteriNULL(GLenum target, GLenum pname, GLint param) {}

void INTERNAL_GL_APIENTRY glFramebufferRenderbufferNULL(GLenum target,
                                                        GLenum attachment,
                                                        GLenum renderbuffertarget,
                                                        GLuint renderbuffer)
{}

void INTERNAL_GL_APIENTRY glFramebufferTextureNULL(GLenum target,
                                                   GLenum attachment,
                                                   GLuint texture,
                                                   GLint level)
{}

void INTERNAL_GL_APIENTRY glFramebufferTexture1DNULL(GLenum target,
                                                     GLenum attachment,
                                                     GLenum textarget,
                                                     GLuint texture,
                                                     GLint level)
{}

void INTERNAL_GL_APIENTRY glFramebufferTexture2DNULL(GLenum target,
                                                     GLenum attachment,
                                                     GLenum textarget,
                                                     GLuint texture,
                                                     GLint level)
{}

void INTERNAL_GL_APIENTRY glFramebufferTexture3DNULL(GLenum target,
                                                     GLenum attachment,
                                                     GLenum textarget,
                                                     GLuint texture,
                                                     GLint level,
                                                     GLint zoffset)
{}

void INTERNAL_GL_APIENTRY glFramebufferTextureLayerNULL(GLenum target,
                                                        GLenum attachment,
                                                        GLuint texture,
                                                        GLint level,
                                                        GLint layer)
{}

void INTERNAL_GL_APIENTRY glFramebufferTextureMultiviewOVRNULL(GLenum target,
                                                               GLenum attachment,
                                                               GLuint texture,
                                                               GLint level,
                                                               GLint baseViewIndex,
                                                               GLsizei numViews)
{}

void INTERNAL_GL_APIENTRY glFrontFaceNULL(GLenum mode) {}

void INTERNAL_GL_APIENTRY glGenBuffersNULL(GLsizei n, GLuint *buffers) {}

void INTERNAL_GL_APIENTRY glGenFencesNVNULL(GLsizei n, GLuint *fences) {}

void INTERNAL_GL_APIENTRY glGenFramebuffersNULL(GLsizei n, GLuint *framebuffers) {}

GLuint INTERNAL_GL_APIENTRY glGenPathsNVNULL(GLsizei range)
{
    return static_cast<GLuint>(0);
}

void INTERNAL_GL_APIENTRY glGenProgramPipelinesNULL(GLsizei n, GLuint *pipelines) {}

void INTERNAL_GL_APIENTRY glGenQueriesNULL(GLsizei n, GLuint *ids) {}

void INTERNAL_GL_APIENTRY glGenRenderbuffersNULL(GLsizei n, GLuint *renderbuffers) {}

void INTERNAL_GL_APIENTRY glGenSamplersNULL(GLsizei count, GLuint *samplers) {}

void INTERNAL_GL_APIENTRY glGenSemaphoresEXTNULL(GLsizei n, GLuint *semaphores) {}

void INTERNAL_GL_APIENTRY glGenTexturesNULL(GLsizei n, GLuint *textures) {}

void INTERNAL_GL_APIENTRY glGenTransformFeedbacksNULL(GLsizei n, GLuint *ids) {}

void INTERNAL_GL_APIENTRY glGenVertexArraysNULL(GLsizei n, GLuint *arrays) {}

void INTERNAL_GL_APIENTRY glGenerateMipmapNULL(GLenum target) {}

void INTERNAL_GL_APIENTRY glGenerateTextureMipmapNULL(GLuint texture) {}

void INTERNAL_GL_APIENTRY glGetActiveAtomicCounterBufferivNULL(GLuint program,
                                                               GLuint bufferIndex,
                                                               GLenum pname,
                                                               GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetActiveAttribNULL(GLuint program,
                                                GLuint index,
                                                GLsizei bufSize,
                                                GLsizei *length,
                                                GLint *size,
                                                GLenum *type,
                                                GLchar *name)
{}

void INTERNAL_GL_APIENTRY glGetActiveSubroutineNameNULL(GLuint program,
                                                        GLenum shadertype,
                                                        GLuint index,
                                                        GLsizei bufsize,
                                                        GLsizei *length,
                                                        GLchar *name)
{}

void INTERNAL_GL_APIENTRY glGetActiveSubroutineUniformNameNULL(GLuint program,
                                                               GLenum shadertype,
                                                               GLuint index,
                                                               GLsizei bufsize,
                                                               GLsizei *length,
                                                               GLchar *name)
{}

void INTERNAL_GL_APIENTRY glGetActiveSubroutineUniformivNULL(GLuint program,
                                                             GLenum shadertype,
                                                             GLuint index,
                                                             GLenum pname,
                                                             GLint *values)
{}

void INTERNAL_GL_APIENTRY glGetActiveUniformNULL(GLuint program,
                                                 GLuint index,
                                                 GLsizei bufSize,
                                                 GLsizei *length,
                                                 GLint *size,
                                                 GLenum *type,
                                                 GLchar *name)
{}

void INTERNAL_GL_APIENTRY glGetActiveUniformBlockNameNULL(GLuint program,
                                                          GLuint uniformBlockIndex,
                                                          GLsizei bufSize,
                                                          GLsizei *length,
                                                          GLchar *uniformBlockName)
{}

void INTERNAL_GL_APIENTRY glGetActiveUniformBlockivNULL(GLuint program,
                                                        GLuint uniformBlockIndex,
                                                        GLenum pname,
                                                        GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetActiveUniformNameNULL(GLuint program,
                                                     GLuint uniformIndex,
                                                     GLsizei bufSize,
                                                     GLsizei *length,
                                                     GLchar *uniformName)
{}

void INTERNAL_GL_APIENTRY glGetActiveUniformsivNULL(GLuint program,
                                                    GLsizei uniformCount,
                                                    const GLuint *uniformIndices,
                                                    GLenum pname,
                                                    GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetAttachedShadersNULL(GLuint program,
                                                   GLsizei maxCount,
                                                   GLsizei *count,
                                                   GLuint *shaders)
{}

GLint INTERNAL_GL_APIENTRY glGetAttribLocationNULL(GLuint program, const GLchar *name)
{
    return static_cast<GLint>(0);
}

void INTERNAL_GL_APIENTRY glGetBooleani_vNULL(GLenum target, GLuint index, GLboolean *data) {}

void INTERNAL_GL_APIENTRY glGetBooleanvNULL(GLenum pname, GLboolean *data) {}

void INTERNAL_GL_APIENTRY glGetBufferParameteri64vNULL(GLenum target, GLenum pname, GLint64 *params)
{}

void INTERNAL_GL_APIENTRY glGetBufferParameterivNULL(GLenum target, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetBufferPointervNULL(GLenum target, GLenum pname, void **params) {}

void INTERNAL_GL_APIENTRY glGetBufferSubDataNULL(GLenum target,
                                                 GLintptr offset,
                                                 GLsizeiptr size,
                                                 void *data)
{}

void INTERNAL_GL_APIENTRY glGetCompressedTexImageNULL(GLenum target, GLint level, void *img) {}

void INTERNAL_GL_APIENTRY glGetCompressedTextureImageNULL(GLuint texture,
                                                          GLint level,
                                                          GLsizei bufSize,
                                                          void *pixels)
{}

void INTERNAL_GL_APIENTRY glGetCompressedTextureSubImageNULL(GLuint texture,
                                                             GLint level,
                                                             GLint xoffset,
                                                             GLint yoffset,
                                                             GLint zoffset,
                                                             GLsizei width,
                                                             GLsizei height,
                                                             GLsizei depth,
                                                             GLsizei bufSize,
                                                             void *pixels)
{}

GLuint INTERNAL_GL_APIENTRY glGetDebugMessageLogNULL(GLuint count,
                                                     GLsizei bufSize,
                                                     GLenum *sources,
                                                     GLenum *types,
                                                     GLuint *ids,
                                                     GLenum *severities,
                                                     GLsizei *lengths,
                                                     GLchar *messageLog)
{
    return static_cast<GLuint>(0);
}

void INTERNAL_GL_APIENTRY glGetDoublei_vNULL(GLenum target, GLuint index, GLdouble *data) {}

void INTERNAL_GL_APIENTRY glGetDoublevNULL(GLenum pname, GLdouble *data) {}

GLenum INTERNAL_GL_APIENTRY glGetErrorNULL()
{
    return static_cast<GLenum>(0);
}

void INTERNAL_GL_APIENTRY glGetFenceivNVNULL(GLuint fence, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetFloati_vNULL(GLenum target, GLuint index, GLfloat *data) {}

void INTERNAL_GL_APIENTRY glGetFloatvNULL(GLenum pname, GLfloat *data) {}

GLint INTERNAL_GL_APIENTRY glGetFragDataIndexNULL(GLuint program, const GLchar *name)
{
    return static_cast<GLint>(0);
}

GLint INTERNAL_GL_APIENTRY glGetFragDataLocationNULL(GLuint program, const GLchar *name)
{
    return static_cast<GLint>(0);
}

void INTERNAL_GL_APIENTRY glGetFramebufferAttachmentParameterivNULL(GLenum target,
                                                                    GLenum attachment,
                                                                    GLenum pname,
                                                                    GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetFramebufferParameterivNULL(GLenum target,
                                                          GLenum pname,
                                                          GLint *params)
{}

GLenum INTERNAL_GL_APIENTRY glGetGraphicsResetStatusNULL()
{
    return static_cast<GLenum>(0);
}

void INTERNAL_GL_APIENTRY glGetInteger64i_vNULL(GLenum target, GLuint index, GLint64 *data) {}

void INTERNAL_GL_APIENTRY glGetInteger64vNULL(GLenum pname, GLint64 *data) {}

void INTERNAL_GL_APIENTRY glGetIntegeri_vNULL(GLenum target, GLuint index, GLint *data) {}

void INTERNAL_GL_APIENTRY glGetIntegervNULL(GLenum pname, GLint *data) {}

void INTERNAL_GL_APIENTRY glGetInternalformatSampleivNVNULL(GLenum target,
                                                            GLenum internalformat,
                                                            GLsizei samples,
                                                            GLenum pname,
                                                            GLsizei bufSize,
                                                            GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetInternalformati64vNULL(GLenum target,
                                                      GLenum internalformat,
                                                      GLenum pname,
                                                      GLsizei bufSize,
                                                      GLint64 *params)
{}

void INTERNAL_GL_APIENTRY glGetInternalformativNULL(GLenum target,
                                                    GLenum internalformat,
                                                    GLenum pname,
                                                    GLsizei bufSize,
                                                    GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetMemoryObjectParameterivEXTNULL(GLuint memoryObject,
                                                              GLenum pname,
                                                              GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetMultisamplefvNULL(GLenum pname, GLuint index, GLfloat *val) {}

void INTERNAL_GL_APIENTRY glGetNamedBufferParameteri64vNULL(GLuint buffer,
                                                            GLenum pname,
                                                            GLint64 *params)
{}

void INTERNAL_GL_APIENTRY glGetNamedBufferParameterivNULL(GLuint buffer,
                                                          GLenum pname,
                                                          GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetNamedBufferPointervNULL(GLuint buffer, GLenum pname, void **params)
{}

void INTERNAL_GL_APIENTRY glGetNamedBufferSubDataNULL(GLuint buffer,
                                                      GLintptr offset,
                                                      GLsizeiptr size,
                                                      void *data)
{}

void INTERNAL_GL_APIENTRY glGetNamedFramebufferAttachmentParameterivNULL(GLuint framebuffer,
                                                                         GLenum attachment,
                                                                         GLenum pname,
                                                                         GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetNamedFramebufferParameterivNULL(GLuint framebuffer,
                                                               GLenum pname,
                                                               GLint *param)
{}

void INTERNAL_GL_APIENTRY glGetNamedRenderbufferParameterivNULL(GLuint renderbuffer,
                                                                GLenum pname,
                                                                GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetObjectLabelNULL(GLenum identifier,
                                               GLuint name,
                                               GLsizei bufSize,
                                               GLsizei *length,
                                               GLchar *label)
{}

void INTERNAL_GL_APIENTRY glGetObjectPtrLabelNULL(const void *ptr,
                                                  GLsizei bufSize,
                                                  GLsizei *length,
                                                  GLchar *label)
{}

void INTERNAL_GL_APIENTRY glGetPathParameterfvNVNULL(GLuint path, GLenum pname, GLfloat *value) {}

void INTERNAL_GL_APIENTRY glGetPathParameterivNVNULL(GLuint path, GLenum pname, GLint *value) {}

void INTERNAL_GL_APIENTRY glGetPointervNULL(GLenum pname, void **params) {}

void INTERNAL_GL_APIENTRY glGetProgramBinaryNULL(GLuint program,
                                                 GLsizei bufSize,
                                                 GLsizei *length,
                                                 GLenum *binaryFormat,
                                                 void *binary)
{}

void INTERNAL_GL_APIENTRY glGetProgramInfoLogNULL(GLuint program,
                                                  GLsizei bufSize,
                                                  GLsizei *length,
                                                  GLchar *infoLog)
{}

void INTERNAL_GL_APIENTRY glGetProgramInterfaceivNULL(GLuint program,
                                                      GLenum programInterface,
                                                      GLenum pname,
                                                      GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetProgramPipelineInfoLogNULL(GLuint pipeline,
                                                          GLsizei bufSize,
                                                          GLsizei *length,
                                                          GLchar *infoLog)
{}

void INTERNAL_GL_APIENTRY glGetProgramPipelineivNULL(GLuint pipeline, GLenum pname, GLint *params)
{}

GLuint INTERNAL_GL_APIENTRY glGetProgramResourceIndexNULL(GLuint program,
                                                          GLenum programInterface,
                                                          const GLchar *name)
{
    return static_cast<GLuint>(0);
}

GLint INTERNAL_GL_APIENTRY glGetProgramResourceLocationNULL(GLuint program,
                                                            GLenum programInterface,
                                                            const GLchar *name)
{
    return static_cast<GLint>(0);
}

GLint INTERNAL_GL_APIENTRY glGetProgramResourceLocationIndexNULL(GLuint program,
                                                                 GLenum programInterface,
                                                                 const GLchar *name)
{
    return static_cast<GLint>(0);
}

void INTERNAL_GL_APIENTRY glGetProgramResourceNameNULL(GLuint program,
                                                       GLenum programInterface,
                                                       GLuint index,
                                                       GLsizei bufSize,
                                                       GLsizei *length,
                                                       GLchar *name)
{}

void INTERNAL_GL_APIENTRY glGetProgramResourceivNULL(GLuint program,
                                                     GLenum programInterface,
                                                     GLuint index,
                                                     GLsizei propCount,
                                                     const GLenum *props,
                                                     GLsizei bufSize,
                                                     GLsizei *length,
                                                     GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetProgramStageivNULL(GLuint program,
                                                  GLenum shadertype,
                                                  GLenum pname,
                                                  GLint *values)
{}

void INTERNAL_GL_APIENTRY glGetProgramivNULL(GLuint program, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetQueryBufferObjecti64vNULL(GLuint id,
                                                         GLuint buffer,
                                                         GLenum pname,
                                                         GLintptr offset)
{}

void INTERNAL_GL_APIENTRY glGetQueryBufferObjectivNULL(GLuint id,
                                                       GLuint buffer,
                                                       GLenum pname,
                                                       GLintptr offset)
{}

void INTERNAL_GL_APIENTRY glGetQueryBufferObjectui64vNULL(GLuint id,
                                                          GLuint buffer,
                                                          GLenum pname,
                                                          GLintptr offset)
{}

void INTERNAL_GL_APIENTRY glGetQueryBufferObjectuivNULL(GLuint id,
                                                        GLuint buffer,
                                                        GLenum pname,
                                                        GLintptr offset)
{}

void INTERNAL_GL_APIENTRY glGetQueryIndexedivNULL(GLenum target,
                                                  GLuint index,
                                                  GLenum pname,
                                                  GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetQueryObjecti64vNULL(GLuint id, GLenum pname, GLint64 *params) {}

void INTERNAL_GL_APIENTRY glGetQueryObjectivNULL(GLuint id, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetQueryObjectui64vNULL(GLuint id, GLenum pname, GLuint64 *params) {}

void INTERNAL_GL_APIENTRY glGetQueryObjectuivNULL(GLuint id, GLenum pname, GLuint *params) {}

void INTERNAL_GL_APIENTRY glGetQueryivNULL(GLenum target, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetRenderbufferParameterivNULL(GLenum target,
                                                           GLenum pname,
                                                           GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetSamplerParameterIivNULL(GLuint sampler, GLenum pname, GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetSamplerParameterIuivNULL(GLuint sampler,
                                                        GLenum pname,
                                                        GLuint *params)
{}

void INTERNAL_GL_APIENTRY glGetSamplerParameterfvNULL(GLuint sampler, GLenum pname, GLfloat *params)
{}

void INTERNAL_GL_APIENTRY glGetSamplerParameterivNULL(GLuint sampler, GLenum pname, GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetSemaphoreParameterui64vEXTNULL(GLuint semaphore,
                                                              GLenum pname,
                                                              GLuint64 *params)
{}

void INTERNAL_GL_APIENTRY glGetShaderInfoLogNULL(GLuint shader,
                                                 GLsizei bufSize,
                                                 GLsizei *length,
                                                 GLchar *infoLog)
{}

void INTERNAL_GL_APIENTRY glGetShaderPrecisionFormatNULL(GLenum shadertype,
                                                         GLenum precisiontype,
                                                         GLint *range,
                                                         GLint *precision)
{}

void INTERNAL_GL_APIENTRY glGetShaderSourceNULL(GLuint shader,
                                                GLsizei bufSize,
                                                GLsizei *length,
                                                GLchar *source)
{}

void INTERNAL_GL_APIENTRY glGetShaderivNULL(GLuint shader, GLenum pname, GLint *params) {}

const GLubyte *INTERNAL_GL_APIENTRY glGetStringNULL(GLenum name)
{
    return static_cast<const GLubyte *>(0);
}

const GLubyte *INTERNAL_GL_APIENTRY glGetStringiNULL(GLenum name, GLuint index)
{
    return static_cast<const GLubyte *>(0);
}

GLuint INTERNAL_GL_APIENTRY glGetSubroutineIndexNULL(GLuint program,
                                                     GLenum shadertype,
                                                     const GLchar *name)
{
    return static_cast<GLuint>(0);
}

GLint INTERNAL_GL_APIENTRY glGetSubroutineUniformLocationNULL(GLuint program,
                                                              GLenum shadertype,
                                                              const GLchar *name)
{
    return static_cast<GLint>(0);
}

void INTERNAL_GL_APIENTRY
glGetSyncivNULL(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
{}

void INTERNAL_GL_APIENTRY
glGetTexImageNULL(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
{}

void INTERNAL_GL_APIENTRY glGetTexLevelParameterfvNULL(GLenum target,
                                                       GLint level,
                                                       GLenum pname,
                                                       GLfloat *params)
{}

void INTERNAL_GL_APIENTRY glGetTexLevelParameterivNULL(GLenum target,
                                                       GLint level,
                                                       GLenum pname,
                                                       GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetTexParameterIivNULL(GLenum target, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetTexParameterIuivNULL(GLenum target, GLenum pname, GLuint *params) {}

void INTERNAL_GL_APIENTRY glGetTexParameterfvNULL(GLenum target, GLenum pname, GLfloat *params) {}

void INTERNAL_GL_APIENTRY glGetTexParameterivNULL(GLenum target, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetTextureImageNULL(GLuint texture,
                                                GLint level,
                                                GLenum format,
                                                GLenum type,
                                                GLsizei bufSize,
                                                void *pixels)
{}

void INTERNAL_GL_APIENTRY glGetTextureLevelParameterfvNULL(GLuint texture,
                                                           GLint level,
                                                           GLenum pname,
                                                           GLfloat *params)
{}

void INTERNAL_GL_APIENTRY glGetTextureLevelParameterivNULL(GLuint texture,
                                                           GLint level,
                                                           GLenum pname,
                                                           GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetTextureParameterIivNULL(GLuint texture, GLenum pname, GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetTextureParameterIuivNULL(GLuint texture,
                                                        GLenum pname,
                                                        GLuint *params)
{}

void INTERNAL_GL_APIENTRY glGetTextureParameterfvNULL(GLuint texture, GLenum pname, GLfloat *params)
{}

void INTERNAL_GL_APIENTRY glGetTextureParameterivNULL(GLuint texture, GLenum pname, GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetTextureSubImageNULL(GLuint texture,
                                                   GLint level,
                                                   GLint xoffset,
                                                   GLint yoffset,
                                                   GLint zoffset,
                                                   GLsizei width,
                                                   GLsizei height,
                                                   GLsizei depth,
                                                   GLenum format,
                                                   GLenum type,
                                                   GLsizei bufSize,
                                                   void *pixels)
{}

void INTERNAL_GL_APIENTRY glGetTransformFeedbackVaryingNULL(GLuint program,
                                                            GLuint index,
                                                            GLsizei bufSize,
                                                            GLsizei *length,
                                                            GLsizei *size,
                                                            GLenum *type,
                                                            GLchar *name)
{}

void INTERNAL_GL_APIENTRY glGetTransformFeedbacki64_vNULL(GLuint xfb,
                                                          GLenum pname,
                                                          GLuint index,
                                                          GLint64 *param)
{}

void INTERNAL_GL_APIENTRY glGetTransformFeedbacki_vNULL(GLuint xfb,
                                                        GLenum pname,
                                                        GLuint index,
                                                        GLint *param)
{}

void INTERNAL_GL_APIENTRY glGetTransformFeedbackivNULL(GLuint xfb, GLenum pname, GLint *param) {}

GLuint INTERNAL_GL_APIENTRY glGetUniformBlockIndexNULL(GLuint program,
                                                       const GLchar *uniformBlockName)
{
    return static_cast<GLuint>(0);
}

void INTERNAL_GL_APIENTRY glGetUniformIndicesNULL(GLuint program,
                                                  GLsizei uniformCount,
                                                  const GLchar *const *uniformNames,
                                                  GLuint *uniformIndices)
{}

GLint INTERNAL_GL_APIENTRY glGetUniformLocationNULL(GLuint program, const GLchar *name)
{
    return static_cast<GLint>(0);
}

void INTERNAL_GL_APIENTRY glGetUniformSubroutineuivNULL(GLenum shadertype,
                                                        GLint location,
                                                        GLuint *params)
{}

void INTERNAL_GL_APIENTRY glGetUniformdvNULL(GLuint program, GLint location, GLdouble *params) {}

void INTERNAL_GL_APIENTRY glGetUniformfvNULL(GLuint program, GLint location, GLfloat *params) {}

void INTERNAL_GL_APIENTRY glGetUniformivNULL(GLuint program, GLint location, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetUniformuivNULL(GLuint program, GLint location, GLuint *params) {}

void INTERNAL_GL_APIENTRY glGetUnsignedBytei_vEXTNULL(GLenum target, GLuint index, GLubyte *data) {}

void INTERNAL_GL_APIENTRY glGetUnsignedBytevEXTNULL(GLenum pname, GLubyte *data) {}

void INTERNAL_GL_APIENTRY glGetVertexArrayIndexed64ivNULL(GLuint vaobj,
                                                          GLuint index,
                                                          GLenum pname,
                                                          GLint64 *param)
{}

void INTERNAL_GL_APIENTRY glGetVertexArrayIndexedivNULL(GLuint vaobj,
                                                        GLuint index,
                                                        GLenum pname,
                                                        GLint *param)
{}

void INTERNAL_GL_APIENTRY glGetVertexArrayivNULL(GLuint vaobj, GLenum pname, GLint *param) {}

void INTERNAL_GL_APIENTRY glGetVertexAttribIivNULL(GLuint index, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetVertexAttribIuivNULL(GLuint index, GLenum pname, GLuint *params) {}

void INTERNAL_GL_APIENTRY glGetVertexAttribLdvNULL(GLuint index, GLenum pname, GLdouble *params) {}

void INTERNAL_GL_APIENTRY glGetVertexAttribPointervNULL(GLuint index, GLenum pname, void **pointer)
{}

void INTERNAL_GL_APIENTRY glGetVertexAttribdvNULL(GLuint index, GLenum pname, GLdouble *params) {}

void INTERNAL_GL_APIENTRY glGetVertexAttribfvNULL(GLuint index, GLenum pname, GLfloat *params) {}

void INTERNAL_GL_APIENTRY glGetVertexAttribivNULL(GLuint index, GLenum pname, GLint *params) {}

void INTERNAL_GL_APIENTRY glGetnCompressedTexImageNULL(GLenum target,
                                                       GLint lod,
                                                       GLsizei bufSize,
                                                       void *pixels)
{}

void INTERNAL_GL_APIENTRY glGetnTexImageNULL(GLenum target,
                                             GLint level,
                                             GLenum format,
                                             GLenum type,
                                             GLsizei bufSize,
                                             void *pixels)
{}

void INTERNAL_GL_APIENTRY glGetnUniformdvNULL(GLuint program,
                                              GLint location,
                                              GLsizei bufSize,
                                              GLdouble *params)
{}

void INTERNAL_GL_APIENTRY glGetnUniformfvNULL(GLuint program,
                                              GLint location,
                                              GLsizei bufSize,
                                              GLfloat *params)
{}

void INTERNAL_GL_APIENTRY glGetnUniformivNULL(GLuint program,
                                              GLint location,
                                              GLsizei bufSize,
                                              GLint *params)
{}

void INTERNAL_GL_APIENTRY glGetnUniformuivNULL(GLuint program,
                                               GLint location,
                                               GLsizei bufSize,
                                               GLuint *params)
{}

void INTERNAL_GL_APIENTRY glHintNULL(GLenum target, GLenum mode) {}

void INTERNAL_GL_APIENTRY glImportMemoryFdEXTNULL(GLuint memory,
                                                  GLuint64 size,
                                                  GLenum handleType,
                                                  GLint fd)
{}

void INTERNAL_GL_APIENTRY glImportMemoryWin32HandleEXTNULL(GLuint memory,
                                                           GLuint64 size,
                                                           GLenum handleType,
                                                           void *handle)
{}

void INTERNAL_GL_APIENTRY glImportMemoryWin32NameEXTNULL(GLuint memory,
                                                         GLuint64 size,
                                                         GLenum handleType,
                                                         const void *name)
{}

void INTERNAL_GL_APIENTRY glImportSemaphoreFdEXTNULL(GLuint semaphore, GLenum handleType, GLint fd)
{}

void INTERNAL_GL_APIENTRY glImportSemaphoreWin32HandleEXTNULL(GLuint semaphore,
                                                              GLenum handleType,
                                                              void *handle)
{}

void INTERNAL_GL_APIENTRY glImportSemaphoreWin32NameEXTNULL(GLuint semaphore,
                                                            GLenum handleType,
                                                            const void *name)
{}

void INTERNAL_GL_APIENTRY glInsertEventMarkerEXTNULL(GLsizei length, const GLchar *marker) {}

void INTERNAL_GL_APIENTRY glInvalidateBufferDataNULL(GLuint buffer) {}

void INTERNAL_GL_APIENTRY glInvalidateBufferSubDataNULL(GLuint buffer,
                                                        GLintptr offset,
                                                        GLsizeiptr length)
{}

void INTERNAL_GL_APIENTRY glInvalidateFramebufferNULL(GLenum target,
                                                      GLsizei numAttachments,
                                                      const GLenum *attachments)
{}

void INTERNAL_GL_APIENTRY glInvalidateNamedFramebufferDataNULL(GLuint framebuffer,
                                                               GLsizei numAttachments,
                                                               const GLenum *attachments)
{}

void INTERNAL_GL_APIENTRY glInvalidateNamedFramebufferSubDataNULL(GLuint framebuffer,
                                                                  GLsizei numAttachments,
                                                                  const GLenum *attachments,
                                                                  GLint x,
                                                                  GLint y,
                                                                  GLsizei width,
                                                                  GLsizei height)
{}

void INTERNAL_GL_APIENTRY glInvalidateSubFramebufferNULL(GLenum target,
                                                         GLsizei numAttachments,
                                                         const GLenum *attachments,
                                                         GLint x,
                                                         GLint y,
                                                         GLsizei width,
                                                         GLsizei height)
{}

void INTERNAL_GL_APIENTRY glInvalidateTexImageNULL(GLuint texture, GLint level) {}

void INTERNAL_GL_APIENTRY glInvalidateTexSubImageNULL(GLuint texture,
                                                      GLint level,
                                                      GLint xoffset,
                                                      GLint yoffset,
                                                      GLint zoffset,
                                                      GLsizei width,
                                                      GLsizei height,
                                                      GLsizei depth)
{}

GLboolean INTERNAL_GL_APIENTRY glIsBufferNULL(GLuint buffer)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsEnabledNULL(GLenum cap)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsEnablediNULL(GLenum target, GLuint index)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsFenceNVNULL(GLuint fence)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsFramebufferNULL(GLuint framebuffer)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsMemoryObjectEXTNULL(GLuint memoryObject)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsPathNVNULL(GLuint path)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsProgramNULL(GLuint program)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsProgramPipelineNULL(GLuint pipeline)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsQueryNULL(GLuint id)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsRenderbufferNULL(GLuint renderbuffer)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsSamplerNULL(GLuint sampler)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsSemaphoreEXTNULL(GLuint semaphore)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsShaderNULL(GLuint shader)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsSyncNULL(GLsync sync)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsTextureNULL(GLuint texture)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsTransformFeedbackNULL(GLuint id)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glIsVertexArrayNULL(GLuint array)
{
    return static_cast<GLboolean>(0);
}

void INTERNAL_GL_APIENTRY glLineWidthNULL(GLfloat width) {}

void INTERNAL_GL_APIENTRY glLinkProgramNULL(GLuint program) {}

void INTERNAL_GL_APIENTRY glLogicOpNULL(GLenum opcode) {}

void *INTERNAL_GL_APIENTRY glMapBufferNULL(GLenum target, GLenum access)
{
    return static_cast<void *>(0);
}

void *INTERNAL_GL_APIENTRY glMapBufferRangeNULL(GLenum target,
                                                GLintptr offset,
                                                GLsizeiptr length,
                                                GLbitfield access)
{
    return static_cast<void *>(0);
}

void *INTERNAL_GL_APIENTRY glMapNamedBufferNULL(GLuint buffer, GLenum access)
{
    return static_cast<void *>(0);
}

void *INTERNAL_GL_APIENTRY glMapNamedBufferRangeNULL(GLuint buffer,
                                                     GLintptr offset,
                                                     GLsizeiptr length,
                                                     GLbitfield access)
{
    return static_cast<void *>(0);
}

void INTERNAL_GL_APIENTRY glMatrixLoadfEXTNULL(GLenum mode, const GLfloat *m) {}

void INTERNAL_GL_APIENTRY glMaxShaderCompilerThreadsARBNULL(GLuint count) {}

void INTERNAL_GL_APIENTRY glMaxShaderCompilerThreadsKHRNULL(GLuint count) {}

void INTERNAL_GL_APIENTRY glMemoryBarrierNULL(GLbitfield barriers) {}

void INTERNAL_GL_APIENTRY glMemoryBarrierByRegionNULL(GLbitfield barriers) {}

void INTERNAL_GL_APIENTRY glMemoryObjectParameterivEXTNULL(GLuint memoryObject,
                                                           GLenum pname,
                                                           const GLint *params)
{}

void INTERNAL_GL_APIENTRY glMinSampleShadingNULL(GLfloat value) {}

void INTERNAL_GL_APIENTRY glMultiDrawArraysNULL(GLenum mode,
                                                const GLint *first,
                                                const GLsizei *count,
                                                GLsizei drawcount)
{}

void INTERNAL_GL_APIENTRY glMultiDrawArraysIndirectNULL(GLenum mode,
                                                        const void *indirect,
                                                        GLsizei drawcount,
                                                        GLsizei stride)
{}

void INTERNAL_GL_APIENTRY glMultiDrawElementsNULL(GLenum mode,
                                                  const GLsizei *count,
                                                  GLenum type,
                                                  const void *const *indices,
                                                  GLsizei drawcount)
{}

void INTERNAL_GL_APIENTRY glMultiDrawElementsBaseVertexNULL(GLenum mode,
                                                            const GLsizei *count,
                                                            GLenum type,
                                                            const void *const *indices,
                                                            GLsizei drawcount,
                                                            const GLint *basevertex)
{}

void INTERNAL_GL_APIENTRY glMultiDrawElementsIndirectNULL(GLenum mode,
                                                          GLenum type,
                                                          const void *indirect,
                                                          GLsizei drawcount,
                                                          GLsizei stride)
{}

void INTERNAL_GL_APIENTRY glNamedBufferDataNULL(GLuint buffer,
                                                GLsizeiptr size,
                                                const void *data,
                                                GLenum usage)
{}

void INTERNAL_GL_APIENTRY glNamedBufferStorageNULL(GLuint buffer,
                                                   GLsizeiptr size,
                                                   const void *data,
                                                   GLbitfield flags)
{}

void INTERNAL_GL_APIENTRY glNamedBufferStorageMemEXTNULL(GLuint buffer,
                                                         GLsizeiptr size,
                                                         GLuint memory,
                                                         GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glNamedBufferSubDataNULL(GLuint buffer,
                                                   GLintptr offset,
                                                   GLsizeiptr size,
                                                   const void *data)
{}

void INTERNAL_GL_APIENTRY glNamedFramebufferDrawBufferNULL(GLuint framebuffer, GLenum buf) {}

void INTERNAL_GL_APIENTRY glNamedFramebufferDrawBuffersNULL(GLuint framebuffer,
                                                            GLsizei n,
                                                            const GLenum *bufs)
{}

void INTERNAL_GL_APIENTRY glNamedFramebufferParameteriNULL(GLuint framebuffer,
                                                           GLenum pname,
                                                           GLint param)
{}

void INTERNAL_GL_APIENTRY glNamedFramebufferReadBufferNULL(GLuint framebuffer, GLenum src) {}

void INTERNAL_GL_APIENTRY glNamedFramebufferRenderbufferNULL(GLuint framebuffer,
                                                             GLenum attachment,
                                                             GLenum renderbuffertarget,
                                                             GLuint renderbuffer)
{}

void INTERNAL_GL_APIENTRY glNamedFramebufferTextureNULL(GLuint framebuffer,
                                                        GLenum attachment,
                                                        GLuint texture,
                                                        GLint level)
{}

void INTERNAL_GL_APIENTRY glNamedFramebufferTextureLayerNULL(GLuint framebuffer,
                                                             GLenum attachment,
                                                             GLuint texture,
                                                             GLint level,
                                                             GLint layer)
{}

void INTERNAL_GL_APIENTRY glNamedRenderbufferStorageNULL(GLuint renderbuffer,
                                                         GLenum internalformat,
                                                         GLsizei width,
                                                         GLsizei height)
{}

void INTERNAL_GL_APIENTRY glNamedRenderbufferStorageMultisampleNULL(GLuint renderbuffer,
                                                                    GLsizei samples,
                                                                    GLenum internalformat,
                                                                    GLsizei width,
                                                                    GLsizei height)
{}

void INTERNAL_GL_APIENTRY glObjectLabelNULL(GLenum identifier,
                                            GLuint name,
                                            GLsizei length,
                                            const GLchar *label)
{}

void INTERNAL_GL_APIENTRY glObjectPtrLabelNULL(const void *ptr, GLsizei length, const GLchar *label)
{}

void INTERNAL_GL_APIENTRY glPatchParameterfvNULL(GLenum pname, const GLfloat *values) {}

void INTERNAL_GL_APIENTRY glPatchParameteriNULL(GLenum pname, GLint value) {}

void INTERNAL_GL_APIENTRY glPathCommandsNVNULL(GLuint path,
                                               GLsizei numCommands,
                                               const GLubyte *commands,
                                               GLsizei numCoords,
                                               GLenum coordType,
                                               const void *coords)
{}

void INTERNAL_GL_APIENTRY glPathParameterfNVNULL(GLuint path, GLenum pname, GLfloat value) {}

void INTERNAL_GL_APIENTRY glPathParameteriNVNULL(GLuint path, GLenum pname, GLint value) {}

void INTERNAL_GL_APIENTRY glPathStencilFuncNVNULL(GLenum func, GLint ref, GLuint mask) {}

void INTERNAL_GL_APIENTRY glPauseTransformFeedbackNULL() {}

void INTERNAL_GL_APIENTRY glPixelStorefNULL(GLenum pname, GLfloat param) {}

void INTERNAL_GL_APIENTRY glPixelStoreiNULL(GLenum pname, GLint param) {}

void INTERNAL_GL_APIENTRY glPointParameterfNULL(GLenum pname, GLfloat param) {}

void INTERNAL_GL_APIENTRY glPointParameterfvNULL(GLenum pname, const GLfloat *params) {}

void INTERNAL_GL_APIENTRY glPointParameteriNULL(GLenum pname, GLint param) {}

void INTERNAL_GL_APIENTRY glPointParameterivNULL(GLenum pname, const GLint *params) {}

void INTERNAL_GL_APIENTRY glPointSizeNULL(GLfloat size) {}

void INTERNAL_GL_APIENTRY glPolygonModeNULL(GLenum face, GLenum mode) {}

void INTERNAL_GL_APIENTRY glPolygonOffsetNULL(GLfloat factor, GLfloat units) {}

void INTERNAL_GL_APIENTRY glPopDebugGroupNULL() {}

void INTERNAL_GL_APIENTRY glPopGroupMarkerEXTNULL() {}

void INTERNAL_GL_APIENTRY glPrimitiveBoundingBoxNULL(GLfloat minX,
                                                     GLfloat minY,
                                                     GLfloat minZ,
                                                     GLfloat minW,
                                                     GLfloat maxX,
                                                     GLfloat maxY,
                                                     GLfloat maxZ,
                                                     GLfloat maxW)
{}

void INTERNAL_GL_APIENTRY glPrimitiveRestartIndexNULL(GLuint index) {}

void INTERNAL_GL_APIENTRY glProgramBinaryNULL(GLuint program,
                                              GLenum binaryFormat,
                                              const void *binary,
                                              GLsizei length)
{}

void INTERNAL_GL_APIENTRY glProgramParameteriNULL(GLuint program, GLenum pname, GLint value) {}

void INTERNAL_GL_APIENTRY glProgramPathFragmentInputGenNVNULL(GLuint program,
                                                              GLint location,
                                                              GLenum genMode,
                                                              GLint components,
                                                              const GLfloat *coeffs)
{}

void INTERNAL_GL_APIENTRY glProgramUniform1dNULL(GLuint program, GLint location, GLdouble v0) {}

void INTERNAL_GL_APIENTRY glProgramUniform1dvNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform1fNULL(GLuint program, GLint location, GLfloat v0) {}

void INTERNAL_GL_APIENTRY glProgramUniform1fvNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform1iNULL(GLuint program, GLint location, GLint v0) {}

void INTERNAL_GL_APIENTRY glProgramUniform1ivNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLint *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform1uiNULL(GLuint program, GLint location, GLuint v0) {}

void INTERNAL_GL_APIENTRY glProgramUniform1uivNULL(GLuint program,
                                                   GLint location,
                                                   GLsizei count,
                                                   const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform2dNULL(GLuint program,
                                                 GLint location,
                                                 GLdouble v0,
                                                 GLdouble v1)
{}

void INTERNAL_GL_APIENTRY glProgramUniform2dvNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform2fNULL(GLuint program,
                                                 GLint location,
                                                 GLfloat v0,
                                                 GLfloat v1)
{}

void INTERNAL_GL_APIENTRY glProgramUniform2fvNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform2iNULL(GLuint program, GLint location, GLint v0, GLint v1)
{}

void INTERNAL_GL_APIENTRY glProgramUniform2ivNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLint *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform2uiNULL(GLuint program,
                                                  GLint location,
                                                  GLuint v0,
                                                  GLuint v1)
{}

void INTERNAL_GL_APIENTRY glProgramUniform2uivNULL(GLuint program,
                                                   GLint location,
                                                   GLsizei count,
                                                   const GLuint *value)
{}

void INTERNAL_GL_APIENTRY
glProgramUniform3dNULL(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
{}

void INTERNAL_GL_APIENTRY glProgramUniform3dvNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY
glProgramUniform3fNULL(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
{}

void INTERNAL_GL_APIENTRY glProgramUniform3fvNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY
glProgramUniform3iNULL(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
{}

void INTERNAL_GL_APIENTRY glProgramUniform3ivNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLint *value)
{}

void INTERNAL_GL_APIENTRY
glProgramUniform3uiNULL(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
{}

void INTERNAL_GL_APIENTRY glProgramUniform3uivNULL(GLuint program,
                                                   GLint location,
                                                   GLsizei count,
                                                   const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform4dNULL(GLuint program,
                                                 GLint location,
                                                 GLdouble v0,
                                                 GLdouble v1,
                                                 GLdouble v2,
                                                 GLdouble v3)
{}

void INTERNAL_GL_APIENTRY glProgramUniform4dvNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniform4fNULL(GLuint program,
                                                 GLint location,
                                                 GLfloat v0,
                                                 GLfloat v1,
                                                 GLfloat v2,
                                                 GLfloat v3)
{}

void INTERNAL_GL_APIENTRY glProgramUniform4fvNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY
glProgramUniform4iNULL(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
{}

void INTERNAL_GL_APIENTRY glProgramUniform4ivNULL(GLuint program,
                                                  GLint location,
                                                  GLsizei count,
                                                  const GLint *value)
{}

void INTERNAL_GL_APIENTRY
glProgramUniform4uiNULL(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
{}

void INTERNAL_GL_APIENTRY glProgramUniform4uivNULL(GLuint program,
                                                   GLint location,
                                                   GLsizei count,
                                                   const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix2dvNULL(GLuint program,
                                                        GLint location,
                                                        GLsizei count,
                                                        GLboolean transpose,
                                                        const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix2fvNULL(GLuint program,
                                                        GLint location,
                                                        GLsizei count,
                                                        GLboolean transpose,
                                                        const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix2x3dvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix2x3fvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix2x4dvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix2x4fvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix3dvNULL(GLuint program,
                                                        GLint location,
                                                        GLsizei count,
                                                        GLboolean transpose,
                                                        const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix3fvNULL(GLuint program,
                                                        GLint location,
                                                        GLsizei count,
                                                        GLboolean transpose,
                                                        const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix3x2dvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix3x2fvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix3x4dvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix3x4fvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix4dvNULL(GLuint program,
                                                        GLint location,
                                                        GLsizei count,
                                                        GLboolean transpose,
                                                        const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix4fvNULL(GLuint program,
                                                        GLint location,
                                                        GLsizei count,
                                                        GLboolean transpose,
                                                        const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix4x2dvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix4x2fvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix4x3dvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glProgramUniformMatrix4x3fvNULL(GLuint program,
                                                          GLint location,
                                                          GLsizei count,
                                                          GLboolean transpose,
                                                          const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glProvokingVertexNULL(GLenum mode) {}

void INTERNAL_GL_APIENTRY glPushDebugGroupNULL(GLenum source,
                                               GLuint id,
                                               GLsizei length,
                                               const GLchar *message)
{}

void INTERNAL_GL_APIENTRY glPushGroupMarkerEXTNULL(GLsizei length, const GLchar *marker) {}

void INTERNAL_GL_APIENTRY glQueryCounterNULL(GLuint id, GLenum target) {}

void INTERNAL_GL_APIENTRY glReadBufferNULL(GLenum src) {}

void INTERNAL_GL_APIENTRY glReadPixelsNULL(GLint x,
                                           GLint y,
                                           GLsizei width,
                                           GLsizei height,
                                           GLenum format,
                                           GLenum type,
                                           void *pixels)
{}

void INTERNAL_GL_APIENTRY glReadnPixelsNULL(GLint x,
                                            GLint y,
                                            GLsizei width,
                                            GLsizei height,
                                            GLenum format,
                                            GLenum type,
                                            GLsizei bufSize,
                                            void *data)
{}

void INTERNAL_GL_APIENTRY glReleaseShaderCompilerNULL() {}

void INTERNAL_GL_APIENTRY glRenderbufferStorageNULL(GLenum target,
                                                    GLenum internalformat,
                                                    GLsizei width,
                                                    GLsizei height)
{}

void INTERNAL_GL_APIENTRY glRenderbufferStorageMultisampleNULL(GLenum target,
                                                               GLsizei samples,
                                                               GLenum internalformat,
                                                               GLsizei width,
                                                               GLsizei height)
{}

void INTERNAL_GL_APIENTRY glResumeTransformFeedbackNULL() {}

void INTERNAL_GL_APIENTRY glSampleCoverageNULL(GLfloat value, GLboolean invert) {}

void INTERNAL_GL_APIENTRY glSampleMaskiNULL(GLuint maskNumber, GLbitfield mask) {}

void INTERNAL_GL_APIENTRY glSamplerParameterIivNULL(GLuint sampler,
                                                    GLenum pname,
                                                    const GLint *param)
{}

void INTERNAL_GL_APIENTRY glSamplerParameterIuivNULL(GLuint sampler,
                                                     GLenum pname,
                                                     const GLuint *param)
{}

void INTERNAL_GL_APIENTRY glSamplerParameterfNULL(GLuint sampler, GLenum pname, GLfloat param) {}

void INTERNAL_GL_APIENTRY glSamplerParameterfvNULL(GLuint sampler,
                                                   GLenum pname,
                                                   const GLfloat *param)
{}

void INTERNAL_GL_APIENTRY glSamplerParameteriNULL(GLuint sampler, GLenum pname, GLint param) {}

void INTERNAL_GL_APIENTRY glSamplerParameterivNULL(GLuint sampler, GLenum pname, const GLint *param)
{}

void INTERNAL_GL_APIENTRY glScissorNULL(GLint x, GLint y, GLsizei width, GLsizei height) {}

void INTERNAL_GL_APIENTRY glScissorArrayvNULL(GLuint first, GLsizei count, const GLint *v) {}

void INTERNAL_GL_APIENTRY
glScissorIndexedNULL(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
{}

void INTERNAL_GL_APIENTRY glScissorIndexedvNULL(GLuint index, const GLint *v) {}

void INTERNAL_GL_APIENTRY glSemaphoreParameterui64vEXTNULL(GLuint semaphore,
                                                           GLenum pname,
                                                           const GLuint64 *params)
{}

void INTERNAL_GL_APIENTRY glSetFenceNVNULL(GLuint fence, GLenum condition) {}

void INTERNAL_GL_APIENTRY glShaderBinaryNULL(GLsizei count,
                                             const GLuint *shaders,
                                             GLenum binaryformat,
                                             const void *binary,
                                             GLsizei length)
{}

void INTERNAL_GL_APIENTRY glShaderSourceNULL(GLuint shader,
                                             GLsizei count,
                                             const GLchar *const *string,
                                             const GLint *length)
{}

void INTERNAL_GL_APIENTRY glShaderStorageBlockBindingNULL(GLuint program,
                                                          GLuint storageBlockIndex,
                                                          GLuint storageBlockBinding)
{}

void INTERNAL_GL_APIENTRY glSignalSemaphoreEXTNULL(GLuint semaphore,
                                                   GLuint numBufferBarriers,
                                                   const GLuint *buffers,
                                                   GLuint numTextureBarriers,
                                                   const GLuint *textures,
                                                   const GLenum *dstLayouts)
{}

void INTERNAL_GL_APIENTRY glStencilFillPathInstancedNVNULL(GLsizei numPaths,
                                                           GLenum pathNameType,
                                                           const void *paths,
                                                           GLuint pathBase,
                                                           GLenum fillMode,
                                                           GLuint mask,
                                                           GLenum transformType,
                                                           const GLfloat *transformValues)
{}

void INTERNAL_GL_APIENTRY glStencilFillPathNVNULL(GLuint path, GLenum fillMode, GLuint mask) {}

void INTERNAL_GL_APIENTRY glStencilFuncNULL(GLenum func, GLint ref, GLuint mask) {}

void INTERNAL_GL_APIENTRY glStencilFuncSeparateNULL(GLenum face,
                                                    GLenum func,
                                                    GLint ref,
                                                    GLuint mask)
{}

void INTERNAL_GL_APIENTRY glStencilMaskNULL(GLuint mask) {}

void INTERNAL_GL_APIENTRY glStencilMaskSeparateNULL(GLenum face, GLuint mask) {}

void INTERNAL_GL_APIENTRY glStencilOpNULL(GLenum fail, GLenum zfail, GLenum zpass) {}

void INTERNAL_GL_APIENTRY glStencilOpSeparateNULL(GLenum face,
                                                  GLenum sfail,
                                                  GLenum dpfail,
                                                  GLenum dppass)
{}

void INTERNAL_GL_APIENTRY glStencilStrokePathInstancedNVNULL(GLsizei numPaths,
                                                             GLenum pathNameType,
                                                             const void *paths,
                                                             GLuint pathBase,
                                                             GLint reference,
                                                             GLuint mask,
                                                             GLenum transformType,
                                                             const GLfloat *transformValues)
{}

void INTERNAL_GL_APIENTRY glStencilStrokePathNVNULL(GLuint path, GLint reference, GLuint mask) {}

void INTERNAL_GL_APIENTRY glStencilThenCoverFillPathInstancedNVNULL(GLsizei numPaths,
                                                                    GLenum pathNameType,
                                                                    const void *paths,
                                                                    GLuint pathBase,
                                                                    GLenum fillMode,
                                                                    GLuint mask,
                                                                    GLenum coverMode,
                                                                    GLenum transformType,
                                                                    const GLfloat *transformValues)
{}

void INTERNAL_GL_APIENTRY glStencilThenCoverFillPathNVNULL(GLuint path,
                                                           GLenum fillMode,
                                                           GLuint mask,
                                                           GLenum coverMode)
{}

void INTERNAL_GL_APIENTRY
glStencilThenCoverStrokePathInstancedNVNULL(GLsizei numPaths,
                                            GLenum pathNameType,
                                            const void *paths,
                                            GLuint pathBase,
                                            GLint reference,
                                            GLuint mask,
                                            GLenum coverMode,
                                            GLenum transformType,
                                            const GLfloat *transformValues)
{}

void INTERNAL_GL_APIENTRY glStencilThenCoverStrokePathNVNULL(GLuint path,
                                                             GLint reference,
                                                             GLuint mask,
                                                             GLenum coverMode)
{}

GLboolean INTERNAL_GL_APIENTRY glTestFenceNVNULL(GLuint fence)
{
    return static_cast<GLboolean>(0);
}

void INTERNAL_GL_APIENTRY glTexBufferNULL(GLenum target, GLenum internalformat, GLuint buffer) {}

void INTERNAL_GL_APIENTRY glTexBufferRangeNULL(GLenum target,
                                               GLenum internalformat,
                                               GLuint buffer,
                                               GLintptr offset,
                                               GLsizeiptr size)
{}

void INTERNAL_GL_APIENTRY glTexImage1DNULL(GLenum target,
                                           GLint level,
                                           GLint internalformat,
                                           GLsizei width,
                                           GLint border,
                                           GLenum format,
                                           GLenum type,
                                           const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTexImage2DNULL(GLenum target,
                                           GLint level,
                                           GLint internalformat,
                                           GLsizei width,
                                           GLsizei height,
                                           GLint border,
                                           GLenum format,
                                           GLenum type,
                                           const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTexImage2DMultisampleNULL(GLenum target,
                                                      GLsizei samples,
                                                      GLenum internalformat,
                                                      GLsizei width,
                                                      GLsizei height,
                                                      GLboolean fixedsamplelocations)
{}

void INTERNAL_GL_APIENTRY glTexImage3DNULL(GLenum target,
                                           GLint level,
                                           GLint internalformat,
                                           GLsizei width,
                                           GLsizei height,
                                           GLsizei depth,
                                           GLint border,
                                           GLenum format,
                                           GLenum type,
                                           const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTexImage3DMultisampleNULL(GLenum target,
                                                      GLsizei samples,
                                                      GLenum internalformat,
                                                      GLsizei width,
                                                      GLsizei height,
                                                      GLsizei depth,
                                                      GLboolean fixedsamplelocations)
{}

void INTERNAL_GL_APIENTRY glTexParameterIivNULL(GLenum target, GLenum pname, const GLint *params) {}

void INTERNAL_GL_APIENTRY glTexParameterIuivNULL(GLenum target, GLenum pname, const GLuint *params)
{}

void INTERNAL_GL_APIENTRY glTexParameterfNULL(GLenum target, GLenum pname, GLfloat param) {}

void INTERNAL_GL_APIENTRY glTexParameterfvNULL(GLenum target, GLenum pname, const GLfloat *params)
{}

void INTERNAL_GL_APIENTRY glTexParameteriNULL(GLenum target, GLenum pname, GLint param) {}

void INTERNAL_GL_APIENTRY glTexParameterivNULL(GLenum target, GLenum pname, const GLint *params) {}

void INTERNAL_GL_APIENTRY glTexStorage1DNULL(GLenum target,
                                             GLsizei levels,
                                             GLenum internalformat,
                                             GLsizei width)
{}

void INTERNAL_GL_APIENTRY glTexStorage2DNULL(GLenum target,
                                             GLsizei levels,
                                             GLenum internalformat,
                                             GLsizei width,
                                             GLsizei height)
{}

void INTERNAL_GL_APIENTRY glTexStorage2DMultisampleNULL(GLenum target,
                                                        GLsizei samples,
                                                        GLenum internalformat,
                                                        GLsizei width,
                                                        GLsizei height,
                                                        GLboolean fixedsamplelocations)
{}

void INTERNAL_GL_APIENTRY glTexStorage3DNULL(GLenum target,
                                             GLsizei levels,
                                             GLenum internalformat,
                                             GLsizei width,
                                             GLsizei height,
                                             GLsizei depth)
{}

void INTERNAL_GL_APIENTRY glTexStorage3DMultisampleNULL(GLenum target,
                                                        GLsizei samples,
                                                        GLenum internalformat,
                                                        GLsizei width,
                                                        GLsizei height,
                                                        GLsizei depth,
                                                        GLboolean fixedsamplelocations)
{}

void INTERNAL_GL_APIENTRY glTexStorageMem2DEXTNULL(GLenum target,
                                                   GLsizei levels,
                                                   GLenum internalFormat,
                                                   GLsizei width,
                                                   GLsizei height,
                                                   GLuint memory,
                                                   GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glTexStorageMem2DMultisampleEXTNULL(GLenum target,
                                                              GLsizei samples,
                                                              GLenum internalFormat,
                                                              GLsizei width,
                                                              GLsizei height,
                                                              GLboolean fixedSampleLocations,
                                                              GLuint memory,
                                                              GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glTexStorageMem3DEXTNULL(GLenum target,
                                                   GLsizei levels,
                                                   GLenum internalFormat,
                                                   GLsizei width,
                                                   GLsizei height,
                                                   GLsizei depth,
                                                   GLuint memory,
                                                   GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glTexStorageMem3DMultisampleEXTNULL(GLenum target,
                                                              GLsizei samples,
                                                              GLenum internalFormat,
                                                              GLsizei width,
                                                              GLsizei height,
                                                              GLsizei depth,
                                                              GLboolean fixedSampleLocations,
                                                              GLuint memory,
                                                              GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glTexSubImage1DNULL(GLenum target,
                                              GLint level,
                                              GLint xoffset,
                                              GLsizei width,
                                              GLenum format,
                                              GLenum type,
                                              const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTexSubImage2DNULL(GLenum target,
                                              GLint level,
                                              GLint xoffset,
                                              GLint yoffset,
                                              GLsizei width,
                                              GLsizei height,
                                              GLenum format,
                                              GLenum type,
                                              const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTexSubImage3DNULL(GLenum target,
                                              GLint level,
                                              GLint xoffset,
                                              GLint yoffset,
                                              GLint zoffset,
                                              GLsizei width,
                                              GLsizei height,
                                              GLsizei depth,
                                              GLenum format,
                                              GLenum type,
                                              const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTextureBarrierNULL() {}

void INTERNAL_GL_APIENTRY glTextureBufferNULL(GLuint texture, GLenum internalformat, GLuint buffer)
{}

void INTERNAL_GL_APIENTRY glTextureBufferRangeNULL(GLuint texture,
                                                   GLenum internalformat,
                                                   GLuint buffer,
                                                   GLintptr offset,
                                                   GLsizeiptr size)
{}

void INTERNAL_GL_APIENTRY glTextureParameterIivNULL(GLuint texture,
                                                    GLenum pname,
                                                    const GLint *params)
{}

void INTERNAL_GL_APIENTRY glTextureParameterIuivNULL(GLuint texture,
                                                     GLenum pname,
                                                     const GLuint *params)
{}

void INTERNAL_GL_APIENTRY glTextureParameterfNULL(GLuint texture, GLenum pname, GLfloat param) {}

void INTERNAL_GL_APIENTRY glTextureParameterfvNULL(GLuint texture,
                                                   GLenum pname,
                                                   const GLfloat *param)
{}

void INTERNAL_GL_APIENTRY glTextureParameteriNULL(GLuint texture, GLenum pname, GLint param) {}

void INTERNAL_GL_APIENTRY glTextureParameterivNULL(GLuint texture, GLenum pname, const GLint *param)
{}

void INTERNAL_GL_APIENTRY glTextureStorage1DNULL(GLuint texture,
                                                 GLsizei levels,
                                                 GLenum internalformat,
                                                 GLsizei width)
{}

void INTERNAL_GL_APIENTRY glTextureStorage2DNULL(GLuint texture,
                                                 GLsizei levels,
                                                 GLenum internalformat,
                                                 GLsizei width,
                                                 GLsizei height)
{}

void INTERNAL_GL_APIENTRY glTextureStorage2DMultisampleNULL(GLuint texture,
                                                            GLsizei samples,
                                                            GLenum internalformat,
                                                            GLsizei width,
                                                            GLsizei height,
                                                            GLboolean fixedsamplelocations)
{}

void INTERNAL_GL_APIENTRY glTextureStorage3DNULL(GLuint texture,
                                                 GLsizei levels,
                                                 GLenum internalformat,
                                                 GLsizei width,
                                                 GLsizei height,
                                                 GLsizei depth)
{}

void INTERNAL_GL_APIENTRY glTextureStorage3DMultisampleNULL(GLuint texture,
                                                            GLsizei samples,
                                                            GLenum internalformat,
                                                            GLsizei width,
                                                            GLsizei height,
                                                            GLsizei depth,
                                                            GLboolean fixedsamplelocations)
{}

void INTERNAL_GL_APIENTRY glTextureStorageMem2DEXTNULL(GLuint texture,
                                                       GLsizei levels,
                                                       GLenum internalFormat,
                                                       GLsizei width,
                                                       GLsizei height,
                                                       GLuint memory,
                                                       GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glTextureStorageMem2DMultisampleEXTNULL(GLuint texture,
                                                                  GLsizei samples,
                                                                  GLenum internalFormat,
                                                                  GLsizei width,
                                                                  GLsizei height,
                                                                  GLboolean fixedSampleLocations,
                                                                  GLuint memory,
                                                                  GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glTextureStorageMem3DEXTNULL(GLuint texture,
                                                       GLsizei levels,
                                                       GLenum internalFormat,
                                                       GLsizei width,
                                                       GLsizei height,
                                                       GLsizei depth,
                                                       GLuint memory,
                                                       GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glTextureStorageMem3DMultisampleEXTNULL(GLuint texture,
                                                                  GLsizei samples,
                                                                  GLenum internalFormat,
                                                                  GLsizei width,
                                                                  GLsizei height,
                                                                  GLsizei depth,
                                                                  GLboolean fixedSampleLocations,
                                                                  GLuint memory,
                                                                  GLuint64 offset)
{}

void INTERNAL_GL_APIENTRY glTextureSubImage1DNULL(GLuint texture,
                                                  GLint level,
                                                  GLint xoffset,
                                                  GLsizei width,
                                                  GLenum format,
                                                  GLenum type,
                                                  const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTextureSubImage2DNULL(GLuint texture,
                                                  GLint level,
                                                  GLint xoffset,
                                                  GLint yoffset,
                                                  GLsizei width,
                                                  GLsizei height,
                                                  GLenum format,
                                                  GLenum type,
                                                  const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTextureSubImage3DNULL(GLuint texture,
                                                  GLint level,
                                                  GLint xoffset,
                                                  GLint yoffset,
                                                  GLint zoffset,
                                                  GLsizei width,
                                                  GLsizei height,
                                                  GLsizei depth,
                                                  GLenum format,
                                                  GLenum type,
                                                  const void *pixels)
{}

void INTERNAL_GL_APIENTRY glTextureViewNULL(GLuint texture,
                                            GLenum target,
                                            GLuint origtexture,
                                            GLenum internalformat,
                                            GLuint minlevel,
                                            GLuint numlevels,
                                            GLuint minlayer,
                                            GLuint numlayers)
{}

void INTERNAL_GL_APIENTRY glTransformFeedbackBufferBaseNULL(GLuint xfb, GLuint index, GLuint buffer)
{}

void INTERNAL_GL_APIENTRY glTransformFeedbackBufferRangeNULL(GLuint xfb,
                                                             GLuint index,
                                                             GLuint buffer,
                                                             GLintptr offset,
                                                             GLsizeiptr size)
{}

void INTERNAL_GL_APIENTRY glTransformFeedbackVaryingsNULL(GLuint program,
                                                          GLsizei count,
                                                          const GLchar *const *varyings,
                                                          GLenum bufferMode)
{}

void INTERNAL_GL_APIENTRY glUniform1dNULL(GLint location, GLdouble x) {}

void INTERNAL_GL_APIENTRY glUniform1dvNULL(GLint location, GLsizei count, const GLdouble *value) {}

void INTERNAL_GL_APIENTRY glUniform1fNULL(GLint location, GLfloat v0) {}

void INTERNAL_GL_APIENTRY glUniform1fvNULL(GLint location, GLsizei count, const GLfloat *value) {}

void INTERNAL_GL_APIENTRY glUniform1iNULL(GLint location, GLint v0) {}

void INTERNAL_GL_APIENTRY glUniform1ivNULL(GLint location, GLsizei count, const GLint *value) {}

void INTERNAL_GL_APIENTRY glUniform1uiNULL(GLint location, GLuint v0) {}

void INTERNAL_GL_APIENTRY glUniform1uivNULL(GLint location, GLsizei count, const GLuint *value) {}

void INTERNAL_GL_APIENTRY glUniform2dNULL(GLint location, GLdouble x, GLdouble y) {}

void INTERNAL_GL_APIENTRY glUniform2dvNULL(GLint location, GLsizei count, const GLdouble *value) {}

void INTERNAL_GL_APIENTRY glUniform2fNULL(GLint location, GLfloat v0, GLfloat v1) {}

void INTERNAL_GL_APIENTRY glUniform2fvNULL(GLint location, GLsizei count, const GLfloat *value) {}

void INTERNAL_GL_APIENTRY glUniform2iNULL(GLint location, GLint v0, GLint v1) {}

void INTERNAL_GL_APIENTRY glUniform2ivNULL(GLint location, GLsizei count, const GLint *value) {}

void INTERNAL_GL_APIENTRY glUniform2uiNULL(GLint location, GLuint v0, GLuint v1) {}

void INTERNAL_GL_APIENTRY glUniform2uivNULL(GLint location, GLsizei count, const GLuint *value) {}

void INTERNAL_GL_APIENTRY glUniform3dNULL(GLint location, GLdouble x, GLdouble y, GLdouble z) {}

void INTERNAL_GL_APIENTRY glUniform3dvNULL(GLint location, GLsizei count, const GLdouble *value) {}

void INTERNAL_GL_APIENTRY glUniform3fNULL(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) {}

void INTERNAL_GL_APIENTRY glUniform3fvNULL(GLint location, GLsizei count, const GLfloat *value) {}

void INTERNAL_GL_APIENTRY glUniform3iNULL(GLint location, GLint v0, GLint v1, GLint v2) {}

void INTERNAL_GL_APIENTRY glUniform3ivNULL(GLint location, GLsizei count, const GLint *value) {}

void INTERNAL_GL_APIENTRY glUniform3uiNULL(GLint location, GLuint v0, GLuint v1, GLuint v2) {}

void INTERNAL_GL_APIENTRY glUniform3uivNULL(GLint location, GLsizei count, const GLuint *value) {}

void INTERNAL_GL_APIENTRY
glUniform4dNULL(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{}

void INTERNAL_GL_APIENTRY glUniform4dvNULL(GLint location, GLsizei count, const GLdouble *value) {}

void INTERNAL_GL_APIENTRY
glUniform4fNULL(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
{}

void INTERNAL_GL_APIENTRY glUniform4fvNULL(GLint location, GLsizei count, const GLfloat *value) {}

void INTERNAL_GL_APIENTRY glUniform4iNULL(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) {}

void INTERNAL_GL_APIENTRY glUniform4ivNULL(GLint location, GLsizei count, const GLint *value) {}

void INTERNAL_GL_APIENTRY
glUniform4uiNULL(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
{}

void INTERNAL_GL_APIENTRY glUniform4uivNULL(GLint location, GLsizei count, const GLuint *value) {}

void INTERNAL_GL_APIENTRY glUniformBlockBindingNULL(GLuint program,
                                                    GLuint uniformBlockIndex,
                                                    GLuint uniformBlockBinding)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix2dvNULL(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix2fvNULL(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix2x3dvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix2x3fvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix2x4dvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix2x4fvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix3dvNULL(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix3fvNULL(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix3x2dvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix3x2fvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix3x4dvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix3x4fvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix4dvNULL(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix4fvNULL(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix4x2dvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix4x2fvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix4x3dvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLdouble *value)
{}

void INTERNAL_GL_APIENTRY glUniformMatrix4x3fvNULL(GLint location,
                                                   GLsizei count,
                                                   GLboolean transpose,
                                                   const GLfloat *value)
{}

void INTERNAL_GL_APIENTRY glUniformSubroutinesuivNULL(GLenum shadertype,
                                                      GLsizei count,
                                                      const GLuint *indices)
{}

GLboolean INTERNAL_GL_APIENTRY glUnmapBufferNULL(GLenum target)
{
    return static_cast<GLboolean>(0);
}

GLboolean INTERNAL_GL_APIENTRY glUnmapNamedBufferNULL(GLuint buffer)
{
    return static_cast<GLboolean>(0);
}

void INTERNAL_GL_APIENTRY glUseProgramNULL(GLuint program) {}

void INTERNAL_GL_APIENTRY glUseProgramStagesNULL(GLuint pipeline, GLbitfield stages, GLuint program)
{}

void INTERNAL_GL_APIENTRY glValidateProgramNULL(GLuint program) {}

void INTERNAL_GL_APIENTRY glValidateProgramPipelineNULL(GLuint pipeline) {}

void INTERNAL_GL_APIENTRY glVertexArrayAttribBindingNULL(GLuint vaobj,
                                                         GLuint attribindex,
                                                         GLuint bindingindex)
{}

void INTERNAL_GL_APIENTRY glVertexArrayAttribFormatNULL(GLuint vaobj,
                                                        GLuint attribindex,
                                                        GLint size,
                                                        GLenum type,
                                                        GLboolean normalized,
                                                        GLuint relativeoffset)
{}

void INTERNAL_GL_APIENTRY glVertexArrayAttribIFormatNULL(GLuint vaobj,
                                                         GLuint attribindex,
                                                         GLint size,
                                                         GLenum type,
                                                         GLuint relativeoffset)
{}

void INTERNAL_GL_APIENTRY glVertexArrayAttribLFormatNULL(GLuint vaobj,
                                                         GLuint attribindex,
                                                         GLint size,
                                                         GLenum type,
                                                         GLuint relativeoffset)
{}

void INTERNAL_GL_APIENTRY glVertexArrayBindingDivisorNULL(GLuint vaobj,
                                                          GLuint bindingindex,
                                                          GLuint divisor)
{}

void INTERNAL_GL_APIENTRY glVertexArrayElementBufferNULL(GLuint vaobj, GLuint buffer) {}

void INTERNAL_GL_APIENTRY glVertexArrayVertexBufferNULL(GLuint vaobj,
                                                        GLuint bindingindex,
                                                        GLuint buffer,
                                                        GLintptr offset,
                                                        GLsizei stride)
{}

void INTERNAL_GL_APIENTRY glVertexArrayVertexBuffersNULL(GLuint vaobj,
                                                         GLuint first,
                                                         GLsizei count,
                                                         const GLuint *buffers,
                                                         const GLintptr *offsets,
                                                         const GLsizei *strides)
{}

void INTERNAL_GL_APIENTRY glVertexAttrib1dNULL(GLuint index, GLdouble x) {}

void INTERNAL_GL_APIENTRY glVertexAttrib1dvNULL(GLuint index, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib1fNULL(GLuint index, GLfloat x) {}

void INTERNAL_GL_APIENTRY glVertexAttrib1fvNULL(GLuint index, const GLfloat *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib1sNULL(GLuint index, GLshort x) {}

void INTERNAL_GL_APIENTRY glVertexAttrib1svNULL(GLuint index, const GLshort *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib2dNULL(GLuint index, GLdouble x, GLdouble y) {}

void INTERNAL_GL_APIENTRY glVertexAttrib2dvNULL(GLuint index, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib2fNULL(GLuint index, GLfloat x, GLfloat y) {}

void INTERNAL_GL_APIENTRY glVertexAttrib2fvNULL(GLuint index, const GLfloat *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib2sNULL(GLuint index, GLshort x, GLshort y) {}

void INTERNAL_GL_APIENTRY glVertexAttrib2svNULL(GLuint index, const GLshort *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib3dNULL(GLuint index, GLdouble x, GLdouble y, GLdouble z) {}

void INTERNAL_GL_APIENTRY glVertexAttrib3dvNULL(GLuint index, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib3fNULL(GLuint index, GLfloat x, GLfloat y, GLfloat z) {}

void INTERNAL_GL_APIENTRY glVertexAttrib3fvNULL(GLuint index, const GLfloat *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib3sNULL(GLuint index, GLshort x, GLshort y, GLshort z) {}

void INTERNAL_GL_APIENTRY glVertexAttrib3svNULL(GLuint index, const GLshort *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4NbvNULL(GLuint index, const GLbyte *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4NivNULL(GLuint index, const GLint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4NsvNULL(GLuint index, const GLshort *v) {}

void INTERNAL_GL_APIENTRY
glVertexAttrib4NubNULL(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
{}

void INTERNAL_GL_APIENTRY glVertexAttrib4NubvNULL(GLuint index, const GLubyte *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4NuivNULL(GLuint index, const GLuint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4NusvNULL(GLuint index, const GLushort *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4bvNULL(GLuint index, const GLbyte *v) {}

void INTERNAL_GL_APIENTRY
glVertexAttrib4dNULL(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{}

void INTERNAL_GL_APIENTRY glVertexAttrib4dvNULL(GLuint index, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY
glVertexAttrib4fNULL(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{}

void INTERNAL_GL_APIENTRY glVertexAttrib4fvNULL(GLuint index, const GLfloat *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4ivNULL(GLuint index, const GLint *v) {}

void INTERNAL_GL_APIENTRY
glVertexAttrib4sNULL(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
{}

void INTERNAL_GL_APIENTRY glVertexAttrib4svNULL(GLuint index, const GLshort *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4ubvNULL(GLuint index, const GLubyte *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4uivNULL(GLuint index, const GLuint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttrib4usvNULL(GLuint index, const GLushort *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribBindingNULL(GLuint attribindex, GLuint bindingindex) {}

void INTERNAL_GL_APIENTRY glVertexAttribDivisorNULL(GLuint index, GLuint divisor) {}

void INTERNAL_GL_APIENTRY glVertexAttribFormatNULL(GLuint attribindex,
                                                   GLint size,
                                                   GLenum type,
                                                   GLboolean normalized,
                                                   GLuint relativeoffset)
{}

void INTERNAL_GL_APIENTRY glVertexAttribI1iNULL(GLuint index, GLint x) {}

void INTERNAL_GL_APIENTRY glVertexAttribI1ivNULL(GLuint index, const GLint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI1uiNULL(GLuint index, GLuint x) {}

void INTERNAL_GL_APIENTRY glVertexAttribI1uivNULL(GLuint index, const GLuint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI2iNULL(GLuint index, GLint x, GLint y) {}

void INTERNAL_GL_APIENTRY glVertexAttribI2ivNULL(GLuint index, const GLint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI2uiNULL(GLuint index, GLuint x, GLuint y) {}

void INTERNAL_GL_APIENTRY glVertexAttribI2uivNULL(GLuint index, const GLuint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI3iNULL(GLuint index, GLint x, GLint y, GLint z) {}

void INTERNAL_GL_APIENTRY glVertexAttribI3ivNULL(GLuint index, const GLint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI3uiNULL(GLuint index, GLuint x, GLuint y, GLuint z) {}

void INTERNAL_GL_APIENTRY glVertexAttribI3uivNULL(GLuint index, const GLuint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI4bvNULL(GLuint index, const GLbyte *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI4iNULL(GLuint index, GLint x, GLint y, GLint z, GLint w) {}

void INTERNAL_GL_APIENTRY glVertexAttribI4ivNULL(GLuint index, const GLint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI4svNULL(GLuint index, const GLshort *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI4ubvNULL(GLuint index, const GLubyte *v) {}

void INTERNAL_GL_APIENTRY
glVertexAttribI4uiNULL(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
{}

void INTERNAL_GL_APIENTRY glVertexAttribI4uivNULL(GLuint index, const GLuint *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribI4usvNULL(GLuint index, const GLushort *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribIFormatNULL(GLuint attribindex,
                                                    GLint size,
                                                    GLenum type,
                                                    GLuint relativeoffset)
{}

void INTERNAL_GL_APIENTRY glVertexAttribIPointerNULL(GLuint index,
                                                     GLint size,
                                                     GLenum type,
                                                     GLsizei stride,
                                                     const void *pointer)
{}

void INTERNAL_GL_APIENTRY glVertexAttribL1dNULL(GLuint index, GLdouble x) {}

void INTERNAL_GL_APIENTRY glVertexAttribL1dvNULL(GLuint index, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribL2dNULL(GLuint index, GLdouble x, GLdouble y) {}

void INTERNAL_GL_APIENTRY glVertexAttribL2dvNULL(GLuint index, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribL3dNULL(GLuint index, GLdouble x, GLdouble y, GLdouble z) {}

void INTERNAL_GL_APIENTRY glVertexAttribL3dvNULL(GLuint index, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY
glVertexAttribL4dNULL(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{}

void INTERNAL_GL_APIENTRY glVertexAttribL4dvNULL(GLuint index, const GLdouble *v) {}

void INTERNAL_GL_APIENTRY glVertexAttribLFormatNULL(GLuint attribindex,
                                                    GLint size,
                                                    GLenum type,
                                                    GLuint relativeoffset)
{}

void INTERNAL_GL_APIENTRY glVertexAttribLPointerNULL(GLuint index,
                                                     GLint size,
                                                     GLenum type,
                                                     GLsizei stride,
                                                     const void *pointer)
{}

void INTERNAL_GL_APIENTRY glVertexAttribP1uiNULL(GLuint index,
                                                 GLenum type,
                                                 GLboolean normalized,
                                                 GLuint value)
{}

void INTERNAL_GL_APIENTRY glVertexAttribP1uivNULL(GLuint index,
                                                  GLenum type,
                                                  GLboolean normalized,
                                                  const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glVertexAttribP2uiNULL(GLuint index,
                                                 GLenum type,
                                                 GLboolean normalized,
                                                 GLuint value)
{}

void INTERNAL_GL_APIENTRY glVertexAttribP2uivNULL(GLuint index,
                                                  GLenum type,
                                                  GLboolean normalized,
                                                  const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glVertexAttribP3uiNULL(GLuint index,
                                                 GLenum type,
                                                 GLboolean normalized,
                                                 GLuint value)
{}

void INTERNAL_GL_APIENTRY glVertexAttribP3uivNULL(GLuint index,
                                                  GLenum type,
                                                  GLboolean normalized,
                                                  const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glVertexAttribP4uiNULL(GLuint index,
                                                 GLenum type,
                                                 GLboolean normalized,
                                                 GLuint value)
{}

void INTERNAL_GL_APIENTRY glVertexAttribP4uivNULL(GLuint index,
                                                  GLenum type,
                                                  GLboolean normalized,
                                                  const GLuint *value)
{}

void INTERNAL_GL_APIENTRY glVertexAttribPointerNULL(GLuint index,
                                                    GLint size,
                                                    GLenum type,
                                                    GLboolean normalized,
                                                    GLsizei stride,
                                                    const void *pointer)
{}

void INTERNAL_GL_APIENTRY glVertexBindingDivisorNULL(GLuint bindingindex, GLuint divisor) {}

void INTERNAL_GL_APIENTRY glViewportNULL(GLint x, GLint y, GLsizei width, GLsizei height) {}

void INTERNAL_GL_APIENTRY glViewportArrayvNULL(GLuint first, GLsizei count, const GLfloat *v) {}

void INTERNAL_GL_APIENTRY
glViewportIndexedfNULL(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
{}

void INTERNAL_GL_APIENTRY glViewportIndexedfvNULL(GLuint index, const GLfloat *v) {}

void INTERNAL_GL_APIENTRY glWaitSemaphoreEXTNULL(GLuint semaphore,
                                                 GLuint numBufferBarriers,
                                                 const GLuint *buffers,
                                                 GLuint numTextureBarriers,
                                                 const GLuint *textures,
                                                 const GLenum *srcLayouts)
{}

void INTERNAL_GL_APIENTRY glWaitSyncNULL(GLsync sync, GLbitfield flags, GLuint64 timeout) {}
}  // namespace rx
