text: // Copyright 2015 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  #include <stdlib.h>
  #include "_cgo_export.h"
  #include "work.h"
  
  void processFn(struct fnargs* args) {
  	switch (args->fn) {
  	case glfnUNDEFINED:
  		abort(); // bad glfn
  		break;
  	case glfnActiveTexture:
  		glActiveTexture((GLenum)args->a0);
  		break;
  	case glfnAttachShader:
  		glAttachShader((GLint)args->a0, (GLint)args->a1);
  		break;
  	case glfnBindAttribLocation:
  		glBindAttribLocation((GLint)args->a0, (GLint)args->a1, (GLchar*)args->a2);
  		free((void*)args->a2);
  		break;
  	case glfnBindBuffer:
  		glBindBuffer((GLenum)args->a0, (GLuint)args->a1);
  		break;
  	case glfnBindFramebuffer:
  		glBindFramebuffer((GLenum)args->a0, (GLint)args->a1);
  		break;
  	case glfnBindRenderbuffer:
  		glBindRenderbuffer((GLenum)args->a0, (GLint)args->a1);
  		break;
  	case glfnBindTexture:
  		glBindTexture((GLenum)args->a0, (GLint)args->a1);
  		break;
  	case glfnBlendColor:
  		glBlendColor(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3);
  		break;
  	case glfnBlendEquation:
  		glBlendEquation((GLenum)args->a0);
  		break;
  	case glfnBlendEquationSeparate:
  		glBlendEquationSeparate((GLenum)args->a0, (GLenum)args->a1);
  		break;
  	case glfnBlendFunc:
  		glBlendFunc((GLenum)args->a0, (GLenum)args->a1);
  		break;
  	case glfnBlendFuncSeparate:
  		glBlendFuncSeparate((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLenum)args->a3);
  		break;
  	case glfnBufferData:
  		glBufferData((GLenum)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2, (GLenum)args->a3);
  		break;
  	case glfnBufferSubData:
  		glBufferSubData((GLenum)args->a0, (GLint)args->a1, (GLsizeiptr)args->a2, (GLvoid*)args->a3);
  		break;
  	case glfnCheckFramebufferStatus:
  		ret = glCheckFramebufferStatus((GLenum)args->a0);
  		break;
  	case glfnClear:
  		glClear((GLenum)args->a0);
  		break;
  	case glfnClearColor:
  		glClearColor(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3);
  		break;
  	case glfnClearDepthf:
  		glClearDepthf(*(GLfloat*)&args->a0);
  		break;
  	case glfnClearStencil:
  		glClearStencil((GLint)args->a0);
  		break;
  	case glfnColorMask:
  		glColorMask((GLboolean)args->a0, (GLboolean)args->a1, (GLboolean)args->a2, (GLboolean)args->a3);
  		break;
  	case glfnCompileShader:
  		glCompileShader((GLint)args->a0);
  		break;
  	case glfnCompressedTexImage2D:
  		glCompressedTexImage2D((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLsizeiptr)args->a6, (GLvoid*)args->a7);
  		break;
  	case glfnCompressedTexSubImage2D:
  		glCompressedTexSubImage2D((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLenum)args->a6, (GLsizeiptr)args->a7, (GLvoid*)args->a8);
  		break;
  	case glfnCopyTexImage2D:
  		glCopyTexImage2D((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLint)args->a6, (GLint)args->a7);
  		break;
  	case glfnCopyTexSubImage2D:
  		glCopyTexSubImage2D((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLint)args->a6, (GLint)args->a7);
  		break;
  	case glfnCreateProgram:
  		ret = glCreateProgram();
  		break;
  	case glfnCreateShader:
  		ret = glCreateShader((GLenum)args->a0);
  		break;
  	case glfnCullFace:
  		glCullFace((GLenum)args->a0);
  		break;
  	case glfnDeleteBuffer:
  		glDeleteBuffers(1, (const GLuint*)(&args->a0));
  		break;
  	case glfnDeleteFramebuffer:
  		glDeleteFramebuffers(1, (const GLuint*)(&args->a0));
  		break;
  	case glfnDeleteProgram:
  		glDeleteProgram((GLint)args->a0);
  		break;
  	case glfnDeleteRenderbuffer:
  		glDeleteRenderbuffers(1, (const GLuint*)(&args->a0));
  		break;
  	case glfnDeleteShader:
  		glDeleteShader((GLint)args->a0);
  		break;
  	case glfnDeleteTexture:
  		glDeleteTextures(1, (const GLuint*)(&args->a0));
  		break;
  	case glfnDepthFunc:
  		glDepthFunc((GLenum)args->a0);
  		break;
  	case glfnDepthMask:
  		glDepthMask((GLboolean)args->a0);
  		break;
  	case glfnDepthRangef:
  		glDepthRangef(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1);
  		break;
  	case glfnDetachShader:
  		glDetachShader((GLint)args->a0, (GLint)args->a1);
  		break;
  	case glfnDisable:
  		glDisable((GLenum)args->a0);
  		break;
  	case glfnDisableVertexAttribArray:
  		glDisableVertexAttribArray((GLint)args->a0);
  		break;
  	case glfnDrawArrays:
  		glDrawArrays((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2);
  		break;
  	case glfnDrawElements:
  		glDrawElements((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (void*)args->a3);
  		break;
  	case glfnEnable:
  		glEnable((GLenum)args->a0);
  		break;
  	case glfnEnableVertexAttribArray:
  		glEnableVertexAttribArray((GLint)args->a0);
  		break;
  	case glfnFinish:
  		glFinish();
  		break;
  	case glfnFlush:
  		glFlush();
  		break;
  	case glfnFramebufferRenderbuffer:
  		glFramebufferRenderbuffer((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint)args->a3);
  		break;
  	case glfnFramebufferTexture2D:
  		glFramebufferTexture2D((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4);
  		break;
  	case glfnFrontFace:
  		glFrontFace((GLenum)args->a0);
  		break;
  	case glfnGenBuffer:
  		glGenBuffers(1, (GLuint*)&ret);
  		break;
  	case glfnGenFramebuffer:
  		glGenFramebuffers(1, (GLuint*)&ret);
  		break;
  	case glfnGenRenderbuffer:
  		glGenRenderbuffers(1, (GLuint*)&ret);
  		break;
  	case glfnGenTexture:
  		glGenTextures(1, (GLuint*)&ret);
  		break;
  	case glfnGenerateMipmap:
  		glGenerateMipmap((GLenum)args->a0);
  		break;
  	case glfnGetActiveAttrib:
  		glGetActiveAttrib(
  			(GLuint)args->a0,
  			(GLuint)args->a1,
  			(GLsizei)args->a2,
  			NULL,
  			(GLint*)args->a4,
  			(GLenum*)args->a5,
  			(GLchar*)args->a6);
  		break;
  	case glfnGetActiveUniform:
  		glGetActiveUniform(
  			(GLuint)args->a0,
  			(GLuint)args->a1,
  			(GLsizei)args->a2,
  			NULL,
  			(GLint*)args->a4,
  			(GLenum*)args->a5,
  			(GLchar*)args->a6);
  		break;
  	case glfnGetAttachedShaders:
  		glGetAttachedShaders((GLuint)args->a0, (GLsizei)args->a1, (GLsizei*)args->a2, (GLuint*)args->a3);
  		break;
  	case glfnGetAttribLocation:
  		ret = glGetAttribLocation((GLint)args->a0, (GLchar*)args->a1);
  		free((void*)args->a1);
  		break;
  	case glfnGetBooleanv:
  		glGetBooleanv((GLenum)args->a0, (GLboolean*)args->a1);
  		break;
  	case glfnGetBufferParameteri:
  		glGetBufferParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)&ret);
  		break;
  	case glfnGetFloatv:
  		glGetFloatv((GLenum)args->a0, (GLfloat*)args->a1);
  		break;
  	case glfnGetIntegerv:
  		glGetIntegerv((GLenum)args->a0, (GLint*)args->a1);
  		break;
  	case glfnGetError:
  		ret = glGetError();
  		break;
  	case glfnGetFramebufferAttachmentParameteriv:
  		glGetFramebufferAttachmentParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint*)&ret);
  		break;
  	case glfnGetProgramiv:
  		glGetProgramiv((GLint)args->a0, (GLenum)args->a1, (GLint*)&ret);
  		break;
  	case glfnGetProgramInfoLog:
  		glGetProgramInfoLog((GLuint)args->a0, (GLsizei)args->a1, (GLsizei*)args->a2, (GLchar*)args->a3);
  		break;
  	case glfnGetRenderbufferParameteriv:
  		glGetRenderbufferParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)&ret);
  		break;
  	case glfnGetShaderiv:
  		glGetShaderiv((GLint)args->a0, (GLenum)args->a1, (GLint*)&ret);
  		break;
  	case glfnGetShaderInfoLog:
  		glGetShaderInfoLog((GLuint)args->a0, (GLsizei)args->a1, (GLsizei*)args->a2, (GLchar*)args->a3);
  		break;
  	case glfnGetShaderPrecisionFormat:
  		glGetShaderPrecisionFormat((GLenum)args->a0, (GLenum)args->a1, (GLint*)args->a2, (GLint*)args->a3);
  		break;
  	case glfnGetShaderSource:
  		glGetShaderSource((GLuint)args->a0, (GLsizei)args->a1, (GLsizei*)args->a2, (GLchar*)args->a3);
  		break;
  	case glfnGetString:
  		ret = (uintptr_t)glGetString((GLenum)args->a0);
  		break;
  	case glfnGetTexParameterfv:
  		glGetTexParameterfv((GLenum)args->a0, (GLenum)args->a1, (GLfloat*)args->a2);
  		break;
  	case glfnGetTexParameteriv:
  		glGetTexParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)args->a2);
  		break;
  	case glfnGetUniformfv:
  		glGetUniformfv((GLuint)args->a0, (GLint)args->a1, (GLfloat*)args->a2);
  		break;
  	case glfnGetUniformiv:
  		glGetUniformiv((GLuint)args->a0, (GLint)args->a1, (GLint*)args->a2);
  		break;
  	case glfnGetUniformLocation:
  		ret = glGetUniformLocation((GLint)args->a0, (GLchar*)args->a1);
  		free((void*)args->a1);
  		break;
  	case glfnGetVertexAttribfv:
  		glGetVertexAttribfv((GLuint)args->a0, (GLenum)args->a1, (GLfloat*)args->a2);
  		break;
  	case glfnGetVertexAttribiv:
  		glGetVertexAttribiv((GLuint)args->a0, (GLenum)args->a1, (GLint*)args->a2);
  		break;
  	case glfnHint:
  		glHint((GLenum)args->a0, (GLenum)args->a1);
  		break;
  	case glfnIsBuffer:
  		ret = glIsBuffer((GLint)args->a0);
  		break;
  	case glfnIsEnabled:
  		ret = glIsEnabled((GLenum)args->a0);
  		break;
  	case glfnIsFramebuffer:
  		ret = glIsFramebuffer((GLint)args->a0);
  		break;
  	case glfnIsProgram:
  		ret = glIsProgram((GLint)args->a0);
  		break;
  	case glfnIsRenderbuffer:
  		ret = glIsRenderbuffer((GLint)args->a0);
  		break;
  	case glfnIsShader:
  		ret = glIsShader((GLint)args->a0);
  		break;
  	case glfnIsTexture:
  		ret = glIsTexture((GLint)args->a0);
  		break;
  	case glfnLineWidth:
  		glLineWidth(*(GLfloat*)&args->a0);
  		break;
  	case glfnLinkProgram:
  		glLinkProgram((GLint)args->a0);
  		break;
  	case glfnPixelStorei:
  		glPixelStorei((GLenum)args->a0, (GLint)args->a1);
  		break;
  	case glfnPolygonOffset:
  		glPolygonOffset(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1);
  		break;
  	case glfnReadPixels:
  		glReadPixels((GLint)args->a0, (GLint)args->a1, (GLsizei)args->a2, (GLsizei)args->a3, (GLenum)args->a4, (GLenum)args->a5, (void*)args->a6);
  		break;
  	case glfnReleaseShaderCompiler:
  		glReleaseShaderCompiler();
  		break;
  	case glfnRenderbufferStorage:
  		glRenderbufferStorage((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2, (GLint)args->a3);
  		break;
  	case glfnSampleCoverage:
  		glSampleCoverage(*(GLfloat*)&args->a0, (GLboolean)args->a1);
  		break;
  	case glfnScissor:
  		glScissor((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3);
  		break;
  	case glfnShaderSource:
  #if defined(os_ios) || defined(os_osx)
  		glShaderSource((GLuint)args->a0, (GLsizei)args->a1, (const GLchar *const *)args->a2, NULL);
  #else
  		glShaderSource((GLuint)args->a0, (GLsizei)args->a1, (const GLchar **)args->a2, NULL);
  #endif
  		free(*(void**)args->a2);
  		free((void*)args->a2);
  		break;
  	case glfnStencilFunc:
  		glStencilFunc((GLenum)args->a0, (GLint)args->a1, (GLuint)args->a2);
  		break;
  	case glfnStencilFuncSeparate:
  		glStencilFuncSeparate((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2, (GLuint)args->a3);
  		break;
  	case glfnStencilMask:
  		glStencilMask((GLuint)args->a0);
  		break;
  	case glfnStencilMaskSeparate:
  		glStencilMaskSeparate((GLenum)args->a0, (GLuint)args->a1);
  		break;
  	case glfnStencilOp:
  		glStencilOp((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2);
  		break;
  	case glfnStencilOpSeparate:
  		glStencilOpSeparate((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLenum)args->a3);
  		break;
  	case glfnTexImage2D:
  		glTexImage2D(
  			(GLenum)args->a0,
  			(GLint)args->a1,
  			(GLint)args->a2,
  			(GLsizei)args->a3,
  			(GLsizei)args->a4,
  			0, // border
  			(GLenum)args->a5,
  			(GLenum)args->a6,
  			(const GLvoid*)args->a7);
  		break;
  	case glfnTexSubImage2D:
  		glTexSubImage2D(
  			(GLenum)args->a0,
  			(GLint)args->a1,
  			(GLint)args->a2,
  			(GLint)args->a3,
  			(GLsizei)args->a4,
  			(GLsizei)args->a5,
  			(GLenum)args->a6,
  			(GLenum)args->a7,
  			(const GLvoid*)args->a8);
  		break;
  	case glfnTexParameterf:
  		glTexParameterf((GLenum)args->a0, (GLenum)args->a1, *(GLfloat*)&args->a2);
  		break;
  	case glfnTexParameterfv:
  		glTexParameterfv((GLenum)args->a0, (GLenum)args->a1, (GLfloat*)args->a2);
  		break;
  	case glfnTexParameteri:
  		glTexParameteri((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2);
  		break;
  	case glfnTexParameteriv:
  		glTexParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)args->a2);
  		break;
  	case glfnUniform1f:
  		glUniform1f((GLint)args->a0, *(GLfloat*)&args->a1);
  		break;
  	case glfnUniform1fv:
  		glUniform1fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2);
  		break;
  	case glfnUniform1i:
  		glUniform1i((GLint)args->a0, (GLint)args->a1);
  		break;
  	case glfnUniform1iv:
  		glUniform1iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2);
  		break;
  	case glfnUniform2f:
  		glUniform2f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2);
  		break;
  	case glfnUniform2fv:
  		glUniform2fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2);
  		break;
  	case glfnUniform2i:
  		glUniform2i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2);
  		break;
  	case glfnUniform2iv:
  		glUniform2iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2);
  		break;
  	case glfnUniform3f:
  		glUniform3f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3);
  		break;
  	case glfnUniform3fv:
  		glUniform3fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2);
  		break;
  	case glfnUniform3i:
  		glUniform3i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3);
  		break;
  	case glfnUniform3iv:
  		glUniform3iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2);
  		break;
  	case glfnUniform4f:
  		glUniform4f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3, *(GLfloat*)&args->a4);
  		break;
  	case glfnUniform4fv:
  		glUniform4fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2);
  		break;
  	case glfnUniform4i:
  		glUniform4i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4);
  		break;
  	case glfnUniform4iv:
  		glUniform4iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)args->a2);
  		break;
  	case glfnUniformMatrix2fv:
  		glUniformMatrix2fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)args->a2);
  		break;
  	case glfnUniformMatrix3fv:
  		glUniformMatrix3fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)args->a2);
  		break;
  	case glfnUniformMatrix4fv:
  		glUniformMatrix4fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)args->a2);
  		break;
  	case glfnUseProgram:
  		glUseProgram((GLint)args->a0);
  		break;
  	case glfnValidateProgram:
  		glValidateProgram((GLint)args->a0);
  		break;
  	case glfnVertexAttrib1f:
  		glVertexAttrib1f((GLint)args->a0, *(GLfloat*)&args->a1);
  		break;
  	case glfnVertexAttrib1fv:
  		glVertexAttrib1fv((GLint)args->a0, (GLfloat*)args->a1);
  		break;
  	case glfnVertexAttrib2f:
  		glVertexAttrib2f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2);
  		break;
  	case glfnVertexAttrib2fv:
  		glVertexAttrib2fv((GLint)args->a0, (GLfloat*)args->a1);
  		break;
  	case glfnVertexAttrib3f:
  		glVertexAttrib3f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3);
  		break;
  	case glfnVertexAttrib3fv:
  		glVertexAttrib3fv((GLint)args->a0, (GLfloat*)args->a1);
  		break;
  	case glfnVertexAttrib4f:
  		glVertexAttrib4f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3, *(GLfloat*)&args->a4);
  		break;
  	case glfnVertexAttrib4fv:
  		glVertexAttrib4fv((GLint)args->a0, (GLfloat*)args->a1);
  		break;
  	case glfnVertexAttribPointer:
  		glVertexAttribPointer((GLuint)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLboolean)args->a3, (GLsizei)args->a4, (const GLvoid*)args->a5);
  		break;
  	case glfnViewport:
  		glViewport((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3);
  		break;
  	}
  }
  