Native OpenGL GC fix

This commit is contained in:
Joshua Granick
2017-03-14 12:32:01 -07:00
parent 8927a3709c
commit 712c87580f
3 changed files with 29 additions and 0 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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);