Sync with released version for TIZEN 1.0 demo
authorHaegeun Park <haegeun.park@samsung.com>
Thu, 12 Apr 2012 13:09:46 +0000 (06:09 -0700)
committerHaegeun Park <haegeun.park@samsung.com>
Thu, 12 Apr 2012 13:09:46 +0000 (06:09 -0700)
Updates since last release:

    - Separted globally shared gl objects to local contexts
      (texture, buffer, framebuffer, renderbuffer, program)
    - Enhance tracing & performance
    - Added gl-error handling
    - Added handling functions for some extensions
    - Fixed dlsym link bug & hided unused symbols

18 files changed:
Makefile
include/EGL/sym_egl.h
include/GLES2/sym_gl.h
src/coregl.c
src/coregl.h
src/coregl_fastpath.c
src/coregl_fastpath.h
src/coregl_fastpath_egl.c
src/coregl_fastpath_gl.c
src/coregl_internal.h
src/coregl_override.c
src/coregl_trace.c
src/coregl_wrappath.c
src/coregl_wrappath.h
src/coregl_wrappath_egl.c
src/coregl_wrappath_gl.c
src/headers/sym_egl.h
src/headers/sym_gl.h

index 0fb8c3c..6b8f8ef 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,9 @@
 CC = gcc
 
-CFLAGS = -g -O2 -fPIC -Wall -std=c99 \
+CFLAGS = -g -O2 -fvisibility=hidden -fPIC -Wall -std=c99 \
        -D_COREGL_EMBEDDED_GL \
 
-LDFLAGS = -g -O2 -Wall -std=c99 -lpthread
+LDFLAGS = -g -O2 -fvisibility=hidden -Wall -std=c99 -lpthread
 
 SOURCES = \
                src/coregl.c \
index 17ed9d6..d31a675 100644 (file)
@@ -1,7 +1,7 @@
 // Defult use-case for exporting symbols
 #ifndef _COREGL_SYMBOL
 #define _COREGL_SYMBOL_NOT_DEFINED
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_COREGL_NAME_MANGLE(FUNC_NAME)) PARAM_LIST;
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_API extern RET_TYPE FUNC_NAME PARAM_LIST;
 #endif
 
 // Standard EGL APIs
@@ -56,8 +56,8 @@ _COREGL_SYMBOL(GL_TRUE, void*, eglMapImageSEC, (EGLDisplay dpy, EGLImageKHR imag
 _COREGL_SYMBOL(GL_TRUE, EGLBoolean, eglUnmapImageSEC, (EGLDisplay dpy, EGLImageKHR image))
 _COREGL_SYMBOL(GL_TRUE, EGLBoolean, eglGetImageAttribSEC, (EGLDisplay dpy, EGLImageKHR image, EGLint attribute, EGLint *value))
 
-//_COREGL_SYMBOL(GL_FALSE, unsigned int, eglLockSurface, (EGLDisplay a, EGLSurface b, const int *attrib_list))
-//_COREGL_SYMBOL(GL_FALSE, unsigned int, eglUnlockSurface, (EGLDisplay a, EGLSurface b))
+_COREGL_SYMBOL(GL_TRUE, EGLBoolean, eglLockSurfaceKHR, (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list))
+_COREGL_SYMBOL(GL_TRUE, EGLBoolean, eglUnlockSurfaceKHR, (EGLDisplay display, EGLSurface surface))
 
 #ifdef _COREGL_SYMBOL_NOT_DEFINED
 #undef _COREGL_SYMBOL_NOT_DEFINED
index 23247a5..45b992d 100644 (file)
@@ -1,7 +1,7 @@
 // Defult use-case for exporting symbols
 #ifndef _COREGL_SYMBOL
 #define _COREGL_SYMBOL_NOT_DEFINED
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_COREGL_NAME_MANGLE(FUNC_NAME)) PARAM_LIST;
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_API extern RET_TYPE FUNC_NAME PARAM_LIST;
 #endif
 
 /* version 1: */
@@ -164,6 +164,7 @@ _COREGL_SYMBOL(GL_TRUE, void, glProgramBinary, (GLuint program, GLenum binaryFor
 _COREGL_SYMBOL(GL_TRUE, void, glProgramParameteri, (GLuint a, GLuint b, GLint d))
 _COREGL_SYMBOL(GL_TRUE, void, glRenderbufferStorageMultisampleEXT, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height))
 _COREGL_SYMBOL(GL_TRUE, void, glFramebufferTexture2DMultisampleEXT, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples))
+_COREGL_SYMBOL(GL_TRUE, void, glDiscardFramebufferEXT, (GLenum target, GLsizei numAttachments, const GLenum *attachments))
 
 #ifdef _COREGL_SYMBOL_NOT_DEFINED
 #undef _COREGL_SYMBOL_NOT_DEFINED
index cb640bf..2375a18 100644 (file)
@@ -4,6 +4,8 @@
 #include <string.h>
 #include "coregl_internal.h"
 
+CoreGL_Opt_Flag         api_opt = COREGL_UNKNOWN_PATH;
+
 Mutex                   ctx_list_access_mutex = MUTEX_INITIALIZER;
 
 void                   *egl_lib_handle;
@@ -11,12 +13,12 @@ void                   *gl_lib_handle;
 
 GLContext_List         *glctx_list = NULL;
 
-// Symbol definition for local
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     RET_TYPE (*_COREGL_NAME_MANGLE(FUNC_NAME)) PARAM_LIST = NULL;
-#include "headers/sym.h"
-#undef _COREGL_SYMBOL
+int                 trace_api_flag = 0;
+int                 trace_ctx_flag = 0;
+int                 trace_state_flag = 0;
+int                 debug_nofp = 0;
 
-// Symbol definition for static
+// Symbol definition for real
 #define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     RET_TYPE (*_sym_##FUNC_NAME) PARAM_LIST;
 #include "headers/sym.h"
 #undef _COREGL_SYMBOL
@@ -184,6 +186,7 @@ init_new_thread_state()
 
        tstate = (GLThreadState *)calloc(1, sizeof(GLThreadState));
        tstate->thread_id = get_current_thread();
+       tstate->binded_api = EGL_NONE;
 
        set_current_thread_state(&ctx_list_access_mutex, tstate);
 
@@ -285,6 +288,11 @@ _gl_sym_init(void)
        return 1;
 }
 
+COREGL_API void coregl_symbol_exported()
+{
+       LOG("\E[0;31;1mERROR : Invalid library link! (Check linkage of libCOREGL)\E[0m\n");
+}
+
 static int
 _gl_lib_init(void)
 {
@@ -293,15 +301,23 @@ _gl_lib_init(void)
        //------------------------------------------------//
        // Open EGL Library as EGL is separate
 #ifndef _COREGL_EMBED_EVAS
-       egl_lib_handle = dlopen("libEGL_drv.so", RTLD_NOW | RTLD_GLOBAL);
+       egl_lib_handle = dlopen("libEGL_drv.so", RTLD_NOW);
 #else
-       egl_lib_handle = dlopen("libEGL.so.1", RTLD_NOW | RTLD_GLOBAL);
+       egl_lib_handle = dlopen("libEGL.so.1", RTLD_NOW);
        if (!egl_lib_handle)
-               egl_lib_handle = dlopen("libEGL.so", RTLD_NOW | RTLD_GLOBAL);
+               egl_lib_handle = dlopen("libEGL.so", RTLD_NOW);
 #endif
        if (!egl_lib_handle)
        {
-               ERR("%s\n", dlerror());
+               ERR("\E[0;31;1mERROR : %s\E[0m\n\n", dlerror());
+               ERR("\E[0;31;1mERROR : Invalid library link! (Check linkage of libCOREGL -> libEGL_drv)\E[0m\n");
+               return 0;
+       }
+
+       // test for invalid linking egl
+       if (dlsym(egl_lib_handle, "coregl_symbol_exported"))
+       {
+               ERR("\E[0;31;1mERROR : Invalid library link! (Check linkage of libCOREGL -> libEGL_drv)\E[0m\n");
                return 0;
        }
 
@@ -315,7 +331,15 @@ _gl_lib_init(void)
 #endif
        if (!gl_lib_handle)
        {
-               ERR("%s\n", dlerror());
+               ERR("\E[0;31;1mERROR : %s\E[0m\n\n", dlerror());
+               ERR("\E[0;31;1mERROR : Invalid library link! (Check linkage of libCOREGL -> libGLESv2_drv)\E[0m\n");
+               return 0;
+       }
+
+       // test for invalid linking gl
+       if (dlsym(gl_lib_handle, "coregl_symbol_exported"))
+       {
+               ERR("\E[0;31;1mERROR : Invalid library link! (Check linkage of libCOREGL -> libGLESv2_drv)\E[0m\n");
                return 0;
        }
        //------------------------------------------------//
@@ -346,6 +370,9 @@ _gl_lib_init(void)
        return 1;
 }
 
+extern void init_fast_gl();
+extern void init_wrap_gl();
+
 #ifndef _COREGL_EMBED_EVAS
 __attribute__((constructor))
 #endif
@@ -353,7 +380,6 @@ int
 init_gl()
 {
        int fastpath_opt = 0;
-       CoreGL_Opt_Flag api_opt = COREGL_NORMAL_PATH;
 
        LOG("[CoreGL] ");
 
@@ -366,12 +392,27 @@ init_gl()
                case 1:
                        api_opt = COREGL_FAST_PATH;
                        LOG(": (%d) Fastpath enabled...\n", fastpath_opt);
+                       init_fast_gl();
                        break;
                default:
                        LOG(": (%d) Default API path enabled...\n", fastpath_opt);
                        api_opt = COREGL_NORMAL_PATH;
+                       init_wrap_gl();
                        break;
-               }
+       }
+
+#ifdef COREGL_TRACE_APICALL_INFO
+       trace_api_flag = atoi(get_env_setting("COREGL_TRACE_API"));
+#endif
+#ifdef COREGL_TRACE_CONTEXT_INFO
+       trace_ctx_flag = atoi(get_env_setting("COREGL_TRACE_CTX"));
+#endif
+#ifdef COREGL_TRACE_STATE_INFO
+       trace_state_flag = atoi(get_env_setting("COREGL_TRACE_STATE"));
+#endif
+
+       debug_nofp = atoi(get_env_setting("COREGL_DEBUG_NOFP"));
+
 
        override_glue_apis(api_opt);
        override_gl_apis(api_opt);
@@ -379,6 +420,9 @@ init_gl()
        return 1;
 }
 
+extern void free_fast_gl();
+extern void free_wrap_gl();
+
 #ifndef _COREGL_EMBED_EVAS
 __attribute__((destructor))
 #endif
@@ -387,6 +431,16 @@ free_gl()
 {
        GLContext_List *current = NULL;
 
+       switch (api_opt)
+       {
+               case COREGL_FAST_PATH:
+                       free_fast_gl();
+                       break;
+               default:
+                       free_wrap_gl();
+                       break;
+       }
+
        AST(mutex_lock(&ctx_list_access_mutex) == 1);
 
        {
index 70d770b..83ed8de 100644 (file)
@@ -13,7 +13,7 @@
 #undef _COREGL_DESKTOP_GL
 #endif
 
-#define _COREGL_NAME_MANGLE(name) glsym_##name
+#define COREGL_API           __attribute__((visibility("default")))
 
 // Include GL/EGL/GLX types
 #ifndef _COREGL_DESKTOP_GL
index 79a7fec..37a08ed 100644 (file)
@@ -4,6 +4,8 @@
 #include <string.h>
 #include <sys/time.h>
 
+GLenum FPGL_Error = GL_NO_ERROR;
+
 Mutex init_context_mutex = MUTEX_INITIALIZER;
 GLGlueContext *initial_ctx = NULL;
 
@@ -33,6 +35,37 @@ _get_stencil_max_mask()
        return (1 << stencil_bit) - 1;
 }
 
+void
+init_fast_gl()
+{
+}
+
+void
+free_fast_gl()
+{
+}
+
+static GL_Object **
+_get_shared_object(GL_Shared_Object_State *sostate, GL_Object_Type type)
+{
+       switch (type)
+       {
+               case GL_OBJECT_TYPE_TEXTURE:
+                       return sostate->texture;
+               case GL_OBJECT_TYPE_BUFFER:
+                       return sostate->buffer;
+               case GL_OBJECT_TYPE_FRAMEBUFFER:
+                       return sostate->framebuffer;
+               case GL_OBJECT_TYPE_RENDERBUFFER:
+                       return sostate->renderbuffer;
+               case GL_OBJECT_TYPE_PROGRAM:
+                       return sostate->program;
+               default:
+                       return NULL;
+       }
+}
+
+
 GLuint
 sostate_create_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint real_name)
 {
@@ -40,10 +73,7 @@ sostate_create_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLui
        GLuint ret = _COREGL_INT_INIT_VALUE;
        int i;
 
-       switch (type)
-       {
-               case GL_OBJECT_TYPE_TEXTURE: object = sostate->texture; break;
-       }
+       object = _get_shared_object(sostate, type);
 
        for (i = 1; i < MAX_GL_OBJECT_SIZE; i++)
        {
@@ -70,10 +100,7 @@ sostate_remove_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLui
        GLuint ret = _COREGL_INT_INIT_VALUE;
        int hash = _COREGL_INT_INIT_VALUE;
 
-       switch (type)
-       {
-               case GL_OBJECT_TYPE_TEXTURE: object = sostate->texture; break;
-       }
+       object = _get_shared_object(sostate, type);
 
        hash = glue_name - (int)type;
        if (hash < 0 ||
@@ -87,6 +114,7 @@ sostate_remove_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLui
 
        free(object[hash]);
        object[hash] = NULL;
+       ret = 1;
        goto finish;
 
 finish:
@@ -100,10 +128,7 @@ sostate_get_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint
        GLuint ret = _COREGL_INT_INIT_VALUE;
        int hash = _COREGL_INT_INIT_VALUE;
 
-       switch (type)
-       {
-               case GL_OBJECT_TYPE_TEXTURE: object = sostate->texture; break;
-       }
+       object = _get_shared_object(sostate, type);
 
        hash = glue_name - (int)type;
        if (hash < 0 ||
@@ -128,10 +153,7 @@ sostate_find_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint
        GLuint ret = _COREGL_INT_INIT_VALUE;
        int i;
 
-       switch (type)
-       {
-               case GL_OBJECT_TYPE_TEXTURE: object = sostate->texture; break;
-       }
+       object = _get_shared_object(sostate, type);
 
        for (i = 1; i < MAX_GL_OBJECT_SIZE; i++)
        {
@@ -153,14 +175,7 @@ dump_context_states(GLGlueContext *ctx, int force_output)
 {
        static struct timeval tv_last = { 0, 0 };
 
-       {
-               char *fp_env = NULL;
-               int fp_envi = 0;
-               fp_env = getenv("COREGL_TRACE_STATE");
-               if (fp_env) fp_envi = atoi(fp_env);
-               else fp_envi = 0;
-               if (fp_envi == 0) return;
-       }
+       if (trace_state_flag != 1) return;
 
        if (!force_output)
        {
@@ -372,7 +387,7 @@ make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        unsigned char flag = 0;
        int i = 0;
 
-       if (atoi(get_env_setting("COREGL_DEBUG_NOFP")) == 1) goto finish;
+       if (debug_nofp == 1) goto finish;
 
        // Return if they're the same
        if (oldctx == newctx) goto finish;
@@ -387,12 +402,14 @@ make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
    if ((memcmp((oldctx->state_ptr), (newctx->state_ptr), (bytes))) != 0)
 #endif
 
-       _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP glFinish)");
+       static void *trace_hint_glfinish = NULL;
+       trace_hint_glfinish = _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP glFinish)", trace_hint_glfinish, 0);
        _sym_glFlush();
-       _COREGL_TRACE_API_END("eglMakeCurrent(FP glFinish)");
+       _COREGL_TRACE_API_END("eglMakeCurrent(FP glFinish)", trace_hint_glfinish, 0);
 
 
-       _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP bind buffers)");
+       static void *trace_hint_bindbuffers = NULL;
+       trace_hint_bindbuffers = _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP bind buffers)", trace_hint_bindbuffers, 0);
 
        //------------------//
        // _bind_flag
@@ -417,13 +434,14 @@ make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                }
        }
 
-       _COREGL_TRACE_API_END("eglMakeCurrent(FP bind buffers)");
+       _COREGL_TRACE_API_END("eglMakeCurrent(FP bind buffers)", trace_hint_bindbuffers, 0);
 
 
        //------------------//
        // Enable States
        // _enable_flag1
-       _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP enable states)");
+       static void *trace_hint_enable_states = NULL;
+       trace_hint_enable_states = _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP enable states)", trace_hint_enable_states, 0);
 
        flag = oldctx->_enable_flag1 | newctx->_enable_flag1;
        if (flag)
@@ -499,11 +517,12 @@ make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                }
        }
 
-       _COREGL_TRACE_API_END("eglMakeCurrent(FP enable states)");
+       _COREGL_TRACE_API_END("eglMakeCurrent(FP enable states)", trace_hint_enable_states, 0);
 
        //------------------//
        // _clear_flag1
