[Title] Major stabilizations
authorHaegeun Park <haegeun.park@samsung.com>
Tue, 9 Oct 2012 04:56:53 +0000 (21:56 -0700)
committerHaegeun Park <haegeun.park@samsung.com>
Tue, 9 Oct 2012 04:56:53 +0000 (21:56 -0700)
[Issue#] -
[Problem] -
[Cause] -
[Solution]
- Refactoring module overriding stack & eject condition
- If the GL call is failed in driver, internal state is not changed
- Tracing internal GL errors in soft-makecurrent
- Adding a GL program object reference counting & handling double-deletion
- Adding a relationship between shared object state and glue contexts

12 files changed:
src/coregl_export.c
src/coregl_internal.h
src/coregl_override.c
src/modules/appopt/coregl_appopt.c
src/modules/coregl_module.c
src/modules/coregl_module.h
src/modules/fastpath/coregl_fastpath.c
src/modules/fastpath/coregl_fastpath.h
src/modules/fastpath/coregl_fastpath_egl.c
src/modules/fastpath/coregl_fastpath_gl.c
src/modules/tracepath/coregl_tracepath.c
src/modules/tracepath/coregl_tracepath_gl.c

index 0752ba6..b9310b0 100644 (file)
@@ -9,9 +9,6 @@
 
 #include <stdlib.h>
 
-#define COREGL_OVERRIDE_API(mangle, func, prefix) \
-   mangle##func = prefix##func
-
 int export_initialized = 0;
 
 static void
@@ -36,8 +33,3 @@ init_export()
        _clean_overrides();
 }
 
-void
-deinit_export()
-{
-}
-
index 758c67e..fea902c 100644 (file)
@@ -49,12 +49,6 @@ typedef GLuint       GLuintmask;
 
 #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_OVERRIDE_API(mangle, func, prefix) \
    mangle##func = prefix##func
 
@@ -116,6 +110,7 @@ extern void                deinit_export();
 // Module interfaces
 extern void                init_modules();
 extern void                deinit_modules();
+extern void                reset_modules_override();
 extern void                init_modules_tstate(GLThreadState *tstate);
 extern void                deinit_modules_tstate(GLThreadState *tstate);
 
index 536c0da..b1b5486 100644 (file)
@@ -3,9 +3,6 @@
 
 #include <stdlib.h>
 
-#define COREGL_OVERRIDE_API(mangle, func, prefix) \
-   mangle##func = prefix##func
-
 void
 init_overrides()
 {
index 3337f6b..ed54703 100644 (file)
@@ -51,29 +51,20 @@ appopt_apply_overrides()
        //appopt_apply_overrides_gl(1);
 }
 
-#define OVERRIDE(f) \
-       if (enable == 1) \
-       { \
-               COREGL_OVERRIDE_API(_orig_appopt_, f, ovr_); \
-               COREGL_OVERRIDE_API(ovr_, f, appopt_); \
-       } \
-       else \
-       { \
-               AST(ovr_##f != NULL); \
-               COREGL_OVERRIDE_API(ovr_, f, _orig_appopt_); \
-               _orig_appopt_##f = NULL; \
-       }
-
 void
 appopt_apply_overrides_egl(int enable)
 {
-       // Fast-Path Core Functions
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_INIT_ORIGINAL(_orig_appopt_, FUNC_NAME);
+# include "../../headers/sym_egl.h"
+#undef _COREGL_SYMBOL
 }
 
 void
 appopt_apply_overrides_gl(int enable)
 {
-       // Fast-Path Functions
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_INIT_ORIGINAL(_orig_appopt_, FUNC_NAME);
+# include "../../headers/sym_gl.h"
+#undef _COREGL_SYMBOL
 }
 
 #undef A_ORD
index 42ad0e3..87bb58d 100644 (file)
 void
 init_modules()
 {
-       // Step 1 : Initialization
-       init_export();
-
-       // Step 2 : User Define Modules : Sequence is important! (Last module's API is called first)
        init_modules_fastpath();
        init_modules_appopt();
-
-       // Step 3 : Common Wrapping Modules
        init_modules_tracepath();
+
+       reset_modules_override();
 }
 
 void
 deinit_modules()
 {
-       // Step 1(rollback init 3) : Common Wrapping Modules
        deinit_modules_tracepath();
-
-       // Step 2(rollback init 2) : User Define Modules : Sequence is important!
        deinit_modules_appopt();
        deinit_modules_fastpath();
+}
 
-       // Step 3(rollback init 1) : De-Initialization
-       deinit_export();
+void
+reset_modules_override()
+{
+       // Step 1 : Initialization
+       init_export();
+
+       // Step 2 : User Define Modules : Sequence is important! (Last module's API is called first)
+       fastpath_apply_overrides();
+       appopt_apply_overrides();
+
+       // Step 3 : Common Wrapping Modules
+       tracepath_apply_overrides();
 }
 
 void
index c4c3333..3ca2cca 100644 (file)
@@ -21,5 +21,29 @@ typedef enum
        else \
                val = NULL
 
+#define COREGL_OVERRIDE_API(mangle, func, prefix) \
+   mangle##func = prefix##func
+
+#define COREGL_INIT_ORIGINAL(orig_prefix, f) \
+{ \
+       if (enable == 1) \
+       { \
+               AST(orig_prefix##f == NULL); \
+               COREGL_OVERRIDE_API(orig_prefix, f, ovr_); \
+       } \
+       else \
+       { \
+               AST(ovr_##f != NULL); \
+               COREGL_OVERRIDE_API(ovr_, f, orig_prefix); \
+               orig_prefix##f = NULL; \
+       } \
+}
+
+#define COREGL_OVERRIDE(prefix, f) \
+       if (enable == 1) \
+       { \
+               COREGL_OVERRIDE_API(ovr_, f, prefix); \
+       }
+
 #endif // COREGL_MODULE_H
 
index 85e935b..b5ccde6 100644 (file)
@@ -34,14 +34,14 @@ _get_texture_states(GLenum pname, GLint *params)
 
        AST(initial_ctx != NULL);
 
-       _sym_glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint *)&cur_active_tex);
+       _orig_fastpath_glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint *)&cur_active_tex);
        int i;
        for (i = 0; i < initial_ctx->gl_num_tex_units[0]; i++)
        {
-               _sym_glActiveTexture(GL_TEXTURE0 + i);
-               _sym_glGetIntegerv(pname, &(((GLint *)params)[i]));
+               _orig_fastpath_glActiveTexture(GL_TEXTURE0 + i);
+               _orig_fastpath_glGetIntegerv(pname, &(((GLint *)params)[i]));
        }
-       _sym_glActiveTexture(cur_active_tex);
+       _orig_fastpath_glActiveTexture(cur_active_tex);
 }
 
 static GLuint
@@ -49,7 +49,7 @@ _get_stencil_max_mask()
 {
        GLuint stencil_bit = 0;
 
-       _sym_glGetIntegerv(GL_STENCIL_BITS, (GLint *)&stencil_bit);
+       _orig_fastpath_glGetIntegerv(GL_STENCIL_BITS, (GLint *)&stencil_bit);
        return (1 << stencil_bit) - 1;
 }
 
@@ -84,8 +84,6 @@ init_modules_fastpath()
 
        debug_nofp = atoi(get_env_setting("COREGL_DEBUG_NOFP"));
 
-       fastpath_apply_overrides();
-
 }
 
 void
