From 0cf50afa1e2e2f24adda44c7289965dc698a9b2f Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 6 Dec 2021 11:49:23 -0600 Subject: [PATCH] (mostly) completed opengles module --- include/onyx_library.h | 2 +- modules/opengles/module.onyx | 4 +- modules/opengles/onyx_opengles.c | 671 ++++++++++++++++++++++-------- modules/opengles/onyx_opengles.so | Bin 126616 -> 206520 bytes src/wasm_runtime.c | 2 +- test_library.so | Bin 15856 -> 0 bytes 6 files changed, 509 insertions(+), 170 deletions(-) delete mode 100755 test_library.so diff --git a/include/onyx_library.h b/include/onyx_library.h index dd755043..c2e3027f 100644 --- a/include/onyx_library.h +++ b/include/onyx_library.h @@ -56,4 +56,4 @@ typedef struct WasmFuncDefinition { #define DOUBLE WASM_F64 #define PTR WASM_I32 -#define ONYX_PTR(p) (wasm_memory_data(wasm_memory) + p) \ No newline at end of file +#define ONYX_PTR(p) (p != 0 ? (wasm_memory_data(wasm_memory) + p) : NULL) \ No newline at end of file diff --git a/modules/opengles/module.onyx b/modules/opengles/module.onyx index d19341bb..dd158c93 100644 --- a/modules/opengles/module.onyx +++ b/modules/opengles/module.onyx @@ -2,6 +2,9 @@ package opengles #library "./modules/opengles/onyx_opengles" +// Reference to an out parameter from OpenGL. +GLExternRef :: #distinct i64 + #foreign "onyx_opengles" { glActiveTexture :: (texture: GLenum) -> void --- glAttachShader :: (program: GLuint, shader: GLuint) -> void --- @@ -252,7 +255,6 @@ package opengles glTexStorage2D :: (target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) -> void --- glTexStorage3D :: (target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei) -> void --- glGetInternalformativ :: (target: GLenum, internalformat: GLenum, pname: GLenum, bufSize: GLsizei, params: ^GLint) -> void --- - } GLbyte :: i8; diff --git a/modules/opengles/onyx_opengles.c b/modules/opengles/onyx_opengles.c index de046205..c0de2445 100644 --- a/modules/opengles/onyx_opengles.c +++ b/modules/opengles/onyx_opengles.c @@ -10,7 +10,7 @@ } #define ONYX_GL_0_RET_INT(name) \ - ONYX_DEF(name, (), ()) { \ + ONYX_DEF(name, (), (INT)) { \ results->data[0] = WASM_I32_VAL( name () ); \ return NULL; \ } @@ -24,6 +24,7 @@ #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) ); \ + return NULL; \ } #define ONYX_GL_INT_2(name) \ @@ -50,12 +51,54 @@ return NULL; \ } +#define ONYX_GL_INT_5(name) \ + ONYX_DEF(name, (INT, 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, params->data[4].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_6(name) \ + ONYX_DEF(name, (INT, INT, 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, params->data[4].of.i32, params->data[5].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_7(name) \ + ONYX_DEF(name, (INT, INT, INT, 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, params->data[4].of.i32, params->data[5].of.i32, params->data[6].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_8(name) \ + ONYX_DEF(name, (INT, INT, INT, 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, params->data[4].of.i32, params->data[5].of.i32, params->data[6].of.i32, params->data[7].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_9(name) \ + ONYX_DEF(name, (INT, INT, INT, INT, 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, params->data[4].of.i32, params->data[5].of.i32, params->data[6].of.i32, params->data[7].of.i32, params->data[8].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_10(name) \ + ONYX_DEF(name, (INT, INT, INT, INT, INT, 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, params->data[4].of.i32, params->data[5].of.i32, params->data[6].of.i32, params->data[7].of.i32, params->data[8].of.i32, params->data[9].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_INT(name) \ + ONYX_DEF(name, (FLOAT, INT), ()) { \ + name (params->data[0].of.f32, params->data[1].of.i32); \ + return NULL; \ + } + #define ONYX_GL_FLOAT_2(name) \ ONYX_DEF(name, (FLOAT, FLOAT), ()) { \ name (params->data[0].of.f32, params->data[1].of.f32); \ @@ -80,6 +123,134 @@ return NULL; \ } +#define ONYX_GL_INT_3_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, (ptr_type *) params->data[3].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_4_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, params->data[3].of.i32, (ptr_type *) params->data[4].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_5_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, INT, INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, params->data[3].of.i32, params->data[4].of.i32, (ptr_type *) params->data[5].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_6_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, INT, INT, INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, params->data[3].of.i32, params->data[4].of.i32, params->data[5].of.i32, (ptr_type *) params->data[6].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_7_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, INT, INT, INT, INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, params->data[3].of.i32, params->data[4].of.i32, params->data[5].of.i32, params->data[6].of.i32, (ptr_type *) params->data[7].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_8_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, INT, INT, INT, INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, params->data[3].of.i32, params->data[4].of.i32, params->data[5].of.i32, params->data[6].of.i32, params->data[7].of.i32, (ptr_type *) params->data[8].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_9_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, INT, INT, INT, INT, INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, params->data[3].of.i32, params->data[4].of.i32, params->data[5].of.i32, params->data[6].of.i32, params->data[7].of.i32, params->data[8].of.i32, (ptr_type *) params->data[9].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_10_PTR(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, INT, INT, INT, INT, INT, INT, INT, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, params->data[3].of.i32, params->data[4].of.i32, params->data[5].of.i32, params->data[6].of.i32, params->data[7].of.i32, params->data[8].of.i32, params->data[9].of.i32, (ptr_type *) params->data[10].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_FLOAT(name) \ + ONYX_DEF(name, (INT, FLOAT), ()) { \ + name (params->data[0].of.i32, params->data[1].of.f32); \ + return NULL; \ + } + +#define ONYX_GL_INT_FLOAT_2(name) \ + ONYX_DEF(name, (INT, FLOAT, FLOAT), ()) { \ + name (params->data[0].of.i32, params->data[1].of.f32, params->data[2].of.f32); \ + return NULL; \ + } + +#define ONYX_GL_INT_FLOAT_3(name) \ + ONYX_DEF(name, (INT, FLOAT, FLOAT, FLOAT), ()) { \ + name (params->data[0].of.i32, params->data[1].of.f32, params->data[2].of.f32, params->data[3].of.f32); \ + return NULL; \ + } + +#define ONYX_GL_INT_FLOAT_4(name) \ + ONYX_DEF(name, (INT, FLOAT, FLOAT, FLOAT, FLOAT), ()) { \ + name (params->data[0].of.i32, params->data[1].of.f32, params->data[2].of.f32, params->data[3].of.f32, params->data[4].of.f32); \ + return NULL; \ + } + +#define ONYX_GL_INT_2_FLOAT(name) \ + ONYX_DEF(name, (INT, INT, FLOAT), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_2_PTR_INT(name, ptr_type) \ + ONYX_DEF(name, (INT, INT, PTR, INT), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, (ptr_type *) ONYX_PTR(params->data[2].of.i32), params->data[3].of.i32); \ + return NULL; \ + } + +#define ONYX_GL_INT_2_PTR_2(name, p1, p2) \ + ONYX_DEF(name, (INT, INT, PTR, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, \ + (p1 *) ONYX_PTR(params->data[2].of.i32), \ + (p2 *) ONYX_PTR(params->data[3].of.i32)); \ + return NULL; \ + } + +#define ONYX_GL_INT_2_PTR_3(name, p1, p2, p3) \ + ONYX_DEF(name, (INT, INT, PTR, PTR, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, \ + (p1 *) ONYX_PTR(params->data[2].of.i32), \ + (p2 *) ONYX_PTR(params->data[3].of.i32), \ + (p3 *) ONYX_PTR(params->data[4].of.i32)); \ + return NULL; \ + } + +#define ONYX_GL_INT_3_PTR_2(name, p1, p2) \ + ONYX_DEF(name, (INT, INT, INT, PTR, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, \ + (p1 *) ONYX_PTR(params->data[3].of.i32), \ + (p2 *) ONYX_PTR(params->data[4].of.i32)); \ + return NULL; \ + } + +#define ONYX_GL_INT_3_PTR_4(name, p1, p2, p3, p4) \ + ONYX_DEF(name, (INT, INT, INT, PTR, PTR, PTR, PTR), ()) { \ + name (params->data[0].of.i32, params->data[1].of.i32, params->data[2].of.i32, \ + (p1 *) ONYX_PTR(params->data[3].of.i32), \ + (p2 *) ONYX_PTR(params->data[4].of.i32), \ + (p3 *) ONYX_PTR(params->data[5].of.i32), \ + (p4 *) ONYX_PTR(params->data[6].of.i32)); \ + return NULL; \ + } + +#define ONYX_GL_INT_PTR_INT_PTR_INT(name, p1, p2) \ + ONYX_DEF(name, (INT, PTR, INT, PTR, INT), ()) { \ + name (params->data[0].of.i32, \ + (p1 *) ONYX_PTR(params->data[1].of.i32), \ + params->data[2].of.i32, \ + (p2 *) ONYX_PTR(params->data[3].of.i32), \ + params->data[4].of.i32); \ + return NULL; \ + } ONYX_GL_0(glFinish) ONYX_GL_0(glFlush) @@ -181,18 +352,24 @@ 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_PTR(glGetUniformBlockIndex, GLchar) 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_3(glProgramParameteri) +ONYX_GL_INT_3(glTexParameteri) 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_4(glFramebufferRenderbuffer) +ONYX_GL_INT_4(glRenderbufferStorage) +ONYX_GL_INT_4(glStencilOpSeparate) ONYX_GL_INT_2_PTR(glBindAttribLocation, GLchar) ONYX_GL_INT_2_PTR(glGetBufferParameteriv, GLint) @@ -223,215 +400,375 @@ 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) +ONYX_GL_INT_2_PTR(glGetIntegeri_v, GLint) +ONYX_GL_INT_2_PTR(glGetVertexAttribIiv, GLint) +ONYX_GL_INT_2_PTR(glGetVertexAttribIuiv, GLuint) +ONYX_GL_INT_2_PTR(glGetUniformuiv, GLuint) +ONYX_GL_INT_2_PTR(glUniform1uiv, GLuint) +ONYX_GL_INT_2_PTR(glUniform2uiv, GLuint) +ONYX_GL_INT_2_PTR(glUniform3uiv, GLuint) +ONYX_GL_INT_2_PTR(glUniform4uiv, GLuint) +ONYX_GL_INT_2_PTR(glClearBufferiv, GLint) +ONYX_GL_INT_2_PTR(glClearBufferuiv, GLuint) +ONYX_GL_INT_2_PTR(glClearBufferfv, GLfloat) +ONYX_GL_INT_2_PTR(glInvalidateFramebuffer, GLenum) +ONYX_GL_INT_3_PTR(glBufferSubData, void) +ONYX_GL_INT_3_PTR(glDrawElements, void) +ONYX_GL_INT_3_PTR(glGetFramebufferAttachmentParameteriv, GLint) +ONYX_GL_INT_2_FLOAT(glSamplerParameterf) +ONYX_GL_INT_2_FLOAT(glTexParameterf) + +ONYX_GL_INT_2_PTR_INT(glBufferData, void) +ONYX_GL_INT_7_PTR(glCompressedTexImage2D, void) +ONYX_GL_INT_8_PTR(glCompressedTexSubImage2D, void) +ONYX_GL_INT_8(glCopyTexImage2D) +ONYX_GL_INT_8(glCopyTexSubImage2D) +ONYX_GL_INT_5(glFramebufferTexture2D) +ONYX_GL_INT_3_PTR_4(glGetActiveAttrib, GLsizei, GLint, GLenum, GLchar) +ONYX_GL_INT_3_PTR_4(glGetActiveUniform, GLsizei, GLint, GLenum, GLchar) +ONYX_GL_INT_2_PTR_2(glGetAttachedShaders, GLsizei, GLuint) +ONYX_GL_INT_2_PTR_2(glGetProgramInfoLog, GLsizei, GLchar) +ONYX_GL_INT_2_PTR_2(glGetShaderInfoLog, GLsizei, GLchar) +ONYX_GL_INT_2_PTR_2(glGetShaderPrecisionFormat, GLint, GLint) +ONYX_GL_INT_2_PTR_2(glGetShaderSource, GLsizei, GLchar) +ONYX_GL_INT_6_PTR(glReadPixels, void) +ONYX_GL_FLOAT_INT(glSampleCoverage) +ONYX_GL_INT_PTR_INT_PTR_INT(glShaderBinary, GLuint, void) +ONYX_GL_INT_8_PTR(glTexImage2D, void) +ONYX_GL_INT_8_PTR(glTexSubImage2D, void) +ONYX_GL_INT_6(glVertexAttribPointer) +ONYX_GL_INT_FLOAT(glUniform1f) +ONYX_GL_INT_2(glUniform1i) +ONYX_GL_INT_FLOAT_2(glUniform2f) +ONYX_GL_INT_3(glUniform2i) +ONYX_GL_INT_FLOAT_3(glUniform3f) +ONYX_GL_INT_4(glUniform3i) +ONYX_GL_INT_FLOAT_4(glUniform4f) +ONYX_GL_INT_5(glUniform4i) +ONYX_GL_INT_2(glUniform1ui) +ONYX_GL_INT_3(glUniform2ui) +ONYX_GL_INT_4(glUniform3ui) +ONYX_GL_INT_5(glUniform4ui) +ONYX_GL_INT_3_PTR(glUniformMatrix2fv, GLfloat) +ONYX_GL_INT_3_PTR(glUniformMatrix3fv, GLfloat) +ONYX_GL_INT_3_PTR(glUniformMatrix4fv, GLfloat) +ONYX_GL_INT_FLOAT(glVertexAttrib1f) +ONYX_GL_INT_FLOAT_2(glVertexAttrib2f) +ONYX_GL_INT_FLOAT_3(glVertexAttrib3f) +ONYX_GL_INT_FLOAT_4(glVertexAttrib4f) +ONYX_GL_INT_3_PTR(glUniformMatrix2x3fv, GLfloat) +ONYX_GL_INT_3_PTR(glUniformMatrix3x2fv, GLfloat) +ONYX_GL_INT_3_PTR(glUniformMatrix2x4fv, GLfloat) +ONYX_GL_INT_3_PTR(glUniformMatrix4x2fv, GLfloat) +ONYX_GL_INT_3_PTR(glUniformMatrix3x4fv, GLfloat) +ONYX_GL_INT_3_PTR(glUniformMatrix4x3fv, GLfloat) + + +// Open3: GLES +ONYX_GL_INT_6(glDrawRangeElements) +ONYX_GL_INT_9_PTR(glTexImage3D, void) +ONYX_GL_INT_10_PTR(glTexSubImage3D, void) +ONYX_GL_INT_9(glCopyTexSubImage3D) +ONYX_GL_INT_8_PTR(glCompressedTexImage3D, void) +ONYX_GL_INT_10_PTR(glCompressedTexSubImage3D, void) +ONYX_GL_INT_10(glBlitFramebuffer) +ONYX_GL_INT_5(glRenderbufferStorageMultisample) +ONYX_GL_INT_5(glFramebufferTextureLayer) +ONYX_GL_INT_5(glBindBufferRange) +ONYX_GL_INT_3_PTR_4(glGetTransformFeedbackVarying, GLsizei, GLsizei, GLenum, GLchar) +ONYX_GL_INT_5(glVertexAttribIPointer) +ONYX_GL_INT_5(glVertexAttribI4i) +ONYX_GL_INT_5(glVertexAttribI4ui) +// ONYX_GL_INT_2_FLOAT_INT(glClearBufferfi) +ONYX_GL_INT_5(glCopyBufferSubData) +// ONYX_GL_INT_2_PTR_INT_PTR(glGetActiveUniformsiv, GLuint, GLint) +ONYX_GL_INT_3_PTR(glGetActiveUniformBlockiv, GLint) +ONYX_GL_INT_3_PTR_2(glGetActiveUniformBlockName, GLsizei, GLchar) +ONYX_GL_INT_3(glUniformBlockBinding) +ONYX_GL_INT_4(glDrawArraysInstanced) +ONYX_GL_INT_5(glDrawElementsInstanced) +ONYX_GL_INT_2_PTR_3(glGetProgramBinary, GLsizei, GLenum, void) +ONYX_GL_INT_2_PTR_INT(glProgramBinary, void) +// ONYX_GL_INT_2_PTR_INT_4(glInvalidateSubFramebuffer, GLenum) +ONYX_GL_INT_5(glTexStorage2D) +ONYX_GL_INT_6(glTexStorage3D) +ONYX_GL_INT_4_PTR(glGetInternalformativ, GLint) + +ONYX_DEF(glShaderSource, (INT, INT, PTR, PTR), ()) { + GLsizei count = params->data[1].of.i32; + int base_ptr = *(int *) ONYX_PTR(params->data[2].of.i32); + char** strs = alloca(count * sizeof(char *)); + for (int i=0; i void --- + glShaderSource(params->data[0].of.i32, count, strs, (GLint *) ONYX_PTR(params->data[3].of.i32)); + return NULL; +} // glGetBufferPointerv :: (target: GLenum, pname: GLenum, params: ^rawptr) -> void --- // glGetVertexAttribPointerv :: (index: GLuint, pname: GLenum, pointer: ^rawptr) -> void --- +// glTransformFeedbackVaryings :: (program: GLuint, count: GLsizei, varyings: ^^GLchar, bufferMode: GLenum) -> void --- +// glGetUniformIndices :: (program: GLuint, uniformCount: GLsizei, uniformNames: ^^GLchar, uniformIndices: ^GLuint) -> void --- + +// Hmm... +// glClientWaitSync :: (sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> GLenum --- +// glWaitSync :: (sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> void --- +// glGetSynciv :: (sync: GLsync, pname: GLenum, bufSize: GLsizei, length: ^GLsizei, values: ^GLint) -> void --- +// ONYX_GL_INT_RET_LONG(glGetString) +// ONYX_GL_INT_2_RET_LONG(glGetStringi) -// glBufferData :: (target: GLenum, size: GLsizeiptr, data: rawptr, usage: GLenum) -> void --- -// glBufferSubData :: (target: GLenum, offset: GLintptr, size: GLsizeiptr, data: rawptr) -> 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 --- -// 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 --- -// 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 --- -// glGetFramebufferAttachmentParameteriv :: (target: GLenum, attachment: GLenum, pname: GLenum, params: ^GLint) -> void --- -// glGetProgramInfoLog :: (program: GLuint, bufSize: GLsizei, length: ^GLsizei, infoLog: ^GLchar) -> 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 --- -// 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 --- -// glShaderBinary :: (count: GLsizei, shaders: ^GLuint, binaryformat: GLenum, binary: rawptr, length: GLsizei) -> void --- -// glShaderSource :: (shader: GLuint, count: GLsizei, conststring: ^^GLchar, length: ^GLint) -> 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 --- -// glTexParameteri :: (target: GLenum, pname: GLenum, param: 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 --- -// glUniform1i :: (location: GLint, v0: GLint) -> void --- -// glUniform2f :: (location: GLint, v0: GLfloat, v1: GLfloat) -> void --- -// glUniform2i :: (location: GLint, v0: GLint, v1: GLint) -> void --- -// glUniform3f :: (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat) -> void --- -// glUniform3i :: (location: GLint, v0: GLint, v1: GLint, v2: GLint) -> void --- -// glUniform4f :: (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat, v3: GLfloat) -> void --- -// glUniform4i :: (location: GLint, v0: GLint, v1: GLint, v2: GLint, v3: 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 --- -// glVertexAttrib2f :: (index: GLuint, x: GLfloat, y: GLfloat) -> void --- -// glVertexAttrib3f :: (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) -> void --- -// glVertexAttrib4f :: (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) -> void --- -// glVertexAttribPointer :: (index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, pointer: rawptr) -> 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 --- -// glTexSubImage3D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, pixels: rawptr) -> void --- -// 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 --- -// 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 --- -// glUniformMatrix4x2fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- -// glUniformMatrix3x4fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- -// glUniformMatrix4x3fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- -// 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 --- -// glBindBufferRange :: (target: GLenum, index: GLuint, buffer: GLuint, offset: GLintptr, size: GLsizeiptr) -> 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 --- -// glVertexAttribI4i :: (index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint) -> void --- -// glVertexAttribI4ui :: (index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint) -> void --- -// 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 --- -// 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 --- -// glGetUniformIndices :: (program: GLuint, uniformCount: GLsizei, uniformNames: ^^GLchar, uniformIndices: ^GLuint) -> void --- -// glGetActiveUniformsiv :: (program: GLuint, uniformCount: GLsizei, uniformIndices: ^GLuint, pname: GLenum, params: ^GLint) -> void --- -// glGetUniformBlockIndex :: (program: GLuint, uniformBlockName: ^GLchar) -> GLuint --- -// glGetActiveUniformBlockiv :: (program: GLuint, uniformBlockIndex: GLuint, pname: GLenum, params: ^GLint) -> void --- -// glGetActiveUniformBlockName :: (program: GLuint, uniformBlockIndex: GLuint, bufSize: GLsizei, length: ^GLsizei, uniformBlockName: ^GLchar) -> void --- -// 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 --- -// glClientWaitSync :: (sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> GLenum --- -// glWaitSync :: (sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> void --- -// glGetSynciv :: (sync: GLsync, pname: GLenum, bufSize: GLsizei, length: ^GLsizei, values: ^GLint) -> void --- -// 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 --- -// glInvalidateFramebuffer :: (target: GLenum, numAttachments: GLsizei, attachments: ^GLenum) -> void --- -// glInvalidateSubFramebuffer :: (target: GLenum, numAttachments: GLsizei, attachments: ^GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- -// glTexStorage2D :: (target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) -> void --- -// glTexStorage3D :: (target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei) -> void --- -// glGetInternalformativ :: (target: GLenum, internalformat: GLenum, pname: GLenum, bufSize: GLsizei, params: ^GLint) -> void --- ONYX_LIBRARY { - ONYX_FUNC(glClearColor) - ONYX_FUNC(glFinish) - ONYX_FUNC(glFlush) - ONYX_FUNC(glReleaseShaderCompiler) - ONYX_FUNC(glEndTransformFeedback) - ONYX_FUNC(glPauseTransformFeedback) - ONYX_FUNC(glResumeTransformFeedback) ONYX_FUNC(glActiveTexture) - ONYX_FUNC(glClear) - ONYX_FUNC(glEnable) - ONYX_FUNC(glDisable) - ONYX_FUNC(glBlendEquation) - ONYX_FUNC(glClearStencil) - ONYX_FUNC(glCompileShader) - ONYX_FUNC(glCullFace) - ONYX_FUNC(glDeleteProgram) - ONYX_FUNC(glDeleteShader) - ONYX_FUNC(glDepthFunc) - ONYX_FUNC(glDepthMask) - ONYX_FUNC(glDisableVertexAttribArray) - ONYX_FUNC(glEnableVertexAttribArray) - ONYX_FUNC(glFrontFace) - ONYX_FUNC(glGenerateMipmap) - ONYX_FUNC(glLineWidth) - ONYX_FUNC(glLinkProgram) - ONYX_FUNC(glStencilMask) - ONYX_FUNC(glUseProgram) - ONYX_FUNC(glValidateProgram) - ONYX_FUNC(glReadBuffer) - ONYX_FUNC(glEndQuery) - ONYX_FUNC(glBindVertexArray) - ONYX_FUNC(glBeginTransformFeedback) ONYX_FUNC(glAttachShader) + ONYX_FUNC(glBindAttribLocation) ONYX_FUNC(glBindBuffer) ONYX_FUNC(glBindFramebuffer) ONYX_FUNC(glBindRenderbuffer) ONYX_FUNC(glBindTexture) - ONYX_FUNC(glCreateProgram) - ONYX_FUNC(glGetError) + ONYX_FUNC(glBlendColor) + ONYX_FUNC(glBlendEquation) 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(glBlendFuncSeparate) + ONYX_FUNC(glBufferData) + ONYX_FUNC(glBufferSubData) 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(glClear) ONYX_FUNC(glClearColor) - ONYX_FUNC(glBlendColor) - + ONYX_FUNC(glClearDepthf) + ONYX_FUNC(glClearStencil) + ONYX_FUNC(glColorMask) + ONYX_FUNC(glCompileShader) + ONYX_FUNC(glCompressedTexImage2D) + ONYX_FUNC(glCompressedTexSubImage2D) + ONYX_FUNC(glCopyTexImage2D) + ONYX_FUNC(glCopyTexSubImage2D) + ONYX_FUNC(glCreateProgram) + ONYX_FUNC(glCreateShader) + ONYX_FUNC(glCullFace) ONYX_FUNC(glDeleteBuffers) ONYX_FUNC(glDeleteFramebuffers) + ONYX_FUNC(glDeleteProgram) ONYX_FUNC(glDeleteRenderbuffers) + ONYX_FUNC(glDeleteShader) ONYX_FUNC(glDeleteTextures) + ONYX_FUNC(glDepthFunc) + ONYX_FUNC(glDepthMask) + ONYX_FUNC(glDepthRangef) + ONYX_FUNC(glDetachShader) + ONYX_FUNC(glDisable) + ONYX_FUNC(glDisableVertexAttribArray) + ONYX_FUNC(glDrawArrays) + ONYX_FUNC(glDrawElements) + ONYX_FUNC(glEnable) + ONYX_FUNC(glEnableVertexAttribArray) + ONYX_FUNC(glFinish) + ONYX_FUNC(glFlush) + ONYX_FUNC(glFramebufferRenderbuffer) + ONYX_FUNC(glFramebufferTexture2D) + ONYX_FUNC(glFrontFace) ONYX_FUNC(glGenBuffers) + ONYX_FUNC(glGenerateMipmap) ONYX_FUNC(glGenFramebuffers) ONYX_FUNC(glGenRenderbuffers) ONYX_FUNC(glGenTextures) + ONYX_FUNC(glGetActiveAttrib) + ONYX_FUNC(glGetActiveUniform) + ONYX_FUNC(glGetAttachedShaders) ONYX_FUNC(glGetAttribLocation) ONYX_FUNC(glGetBooleanv) + ONYX_FUNC(glGetBufferParameteriv) + ONYX_FUNC(glGetError) ONYX_FUNC(glGetFloatv) + ONYX_FUNC(glGetFramebufferAttachmentParameteriv) ONYX_FUNC(glGetIntegerv) + ONYX_FUNC(glGetProgramiv) + ONYX_FUNC(glGetProgramInfoLog) + ONYX_FUNC(glGetRenderbufferParameteriv) + ONYX_FUNC(glGetShaderiv) + ONYX_FUNC(glGetShaderInfoLog) + ONYX_FUNC(glGetShaderPrecisionFormat) + ONYX_FUNC(glGetShaderSource) + // ONYX_FUNC(glGetString) + ONYX_FUNC(glGetTexParameterfv) + ONYX_FUNC(glGetTexParameteriv) + ONYX_FUNC(glGetUniformfv) + ONYX_FUNC(glGetUniformiv) ONYX_FUNC(glGetUniformLocation) + ONYX_FUNC(glGetVertexAttribfv) + ONYX_FUNC(glGetVertexAttribiv) + // ONYX_FUNC(glGetVertexAttribPointerv) + ONYX_FUNC(glHint) + ONYX_FUNC(glIsBuffer) + ONYX_FUNC(glIsEnabled) + ONYX_FUNC(glIsFramebuffer) + ONYX_FUNC(glIsProgram) + ONYX_FUNC(glIsRenderbuffer) + ONYX_FUNC(glIsShader) + ONYX_FUNC(glIsTexture) + ONYX_FUNC(glLineWidth) + ONYX_FUNC(glLinkProgram) + ONYX_FUNC(glPixelStorei) + ONYX_FUNC(glPolygonOffset) + ONYX_FUNC(glReadPixels) + ONYX_FUNC(glReleaseShaderCompiler) + ONYX_FUNC(glRenderbufferStorage) + ONYX_FUNC(glSampleCoverage) + ONYX_FUNC(glScissor) + ONYX_FUNC(glShaderBinary) + ONYX_FUNC(glShaderSource) + ONYX_FUNC(glStencilFunc) + ONYX_FUNC(glStencilFuncSeparate) + ONYX_FUNC(glStencilMask) + ONYX_FUNC(glStencilMaskSeparate) + ONYX_FUNC(glStencilOp) + ONYX_FUNC(glStencilOpSeparate) + ONYX_FUNC(glTexImage2D) + ONYX_FUNC(glTexParameterf) + ONYX_FUNC(glTexParameterfv) + ONYX_FUNC(glTexParameteri) + ONYX_FUNC(glTexParameteriv) + ONYX_FUNC(glTexSubImage2D) + ONYX_FUNC(glUniform1f) + ONYX_FUNC(glUniform1fv) + ONYX_FUNC(glUniform1i) + ONYX_FUNC(glUniform1iv) + ONYX_FUNC(glUniform2f) + ONYX_FUNC(glUniform2fv) + ONYX_FUNC(glUniform2i) + ONYX_FUNC(glUniform2iv) + ONYX_FUNC(glUniform3f) + ONYX_FUNC(glUniform3fv) + ONYX_FUNC(glUniform3i) + ONYX_FUNC(glUniform3iv) + ONYX_FUNC(glUniform4f) + ONYX_FUNC(glUniform4fv) + ONYX_FUNC(glUniform4i) + ONYX_FUNC(glUniform4iv) + ONYX_FUNC(glUniformMatrix2fv) + ONYX_FUNC(glUniformMatrix3fv) + ONYX_FUNC(glUniformMatrix4fv) + ONYX_FUNC(glUseProgram) + ONYX_FUNC(glValidateProgram) + ONYX_FUNC(glVertexAttrib1f) ONYX_FUNC(glVertexAttrib1fv) + ONYX_FUNC(glVertexAttrib2f) ONYX_FUNC(glVertexAttrib2fv) + ONYX_FUNC(glVertexAttrib3f) ONYX_FUNC(glVertexAttrib3fv) + ONYX_FUNC(glVertexAttrib4f) ONYX_FUNC(glVertexAttrib4fv) + ONYX_FUNC(glVertexAttribPointer) + ONYX_FUNC(glViewport) + + + // Open3: GLES + ONYX_FUNC(glReadBuffer) + ONYX_FUNC(glDrawRangeElements) + ONYX_FUNC(glTexImage3D) + ONYX_FUNC(glTexSubImage3D) + ONYX_FUNC(glCopyTexSubImage3D) + ONYX_FUNC(glCompressedTexImage3D) + ONYX_FUNC(glCompressedTexSubImage3D) ONYX_FUNC(glGenQueries) ONYX_FUNC(glDeleteQueries) + ONYX_FUNC(glIsQuery) + ONYX_FUNC(glBeginQuery) + ONYX_FUNC(glEndQuery) + ONYX_FUNC(glGetQueryiv) + ONYX_FUNC(glGetQueryObjectuiv) + ONYX_FUNC(glUnmapBuffer) + // ONYX_FUNC(glGetBufferPointerv) ONYX_FUNC(glDrawBuffers) + ONYX_FUNC(glUniformMatrix2x3fv) + ONYX_FUNC(glUniformMatrix3x2fv) + ONYX_FUNC(glUniformMatrix2x4fv) + ONYX_FUNC(glUniformMatrix4x2fv) + ONYX_FUNC(glUniformMatrix3x4fv) + ONYX_FUNC(glUniformMatrix4x3fv) + ONYX_FUNC(glBlitFramebuffer) + ONYX_FUNC(glRenderbufferStorageMultisample) + ONYX_FUNC(glFramebufferTextureLayer) + ONYX_FUNC(glMapBufferRange) + ONYX_FUNC(glFlushMappedBufferRange) + ONYX_FUNC(glBindVertexArray) ONYX_FUNC(glDeleteVertexArrays) ONYX_FUNC(glGenVertexArrays) - ONYX_FUNC(glGenSamplers) + ONYX_FUNC(glIsVertexArray) + ONYX_FUNC(glGetIntegeri_v) + ONYX_FUNC(glBeginTransformFeedback) + ONYX_FUNC(glEndTransformFeedback) + ONYX_FUNC(glBindBufferRange) + ONYX_FUNC(glBindBufferBase) + // ONYX_FUNC(glTransformFeedbackVaryings) + ONYX_FUNC(glGetTransformFeedbackVarying) + ONYX_FUNC(glVertexAttribIPointer) + ONYX_FUNC(glGetVertexAttribIiv) + ONYX_FUNC(glGetVertexAttribIuiv) + ONYX_FUNC(glVertexAttribI4i) + ONYX_FUNC(glVertexAttribI4ui) + ONYX_FUNC(glVertexAttribI4iv) + ONYX_FUNC(glVertexAttribI4uiv) + ONYX_FUNC(glGetUniformuiv) + ONYX_FUNC(glGetFragDataLocation) + ONYX_FUNC(glUniform1ui) + ONYX_FUNC(glUniform2ui) + ONYX_FUNC(glUniform3ui) + ONYX_FUNC(glUniform4ui) + ONYX_FUNC(glUniform1uiv) + ONYX_FUNC(glUniform2uiv) + ONYX_FUNC(glUniform3uiv) + ONYX_FUNC(glUniform4uiv) + ONYX_FUNC(glClearBufferiv) + ONYX_FUNC(glClearBufferuiv) + ONYX_FUNC(glClearBufferfv) + // ONYX_FUNC(glClearBufferfi) + // ONYX_FUNC(glGetStringi) + ONYX_FUNC(glCopyBufferSubData) + // ONYX_FUNC(glGetUniformIndices) + // ONYX_FUNC(glGetActiveUniformsiv) + ONYX_FUNC(glGetUniformBlockIndex) + ONYX_FUNC(glGetActiveUniformBlockiv) + ONYX_FUNC(glGetActiveUniformBlockName) + ONYX_FUNC(glUniformBlockBinding) + ONYX_FUNC(glDrawArraysInstanced) + ONYX_FUNC(glDrawElementsInstanced) + //ONYX_FUNC(glFenceSync) + //ONYX_FUNC(glIsSync) + //ONYX_FUNC(glDeleteSync) + //ONYX_FUNC(glClientWaitSync) + //ONYX_FUNC(glWaitSync) ONYX_FUNC(glGetInteger64v) + // ONYX_FUNC(glGetSynciv) + ONYX_FUNC(glGetInteger64i_v) + ONYX_FUNC(glGetBufferParameteri64v) + ONYX_FUNC(glGenSamplers) ONYX_FUNC(glDeleteSamplers) + ONYX_FUNC(glIsSampler) + ONYX_FUNC(glBindSampler) + ONYX_FUNC(glSamplerParameteri) + ONYX_FUNC(glSamplerParameteriv) + ONYX_FUNC(glSamplerParameterf) + ONYX_FUNC(glSamplerParameterfv) + ONYX_FUNC(glGetSamplerParameteriv) + ONYX_FUNC(glGetSamplerParameterfv) + ONYX_FUNC(glVertexAttribDivisor) + ONYX_FUNC(glBindTransformFeedback) ONYX_FUNC(glDeleteTransformFeedbacks) ONYX_FUNC(glGenTransformFeedbacks) + ONYX_FUNC(glIsTransformFeedback) + ONYX_FUNC(glPauseTransformFeedback) + ONYX_FUNC(glResumeTransformFeedback) + ONYX_FUNC(glGetProgramBinary) + ONYX_FUNC(glProgramBinary) + ONYX_FUNC(glProgramParameteri) + ONYX_FUNC(glInvalidateFramebuffer) + // ONYX_FUNC(glInvalidateSubFramebuffer) + ONYX_FUNC(glTexStorage2D) + ONYX_FUNC(glTexStorage3D) + ONYX_FUNC(glGetInternalformativ) NULL }; diff --git a/modules/opengles/onyx_opengles.so b/modules/opengles/onyx_opengles.so index f0829791308234b7fe88585adea8a3786e66b754..5253b1f71e874664b202b8d7870b6cc734016744 100755 GIT binary patch literal 206520 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 N8@7Zh4B}zp{{f*JTnzvK literal 126616 zcmeIb3w&HvwLgCPq&z#k3*|9DDWO1_mQunyP17`imQJ5k6f)Cf(o9K{!(>uYy=bJh zP#!vPa> z|74V|tnXgm@7imxJ!fXloRfTM&b-QzBStv%80B2x2rqZNLdtO9&bRtw%A8VXU#HAD z%9$u*M`Mi1RJACStP@baP#YtDY#0B)qh0>nXXj5-K3Sb7^L1f7vqv4PaI!jYEDYuU zqQ>(d7uwJT%I~~HS>lZZSMZ#75&xvnW^q}_j>BOwNAX{W5HQ$~f*rD)w*z_HPC_18 zkwZKd|0!8Flzd_2jeADvaNCFp$Wp$Az?18uXhr|UwmXY3pI09OST|YPbs}#N{u6s< z?j=iM-;L-J*xvA;c#K3}k3R(PQShILU;EFAN1b-jTb~OZweXbJejobr-@f?v35w@9 zx4;jAC+Znj2LAv{VB(R_U2*k-hn`ueyn+8-3llnMAnd#Wm-|>k5tw-KtJodwh9{MME=p5y-o}cwt z|BOfcmptZkwa0uWc<7Jyh%fiR=X%WNO%MEE9(`Zu(f9W~bUyH?_iG+?9p|wRyF7Hx z@z@U^dGv9+2fou|-5&J7f8kN@r5^M7x<_3PdCVu|k@r*&{goc;v)!YQ>pkYb$|G;J z$NV>Y;LAPcbFD|;mwL=|e-Hf^Jm!BYyzrThKQ64B>G*Sz$9kUXG0)dL`t>c3cvuD} z2>?a*w>M&W)YP^`YwF`o(Z=}aW6sLP%6L<}r9u4A*edO!SYs^O5?kC51@YO< ztKE2GECJ(ln(CG$qD?LJ&56~Ou~^-TXzi5%hoh}6G1I`JSWD|_Iajqtlkw&z z3SFFxHPyx&g{x++$`F2QV`F8sR)|(Wg?fJF_eEC3++;&#Yg4TZg`ej~TSTRpdRZ)y zjJ3^5CKK@$vl5BuS{RzsBqn7VsZ2CCB{A>ZSW_$kmCuj6tD`Q^=Ea+0m&WUoV)^0c zEBluO>%h!QTeQ_$2A!)bSieQFXkB@0eLb~lVQVZQW>p?36 z`j$X2`xJ#!37v|qpd12O1gjrQ6hQrLE9lMQm>U&kiy4WY^(}2d%Bpx%5+cI!wpioh zWOE`G2TxlDT}4!(7r8jP+EtrWZ$U+TO}s_!DluPE)w3I7wO4ATElx(0tu2sO?a;pE zsBY<7jOrHE>pF<4Zqc~X?{8pr3tOP-7EP{yrK($~kflwqDYQI=ovUs!6#$}rrOT&^ z+`IKK7x}}YXw%A=@WRcFYgaZmEvT<=iHTK~v9p^S)#`|*DCg>E%j%ldvDMA6f3%-# zV82DBsCeS2If`XcPaJI#`a!+=eiZ8#06ZD`g}`AdfN%+b3iwI&9Gur&ONRhBkd!w! z!y%(-jm(g&Y;2Au@#pHMWNc+Df!@-lxHyn$WPR&Qs~2H9GJODY#sFl7L|~etrSVvQ z*_xk-Ufo}|T0gDPxG)0|Y_l3qVkt9ch*{#%OYMXHoCCHCYJ1>GSpSt3&}NSnsh$z% zOHw_fRbmxTlROZL4ET)2=Qw%`#KBI!zRZuhZVV4Ca(BW&|G}mlUU!6sswE6Zjn%N< z65>eEcjVBH19H#eA#!nTyhT0PwHau!%i^)C-R6YY{4fXA0(}C;y(Eu!{nNm$gHLi< zJM1`pn+}Lo&v^=k?b{cDdnKu36o;FWLeQmAeOpq9j>$M(RtD*Sj6hYj)ydIE)RxDQ z>H3J;`Z#iiKBAriIHI-;ERj6K$uM#jtXLJRO{)C^Sl@<@*We-vzC9Z@`U=2@7wrMxdC32*hxfL0j;Hm=ICvwSufo6LLEme^#|imJZ&bDy zzwaVEjCi~FpaKuV$xk0vhzGi4nA5@VV-U|U`~lSOWO(R2rQ5~uFyc9eQ{HZdpM-hy z41bF1Ww?v_&f$f1r4SD?obr}1{B+D4V)*Nrx0K--)GuRr7V!wfDQ^SA=VD%$;U8n( zHiqX>zn$R$@j(zCX^x|Q2g9#GJj3uKZV)Pt)5-7<>US|bjChXWRBt!KukMoaPM+as zV%}bcyQuF>VEsir$Z*PA!th%#Z;0UwF>fiuGpJw2@GRmHhEv`KhTn^MU54L;dD|GC zNBwq&2QI+=avb$L82%9A8HPWNc{>@N!sA63!$X)i$8f5*o8dplym^M_F>f!!Gnm&o zqOiYV%o}7l_z^cc@=?n0Eaoj^xQlrs45z#e41W&ux(qMJylo86W8QX# zr>MUSr@S2ue;M;;7=9(@?PPdhj9T9=hG(e145z%^41Wvr<{AEV%-hTG5axA`EbMQV z`pa<2Tf*>Nm^Z}m$1!gy!^4=jjNy6eFT*Ks1H;EY;mC)}@HeTy40kbaJHrDPs`}F$ z$GSQgejw(}Fns(?YCfF|Pf>pv9>TmihEu)W3_lL@<{4g!d3zb2q5e)(_0ju{Fy;+1 zobr}1JcM~e43A>oQif-#zYKRVZ-n8Lw}Ij3VP2QvH(=g2hUclj3{O#i8BTdS7+!^W zGYo%>`pfXZShc=g49`%18BTe-8D5Kd^9=t3^_Srx%74a)L({E-V%migLy*? zA9u6b&!r3xW8N}`=c&I8r@Rde--vl#hEK!1Z47rYZ#%;SWvc!($LaaY@VhW?hT)fC z-cE+6sJ{#kVcs0WsorjeZ^pcNhTnpDdl{ag{vNIBqyC05Z;;`Xw}jz8#JnMf|CIX6 z@GSM0;V$NlFr4x>FnkNMz4nm^aOE%G<&4-(cPh!}t3t9-kQ=*h{T% z7sE4{H^*?w+s*LTF>jvXXJX!7hKDe(bBxMQ{moK;8BTdi82&Ei4Ke%*%v;LvFy<{| zc%J&paLU`j@DDJr%kb+kZyUp1%-hcJz${gNn&b5RW%#~ZR39@8&rp9Ep2ECc3=d)6 z9K)&JZiY|7ym^NIj{3{+4E6We!v2OaZ;;`Xw}jzmVBQeJ5B-{2hf;=TslN<&F>i$7 zl(&K5Wti7x_(IIv#_&A#m*FYuFT*Ks2g4Upe;Ix==Ivy7V4PatE{12QzYM3m-3*UW ze;NJ^=Iv#82=h9@!v1EdzYM3mB@Az&{xW<_3j53OFy<{|c%J&paLU`j@EfVW44;L0 z+ZgU*-gbru%JKQjaeDqT{0{0b!>_@-oeWP=e;FRayg7zbz1Q{EDWKTQ2)`1{mfhG(h240kbagyEF8f#E-+{xbaZThzX4V|bqW%kUKS zm*JGRgW=Cpe;Ixy=Ivy7U~hc>GCV{5WjN*SX83E=Uxt4d^Y$`4gn6Cg3;UbJyg`Oj z-V%ntL;Yp=8<@A0;bF{M#_)W(nn#4;l(&K5BcD`#bQyl^t=M0NyO_6~;epvIZ<^!u z{AKu&m^Z`l&tl$AhNq~%49_5*V>s2@&G0iYZ=T`zVBTJaXHnldp|HPs#Dff{yd?}T z$Gjnizkzv686Mb2a}1}v-3*UYe;MA1d3zb2MSW)y>o4L#hEv`WhPP6G8NM6ymNGoB zFZP$=A;cpLr@Rde-$4Ckc;(lzzYGtfemlcm#M2C?yd4a`h5F0zn=x-E!&9i=#qbQ` zIfhf-ZiauG`pfX&V%}bcXHnldk@XkxAj2td3B$ij{bl$>ae*N`N*Ny55BtmT5aJPr zQ{D!K|A_j_@D-T1jp1R`Z)doRc$(pqw}atNQGXf!0OsvvcnbBq7@k2q$8gHq&G1*L zzYNb~-d=`hQQw)&`ippw;gq+8;croY8GhF7*k6VR_Q(D*JTzP35r$LV28O>+{bl$H z%-hEB5aw-Xco_4h8BTdS7(QyNsw>0rdogb(!^4=ji{UQj%`u$vb~F57%$sL;4)gXh z+{L`kNrnAQVcsCaDQ^kGgP1qO@VR$je;J;l{xUp6{be}iZD9CmnAc_aBbc|1;Th^L z!?V<1hEv`ShM!OUW%#H&RlS`I&r*LGo~QmYobq-vd=d4R;ma{^FT?ZH-;%=q1}c;v z>%#=Kn&cQJ2{;gq+V;dfGh8U7IF?Pa)&d7YCB`hG(e145z#e4F3uBm*LAWZyUoi)L({YslN=Tyd4aGj{3{+ z?_u6fhG(h249`=48BTe-8U8Bum*LJg)jIbwJWu_dQrO?X9DM$Ayi4hnF#Ij*FT!0`8}zYKp6^R_WOgn8Q;9>%qzRFUPyo{7V?#O#Nl}$C$U2;eh}?e;FRayb*>| zy$uY%hWg9!MR%)twlO?}dD|Ht#=L2UQ{E1S-%9;u_;)dHC&R;-w~OH}=FKsj@^&+P z6ZMzjA7S2JhP#;8Ijyk2De5o7DQ^kGAEo{>eBnK6ol6;>qW&^GL;YnqkOZ{bdp8Csh%G=HGcd5S&52w{S_cA69>h>^6mm7=C|R;iU`@9Ei_fhKDe3gyB?g1H+HPye`8(#Jp_` z4`JSRhKDh4n&FhUgW;!R-VDPR+^g#CWOx|!b}`(=yg7zb-fo7^#=LokZ^FF240kcF zbGlk@`hGt}{be}iEn#?=`pfXYVBS)Or>MUS&rp9EPI(&`eg*ZH;pg3_*13)08R{>? zv(#UPQ{E1SucH1kd?V)VWO$bP%kVt)m*JGRo8jxIzYO1jd3zb2r~ZZt`x~fIevso` zYTZg0{&ngv!%zH>%#=Kn&cQJ2{;gq+V;oGUd3=eHm>)gw57xOyP3j3R){xY2MmN5JU z>Mz4LVBS)Or>MUS&rp9EPI(&`-c9{w_#ZKE8^bfyUxsI?zYM3m9Sr|F^_StL_p5d8 zWO$bP%kVt)m*JGRo8hCMR{D8{--UU58J?&9PA}|lpc#gn1(jr+OP09>TmX!&hP6Him~VZ#%=om^aOE%G<&43o&no;V)p`PKJju zZx_Q|%$s94NAw~gVULsZ^&hKDh4n&FhUgW)@fcsvzWJw;d$yW z!zph!!;izfd4`X8NY&fR@I3W*W?_E=7b`!=@h+uP!tkk>H^lHd%v;Lvz@bXNjNu{7 z8(}!r+raR1slN<=8uPX>JcN1M86L*GX@*nY4u)4ze;GdIVYNP;3=d=8E{409H^*?w z+s*K$)L(|*jCp$*?qXi&tit}LsJ{%Syd?}@LH%WT9`lwmJVpIwc!v7RaLU`j@Mh{S z!?v(#UPQ{E1SucQ7lybJSoGCWKDWq6+Y%W%ru&G6f(zYH(=FI8_Z z!}HYN(!%}*=Hc^~<6TOpgyD}+e;J;_yrm2e9EQ(dhKDe3gyB?g1H+%B{xZB5^R_WO zgn8Q;9>%(j~bFy`%IxQlsn45z%^49`=48NMC!_A=bXyw2H$ z{Y_DS8BW)clrWrruR)06^m_+N86G?w`^)eM;#CY!BOYcr-S@tn;pquVKf-XjkGg^3 z!6Q_>%W%36xsBmzjBjUn4)N<59>n`LQw)zFeka4}KGihC=|0j9hSPnX8HUq+n4Jty z<9&u*49_9Ho#8>eZ!OF42;w^!PWS2M7*6-mbu&DO_f6#)9znd9;c3L3a|-uu-+f#R z58{100ft8qpTO`m;z5SfeMBV;r~7jKLd9yv+ntzvi@ z@i4=4h%aY&ute!Z7#=~qf#GSyU53+jS8WUro~-oS86H9WdWNSFPcb})_?-+7PEq=4 zhDQ+ZV0aqw48!TVlTL;QPf_|^438kbo#AQ3vkcE6zJuYxQ;St2U8J-c~sg`u>&SX~Y8z&mo@Otpvt`8IM}R?9lMTH9V)`^EA9$!|~P; zIhxn-by|F{hU2ejk)snFRo7nNsh<=nsNo|uoe~WnrQsnBAFbh~8a_tD%QRf91wE=X zT+E3cVGXAqh_U4wzBdJfjcE8j8s4Dc`)atW;rnTLn}+YN;q4lJfQDbM;QH&&cwWPg(ePdkKUTw?5&io%sNv%@{5TB{X!!9OK0(7z(D0y!Ptx!b4L?!C zLmEC=!%H>%Bn>aq@DdHL((sctJgnhUG<>;+pQ7Or4L?=G8#Meh4R4I z8h(z3@6hmbH9V)`=V^GihM%wDc@4in!+SOSLJfCD_V52P4IiiBvot)Q;pG}WLBnTj zcu>PDG`vK^=V*9H!z(qsRKw?Lc$tP*X?T@}S8I4!!!OeCzEs0IG<=zcXEgj$4e!+OhzWdBS0=)ago$&AYW6R(t;mb1- zJ-OZRIPn$Xiw~1MS?RwZ{E@=%lK!*8A0_;Z^tT9qwD8l?|EciD2tOtLM} z1JX|j{{Z1T(qAR~@xsr40>FtYgdY%oPWqP#UwkFgla>A=;ft?gdb*^4k?_S=Fg+RR zmkVEf_0p4;{yD-IU%B+8q(5Ew;;WXPcIi(MzW7S7$Cdu^!WUn;^hBh8r0~U8Ej?lB zA0&M76-!T<^!E|I_-dsmB>j=X7hkFL1f~BWoJMFkTKEC!zbE`-gzrfIZQ&m){QSqF z{yz#oDEyrCUlIOs!p}qkr{4VJ~EBq6LpOO9+;ZG8NTKYc~{)xg*N&ivdPZoZ= z^dA)dNy2xff1mJ6gddUqUBW+E_+jbaDtz%3M^BmbZxH?|!VgLRTH%YYG3la>A=;ft>*db*^4k?_S=6FnK} zmkVEfCDD_X{yD-IUq$q!q(5Ew;wy-rcIi(MzWC~)$Cdu^!WUmT^hBh8r0~U84LxD$ zA0&M76+=&%^!E|I_-dgiB>j=X7hfs#1f~BWoL*`;U-$v(zbE_)gzrfIZQ)-i{QSRU z|Ak*B{G9Y(5&kUUXQlsw@XLkYCH-fGKU?@2>2DE!h49nT|Ecij2tOtLM}=Q0{C4R- zDEzs?ccp)y@T-I$k^Wu6uNHn-`nL-IBH@=w{|4b-Ec}r4uND40;RmJvdEw6&en9#O z;a?(rNBXOTzd-o;4`u&_9~OR2`j-h`oWk$PN`H~?#i{$AF6mz+d~wRYCnNoG;fquC zJ!$EmBYbg+z9%L9>B1MM=6l+uKSlWBlzfjX{o{o%PQ~{`q<^IF#VPonu=EcSzBu*X zQzrd=gfC9H_k^TBQuyLjdrwgMAHr$JhRcN?kp6qZze4zq^xqbKjqvjy$o>mIBK(~6 zUlD#(_*v<{Ap8}=?~?wr!mky6M*3TXUnl&u^nWV+nDA55e^mJO!f%)UgTh}ad{_GS z317Sb^+cq9m+<4l4@>`6;ja>Yne=ZE{*}THN&i~mHwr%}{m%=3weSPdPYAzB_>S~f z3BOtR`Ci$7;k&}mN&hn8i&NM=S?MnlzBqN=(zKVA6Z)O1g~^rr}4oRaQwrGLEe#i{6?i1d#XzBmQl6PEr#!WXBWd&;E0kMPAQ z=bn)CM+zVQgZicaA&fP^o`CwL|DN#S7yPUxtGaOx{I`5u_d<9&RXsgQOu6dm+2e%WID4F=Ro!@b zuPVb#-2k-~rRu8#NqehqEE@;^-}rR*rSBI^&pYsfT|NVs!q(CX_EvnTaAmv$XT$3F zQrySy9Ix`LxZLj?zvegaF~7@mnypXU9fFWmC$eJw1k>d*e+GxhO)1JC}uPsOm`z_ zs&!ofaa7o%uh&bk5asY{SL6xk$-TY!1U-K=V{jWox^HGId zF(Eyo-Tr$VZ3gin}Hcc-E3s{WS(d?l>9vucF?W~XYSc(?O)+w0PpU%>em6uo#5 zqPq(Z{)HQ4OuS!o7nJ08rf*wC59t@ZcMzhtS` zFZ!K9h`wbl{|PubiRE812+ij= zbd6Q?hpjGt9e$np^LiFN4+RA?_ z(pUbXL5ME1Zhp64^y8ggdUt;te9wd3UpxrW>#SSq zs(w-NeD=Hf-?Ps2sD9B0JVght>BoPtmH#w+?SkAwfiE9h^!kF=Gn3BftBZS+>0-a2Y0LZ09Fo|Kzt zYfGVA-|j=XjZcuiI05%-co#bLHA_1R#HwmxiTV&(=bc)m;?2Tux)<0Q(MJvzoc{Bi z+pX~Y_k5-lh|!yts&!ie;+)Y-1PJH(jay)5F<)XKF|)o!lI_*cRMJ%Y+9blC?*7K_ z{Y+G7kAG~twuoXK#y`fFb^K#_ijm{u%=?dR$IQN^2;Erl;c39ubo)M9sd-=Jd)@=q zgcjJi;xBL9(mm&Y{jJI1W_+Qq{Uy8D*CXs=k^Q^zHyi&3d${}ewt0^^3BK0HIIaNU$I8&so-I%rD_`0?adS&+I*bIA6&luZY z8uQoXef9jup5=MmTF-U;c@EjLJgu+T`g3f5o`+z=?7_Otf7O=f$8gyR?t_Xw%kw8| zo(27R{uctx_3&2{?dUHL{*V67R?0ie`bt?lgx#;)vpgqRck{yjJg>n5??FAy)}v<+Ty%x?tntiKxXb!q z9>hzQc*kudD zinm`LY84S+dcH#&^C4V=hwZ*@$SEGSw)>9$6qAOWVv4nj8T~1qfPFEvcAxY=wuO2g zE?&fiy23Msuj9#oS$A%{KhG{$R&y!7^31g^*@*r;U){4jU$fTp4Y&vt*KP8i<+;w9 zXIg)rU%-=U57zCM);!O^MXp%SvOUXlxHV6-KhL|cG54UJd#wBV1GtD6>)Ehpd9G&l z+&Jc8(7yahxPqXfod1 zM4^k5v8LL1qj1&CRT;u>ZEUQJ)=CYiP|sf>{l3VGn44^BP_Tqb;IROua0Y zNXFV`C6kHxidl(7bS(_cX%dq%jZ`L@o06D!ZmcPmfXe5`-PKVSX!GJtu}kB1NwNI! z^OgNef^}f#r7hZOEsHkB>k8IyQ7l?l-dbNzZCcnGONd#O$D8VKPB_o<*vfd5saa4? zw6>vd2?VoGQ8<;*sn`n2A&^C|`msa-)Zey(-Ykx}QBk&-k?2|9(iWtwiZ>-8A{=jv zH7-szCt`8%v}Mp$L=}3Gi=(SuwMq3BRK(ZBTjZ`1^EFjHyCGJ4rB>SFWHi|-o)l__ z_AN(sOW$Htx2Rs%K~!~%#+8151FKuu0#&zYa{Vh+-9m*dZGugqp)EZf;z=vbkwNeSJ$ztg?)q-Q1{FM>K^T^;}TX5G$d4t zFR&lQ(gXneybfyJddLk31O3O7a(HPG8fx2y;lQvOj>QS_WbZpTXis&yE%7M0xHjIR zp3mA0wAf|w*wt=xLhNstgKB|30pnhhhqV4_;MT$Cv8)|-oW4y5#Hyz?g~Imji@?2- z)G>;~%}F8X(x|>IDMZI)oGvSabU;R+s@m%0=p$;&IYS>&PXQcJTLzX$ z9>ruBISW>-iq$67{sF9SL&s}ykyVHKRx7Ud`hcAwqB%%w!f~1a$02^i#8Kxqj&_`z z;9by!AMf6MJ^Xxc*Y4dJu#bbyg8d!XJlOZa2F5tfflut-9RhnA*f7{?urAp3U{hd! z2{r?^8*CQrfm?tN_8hQ*v5r#}SB{!CnhC zu$SXJ0yYHpWw2qe&Q{=qJsE5Y>>{ukup7Zw-P}8Q_Cm3^oJy4zO7<4mJ<=_-BE?uj9nQhQMaP zhQa<5tPA#n{{}wTuYk>f{T0|O*n@use6W{+4eST~1sej}4K@t+^yh#N_A;<3u-^ci z0lNci7VL$;20qx$U<2?Qqy7ap1UCE|;Dfy%tPA!-uqm($vcLzs32YYZ2VnDHFL@sL z2RP1mz=pu~f(?V6{{ryA-Ul`X_Mc!gVCTWNS6Q(4g3W{71vW6=aV~~$=|W)BV8dYF z2kU~p2)>O>fxQQ82JAn;X2Dj&*I0S5cY_TC;JYiZA+S~Ob!r&wx52t#-vgThI~TtE z&w%|F*euvTfz5-R0hcxe4s@I^gAIYrf(?T`8ZPs2!L9J#nhhSZ>E8yCx6xe6MX24E|%VDx$?*f|#I}$F!3LFf1z=ps+ z2Q~~glmkB4JHe*FImS{{y9=Ic&H;hS114NFe&4IdwL2FcdG3@m zCLJ$`BBlcV>-pL4-Qs6w)&YSHBWLeF_EHc6S73GU-=8ew>tXzL%lIZ3|Gi~=D~$in zGQJbWU$l&iU#0y#jGqf}ee<8QZq!v!f|&m#7=OnyUIF8K{e1WClXZTbRzHjfEaU58 z{0PhVCKx~7GQJhYPqB>egz*`c@zEn4=X}ffBp9!>j90+;0?T+Ej4!v0uZQudWqcEi zuY&PY_4QrZzrI^xe2s;_6UM(}86Q0g_PJ$z5{%zs8LxoxyI}k*eSV4l`PISr_bvSO zF#c1^_$C;C(lWjk#(!lQ-wER{TE<6@hSz$__#_yA%Q9X8<9W+?9gKefs3FDms`fS!g$;=z7xh%mhsW>Lj7YHKSj@9-@pGR z!T1&!zfd0+%>`fdw*r26-7;P$0^zgAN}WG)g%l9{^)NoyGQJ7MzY60^3;5wa{#F=& z(lWji#(OQ}qv5l_Y4BOcOMeoKuds|)!1x`O@j4j)m1TTAjE{iNPG0#p!T3ze_*NLd z(lWji#?zMZ(ePR3Ma%dk7~f~B_xvhg{6fok9gHU}$elet1RQA;j`E^mhnk2{-|ZV0>$f0SM`l=h4E?__u}t_@iq&8G<+7m-!eW4#$SN(&lTiXA8_RH55^CGa{?<0 z#xL)iUmc8xVI1z4=zo15xv+11J&bRFaWDN%FuujY-wNZsmi#+m{2VwZ(NK`TwlDu^ z_$+^|WqcBhKWiDUfboOi+=iEa9gJUQ8D9_M_gTg_!T8&j@vSgE9nPK97Swk|Uwu1a zywx&38qP&@!noJ`C&9P_=U%+VD`33JGF}JcDa-hJ7#HVuyym|N#wWr#980X!#h26Q}Dg;Hw$=I2>(Rz50Rh zEEYoZbT3llnAV|upX^ri&tUv+^l2UQ=-+?~@d5gW^iLFL@c)td#GH3#yTU8cE<;<7 zb`9DMXm3Zm8SP_ex1oIr?VD(Kp&k2WM?MZiI~navw3TR=p{+-|2JHs4x1-&R_A#{E z(7uHBO|-kvj=dK1qn(U)CfZ80%h1-NU4wQ5+S}1?M*A4rZD?OY`zG35XveO@{Aeem zor$&*?J~6WXxE_KfcAE@o6$aob{pE4(7uUw7uvDwF+bYLXlJ6WM7s=aJ=!&BH=w;8 z?Pj!(q1}e|CA4p%-Gz4SS1>=?$!KSytwg&FZ9UpGXg8p}9qneckD=X$_9e7$qTPjd z>;}w_b~4(TXe-e!LtBq_4cZN8Z%4Zs?PF-Sp?wMMn`n2T9eW+-M>`qqOth6~m!Yjk zy9VtBw6~+(jP^0K+t9v*_D!_A(2l(x^P`=Nb|%_Nw9C-eqg{h`1KQisZbthU+HGiG zLaVa%|Jy!#M85++6?z3j(it8fxF$L>ygvGB4E*{3`udCN_4&WP zKZoZ(V9ON%!|PM990QzxhxM@?BgEK9OF*&l(UR}2P;A_iTCU~r_<$`{01U5B!Ey|6 zhSz7nk`w@Yx;~={)CM~L?&IS4WPAL(kN>-`@9_L=yUTHg*XRG=>%*%HbSdN*v=3}l ze&{^)PBDyDp#%RV{z=Gx3i&SbQa<^oBmZ^eXONfm$)Ah-kCC58Uf_KDJ6@Xq705s0 z21hC1upPc|3k=s8u=+aZy55) z|2gvWG=JoWee$;=|A-qM`N$&Q^~rw@`Q^yZBR}Pn|1$EgM1Ek5TDOc({#(fZI`Tuv z&-&!=LjL2(4j z@)sfhX53ubg8U5f!#?>BBmaHmXOZvv z$j{RJee%nZ{|52{`>1(`&<@P35XwIv`BVN=;bG*tKKY+P{#D3NAur>TA4h&C^0Uax z`{cJGe>d_2`(piQi`BmY`ITSC`jO}Q`41yMZ~*q-Cx0#SM}9-;g^(Zi z$=`tdOOYQ&zUz~JC-NUczKi^nPyY9iKjJPm{}l2wKKVaE{xaleke~I*e-8QILw*+d zd7u1Ok?(v{%|DO)z#M=5e+&6bkslb3{rAa#ANda=KZN|SPyRknsd?{4ei-?#PySKJ zU-B)b<03!hlRp*t4U^!*C2n<-D>_Jyy6;`5z(QMSjXB|54;GyhqJH zh5U?9{ubnKMt%nQS)cs>LH@sxpGAJ&C;wgKhtq2QdE^J?`s@GLZHjk4@&gBA|9$e0 zLjH%y47n5k|i2lRq2zn~?7!Kjo7jM*d%rpF)1dC;tlMpLd^{e+Kzk zpZrzG--!Gy^7B6V>yW<#`FZ3As#G7znXs* z`FWrG(N8PhUC7TPKTz$j|3@Hy)+hfEshcFnp^ zt}h%p0Pz4`7e%ATAx`(H6Mh!_Fv2<937)6sul{wM*%CjBwBF7)ZTLek%c@qsag>oa0s)!z)$KVRao|CxR>;6k6S zJ0$&YV|<9|zl{1>rhgE;0LcB%^k)Mu^y#`p(swaF%=Et}aX4-;{kJfl-bc~;9I?OB zr|T9;e=gu+J}%S0M&gG%feQ=Q?S~j2!S`dN|2pc^b&aII54=)`zZpB>mShKEw1Uj#vE+GyP=}hvN^M|8;;1eY!4^^nZx)S*HJI)OVTw z2?13vy-%h2F9clZ({+=i{{@WCGyO*;4*Q?!zm4$`e7{Tj6Ao1RbY11C`1~pdT&#a! zY+)a-mpHtxG5z0QJiV_b{rwJ7`gGkT&3_KyLO;axZ;<%mPL}D5zh5Nc>HT`2{=rJ0 zuFE9-3cy8tnCX8(;;{dj{tqyoJ_nHg>!?rHZIb@J@QZMSzRUFIN*wloS>d{^$N0!m z3Mc&^11|bY*L9Nqn;4&B`bQrs^1}XS`b#Aa#~-G@4sfAQ*L{ljf8y~l#%GxRo2VaV z`oY6+{h59kaG_7vh0^^01LLzy|3?ys<3H2?E5_63ELxvq4_Eqh-6-i_47gbTJkwt% zaoGP%|K}JVIl6HD|BU){T`B1w1}`W=Kd@I}9~Vm;_CM3V1>@;+AaZoZv$ND({-t&--YpEroRjI^GyG=BUQchIhN*s8Q?;n zu3IJjbr|n5{Vs{a{-0I2Zl7R$mw&nf{+Ko<4We z{3pX3LNR~3?v?Z}2VCf9nEo9Shxb2B{{@Vv&-0`|>S(1;*TtTvo?cD}aG{@N`VA6? z{m=C8#dtbTK>AtKr|V`(|6drNXZoebh`g}>nf@Ay!~4%;3)lZaz{UE|b+x4b3dRS< z74~t$u}VL~^e>e-9DkVpO@Ir1y6%?rAIJC*)8B>qS*9Nfs`aGvCA2;fz=b|tmrMFL zVSJeB|3>0){AcK54g~$>vlzh;At)&?_qp|=?9Nj z`gC0{>0bo6-2Y5}y~JVvGyPv;Je?<^^~s|?UH41+N1vedGfaPh#9{w4{cACv&Oed< z_W&2`L)Qh9eiq}iOn>i5A}{QJraxQa@cHXFwQi)}0=Uqp>xR$4^}Gk;^GrX7`YEP= z{E4dG2-Cj|aG_7v71R8`it&NH3;VcD;&A+D`nxec&Ge^ER{C_^G3kE>aM9lo)4x^X zaQtWbzry$&)Bgzd>AGanFF8r+hnap{;;{dj{`WAR&KuJDzX7;dAG&Ut^bdysF@Klo zUnX(b|Fa9%?QV>Z9ADVq9e@jcx~`e@4}b%;-2Y5}5#kw!-+?%t=LA{#cmZ&sPuD$H zAinn$rJrRwvk}iT{ELXw`BT#WFTjO9T^CLI|BLZ~eG1p%pi@-d5W}kxr}MI;zXou* z{7Ng{m`|4JBoWUu{2|2Y{50vmg8Fn_HtCO^s`LZ<7OsC8;vt4#gE*b{ zCjAWHVtwekZPNb(#)p~Cp{J|7F2m;`9>MeHq`ww$p-AG;zF9BTiH?Uvf`bQBDG5ni| z)AtIb|KF%j*Nv0@KQTVcbf!zk3VU^#rn{7<)r^>j88G0@n9 zPTzyj{5JwF^y#{D(tjM|vrOk7i02u8>I{{azF#5z%K#VpbX_{>ugCbn{)OxRxWwW8 z13Nzd6XWT78`3}NOr=lPt;69(J{AKm`Ws^UH%T1cKQR4m7*F2^k^U~!UvazAy%6<} zpQ-f2O#gC;!}|xO{|$^!PcH25e*-Sohpu}k{SPqSW%|?35_#eMGt*xsarpej^uGbP z(5LI-SK|D)Vtk6}e}wuOrhjIss+YbOqxGo+TX4(}hB{#zJN-{aBzkAXLALZ7a?C;f$hi~W;l`nO6P z-ak|n?%UsDJbgb%`um-$^y#{M(k}yC9)IvU?Fm@de@GnmKhysS#?$wXr2h`;({=l# zKM~%j$o;E&r#rn{7{iOdU#)p~y3FnKvu>YBURO0aYi|OA6 zxX`ET{z?BSjCYy-s0);Sis_e29QHrczZ!6%Pxl3oeh0>kp9&epJDosNgVb+)8B>hk&_G8|I{+2Pxlp&{uO|W`DB^?9TJEA&-9|lNdGjzg?^st*GU}q{~R?>+PB}rc=~>u^q&P>tPkCnK>Gi{_yAs~ zPCBQRtNwAN&e2D3fnyvK1Ous_n@cxtOe*tizPxm#D z{v#M4X8M0deV6H<3~#)}deZm&H2=#17y5MH1L@z4@h;PUR^o8{XZqvjD1Ewqfb`D; zTcR~8^V|C_;{$k|KIx39R{9~Pf1$)-|DRg8KFxp&eY$Uh^uLMm zA*TN->W7*BQ5UK8j4=JhfD3)PuY>eAV0@VAKPhoI{xkg%7b|_bPNl?Ak23)m`gGq1 z>BlhMW%_qZ9QHrc-+}RT{R`=jo2T^Yz7W!%0l3&dDW=~naoGP%|9cou*VT~z?@^!b z8zKFD=PUgT)1NDG*#As_J;p~)E9~!&0T=5-_mz1#`c3*dj1S;_3bg-^3oHE))322{ z?Ek5S>+?;(h5r3a|2G&PV*2|pRQh42KTqOt{Ac=K23+WW$n+n@_%PG|8|u4Ef7&9E z7uKKYuLNA^FSxgGeZGP5F4KQr;;{dj{yvM9evav%4Y<(Xg!=IGmybG(Pci*(OC0t; z(|;M`gQpj+|6WU!{$EfZ+A1Gs04|UJOn;TcVgEDz`!GJj^s}f>_tn6*myZuIKFjnk zfDI=1Khs|)aaez*{|msy`p|thH2?Q8KF{>0EmQh|Dzy%@Z<{0z`=9CG3%Jmy`*LXh zS&R?heHx@Q{!*nMV)_dt4*Ne;xc*-OT=On?8+DE&0kKNoPJPxt+-K>ZlTyG;KsiNpS9`dN(6G5wEF zpY98SWtWdhm#O)rn0`#+u>YC3jL$RuzoCAhx^Vwb zzg*RuWBPHxg+ASv)PU>%EsPJ~eJT?We@)`>`IqS*cZJdqPA^>l%K#Vpbl(!`e+}b9 zO#c~)!{=Y7Ke|TgN0|PZfD3)PuZi?mV0@VAKPYk7|4jey7@ubP(<4fs?t3Er)qsoR zr_1y=OC0t;)6Zdij_C)YN}ukFBK`9Km+ya={ud+;`=9Cm4C8}mjBv!GME>hIe*;{s z58XFK`X|6flE;6hze3`$|C#=M7$0H!I{+8@bYB(e?^CPvvrNB2;_&{5>3<31(@Z}D zxX`EjuE3R#-(!59=^tJv^1}Q7i_|*MzFj17IQ}#Jb$|uc#kl z`lrWKy}=oU>mLJL=+k{$v_5xWe2D44ByrgPO#iTYr5|DX^8gq6bYB~rNdGf{%l*&vZ<9Fef2RKe#^;#+7!VZmr~AT4e+K*@_dnBb zlsN2vrhh-i2hS{A|K9>G^y$7a>aX~t=W_ou{j=f%hyBm=U5Uf{Po{ql;6k77D7N3)SpN{yua!9Lf2RK}jE^w=|3-bf zuZ{F~VSJeBPhG9n-(~tMB@XM)^lt}TtPkDyM*2@+yvy`IK>ZZcpWcM)&-9~!3w^pT zj`VNB_!QIMDskBVO#fqy4~iQZ;87y~b(~Y1m45zV1;DnKk4piU`=9CGE^*lZO#dZ} zk1+lHT%}L<)sg-MfD8RB)Bl3R;rP$=e}eI8rvDezr~B?m|LCifexB(^B@V~`d4>CS zGsfqb{_B8?^{4ytNPj{?>C=67bo^f~aoGP%{~H(|EG=CBEZ{<)?%N~%Q7uZJ?!zPf z*%F8S&-B-0e1z%$3~-@O_w|wfyBHrntZ*HsB}HC1{xkhniNpS9`u_#E(5L(UNdHe5 zPxtZB{7YJuev0WgN*rE)nf_+Lg+ARENcv*dru%^YSLy_u34g$itQk}M+fsl3zQ31A z;dz`7|NCbjOZ;HR`Gg{s9lJ)@@y@ts3h^TV7yF#l`$!=Mp$hn({sapA${^y7SHW2^X93WA--V%a@z+t`akT zIm|y`nEw%Hn&YoO!i?8lV8(Za%=nD`%=m&M&G>UCneq4FbG>OjZ-w_oCVXVnjQ{OG zGk)hWX1o;M$C~ti00$@&zW-5X{3`eyZHm7aUZ73*%N~7SyvQ7%gwGKso!1UGAC!s8ytpPSAy#~%To?@T(6Pc!2i;eE0x{_`Hk?F%k4$Jgv@#y8J5<4p_A__6T* z)-<1kMw;O}^o zAs@Rv^j~$&I{O`H#*dq9#y6c{#=lx+#(O>bvi&M^{QXPK_-r_@XzK5~9`pRb<9)>o zW6V06Tg>>22b=Mdv(5MtIKOI|=g$&m{5=RZ#b0@f89&|Qb$KJ~hXcj?*t6llA|9|` z#pBS3Stm8!jGup@8UOWZX8d)J_lN)RIG+5&Hr7-^ZEe>C`5YEy>pU z`l+=}T`Un>8E;9(5;e)yHMNb+O|cfIrlzjBW@TgZifCg^U9vgRQWI@$b84GcyN$7A ztPXyWhcTk2KHe0si6#=!wKcJ(WMZvTpNOuG)zr1FUcDA5npXpn$%4@4rnPM~&2Fq| zWn-)bCU$kSWpzzse04n8QnNbRR#O+NkG3`@o%wU-FIe=Mn((Z-b7~e>Up5DHB{kjz zH8jD5-6$ljSpnriO$Dk@QYGYVX&Ass#9BamkR+IqUwxm`uur|Qb?`Gca*Pu5A)KcG^SX~*5 z)vbuuUOC9BeMy*#_C@41`yyFO4o6#CVtZP&PZ3kuKB>HLpEPUfi{SXNdXH=Ot70nN zFPB&EmuD@1b|Mx{#=?o_m2l`C-WpE zmS34@Zb}Z}=u>b<`c?_ANp-6;y=6t11$1Ep1-B zDRybRE;-m!gWfz-LEh247VpSnWn4M5kKvHelj%{4XS|^p&sb|Y_|DdN$W2&J+1i+< za%}Ou99yiloTV*8JV#<7nu@W6^I9yS)>4*58{>6DKIc=6Z7Ql5hgViC-df(GShTKO zeuFT`qnw3kD#{Yh>#>AdOM&yc3tMCGT@3%8#Qp^Gq?yX_4CY0623kufk2lrfdxs&s zZz{$%6;zDF>nav+FAu(eYueNE=H>oGjK%t+4yf55&00FV8;;gCczndMZ%`}MRHl`{ zi?aq>OA=dQNQVv!(NvBloEKvWEm}&Y_y$*fnL5ZLh{$SVdlhBlm@2cy7cFm5tO>rB z9CCeDx>tc#lBq%~p=gOiJNYlV=f(6Y%q!khlUJ<09Q`cr;+Tj{4)%;%!P!<%4P%ME zvJWWM7pr*LLpYryOEvO5%QHqBOEN}U%czJA`CxCQnu@U!cslh>WRe%IddD+RDdm>*I|pbmZNx$^H!I?6 z;w^)|ZorR%sXRYCUZx+8wOslBU=J^F@~2@c*&mY^?T=+Gdv-&t_Dby?=i+2E*(xrW zl)3t@L9`!ne2SO~_etfI`=r@RPl$_rhV)rYU4!F6HI`}1HJ~_Ku(hP>mLYvo^Q4(d z@eJl=cm@_JL489}H^@C$-QvYF7vU8>unMopB4ub#szH}xS(9Gp{1P?64Bd|yb zULU55)!@Z57vU8>unMopB4rHaeQkA%nPo1)96PW8bDVYhOPk<3(ILH@*qEj=Z1KDl zTdcL5>K1&9ID|9qcCM);JA)Txk1kTyo}Os0ZYi!{F0nXoV4=l1MauR1oK)=4;KehS z<`q4#Ag@Sk8S-jEc~wvSAm1CSR>l%TD8!TLQHp20p%~BDV&yDtiiId7sVr)~9#W=jeV)4Gqo4!Zonb^h3GjVL?nc{ty zcg7x-XJQvC&&08nXNvb--i$pe&%`cPo{3{C&lGPh58efe^Tu)c3v{G%oPH-w(KjGo zL{m|gJiH!DsI?UJN!Dvp_G;{0Q$cnHugM;5FDntfdT5_mDlAN6NtXBl1zBS4<;WXy z@qjAM(+}?E95T3HcIMu-0C zsHlRunJ7F?WTEm!~eQ9T2GQ}Ey}-788r6&=Y}ZM;Hk8=Ie4aNJV7F!B+2gFdC>&f&e z)-&Evoo8&Za^UKZzJ?C^D=*lwMfe`26=4|)EW#K}nM3KFp5DOsQKo@aq)Y>&Sef|U z{7@R{P4y_wn_#HRJJ@GQhQ+YIO2Xd6qz0_BtvkqlJwJOLupkJzDIFIScVFV zFa}emVU>!uPfu^)`zX`EDpIC_VJ%ZXE)2SrMaZTCi%@uVMZ$fTW>^+``}D*HaN)bNEV{0Buh9i#}ewR6vGnOJ46W$L|Z9_aIaDfp?*p+U6tgk6cf=> ziYeTq6jP|LQVdJruM`8(R*E6qs}w`1pHfU0Q~4^zM6{G*3il|*6zZ!K!xH!_#Xz)` zVhHyt#SrSJ6w@_ezDh9>Ev1;kJxVc!`YOe+1pZ1f5N)Lx!o5l{gj!31_nh+1Yy;0; ziiKz@#S+d-v4r|6WxChIGY~9}$mY{ZI`x`=MD&AMpLuV4Lehz*Mpi8ZXxeWl*IK`hy6cfI+}d zsRmlHQVkSqsc<;slO4*z)`y0vV1LSUx)N2eKi=$&8~P&`t%b^LHSh>?9Tseis?!-+oueije- z^XW1b@$&%*J7n+LTlw^_(9j?7=b@e5+Wc=gQjL^NLM!9NuKJo#kBG{9drje}nV`+V{W;Et-GuJjD;5s_gYtD8@6_`6u8alGjOm{x{*3YG0KFdk<4c zQ;PZ9XDd`3)-HfePIc4qQ*3XVyNXo*b~dX_uddP2{=9^W?P=ow=bJcFnlKWW>-;}B Cw;enH diff --git a/src/wasm_runtime.c b/src/wasm_runtime.c index fd72a057..9a4513a2 100644 --- a/src/wasm_runtime.c +++ b/src/wasm_runtime.c @@ -538,7 +538,7 @@ static void onyx_load_library(char *name) { static void onyx_lookup_and_load_custom_libraries(bh_buffer wasm_bytes) { i32 cursor = 8; // skip the magic number and version - while (1) { + while (cursor < wasm_bytes.length) { u64 section_number = uleb128_to_uint(wasm_bytes.data, &cursor); u64 section_size = uleb128_to_uint(wasm_bytes.data, &cursor); diff --git a/test_library.so b/test_library.so deleted file mode 100755 index cba999b442acfd045204c2291bfd61180a7dcf54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15856 zcmeHOU2Ggz6~4QP8;AUO6Pnf}1y4eXlB!JePoZ)%j=lB-{D)&pOVCzNmC=kPilrk`A+XfFY6Bhb zP&*>qwacm-YKv`}0xF5iZA2=O!2`RcOF-~UN9`Fpu8QHyLIa!qZXsR9)CQURSK=dS zEx#lPKNi`~5I;lwfET5oz;+!b>Ld3P@#45o?0|8<-%3B?xLf>yQ7(u(@phQ|DD91k z-yuT>j^iED9uVz)nfy2}H(PL-$E3a0uEUb#6DVSoPlFocF*7hcLE|oUk^2IDT4bW4 z!n#}OvxYuw-}SFgzp&2xtN-YCp8WQP=kEOR&pvqPAvVPI+6dhUGr?bAV~J_v-14m_ZaqGx6dxwufKED ze*M}SJN1VBo9p4N6ktLEwAUA>JG%Oo{kgyM-LH^Z)ecVBr@Ieu)js=nxXC`(JxoG< zn?c9RQ`EUP+P+2A)K?a!&5o|8xEpF=db!T$!||@nknIG;phRTsvtPevpRFy?8MSqA zEFC-qO*`OSsMKFU`kL##+jl7S=xNd}S(BpFCDkYpgqK$3wZ14#yw3?v!&|IPrt z+SYXs^}kXh!zUkbhDQ1(2D8p^&rnuP`@R~_7plf7KlrMb+eyZ$9c%9EB;@~@uD)BZ zA0oW8RIfiw$p5)=Nj*NMQnQ)Vj*aWupP|sZiR1r}FOa=Ks5WQ%H+O!qW5cQTd3ALA zeRmz)y^CqKq1S!&HH!BcCVDn!&ZK)c-QrRpmXnfXAjv?Ifg}S-29gXU8AvjaWFW~v zl7S=x|D6oTx<{<9#9BpOv&m(nhQx!ZO+x5C1 znaE;DtZ{rxWL`hXWsk@o)1o>jxIvKLPq~PhQdT53)nwp>X*_m_-EE? z1^RifB!(8RMg{S%*LD9ZVo$Hv(fJ^c^jaIq4~zbNkr7A2{m%gF*y9ZziLI}V>mg%Z z?M_28ST{RwY57G#OK_mK_Y1}zT9Lii*uUT0Z_=WH4=tRxwd&9E8^y9IkHa*LMoan$ z&1T^%F@C4;7}v1>992?u)hm`}aGiQ1eyhSb)mo()_aEbU<>*smjfw3|~ByCK$UeEtY;#=9@y$at? z{H_-9)l?8x!y2tlnNrKk^_{TfO!0z!UVfkRotdIP=@y+_=m%BDt<9<_zf>uDp_ijC zQcDY7#9wgSAaLg#uN=~1{pr9hc}}iYD$S8gljM+PxWcq~kw5k8lv^#)n*UNEtU4uk zmbMj4yR~AdhO$E=V<(-_o`I}$;`oDEY!xV!X~zL=A#f@#wdqXK*?GZ=odXX4x+oh9 z8rFeVrKmS;PQCcgF`Lgs8tosWpEsTCa3AlI;4ExHH~!jD9&)Q7&<2t+q^j*uD(jZeca=q-eFL z<0kfPtcan^>Rc&wCkewqV;;4#AA06Yxn@=Zzv2bqoH85KWUWxleYTKOkwMo6lvV+trG+s;|Xvz$|Svp3UHv>QChORQbyo|_vj(j0$ z4?Q%s2kI2qEfuDyRi9$f!HgQv!6vI!WzsjKL<7IoSMH;5JfCUaW3k%4F2u(D8!~Sr zYxZAle;4fWT!7p|mA})Rfo>zZV1gsKTWI*j+y4^jd5#2s%%gxWi9b(&=vJuUkLSt> z;zG{0r~mO1^tH|Fi$$3V?o9|3uv%2m3aR(tJEo~ zaBTQvUI)ay4(-R!|4H#bCIK-|1R_uDPfw#8^2hn%oM0Z?crMBF3G-z#i3<7w`3zN> z{SEPJAPfcZ*aJQr^S49+e0LRp(9gyE@tgg`=PmliwqmW1;_;2Uf)2j@f5o@;^xC_QkxRh5yzD zqbqF7r5Q2yv_>DFMnLHpzvuD?=Z*UUzvrRv+EX8&KB&=+1xLHE-9nXC{#Oo*Ma&^4 Gs(%CVw7aSR -- 2.25.1