-       _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP clear/viewport)");
+       static void *trace_hint_clear_viewport = NULL;
+       trace_hint_clear_viewport = _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP clear/viewport)", trace_hint_clear_viewport, 0);
 
        flag = oldctx->_clear_flag1 | newctx->_clear_flag1;
        if (flag)
@@ -566,11 +585,12 @@ make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
 
        }
 
-       _COREGL_TRACE_API_END("eglMakeCurrent(FP clear/viewport)");
+       _COREGL_TRACE_API_END("eglMakeCurrent(FP clear/viewport)", trace_hint_clear_viewport, 0);
 
        //------------------//
        // Texture here...
-       _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP bind textures)");
+       static void *trace_hint_bind_textures = NULL;
+       trace_hint_bind_textures = _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP bind textures)", trace_hint_bind_textures, 0);
 
        flag = oldctx->_tex_flag1 | newctx->_tex_flag1;
        if (flag)
@@ -599,10 +619,11 @@ make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                        _sym_glHint(GL_GENERATE_MIPMAP_HINT, newctx->gl_generate_mipmap_hint[0]);
                }
        }
-       _COREGL_TRACE_API_END("eglMakeCurrent(FP bind textures)");
+       _COREGL_TRACE_API_END("eglMakeCurrent(FP bind textures)", trace_hint_bind_textures, 0);
 
        //------------------//
-       _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP etc.)");
+       static void *trace_hint_etc = NULL;
+       trace_hint_etc = _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP etc.)", trace_hint_etc, 0);
 
        flag = oldctx->_blend_flag | newctx->_blend_flag;
        if (flag)
@@ -743,10 +764,11 @@ make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                        _sym_glPixelStorei(GL_UNPACK_ALIGNMENT, newctx->gl_unpack_alignment[0]);
                }
        }
-       _COREGL_TRACE_API_END("eglMakeCurrent(FP etc.)");
+       _COREGL_TRACE_API_END("eglMakeCurrent(FP etc.)", trace_hint_etc, 0);
 
        // _varray_flag
-       _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP vertex attrib)");
+       static void *trace_hint_vertex_attrib = NULL;
+       trace_hint_vertex_attrib = _COREGL_TRACE_API_BEGIN("eglMakeCurrent(FP vertex attrib)", trace_hint_vertex_attrib, 0);
        flag = oldctx->_vattrib_flag | newctx->_vattrib_flag;
        if (flag)
        {
@@ -791,7 +813,7 @@ make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
 
        }
 
-       _COREGL_TRACE_API_END("eglMakeCurrent(FP vertex attrib)");
+       _COREGL_TRACE_API_END("eglMakeCurrent(FP vertex attrib)", trace_hint_vertex_attrib, 0);
        goto finish;
 
 finish:
index 744e9ce..e0617fe 100644 (file)
@@ -3,6 +3,11 @@
 
 #include "coregl_internal.h"
 
+// Symbol definition for fastpath
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (fpgl_##FUNC_NAME) PARAM_LIST;
+# include "headers/sym.h"
+#undef _COREGL_SYMBOL
+
 #define FLAG_BIT_0      0x01
 #define FLAG_BIT_1      0x02
 #define FLAG_BIT_2      0x04
@@ -44,7 +49,12 @@ typedef struct
 
 typedef enum
 {
-       GL_OBJECT_TYPE_TEXTURE = 0x1000000,
+       GL_OBJECT_TYPE_UNKNOWN       = 0x0,
+       GL_OBJECT_TYPE_TEXTURE       = 0x1000000,
+       GL_OBJECT_TYPE_BUFFER        = 0x2000000,
+       GL_OBJECT_TYPE_FRAMEBUFFER   = 0x3000000,
+       GL_OBJECT_TYPE_RENDERBUFFER  = 0x4000000,
+       GL_OBJECT_TYPE_PROGRAM       = 0x5000000,
 } GL_Object_Type;
 
 typedef struct _GL_Object
@@ -59,7 +69,11 @@ typedef struct _GL_Shared_Object_State
 {
        int                    ref_count;
 
-       GL_Object              *texture[MAX_GL_OBJECT_SIZE]; // Texture object : 0x10000X
+       GL_Object              *texture[MAX_GL_OBJECT_SIZE];
+       GL_Object              *buffer[MAX_GL_OBJECT_SIZE];
+       GL_Object              *framebuffer[MAX_GL_OBJECT_SIZE];
+       GL_Object              *renderbuffer[MAX_GL_OBJECT_SIZE];
+       GL_Object              *program[MAX_GL_OBJECT_SIZE];
 } GL_Shared_Object_State;
 
 typedef struct _GLGlueContext
@@ -98,6 +112,8 @@ typedef struct _GLGlueContext
 
        GL_Shared_Object_State *sostate;
 
+       GLenum                  gl_error;
+
        // General state
 #define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT)     TYPE NAME[ARRAY_SIZE];
 # include "coregl_fastpath_state.h"
@@ -107,6 +123,11 @@ typedef struct _GLGlueContext
 
 extern GLGlueContext *initial_ctx;
 
+extern int            debug_nofp;
+
+extern void     init_fast_gl();
+extern void     free_fast_gl();
+
 extern int      init_context_states(GLGlueContext *ctx);
 extern void     make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx);
 
index 4b6baed..a457cf9 100644 (file)
@@ -9,27 +9,13 @@
 General_Trace_List *glue_ctx_trace_list = NULL;
 General_Trace_List *context_state_trace_list = NULL;
 
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST) \
-       extern RET_TYPE FUNC_NAME PARAM_LIST;
-#include "headers/sym_egl.h"
-#include "headers/sym_gl.h"
-#undef _COREGL_SYMBOL
-
-
 static void
 _dump_context_info(const char *ment, int force_output)
 {
        GLThreadState *tstate = NULL;
        static struct timeval tv_last = { 0, 0 };
 
-       {
-               char *fp_env = NULL;
-               int fp_envi = 0;
-               fp_env = getenv("COREGL_TRACE_CTX");
-               if (fp_env) fp_envi = atoi(fp_env);
-               else fp_envi = 0;
-               if (fp_envi == 0) return;
-       }
+       if (trace_ctx_flag != 1) return;
 
        AST(mutex_lock(&ctx_list_access_mutex) == 1);
        AST(mutex_lock(&general_trace_lists_access_mutex) == 1);
@@ -48,9 +34,9 @@ _dump_context_info(const char *ment, int force_output)
        tstate = get_current_thread_state();
 
        LOG("\n");
-       LOG("\E[0;40;34m========================================================================================================================\E[0m\n");
-       LOG("\E[0;32;1m  Context info \E[1;37;1m: %s\E[0m\n", ment);
-       LOG("\E[0;40;34m========================================================================================================================\E[0m\n");
+       LOG("\E[40;34m========================================================================================================================\E[0m\n");
+       LOG("\E[40;32;1m  Context info \E[1;37;1m: %s\E[0m\n", ment);
+       LOG("\E[40;34m========================================================================================================================\E[0m\n");
 
 
        // Thread State List
@@ -132,7 +118,7 @@ _dump_context_info(const char *ment, int force_output)
                }
        }
 
-       LOG("\E[0;40;33m........................................................................................................................\E[0m\n");
+       LOG("\E[40;33m........................................................................................................................\E[0m\n");
 
        // Not-binded Context State List
        {
@@ -203,7 +189,7 @@ _dump_context_info(const char *ment, int force_output)
 
        }
 
-       LOG("\E[0;40;33m........................................................................................................................\E[0m\n");
+       LOG("\E[40;33m........................................................................................................................\E[0m\n");
 
        // Not-binded Glue Context List
        {
@@ -229,7 +215,7 @@ _dump_context_info(const char *ment, int force_output)
                }
        }
 
-       LOG("\E[0;40;34m========================================================================================================================\E[0m\n");
+       LOG("\E[40;34m========================================================================================================================\E[0m\n");
        LOG("\n");
 
        goto finish;
@@ -287,7 +273,7 @@ _pack_egl_context_option(EGL_packed_option *pack_data, EGLDisplay dpy, EGLConfig
                        default:
                                ERR("Invalid context attribute.\n");
                                goto finish;
-                       }
+               }
                attrib += 2;
        }
        ret = 1;