@@ -108,8 +106,8 @@ deinit_modules_fastpath()
                        {
                                ERR("\E[0;31;1mWARNING : Context attached to [dpy=%p|rctx=%p] has not been completely destroyed.(leak)\E[0m\n", current->cstate->rdpy, current->cstate->rctx);
 
-                               _sym_eglMakeCurrent(current->cstate->rdpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-                               _sym_eglDestroyContext(current->cstate->rdpy, current->cstate->rctx);
+                               _orig_fastpath_eglMakeCurrent(current->cstate->rdpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+                               _orig_fastpath_eglDestroyContext(current->cstate->rdpy, current->cstate->rctx);
 
                                fastpath_remove_context_states_from_list(current->cstate, NULL);
                                retry_destroy = 1;
@@ -167,153 +165,142 @@ fastpath_apply_overrides()
        }
 }
 
-#define OVERRIDE(f) \
-       if (enable == 1) \
-       { \
-               COREGL_OVERRIDE_API(_orig_fastpath_, f, ovr_); \
-               COREGL_OVERRIDE_API(ovr_, f, fastpath_); \
-       } \
-       else \
-       { \
-               AST(ovr_##f != NULL); \
-               COREGL_OVERRIDE_API(ovr_, f, _orig_fastpath_); \
-               _orig_fastpath_##f = NULL; \
-       }
 
 void
 fastpath_apply_overrides_egl(int enable)
 {
-       // Fast-Path Core Functions
-       OVERRIDE(eglGetProcAddress);
-
-       OVERRIDE(eglBindAPI);
-       OVERRIDE(eglQueryAPI);
-
-       OVERRIDE(eglCreateContext);
-       OVERRIDE(eglCreateImageKHR);
-       OVERRIDE(eglMakeCurrent);
-       OVERRIDE(eglDestroyContext);
-       OVERRIDE(eglQueryContext);
-       OVERRIDE(eglGetCurrentContext);
-       OVERRIDE(eglReleaseThread);
-       OVERRIDE(eglGetCurrentSurface);
-       OVERRIDE(eglTerminate);
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_INIT_ORIGINAL(_orig_fastpath_, FUNC_NAME);
+# include "../../headers/sym_egl.h"
+#undef _COREGL_SYMBOL
+
+       COREGL_OVERRIDE(fastpath_, eglGetProcAddress);
+
+       COREGL_OVERRIDE(fastpath_, eglBindAPI);
+       COREGL_OVERRIDE(fastpath_, eglQueryAPI);
+
+       COREGL_OVERRIDE(fastpath_, eglCreateContext);
+       COREGL_OVERRIDE(fastpath_, eglCreateImageKHR);
+       COREGL_OVERRIDE(fastpath_, eglMakeCurrent);
+       COREGL_OVERRIDE(fastpath_, eglDestroyContext);
+       COREGL_OVERRIDE(fastpath_, eglQueryContext);
+       COREGL_OVERRIDE(fastpath_, eglGetCurrentContext);
+       COREGL_OVERRIDE(fastpath_, eglReleaseThread);
+       COREGL_OVERRIDE(fastpath_, eglGetCurrentSurface);
+       COREGL_OVERRIDE(fastpath_, eglTerminate);
 
 }
 
 void
 fastpath_apply_overrides_gl(int enable)
 {
-       // Fast-Path Functions
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_INIT_ORIGINAL(_orig_fastpath_, FUNC_NAME);
+# include "../../headers/sym_gl.h"
+#undef _COREGL_SYMBOL
+
        if (debug_nofp != 1)
        {
-               OVERRIDE(glGetError);
-
-               OVERRIDE(glGetIntegerv);
-               OVERRIDE(glGetFloatv);
-               OVERRIDE(glGetBooleanv);
-
-               OVERRIDE(glActiveTexture);
-               OVERRIDE(glGenTextures);
-               OVERRIDE(glBindTexture);
-               OVERRIDE(glIsTexture);
-               OVERRIDE(glDeleteTextures);
-               OVERRIDE(glFramebufferTexture2D);
-               OVERRIDE(glFramebufferTexture2DMultisampleEXT);
-
-               OVERRIDE(glGenBuffers);
-               OVERRIDE(glBindBuffer);
-               OVERRIDE(glIsBuffer);
-               OVERRIDE(glDeleteBuffers);
-
-               OVERRIDE(glGenFramebuffers);
-               OVERRIDE(glBindFramebuffer);
-               OVERRIDE(glIsFramebuffer);
-               OVERRIDE(glDeleteFramebuffers);
-
-               OVERRIDE(glGenRenderbuffers);
-               OVERRIDE(glBindRenderbuffer);
-               OVERRIDE(glFramebufferRenderbuffer);
-               OVERRIDE(glIsRenderbuffer);
-               OVERRIDE(glDeleteRenderbuffers);
-
-               OVERRIDE(glCreateShader);
-               OVERRIDE(glCreateProgram);
-               OVERRIDE(glAttachShader);
-               OVERRIDE(glCompileShader);
-               OVERRIDE(glShaderBinary);
-               OVERRIDE(glDeleteShader);
-               OVERRIDE(glDetachShader);
-               OVERRIDE(glGetShaderiv);
-               OVERRIDE(glGetShaderInfoLog);
-               OVERRIDE(glGetShaderSource);
-               OVERRIDE(glIsShader);
-               OVERRIDE(glShaderSource);
-               OVERRIDE(glBindAttribLocation);
-               OVERRIDE(glDeleteProgram);
-               OVERRIDE(glGetActiveAttrib);
-               OVERRIDE(glGetActiveUniform);
-               OVERRIDE(glGetAttachedShaders);
-               OVERRIDE(glGetAttribLocation);
-               OVERRIDE(glGetProgramiv);
-               OVERRIDE(glGetProgramInfoLog);
-               OVERRIDE(glGetUniformfv);
-               OVERRIDE(glGetUniformiv);
-               OVERRIDE(glGetUniformLocation);
-               OVERRIDE(glIsProgram);
-               OVERRIDE(glLinkProgram);
-               OVERRIDE(glUseProgram);
-               OVERRIDE(glValidateProgram);
-               OVERRIDE(glGetProgramBinary);
-               OVERRIDE(glProgramBinary);
-
-               OVERRIDE(glBlendColor);
-               OVERRIDE(glBlendEquation);
-               OVERRIDE(glBlendEquationSeparate);
-               OVERRIDE(glBlendFunc);
-               OVERRIDE(glBlendFuncSeparate);
-               OVERRIDE(glClearColor);
-               OVERRIDE(glClearDepthf);
-               OVERRIDE(glClearStencil);
-               OVERRIDE(glColorMask);
-               OVERRIDE(glCullFace);
-               OVERRIDE(glDepthFunc);
-               OVERRIDE(glDepthMask);
-               OVERRIDE(glDepthRangef);
-               OVERRIDE(glDisable);
-               OVERRIDE(glDisableVertexAttribArray);
-               OVERRIDE(glDrawArrays);
-               OVERRIDE(glDrawElements);
-               OVERRIDE(glEnable);
-               OVERRIDE(glEnableVertexAttribArray);
-               OVERRIDE(glFrontFace);
-               OVERRIDE(glGetVertexAttribfv);
-               OVERRIDE(glGetVertexAttribiv);
-               OVERRIDE(glGetVertexAttribPointerv);
-               OVERRIDE(glHint);
-               OVERRIDE(glLineWidth);
-               OVERRIDE(glPixelStorei);
-               OVERRIDE(glPolygonOffset);
-               OVERRIDE(glSampleCoverage);
-               OVERRIDE(glScissor);
-               OVERRIDE(glStencilFunc);
-               OVERRIDE(glStencilFuncSeparate);
-               OVERRIDE(glStencilMask);
-               OVERRIDE(glStencilMaskSeparate);
-               OVERRIDE(glStencilOp);
-               OVERRIDE(glStencilOpSeparate);
-               OVERRIDE(glVertexAttrib1f);
-               OVERRIDE(glVertexAttrib1fv);
-               OVERRIDE(glVertexAttrib2f);
-               OVERRIDE(glVertexAttrib2fv);
-               OVERRIDE(glVertexAttrib3f);
-               OVERRIDE(glVertexAttrib3fv);
-               OVERRIDE(glVertexAttrib4f);
-               OVERRIDE(glVertexAttrib4fv);
-               OVERRIDE(glVertexAttribPointer);
-               OVERRIDE(glViewport);
-
-               OVERRIDE(glEGLImageTargetTexture2DOES);
+               COREGL_OVERRIDE(fastpath_, glGetError);
+
+               COREGL_OVERRIDE(fastpath_, glGetIntegerv);
+               COREGL_OVERRIDE(fastpath_, glGetFloatv);
+               COREGL_OVERRIDE(fastpath_, glGetBooleanv);
+
+               COREGL_OVERRIDE(fastpath_, glActiveTexture);
+               COREGL_OVERRIDE(fastpath_, glGenTextures);
+               COREGL_OVERRIDE(fastpath_, glBindTexture);
+               COREGL_OVERRIDE(fastpath_, glIsTexture);
+               COREGL_OVERRIDE(fastpath_, glDeleteTextures);
+               COREGL_OVERRIDE(fastpath_, glFramebufferTexture2D);
+               COREGL_OVERRIDE(fastpath_, glFramebufferTexture2DMultisampleEXT);
+
+               COREGL_OVERRIDE(fastpath_, glGenBuffers);
+               COREGL_OVERRIDE(fastpath_, glBindBuffer);
+               COREGL_OVERRIDE(fastpath_, glIsBuffer);
+               COREGL_OVERRIDE(fastpath_, glDeleteBuffers);
+
+               COREGL_OVERRIDE(fastpath_, glGenFramebuffers);
+               COREGL_OVERRIDE(fastpath_, glBindFramebuffer);
+               COREGL_OVERRIDE(fastpath_, glIsFramebuffer);
+               COREGL_OVERRIDE(fastpath_, glDeleteFramebuffers);
+
+               COREGL_OVERRIDE(fastpath_, glGenRenderbuffers);
+               COREGL_OVERRIDE(fastpath_, glBindRenderbuffer);
+               COREGL_OVERRIDE(fastpath_, glFramebufferRenderbuffer);
+               COREGL_OVERRIDE(fastpath_, glIsRenderbuffer);
+               COREGL_OVERRIDE(fastpath_, glDeleteRenderbuffers);
+
+               COREGL_OVERRIDE(fastpath_, glCreateShader);
+               COREGL_OVERRIDE(fastpath_, glCreateProgram);
+               COREGL_OVERRIDE(fastpath_, glAttachShader);
+               COREGL_OVERRIDE(fastpath_, glCompileShader);
+               COREGL_OVERRIDE(fastpath_, glShaderBinary);
+               COREGL_OVERRIDE(fastpath_, glDeleteShader);
+               COREGL_OVERRIDE(fastpath_, glDetachShader);
+               COREGL_OVERRIDE(fastpath_, glGetShaderiv);
+               COREGL_OVERRIDE(fastpath_, glGetShaderInfoLog);
+               COREGL_OVERRIDE(fastpath_, glGetShaderSource);
+               COREGL_OVERRIDE(fastpath_, glIsShader);
+               COREGL_OVERRIDE(fastpath_, glShaderSource);
+               COREGL_OVERRIDE(fastpath_, glBindAttribLocation);
+               COREGL_OVERRIDE(fastpath_, glDeleteProgram);
+               COREGL_OVERRIDE(fastpath_, glGetActiveAttrib);
+               COREGL_OVERRIDE(fastpath_, glGetActiveUniform);
+               COREGL_OVERRIDE(fastpath_, glGetAttachedShaders);
+               COREGL_OVERRIDE(fastpath_, glGetAttribLocation);
+               COREGL_OVERRIDE(fastpath_, glGetProgramiv);
+               COREGL_OVERRIDE(fastpath_, glGetProgramInfoLog);
+               COREGL_OVERRIDE(fastpath_, glGetUniformfv);
+               COREGL_OVERRIDE(fastpath_, glGetUniformiv);
+               COREGL_OVERRIDE(fastpath_, glGetUniformLocation);
+               COREGL_OVERRIDE(fastpath_, glIsProgram);
+               COREGL_OVERRIDE(fastpath_, glLinkProgram);
+               COREGL_OVERRIDE(fastpath_, glUseProgram);
+               COREGL_OVERRIDE(fastpath_, glValidateProgram);
+               COREGL_OVERRIDE(fastpath_, glGetProgramBinary);
+               COREGL_OVERRIDE(fastpath_, glProgramBinary);
+
+               COREGL_OVERRIDE(fastpath_, glBlendColor);
+               COREGL_OVERRIDE(fastpath_, glBlendEquation);
+               COREGL_OVERRIDE(fastpath_, glBlendEquationSeparate);
+               COREGL_OVERRIDE(fastpath_, glBlendFunc);
+               COREGL_OVERRIDE(fastpath_, glBlendFuncSeparate);
+               COREGL_OVERRIDE(fastpath_, glClearColor);
+               COREGL_OVERRIDE(fastpath_, glClearDepthf);
+               COREGL_OVERRIDE(fastpath_, glClearStencil);
+               COREGL_OVERRIDE(fastpath_, glColorMask);
+               COREGL_OVERRIDE(fastpath_, glCullFace);
+               COREGL_OVERRIDE(fastpath_, glDepthFunc);
+               COREGL_OVERRIDE(fastpath_, glDepthMask);
+               COREGL_OVERRIDE(fastpath_, glDepthRangef);
+               COREGL_OVERRIDE(fastpath_, glDisable);
+               COREGL_OVERRIDE(fastpath_, glDisableVertexAttribArray);
+               COREGL_OVERRIDE(fastpath_, glEnable);
+               COREGL_OVERRIDE(fastpath_, glEnableVertexAttribArray);
+               COREGL_OVERRIDE(fastpath_, glFrontFace);
+               COREGL_OVERRIDE(fastpath_, glHint);
+               COREGL_OVERRIDE(fastpath_, glLineWidth);
+               COREGL_OVERRIDE(fastpath_, glPixelStorei);
+               COREGL_OVERRIDE(fastpath_, glPolygonOffset);
+               COREGL_OVERRIDE(fastpath_, glSampleCoverage);
+               COREGL_OVERRIDE(fastpath_, glScissor);
+               COREGL_OVERRIDE(fastpath_, glStencilFunc);
+               COREGL_OVERRIDE(fastpath_, glStencilFuncSeparate);
+               COREGL_OVERRIDE(fastpath_, glStencilMask);
+               COREGL_OVERRIDE(fastpath_, glStencilMaskSeparate);
+               COREGL_OVERRIDE(fastpath_, glStencilOp);
+               COREGL_OVERRIDE(fastpath_, glStencilOpSeparate);
+               COREGL_OVERRIDE(fastpath_, glVertexAttrib1f);
+               COREGL_OVERRIDE(fastpath_, glVertexAttrib1fv);
+               COREGL_OVERRIDE(fastpath_, glVertexAttrib2f);
+               COREGL_OVERRIDE(fastpath_, glVertexAttrib2fv);
+               COREGL_OVERRIDE(fastpath_, glVertexAttrib3f);
+               COREGL_OVERRIDE(fastpath_, glVertexAttrib3fv);
+               COREGL_OVERRIDE(fastpath_, glVertexAttrib4f);
+               COREGL_OVERRIDE(fastpath_, glVertexAttrib4fv);
+               COREGL_OVERRIDE(fastpath_, glVertexAttribPointer);
+               COREGL_OVERRIDE(fastpath_, glViewport);
+
+               COREGL_OVERRIDE(fastpath_, glEGLImageTargetTexture2DOES);
 
        }
        else
@@ -502,6 +489,7 @@ fastpath_sostate_create_object(GL_Shared_Object_State *sostate, GL_Object_Type t
                        GL_Object *newobj = (GL_Object *)calloc(1, sizeof(GL_Object));
                        newobj->id = (int)type + i;
                        newobj->real_id = real_name;
+                       newobj->ref_count = 1;
                        object[i] = newobj;
                        ret = newobj->id;
                        goto finish;
@@ -532,8 +520,14 @@ fastpath_sostate_remove_object(GL_Shared_Object_State *sostate, GL_Object_Type t
                goto finish;
        }
 
-       free(object[hash]);
-       object[hash] = NULL;
+       object[hash]->ref_count--;
+
+       if (object[hash]->ref_count <= 0)
+       {
+               free(object[hash]);
+               object[hash] = NULL;
+       }
+
        ret = 1;
        goto finish;
 
@@ -566,6 +560,57 @@ finish:
        return ret;
 }
 
+GLint
+fastpath_sostate_set_object_tag(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name, GLvoid *tag)
+{
+       GL_Object **object = NULL;
+       GLint ret = _COREGL_INT_INIT_VALUE;
+       int hash = _COREGL_INT_INIT_VALUE;
+
+       object = _get_shared_object(sostate, type);
+
+       hash = glue_name - (int)type;
+       if (hash < 0 ||
+           hash > MAX_GL_OBJECT_SIZE ||
+           object[hash] == NULL ||
+           object[hash]->id != glue_name)
+       {
+               ret = 0;
+               goto finish;
+       }
+       object[hash]->tag = tag;
+       ret = 1;
+       goto finish;
+
+finish:
+       return ret;
+}
+
+GLvoid *
+fastpath_sostate_get_object_tag(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name)
+{
+       GL_Object **object = NULL;
+       GLvoid *ret = NULL;
+       int hash = _COREGL_INT_INIT_VALUE;
+
+       object = _get_shared_object(sostate, type);
+
+       hash = glue_name - (int)type;
+       if (hash < 0 ||
+           hash > MAX_GL_OBJECT_SIZE ||
+           object[hash] == NULL ||
+           object[hash]->id != glue_name)
+       {
+               ret = NULL;
+               goto finish;
+       }
+       ret = object[hash]->tag;
+       goto finish;
+
+finish:
+       return ret;
+}
+
 GLuint
 fastpath_sostate_find_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint real_name)
 {
@@ -590,6 +635,32 @@ finish:
        return ret;
 }
 
+GLint
+fastpath_sostate_use_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name)
+{
+       GL_Object **object = NULL;
+       GLint ret = 0;
+       int hash = _COREGL_INT_INIT_VALUE;
+
+       object = _get_shared_object(sostate, type);
+
+       hash = glue_name - (int)type;
+       if (hash < 0 ||
+           hash > MAX_GL_OBJECT_SIZE ||
+           object[hash] == NULL ||
+           object[hash]->id != glue_name)
+       {
+               ret = 0;
+               goto finish;
+       }
+       object[hash]->ref_count++;
+       ret = 1;
+       goto finish;
+
+finish:
+       return ret;
+}
+
 void
 fastpath_dump_context_states(GLGlueContext *ctx, int force_output)
 {
@@ -808,16 +879,36 @@ extern void *tracepath_api_trace_begin(const char *name, void *hint, int trace_t
 extern void *tracepath_api_trace_end(const char *name, void *hint, int trace_total_time);
 #endif
 
-void
+#define CHECK_GL_ERROR(func) \
+       { \
+               func; \
+               int err = _orig_fastpath_glGetError(); \
+               if (err != GL_NO_ERROR) \
+               { \
+                       printf("\E[0;31;1mERROR(GL %p) : %s returns GL error 0x%X\E[0m\n", oldctx->cstate, #func, err); \
+                       goto finish; \
+               } \
+       }
+
+int
 fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
 {
+       int ret = 0;
        unsigned char flag = 0;
        int i = 0;
 
-       if (debug_nofp == 1) goto finish;
+       if (debug_nofp == 1)
+       {
+               ret = 1;
+               goto finish;
+       }
 
        // Return if they're the same
-       if (oldctx == newctx) goto finish;
+       if (oldctx == newctx)
+       {
+               ret = 1;
+               goto finish;
+       }
 
 #define STATE_COMPARE(state) \
    if ((oldctx->state) != (newctx->state))
@@ -831,7 +922,13 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        trace_hint_glfinish = tracepath_api_trace_begin("eglMakeCurrent(FP glFinish)", trace_hint_glfinish, 0);
 #endif // COREGL_USE_MODULE_TRACEPATH
 
-       _sym_glFlush();
+       {
+               int err = _orig_fastpath_glGetError();
+               if (err != GL_NO_ERROR && oldctx->gl_error == GL_NO_ERROR)
+                       oldctx->gl_error = err;
+       }
+
+       CHECK_GL_ERROR(_orig_fastpath_glFlush())
 
 #ifdef COREGL_USE_MODULE_TRACEPATH
        tracepath_api_trace_end("eglMakeCurrent(FP glFinish)", trace_hint_glfinish, 0);
@@ -842,6 +939,7 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        trace_hint_bindbuffers = tracepath_api_trace_begin("eglMakeCurrent(FP bind buffers)", trace_hint_bindbuffers, 0);
 #endif // COREGL_USE_MODULE_TRACEPATH
 
+
        //------------------//
        // _bind_flag
        flag = oldctx->_bind_flag | newctx->_bind_flag;
@@ -849,19 +947,19 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        {
                STATE_COMPARE(gl_array_buffer_binding[0])
                {
-                       _sym_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding[0]))
                }
                STATE_COMPARE(gl_element_array_buffer_binding[0])
                {
-                       _sym_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding[0]))
                }
                STATE_COMPARE(gl_framebuffer_binding[0])
                {
-                       _sym_glBindFramebuffer(GL_FRAMEBUFFER, newctx->gl_framebuffer_binding[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_FRAMEBUFFER, newctx->gl_framebuffer_binding[0]))
                }
                STATE_COMPARE(gl_renderbuffer_binding[0])
                {
-                       _sym_glBindRenderbuffer(GL_RENDERBUFFER, newctx->gl_renderbuffer_binding[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBindRenderbuffer(GL_RENDERBUFFER, newctx->gl_renderbuffer_binding[0]))
                }
        }
 
@@ -884,31 +982,39 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                STATE_COMPARE(gl_blend[0])
                {
                        if (newctx->gl_blend[0])
-                               _sym_glEnable(GL_BLEND);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_BLEND))
+                       }
                        else
-                               _sym_glDisable(GL_BLEND);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_BLEND))
+                       }
                STATE_COMPARE(gl_cull_face[0])
                {
                        if (newctx->gl_cull_face[0])
-                               _sym_glEnable(GL_CULL_FACE);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_CULL_FACE))
+                       }
                        else
-                               _sym_glDisable(GL_CULL_FACE);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_CULL_FACE))
+                       }
                STATE_COMPARE(gl_depth_test[0])
                {
                        if (newctx->gl_depth_test[0])
-                               _sym_glEnable(GL_DEPTH_TEST);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_DEPTH_TEST))
+                       }
                        else
-                               _sym_glDisable(GL_DEPTH_TEST);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_DEPTH_TEST))
+                       }
                STATE_COMPARE(gl_dither[0])
                {
                        if (newctx->gl_dither[0])
-                               _sym_glEnable(GL_DITHER);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_DITHER))
+                       }
                        else
-                               _sym_glDisable(GL_DITHER);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_DITHER))
+                       }
        }
 
        // _enable_flag2
@@ -918,38 +1024,48 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                STATE_COMPARE(gl_polygon_offset_fill[0])
                {
                        if (newctx->gl_polygon_offset_fill[0])
-                               _sym_glEnable(GL_POLYGON_OFFSET_FILL);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_POLYGON_OFFSET_FILL))
+                       }
                        else
-                               _sym_glDisable(GL_POLYGON_OFFSET_FILL);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_POLYGON_OFFSET_FILL))
+                       }
                STATE_COMPARE(gl_sample_alpha_to_coverage[0])
                {
                        if (newctx->gl_sample_alpha_to_coverage[0])
-                               _sym_glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE))
+                       }
                        else
-                               _sym_glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE))
+                       }
                STATE_COMPARE(gl_sample_coverage[0])
                {
                        if (newctx->gl_sample_coverage[0])
-                               _sym_glEnable(GL_SAMPLE_COVERAGE);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SAMPLE_COVERAGE))
+                       }
                        else
-                               _sym_glDisable(GL_SAMPLE_COVERAGE);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SAMPLE_COVERAGE))
+                       }
                STATE_COMPARE(gl_scissor_test[0])
                {
                        if (newctx->gl_scissor_test[0])
-                               _sym_glEnable(GL_SCISSOR_TEST);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SCISSOR_TEST))
+                       }
                        else
-                               _sym_glDisable(GL_SCISSOR_TEST);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SCISSOR_TEST))
+                       }
                STATE_COMPARE(gl_stencil_test[0])
                {
                        if (newctx->gl_stencil_test[0])
-                               _sym_glEnable(GL_STENCIL_TEST);
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_STENCIL_TEST))
+                       }
                        else
-                               _sym_glDisable(GL_STENCIL_TEST);
-               }
+                               CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_STENCIL_TEST))
+                       }
        }
 
 #ifdef COREGL_USE_MODULE_TRACEPATH
@@ -969,22 +1085,22 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                // Viewport.
                STATES_COMPARE(gl_viewport, 4 * sizeof(GLint))
                {
-                       _sym_glViewport(newctx->gl_viewport[0],
-                                       newctx->gl_viewport[1],
-                                       newctx->gl_viewport[2],
-                                       newctx->gl_viewport[3]);
+                       CHECK_GL_ERROR(_orig_fastpath_glViewport(newctx->gl_viewport[0],
+                                      newctx->gl_viewport[1],
+                                      newctx->gl_viewport[2],
+                                      newctx->gl_viewport[3]))
                }
 
                STATE_COMPARE(gl_current_program[0])
                {
-                       _sym_glUseProgram(newctx->gl_current_program[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glUseProgram(newctx->gl_current_program[0]))
                }
                STATES_COMPARE(gl_color_clear_value, 4 * sizeof(GLclampf))
                {
-                       _sym_glClearColor(newctx->gl_color_clear_value[0],
-                                         newctx->gl_color_clear_value[1],
-                                         newctx->gl_color_clear_value[2],
-                                         newctx->gl_color_clear_value[3]);
+                       CHECK_GL_ERROR(_orig_fastpath_glClearColor(newctx->gl_color_clear_value[0],
+                                      newctx->gl_color_clear_value[1],
+                                      newctx->gl_color_clear_value[2],
+                                      newctx->gl_color_clear_value[3]))
                }
        }
 
@@ -995,31 +1111,31 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        {
                STATES_COMPARE(gl_color_writemask, 4 * sizeof(GLboolean))
                {
-                       _sym_glColorMask(newctx->gl_color_writemask[0],
-                                        newctx->gl_color_writemask[1],
-                                        newctx->gl_color_writemask[2],
-                                        newctx->gl_color_writemask[3]);
+                       CHECK_GL_ERROR(_orig_fastpath_glColorMask(newctx->gl_color_writemask[0],
+                                      newctx->gl_color_writemask[1],
+                                      newctx->gl_color_writemask[2],
+                                      newctx->gl_color_writemask[3]))
                }
                STATES_COMPARE(gl_depth_range, 2 * sizeof(GLclampf))
                {
-                       _sym_glDepthRangef(newctx->gl_depth_range[0],
-                                          newctx->gl_depth_range[1]);
+                       CHECK_GL_ERROR(_orig_fastpath_glDepthRangef(newctx->gl_depth_range[0],
+                                      newctx->gl_depth_range[1]))
                }
                STATE_COMPARE(gl_depth_clear_value[0])
                {
-                       _sym_glClearDepthf(newctx->gl_depth_clear_value[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glClearDepthf(newctx->gl_depth_clear_value[0]))
                }
                STATE_COMPARE(gl_depth_func[0])
                {
-                       _sym_glDepthFunc(newctx->gl_depth_func[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glDepthFunc(newctx->gl_depth_func[0]))
                }
                STATE_COMPARE(gl_depth_writemask[0])
                {
-                       _sym_glDepthMask(newctx->gl_depth_writemask[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glDepthMask(newctx->gl_depth_writemask[0]))
                }
                STATE_COMPARE(gl_cull_face_mode[0])
                {
-                       _sym_glCullFace(newctx->gl_cull_face_mode[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glCullFace(newctx->gl_cull_face_mode[0]))
                }
 
        }
@@ -1043,23 +1159,23 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                {
                        STATE_COMPARE(gl_tex_2d_state[i])
                        {
-                               _sym_glActiveTexture(GL_TEXTURE0 + i);
-                               _sym_glBindTexture(GL_TEXTURE_2D, newctx->gl_tex_2d_state[i]);
+                               CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
+                               CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_2D, newctx->gl_tex_2d_state[i]))
                        }
 
                        STATE_COMPARE(gl_tex_cube_state[i])
                        {
-                               _sym_glActiveTexture(GL_TEXTURE0 + i);
-                               _sym_glBindTexture(GL_TEXTURE_CUBE_MAP, newctx->gl_tex_cube_state[i]);
+                               CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
+                               CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_CUBE_MAP, newctx->gl_tex_cube_state[i]))
                        }
                }
 
                // Restore active texture
