From 6ebfa17d5d7cb887dd523ea1fa1475345a1759dc Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Thu, 16 Mar 2017 10:06:52 -0700 Subject: [PATCH] Improve OpenGL GC --- lime/_backend/native/NativeCFFI.hx | 4 +- lime/graphics/opengl/GL.hx | 2 +- .../src/graphics/opengl/OpenGLBindings.cpp | 45 ++++++++++++------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/lime/_backend/native/NativeCFFI.hx b/lime/_backend/native/NativeCFFI.hx index bfc7293be..dfb3f54a6 100644 --- a/lime/_backend/native/NativeCFFI.hx +++ b/lime/_backend/native/NativeCFFI.hx @@ -521,8 +521,8 @@ class NativeCFFI { @: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_object_from_id (id:Int, type:Int):Dynamic; + @:cffi private static function lime_gl_object_register (id:Int, type:Int, object:Dynamic):Void; @:cffi private static function lime_gl_pixel_storei (pname:Int, param:Int):Void; @:cffi private static function lime_gl_polygon_offset (factor:Float32, units:Float32):Void; @:cffi private static function lime_gl_read_pixels (x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:DataPointer):Void; diff --git a/lime/graphics/opengl/GL.hx b/lime/graphics/opengl/GL.hx index 4b83bca04..dc6f12a1c 100644 --- a/lime/graphics/opengl/GL.hx +++ b/lime/graphics/opengl/GL.hx @@ -3050,7 +3050,7 @@ class GL { public static function fromInt (type:GLObjectType, id:Int):GLObject { #if (lime_cffi && lime_opengl && !macro) - var object = NativeCFFI.lime_gl_object_from_id (id); + var object = NativeCFFI.lime_gl_object_from_id (id, type); if (object != null) { diff --git a/project/src/graphics/opengl/OpenGLBindings.cpp b/project/src/graphics/opengl/OpenGLBindings.cpp index d7f1f9710..d9d72f43b 100644 --- a/project/src/graphics/opengl/OpenGLBindings.cpp +++ b/project/src/graphics/opengl/OpenGLBindings.cpp @@ -31,7 +31,7 @@ namespace lime { int OpenGLBindings::defaultFramebuffer = 0; - std::map glObjects; + std::map > glObjects; std::map glObjectIDs; std::map glObjectTypes; @@ -46,11 +46,12 @@ namespace lime { if (glObjectIDs.find (object) != glObjectIDs.end ()) { GLuint id = glObjectIDs[object]; + GLObjectType type = glObjectTypes[object]; gc_gl_id.push_back (id); - gc_gl_type.push_back (glObjectTypes[object]); + gc_gl_type.push_back (type); - glObjects.erase (id); + glObjects[type].erase (id); glObjectIDs.erase (object); glObjectTypes.erase (object); @@ -67,6 +68,7 @@ namespace lime { gc_gl_mutex.Lock (); int size = gc_gl_id.size (); + GLuint id; GLObjectType type; @@ -1066,26 +1068,25 @@ namespace lime { if (glObjectIDs.find (object) != glObjectIDs.end ()) { - int id = glObjectIDs[object]; + GLuint id = glObjectIDs[object]; + GLObjectType type = glObjectTypes[object]; + + glObjects[type].erase (id); glObjectTypes.erase (object); glObjectIDs.erase (object); - if (glObjects[id] == object) { - - glObjects.erase (id); - - } - } } - value lime_gl_object_from_id (int id) { + value lime_gl_object_from_id (int id, int type) { - if (glObjects.find (id) != glObjects.end ()) { + GLObjectType _type = (GLObjectType)type; + + if (glObjects[_type].find (id) != glObjects[_type].end ()) { - return glObjects[id]; + return glObjects[_type][id]; } else { @@ -1098,9 +1099,23 @@ namespace lime { void lime_gl_object_register (int id, int type, value object) { + GLObjectType _type = (GLObjectType)type; + + //if (glObjects[_type].find (id) != glObjects[_type].end ()) { + // + //value otherObject = glObjects[_type][id]; + //if (otherObject == object) return; + // + //glObjectTypes.erase (otherObject); + //glObjectIDs.erase (object); + // + //val_gc (otherObject, 0); + // + //} + glObjectTypes[object] = (GLObjectType)type; glObjectIDs[object] = id; - glObjects[id] = object; + glObjects[_type][id] = object; val_gc (object, gc_gl_object); @@ -1588,7 +1603,7 @@ namespace lime { 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_PRIME2 (lime_gl_object_from_id); DEFINE_PRIME3v (lime_gl_object_register); DEFINE_PRIME2v (lime_gl_pixel_storei); DEFINE_PRIME2v (lime_gl_polygon_offset);