@@ -508,7 +494,7 @@ _egl_create_context(EGL_packed_option *real_ctx_option, GLContextState **cstate_
        // Pack context option
        AST(_pack_egl_context_option(real_ctx_option, dpy, config, 0, attrib_list) == 1);
 
-       if (atoi(get_env_setting("COREGL_DEBUG_NOFP")) == 1)
+       if (debug_nofp == 1)
        {
                static int debug_force_real = 100001;
                AST(_pack_egl_context_option(real_ctx_option, dpy, config, debug_force_real, attrib_list) == 1);
@@ -584,6 +570,81 @@ finish:
 //                   Fastpath EGL Functions                       //
 //    The functions have prefix 'fpgl_' for (fastpath gl)         //
 //----------------------------------------------------------------//
+
+extern EGLBoolean (*_COREGL_NAME_MANGLE(eglBindAPI))(EGLenum api);
+extern EGLenum (*_COREGL_NAME_MANGLE(eglQueryAPI))(void);
+
+EGLBoolean
+fpgl_eglBindAPI(EGLenum api)
+{
+       EGLBoolean ret = EGL_FALSE;
+       GLThreadState *tstate = NULL;
+
+       _COREGL_FAST_FUNC_BEGIN();
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+
+       ret = _sym_eglBindAPI(api);
+
+       tstate = get_current_thread_state();
+       if (tstate == NULL)
+       {
+               AST(init_new_thread_state() == 1);
+
+               tstate = get_current_thread_state();
+               AST(tstate != NULL);
+       }
+
+       {
+               EGLenum newapi = _sym_eglQueryAPI();
+               if (tstate->binded_api != newapi)
+               {
+                       if (newapi != EGL_OPENGL_ES_API)
+                       {
+                               // Fallback when binding other API
+                               // Fastpath restores when bind OPENGL_ES_API
+                               override_glue_normal_path();
+                               _COREGL_NAME_MANGLE(eglBindAPI) = fpgl_eglBindAPI;
+                               _COREGL_NAME_MANGLE(eglQueryAPI) = fpgl_eglQueryAPI;
+                       }
+                       else
+                       {
+                               override_glue_fast_path();
+                       }
+                       tstate->binded_api = newapi;
+               }
+       }
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+EGLenum
+fpgl_eglQueryAPI(void)
+{
+       EGLenum ret = 0;
+       GLThreadState *tstate = NULL;
+
+       _COREGL_FAST_FUNC_BEGIN();
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+
+       ret = _sym_eglQueryAPI();
+
+       tstate = get_current_thread_state();
+       if (tstate != NULL)
+       {
+               AST(tstate->binded_api == ret);
+       }
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
 EGLContext
 fpgl_eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list)
 {
@@ -732,7 +793,7 @@ fpgl_eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
 
                if (gctx->is_destroyed == 1)
                {
-                       ERR("\E[0;31;1mWARNING : Context [%p] is already destroyed!!!\E[0m\n", ctx);
+                       ERR("\E[40;31;1mWARNING : Context [%p] is already destroyed!!!\E[0m\n", ctx);
                }
                else
                {
@@ -781,7 +842,9 @@ fpgl_eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *v
                real_ctx = gctx->cstate->rctx;
        }
 
+       _COREGL_FAST_FUNC_SYMCALL_BEGIN();
        ret = _sym_eglQueryContext(dpy, real_ctx, attribute, value);
+       _COREGL_FAST_FUNC_SYMCALL_END();
        goto finish;
 
 finish:
@@ -790,15 +853,19 @@ finish:
 }
 
 
+
 EGLBoolean
-fpgl_eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
+fpgl_eglReleaseThread(void)
 {
        EGLBoolean ret = EGL_FALSE;
+       EGLDisplay dpy = EGL_NO_DISPLAY;
 
        _COREGL_FAST_FUNC_BEGIN();
 
-       // BB : NO OP
-       ret = _sym_eglDestroySurface(dpy, surface);
+       dpy = _sym_eglGetCurrentDisplay();
+       AST(dpy != EGL_NO_DISPLAY);
+       fpgl_eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+       ret = _sym_eglReleaseThread();
        goto finish;
 
 finish:
@@ -841,9 +908,9 @@ fpgl_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext
                        _bind_context_state(NULL, tstate->cstate, &ctx_list_access_mutex);
                        tstate->cstate = NULL;
                }
-               if (!_sym_eglMakeCurrent(dpy, draw, read, EGL_NO_CONTEXT))
+               if (_sym_eglMakeCurrent(dpy, draw, read, ctx) != EGL_TRUE)
                {
-                       ERR("WARNING : Error making EGL_NO_CONTEXT current. (invalid EGL display [%p] or EGL surface [D:%p/R:%p])\n", dpy, draw, read);
+                       ERR("WARNING : Error making context [%p] current. (invalid EGL display [%p] or EGL surface [D:%p/R:%p])\n", ctx, dpy, draw, read);
                        ret = EGL_FALSE;
                        goto finish;
                }
@@ -890,7 +957,7 @@ fpgl_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext
                _bind_context_state(gctx, cstate_new, &ctx_list_access_mutex);
 
                // TODO : Setup context state for new real ctx
-               ERR("\E[0;31;1mWARNING : Cross-thread usage(makecurrent) can cause a state-broken situation!\E[0m\n");
+               ERR("\E[40;31;1mWARNING : Cross-thread usage(makecurrent) can cause a state-broken situation!\E[0m\n");
 
                _unlink_context_state(gctx, &ctx_list_access_mutex);
                _link_context_state(gctx, cstate_new);
@@ -939,7 +1006,7 @@ fpgl_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext
        if (need_mc == EGL_TRUE)
        {
                // BB : full makecurrent
-               if (!_sym_eglMakeCurrent(dpy, draw, read, gctx->cstate->rctx))
+               if (_sym_eglMakeCurrent(dpy, draw, read, gctx->cstate->rctx) != EGL_TRUE)
                {
                        ERR("Error making context current with the drawable.\n");
                        ret = EGL_FALSE;
@@ -1052,7 +1119,7 @@ fpgl_eglGetCurrentSurface(EGLint readdraw)
                        case EGL_READ :
                                ret = (GLGlueContext *)tstate->rsurf_read;
                                break;
-                       }
+               }
        }
        goto finish;
 
@@ -1065,19 +1132,23 @@ EGLImageKHR
 fpgl_eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
 {
        void *ret = NULL;
-       GLThreadState *tstate = NULL;
        EGLContext real_ctx = EGL_NO_CONTEXT;
 
        _COREGL_FAST_FUNC_BEGIN();
 
-       tstate = get_current_thread_state();
-
        if (ctx != NULL && ctx != EGL_NO_CONTEXT)
        {
                GLGlueContext *gctx = (GLGlueContext *)ctx;
 
-               AST(gctx->cstate != NULL);
-               real_ctx = gctx->cstate->rctx;
+               if (gctx->magic != MAGIC_GLFAST)
+               {
+                       real_ctx = ctx;
+               }
+               else
+               {
+                       AST(gctx->cstate != NULL);
+                       real_ctx = gctx->cstate->rctx;
+               }
        }
        ret = _sym_eglCreateImageKHR(dpy, real_ctx, target, buffer, attrib_list);
 
@@ -1108,7 +1179,7 @@ fpgl_eglGetProcAddress(const char* procname)
        ret = _sym_eglGetProcAddress(procname);
        if (ret != NULL)
        {
-               LOG("\E[0;31;1mWARNING : COREGL can't support '%s' (unmanaged situation may occur)\E[0m\n", procname);
+               LOG("\E[40;31;1mWARNING : COREGL can't support '%s' (unmanaged situation may occur)\E[0m\n", procname);
        }
 
        goto finish;
index 743a2f3..eda3a4d 100644 (file)
    current_ctx = (GLGlueContext *)tstate->cstate->data; \
    AST(current_ctx != NULL);
 
+#define GET_REAL_OBJ(type, glue_handle, real_handle) \
+       _get_real_obj(current_ctx->sostate, type, glue_handle, real_handle)
+
+static inline int
+_get_real_obj(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_handle, GLuint *real_handle)
+{
+       if (glue_handle == 0)
+       {
+               *real_handle = 0;
+       }
+       else
+       {
+               AST(sostate != NULL);
+               *real_handle = sostate_get_object(sostate, type, glue_handle);
+               if (*real_handle == 0)
+                       return 0;
+       }
+       return 1;
+}
+
+static void
+_set_gl_error(GLenum error)
+{
+       GLenum glerror = GL_NONE;
+       DEFINE_FAST_GL_FUNC();
+       INIT_FAST_GL_FUNC();
+
+       glerror = _sym_glGetError();
+
+       if (current_ctx->gl_error == GL_NO_ERROR &&
+           glerror == GL_NO_ERROR &&
+           error != GL_NO_ERROR)
+       {
+               current_ctx->gl_error = error;
+       }
+}
+
+GLenum
+fpgl_glGetError(void)
+{
+       GLenum ret = GL_NONE;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (current_ctx->gl_error != GL_NO_ERROR)
+       {
+               ret = current_ctx->gl_error;
+       }
+       else
+       {
+               ret = _sym_glGetError();
+       }
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void
+fpgl_glActiveTexture(GLenum texture)
+{
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       CURR_STATE_COMPARE(gl_active_texture, texture)
+       {
+               _sym_glActiveTexture(texture);
+
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+               current_ctx->_tex_flag1 |= FLAG_BIT_1;
+               current_ctx->gl_active_texture[0] = texture;
+       }
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+
+void
+fpgl_glGenTextures(GLsizei n, GLuint* textures)
+{
+       int i;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (textures == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+
+       _sym_glGenTextures(n, objid_array);
+
+       for (i = 0; i < n; i++)
+       {
+               textures[i] = sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, objid_array[i]);
+       }
+
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+       _COREGL_FAST_FUNC_END();
+}
+
+
+void
+fpgl_glBindTexture(GLenum target, GLuint texture)
+{
+       int active_idx;
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       active_idx = current_ctx->gl_active_texture[0] - GL_TEXTURE0;
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1)
+       {
+               _set_gl_error(GL_OUT_OF_MEMORY);
+               goto finish;
+       }
+
+       if (target == GL_TEXTURE_2D)
+       {
+               if (current_ctx->gl_tex_2d_state[active_idx] != real_obj)
+               {
+                       _sym_glBindTexture(target, real_obj);
+
+                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+                       current_ctx->_tex_flag1 |= FLAG_BIT_3;
+
+                       current_ctx->gl_tex_2d_state[active_idx] = real_obj;
+               }
+       }
+       else if (target == GL_TEXTURE_CUBE_MAP)
+       {
+               if (current_ctx->gl_tex_cube_state[active_idx] != real_obj)
+               {
+                       _sym_glBindTexture(target, real_obj);
+
+                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+                       current_ctx->_tex_flag1 |= FLAG_BIT_4;
+
+                       current_ctx->gl_tex_cube_state[active_idx] = real_obj;
+               }
+       }
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+
+void
+fpgl_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1)
+       {
+               _set_gl_error(GL_OUT_OF_MEMORY);
+               goto finish;
+       }
+
+       _sym_glFramebufferTexture2D(target, attachment, textarget, real_obj, level);
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1)
+       {
+               _set_gl_error(GL_OUT_OF_MEMORY);
+               goto finish;
+       }
+
+       _sym_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, real_obj, level, samples);
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+GLboolean
+fpgl_glIsTexture(GLuint texture)
+{
+       GLboolean ret;
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1)
+       {
+               ret = GL_FALSE;
+               goto finish;
+       }
+
+       ret = _sym_glIsTexture(real_obj);
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+
+void
+fpgl_glDeleteTextures(GLsizei n, const GLuint* textures)
+{
+       int i, j;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (textures == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+       {
+               int real_n = 0;
+
+               for (i = 0; i < n; i++)
+               {
+                       int real_objid = _COREGL_INT_INIT_VALUE;
+                       if (textures[i] == 0) continue;
+
+                       real_objid = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, textures[i]);
+                       if (real_objid == 0) continue;
+
+                       sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, textures[i]);
+                       objid_array[real_n++] = real_objid;
+               }
+
+               _sym_glDeleteTextures(real_n, objid_array);
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+               for (i = 0; i < real_n; i++)
+               {
+                       for (j = 0; j < current_ctx->gl_num_tex_units[0]; j++)
+                       {
+                               if (current_ctx->gl_tex_2d_state[j] == objid_array[i])
+                                       current_ctx->gl_tex_2d_state[j] = 0;
+                               if (current_ctx->gl_tex_cube_state[j] == objid_array[i])
+                                       current_ctx->gl_tex_cube_state[j] = 0;
+                       }
+               }
+       }
+
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+       _COREGL_FAST_FUNC_END();
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void
+fpgl_glGenBuffers(GLsizei n, GLuint* buffers)
+{
+       int i;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (buffers == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+
+       _sym_glGenBuffers(n, objid_array);
+
+       for (i = 0; i < n; i++)
+       {
+               buffers[i] = sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_BUFFER, objid_array[i]);
+       }
+
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+       _COREGL_FAST_FUNC_END();
+}
+
+
+void
+fpgl_glBindBuffer(GLenum target, GLuint buffer)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_BUFFER, buffer, &real_obj) != 1)
+       {
+               _set_gl_error(GL_OUT_OF_MEMORY);
+               goto finish;
+       }
+
+       if (target == GL_ARRAY_BUFFER)
+       {
+               CURR_STATE_COMPARE(gl_array_buffer_binding, real_obj)
+               {
+                       _sym_glBindBuffer(target, real_obj);
+
+                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+                       if (real_obj == 0)
+                               current_ctx->_bind_flag &= (~FLAG_BIT_0);
+                       else
+                               current_ctx->_bind_flag |= FLAG_BIT_0;
+                       current_ctx->gl_array_buffer_binding[0] = real_obj;
+               }
+       }
+       else if (target == GL_ELEMENT_ARRAY_BUFFER)
+       {
+               CURR_STATE_COMPARE(gl_element_array_buffer_binding, real_obj)
+               {
+                       _sym_glBindBuffer(target, real_obj);
+                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+                       if (real_obj == 0)
+                               current_ctx->_bind_flag &= (~FLAG_BIT_1);
+                       else
+                               current_ctx->_bind_flag |= FLAG_BIT_1;
+                       current_ctx->gl_element_array_buffer_binding[0] = real_obj;
+               }
+       }
+       else
+       {
+               // For error recording
+               _sym_glBindBuffer(target, real_obj);
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       }
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+GLboolean
+fpgl_glIsBuffer(GLuint buffer)
+{
+       GLboolean ret;
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_BUFFER, buffer, &real_obj) != 1)
+       {
+               ret = GL_FALSE;
+               goto finish;
+       }
+
+       ret = _sym_glIsBuffer(real_obj);
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+
+void
+fpgl_glDeleteBuffers(GLsizei n, const GLuint* buffers)
+{
+       int i;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (buffers == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+       {
+               int real_n = 0;
+
+               for (i = 0; i < n; i++)
+               {
+                       int real_objid = _COREGL_INT_INIT_VALUE;
+                       if (buffers[i] == 0) continue;
+
+                       real_objid = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_BUFFER, buffers[i]);
+                       if (real_objid == 0) continue;
+
+                       sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_BUFFER, buffers[i]);
+                       objid_array[real_n++] = real_objid;
+               }
+
+               _sym_glDeleteBuffers(real_n, objid_array);
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+               for (i = 0; i < real_n; i++)
+               {
+                       if (current_ctx->gl_array_buffer_binding[0] == objid_array[i])
+                       {
+                               current_ctx->_bind_flag &= (~FLAG_BIT_0);
+                               current_ctx->gl_array_buffer_binding[0] = 0;
+                       }
+                       if (current_ctx->gl_element_array_buffer_binding[0] == objid_array[i])
+                       {
+                               current_ctx->_bind_flag &= (~FLAG_BIT_1);
+                               current_ctx->gl_element_array_buffer_binding[0] = 0;
+                       }
+               }
+       }
+
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+       _COREGL_FAST_FUNC_END();
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+
+void
+fpgl_glGenFramebuffers(GLsizei n, GLuint* framebuffers)
+{
+       int i;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (framebuffers == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+
+       _sym_glGenFramebuffers(n, objid_array);
+
+       for (i = 0; i < n; i++)
+       {
+               framebuffers[i] = sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_FRAMEBUFFER, objid_array[i]);
+       }
+
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+       _COREGL_FAST_FUNC_END();
+}
+
+
+void
+fpgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_FRAMEBUFFER, framebuffer, &real_obj) != 1)
+       {
+               _set_gl_error(GL_OUT_OF_MEMORY);
+               goto finish;
+       }
+
+       if (target == GL_FRAMEBUFFER)
+       {
+               CURR_STATE_COMPARE(gl_framebuffer_binding, real_obj)
+               {
+                       _sym_glBindFramebuffer(target, real_obj);
+                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+                       if (real_obj == 0)
+                               current_ctx->_bind_flag &= (~FLAG_BIT_2);
+                       else
+                               current_ctx->_bind_flag |= FLAG_BIT_2;
+                       current_ctx->gl_framebuffer_binding[0] = real_obj;
+               }
+       }
+       else
+       {
+               // For error recording
+               _sym_glBindFramebuffer(target, real_obj);
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+       }
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+GLboolean
+fpgl_glIsFramebuffer(GLuint framebuffer)
+{
+       GLboolean ret;
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_FRAMEBUFFER, framebuffer, &real_obj) != 1)
+       {
+               ret = GL_FALSE;
+               goto finish;
+       }
+
+       ret = _sym_glIsFramebuffer(real_obj);
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+
+void
+fpgl_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
+{
+       int i;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (framebuffers == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+       {
+               int real_n = 0;
+
+               for (i = 0; i < n; i++)
+               {
+                       int real_objid = _COREGL_INT_INIT_VALUE;
+                       if (framebuffers[i] == 0) continue;
+
+                       real_objid = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_FRAMEBUFFER, framebuffers[i]);
+                       if (real_objid == 0) continue;
+
+                       sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_FRAMEBUFFER, framebuffers[i]);
+                       objid_array[real_n++] = real_objid;
+               }
+
+               _sym_glDeleteFramebuffers(real_n, objid_array);
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+               for (i = 0; i < real_n; i++)
+               {
+                       if (current_ctx->gl_framebuffer_binding[0] == framebuffers[i])
+                       {
+                               current_ctx->_bind_flag &= (~FLAG_BIT_2);
+                               current_ctx->gl_framebuffer_binding[0] = 0;
+                       }
+               }
+       }
+
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+       _COREGL_FAST_FUNC_END();
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+
+void
+fpgl_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
+{
+       int i;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (renderbuffers == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+
+       _sym_glGenRenderbuffers(n, objid_array);
+
+       for (i = 0; i < n; i++)
+       {
+               renderbuffers[i] = sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_RENDERBUFFER, objid_array[i]);
+       }
+
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+       _COREGL_FAST_FUNC_END();
+}
+
+
+void
+fpgl_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1)
+       {
+               _set_gl_error(GL_OUT_OF_MEMORY);
+               goto finish;
+       }
+
+       if (target == GL_RENDERBUFFER)
+       {
+               CURR_STATE_COMPARE(gl_renderbuffer_binding, real_obj)
+               {
+                       _sym_glBindRenderbuffer(target, real_obj);
+                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+                       if (real_obj == 0)
+                               current_ctx->_bind_flag &= (~FLAG_BIT_3);
+                       else
+                               current_ctx->_bind_flag |= FLAG_BIT_3;
+                       current_ctx->gl_renderbuffer_binding[0] = real_obj;
+               }
+       }
+       else
+       {
+               // For error recording
+               _sym_glBindRenderbuffer(target, real_obj);
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       }
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1)
+       {
+               _set_gl_error(GL_OUT_OF_MEMORY);
+               goto finish;
+       }
+
+       _sym_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, real_obj);
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+GLboolean
+fpgl_glIsRenderbuffer(GLuint renderbuffer)
+{
+       GLboolean ret;
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1)
+       {
+               ret = GL_FALSE;
+               goto finish;
+       }
+
+       ret = _sym_glIsRenderbuffer(real_obj);
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+
+void
+fpgl_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+{
+       int i;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (renderbuffers == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+       {
+               int real_n = 0;
+
+               for (i = 0; i < n; i++)
+               {
+                       int real_objid = _COREGL_INT_INIT_VALUE;
+                       if (renderbuffers[i] == 0) continue;
+
+                       real_objid = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_RENDERBUFFER, renderbuffers[i]);
+                       if (real_objid == 0) continue;
+
+                       sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_RENDERBUFFER, renderbuffers[i]);
+                       objid_array[real_n++] = real_objid;
+               }
+
+               _sym_glDeleteRenderbuffers(real_n, objid_array);
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+               for (i = 0; i < real_n; i++)
+               {
+                       if (current_ctx->gl_renderbuffer_binding[0] == renderbuffers[i])
+                       {
+                               current_ctx->_bind_flag &= (~FLAG_BIT_3);
+                               current_ctx->gl_renderbuffer_binding[0] = 0;
+                       }
+               }
+       }
+
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+       _COREGL_FAST_FUNC_END();
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+
+GLuint
+fpgl_glCreateProgram(void)
+{
+       GLuint ret = _COREGL_INT_INIT_VALUE;
+       GLuint real_obj = _COREGL_INT_INIT_VALUE;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       AST(current_ctx->sostate != NULL);
+
+       real_obj = _sym_glCreateProgram();
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+       ret = sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, real_obj);
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+GLuint
+fpgl_glCreateShader(GLenum type)
+{
+       GLuint ret = _COREGL_INT_INIT_VALUE;
+       GLuint real_obj = _COREGL_INT_INIT_VALUE;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       AST(current_ctx->sostate != NULL);
+
+       real_obj = _sym_glCreateShader(type);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+       ret = sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, real_obj);
+
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+void
+fpgl_glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       _sym_glShaderSource(real_obj, count, string, length);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
+{
+       int i;
+       GLuint *objid_array = NULL;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (shaders == NULL) goto finish;
+
+       AST(current_ctx->sostate != NULL);
+
+       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+
+       for (i = 0; i < n; i++)
+       {
+               if (shaders[i] == 0) continue;
+               objid_array[i] = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, shaders[i]);
+       }
+
+#ifndef _COREGL_DESKTOP_GL
+       _sym_glShaderBinary(n, objid_array, binaryformat, binary, length);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#else
+// FIXME: need to dlsym/getprocaddress for this
+       /*
+          n = binaryformat = length = 0;
+          shaders = binary = 0;
+       */
+#endif
+       goto finish;
+
+finish:
+       if (objid_array != NULL)
+       {
+               free(objid_array);
+               objid_array = NULL;
+       }
+
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glCompileShader(GLuint shader)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       _sym_glCompileShader(real_obj);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glBindAttribLocation(GLuint program, GLuint index, const char* name)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       _sym_glBindAttribLocation(real_obj, index, name);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glAttachShader(GLuint program, GLuint shader)
+{
+       GLuint real_obj_program;
+       GLuint real_obj_shader;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj_program) != 1 ||
+           GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj_shader) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       _sym_glAttachShader(real_obj_program, real_obj_shader);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glDetachShader(GLuint program, GLuint shader)
+{
+       GLuint real_obj_program;
+       GLuint real_obj_shader;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj_program) != 1 ||
+           GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj_shader) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       _sym_glDetachShader(real_obj_program, real_obj_shader);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+GLboolean
+fpgl_glIsShader(GLuint shader)
+{
+       GLboolean ret;
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj) != 1)
+       {
+               ret = GL_FALSE;
+               goto finish;
+       }
+
+       ret = _sym_glIsShader(real_obj);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+GLboolean
+fpgl_glIsProgram(GLuint program)
+{
+       GLboolean ret;
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               ret = GL_FALSE;
+               goto finish;
+       }
+
+       ret = _sym_glIsProgram(real_obj);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+       return ret;
+}
+
+void
+fpgl_glLinkProgram(GLuint program)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       _sym_glLinkProgram(real_obj);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glValidateProgram(GLuint program)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       _sym_glValidateProgram(real_obj);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glUseProgram(GLuint program)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       CURR_STATE_COMPARE(gl_current_program, real_obj)
+       {
+               _sym_glUseProgram(real_obj);
+
+               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+               current_ctx->_clear_flag1 |= FLAG_BIT_1;
+               current_ctx->gl_current_program[0] = real_obj;
+       }
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       _sym_glGetActiveAttrib(real_obj, index, bufsize, length, size, type, name);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
+
+void
+fpgl_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+{
+       GLuint real_obj;
+
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       _sym_glGetActiveUniform(real_obj, index, bufsize, length, size, type, name);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_FAST_FUNC_END();
+}
 
 void
-fpgl_glActiveTexture(GLenum texture)
+fpgl_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
 {
+       int i;
+       GLsizei real_count = _COREGL_INT_INIT_VALUE;
+       GLuint real_obj;
+
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       CURR_STATE_COMPARE(gl_active_texture, texture)
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               _sym_glActiveTexture(texture);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
 
+       _sym_glGetAttachedShaders(real_obj, maxcount, &real_count, shaders);
 
-               current_ctx->_tex_flag1 |= FLAG_BIT_1;
-               current_ctx->gl_active_texture[0] = texture;
+       for (i = 0; i < real_count; i++)
+       {
+               if (shaders[i] != 0)
+                       shaders[i] = sostate_find_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, shaders[i]);
        }
+       if (count != NULL) *count = real_count;
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
 }
 