-               _sym_glActiveTexture(newctx->gl_active_texture[0]);
+               CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(newctx->gl_active_texture[0]))
 
                STATE_COMPARE(gl_generate_mipmap_hint[0])
                {
-                       _sym_glHint(GL_GENERATE_MIPMAP_HINT, newctx->gl_generate_mipmap_hint[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glHint(GL_GENERATE_MIPMAP_HINT, newctx->gl_generate_mipmap_hint[0]))
                }
        }
 #ifdef COREGL_USE_MODULE_TRACEPATH
@@ -1077,25 +1193,25 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        {
                STATES_COMPARE(gl_blend_color, 4 * sizeof(GLclampf))
                {
-                       _sym_glBlendColor(newctx->gl_blend_color[0],
-                                         newctx->gl_blend_color[1],
-                                         newctx->gl_blend_color[2],
-                                         newctx->gl_blend_color[3]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBlendColor(newctx->gl_blend_color[0],
+                                      newctx->gl_blend_color[1],
+                                      newctx->gl_blend_color[2],
+                                      newctx->gl_blend_color[3]))
                }
                if ((oldctx->gl_blend_src_rgb[0] != newctx->gl_blend_src_rgb[0]) ||
                    (oldctx->gl_blend_dst_rgb[0] != newctx->gl_blend_dst_rgb[0]) ||
                    (oldctx->gl_blend_src_alpha[0] != newctx->gl_blend_src_alpha[0]) ||
                    (oldctx->gl_blend_dst_alpha[0] != newctx->gl_blend_dst_alpha[0]))
                {
-                       _sym_glBlendFuncSeparate(newctx->gl_blend_src_rgb[0],
-                                                newctx->gl_blend_dst_rgb[0],
-                                                newctx->gl_blend_src_alpha[0],
-                                                newctx->gl_blend_dst_alpha[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBlendFuncSeparate(newctx->gl_blend_src_rgb[0],
+                                      newctx->gl_blend_dst_rgb[0],
+                                      newctx->gl_blend_src_alpha[0],
+                                      newctx->gl_blend_dst_alpha[0]))
                }
                if ((oldctx->gl_blend_equation_rgb[0] != newctx->gl_blend_equation_rgb[0]) ||
                    (oldctx->gl_blend_equation_alpha[0] != newctx->gl_blend_equation_alpha[0]))
                {
-                       _sym_glBlendEquationSeparate(newctx->gl_blend_equation_rgb[0], newctx->gl_blend_equation_alpha[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBlendEquationSeparate(newctx->gl_blend_equation_rgb[0], newctx->gl_blend_equation_alpha[0]))
                }
 
        }
@@ -1109,24 +1225,24 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                    (oldctx->gl_stencil_ref[0]  != newctx->gl_stencil_ref[0])  ||
                    (oldctx->gl_stencil_value_mask[0] != newctx->gl_stencil_value_mask[0]))
                {
-                       _sym_glStencilFuncSeparate(GL_FRONT,
-                                                  newctx->gl_stencil_func[0],
-                                                  newctx->gl_stencil_ref[0],
-                                                  newctx->gl_stencil_value_mask[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glStencilFuncSeparate(GL_FRONT,
+                                      newctx->gl_stencil_func[0],
+                                      newctx->gl_stencil_ref[0],
+                                      newctx->gl_stencil_value_mask[0]))
                }
                if ((oldctx->gl_stencil_fail[0] != newctx->gl_stencil_fail[0]) ||
                    (oldctx->gl_stencil_pass_depth_fail[0] != newctx->gl_stencil_pass_depth_fail[0]) ||
                    (oldctx->gl_stencil_pass_depth_pass[0] != newctx->gl_stencil_pass_depth_pass[0]))
                {
-                       _sym_glStencilOpSeparate(GL_FRONT,
-                                                newctx->gl_stencil_fail[0],
-                                                newctx->gl_stencil_pass_depth_fail[0],
-                                                newctx->gl_stencil_pass_depth_pass[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glStencilOpSeparate(GL_FRONT,
+                                      newctx->gl_stencil_fail[0],
+                                      newctx->gl_stencil_pass_depth_fail[0],
+                                      newctx->gl_stencil_pass_depth_pass[0]))
                }
 
                STATE_COMPARE(gl_stencil_writemask[0])
                {
-                       _sym_glStencilMaskSeparate(GL_FRONT, newctx->gl_stencil_writemask[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glStencilMaskSeparate(GL_FRONT, newctx->gl_stencil_writemask[0]))
                }
        }
 
@@ -1139,28 +1255,28 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                    (oldctx->gl_stencil_back_ref[0]  != newctx->gl_stencil_back_ref[0])  ||
                    (oldctx->gl_stencil_back_value_mask[0] != newctx->gl_stencil_back_value_mask[0]))
                {
-                       _sym_glStencilFuncSeparate(GL_BACK,
-                                                  newctx->gl_stencil_back_func[0],
-                                                  newctx->gl_stencil_back_ref[0],
-                                                  newctx->gl_stencil_back_value_mask[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glStencilFuncSeparate(GL_BACK,
+                                      newctx->gl_stencil_back_func[0],
+                                      newctx->gl_stencil_back_ref[0],
+                                      newctx->gl_stencil_back_value_mask[0]))
                }
                if ((oldctx->gl_stencil_back_fail[0] != newctx->gl_stencil_back_fail[0]) ||
                    (oldctx->gl_stencil_back_pass_depth_fail[0] != newctx->gl_stencil_back_pass_depth_fail[0]) ||
                    (oldctx->gl_stencil_back_pass_depth_pass[0] != newctx->gl_stencil_back_pass_depth_pass[0]))
                {
-                       _sym_glStencilOpSeparate(GL_BACK,
-                                                newctx->gl_stencil_back_fail[0],
-                                                newctx->gl_stencil_back_pass_depth_fail[0],
-                                                newctx->gl_stencil_back_pass_depth_pass[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glStencilOpSeparate(GL_BACK,
+                                      newctx->gl_stencil_back_fail[0],
+                                      newctx->gl_stencil_back_pass_depth_fail[0],
+                                      newctx->gl_stencil_back_pass_depth_pass[0]))
                }
 
                STATE_COMPARE(gl_stencil_back_writemask[0])
                {
-                       _sym_glStencilMaskSeparate(GL_BACK, newctx->gl_stencil_back_writemask[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glStencilMaskSeparate(GL_BACK, newctx->gl_stencil_back_writemask[0]))
                }
                STATE_COMPARE(gl_stencil_clear_value[0])
                {
-                       _sym_glClearStencil(newctx->gl_stencil_clear_value[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glClearStencil(newctx->gl_stencil_clear_value[0]))
                }
        }
 
@@ -1171,23 +1287,23 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        {
                STATE_COMPARE(gl_front_face[0])
                {
-                       _sym_glFrontFace(newctx->gl_front_face[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glFrontFace(newctx->gl_front_face[0]))
                }
                STATE_COMPARE(gl_line_width[0])
                {
-                       _sym_glLineWidth(newctx->gl_line_width[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glLineWidth(newctx->gl_line_width[0]))
                }
                if ((oldctx->gl_polygon_offset_factor[0] != newctx->gl_polygon_offset_factor[0]) ||
                    (oldctx->gl_polygon_offset_units[0]  != newctx->gl_polygon_offset_units[0]))
                {
-                       _sym_glPolygonOffset(newctx->gl_polygon_offset_factor[0],
-                                            newctx->gl_polygon_offset_units[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glPolygonOffset(newctx->gl_polygon_offset_factor[0],
+                                      newctx->gl_polygon_offset_units[0]))
                }
                if ((oldctx->gl_sample_coverage_value[0]  != newctx->gl_sample_coverage_value[0]) ||
                    (oldctx->gl_sample_coverage_invert[0] != newctx->gl_sample_coverage_invert[0]))
                {
-                       _sym_glSampleCoverage(newctx->gl_sample_coverage_value[0],
-                                             newctx->gl_sample_coverage_invert[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glSampleCoverage(newctx->gl_sample_coverage_value[0],
+                                      newctx->gl_sample_coverage_invert[0]))
                }
        }
 
@@ -1197,18 +1313,18 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        {
                STATES_COMPARE(gl_scissor_box, 4 * sizeof(GLint))
                {
-                       _sym_glScissor(newctx->gl_scissor_box[0],
-                                      newctx->gl_scissor_box[1],
-                                      newctx->gl_scissor_box[2],
-                                      newctx->gl_scissor_box[3]);
+                       CHECK_GL_ERROR(_orig_fastpath_glScissor(newctx->gl_scissor_box[0],
+                                                               newctx->gl_scissor_box[1],
+                                                               newctx->gl_scissor_box[2],
+                                                               newctx->gl_scissor_box[3]))
                }
                STATE_COMPARE(gl_pack_alignment[0])
                {
-                       _sym_glPixelStorei(GL_PACK_ALIGNMENT, newctx->gl_pack_alignment[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_PACK_ALIGNMENT, newctx->gl_pack_alignment[0]))
                }
                STATE_COMPARE(gl_unpack_alignment[0])
                {
-                       _sym_glPixelStorei(GL_UNPACK_ALIGNMENT, newctx->gl_unpack_alignment[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_UNPACK_ALIGNMENT, newctx->gl_unpack_alignment[0]))
                }
        }
 #ifdef COREGL_USE_MODULE_TRACEPATH
@@ -1228,39 +1344,42 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                {
                        if (newctx->gl_vertex_array_buf_id[i] != oldctx->gl_vertex_array_buf_id[i])
                        {
-                               _sym_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_vertex_array_buf_id[i]);
+                               CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_vertex_array_buf_id[i]))
+                       }
+                       else
+                       {
+                               CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, 0))
                        }
-                       else _sym_glBindBuffer(GL_ARRAY_BUFFER, 0);
 
-                       _sym_glVertexAttribPointer(i,
-                                                  newctx->gl_vertex_array_size[i],
-                                                  newctx->gl_vertex_array_type[i],
-                                                  newctx->gl_vertex_array_normalized[i],
-                                                  newctx->gl_vertex_array_stride[i],
-                                                  newctx->gl_vertex_array_pointer[i]);
+                       CHECK_GL_ERROR(_orig_fastpath_glVertexAttribPointer(i,
+                                      newctx->gl_vertex_array_size[i],
+                                      newctx->gl_vertex_array_type[i],
+                                      newctx->gl_vertex_array_normalized[i],
+                                      newctx->gl_vertex_array_stride[i],
+                                      newctx->gl_vertex_array_pointer[i]))
 
                        STATES_COMPARE(gl_vertex_attrib_value + 4 * i, 4 * sizeof(GLfloat))
                        {
-                               _sym_glVertexAttrib4fv(i, &newctx->gl_vertex_attrib_value[4 * i]);
+                               CHECK_GL_ERROR(_orig_fastpath_glVertexAttrib4fv(i, &newctx->gl_vertex_attrib_value[4 * i]))
                        }
 
                        if (newctx->gl_vertex_array_enabled[i] == GL_TRUE)
                        {
-                               _sym_glEnableVertexAttribArray(i);
+                               CHECK_GL_ERROR(_orig_fastpath_glEnableVertexAttribArray(i))
                        }
                        else
                        {
-                               _sym_glDisableVertexAttribArray(i);
+                               CHECK_GL_ERROR(_orig_fastpath_glDisableVertexAttribArray(i))
                        }
                }
 
                STATE_COMPARE(gl_array_buffer_binding[0])
                {
-                       _sym_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding[0]))
                }
                STATE_COMPARE(gl_element_array_buffer_binding[0])
                {
-                       _sym_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding[0]);
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding[0]))
                }
 
        }
@@ -1269,6 +1388,7 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
        tracepath_api_trace_end("eglMakeCurrent(FP vertex attrib)", trace_hint_vertex_attrib, 0);
 #endif // COREGL_USE_MODULE_TRACEPATH
 
+       ret = 1;
        goto finish;
 
 finish:
@@ -1277,7 +1397,7 @@ finish:
        if (unlikely(trace_state_flag == 1))
                fastpath_dump_context_states(newctx, 0);
 #endif // COREGL_FASTPATH_TRACE_STATE_INFO
-       return;
+       return ret;
 #undef STATE_COMPARE
 #undef STATES_COMPARE
 }
index 09f9d9c..e3755a4 100644 (file)
@@ -127,13 +127,16 @@ typedef struct _GL_Object
 {
        GLuint                            id;
        GLuint                            real_id;
+       GLint                             ref_count;
+       GLvoid                            *tag;
 
        struct _GL_Shared_Object_State  *parent;
 } GL_Object;
 
 typedef struct _GL_Shared_Object_State
 {
-       int                    ref_count;
+       int                      ref_count;
+       General_Trace_List      *using_gctxs;
 
        GL_Object              *texture[MAX_GL_OBJECT_SIZE];
        GL_Object              *buffer[MAX_GL_OBJECT_SIZE];
@@ -208,7 +211,7 @@ extern void                fastpath_apply_overrides_egl(int enable);
 extern void                fastpath_apply_overrides_gl(int enable);
 
 extern int                 fastpath_init_context_states(GLGlueContext *ctx);
-extern void                fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx);
+extern int                 fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx);
 
 #ifdef COREGL_FASTPATH_TRACE_STATE_INFO
 extern void                fastpath_dump_context_states(GLGlueContext *ctx, int force_output);
@@ -224,7 +227,12 @@ extern GLuint              fastpath_sostate_create_object(GL_Shared_Object_State
 extern GLuint              fastpath_sostate_remove_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name);
 extern GLuint              fastpath_sostate_get_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint name);
 extern GLuint              fastpath_sostate_find_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint real_name);
+extern GLint               fastpath_sostate_use_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name);
+extern GLint               fastpath_sostate_set_object_tag(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name, GLvoid *tag);
+extern GLvoid             *fastpath_sostate_get_object_tag(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name);
 
+// GL context management functions
+extern void                fastpath_release_gl_context(GLGlueContext *gctx);
 
 #endif // COREGL_FASTPATH_H
 
index b17e039..fdb9760 100644 (file)
@@ -419,15 +419,21 @@ _unlink_context_state(GLGlueContext *gctx, Mutex *ctx_list_mtx)
 }
 
 static void
-_add_shared_obj_state_ref(GL_Shared_Object_State *sostate)
+_add_shared_obj_state_ref(GLGlueContext *gctx, GL_Shared_Object_State *sostate)
 {
        AST(sostate->ref_count >= 0);
        sostate->ref_count++;
+       add_to_general_trace_list(&sostate->using_gctxs, gctx);
 }
 
 static void
-_remove_shared_obj_state_ref(GL_Shared_Object_State *sostate)
+_remove_shared_obj_state_ref(GLGlueContext *gctx, GL_Shared_Object_State *sostate)
 {
+       remove_from_general_trace_list(&sostate->using_gctxs, gctx);
+
+       // Restore attached states
+       fastpath_release_gl_context(gctx);
+
        AST(sostate->ref_count > 0);
        sostate->ref_count--;
        if (sostate->ref_count == 0)
@@ -462,7 +468,7 @@ _remove_context_ref(GLGlueContext *gctx, Mutex *ctx_list_mtx)
                _unlink_context_state(gctx, ctx_list_mtx);
 
                AST(gctx->sostate != NULL);
-               _remove_shared_obj_state_ref(gctx->sostate);
+               _remove_shared_obj_state_ref(gctx, gctx->sostate);
                gctx->sostate = NULL;
 
                if (gctx->real_ctx_option != NULL)
@@ -508,7 +514,7 @@ _remove_context_ref(GLGlueContext *gctx, Mutex *ctx_list_mtx)
        }
 }
 
-static void
+static int
 _bind_context_state(GLGlueContext *gctx, GLContextState *cstate, Mutex *ctx_list_mtx)
 {
        if (gctx != NULL)
@@ -530,12 +536,16 @@ _bind_context_state(GLGlueContext *gctx, GLContextState *cstate, Mutex *ctx_list
                AST(newctx != NULL);
                AST(curctx != NULL);
 
-               fastpath_make_context_current(curctx, newctx);
+               if (!fastpath_make_context_current(curctx, newctx))
+                       return 0;
+
                cstate->data = (void *)newctx;
                _remove_context_ref(curctx, ctx_list_mtx);
                _add_context_ref(newctx);
        }
 
+       return 1;
+
 }
 
 GLContextState *
@@ -652,20 +662,8 @@ fastpath_eglBindAPI(EGLenum api)
 
        {
                EGLenum newapi = _orig_fastpath_eglQueryAPI();
-               if (tstate->binded_api != newapi)
+               if (tstate->binded_api != EGL_OPENGL_ES_API)
                {
-                       if (newapi != EGL_OPENGL_ES_API)
-                       {
-                               // Fallback when binding other API
-                               // Fastpath restores when bind OPENGL_ES_API
-                               fastpath_apply_overrides_egl(0);
-                               ovr_eglBindAPI = fastpath_eglBindAPI;
-                               ovr_eglQueryAPI = fastpath_eglQueryAPI;
-                       }
-                       else
-                       {
-                               fastpath_apply_overrides_egl(1);
-                       }
                        tstate->binded_api = newapi;
                }
        }
@@ -774,9 +772,10 @@ fastpath_eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_con
                        ERR("\E[40;31;1mERROR : Error creating a new GLGlueContext(Memory full 4)\E[0m\n");
                        goto finish;
                }
+               sostate_new->using_gctxs = NULL;
                gctx->sostate = sostate_new;
        }
-       _add_shared_obj_state_ref(gctx->sostate);
+       _add_shared_obj_state_ref(gctx, gctx->sostate);
        gctx->real_ctx_option = real_ctx_option;
        gctx->real_ctx_option_len = sizeof(EGL_packed_option);
        gctx->real_ctx_sharable_option = real_ctx_sharable_option;
@@ -1032,7 +1031,10 @@ fastpath_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLCon
 
                if (tstate->cstate != NULL)
                {
-                       _bind_context_state(NULL, tstate->cstate, &ctx_list_access_mutex);
+                       if (_bind_context_state(NULL, tstate->cstate, &ctx_list_access_mutex) != 1)
+                       {
+                               ERR("\E[40;31;1mWARNING : Error soft-makecurrent for context deletion\E[0m\n");
+                       }
                        tstate->cstate = NULL;
                }
                if (_orig_fastpath_eglMakeCurrent(dpy, draw, read, ctx) != EGL_TRUE)
