/* WARNING: This is auto-generated file. Do not modify, since changes will
 * be lost! Modify the generating script instead.
 *
 * Generated from Khronos GL API description (gl.xml) revision 33312.
 */

void glwActiveShaderProgram (GLuint pipeline, GLuint program)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->activeShaderProgram(pipeline, program);
}

void glwActiveTexture (GLenum texture)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->activeTexture(texture);
}

void glwAttachShader (GLuint program, GLuint shader)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->attachShader(program, shader);
}

void glwBeginConditionalRender (GLuint id, GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->beginConditionalRender(id, mode);
}

void glwBeginQuery (GLenum target, GLuint id)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->beginQuery(target, id);
}

void glwBeginQueryIndexed (GLenum target, GLuint index, GLuint id)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->beginQueryIndexed(target, index, id);
}

void glwBeginTransformFeedback (GLenum primitiveMode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->beginTransformFeedback(primitiveMode);
}

void glwBindAttribLocation (GLuint program, GLuint index, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindAttribLocation(program, index, name);
}

void glwBindBuffer (GLenum target, GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindBuffer(target, buffer);
}

void glwBindBufferBase (GLenum target, GLuint index, GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindBufferBase(target, index, buffer);
}

void glwBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindBufferRange(target, index, buffer, offset, size);
}

void glwBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindBuffersBase(target, first, count, buffers);
}

void glwBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindBuffersRange(target, first, count, buffers, offsets, sizes);
}

void glwBindFragDataLocation (GLuint program, GLuint color, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindFragDataLocation(program, color, name);
}

void glwBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindFragDataLocationIndexed(program, colorNumber, index, name);
}

void glwBindFramebuffer (GLenum target, GLuint framebuffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindFramebuffer(target, framebuffer);
}

void glwBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindImageTexture(unit, texture, level, layered, layer, access, format);
}

void glwBindImageTextures (GLuint first, GLsizei count, const GLuint *textures)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindImageTextures(first, count, textures);
}

void glwBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindMultiTextureEXT(texunit, target, texture);
}

void glwBindProgramPipeline (GLuint pipeline)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindProgramPipeline(pipeline);
}

void glwBindRenderbuffer (GLenum target, GLuint renderbuffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindRenderbuffer(target, renderbuffer);
}

void glwBindSampler (GLuint unit, GLuint sampler)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindSampler(unit, sampler);
}

void glwBindSamplers (GLuint first, GLsizei count, const GLuint *samplers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindSamplers(first, count, samplers);
}

void glwBindTexture (GLenum target, GLuint texture)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindTexture(target, texture);
}

void glwBindTextureUnit (GLuint unit, GLuint texture)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindTextureUnit(unit, texture);
}

void glwBindTextures (GLuint first, GLsizei count, const GLuint *textures)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindTextures(first, count, textures);
}

void glwBindTransformFeedback (GLenum target, GLuint id)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindTransformFeedback(target, id);
}

void glwBindVertexArray (GLuint array)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindVertexArray(array);
}

void glwBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindVertexBuffer(bindingindex, buffer, offset, stride);
}

void glwBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bindVertexBuffers(first, count, buffers, offsets, strides);
}

void glwBlendBarrier (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendBarrier();
}

void glwBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendColor(red, green, blue, alpha);
}

void glwBlendEquation (GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendEquation(mode);
}

void glwBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendEquationSeparate(modeRGB, modeAlpha);
}

void glwBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendEquationSeparatei(buf, modeRGB, modeAlpha);
}

void glwBlendEquationi (GLuint buf, GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendEquationi(buf, mode);
}

void glwBlendFunc (GLenum sfactor, GLenum dfactor)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendFunc(sfactor, dfactor);
}

void glwBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
}

void glwBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
}

void glwBlendFunci (GLuint buf, GLenum src, GLenum dst)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blendFunci(buf, src, dst);
}

void glwBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
}

void glwBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->blitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
}

void glwBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bufferData(target, size, data, usage);
}

void glwBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bufferPageCommitmentARB(target, offset, size, commit);
}

void glwBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bufferStorage(target, size, data, flags);
}

void glwBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->bufferSubData(target, offset, size, data);
}

GLenum glwCheckFramebufferStatus (GLenum target)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLenum)0;
	return gl->checkFramebufferStatus(target);
}

GLenum glwCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLenum)0;
	return gl->checkNamedFramebufferStatus(framebuffer, target);
}

void glwClampColor (GLenum target, GLenum clamp)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clampColor(target, clamp);
}

void glwClear (GLbitfield mask)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clear(mask);
}

void glwClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearBufferData(target, internalformat, format, type, data);
}

void glwClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearBufferSubData(target, internalformat, offset, size, format, type, data);
}

void glwClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearBufferfi(buffer, drawbuffer, depth, stencil);
}

void glwClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearBufferfv(buffer, drawbuffer, value);
}

void glwClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearBufferiv(buffer, drawbuffer, value);
}

void glwClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearBufferuiv(buffer, drawbuffer, value);
}

void glwClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearColor(red, green, blue, alpha);
}

void glwClearDepth (GLdouble depth)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearDepth(depth);
}

void glwClearDepthf (GLfloat d)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearDepthf(d);
}

void glwClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearNamedBufferData(buffer, internalformat, format, type, data);
}

void glwClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data);
}

void glwClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil);
}

void glwClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value);
}

void glwClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value);
}

void glwClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value);
}

void glwClearStencil (GLint s)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearStencil(s);
}

void glwClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearTexImage(texture, level, format, type, data);
}

void glwClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
}

void glwClientAttribDefaultEXT (GLbitfield mask)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clientAttribDefaultEXT(mask);
}

GLenum glwClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLenum)0;
	return gl->clientWaitSync(sync, flags, timeout);
}

void glwClipControl (GLenum origin, GLenum depth)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->clipControl(origin, depth);
}

void glwColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->colorMask(red, green, blue, alpha);
}

void glwColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->colorMaski(index, r, g, b, a);
}

void glwCompileShader (GLuint shader)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compileShader(shader);
}

void glwCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, bits);
}

void glwCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, bits);
}

void glwCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits);
}

void glwCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, bits);
}

void glwCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits);
}

void glwCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
}

void glwCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
}

void glwCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
}

void glwCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
}

void glwCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTexImage3DOES(target, level, internalformat, width, height, depth, border, imageSize, data);
}

void glwCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
}

void glwCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
}

void glwCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
}

void glwCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
}

void glwCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, bits);
}

void glwCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, bits);
}

void glwCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, bits);
}

void glwCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data);
}

void glwCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits);
}

void glwCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data);
}

void glwCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits);
}

void glwCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
}

void glwCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->compressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
}

void glwCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
}

void glwCopyImageSubData (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)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
}

void glwCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border);
}

void glwCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border);
}

void glwCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width);
}

void glwCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height);
}

void glwCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height);
}

void glwCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);
}

void glwCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTexImage1D(target, level, internalformat, x, y, width, border);
}

void glwCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTexImage2D(target, level, internalformat, x, y, width, height, border);
}

void glwCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTexSubImage1D(target, level, xoffset, x, y, width);
}

void glwCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
}

void glwCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
}

void glwCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width, height);
}

void glwCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border);
}

void glwCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border);
}

void glwCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTextureSubImage1D(texture, level, xoffset, x, y, width);
}

void glwCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width);
}

void glwCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height);
}

void glwCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height);
}

void glwCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height);
}

void glwCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->copyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height);
}

void glwCreateBuffers (GLsizei n, GLuint *buffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createBuffers(n, buffers);
}

void glwCreateFramebuffers (GLsizei n, GLuint *framebuffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createFramebuffers(n, framebuffers);
}

GLuint glwCreateProgram (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLuint)0;
	return gl->createProgram();
}

void glwCreateProgramPipelines (GLsizei n, GLuint *pipelines)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createProgramPipelines(n, pipelines);
}