-
-void
-fpgl_glBindBuffer(GLenum target, GLuint buffer)
+int
+fpgl_glGetAttribLocation(GLuint program, const char* name)
 {
+       int ret = _COREGL_INT_INIT_VALUE;
+       GLuint real_obj;
+
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-
-       if (target == GL_ARRAY_BUFFER)
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               CURR_STATE_COMPARE(gl_array_buffer_binding, buffer)
-               {
-                       _sym_glBindBuffer(target, buffer);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       if (buffer == 0)
-                               current_ctx->_bind_flag &= (~FLAG_BIT_0);
-                       else
-                               current_ctx->_bind_flag |= FLAG_BIT_0;
-                       current_ctx->gl_array_buffer_binding[0] = buffer;
-               }
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
-       else if (target == GL_ELEMENT_ARRAY_BUFFER)
-       {
-               CURR_STATE_COMPARE(gl_element_array_buffer_binding, buffer)
-               {
-                       _sym_glBindBuffer(target, buffer);
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
 
-                       if (buffer == 0)
-                               current_ctx->_bind_flag &= (~FLAG_BIT_1);
-                       else
-                               current_ctx->_bind_flag |= FLAG_BIT_1;
-                       current_ctx->gl_element_array_buffer_binding[0] = buffer;
-               }
-       }
-       else
-       {
-               // For error recording
-               _sym_glBindBuffer(target, buffer);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-       }
+       ret = _sym_glGetAttribLocation(real_obj, name);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
+       return ret;
 }
 
-
 void
-fpgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
+fpgl_glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
 {
+       GLuint real_obj;
+
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       if (target == GL_FRAMEBUFFER)
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj) != 1)
        {
-               CURR_STATE_COMPARE(gl_framebuffer_binding, framebuffer)
-               {
-                       _sym_glBindFramebuffer(target, framebuffer);
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       if (framebuffer == 0)
-                               current_ctx->_bind_flag &= (~FLAG_BIT_2);
-                       else
-                               current_ctx->_bind_flag |= FLAG_BIT_2;
-                       current_ctx->gl_framebuffer_binding[0] = framebuffer;
-               }
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
-       else
-       {
-               // For error recording
-               _sym_glBindFramebuffer(target, framebuffer);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
 
-       }
+       _sym_glGetShaderiv(real_obj, pname, params);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
 }
 
-
 void
-fpgl_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+fpgl_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
 {
+       GLuint real_obj;
+
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       if (target == GL_RENDERBUFFER)
-       {
-               CURR_STATE_COMPARE(gl_renderbuffer_binding, renderbuffer)
-               {
-                       _sym_glBindRenderbuffer(target, renderbuffer);
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       if (renderbuffer == 0)
-                               current_ctx->_bind_flag &= (~FLAG_BIT_3);
-                       else
-                               current_ctx->_bind_flag |= FLAG_BIT_3;
-                       current_ctx->gl_renderbuffer_binding[0] = renderbuffer;
-               }
-       }
-       else
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj) != 1)
        {
-               // For error recording
-               _sym_glBindRenderbuffer(target, renderbuffer);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
+
+       _sym_glGetShaderInfoLog(real_obj, bufsize, length, infolog);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
@@ -167,125 +1342,90 @@ finish:
 }
 
 void
-fpgl_glGenTextures(GLsizei n, GLuint* textures)
+fpgl_glGetProgramiv(GLuint program, GLenum pname, GLint* params)
 {
-       int i;
-       GLuint *texid_array = NULL;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       if (textures == NULL) goto finish;
-
-       AST(current_ctx->sostate != NULL);
-
-       texid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-
-       _sym_glGenTextures(n, texid_array);
-
-       for (i = 0; i < n; i++)
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               textures[i] = sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, texid_array[i]);
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
 
-       free(texid_array);
-
+       _sym_glGetProgramiv(real_obj, pname, params);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
 }
 
-
 void
-fpgl_glBindTexture(GLenum target, GLuint texture)
+fpgl_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
 {
-       int active_idx;
-       GLuint real_texobj;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       active_idx = current_ctx->gl_active_texture[0] - GL_TEXTURE0;
-
-       if (texture == 0)
-       {
-               real_texobj = 0;
-       }
-       else
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               AST(current_ctx->sostate != NULL);
-               real_texobj = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, texture);
-               if (real_texobj == 0)
-               {
-                       // GLERROR : OUT_OF_MEMORY
-                       LOG("\E[0;31;1mWARNING : Try binding invalid texture object\E[0m\n");
-                       goto finish;
-               }
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
 
-       if (target == GL_TEXTURE_2D)
-       {
-               if (current_ctx->gl_tex_2d_state[active_idx] != real_texobj)
-               {
-                       _sym_glBindTexture(target, real_texobj);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_tex_flag1 |= FLAG_BIT_3;
+       _sym_glGetProgramInfoLog(real_obj, bufsize, length, infolog);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
 
-                       current_ctx->gl_tex_2d_state[active_idx] = real_texobj;
-               }
-       }
-       else if (target == GL_TEXTURE_CUBE_MAP)
-       {
-               if (current_ctx->gl_tex_cube_state[active_idx] != real_texobj)
-               {
-                       _sym_glBindTexture(target, real_texobj);
+finish:
+       _COREGL_FAST_FUNC_END();
+}
 
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+void
+fpgl_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
+{
+       GLuint real_obj;
 
-                       current_ctx->_tex_flag1 |= FLAG_BIT_4;
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
 
-                       current_ctx->gl_tex_cube_state[active_idx] = real_texobj;
-               }
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
+
+       _sym_glGetShaderSource(real_obj, bufsize, length, source);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
 }
 
-
 void
-fpgl_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+fpgl_glGetUniformfv(GLuint program, GLint location, GLfloat* params)
 {
-       GLuint real_texobj;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       if (texture == 0)
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               real_texobj = 0;
-       }
-       else
-       {
-               AST(current_ctx->sostate != NULL);
-               real_texobj = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, texture);
-               if (real_texobj == 0)
-               {
-                       // GLERROR : OUT_OF_MEMORY
-                       LOG("\E[0;31;1mWARNING : Try using invalid texture object\E[0m\n");
-                       goto finish;
-               }
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
 
-       _sym_glFramebufferTexture2D(target, attachment, textarget, real_texobj, level);
-
+       _sym_glGetUniformfv(real_obj, location, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -294,32 +1434,21 @@ finish:
 }
 
 void
-fpgl_glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples)
+fpgl_glGetUniformiv(GLuint program, GLint location, GLint* params)
 {
-       GLuint real_texobj;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       if (texture == 0)
-       {
-               real_texobj = 0;
-       }
-       else
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               AST(current_ctx->sostate != NULL);
-               real_texobj = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, texture);
-               if (real_texobj == 0)
-               {
-                       // GLERROR : OUT_OF_MEMORY
-                       LOG("\E[0;31;1mWARNING : Try using invalid texture object\E[0m\n");
-                       goto finish;
-               }
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
 
-       _sym_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, real_texobj, level, samples);
-
+       _sym_glGetUniformiv(real_obj, location, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -327,166 +1456,152 @@ finish:
        _COREGL_FAST_FUNC_END();
 }
 
-GLboolean
-fpgl_glIsTexture(GLuint texture)
+void
+fpgl_glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei* length, GLenum* binaryFormat, void* binary)
 {
-       GLboolean ret;
-       GLuint real_texobj;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       if (texture == 0)
-       {
-               real_texobj = 0;
-       }
-       else
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               AST(current_ctx->sostate != NULL);
-               real_texobj = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, texture);
-               if (real_texobj == 0)
-               {
-                       ret = GL_FALSE;
-                       goto finish;
-               }
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
        }
 
-       ret = _sym_glIsTexture(real_texobj);
-
+       _sym_glGetProgramBinary(real_obj, bufsize, length, binaryFormat, binary);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
-       return ret;
 }
 
-
 void
-fpgl_glDeleteTextures(GLsizei n, const GLuint* textures)
+fpgl_glProgramBinary(GLuint program, GLenum binaryFormat, const void* binary, GLint length)
 {
-       int i, j;
-       GLuint *texid_array = NULL;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       if (textures == NULL) goto finish;
-
-       AST(current_ctx->sostate != NULL);
-
-       texid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               int real_n = 0;
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
 
-               for (i = 0; i < n; i++)
-               {
-                       int real_texid = _COREGL_INT_INIT_VALUE;
-                       if (textures[i] == 0) continue;
+       _sym_glProgramBinary(real_obj, binaryFormat, binary, length);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
 
-                       real_texid = sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, textures[i]);
-                       if (real_texid == 0) continue;
+finish:
+       _COREGL_FAST_FUNC_END();
+}
 
-                       sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, textures[i]);
-                       texid_array[real_n++] = real_texid;
-               }
 
-               _sym_glDeleteTextures(real_n, texid_array);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+void
+fpgl_glProgramParameteri(GLuint program, GLuint pname, GLint value)
+{
+       GLuint real_obj;
 
-               for (i = 0; i < real_n; i++)
-               {
-                       for (j = 0; j < current_ctx->gl_num_tex_units[0]; j++)
-                       {
-                               if (current_ctx->gl_tex_2d_state[j] == texid_array[i])
-                                       current_ctx->gl_tex_2d_state[j] = 0;
-                               if (current_ctx->gl_tex_cube_state[j] == texid_array[i])
-                                       current_ctx->gl_tex_cube_state[j] = 0;
-                       }
-               }
-       }
+       DEFINE_FAST_GL_FUNC();
+       _COREGL_FAST_FUNC_BEGIN();
+       INIT_FAST_GL_FUNC();
 
-       free(texid_array);
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
 
+       _sym_glProgramParameteri(real_obj, pname, value);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
 }
 
-void
-fpgl_glDeleteBuffers(GLsizei n, const GLuint* buffers)
+int
+fpgl_glGetUniformLocation(GLuint program, const char* name)
 {
-       int i;
+       int ret = _COREGL_INT_INIT_VALUE;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       _sym_glDeleteBuffers(n, buffers);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       for (i = 0; i < n; i++)
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
        {
-               if (current_ctx->gl_array_buffer_binding[0] == buffers[i])
-                       current_ctx->gl_array_buffer_binding[0] = 0;
-               if (current_ctx->gl_element_array_buffer_binding[0] == buffers[i])
-                       current_ctx->gl_element_array_buffer_binding[0] = 0;
+               _set_gl_error(GL_INVALID_VALUE);
+               ret = -1;
+               goto finish;
        }
+
+       ret = _sym_glGetUniformLocation(real_obj, name);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
+       return ret;
 }
 
-
 void
-fpgl_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
+fpgl_glDeleteShader(GLuint shader)
 {
-       int i;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       _sym_glDeleteFramebuffers(n, framebuffers);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, shader, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
 
-       for (i = 0; i < n; i++)
+       _sym_glDeleteShader(real_obj);
+       if (real_obj != 0)
        {
-               if (current_ctx->gl_framebuffer_binding[0] == framebuffers[i])
-                       current_ctx->gl_framebuffer_binding[0] = 0;
+               AST(sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, shader) == 1);
        }
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
        _COREGL_FAST_FUNC_END();
 }
 
-
 void
-fpgl_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+fpgl_glDeleteProgram(GLuint program)
 {
-       int i;
+       GLuint real_obj;
 
        DEFINE_FAST_GL_FUNC();
        _COREGL_FAST_FUNC_BEGIN();
        INIT_FAST_GL_FUNC();
 
-       _sym_glDeleteRenderbuffers(n, renderbuffers);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
 
-       for (i = 0; i < n; i++)
+       _sym_glDeleteProgram(real_obj);
+       if (real_obj != 0)
        {
-               if (current_ctx->gl_renderbuffer_binding[0] == renderbuffers[i])
-                       current_ctx->gl_renderbuffer_binding[0] = 0;
+               AST(sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, program) == 1);
        }
+
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
@@ -494,6 +1609,9 @@ finish:
 }
 
 
+
+//////////////////////////////////////////////////////////////////////////////////
+
 void
 fpgl_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
 {
@@ -911,7 +2029,7 @@ fpgl_glDisable(GLenum cap)
                                current_ctx->gl_stencil_test[0] = GL_FALSE;
                        }
                        break;
-               }
+       }
        goto finish;
 
 finish:
@@ -1075,7 +2193,7 @@ fpgl_glEnable(GLenum cap)
                                current_ctx->gl_stencil_test[0] = GL_TRUE;
                        }
                        break;
-               }
+       }
        goto finish;
 
 finish:
@@ -1603,30 +2721,6 @@ finish:
        _COREGL_FAST_FUNC_END();
 }
 
-
-void
-fpgl_glUseProgram(GLuint program)
-{
-       DEFINE_FAST_GL_FUNC();
-       _COREGL_FAST_FUNC_BEGIN();
-       INIT_FAST_GL_FUNC();
-
-       CURR_STATE_COMPARE(gl_current_program, program)
-       {
-               _sym_glUseProgram(program);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag1 |= FLAG_BIT_1;
-               current_ctx->gl_current_program[0] = program;
-       }
-       goto finish;
-
-finish:
-       _COREGL_FAST_FUNC_END();
-}
-
-
 // Optmize?
 void
 fpgl_glVertexAttrib1f(GLuint indx, GLfloat x)
@@ -1894,7 +2988,7 @@ fpgl_glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
                case GL_TEXTURE_CUBE_MAP:
                        current_ctx->gl_tex_cube_state[tex_idx] = -1;
                        break;
-               }
+       }
 
        _sym_glEGLImageTargetTexture2DOES(target, image);
 
@@ -1936,9 +3030,15 @@ _process_getfunc(GLenum pname, GLvoid *ptr, GLenum get_type)
 
                        switch (get_type)
                        {
-                               case GL_INT: ((GLint *)ptr)[0] = glue_tex_id; break;
-                               case GL_FLOAT: ((GLfloat *)ptr)[0] = (GLfloat)glue_tex_id; break;
-                               case GL_BOOL: ((GLboolean *)ptr)[0] = (glue_tex_id == 0) ? GL_FALSE : GL_TRUE; break;
+                               case GL_INT:
+                                       ((GLint *)ptr)[0] = glue_tex_id;
+                                       break;
+                               case GL_FLOAT:
+                                       ((GLfloat *)ptr)[0] = (GLfloat)glue_tex_id;
+                                       break;
+                               case GL_BOOL:
+                                       ((GLboolean *)ptr)[0] = (glue_tex_id == 0) ? GL_FALSE : GL_TRUE;
+                                       break;
                        }
                        ret = GL_TRUE;
                        break;
@@ -1966,7 +3066,7 @@ fpgl_glGetBooleanv(GLenum pname, GLboolean* params)
        goto finish;
 
 finish:
-       _COREGL_WRAP_FUNC_END();
+       _COREGL_FAST_FUNC_END();
 }
 
 void
@@ -1984,7 +3084,7 @@ fpgl_glGetFloatv(GLenum pname, GLfloat* params)
        goto finish;
 
 finish:
-       _COREGL_WRAP_FUNC_END();
+       _COREGL_FAST_FUNC_END();
 }
 
 void
@@ -2002,6 +3102,6 @@ fpgl_glGetIntegerv(GLenum pname, GLint* params)
        goto finish;
 
 finish:
-       _COREGL_WRAP_FUNC_END();
+       _COREGL_FAST_FUNC_END();
 }
 
index d9fa663..6d611de 100644 (file)
@@ -5,6 +5,11 @@
 
 #include "coregl.h"
 
+// Symbol definition for real
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_sym_##FUNC_NAME) PARAM_LIST;
+# include "headers/sym.h"
+#undef _COREGL_SYMBOL
+
 #define COREGL_DEBUG
 
 # define ERR(...) \
@@ -43,43 +48,28 @@ typedef GLuint       GLuintmask;
 
 #define _COREGL_TRACE_OUTPUT_INTERVAL_SEC 5
 
