From a482c14d5cdbfcbd54efaac80aa6f7330561372d Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Thu, 14 Mar 2019 10:15:00 -0700 Subject: [PATCH] GL binding fixes --- project/include/ui/Window.h | 2 +- project/src/ExternalInterface.cpp | 8 ++-- project/src/backend/sdl/SDLWindow.cpp | 16 ++----- project/src/backend/sdl/SDLWindow.h | 2 +- .../src/graphics/opengl/OpenGLBindings.cpp | 47 ++++++++++--------- .../_internal/backend/native/NativeCFFI.hx | 14 +++--- .../native/NativeOpenGLRenderContext.hx | 45 ++++++------------ .../_internal/backend/native/NativeWindow.hx | 8 +--- 8 files changed, 57 insertions(+), 85 deletions(-) diff --git a/project/include/ui/Window.h b/project/include/ui/Window.h index dc624ddbd..579f0b3c4 100644 --- a/project/include/ui/Window.h +++ b/project/include/ui/Window.h @@ -27,7 +27,7 @@ namespace lime { virtual void Alert (const char* message, const char* title) = 0; virtual void Close () = 0; virtual void ContextFlip () = 0; - virtual void* ContextLock (bool useCFFIValue, void* object) = 0; + virtual void* ContextLock (bool useCFFIValue) = 0; virtual void ContextMakeCurrent () = 0; virtual void ContextUnlock () = 0; virtual void Focus () = 0; diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index 73bc55844..a2439863e 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -3131,14 +3131,14 @@ namespace lime { value lime_window_context_lock (value window) { - return (value)((Window*)val_data (window))->ContextLock (true, NULL); + return (value)((Window*)val_data (window))->ContextLock (true); } - HL_PRIM vdynamic* hl_lime_window_context_lock (HL_CFFIPointer* window, vdynamic* object) { + HL_PRIM vdynamic* hl_lime_window_context_lock (HL_CFFIPointer* window) { - return (vdynamic*)((Window*)window->ptr)->ContextLock (false, object); + return (vdynamic*)((Window*)window->ptr)->ContextLock (false); } @@ -4070,7 +4070,7 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_window_alert, _TCFFIPOINTER _STRING _STRING); DEFINE_HL_PRIM (_VOID, lime_window_close, _TCFFIPOINTER); DEFINE_HL_PRIM (_VOID, lime_window_context_flip, _TCFFIPOINTER); - DEFINE_HL_PRIM (_DYN, lime_window_context_lock, _TCFFIPOINTER _DYN); + DEFINE_HL_PRIM (_DYN, lime_window_context_lock, _TCFFIPOINTER); DEFINE_HL_PRIM (_VOID, lime_window_context_make_current, _TCFFIPOINTER); DEFINE_HL_PRIM (_VOID, lime_window_context_unlock, _TCFFIPOINTER); DEFINE_HL_PRIM (_TCFFIPOINTER, lime_window_create, _TCFFIPOINTER _I32 _I32 _I32 _STRING); diff --git a/project/src/backend/sdl/SDLWindow.cpp b/project/src/backend/sdl/SDLWindow.cpp index 2adbaf789..148c9c43d 100644 --- a/project/src/backend/sdl/SDLWindow.cpp +++ b/project/src/backend/sdl/SDLWindow.cpp @@ -370,7 +370,7 @@ namespace lime { } - void* SDLWindow::ContextLock (bool useCFFIValue, void* object) { + void* SDLWindow::ContextLock (bool useCFFIValue) { if (sdlRenderer) { @@ -399,14 +399,14 @@ namespace lime { if (useCFFIValue) { - value result = alloc_empty_object (); - if (SDL_LockTexture (sdlTexture, NULL, &pixels, &pitch) == 0) { + value result = alloc_empty_object (); alloc_field (result, val_id ("width"), alloc_int (contextWidth)); alloc_field (result, val_id ("height"), alloc_int (contextHeight)); alloc_field (result, val_id ("pixels"), alloc_float ((uintptr_t)pixels)); alloc_field (result, val_id ("pitch"), alloc_int (pitch)); + return result; } else { @@ -414,8 +414,6 @@ namespace lime { } - return result; - } else { const int id_width = hl_hash_utf8 ("width"); @@ -423,16 +421,14 @@ namespace lime { const int id_pixels = hl_hash_utf8 ("pixels"); const int id_pitch = hl_hash_utf8 ("pitch"); - // TODO: Allocate a new object here? - - vdynamic* result = (vdynamic*)object; - if (SDL_LockTexture (sdlTexture, NULL, &pixels, &pitch) == 0) { + vdynamic* result = (vdynamic*)hl_alloc_dynobj(); hl_dyn_seti (result, id_width, &hlt_i32, contextWidth); hl_dyn_seti (result, id_height, &hlt_i32, contextHeight); hl_dyn_setd (result, id_pixels, (uintptr_t)pixels); hl_dyn_seti (result, id_pitch, &hlt_i32, pitch); + return result; } else { @@ -440,8 +436,6 @@ namespace lime { } - return result; - } } else { diff --git a/project/src/backend/sdl/SDLWindow.h b/project/src/backend/sdl/SDLWindow.h index 4091eafb9..f18c713a9 100644 --- a/project/src/backend/sdl/SDLWindow.h +++ b/project/src/backend/sdl/SDLWindow.h @@ -21,7 +21,7 @@ namespace lime { virtual void Alert (const char* message, const char* title); virtual void Close (); virtual void ContextFlip (); - virtual void* ContextLock (bool useCFFIValue, void* object); + virtual void* ContextLock (bool useCFFIValue); virtual void ContextMakeCurrent (); virtual void ContextUnlock (); virtual void Focus (); diff --git a/project/src/graphics/opengl/OpenGLBindings.cpp b/project/src/graphics/opengl/OpenGLBindings.cpp index 120863af1..8f7cc20c0 100644 --- a/project/src/graphics/opengl/OpenGLBindings.cpp +++ b/project/src/graphics/opengl/OpenGLBindings.cpp @@ -1696,9 +1696,7 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_active_attrib (int program, int index, void* object) { - - vdynamic* result = (vdynamic*)object; + HL_PRIM vdynamic* hl_lime_gl_get_active_attrib (int program, int index) { char buffer[GL_ACTIVE_ATTRIBUTE_MAX_LENGTH]; GLsizei outLen = 0; @@ -1707,13 +1705,15 @@ namespace lime { glGetActiveAttrib (program, index, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &outLen, &size, &type, &buffer[0]); - char* _buffer = (char*)malloc (outLen); + char* _buffer = (char*)malloc (outLen + 1); memcpy (_buffer, &buffer, outLen); + _buffer[outLen] = '\0'; const int id_size = hl_hash_utf8 ("size"); const int id_type = hl_hash_utf8 ("type"); const int id_name = hl_hash_utf8 ("name"); + vdynamic *result = (vdynamic*)hl_alloc_dynobj(); hl_dyn_seti (result, id_size, &hlt_i32, size); hl_dyn_seti (result, id_type, &hlt_i32, type); hl_dyn_setp (result, id_name, &hlt_bytes, _buffer); @@ -1744,7 +1744,7 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_active_uniform (int program, int index, void* object) { + HL_PRIM vdynamic* hl_lime_gl_get_active_uniform (int program, int index) { char* buffer[GL_ACTIVE_UNIFORM_MAX_LENGTH]; GLsizei outLen = 0; @@ -1753,15 +1753,15 @@ namespace lime { glGetActiveUniform (program, index, GL_ACTIVE_UNIFORM_MAX_LENGTH, &outLen, &size, &type, (GLchar*)&buffer); - char* _buffer = (char*)malloc (outLen); + char* _buffer = (char*)malloc (outLen + 1); memcpy (_buffer, &buffer, outLen); + _buffer[outLen] = '\0'; const int id_size = hl_hash_utf8 ("size"); const int id_type = hl_hash_utf8 ("type"); const int id_name = hl_hash_utf8 ("name"); - vdynamic* result = (vdynamic*)object; - + vdynamic *result = (vdynamic*)hl_alloc_dynobj(); hl_dyn_seti (result, id_size, &hlt_i32, size); hl_dyn_seti (result, id_type, &hlt_i32, type); hl_dyn_setp (result, id_name, &hlt_bytes, _buffer); @@ -2076,9 +2076,7 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_context_attributes (void* object) { - - vdynamic* result = (vdynamic*)object; + HL_PRIM vdynamic* hl_lime_gl_get_context_attributes () { const int id_alpha = hl_hash_utf8 ("alpha"); const int id_depth = hl_hash_utf8 ("depth"); @@ -2087,6 +2085,7 @@ namespace lime { // TODO: Handle if depth and stencil are disabled + vdynamic *result = (vdynamic*)hl_alloc_dynobj(); hl_dyn_seti (result, id_alpha, &hlt_bool, true); hl_dyn_seti (result, id_depth, &hlt_bool, true); hl_dyn_seti (result, id_stencil, &hlt_bool, true); @@ -2806,7 +2805,7 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_shader_precision_format (int shadertype, int precisiontype, void* object) { + HL_PRIM vdynamic* hl_lime_gl_get_shader_precision_format (int shadertype, int precisiontype) { #ifdef LIME_GLES @@ -2815,12 +2814,11 @@ namespace lime { glGetShaderPrecisionFormat (shadertype, precisiontype, range, &precision); - vdynamic* result = (vdynamic*)object; - const int id_rangeMin = hl_hash_utf8 ("rangeMin"); const int id_rangeMax = hl_hash_utf8 ("rangeMax"); const int id_precision = hl_hash_utf8 ("precision"); + vdynamic *result = (vdynamic*)hl_alloc_dynobj(); hl_dyn_seti (result, id_rangeMin, &hlt_i32, range[0]); hl_dyn_seti (result, id_rangeMax, &hlt_i32, range[1]); hl_dyn_seti (result, id_precision, &hlt_i32, precision); @@ -3092,11 +3090,9 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_transform_feedback_varying (int program, int index, void* object) { + HL_PRIM vdynamic* hl_lime_gl_get_transform_feedback_varying (int program, int index) { #ifdef LIME_GLES3_API - vdynamic* result = (vdynamic*)object; - GLint maxLength = 0; glGetProgramiv (program, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, &maxLength); @@ -3108,13 +3104,18 @@ namespace lime { glGetTransformFeedbackVarying (program, index, maxLength, &outLen, &size, &type, buffer); + char* _buffer = (char*)malloc (outLen + 1); + memcpy (_buffer, &buffer, outLen); + _buffer[outLen] = '\0'; + const int id_size = hl_hash_utf8 ("size"); const int id_type = hl_hash_utf8 ("type"); const int id_name = hl_hash_utf8 ("name"); + vdynamic *result = (vdynamic*)hl_alloc_dynobj(); hl_dyn_seti (result, id_size, &hlt_i32, size); hl_dyn_seti (result, id_type, &hlt_i32, type); - hl_dyn_setp (result, id_name, &hlt_bytes, buffer); + hl_dyn_setp (result, id_name, &hlt_bytes, _buffer); return result; #else @@ -5704,8 +5705,8 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_framebuffer_texture2D, _I32 _I32 _I32 _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_front_face, _I32); DEFINE_HL_PRIM (_VOID, lime_gl_generate_mipmap, _I32); - DEFINE_HL_PRIM (_DYN, lime_gl_get_active_attrib, _I32 _I32 _DYN); - DEFINE_HL_PRIM (_DYN, lime_gl_get_active_uniform, _I32 _I32 _DYN); + DEFINE_HL_PRIM (_DYN, lime_gl_get_active_attrib, _I32 _I32); + DEFINE_HL_PRIM (_DYN, lime_gl_get_active_uniform, _I32 _I32); DEFINE_HL_PRIM (_I32, lime_gl_get_active_uniform_blocki, _I32 _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_active_uniform_blockiv, _I32 _I32 _I32 _F64); DEFINE_HL_PRIM (_BYTES, lime_gl_get_active_uniform_block_name, _I32 _I32); @@ -5719,7 +5720,7 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_get_buffer_parameteri64v, _I32 _I32 _F64); DEFINE_HL_PRIM (_F64, lime_gl_get_buffer_pointerv, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_buffer_sub_data, _I32 _F64 _I32 _F64); - DEFINE_HL_PRIM (_DYN, lime_gl_get_context_attributes, _DYN); + DEFINE_HL_PRIM (_DYN, lime_gl_get_context_attributes, _NO_ARG); DEFINE_HL_PRIM (_I32, lime_gl_get_error, _NO_ARG); DEFINE_HL_PRIM (_DYN, lime_gl_get_extension, _STRING); DEFINE_HL_PRIM (_F32, lime_gl_get_float, _I32); @@ -5750,7 +5751,7 @@ namespace lime { DEFINE_HL_PRIM (_BYTES, lime_gl_get_shader_info_log, _I32); DEFINE_HL_PRIM (_I32, lime_gl_get_shaderi, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_shaderiv, _I32 _I32 _F64); - DEFINE_HL_PRIM (_DYN, lime_gl_get_shader_precision_format, _I32 _I32 _DYN); + DEFINE_HL_PRIM (_DYN, lime_gl_get_shader_precision_format, _I32 _I32); DEFINE_HL_PRIM (_BYTES, lime_gl_get_shader_source, _I32); DEFINE_HL_PRIM (_BYTES, lime_gl_get_string, _I32); DEFINE_HL_PRIM (_BYTES, lime_gl_get_stringi, _I32 _I32); @@ -5760,7 +5761,7 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_get_tex_parameterfv, _I32 _I32 _F64); DEFINE_HL_PRIM (_I32, lime_gl_get_tex_parameteri, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_tex_parameteriv, _I32 _I32 _F64); - DEFINE_HL_PRIM (_DYN, lime_gl_get_transform_feedback_varying, _I32 _I32 _DYN); + DEFINE_HL_PRIM (_DYN, lime_gl_get_transform_feedback_varying, _I32 _I32); DEFINE_HL_PRIM (_F32, lime_gl_get_uniformf, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_uniformfv, _I32 _I32 _F64); DEFINE_HL_PRIM (_I32, lime_gl_get_uniformi, _I32 _I32); diff --git a/src/lime/_internal/backend/native/NativeCFFI.hx b/src/lime/_internal/backend/native/NativeCFFI.hx index 8ebeae660..62c220332 100644 --- a/src/lime/_internal/backend/native/NativeCFFI.hx +++ b/src/lime/_internal/backend/native/NativeCFFI.hx @@ -1217,7 +1217,7 @@ class NativeCFFI @:hlNative("lime", "lime_window_context_flip") private static function lime_window_context_flip(handle:CFFIPointer):Void {} - @:hlNative("lime", "lime_window_context_lock") private static function lime_window_context_lock(handle:CFFIPointer, object:Dynamic):Dynamic + @:hlNative("lime", "lime_window_context_lock") private static function lime_window_context_lock(handle:CFFIPointer):Dynamic { return null; } @@ -5024,12 +5024,12 @@ class NativeCFFI @:hlNative("lime", "lime_gl_generate_mipmap") private static function lime_gl_generate_mipmap(target:Int):Void {} - @:hlNative("lime", "lime_gl_get_active_attrib") private static function lime_gl_get_active_attrib(program:Int, index:Int, object:Dynamic):Dynamic + @:hlNative("lime", "lime_gl_get_active_attrib") private static function lime_gl_get_active_attrib(program:Int, index:Int):Dynamic { return null; } - @:hlNative("lime", "lime_gl_get_active_uniform") private static function lime_gl_get_active_uniform(program:Int, index:Int, object:Dynamic):Dynamic + @:hlNative("lime", "lime_gl_get_active_uniform") private static function lime_gl_get_active_uniform(program:Int, index:Int):Dynamic { return null; } @@ -5088,7 +5088,7 @@ class NativeCFFI @:hlNative("lime", "lime_gl_get_buffer_sub_data") private static function lime_gl_get_buffer_sub_data(target:Int, offset:DataPointer, size:Int, data:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_context_attributes") private static function lime_gl_get_context_attributes(object:Dynamic):Dynamic + @:hlNative("lime", "lime_gl_get_context_attributes") private static function lime_gl_get_context_attributes():Dynamic { return null; } @@ -5204,8 +5204,7 @@ class NativeCFFI @:hlNative("lime", "lime_gl_get_shaderiv") private static function lime_gl_get_shaderiv(shader:Int, pname:Int, params:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_shader_precision_format") private static function lime_gl_get_shader_precision_format(shadertype:Int, precisiontype:Int, - object:Dynamic):Dynamic + @:hlNative("lime", "lime_gl_get_shader_precision_format") private static function lime_gl_get_shader_precision_format(shadertype:Int, precisiontype:Int):Dynamic { return null; } @@ -5247,8 +5246,7 @@ class NativeCFFI @:hlNative("lime", "lime_gl_get_tex_parameteriv") private static function lime_gl_get_tex_parameteriv(target:Int, pname:Int, params:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_transform_feedback_varying") private static function lime_gl_get_transform_feedback_varying(program:Int, index:Int, - object:Dynamic):Dynamic + @:hlNative("lime", "lime_gl_get_transform_feedback_varying") private static function lime_gl_get_transform_feedback_varying(program:Int, index:Int):Dynamic { return null; } diff --git a/src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx b/src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx index 2d429b710..9c383e250 100644 --- a/src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx +++ b/src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx @@ -1390,13 +1390,13 @@ class NativeOpenGLRenderContext { #if (lime_cffi && (lime_opengl || lime_opengles) && !macro) #if hl - var object:{size:Int, type:Int, name:hl.Bytes} = {size: 0, type: 0, name: null}; - if (NativeCFFI.lime_gl_get_active_attrib(__getObjectID(program), index, object) != null) + var result = NativeCFFI.lime_gl_get_active_attrib(__getObjectID(program), index); + if (result != null) { return { - size: object.size, - type: object.type, - name: object.name != null ? @:privateAccess String.fromUTF8(object.name) : null + size: result.size, + type: result.type, + name: @:privateAccess String.fromUTF8(result.name) }; } else @@ -1415,13 +1415,13 @@ class NativeOpenGLRenderContext { #if (lime_cffi && (lime_opengl || lime_opengles) && !macro) #if hl - var object:{size:Int, type:Int, name:hl.Bytes} = {size: 0, type: 0, name: null}; - if (NativeCFFI.lime_gl_get_active_uniform(__getObjectID(program), index, object) != null) + var result = NativeCFFI.lime_gl_get_active_uniform(__getObjectID(program), index); + if (result != null) { return { - size: object.size, - type: object.type, - name: object.name != null ? @:privateAccess String.fromUTF8(object.name) : null + size: result.size, + type: result.type, + name: @:privateAccess String.fromUTF8(result.name) }; } else @@ -1582,18 +1582,7 @@ class NativeOpenGLRenderContext public function getContextAttributes():GLContextAttributes { #if (lime_cffi && (lime_opengl || lime_opengles) && !macro) - #if hl - var object:Dynamic = - { - alpha: false, - depth: false, - stencil: false, - antialias: false - }; - var base:Dynamic = NativeCFFI.lime_gl_get_context_attributes(object); - #else var base:Dynamic = NativeCFFI.lime_gl_get_context_attributes(); - #end base.premultipliedAlpha = false; base.preserveDrawingBuffer = false; return base; @@ -2056,11 +2045,7 @@ class NativeOpenGLRenderContext public function getShaderPrecisionFormat(shadertype:Int, precisiontype:Int):GLShaderPrecisionFormat { #if (lime_cffi && (lime_opengl || lime_opengles) && !macro) - #if hl - return NativeCFFI.lime_gl_get_shader_precision_format(shadertype, precisiontype, {rangeMin: 0, rangeMax: 0, precision: 0}); - #else return NativeCFFI.lime_gl_get_shader_precision_format(shadertype, precisiontype); - #end #else return null; #end @@ -2205,13 +2190,13 @@ class NativeOpenGLRenderContext { #if (lime_cffi && (lime_opengl || lime_opengles) && !macro) #if hl - var object:{size:Int, type:Int, name:hl.Bytes} = {size: 0, type: 0, name: null}; - if (NativeCFFI.lime_gl_get_transform_feedback_varying(__getObjectID(program), index, object) != null) + var result = NativeCFFI.lime_gl_get_transform_feedback_varying(__getObjectID(program), index); + if (result != null) { return { - size: object.size, - type: object.type, - name: object.name != null ? @:privateAccess String.fromUTF8(object.name) : null + size: result.size, + type: result.type, + name: @:privateAccess String.fromUTF8(result.name) }; } else diff --git a/src/lime/_internal/backend/native/NativeWindow.hx b/src/lime/_internal/backend/native/NativeWindow.hx index 83e846e7a..b646619a7 100644 --- a/src/lime/_internal/backend/native/NativeWindow.hx +++ b/src/lime/_internal/backend/native/NativeWindow.hx @@ -408,13 +408,7 @@ class NativeWindow if (!useHardware) { #if lime_cairo - var lock:Dynamic = NativeCFFI.lime_window_context_lock(handle #if hl, - { - width: 0, - height: 0, - pixels: 0., - pitch: 0 - } #end); + var lock:Dynamic = NativeCFFI.lime_window_context_lock(handle); if (lock != null && (cacheLock == null || cacheLock.pixels != lock.pixels || cacheLock.width != lock.width || cacheLock.height != lock.height))