void glwCreateQueries (GLenum target, GLsizei n, GLuint *ids)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createQueries(target, n, ids);
}

void glwCreateRenderbuffers (GLsizei n, GLuint *renderbuffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createRenderbuffers(n, renderbuffers);
}

void glwCreateSamplers (GLsizei n, GLuint *samplers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createSamplers(n, samplers);
}

GLuint glwCreateShader (GLenum type)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLuint)0;
	return gl->createShader(type);
}

GLuint glwCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLuint)0;
	return gl->createShaderProgramv(type, count, strings);
}

void glwCreateTextures (GLenum target, GLsizei n, GLuint *textures)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createTextures(target, n, textures);
}

void glwCreateTransformFeedbacks (GLsizei n, GLuint *ids)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createTransformFeedbacks(n, ids);
}

void glwCreateVertexArrays (GLsizei n, GLuint *arrays)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->createVertexArrays(n, arrays);
}

void glwCullFace (GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->cullFace(mode);
}

void glwDebugMessageCallback (GLDEBUGPROC callback, const void *userParam)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->debugMessageCallback(callback, userParam);
}

void glwDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->debugMessageControl(source, type, severity, count, ids, enabled);
}

void glwDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->debugMessageInsert(source, type, id, severity, length, buf);
}

void glwDeleteBuffers (GLsizei n, const GLuint *buffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteBuffers(n, buffers);
}

void glwDeleteFramebuffers (GLsizei n, const GLuint *framebuffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteFramebuffers(n, framebuffers);
}

void glwDeleteProgram (GLuint program)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteProgram(program);
}

void glwDeleteProgramPipelines (GLsizei n, const GLuint *pipelines)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteProgramPipelines(n, pipelines);
}

void glwDeleteQueries (GLsizei n, const GLuint *ids)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteQueries(n, ids);
}

void glwDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteRenderbuffers(n, renderbuffers);
}

void glwDeleteSamplers (GLsizei count, const GLuint *samplers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteSamplers(count, samplers);
}

void glwDeleteShader (GLuint shader)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteShader(shader);
}

void glwDeleteSync (GLsync sync)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteSync(sync);
}

void glwDeleteTextures (GLsizei n, const GLuint *textures)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteTextures(n, textures);
}

void glwDeleteTransformFeedbacks (GLsizei n, const GLuint *ids)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteTransformFeedbacks(n, ids);
}

void glwDeleteVertexArrays (GLsizei n, const GLuint *arrays)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->deleteVertexArrays(n, arrays);
}

void glwDepthBoundsEXT (GLclampd zmin, GLclampd zmax)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthBoundsEXT(zmin, zmax);
}

void glwDepthFunc (GLenum func)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthFunc(func);
}

void glwDepthMask (GLboolean flag)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthMask(flag);
}

void glwDepthRange (GLdouble near, GLdouble far)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthRange(near, far);
}

void glwDepthRangeArrayfvOES (GLuint first, GLsizei count, const GLfloat *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthRangeArrayfvOES(first, count, v);
}

void glwDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthRangeArrayv(first, count, v);
}

void glwDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthRangeIndexed(index, n, f);
}

void glwDepthRangeIndexedfOES (GLuint index, GLfloat n, GLfloat f)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthRangeIndexedfOES(index, n, f);
}

void glwDepthRangef (GLfloat n, GLfloat f)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->depthRangef(n, f);
}

void glwDetachShader (GLuint program, GLuint shader)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->detachShader(program, shader);
}

void glwDisable (GLenum cap)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->disable(cap);
}

void glwDisableClientStateIndexedEXT (GLenum array, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->disableClientStateIndexedEXT(array, index);
}

void glwDisableClientStateiEXT (GLenum array, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->disableClientStateiEXT(array, index);
}

void glwDisableIndexedEXT (GLenum target, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->disableIndexedEXT(target, index);
}

void glwDisableVertexArrayAttrib (GLuint vaobj, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->disableVertexArrayAttrib(vaobj, index);
}

void glwDisableVertexArrayEXT (GLuint vaobj, GLenum array)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->disableVertexArrayEXT(vaobj, array);
}

void glwDisableVertexAttribArray (GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->disableVertexAttribArray(index);
}

void glwDisablei (GLenum target, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->disablei(target, index);
}

void glwDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->dispatchCompute(num_groups_x, num_groups_y, num_groups_z);
}

void glwDispatchComputeIndirect (GLintptr indirect)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->dispatchComputeIndirect(indirect);
}

void glwDrawArrays (GLenum mode, GLint first, GLsizei count)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawArrays(mode, first, count);
}

void glwDrawArraysIndirect (GLenum mode, const void *indirect)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawArraysIndirect(mode, indirect);
}

void glwDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawArraysInstanced(mode, first, count, instancecount);
}

void glwDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
}

void glwDrawBuffer (GLenum buf)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawBuffer(buf);
}

void glwDrawBuffers (GLsizei n, const GLenum *bufs)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawBuffers(n, bufs);
}

void glwDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawElements(mode, count, type, indices);
}

void glwDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawElementsBaseVertex(mode, count, type, indices, basevertex);
}

void glwDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawElementsIndirect(mode, type, indirect);
}

void glwDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawElementsInstanced(mode, count, type, indices, instancecount);
}

void glwDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
}

void glwDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
}

void glwDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
}

void glwDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawRangeElements(mode, start, end, count, type, indices);
}

void glwDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
}

void glwDrawTransformFeedback (GLenum mode, GLuint id)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawTransformFeedback(mode, id);
}

void glwDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawTransformFeedbackInstanced(mode, id, instancecount);
}

void glwDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawTransformFeedbackStream(mode, id, stream);
}

void glwDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->drawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
}

void glwEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->eglImageTargetRenderbufferStorageOES(target, image);
}

void glwEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->eglImageTargetTexture2DOES(target, image);
}

void glwEnable (GLenum cap)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->enable(cap);
}

void glwEnableClientStateIndexedEXT (GLenum array, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->enableClientStateIndexedEXT(array, index);
}

void glwEnableClientStateiEXT (GLenum array, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->enableClientStateiEXT(array, index);
}

void glwEnableIndexedEXT (GLenum target, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->enableIndexedEXT(target, index);
}

void glwEnableVertexArrayAttrib (GLuint vaobj, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->enableVertexArrayAttrib(vaobj, index);
}

void glwEnableVertexArrayEXT (GLuint vaobj, GLenum array)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->enableVertexArrayEXT(vaobj, array);
}

void glwEnableVertexAttribArray (GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->enableVertexAttribArray(index);
}

void glwEnablei (GLenum target, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->enablei(target, index);
}

void glwEndConditionalRender (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->endConditionalRender();
}

void glwEndQuery (GLenum target)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->endQuery(target);
}

void glwEndQueryIndexed (GLenum target, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->endQueryIndexed(target, index);
}

void glwEndTransformFeedback (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->endTransformFeedback();
}

GLsync glwFenceSync (GLenum condition, GLbitfield flags)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLsync)0;
	return gl->fenceSync(condition, flags);
}

void glwFinish (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->finish();
}

void glwFlush (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->flush();
}

void glwFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->flushMappedBufferRange(target, offset, length);
}

void glwFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->flushMappedNamedBufferRange(buffer, offset, length);
}

void glwFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferDrawBufferEXT(framebuffer, mode);
}

void glwFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferDrawBuffersEXT(framebuffer, n, bufs);
}

void glwFramebufferParameteri (GLenum target, GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferParameteri(target, pname, param);
}

void glwFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferReadBufferEXT(framebuffer, mode);
}

void glwFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
}

void glwFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferTexture(target, attachment, texture, level);
}

void glwFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferTexture1D(target, attachment, textarget, texture, level);
}

void glwFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferTexture2D(target, attachment, textarget, texture, level);
}

void glwFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
}

void glwFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset);
}

void glwFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->framebufferTextureLayer(target, attachment, texture, level, layer);
}

void glwFrontFace (GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->frontFace(mode);
}