@@ -1081,7 +1083,14 @@ fastpath_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLCon
 
                AST(cstate_new != NULL);
 
-               _bind_context_state(gctx, cstate_new, &ctx_list_access_mutex);
+               if (_bind_context_state(gctx, cstate_new, &ctx_list_access_mutex) != 1)
+               {
+                       ERR("\E[40;31;1mWARNING : Error soft-makecurrent in Cross-thread usage!\E[0m\n");
+                       free(cstate_new);
+                       _orig_fastpath_eglDestroyContext(dpy, new_real_ctx);
+                       ret = EGL_FALSE;
+                       goto finish;
+               }
 
                // TODO : Setup context state for new real ctx
                ERR("\E[40;31;1mWARNING : Cross-thread usage(makecurrent) can cause a state-broken situation!\E[0m\n");
@@ -1170,7 +1179,11 @@ fastpath_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLCon
                gctx->surface_attached = 1;
        }
 
-       _bind_context_state(gctx, tstate->cstate, &ctx_list_access_mutex);
+       if (_bind_context_state(gctx, tstate->cstate, &ctx_list_access_mutex) != 1)
+       {
+               ret = EGL_FALSE;
+               goto finish;
+       }
        gctx->used_count++;
 
        ret = EGL_TRUE;
index 625c7e9..538e615 100644 (file)
@@ -5,6 +5,11 @@
 #define CURR_STATE_COMPARE(curr_state, state ) \
    if ((current_ctx->curr_state[0]) != (state))
 
+#define IF_GL_SUCCESS(orig_gl_func) \
+       _get_gl_error(); \
+       orig_gl_func; \
+       if (_get_gl_error() == GL_NO_ERROR)
+
 #define DEFINE_FASTPAH_GL_FUNC() \
    MY_MODULE_TSTATE *tstate = NULL; \
    GLGlueContext *current_ctx = NULL;
@@ -58,8 +63,8 @@ _get_glue_obj(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint real_
        return 1;
 }
 
-static void
-_set_gl_error(GLenum error)
+static inline GLenum
+_get_gl_error()
 {
        GLenum glerror = GL_NONE;
        DEFINE_FASTPAH_GL_FUNC();
@@ -67,9 +72,25 @@ _set_gl_error(GLenum error)
 
        glerror = _orig_fastpath_glGetError();
 
-       if (current_ctx->gl_error == GL_NO_ERROR &&
-           glerror == GL_NO_ERROR &&
-           error != GL_NO_ERROR)
+       if (current_ctx->gl_error == GL_NO_ERROR && glerror != GL_NO_ERROR)
+       {
+               current_ctx->gl_error = glerror;
+       }
+       goto finish;
+
+finish:
+       return glerror;
+}
+
+static inline void
+_set_gl_error(GLenum error)
+{
+       DEFINE_FASTPAH_GL_FUNC();
+       INIT_FASTPATH_GL_FUNC();
+
+       _get_gl_error();
+
+       if (current_ctx->gl_error == GL_NO_ERROR && error != GL_NO_ERROR)
        {
                current_ctx->gl_error = error;
        }
@@ -79,6 +100,134 @@ finish:
        return;
 }
 
+typedef struct
+{
+       GLsizei shader_count;
+       GLuint shaders[10];
+       GLuint is_deleting;
+} Program_object_attached_tag;
+
+GLuint
+_create_program_object(GL_Shared_Object_State *sostate, int is_program, GLenum shader_type)
+{
+       GLuint ret = 0;
+       GLuint real_obj = 0;
+
+       if (is_program == 1)
+               real_obj = _orig_fastpath_glCreateProgram();
+       else
+               real_obj = _orig_fastpath_glCreateShader(shader_type);
+
+       if (real_obj != 0)
+       {
+               ret = fastpath_sostate_create_object(sostate, GL_OBJECT_TYPE_PROGRAM, real_obj);
+
+               Program_object_attached_tag *poat = NULL;
+               poat = (Program_object_attached_tag *)calloc(1, sizeof(Program_object_attached_tag));
+               AST(poat != NULL);
+
+               poat->is_deleting = 0;
+               poat->shader_count = 0;
+
+               fastpath_sostate_set_object_tag(sostate, GL_OBJECT_TYPE_PROGRAM, ret, poat);
+       }
+
+       return ret;
+}
+
+static void
+_update_program_attach_info(GL_Shared_Object_State *sostate, GLuint program)
+{
+       Program_object_attached_tag *poat = NULL;
+       GLuint real_program = _COREGL_INT_INIT_VALUE;
+
+       poat = (Program_object_attached_tag *)fastpath_sostate_get_object_tag(sostate, GL_OBJECT_TYPE_PROGRAM, program);
+       AST(poat != NULL);
+
+       real_program = fastpath_sostate_get_object(sostate, GL_OBJECT_TYPE_PROGRAM, program);
+       AST(real_program > 0);
+
+       _orig_fastpath_glGetAttachedShaders(real_program, 10, &poat->shader_count, poat->shaders);
+}
+
+static void
+_attach_program_object(GL_Shared_Object_State *sostate, GLuint object)
+{
+       if (object != 0)
+       {
+               fastpath_sostate_use_object(sostate, GL_OBJECT_TYPE_PROGRAM, object);
+       }
+}
+
+static int
+_is_deleted_program_object(GL_Shared_Object_State *sostate, GLuint glue_object)
+{
+       Program_object_attached_tag *poat = NULL;
+       poat = (Program_object_attached_tag *)fastpath_sostate_get_object_tag(sostate, GL_OBJECT_TYPE_PROGRAM, glue_object);
+       AST(poat != NULL);
+       return poat->is_deleting;
+}
+
+static void
+_detach_program_object(GL_Shared_Object_State *sostate, GLuint real_object, int is_program, int is_deleting)
+{
+       if (real_object != 0)
+       {
+               GLuint object = _COREGL_INT_INIT_VALUE;
+               Program_object_attached_tag *poat = NULL;
+
+               object = fastpath_sostate_find_object(sostate, GL_OBJECT_TYPE_PROGRAM, real_object);
+               AST(object != 0);
+
+               poat = (Program_object_attached_tag *)fastpath_sostate_get_object_tag(sostate, GL_OBJECT_TYPE_PROGRAM, object);
+               AST(poat != NULL);
+
+               if (is_deleting == 1)
+               {
+                       if (poat->is_deleting == 0)
+                       {
+                               poat->is_deleting = 1;
+                               fastpath_sostate_remove_object(sostate, GL_OBJECT_TYPE_PROGRAM, object);
+                       }
+               }
+               else
+               {
+                       fastpath_sostate_remove_object(sostate, GL_OBJECT_TYPE_PROGRAM, object);
+               }
+
+               if (fastpath_sostate_get_object(sostate, GL_OBJECT_TYPE_PROGRAM, object) == 0)
+               {
+                       // Is completely removed. De-referencing attached shader objects
+                       int i;
+                       for (i = 0; i < poat->shader_count; i++)
+                       {
+                               GLuint glue_shader = fastpath_sostate_find_object(sostate, GL_OBJECT_TYPE_PROGRAM, poat->shaders[i]);
+                               fastpath_sostate_remove_object(sostate, GL_OBJECT_TYPE_PROGRAM, glue_shader);
+                       }
+
+                       poat = NULL;
+                       free(poat);
+
+                       if (is_program == 1)
+                               _orig_fastpath_glDeleteProgram(real_object);
+                       else
+                               _orig_fastpath_glDeleteShader(real_object);
+               }
+       }
+}
+
+
+void
+fastpath_release_gl_context(GLGlueContext *gctx)
+{
+       // Release program
+       if (gctx->gl_current_program[0] != 0)
+       {
+               _detach_program_object(gctx->sostate, gctx->gl_current_program[0], 1, 0);
+               gctx->gl_current_program[0] = 0;
+       }
+}
+
 GLenum
 fastpath_glGetError(void)
 {
@@ -92,6 +241,7 @@ fastpath_glGetError(void)
        {
                ret = current_ctx->gl_error;
                current_ctx->gl_error = GL_NO_ERROR;
+               _orig_fastpath_glGetError();
        }
        else
        {
@@ -115,12 +265,11 @@ fastpath_glActiveTexture(GLenum texture)
 
        CURR_STATE_COMPARE(gl_active_texture, texture)
        {
-               _orig_fastpath_glActiveTexture(texture);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_tex_flag1 |= FLAG_BIT_1;
-               current_ctx->gl_active_texture[0] = texture;
+               IF_GL_SUCCESS(_orig_fastpath_glActiveTexture(texture))
+               {
+                       current_ctx->_tex_flag1 |= FLAG_BIT_1;
+                       current_ctx->gl_active_texture[0] = texture;
+               }
        }
        goto finish;
 
@@ -139,6 +288,12 @@ fastpath_glGenTextures(GLsizei n, GLuint* textures)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (textures == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
@@ -186,28 +341,29 @@ fastpath_glBindTexture(GLenum target, GLuint texture)
        {
                if (current_ctx->gl_tex_2d_state[active_idx] != real_obj)
                {
-                       _orig_fastpath_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;
+                       IF_GL_SUCCESS(_orig_fastpath_glBindTexture(target, real_obj))
+                       {
+                               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)
                {
-                       _orig_fastpath_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;
+                       IF_GL_SUCCESS(_orig_fastpath_glBindTexture(target, real_obj))
+                       {
+                               current_ctx->_tex_flag1 |= FLAG_BIT_4;
+                               current_ctx->gl_tex_cube_state[active_idx] = real_obj;
+                       }
                }
        }
+       else
+       {
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
+       }
        goto finish;
 
 finish:
@@ -232,7 +388,6 @@ fastpath_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarg
 
        _orig_fastpath_glFramebufferTexture2D(target, attachment, textarget, real_obj, level);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
@@ -256,7 +411,6 @@ fastpath_glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
 
        _orig_fastpath_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, real_obj, level, samples);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
@@ -281,8 +435,6 @@ fastpath_glIsTexture(GLuint texture)
 
        ret = _orig_fastpath_glIsTexture(real_obj);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
        goto finish;
 
 finish:
@@ -301,6 +453,12 @@ fastpath_glDeleteTextures(GLsizei n, const GLuint* textures)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (textures == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
@@ -317,21 +475,31 @@ fastpath_glDeleteTextures(GLsizei n, const GLuint* textures)
                        real_objid = fastpath_sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, textures[i]);
                        if (real_objid == 0) continue;
 
-                       fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, textures[i]);
+                       AST(fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_TEXTURE, textures[i]) == 1);
                        objid_array[real_n++] = real_objid;
                }
 
-               _orig_fastpath_glDeleteTextures(real_n, objid_array);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               for (i = 0; i < real_n; i++)
+               IF_GL_SUCCESS(_orig_fastpath_glDeleteTextures(real_n, objid_array))
                {
-                       for (j = 0; j < current_ctx->gl_num_tex_units[0]; j++)
+                       for (i = 0; i < real_n; i++)
                        {
-                               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;
+                               General_Trace_List *current = NULL;
+                               current = current_ctx->sostate->using_gctxs;
+
+                               while (current != NULL)
+                               {
+                                       GLGlueContext *cur_gctx = (GLGlueContext *)current->value;
+
+                                       for (j = 0; j < cur_gctx->gl_num_tex_units[0]; j++)
+                                       {
+                                               if (cur_gctx->gl_tex_2d_state[j] == objid_array[i])
+                                                       cur_gctx->gl_tex_2d_state[j] = 0;
+                                               if (cur_gctx->gl_tex_cube_state[j] == objid_array[i])
+                                                       cur_gctx->gl_tex_cube_state[j] = 0;
+                                       }
+
+                                       current = current->next;
+                               }
                        }
                }
        }
@@ -359,17 +527,24 @@ fastpath_glGenBuffers(GLsizei n, GLuint* buffers)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (buffers == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
 
        objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
 
-       _orig_fastpath_glGenBuffers(n, objid_array);
-
-       for (i = 0; i < n; i++)
+       IF_GL_SUCCESS(_orig_fastpath_glGenBuffers(n, objid_array))
        {
-               buffers[i] = fastpath_sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_BUFFER, objid_array[i]);
+               for (i = 0; i < n; i++)
+               {
+                       buffers[i] = fastpath_sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_BUFFER, objid_array[i]);
+               }
        }
 
        goto finish;
@@ -403,37 +578,38 @@ fastpath_glBindBuffer(GLenum target, GLuint buffer)
        {
                CURR_STATE_COMPARE(gl_array_buffer_binding, real_obj)
                {
-                       _orig_fastpath_glBindBuffer(target, real_obj);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+                       IF_GL_SUCCESS(_orig_fastpath_glBindBuffer(target, real_obj))
+                       {
+                               if (real_obj == 0)
+                                       current_ctx->_bind_flag &= (~FLAG_BIT_0);
+                               else
+                                       current_ctx->_bind_flag |= FLAG_BIT_0;
 
-                       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;
+                               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)
                {
-                       _orig_fastpath_glBindBuffer(target, real_obj);
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+                       IF_GL_SUCCESS(_orig_fastpath_glBindBuffer(target, real_obj))
+                       {
+                               if (real_obj == 0)
+                                       current_ctx->_bind_flag &= (~FLAG_BIT_1);
+                               else
+                                       current_ctx->_bind_flag |= FLAG_BIT_1;
 
-                       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;
+                               current_ctx->gl_element_array_buffer_binding[0] = real_obj;
+                       }
                }
        }
        else
        {
-               // For error recording
-               _orig_fastpath_glBindBuffer(target, real_obj);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
        }
+
        goto finish;
 
 finish:
@@ -458,8 +634,6 @@ fastpath_glIsBuffer(GLuint buffer)
 
        ret = _orig_fastpath_glIsBuffer(real_obj);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
        goto finish;
 
 finish:
@@ -478,6 +652,12 @@ fastpath_glDeleteBuffers(GLsizei n, const GLuint* buffers)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (buffers == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
@@ -494,24 +674,34 @@ fastpath_glDeleteBuffers(GLsizei n, const GLuint* buffers)
                        real_objid = fastpath_sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_BUFFER, buffers[i]);
                        if (real_objid == 0) continue;
 
-                       fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_BUFFER, buffers[i]);
+                       AST(fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_BUFFER, buffers[i]) == 1);
                        objid_array[real_n++] = real_objid;
                }
 
-               _orig_fastpath_glDeleteBuffers(real_n, objid_array);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               for (i = 0; i < real_n; i++)
+               IF_GL_SUCCESS(_orig_fastpath_glDeleteBuffers(real_n, objid_array))
                {
-                       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])
+                       for (i = 0; i < real_n; i++)
                        {
-                               current_ctx->_bind_flag &= (~FLAG_BIT_1);
-                               current_ctx->gl_element_array_buffer_binding[0] = 0;
+                               General_Trace_List *current = NULL;
+                               current = current_ctx->sostate->using_gctxs;
+
+                               while (current != NULL)
+                               {
+                                       GLGlueContext *cur_gctx = (GLGlueContext *)current->value;
+
+                                       if (cur_gctx->gl_array_buffer_binding[0] == objid_array[i])
+                                       {
+                                               cur_gctx->_bind_flag &= (~FLAG_BIT_0);
+                                               cur_gctx->gl_array_buffer_binding[0] = 0;
+                                       }
+                                       if (cur_gctx->gl_element_array_buffer_binding[0] == objid_array[i])
+                                       {
+                                               cur_gctx->_bind_flag &= (~FLAG_BIT_1);
+                                               cur_gctx->gl_element_array_buffer_binding[0] = 0;
+                                       }
+
+                                       current = current->next;
+                               }
                        }
                }
        }
@@ -539,17 +729,24 @@ fastpath_glGenFramebuffers(GLsizei n, GLuint* framebuffers)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (framebuffers == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
 
        objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
 
-       _orig_fastpath_glGenFramebuffers(n, objid_array);
-
-       for (i = 0; i < n; i++)
+       IF_GL_SUCCESS(_orig_fastpath_glGenFramebuffers(n, objid_array))
        {
-               framebuffers[i] = fastpath_sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_FRAMEBUFFER, objid_array[i]);
+               for (i = 0; i < n; i++)
+               {
+                       framebuffers[i] = fastpath_sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_FRAMEBUFFER, objid_array[i]);
+               }
        }
 
        goto finish;
@@ -583,22 +780,20 @@ fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
        {
                CURR_STATE_COMPARE(gl_framebuffer_binding, real_obj)
                {
-                       _orig_fastpath_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;
+                       IF_GL_SUCCESS(_orig_fastpath_glBindFramebuffer(target, real_obj))
+                       {
+                               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
-               _orig_fastpath_glBindFramebuffer(target, real_obj);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
        }
        goto finish;
 
@@ -624,8 +819,6 @@ fastpath_glIsFramebuffer(GLuint framebuffer)
 
        ret = _orig_fastpath_glIsFramebuffer(real_obj);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
        goto finish;
 
 finish:
@@ -644,6 +837,12 @@ fastpath_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (framebuffers == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
@@ -660,19 +859,29 @@ fastpath_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
                        real_objid = fastpath_sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_FRAMEBUFFER, framebuffers[i]);
                        if (real_objid == 0) continue;
 
-                       fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_FRAMEBUFFER, framebuffers[i]);
+                       AST(fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_FRAMEBUFFER, framebuffers[i]) == 1);
                        objid_array[real_n++] = real_objid;
                }
 
