// 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::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) const
{
    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(PrimitiveMode mode,
                                          const GLsizei *count,
                                          DrawElementsType 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, UniformLocation location, GLdouble *params)
{
    UNIMPLEMENTED();
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

void Context::uniformMatrix4x3dv(UniformLocation 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, UniformLocation location, GLdouble v0)
{
    UNIMPLEMENTED();
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

void Context::programUniformMatrix4x3dv(ShaderProgramID program,
                                        UniformLocation 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::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::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::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,
                            UniformLocation location,
                            GLsizei bufSize,
                            GLdouble *params)
{
    UNIMPLEMENTED();
}

void Context::getnUniformuiv(ShaderProgramID program,
                             UniformLocation 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