-// Symbol definition for static
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_sym_##FUNC_NAME) PARAM_LIST;
-# include "headers/sym.h"
-#undef _COREGL_SYMBOL
-
-// Symbol definition for wrappath
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (evgl_##FUNC_NAME) PARAM_LIST;
-# include "headers/sym.h"
-#undef _COREGL_SYMBOL
-
-// Symbol definition for fastpath
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (fpgl_##FUNC_NAME) PARAM_LIST;
-# include "headers/sym.h"
-#undef _COREGL_SYMBOL
-
 #define _COREGL_INT_INIT_VALUE -3
 
-
 #ifdef COREGL_ERRORS
 # define GLERR(fn, fl, ln, op)
 #else
 # define GLERR(fn, fl, ln, op)
 #endif
 
+#define _COREGL_NAME_MANGLE(name) ovr_##name
 
 typedef struct _Trace_Data Trace_Data;
 
 #ifdef COREGL_TRACE_APICALL_INFO
-# define _COREGL_TRACE_API_BEGIN(api) \
-   trace_begin(api);
-# define _COREGL_TRACE_API_END(api) \
-   trace_end(api);
+# define _COREGL_TRACE_API_BEGIN(api, hint, trace_total_time) \
+   trace_begin(api, hint, trace_total_time);
+# define _COREGL_TRACE_API_END(api, hint, trace_total_time) \
+   trace_end(api, hint, trace_total_time);
 # define _COREGL_TRACE_API_OUTPUT(force_output) \
    trace_output(force_output);
 #else
-# define _COREGL_TRACE_API_BEGIN(api)
-# define _COREGL_TRACE_API_END(api)
+# define _COREGL_TRACE_API_BEGIN(api, trace_total_time)
+# define _COREGL_TRACE_API_END(api, trace_total_time)
 # define _COREGL_TRACE_API_OUTPUT(force_output)
 #endif
 
@@ -88,19 +78,25 @@ typedef struct _Trace_Data Trace_Data;
 
 #define _COREGL_FAST_FUNC_END()
 
+#define _COREGL_FAST_FUNC_SYMCALL_BEGIN()
+
+#define _COREGL_FAST_FUNC_SYMCALL_END()
+
 #define _COREGL_WRAP_FUNC_BEGIN() \
-   _COREGL_TRACE_API_BEGIN(__func__);
+       static void *trace_hint = NULL; \
+   trace_hint = _COREGL_TRACE_API_BEGIN(__func__, trace_hint, 1);
 
 #define _COREGL_WRAP_FUNC_END() \
-   _COREGL_TRACE_API_END(__func__);
+   _COREGL_TRACE_API_END(__func__, trace_hint, 1);
 
 typedef enum _CoreGL_Opt_Flag
 {
+    COREGL_UNKNOWN_PATH,
     COREGL_NORMAL_PATH,
-    GL_WRAPPED_PATH,
     COREGL_FAST_PATH
 } CoreGL_Opt_Flag;
 
+extern CoreGL_Opt_Flag api_opt;
 
 #ifndef _COREGL_DESKTOP_GL
 typedef EGLSurface     GLSurface;
@@ -123,6 +119,7 @@ typedef struct _GLContextState
 typedef struct _GLThreadState
 {
        int                      thread_id;
+       EGLenum                  binded_api;
        GLContextState          *cstate;
        GLSurface               *rsurf_draw;
        GLSurface               *rsurf_read;
@@ -155,10 +152,13 @@ typedef struct _General_Trace_List
 extern General_Trace_List  *thread_trace_list;
 extern Mutex                general_trace_lists_access_mutex;
 
-extern int                  trace_api_flag;
+extern int                 trace_api_flag;
+extern int                 trace_ctx_flag;
+extern int                 trace_state_flag;
+extern int                 debug_nofp;
 
 // Environment functions
-extern const char *get_env_setting(const char *name);
+extern const char         *get_env_setting(const char *name);
 
 // Main utility functions
 extern int                 init_new_thread_state();
@@ -189,8 +189,8 @@ extern void                override_gl_apis(CoreGL_Opt_Flag opt);
 // Debug & Trace functions
 extern int                 add_to_general_trace_list(General_Trace_List **gtl, void *value);
 extern int                 remove_from_general_trace_list(General_Trace_List **gtl, void *value);
-extern void                trace_begin(const char *name);
-extern void                trace_end(const char *name);
+extern void               *trace_begin(const char *name, void *hint, int trace_total_time);
+extern void               *trace_end(const char *name, void *hint, int trace_total_time);
 extern void                trace_output(int force_output);
 
 #endif // COREGL_INTERNAL_H
index 1d7c3dd..ed2304e 100644 (file)
@@ -1,14 +1,16 @@
 #include "coregl_internal.h"
+#include "coregl_wrappath.h"
+#include "coregl_fastpath.h"
 
 #include <stdlib.h>
 
-#define COREGL_API_OVERRIDE(func, prefix) \
+#define COREGL_OVERRIDE_API(func, prefix) \
    _COREGL_NAME_MANGLE(func) = prefix##func
 
 void
 override_glue_normal_path()
 {
-#define N_ORD(f) COREGL_API_OVERRIDE(f, _sym_) // GL Normal Path
+#define N_ORD(f) COREGL_OVERRIDE_API(f, _sym_) // GL Normal Path
 
 #define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     N_ORD(FUNC_NAME);
 # ifndef _COREGL_DESKTOP_GL
@@ -27,39 +29,34 @@ override_glue_fast_path()
        // Inherit from normal path
        override_glue_normal_path();
 
-#define F_ORD(f) COREGL_API_OVERRIDE(f, fpgl_) // GL Fast Path
+#define F_ORD(f) COREGL_OVERRIDE_API(f, fpgl_) // GL Fast Path
 
 
 #ifndef _COREGL_DESKTOP_GL
        // Fast-Path Core Functions
        F_ORD(eglGetProcAddress);
 
+       F_ORD(eglBindAPI);
+       F_ORD(eglQueryAPI);
+
        F_ORD(eglCreateContext);
        F_ORD(eglCreateImageKHR);
        F_ORD(eglMakeCurrent);
        F_ORD(eglDestroyContext);
        F_ORD(eglQueryContext);
        F_ORD(eglGetCurrentContext);
-
-       if (atoi(get_env_setting("COREGL_DEBUG_NOFP")) != 1)
-       {
-               F_ORD(eglGetCurrentSurface);
-               F_ORD(eglDestroySurface);
-       }
-       else
-       {
-               LOG("\E[0;35;1m[CoreGL] SKIP GLUE FASTPATH...\E[0m\n");
-       }
+       F_ORD(eglReleaseThread);
+       F_ORD(eglGetCurrentSurface);
 
 #else
-               // Fastpath-ed Functions
-               F_ORD(glXCreateContext);
-               F_ORD(glXDestroyContext);
-               F_ORD(glXMakeCurrent);
-               F_ORD(glXGetCurrentContext);
-               F_ORD(glXGetCurrentDrawable);
-
-               F_ORD(glXMakeContextCurrent);
+       // Fastpath-ed Functions
+       F_ORD(glXCreateContext);
+       F_ORD(glXDestroyContext);
+       F_ORD(glXMakeCurrent);
+       F_ORD(glXGetCurrentContext);
+       F_ORD(glXGetCurrentDrawable);
+
+       F_ORD(glXMakeContextCurrent);
 #endif
 
 #undef F_ORD
@@ -68,7 +65,7 @@ override_glue_fast_path()
 void
 override_gl_normal_path()
 {
-#define N_ORD(f) COREGL_API_OVERRIDE(f, _sym_) // GL Normal Path
+#define N_ORD(f) COREGL_OVERRIDE_API(f, _sym_) // GL Normal Path
 
 #define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     N_ORD(FUNC_NAME);
 # include "headers/sym_gl.h"
@@ -83,25 +80,67 @@ override_gl_fast_path()
        // Inherit from normal path
        override_gl_normal_path();
 
-#define F_ORD(f) COREGL_API_OVERRIDE(f, fpgl_) // GL Wrapped Path
+#define F_ORD(f) COREGL_OVERRIDE_API(f, fpgl_) // GL Wrapped Path
 
        // Fast-Path Functions
-       if (atoi(get_env_setting("COREGL_DEBUG_NOFP")) != 1)
+       if (debug_nofp != 1)
        {
-               F_ORD(glActiveTexture);
-               F_ORD(glBindBuffer);
-               F_ORD(glDeleteBuffers);
+               F_ORD(glGetError);
 
+               F_ORD(glActiveTexture);
                F_ORD(glGenTextures);
                F_ORD(glBindTexture);
                F_ORD(glIsTexture);
                F_ORD(glFramebufferTexture2D);
                F_ORD(glDeleteTextures);
 
+               F_ORD(glGenBuffers);
+               F_ORD(glBindBuffer);
+               F_ORD(glIsBuffer);
+               F_ORD(glDeleteBuffers);
+
+               F_ORD(glGenFramebuffers);
                F_ORD(glBindFramebuffer);
+               F_ORD(glIsFramebuffer);
                F_ORD(glDeleteFramebuffers);
+
+               F_ORD(glGenRenderbuffers);
                F_ORD(glBindRenderbuffer);
+               F_ORD(glFramebufferRenderbuffer);
+               F_ORD(glIsRenderbuffer);
                F_ORD(glDeleteRenderbuffers);
+
+               F_ORD(glCreateShader);
+               F_ORD(glCreateProgram);
+               F_ORD(glAttachShader);
+               F_ORD(glCompileShader);
+               F_ORD(glShaderBinary);
+               F_ORD(glDeleteShader);
+               F_ORD(glDetachShader);
+               F_ORD(glGetShaderiv);
+               F_ORD(glGetShaderInfoLog);
+               F_ORD(glGetShaderSource);
+               F_ORD(glIsShader);
+               F_ORD(glShaderSource);
+               F_ORD(glBindAttribLocation);
+               F_ORD(glDeleteProgram);
+               F_ORD(glDetachShader);
+               F_ORD(glGetActiveAttrib);
+               F_ORD(glGetActiveUniform);
+               F_ORD(glGetAttachedShaders);
+               F_ORD(glGetAttribLocation);
+               F_ORD(glGetProgramiv);
+               F_ORD(glGetProgramInfoLog);
+               F_ORD(glGetUniformfv);
+               F_ORD(glGetUniformiv);
+               F_ORD(glGetUniformLocation);
+               F_ORD(glIsProgram);
+               F_ORD(glLinkProgram);
+               F_ORD(glUseProgram);
+               F_ORD(glValidateProgram);
+               F_ORD(glGetProgramBinary);
+               F_ORD(glProgramBinary);
+
                F_ORD(glBlendColor);
                F_ORD(glBlendEquation);
                F_ORD(glBlendEquationSeparate);
@@ -137,7 +176,6 @@ override_gl_fast_path()
                F_ORD(glStencilMaskSeparate);
                F_ORD(glStencilOp);
                F_ORD(glStencilOpSeparate);
-               F_ORD(glUseProgram);
                F_ORD(glVertexAttrib1f);
                F_ORD(glVertexAttrib1fv);
                F_ORD(glVertexAttrib2f);
@@ -179,7 +217,7 @@ override_glue_apis(CoreGL_Opt_Flag opt)
                        break;
                default:
                        ERR("Invalide GL Override Option!!!\n");
-               }
+       }
 }
 
 void
@@ -195,6 +233,6 @@ override_gl_apis(CoreGL_Opt_Flag opt)
                        break;
                default:
                        ERR("Invalide GL Override Option!!!\n");
-               }
+       }
 }
 
index 8433072..1622652 100644 (file)
@@ -4,16 +4,20 @@
 #include <string.h>
 #include <sys/time.h>
 
-#define MAX_TRACE_NAME_LENGTH 256
-#define MAX_TRACE_TABLE_SIZE 65536
+#define MAX_TRACE_NAME_LENGTH  256
+#define MAX_TRACE_TABLE_SIZE   65536
+
+#define TIMEVAL_INIT            { 0, 0 }
 
 struct _Trace_Data
 {
        char                         name[MAX_TRACE_NAME_LENGTH];
        int                          call_count;
        int                          last_call_count;
-       long                         elapsed_time;
-       long                         last_elapsed_time;
+       struct timeval              elapsed_time;
+       struct timeval              last_elapsed_time;
+       struct timeval              total_elapsed_time;
+       struct timeval              last_total_elapsed_time;
        struct timeval              last_time;
 
        int                          traced;
@@ -24,19 +28,63 @@ struct _Trace_Data
 General_Trace_List *thread_trace_list = NULL;
 Mutex               general_trace_lists_access_mutex = MUTEX_INITIALIZER;
 
-int                 trace_api_flag = 1;
+struct timeval     initial_time = TIMEVAL_INIT;
+struct timeval     last_initial_time = TIMEVAL_INIT;
+
+struct timeval     last_trace_time = TIMEVAL_INIT;
+struct timeval     other_elapsed_time = TIMEVAL_INIT;
+struct timeval     traced_other_elapsed_time = TIMEVAL_INIT;
 
 
+static inline void
+_add_timeval_period(struct timeval *tv_dst, struct timeval tv_now, struct timeval tv_old)
+{
+       tv_dst->tv_sec += tv_now.tv_sec - tv_old.tv_sec;
+       tv_dst->tv_usec += 1000000 + (tv_now.tv_usec - tv_old.tv_usec);
+       tv_dst->tv_sec += (tv_dst->tv_usec / 1000000) - 1;
+       tv_dst->tv_usec = tv_dst->tv_usec % 1000000;
+}
+
+static inline void
+_add_timeval(struct timeval *tv_dst, struct timeval tv_src)
+{
+       tv_dst->tv_sec += tv_src.tv_sec;
+       tv_dst->tv_usec += tv_src.tv_usec;
+       if (tv_dst->tv_usec > 1000000)
+       {
+               tv_dst->tv_usec -= 1000000;
+               tv_dst->tv_sec++;
+       }
+       else if (tv_dst->tv_usec < 0)
+       {
+               tv_dst->tv_usec += 1000000;
+               tv_dst->tv_sec--;
+       }
+}
+
+static inline double
+_get_timeval_period(struct timeval time_now, struct timeval time_old)
+{
+       return ((time_now.tv_sec - time_old.tv_sec) * 1000) + ((time_now.tv_usec - time_old.tv_usec) / 1000.0);
+}
+
+static inline double
+_get_timeval(struct timeval time)
+{
+       return (time.tv_sec * 1000) + (time.tv_usec / 1000.0);
+}
+
 static unsigned short
 _generate_hash_short(const char *string)
 {
        unsigned short hash = 0;
        int i;
+
        for (i = 0; i < strlen(string); i++)
        {
                hash = 253 * hash + string[i];
        }
-       return hash ^ (hash >> 8);
+       return (hash ^ (hash >> 8)) % MAX_TRACE_TABLE_SIZE;
 }
 
 static Trace_Data *
@@ -53,7 +101,7 @@ _get_trace_data(Trace_Data **ftd_table, const char *name)
 
        current = ftd_table[hash];
 
-       while (current != NULL)
+       while (current != NULL && current->next != NULL)
        {
                if (strcmp(current->name, name) == 0)
                        break;
@@ -82,6 +130,7 @@ _get_trace_data(Trace_Data **ftd_table, const char *name)
                }
                ret = newitm;
        }
+
        goto finish;
 
 finish:
@@ -143,90 +192,152 @@ finish:
        return ret;
 }
 
-void
-trace_begin(const char *funcname)
+void *
+trace_begin(const char *funcname, void *hint, int trace_total_time)
 {
-       GLThreadState *tstate = NULL;
-
-       tstate = get_current_thread_state();
+       Trace_Data *ftd = NULL;
+       struct timeval t = TIMEVAL_INIT;
 
-       if (tstate == NULL)
+       if (trace_api_flag == 1)
        {
-               init_new_thread_state();
+               AST(gettimeofday(&t, NULL) == 0);
 
-               tstate = get_current_thread_state();
-               AST(tstate != NULL);
-       }
+               ftd = (Trace_Data *)hint;
 
-       if (tstate->ftd_table == NULL)
-       {
-               tstate->ftd_table = (Trace_Data **)calloc(1, sizeof(Trace_Data *) * MAX_TRACE_TABLE_SIZE);
-       }
+               if (ftd == NULL)
+               {
+                       GLThreadState *tstate = NULL;
+                       tstate = get_current_thread_state();
+
+                       if (tstate == NULL)
+                       {
+                               init_new_thread_state();
+
+                               tstate = get_current_thread_state();
+                               AST(tstate != NULL);
+                       }
+
+                       if (tstate->ftd_table == NULL)
+                       {
+                               tstate->ftd_table = (Trace_Data **)calloc(1, sizeof(Trace_Data *) * MAX_TRACE_TABLE_SIZE);
+                       }
+
+                       ftd = _get_trace_data(tstate->ftd_table, funcname);
+               }
 
-       if (trace_api_flag == 1)
-       {
-               Trace_Data *ftd = _get_trace_data(tstate->ftd_table, funcname);
                AST(ftd != NULL);
 
                ftd->call_count++;
                AST(ftd->last_time.tv_sec == 0);
 
                AST(gettimeofday(&ftd->last_time, NULL) == 0);
+
+               if (initial_time.tv_sec == 0)
+               {
+                       initial_time = ftd->last_time;
+                       last_initial_time = ftd->last_time;
+               }
+
+               if (trace_total_time == 1)
+               {
+                       if (last_trace_time.tv_sec != 0)
+                       {
+                               _add_timeval_period(&other_elapsed_time, t, last_trace_time);
+                               last_trace_time.tv_sec = 0;
+                       }
+               }
+
        }
+
+       return ftd;
 }
 
