{-# LANGUAGE CPP #-}
-- | definition from gl3.h
module Graphics.OpenGLES.Base (
	-- * Basic Types
	GL,
	GLName,
	-- ** OpenGL ES 2.0
	GLboolean,
	GLbyte,
	GLubyte,
	GLchar,
	GLshort,
	GLushort,
	GLint,
	GLuint,
	GLfixed,
	GLsizei,
	GLenum,
	GLintptr,
	GLsizeiptr,
	GLbitfield,
	GLfloat,
	GLclampf,
	-- ** OpenGL ES 3.0
	GLint64,
	GLuint64,
	GLsync,
	GLhalf,

	-- * Bindings
	--isGLProcAvailable,

	-- ** OpenGL ES 2.0
	glActiveTexture,
	glAttachShader,
	glBindAttribLocation,
	glBindBuffer,
	glBindFramebuffer,
	glBindRenderbuffer,
	glBindTexture,
	glBlendColor,
	glBlendEquation,
	glBlendEquationSeparate,
	glBlendFunc,
	glBlendFuncSeparate,
	glBufferData,
	glBufferSubData,
	glCheckFramebufferStatus,
	glClear,
	glClearColor,
	glClearDepthf,
	glClearStencil,
	glColorMask,
	glCompileShader,
	glCompressedTexImage2D,
	glCompressedTexSubImage2D,
	glCopyTexImage2D,
	glCopyTexSubImage2D,
	glCreateProgram,
	glCreateShader,
	glCullFace,
	glDeleteBuffers,
	glDeleteFramebuffers,
	glDeleteProgram,
	glDeleteRenderbuffers,
	glDeleteShader,
	glDeleteTextures,
	glDepthFunc,
	glDepthMask,
	glDepthRangef,
	glDetachShader,
	glDisable,
	glDisableVertexAttribArray,
	glDrawArrays,
	glDrawElements,
	glEnable,
	glEnableVertexAttribArray,
	glFinish,
	glFlush,
	glFramebufferRenderbuffer,
	glFramebufferTexture2D,
	glFrontFace,
	glGenBuffers,
	glGenerateMipmap,
	glGenFramebuffers,
	glGenRenderbuffers,
	glGenTextures,
	glGetActiveAttrib,
	glGetActiveUniform,
	glGetAttachedShaders,
	glGetAttribLocation,
	glGetBooleanv,
	glGetBufferParameteriv,
	glGetError,
	glGetFloatv,
	glGetFramebufferAttachmentParameteriv,
	glGetIntegerv,
	glGetProgramiv,
	glGetProgramInfoLog,
	glGetRenderbufferParameteriv,
	glGetShaderiv,
	glGetShaderInfoLog,
	glGetShaderPrecisionFormat,
	glGetShaderSource,
	glGetString,
	glGetTexParameterfv,
	glGetTexParameteriv,
	glGetUniformfv,
	glGetUniformiv,
	glGetUniformLocation,
	glGetVertexAttribfv,
	glGetVertexAttribiv,
	glGetVertexAttribPointerv,
	glHint,
	glIsBuffer,
	glIsEnabled,
	glIsFramebuffer,
	glIsProgram,
	glIsRenderbuffer,
	glIsShader,
	glIsTexture,
	glLineWidth,
	glLinkProgram,
	glPixelStorei,
	glPolygonOffset,
	glReadPixels,
	glReleaseShaderCompiler,
	glRenderbufferStorage,
	glSampleCoverage,
	glScissor,
	glShaderBinary,
	glShaderSource,
	glStencilFunc,
	glStencilFuncSeparate,
	glStencilMask,
	glStencilMaskSeparate,
	glStencilOp,
	glStencilOpSeparate,
	glTexImage2D,
	glTexParameterf,
	glTexParameterfv,
	glTexParameteri,
	glTexParameteriv,
	glTexSubImage2D,
	glUniform1f,
	glUniform1fv,
	glUniform1i,
	glUniform1iv,
	glUniform2f,
	glUniform2fv,
	glUniform2i,
	glUniform2iv,
	glUniform3f,
	glUniform3fv,
	glUniform3i,
	glUniform3iv,
	glUniform4f,
	glUniform4fv,
	glUniform4i,
	glUniform4iv,
	glUniformMatrix2fv,
	glUniformMatrix3fv,
	glUniformMatrix4fv,
	glUseProgram,
	glValidateProgram,
	glVertexAttrib1f,
	glVertexAttrib1fv,
	glVertexAttrib2f,
	glVertexAttrib2fv,
	glVertexAttrib3f,
	glVertexAttrib3fv,
	glVertexAttrib4f,
	glVertexAttrib4fv,
	glVertexAttribPointer,
	glViewport,

	-- ** OpenGL ES 3.0
	glReadBuffer,
	glDrawRangeElements,
	glTexImage3D,
	glTexSubImage3D,
	glCopyTexSubImage3D,
	glCompressedTexImage3D,
	glCompressedTexSubImage3D,
	glGenQueries,
	glDeleteQueries,
	glIsQuery,
	glBeginQuery,
	glEndQuery,
	glGetQueryiv,
	glGetQueryObjectuiv,
	glUnmapBuffer,
	glGetBufferPointerv,
	glDrawBuffers,
	glUniformMatrix2x3fv,
	glUniformMatrix3x2fv,
	glUniformMatrix2x4fv,
	glUniformMatrix4x2fv,
	glUniformMatrix3x4fv,
	glUniformMatrix4x3fv,
	glBlitFramebuffer,
	glRenderbufferStorageMultisample,
	glFramebufferTextureLayer,
	glMapBufferRange,
	glFlushMappedBufferRange,
	glBindVertexArray,
	glDeleteVertexArrays,
	glGenVertexArrays,
	glIsVertexArray,
	glGetIntegeri_v,
	glBeginTransformFeedback,
	glEndTransformFeedback,
	glBindBufferRange,
	glBindBufferBase,
	glTransformFeedbackVaryings,
	glGetTransformFeedbackVarying,
	glVertexAttribIPointer,
	glGetVertexAttribIiv,
	glGetVertexAttribIuiv,
	glVertexAttribI4i,
	glVertexAttribI4ui,
	glVertexAttribI4iv,
	glVertexAttribI4uiv,
	glGetUniformuiv,
	glGetFragDataLocation,
	glUniform1ui,
	glUniform2ui,
	glUniform3ui,
	glUniform4ui,
	glUniform1uiv,
	glUniform2uiv,
	glUniform3uiv,
	glUniform4uiv,
	glClearBufferiv,
	glClearBufferuiv,
	glClearBufferfv,
	glClearBufferfi,
	glGetStringi,
	glCopyBufferSubData,
	glGetUniformIndices,
	glGetActiveUniformsiv,
	glGetUniformBlockIndex,
	glGetActiveUniformBlockiv,
	glGetActiveUniformBlockName,
	glUniformBlockBinding,
	glDrawArraysInstanced,
	glDrawElementsInstanced,
	glFenceSync,
	glIsSync,
	glDeleteSync,
	glClientWaitSync,
	glWaitSync,
	glGetInteger64v,
	glGetSynciv,
	glGetInteger64i_v,
	glGetBufferParameteri64v,
	glGenSamplers,
	glDeleteSamplers,
	glIsSampler,
	glBindSampler,
	glSamplerParameteri,
	glSamplerParameteriv,
	glSamplerParameterf,
	glSamplerParameterfv,
	glGetSamplerParameteriv,
	glGetSamplerParameterfv,
	glVertexAttribDivisor,
	glBindTransformFeedback,
	glDeleteTransformFeedbacks,
	glGenTransformFeedbacks,
	glIsTransformFeedback,
	glPauseTransformFeedback,
	glResumeTransformFeedback,
	glGetProgramBinary,
	glProgramBinary,
	glProgramParameteri,
	glInvalidateFramebuffer,
	glInvalidateSubFramebuffer,
	glTexStorage2D,
	glTexStorage3D,
	glGetInternalformativ,

	-- ** Extensions
	glDrawTexiOES,
	glMultiDrawArraysEXT,
	glMultiDrawElementsEXT,
	glGenVertexArraysOES,
	glBindVertexArrayOES,
	glDeleteVertexArraysOES,
	glIsVertexArrayOES,

	-- ** OpenGL ES 3.1
	glDispatchCompute,
	glDispatchComputeIndirect,
	glDrawArraysIndirect,
	glDrawElementsIndirect,
	glFramebufferParameteri,
	glGetFramebufferParameteriv,
	glGetProgramInterfaceiv,
	glGetProgramResourceIndex,
	glGetProgramResourceName,
	glGetProgramResourceiv,
	glGetProgramResourceLocation,
	glUseProgramStages,
	glActiveShaderProgram,
	glCreateShaderProgramv,
	glBindProgramPipeline,
	glDeleteProgramPipelines,
	glGenProgramPipelines,
	glIsProgramPipeline,
	glGetProgramPipelineiv,
	glProgramUniform1i,
	glProgramUniform2i,
	glProgramUniform3i,
	glProgramUniform4i,
	glProgramUniform1ui,
	glProgramUniform2ui,
	glProgramUniform3ui,
	glProgramUniform4ui,
	glProgramUniform1f,
	glProgramUniform2f,
	glProgramUniform3f,
	glProgramUniform4f,
	glProgramUniform1iv,
	glProgramUniform2iv,
	glProgramUniform3iv,
	glProgramUniform4iv,
	glProgramUniform1uiv,
	glProgramUniform2uiv,
	glProgramUniform3uiv,
	glProgramUniform4uiv,
	glProgramUniform1fv,
	glProgramUniform2fv,
	glProgramUniform3fv,
	glProgramUniform4fv,
	glProgramUniformMatrix2fv,
	glProgramUniformMatrix3fv,
	glProgramUniformMatrix4fv,
	glProgramUniformMatrix2x3fv,
	glProgramUniformMatrix3x2fv,
	glProgramUniformMatrix2x4fv,
	glProgramUniformMatrix4x2fv,
	glProgramUniformMatrix3x4fv,
	glProgramUniformMatrix4x3fv,
	glValidateProgramPipeline,
	glGetProgramPipelineInfoLog,
	glBindImageTexture,
	glGetBooleani_v,
	glMemoryBarrier,
	glMemoryBarrierByRegion,
	glTexStorage2DMultisample,
	glGetMultisamplefv,
	glSampleMaski,
	glGetTexLevelParameteriv,
	glGetTexLevelParameterfv,
	glBindVertexBuffer,
	glVertexAttribFormat,
	glVertexAttribIFormat,
	glVertexAttribBinding,
	glVertexBindingDivisor
	) where
import Foreign
import Foreign.C.String
import Graphics.EGL (eglGetProcAddress)
--XXX unify Wrappers by args
-- * Basic Types

-- | IO actions run in GL thread.
type GL = IO

-- | Name of a shader, program, and variable.
type GLName = String

-- ** OpenGL ES 2.0

-- | 1bit boolean
type GLboolean = Word8

-- | 8bit signed two\'s complement binary integer
type GLbyte = Int8

-- | 8bit unsigned binary integer
type GLubyte = Word8

-- | (Unused) 8bit characters making up strings
type GLchar = Int8

-- | 16bit signed two\'s complement binary integer
type GLshort = Int16

-- | 16bit unsigned binary integer
type GLushort = Word16

-- | 32bit signed two\'s complement binary integer
type GLint = Int32

-- | 32bit unsigned binary integer
type GLuint = Word32

-- | 32bit signed two\'s complement 16.16 scaled integer
type GLfixed = Int32

-- | 32bit non-negative binary integer size
type GLsizei = Int32

-- | 32bit enumerated binary integer value
type GLenum = Word32

-- | Pointer-sized signed two\'s complement binary integer
type GLintptr = Int

-- | Pointer-sized non-negative binary integer size
type GLsizeiptr = Int

-- | 32bit bit field
type GLbitfield = Word32

-- | 32bit floating-point value
type GLfloat = Float

-- | 32bit floating-point value clamped to [0,1]
type GLclampf = Float

-- ** OpenGL ES 3.0

-- | 64bit signed two\'s complement binary integer
type GLint64 = Int64

-- | 64bit unsigned binary integer
type GLuint64 = Word64

-- | Pointer-sized sync object handle
type GLsync = Ptr ()

-- | 16bit half-precision floating-point value encoded in an unsigned scalar
type GLhalf = Word16


-- * Bindings

{-isGLProcAvailable :: String -> Bool
isGLProcAvailable name = let
	proc = castFunPtrToPtr (eglGetProcAddress name)
	undef = castFunPtrToPtr (eglGetProcAddress "glUndefined")
	in abs (proc `minusPtr` undef) > 0x10000
	-- eglGetProcAddress may return an useless pointer when
	-- given name starts with "gl" but not implemented.
-}
-- Declere must-have functions
#define GLES2(_procname, _typ) \
foreign import ccall unsafe "GLES2/gl2.h" _procname :: _typ; \
--{- avoid inlining to save size # INLINE _procname #-} \

-- Work around for a runtime link error
#define GL_EXT(_procname, _typ) \
foreign import ccall unsafe "dynamic" unwrap_/**/_procname :: FunPtr (_typ) -> _typ; \
_procname :: _typ; \
_procname = unwrap_/**/_procname (eglGetProcAddress "_procname") ; \
{-# NOINLINE _procname #-} \
-- foreign import ccall unsafe "dynamic"
--   unwrap_glActiveTexture :: FunPtr (GLenum -> GL ()) -> GLenum -> GL ();
-- glActiveTexture :: GLenum -> GL ();
-- glActiveTexture = unwrap_glActiveTexture (eglGetProcAddress "glActiveTexture");


-- Share unwrap_* with a mother function
#define GL_DUP(_procname, _mother, _typ) \
_procname :: _typ; \
_procname = unwrap_/**/_mother (eglGetProcAddress "_procname") ; \
{-# NOINLINE _procname #-} \


-- ** OpenGL ES 2.0

GLES2(glActiveTexture, GLenum -> GL ())
GLES2(glAttachShader, GLuint -> GLuint -> GL ())
GLES2(glBindAttribLocation, GLuint -> GLuint -> CString -> GL ())
GLES2(glBindBuffer, GLenum -> GLuint -> GL ())
GLES2(glBindFramebuffer, GLenum -> GLuint -> GL ())
GLES2(glBindRenderbuffer, GLenum -> GLuint -> GL ())
GLES2(glBindTexture, GLenum -> GLuint -> GL ())
GLES2(glBlendColor, GLclampf -> GLclampf -> GLclampf -> GLclampf -> GL ())
GLES2(glBlendEquation, GLenum -> GL ())
GLES2(glBlendEquationSeparate, GLenum -> GLenum -> GL ())
GLES2(glBlendFunc, GLenum -> GLenum -> GL ())
GLES2(glBlendFuncSeparate, GLenum -> GLenum -> GLenum -> GLenum -> GL ())
GLES2(glBufferData, GLenum -> GLsizeiptr -> Ptr () -> GLenum -> GL ())
GLES2(glBufferSubData, GLenum -> GLintptr -> GLsizeiptr -> Ptr () -> GL ())
GLES2(glCheckFramebufferStatus, GLenum -> GL GLenum)
GLES2(glClear, GLbitfield -> GL ())
GLES2(glClearColor, GLclampf -> GLclampf -> GLclampf -> GLclampf -> GL ())
GLES2(glClearDepthf, GLclampf -> GL ())
GLES2(glClearStencil, GLint -> GL ())
GLES2(glColorMask, GLboolean -> GLboolean -> GLboolean -> GLboolean -> GL ())
GLES2(glCompileShader, GLuint -> GL ())
--GLES2(glCompressedTexImage2D, GLenum -> GLint -> GLenum -> GLsizei -> GLsizei -> GLint -> GLsizei -> Ptr () -> GL ())
GLES2(glCompressedTexImage2D, GLenum -> GLint -> GLenum -> GLuint -> GLuint -> GLint -> GLsizei -> CString -> GL ())
GLES2(glCompressedTexSubImage2D, GLenum -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GLenum -> GLsizei -> Ptr () -> GL ())
GLES2(glCopyTexImage2D, GLenum -> GLint -> GLenum -> GLint -> GLint -> GLsizei -> GLsizei -> GLint -> GL ())
GLES2(glCopyTexSubImage2D, GLenum -> GLint -> GLint -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GL ())
GLES2(glCreateProgram, GL GLuint)
GLES2(glCreateShader, GLenum -> GL GLuint)
GLES2(glCullFace, GLenum -> GL ())
GLES2(glDeleteBuffers, GLsizei -> Ptr GLuint -> GL ())
GLES2(glDeleteFramebuffers, GLsizei -> Ptr GLuint -> GL ())
GLES2(glDeleteProgram, GLuint -> GL ())
GLES2(glDeleteRenderbuffers, GLsizei -> Ptr GLuint -> GL ())
GLES2(glDeleteShader, GLuint -> GL ())
GLES2(glDeleteTextures, GLsizei -> Ptr GLuint -> GL ())
GLES2(glDepthFunc, GLenum -> GL ())
GLES2(glDepthMask, GLboolean -> GL ())
GLES2(glDepthRangef, GLclampf -> GLclampf -> GL ())
GLES2(glDetachShader, GLuint -> GLuint -> GL ())
GLES2(glDisable, GLenum -> GL ())
GLES2(glDisableVertexAttribArray, GLuint -> GL ())
GLES2(glDrawArrays, GLenum -> GLint -> GLsizei -> GL ())
GLES2(glDrawElements, GLenum -> GLsizei -> GLenum -> Ptr () -> GL ())
GLES2(glEnable, GLenum -> GL ())
GLES2(glEnableVertexAttribArray, GLuint -> GL ())
GLES2(glFinish, GL ())
GLES2(glFlush, GL ())
GLES2(glFramebufferRenderbuffer, GLenum -> GLenum -> GLenum -> GLuint -> GL ())
GLES2(glFramebufferTexture2D, GLenum -> GLenum -> GLenum -> GLuint -> GLint -> GL ())
GLES2(glFrontFace, GLenum -> GL ())
GLES2(glGenBuffers, GLsizei -> Ptr GLuint -> GL ())
GLES2(glGenerateMipmap, GLenum -> GL ())
GLES2(glGenFramebuffers, GLsizei -> Ptr GLuint -> GL ())
GLES2(glGenRenderbuffers, GLsizei -> Ptr GLuint -> GL ())
GLES2(glGenTextures, GLsizei -> Ptr GLuint -> GL ())
GLES2(glGetActiveAttrib, GLuint -> GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLint -> Ptr GLenum -> CString -> GL ())
GLES2(glGetActiveUniform, GLuint -> GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLint -> Ptr GLenum -> CString -> GL ())
GLES2(glGetAttachedShaders, GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLuint -> GL ())
GLES2(glGetAttribLocation, GLuint -> CString -> GL GLint)
GLES2(glGetBooleanv, GLenum -> Ptr GLboolean -> GL ())
GLES2(glGetBufferParameteriv, GLenum -> GLenum -> Ptr GLint -> GL ())
GLES2(glGetError, GL GLenum)
GLES2(glGetFloatv, GLenum -> Ptr GLfloat -> GL ())
GLES2(glGetFramebufferAttachmentParameteriv, GLenum -> GLenum -> GLenum -> Ptr GLint -> GL ())
GLES2(glGetIntegerv, GLenum -> Ptr GLint -> GL ())
GLES2(glGetProgramiv, GLuint -> GLenum -> Ptr GLint -> GL ())
GLES2(glGetProgramInfoLog, GLuint -> GLsizei -> Ptr GLsizei -> CString -> GL ())
GLES2(glGetRenderbufferParameteriv, GLenum -> GLenum -> Ptr GLint -> GL ())
GLES2(glGetShaderiv, GLuint -> GLenum -> Ptr GLint -> GL ())
GLES2(glGetShaderInfoLog, GLuint -> GLsizei -> Ptr GLsizei -> CString -> GL ())
GLES2(glGetShaderPrecisionFormat, GLenum -> GLenum -> Ptr GLint -> Ptr GLint -> GL ())
GLES2(glGetShaderSource, GLuint -> GLsizei -> Ptr GLsizei -> CString -> GL ())
GLES2(glGetString, GLenum -> GL CString)
GLES2(glGetTexParameterfv, GLenum -> GLenum -> Ptr GLfloat -> GL ())
GLES2(glGetTexParameteriv, GLenum -> GLenum -> Ptr GLint -> GL ())
GLES2(glGetUniformfv, GLuint -> GLint -> Ptr GLfloat -> GL ())
GLES2(glGetUniformiv, GLuint -> GLint -> Ptr GLint -> GL ())
GLES2(glGetUniformLocation, GLuint -> CString -> GL GLint)
GLES2(glGetVertexAttribfv, GLuint -> GLenum -> Ptr GLfloat -> GL ())
GLES2(glGetVertexAttribiv, GLuint -> GLenum -> Ptr GLint -> GL ())
GLES2(glGetVertexAttribPointerv, GLuint -> GLenum -> Ptr (Ptr ()) -> GL ())
GLES2(glHint, GLenum -> GLenum -> GL ())
GLES2(glIsBuffer, GLuint -> GL GLboolean)
GLES2(glIsEnabled, GLenum -> GL GLboolean)
GLES2(glIsFramebuffer, GLuint -> GL GLboolean)
GLES2(glIsProgram, GLuint -> GL GLboolean)
GLES2(glIsRenderbuffer, GLuint -> GL GLboolean)
GLES2(glIsShader, GLuint -> GL GLboolean)
GLES2(glIsTexture, GLuint -> GL GLboolean)
GLES2(glLineWidth, GLfloat -> GL ())
GLES2(glLinkProgram, GLuint -> GL ())
GLES2(glPixelStorei, GLenum -> GLint -> GL ())
GLES2(glPolygonOffset, GLfloat -> GLfloat -> GL ())
GLES2(glReadPixels, GLint -> GLint -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr () -> GL ())
GLES2(glReleaseShaderCompiler, GL ())
GLES2(glRenderbufferStorage, GLenum -> GLenum -> GLsizei -> GLsizei -> GL ())
GLES2(glSampleCoverage, GLclampf -> GLboolean -> GL ())
GLES2(glScissor, GLint -> GLint -> GLsizei -> GLsizei -> GL ())
GLES2(glShaderBinary, GLsizei -> Ptr GLuint -> GLenum -> Ptr () -> GLsizei -> GL ())
GLES2(glShaderSource, GLuint -> GLsizei -> Ptr CString -> Ptr GLint -> GL ())
GLES2(glStencilFunc, GLenum -> GLint -> GLuint -> GL ())
GLES2(glStencilFuncSeparate, GLenum -> GLenum -> GLint -> GLuint -> GL ())
GLES2(glStencilMask, GLuint -> GL ())
GLES2(glStencilMaskSeparate, GLenum -> GLuint -> GL ())
GLES2(glStencilOp, GLenum -> GLenum -> GLenum -> GL ())
GLES2(glStencilOpSeparate, GLenum -> GLenum -> GLenum -> GLenum -> GL ())
-- GLES2(glTexImage2D, GLenum -> GLint -> GLint -> GLsizei -> GLsizei -> GLint -> GLenum -> GLenum -> Ptr () -> GL ())
GLES2(glTexImage2D, GLenum -> GLint -> GLenum -> GLuint -> GLuint -> GLint -> GLenum -> GLenum -> CString -> GL ())
GLES2(glTexParameterf, GLenum -> GLenum -> GLfloat -> GL ())
GLES2(glTexParameterfv, GLenum -> GLenum -> Ptr GLfloat -> GL ())
GLES2(glTexParameteri, GLenum -> GLenum -> GLint -> GL ())
GLES2(glTexParameteriv, GLenum -> GLenum -> Ptr GLint -> GL ())
GLES2(glTexSubImage2D, GLenum -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr () -> GL ())
GLES2(glUniform1f, GLint -> GLfloat -> GL ())
GLES2(glUniform1fv, GLint -> GLsizei -> Ptr GLfloat -> GL ())
GLES2(glUniform1i, GLint -> GLint -> GL ())
GLES2(glUniform1iv, GLint -> GLsizei -> Ptr GLint -> GL ())
GLES2(glUniform2f, GLint -> GLfloat -> GLfloat -> GL ())
GLES2(glUniform2fv, GLint -> GLsizei -> Ptr GLfloat -> GL ())
GLES2(glUniform2i, GLint -> GLint -> GLint -> GL ())
GLES2(glUniform2iv, GLint -> GLsizei -> Ptr GLint -> GL ())
GLES2(glUniform3f, GLint -> GLfloat -> GLfloat -> GLfloat -> GL ())
GLES2(glUniform3fv, GLint -> GLsizei -> Ptr GLfloat -> GL ())
GLES2(glUniform3i, GLint -> GLint -> GLint -> GLint -> GL ())
GLES2(glUniform3iv, GLint -> GLsizei -> Ptr GLint -> GL ())
GLES2(glUniform4f, GLint -> GLfloat -> GLfloat -> GLfloat -> GLfloat -> GL ())
GLES2(glUniform4fv, GLint -> GLsizei -> Ptr GLfloat -> GL ())
GLES2(glUniform4i, GLint -> GLint -> GLint -> GLint -> GLint -> GL ())
GLES2(glUniform4iv, GLint -> GLsizei -> Ptr GLint -> GL ())
GLES2(glUniformMatrix2fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GLES2(glUniformMatrix3fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GLES2(glUniformMatrix4fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GLES2(glUseProgram, GLuint -> GL ())
GLES2(glValidateProgram, GLuint -> GL ())
GLES2(glVertexAttrib1f, GLuint -> GLfloat -> GL ())
GLES2(glVertexAttrib1fv, GLuint -> Ptr GLfloat -> GL ())
GLES2(glVertexAttrib2f, GLuint -> GLfloat -> GLfloat -> GL ())
GLES2(glVertexAttrib2fv, GLuint -> Ptr GLfloat -> GL ())
GLES2(glVertexAttrib3f, GLuint -> GLfloat -> GLfloat -> GLfloat -> GL ())
GLES2(glVertexAttrib3fv, GLuint -> Ptr GLfloat -> GL ())
GLES2(glVertexAttrib4f, GLuint -> GLfloat -> GLfloat -> GLfloat -> GLfloat -> GL ())
GLES2(glVertexAttrib4fv, GLuint -> Ptr GLfloat -> GL ())
GLES2(glVertexAttribPointer, GLuint -> GLint -> GLenum -> GLboolean -> GLsizei -> Ptr () -> GL ())
GLES2(glViewport, GLint -> GLint -> GLsizei -> GLsizei -> GL ())

-- ** OpenGL ES 3.0

GL_EXT(glReadBuffer, GLenum -> GL ())
GL_EXT(glDrawRangeElements, GLenum -> GLuint -> GLuint -> GLsizei -> GLenum -> Ptr (()) -> GL ())
--GL_EXT(glTexImage3D, GLenum -> GLint -> GLint -> GLsizei -> GLsizei -> GLsizei -> GLint -> GLenum -> GLenum -> Ptr () -> GL ())
GL_EXT(glTexImage3D, GLenum -> GLint -> GLenum -> GLuint -> GLuint -> GLuint -> GLint -> GLenum -> GLenum -> CString -> GL ())
GL_EXT(glTexSubImage3D, GLenum -> GLint -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr () -> GL ())
GL_EXT(glCopyTexSubImage3D, GLenum -> GLint -> GLint -> GLint -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GL ())
--GL_EXT(glCompressedTexImage3D, GLenum -> GLint -> GLenum -> GLsizei -> GLsizei -> GLsizei -> GLint -> GLsizei -> Ptr () -> GL ())
GL_EXT(glCompressedTexImage3D, GLenum -> GLint -> GLenum -> GLuint -> GLuint -> GLuint -> GLint -> GLsizei -> CString -> GL ())
GL_EXT(glCompressedTexSubImage3D, GLenum -> GLint -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GLsizei -> GLenum -> GLsizei -> Ptr () -> GL ())
GL_EXT(glGenQueries, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glDeleteQueries, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glIsQuery, GLuint -> GL GLboolean)
GL_EXT(glBeginQuery, GLenum -> GLuint -> GL ())
GL_EXT(glEndQuery, GLenum -> GL ())
GL_EXT(glGetQueryiv, GLenum -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glGetQueryObjectuiv, GLuint -> GLenum -> Ptr GLuint -> GL ())
GL_EXT(glUnmapBuffer, GLenum -> GL GLboolean)
GL_EXT(glGetBufferPointerv, GLenum -> GLenum -> Ptr (Ptr ()) -> GL ())
GL_EXT(glDrawBuffers, GLsizei -> Ptr GLenum -> GL ())
GL_EXT(glUniformMatrix2x3fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glUniformMatrix3x2fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glUniformMatrix2x4fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glUniformMatrix4x2fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glUniformMatrix3x4fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glUniformMatrix4x3fv, GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glBlitFramebuffer, GLint -> GLint -> GLint -> GLint -> GLint -> GLint -> GLint -> GLint -> GLbitfield -> GLenum -> GL ())
GL_EXT(glRenderbufferStorageMultisample, GLenum -> GLsizei -> GLenum -> GLsizei -> GLsizei -> GL ())
GL_EXT(glFramebufferTextureLayer, GLenum -> GLenum -> GLuint -> GLint -> GLint -> GL ())
GL_EXT(glMapBufferRange, GLenum -> GLintptr -> GLsizeiptr -> GLbitfield -> GL (Ptr ()))
GL_EXT(glFlushMappedBufferRange, GLenum -> GLintptr -> GLsizeiptr -> GL ())
GL_EXT(glBindVertexArray, GLuint -> GL ())
GL_EXT(glDeleteVertexArrays, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glGenVertexArrays, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glIsVertexArray, GLuint -> GL GLboolean)
GL_EXT(glGetIntegeri_v, GLenum -> GLuint -> Ptr GLint -> GL ())
GL_EXT(glBeginTransformFeedback, GLenum -> GL ())
GL_EXT(glEndTransformFeedback, GL ())
GL_EXT(glBindBufferRange, GLenum -> GLuint -> GLuint -> GLintptr -> GLsizeiptr -> GL ())
GL_EXT(glBindBufferBase, GLenum -> GLuint -> GLuint -> GL ())
GL_EXT(glTransformFeedbackVaryings, GLuint -> GLsizei -> Ptr CString -> GLenum -> GL ())
GL_EXT(glGetTransformFeedbackVarying, GLuint -> GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLsizei -> Ptr GLenum -> CString -> GL ())
GL_EXT(glVertexAttribIPointer, GLuint -> GLint -> GLenum -> GLsizei -> Ptr () -> GL ())
GL_EXT(glGetVertexAttribIiv, GLuint -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glGetVertexAttribIuiv, GLuint -> GLenum -> Ptr GLuint -> GL ())
GL_EXT(glVertexAttribI4i, GLuint -> GLint -> GLint -> GLint -> GLint -> GL ())
GL_EXT(glVertexAttribI4ui, GLuint -> GLuint -> GLuint -> GLuint -> GLuint -> GL ())
GL_EXT(glVertexAttribI4iv, GLuint -> Ptr GLint -> GL ())
GL_EXT(glVertexAttribI4uiv, GLuint -> Ptr GLuint -> GL ())
GL_EXT(glGetUniformuiv, GLuint -> GLint -> Ptr GLuint -> GL ())
GL_EXT(glGetFragDataLocation, GLuint -> CString-> GL GLint)
GL_EXT(glUniform1ui, GLint -> GLuint -> GL ())
GL_EXT(glUniform2ui, GLint -> GLuint -> GLuint -> GL ())
GL_EXT(glUniform3ui, GLint -> GLuint -> GLuint -> GLuint -> GL ())
GL_EXT(glUniform4ui, GLint -> GLuint -> GLuint -> GLuint -> GLuint -> GL ())
GL_EXT(glUniform1uiv, GLint -> GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glUniform2uiv, GLint -> GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glUniform3uiv, GLint -> GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glUniform4uiv, GLint -> GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glClearBufferiv, GLenum -> GLint -> Ptr GLint -> GL ())
GL_EXT(glClearBufferuiv, GLenum -> GLint -> Ptr GLuint -> GL ())
GL_EXT(glClearBufferfv, GLenum -> GLint -> Ptr GLfloat -> GL ())
GL_EXT(glClearBufferfi, GLenum -> GLint -> GLfloat -> GLint -> GL ())
GL_EXT(glGetStringi, GLenum -> GLuint -> GL CString)
GL_EXT(glCopyBufferSubData, GLenum -> GLenum -> GLintptr -> GLintptr -> GLsizeiptr -> GL ())
GL_EXT(glGetUniformIndices, GLuint -> GLsizei -> Ptr CString -> Ptr GLuint -> GL ())
GL_EXT(glGetActiveUniformsiv, GLuint -> GLsizei -> Ptr GLuint -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glGetUniformBlockIndex, GLuint -> CString -> GL GLuint)
GL_EXT(glGetActiveUniformBlockiv, GLuint -> GLuint -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glGetActiveUniformBlockName, GLuint -> GLuint -> GLsizei -> Ptr GLsizei -> CString -> GL ())
GL_EXT(glUniformBlockBinding, GLuint -> GLuint -> GLuint -> GL ())
GL_EXT(glDrawArraysInstanced, GLenum -> GLint -> GLsizei -> GLsizei -> GL ())
GL_EXT(glDrawElementsInstanced, GLenum -> GLsizei -> GLenum -> Ptr () -> GLsizei -> GL ())
GL_EXT(glFenceSync, GLenum -> GLbitfield -> GL GLsync)
GL_EXT(glIsSync, GLsync -> GL GLboolean)
GL_EXT(glDeleteSync, GLsync -> GL ())
GL_EXT(glClientWaitSync, GLsync -> GLbitfield -> GLuint64 -> GL GLenum)
GL_EXT(glWaitSync, GLsync -> GLbitfield -> GLuint64 -> GL ())
GL_EXT(glGetInteger64v, GLenum -> Ptr GLint64 -> GL ())
GL_EXT(glGetSynciv, GLsync -> GLenum -> GLsizei -> Ptr GLsizei -> Ptr GLint -> GL ())
GL_EXT(glGetInteger64i_v, GLenum -> GLuint -> Ptr GLint64 -> GL ())
GL_EXT(glGetBufferParameteri64v, GLenum -> GLenum -> Ptr GLint64 -> GL ())
GL_EXT(glGenSamplers, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glDeleteSamplers, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glIsSampler, GLuint -> GL GLboolean)
GL_EXT(glBindSampler, GLuint -> GLuint -> GL ())
GL_EXT(glSamplerParameteri, GLuint -> GLenum -> GLint -> GL ())
GL_EXT(glSamplerParameteriv, GLuint -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glSamplerParameterf, GLuint -> GLenum -> GLfloat -> GL ())
GL_EXT(glSamplerParameterfv, GLuint -> GLenum -> Ptr GLfloat -> GL ())
GL_EXT(glGetSamplerParameteriv, GLuint -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glGetSamplerParameterfv, GLuint -> GLenum -> Ptr GLfloat -> GL ())
GL_EXT(glVertexAttribDivisor, GLuint -> GLuint -> GL ())
GL_EXT(glBindTransformFeedback, GLenum -> GLuint -> GL ())
GL_EXT(glDeleteTransformFeedbacks, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glGenTransformFeedbacks, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glIsTransformFeedback, GLuint -> GL GLboolean)
GL_EXT(glPauseTransformFeedback, GL ())
GL_EXT(glResumeTransformFeedback, GL ())
GL_EXT(glGetProgramBinary, GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLenum -> Ptr () -> GL ())
GL_EXT(glProgramBinary, GLuint -> GLenum -> Ptr () -> GLsizei -> GL ())
GL_EXT(glProgramParameteri, GLuint -> GLenum -> GLint -> GL ())
GL_EXT(glInvalidateFramebuffer, GLenum -> GLsizei -> Ptr GLenum -> GL ())
GL_EXT(glInvalidateSubFramebuffer, GLenum -> GLsizei -> Ptr GLenum -> GLint -> GLint -> GLsizei -> GLsizei -> GL ())
GL_EXT(glTexStorage2D, GLenum -> GLsizei -> GLenum -> GLsizei -> GLsizei -> GL ())
GL_EXT(glTexStorage3D, GLenum -> GLsizei -> GLenum -> GLsizei -> GLsizei -> GLsizei -> GL ())
GL_EXT(glGetInternalformativ, GLenum -> GLenum -> GLenum -> GLsizei -> Ptr GLint -> GL ())

-- ** Extensions

GL_EXT(glDrawTexiOES, GLint -> GLint -> GLint -> GLint -> GLint -> GL ())
GL_EXT(glMultiDrawArraysEXT, GLenum -> Ptr GLint -> Ptr GLsizei -> GLsizei -> GL ())
GL_EXT(glMultiDrawElementsEXT, GLenum -> Ptr GLsizei -> GLenum -> Ptr (Ptr ()) -> GLsizei -> GL ())
GL_DUP(glBindVertexArrayOES,glBindVertexArray, GLuint -> GL ())
GL_DUP(glDeleteVertexArraysOES,glDeleteVertexArrays, GLsizei -> Ptr GLuint -> GL ())
GL_DUP(glGenVertexArraysOES,glGenVertexArrays, GLsizei -> Ptr GLuint -> GL ())
GL_DUP(glIsVertexArrayOES,glIsVertexArray, GLuint -> GL GLboolean)

-- ** OpenGL ES 3.1

GL_EXT(glDispatchCompute, GLuint -> GLuint -> GLuint -> GL ())
GL_EXT(glDispatchComputeIndirect, GLintptr -> GL ())
GL_EXT(glDrawArraysIndirect, GLenum -> Ptr () -> GL ())
GL_EXT(glDrawElementsIndirect, GLenum -> GLenum -> Ptr () -> GL ())
GL_EXT(glFramebufferParameteri, GLenum -> GLenum -> GLint -> GL ())
GL_EXT(glGetFramebufferParameteriv, GLenum -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glGetProgramInterfaceiv, GLuint -> GLenum -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glGetProgramResourceIndex, GLuint -> GLenum -> Ptr GLchar -> GL ())
GL_EXT(glGetProgramResourceName, GLuint -> GLenum -> GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLchar -> GL ())
GL_EXT(glGetProgramResourceiv, GLuint -> GLenum -> GLuint -> GLsizei -> Ptr GLenum -> GLsizei -> Ptr GLsizei -> Ptr GLint -> GL ())
GL_EXT(glGetProgramResourceLocation, GLuint -> GLenum -> Ptr GLchar -> GL ())
GL_EXT(glUseProgramStages, GLuint -> GLbitfield -> GLuint -> GL ())
GL_EXT(glActiveShaderProgram, GLuint -> GLuint -> GL ())
GL_EXT(glCreateShaderProgramv, GLenum -> GLsizei -> Ptr CString -> GL ())
GL_EXT(glBindProgramPipeline, GLuint -> GL ())
GL_EXT(glDeleteProgramPipelines, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glGenProgramPipelines, GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glIsProgramPipeline, GLuint -> GL ())
GL_EXT(glGetProgramPipelineiv, GLuint -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glProgramUniform1i, GLuint -> GLint -> GLint -> GL ())
GL_EXT(glProgramUniform2i, GLuint -> GLint -> GLint -> GLint -> GL ())
GL_EXT(glProgramUniform3i, GLuint -> GLint -> GLint -> GLint -> GLint -> GL ())
GL_EXT(glProgramUniform4i, GLuint -> GLint -> GLint -> GLint -> GLint -> GLint -> GL ())
GL_EXT(glProgramUniform1ui, GLuint -> GLint -> GLuint -> GL ())
GL_EXT(glProgramUniform2ui, GLuint -> GLint -> GLuint -> GLuint -> GL ())
GL_EXT(glProgramUniform3ui, GLuint -> GLint -> GLuint -> GLuint -> GLuint -> GL ())
GL_EXT(glProgramUniform4ui, GLuint -> GLint -> GLuint -> GLuint -> GLuint -> GLuint -> GL ())
GL_EXT(glProgramUniform1f, GLuint -> GLint -> GLfloat -> GL ())
GL_EXT(glProgramUniform2f, GLuint -> GLint -> GLfloat -> GLfloat -> GL ())
GL_EXT(glProgramUniform3f, GLuint -> GLint -> GLfloat -> GLfloat -> GLfloat -> GL ())
GL_EXT(glProgramUniform4f, GLuint -> GLint -> GLfloat -> GLfloat -> GLfloat -> GLfloat -> GL ())
GL_EXT(glProgramUniform1iv, GLuint -> GLint -> GLsizei -> Ptr GLint -> GL ())
GL_EXT(glProgramUniform2iv, GLuint -> GLint -> GLsizei -> Ptr GLint -> GL ())
GL_EXT(glProgramUniform3iv, GLuint -> GLint -> GLsizei -> Ptr GLint -> GL ())
GL_EXT(glProgramUniform4iv, GLuint -> GLint -> GLsizei -> Ptr GLint -> GL ())
GL_EXT(glProgramUniform1uiv, GLuint -> GLint -> GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glProgramUniform2uiv, GLuint -> GLint -> GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glProgramUniform3uiv, GLuint -> GLint -> GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glProgramUniform4uiv, GLuint -> GLint -> GLsizei -> Ptr GLuint -> GL ())
GL_EXT(glProgramUniform1fv, GLuint -> GLint -> GLsizei -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniform2fv, GLuint -> GLint -> GLsizei -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniform3fv, GLuint -> GLint -> GLsizei -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniform4fv, GLuint -> GLint -> GLsizei -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix2fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix3fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix4fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix2x3fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix3x2fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix2x4fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix4x2fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix3x4fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glProgramUniformMatrix4x3fv, GLuint -> GLint -> GLsizei -> GLboolean -> Ptr GLfloat -> GL ())
GL_EXT(glValidateProgramPipeline, GLuint -> GL ())
GL_EXT(glGetProgramPipelineInfoLog, GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLchar -> GL ())
GL_EXT(glBindImageTexture, GLuint -> GLuint -> GLint -> GLboolean -> GLint -> GLenum -> GLenum -> GL ())
GL_EXT(glGetBooleani_v, GLenum -> GLuint -> Ptr GLboolean -> GL ())
GL_EXT(glMemoryBarrier, GLbitfield -> GL ())
GL_EXT(glMemoryBarrierByRegion, GLbitfield -> GL ())
GL_EXT(glTexStorage2DMultisample, GLenum -> GLsizei -> GLenum -> GLsizei -> GLsizei -> GLboolean -> GL ())
GL_EXT(glGetMultisamplefv, GLenum -> GLuint -> Ptr GLfloat -> GL ())
GL_EXT(glSampleMaski, GLuint -> GLbitfield -> GL ())
GL_EXT(glGetTexLevelParameteriv, GLenum -> GLint -> GLenum -> Ptr GLint -> GL ())
GL_EXT(glGetTexLevelParameterfv, GLenum -> GLint -> GLenum -> Ptr GLfloat -> GL ())
GL_EXT(glBindVertexBuffer, GLuint -> GLuint -> GLintptr -> GLsizei -> GL ())
GL_EXT(glVertexAttribFormat, GLuint -> GLint -> GLenum -> GLboolean -> GLuint -> GL ())
GL_EXT(glVertexAttribIFormat, GLuint -> GLint -> GLenum -> GLuint -> GL ())
GL_EXT(glVertexAttribBinding, GLuint -> GLuint -> GL ())
GL_EXT(glVertexBindingDivisor, GLuint -> GLuint -> GL ())