From 1a7235252e7b304a4d4317c49d7d9d103ed0f7d3 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 5 Dec 2021 21:28:55 -0600 Subject: [PATCH] more opengles functionality --- modules/opengles/onyx_opengles.c | 371 +++++++++++++++++++----------- modules/opengles/onyx_opengles.so | Bin 40032 -> 126616 bytes 2 files changed, 243 insertions(+), 128 deletions(-) diff --git a/modules/opengles/onyx_opengles.c b/modules/opengles/onyx_opengles.c index e49528e3..de046205 100644 --- a/modules/opengles/onyx_opengles.c +++ b/modules/opengles/onyx_opengles.c @@ -9,24 +9,86 @@ return NULL; \ } +#define ONYX_GL_0_RET_INT(name) \ + ONYX_DEF(name, (), ()) { \ + results->data[0] = WASM_I32_VAL( name () ); \ + return NULL; \ + } + #define ONYX_GL_INT_1(name) \ ONYX_DEF(name, (INT), ()) { \ name (params->data[0].of.i32); \ return NULL; \ } +#define ONYX_GL_INT_1_RET_INT(name) \ + ONYX_DEF(name, (INT), (INT)) { \ + results->data[0] = WASM_I32_VAL( name (params->data[0].of.i32) ); \ + } + #define ONYX_GL_INT_2(name) \ ONYX_DEF(name, (INT, INT), ()) { \ - name (params->data[0].of.i32, params->data[0].of.i32); \ + name (params->data[0].of.i32, params->data[1].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_2_RET_INT(name) \ + ONYX_DEF(name, (INT, INT), (INT)) { \ + results->data[0] = WASM_I32_VAL( name (params->data[0].of.i32, params->data[1].of.i32) ); \ + return NULL; \ + } + +#define ONYX_GL_INT_3(name) \ + ONYX_DEF(name, (INT, INT, INT), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_4(name) \ + ONYX_DEF(name, (INT, INT, INT, INT), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, params->data[3].of.i32); \ return NULL; \ } +#define ONYX_GL_FLOAT_1(name) \ + ONYX_DEF(name, (FLOAT), ()) { \ + name (params->data[0].of.f32); \ + return NULL; \ + } + +#define ONYX_GL_FLOAT_2(name) \ + ONYX_DEF(name, (FLOAT, FLOAT), ()) { \ + name (params->data[0].of.f32, params->data[1].of.f32); \ + return NULL; \ + } + +#define ONYX_GL_FLOAT_4(name) \ + ONYX_DEF(name, (FLOAT, FLOAT, FLOAT, FLOAT), ()) { \ + name (params->data[0].of.f32, params->data[1].of.f32, params->data[2].of.f32, params->data[3].of.f32); \ + return NULL; \ + } + +#define ONYX_GL_INT_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, PTR), ()) { \ + name (params->data[0].of.i32, (ptr_type *) ONYX_PTR(params->data[1].of.i32)); \ + return NULL; \ + } + +#define ONYX_GL_INT_2_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, (ptr_type *) ONYX_PTR(params->data[2].of.i32)); \ + return NULL; \ + } + + ONYX_GL_0(glFinish) ONYX_GL_0(glFlush) ONYX_GL_0(glReleaseShaderCompiler) ONYX_GL_0(glEndTransformFeedback) ONYX_GL_0(glPauseTransformFeedback) ONYX_GL_0(glResumeTransformFeedback) +ONYX_GL_0_RET_INT(glCreateProgram) +ONYX_GL_0_RET_INT(glGetError) ONYX_GL_INT_1(glActiveTexture) ONYX_GL_INT_1(glClear) ONYX_GL_INT_1(glEnable) @@ -57,130 +119,172 @@ ONYX_GL_INT_2(glBindBuffer) ONYX_GL_INT_2(glBindFramebuffer) ONYX_GL_INT_2(glBindRenderbuffer) ONYX_GL_INT_2(glBindTexture) -// glBlendEquationSeparate :: (modeRGB: GLenum, modeAlpha: GLenum) -> void --- -// glBlendFunc :: (sfactor: GLenum, dfactor: GLenum) -> void --- -// glDetachShader :: (program: GLuint, shader: GLuint) -> void --- -// glHint :: (target: GLenum, mode: GLenum) -> void --- -// glPixelStorei :: (pname: GLenum, param: GLint) -> void --- -// glStencilMaskSeparate :: (face: GLenum, mask: GLuint) -> void --- +ONYX_GL_INT_2(glBlendEquationSeparate) +ONYX_GL_INT_2(glBlendFunc) +ONYX_GL_INT_2(glDetachShader) +ONYX_GL_INT_2(glHint) +ONYX_GL_INT_2(glPixelStorei) +ONYX_GL_INT_2(glStencilMaskSeparate) +ONYX_GL_INT_2(glBeginQuery) +ONYX_GL_INT_2(glBindSampler) +ONYX_GL_INT_2(glVertexAttribDivisor) +ONYX_GL_INT_2(glBindTransformFeedback) +ONYX_GL_INT_1_RET_INT(glCheckFramebufferStatus) +ONYX_GL_INT_1_RET_INT(glCreateShader) +ONYX_GL_INT_1_RET_INT(glIsBuffer) +ONYX_GL_INT_1_RET_INT(glIsEnabled) +ONYX_GL_INT_1_RET_INT(glIsFramebuffer) +ONYX_GL_INT_1_RET_INT(glIsProgram ) +ONYX_GL_INT_1_RET_INT(glIsRenderbuffer) +ONYX_GL_INT_1_RET_INT(glIsShader) +ONYX_GL_INT_1_RET_INT(glIsTexture) +ONYX_GL_INT_1_RET_INT(glIsQuery) +ONYX_GL_INT_1_RET_INT(glUnmapBuffer) +ONYX_GL_INT_1_RET_INT(glIsVertexArray) +// ONYX_GL_INT_1_RET_INT(glIsSync) +ONYX_GL_INT_1_RET_INT(glIsTransformFeedback) +ONYX_GL_INT_1_RET_INT(glIsSampler) +// ONYX_GL_INT_2_RET_INT(glFenceSync) +ONYX_GL_FLOAT_1(glClearDepthf) +ONYX_GL_FLOAT_2(glDepthRangef) +ONYX_GL_FLOAT_2(glPolygonOffset) +ONYX_GL_FLOAT_4(glClearColor) +ONYX_GL_FLOAT_4(glBlendColor) + +ONYX_GL_INT_PTR(glDeleteBuffers, GLuint) +ONYX_GL_INT_PTR(glDeleteFramebuffers, GLuint) +ONYX_GL_INT_PTR(glDeleteRenderbuffers, GLuint) +ONYX_GL_INT_PTR(glDeleteTextures, GLuint) +ONYX_GL_INT_PTR(glGenBuffers, GLuint) +ONYX_GL_INT_PTR(glGenFramebuffers, GLuint) +ONYX_GL_INT_PTR(glGenRenderbuffers, GLuint) +ONYX_GL_INT_PTR(glGenTextures, GLuint) +ONYX_GL_INT_PTR(glGetAttribLocation, GLchar) +ONYX_GL_INT_PTR(glGetBooleanv, GLboolean) +ONYX_GL_INT_PTR(glGetFloatv, GLfloat) +ONYX_GL_INT_PTR(glGetIntegerv, GLint) +ONYX_GL_INT_PTR(glGetUniformLocation, GLchar) +ONYX_GL_INT_PTR(glVertexAttrib1fv, GLfloat) +ONYX_GL_INT_PTR(glVertexAttrib2fv, GLfloat) +ONYX_GL_INT_PTR(glVertexAttrib3fv, GLfloat) +ONYX_GL_INT_PTR(glVertexAttrib4fv, GLfloat) +ONYX_GL_INT_PTR(glGenQueries, GLuint) +ONYX_GL_INT_PTR(glDeleteQueries, GLuint) +ONYX_GL_INT_PTR(glDrawBuffers, GLenum) +ONYX_GL_INT_PTR(glDeleteVertexArrays, GLuint) +ONYX_GL_INT_PTR(glGenVertexArrays, GLuint) +ONYX_GL_INT_PTR(glGenSamplers, GLuint) +ONYX_GL_INT_PTR(glGetInteger64v, GLint64) +ONYX_GL_INT_PTR(glDeleteSamplers, GLuint) +ONYX_GL_INT_PTR(glDeleteTransformFeedbacks, GLuint) +ONYX_GL_INT_PTR(glGenTransformFeedbacks, GLuint) +ONYX_GL_INT_PTR(glGetFragDataLocation, GLchar) +ONYX_GL_INT_PTR(glVertexAttribI4iv, GLint) +ONYX_GL_INT_PTR(glVertexAttribI4uiv, GLuint) +ONYX_GL_INT_3(glDrawArrays) +ONYX_GL_INT_3(glStencilFunc) +ONYX_GL_INT_3(glStencilOp) +ONYX_GL_INT_3(glFlushMappedBufferRange) +ONYX_GL_INT_3(glBindBufferBase) +ONYX_GL_INT_3(glSamplerParameteri) +ONYX_GL_INT_4(glBlendFuncSeparate) +ONYX_GL_INT_4(glColorMask) +ONYX_GL_INT_4(glScissor) +ONYX_GL_INT_4(glStencilFuncSeparate) +ONYX_GL_INT_4(glViewport) +ONYX_GL_INT_4(glMapBufferRange) + +ONYX_GL_INT_2_PTR(glBindAttribLocation, GLchar) +ONYX_GL_INT_2_PTR(glGetBufferParameteriv, GLint) +ONYX_GL_INT_2_PTR(glGetProgramiv, GLint) +ONYX_GL_INT_2_PTR(glGetRenderbufferParameteriv, GLint) +ONYX_GL_INT_2_PTR(glGetShaderiv, GLint) +ONYX_GL_INT_2_PTR(glGetTexParameterfv, GLfloat) +ONYX_GL_INT_2_PTR(glGetTexParameteriv, GLint) +ONYX_GL_INT_2_PTR(glGetUniformfv, GLfloat) +ONYX_GL_INT_2_PTR(glGetUniformiv, GLint) +ONYX_GL_INT_2_PTR(glGetVertexAttribfv, GLfloat) +ONYX_GL_INT_2_PTR(glGetVertexAttribiv, GLint) +ONYX_GL_INT_2_PTR(glTexParameterfv, GLfloat) +ONYX_GL_INT_2_PTR(glTexParameteriv, GLint) +ONYX_GL_INT_2_PTR(glUniform1fv, GLfloat) +ONYX_GL_INT_2_PTR(glUniform1iv, GLint) +ONYX_GL_INT_2_PTR(glUniform2fv, GLfloat) +ONYX_GL_INT_2_PTR(glUniform2iv, GLint) +ONYX_GL_INT_2_PTR(glUniform3fv, GLfloat) +ONYX_GL_INT_2_PTR(glUniform3iv, GLint) +ONYX_GL_INT_2_PTR(glUniform4fv, GLfloat) +ONYX_GL_INT_2_PTR(glUniform4iv, GLint) +ONYX_GL_INT_2_PTR(glGetQueryiv, GLint) +ONYX_GL_INT_2_PTR(glGetQueryObjectuiv, GLuint) +ONYX_GL_INT_2_PTR(glGetInteger64i_v, GLint64) +ONYX_GL_INT_2_PTR(glGetBufferParameteri64v, GLint64) +ONYX_GL_INT_2_PTR(glSamplerParameteriv, GLint) +ONYX_GL_INT_2_PTR(glSamplerParameterfv, GLfloat) +ONYX_GL_INT_2_PTR(glGetSamplerParameteriv, GLint) +ONYX_GL_INT_2_PTR(glGetSamplerParameterfv, GLfloat) + +// glSamplerParameterf :: (sampler: GLuint, pname: GLenum, param: GLfloat) -> void --- -ONYX_DEF(glClearColor, (FLOAT, FLOAT, FLOAT, FLOAT), ()) { - glClearColor( - params->data[0].of.f32, - params->data[1].of.f32, - params->data[2].of.f32, - params->data[3].of.f32); - return NULL; -} +// glGetBufferPointerv :: (target: GLenum, pname: GLenum, params: ^rawptr) -> void --- +// glGetVertexAttribPointerv :: (index: GLuint, pname: GLenum, pointer: ^rawptr) -> void --- -// glBindAttribLocation :: (program: GLuint, index: GLuint, name: ^GLchar) -> void --- -// glBlendColor :: (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) -> void --- -// glBlendFuncSeparate :: (sfactorRGB: GLenum, dfactorRGB: GLenum, sfactorAlpha: GLenum, dfactorAlpha: GLenum) -> void --- // glBufferData :: (target: GLenum, size: GLsizeiptr, data: rawptr, usage: GLenum) -> void --- // glBufferSubData :: (target: GLenum, offset: GLintptr, size: GLsizeiptr, data: rawptr) -> void --- -// glCheckFramebufferStatus :: (target: GLenum) -> GLenum --- -// glClearDepthf :: (d: GLfloat) -> void --- -// glColorMask :: (red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) -> void --- // glCompressedTexImage2D :: (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, data: rawptr) -> void --- // glCompressedTexSubImage2D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, data: rawptr) -> void --- // glCopyTexImage2D :: (target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) -> void --- // glCopyTexSubImage2D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- -// glCreateProgram :: () -> GLuint --- -// glCreateShader :: (type: GLenum) -> GLuint --- -// glDeleteBuffers :: (n: GLsizei, buffers: ^GLuint) -> void --- -// glDeleteFramebuffers :: (n: GLsizei, framebuffers: ^GLuint) -> void --- -// glDeleteRenderbuffers :: (n: GLsizei, renderbuffers: ^GLuint) -> void --- -// glDeleteTextures :: (n: GLsizei, textures: ^GLuint) -> void --- -// glDepthRangef :: (n: GLfloat, f: GLfloat) -> void --- -// glDrawArrays :: (mode: GLenum, first: GLint, count: GLsizei) -> void --- // glDrawElements :: (mode: GLenum, count: GLsizei, type: GLenum, indices: rawptr) -> void --- // glFramebufferRenderbuffer :: (target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: GLuint) -> void --- // glFramebufferTexture2D :: (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint) -> void --- -// glGenBuffers :: (n: GLsizei, buffers: ^GLuint) -> void --- -// glGenFramebuffers :: (n: GLsizei, framebuffers: ^GLuint) -> void --- -// glGenRenderbuffers :: (n: GLsizei, renderbuffers: ^GLuint) -> void --- -// glGenTextures :: (n: GLsizei, textures: ^GLuint) -> void --- // glGetActiveAttrib :: (program: GLuint, index: GLuint, bufSize: GLsizei, length: ^GLsizei, size: ^GLint, type: ^GLenum, name: ^GLchar) -> void --- // glGetActiveUniform :: (program: GLuint, index: GLuint, bufSize: GLsizei, length: ^GLsizei, size: ^GLint, type: ^GLenum, name: ^GLchar) -> void --- // glGetAttachedShaders :: (program: GLuint, maxCount: GLsizei, count: ^GLsizei, shaders: ^GLuint) -> void --- -// glGetAttribLocation :: (program: GLuint, name: ^GLchar) -> GLint --- -// glGetBooleanv :: (pname: GLenum, data: ^GLboolean) -> void --- -// glGetBufferParameteriv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- -// glGetError :: () -> GLenum --- -// glGetFloatv :: (pname: GLenum, data: ^GLfloat) -> void --- // glGetFramebufferAttachmentParameteriv :: (target: GLenum, attachment: GLenum, pname: GLenum, params: ^GLint) -> void --- -// glGetIntegerv :: (pname: GLenum, data: ^GLint) -> void --- -// glGetProgramiv :: (program: GLuint, pname: GLenum, params: ^GLint) -> void --- // glGetProgramInfoLog :: (program: GLuint, bufSize: GLsizei, length: ^GLsizei, infoLog: ^GLchar) -> void --- -// glGetRenderbufferParameteriv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- -// glGetShaderiv :: (shader: GLuint, pname: GLenum, params: ^GLint) -> void --- // glGetShaderInfoLog :: (shader: GLuint, bufSize: GLsizei, length: ^GLsizei, infoLog: ^GLchar) -> void --- // glGetShaderPrecisionFormat :: (shadertype: GLenum, precisiontype: GLenum, range: ^GLint, precision: ^GLint) -> void --- // glGetShaderSource :: (shader: GLuint, bufSize: GLsizei, length: ^GLsizei, source: ^GLchar) -> void --- // glGetString :: (name: GLenum) -> ^GLubyte --- -// glGetTexParameterfv :: (target: GLenum, pname: GLenum, params: ^GLfloat) -> void --- -// glGetTexParameteriv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- -// glGetUniformfv :: (program: GLuint, location: GLint, params: ^GLfloat) -> void --- -// glGetUniformiv :: (program: GLuint, location: GLint, params: ^GLint) -> void --- -// glGetUniformLocation :: (program: GLuint, name: ^GLchar) -> GLint --- -// glGetVertexAttribfv :: (index: GLuint, pname: GLenum, params: ^GLfloat) -> void --- -// glGetVertexAttribiv :: (index: GLuint, pname: GLenum, params: ^GLint) -> void --- -// glGetVertexAttribPointerv :: (index: GLuint, pname: GLenum, pointer: ^rawptr) -> void --- -// glIsBuffer :: (buffer: GLuint) -> GLboolean --- -// glIsEnabled :: (cap: GLenum) -> GLboolean --- -// glIsFramebuffer :: (framebuffer: GLuint) -> GLboolean --- -// glIsProgram :: (program: GLuint) -> GLboolean --- -// glIsRenderbuffer :: (renderbuffer: GLuint) -> GLboolean --- -// glIsShader :: (shader: GLuint) -> GLboolean --- -// glIsTexture :: (texture: GLuint) -> GLboolean --- -// glPolygonOffset :: (factor: GLfloat, units: GLfloat) -> void --- // glReadPixels :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: rawptr) -> void --- // glRenderbufferStorage :: (target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) -> void --- // glSampleCoverage :: (value: GLfloat, invert: GLboolean) -> void --- -// glScissor :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- // glShaderBinary :: (count: GLsizei, shaders: ^GLuint, binaryformat: GLenum, binary: rawptr, length: GLsizei) -> void --- // glShaderSource :: (shader: GLuint, count: GLsizei, conststring: ^^GLchar, length: ^GLint) -> void --- -// glStencilFunc :: (func: GLenum, ref: GLint, mask: GLuint) -> void --- -// glStencilFuncSeparate :: (face: GLenum, func: GLenum, ref: GLint, mask: GLuint) -> void --- -// glStencilOp :: (fail: GLenum, zfail: GLenum, zpass: GLenum) -> void --- // glStencilOpSeparate :: (face: GLenum, sfail: GLenum, dpfail: GLenum, dppass: GLenum) -> void --- // glTexImage2D :: (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: rawptr) -> void --- // glTexParameterf :: (target: GLenum, pname: GLenum, param: GLfloat) -> void --- -// glTexParameterfv :: (target: GLenum, pname: GLenum, params: ^GLfloat) -> void --- // glTexParameteri :: (target: GLenum, pname: GLenum, param: GLint) -> void --- -// glTexParameteriv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- // glTexSubImage2D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: rawptr) -> void --- // glUniform1f :: (location: GLint, v0: GLfloat) -> void --- -// glUniform1fv :: (location: GLint, count: GLsizei, value: ^GLfloat) -> void --- // glUniform1i :: (location: GLint, v0: GLint) -> void --- -// glUniform1iv :: (location: GLint, count: GLsizei, value: ^GLint) -> void --- // glUniform2f :: (location: GLint, v0: GLfloat, v1: GLfloat) -> void --- -// glUniform2fv :: (location: GLint, count: GLsizei, value: ^GLfloat) -> void --- // glUniform2i :: (location: GLint, v0: GLint, v1: GLint) -> void --- -// glUniform2iv :: (location: GLint, count: GLsizei, value: ^GLint) -> void --- // glUniform3f :: (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat) -> void --- -// glUniform3fv :: (location: GLint, count: GLsizei, value: ^GLfloat) -> void --- // glUniform3i :: (location: GLint, v0: GLint, v1: GLint, v2: GLint) -> void --- -// glUniform3iv :: (location: GLint, count: GLsizei, value: ^GLint) -> void --- // glUniform4f :: (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat, v3: GLfloat) -> void --- -// glUniform4fv :: (location: GLint, count: GLsizei, value: ^GLfloat) -> void --- // glUniform4i :: (location: GLint, v0: GLint, v1: GLint, v2: GLint, v3: GLint) -> void --- -// glUniform4iv :: (location: GLint, count: GLsizei, value: ^GLint) -> void --- // glUniformMatrix2fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- // glUniformMatrix3fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- // glUniformMatrix4fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- // glVertexAttrib1f :: (index: GLuint, x: GLfloat) -> void --- -// glVertexAttrib1fv :: (index: GLuint, v: ^GLfloat) -> void --- // glVertexAttrib2f :: (index: GLuint, x: GLfloat, y: GLfloat) -> void --- -// glVertexAttrib2fv :: (index: GLuint, v: ^GLfloat) -> void --- // glVertexAttrib3f :: (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) -> void --- -// glVertexAttrib3fv :: (index: GLuint, v: ^GLfloat) -> void --- // glVertexAttrib4f :: (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) -> void --- -// glVertexAttrib4fv :: (index: GLuint, v: ^GLfloat) -> void --- // glVertexAttribPointer :: (index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, pointer: rawptr) -> void --- -// glViewport :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- - +// glGetIntegeri_v :: (target: GLenum, index: GLuint, data: ^GLint) -> void --- +// glGetVertexAttribIiv :: (index: GLuint, pname: GLenum, params: ^GLint) -> void --- +// glGetVertexAttribIuiv :: (index: GLuint, pname: GLenum, params: ^GLuint) -> void --- +// glGetUniformuiv :: (program: GLuint, location: GLint, params: ^GLuint) -> void --- +// glUniform1uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- +// glUniform2uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- +// glUniform3uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- +// glUniform4uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- +// glClearBufferiv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLint) -> void --- +// glClearBufferuiv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLuint) -> void --- +// glClearBufferfv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLfloat) -> void --- // Open3: GLES // glDrawRangeElements :: (mode: GLenum, start: GLuint, end: GLuint, count: GLsizei, type: GLenum, indices: rawptr) -> void --- // glTexImage3D :: (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: rawptr) -> void --- @@ -188,15 +292,6 @@ ONYX_DEF(glClearColor, (FLOAT, FLOAT, FLOAT, FLOAT), ()) { // glCopyTexSubImage3D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- // glCompressedTexImage3D :: (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, data: rawptr) -> void --- // glCompressedTexSubImage3D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, data: rawptr) -> void --- -// glGenQueries :: (n: GLsizei, ids: ^GLuint) -> void --- -// glDeleteQueries :: (n: GLsizei, ids: ^GLuint) -> void --- -// glIsQuery :: (id: GLuint) -> GLboolean --- -// glBeginQuery :: (target: GLenum, id: GLuint) -> void --- -// glGetQueryiv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- -// glGetQueryObjectuiv :: (id: GLuint, pname: GLenum, params: ^GLuint) -> void --- -// glUnmapBuffer :: (target: GLenum) -> GLboolean --- -// glGetBufferPointerv :: (target: GLenum, pname: GLenum, params: ^rawptr) -> void --- -// glDrawBuffers :: (n: GLsizei, bufs: ^GLenum) -> void --- // glUniformMatrix2x3fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- // glUniformMatrix3x2fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- // glUniformMatrix2x4fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- @@ -206,36 +301,16 @@ ONYX_DEF(glClearColor, (FLOAT, FLOAT, FLOAT, FLOAT), ()) { // glBlitFramebuffer :: (srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum) -> void --- // glRenderbufferStorageMultisample :: (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) -> void --- // glFramebufferTextureLayer :: (target: GLenum, attachment: GLenum, texture: GLuint, level: GLint, layer: GLint) -> void --- -// glMapBufferRange :: (target: GLenum, offset: GLintptr, length: GLsizeiptr, access: GLbitfield) -> rawptr --- -// glFlushMappedBufferRange :: (target: GLenum, offset: GLintptr, length: GLsizeiptr) -> void --- -// glDeleteVertexArrays :: (n: GLsizei, arrays: ^GLuint) -> void --- -// glGenVertexArrays :: (n: GLsizei, arrays: ^GLuint) -> void --- -// glIsVertexArray :: (array: GLuint) -> GLboolean --- -// glGetIntegeri_v :: (target: GLenum, index: GLuint, data: ^GLint) -> void --- // glBindBufferRange :: (target: GLenum, index: GLuint, buffer: GLuint, offset: GLintptr, size: GLsizeiptr) -> void --- -// glBindBufferBase :: (target: GLenum, index: GLuint, buffer: GLuint) -> void --- // glTransformFeedbackVaryings :: (program: GLuint, count: GLsizei, varyings: ^^GLchar, bufferMode: GLenum) -> void --- // glGetTransformFeedbackVarying :: (program: GLuint, index: GLuint, bufSize: GLsizei, length: ^GLsizei, size: ^GLsizei, type: ^GLenum, name: ^GLchar) -> void --- // glVertexAttribIPointer :: (index: GLuint, size: GLint, type: GLenum, stride: GLsizei, pointer: rawptr) -> void --- -// glGetVertexAttribIiv :: (index: GLuint, pname: GLenum, params: ^GLint) -> void --- -// glGetVertexAttribIuiv :: (index: GLuint, pname: GLenum, params: ^GLuint) -> void --- // glVertexAttribI4i :: (index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint) -> void --- // glVertexAttribI4ui :: (index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint) -> void --- -// glVertexAttribI4iv :: (index: GLuint, v: ^GLint) -> void --- -// glVertexAttribI4uiv :: (index: GLuint, v: ^GLuint) -> void --- -// glGetUniformuiv :: (program: GLuint, location: GLint, params: ^GLuint) -> void --- -// glGetFragDataLocation :: (program: GLuint, name: ^GLchar) -> GLint --- // glUniform1ui :: (location: GLint, v0: GLuint) -> void --- // glUniform2ui :: (location: GLint, v0: GLuint, v1: GLuint) -> void --- // glUniform3ui :: (location: GLint, v0: GLuint, v1: GLuint, v2: GLuint) -> void --- // glUniform4ui :: (location: GLint, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint) -> void --- -// glUniform1uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- -// glUniform2uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- -// glUniform3uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- -// glUniform4uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- -// glClearBufferiv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLint) -> void --- -// glClearBufferuiv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLuint) -> void --- -// glClearBufferfv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLfloat) -> void --- // glClearBufferfi :: (buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint) -> void --- // glGetStringi :: (name: GLenum, index: GLuint) -> ^GLubyte --- // glCopyBufferSubData :: (readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr) -> void --- @@ -247,29 +322,9 @@ ONYX_DEF(glClearColor, (FLOAT, FLOAT, FLOAT, FLOAT), ()) { // glUniformBlockBinding :: (program: GLuint, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint) -> void --- // glDrawArraysInstanced :: (mode: GLenum, first: GLint, count: GLsizei, instancecount: GLsizei) -> void --- // glDrawElementsInstanced :: (mode: GLenum, count: GLsizei, type: GLenum, indices: rawptr, instancecount: GLsizei) -> void --- -// glFenceSync :: (condition: GLenum, flags: GLbitfield) -> GLsync --- -// glIsSync :: (sync: GLsync) -> GLboolean --- // glClientWaitSync :: (sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> GLenum --- // glWaitSync :: (sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> void --- -// glGetInteger64v :: (pname: GLenum, data: ^GLint64) -> void --- // glGetSynciv :: (sync: GLsync, pname: GLenum, bufSize: GLsizei, length: ^GLsizei, values: ^GLint) -> void --- -// glGetInteger64i_v :: (target: GLenum, index: GLuint, data: ^GLint64) -> void --- -// glGetBufferParameteri64v :: (target: GLenum, pname: GLenum, params: ^GLint64) -> void --- -// glGenSamplers :: (count: GLsizei, samplers: ^GLuint) -> void --- -// glDeleteSamplers :: (count: GLsizei, samplers: ^GLuint) -> void --- -// glIsSampler :: (sampler: GLuint) -> GLboolean --- -// glBindSampler :: (unit: GLuint, sampler: GLuint) -> void --- -// glSamplerParameteri :: (sampler: GLuint, pname: GLenum, param: GLint) -> void --- -// glSamplerParameteriv :: (sampler: GLuint, pname: GLenum, param: ^GLint) -> void --- -// glSamplerParameterf :: (sampler: GLuint, pname: GLenum, param: GLfloat) -> void --- -// glSamplerParameterfv :: (sampler: GLuint, pname: GLenum, param: ^GLfloat) -> void --- -// glGetSamplerParameteriv :: (sampler: GLuint, pname: GLenum, params: ^GLint) -> void --- -// glGetSamplerParameterfv :: (sampler: GLuint, pname: GLenum, params: ^GLfloat) -> void --- -// glVertexAttribDivisor :: (index: GLuint, divisor: GLuint) -> void --- -// glBindTransformFeedback :: (target: GLenum, id: GLuint) -> void --- -// glDeleteTransformFeedbacks :: (n: GLsizei, ids: ^GLuint) -> void --- -// glGenTransformFeedbacks :: (n: GLsizei, ids: ^GLuint) -> void --- -// glIsTransformFeedback :: (id: GLuint) -> GLboolean --- // glGetProgramBinary :: (program: GLuint, bufSize: GLsizei, length: ^GLsizei, binaryFormat: ^GLenum, binary: rawptr) -> void --- // glProgramBinary :: (program: GLuint, binaryFormat: GLenum, binary: rawptr, length: GLsizei) -> void --- // glProgramParameteri :: (program: GLuint, pname: GLenum, value: GLint) -> void --- @@ -317,6 +372,66 @@ ONYX_LIBRARY { ONYX_FUNC(glBindFramebuffer) ONYX_FUNC(glBindRenderbuffer) ONYX_FUNC(glBindTexture) + ONYX_FUNC(glCreateProgram) + ONYX_FUNC(glGetError) + ONYX_FUNC(glBlendEquationSeparate) + ONYX_FUNC(glBlendFunc) + ONYX_FUNC(glDetachShader) + ONYX_FUNC(glHint) + ONYX_FUNC(glPixelStorei) + ONYX_FUNC(glStencilMaskSeparate) + ONYX_FUNC(glBeginQuery) + ONYX_FUNC(glBindSampler) + ONYX_FUNC(glVertexAttribDivisor) + ONYX_FUNC(glBindTransformFeedback) + ONYX_FUNC(glCheckFramebufferStatus) + ONYX_FUNC(glCreateShader) + ONYX_FUNC(glIsBuffer) + ONYX_FUNC(glIsEnabled) + ONYX_FUNC(glIsFramebuffer) + ONYX_FUNC(glIsProgram ) + ONYX_FUNC(glIsRenderbuffer) + ONYX_FUNC(glIsShader) + ONYX_FUNC(glIsTexture) + ONYX_FUNC(glIsQuery) + ONYX_FUNC(glUnmapBuffer) + ONYX_FUNC(glIsVertexArray) + ONYX_FUNC(glIsTransformFeedback) + ONYX_FUNC(glIsSampler) + // ONYX_FUNC(glFenceSync) + ONYX_FUNC(glClearDepthf) + ONYX_FUNC(glDepthRangef) + ONYX_FUNC(glPolygonOffset) + ONYX_FUNC(glClearColor) + ONYX_FUNC(glBlendColor) + + ONYX_FUNC(glDeleteBuffers) + ONYX_FUNC(glDeleteFramebuffers) + ONYX_FUNC(glDeleteRenderbuffers) + ONYX_FUNC(glDeleteTextures) + ONYX_FUNC(glGenBuffers) + ONYX_FUNC(glGenFramebuffers) + ONYX_FUNC(glGenRenderbuffers) + ONYX_FUNC(glGenTextures) + ONYX_FUNC(glGetAttribLocation) + ONYX_FUNC(glGetBooleanv) + ONYX_FUNC(glGetFloatv) + ONYX_FUNC(glGetIntegerv) + ONYX_FUNC(glGetUniformLocation) + ONYX_FUNC(glVertexAttrib1fv) + ONYX_FUNC(glVertexAttrib2fv) + ONYX_FUNC(glVertexAttrib3fv) + ONYX_FUNC(glVertexAttrib4fv) + ONYX_FUNC(glGenQueries) + ONYX_FUNC(glDeleteQueries) + ONYX_FUNC(glDrawBuffers) + ONYX_FUNC(glDeleteVertexArrays) + ONYX_FUNC(glGenVertexArrays) + ONYX_FUNC(glGenSamplers) + ONYX_FUNC(glGetInteger64v) + ONYX_FUNC(glDeleteSamplers) + ONYX_FUNC(glDeleteTransformFeedbacks) + ONYX_FUNC(glGenTransformFeedbacks) NULL -}; \ No newline at end of file +}; diff --git a/modules/opengles/onyx_opengles.so b/modules/opengles/onyx_opengles.so index d79e114b3615820cdc96af6344c0434fd1adcfd6..f0829791308234b7fe88585adea8a3786e66b754 100755 GIT binary patch literal 126616 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 Cw;enH literal 40032 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 Rk7YXANB*8Pgn=lk{{t>lbe#YI -- 2.25.1