void glwGenBuffers (GLsizei n, GLuint *buffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genBuffers(n, buffers);
}

void glwGenFramebuffers (GLsizei n, GLuint *framebuffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genFramebuffers(n, framebuffers);
}

void glwGenProgramPipelines (GLsizei n, GLuint *pipelines)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genProgramPipelines(n, pipelines);
}

void glwGenQueries (GLsizei n, GLuint *ids)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genQueries(n, ids);
}

void glwGenRenderbuffers (GLsizei n, GLuint *renderbuffers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genRenderbuffers(n, renderbuffers);
}

void glwGenSamplers (GLsizei count, GLuint *samplers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genSamplers(count, samplers);
}

void glwGenTextures (GLsizei n, GLuint *textures)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genTextures(n, textures);
}

void glwGenTransformFeedbacks (GLsizei n, GLuint *ids)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genTransformFeedbacks(n, ids);
}

void glwGenVertexArrays (GLsizei n, GLuint *arrays)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->genVertexArrays(n, arrays);
}

void glwGenerateMipmap (GLenum target)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->generateMipmap(target);
}

void glwGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->generateMultiTexMipmapEXT(texunit, target);
}

void glwGenerateTextureMipmap (GLuint texture)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->generateTextureMipmap(texture);
}

void glwGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
}

void glwGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveAttrib(program, index, bufSize, length, size, type, name);
}

void glwGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveSubroutineName(program, shadertype, index, bufsize, length, name);
}

void glwGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
}

void glwGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveSubroutineUniformiv(program, shadertype, index, pname, values);
}

void glwGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveUniform(program, index, bufSize, length, size, type, name);
}

void glwGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
}

void glwGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
}

void glwGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
}

void glwGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
}

void glwGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getAttachedShaders(program, maxCount, count, shaders);
}

GLint glwGetAttribLocation (GLuint program, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLint)0;
	return gl->getAttribLocation(program, name);
}

void glwGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getBooleanIndexedvEXT(target, index, data);
}

void glwGetBooleani_v (GLenum target, GLuint index, GLboolean *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getBooleani_v(target, index, data);
}

void glwGetBooleanv (GLenum pname, GLboolean *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getBooleanv(pname, data);
}

void glwGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getBufferParameteri64v(target, pname, params);
}

void glwGetBufferParameteriv (GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getBufferParameteriv(target, pname, params);
}

void glwGetBufferPointerv (GLenum target, GLenum pname, void **params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getBufferPointerv(target, pname, params);
}

void glwGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getBufferSubData(target, offset, size, data);
}

void glwGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getCompressedMultiTexImageEXT(texunit, target, lod, img);
}

void glwGetCompressedTexImage (GLenum target, GLint level, void *img)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getCompressedTexImage(target, level, img);
}

void glwGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getCompressedTextureImage(texture, level, bufSize, pixels);
}

void glwGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);
}

GLuint glwGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLuint)0;
	return gl->getDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
}

void glwGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getDoubleIndexedvEXT(target, index, data);
}

void glwGetDoublei_v (GLenum target, GLuint index, GLdouble *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getDoublei_v(target, index, data);
}

void glwGetDoublev (GLenum pname, GLdouble *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getDoublev(pname, data);
}

GLenum glwGetError (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return GL_INVALID_OPERATION;
	return gl->getError();
}

void glwGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getFloatIndexedvEXT(target, index, data);
}

void glwGetFloati_v (GLenum target, GLuint index, GLfloat *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getFloati_v(target, index, data);
}

void glwGetFloatv (GLenum pname, GLfloat *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getFloatv(pname, data);
}

GLint glwGetFragDataIndex (GLuint program, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLint)0;
	return gl->getFragDataIndex(program, name);
}

GLint glwGetFragDataLocation (GLuint program, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLint)0;
	return gl->getFragDataLocation(program, name);
}

void glwGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getFramebufferAttachmentParameteriv(target, attachment, pname, params);
}

void glwGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getFramebufferParameteriv(target, pname, params);
}

GLenum glwGetGraphicsResetStatus (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLenum)0;
	return gl->getGraphicsResetStatus();
}

void glwGetInteger64i_v (GLenum target, GLuint index, GLint64 *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getInteger64i_v(target, index, data);
}

void glwGetInteger64v (GLenum pname, GLint64 *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getInteger64v(pname, data);
}

void glwGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getIntegerIndexedvEXT(target, index, data);
}

void glwGetIntegeri_v (GLenum target, GLuint index, GLint *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getIntegeri_v(target, index, data);
}

void glwGetIntegerv (GLenum pname, GLint *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getIntegerv(pname, data);
}

void glwGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getInternalformatSampleivNV(target, internalformat, samples, pname, bufSize, params);
}

void glwGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getInternalformati64v(target, internalformat, pname, bufSize, params);
}

void glwGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getInternalformativ(target, internalformat, pname, bufSize, params);
}

void glwGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexEnvfvEXT(texunit, target, pname, params);
}

void glwGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexEnvivEXT(texunit, target, pname, params);
}

void glwGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexGendvEXT(texunit, coord, pname, params);
}

void glwGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexGenfvEXT(texunit, coord, pname, params);
}

void glwGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexGenivEXT(texunit, coord, pname, params);
}

void glwGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexImageEXT(texunit, target, level, format, type, pixels);
}

void glwGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexLevelParameterfvEXT(texunit, target, level, pname, params);
}

void glwGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexLevelParameterivEXT(texunit, target, level, pname, params);
}

void glwGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexParameterIivEXT(texunit, target, pname, params);
}

void glwGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexParameterIuivEXT(texunit, target, pname, params);
}

void glwGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexParameterfvEXT(texunit, target, pname, params);
}

void glwGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultiTexParameterivEXT(texunit, target, pname, params);
}

void glwGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getMultisamplefv(pname, index, val);
}

void glwGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedBufferParameteri64v(buffer, pname, params);
}

void glwGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedBufferParameteriv(buffer, pname, params);
}

void glwGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedBufferPointerv(buffer, pname, params);
}

void glwGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedBufferSubData(buffer, offset, size, data);
}

void glwGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
}

void glwGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedFramebufferParameteriv(framebuffer, pname, param);
}

void glwGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedProgramLocalParameterIivEXT(program, target, index, params);
}

void glwGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedProgramLocalParameterIuivEXT(program, target, index, params);
}

void glwGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedProgramLocalParameterdvEXT(program, target, index, params);
}

void glwGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedProgramLocalParameterfvEXT(program, target, index, params);
}

void glwGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedProgramStringEXT(program, target, pname, string);
}

void glwGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedProgramivEXT(program, target, pname, params);
}

void glwGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getNamedRenderbufferParameteriv(renderbuffer, pname, params);
}

void glwGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getObjectLabel(identifier, name, bufSize, length, label);
}

void glwGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getObjectPtrLabel(ptr, bufSize, length, label);
}

void glwGetPointerIndexedvEXT (GLenum target, GLuint index, void **data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getPointerIndexedvEXT(target, index, data);
}

void glwGetPointeri_vEXT (GLenum pname, GLuint index, void **params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getPointeri_vEXT(pname, index, params);
}

void glwGetPointerv (GLenum pname, void **params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getPointerv(pname, params);
}

void glwGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramBinary(program, bufSize, length, binaryFormat, binary);
}

void glwGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramInfoLog(program, bufSize, length, infoLog);
}

void glwGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramInterfaceiv(program, programInterface, pname, params);
}

void glwGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
}

void glwGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramPipelineiv(pipeline, pname, params);
}

GLuint glwGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLuint)0;
	return gl->getProgramResourceIndex(program, programInterface, name);
}

GLint glwGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLint)0;
	return gl->getProgramResourceLocation(program, programInterface, name);
}

GLint glwGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLint)0;
	return gl->getProgramResourceLocationIndex(program, programInterface, name);
}

void glwGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramResourceName(program, programInterface, index, bufSize, length, name);
}

void glwGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
}

void glwGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramStageiv(program, shadertype, pname, values);
}

void glwGetProgramiv (GLuint program, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getProgramiv(program, pname, params);
}

void glwGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryBufferObjecti64v(id, buffer, pname, offset);
}

void glwGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryBufferObjectiv(id, buffer, pname, offset);
}

void glwGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryBufferObjectui64v(id, buffer, pname, offset);
}

void glwGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryBufferObjectuiv(id, buffer, pname, offset);
}

void glwGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryIndexediv(target, index, pname, params);
}

void glwGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryObjecti64v(id, pname, params);
}

void glwGetQueryObjectiv (GLuint id, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryObjectiv(id, pname, params);
}

void glwGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryObjectui64v(id, pname, params);
}

void glwGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryObjectuiv(id, pname, params);
}

void glwGetQueryiv (GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getQueryiv(target, pname, params);
}

void glwGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getRenderbufferParameteriv(target, pname, params);
}

void glwGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getSamplerParameterIiv(sampler, pname, params);
}

void glwGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getSamplerParameterIuiv(sampler, pname, params);
}

void glwGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getSamplerParameterfv(sampler, pname, params);
}

void glwGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getSamplerParameteriv(sampler, pname, params);
}

void glwGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getShaderInfoLog(shader, bufSize, length, infoLog);
}

void glwGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getShaderPrecisionFormat(shadertype, precisiontype, range, precision);
}

void glwGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getShaderSource(shader, bufSize, length, source);
}

void glwGetShaderiv (GLuint shader, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getShaderiv(shader, pname, params);
}

const GLubyte * glwGetString (GLenum name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (const GLubyte *)0;
	return gl->getString(name);
}

const GLubyte * glwGetStringi (GLenum name, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (const GLubyte *)0;
	return gl->getStringi(name, index);
}

GLuint glwGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLuint)0;
	return gl->getSubroutineIndex(program, shadertype, name);
}

GLint glwGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLint)0;
	return gl->getSubroutineUniformLocation(program, shadertype, name);
}

void glwGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getSynciv(sync, pname, bufSize, length, values);
}

void glwGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTexImage(target, level, format, type, pixels);
}

void glwGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTexLevelParameterfv(target, level, pname, params);
}

void glwGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTexLevelParameteriv(target, level, pname, params);
}

void glwGetTexParameterIiv (GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTexParameterIiv(target, pname, params);
}

void glwGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTexParameterIuiv(target, pname, params);
}

void glwGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTexParameterfv(target, pname, params);
}

void glwGetTexParameteriv (GLenum target, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTexParameteriv(target, pname, params);
}

void glwGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTextureImage(texture, level, format, type, bufSize, pixels);
}

void glwGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTextureLevelParameterfv(texture, level, pname, params);
}

void glwGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTextureLevelParameteriv(texture, level, pname, params);
}

void glwGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTextureParameterIiv(texture, pname, params);
}

void glwGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTextureParameterIuiv(texture, pname, params);
}

void glwGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTextureParameterfv(texture, pname, params);
}

void glwGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTextureParameteriv(texture, pname, params);
}

void glwGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);
}

void glwGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
}

void glwGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTransformFeedbacki64_v(xfb, pname, index, param);
}

void glwGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTransformFeedbacki_v(xfb, pname, index, param);
}

void glwGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getTransformFeedbackiv(xfb, pname, param);
}

GLuint glwGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLuint)0;
	return gl->getUniformBlockIndex(program, uniformBlockName);
}

void glwGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getUniformIndices(program, uniformCount, uniformNames, uniformIndices);
}

GLint glwGetUniformLocation (GLuint program, const GLchar *name)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLint)0;
	return gl->getUniformLocation(program, name);
}

void glwGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getUniformSubroutineuiv(shadertype, location, params);
}

void glwGetUniformdv (GLuint program, GLint location, GLdouble *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getUniformdv(program, location, params);
}

void glwGetUniformfv (GLuint program, GLint location, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getUniformfv(program, location, params);
}

void glwGetUniformiv (GLuint program, GLint location, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getUniformiv(program, location, params);
}

void glwGetUniformuiv (GLuint program, GLint location, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getUniformuiv(program, location, params);
}

void glwGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexArrayIndexed64iv(vaobj, index, pname, param);
}

void glwGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexArrayIndexediv(vaobj, index, pname, param);
}

void glwGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexArrayIntegeri_vEXT(vaobj, index, pname, param);
}

void glwGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexArrayIntegervEXT(vaobj, pname, param);
}

void glwGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexArrayPointeri_vEXT(vaobj, index, pname, param);
}

void glwGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexArrayPointervEXT(vaobj, pname, param);
}

void glwGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexArrayiv(vaobj, pname, param);
}

void glwGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexAttribIiv(index, pname, params);
}

void glwGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexAttribIuiv(index, pname, params);
}

void glwGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexAttribLdv(index, pname, params);
}

void glwGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexAttribPointerv(index, pname, pointer);
}

void glwGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexAttribdv(index, pname, params);
}

void glwGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexAttribfv(index, pname, params);
}

void glwGetVertexAttribiv (GLuint index, GLenum pname, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getVertexAttribiv(index, pname, params);
}

void glwGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getnCompressedTexImage(target, lod, bufSize, pixels);
}

void glwGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getnTexImage(target, level, format, type, bufSize, pixels);
}

void glwGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getnUniformdv(program, location, bufSize, params);
}

void glwGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getnUniformfv(program, location, bufSize, params);
}

void glwGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getnUniformiv(program, location, bufSize, params);
}

void glwGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->getnUniformuiv(program, location, bufSize, params);
}

void glwHint (GLenum target, GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->hint(target, mode);
}

void glwInsertEventMarkerEXT (GLsizei length, const GLchar *marker)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->insertEventMarkerEXT(length, marker);
}

void glwInvalidateBufferData (GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->invalidateBufferData(buffer);
}

void glwInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->invalidateBufferSubData(buffer, offset, length);
}

void glwInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->invalidateFramebuffer(target, numAttachments, attachments);
}

void glwInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->invalidateNamedFramebufferData(framebuffer, numAttachments, attachments);
}

void glwInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->invalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height);
}

void glwInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->invalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
}

void glwInvalidateTexImage (GLuint texture, GLint level)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->invalidateTexImage(texture, level);
}

void glwInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->invalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
}

GLboolean glwIsBuffer (GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isBuffer(buffer);
}

GLboolean glwIsEnabled (GLenum cap)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isEnabled(cap);
}

GLboolean glwIsEnabledIndexedEXT (GLenum target, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isEnabledIndexedEXT(target, index);
}

GLboolean glwIsEnabledi (GLenum target, GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isEnabledi(target, index);
}

GLboolean glwIsFramebuffer (GLuint framebuffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isFramebuffer(framebuffer);
}

GLboolean glwIsProgram (GLuint program)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isProgram(program);
}

GLboolean glwIsProgramPipeline (GLuint pipeline)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isProgramPipeline(pipeline);
}

GLboolean glwIsQuery (GLuint id)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isQuery(id);
}

GLboolean glwIsRenderbuffer (GLuint renderbuffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isRenderbuffer(renderbuffer);
}

GLboolean glwIsSampler (GLuint sampler)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isSampler(sampler);
}

GLboolean glwIsShader (GLuint shader)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isShader(shader);
}

GLboolean glwIsSync (GLsync sync)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isSync(sync);
}

GLboolean glwIsTexture (GLuint texture)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isTexture(texture);
}

GLboolean glwIsTransformFeedback (GLuint id)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isTransformFeedback(id);
}

GLboolean glwIsVertexArray (GLuint array)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->isVertexArray(array);
}

void glwLineWidth (GLfloat width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->lineWidth(width);
}

void glwLinkProgram (GLuint program)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->linkProgram(program);
}

void glwLogicOp (GLenum opcode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->logicOp(opcode);
}