-               _orig_fastpath_glDeleteFramebuffers(real_n, objid_array);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               for (i = 0; i < real_n; i++)
+               IF_GL_SUCCESS(_orig_fastpath_glDeleteFramebuffers(real_n, objid_array))
                {
-                       if (current_ctx->gl_framebuffer_binding[0] == framebuffers[i])
+                       for (i = 0; i < real_n; i++)
                        {
-                               current_ctx->_bind_flag &= (~FLAG_BIT_2);
-                               current_ctx->gl_framebuffer_binding[0] = 0;
+                               General_Trace_List *current = NULL;
+                               current = current_ctx->sostate->using_gctxs;
+
+                               while (current != NULL)
+                               {
+                                       GLGlueContext *cur_gctx = (GLGlueContext *)current->value;
+
+                                       if (cur_gctx->gl_framebuffer_binding[0] == framebuffers[i])
+                                       {
+                                               cur_gctx->_bind_flag &= (~FLAG_BIT_2);
+                                               cur_gctx->gl_framebuffer_binding[0] = 0;
+                                       }
+
+                                       current = current->next;
+                               }
                        }
                }
        }
@@ -700,17 +909,24 @@ fastpath_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (renderbuffers == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
 
        objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
 
-       _orig_fastpath_glGenRenderbuffers(n, objid_array);
-
-       for (i = 0; i < n; i++)
+       IF_GL_SUCCESS(_orig_fastpath_glGenRenderbuffers(n, objid_array))
        {
-               renderbuffers[i] = fastpath_sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_RENDERBUFFER, objid_array[i]);
+               for (i = 0; i < n; i++)
+               {
+                       renderbuffers[i] = fastpath_sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_RENDERBUFFER, objid_array[i]);
+               }
        }
 
        goto finish;
@@ -744,22 +960,22 @@ fastpath_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
        {
                CURR_STATE_COMPARE(gl_renderbuffer_binding, real_obj)
                {
-                       _orig_fastpath_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;
+                       IF_GL_SUCCESS(_orig_fastpath_glBindRenderbuffer(target, real_obj))
+                       {
+                               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
-               _orig_fastpath_glBindRenderbuffer(target, real_obj);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
        }
+
        goto finish;
 
 finish:
@@ -783,8 +999,6 @@ fastpath_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum rend
 
        _orig_fastpath_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, real_obj);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
        goto finish;
 
 finish:
@@ -809,8 +1023,6 @@ fastpath_glIsRenderbuffer(GLuint renderbuffer)
 
        ret = _orig_fastpath_glIsRenderbuffer(real_obj);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
        goto finish;
 
 finish:
@@ -829,6 +1041,12 @@ fastpath_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (renderbuffers == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
@@ -845,19 +1063,29 @@ fastpath_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
                        real_objid = fastpath_sostate_get_object(current_ctx->sostate, GL_OBJECT_TYPE_RENDERBUFFER, renderbuffers[i]);
                        if (real_objid == 0) continue;
 
-                       fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_RENDERBUFFER, renderbuffers[i]);
+                       AST(fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_RENDERBUFFER, renderbuffers[i]) == 1);
                        objid_array[real_n++] = real_objid;
                }
 
-               _orig_fastpath_glDeleteRenderbuffers(real_n, objid_array);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               for (i = 0; i < real_n; i++)
+               IF_GL_SUCCESS(_orig_fastpath_glDeleteRenderbuffers(real_n, objid_array))
                {
-                       if (current_ctx->gl_renderbuffer_binding[0] == renderbuffers[i])
+                       for (i = 0; i < real_n; i++)
                        {
-                               current_ctx->_bind_flag &= (~FLAG_BIT_3);
-                               current_ctx->gl_renderbuffer_binding[0] = 0;
+                               General_Trace_List *current = NULL;
+                               current = current_ctx->sostate->using_gctxs;
+
+                               while (current != NULL)
+                               {
+                                       GLGlueContext *cur_gctx = (GLGlueContext *)current->value;
+
+                                       if (cur_gctx->gl_renderbuffer_binding[0] == renderbuffers[i])
+                                       {
+                                               cur_gctx->_bind_flag &= (~FLAG_BIT_3);
+                                               cur_gctx->gl_renderbuffer_binding[0] = 0;
+                                       }
+
+                                       current = current->next;
+                               }
                        }
                }
        }
@@ -878,8 +1106,7 @@ finish:
 GLuint
 fastpath_glCreateProgram(void)
 {
-       GLuint ret = _COREGL_INT_INIT_VALUE;
-       GLuint real_obj = _COREGL_INT_INIT_VALUE;
+       GLuint ret = 0;
 
        DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
@@ -887,10 +1114,9 @@ fastpath_glCreateProgram(void)
 
        AST(current_ctx->sostate != NULL);
 
-       real_obj = _orig_fastpath_glCreateProgram();
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       ret = _create_program_object(current_ctx->sostate, 1, GL_NONE);
 
-       ret = fastpath_sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, real_obj);
+       _attach_program_object(current_ctx->sostate, ret);
 
        goto finish;
 
@@ -902,8 +1128,7 @@ finish:
 GLuint
 fastpath_glCreateShader(GLenum type)
 {
-       GLuint ret = _COREGL_INT_INIT_VALUE;
-       GLuint real_obj = _COREGL_INT_INIT_VALUE;
+       GLuint ret = 0;
 
        DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
@@ -911,10 +1136,9 @@ fastpath_glCreateShader(GLenum type)
 
        AST(current_ctx->sostate != NULL);
 
-       real_obj = _orig_fastpath_glCreateShader(type);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       ret = _create_program_object(current_ctx->sostate, 0, type);
 
-       ret = fastpath_sostate_create_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, real_obj);
+       _attach_program_object(current_ctx->sostate, ret);
 
        goto finish;
 
@@ -938,7 +1162,7 @@ fastpath_glShaderSource(GLuint shader, GLsizei count, const char** string, const
                goto finish;
        }
        _orig_fastpath_glShaderSource(real_obj, count, string, length);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -955,6 +1179,12 @@ fastpath_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, c
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
+       if (n < 0)
+       {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+       if (n == 0) goto finish;
        if (shaders == NULL) goto finish;
 
        AST(current_ctx->sostate != NULL);
@@ -968,7 +1198,7 @@ fastpath_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, c
        }
 
        _orig_fastpath_glShaderBinary(n, objid_array, binaryformat, binary, length);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -997,7 +1227,7 @@ fastpath_glCompileShader(GLuint shader)
        }
 
        _orig_fastpath_glCompileShader(real_obj);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1020,7 +1250,7 @@ fastpath_glBindAttribLocation(GLuint program, GLuint index, const char* name)
        }
 
        _orig_fastpath_glBindAttribLocation(real_obj, index, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1044,8 +1274,12 @@ fastpath_glAttachShader(GLuint program, GLuint shader)
                goto finish;
        }
 
-       _orig_fastpath_glAttachShader(real_obj_program, real_obj_shader);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       IF_GL_SUCCESS(_orig_fastpath_glAttachShader(real_obj_program, real_obj_shader))
+       {
+               _update_program_attach_info(current_ctx->sostate, program);
+               _attach_program_object(current_ctx->sostate, shader);
+       }
+
        goto finish;
 
 finish:
@@ -1069,8 +1303,12 @@ fastpath_glDetachShader(GLuint program, GLuint shader)
                goto finish;
        }
 
-       _orig_fastpath_glDetachShader(real_obj_program, real_obj_shader);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       IF_GL_SUCCESS(_orig_fastpath_glDetachShader(real_obj_program, real_obj_shader))
+       {
+               _update_program_attach_info(current_ctx->sostate, program);
+               _detach_program_object(current_ctx->sostate, real_obj_shader, 0, 0);
+       }
+
        goto finish;
 
 finish:
@@ -1094,7 +1332,7 @@ fastpath_glIsShader(GLuint shader)
        }
 
        ret = _orig_fastpath_glIsShader(real_obj);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1119,7 +1357,7 @@ fastpath_glIsProgram(GLuint program)
        }
 
        ret = _orig_fastpath_glIsProgram(real_obj);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1143,7 +1381,7 @@ fastpath_glLinkProgram(GLuint program)
        }
 
        _orig_fastpath_glLinkProgram(real_obj);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1166,7 +1404,7 @@ fastpath_glValidateProgram(GLuint program)
        }
 
        _orig_fastpath_glValidateProgram(real_obj);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1190,12 +1428,14 @@ fastpath_glUseProgram(GLuint program)
 
        CURR_STATE_COMPARE(gl_current_program, real_obj)
        {
-               _orig_fastpath_glUseProgram(real_obj);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               IF_GL_SUCCESS(_orig_fastpath_glUseProgram(real_obj))
+               {
+                       _attach_program_object(current_ctx->sostate, program);
+                       _detach_program_object(current_ctx->sostate, current_ctx->gl_current_program[0], 1, 0);
 
-               current_ctx->_clear_flag1 |= FLAG_BIT_1;
-               current_ctx->gl_current_program[0] = real_obj;
+                       current_ctx->_clear_flag1 |= FLAG_BIT_1;
+                       current_ctx->gl_current_program[0] = real_obj;
+               }
        }
        goto finish;
 
@@ -1219,7 +1459,7 @@ fastpath_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsize
        }
 
        _orig_fastpath_glGetActiveAttrib(real_obj, index, bufsize, length, size, type, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1242,7 +1482,7 @@ fastpath_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsiz
        }
 
        _orig_fastpath_glGetActiveUniform(real_obj, index, bufsize, length, size, type, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1266,16 +1506,16 @@ fastpath_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count,
                goto finish;
        }
 
-       _orig_fastpath_glGetAttachedShaders(real_obj, maxcount, &real_count, shaders);
-
-       for (i = 0; i < real_count; i++)
+       IF_GL_SUCCESS(_orig_fastpath_glGetAttachedShaders(real_obj, maxcount, &real_count, shaders))
        {
-               if (shaders[i] != 0)
-                       shaders[i] = fastpath_sostate_find_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, shaders[i]);
+               for (i = 0; i < real_count; i++)
+               {
+                       if (shaders[i] != 0)
+                               shaders[i] = fastpath_sostate_find_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, shaders[i]);
+               }
+               if (count != NULL) *count = real_count;
        }
-       if (count != NULL) *count = real_count;
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
@@ -1299,7 +1539,7 @@ fastpath_glGetAttribLocation(GLuint program, const char* name)
        }
 
        ret = _orig_fastpath_glGetAttribLocation(real_obj, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1322,8 +1562,18 @@ fastpath_glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
                goto finish;
        }
 
-       _orig_fastpath_glGetShaderiv(real_obj, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       switch (pname)
+       {
+               case GL_DELETE_STATUS:
+                       *params = GL_FALSE;
+                       if (_is_deleted_program_object(current_ctx->sostate, shader) == 1)
+                               *params = GL_TRUE;
+                       break;
+               default:
+                       _orig_fastpath_glGetShaderiv(real_obj, pname, params);
+                       break;
+       }
+
        goto finish;
 
 finish:
@@ -1346,7 +1596,7 @@ fastpath_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, cha
        }
 
        _orig_fastpath_glGetShaderInfoLog(real_obj, bufsize, length, infolog);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1368,8 +1618,18 @@ fastpath_glGetProgramiv(GLuint program, GLenum pname, GLint* params)
                goto finish;
        }
 
-       _orig_fastpath_glGetProgramiv(real_obj, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+       switch (pname)
+       {
+               case GL_DELETE_STATUS:
+                       *params = GL_FALSE;
+                       if (_is_deleted_program_object(current_ctx->sostate, program) == 1)
+                               *params = GL_TRUE;
+                       break;
+               default:
+                       _orig_fastpath_glGetProgramiv(real_obj, pname, params);
+                       break;
+       }
+
        goto finish;
 
 finish:
@@ -1392,7 +1652,7 @@ fastpath_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, c
        }
 
        _orig_fastpath_glGetProgramInfoLog(real_obj, bufsize, length, infolog);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1415,7 +1675,7 @@ fastpath_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char
        }
 
        _orig_fastpath_glGetShaderSource(real_obj, bufsize, length, source);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1438,7 +1698,7 @@ fastpath_glGetUniformfv(GLuint program, GLint location, GLfloat* params)
        }
 
        _orig_fastpath_glGetUniformfv(real_obj, location, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1461,7 +1721,7 @@ fastpath_glGetUniformiv(GLuint program, GLint location, GLint* params)
        }
 
        _orig_fastpath_glGetUniformiv(real_obj, location, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1484,7 +1744,7 @@ fastpath_glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei* length, GL
        }
 
        _orig_fastpath_glGetProgramBinary(real_obj, bufsize, length, binaryFormat, binary);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1507,7 +1767,7 @@ fastpath_glProgramBinary(GLuint program, GLenum binaryFormat, const void* binary
        }
 
        _orig_fastpath_glProgramBinary(real_obj, binaryFormat, binary, length);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1531,7 +1791,7 @@ fastpath_glProgramParameteri(GLuint program, GLuint pname, GLint value)
        }
 
        _orig_fastpath_glProgramParameteri(real_obj, pname, value);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1556,7 +1816,7 @@ fastpath_glGetUniformLocation(GLuint program, const char* name)
        }
 
        ret = _orig_fastpath_glGetUniformLocation(real_obj, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1579,13 +1839,8 @@ fastpath_glDeleteShader(GLuint shader)
                goto finish;
        }
 
-       _orig_fastpath_glDeleteShader(real_obj);
-       if (real_obj != 0)
-       {
-               AST(fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, shader) == 1);
-       }
+       _detach_program_object(current_ctx->sostate, real_obj, 0, 1);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
@@ -1607,13 +1862,8 @@ fastpath_glDeleteProgram(GLuint program)
                goto finish;
        }
 
-       _orig_fastpath_glDeleteProgram(real_obj);
-       if (real_obj != 0)
-       {
-               AST(fastpath_sostate_remove_object(current_ctx->sostate, GL_OBJECT_TYPE_PROGRAM, program) == 1);
-       }
+       _detach_program_object(current_ctx->sostate, real_obj, 1, 1);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        goto finish;
 
 finish:
@@ -1636,15 +1886,14 @@ fastpath_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alph
            (current_ctx->gl_blend_color[2] != blue) ||
            (current_ctx->gl_blend_color[3] != alpha))
        {
-               _orig_fastpath_glBlendColor(red, green, blue, alpha);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_blend_flag |= FLAG_BIT_0;
-               current_ctx->gl_blend_color[0] = red;
-               current_ctx->gl_blend_color[1] = green;
-               current_ctx->gl_blend_color[2] = blue;
-               current_ctx->gl_blend_color[3] = alpha;
+               IF_GL_SUCCESS(_orig_fastpath_glBlendColor(red, green, blue, alpha))
+               {
+                       current_ctx->_blend_flag |= FLAG_BIT_0;
+                       current_ctx->gl_blend_color[0] = red;
+                       current_ctx->gl_blend_color[1] = green;
+                       current_ctx->gl_blend_color[2] = blue;
+                       current_ctx->gl_blend_color[3] = alpha;
+               }
        }
        goto finish;
 
@@ -1661,13 +1910,12 @@ fastpath_glBlendEquation(GLenum mode)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glBlendEquation(mode);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_blend_flag |= (FLAG_BIT_5 | FLAG_BIT_6);
-       _orig_fastpath_glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*) & (current_ctx->gl_blend_equation_rgb));
-       _orig_fastpath_glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*) & (current_ctx->gl_blend_equation_alpha));
+       IF_GL_SUCCESS(_orig_fastpath_glBlendEquation(mode))
+       {
+               current_ctx->_blend_flag |= (FLAG_BIT_5 | FLAG_BIT_6);
+               _orig_fastpath_glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*) & (current_ctx->gl_blend_equation_rgb));
+               _orig_fastpath_glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*) & (current_ctx->gl_blend_equation_alpha));
+       }
        goto finish;
 
 finish:
@@ -1685,13 +1933,12 @@ fastpath_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
        if ((current_ctx->gl_blend_equation_rgb[0] != modeRGB) ||
            (current_ctx->gl_blend_equation_alpha[0] != modeAlpha))
        {
-               _orig_fastpath_glBlendEquationSeparate(modeRGB, modeAlpha);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_blend_flag |= (FLAG_BIT_5 | FLAG_BIT_6);
-               current_ctx->gl_blend_equation_rgb[0]    = modeRGB;
-               current_ctx->gl_blend_equation_alpha[0]  = modeAlpha;
+               IF_GL_SUCCESS(_orig_fastpath_glBlendEquationSeparate(modeRGB, modeAlpha))
+               {
+                       current_ctx->_blend_flag |= (FLAG_BIT_5 | FLAG_BIT_6);
+                       current_ctx->gl_blend_equation_rgb[0]    = modeRGB;
+                       current_ctx->gl_blend_equation_alpha[0]  = modeAlpha;
+               }
        }
        goto finish;
 
@@ -1708,15 +1955,14 @@ fastpath_glBlendFunc(GLenum sfactor, GLenum dfactor)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glBlendFunc(sfactor, dfactor);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_blend_flag |= (FLAG_BIT_1 | FLAG_BIT_2 | FLAG_BIT_3 | FLAG_BIT_4);
-       _orig_fastpath_glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*) & (current_ctx->gl_blend_src_rgb));
-       _orig_fastpath_glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*) & (current_ctx->gl_blend_src_alpha));
-       _orig_fastpath_glGetIntegerv(GL_BLEND_DST_RGB, (GLint*) & (current_ctx->gl_blend_dst_rgb));
-       _orig_fastpath_glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*) & (current_ctx->gl_blend_dst_alpha));
+       IF_GL_SUCCESS(_orig_fastpath_glBlendFunc(sfactor, dfactor))
+       {
+               current_ctx->_blend_flag |= (FLAG_BIT_1 | FLAG_BIT_2 | FLAG_BIT_3 | FLAG_BIT_4);
+               _orig_fastpath_glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*) & (current_ctx->gl_blend_src_rgb));
+               _orig_fastpath_glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*) & (current_ctx->gl_blend_src_alpha));
+               _orig_fastpath_glGetIntegerv(GL_BLEND_DST_RGB, (GLint*) & (current_ctx->gl_blend_dst_rgb));
+               _orig_fastpath_glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*) & (current_ctx->gl_blend_dst_alpha));
+       }
        goto finish;
 
 finish:
