Collect GL objects from the main thread
This commit is contained in:
@@ -391,6 +391,8 @@ class GL {
|
|||||||
private static var context:RenderingContext;
|
private static var context:RenderingContext;
|
||||||
#end
|
#end
|
||||||
|
|
||||||
|
private static var __currentProgram:GLProgram;
|
||||||
|
|
||||||
|
|
||||||
public static inline function activeTexture (texture:Int):Void {
|
public static inline function activeTexture (texture:Int):Void {
|
||||||
|
|
||||||
@@ -2072,6 +2074,8 @@ class GL {
|
|||||||
|
|
||||||
public static inline function useProgram (program:GLProgram):Void {
|
public static inline function useProgram (program:GLProgram):Void {
|
||||||
|
|
||||||
|
__currentProgram = program;
|
||||||
|
|
||||||
#if (js && html5 && !display)
|
#if (js && html5 && !display)
|
||||||
context.useProgram (program);
|
context.useProgram (program);
|
||||||
#elseif (lime_cffi && lime_opengl && !macro)
|
#elseif (lime_cffi && lime_opengl && !macro)
|
||||||
|
|||||||
@@ -4,7 +4,9 @@
|
|||||||
#include <utils/Bytes.h>
|
#include <utils/Bytes.h>
|
||||||
#include "OpenGL.h"
|
#include "OpenGL.h"
|
||||||
#include "OpenGLBindings.h"
|
#include "OpenGLBindings.h"
|
||||||
|
#include <mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#ifdef NEED_EXTENSIONS
|
#ifdef NEED_EXTENSIONS
|
||||||
#define DEFINE_EXTENSION
|
#define DEFINE_EXTENSION
|
||||||
@@ -34,45 +36,131 @@ namespace lime {
|
|||||||
void lime_gl_delete_shader (value handle);
|
void lime_gl_delete_shader (value handle);
|
||||||
void lime_gl_delete_texture (value handle);
|
void lime_gl_delete_texture (value handle);
|
||||||
|
|
||||||
|
enum GCObjectType {
|
||||||
|
|
||||||
|
GC_BUFFER,
|
||||||
|
GC_FRAMEBUFFER,
|
||||||
|
GC_PROGRAM,
|
||||||
|
GC_RENDERBUFFER,
|
||||||
|
GC_SHADER,
|
||||||
|
GC_TEXTURE
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<GCObjectType> gc_gl_type;
|
||||||
|
std::vector<GLuint> gc_gl_id;
|
||||||
|
std::mutex gc_gl_mutex;
|
||||||
|
|
||||||
|
|
||||||
void gc_gl_buffer (value handle) {
|
void gc_gl_buffer (value handle) {
|
||||||
|
|
||||||
lime_gl_delete_buffer (handle);
|
std::lock_guard<std::mutex> lock (gc_gl_mutex);
|
||||||
|
gc_gl_type.push_back (GC_BUFFER);
|
||||||
|
gc_gl_id.push_back (reinterpret_cast<uintptr_t> (val_data (handle)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gc_gl_framebuffer (value handle) {
|
void gc_gl_framebuffer (value handle) {
|
||||||
|
|
||||||
lime_gl_delete_framebuffer (handle);
|
std::lock_guard<std::mutex> lock (gc_gl_mutex);
|
||||||
|
gc_gl_type.push_back (GC_FRAMEBUFFER);
|
||||||
|
gc_gl_id.push_back (reinterpret_cast<uintptr_t> (val_data (handle)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gc_gl_program (value handle) {
|
void gc_gl_program (value handle) {
|
||||||
|
|
||||||
lime_gl_delete_program (handle);
|
std::lock_guard<std::mutex> lock (gc_gl_mutex);
|
||||||
|
gc_gl_type.push_back (GC_PROGRAM);
|
||||||
|
gc_gl_id.push_back (reinterpret_cast<uintptr_t> (val_data (handle)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gc_gl_render_buffer (value handle) {
|
void gc_gl_render_buffer (value handle) {
|
||||||
|
|
||||||
lime_gl_delete_render_buffer (handle);
|
std::lock_guard<std::mutex> lock (gc_gl_mutex);
|
||||||
|
gc_gl_type.push_back (GC_RENDERBUFFER);
|
||||||
|
gc_gl_id.push_back (reinterpret_cast<uintptr_t> (val_data (handle)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void gc_gl_run () {
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> lock (gc_gl_mutex);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
i = gc_gl_type.size () - 1;
|
||||||
|
|
||||||
|
if (i > -1) {
|
||||||
|
|
||||||
|
GCObjectType type = gc_gl_type[i];
|
||||||
|
GLuint id = gc_gl_id[i];
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
|
||||||
|
case GC_BUFFER:
|
||||||
|
|
||||||
|
glDeleteBuffers (1, &id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GC_FRAMEBUFFER:
|
||||||
|
|
||||||
|
glDeleteFramebuffers (1, &id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GC_PROGRAM:
|
||||||
|
|
||||||
|
glDeleteProgram (id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GC_RENDERBUFFER:
|
||||||
|
|
||||||
|
glDeleteRenderbuffers (1, &id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GC_SHADER:
|
||||||
|
|
||||||
|
glDeleteShader (id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GC_TEXTURE:
|
||||||
|
|
||||||
|
glDeleteTextures (1, &id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
gc_gl_type.pop_back ();
|
||||||
|
gc_gl_id.pop_back ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (i > 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gc_gl_shader (value handle) {
|
void gc_gl_shader (value handle) {
|
||||||
|
|
||||||
lime_gl_delete_shader (handle);
|
std::lock_guard<std::mutex> lock (gc_gl_mutex);
|
||||||
|
gc_gl_type.push_back (GC_SHADER);
|
||||||
|
gc_gl_id.push_back (reinterpret_cast<uintptr_t> (val_data (handle)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gc_gl_texture (value handle) {
|
void gc_gl_texture (value handle) {
|
||||||
|
|
||||||
lime_gl_delete_texture (handle);
|
std::lock_guard<std::mutex> lock (gc_gl_mutex);
|
||||||
|
gc_gl_type.push_back (GC_TEXTURE);
|
||||||
|
gc_gl_id.push_back (reinterpret_cast<uintptr_t> (val_data (handle)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,6 +298,7 @@ namespace lime {
|
|||||||
|
|
||||||
void lime_gl_clear (int mask) {
|
void lime_gl_clear (int mask) {
|
||||||
|
|
||||||
|
gc_gl_run ();
|
||||||
glClear (mask);
|
glClear (mask);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user