Native OpenGL GC fix
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user