void * glwMapBuffer (GLenum target, GLenum access)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (void *)0;
	return gl->mapBuffer(target, access);
}

void * glwMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (void *)0;
	return gl->mapBufferRange(target, offset, length, access);
}

void * glwMapNamedBuffer (GLuint buffer, GLenum access)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (void *)0;
	return gl->mapNamedBuffer(buffer, access);
}

void * glwMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (void *)0;
	return gl->mapNamedBufferRange(buffer, offset, length, access);
}

void glwMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixFrustumEXT(mode, left, right, bottom, top, zNear, zFar);
}

void glwMatrixLoadIdentityEXT (GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixLoadIdentityEXT(mode);
}

void glwMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixLoadTransposedEXT(mode, m);
}

void glwMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixLoadTransposefEXT(mode, m);
}

void glwMatrixLoaddEXT (GLenum mode, const GLdouble *m)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixLoaddEXT(mode, m);
}

void glwMatrixLoadfEXT (GLenum mode, const GLfloat *m)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixLoadfEXT(mode, m);
}

void glwMatrixMultTransposedEXT (GLenum mode, const GLdouble *m)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixMultTransposedEXT(mode, m);
}

void glwMatrixMultTransposefEXT (GLenum mode, const GLfloat *m)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixMultTransposefEXT(mode, m);
}

void glwMatrixMultdEXT (GLenum mode, const GLdouble *m)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixMultdEXT(mode, m);
}

void glwMatrixMultfEXT (GLenum mode, const GLfloat *m)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixMultfEXT(mode, m);
}

void glwMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixOrthoEXT(mode, left, right, bottom, top, zNear, zFar);
}

void glwMatrixPopEXT (GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixPopEXT(mode);
}

void glwMatrixPushEXT (GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixPushEXT(mode);
}

void glwMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixRotatedEXT(mode, angle, x, y, z);
}

void glwMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixRotatefEXT(mode, angle, x, y, z);
}

void glwMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixScaledEXT(mode, x, y, z);
}

void glwMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixScalefEXT(mode, x, y, z);
}

void glwMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixTranslatedEXT(mode, x, y, z);
}

void glwMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->matrixTranslatefEXT(mode, x, y, z);
}

void glwMaxShaderCompilerThreadsARB (GLuint count)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->maxShaderCompilerThreadsARB(count);
}

void glwMemoryBarrier (GLbitfield barriers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->memoryBarrier(barriers);
}

void glwMemoryBarrierByRegion (GLbitfield barriers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->memoryBarrierByRegion(barriers);
}

void glwMinSampleShading (GLfloat value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->minSampleShading(value);
}

void glwMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiDrawArrays(mode, first, count, drawcount);
}

void glwMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiDrawArraysIndirect(mode, indirect, drawcount, stride);
}

void glwMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiDrawElements(mode, count, type, indices, drawcount);
}

void glwMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
}

void glwMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
}

void glwMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexBufferEXT(texunit, target, internalformat, buffer);
}

void glwMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexCoordPointerEXT(texunit, size, type, stride, pointer);
}

void glwMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexEnvfEXT(texunit, target, pname, param);
}

void glwMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexEnvfvEXT(texunit, target, pname, params);
}

void glwMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexEnviEXT(texunit, target, pname, param);
}

void glwMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexEnvivEXT(texunit, target, pname, params);
}

void glwMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexGendEXT(texunit, coord, pname, param);
}

void glwMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexGendvEXT(texunit, coord, pname, params);
}

void glwMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexGenfEXT(texunit, coord, pname, param);
}

void glwMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexGenfvEXT(texunit, coord, pname, params);
}

void glwMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexGeniEXT(texunit, coord, pname, param);
}

void glwMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexGenivEXT(texunit, coord, pname, params);
}

void glwMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels);
}

void glwMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels);
}

void glwMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels);
}

void glwMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexParameterIivEXT(texunit, target, pname, params);
}

void glwMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexParameterIuivEXT(texunit, target, pname, params);
}

void glwMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexParameterfEXT(texunit, target, pname, param);
}

void glwMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexParameterfvEXT(texunit, target, pname, params);
}

void glwMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexParameteriEXT(texunit, target, pname, param);
}

void glwMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexParameterivEXT(texunit, target, pname, params);
}

void glwMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexRenderbufferEXT(texunit, target, renderbuffer);
}

void glwMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels);
}

void glwMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels);
}

void glwMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->multiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
}

void glwNamedBufferData (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedBufferData(buffer, size, data, usage);
}

void glwNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedBufferPageCommitmentARB(buffer, offset, size, commit);
}

void glwNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedBufferPageCommitmentEXT(buffer, offset, size, commit);
}

void glwNamedBufferStorage (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedBufferStorage(buffer, size, data, flags);
}

void glwNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedBufferSubData(buffer, offset, size, data);
}

void glwNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedCopyBufferSubDataEXT(readBuffer, writeBuffer, readOffset, writeOffset, size);
}

void glwNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferDrawBuffer(framebuffer, buf);
}

void glwNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferDrawBuffers(framebuffer, n, bufs);
}

void glwNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferParameteri(framebuffer, pname, param);
}

void glwNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferReadBuffer(framebuffer, src);
}

void glwNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer);
}

void glwNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferTexture(framebuffer, attachment, texture, level);
}

void glwNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level);
}

void glwNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level);
}

void glwNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset);
}

void glwNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face);
}

void glwNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer);
}

void glwNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameter4dEXT(program, target, index, x, y, z, w);
}

void glwNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameter4dvEXT(program, target, index, params);
}

void glwNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameter4fEXT(program, target, index, x, y, z, w);
}

void glwNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameter4fvEXT(program, target, index, params);
}

void glwNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w);
}

void glwNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameterI4ivEXT(program, target, index, params);
}

void glwNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w);
}

void glwNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameterI4uivEXT(program, target, index, params);
}

void glwNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParameters4fvEXT(program, target, index, count, params);
}

void glwNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParametersI4ivEXT(program, target, index, count, params);
}

void glwNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramLocalParametersI4uivEXT(program, target, index, count, params);
}

void glwNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedProgramStringEXT(program, target, format, len, string);
}

void glwNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedRenderbufferStorage(renderbuffer, internalformat, width, height);
}

void glwNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height);
}

void glwNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->namedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height);
}

void glwObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->objectLabel(identifier, name, length, label);
}

void glwObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->objectPtrLabel(ptr, length, label);
}

void glwPatchParameterfv (GLenum pname, const GLfloat *values)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->patchParameterfv(pname, values);
}

void glwPatchParameteri (GLenum pname, GLint value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->patchParameteri(pname, value);
}

void glwPauseTransformFeedback (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pauseTransformFeedback();
}

void glwPixelStoref (GLenum pname, GLfloat param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pixelStoref(pname, param);
}

void glwPixelStorei (GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pixelStorei(pname, param);
}

void glwPointParameterf (GLenum pname, GLfloat param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pointParameterf(pname, param);
}

void glwPointParameterfv (GLenum pname, const GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pointParameterfv(pname, params);
}

void glwPointParameteri (GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pointParameteri(pname, param);
}

void glwPointParameteriv (GLenum pname, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pointParameteriv(pname, params);
}

void glwPointSize (GLfloat size)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pointSize(size);
}

void glwPolygonMode (GLenum face, GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->polygonMode(face, mode);
}

void glwPolygonOffset (GLfloat factor, GLfloat units)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->polygonOffset(factor, units);
}

void glwPopDebugGroup (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->popDebugGroup();
}

void glwPopGroupMarkerEXT (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->popGroupMarkerEXT();
}

void glwPrimitiveBoundingBox (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->primitiveBoundingBox(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW);
}

void glwPrimitiveRestartIndex (GLuint index)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->primitiveRestartIndex(index);
}

void glwProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programBinary(program, binaryFormat, binary, length);
}

