From 712c87580fa8df61836fa6da3c5abb89661f4b7a Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Tue, 14 Mar 2017 12:32:01 -0700 Subject: [PATCH] Native OpenGL GC fix --- lime/_backend/native/NativeCFFI.hx | 1 + lime/_backend/native/NativeGLRenderContext.hx | 6 +++++ .../src/graphics/opengl/OpenGLBindings.cpp | 22 +++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/lime/_backend/native/NativeCFFI.hx b/lime/_backend/native/NativeCFFI.hx index 267550260..bfc7293be 100644 --- a/lime/_backend/native/NativeCFFI.hx +++ b/lime/_backend/native/NativeCFFI.hx @@ -520,6 +520,7 @@ class NativeCFFI { @:cffi private static function lime_gl_is_texture (texture:Int):Bool; @:cffi private static function lime_gl_line_width (width:Float32):Void; @:cffi private static function lime_gl_link_program (program:Int):Void; + @:cffi private static function lime_gl_object_deregister (object:Dynamic):Void; @:cffi private static function lime_gl_object_from_id (id:Int):Dynamic; @:cffi private static function lime_gl_object_register (type:Int, id:Int, object:Dynamic):Void; @:cffi private static function lime_gl_pixel_storei (pname:Int, param:Int):Void; diff --git a/lime/_backend/native/NativeGLRenderContext.hx b/lime/_backend/native/NativeGLRenderContext.hx index fab14f16c..e1f632e72 100644 --- a/lime/_backend/native/NativeGLRenderContext.hx +++ b/lime/_backend/native/NativeGLRenderContext.hx @@ -1208,6 +1208,7 @@ class NativeGLRenderContext { public function deleteBuffer (buffer:GLBuffer):Void { #if (lime_cffi && lime_opengl && !macro) + if (buffer != null) NativeCFFI.lime_gl_object_deregister (buffer); NativeCFFI.lime_gl_delete_buffer (__getObjectID (buffer)); #end @@ -1217,6 +1218,7 @@ class NativeGLRenderContext { public function deleteFramebuffer (framebuffer:GLFramebuffer):Void { #if (lime_cffi && lime_opengl && !macro) + if (framebuffer != null) NativeCFFI.lime_gl_object_deregister (framebuffer); NativeCFFI.lime_gl_delete_framebuffer (__getObjectID (framebuffer)); #end @@ -1226,6 +1228,7 @@ class NativeGLRenderContext { public function deleteProgram (program:GLProgram):Void { #if (lime_cffi && lime_opengl && !macro) + if (program != null) NativeCFFI.lime_gl_object_deregister (program); NativeCFFI.lime_gl_delete_program (__getObjectID (program)); #end @@ -1241,6 +1244,7 @@ class NativeGLRenderContext { public function deleteRenderbuffer (renderbuffer:GLRenderbuffer):Void { #if (lime_cffi && lime_opengl && !macro) + if (renderbuffer != null) NativeCFFI.lime_gl_object_deregister (renderbuffer); NativeCFFI.lime_gl_delete_renderbuffer (__getObjectID (renderbuffer)); #end @@ -1256,6 +1260,7 @@ class NativeGLRenderContext { public function deleteShader (shader:GLShader):Void { #if (lime_cffi && lime_opengl && !macro) + if (shader != null) NativeCFFI.lime_gl_object_deregister (shader); NativeCFFI.lime_gl_delete_shader (__getObjectID (shader)); #end @@ -1271,6 +1276,7 @@ class NativeGLRenderContext { public function deleteTexture (texture:GLTexture):Void { #if (lime_cffi && lime_opengl && !macro) + if (texture != null) NativeCFFI.lime_gl_object_deregister (texture); NativeCFFI.lime_gl_delete_texture (__getObjectID (texture)); #end diff --git a/project/src/graphics/opengl/OpenGLBindings.cpp b/project/src/graphics/opengl/OpenGLBindings.cpp index 35ee47c71..d7f1f9710 100644 --- a/project/src/graphics/opengl/OpenGLBindings.cpp +++ b/project/src/graphics/opengl/OpenGLBindings.cpp @@ -1060,6 +1060,27 @@ namespace lime { } + void lime_gl_object_deregister (value object) { + + val_gc (object, 0); + + if (glObjectIDs.find (object) != glObjectIDs.end ()) { + + int id = glObjectIDs[object]; + glObjectTypes.erase (object); + glObjectIDs.erase (object); + + if (glObjects[id] == object) { + + glObjects.erase (id); + + } + + } + + } + + value lime_gl_object_from_id (int id) { if (glObjects.find (id) != glObjects.end ()) { @@ -1566,6 +1587,7 @@ namespace lime { DEFINE_PRIME1 (lime_gl_is_texture); DEFINE_PRIME1v (lime_gl_line_width); DEFINE_PRIME1v (lime_gl_link_program); + DEFINE_PRIME1v (lime_gl_object_deregister); DEFINE_PRIME1 (lime_gl_object_from_id); DEFINE_PRIME3v (lime_gl_object_register); DEFINE_PRIME2v (lime_gl_pixel_storei);