// GENERATED FILE - DO NOT EDIT.
// Generated by generate_entry_points.py using data from 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.
//
// Context_gl.cpp: Implements the GL specific parts of Context.

#include "Context.h"
#include "common/debug.h"

namespace gl
{

void Context::compressedTexImage1D(GLenum target,
                                   GLint level,
                                   GLenum internalformat,
                                   GLsizei width,
                                   GLint border,
                                   GLsizei imageSize,
                                   const void *data)
{
    UNIMPLEMENTED();
}

void Context::compressedTexSubImage1D(GLenum target,
                                      GLint level,
                                      GLint xoffset,
                                      GLsizei width,
                                      GLenum format,
                                      GLsizei imageSize,
                                      const void *data)
{
    UNIMPLEMENTED();
}

void Context::getCompressedTexImage(GLenum target, GLint level, void *img)
{
    UNIMPLEMENTED();
}

void Context::loadTransposeMatrixd(const GLdouble *m)
{
    UNIMPLEMENTED();
}

void Context::loadTransposeMatrixf(const GLfloat *m)
{
    UNIMPLEMENTED();
}

void Context::multTransposeMatrixd(const GLdouble *m)
{
    UNIMPLEMENTED();
}

void Context::multTransposeMatrixf(const GLfloat *m)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord1d(GLenum target, GLdouble s)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord1dv(GLenum target, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord1f(GLenum target, GLfloat s)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord1fv(GLenum target, const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord1i(GLenum target, GLint s)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord1iv(GLenum target, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord1s(GLenum target, GLshort s)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord1sv(GLenum target, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord2dv(GLenum target, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord2fv(GLenum target, const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord2i(GLenum target, GLint s, GLint t)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord2iv(GLenum target, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord2s(GLenum target, GLshort s, GLshort t)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord2sv(GLenum target, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord3dv(GLenum target, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord3fv(GLenum target, const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord3iv(GLenum target, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord3sv(GLenum target, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord4dv(GLenum target, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord4fv(GLenum target, const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord4iv(GLenum target, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoord4sv(GLenum target, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::getVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib1d(GLuint index, GLdouble x)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib1dv(GLuint index, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib1s(GLuint index, GLshort x)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib1sv(GLuint index, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib2dv(GLuint index, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib2s(GLuint index, GLshort x, GLshort y)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib2sv(GLuint index, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib3dv(GLuint index, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib3sv(GLuint index, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4Nbv(GLuint index, const GLbyte *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4Niv(GLuint index, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4Nsv(GLuint index, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4Nubv(GLuint index, const GLubyte *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4Nuiv(GLuint index, const GLuint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4Nusv(GLuint index, const GLushort *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4bv(GLuint index, const GLbyte *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4dv(GLuint index, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4iv(GLuint index, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4sv(GLuint index, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4ubv(GLuint index, const GLubyte *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4uiv(GLuint index, const GLuint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttrib4usv(GLuint index, const GLushort *v)
{
    UNIMPLEMENTED();
}

void Context::beginConditionalRender(GLuint id, GLenum mode)
{
    UNIMPLEMENTED();
}

void Context::clampColor(GLenum target, GLenum clamp)
{
    UNIMPLEMENTED();
}

void Context::endConditionalRender()
{
    UNIMPLEMENTED();
}

void Context::framebufferTexture1D(GLenum target,
                                   GLenum attachment,
                                   TextureTarget textarget,
                                   TextureID texture,
                                   GLint level)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI1i(GLuint index, GLint x)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI1iv(GLuint index, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI1ui(GLuint index, GLuint x)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI1uiv(GLuint index, const GLuint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI2i(GLuint index, GLint x, GLint y)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI2iv(GLuint index, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI2ui(GLuint index, GLuint x, GLuint y)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI2uiv(GLuint index, const GLuint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI3iv(GLuint index, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI3uiv(GLuint index, const GLuint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI4bv(GLuint index, const GLbyte *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI4sv(GLuint index, const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI4ubv(GLuint index, const GLubyte *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribI4usv(GLuint index, const GLushort *v)
{
    UNIMPLEMENTED();
}

void Context::getActiveUniformName(ShaderProgramID program,
                                   GLuint uniformIndex,
                                   GLsizei bufSize,
                                   GLsizei *length,
                                   GLchar *uniformName)
{
    UNIMPLEMENTED();
}

void Context::primitiveRestartIndex(GLuint index)
{
    UNIMPLEMENTED();
}

void Context::fogCoordPointer(GLenum type, GLsizei stride, const void *pointer)
{
    UNIMPLEMENTED();
}

void Context::fogCoordd(GLdouble coord)
{
    UNIMPLEMENTED();
}

void Context::fogCoorddv(const GLdouble *coord)
{
    UNIMPLEMENTED();
}

void Context::fogCoordf(GLfloat coord)
{
    UNIMPLEMENTED();
}

void Context::fogCoordfv(const GLfloat *coord)
{
    UNIMPLEMENTED();
}

void Context::pointParameteri(GLenum pname, GLint param)
{
    UNIMPLEMENTED();
}

void Context::pointParameteriv(GLenum pname, const GLint *params)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3bv(const GLbyte *v)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3i(GLint red, GLint green, GLint blue)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3s(GLshort red, GLshort green, GLshort blue)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3ubv(const GLubyte *v)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3ui(GLuint red, GLuint green, GLuint blue)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3uiv(const GLuint *v)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3us(GLushort red, GLushort green, GLushort blue)
{
    UNIMPLEMENTED();
}

void Context::secondaryColor3usv(const GLushort *v)
{
    UNIMPLEMENTED();
}

void Context::secondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
{
    UNIMPLEMENTED();
}

void Context::windowPos2d(GLdouble x, GLdouble y)
{
    UNIMPLEMENTED();
}

void Context::windowPos2dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::windowPos2f(GLfloat x, GLfloat y)
{
    UNIMPLEMENTED();
}

void Context::windowPos2fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::windowPos2i(GLint x, GLint y)
{
    UNIMPLEMENTED();
}

void Context::windowPos2iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::windowPos2s(GLshort x, GLshort y)
{
    UNIMPLEMENTED();
}

void Context::windowPos2sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::windowPos3d(GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::windowPos3dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::windowPos3f(GLfloat x, GLfloat y, GLfloat z)
{
    UNIMPLEMENTED();
}

void Context::windowPos3fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::windowPos3i(GLint x, GLint y, GLint z)
{
    UNIMPLEMENTED();
}

void Context::windowPos3iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::windowPos3s(GLshort x, GLshort y, GLshort z)
{
    UNIMPLEMENTED();
}

void Context::windowPos3sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::getBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
{
    UNIMPLEMENTED();
}

void Context::accum(GLenum op, GLfloat value)
{
    UNIMPLEMENTED();
}

void Context::begin(GLenum mode)
{
    UNIMPLEMENTED();
}

void Context::bitmap(GLsizei width,
                     GLsizei height,
                     GLfloat xorig,
                     GLfloat yorig,
                     GLfloat xmove,
                     GLfloat ymove,
                     const GLubyte *bitmap)
{
    UNIMPLEMENTED();
}

void Context::callList(GLuint list)
{
    UNIMPLEMENTED();
}

void Context::callLists(GLsizei n, GLenum type, const void *lists)
{
    UNIMPLEMENTED();
}

void Context::clearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{
    UNIMPLEMENTED();
}

void Context::clearDepth(GLdouble depth)
{
    UNIMPLEMENTED();
}

void Context::clearIndex(GLfloat c)
{
    UNIMPLEMENTED();
}

void Context::clipPlane(GLenum plane, const GLdouble *equation)
{
    UNIMPLEMENTED();
}

void Context::color3b(GLbyte red, GLbyte green, GLbyte blue)
{
    UNIMPLEMENTED();
}

void Context::color3bv(const GLbyte *v)
{
    UNIMPLEMENTED();
}

void Context::color3d(GLdouble red, GLdouble green, GLdouble blue)
{
    UNIMPLEMENTED();
}

void Context::color3dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::color3f(GLfloat red, GLfloat green, GLfloat blue)
{
    UNIMPLEMENTED();
}

void Context::color3fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::color3i(GLint red, GLint green, GLint blue)
{
    UNIMPLEMENTED();
}

void Context::color3iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::color3s(GLshort red, GLshort green, GLshort blue)
{
    UNIMPLEMENTED();
}

void Context::color3sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::color3ub(GLubyte red, GLubyte green, GLubyte blue)
{
    UNIMPLEMENTED();
}

void Context::color3ubv(const GLubyte *v)
{
    UNIMPLEMENTED();
}

void Context::color3ui(GLuint red, GLuint green, GLuint blue)
{
    UNIMPLEMENTED();
}

void Context::color3uiv(const GLuint *v)
{
    UNIMPLEMENTED();
}

void Context::color3us(GLushort red, GLushort green, GLushort blue)
{
    UNIMPLEMENTED();
}

void Context::color3usv(const GLushort *v)
{
    UNIMPLEMENTED();
}

void Context::color4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
{
    UNIMPLEMENTED();
}

void Context::color4bv(const GLbyte *v)
{
    UNIMPLEMENTED();
}

void Context::color4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
{
    UNIMPLEMENTED();
}

void Context::color4dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::color4fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::color4i(GLint red, GLint green, GLint blue, GLint alpha)
{
    UNIMPLEMENTED();
}

void Context::color4iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::color4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
{
    UNIMPLEMENTED();
}

void Context::color4sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::color4ubv(const GLubyte *v)
{
    UNIMPLEMENTED();
}

void Context::color4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
{
    UNIMPLEMENTED();
}

void Context::color4uiv(const GLuint *v)
{
    UNIMPLEMENTED();
}

void Context::color4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
{
    UNIMPLEMENTED();
}

void Context::color4usv(const GLushort *v)
{
    UNIMPLEMENTED();
}

void Context::colorMaterial(GLenum face, GLenum mode)
{
    UNIMPLEMENTED();
}

void Context::copyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
{
    UNIMPLEMENTED();
}

void Context::deleteLists(GLuint list, GLsizei range)
{
    UNIMPLEMENTED();
}

void Context::depthRange(GLdouble n, GLdouble f)
{
    UNIMPLEMENTED();
}

void Context::drawBuffer(GLenum buf)
{
    UNIMPLEMENTED();
}

void Context::drawPixels(GLsizei width,
                         GLsizei height,
                         GLenum format,
                         GLenum type,
                         const void *pixels)
{
    UNIMPLEMENTED();
}

void Context::edgeFlag(GLboolean flag)
{
    UNIMPLEMENTED();
}

void Context::edgeFlagv(const GLboolean *flag)
{
    UNIMPLEMENTED();
}

void Context::end()
{
    UNIMPLEMENTED();
}

void Context::endList()
{
    UNIMPLEMENTED();
}

void Context::evalCoord1d(GLdouble u)
{
    UNIMPLEMENTED();
}

void Context::evalCoord1dv(const GLdouble *u)
{
    UNIMPLEMENTED();
}

void Context::evalCoord1f(GLfloat u)
{
    UNIMPLEMENTED();
}

void Context::evalCoord1fv(const GLfloat *u)
{
    UNIMPLEMENTED();
}

void Context::evalCoord2d(GLdouble u, GLdouble v)
{
    UNIMPLEMENTED();
}

void Context::evalCoord2dv(const GLdouble *u)
{
    UNIMPLEMENTED();
}

void Context::evalCoord2f(GLfloat u, GLfloat v)
{
    UNIMPLEMENTED();
}

void Context::evalCoord2fv(const GLfloat *u)
{
    UNIMPLEMENTED();
}

void Context::evalMesh1(GLenum mode, GLint i1, GLint i2)
{
    UNIMPLEMENTED();
}

void Context::evalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
{
    UNIMPLEMENTED();
}

void Context::evalPoint1(GLint i)
{
    UNIMPLEMENTED();
}

void Context::evalPoint2(GLint i, GLint j)
{
    UNIMPLEMENTED();
}

void Context::feedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
{
    UNIMPLEMENTED();
}

void Context::fogi(GLenum pname, GLint param)
{
    UNIMPLEMENTED();
}

void Context::fogiv(GLenum pname, const GLint *params)
{
    UNIMPLEMENTED();
}

void Context::frustum(GLdouble left,
                      GLdouble right,
                      GLdouble bottom,
                      GLdouble top,
                      GLdouble zNear,
                      GLdouble zFar)
{
    UNIMPLEMENTED();
}

GLuint Context::genLists(GLsizei range)
{
    UNIMPLEMENTED();
    return 0;
}

void Context::getClipPlane(GLenum plane, GLdouble *equation)
{
    UNIMPLEMENTED();
}

void Context::getDoublev(GLenum pname, GLdouble *data)
{
    UNIMPLEMENTED();
}

void Context::getLightiv(GLenum light, GLenum pname, GLint *params)
{
    UNIMPLEMENTED();
}

void Context::getMapdv(GLenum target, GLenum query, GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::getMapfv(GLenum target, GLenum query, GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::getMapiv(GLenum target, GLenum query, GLint *v)
{
    UNIMPLEMENTED();
}

void Context::getMaterialiv(GLenum face, GLenum pname, GLint *params)
{
    UNIMPLEMENTED();
}

void Context::getPixelMapfv(GLenum map, GLfloat *values)
{
    UNIMPLEMENTED();
}

void Context::getPixelMapuiv(GLenum map, GLuint *values)
{
    UNIMPLEMENTED();
}

void Context::getPixelMapusv(GLenum map, GLushort *values)
{
    UNIMPLEMENTED();
}

void Context::getPolygonStipple(GLubyte *mask)
{
    UNIMPLEMENTED();
}

void Context::getTexGendv(GLenum coord, GLenum pname, GLdouble *params)
{
    UNIMPLEMENTED();
}

void Context::indexMask(GLuint mask)
{
    UNIMPLEMENTED();
}

void Context::indexd(GLdouble c)
{
    UNIMPLEMENTED();
}

void Context::indexdv(const GLdouble *c)
{
    UNIMPLEMENTED();
}

void Context::indexf(GLfloat c)
{
    UNIMPLEMENTED();
}

void Context::indexfv(const GLfloat *c)
{
    UNIMPLEMENTED();
}

void Context::indexi(GLint c)
{
    UNIMPLEMENTED();
}

void Context::indexiv(const GLint *c)
{
    UNIMPLEMENTED();
}

void Context::indexs(GLshort c)
{
    UNIMPLEMENTED();
}

void Context::indexsv(const GLshort *c)
{
    UNIMPLEMENTED();
}

void Context::initNames()
{
    UNIMPLEMENTED();
}

GLboolean Context::isList(GLuint list)
{
    UNIMPLEMENTED();
    return false;
}

void Context::lightModeli(GLenum pname, GLint param)
{
    UNIMPLEMENTED();
}

void Context::lightModeliv(GLenum pname, const GLint *params)
{
    UNIMPLEMENTED();
}

void Context::lighti(GLenum light, GLenum pname, GLint param)
{
    UNIMPLEMENTED();
}

void Context::lightiv(GLenum light, GLenum pname, const GLint *params)
{
    UNIMPLEMENTED();
}

void Context::lineStipple(GLint factor, GLushort pattern)
{
    UNIMPLEMENTED();
}

void Context::listBase(GLuint base)
{
    UNIMPLEMENTED();
}

void Context::loadMatrixd(const GLdouble *m)
{
    UNIMPLEMENTED();
}

void Context::loadName(GLuint name)
{
    UNIMPLEMENTED();
}

void Context::map1d(GLenum target,
                    GLdouble u1,
                    GLdouble u2,
                    GLint stride,
                    GLint order,
                    const GLdouble *points)
{
    UNIMPLEMENTED();
}

void Context::map1f(GLenum target,
                    GLfloat u1,
                    GLfloat u2,
                    GLint stride,
                    GLint order,
                    const GLfloat *points)
{
    UNIMPLEMENTED();
}

void Context::map2d(GLenum target,
                    GLdouble u1,
                    GLdouble u2,
                    GLint ustride,
                    GLint uorder,
                    GLdouble v1,
                    GLdouble v2,
                    GLint vstride,
                    GLint vorder,
                    const GLdouble *points)
{
    UNIMPLEMENTED();
}

void Context::map2f(GLenum target,
                    GLfloat u1,
                    GLfloat u2,
                    GLint ustride,
                    GLint uorder,
                    GLfloat v1,
                    GLfloat v2,
                    GLint vstride,
                    GLint vorder,
                    const GLfloat *points)
{
    UNIMPLEMENTED();
}

void Context::mapGrid1d(GLint un, GLdouble u1, GLdouble u2)
{
    UNIMPLEMENTED();
}

void Context::mapGrid1f(GLint un, GLfloat u1, GLfloat u2)
{
    UNIMPLEMENTED();
}

void Context::mapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
{
    UNIMPLEMENTED();
}

void Context::mapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
{
    UNIMPLEMENTED();
}

void Context::materiali(GLenum face, GLenum pname, GLint param)
{
    UNIMPLEMENTED();
}

void Context::materialiv(GLenum face, GLenum pname, const GLint *params)
{
    UNIMPLEMENTED();
}

void Context::multMatrixd(const GLdouble *m)
{
    UNIMPLEMENTED();
}

void Context::newList(GLuint list, GLenum mode)
{
    UNIMPLEMENTED();
}

void Context::normal3b(GLbyte nx, GLbyte ny, GLbyte nz)
{
    UNIMPLEMENTED();
}

void Context::normal3bv(const GLbyte *v)
{
    UNIMPLEMENTED();
}

void Context::normal3d(GLdouble nx, GLdouble ny, GLdouble nz)
{
    UNIMPLEMENTED();
}

void Context::normal3dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::normal3fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::normal3i(GLint nx, GLint ny, GLint nz)
{
    UNIMPLEMENTED();
}

void Context::normal3iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::normal3s(GLshort nx, GLshort ny, GLshort nz)
{
    UNIMPLEMENTED();
}

void Context::normal3sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::ortho(GLdouble left,
                    GLdouble right,
                    GLdouble bottom,
                    GLdouble top,
                    GLdouble zNear,
                    GLdouble zFar)
{
    UNIMPLEMENTED();
}

void Context::passThrough(GLfloat token)
{
    UNIMPLEMENTED();
}

void Context::pixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values)
{
    UNIMPLEMENTED();
}

void Context::pixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values)
{
    UNIMPLEMENTED();
}

void Context::pixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values)
{
    UNIMPLEMENTED();
}

void Context::pixelStoref(GLenum pname, GLfloat param)
{
    UNIMPLEMENTED();
}

void Context::pixelTransferf(GLenum pname, GLfloat param)
{
    UNIMPLEMENTED();
}

void Context::pixelTransferi(GLenum pname, GLint param)
{
    UNIMPLEMENTED();
}

void Context::pixelZoom(GLfloat xfactor, GLfloat yfactor)
{
    UNIMPLEMENTED();
}

void Context::polygonMode(GLenum face, GLenum mode)
{
    UNIMPLEMENTED();
}

void Context::polygonStipple(const GLubyte *mask)
{
    UNIMPLEMENTED();
}

void Context::popAttrib()
{
    UNIMPLEMENTED();
}

void Context::popName()
{
    UNIMPLEMENTED();
}

void Context::pushAttrib(GLbitfield mask)
{
    UNIMPLEMENTED();
}

void Context::pushName(GLuint name)
{
    UNIMPLEMENTED();
}

void Context::rasterPos2d(GLdouble x, GLdouble y)
{
    UNIMPLEMENTED();
}

void Context::rasterPos2dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos2f(GLfloat x, GLfloat y)
{
    UNIMPLEMENTED();
}

void Context::rasterPos2fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos2i(GLint x, GLint y)
{
    UNIMPLEMENTED();
}

void Context::rasterPos2iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos2s(GLshort x, GLshort y)
{
    UNIMPLEMENTED();
}

void Context::rasterPos2sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos3d(GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::rasterPos3dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos3f(GLfloat x, GLfloat y, GLfloat z)
{
    UNIMPLEMENTED();
}

void Context::rasterPos3fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos3i(GLint x, GLint y, GLint z)
{
    UNIMPLEMENTED();
}

void Context::rasterPos3iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos3s(GLshort x, GLshort y, GLshort z)
{
    UNIMPLEMENTED();
}

void Context::rasterPos3sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
    UNIMPLEMENTED();
}

void Context::rasterPos4dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
    UNIMPLEMENTED();
}

void Context::rasterPos4fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos4i(GLint x, GLint y, GLint z, GLint w)
{
    UNIMPLEMENTED();
}

void Context::rasterPos4iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::rasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
{
    UNIMPLEMENTED();
}

void Context::rasterPos4sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
{
    UNIMPLEMENTED();
}

void Context::rectdv(const GLdouble *v1, const GLdouble *v2)
{
    UNIMPLEMENTED();
}

void Context::rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
{
    UNIMPLEMENTED();
}

void Context::rectfv(const GLfloat *v1, const GLfloat *v2)
{
    UNIMPLEMENTED();
}

void Context::recti(GLint x1, GLint y1, GLint x2, GLint y2)
{
    UNIMPLEMENTED();
}

void Context::rectiv(const GLint *v1, const GLint *v2)
{
    UNIMPLEMENTED();
}

void Context::rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
{
    UNIMPLEMENTED();
}

void Context::rectsv(const GLshort *v1, const GLshort *v2)
{
    UNIMPLEMENTED();
}

GLint Context::renderMode(GLenum mode)
{
    UNIMPLEMENTED();
    return 0;
}

void Context::rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::scaled(GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::selectBuffer(GLsizei size, GLuint *buffer)
{
    UNIMPLEMENTED();
}

void Context::texCoord1d(GLdouble s)
{
    UNIMPLEMENTED();
}

void Context::texCoord1dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord1f(GLfloat s)
{
    UNIMPLEMENTED();
}

void Context::texCoord1fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord1i(GLint s)
{
    UNIMPLEMENTED();
}

void Context::texCoord1iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord1s(GLshort s)
{
    UNIMPLEMENTED();
}

void Context::texCoord1sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord2d(GLdouble s, GLdouble t)
{
    UNIMPLEMENTED();
}

void Context::texCoord2dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord2f(GLfloat s, GLfloat t)
{
    UNIMPLEMENTED();
}

void Context::texCoord2fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord2i(GLint s, GLint t)
{
    UNIMPLEMENTED();
}

void Context::texCoord2iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord2s(GLshort s, GLshort t)
{
    UNIMPLEMENTED();
}

void Context::texCoord2sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord3d(GLdouble s, GLdouble t, GLdouble r)
{
    UNIMPLEMENTED();
}

void Context::texCoord3dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord3f(GLfloat s, GLfloat t, GLfloat r)
{
    UNIMPLEMENTED();
}

void Context::texCoord3fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord3i(GLint s, GLint t, GLint r)
{
    UNIMPLEMENTED();
}

void Context::texCoord3iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord3s(GLshort s, GLshort t, GLshort r)
{
    UNIMPLEMENTED();
}

void Context::texCoord3sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
{
    UNIMPLEMENTED();
}

void Context::texCoord4dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
{
    UNIMPLEMENTED();
}

void Context::texCoord4fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord4i(GLint s, GLint t, GLint r, GLint q)
{
    UNIMPLEMENTED();
}

void Context::texCoord4iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::texCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
{
    UNIMPLEMENTED();
}

void Context::texCoord4sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::texGend(GLenum coord, GLenum pname, GLdouble param)
{
    UNIMPLEMENTED();
}

void Context::texGendv(GLenum coord, GLenum pname, const GLdouble *params)
{
    UNIMPLEMENTED();
}

void Context::texImage1D(GLenum target,
                         GLint level,
                         GLint internalformat,
                         GLsizei width,
                         GLint border,
                         GLenum format,
                         GLenum type,
                         const void *pixels)
{
    UNIMPLEMENTED();
}

void Context::translated(GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::vertex2d(GLdouble x, GLdouble y)
{
    UNIMPLEMENTED();
}

void Context::vertex2dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertex2f(GLfloat x, GLfloat y)
{
    UNIMPLEMENTED();
}

void Context::vertex2fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::vertex2i(GLint x, GLint y)
{
    UNIMPLEMENTED();
}

void Context::vertex2iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertex2s(GLshort x, GLshort y)
{
    UNIMPLEMENTED();
}

void Context::vertex2sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::vertex3d(GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::vertex3dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertex3f(GLfloat x, GLfloat y, GLfloat z)
{
    UNIMPLEMENTED();
}

void Context::vertex3fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::vertex3i(GLint x, GLint y, GLint z)
{
    UNIMPLEMENTED();
}

void Context::vertex3iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertex3s(GLshort x, GLshort y, GLshort z)
{
    UNIMPLEMENTED();
}

void Context::vertex3sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

void Context::vertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
    UNIMPLEMENTED();
}

void Context::vertex4dv(const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
    UNIMPLEMENTED();
}

void Context::vertex4fv(const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::vertex4i(GLint x, GLint y, GLint z, GLint w)
{
    UNIMPLEMENTED();
}

void Context::vertex4iv(const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
{
    UNIMPLEMENTED();
}

void Context::vertex4sv(const GLshort *v)
{
    UNIMPLEMENTED();
}

GLboolean Context::areTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
{
    UNIMPLEMENTED();
    return false;
}

void Context::arrayElement(GLint i)
{
    UNIMPLEMENTED();
}

void Context::copyTexImage1D(GLenum target,
                             GLint level,
                             GLenum internalformat,
                             GLint x,
                             GLint y,
                             GLsizei width,
                             GLint border)
{
    UNIMPLEMENTED();
}

void Context::copyTexSubImage1D(GLenum target,
                                GLint level,
                                GLint xoffset,
                                GLint x,
                                GLint y,
                                GLsizei width)
{
    UNIMPLEMENTED();
}

void Context::edgeFlagPointer(GLsizei stride, const void *pointer)
{
    UNIMPLEMENTED();
}

void Context::indexPointer(GLenum type, GLsizei stride, const void *pointer)
{
    UNIMPLEMENTED();
}

void Context::indexub(GLubyte c)
{
    UNIMPLEMENTED();
}

void Context::indexubv(const GLubyte *c)
{
    UNIMPLEMENTED();
}

void Context::interleavedArrays(GLenum format, GLsizei stride, const void *pointer)
{
    UNIMPLEMENTED();
}

void Context::popClientAttrib()
{
    UNIMPLEMENTED();
}

void Context::prioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
{
    UNIMPLEMENTED();
}

void Context::pushClientAttrib(GLbitfield mask)
{
    UNIMPLEMENTED();
}

void Context::texSubImage1D(GLenum target,
                            GLint level,
                            GLint xoffset,
                            GLsizei width,
                            GLenum format,
                            GLenum type,
                            const void *pixels)
{
    UNIMPLEMENTED();
}

void Context::multiDrawElementsBaseVertex(GLenum mode,
                                          const GLsizei *count,
                                          GLenum type,
                                          const void *const *indices,
                                          GLsizei drawcount,
                                          const GLint *basevertex)
{
    UNIMPLEMENTED();
}

void Context::texImage2DMultisample(GLenum target,
                                    GLsizei samples,
                                    GLenum internalformat,
                                    GLsizei width,
                                    GLsizei height,
                                    GLboolean fixedsamplelocations)
{
    UNIMPLEMENTED();
}

void Context::texImage3DMultisample(GLenum target,
                                    GLsizei samples,
                                    GLenum internalformat,
                                    GLsizei width,
                                    GLsizei height,
                                    GLsizei depth,
                                    GLboolean fixedsamplelocations)
{
    UNIMPLEMENTED();
}

void Context::colorP3ui(GLenum type, GLuint color)
{
    UNIMPLEMENTED();
}

void Context::colorP3uiv(GLenum type, const GLuint *color)
{
    UNIMPLEMENTED();
}

void Context::colorP4ui(GLenum type, GLuint color)
{
    UNIMPLEMENTED();
}

void Context::colorP4uiv(GLenum type, const GLuint *color)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::multiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::normalP3ui(GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::normalP3uiv(GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::secondaryColorP3ui(GLenum type, GLuint color)
{
    UNIMPLEMENTED();
}

void Context::secondaryColorP3uiv(GLenum type, const GLuint *color)
{
    UNIMPLEMENTED();
}

void Context::texCoordP1ui(GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::texCoordP1uiv(GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::texCoordP2ui(GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::texCoordP2uiv(GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::texCoordP3ui(GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::texCoordP3uiv(GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::texCoordP4ui(GLenum type, GLuint coords)
{
    UNIMPLEMENTED();
}

void Context::texCoordP4uiv(GLenum type, const GLuint *coords)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribP1uiv(GLuint index,
                                GLenum type,
                                GLboolean normalized,
                                const GLuint *value)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribP2uiv(GLuint index,
                                GLenum type,
                                GLboolean normalized,
                                const GLuint *value)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribP3uiv(GLuint index,
                                GLenum type,
                                GLboolean normalized,
                                const GLuint *value)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribP4uiv(GLuint index,
                                GLenum type,
                                GLboolean normalized,
                                const GLuint *value)
{
    UNIMPLEMENTED();
}

void Context::vertexP2ui(GLenum type, GLuint value)
{
    UNIMPLEMENTED();
}

void Context::vertexP2uiv(GLenum type, const GLuint *value)
{
    UNIMPLEMENTED();
}

void Context::vertexP3ui(GLenum type, GLuint value)
{
    UNIMPLEMENTED();
}

void Context::vertexP3uiv(GLenum type, const GLuint *value)
{
    UNIMPLEMENTED();
}

void Context::vertexP4ui(GLenum type, GLuint value)
{
    UNIMPLEMENTED();
}

void Context::vertexP4uiv(GLenum type, const GLuint *value)
{
    UNIMPLEMENTED();
}

void Context::beginQueryIndexed(GLenum target, GLuint index, QueryID id)
{
    UNIMPLEMENTED();
}

void Context::drawTransformFeedback(GLenum mode, TransformFeedbackID id)
{
    UNIMPLEMENTED();
}

void Context::drawTransformFeedbackStream(GLenum mode, TransformFeedbackID id, GLuint stream)
{
    UNIMPLEMENTED();
}

void Context::endQueryIndexed(GLenum target, GLuint index)
{
    UNIMPLEMENTED();
}

void Context::getActiveSubroutineName(ShaderProgramID program,
                                      GLenum shadertype,
                                      GLuint index,
                                      GLsizei bufsize,
                                      GLsizei *length,
                                      GLchar *name)
{
    UNIMPLEMENTED();
}

void Context::getActiveSubroutineUniformName(ShaderProgramID program,
                                             GLenum shadertype,
                                             GLuint index,
                                             GLsizei bufsize,
                                             GLsizei *length,
                                             GLchar *name)
{
    UNIMPLEMENTED();
}

void Context::getActiveSubroutineUniformiv(ShaderProgramID program,
                                           GLenum shadertype,
                                           GLuint index,
                                           GLenum pname,
                                           GLint *values)
{
    UNIMPLEMENTED();
}

void Context::getProgramStageiv(ShaderProgramID program,
                                GLenum shadertype,
                                GLenum pname,
                                GLint *values)
{
    UNIMPLEMENTED();
}

void Context::getQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
{
    UNIMPLEMENTED();
}

GLuint Context::getSubroutineIndex(ShaderProgramID program, GLenum shadertype, const GLchar *name)
{
    UNIMPLEMENTED();
    return 0;
}

GLint Context::getSubroutineUniformLocation(ShaderProgramID program,
                                            GLenum shadertype,
                                            const GLchar *name)
{
    UNIMPLEMENTED();
    return 0;
}

void Context::getUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
{
    UNIMPLEMENTED();
}

void Context::getUniformdv(ShaderProgramID program, GLint location, GLdouble *params)
{
    UNIMPLEMENTED();
}

void Context::patchParameterfv(GLenum pname, const GLfloat *values)
{
    UNIMPLEMENTED();
}

void Context::uniform1d(GLint location, GLdouble x)
{
    UNIMPLEMENTED();
}

void Context::uniform1dv(GLint location, GLsizei count, const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniform2d(GLint location, GLdouble x, GLdouble y)
{
    UNIMPLEMENTED();
}

void Context::uniform2dv(GLint location, GLsizei count, const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::uniform3dv(GLint location, GLsizei count, const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
    UNIMPLEMENTED();
}

void Context::uniform4dv(GLint location, GLsizei count, const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix2dv(GLint location,
                               GLsizei count,
                               GLboolean transpose,
                               const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix2x3dv(GLint location,
                                 GLsizei count,
                                 GLboolean transpose,
                                 const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix2x4dv(GLint location,
                                 GLsizei count,
                                 GLboolean transpose,
                                 const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix3dv(GLint location,
                               GLsizei count,
                               GLboolean transpose,
                               const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix3x2dv(GLint location,
                                 GLsizei count,
                                 GLboolean transpose,
                                 const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix3x4dv(GLint location,
                                 GLsizei count,
                                 GLboolean transpose,
                                 const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix4dv(GLint location,
                               GLsizei count,
                               GLboolean transpose,
                               const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix4x2dv(GLint location,
                                 GLsizei count,
                                 GLboolean transpose,
                                 const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformMatrix4x3dv(GLint location,
                                 GLsizei count,
                                 GLboolean transpose,
                                 const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::uniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
{
    UNIMPLEMENTED();
}

void Context::depthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::depthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
{
    UNIMPLEMENTED();
}

void Context::getDoublei_v(GLenum target, GLuint index, GLdouble *data)
{
    UNIMPLEMENTED();
}

void Context::getFloati_v(GLenum target, GLuint index, GLfloat *data)
{
    UNIMPLEMENTED();
}

void Context::getVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
{
    UNIMPLEMENTED();
}

void Context::programUniform1d(ShaderProgramID program, GLint location, GLdouble v0)
{
    UNIMPLEMENTED();
}

void Context::programUniform1dv(ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniform2d(ShaderProgramID program, GLint location, GLdouble v0, GLdouble v1)
{
    UNIMPLEMENTED();
}

void Context::programUniform2dv(ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniform3d(ShaderProgramID program,
                               GLint location,
                               GLdouble v0,
                               GLdouble v1,
                               GLdouble v2)
{
    UNIMPLEMENTED();
}

void Context::programUniform3dv(ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniform4d(ShaderProgramID program,
                               GLint location,
                               GLdouble v0,
                               GLdouble v1,
                               GLdouble v2,
                               GLdouble v3)
{
    UNIMPLEMENTED();
}

void Context::programUniform4dv(ShaderProgramID program,
                                GLint location,
                                GLsizei count,
                                const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix2dv(ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix2x3dv(ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix2x4dv(ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix3dv(ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix3x2dv(ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix3x4dv(ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix4dv(ShaderProgramID program,
                                      GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix4x2dv(ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::programUniformMatrix4x3dv(ShaderProgramID program,
                                        GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLdouble *value)
{
    UNIMPLEMENTED();
}

void Context::scissorArrayv(GLuint first, GLsizei count, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::scissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
{
    UNIMPLEMENTED();
}

void Context::scissorIndexedv(GLuint index, const GLint *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribL1d(GLuint index, GLdouble x)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribL1dv(GLuint index, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribL2dv(GLuint index, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribL3dv(GLuint index, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribL4dv(GLuint index, const GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribLPointer(GLuint index,
                                   GLint size,
                                   GLenum type,
                                   GLsizei stride,
                                   const void *pointer)
{
    UNIMPLEMENTED();
}

void Context::viewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::viewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
{
    UNIMPLEMENTED();
}

void Context::viewportIndexedfv(GLuint index, const GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::drawElementsInstancedBaseInstance(GLenum mode,
                                                GLsizei count,
                                                GLenum type,
                                                const void *indices,
                                                GLsizei instancecount,
                                                GLuint baseinstance)
{
    UNIMPLEMENTED();
}

void Context::drawTransformFeedbackInstanced(GLenum mode,
                                             TransformFeedbackID id,
                                             GLsizei instancecount)
{
    UNIMPLEMENTED();
}

void Context::drawTransformFeedbackStreamInstanced(GLenum mode,
                                                   TransformFeedbackID id,
                                                   GLuint stream,
                                                   GLsizei instancecount)
{
    UNIMPLEMENTED();
}

void Context::getActiveAtomicCounterBufferiv(ShaderProgramID program,
                                             GLuint bufferIndex,
                                             GLenum pname,
                                             GLint *params)
{
    UNIMPLEMENTED();
}

void Context::clearBufferData(GLenum target,
                              GLenum internalformat,
                              GLenum format,
                              GLenum type,
                              const void *data)
{
    UNIMPLEMENTED();
}

void Context::clearBufferSubData(GLenum target,
                                 GLenum internalformat,
                                 GLintptr offset,
                                 GLsizeiptr size,
                                 GLenum format,
                                 GLenum type,
                                 const void *data)
{
    UNIMPLEMENTED();
}

void Context::getInternalformati64v(GLenum target,
                                    GLenum internalformat,
                                    GLenum pname,
                                    GLsizei bufSize,
                                    GLint64 *params)
{
    UNIMPLEMENTED();
}

void Context::invalidateBufferData(BufferID buffer)
{
    UNIMPLEMENTED();
}

void Context::invalidateBufferSubData(BufferID buffer, GLintptr offset, GLsizeiptr length)
{
    UNIMPLEMENTED();
}

void Context::invalidateTexImage(TextureID texture, GLint level)
{
    UNIMPLEMENTED();
}

void Context::invalidateTexSubImage(TextureID texture,
                                    GLint level,
                                    GLint xoffset,
                                    GLint yoffset,
                                    GLint zoffset,
                                    GLsizei width,
                                    GLsizei height,
                                    GLsizei depth)
{
    UNIMPLEMENTED();
}

void Context::multiDrawArraysIndirect(GLenum mode,
                                      const void *indirect,
                                      GLsizei drawcount,
                                      GLsizei stride)
{
    UNIMPLEMENTED();
}

void Context::multiDrawElementsIndirect(GLenum mode,
                                        GLenum type,
                                        const void *indirect,
                                        GLsizei drawcount,
                                        GLsizei stride)
{
    UNIMPLEMENTED();
}

void Context::shaderStorageBlockBinding(ShaderProgramID program,
                                        GLuint storageBlockIndex,
                                        GLuint storageBlockBinding)
{
    UNIMPLEMENTED();
}

void Context::textureView(TextureID texture,
                          GLenum target,
                          GLuint origtexture,
                          GLenum internalformat,
                          GLuint minlevel,
                          GLuint numlevels,
                          GLuint minlayer,
                          GLuint numlayers)
{
    UNIMPLEMENTED();
}

void Context::vertexAttribLFormat(GLuint attribindex,
                                  GLint size,
                                  GLenum type,
                                  GLuint relativeoffset)
{
    UNIMPLEMENTED();
}

void Context::bindBuffersBase(GLenum target, GLuint first, GLsizei count, const BufferID *buffers)
{
    UNIMPLEMENTED();
}

void Context::bindBuffersRange(GLenum target,
                               GLuint first,
                               GLsizei count,
                               const BufferID *buffers,
                               const GLintptr *offsets,
                               const GLsizeiptr *sizes)
{
    UNIMPLEMENTED();
}

void Context::bindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
{
    UNIMPLEMENTED();
}

void Context::bindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
{
    UNIMPLEMENTED();
}

void Context::bindTextures(GLuint first, GLsizei count, const GLuint *textures)
{
    UNIMPLEMENTED();
}

void Context::bindVertexBuffers(GLuint first,
                                GLsizei count,
                                const BufferID *buffers,
                                const GLintptr *offsets,
                                const GLsizei *strides)
{
    UNIMPLEMENTED();
}

void Context::bufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
{
    UNIMPLEMENTED();
}

void Context::clearTexImage(TextureID texture,
                            GLint level,
                            GLenum format,
                            GLenum type,
                            const void *data)
{
    UNIMPLEMENTED();
}

void Context::clearTexSubImage(TextureID texture,
                               GLint level,
                               GLint xoffset,
                               GLint yoffset,
                               GLint zoffset,
                               GLsizei width,
                               GLsizei height,
                               GLsizei depth,
                               GLenum format,
                               GLenum type,
                               const void *data)
{
    UNIMPLEMENTED();
}

void Context::bindTextureUnit(GLuint unit, TextureID texture)
{
    UNIMPLEMENTED();
}

void Context::blitNamedFramebuffer(GLuint readFramebuffer,
                                   GLuint drawFramebuffer,
                                   GLint srcX0,
                                   GLint srcY0,
                                   GLint srcX1,
                                   GLint srcY1,
                                   GLint dstX0,
                                   GLint dstY0,
                                   GLint dstX1,
                                   GLint dstY1,
                                   GLbitfield mask,
                                   GLenum filter)
{
    UNIMPLEMENTED();
}

GLenum Context::checkNamedFramebufferStatus(FramebufferID framebuffer, GLenum target)
{
    UNIMPLEMENTED();
    return 0;
}

void Context::clearNamedBufferData(BufferID buffer,
                                   GLenum internalformat,
                                   GLenum format,
                                   GLenum type,
                                   const void *data)
{
    UNIMPLEMENTED();
}

void Context::clearNamedBufferSubData(BufferID buffer,
                                      GLenum internalformat,
                                      GLintptr offset,
                                      GLsizeiptr size,
                                      GLenum format,
                                      GLenum type,
                                      const void *data)
{
    UNIMPLEMENTED();
}

void Context::clearNamedFramebufferfi(FramebufferID framebuffer,
                                      GLenum buffer,
                                      GLint drawbuffer,
                                      GLfloat depth,
                                      GLint stencil)
{
    UNIMPLEMENTED();
}

void Context::clearNamedFramebufferfv(FramebufferID framebuffer,
                                      GLenum buffer,
                                      GLint drawbuffer,
                                      const GLfloat *value)
{
    UNIMPLEMENTED();
}

void Context::clearNamedFramebufferiv(FramebufferID framebuffer,
                                      GLenum buffer,
                                      GLint drawbuffer,
                                      const GLint *value)
{
    UNIMPLEMENTED();
}

void Context::clearNamedFramebufferuiv(FramebufferID framebuffer,
                                       GLenum buffer,
                                       GLint drawbuffer,
                                       const GLuint *value)
{
    UNIMPLEMENTED();
}

void Context::clipControl(GLenum origin, GLenum depth)
{
    UNIMPLEMENTED();
}

void Context::compressedTextureSubImage1D(TextureID texture,
                                          GLint level,
                                          GLint xoffset,
                                          GLsizei width,
                                          GLenum format,
                                          GLsizei imageSize,
                                          const void *data)
{
    UNIMPLEMENTED();
}

void Context::compressedTextureSubImage2D(TextureID texture,
                                          GLint level,
                                          GLint xoffset,
                                          GLint yoffset,
                                          GLsizei width,
                                          GLsizei height,
                                          GLenum format,
                                          GLsizei imageSize,
                                          const void *data)
{
    UNIMPLEMENTED();
}

void Context::compressedTextureSubImage3D(TextureID texture,
                                          GLint level,
                                          GLint xoffset,
                                          GLint yoffset,
                                          GLint zoffset,
                                          GLsizei width,
                                          GLsizei height,
                                          GLsizei depth,
                                          GLenum format,
                                          GLsizei imageSize,
                                          const void *data)
{
    UNIMPLEMENTED();
}

void Context::copyNamedBufferSubData(GLuint readBuffer,
                                     GLuint writeBuffer,
                                     GLintptr readOffset,
                                     GLintptr writeOffset,
                                     GLsizeiptr size)
{
    UNIMPLEMENTED();
}

void Context::copyTextureSubImage1D(TextureID texture,
                                    GLint level,
                                    GLint xoffset,
                                    GLint x,
                                    GLint y,
                                    GLsizei width)
{
    UNIMPLEMENTED();
}

void Context::copyTextureSubImage2D(TextureID texture,
                                    GLint level,
                                    GLint xoffset,
                                    GLint yoffset,
                                    GLint x,
                                    GLint y,
                                    GLsizei width,
                                    GLsizei height)
{
    UNIMPLEMENTED();
}

void Context::copyTextureSubImage3D(TextureID texture,
                                    GLint level,
                                    GLint xoffset,
                                    GLint yoffset,
                                    GLint zoffset,
                                    GLint x,
                                    GLint y,
                                    GLsizei width,
                                    GLsizei height)
{
    UNIMPLEMENTED();
}

void Context::createBuffers(GLsizei n, BufferID *buffers)
{
    UNIMPLEMENTED();
}

void Context::createFramebuffers(GLsizei n, GLuint *framebuffers)
{
    UNIMPLEMENTED();
}

void Context::createProgramPipelines(GLsizei n, GLuint *pipelines)
{
    UNIMPLEMENTED();
}

void Context::createQueries(GLenum target, GLsizei n, GLuint *ids)
{
    UNIMPLEMENTED();
}

void Context::createRenderbuffers(GLsizei n, RenderbufferID *renderbuffers)
{
    UNIMPLEMENTED();
}

void Context::createSamplers(GLsizei n, GLuint *samplers)
{
    UNIMPLEMENTED();
}

void Context::createTextures(GLenum target, GLsizei n, GLuint *textures)
{
    UNIMPLEMENTED();
}

void Context::createTransformFeedbacks(GLsizei n, GLuint *ids)
{
    UNIMPLEMENTED();
}

void Context::createVertexArrays(GLsizei n, VertexArrayID *arrays)
{
    UNIMPLEMENTED();
}

void Context::disableVertexArrayAttrib(VertexArrayID vaobj, GLuint index)
{
    UNIMPLEMENTED();
}

void Context::enableVertexArrayAttrib(VertexArrayID vaobj, GLuint index)
{
    UNIMPLEMENTED();
}

void Context::flushMappedNamedBufferRange(BufferID buffer, GLintptr offset, GLsizeiptr length)
{
    UNIMPLEMENTED();
}

void Context::generateTextureMipmap(TextureID texture)
{
    UNIMPLEMENTED();
}

void Context::getCompressedTextureImage(TextureID texture,
                                        GLint level,
                                        GLsizei bufSize,
                                        void *pixels)
{
    UNIMPLEMENTED();
}

void Context::getCompressedTextureSubImage(TextureID texture,
                                           GLint level,
                                           GLint xoffset,
                                           GLint yoffset,
                                           GLint zoffset,
                                           GLsizei width,
                                           GLsizei height,
                                           GLsizei depth,
                                           GLsizei bufSize,
                                           void *pixels)
{
    UNIMPLEMENTED();
}

void Context::getNamedBufferParameteri64v(BufferID buffer, GLenum pname, GLint64 *params)
{
    UNIMPLEMENTED();
}

void Context::getNamedBufferParameteriv(BufferID buffer, GLenum pname, GLint *params)
{
    UNIMPLEMENTED();
}

void Context::getNamedBufferPointerv(BufferID buffer, GLenum pname, void **params)
{
    UNIMPLEMENTED();
}

void Context::getNamedBufferSubData(BufferID buffer, GLintptr offset, GLsizeiptr size, void *data)
{
    UNIMPLEMENTED();
}

void Context::getNamedFramebufferAttachmentParameteriv(FramebufferID framebuffer,
                                                       GLenum attachment,
                                                       GLenum pname,
                                                       GLint *params)
{
    UNIMPLEMENTED();
}

void Context::getNamedFramebufferParameteriv(FramebufferID framebuffer, GLenum pname, GLint *param)
{
    UNIMPLEMENTED();
}

void Context::getNamedRenderbufferParameteriv(RenderbufferID renderbuffer,
                                              GLenum pname,
                                              GLint *params)
{
    UNIMPLEMENTED();
}

void Context::getQueryBufferObjecti64v(GLuint id, BufferID buffer, GLenum pname, GLintptr offset)
{
    UNIMPLEMENTED();
}

void Context::getQueryBufferObjectiv(GLuint id, BufferID buffer, GLenum pname, GLintptr offset)
{
    UNIMPLEMENTED();
}

void Context::getQueryBufferObjectui64v(GLuint id, BufferID buffer, GLenum pname, GLintptr offset)
{
    UNIMPLEMENTED();
}

void Context::getQueryBufferObjectuiv(GLuint id, BufferID buffer, GLenum pname, GLintptr offset)
{
    UNIMPLEMENTED();
}

void Context::getTextureImage(TextureID texture,
                              GLint level,
                              GLenum format,
                              GLenum type,
                              GLsizei bufSize,
                              void *pixels)
{
    UNIMPLEMENTED();
}

void Context::getTextureLevelParameterfv(TextureID texture,
                                         GLint level,
                                         GLenum pname,
                                         GLfloat *params)
{
    UNIMPLEMENTED();
}

void Context::getTextureLevelParameteriv(TextureID texture,
                                         GLint level,
                                         GLenum pname,
                                         GLint *params)
{
    UNIMPLEMENTED();
}

void Context::getTextureParameterIiv(TextureID texture, GLenum pname, GLint *params)
{
    UNIMPLEMENTED();
}

void Context::getTextureParameterIuiv(TextureID texture, GLenum pname, GLuint *params)
{
    UNIMPLEMENTED();
}

void Context::getTextureParameterfv(TextureID texture, GLenum pname, GLfloat *params)
{
    UNIMPLEMENTED();
}

void Context::getTextureParameteriv(TextureID texture, GLenum pname, GLint *params)
{
    UNIMPLEMENTED();
}

void Context::getTextureSubImage(TextureID texture,
                                 GLint level,
                                 GLint xoffset,
                                 GLint yoffset,
                                 GLint zoffset,
                                 GLsizei width,
                                 GLsizei height,
                                 GLsizei depth,
                                 GLenum format,
                                 GLenum type,
                                 GLsizei bufSize,
                                 void *pixels)
{
    UNIMPLEMENTED();
}

void Context::getTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)
{
    UNIMPLEMENTED();
}

void Context::getTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param)
{
    UNIMPLEMENTED();
}

void Context::getTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
{
    UNIMPLEMENTED();
}

void Context::getVertexArrayIndexed64iv(VertexArrayID vaobj,
                                        GLuint index,
                                        GLenum pname,
                                        GLint64 *param)
{
    UNIMPLEMENTED();
}

void Context::getVertexArrayIndexediv(VertexArrayID vaobj, GLuint index, GLenum pname, GLint *param)
{
    UNIMPLEMENTED();
}

void Context::getVertexArrayiv(VertexArrayID vaobj, GLenum pname, GLint *param)
{
    UNIMPLEMENTED();
}

void Context::getnColorTable(GLenum target,
                             GLenum format,
                             GLenum type,
                             GLsizei bufSize,
                             void *table)
{
    UNIMPLEMENTED();
}

void Context::getnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels)
{
    UNIMPLEMENTED();
}

void Context::getnConvolutionFilter(GLenum target,
                                    GLenum format,
                                    GLenum type,
                                    GLsizei bufSize,
                                    void *image)
{
    UNIMPLEMENTED();
}

void Context::getnHistogram(GLenum target,
                            GLboolean reset,
                            GLenum format,
                            GLenum type,
                            GLsizei bufSize,
                            void *values)
{
    UNIMPLEMENTED();
}

void Context::getnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v)
{
    UNIMPLEMENTED();
}

void Context::getnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v)
{
    UNIMPLEMENTED();
}

void Context::getnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v)
{
    UNIMPLEMENTED();
}

void Context::getnMinmax(GLenum target,
                         GLboolean reset,
                         GLenum format,
                         GLenum type,
                         GLsizei bufSize,
                         void *values)
{
    UNIMPLEMENTED();
}

void Context::getnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values)
{
    UNIMPLEMENTED();
}

void Context::getnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values)
{
    UNIMPLEMENTED();
}

void Context::getnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values)
{
    UNIMPLEMENTED();
}

void Context::getnPolygonStipple(GLsizei bufSize, GLubyte *pattern)
{
    UNIMPLEMENTED();
}

void Context::getnSeparableFilter(GLenum target,
                                  GLenum format,
                                  GLenum type,
                                  GLsizei rowBufSize,
                                  void *row,
                                  GLsizei columnBufSize,
                                  void *column,
                                  void *span)
{
    UNIMPLEMENTED();
}

void Context::getnTexImage(GLenum target,
                           GLint level,
                           GLenum format,
                           GLenum type,
                           GLsizei bufSize,
                           void *pixels)
{
    UNIMPLEMENTED();
}

void Context::getnUniformdv(ShaderProgramID program,
                            GLint location,
                            GLsizei bufSize,
                            GLdouble *params)
{
    UNIMPLEMENTED();
}

void Context::getnUniformuiv(ShaderProgramID program,
                             GLint location,
                             GLsizei bufSize,
                             GLuint *params)
{
    UNIMPLEMENTED();
}

void Context::invalidateNamedFramebufferData(FramebufferID framebuffer,
                                             GLsizei numAttachments,
                                             const GLenum *attachments)
{
    UNIMPLEMENTED();
}

void Context::invalidateNamedFramebufferSubData(FramebufferID framebuffer,
                                                GLsizei numAttachments,
                                                const GLenum *attachments,
                                                GLint x,
                                                GLint y,
                                                GLsizei width,
                                                GLsizei height)
{
    UNIMPLEMENTED();
}

void *Context::mapNamedBuffer(BufferID buffer, GLenum access)
{
    UNIMPLEMENTED();
    return nullptr;
}

void *Context::mapNamedBufferRange(BufferID buffer,
                                   GLintptr offset,
                                   GLsizeiptr length,
                                   GLbitfield access)
{
    UNIMPLEMENTED();
    return nullptr;
}

void Context::namedBufferData(BufferID buffer, GLsizeiptr size, const void *data, GLenum usage)
{
    UNIMPLEMENTED();
}

void Context::namedBufferStorage(BufferID buffer,
                                 GLsizeiptr size,
                                 const void *data,
                                 GLbitfield flags)
{
    UNIMPLEMENTED();
}

void Context::namedBufferSubData(BufferID buffer,
                                 GLintptr offset,
                                 GLsizeiptr size,
                                 const void *data)
{
    UNIMPLEMENTED();
}

void Context::namedFramebufferDrawBuffer(FramebufferID framebuffer, GLenum buf)
{
    UNIMPLEMENTED();
}

void Context::namedFramebufferDrawBuffers(FramebufferID framebuffer, GLsizei n, const GLenum *bufs)
{
    UNIMPLEMENTED();
}

void Context::namedFramebufferParameteri(FramebufferID framebuffer, GLenum pname, GLint param)
{
    UNIMPLEMENTED();
}

void Context::namedFramebufferReadBuffer(FramebufferID framebuffer, GLenum src)
{
    UNIMPLEMENTED();
}

void Context::namedFramebufferRenderbuffer(FramebufferID framebuffer,
                                           GLenum attachment,
                                           GLenum renderbuffertarget,
                                           RenderbufferID renderbuffer)
{
    UNIMPLEMENTED();
}

void Context::namedFramebufferTexture(FramebufferID framebuffer,
                                      GLenum attachment,
                                      TextureID texture,
                                      GLint level)
{
    UNIMPLEMENTED();
}

void Context::namedFramebufferTextureLayer(FramebufferID framebuffer,
                                           GLenum attachment,
                                           TextureID texture,
                                           GLint level,
                                           GLint layer)
{
    UNIMPLEMENTED();
}

void Context::namedRenderbufferStorage(RenderbufferID renderbuffer,
                                       GLenum internalformat,
                                       GLsizei width,
                                       GLsizei height)
{
    UNIMPLEMENTED();
}

void Context::namedRenderbufferStorageMultisample(RenderbufferID renderbuffer,
                                                  GLsizei samples,
                                                  GLenum internalformat,
                                                  GLsizei width,
                                                  GLsizei height)
{
    UNIMPLEMENTED();
}

void Context::textureBarrier()
{
    UNIMPLEMENTED();
}

void Context::textureBuffer(TextureID texture, GLenum internalformat, BufferID buffer)
{
    UNIMPLEMENTED();
}

void Context::textureBufferRange(TextureID texture,
                                 GLenum internalformat,
                                 BufferID buffer,
                                 GLintptr offset,
                                 GLsizeiptr size)
{
    UNIMPLEMENTED();
}

void Context::textureParameterIiv(TextureID texture, GLenum pname, const GLint *params)
{
    UNIMPLEMENTED();
}

void Context::textureParameterIuiv(TextureID texture, GLenum pname, const GLuint *params)
{
    UNIMPLEMENTED();
}

void Context::textureParameterf(TextureID texture, GLenum pname, GLfloat param)
{
    UNIMPLEMENTED();
}

void Context::textureParameterfv(TextureID texture, GLenum pname, const GLfloat *param)
{
    UNIMPLEMENTED();
}

void Context::textureParameteri(TextureID texture, GLenum pname, GLint param)
{
    UNIMPLEMENTED();
}

void Context::textureParameteriv(TextureID texture, GLenum pname, const GLint *param)
{
    UNIMPLEMENTED();
}

void Context::textureStorage1D(TextureID texture,
                               GLsizei levels,
                               GLenum internalformat,
                               GLsizei width)
{
    UNIMPLEMENTED();
}

void Context::textureStorage2D(TextureID texture,
                               GLsizei levels,
                               GLenum internalformat,
                               GLsizei width,
                               GLsizei height)
{
    UNIMPLEMENTED();
}

void Context::textureStorage2DMultisample(TextureID texture,
                                          GLsizei samples,
                                          GLenum internalformat,
                                          GLsizei width,
                                          GLsizei height,
                                          GLboolean fixedsamplelocations)
{
    UNIMPLEMENTED();
}

void Context::textureStorage3D(TextureID texture,
                               GLsizei levels,
                               GLenum internalformat,
                               GLsizei width,
                               GLsizei height,
                               GLsizei depth)
{
    UNIMPLEMENTED();
}

void Context::textureStorage3DMultisample(TextureID texture,
                                          GLsizei samples,
                                          GLenum internalformat,
                                          GLsizei width,
                                          GLsizei height,
                                          GLsizei depth,
                                          GLboolean fixedsamplelocations)
{
    UNIMPLEMENTED();
}

void Context::textureSubImage1D(TextureID texture,
                                GLint level,
                                GLint xoffset,
                                GLsizei width,
                                GLenum format,
                                GLenum type,
                                const void *pixels)
{
    UNIMPLEMENTED();
}

void Context::textureSubImage2D(TextureID texture,
                                GLint level,
                                GLint xoffset,
                                GLint yoffset,
                                GLsizei width,
                                GLsizei height,
                                GLenum format,
                                GLenum type,
                                const void *pixels)
{
    UNIMPLEMENTED();
}

void Context::textureSubImage3D(TextureID texture,
                                GLint level,
                                GLint xoffset,
                                GLint yoffset,
                                GLint zoffset,
                                GLsizei width,
                                GLsizei height,
                                GLsizei depth,
                                GLenum format,
                                GLenum type,
                                const void *pixels)
{
    UNIMPLEMENTED();
}

void Context::transformFeedbackBufferBase(GLuint xfb, GLuint index, BufferID buffer)
{
    UNIMPLEMENTED();
}

void Context::transformFeedbackBufferRange(GLuint xfb,
                                           GLuint index,
                                           BufferID buffer,
                                           GLintptr offset,
                                           GLsizeiptr size)
{
    UNIMPLEMENTED();
}

GLboolean Context::unmapNamedBuffer(BufferID buffer)
{
    UNIMPLEMENTED();
    return false;
}

void Context::vertexArrayAttribBinding(VertexArrayID vaobj, GLuint attribindex, GLuint bindingindex)
{
    UNIMPLEMENTED();
}

void Context::vertexArrayAttribFormat(VertexArrayID vaobj,
                                      GLuint attribindex,
                                      GLint size,
                                      GLenum type,
                                      GLboolean normalized,
                                      GLuint relativeoffset)
{
    UNIMPLEMENTED();
}

void Context::vertexArrayAttribIFormat(VertexArrayID vaobj,
                                       GLuint attribindex,
                                       GLint size,
                                       GLenum type,
                                       GLuint relativeoffset)
{
    UNIMPLEMENTED();
}

void Context::vertexArrayAttribLFormat(VertexArrayID vaobj,
                                       GLuint attribindex,
                                       GLint size,
                                       GLenum type,
                                       GLuint relativeoffset)
{
    UNIMPLEMENTED();
}

void Context::vertexArrayBindingDivisor(VertexArrayID vaobj, GLuint bindingindex, GLuint divisor)
{
    UNIMPLEMENTED();
}

void Context::vertexArrayElementBuffer(VertexArrayID vaobj, BufferID buffer)
{
    UNIMPLEMENTED();
}

void Context::vertexArrayVertexBuffer(VertexArrayID vaobj,
                                      GLuint bindingindex,
                                      BufferID buffer,
                                      GLintptr offset,
                                      GLsizei stride)
{
    UNIMPLEMENTED();
}

void Context::vertexArrayVertexBuffers(VertexArrayID vaobj,
                                       GLuint first,
                                       GLsizei count,
                                       const BufferID *buffers,
                                       const GLintptr *offsets,
                                       const GLsizei *strides)
{
    UNIMPLEMENTED();
}

void Context::multiDrawArraysIndirectCount(GLenum mode,
                                           const void *indirect,
                                           GLintptr drawcount,
                                           GLsizei maxdrawcount,
                                           GLsizei stride)
{
    UNIMPLEMENTED();
}

void Context::multiDrawElementsIndirectCount(GLenum mode,
                                             GLenum type,
                                             const void *indirect,
                                             GLintptr drawcount,
                                             GLsizei maxdrawcount,
                                             GLsizei stride)
{
    UNIMPLEMENTED();
}

void Context::polygonOffsetClamp(GLfloat factor, GLfloat units, GLfloat clamp)
{
    UNIMPLEMENTED();
}

void Context::specializeShader(GLuint shader,
                               const GLchar *pEntryPoint,
                               GLuint numSpecializationConstants,
                               const GLuint *pConstantIndex,
                               const GLuint *pConstantValue)
{
    UNIMPLEMENTED();
}

}  // namespace gl