void glwProgramParameteri (GLuint program, GLenum pname, GLint value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programParameteri(program, pname, value);
}

void glwProgramUniform1d (GLuint program, GLint location, GLdouble v0)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform1d(program, location, v0);
}

void glwProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform1dv(program, location, count, value);
}

void glwProgramUniform1f (GLuint program, GLint location, GLfloat v0)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform1f(program, location, v0);
}

void glwProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform1fv(program, location, count, value);
}

void glwProgramUniform1i (GLuint program, GLint location, GLint v0)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform1i(program, location, v0);
}

void glwProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform1iv(program, location, count, value);
}

void glwProgramUniform1ui (GLuint program, GLint location, GLuint v0)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform1ui(program, location, v0);
}

void glwProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform1uiv(program, location, count, value);
}

void glwProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform2d(program, location, v0, v1);
}

void glwProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform2dv(program, location, count, value);
}

void glwProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform2f(program, location, v0, v1);
}

void glwProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform2fv(program, location, count, value);
}

void glwProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform2i(program, location, v0, v1);
}

void glwProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform2iv(program, location, count, value);
}

void glwProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform2ui(program, location, v0, v1);
}

void glwProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform2uiv(program, location, count, value);
}

void glwProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform3d(program, location, v0, v1, v2);
}

void glwProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform3dv(program, location, count, value);
}

void glwProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform3f(program, location, v0, v1, v2);
}

void glwProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform3fv(program, location, count, value);
}

void glwProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform3i(program, location, v0, v1, v2);
}

void glwProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform3iv(program, location, count, value);
}

void glwProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform3ui(program, location, v0, v1, v2);
}

void glwProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform3uiv(program, location, count, value);
}

void glwProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform4d(program, location, v0, v1, v2, v3);
}

void glwProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform4dv(program, location, count, value);
}

void glwProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform4f(program, location, v0, v1, v2, v3);
}

void glwProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform4fv(program, location, count, value);
}

void glwProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform4i(program, location, v0, v1, v2, v3);
}

void glwProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform4iv(program, location, count, value);
}

void glwProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform4ui(program, location, v0, v1, v2, v3);
}

void glwProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniform4uiv(program, location, count, value);
}

void glwProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix2dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix2fv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix2x3dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix2x3fv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix2x4dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix2x4fv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix3dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix3fv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix3x2dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix3x2fv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix3x4dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix3x4fv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix4dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix4fv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix4x2dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix4x2fv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix4x3dv(program, location, count, transpose, value);
}

void glwProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->programUniformMatrix4x3fv(program, location, count, transpose, value);
}

void glwProvokingVertex (GLenum mode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->provokingVertex(mode);
}

void glwPushClientAttribDefaultEXT (GLbitfield mask)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pushClientAttribDefaultEXT(mask);
}

void glwPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pushDebugGroup(source, id, length, message);
}

void glwPushGroupMarkerEXT (GLsizei length, const GLchar *marker)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->pushGroupMarkerEXT(length, marker);
}

void glwQueryCounter (GLuint id, GLenum target)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->queryCounter(id, target);
}

void glwReadBuffer (GLenum src)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->readBuffer(src);
}

void glwReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->readPixels(x, y, width, height, format, type, pixels);
}

void glwReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->readnPixels(x, y, width, height, format, type, bufSize, data);
}

void glwReleaseShaderCompiler (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->releaseShaderCompiler();
}

void glwRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->renderbufferStorage(target, internalformat, width, height);
}

void glwRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->renderbufferStorageMultisample(target, samples, internalformat, width, height);
}

void glwResumeTransformFeedback (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->resumeTransformFeedback();
}

void glwSampleCoverage (GLfloat value, GLboolean invert)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->sampleCoverage(value, invert);
}

void glwSampleMaski (GLuint maskNumber, GLbitfield mask)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->sampleMaski(maskNumber, mask);
}

void glwSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->samplerParameterIiv(sampler, pname, param);
}

void glwSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->samplerParameterIuiv(sampler, pname, param);
}

void glwSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->samplerParameterf(sampler, pname, param);
}

void glwSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->samplerParameterfv(sampler, pname, param);
}

void glwSamplerParameteri (GLuint sampler, GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->samplerParameteri(sampler, pname, param);
}

void glwSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->samplerParameteriv(sampler, pname, param);
}

void glwScissor (GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->scissor(x, y, width, height);
}

void glwScissorArrayv (GLuint first, GLsizei count, const GLint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->scissorArrayv(first, count, v);
}

void glwScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->scissorIndexed(index, left, bottom, width, height);
}

void glwScissorIndexedv (GLuint index, const GLint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->scissorIndexedv(index, v);
}

void glwShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->shaderBinary(count, shaders, binaryformat, binary, length);
}

void glwShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->shaderSource(shader, count, string, length);
}

void glwShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->shaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
}

void glwStencilFunc (GLenum func, GLint ref, GLuint mask)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->stencilFunc(func, ref, mask);
}

void glwStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->stencilFuncSeparate(face, func, ref, mask);
}

void glwStencilMask (GLuint mask)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->stencilMask(mask);
}

void glwStencilMaskSeparate (GLenum face, GLuint mask)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->stencilMaskSeparate(face, mask);
}

void glwStencilOp (GLenum fail, GLenum zfail, GLenum zpass)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->stencilOp(fail, zfail, zpass);
}

void glwStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->stencilOpSeparate(face, sfail, dpfail, dppass);
}

void glwTexBuffer (GLenum target, GLenum internalformat, GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texBuffer(target, internalformat, buffer);
}

void glwTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texBufferRange(target, internalformat, buffer, offset, size);
}

void glwTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texImage1D(target, level, internalformat, width, border, format, type, pixels);
}

void glwTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
}

void glwTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
}

void glwTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
}

void glwTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
}

void glwTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texImage3DOES(target, level, internalformat, width, height, depth, border, format, type, pixels);
}

void glwTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height, depth, commit);
}

void glwTexParameterIiv (GLenum target, GLenum pname, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texParameterIiv(target, pname, params);
}

void glwTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texParameterIuiv(target, pname, params);
}

void glwTexParameterf (GLenum target, GLenum pname, GLfloat param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texParameterf(target, pname, param);
}

void glwTexParameterfv (GLenum target, GLenum pname, const GLfloat *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texParameterfv(target, pname, params);
}

void glwTexParameteri (GLenum target, GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texParameteri(target, pname, param);
}

void glwTexParameteriv (GLenum target, GLenum pname, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texParameteriv(target, pname, params);
}

void glwTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texStorage1D(target, levels, internalformat, width);
}

void glwTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texStorage1DEXT(target, levels, internalformat, width);
}

void glwTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texStorage2D(target, levels, internalformat, width, height);
}

void glwTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texStorage2DEXT(target, levels, internalformat, width, height);
}

void glwTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
}

void glwTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texStorage3D(target, levels, internalformat, width, height, depth);
}

void glwTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texStorage3DEXT(target, levels, internalformat, width, height, depth);
}

void glwTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
}

void glwTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texSubImage1D(target, level, xoffset, width, format, type, pixels);
}

void glwTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
}

void glwTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
}

void glwTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
}

void glwTextureBarrier (void)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureBarrier();
}

void glwTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureBuffer(texture, internalformat, buffer);
}

void glwTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureBufferRange(texture, internalformat, buffer, offset, size);
}

void glwTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels);
}

void glwTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels);
}

void glwTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels);
}

void glwTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->texturePageCommitmentEXT(texture, level, xoffset, yoffset, zoffset, width, height, depth, commit);
}

void glwTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureParameterIiv(texture, pname, params);
}

void glwTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureParameterIuiv(texture, pname, params);
}

void glwTextureParameterf (GLuint texture, GLenum pname, GLfloat param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureParameterf(texture, pname, param);
}

void glwTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureParameterfv(texture, pname, param);
}