@@ -1736,15 +1982,14 @@ fastpath_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLen
            (current_ctx->gl_blend_src_alpha[0] != srcAlpha) ||
            (current_ctx->gl_blend_dst_alpha[0] != dstAlpha))
        {
-               _orig_fastpath_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_blend_flag |= (FLAG_BIT_1 | FLAG_BIT_2 | FLAG_BIT_3 | FLAG_BIT_4);
-               current_ctx->gl_blend_src_rgb[0]   = srcRGB;
-               current_ctx->gl_blend_dst_rgb[0]   = dstRGB;
-               current_ctx->gl_blend_src_alpha[0] = srcAlpha;
-               current_ctx->gl_blend_dst_alpha[0] = dstAlpha;
+               IF_GL_SUCCESS(_orig_fastpath_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha))
+               {
+                       current_ctx->_blend_flag |= (FLAG_BIT_1 | FLAG_BIT_2 | FLAG_BIT_3 | FLAG_BIT_4);
+                       current_ctx->gl_blend_src_rgb[0]   = srcRGB;
+                       current_ctx->gl_blend_dst_rgb[0]   = dstRGB;
+                       current_ctx->gl_blend_src_alpha[0] = srcAlpha;
+                       current_ctx->gl_blend_dst_alpha[0] = dstAlpha;
+               }
        }
        goto finish;
 
@@ -1765,15 +2010,14 @@ fastpath_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alph
            (current_ctx->gl_color_clear_value[2] != blue) ||
            (current_ctx->gl_color_clear_value[3] != alpha))
        {
-               _orig_fastpath_glClearColor(red, green, blue, alpha);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag1 |= (FLAG_BIT_2);
-               current_ctx->gl_color_clear_value[0] = red;
-               current_ctx->gl_color_clear_value[1] = green;
-               current_ctx->gl_color_clear_value[2] = blue;
-               current_ctx->gl_color_clear_value[3] = alpha;
+               IF_GL_SUCCESS(_orig_fastpath_glClearColor(red, green, blue, alpha))
+               {
+                       current_ctx->_clear_flag1 |= (FLAG_BIT_2);
+                       current_ctx->gl_color_clear_value[0] = red;
+                       current_ctx->gl_color_clear_value[1] = green;
+                       current_ctx->gl_color_clear_value[2] = blue;
+                       current_ctx->gl_color_clear_value[3] = alpha;
+               }
        }
        goto finish;
 
@@ -1791,12 +2035,11 @@ fastpath_glClearDepthf(GLclampf depth)
 
        CURR_STATE_COMPARE(gl_depth_clear_value, depth)
        {
-               _orig_fastpath_glClearDepthf(depth);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag2 |= FLAG_BIT_2;
-               current_ctx->gl_depth_clear_value[0] = depth;
+               IF_GL_SUCCESS(_orig_fastpath_glClearDepthf(depth))
+               {
+                       current_ctx->_clear_flag2 |= FLAG_BIT_2;
+                       current_ctx->gl_depth_clear_value[0] = depth;
+               }
        }
        goto finish;
 
@@ -1814,12 +2057,11 @@ fastpath_glClearStencil(GLint s)
 
        CURR_STATE_COMPARE(gl_stencil_clear_value, s)
        {
-               _orig_fastpath_glClearStencil(s);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_stencil_flag2 |= FLAG_BIT_7;
-               current_ctx->gl_stencil_clear_value[0] = s;
+               IF_GL_SUCCESS(_orig_fastpath_glClearStencil(s))
+               {
+                       current_ctx->_stencil_flag2 |= FLAG_BIT_7;
+                       current_ctx->gl_stencil_clear_value[0] = s;
+               }
        }
        goto finish;
 
@@ -1840,15 +2082,14 @@ fastpath_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean a
            (current_ctx->gl_color_writemask[2] != blue) ||
            (current_ctx->gl_color_writemask[3] != alpha))
        {
-               _orig_fastpath_glColorMask(red, green, blue, alpha);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag2 |= FLAG_BIT_0;
-               current_ctx->gl_color_writemask[0] = red;
-               current_ctx->gl_color_writemask[1] = green;
-               current_ctx->gl_color_writemask[2] = blue;
-               current_ctx->gl_color_writemask[3] = alpha;
+               IF_GL_SUCCESS(_orig_fastpath_glColorMask(red, green, blue, alpha))
+               {
+                       current_ctx->_clear_flag2 |= FLAG_BIT_0;
+                       current_ctx->gl_color_writemask[0] = red;
+                       current_ctx->gl_color_writemask[1] = green;
+                       current_ctx->gl_color_writemask[2] = blue;
+                       current_ctx->gl_color_writemask[3] = alpha;
+               }
        }
        goto finish;
 
@@ -1866,12 +2107,11 @@ fastpath_glCullFace(GLenum mode)
 
        CURR_STATE_COMPARE(gl_cull_face_mode, mode)
        {
-               _orig_fastpath_glCullFace(mode);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag2 |= FLAG_BIT_5;
-               current_ctx->gl_cull_face_mode[0] = mode;
+               IF_GL_SUCCESS(_orig_fastpath_glCullFace(mode))
+               {
+                       current_ctx->_clear_flag2 |= FLAG_BIT_5;
+                       current_ctx->gl_cull_face_mode[0] = mode;
+               }
        }
        goto finish;
 
@@ -1889,12 +2129,11 @@ fastpath_glDepthFunc(GLenum func)
 
        CURR_STATE_COMPARE(gl_depth_func, func)
        {
-               _orig_fastpath_glDepthFunc(func);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag2 |= FLAG_BIT_3;
-               current_ctx->gl_depth_func[0] = func;
+               IF_GL_SUCCESS(_orig_fastpath_glDepthFunc(func))
+               {
+                       current_ctx->_clear_flag2 |= FLAG_BIT_3;
+                       current_ctx->gl_depth_func[0] = func;
+               }
        }
        goto finish;
 
@@ -1912,12 +2151,11 @@ fastpath_glDepthMask(GLboolean flag)
 
        CURR_STATE_COMPARE(gl_depth_writemask, flag)
        {
-               _orig_fastpath_glDepthMask(flag);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag2 |= FLAG_BIT_4;
-               current_ctx->gl_depth_writemask[0] = flag;
+               IF_GL_SUCCESS(_orig_fastpath_glDepthMask(flag))
+               {
+                       current_ctx->_clear_flag2 |= FLAG_BIT_4;
+                       current_ctx->gl_depth_writemask[0] = flag;
+               }
        }
        goto finish;
 
@@ -1936,13 +2174,12 @@ fastpath_glDepthRangef(GLclampf zNear, GLclampf zFar)
        if ((current_ctx->gl_depth_range[0] != zNear) ||
            (current_ctx->gl_depth_range[1] != zFar))
        {
-               _orig_fastpath_glDepthRangef(zNear, zFar);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag2 |= FLAG_BIT_1;
-               current_ctx->gl_depth_range[0] = zNear;
-               current_ctx->gl_depth_range[1] = zFar;
+               IF_GL_SUCCESS(_orig_fastpath_glDepthRangef(zNear, zFar))
+               {
+                       current_ctx->_clear_flag2 |= FLAG_BIT_1;
+                       current_ctx->gl_depth_range[0] = zNear;
+                       current_ctx->gl_depth_range[1] = zFar;
+               }
        }
        goto finish;
 
@@ -1964,7 +2201,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_blend, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag1 &= (~FLAG_BIT_0);
                                current_ctx->gl_blend[0] = GL_FALSE;
                        }
@@ -1973,7 +2209,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_cull_face, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag1 &= (~FLAG_BIT_1);
                                current_ctx->gl_cull_face[0] = GL_FALSE;
                        }
@@ -1982,7 +2217,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_depth_test, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag1 &= (~FLAG_BIT_2);
                                current_ctx->gl_depth_test[0] = GL_FALSE;
                        }
@@ -1991,7 +2225,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_dither, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag1 &= (~FLAG_BIT_3);
                                current_ctx->gl_dither[0] = GL_FALSE;
                        }
@@ -2000,7 +2233,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_polygon_offset_fill, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag2 &= (~FLAG_BIT_0);
                                current_ctx->gl_polygon_offset_fill[0] = GL_FALSE;
                        }
@@ -2009,7 +2241,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_sample_alpha_to_coverage, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag2 &= (~FLAG_BIT_1);
                                current_ctx->gl_sample_alpha_to_coverage[0] = GL_FALSE;
                        }
@@ -2018,7 +2249,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_sample_coverage, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag2 &= (~FLAG_BIT_2);
                                current_ctx->gl_sample_coverage[0] = GL_FALSE;
                        }
@@ -2027,7 +2257,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_scissor_test, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag2 &= (~FLAG_BIT_3);
                                current_ctx->gl_scissor_test[0] = GL_FALSE;
                        }
@@ -2036,7 +2265,6 @@ fastpath_glDisable(GLenum cap)
                        CURR_STATE_COMPARE(gl_stencil_test, GL_FALSE)
                        {
                                _orig_fastpath_glDisable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
                                current_ctx->_enable_flag2 &= (~FLAG_BIT_4);
                                current_ctx->gl_stencil_test[0] = GL_FALSE;
                        }
@@ -2056,48 +2284,18 @@ fastpath_glDisableVertexAttribArray(GLuint index)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glDisableVertexAttribArray(index);
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_1;
-       current_ctx->gl_vertex_array_enabled[index]    = GL_FALSE;
-
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-
-void
-fastpath_glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       _orig_fastpath_glDrawArrays(mode, first, count);
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-
-void
-fastpath_glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
-{
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
+       IF_GL_SUCCESS(_orig_fastpath_glDisableVertexAttribArray(index))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_1;
+               current_ctx->gl_vertex_array_enabled[index] = GL_FALSE;
+       }
 
-       _orig_fastpath_glDrawElements(mode, count, type, indices);
        goto finish;
 
 finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-
 void
 fastpath_glEnable(GLenum cap)
 {
@@ -2111,8 +2309,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_blend, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
                                current_ctx->_enable_flag1 |= FLAG_BIT_0;
                                current_ctx->gl_blend[0] = GL_TRUE;
                        }
@@ -2121,9 +2317,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_cull_face, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-
                                current_ctx->_enable_flag1 |= FLAG_BIT_1;
                                current_ctx->gl_cull_face[0] = GL_TRUE;
                        }
@@ -2132,9 +2325,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_depth_test, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-
                                current_ctx->_enable_flag1 |= FLAG_BIT_2;
                                current_ctx->gl_depth_test[0] = GL_TRUE;
                        }
@@ -2143,9 +2333,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_dither, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-
                                current_ctx->_enable_flag1 |= FLAG_BIT_3;
                                current_ctx->gl_dither[0] = GL_TRUE;
                        }
@@ -2154,9 +2341,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_polygon_offset_fill, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-
                                current_ctx->_enable_flag2 |= FLAG_BIT_0;
                                current_ctx->gl_polygon_offset_fill[0] = GL_TRUE;
                        }
@@ -2165,9 +2349,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_sample_alpha_to_coverage, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-
                                current_ctx->_enable_flag2 |= FLAG_BIT_1;
                                current_ctx->gl_sample_alpha_to_coverage[0] = GL_TRUE;
                        }
@@ -2176,9 +2357,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_sample_coverage, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-
                                current_ctx->_enable_flag2 |= FLAG_BIT_2;
                                current_ctx->gl_sample_coverage[0] = GL_TRUE;
                        }
@@ -2187,9 +2365,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_scissor_test, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-
                                current_ctx->_enable_flag2 |= FLAG_BIT_3;
                                current_ctx->gl_scissor_test[0] = GL_TRUE;
                        }
@@ -2198,9 +2373,6 @@ fastpath_glEnable(GLenum cap)
                        CURR_STATE_COMPARE(gl_stencil_test, GL_TRUE)
                        {
                                _orig_fastpath_glEnable(cap);
-                               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-
                                current_ctx->_enable_flag2 |= FLAG_BIT_4;
                                current_ctx->gl_stencil_test[0] = GL_TRUE;
                        }
@@ -2221,12 +2393,11 @@ fastpath_glEnableVertexAttribArray(GLuint index)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glEnableVertexAttribArray(index);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_1;
-       current_ctx->gl_vertex_array_enabled[index]    = GL_TRUE;
+       IF_GL_SUCCESS(_orig_fastpath_glEnableVertexAttribArray(index))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_1;
+               current_ctx->gl_vertex_array_enabled[index] = GL_TRUE;
+       }
 
        goto finish;
 
@@ -2244,12 +2415,11 @@ fastpath_glFrontFace(GLenum mode)
 
        CURR_STATE_COMPARE(gl_front_face, mode)
        {
-               _orig_fastpath_glFrontFace(mode);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_misc_flag1 |= FLAG_BIT_0;
-               current_ctx->gl_front_face[0] = mode;
+               IF_GL_SUCCESS(_orig_fastpath_glFrontFace(mode))
+               {
+                       current_ctx->_misc_flag1 |= FLAG_BIT_0;
+                       current_ctx->gl_front_face[0] = mode;
+               }
        }
        goto finish;
 
@@ -2257,58 +2427,6 @@ finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-
-void
-fastpath_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
-{
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       _orig_fastpath_glGetVertexAttribfv(index, pname, params);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-
-void
-fastpath_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
-{
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       _orig_fastpath_glGetVertexAttribiv(index, pname, params);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-
-void
-fastpath_glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
-{
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       _orig_fastpath_glGetVertexAttribPointerv(index, pname, pointer);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
 // Fix Maybe?
 void
 fastpath_glHint(GLenum target, GLenum mode)
@@ -2321,19 +2439,17 @@ fastpath_glHint(GLenum target, GLenum mode)
        {
                CURR_STATE_COMPARE(gl_generate_mipmap_hint, mode)
                {
-                       _orig_fastpath_glHint(target, mode);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_tex_flag1 |= FLAG_BIT_2;
-                       current_ctx->gl_generate_mipmap_hint[0] = mode;
+                       IF_GL_SUCCESS(_orig_fastpath_glHint(target, mode))
+                       {
+                               current_ctx->_tex_flag1 |= FLAG_BIT_2;
+                               current_ctx->gl_generate_mipmap_hint[0] = mode;
+                       }
                }
        }
        else
        {
-               // For GL Error to be picked up
-               _orig_fastpath_glHint(target, mode);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
        }
        goto finish;
 
@@ -2351,12 +2467,11 @@ fastpath_glLineWidth(GLfloat width)
 
        CURR_STATE_COMPARE(gl_line_width, width)
        {
-               _orig_fastpath_glLineWidth(width);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_misc_flag1 |= FLAG_BIT_1;
-               current_ctx->gl_line_width[0] = width;
+               IF_GL_SUCCESS(_orig_fastpath_glLineWidth(width))
+               {
+                       current_ctx->_misc_flag1 |= FLAG_BIT_1;
+                       current_ctx->gl_line_width[0] = width;
+               }
        }
        goto finish;
 
@@ -2376,31 +2491,28 @@ fastpath_glPixelStorei(GLenum pname, GLint param)
        {
                CURR_STATE_COMPARE(gl_pack_alignment, param)
                {
-                       _orig_fastpath_glPixelStorei(pname, param);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_misc_flag2 |= FLAG_BIT_1;
-                       current_ctx->gl_pack_alignment[0] = param;
+                       IF_GL_SUCCESS(_orig_fastpath_glPixelStorei(pname, param))
+                       {
+                               current_ctx->_misc_flag2 |= FLAG_BIT_1;
+                               current_ctx->gl_pack_alignment[0] = param;
+                       }
                }
        }
        else if (pname == GL_UNPACK_ALIGNMENT)
        {
                CURR_STATE_COMPARE(gl_unpack_alignment, param)
                {
-                       _orig_fastpath_glPixelStorei(pname, param);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_misc_flag2 |= FLAG_BIT_2;
-                       current_ctx->gl_unpack_alignment[0] = param;
+                       IF_GL_SUCCESS(_orig_fastpath_glPixelStorei(pname, param))
+                       {
+                               current_ctx->_misc_flag2 |= FLAG_BIT_2;
+                               current_ctx->gl_unpack_alignment[0] = param;
+                       }
                }
        }
        else
        {
-               // For GL Error to be picked up
-               _orig_fastpath_glPixelStorei(pname, param);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
        }
        goto finish;
 
@@ -2419,13 +2531,12 @@ fastpath_glPolygonOffset(GLfloat factor, GLfloat units)
        if ((current_ctx->gl_polygon_offset_factor[0] != factor) ||
            (current_ctx->gl_polygon_offset_units[0] != units))
        {
-               _orig_fastpath_glPolygonOffset(factor, units);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_misc_flag1 |= (FLAG_BIT_2 | FLAG_BIT_3);
-               current_ctx->gl_polygon_offset_factor[0] = factor;
-               current_ctx->gl_polygon_offset_units[0]  = units;
+               IF_GL_SUCCESS(_orig_fastpath_glPolygonOffset(factor, units))
+               {
+                       current_ctx->_misc_flag1 |= (FLAG_BIT_2 | FLAG_BIT_3);
+                       current_ctx->gl_polygon_offset_factor[0] = factor;
+                       current_ctx->gl_polygon_offset_units[0]  = units;
+               }
        }
        goto finish;
 
@@ -2444,13 +2555,12 @@ fastpath_glSampleCoverage(GLclampf value, GLboolean invert)
        if ((current_ctx->gl_sample_coverage_value[0] != value) ||
            (current_ctx->gl_sample_coverage_invert[0] != invert))
        {
-               _orig_fastpath_glSampleCoverage(value, invert);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_misc_flag1 |= (FLAG_BIT_4 | FLAG_BIT_5);
-               current_ctx->gl_sample_coverage_value[0]  = value;
-               current_ctx->gl_sample_coverage_invert[0] = invert;
+               IF_GL_SUCCESS(_orig_fastpath_glSampleCoverage(value, invert))
+               {
+                       current_ctx->_misc_flag1 |= (FLAG_BIT_4 | FLAG_BIT_5);
+                       current_ctx->gl_sample_coverage_value[0]  = value;
+                       current_ctx->gl_sample_coverage_invert[0] = invert;
+               }
        }
        goto finish;
 
@@ -2471,15 +2581,14 @@ fastpath_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
            (current_ctx->gl_scissor_box[2] != width) ||
            (current_ctx->gl_scissor_box[3] != height))
        {
-               _orig_fastpath_glScissor(x, y, width, height);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_misc_flag2 |= FLAG_BIT_0;
-               current_ctx->gl_scissor_box[0] = x;
-               current_ctx->gl_scissor_box[1] = y;
-               current_ctx->gl_scissor_box[2] = width;
-               current_ctx->gl_scissor_box[3] = height;
+               IF_GL_SUCCESS(_orig_fastpath_glScissor(x, y, width, height))
+               {
+                       current_ctx->_misc_flag2 |= FLAG_BIT_0;
+                       current_ctx->gl_scissor_box[0] = x;
+                       current_ctx->gl_scissor_box[1] = y;
+                       current_ctx->gl_scissor_box[2] = width;
+                       current_ctx->gl_scissor_box[3] = height;
+               }
        }
        goto finish;
 
@@ -2502,19 +2611,18 @@ fastpath_glStencilFunc(GLenum func, GLint ref, GLuint mask)
            (current_ctx->gl_stencil_back_ref[0] != ref) ||
            (current_ctx->gl_stencil_back_value_mask[0] != mask))
        {
-               _orig_fastpath_glStencilFunc(func, ref, mask);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_stencil_flag1 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2);
-               current_ctx->gl_stencil_func[0]             = func;
-               current_ctx->gl_stencil_ref[0]              = ref;
-               current_ctx->gl_stencil_value_mask[0]       = mask;
+               IF_GL_SUCCESS(_orig_fastpath_glStencilFunc(func, ref, mask))
+               {
+                       current_ctx->_stencil_flag1 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2);
+                       current_ctx->gl_stencil_func[0]             = func;
+                       current_ctx->gl_stencil_ref[0]              = ref;
+                       current_ctx->gl_stencil_value_mask[0]       = mask;
 
-               current_ctx->_stencil_flag2 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2);
-               current_ctx->gl_stencil_back_func[0]        = func;
-               current_ctx->gl_stencil_back_ref[0]         = ref;
-               current_ctx->gl_stencil_back_value_mask[0]  = mask;
+                       current_ctx->_stencil_flag2 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2);
+                       current_ctx->gl_stencil_back_func[0]        = func;
+                       current_ctx->gl_stencil_back_ref[0]         = ref;
+                       current_ctx->gl_stencil_back_value_mask[0]  = mask;
+               }
        }
        goto finish;
 