-void
-trace_end(const char *funcname)
+void *
+trace_end(const char *funcname, void *hint, int trace_total_time)
 {
-       GLThreadState *tstate = NULL;
-       struct timeval t = {0};
+       Trace_Data *ftd = NULL;
+       struct timeval t = TIMEVAL_INIT;
 
-       AST(gettimeofday(&t, NULL) == 0);
+       ftd = (Trace_Data *)hint;
 
-       tstate = get_current_thread_state();
+       AST(gettimeofday(&t, NULL) == 0);
 
-       if (tstate == NULL)
+       if (trace_api_flag == 1)
        {
-               init_new_thread_state();
+               GLThreadState *tstate = NULL;
+               struct timeval elapsed_time = TIMEVAL_INIT;
 
-               tstate = get_current_thread_state();
-               AST(tstate != NULL);
-       }
+               if (ftd == NULL)
+               {
+                       tstate = get_current_thread_state();
 
-       AST(tstate->ftd_table != NULL);
+                       if (tstate == NULL)
+                       {
+                               init_new_thread_state();
+
+                               tstate = get_current_thread_state();
+                               AST(tstate != NULL);
+                       }
+                       AST(tstate->ftd_table != NULL);
+
+                       ftd = _get_trace_data(tstate->ftd_table, funcname);
+               }
 
-       if (trace_api_flag == 1)
-       {
-               Trace_Data *ftd = _get_trace_data(tstate->ftd_table, funcname);
                AST(ftd != NULL);
 
-               ftd->elapsed_time +=
-                   (t.tv_sec - ftd->last_time.tv_sec) * 100000 +
-                   (t.tv_usec - ftd->last_time.tv_usec) / 10;
+               _add_timeval_period(&elapsed_time, t, ftd->last_time);
+
+               _add_timeval(&ftd->elapsed_time, elapsed_time);
+
+
                ftd->last_time.tv_sec = 0;
+
+               if (trace_total_time == 1)
+               {
+                       _add_timeval(&ftd->total_elapsed_time, elapsed_time);
+
+                       AST(gettimeofday(&last_trace_time, NULL) == 0);
+
+                       if (initial_time.tv_sec == 0)
+                       {
+                               initial_time = t;
+                               last_initial_time = t;
+                       }
+               }
+
        }
+
+
+       return ftd;
 }
 
 void
 trace_output(int force_output)
 {
-       static struct timeval tv_last = { 0, 0 };
+       static struct timeval tv_last = TIMEVAL_INIT;
+       struct timeval total_now = TIMEVAL_INIT;
        GLThreadState *tstate = NULL;
        Trace_Data **ftd_table = NULL;
+
+       double total_elapsed_time = 0.0;
+       double total_elapsed_time_period = 0.0;
+       double total_opengl_elapsed_time = 0.0;
+       double total_opengl_elapsed_time_period = 0.0;
+       double total_other_elapsed_time = 0.0;
+       double total_other_elapsed_time_period = 0.0;
+
+       double swaps_per_sec = 0.0;
+
        int i;
 
+       if (trace_api_flag != 1)
        {
-               char *fp_env = NULL;
-               int fp_envi = 0;
-               fp_env = getenv("COREGL_TRACE_API");
-               if (fp_env) fp_envi = atoi(fp_env);
-               else fp_envi = 0;
-               if (fp_envi == 0) return;
+               goto finish;
        }
 
        if (!force_output)
        {
-               struct timeval tv_now = { 0, 0 };
+               struct timeval tv_now = TIMEVAL_INIT;
                AST(gettimeofday(&tv_now, NULL) == 0);
                if (tv_now.tv_sec - tv_last.tv_sec < _COREGL_TRACE_OUTPUT_INTERVAL_SEC)
                {
@@ -235,6 +346,16 @@ trace_output(int force_output)
                tv_last = tv_now;
        }
 
+       AST(gettimeofday(&total_now, NULL) == 0);
+
+       total_elapsed_time = _get_timeval_period(total_now, initial_time);
+       total_elapsed_time_period = _get_timeval_period(total_now, last_initial_time);
+       last_initial_time = total_now;
+
+       total_other_elapsed_time = _get_timeval(other_elapsed_time);
+       total_other_elapsed_time_period = _get_timeval_period(other_elapsed_time, traced_other_elapsed_time);
+       traced_other_elapsed_time = other_elapsed_time;
+
        tstate = get_current_thread_state();
 
        if (tstate == NULL)
@@ -249,10 +370,22 @@ trace_output(int force_output)
        ftd_table = tstate->ftd_table;
        if (ftd_table == NULL) return;
 
+       {
+               static Trace_Data *trace_hint_swap = NULL;
+               if (trace_hint_swap == NULL)
+                       trace_hint_swap = _get_trace_data(ftd_table, "eglSwapBuffers");
+
+               if (trace_hint_swap != NULL && total_elapsed_time_period > 0)
+               {
+                       swaps_per_sec = (trace_hint_swap->call_count - trace_hint_swap->last_call_count) / (total_elapsed_time_period / 1000);
+               }
+       }
+
+
        LOG("\n");
-       LOG("\E[0;40;34m========================================================================================================================\E[0m\n");
-       LOG("\E[0;32;1m  API call info \E[1;37;1m: Thread ID = %d\E[0m\n", tstate->thread_id);
-       LOG("\E[0;40;34m========================================================================================================================\E[0m\n");
+       LOG("\E[40;34m========================================================================================================================\E[0m\n");
+       LOG("\E[40;32;1m  API call info \E[1;37;1m: Thread ID = %d  [Swaps per Second(P) = %7.2f]\E[0m\n", tstate->thread_id, swaps_per_sec);
+       LOG("\E[40;34m========================================================================================================================\E[0m\n");
 
        // highlighted
        for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
@@ -263,19 +396,22 @@ trace_output(int force_output)
 
                        while (current != NULL)
                        {
-                               double elapsed_time = current->elapsed_time / 100.0;
+                               double elapsed_time = _get_timeval(current->elapsed_time);
                                double elapsed_time_per_call = elapsed_time / current->call_count;
 
+                               total_opengl_elapsed_time += _get_timeval(current->total_elapsed_time);
+                               total_opengl_elapsed_time_period += _get_timeval(current->total_elapsed_time) - _get_timeval(current->last_total_elapsed_time);
+
                                current->traced = 0;
 
                                if (current->call_count > current->last_call_count)
                                {
-                                       double elapsed_time_period = (current->elapsed_time - current->last_elapsed_time) / 100.0;
+                                       double elapsed_time_period = _get_timeval_period(current->elapsed_time, current->last_elapsed_time);
                                        double elapsed_time_per_call_period = elapsed_time_period / (current->call_count - current->last_call_count);
 
-                                       if (elapsed_time_per_call_period >= 0.01)
+                                       if (elapsed_time_per_call_period >= 0.01 || current->call_count - current->last_call_count > 1000)
                                        {
-                                               LOG("\E[0;37;1m %-42.42s : %10d call(s), %10.2f ms, %9.2f ms/API, %9.2f ms/API(P) \E[0m\n",
+                                               LOG("\E[40;37;1m %-42.42s : %10d call(s), %10.2f ms, %9.3f ms/API, %9.3f ms/API(P) \E[0m\n",
                                                    current->name, current->call_count, elapsed_time, elapsed_time_per_call, elapsed_time_per_call_period);
                                                current->traced = 1;
                                        }
@@ -286,12 +422,9 @@ trace_output(int force_output)
        }
 
        {
-               char *fp_env = NULL;
-               int fp_envi = 0;
-               fp_env = getenv("COREGL_TRACE_API_ALL");
-               if (fp_env) fp_envi = atoi(fp_env);
-               else fp_envi = 0;
-               if (fp_envi != 0)
+               int fp_env = 0;
+               fp_env = atoi(get_env_setting("COREGL_TRACE_API_ALL"));
+               if (fp_env == 0)
                {
                        // other
                        for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
@@ -304,10 +437,10 @@ trace_output(int force_output)
                                        {
                                                if (current->traced == 0)
                                                {
-                                                       double elapsed_time = current->elapsed_time / 100.0;
+                                                       double elapsed_time = _get_timeval(current->elapsed_time);
                                                        double elapsed_time_per_call = elapsed_time / current->call_count;
 
-                                                       LOG(" %-42.42s : %10d call(s), %10.2f ms, %9.2f ms/API\n",
+                                                       LOG(" %-42.42s : %10d call(s), %10.2f ms, %9.3f ms/API\n",
                                                            current->name, current->call_count, elapsed_time, elapsed_time_per_call);
                                                }
                                                current = current->next;
@@ -317,6 +450,40 @@ trace_output(int force_output)
                }
        }
 
+       LOG("\E[40;34m========================================================================================================================\E[0m\n");
+
+       LOG("\E[40;36;1m %-42.42s : %13.2f ms[%6.2f%%], %13.2f ms(P)[%6.2f%%]\E[0m\n",
+           "TOTAL elapsed Time",
+           total_elapsed_time,
+           100.0,
+           total_elapsed_time_period,
+           100.0);
+
+
+       LOG("\E[40;36;1m %-42.42s : %13.2f ms[%6.2f%%], %13.2f ms(P)[%6.2f%%]\E[0m\n",
+           "OpenGL elapsed Time",
+           total_opengl_elapsed_time,
+           total_opengl_elapsed_time * 100.0 / total_elapsed_time,
+           total_opengl_elapsed_time_period,
+           total_opengl_elapsed_time_period * 100.0 / total_elapsed_time_period);
+
+       LOG("\E[40;36;1m %-42.42s : %13.2f ms[%6.2f%%], %13.2f ms(P)[%6.2f%%]\E[0m\n",
+           "Out of OpenGL elapsed time",
+           total_other_elapsed_time,
+           total_other_elapsed_time * 100.0 / total_elapsed_time,
+           total_other_elapsed_time_period,
+           total_other_elapsed_time_period * 100.0 / total_elapsed_time_period);
+
+       LOG("\E[40;36;1m %-42.42s : %13.2f ms[%6.2f%%], %13.2f ms(P)[%6.2f%%]\E[0m\n",
+           "CoreGL API tracing overhead",
+           total_elapsed_time - total_opengl_elapsed_time - total_other_elapsed_time,
+           (total_elapsed_time - total_opengl_elapsed_time - total_other_elapsed_time) * 100.0 / total_elapsed_time,
+           total_elapsed_time_period - total_opengl_elapsed_time_period - total_other_elapsed_time_period,
+           (total_elapsed_time_period - total_opengl_elapsed_time_period - total_other_elapsed_time_period) * 100.0 / total_elapsed_time_period);
+
+       LOG("\E[40;34m========================================================================================================================\E[0m\n");
+       LOG("\n");
+
        for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
        {
                if (ftd_table[i] != NULL)
@@ -327,14 +494,12 @@ trace_output(int force_output)
                        {
                                current->last_call_count = current->call_count;
                                current->last_elapsed_time = current->elapsed_time;
+                               current->last_total_elapsed_time = current->total_elapsed_time;
                                current = current->next;
                        }
                }
        }
 
-       LOG("\E[0;40;34m========================================================================================================================\E[0m\n");
-       LOG("\n");
-
        goto finish;
 
 finish:
index bd83f00..e8f5fc7 100644 (file)
@@ -4,6 +4,11 @@
 #include <string.h>
 #include <sys/time.h>
 
+// Symbol definition for override
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     RET_TYPE (*_COREGL_NAME_MANGLE(FUNC_NAME)) PARAM_LIST = NULL;
+#include "headers/sym.h"
+#undef _COREGL_SYMBOL
+
 typedef struct _GLGlueFakeContext
 {
        GLuint gl_num_tex_units[1];
@@ -32,23 +37,25 @@ _get_texture_states(GLenum pname, GLint *params)
 }
 
 void
+init_wrap_gl()
+{
+}
+
+void
+free_wrap_gl()
+{
+}
+
+void
 dump_wrap_context_states(int force_output)
 {
        static struct timeval tv_last = { 0, 0 };
 
+       if (trace_ctx_flag != 1) return;
 
        _sym_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, (GLint *)initial_fake_ctx->gl_num_tex_units);
        _sym_glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, (GLint *)initial_fake_ctx->gl_num_vertex_attribs);
 
-       {
-               char *fp_env = NULL;
-               int fp_envi = 0;
-               fp_env = getenv("COREGL_TRACE_STATE");
-               if (fp_env) fp_envi = atoi(fp_env);
-               else fp_envi = 0;
-               if (fp_envi == 0) return;
-       }
-
        if (!force_output)
        {
                struct timeval tv_now = { 0, 0 };
index 55d0626..3aa8b69 100644 (file)
@@ -1,5 +1,13 @@
 \r
 #include "coregl_internal.h"\r
 \r
+// Symbol definition for override\r
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_COREGL_NAME_MANGLE(FUNC_NAME)) PARAM_LIST;\r
+# include "headers/sym.h"
+#undef _COREGL_SYMBOL
+\r
+extern void init_wrap_gl();\r
+extern void free_wrap_gl();\r
+\r
 extern void dump_wrap_context_states(int force_output);\r
 \r
index 3f543ec..e00b570 100644 (file)
@@ -6,7 +6,8 @@ eglGetError(void)
        EGLint ret = _COREGL_INT_INIT_VALUE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetError();
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+       ret = ovr_eglGetError();
        goto finish;
 
 finish:
@@ -20,7 +21,8 @@ eglGetDisplay(EGLNativeDisplayType display_id)
        EGLDisplay ret = EGL_NO_DISPLAY;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetDisplay(display_id);
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+       ret = ovr_eglGetDisplay(display_id);
        goto finish;
 
 finish:
@@ -32,9 +34,9 @@ EGLBoolean
 eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor)
 {
        EGLBoolean ret = EGL_FALSE;
-
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglInitialize(dpy, major, minor);
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+       ret = ovr_eglInitialize(dpy, major, minor);
        goto finish;
 
 finish:
@@ -48,7 +50,8 @@ eglTerminate(EGLDisplay dpy)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglTerminate(dpy);
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+       ret = ovr_eglTerminate(dpy);
        goto finish;
 
 finish:
@@ -62,7 +65,7 @@ eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *nu
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetConfigs(dpy, configs, config_size, num_config);
+       ret = ovr_eglGetConfigs(dpy, configs, config_size, num_config);
        goto finish;
 
 finish:
@@ -76,7 +79,7 @@ eglChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, E
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglChooseConfig(dpy, attrib_list, configs, config_size, num_config);
+       ret = ovr_eglChooseConfig(dpy, attrib_list, configs, config_size, num_config);
        goto finish;
 
 finish:
@@ -90,7 +93,7 @@ eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *v
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetConfigAttrib(dpy, config, attribute, value);
+       ret = ovr_eglGetConfigAttrib(dpy, config, attribute, value);
        goto finish;
 
 finish:
@@ -105,7 +108,7 @@ eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win
        EGLSurface ret = EGL_NO_SURFACE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglCreateWindowSurface(dpy, config, win, attrib_list);
+       ret = ovr_eglCreateWindowSurface(dpy, config, win, attrib_list);
        goto finish;
 
 finish:
@@ -119,7 +122,7 @@ eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_l
        EGLSurface ret = EGL_NO_SURFACE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglCreatePbufferSurface(dpy, config, attrib_list);
+       ret = ovr_eglCreatePbufferSurface(dpy, config, attrib_list);
        goto finish;
 
 finish:
@@ -133,7 +136,7 @@ eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pix
        EGLSurface ret = EGL_NO_SURFACE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglCreatePixmapSurface(dpy, config, pixmap, attrib_list);
+       ret = ovr_eglCreatePixmapSurface(dpy, config, pixmap, attrib_list);
        goto finish;
 
 finish:
@@ -147,7 +150,7 @@ eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglDestroySurface(dpy, surface);
+       ret = ovr_eglDestroySurface(dpy, surface);
        goto finish;
 
 finish:
@@ -161,7 +164,7 @@ eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *va
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglQuerySurface(dpy, surface, attribute, value);
+       ret = ovr_eglQuerySurface(dpy, surface, attribute, value);
        goto finish;
 
 finish:
@@ -175,7 +178,8 @@ eglBindAPI(EGLenum api)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglBindAPI(api);
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+       ret = ovr_eglBindAPI(api);
        goto finish;
 
 finish:
@@ -189,7 +193,8 @@ eglQueryAPI(void)
        EGLenum ret = 0;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglQueryAPI();
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+       ret = ovr_eglQueryAPI();
        goto finish;
 
 finish:
@@ -203,7 +208,7 @@ eglWaitClient(void)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglWaitClient();
+       ret = ovr_eglWaitClient();
        goto finish;
 
 finish:
@@ -217,7 +222,7 @@ eglReleaseThread(void)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglReleaseThread();
+       ret = ovr_eglReleaseThread();
        goto finish;
 
 finish:
@@ -231,7 +236,7 @@ eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffe
        EGLSurface ret = EGL_NO_SURFACE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglCreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
+       ret = ovr_eglCreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
        goto finish;
 
 finish:
@@ -245,7 +250,7 @@ eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint va
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglSurfaceAttrib(dpy, surface, attribute, value);
+       ret = ovr_eglSurfaceAttrib(dpy, surface, attribute, value);
        goto finish;
 
 finish:
@@ -257,7 +262,7 @@ void
 eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_eglBindTexImage(dpy, surface, buffer);
+       ovr_eglBindTexImage(dpy, surface, buffer);
        goto finish;
 
 finish:
@@ -270,7 +275,7 @@ eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglReleaseTexImage(dpy, surface, buffer);
+       ret = ovr_eglReleaseTexImage(dpy, surface, buffer);
        goto finish;
 
 finish:
@@ -284,7 +289,7 @@ eglSwapInterval(EGLDisplay dpy, EGLint interval)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglSwapInterval(dpy, interval);
+       ret = ovr_eglSwapInterval(dpy, interval);
        goto finish;
 
 finish:
@@ -298,7 +303,7 @@ eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, con
        EGLContext ret = EGL_NO_CONTEXT;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglCreateContext(dpy, config, share_context, attrib_list);
+       ret = ovr_eglCreateContext(dpy, config, share_context, attrib_list);
        goto finish;
 
 finish:
@@ -312,7 +317,7 @@ eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglDestroyContext(dpy, ctx);
+       ret = ovr_eglDestroyContext(dpy, ctx);
        goto finish;
 
 finish:
@@ -326,13 +331,13 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglMakeCurrent(dpy, draw, read, ctx);
+       ret = ovr_eglMakeCurrent(dpy, draw, read, ctx);
        goto finish;
 
 finish:
        _COREGL_WRAP_FUNC_END();
 #ifdef COREGL_TRACE_STATE_INFO
-       if (glsym_eglMakeCurrent != fpgl_eglMakeCurrent)
+       if (ovr_eglMakeCurrent == _sym_eglMakeCurrent)
                dump_wrap_context_states(0);
 #endif // COREGL_TRACE_STATE_INFO
        return ret;
@@ -344,7 +349,7 @@ eglGetCurrentContext(void)
        EGLContext ret = EGL_NO_CONTEXT;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetCurrentContext();
+       ret = ovr_eglGetCurrentContext();
        goto finish;
 
 finish:
@@ -358,7 +363,7 @@ eglGetCurrentSurface(EGLint readdraw)
        EGLSurface ret = EGL_NO_SURFACE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetCurrentSurface(readdraw);
+       ret = ovr_eglGetCurrentSurface(readdraw);
        goto finish;
 
 finish:
@@ -372,7 +377,7 @@ eglGetCurrentDisplay(void)
        EGLDisplay ret = EGL_NO_DISPLAY;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetCurrentDisplay();
+       ret = ovr_eglGetCurrentDisplay();
        goto finish;
 
 finish:
@@ -386,7 +391,7 @@ eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglQueryContext(dpy, ctx, attribute, value);
+       ret = ovr_eglQueryContext(dpy, ctx, attribute, value);
        goto finish;
 
 finish:
@@ -400,7 +405,7 @@ eglWaitGL(void)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglWaitGL();
+       ret = ovr_eglWaitGL();
        goto finish;
 
 finish:
@@ -414,7 +419,7 @@ eglWaitNative(EGLint engine)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglWaitNative(engine);
+       ret = ovr_eglWaitNative(engine);
        goto finish;
 
 finish:
@@ -428,7 +433,7 @@ eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglSwapBuffers(dpy, surface);
+       ret = ovr_eglSwapBuffers(dpy, surface);
 
        goto finish;
 
@@ -444,7 +449,7 @@ eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
        EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglCopyBuffers(dpy, surface, target);
+       ret = ovr_eglCopyBuffers(dpy, surface, target);
        goto finish;
 
 finish:
@@ -458,7 +463,8 @@ eglGetProcAddress(const char* procname)
        _eng_fn ret = NULL;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetProcAddress(procname);
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+       ret = ovr_eglGetProcAddress(procname);
        goto finish;
 
 finish:
@@ -472,7 +478,8 @@ eglQueryString(EGLDisplay dpy, EGLint name)
        const char *ret = NULL;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglQueryString(dpy, name);
+       if (api_opt == COREGL_UNKNOWN_PATH) goto finish;
+       ret = ovr_eglQueryString(dpy, name);
        goto finish;
 
 finish:
@@ -486,7 +493,7 @@ eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuff
        void *ret = NULL;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
+       ret = ovr_eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
        goto finish;
 
 finish:
@@ -497,10 +504,10 @@ finish:
 EGLBoolean
 eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
 {
-       unsigned int ret = _COREGL_INT_INIT_VALUE;
+       EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglDestroyImageKHR(dpy, image);
+       ret = ovr_eglDestroyImageKHR(dpy, image);
        goto finish;
 
 finish:
@@ -514,7 +521,7 @@ eglMapImageSEC(EGLDisplay dpy, EGLImageKHR image)
        void *ret = NULL;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglMapImageSEC(dpy, image);
+       ret = ovr_eglMapImageSEC(dpy, image);
        goto finish;
 
 finish:
@@ -525,10 +532,10 @@ finish:
 EGLBoolean
 eglUnmapImageSEC(EGLDisplay dpy, EGLImageKHR image)
 {
-       unsigned int ret = _COREGL_INT_INIT_VALUE;
+       EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglUnmapImageSEC(dpy, image);
+       ret = ovr_eglUnmapImageSEC(dpy, image);
        goto finish;
 
 finish:
@@ -539,10 +546,38 @@ finish:
 EGLBoolean
 eglGetImageAttribSEC(EGLDisplay dpy, EGLImageKHR image, EGLint attribute, EGLint *value)
 {
-       unsigned int ret = _COREGL_INT_INIT_VALUE;
+       EGLBoolean ret = EGL_FALSE;
+
+       _COREGL_WRAP_FUNC_BEGIN();
+       ret = ovr_eglGetImageAttribSEC(dpy, image, attribute, value);
+       goto finish;
+
+finish:
+       _COREGL_WRAP_FUNC_END();
+       return ret;
+}
+
+EGLBoolean
+eglLockSurfaceKHR(EGLDisplay display, EGLSurface surface, const EGLint *attrib_list)
+{
+       EGLBoolean ret = EGL_FALSE;
+
+       _COREGL_WRAP_FUNC_BEGIN();
+       ret = ovr_eglLockSurfaceKHR(display, surface, attrib_list);
+       goto finish;
+
+finish:
+       _COREGL_WRAP_FUNC_END();
+       return ret;
+}
+
+EGLBoolean
+eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surface)
+{
+       EGLBoolean ret = EGL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_eglGetImageAttribSEC(dpy, image, attribute, value);
+       ret = ovr_eglUnlockSurfaceKHR(display, surface);
        goto finish;
 
 finish:
index ac62c4b..3ca57c9 100644 (file)
@@ -4,7 +4,7 @@ void
 glActiveTexture(GLenum texture)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glActiveTexture(texture);
+       ovr_glActiveTexture(texture);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -16,7 +16,7 @@ void
 glAttachShader(GLuint program, GLuint shader)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glAttachShader(program, shader);
+       ovr_glAttachShader(program, shader);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -28,7 +28,7 @@ void
 glBindAttribLocation(GLuint program, GLuint index, const char* name)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBindAttribLocation(program, index, name);
+       ovr_glBindAttribLocation(program, index, name);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -40,7 +40,7 @@ void
 glBindBuffer(GLenum target, GLuint buffer)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBindBuffer(target, buffer);
+       ovr_glBindBuffer(target, buffer);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -52,7 +52,7 @@ void
 glBindFramebuffer(GLenum target, GLuint framebuffer)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBindFramebuffer(target, framebuffer);
+       ovr_glBindFramebuffer(target, framebuffer);
 
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
@@ -65,7 +65,7 @@ void
 glBindRenderbuffer(GLenum target, GLuint renderbuffer)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBindRenderbuffer(target, renderbuffer);
+       ovr_glBindRenderbuffer(target, renderbuffer);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -77,7 +77,7 @@ void
 glBindTexture(GLenum target, GLuint texture)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBindTexture(target, texture);
+       ovr_glBindTexture(target, texture);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -89,7 +89,7 @@ void
 glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBlendColor(red, green, blue, alpha);
+       ovr_glBlendColor(red, green, blue, alpha);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -101,7 +101,7 @@ void
 glBlendEquation(GLenum mode)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBlendEquation(mode);
+       ovr_glBlendEquation(mode);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -113,7 +113,7 @@ void
 glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBlendEquationSeparate(modeRGB, modeAlpha);
+       ovr_glBlendEquationSeparate(modeRGB, modeAlpha);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -125,7 +125,7 @@ void
 glBlendFunc(GLenum sfactor, GLenum dfactor)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBlendFunc(sfactor, dfactor);
+       ovr_glBlendFunc(sfactor, dfactor);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -137,7 +137,7 @@ void
 glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+       ovr_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -149,7 +149,7 @@ void
 glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBufferData(target, size, data, usage);
+       ovr_glBufferData(target, size, data, usage);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -161,7 +161,7 @@ void
 glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glBufferSubData(target, offset, size, data);
+       ovr_glBufferSubData(target, offset, size, data);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -175,7 +175,7 @@ glCheckFramebufferStatus(GLenum target)
        GLenum ret = GL_NONE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glCheckFramebufferStatus(target);
+       ret = ovr_glCheckFramebufferStatus(target);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -188,7 +188,7 @@ void
 glClear(GLbitfield mask)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glClear(mask);
+       ovr_glClear(mask);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -200,7 +200,7 @@ void
 glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glClearColor(red, green, blue, alpha);
+       ovr_glClearColor(red, green, blue, alpha);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -212,7 +212,7 @@ void
 glClearDepthf(GLclampf depth)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glClearDepthf(depth);
+       ovr_glClearDepthf(depth);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -224,7 +224,7 @@ void
 glClearStencil(GLint s)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glClearStencil(s);
+       ovr_glClearStencil(s);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -236,7 +236,7 @@ void
 glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glColorMask(red, green, blue, alpha);
+       ovr_glColorMask(red, green, blue, alpha);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -248,7 +248,7 @@ void
 glCompileShader(GLuint shader)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glCompileShader(shader);
+       ovr_glCompileShader(shader);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -260,7 +260,7 @@ void
 glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+       ovr_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -272,7 +272,7 @@ void
 glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+       ovr_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -284,7 +284,7 @@ void
 glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+       ovr_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -296,7 +296,7 @@ void
 glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+       ovr_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -310,7 +310,7 @@ glCreateProgram(void)
        GLuint ret = _COREGL_INT_INIT_VALUE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glCreateProgram();
+       ret = ovr_glCreateProgram();
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -324,7 +324,7 @@ glCreateShader(GLenum type)
 {
        GLuint ret = _COREGL_INT_INIT_VALUE;
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glCreateShader(type);
+       ret = ovr_glCreateShader(type);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -337,7 +337,7 @@ void
 glCullFace(GLenum mode)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glCullFace(mode);
+       ovr_glCullFace(mode);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -349,7 +349,7 @@ void
 glDeleteBuffers(GLsizei n, const GLuint* buffers)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDeleteBuffers(n, buffers);
+       ovr_glDeleteBuffers(n, buffers);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -361,7 +361,7 @@ void
 glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDeleteFramebuffers(n, framebuffers);
+       ovr_glDeleteFramebuffers(n, framebuffers);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -373,7 +373,7 @@ void
 glDeleteProgram(GLuint program)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDeleteProgram(program);
+       ovr_glDeleteProgram(program);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -385,7 +385,7 @@ void
 glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDeleteRenderbuffers(n, renderbuffers);
+       ovr_glDeleteRenderbuffers(n, renderbuffers);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -397,7 +397,7 @@ void
 glDeleteShader(GLuint shader)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDeleteShader(shader);
+       ovr_glDeleteShader(shader);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -409,7 +409,7 @@ void
 glDeleteTextures(GLsizei n, const GLuint* textures)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDeleteTextures(n, textures);
+       ovr_glDeleteTextures(n, textures);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -421,7 +421,7 @@ void
 glDepthFunc(GLenum func)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDepthFunc(func);
+       ovr_glDepthFunc(func);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -433,7 +433,7 @@ void
 glDepthMask(GLboolean flag)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDepthMask(flag);
+       ovr_glDepthMask(flag);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -445,7 +445,7 @@ void
 glDepthRangef(GLclampf zNear, GLclampf zFar)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDepthRangef(zNear, zFar);
+       ovr_glDepthRangef(zNear, zFar);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -457,7 +457,7 @@ void
 glDetachShader(GLuint program, GLuint shader)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDetachShader(program, shader);
+       ovr_glDetachShader(program, shader);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -469,7 +469,7 @@ void
 glDisable(GLenum cap)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDisable(cap);
+       ovr_glDisable(cap);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -481,7 +481,7 @@ void
 glDisableVertexAttribArray(GLuint index)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDisableVertexAttribArray(index);
+       ovr_glDisableVertexAttribArray(index);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -493,7 +493,7 @@ void
 glDrawArrays(GLenum mode, GLint first, GLsizei count)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDrawArrays(mode, first, count);
+       ovr_glDrawArrays(mode, first, count);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -505,7 +505,7 @@ void
 glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glDrawElements(mode, count, type, indices);
+       ovr_glDrawElements(mode, count, type, indices);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -517,7 +517,7 @@ void
 glEnable(GLenum cap)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glEnable(cap);
+       ovr_glEnable(cap);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -529,7 +529,7 @@ void
 glEnableVertexAttribArray(GLuint index)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glEnableVertexAttribArray(index);
+       ovr_glEnableVertexAttribArray(index);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -541,7 +541,7 @@ void
 glFinish(void)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glFinish();
+       ovr_glFinish();
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -554,7 +554,7 @@ void
 glFlush(void)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glFlush();
+       ovr_glFlush();
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -567,7 +567,7 @@ void
 glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+       ovr_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -579,7 +579,7 @@ void
 glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glFramebufferTexture2D(target, attachment, textarget, texture, level);
+       ovr_glFramebufferTexture2D(target, attachment, textarget, texture, level);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -591,7 +591,7 @@ void
 glFrontFace(GLenum mode)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glFrontFace(mode);
+       ovr_glFrontFace(mode);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -603,7 +603,7 @@ void
 glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetVertexAttribfv(index, pname, params);
+       ovr_glGetVertexAttribfv(index, pname, params);
 
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
@@ -616,7 +616,7 @@ void
 glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetVertexAttribiv(index, pname, params);
+       ovr_glGetVertexAttribiv(index, pname, params);
 
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
@@ -629,7 +629,7 @@ void
 glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetVertexAttribPointerv(index, pname, pointer);
+       ovr_glGetVertexAttribPointerv(index, pname, pointer);
 
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
 
@@ -643,7 +643,7 @@ void
 glHint(GLenum target, GLenum mode)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glHint(target, mode);
+       ovr_glHint(target, mode);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -655,7 +655,7 @@ void
 glGenBuffers(GLsizei n, GLuint* buffers)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGenBuffers(n, buffers);
+       ovr_glGenBuffers(n, buffers);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -667,7 +667,7 @@ void
 glGenerateMipmap(GLenum target)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGenerateMipmap(target);
+       ovr_glGenerateMipmap(target);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -679,7 +679,7 @@ void
 glGenFramebuffers(GLsizei n, GLuint* framebuffers)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGenFramebuffers(n, framebuffers);
+       ovr_glGenFramebuffers(n, framebuffers);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -691,7 +691,7 @@ void
 glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGenRenderbuffers(n, renderbuffers);
+       ovr_glGenRenderbuffers(n, renderbuffers);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -703,7 +703,7 @@ void
 glGenTextures(GLsizei n, GLuint* textures)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGenTextures(n, textures);
+       ovr_glGenTextures(n, textures);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -715,7 +715,7 @@ void
 glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetActiveAttrib(program, index, bufsize, length, size, type, name);
+       ovr_glGetActiveAttrib(program, index, bufsize, length, size, type, name);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -727,7 +727,7 @@ void
 glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetActiveUniform(program, index, bufsize, length, size, type, name);
+       ovr_glGetActiveUniform(program, index, bufsize, length, size, type, name);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -739,7 +739,7 @@ void
 glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetAttachedShaders(program, maxcount, count, shaders);
+       ovr_glGetAttachedShaders(program, maxcount, count, shaders);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -752,7 +752,7 @@ glGetAttribLocation(GLuint program, const char* name)
 {
        int ret = _COREGL_INT_INIT_VALUE;
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glGetAttribLocation(program, name);
+       ret = ovr_glGetAttribLocation(program, name);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -765,7 +765,7 @@ void
 glGetBooleanv(GLenum pname, GLboolean* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetBooleanv(pname, params);
+       ovr_glGetBooleanv(pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -777,7 +777,7 @@ void
 glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetBufferParameteriv(target, pname, params);
+       ovr_glGetBufferParameteriv(target, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -791,7 +791,7 @@ glGetError(void)
        GLenum ret = GL_NONE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glGetError();
+       ret = ovr_glGetError();
        goto finish;
 
 finish:
@@ -803,7 +803,7 @@ void
 glGetFloatv(GLenum pname, GLfloat* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetFloatv(pname, params);
+       ovr_glGetFloatv(pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -815,7 +815,7 @@ void
 glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+       ovr_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -827,7 +827,7 @@ void
 glGetIntegerv(GLenum pname, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetIntegerv(pname, params);
+       ovr_glGetIntegerv(pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -839,7 +839,7 @@ void
 glGetProgramiv(GLuint program, GLenum pname, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetProgramiv(program, pname, params);
+       ovr_glGetProgramiv(program, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -851,7 +851,7 @@ void
 glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetProgramInfoLog(program, bufsize, length, infolog);
+       ovr_glGetProgramInfoLog(program, bufsize, length, infolog);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -863,7 +863,7 @@ void
 glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetRenderbufferParameteriv(target, pname, params);
+       ovr_glGetRenderbufferParameteriv(target, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -875,7 +875,7 @@ void
 glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetShaderiv(shader, pname, params);
+       ovr_glGetShaderiv(shader, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -887,7 +887,7 @@ void
 glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetShaderInfoLog(shader, bufsize, length, infolog);
+       ovr_glGetShaderInfoLog(shader, bufsize, length, infolog);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -900,7 +900,7 @@ glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range
 {
        _COREGL_WRAP_FUNC_BEGIN();
 #ifndef _COREGL_DESKTOP_GL
-       glsym_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+       ovr_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
 #else
        if (range)
@@ -926,7 +926,7 @@ void
 glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetShaderSource(shader, bufsize, length, source);
+       ovr_glGetShaderSource(shader, bufsize, length, source);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -940,7 +940,7 @@ glGetString(GLenum name)
        const GLubyte *ret = NULL;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glGetString(name);
+       ret = ovr_glGetString(name);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -953,7 +953,7 @@ void
 glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetTexParameterfv(target, pname, params);
+       ovr_glGetTexParameterfv(target, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -965,7 +965,7 @@ void
 glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetTexParameteriv(target, pname, params);
+       ovr_glGetTexParameteriv(target, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -977,7 +977,7 @@ void
 glGetUniformfv(GLuint program, GLint location, GLfloat* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetUniformfv(program, location, params);
+       ovr_glGetUniformfv(program, location, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -989,7 +989,7 @@ void
 glGetUniformiv(GLuint program, GLint location, GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetUniformiv(program, location, params);
+       ovr_glGetUniformiv(program, location, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1002,7 +1002,7 @@ glGetUniformLocation(GLuint program, const char* name)
        int ret = _COREGL_INT_INIT_VALUE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glGetUniformLocation(program, name);
+       ret = ovr_glGetUniformLocation(program, name);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1017,7 +1017,7 @@ glIsBuffer(GLuint buffer)
        GLboolean ret = GL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glIsBuffer(buffer);
+       ret = ovr_glIsBuffer(buffer);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1032,7 +1032,7 @@ glIsEnabled(GLenum cap)
        GLboolean ret = GL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glIsEnabled(cap);
+       ret = ovr_glIsEnabled(cap);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1047,7 +1047,7 @@ glIsFramebuffer(GLuint framebuffer)
        GLboolean ret = GL_FALSE;
 
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glIsFramebuffer(framebuffer);
+       ret = ovr_glIsFramebuffer(framebuffer);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1061,7 +1061,7 @@ glIsProgram(GLuint program)
 {
        GLboolean ret;
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glIsProgram(program);
+       ret = ovr_glIsProgram(program);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1075,7 +1075,7 @@ glIsRenderbuffer(GLuint renderbuffer)
 {
        GLboolean ret;
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glIsRenderbuffer(renderbuffer);
+       ret = ovr_glIsRenderbuffer(renderbuffer);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1089,7 +1089,7 @@ glIsShader(GLuint shader)
 {
        GLboolean ret;
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glIsShader(shader);
+       ret = ovr_glIsShader(shader);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1103,7 +1103,7 @@ glIsTexture(GLuint texture)
 {
        GLboolean ret;
        _COREGL_WRAP_FUNC_BEGIN();
-       ret = glsym_glIsTexture(texture);
+       ret = ovr_glIsTexture(texture);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1116,7 +1116,7 @@ void
 glLineWidth(GLfloat width)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glLineWidth(width);
+       ovr_glLineWidth(width);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1128,7 +1128,7 @@ void
 glLinkProgram(GLuint program)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glLinkProgram(program);
+       ovr_glLinkProgram(program);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1140,7 +1140,7 @@ void
 glPixelStorei(GLenum pname, GLint param)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glPixelStorei(pname, param);
+       ovr_glPixelStorei(pname, param);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1152,7 +1152,7 @@ void
 glPolygonOffset(GLfloat factor, GLfloat units)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glPolygonOffset(factor, units);
+       ovr_glPolygonOffset(factor, units);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1164,7 +1164,7 @@ void
 glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glReadPixels(x, y, width, height, format, type, pixels);
+       ovr_glReadPixels(x, y, width, height, format, type, pixels);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1177,7 +1177,7 @@ glReleaseShaderCompiler(void)
 {
        _COREGL_WRAP_FUNC_BEGIN();
 #ifndef _COREGL_DESKTOP_GL
-       glsym_glReleaseShaderCompiler();
+       ovr_glReleaseShaderCompiler();
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
 #else
        //FIXME!!! need something here?
@@ -1193,7 +1193,7 @@ void
 glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glRenderbufferStorage(target, internalformat, width, height);
+       ovr_glRenderbufferStorage(target, internalformat, width, height);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1205,7 +1205,7 @@ void
 glSampleCoverage(GLclampf value, GLboolean invert)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glSampleCoverage(value, invert);
+       ovr_glSampleCoverage(value, invert);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1217,7 +1217,7 @@ void
 glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glScissor(x, y, width, height);
+       ovr_glScissor(x, y, width, height);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1230,7 +1230,7 @@ glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void
 {
        _COREGL_WRAP_FUNC_BEGIN();
 #ifndef _COREGL_DESKTOP_GL
-       glsym_glShaderBinary(n, shaders, binaryformat, binary, length);
+       ovr_glShaderBinary(n, shaders, binaryformat, binary, length);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
 #else
 // FIXME: need to dlsym/getprocaddress for this
@@ -1250,7 +1250,7 @@ void
 glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glShaderSource(shader, count, string, length);
+       ovr_glShaderSource(shader, count, string, length);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1262,7 +1262,7 @@ void
 glStencilFunc(GLenum func, GLint ref, GLuint mask)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glStencilFunc(func, ref, mask);
+       ovr_glStencilFunc(func, ref, mask);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1274,7 +1274,7 @@ void
 glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glStencilFuncSeparate(face, func, ref, mask);
+       ovr_glStencilFuncSeparate(face, func, ref, mask);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1286,7 +1286,7 @@ void
 glStencilMask(GLuint mask)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glStencilMask(mask);
+       ovr_glStencilMask(mask);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1298,7 +1298,7 @@ void
 glStencilMaskSeparate(GLenum face, GLuint mask)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glStencilMaskSeparate(face, mask);
+       ovr_glStencilMaskSeparate(face, mask);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1310,7 +1310,7 @@ void
 glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glStencilOp(fail, zfail, zpass);
+       ovr_glStencilOp(fail, zfail, zpass);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1322,7 +1322,7 @@ void
 glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glStencilOpSeparate(face, fail, zfail, zpass);
+       ovr_glStencilOpSeparate(face, fail, zfail, zpass);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1334,7 +1334,7 @@ void
 glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+       ovr_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1346,7 +1346,7 @@ void
 glTexParameterf(GLenum target, GLenum pname, GLfloat param)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glTexParameterf(target, pname, param);
+       ovr_glTexParameterf(target, pname, param);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1358,7 +1358,7 @@ void
 glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glTexParameterfv(target, pname, params);
+       ovr_glTexParameterfv(target, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1370,7 +1370,7 @@ void
 glTexParameteri(GLenum target, GLenum pname, GLint param)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glTexParameteri(target, pname, param);
+       ovr_glTexParameteri(target, pname, param);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1382,7 +1382,7 @@ void
 glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glTexParameteriv(target, pname, params);
+       ovr_glTexParameteriv(target, pname, params);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1394,7 +1394,7 @@ void
 glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+       ovr_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1406,7 +1406,7 @@ void
 glUniform1f(GLint location, GLfloat x)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform1f(location, x);
+       ovr_glUniform1f(location, x);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1418,7 +1418,7 @@ void
 glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform1fv(location, count, v);
+       ovr_glUniform1fv(location, count, v);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1430,7 +1430,7 @@ void
 glUniform1i(GLint location, GLint x)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform1i(location, x);
+       ovr_glUniform1i(location, x);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1442,7 +1442,7 @@ void
 glUniform1iv(GLint location, GLsizei count, const GLint* v)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform1iv(location, count, v);
+       ovr_glUniform1iv(location, count, v);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1454,7 +1454,7 @@ void
 glUniform2f(GLint location, GLfloat x, GLfloat y)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform2f(location, x, y);
+       ovr_glUniform2f(location, x, y);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1466,7 +1466,7 @@ void
 glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform2fv(location, count, v);
+       ovr_glUniform2fv(location, count, v);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1478,7 +1478,7 @@ void
 glUniform2i(GLint location, GLint x, GLint y)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform2i(location, x, y);
+       ovr_glUniform2i(location, x, y);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1490,7 +1490,7 @@ void
 glUniform2iv(GLint location, GLsizei count, const GLint* v)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform2iv(location, count, v);
+       ovr_glUniform2iv(location, count, v);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1502,7 +1502,7 @@ void
 glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform3f(location, x, y, z);
+       ovr_glUniform3f(location, x, y, z);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1514,7 +1514,7 @@ void
 glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform3fv(location, count, v);
+       ovr_glUniform3fv(location, count, v);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1526,7 +1526,7 @@ void
 glUniform3i(GLint location, GLint x, GLint y, GLint z)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform3i(location, x, y, z);
+       ovr_glUniform3i(location, x, y, z);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1538,7 +1538,7 @@ void
 glUniform3iv(GLint location, GLsizei count, const GLint* v)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform3iv(location, count, v);
+       ovr_glUniform3iv(location, count, v);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1550,7 +1550,7 @@ void
 glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform4f(location, x, y, z, w);
+       ovr_glUniform4f(location, x, y, z, w);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1562,7 +1562,7 @@ void
 glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform4fv(location, count, v);
+       ovr_glUniform4fv(location, count, v);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1574,7 +1574,7 @@ void
 glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform4i(location, x, y, z, w);
+       ovr_glUniform4i(location, x, y, z, w);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1586,7 +1586,7 @@ void
 glUniform4iv(GLint location, GLsizei count, const GLint* v)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniform4iv(location, count, v);
+       ovr_glUniform4iv(location, count, v);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1598,7 +1598,7 @@ void
 glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniformMatrix2fv(location, count, transpose, value);
+       ovr_glUniformMatrix2fv(location, count, transpose, value);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1610,7 +1610,7 @@ void
 glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniformMatrix3fv(location, count, transpose, value);
+       ovr_glUniformMatrix3fv(location, count, transpose, value);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1622,7 +1622,7 @@ void
 glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUniformMatrix4fv(location, count, transpose, value);
+       ovr_glUniformMatrix4fv(location, count, transpose, value);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1634,7 +1634,7 @@ void
 glUseProgram(GLuint program)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glUseProgram(program);
+       ovr_glUseProgram(program);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1646,7 +1646,7 @@ void
 glValidateProgram(GLuint program)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glValidateProgram(program);
+       ovr_glValidateProgram(program);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1658,7 +1658,7 @@ void
 glVertexAttrib1f(GLuint indx, GLfloat x)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttrib1f(indx, x);
+       ovr_glVertexAttrib1f(indx, x);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1670,7 +1670,7 @@ void
 glVertexAttrib1fv(GLuint indx, const GLfloat* values)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttrib1fv(indx, values);
+       ovr_glVertexAttrib1fv(indx, values);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1682,7 +1682,7 @@ void
 glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttrib2f(indx, x, y);
+       ovr_glVertexAttrib2f(indx, x, y);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1694,7 +1694,7 @@ void
 glVertexAttrib2fv(GLuint indx, const GLfloat* values)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttrib2fv(indx, values);
+       ovr_glVertexAttrib2fv(indx, values);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1706,7 +1706,7 @@ void
 glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttrib3f(indx, x, y, z);
+       ovr_glVertexAttrib3f(indx, x, y, z);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1718,7 +1718,7 @@ void
 glVertexAttrib3fv(GLuint indx, const GLfloat* values)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttrib3fv(indx, values);
+       ovr_glVertexAttrib3fv(indx, values);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1730,7 +1730,7 @@ void
 glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttrib4f(indx, x, y, z, w);
+       ovr_glVertexAttrib4f(indx, x, y, z, w);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1742,7 +1742,7 @@ void
 glVertexAttrib4fv(GLuint indx, const GLfloat* values)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttrib4fv(indx, values);
+       ovr_glVertexAttrib4fv(indx, values);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1754,7 +1754,7 @@ void
 glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
+       ovr_glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1766,7 +1766,7 @@ void
 glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glViewport(x, y, width, height);
+       ovr_glViewport(x, y, width, height);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1780,7 +1780,7 @@ void
 glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glEGLImageTargetTexture2DOES(target, image);
+       ovr_glEGLImageTargetTexture2DOES(target, image);
        goto finish;
 
 finish:
@@ -1791,7 +1791,7 @@ void
 glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glEGLImageTargetRenderbufferStorageOES(target, image);
+       ovr_glEGLImageTargetRenderbufferStorageOES(target, image);
        goto finish;
 
 finish:
@@ -1802,7 +1802,7 @@ void
 glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei* length, GLenum* binaryFormat, void* binary)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glGetProgramBinary(program, bufsize, length, binaryFormat, binary);
+       ovr_glGetProgramBinary(program, bufsize, length, binaryFormat, binary);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1814,7 +1814,7 @@ void
 glProgramBinary(GLuint program, GLenum binaryFormat, const void* binary, GLint length)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glProgramBinary(program, binaryFormat, binary, length);
+       ovr_glProgramBinary(program, binaryFormat, binary, length);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1827,7 +1827,7 @@ void
 glProgramParameteri(GLuint program, GLuint pname, GLint value)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glProgramParameteri(program, pname, value);
+       ovr_glProgramParameteri(program, pname, value);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1839,7 +1839,7 @@ void
 glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);
+       ovr_glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
@@ -1851,7 +1851,19 @@ void
 glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples)
 {
        _COREGL_WRAP_FUNC_BEGIN();
-       glsym_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples);
+       ovr_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples);
+       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       goto finish;
+
+finish:
+       _COREGL_WRAP_FUNC_END();
+}
+
+void
+glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+       _COREGL_WRAP_FUNC_BEGIN();
+       ovr_glDiscardFramebufferEXT(target, numAttachments, attachments);
        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
index 17ed9d6..d31a675 100644 (file)
@@ -1,7 +1,7 @@
 // Defult use-case for exporting symbols
 #ifndef _COREGL_SYMBOL
 #define _COREGL_SYMBOL_NOT_DEFINED
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_COREGL_NAME_MANGLE(FUNC_NAME)) PARAM_LIST;
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_API extern RET_TYPE FUNC_NAME PARAM_LIST;
 #endif
 
 // Standard EGL APIs
@@ -56,8 +56,8 @@ _COREGL_SYMBOL(GL_TRUE, void*, eglMapImageSEC, (EGLDisplay dpy, EGLImageKHR imag
 _COREGL_SYMBOL(GL_TRUE, EGLBoolean, eglUnmapImageSEC, (EGLDisplay dpy, EGLImageKHR image))
 _COREGL_SYMBOL(GL_TRUE, EGLBoolean, eglGetImageAttribSEC, (EGLDisplay dpy, EGLImageKHR image, EGLint attribute, EGLint *value))
 
-//_COREGL_SYMBOL(GL_FALSE, unsigned int, eglLockSurface, (EGLDisplay a, EGLSurface b, const int *attrib_list))
-//_COREGL_SYMBOL(GL_FALSE, unsigned int, eglUnlockSurface, (EGLDisplay a, EGLSurface b))
+_COREGL_SYMBOL(GL_TRUE, EGLBoolean, eglLockSurfaceKHR, (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list))
+_COREGL_SYMBOL(GL_TRUE, EGLBoolean, eglUnlockSurfaceKHR, (EGLDisplay display, EGLSurface surface))
 
 #ifdef _COREGL_SYMBOL_NOT_DEFINED
 #undef _COREGL_SYMBOL_NOT_DEFINED
index 23247a5..45b992d 100644 (file)
@@ -1,7 +1,7 @@
 // Defult use-case for exporting symbols
 #ifndef _COREGL_SYMBOL
 #define _COREGL_SYMBOL_NOT_DEFINED
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_COREGL_NAME_MANGLE(FUNC_NAME)) PARAM_LIST;
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_API extern RET_TYPE FUNC_NAME PARAM_LIST;
 #endif
 
 /* version 1: */
@@ -164,6 +164,7 @@ _COREGL_SYMBOL(GL_TRUE, void, glProgramBinary, (GLuint program, GLenum binaryFor
 _COREGL_SYMBOL(GL_TRUE, void, glProgramParameteri, (GLuint a, GLuint b, GLint d))
 _COREGL_SYMBOL(GL_TRUE, void, glRenderbufferStorageMultisampleEXT, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height))
 _COREGL_SYMBOL(GL_TRUE, void, glFramebufferTexture2DMultisampleEXT, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples))
+_COREGL_SYMBOL(GL_TRUE, void, glDiscardFramebufferEXT, (GLenum target, GLsizei numAttachments, const GLenum *attachments))
 
 #ifdef _COREGL_SYMBOL_NOT_DEFINED
 #undef _COREGL_SYMBOL_NOT_DEFINED