// 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::colorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
{
    UNIMPLEMENTED();
}

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

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

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

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

GLboolean Context::isEnabledi(GLenum target, GLuint index)
{
    UNIMPLEMENTED();
    return false;
}

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::texBuffer(GLenum target, GLenum internalformat, BufferID buffer)
{
    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::getTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
{
    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::drawElementsBaseVertex(GLenum mode,
                                     GLsizei count,
                                     GLenum type,
                                     const void *indices,
                                     GLint basevertex)
{
    UNIMPLEMENTED();
}

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

void Context::drawRangeElementsBaseVertex(GLenum mode,
                                          GLuint start,
                                          GLuint end,
                                          GLsizei count,
                                          GLenum type,
                                          const void *indices,
                                          GLint basevertex)
{
    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::blendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
{
    UNIMPLEMENTED();
}

void Context::blendEquationi(GLuint buf, GLenum mode)
{
    UNIMPLEMENTED();
}

void Context::blendFuncSeparatei(GLuint buf,
                                 GLenum srcRGB,
                                 GLenum dstRGB,
                                 GLenum srcAlpha,
                                 GLenum dstAlpha)
{
    UNIMPLEMENTED();
}

void Context::blendFunci(GLuint buf, GLenum src, GLenum dst)
{
    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::minSampleShading(GLfloat value)
{
    UNIMPLEMENTED();
}

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

void Context::patchParameteri(GLenum pname, GLint value)
{
    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::copyImageSubData(GLuint srcName,
                               GLenum srcTarget,
                               GLint srcLevel,
                               GLint srcX,
                               GLint srcY,
                               GLint srcZ,
                               GLuint dstName,
                               GLenum dstTarget,
                               GLint dstLevel,
                               GLint dstX,
                               GLint dstY,
                               GLint dstZ,
                               GLsizei srcWidth,
                               GLsizei srcHeight,
                               GLsizei srcDepth)
{
    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::texBufferRange(GLenum target,
                             GLenum internalformat,
                             BufferID buffer,
                             GLintptr offset,
                             GLsizeiptr size)
{
    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