@@ -2536,15 +2644,14 @@ fastpath_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
                    (current_ctx->gl_stencil_ref[0] != ref) ||
                    (current_ctx->gl_stencil_value_mask[0] != mask))
                {
-                       _orig_fastpath_glStencilFuncSeparate(face, func, ref, mask);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_stencil_flag1 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2);
+                       IF_GL_SUCCESS(_orig_fastpath_glStencilFuncSeparate(face, func, ref, mask))
+                       {
+                               current_ctx->_stencil_flag1 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2);
 
-                       current_ctx->gl_stencil_func[0]             = func;
-                       current_ctx->gl_stencil_ref[0]              = ref;
-                       current_ctx->gl_stencil_value_mask[0]       = mask;
+                               current_ctx->gl_stencil_func[0]             = func;
+                               current_ctx->gl_stencil_ref[0]              = ref;
+                               current_ctx->gl_stencil_value_mask[0]       = mask;
+                       }
                }
        }
        else if ((face == GL_BACK) || (face == GL_FRONT_AND_BACK))
@@ -2553,23 +2660,20 @@ fastpath_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
                    (current_ctx->gl_stencil_back_ref[0] != ref) ||
                    (current_ctx->gl_stencil_back_value_mask[0] != mask))
                {
-                       _orig_fastpath_glStencilFuncSeparate(face, func, ref, mask);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_stencil_flag2 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2);
+                       IF_GL_SUCCESS(_orig_fastpath_glStencilFuncSeparate(face, func, ref, mask))
+                       {
+                               current_ctx->_stencil_flag2 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2);
 
-                       current_ctx->gl_stencil_back_func[0]        = func;
-                       current_ctx->gl_stencil_back_ref[0]         = ref;
-                       current_ctx->gl_stencil_back_value_mask[0]  = mask;
+                               current_ctx->gl_stencil_back_func[0]        = func;
+                               current_ctx->gl_stencil_back_ref[0]         = ref;
+                               current_ctx->gl_stencil_back_value_mask[0]  = mask;
+                       }
                }
        }
        else
        {
-               // Have GL pick up the error
-               _orig_fastpath_glStencilFuncSeparate(face, func, ref, mask);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
        }
        goto finish;
 
@@ -2588,15 +2692,14 @@ fastpath_glStencilMask(GLuint mask)
        if ((current_ctx->gl_stencil_writemask[0] != mask) ||
            (current_ctx->gl_stencil_back_writemask[0] != mask))
        {
-               _orig_fastpath_glStencilMask(mask);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_stencil_flag1 |= (FLAG_BIT_6);
-               current_ctx->_stencil_flag2 |= (FLAG_BIT_6);
+               IF_GL_SUCCESS(_orig_fastpath_glStencilMask(mask))
+               {
+                       current_ctx->_stencil_flag1 |= (FLAG_BIT_6);
+                       current_ctx->_stencil_flag2 |= (FLAG_BIT_6);
 
-               current_ctx->gl_stencil_writemask[0]        = mask;
-               current_ctx->gl_stencil_back_writemask[0]   = mask;
+                       current_ctx->gl_stencil_writemask[0]        = mask;
+                       current_ctx->gl_stencil_back_writemask[0]   = mask;
+               }
        }
        goto finish;
 
@@ -2616,31 +2719,28 @@ fastpath_glStencilMaskSeparate(GLenum face, GLuint mask)
        {
                if (current_ctx->gl_stencil_writemask[0] != mask)
                {
-                       _orig_fastpath_glStencilMaskSeparate(face, mask);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_stencil_flag1 |= (FLAG_BIT_6);
-                       current_ctx->gl_stencil_writemask[0] = mask;
+                       IF_GL_SUCCESS(_orig_fastpath_glStencilMaskSeparate(face, mask))
+                       {
+                               current_ctx->_stencil_flag1 |= (FLAG_BIT_6);
+                               current_ctx->gl_stencil_writemask[0] = mask;
+                       }
                }
        }
        else if ((face == GL_BACK) || (face == GL_FRONT_AND_BACK))
        {
                if (current_ctx->gl_stencil_back_writemask[0] != mask)
                {
-                       _orig_fastpath_glStencilMaskSeparate(face, mask);
-
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_stencil_flag2 |= (FLAG_BIT_6);
-                       current_ctx->gl_stencil_back_writemask[0]   = mask;
+                       IF_GL_SUCCESS(_orig_fastpath_glStencilMaskSeparate(face, mask))
+                       {
+                               current_ctx->_stencil_flag2 |= (FLAG_BIT_6);
+                               current_ctx->gl_stencil_back_writemask[0]   = mask;
+                       }
                }
        }
        else
        {
-               // Have GL pick up the error
-               _orig_fastpath_glStencilMaskSeparate(face, mask);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
        }
        goto finish;
 
@@ -2663,19 +2763,18 @@ fastpath_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
            (current_ctx->gl_stencil_back_pass_depth_fail[0] != zfail) ||
            (current_ctx->gl_stencil_back_pass_depth_pass[0] != zpass))
        {
-               _orig_fastpath_glStencilOp(fail, zfail, zpass);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_stencil_flag1 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5);
-               current_ctx->gl_stencil_fail[0]              = fail;
-               current_ctx->gl_stencil_pass_depth_fail[0]   = zfail;
-               current_ctx->gl_stencil_pass_depth_pass[0]   = zpass;
+               IF_GL_SUCCESS(_orig_fastpath_glStencilOp(fail, zfail, zpass))
+               {
+                       current_ctx->_stencil_flag1 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5);
+                       current_ctx->gl_stencil_fail[0]              = fail;
+                       current_ctx->gl_stencil_pass_depth_fail[0]   = zfail;
+                       current_ctx->gl_stencil_pass_depth_pass[0]   = zpass;
 
-               current_ctx->_stencil_flag2 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5);
-               current_ctx->gl_stencil_back_fail[0]         = fail;
-               current_ctx->gl_stencil_back_pass_depth_fail[0]   = zfail;
-               current_ctx->gl_stencil_back_pass_depth_pass[0]   = zpass;
+                       current_ctx->_stencil_flag2 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5);
+                       current_ctx->gl_stencil_back_fail[0]         = fail;
+                       current_ctx->gl_stencil_back_pass_depth_fail[0]   = zfail;
+                       current_ctx->gl_stencil_back_pass_depth_pass[0]   = zpass;
+               }
        }
        goto finish;
 
@@ -2697,13 +2796,13 @@ fastpath_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpas
                    (current_ctx->gl_stencil_pass_depth_fail[0] != zfail) ||
                    (current_ctx->gl_stencil_pass_depth_pass[0] != zpass))
                {
-                       _orig_fastpath_glStencilOpSeparate(face, fail, zfail, zpass);
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_stencil_flag1 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5);
-                       current_ctx->gl_stencil_fail[0]              = fail;
-                       current_ctx->gl_stencil_pass_depth_fail[0]   = zfail;
-                       current_ctx->gl_stencil_pass_depth_pass[0]   = zpass;
+                       IF_GL_SUCCESS(_orig_fastpath_glStencilOpSeparate(face, fail, zfail, zpass))
+                       {
+                               current_ctx->_stencil_flag1 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5);
+                               current_ctx->gl_stencil_fail[0]              = fail;
+                               current_ctx->gl_stencil_pass_depth_fail[0]   = zfail;
+                               current_ctx->gl_stencil_pass_depth_pass[0]   = zpass;
+                       }
                }
        }
        else if ((face == GL_BACK) || (face == GL_FRONT_AND_BACK))
@@ -2712,20 +2811,19 @@ fastpath_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpas
                    (current_ctx->gl_stencil_back_pass_depth_fail[0] != zfail) ||
                    (current_ctx->gl_stencil_back_pass_depth_pass[0] != zpass))
                {
-                       _orig_fastpath_glStencilOpSeparate(face, fail, zfail, zpass);
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-                       current_ctx->_stencil_flag2 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5);
-                       current_ctx->gl_stencil_back_fail[0]         = fail;
-                       current_ctx->gl_stencil_back_pass_depth_fail[0]   = zfail;
-                       current_ctx->gl_stencil_back_pass_depth_pass[0]   = zpass;
+                       IF_GL_SUCCESS(_orig_fastpath_glStencilOpSeparate(face, fail, zfail, zpass))
+                       {
+                               current_ctx->_stencil_flag2 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5);
+                               current_ctx->gl_stencil_back_fail[0]              = fail;
+                               current_ctx->gl_stencil_back_pass_depth_fail[0]   = zfail;
+                               current_ctx->gl_stencil_back_pass_depth_pass[0]   = zpass;
+                       }
                }
        }
        else
        {
-               // For picking up error purpose
-               _orig_fastpath_glStencilOpSeparate(face, fail, zfail, zpass);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               _set_gl_error(GL_INVALID_ENUM);
+               goto finish;
        }
        goto finish;
 
@@ -2741,15 +2839,14 @@ fastpath_glVertexAttrib1f(GLuint indx, GLfloat x)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttrib1f(indx, x);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = x;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = 0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = 0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttrib1f(indx, x))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = x;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = 0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = 0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       }
        goto finish;
 
 finish:
@@ -2765,15 +2862,14 @@ fastpath_glVertexAttrib1fv(GLuint indx, const GLfloat* values)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttrib1fv(indx, values);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = values[0];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = 0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = 0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttrib1fv(indx, values))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = values[0];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = 0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = 0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       }
        goto finish;
 
 finish:
@@ -2789,15 +2885,14 @@ fastpath_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttrib2f(indx, x, y);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = x;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = y;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = 0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttrib2f(indx, x, y))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = x;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = y;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = 0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       }
        goto finish;
 
 finish:
@@ -2813,15 +2908,14 @@ fastpath_glVertexAttrib2fv(GLuint indx, const GLfloat* values)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttrib2fv(indx, values);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = values[0];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = values[1];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = 0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttrib2fv(indx, values))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = values[0];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = values[1];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = 0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       }
        goto finish;
 
 finish:
@@ -2837,15 +2931,14 @@ fastpath_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttrib3f(indx, x, y, z);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = x;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = y;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = z;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttrib3f(indx, x, y, z))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = x;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = y;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = z;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       }
        goto finish;
 
 finish:
@@ -2861,15 +2954,14 @@ fastpath_glVertexAttrib3fv(GLuint indx, const GLfloat* values)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttrib3fv(indx, values);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = values[0];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = values[1];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = values[2];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttrib3fv(indx, values))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = values[0];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = values[1];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = values[2];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = 1;
+       }
        goto finish;
 
 finish:
@@ -2885,15 +2977,14 @@ fastpath_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttrib4f(indx, x, y, z, w);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = x;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = y;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = z;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = w;
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttrib4f(indx, x, y, z, w))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = x;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = y;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = z;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = w;
+       }
        goto finish;
 
 finish:
@@ -2909,15 +3000,14 @@ fastpath_glVertexAttrib4fv(GLuint indx, const GLfloat* values)
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttrib4fv(indx, values);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_0;
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = values[0];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = values[1];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = values[2];
-       current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = values[3];
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttrib4fv(indx, values))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_0;
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 0] = values[0];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 1] = values[1];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 2] = values[2];
+               current_ctx->gl_vertex_attrib_value[indx * 4 + 3] = values[3];
+       }
        goto finish;
 
 finish:
@@ -2934,18 +3024,17 @@ fastpath_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean n
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
-
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-       current_ctx->_vattrib_flag |= FLAG_BIT_1;
+       IF_GL_SUCCESS(_orig_fastpath_glVertexAttribPointer(indx, size, type, normalized, stride, ptr))
+       {
+               current_ctx->_vattrib_flag |= FLAG_BIT_1;
 
-       current_ctx->gl_vertex_array_buf_id[indx]     = current_ctx->gl_array_buffer_binding[0];
-       current_ctx->gl_vertex_array_size[indx]       = size;
-       current_ctx->gl_vertex_array_type[indx]       = type;
-       current_ctx->gl_vertex_array_normalized[indx] = normalized;
-       current_ctx->gl_vertex_array_stride[indx]     = stride;
-       current_ctx->gl_vertex_array_pointer[indx]    = (GLvoid *)ptr;
+               current_ctx->gl_vertex_array_buf_id[indx]     = current_ctx->gl_array_buffer_binding[0];
+               current_ctx->gl_vertex_array_size[indx]       = size;
+               current_ctx->gl_vertex_array_type[indx]       = type;
+               current_ctx->gl_vertex_array_normalized[indx] = normalized;
+               current_ctx->gl_vertex_array_stride[indx]     = stride;
+               current_ctx->gl_vertex_array_pointer[indx]    = (GLvoid *)ptr;
+       }
        goto finish;
 
 finish:
@@ -2965,15 +3054,14 @@ fastpath_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
            (current_ctx->gl_viewport[2] != width) ||
            (current_ctx->gl_viewport[3] != height))
        {
-               _orig_fastpath_glViewport(x, y, width, height);
-
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
-               current_ctx->_clear_flag1 |= FLAG_BIT_0;
-               current_ctx->gl_viewport[0] = x;
-               current_ctx->gl_viewport[1] = y;
-               current_ctx->gl_viewport[2] = width;
-               current_ctx->gl_viewport[3] = height;
+               IF_GL_SUCCESS(_orig_fastpath_glViewport(x, y, width, height))
+               {
+                       current_ctx->_clear_flag1 |= FLAG_BIT_0;
+                       current_ctx->gl_viewport[0] = x;
+                       current_ctx->gl_viewport[1] = y;
+                       current_ctx->gl_viewport[2] = width;
+                       current_ctx->gl_viewport[3] = height;
+               }
        }
        goto finish;
 
@@ -3004,8 +3092,6 @@ fastpath_glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
 
        _orig_fastpath_glEGLImageTargetTexture2DOES(target, image);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
        goto finish;
 
 finish:
@@ -3043,9 +3129,8 @@ _process_getfunc(GLenum pname, GLvoid *ptr, GLenum get_type)
                        GLint real_obj_id = _COREGL_INT_INIT_VALUE;
                        GLuint glue_obj_id = _COREGL_INT_INIT_VALUE;
                        GL_Object_Type obj_type = GL_OBJECT_TYPE_UNKNOWN;
-                       _orig_fastpath_glGetIntegerv(pname, (GLint *)&real_obj_id);
 
-                       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+                       _orig_fastpath_glGetIntegerv(pname, (GLint *)&real_obj_id);
 
                        switch(pname)
                        {
@@ -3092,7 +3177,6 @@ fastpath_glGetBooleanv(GLenum pname, GLboolean* params)
        if (_process_getfunc(pname, params, GL_BOOL) != GL_TRUE)
        {
                _orig_fastpath_glGetBooleanv(pname, params);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        }
        goto finish;
 
@@ -3110,7 +3194,6 @@ fastpath_glGetFloatv(GLenum pname, GLfloat* params)
        if (_process_getfunc(pname, params, GL_FLOAT) != GL_TRUE)
        {
                _orig_fastpath_glGetFloatv(pname, params);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        }
        goto finish;
 
@@ -3128,7 +3211,6 @@ fastpath_glGetIntegerv(GLenum pname, GLint* params)
        if (_process_getfunc(pname, params, GL_INT) != GL_TRUE)
        {
                _orig_fastpath_glGetIntegerv(pname, params);
-               GLERR(__FUNCTION__, __FILE__, __LINE__, "");
        }
        goto finish;
 
index 351750e..060d140 100644 (file)
@@ -171,23 +171,14 @@ tracepath_apply_overrides()
        }
 }
 