void glwTextureParameteri (GLuint texture, GLenum pname, GLint param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureParameteri(texture, pname, param);
}

void glwTextureParameteriv (GLuint texture, GLenum pname, const GLint *param)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureParameteriv(texture, pname, param);
}

void glwTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureRenderbufferEXT(texture, target, renderbuffer);
}

void glwTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureStorage1D(texture, levels, internalformat, width);
}

void glwTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureStorage1DEXT(texture, target, levels, internalformat, width);
}

void glwTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureStorage2D(texture, levels, internalformat, width, height);
}

void glwTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureStorage2DEXT(texture, target, levels, internalformat, width, height);
}

void glwTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations);
}

void glwTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureStorage3D(texture, levels, internalformat, width, height, depth);
}

void glwTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureStorage3DEXT(texture, target, levels, internalformat, width, height, depth);
}

void glwTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations);
}

void glwTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureSubImage1D(texture, level, xoffset, width, format, type, pixels);
}

void glwTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels);
}

void glwTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels);
}

void glwTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
}

void glwTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
}

void glwTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
}

void glwTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->textureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
}

void glwTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->transformFeedbackBufferBase(xfb, index, buffer);
}

void glwTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->transformFeedbackBufferRange(xfb, index, buffer, offset, size);
}

void glwTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->transformFeedbackVaryings(program, count, varyings, bufferMode);
}

void glwUniform1d (GLint location, GLdouble x)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform1d(location, x);
}

void glwUniform1dv (GLint location, GLsizei count, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform1dv(location, count, value);
}

void glwUniform1f (GLint location, GLfloat v0)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform1f(location, v0);
}

void glwUniform1fv (GLint location, GLsizei count, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform1fv(location, count, value);
}

void glwUniform1i (GLint location, GLint v0)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform1i(location, v0);
}

void glwUniform1iv (GLint location, GLsizei count, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform1iv(location, count, value);
}

void glwUniform1ui (GLint location, GLuint v0)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform1ui(location, v0);
}

void glwUniform1uiv (GLint location, GLsizei count, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform1uiv(location, count, value);
}

void glwUniform2d (GLint location, GLdouble x, GLdouble y)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform2d(location, x, y);
}

void glwUniform2dv (GLint location, GLsizei count, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform2dv(location, count, value);
}

void glwUniform2f (GLint location, GLfloat v0, GLfloat v1)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform2f(location, v0, v1);
}

void glwUniform2fv (GLint location, GLsizei count, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform2fv(location, count, value);
}

void glwUniform2i (GLint location, GLint v0, GLint v1)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform2i(location, v0, v1);
}

void glwUniform2iv (GLint location, GLsizei count, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform2iv(location, count, value);
}

void glwUniform2ui (GLint location, GLuint v0, GLuint v1)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform2ui(location, v0, v1);
}

void glwUniform2uiv (GLint location, GLsizei count, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform2uiv(location, count, value);
}

void glwUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform3d(location, x, y, z);
}

void glwUniform3dv (GLint location, GLsizei count, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform3dv(location, count, value);
}

void glwUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform3f(location, v0, v1, v2);
}

void glwUniform3fv (GLint location, GLsizei count, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform3fv(location, count, value);
}

void glwUniform3i (GLint location, GLint v0, GLint v1, GLint v2)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform3i(location, v0, v1, v2);
}

void glwUniform3iv (GLint location, GLsizei count, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform3iv(location, count, value);
}

void glwUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform3ui(location, v0, v1, v2);
}

void glwUniform3uiv (GLint location, GLsizei count, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform3uiv(location, count, value);
}

void glwUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform4d(location, x, y, z, w);
}

void glwUniform4dv (GLint location, GLsizei count, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform4dv(location, count, value);
}

void glwUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform4f(location, v0, v1, v2, v3);
}

void glwUniform4fv (GLint location, GLsizei count, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform4fv(location, count, value);
}

void glwUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform4i(location, v0, v1, v2, v3);
}

void glwUniform4iv (GLint location, GLsizei count, const GLint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform4iv(location, count, value);
}

void glwUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform4ui(location, v0, v1, v2, v3);
}

void glwUniform4uiv (GLint location, GLsizei count, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniform4uiv(location, count, value);
}

void glwUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
}

void glwUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix2dv(location, count, transpose, value);
}

void glwUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix2fv(location, count, transpose, value);
}

void glwUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix2x3dv(location, count, transpose, value);
}

void glwUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix2x3fv(location, count, transpose, value);
}

void glwUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix2x4dv(location, count, transpose, value);
}

void glwUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix2x4fv(location, count, transpose, value);
}

void glwUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix3dv(location, count, transpose, value);
}

void glwUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix3fv(location, count, transpose, value);
}

void glwUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix3x2dv(location, count, transpose, value);
}

void glwUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix3x2fv(location, count, transpose, value);
}

void glwUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix3x4dv(location, count, transpose, value);
}

void glwUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix3x4fv(location, count, transpose, value);
}

void glwUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix4dv(location, count, transpose, value);
}

void glwUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix4fv(location, count, transpose, value);
}

void glwUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix4x2dv(location, count, transpose, value);
}

void glwUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix4x2fv(location, count, transpose, value);
}

void glwUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix4x3dv(location, count, transpose, value);
}

void glwUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformMatrix4x3fv(location, count, transpose, value);
}

void glwUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->uniformSubroutinesuiv(shadertype, count, indices);
}

GLboolean glwUnmapBuffer (GLenum target)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->unmapBuffer(target);
}

GLboolean glwUnmapNamedBuffer (GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return (GLboolean)0;
	return gl->unmapNamedBuffer(buffer);
}

void glwUseProgram (GLuint program)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->useProgram(program);
}

void glwUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->useProgramStages(pipeline, stages, program);
}

void glwValidateProgram (GLuint program)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->validateProgram(program);
}

void glwValidateProgramPipeline (GLuint pipeline)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->validateProgramPipeline(pipeline);
}

void glwVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayAttribBinding(vaobj, attribindex, bindingindex);
}

void glwVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset);
}

void glwVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset);
}

void glwVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset);
}

void glwVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayBindVertexBufferEXT(vaobj, bindingindex, buffer, offset, stride);
}

void glwVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayBindingDivisor(vaobj, bindingindex, divisor);
}

void glwVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayColorOffsetEXT(vaobj, buffer, size, type, stride, offset);
}

void glwVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayEdgeFlagOffsetEXT(vaobj, buffer, stride, offset);
}

void glwVertexArrayElementBuffer (GLuint vaobj, GLuint buffer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayElementBuffer(vaobj, buffer);
}

void glwVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayFogCoordOffsetEXT(vaobj, buffer, type, stride, offset);
}

void glwVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayIndexOffsetEXT(vaobj, buffer, type, stride, offset);
}

void glwVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayMultiTexCoordOffsetEXT(vaobj, buffer, texunit, size, type, stride, offset);
}

void glwVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayNormalOffsetEXT(vaobj, buffer, type, stride, offset);
}

void glwVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArraySecondaryColorOffsetEXT(vaobj, buffer, size, type, stride, offset);
}

void glwVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayTexCoordOffsetEXT(vaobj, buffer, size, type, stride, offset);
}

void glwVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexAttribBindingEXT(vaobj, attribindex, bindingindex);
}

void glwVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexAttribDivisorEXT(vaobj, index, divisor);
}

void glwVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexAttribFormatEXT(vaobj, attribindex, size, type, normalized, relativeoffset);
}

void glwVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexAttribIFormatEXT(vaobj, attribindex, size, type, relativeoffset);
}

void glwVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexAttribIOffsetEXT(vaobj, buffer, index, size, type, stride, offset);
}

void glwVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexAttribLFormatEXT(vaobj, attribindex, size, type, relativeoffset);
}

void glwVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, offset);
}

void glwVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexAttribOffsetEXT(vaobj, buffer, index, size, type, normalized, stride, offset);
}

void glwVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexBindingDivisorEXT(vaobj, bindingindex, divisor);
}

void glwVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride);
}

void glwVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides);
}

void glwVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexArrayVertexOffsetEXT(vaobj, buffer, size, type, stride, offset);
}

void glwVertexAttrib1d (GLuint index, GLdouble x)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib1d(index, x);
}

void glwVertexAttrib1dv (GLuint index, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib1dv(index, v);
}

void glwVertexAttrib1f (GLuint index, GLfloat x)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib1f(index, x);
}

void glwVertexAttrib1fv (GLuint index, const GLfloat *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib1fv(index, v);
}

void glwVertexAttrib1s (GLuint index, GLshort x)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib1s(index, x);
}

void glwVertexAttrib1sv (GLuint index, const GLshort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib1sv(index, v);
}

void glwVertexAttrib2d (GLuint index, GLdouble x, GLdouble y)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib2d(index, x, y);
}

void glwVertexAttrib2dv (GLuint index, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib2dv(index, v);
}

void glwVertexAttrib2f (GLuint index, GLfloat x, GLfloat y)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib2f(index, x, y);
}

void glwVertexAttrib2fv (GLuint index, const GLfloat *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib2fv(index, v);
}

void glwVertexAttrib2s (GLuint index, GLshort x, GLshort y)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib2s(index, x, y);
}

void glwVertexAttrib2sv (GLuint index, const GLshort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib2sv(index, v);
}

void glwVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib3d(index, x, y, z);
}

void glwVertexAttrib3dv (GLuint index, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib3dv(index, v);
}

void glwVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib3f(index, x, y, z);
}

void glwVertexAttrib3fv (GLuint index, const GLfloat *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib3fv(index, v);
}

void glwVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib3s(index, x, y, z);
}

void glwVertexAttrib3sv (GLuint index, const GLshort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib3sv(index, v);
}

void glwVertexAttrib4Nbv (GLuint index, const GLbyte *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4Nbv(index, v);
}

void glwVertexAttrib4Niv (GLuint index, const GLint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4Niv(index, v);
}

void glwVertexAttrib4Nsv (GLuint index, const GLshort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4Nsv(index, v);
}

void glwVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4Nub(index, x, y, z, w);
}

void glwVertexAttrib4Nubv (GLuint index, const GLubyte *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4Nubv(index, v);
}

void glwVertexAttrib4Nuiv (GLuint index, const GLuint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4Nuiv(index, v);
}

void glwVertexAttrib4Nusv (GLuint index, const GLushort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4Nusv(index, v);
}

void glwVertexAttrib4bv (GLuint index, const GLbyte *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4bv(index, v);
}

void glwVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4d(index, x, y, z, w);
}

void glwVertexAttrib4dv (GLuint index, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4dv(index, v);
}

void glwVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4f(index, x, y, z, w);
}

void glwVertexAttrib4fv (GLuint index, const GLfloat *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4fv(index, v);
}

void glwVertexAttrib4iv (GLuint index, const GLint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4iv(index, v);
}

void glwVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4s(index, x, y, z, w);
}

void glwVertexAttrib4sv (GLuint index, const GLshort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4sv(index, v);
}

void glwVertexAttrib4ubv (GLuint index, const GLubyte *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4ubv(index, v);
}

void glwVertexAttrib4uiv (GLuint index, const GLuint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4uiv(index, v);
}

void glwVertexAttrib4usv (GLuint index, const GLushort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttrib4usv(index, v);
}

void glwVertexAttribBinding (GLuint attribindex, GLuint bindingindex)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribBinding(attribindex, bindingindex);
}

void glwVertexAttribDivisor (GLuint index, GLuint divisor)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribDivisor(index, divisor);
}

void glwVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
}

void glwVertexAttribI1i (GLuint index, GLint x)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI1i(index, x);
}

void glwVertexAttribI1iv (GLuint index, const GLint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI1iv(index, v);
}

void glwVertexAttribI1ui (GLuint index, GLuint x)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI1ui(index, x);
}

void glwVertexAttribI1uiv (GLuint index, const GLuint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI1uiv(index, v);
}

void glwVertexAttribI2i (GLuint index, GLint x, GLint y)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI2i(index, x, y);
}

void glwVertexAttribI2iv (GLuint index, const GLint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI2iv(index, v);
}

void glwVertexAttribI2ui (GLuint index, GLuint x, GLuint y)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI2ui(index, x, y);
}

void glwVertexAttribI2uiv (GLuint index, const GLuint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI2uiv(index, v);
}

void glwVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI3i(index, x, y, z);
}

void glwVertexAttribI3iv (GLuint index, const GLint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI3iv(index, v);
}

void glwVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI3ui(index, x, y, z);
}

void glwVertexAttribI3uiv (GLuint index, const GLuint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI3uiv(index, v);
}

void glwVertexAttribI4bv (GLuint index, const GLbyte *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI4bv(index, v);
}

void glwVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI4i(index, x, y, z, w);
}

void glwVertexAttribI4iv (GLuint index, const GLint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI4iv(index, v);
}

void glwVertexAttribI4sv (GLuint index, const GLshort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI4sv(index, v);
}

void glwVertexAttribI4ubv (GLuint index, const GLubyte *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI4ubv(index, v);
}

void glwVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI4ui(index, x, y, z, w);
}

void glwVertexAttribI4uiv (GLuint index, const GLuint *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI4uiv(index, v);
}

void glwVertexAttribI4usv (GLuint index, const GLushort *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribI4usv(index, v);
}

void glwVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribIFormat(attribindex, size, type, relativeoffset);
}

void glwVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribIPointer(index, size, type, stride, pointer);
}

void glwVertexAttribL1d (GLuint index, GLdouble x)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribL1d(index, x);
}

void glwVertexAttribL1dv (GLuint index, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribL1dv(index, v);
}

void glwVertexAttribL2d (GLuint index, GLdouble x, GLdouble y)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribL2d(index, x, y);
}

void glwVertexAttribL2dv (GLuint index, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribL2dv(index, v);
}

void glwVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribL3d(index, x, y, z);
}

void glwVertexAttribL3dv (GLuint index, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribL3dv(index, v);
}

void glwVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribL4d(index, x, y, z, w);
}

void glwVertexAttribL4dv (GLuint index, const GLdouble *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribL4dv(index, v);
}

void glwVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribLFormat(attribindex, size, type, relativeoffset);
}

void glwVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribLPointer(index, size, type, stride, pointer);
}

void glwVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribP1ui(index, type, normalized, value);
}

void glwVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribP1uiv(index, type, normalized, value);
}

void glwVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribP2ui(index, type, normalized, value);
}

void glwVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribP2uiv(index, type, normalized, value);
}

void glwVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribP3ui(index, type, normalized, value);
}

void glwVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribP3uiv(index, type, normalized, value);
}

void glwVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribP4ui(index, type, normalized, value);
}

void glwVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribP4uiv(index, type, normalized, value);
}

void glwVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexAttribPointer(index, size, type, normalized, stride, pointer);
}

void glwVertexBindingDivisor (GLuint bindingindex, GLuint divisor)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->vertexBindingDivisor(bindingindex, divisor);
}

void glwViewport (GLint x, GLint y, GLsizei width, GLsizei height)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->viewport(x, y, width, height);
}

void glwViewportArrayv (GLuint first, GLsizei count, const GLfloat *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->viewportArrayv(first, count, v);
}

void glwViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->viewportIndexedf(index, x, y, w, h);
}

void glwViewportIndexedfv (GLuint index, const GLfloat *v)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->viewportIndexedfv(index, v);
}

void glwWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout)
{
	const glw::Functions* gl = glw::getCurrentThreadFunctions();
	if (!gl)
		return;
	gl->waitSync(sync, flags, timeout);
}