-#define OVERRIDE(f) \
-       if (enable == 1) \
-       { \
-               COREGL_OVERRIDE_API(_orig_tracepath_, f, ovr_); \
-               COREGL_OVERRIDE_API(ovr_, f, tracepath_); \
-       } \
-       else \
-       { \
-               AST(ovr_##f != NULL); \
-               COREGL_OVERRIDE_API(ovr_, f, _orig_tracepath_); \
-               _orig_tracepath_##f = NULL; \
-       }
-
 void
 tracepath_apply_overrides_egl(int enable)
 {
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     OVERRIDE(FUNC_NAME);
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_INIT_ORIGINAL(_orig_tracepath_, FUNC_NAME);
+# include "../../headers/sym_egl.h"
+#undef _COREGL_SYMBOL
+
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_OVERRIDE(tracepath_, FUNC_NAME);
 # include "../../headers/sym_egl.h"
 #undef _COREGL_SYMBOL
 }
@@ -195,7 +186,11 @@ tracepath_apply_overrides_egl(int enable)
 void
 tracepath_apply_overrides_gl(int enable)
 {
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     OVERRIDE(FUNC_NAME);
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_INIT_ORIGINAL(_orig_tracepath_, FUNC_NAME);
+# include "../../headers/sym_gl.h"
+#undef _COREGL_SYMBOL
+
+#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_OVERRIDE(tracepath_, FUNC_NAME);
 # include "../../headers/sym_gl.h"
 #undef _COREGL_SYMBOL
 
index 0ccc804..af360fd 100644 (file)
@@ -162,7 +162,7 @@ tracepath_glActiveTexture(GLenum texture)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glActiveTexture(texture);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -174,7 +174,7 @@ tracepath_glAttachShader(GLuint program, GLuint shader)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glAttachShader(program, shader);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -186,7 +186,7 @@ tracepath_glBindAttribLocation(GLuint program, GLuint index, const char* name)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBindAttribLocation(program, index, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -198,7 +198,7 @@ tracepath_glBindBuffer(GLenum target, GLuint buffer)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBindBuffer(target, buffer);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -211,7 +211,7 @@ tracepath_glBindFramebuffer(GLenum target, GLuint framebuffer)
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBindFramebuffer(target, framebuffer);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -223,7 +223,7 @@ tracepath_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBindRenderbuffer(target, renderbuffer);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -235,7 +235,7 @@ tracepath_glBindTexture(GLenum target, GLuint texture)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBindTexture(target, texture);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -247,7 +247,7 @@ tracepath_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alp
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBlendColor(red, green, blue, alpha);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -259,7 +259,7 @@ tracepath_glBlendEquation(GLenum mode)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBlendEquation(mode);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -271,7 +271,7 @@ tracepath_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBlendEquationSeparate(modeRGB, modeAlpha);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -283,7 +283,7 @@ tracepath_glBlendFunc(GLenum sfactor, GLenum dfactor)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBlendFunc(sfactor, dfactor);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -295,7 +295,7 @@ tracepath_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLe
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -307,7 +307,7 @@ tracepath_glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBufferData(target, size, data, usage);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -319,7 +319,7 @@ tracepath_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glBufferSubData(target, offset, size, data);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -333,7 +333,7 @@ tracepath_glCheckFramebufferStatus(GLenum target)
 
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glCheckFramebufferStatus(target);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -346,7 +346,7 @@ tracepath_glClear(GLbitfield mask)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glClear(mask);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -358,7 +358,7 @@ tracepath_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alp
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glClearColor(red, green, blue, alpha);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -370,7 +370,7 @@ tracepath_glClearDepthf(GLclampf depth)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glClearDepthf(depth);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -382,7 +382,7 @@ tracepath_glClearStencil(GLint s)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glClearStencil(s);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -394,7 +394,7 @@ tracepath_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glColorMask(red, green, blue, alpha);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -406,7 +406,7 @@ tracepath_glCompileShader(GLuint shader)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glCompileShader(shader);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -418,7 +418,7 @@ tracepath_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalform
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -430,7 +430,7 @@ tracepath_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, G
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -442,7 +442,7 @@ tracepath_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GL
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -454,7 +454,7 @@ tracepath_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint y
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -468,7 +468,7 @@ tracepath_glCreateProgram(void)
 
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glCreateProgram();
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -482,7 +482,7 @@ tracepath_glCreateShader(GLenum type)
        GLuint ret = _COREGL_INT_INIT_VALUE;
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glCreateShader(type);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -495,7 +495,7 @@ tracepath_glCullFace(GLenum mode)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glCullFace(mode);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -507,7 +507,7 @@ tracepath_glDeleteBuffers(GLsizei n, const GLuint* buffers)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDeleteBuffers(n, buffers);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -519,7 +519,7 @@ tracepath_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDeleteFramebuffers(n, framebuffers);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -531,7 +531,7 @@ tracepath_glDeleteProgram(GLuint program)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDeleteProgram(program);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -543,7 +543,7 @@ tracepath_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDeleteRenderbuffers(n, renderbuffers);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -572,7 +572,7 @@ tracepath_glDeleteShader(GLuint shader)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDeleteShader(shader);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -584,7 +584,7 @@ tracepath_glDeleteTextures(GLsizei n, const GLuint* textures)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDeleteTextures(n, textures);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -613,7 +613,7 @@ tracepath_glDepthFunc(GLenum func)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDepthFunc(func);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -625,7 +625,7 @@ tracepath_glDepthMask(GLboolean flag)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDepthMask(flag);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -637,7 +637,7 @@ tracepath_glDepthRangef(GLclampf zNear, GLclampf zFar)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDepthRangef(zNear, zFar);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -649,7 +649,7 @@ tracepath_glDetachShader(GLuint program, GLuint shader)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDetachShader(program, shader);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -661,7 +661,7 @@ tracepath_glDisable(GLenum cap)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDisable(cap);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -673,7 +673,7 @@ tracepath_glDisableVertexAttribArray(GLuint index)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDisableVertexAttribArray(index);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -685,7 +685,7 @@ tracepath_glDrawArrays(GLenum mode, GLint first, GLsizei count)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDrawArrays(mode, first, count);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -697,7 +697,7 @@ tracepath_glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* in
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDrawElements(mode, count, type, indices);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -709,7 +709,7 @@ tracepath_glEnable(GLenum cap)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glEnable(cap);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -721,7 +721,7 @@ tracepath_glEnableVertexAttribArray(GLuint index)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glEnableVertexAttribArray(index);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -733,7 +733,7 @@ tracepath_glFinish(void)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glFinish();
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -747,7 +747,7 @@ tracepath_glFlush(void)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glFlush();
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -761,7 +761,7 @@ tracepath_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum ren
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -773,7 +773,7 @@ tracepath_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textar
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glFramebufferTexture2D(target, attachment, textarget, texture, level);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -785,7 +785,7 @@ tracepath_glFrontFace(GLenum mode)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glFrontFace(mode);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -798,7 +798,7 @@ tracepath_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetVertexAttribfv(index, pname, params);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -811,7 +811,7 @@ tracepath_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetVertexAttribiv(index, pname, params);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -824,7 +824,7 @@ tracepath_glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetVertexAttribPointerv(index, pname, pointer);
 
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
 
        goto finish;
 
@@ -837,7 +837,7 @@ tracepath_glHint(GLenum target, GLenum mode)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glHint(target, mode);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -849,7 +849,7 @@ tracepath_glGenBuffers(GLsizei n, GLuint* buffers)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGenBuffers(n, buffers);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -861,7 +861,7 @@ tracepath_glGenerateMipmap(GLenum target)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGenerateMipmap(target);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -873,7 +873,7 @@ tracepath_glGenFramebuffers(GLsizei n, GLuint* framebuffers)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGenFramebuffers(n, framebuffers);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -885,7 +885,7 @@ tracepath_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGenRenderbuffers(n, renderbuffers);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -914,7 +914,7 @@ tracepath_glGenTextures(GLsizei n, GLuint* textures)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGenTextures(n, textures);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -943,7 +943,7 @@ tracepath_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsiz
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetActiveAttrib(program, index, bufsize, length, size, type, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -955,7 +955,7 @@ tracepath_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsi
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetActiveUniform(program, index, bufsize, length, size, type, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -967,7 +967,7 @@ tracepath_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count,
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetAttachedShaders(program, maxcount, count, shaders);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -980,7 +980,7 @@ tracepath_glGetAttribLocation(GLuint program, const char* name)
        int ret = _COREGL_INT_INIT_VALUE;
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glGetAttribLocation(program, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -993,7 +993,7 @@ tracepath_glGetBooleanv(GLenum pname, GLboolean* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetBooleanv(pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1005,7 +1005,7 @@ tracepath_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetBufferParameteriv(target, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1031,7 +1031,7 @@ tracepath_glGetFloatv(GLenum pname, GLfloat* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetFloatv(pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1043,7 +1043,7 @@ tracepath_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1055,7 +1055,7 @@ tracepath_glGetIntegerv(GLenum pname, GLint* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetIntegerv(pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1067,7 +1067,7 @@ tracepath_glGetProgramiv(GLuint program, GLenum pname, GLint* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetProgramiv(program, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1079,7 +1079,7 @@ tracepath_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length,
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetProgramInfoLog(program, bufsize, length, infolog);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1091,7 +1091,7 @@ tracepath_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* param
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetRenderbufferParameteriv(target, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1103,7 +1103,7 @@ tracepath_glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetShaderiv(shader, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1115,7 +1115,7 @@ tracepath_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, ch
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetShaderInfoLog(shader, bufsize, length, infolog);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1127,7 +1127,7 @@ tracepath_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GL
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1139,7 +1139,7 @@ tracepath_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, cha
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetShaderSource(shader, bufsize, length, source);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1153,7 +1153,7 @@ tracepath_glGetString(GLenum name)
 
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glGetString(name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1166,7 +1166,7 @@ tracepath_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetTexParameterfv(target, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1178,7 +1178,7 @@ tracepath_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetTexParameteriv(target, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1190,7 +1190,7 @@ tracepath_glGetUniformfv(GLuint program, GLint location, GLfloat* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetUniformfv(program, location, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1202,7 +1202,7 @@ tracepath_glGetUniformiv(GLuint program, GLint location, GLint* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetUniformiv(program, location, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1215,7 +1215,7 @@ tracepath_glGetUniformLocation(GLuint program, const char* name)
 
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glGetUniformLocation(program, name);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1230,7 +1230,7 @@ tracepath_glIsBuffer(GLuint buffer)
 
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glIsBuffer(buffer);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1245,7 +1245,7 @@ tracepath_glIsEnabled(GLenum cap)
 
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glIsEnabled(cap);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1260,7 +1260,7 @@ tracepath_glIsFramebuffer(GLuint framebuffer)
 
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glIsFramebuffer(framebuffer);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1274,7 +1274,7 @@ tracepath_glIsProgram(GLuint program)
        GLboolean ret;
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glIsProgram(program);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1288,7 +1288,7 @@ tracepath_glIsRenderbuffer(GLuint renderbuffer)
        GLboolean ret;
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glIsRenderbuffer(renderbuffer);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1302,7 +1302,7 @@ tracepath_glIsShader(GLuint shader)
        GLboolean ret;
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glIsShader(shader);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1316,7 +1316,7 @@ tracepath_glIsTexture(GLuint texture)
        GLboolean ret;
        _COREGL_TRACEPATH_FUNC_BEGIN();
        ret = _orig_tracepath_glIsTexture(texture);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1329,7 +1329,7 @@ tracepath_glLineWidth(GLfloat width)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glLineWidth(width);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1341,7 +1341,7 @@ tracepath_glLinkProgram(GLuint program)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glLinkProgram(program);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1353,7 +1353,7 @@ tracepath_glPixelStorei(GLenum pname, GLint param)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glPixelStorei(pname, param);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1365,7 +1365,7 @@ tracepath_glPolygonOffset(GLfloat factor, GLfloat units)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glPolygonOffset(factor, units);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1377,7 +1377,7 @@ tracepath_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum f
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glReadPixels(x, y, width, height, format, type, pixels);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1389,7 +1389,7 @@ tracepath_glReleaseShaderCompiler(void)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glReleaseShaderCompiler();
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1401,7 +1401,7 @@ tracepath_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei wi
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glRenderbufferStorage(target, internalformat, width, height);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1452,7 +1452,7 @@ tracepath_glSampleCoverage(GLclampf value, GLboolean invert)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glSampleCoverage(value, invert);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1464,7 +1464,7 @@ tracepath_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glScissor(x, y, width, height);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1476,7 +1476,7 @@ tracepath_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat,
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glShaderBinary(n, shaders, binaryformat, binary, length);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1488,7 +1488,7 @@ tracepath_glShaderSource(GLuint shader, GLsizei count, const char** string, cons
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glShaderSource(shader, count, string, length);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1500,7 +1500,7 @@ tracepath_glStencilFunc(GLenum func, GLint ref, GLuint mask)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glStencilFunc(func, ref, mask);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1512,7 +1512,7 @@ tracepath_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glStencilFuncSeparate(face, func, ref, mask);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1524,7 +1524,7 @@ tracepath_glStencilMask(GLuint mask)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glStencilMask(mask);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1536,7 +1536,7 @@ tracepath_glStencilMaskSeparate(GLenum face, GLuint mask)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glStencilMaskSeparate(face, mask);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1548,7 +1548,7 @@ tracepath_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glStencilOp(fail, zfail, zpass);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1560,7 +1560,7 @@ tracepath_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpa
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glStencilOpSeparate(face, fail, zfail, zpass);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1572,7 +1572,7 @@ tracepath_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1623,7 +1623,7 @@ tracepath_glTexParameterf(GLenum target, GLenum pname, GLfloat param)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glTexParameterf(target, pname, param);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1635,7 +1635,7 @@ tracepath_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glTexParameterfv(target, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1647,7 +1647,7 @@ tracepath_glTexParameteri(GLenum target, GLenum pname, GLint param)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glTexParameteri(target, pname, param);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1659,7 +1659,7 @@ tracepath_glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glTexParameteriv(target, pname, params);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1671,7 +1671,7 @@ tracepath_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffs
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1683,7 +1683,7 @@ tracepath_glUniform1f(GLint location, GLfloat x)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform1f(location, x);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1695,7 +1695,7 @@ tracepath_glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform1fv(location, count, v);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1707,7 +1707,7 @@ tracepath_glUniform1i(GLint location, GLint x)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform1i(location, x);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1719,7 +1719,7 @@ tracepath_glUniform1iv(GLint location, GLsizei count, const GLint* v)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform1iv(location, count, v);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1731,7 +1731,7 @@ tracepath_glUniform2f(GLint location, GLfloat x, GLfloat y)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform2f(location, x, y);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1743,7 +1743,7 @@ tracepath_glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform2fv(location, count, v);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1755,7 +1755,7 @@ tracepath_glUniform2i(GLint location, GLint x, GLint y)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform2i(location, x, y);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1767,7 +1767,7 @@ tracepath_glUniform2iv(GLint location, GLsizei count, const GLint* v)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform2iv(location, count, v);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1779,7 +1779,7 @@ tracepath_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform3f(location, x, y, z);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1791,7 +1791,7 @@ tracepath_glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform3fv(location, count, v);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1803,7 +1803,7 @@ tracepath_glUniform3i(GLint location, GLint x, GLint y, GLint z)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform3i(location, x, y, z);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1815,7 +1815,7 @@ tracepath_glUniform3iv(GLint location, GLsizei count, const GLint* v)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform3iv(location, count, v);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1827,7 +1827,7 @@ tracepath_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform4f(location, x, y, z, w);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1839,7 +1839,7 @@ tracepath_glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform4fv(location, count, v);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1851,7 +1851,7 @@ tracepath_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform4i(location, x, y, z, w);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1863,7 +1863,7 @@ tracepath_glUniform4iv(GLint location, GLsizei count, const GLint* v)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniform4iv(location, count, v);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1875,7 +1875,7 @@ tracepath_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose,
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniformMatrix2fv(location, count, transpose, value);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1887,7 +1887,7 @@ tracepath_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose,
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniformMatrix3fv(location, count, transpose, value);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1899,7 +1899,7 @@ tracepath_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUniformMatrix4fv(location, count, transpose, value);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1911,7 +1911,7 @@ tracepath_glUseProgram(GLuint program)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glUseProgram(program);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1923,7 +1923,7 @@ tracepath_glValidateProgram(GLuint program)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glValidateProgram(program);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1935,7 +1935,7 @@ tracepath_glVertexAttrib1f(GLuint indx, GLfloat x)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttrib1f(indx, x);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1947,7 +1947,7 @@ tracepath_glVertexAttrib1fv(GLuint indx, const GLfloat* values)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttrib1fv(indx, values);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1959,7 +1959,7 @@ tracepath_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttrib2f(indx, x, y);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1971,7 +1971,7 @@ tracepath_glVertexAttrib2fv(GLuint indx, const GLfloat* values)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttrib2fv(indx, values);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1983,7 +1983,7 @@ tracepath_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttrib3f(indx, x, y, z);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -1995,7 +1995,7 @@ tracepath_glVertexAttrib3fv(GLuint indx, const GLfloat* values)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttrib3fv(indx, values);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2007,7 +2007,7 @@ tracepath_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttrib4f(indx, x, y, z, w);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2019,7 +2019,7 @@ tracepath_glVertexAttrib4fv(GLuint indx, const GLfloat* values)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttrib4fv(indx, values);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2031,7 +2031,7 @@ tracepath_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2043,7 +2043,7 @@ tracepath_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glViewport(x, y, width, height);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2113,7 +2113,7 @@ tracepath_glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei* length, G
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glGetProgramBinary(program, bufsize, length, binaryFormat, binary);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2125,7 +2125,7 @@ tracepath_glProgramBinary(GLuint program, GLenum binaryFormat, const void* binar
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glProgramBinary(program, binaryFormat, binary, length);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2138,7 +2138,7 @@ tracepath_glProgramParameteri(GLuint program, GLuint pname, GLint value)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glProgramParameteri(program, pname, value);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2150,7 +2150,7 @@ tracepath_glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GL
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2201,7 +2201,7 @@ tracepath_glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish:
@@ -2213,7 +2213,7 @@ tracepath_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const G
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
        _orig_tracepath_glDiscardFramebufferEXT(target, numAttachments, attachments);
-       GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
        goto finish;
 
 finish: