Fix duplicate code issue for coregl_fastpath_gl.c 53/238653/5
authorwanchao.xu <wanchao.xu@samsung.com>
Thu, 16 Jul 2020 05:19:28 +0000 (13:19 +0800)
committerXuelian <xuelian.bai@samsung.com>
Tue, 11 Aug 2020 10:11:32 +0000 (18:11 +0800)
Reuse code for gl*/gl*EXT/... functions.

Signed-off-by: Wanchao Xu <wanchao.xu@samsung.com>
Change-Id: If4ae3dfed6a022f8188e3e0862b29a486f5f863c

src/modules/fastpath/coregl_fastpath.h
src/modules/fastpath/coregl_fastpath_gl.c
src/modules/tracepath/coregl_tracepath.h
src/modules/tracepath/coregl_tracepath_gl.c

index bb7a837..1e970db 100644 (file)
@@ -118,6 +118,11 @@ typedef struct {
 
 #define GL_OBJECT_ID_LIMIT         0xFFFFFF
 
+#define FASTPATH_FUNC_TYPE                 int
+#define FASTPATH_FUNC_TYPE_STANDARD        0x10
+#define FASTPATH_FUNC_TYPE_OES             0x20
+#define FASTPATH_FUNC_TYPE_EXT             0x30
+
 #define GL_Object_Type                     int
 #define GL_OBJECT_TYPE_QUERY               0x0
 #define GL_OBJECT_TYPE_TEXTURE             0x1000000
index 284eac5..1a13e87 100644 (file)
@@ -373,28 +373,49 @@ finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glSampleCoveragex(GLclampx value, GLboolean invert)
+static void
+_fp_glSampleCoveragex(GLclampx value, GLboolean invert, FASTPATH_FUNC_TYPE ftype)
 {
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (CURR_STATE_COMPARE(gl_sample_coverage_value, 0, value) ||
                        CURR_STATE_COMPARE(gl_sample_coverage_invert, 0, invert)) {
-               IF_GL_SUCCESS(_orig_fastpath_glSampleCoveragex(value, invert)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glSampleCoveragex(value, invert);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glSampleCoveragexOES(value, invert);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        current_ctx->_misc_flag1 |=
                                _MISC_FLAG1_BIT_gl_sample_coverage_value |
                                _MISC_FLAG1_BIT_gl_sample_coverage_invert;
 
-                       CURR_STATE_UPDATE(gl_sample_coverage_value, 0, value);
-                       CURR_STATE_UPDATE(gl_sample_coverage_invert, 0, invert);
+                       CURR_STATE_UPDATE(gl_sample_coverage_value, 0, value)
+                       CURR_STATE_UPDATE(gl_sample_coverage_invert, 0, invert)
                }
        }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glSampleCoveragex(GLclampx value, GLboolean invert)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glSampleCoveragex(value, invert, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -721,14 +742,13 @@ finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glFramebufferTexture2D(GLenum target, GLenum attachment,
-                                                               GLenum textarget, GLuint texture, GLint level)
+static void
+_fp_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget,
+               GLuint texture, GLint level, GLsizei samples, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1) {
@@ -736,12 +756,37 @@ fastpath_glFramebufferTexture2D(GLenum target, GLenum attachment,
                goto finish;
        }
 
-       _orig_fastpath_glFramebufferTexture2D(target, attachment, textarget, real_obj,
-                                                                                 level);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glFramebufferTexture2D(target, attachment, textarget, real_obj, level);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glFramebufferTexture2DOES(target, attachment, textarget, real_obj, level);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glFramebufferTexture2DMultisampleEXT(target, attachment,
+                       textarget, real_obj, level, samples);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glFramebufferTexture2D(GLenum target, GLenum attachment,
+                                   GLenum textarget, GLuint texture, GLint level)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glFramebufferTexture2D(target, attachment, textarget,
+               texture, level, 0, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -775,44 +820,43 @@ void
 fastpath_glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
                GLenum textarget, GLuint texture, GLint level, GLsizei samples)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
-
-       _orig_fastpath_glFramebufferTexture2DMultisampleEXT(target, attachment,
-                       textarget, real_obj, level, samples);
 
-       goto finish;
+       _fp_glFramebufferTexture2D(target, attachment, textarget,
+               texture, level, samples, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-void
-fastpath_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment,
-               GLenum pname, GLint *params)
+static void
+_fp_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment,
+       GLenum pname, GLint *params, FASTPATH_FUNC_TYPE ftype)
 {
        GLint real_obj, fa_type;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        switch (pname) {
        case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
                params[0] = 0;
-               _orig_fastpath_glGetFramebufferAttachmentParameteriv(target, attachment, pname,
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glGetFramebufferAttachmentParameteriv(target, attachment, pname,
                                &real_obj);
-               _orig_fastpath_glGetFramebufferAttachmentParameteriv(target, attachment,
+                       _orig_fastpath_glGetFramebufferAttachmentParameteriv(target, attachment,
+                               GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &fa_type);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glGetFramebufferAttachmentParameterivOES(target, attachment,
+                               pname, &real_obj);
+                       _orig_fastpath_glGetFramebufferAttachmentParameterivOES(target, attachment,
                                GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &fa_type);
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
                switch (fa_type) {
                case GL_TEXTURE:
                        if (GET_GLUE_OBJ(GL_OBJECT_TYPE_TEXTURE, real_obj, (GLuint *)params) != 1) {
@@ -830,14 +874,37 @@ fastpath_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment,
                }
                break;
        default:
-               _orig_fastpath_glGetFramebufferAttachmentParameteriv(target, attachment, pname,
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glGetFramebufferAttachmentParameteriv(target, attachment, pname,
                                params);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glGetFramebufferAttachmentParameterivOES(target, attachment,
+                               pname, params);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
                break;
        }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment,
+       GLenum pname, GLint* params)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGetFramebufferAttachmentParameteriv(target, attachment, pname,
+                       params, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -1336,14 +1403,13 @@ finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+static void
+_fp_glGenFramebuffers(GLsizei n, GLuint *framebuffers, FASTPATH_FUNC_TYPE ftype)
 {
        int i;
        GLuint *objid_array = NULL;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (n < 0) {
@@ -1357,7 +1423,20 @@ fastpath_glGenFramebuffers(GLsizei n, GLuint *framebuffers)
 
        objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
 
-       IF_GL_SUCCESS(_orig_fastpath_glGenFramebuffers(n, objid_array)) {
+       _get_gl_error();
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGenFramebuffers(n, objid_array);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glGenFramebuffersOES(n, objid_array);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
+
+       if (_get_gl_error() == GL_NO_ERROR) {
                for (i = 0; i < n; i++) {
                        framebuffers[i] = fastpath_ostate_create_object(&current_ctx->ostate,
                                                          GL_OBJECT_TYPE_FRAMEBUFFER, objid_array[i]);
@@ -1371,16 +1450,24 @@ finish:
                free(objid_array);
                objid_array = NULL;
        }
-       _COREGL_FASTPATH_FUNC_END();
 }
 
 void
-fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
+fastpath_glGenFramebuffers(GLsizei n, GLuint* framebuffers)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGenFramebuffers(n, framebuffers, FASTPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glBindFramebuffer(GLenum target, GLuint framebuffer, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_FRAMEBUFFER, framebuffer, &real_obj) != 1) {
@@ -1391,13 +1478,23 @@ fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
 #define STATE_PROC(gl_state, flagid, flagbit) \
        {       \
                if(real_obj == 0) {     \
-                       IF_GL_SUCCESS(_orig_fastpath_glBindFramebuffer(target, real_obj)) { \
+                       _get_gl_error(); \
+                       if (ftype == FASTPATH_FUNC_TYPE_STANDARD) \
+                               _orig_fastpath_glBindFramebuffer(target, real_obj);     \
+                       else if (ftype == FASTPATH_FUNC_TYPE_OES)       \
+                               _orig_fastpath_glBindFramebufferOES(target, real_obj);  \
+                       if (_get_gl_error() == GL_NO_ERROR){    \
                                current_ctx->flagid &= (~flagbit##_##gl_state); \
                                CURR_STATE_CLEAR(gl_state, 0);                                  \
                        }                                                                                                       \
                }\
                else if CURR_STATE_COMPARE(gl_state, 0, real_obj) {                     \
-                       IF_GL_SUCCESS(_orig_fastpath_glBindFramebuffer(target, real_obj)) {     \
+                       _get_gl_error(); \
+                       if (ftype == FASTPATH_FUNC_TYPE_STANDARD) \
+                               _orig_fastpath_glBindFramebuffer(target, real_obj);     \
+                       else if (ftype == FASTPATH_FUNC_TYPE_OES)       \
+                               _orig_fastpath_glBindFramebufferOES(target, real_obj);  \
+                       if (_get_gl_error() == GL_NO_ERROR){    \
                                if (real_obj == 0)                                                                                                      \
                                        current_ctx->flagid &= (~flagbit##_##gl_state);                                 \
                                else                                                                                                                            \
@@ -1439,17 +1536,26 @@ fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glBindFramebuffer(target, framebuffer, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
-GLboolean
-fastpath_glIsFramebuffer(GLuint framebuffer)
+static GLboolean
+_fp_glIsFramebuffer(GLuint framebuffer, FASTPATH_FUNC_TYPE ftype)
 {
        GLboolean ret = GL_FALSE;
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_FRAMEBUFFER, framebuffer, &real_obj) != 1) {
@@ -1457,24 +1563,44 @@ fastpath_glIsFramebuffer(GLuint framebuffer)
                goto finish;
        }
 
-       ret = _orig_fastpath_glIsFramebuffer(real_obj);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               ret = _orig_fastpath_glIsFramebuffer(real_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               ret = _orig_fastpath_glIsFramebufferOES(real_obj);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return ret;
+}
+
+GLboolean
+fastpath_glIsFramebuffer(GLuint framebuffer)
+{
+       GLboolean ret = GL_FALSE;
+
+       _COREGL_FASTPATH_FUNC_BEGIN();
+       ret = _fp_glIsFramebuffer(framebuffer, FASTPATH_FUNC_TYPE_STANDARD);
        _COREGL_FASTPATH_FUNC_END();
+
        return ret;
 }
 
 
-void
-fastpath_glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+static void
+_fp_glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers, FASTPATH_FUNC_TYPE ftype)
 {
        int i;
        GLuint *objid_array = NULL;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (n < 0) {
@@ -1504,7 +1630,19 @@ fastpath_glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
                        objid_array[real_n++] = real_objid;
                }
 
-               IF_GL_SUCCESS(_orig_fastpath_glDeleteFramebuffers(real_n, objid_array)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glDeleteFramebuffers(real_n, objid_array);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glDeleteFramebuffersOES(real_n, objid_array);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        for (i = 0; i < real_n; i++) {
                                General_Trace_List *current = NULL;
                                current = current_ctx->ostate.shared->using_gctxs;
@@ -1539,17 +1677,25 @@ finish:
                free(objid_array);
                objid_array = NULL;
        }
-       _COREGL_FASTPATH_FUNC_END();
 }
 
 void
-fastpath_glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+fastpath_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glDeleteFramebuffers(n, framebuffers, FASTPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glGenRenderbuffers(GLsizei n, GLuint *renderbuffers, FASTPATH_FUNC_TYPE ftype)
 {
        int i;
        GLuint *objid_array = NULL;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (n < 0) {
@@ -1563,7 +1709,19 @@ fastpath_glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
 
        objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
 
-       IF_GL_SUCCESS(_orig_fastpath_glGenRenderbuffers(n, objid_array)) {
+       _get_gl_error();
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGenRenderbuffers(n, objid_array);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glGenRenderbuffersOES(n, objid_array);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
+       if (_get_gl_error() == GL_NO_ERROR) {
                for (i = 0; i < n; i++) {
                        renderbuffers[i] = fastpath_ostate_create_object(&current_ctx->ostate,
                                                           GL_OBJECT_TYPE_RENDERBUFFER, objid_array[i]);
@@ -1577,17 +1735,24 @@ finish:
                free(objid_array);
                objid_array = NULL;
        }
-       _COREGL_FASTPATH_FUNC_END();
 }
 
-
 void
-fastpath_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+fastpath_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGenRenderbuffers(n, renderbuffers, FASTPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glBindRenderbuffer(GLenum target, GLuint renderbuffer, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1) {
@@ -1597,11 +1762,24 @@ fastpath_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
 
        if (target == GL_RENDERBUFFER) {
                if CURR_STATE_COMPARE(gl_renderbuffer_binding, 0, real_obj) {
-                       IF_GL_SUCCESS(_orig_fastpath_glBindRenderbuffer(target, real_obj)) {
+                       _get_gl_error();
+                       switch (ftype) {
+                       case FASTPATH_FUNC_TYPE_STANDARD:
+                               _orig_fastpath_glBindRenderbuffer(target, real_obj);
+                               break;
+                       case FASTPATH_FUNC_TYPE_OES:
+                               _orig_fastpath_glBindRenderbufferOES(target, real_obj);
+                               break;
+                       default:
+                               _set_gl_error(GL_INVALID_OPERATION);
+                               goto finish;
+                       }
+                       if (_get_gl_error() == GL_NO_ERROR) {
                                if (real_obj == 0)
                                        current_ctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_renderbuffer_binding);
                                else
                                        current_ctx->_bind_flag1 |= _BIND_FLAG1_BIT_gl_renderbuffer_binding;
+
                                CURR_STATE_UPDATE(gl_renderbuffer_binding, 0, real_obj)
                        }
                }
@@ -1613,18 +1791,27 @@ fastpath_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glBindRenderbuffer(target, renderbuffer, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-void
-fastpath_glFramebufferRenderbuffer(GLenum target, GLenum attachment,
-                                                                  GLenum renderbuffertarget, GLuint renderbuffer)
+static void
+_fp_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget,
+                                           GLuint renderbuffer, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1) {
@@ -1632,24 +1819,46 @@ fastpath_glFramebufferRenderbuffer(GLenum target, GLenum attachment,
                goto finish;
        }
 
-       _orig_fastpath_glFramebufferRenderbuffer(target, attachment, renderbuffertarget,
-                       real_obj);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glFramebufferRenderbuffer(target, attachment, renderbuffertarget,
+                               real_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glFramebufferRenderbufferOES(target, attachment,
+                               renderbuffertarget, real_obj);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glFramebufferRenderbuffer(GLenum target, GLenum attachment,
+       GLenum renderbuffertarget, GLuint renderbuffer)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glFramebufferRenderbuffer(target, attachment, renderbuffertarget,
+                                                   renderbuffer, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-GLboolean
-fastpath_glIsRenderbuffer(GLuint renderbuffer)
+static GLboolean
+_fp_glIsRenderbuffer(GLuint renderbuffer, FASTPATH_FUNC_TYPE ftype)
 {
        GLboolean ret = GL_FALSE;
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1) {
@@ -1657,23 +1866,45 @@ fastpath_glIsRenderbuffer(GLuint renderbuffer)
                goto finish;
        }
 
-       ret = _orig_fastpath_glIsRenderbuffer(real_obj);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               ret = _orig_fastpath_glIsRenderbuffer(real_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               ret = _orig_fastpath_glIsRenderbufferOES(real_obj);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return ret;
+}
+
+GLboolean
+fastpath_glIsRenderbuffer(GLuint renderbuffer)
+{
+       GLboolean ret = GL_FALSE;
+
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       ret = _fp_glIsRenderbuffer(renderbuffer, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
        return ret;
+
 }
 
-void
-fastpath_glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+static void
+_fp_glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers, FASTPATH_FUNC_TYPE ftype)
 {
        int i;
        GLuint *objid_array = NULL;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (n < 0) {
@@ -1703,7 +1934,19 @@ fastpath_glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
                        objid_array[real_n++] = real_objid;
                }
 
-               IF_GL_SUCCESS(_orig_fastpath_glDeleteRenderbuffers(real_n, objid_array)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glDeleteRenderbuffers(real_n, objid_array);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glDeleteRenderbuffersOES(real_n, objid_array);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        for (i = 0; i < real_n; i++) {
                                General_Trace_List *current = NULL;
                                current = current_ctx->ostate.shared->using_gctxs;
@@ -1729,6 +1972,15 @@ finish:
                free(objid_array);
                objid_array = NULL;
        }
+}
+
+void
+fastpath_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glDeleteRenderbuffers(n, renderbuffers, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -2393,14 +2645,13 @@ finish:
 }
 
 
-void
-fastpath_glActiveShaderProgramEXT(GLuint pipeline, GLuint program)
+static void
+_fp_glActiveShaderProgram(GLuint pipeline, GLuint program, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_program_obj;
        GLuint real_pipeline_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_program_obj) != 1) {
@@ -2414,21 +2665,41 @@ fastpath_glActiveShaderProgramEXT(GLuint pipeline, GLuint program)
                goto finish;
        }
 
-       _orig_fastpath_glActiveShaderProgramEXT(real_pipeline_obj, real_program_obj);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glActiveShaderProgram(real_pipeline_obj, real_program_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glActiveShaderProgramEXT(real_pipeline_obj, real_program_obj);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
 void
-fastpath_glProgramParameteriEXT(GLuint program, GLenum pname, GLint value)
+fastpath_glActiveShaderProgramEXT(GLuint pipeline, GLuint program)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glActiveShaderProgram(pipeline, program, FASTPATH_FUNC_TYPE_EXT);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glProgramParameteri(GLuint program, GLenum pname, GLint value,
+                                     FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
@@ -2436,22 +2707,42 @@ fastpath_glProgramParameteriEXT(GLuint program, GLenum pname, GLint value)
                goto finish;
        }
 
-       _orig_fastpath_glProgramParameteriEXT(real_obj, pname, value);
-
-       goto finish;
-
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glProgramParameteri(real_obj, pname, value);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glProgramParameteriEXT(real_obj, pname, value);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
+
+       goto finish;
+
 finish:
+       return;
+}
+
+void
+fastpath_glProgramParameteriEXT(GLuint program, GLenum pname, GLint value)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glProgramParameteri(program, pname, value, FASTPATH_FUNC_TYPE_EXT);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-void
-fastpath_glProgramUniform1iEXT(GLuint program, GLint location, GLint x)
+static void
+_fp_glProgramUniformi(GLuint program, GLint location, int count, GLint *v,
+                                    FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
@@ -2459,93 +2750,108 @@ fastpath_glProgramUniform1iEXT(GLuint program, GLint location, GLint x)
                goto finish;
        }
 
-       _orig_fastpath_glProgramUniform1iEXT(real_obj, location, x);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               switch(count) {
+                       case 1:
+                               _orig_fastpath_glProgramUniform1i(real_obj, location, *v);
+                               break;
+                       case 2:
+                               _orig_fastpath_glProgramUniform2i(real_obj, location, v[0], v[1]);
+                               break;
+                       case 3:
+                               _orig_fastpath_glProgramUniform3i(real_obj, location, v[0], v[1], v[2]);
+                               break;
+                       case 4:
+                               _orig_fastpath_glProgramUniform4i(real_obj, location, v[0], v[1], v[2], v[3]);
+                               break;
+               }
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               switch(count) {
+                       case 1:
+                               _orig_fastpath_glProgramUniform1iEXT(real_obj, location, *v);
+                               break;
+                       case 2:
+                               _orig_fastpath_glProgramUniform2iEXT(real_obj, location, v[0], v[1]);
+                               break;
+                       case 3:
+                               _orig_fastpath_glProgramUniform3iEXT(real_obj, location, v[0], v[1], v[2]);
+                               break;
+                       case 4:
+                               _orig_fastpath_glProgramUniform4iEXT(real_obj, location, v[0], v[1], v[2], v[3]);
+                               break;
+               }
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
+void
+fastpath_glProgramUniform1iEXT(GLuint program, GLint location, GLint x)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glProgramUniformi(program, location, 1, &x, FASTPATH_FUNC_TYPE_EXT);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
 
 void
 fastpath_glProgramUniform2iEXT(GLuint program, GLint location, GLint x, GLint y)
 {
-       GLuint real_obj;
+       GLint v[2];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform2iEXT(real_obj, location, x, y);
+       v[0] = x, v[1] = y;
+       _fp_glProgramUniformi(program, location, 2, v, FASTPATH_FUNC_TYPE_EXT);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-
 void
 fastpath_glProgramUniform3iEXT(GLuint program, GLint location, GLint x, GLint y,
                                                           GLint z)
 {
-       GLuint real_obj;
+       GLint v[3];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform3iEXT(real_obj, location, x, y, z);
+       v[0] = x, v[1] = y, v[2] = z;
+       _fp_glProgramUniformi(program, location, 3, v, FASTPATH_FUNC_TYPE_EXT);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-
 void
 fastpath_glProgramUniform4iEXT(GLuint program, GLint location, GLint x, GLint y,
                                                           GLint z, GLint w)
 {
-       GLuint real_obj;
+       GLint v[4];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform4iEXT(real_obj, location, x, y, z, w);
+       v[0] = x, v[1] = y, v[2] = z, v[3] = w;
+       _fp_glProgramUniformi(program, location, 4, v, FASTPATH_FUNC_TYPE_EXT);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-void
-fastpath_glProgramUniform1fEXT(GLuint program, GLint location, GLfloat x)
+static void
+_fp_glProgramUniformf(GLuint program, GLint location, int count, GLfloat *v, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
@@ -2553,95 +2859,110 @@ fastpath_glProgramUniform1fEXT(GLuint program, GLint location, GLfloat x)
                goto finish;
        }
 
-       _orig_fastpath_glProgramUniform1fEXT(real_obj, location, x);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               switch (count) {
+                       case 1:
+                               _orig_fastpath_glProgramUniform1f(real_obj, location, *v);
+                               break;
+                       case 2:
+                               _orig_fastpath_glProgramUniform2f(real_obj, location, v[0], v[1]);
+                               break;
+                       case 3:
+                               _orig_fastpath_glProgramUniform3f(real_obj, location,  v[0], v[1], v[2]);
+                               break;
+                       case 4:
+                               _orig_fastpath_glProgramUniform4f(real_obj, location, v[0], v[1], v[2], v[3]);
+                               break;
+               }
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               switch(count) {
+                       case 1:
+                               _orig_fastpath_glProgramUniform1fEXT(real_obj, location, *v);
+                               break;
+                       case 2:
+                               _orig_fastpath_glProgramUniform2fEXT(real_obj, location, v[0], v[1]);
+                               break;
+                       case 3:
+                               _orig_fastpath_glProgramUniform3fEXT(real_obj, location, v[0], v[1], v[2]);
+                               break;
+                       case 4:
+                               _orig_fastpath_glProgramUniform4fEXT(real_obj, location, v[0], v[1], v[2], v[3]);
+                               break;
+               }
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
+void
+fastpath_glProgramUniform1fEXT(GLuint program, GLint location, GLfloat x)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glProgramUniformf(program, location, 1, &x, FASTPATH_FUNC_TYPE_EXT);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
 
 void
 fastpath_glProgramUniform2fEXT(GLuint program, GLint location, GLfloat x,
                                                           GLfloat y)
 {
-       GLuint real_obj;
+       GLfloat v[2];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform2fEXT(real_obj, location, x, y);
 
-       goto finish;
+       v[0] = x, v[1] = y;
+       _fp_glProgramUniformf(program, location, 2, v, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-
 void
 fastpath_glProgramUniform3fEXT(GLuint program, GLint location, GLfloat x,
                                                           GLfloat y, GLfloat z)
 {
-       GLuint real_obj;
+       GLfloat v[3];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
+       v[0] = x, v[1] = y, v[2] = z;
+       _fp_glProgramUniformf(program, location, 3, v, FASTPATH_FUNC_TYPE_EXT);
 
-       _orig_fastpath_glProgramUniform3fEXT(real_obj, location, x, y, z);
-
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-
 void
 fastpath_glProgramUniform4fEXT(GLuint program, GLint location, GLfloat x,
                                                           GLfloat y, GLfloat z, GLfloat w)
 {
-       GLuint real_obj;
+       GLfloat v[4];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform4fEXT(real_obj, location, x, y, z, w);
 
-       goto finish;
+       v[0] = x, v[1] = y, v[2] = z, v[3] = w;
+       _fp_glProgramUniformf(program, location, 4, v, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-void
-fastpath_glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count,
-                                                               const GLint *value)
+static void
+_fp_glProgramUniformiv(GLuint program, GLint location, GLsizei count,
+                                                                const GLint *value, GLint vertor, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
@@ -2649,11 +2970,58 @@ fastpath_glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count,
                goto finish;
        }
 
-       _orig_fastpath_glProgramUniform1ivEXT(real_obj, location, count, value);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               switch (vertor) {
+               case 1:
+                       _orig_fastpath_glProgramUniform1iv(real_obj, location, count, value);
+                       break;
+               case 2:
+                       _orig_fastpath_glProgramUniform2iv(real_obj, location, count, value);
+                       break;
+               case 3:
+                       _orig_fastpath_glProgramUniform3iv(real_obj, location, count, value);
+                       break;
+               case 4:
+                       _orig_fastpath_glProgramUniform4iv(real_obj, location, count, value);
+                       break;
+               }
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               switch (vertor) {
+               case 1:
+                       _orig_fastpath_glProgramUniform1ivEXT(real_obj, location, count, value);
+                       break;
+               case 2:
+                       _orig_fastpath_glProgramUniform2ivEXT(real_obj, location, count, value);
+                       break;
+               case 3:
+                       _orig_fastpath_glProgramUniform3ivEXT(real_obj, location, count, value);
+                       break;
+               case 4:
+                       _orig_fastpath_glProgramUniform4ivEXT(real_obj, location, count, value);
+                       break;
+               }
+               break;
+       default:
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count,
+                                                               const GLint *value)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glProgramUniformiv(program, location, count, value,
+               1, FASTPATH_FUNC_TYPE_EXT);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -2662,22 +3030,11 @@ void
 fastpath_glProgramUniform2ivEXT(GLuint program, GLint location, GLsizei count,
                                                                const GLint *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform2ivEXT(real_obj, location, count, value);
 
-       goto finish;
+       _fp_glProgramUniformiv(program, location, count, value,
+               2, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -2686,22 +3043,11 @@ void
 fastpath_glProgramUniform3ivEXT(GLuint program, GLint location, GLsizei count,
                                                                const GLint *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform3ivEXT(real_obj, location, count, value);
 
-       goto finish;
+       _fp_glProgramUniformiv(program, location, count, value,
+               3, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -2710,10 +3056,22 @@ void
 fastpath_glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei count,
                                                                const GLint *value)
 {
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glProgramUniformiv(program, location, count, value,
+               4, FASTPATH_FUNC_TYPE_EXT);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+
+static void
+_fp_glProgramUniformfv(GLuint program, GLint location, GLsizei count,
+                                                               const GLfloat *value, GLint vertor, FASTPATH_FUNC_TYPE ftype)
+{
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
@@ -2721,35 +3079,58 @@ fastpath_glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei count,
                goto finish;
        }
 
-       _orig_fastpath_glProgramUniform4ivEXT(real_obj, location, count, value);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               switch (vertor) {
+               case 1:
+                       _orig_fastpath_glProgramUniform1fv(real_obj, location, count, value);
+                       break;
+               case 2:
+                       _orig_fastpath_glProgramUniform2fv(real_obj, location, count, value);
+                       break;
+               case 3:
+                       _orig_fastpath_glProgramUniform3fv(real_obj, location, count, value);
+                       break;
+               case 4:
+                       _orig_fastpath_glProgramUniform4fv(real_obj, location, count, value);
+                       break;
+               }
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               switch (vertor) {
+               case 1:
+                       _orig_fastpath_glProgramUniform1fvEXT(real_obj, location, count, value);
+                       break;
+               case 2:
+                       _orig_fastpath_glProgramUniform2fvEXT(real_obj, location, count, value);
+                       break;
+               case 3:
+                       _orig_fastpath_glProgramUniform3fvEXT(real_obj, location, count, value);
+                       break;
+               case 4:
+                       _orig_fastpath_glProgramUniform4fvEXT(real_obj, location, count, value);
+                       break;
+               }
+               break;
+       default:
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
-
 void
 fastpath_glProgramUniform1fvEXT(GLuint program, GLint location, GLsizei count,
                                                                const GLfloat *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform1fvEXT(real_obj, location, count, value);
 
-       goto finish;
+       _fp_glProgramUniformfv(program, location, count, value,
+               1, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -2758,22 +3139,11 @@ void
 fastpath_glProgramUniform2fvEXT(GLuint program, GLint location, GLsizei count,
                                                                const GLfloat *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform2fvEXT(real_obj, location, count, value);
 
-       goto finish;
+       _fp_glProgramUniformfv(program, location, count, value,
+               2, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -2782,22 +3152,11 @@ void
 fastpath_glProgramUniform3fvEXT(GLuint program, GLint location, GLsizei count,
                                                                const GLfloat *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform3fvEXT(real_obj, location, count, value);
 
-       goto finish;
+       _fp_glProgramUniformfv(program, location, count, value,
+               3, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -2806,22 +3165,11 @@ void
 fastpath_glProgramUniform4fvEXT(GLuint program, GLint location, GLsizei count,
                                                                const GLfloat *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform4fvEXT(real_obj, location, count, value);
-
-       goto finish;
+       _fp_glProgramUniformfv(program, location, count, value,
+               4, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -2997,14 +3345,25 @@ finish:
 }
 
 
-void
-fastpath_glBlendEquation(GLenum mode)
+static void
+_fp_glBlendEquation(GLenum mode, FASTPATH_FUNC_TYPE ftype)
 {
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       IF_GL_SUCCESS(_orig_fastpath_glBlendEquation(mode)) {
+       _get_gl_error();
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glBlendEquation(mode);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glBlendEquationOES(mode);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
+       if (_get_gl_error() == GL_NO_ERROR) {
                current_ctx->_blend_flag |=
                        _BLEND_FLAG_BIT_gl_blend_equation_rgb |
                        _BLEND_FLAG_BIT_gl_blend_equation_alpha;
@@ -3017,19 +3376,40 @@ fastpath_glBlendEquation(GLenum mode)
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
 void
-fastpath_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+fastpath_glBlendEquation(GLenum mode)
 {
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glBlendEquation(mode, FASTPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha, FASTPATH_FUNC_TYPE ftype)
+{
+       DEFINE_FASTPAH_GL_FUNC();
        INIT_FASTPATH_GL_FUNC();
 
        if (CURR_STATE_COMPARE(gl_blend_equation_rgb, 0, modeRGB) ||
                        CURR_STATE_COMPARE(gl_blend_equation_alpha, 0, modeAlpha)) {
-               IF_GL_SUCCESS(_orig_fastpath_glBlendEquationSeparate(modeRGB, modeAlpha)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glBlendEquationSeparate(modeRGB, modeAlpha);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glBlendEquationSeparateOES(modeRGB, modeAlpha);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        current_ctx->_blend_flag |=
                                _BLEND_FLAG_BIT_gl_blend_equation_rgb |
                                _BLEND_FLAG_BIT_gl_blend_equation_alpha;
@@ -3041,6 +3421,16 @@ fastpath_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glBlendEquationSeparate(modeRGB, modeAlpha, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -3075,20 +3465,30 @@ finish:
 }
 
 
-void
-fastpath_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha,
-                                                        GLenum dstAlpha)
+static void
+_fp_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha,
+                                                             GLenum dstAlpha, FASTPATH_FUNC_TYPE ftype)
 {
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (CURR_STATE_COMPARE(gl_blend_src_rgb, 0, srcRGB) ||
                        CURR_STATE_COMPARE(gl_blend_dst_rgb, 0, dstRGB) ||
                        CURR_STATE_COMPARE(gl_blend_src_alpha, 0, srcAlpha) ||
                        CURR_STATE_COMPARE(gl_blend_dst_alpha, 0, dstAlpha)) {
-               IF_GL_SUCCESS(_orig_fastpath_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha,
-                                         dstAlpha)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glBlendFuncSeparateOES(srcRGB, dstRGB, srcAlpha, dstAlpha);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        current_ctx->_blend_flag |=
                                _BLEND_FLAG_BIT_gl_blend_src_rgb |
                                _BLEND_FLAG_BIT_gl_blend_src_alpha |
@@ -3104,6 +3504,17 @@ fastpath_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha,
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha,
+                                                        GLenum dstAlpha)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -3135,15 +3546,26 @@ finish:
 }
 
 
-void
-fastpath_glClearDepthf(GLclampf depth)
+static void
+_fp_glClearDepthf(GLclampf depth, FASTPATH_FUNC_TYPE ftype)
 {
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if CURR_STATE_COMPARE(gl_depth_clear_value, 0, depth) {
-               IF_GL_SUCCESS(_orig_fastpath_glClearDepthf(depth)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glClearDepthf(depth);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glClearDepthfOES(depth);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        current_ctx->_clear_flag2 |= _CLEAR_FLAG2_BIT_gl_depth_clear_value;
                        CURR_STATE_UPDATE(gl_depth_clear_value, 0, depth)
                }
@@ -3151,6 +3573,16 @@ fastpath_glClearDepthf(GLclampf depth)
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glClearDepthf(GLclampf depth)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glClearDepthf(depth, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -3211,19 +3643,30 @@ finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glColorMaski(GLuint buf, GLboolean r, GLboolean g, GLboolean b,
-                                         GLboolean a)
+static void
+_fp_glColorMaski(GLuint buf, GLboolean r, GLboolean g, GLboolean b,
+                                              GLboolean a, FASTPATH_FUNC_TYPE ftype)
 {
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (CURR_STATE_COMPARE(gl_color_writemask, 0 + 4 * buf, r) ||
                        CURR_STATE_COMPARE(gl_color_writemask, 1 + 4 * buf, g) ||
                        CURR_STATE_COMPARE(gl_color_writemask, 2 + 4 * buf, b) ||
                        CURR_STATE_COMPARE(gl_color_writemask, 3 + 4 * buf, a)) {
-               IF_GL_SUCCESS(_orig_fastpath_glColorMaski(buf, r, g, b, a)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glColorMaski(buf, r, g, b, a);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glColorMaskiOES(buf, r, g, b, a);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        current_ctx->_clear_flag2 |= _CLEAR_FLAG2_BIT_gl_color_writemask;
                        CURR_STATE_UPDATE(gl_color_writemask, 0 + 4 * buf, r)
                        CURR_STATE_UPDATE(gl_color_writemask, 1 + 4 * buf, g)
@@ -3234,6 +3677,17 @@ fastpath_glColorMaski(GLuint buf, GLboolean r, GLboolean g, GLboolean b,
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glColorMaski(GLuint buf, GLboolean r, GLboolean g, GLboolean b,
+                                         GLboolean a)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glColorMaski(buf, r, g, b, a, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -3241,25 +3695,10 @@ void
 fastpath_glColorMaskiOES(GLuint buf, GLboolean r, GLboolean g, GLboolean b,
                                                 GLboolean a)
 {
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if (CURR_STATE_COMPARE(gl_color_writemask, 0 + 4 * buf, r) ||
-                       CURR_STATE_COMPARE(gl_color_writemask, 1 + 4 * buf, g) ||
-                       CURR_STATE_COMPARE(gl_color_writemask, 2 + 4 * buf, b) ||
-                       CURR_STATE_COMPARE(gl_color_writemask, 3 + 4 * buf, a)) {
-               IF_GL_SUCCESS(_orig_fastpath_glColorMaskiOES(buf, r, g, b, a)) {
-                       current_ctx->_clear_flag2 |= _CLEAR_FLAG2_BIT_gl_color_writemask;
-                       CURR_STATE_UPDATE(gl_color_writemask, 0 + 4 * buf, r)
-                       CURR_STATE_UPDATE(gl_color_writemask, 1 + 4 * buf, g)
-                       CURR_STATE_UPDATE(gl_color_writemask, 2 + 4 * buf, b)
-                       CURR_STATE_UPDATE(gl_color_writemask, 3 + 4 * buf, a)
-               }
-       }
-       goto finish;
+       _fp_glColorMaski(buf, r, g, b, a, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -3324,16 +3763,27 @@ finish:
 }
 
 
-void
-fastpath_glDepthRangef(GLclampf zNear, GLclampf zFar)
+static void
+_fp_glDepthRangef(GLclampf zNear, GLclampf zFar, FASTPATH_FUNC_TYPE ftype)
 {
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (CURR_STATE_COMPARE(gl_depth_range, 0, zNear) ||
                        CURR_STATE_COMPARE(gl_depth_range, 1, zFar)) {
-               IF_GL_SUCCESS(_orig_fastpath_glDepthRangef(zNear, zFar)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glDepthRangef(zNear, zFar);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glDepthRangefOES(zNear, zFar);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        current_ctx->_clear_flag2 |= _CLEAR_FLAG2_BIT_gl_depth_range;
                        CURR_STATE_UPDATE(gl_depth_range, 0, zNear)
                        CURR_STATE_UPDATE(gl_depth_range, 1, zFar)
@@ -3342,6 +3792,16 @@ fastpath_glDepthRangef(GLclampf zNear, GLclampf zFar)
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glDepthRangef(GLclampf zNear, GLclampf zFar)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glDepthRangef(zNear, zFar, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -4426,14 +4886,13 @@ finish:
 
 
 /* ES 3.0 PASS (SUPPORT) */
-void
-fastpath_glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei *length,
-                                                       GLenum *binaryFormat, void *binary)
+static void
+_fp_glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei *length,
+                                                            GLenum *binaryFormat, void *binary, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
@@ -4441,12 +4900,33 @@ fastpath_glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei *length,
                goto finish;
        }
 
-       _orig_fastpath_glGetProgramBinary(real_obj, bufsize, length, binaryFormat,
-                                                                         binary);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGetProgramBinary(real_obj, bufsize, length, binaryFormat, binary);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glGetProgramBinaryOES(real_obj, bufsize, length, binaryFormat, binary);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei *length,
+                                                       GLenum *binaryFormat, void *binary)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGetProgramBinary(program, bufsize, length, binaryFormat,
+               binary, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -4455,10 +4935,21 @@ void
 fastpath_glGetProgramBinaryOES(GLuint program, GLsizei bufsize, GLsizei *length,
                                                           GLenum *binaryFormat, void *binary)
 {
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGetProgramBinary(program, bufsize, length, binaryFormat,
+               binary, FASTPATH_FUNC_TYPE_OES);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary,
+                                 GLint length, FASTPATH_FUNC_TYPE ftype)
+{
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
@@ -4466,36 +4957,32 @@ fastpath_glGetProgramBinaryOES(GLuint program, GLsizei bufsize, GLsizei *length,
                goto finish;
        }
 
-       _orig_fastpath_glGetProgramBinaryOES(real_obj, bufsize, length, binaryFormat,
-                                                                                binary);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glProgramBinary(real_obj, binaryFormat, binary, length);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glProgramBinaryOES(real_obj, binaryFormat, binary, length);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
-
 void
 fastpath_glProgramBinary(GLuint program, GLenum binaryFormat,
                                                 const void *binary, GLint length)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramBinary(real_obj, binaryFormat, binary, length);
-
-       goto finish;
+       _fp_glProgramBinary(program, binaryFormat, binary, length, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -4504,22 +4991,10 @@ void
 fastpath_glProgramBinaryOES(GLuint program, GLenum binaryFormat,
                                                        const void *binary, GLint length)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramBinaryOES(real_obj, binaryFormat, binary, length);
-
-       goto finish;
+       _fp_glProgramBinary(program, binaryFormat, binary, length, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -4548,14 +5023,13 @@ finish:
 }
 
 
-void
-fastpath_glGenQueries(GLsizei n, GLuint *ids)
+static void
+_fp_glGenQueries(GLsizei n, GLuint *ids, FASTPATH_FUNC_TYPE ftype)
 {
        int i;
        GLuint *objid_array = NULL;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (n < 0) {
@@ -4569,7 +5043,19 @@ fastpath_glGenQueries(GLsizei n, GLuint *ids)
 
        objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
 
-       IF_GL_SUCCESS(_orig_fastpath_glGenQueries(n, objid_array)) {
+       _get_gl_error();
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGenQueries(n, objid_array);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glGenQueriesEXT(n, objid_array);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
+       if (_get_gl_error() == GL_NO_ERROR) {
                for (i = 0; i < n; i++) {
                        ids[i] = fastpath_ostate_create_object(&current_ctx->ostate,
                                                                                                   GL_OBJECT_TYPE_QUERY, objid_array[i]);
@@ -4583,18 +5069,27 @@ finish:
                free(objid_array);
                objid_array = NULL;
        }
+}
+
+void
+fastpath_glGenQueries(GLsizei n, GLuint* ids)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGenQueries(n, ids, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-void
-fastpath_glDeleteQueries(GLsizei n, const GLuint *ids)
+static void
+_fp_glDeleteQueries(GLsizei n, const GLuint *ids, FASTPATH_FUNC_TYPE ftype)
 {
        int i;
        GLuint *objid_array = NULL;
+       int real_n = 0;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (n < 0) {
@@ -4608,23 +5103,30 @@ fastpath_glDeleteQueries(GLsizei n, const GLuint *ids)
 
        objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
        if (objid_array == NULL) goto finish;
-       {
-               int real_n = 0;
 
-               for (i = 0; i < n; i++) {
-                       int real_objid = _COREGL_INT_INIT_VALUE;
-                       if (ids[i] == 0) continue;
+       for (i = 0; i < n; i++) {
+               GLuint real_obj;
+               if (ids[i] == 0)
+                       continue;
 
-                       real_objid = fastpath_ostate_get_object(&current_ctx->ostate,
-                                                                                                       GL_OBJECT_TYPE_QUERY, ids[i]);
-                       if (real_objid == 0) continue;
+               if (GET_REAL_OBJ(GL_OBJECT_TYPE_QUERY, ids[i], &real_obj) != 1)
+                       continue;
 
-                       AST(fastpath_ostate_remove_object(&current_ctx->ostate, GL_OBJECT_TYPE_QUERY,
-                                                                                         ids[i]) == 1);
-                       objid_array[real_n++] = real_objid;
-               }
+               AST(fastpath_ostate_remove_object(&current_ctx->ostate, GL_OBJECT_TYPE_QUERY,
+                                                                                 ids[i]) == 1);
+               objid_array[real_n++] = real_obj;
+       }
 
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
                _orig_fastpath_glDeleteQueries(real_n, objid_array);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glDeleteQueriesEXT(real_n, objid_array);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
        }
 
        goto finish;
@@ -4634,18 +5136,26 @@ finish:
                free(objid_array);
                objid_array = NULL;
        }
+}
+
+void
+fastpath_glDeleteQueries(GLsizei n, const GLuint* ids)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glDeleteQueries(n, ids, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-GLboolean
-fastpath_glIsQuery(GLuint id)
+static GLboolean
+_fp_glIsQuery(GLuint id, FASTPATH_FUNC_TYPE ftype)
 {
        GLboolean ret = GL_FALSE;
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_QUERY, id, &real_obj) != 1) {
@@ -4653,23 +5163,44 @@ fastpath_glIsQuery(GLuint id)
                goto finish;
        }
 
-       ret = _orig_fastpath_glIsQuery(real_obj);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               ret = _orig_fastpath_glIsQuery(real_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               ret = _orig_fastpath_glIsQueryEXT(real_obj);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
        return ret;
 }
 
+GLboolean
+fastpath_glIsQuery(GLuint id)
+{
+       GLboolean ret = GL_FALSE;
 
-void
-fastpath_glBeginQuery(GLenum target, GLuint id)
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       ret = _fp_glIsQuery(id, FASTPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_FASTPATH_FUNC_END();
+       return ret;
+}
+
+
+static void
+_fp_glBeginQuery(GLenum target, GLuint id, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_QUERY, id, &real_obj) != 1) {
@@ -4678,25 +5209,54 @@ fastpath_glBeginQuery(GLenum target, GLuint id)
                goto finish;
        }
 
-       _orig_fastpath_glBeginQuery(target, real_obj);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glBeginQuery(target, real_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glBeginQueryEXT(target, real_obj);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glBeginQuery(GLenum target, GLuint id)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glBeginQuery(target, id, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-void
-fastpath_glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+static void
+_fp_glGetQueryiv(GLenum target, GLenum pname, GLint *params, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint glue_obj_id = _COREGL_INT_INIT_VALUE;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glGetQueryiv(target, pname, params);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGetQueryiv(target, pname, params);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glGetQueryivEXT(target, pname, params);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        switch (pname) {
        case GL_CURRENT_QUERY:
@@ -4710,17 +5270,25 @@ fastpath_glGetQueryiv(GLenum target, GLenum pname, GLint *params)
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
-
 void
-fastpath_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+fastpath_glGetQueryiv(GLenum target, GLenum pname, GLint* params)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGetQueryiv(target, pname, params, FASTPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_QUERY, id, &real_obj) != 1) {
@@ -4728,11 +5296,31 @@ fastpath_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
                goto finish;
        }
 
-       _orig_fastpath_glGetQueryObjectuiv(real_obj, pname, params);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGetQueryObjectuiv(real_obj, pname, params);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glGetQueryObjectuivEXT(real_obj, pname, params);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGetQueryObjectuiv(id, pname, params, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -4780,14 +5368,13 @@ finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glGenVertexArrays(GLsizei n, GLuint *arrays)
+static void
+_fp_glGenVertexArrays(GLsizei n, GLuint *arrays, FASTPATH_FUNC_TYPE ftype)
 {
        int i;
        GLuint *objid_array = NULL;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (n < 0) {
@@ -4801,7 +5388,19 @@ fastpath_glGenVertexArrays(GLsizei n, GLuint *arrays)
 
        objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
 
-       IF_GL_SUCCESS(_orig_fastpath_glGenVertexArrays(n, objid_array)) {
+       _get_gl_error();
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGenVertexArrays(n, objid_array);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glGenVertexArraysOES(n, objid_array);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
+       if (_get_gl_error() == GL_NO_ERROR) {
                for (i = 0; i < n; i++) {
                        arrays[i] = fastpath_ostate_create_object(&current_ctx->ostate,
                                                GL_OBJECT_TYPE_VERTEXARRAY, objid_array[i]);
@@ -4815,18 +5414,26 @@ finish:
                free(objid_array);
                objid_array = NULL;
        }
+}
+
+void
+fastpath_glGenVertexArrays(GLsizei n, GLuint* arrays)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGenVertexArrays(n, arrays, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-void
-fastpath_glBindVertexArray(GLuint array)
+static void
+_fp_glBindVertexArray(GLuint array, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
        int i;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_VERTEXARRAY, array, &real_obj) != 1) {
@@ -4834,15 +5441,28 @@ fastpath_glBindVertexArray(GLuint array)
                goto finish;
        }
 
+#define ORIG_FASTPATH_FUNC() \
+       switch (ftype) { \
+       case FASTPATH_FUNC_TYPE_STANDARD: \
+               _orig_fastpath_glBindVertexArray(real_obj); \
+               break; \
+       case FASTPATH_FUNC_TYPE_OES: \
+               _orig_fastpath_glBindVertexArrayOES(real_obj); \
+               break; \
+       default: \
+               _set_gl_error(GL_INVALID_OPERATION); \
+               goto finish; \
+       }
+
        if (real_obj == 0) {
-               IF_GL_SUCCESS(_orig_fastpath_glBindVertexArray(real_obj)) {
+               IF_GL_SUCCESS(ORIG_FASTPATH_FUNC()) {
                        current_ctx->_misc_flag3 &= ~(_MISC_FLAG3_BIT_gl_vertex_array_binding);
                        CURR_STATE_CLEAR(gl_vertex_array_binding, 0)
                        for (i = 0; i < current_ctx->gl_vertex_attribs_num[0]; i++)
                                CURR_STATE_CLEAR(gl_vertex_array_enabled, i)
                        }
        } else if (CURR_STATE_COMPARE(gl_vertex_array_binding, 0, real_obj)) {
-               IF_GL_SUCCESS(_orig_fastpath_glBindVertexArray(real_obj)) {
+               IF_GL_SUCCESS(ORIG_FASTPATH_FUNC()) {
                        current_ctx->_misc_flag3 |= _MISC_FLAG3_BIT_gl_vertex_array_binding;
                        CURR_STATE_UPDATE(gl_vertex_array_binding, 0, real_obj)
                        for (i = 0; i < current_ctx->gl_vertex_attribs_num[0]; i++)
@@ -4852,18 +5472,28 @@ fastpath_glBindVertexArray(GLuint array)
        goto finish;
 
 finish:
+#undef ORIG_FASTPATH_FUNC
+       return;
+}
+
+void
+fastpath_glBindVertexArray(GLuint array)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glBindVertexArray(array, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
-GLboolean
-fastpath_glIsVertexArray(GLuint array)
+static GLboolean
+_fp_glIsVertexArray(GLuint array, FASTPATH_FUNC_TYPE ftype)
 {
        GLboolean ret = GL_FALSE;
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_VERTEXARRAY, array, &real_obj) != 1) {
@@ -4871,24 +5501,44 @@ fastpath_glIsVertexArray(GLuint array)
                goto finish;
        }
 
-       ret = _orig_fastpath_glIsVertexArray(real_obj);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               ret = _orig_fastpath_glIsVertexArray(real_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               ret = _orig_fastpath_glIsVertexArrayOES(real_obj);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return ret;
+}
+
+GLboolean
+fastpath_glIsVertexArray(GLuint array)
+{
+       GLboolean ret = GL_FALSE;
+
+       _COREGL_FASTPATH_FUNC_BEGIN();
+       ret = _fp_glIsVertexArray(array, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
        return ret;
 }
 
 
-void
-fastpath_glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+static void
+_fp_glDeleteVertexArrays(GLsizei n, const GLuint *arrays, FASTPATH_FUNC_TYPE ftype)
 {
        int i;
        GLuint *objid_array = NULL;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (n < 0) {
@@ -4906,19 +5556,32 @@ fastpath_glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
                int real_n = 0;
 
                for (i = 0; i < n; i++) {
-                       int real_objid = _COREGL_INT_INIT_VALUE;
-                       if (arrays[i] == 0) continue;
+                       GLuint real_objid;
 
-                       real_objid = fastpath_ostate_get_object(&current_ctx->ostate,
-                                                                                                       GL_OBJECT_TYPE_VERTEXARRAY, arrays[i]);
-                       if (real_objid == 0) continue;
+                       if (arrays[i] == 0)
+                               continue;
+
+                       if (GET_REAL_OBJ(GL_OBJECT_TYPE_VERTEXARRAY, arrays[i], &real_objid) != 1)
+                               continue;
 
                        AST(fastpath_ostate_remove_object(&current_ctx->ostate,
                                                                                          GL_OBJECT_TYPE_VERTEXARRAY, arrays[i]) == 1);
                        objid_array[real_n++] = real_objid;
                }
 
-               IF_GL_SUCCESS(_orig_fastpath_glDeleteVertexArrays(real_n, objid_array)) {
+               _get_gl_error();
+               switch (ftype) {
+               case FASTPATH_FUNC_TYPE_STANDARD:
+                       _orig_fastpath_glDeleteVertexArrays(real_n, objid_array);
+                       break;
+               case FASTPATH_FUNC_TYPE_OES:
+                       _orig_fastpath_glDeleteVertexArraysOES(real_n, objid_array);
+                       break;
+               default:
+                       _set_gl_error(GL_INVALID_OPERATION);
+                       goto finish;
+               }
+               if (_get_gl_error() == GL_NO_ERROR) {
                        for (i = 0; i < real_n; i++) {
                                General_Trace_List *current = NULL;
                                current = current_ctx->ostate.shared->using_gctxs;
@@ -4943,6 +5606,15 @@ finish:
                free(objid_array);
                objid_array = NULL;
        }
+}
+
+void
+fastpath_glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glDeleteVertexArrays(n, arrays, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -5971,29 +6643,17 @@ fastpath_glVertexAttribDivisor(GLuint index, GLuint divisor)
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
 
 void
 fastpath_glProgramParameteri(GLuint program, GLenum pname, GLint value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramParameteri(real_obj, pname, value);
 
-       goto finish;
+       _fp_glProgramParameteri(program, pname, value, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6482,29 +7142,10 @@ finish:
 void
 fastpath_glActiveShaderProgram(GLuint pipeline, GLuint program)
 {
-       GLuint real_program_obj;
-       GLuint real_pipeline_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_program_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAMPIPELINE, pipeline,
-                                        &real_pipeline_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       _orig_fastpath_glActiveShaderProgram(real_pipeline_obj, real_program_obj);
+       _fp_glActiveShaderProgram(pipeline, program, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6512,22 +7153,11 @@ void
 fastpath_glProgramUniform1iv(GLuint program, GLint location, GLsizei count,
                                                         const GLint *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform1iv(real_obj, location, count, value);
+       _fp_glProgramUniformiv(program, location, count, value,
+               1, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6536,22 +7166,11 @@ void
 fastpath_glProgramUniform2iv(GLuint program, GLint location, GLsizei count,
                                                         const GLint *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform2iv(real_obj, location, count, value);
+       _fp_glProgramUniformiv(program, location, count, value,
+               2, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6560,22 +7179,11 @@ void
 fastpath_glProgramUniform3iv(GLuint program, GLint location, GLsizei count,
                                                         const GLint *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform3iv(real_obj, location, count, value);
+       _fp_glProgramUniformiv(program, location, count, value,
+               3, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6584,22 +7192,11 @@ void
 fastpath_glProgramUniform4iv(GLuint program, GLint location, GLsizei count,
                                                         const GLint *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform4iv(real_obj, location, count, value);
+       _fp_glProgramUniformiv(program, location, count, value,
+               4, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6609,22 +7206,11 @@ void
 fastpath_glProgramUniform1fv(GLuint program, GLint location, GLsizei count,
                                                         const GLfloat *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform1fv(real_obj, location, count, value);
+       _fp_glProgramUniformfv(program, location, count, value,
+               1, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6633,22 +7219,11 @@ void
 fastpath_glProgramUniform2fv(GLuint program, GLint location, GLsizei count,
                                                         const GLfloat *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform2fv(real_obj, location, count, value);
+       _fp_glProgramUniformfv(program, location, count, value,
+               2, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6657,22 +7232,11 @@ void
 fastpath_glProgramUniform3fv(GLuint program, GLint location, GLsizei count,
                                                         const GLfloat *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform3fv(real_obj, location, count, value);
+       _fp_glProgramUniformfv(program, location, count, value,
+               3, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6681,22 +7245,11 @@ void
 fastpath_glProgramUniform4fv(GLuint program, GLint location, GLsizei count,
                                                         const GLfloat *value)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform4fv(real_obj, location, count, value);
+       _fp_glProgramUniformfv(program, location, count, value,
+               4, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6778,22 +7331,10 @@ finish:
 void
 fastpath_glProgramUniform1i(GLuint program, GLint location, GLint x)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform1i(real_obj, location, x);
+       _fp_glProgramUniformi(program, location, 1, &x, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6801,22 +7342,13 @@ finish:
 void
 fastpath_glProgramUniform2i(GLuint program, GLint location, GLint x, GLint y)
 {
-       GLuint real_obj;
+       GLint v[2];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform2i(real_obj, location, x, y);
 
-       goto finish;
+       v[0] = x, v[1] = y;
+       _fp_glProgramUniformi(program, location, 2, v, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6825,22 +7357,13 @@ void
 fastpath_glProgramUniform3i(GLuint program, GLint location, GLint x, GLint y,
                                                        GLint z)
 {
-       GLuint real_obj;
+       GLint v[3];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform3i(real_obj, location, x, y, z);
-
-       goto finish;
+       v[0] = x, v[1] = y, v[2] = z;
+       _fp_glProgramUniformi(program, location, 3, v, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6849,22 +7372,13 @@ void
 fastpath_glProgramUniform4i(GLuint program, GLint location, GLint x, GLint y,
                                                        GLint z, GLint w)
 {
-       GLuint real_obj;
+       GLint v[4];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform4i(real_obj, location, x, y, z, w);
 
-       goto finish;
+       v[0] = x, v[1] = y, v[2] = z, v[3] = w;
+       _fp_glProgramUniformi(program, location, 4, v, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6872,22 +7386,10 @@ finish:
 void
 fastpath_glProgramUniform1f(GLuint program, GLint location, GLfloat x)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
+       _fp_glProgramUniformf(program, location, 1, &x, FASTPATH_FUNC_TYPE_STANDARD);
 
-       _orig_fastpath_glProgramUniform1f(real_obj, location, x);
-
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6896,22 +7398,13 @@ void
 fastpath_glProgramUniform2f(GLuint program, GLint location, GLfloat x,
                                                        GLfloat y)
 {
-       GLuint real_obj;
+       GLfloat v[2];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform2f(real_obj, location, x, y);
+       v[0] = x, v[1] = y;
+       _fp_glProgramUniformf(program, location, 2, v, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6920,22 +7413,13 @@ void
 fastpath_glProgramUniform3f(GLuint program, GLint location, GLfloat x,
                                                        GLfloat y, GLfloat z)
 {
-       GLuint real_obj;
+       GLfloat v[3];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glProgramUniform3f(real_obj, location, x, y, z);
 
-       goto finish;
+       v[0] = x, v[1] = y, v[2] = z;
+       _fp_glProgramUniformf(program, location, 3, v, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -6944,22 +7428,13 @@ void
 fastpath_glProgramUniform4f(GLuint program, GLint location, GLfloat x,
                                                        GLfloat y, GLfloat z, GLfloat w)
 {
-       GLuint real_obj;
+       GLfloat v[4];
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_PROGRAM, program, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glProgramUniform4f(real_obj, location, x, y, z, w);
-
-       goto finish;
+       v[0] = x, v[1] = y, v[2] = z, v[3] = w;
+       _fp_glProgramUniformf(program, location, 4, v, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -7419,101 +7894,68 @@ finish:
 void
 fastpath_glBindFramebufferOES(GLenum target, GLuint framebuffer)
 {
-       GLuint real_obj;
+       _COREGL_FASTPATH_FUNC_BEGIN();
 
-       DEFINE_FASTPAH_GL_FUNC();
+       _fp_glBindFramebuffer(target, framebuffer, FASTPATH_FUNC_TYPE_OES);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+void
+fastpath_glBindRenderbufferOES(GLenum target, GLuint renderbuffer)
+{
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_FRAMEBUFFER, framebuffer, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
+       _fp_glBindRenderbuffer(target, renderbuffer, FASTPATH_FUNC_TYPE_OES);
 
-#define STATE_PROC(gl_state, flagid, flagbit) \
-       {       \
-               if(real_obj == 0) { \
-                       IF_GL_SUCCESS(_orig_fastpath_glBindFramebufferOES(target, real_obj)) { \
-                               current_ctx->flagid &= (~flagbit##_##gl_state); \
-                               CURR_STATE_CLEAR(gl_state, 0);                                  \
-                       }                                                                                                       \
-               }\
-               else if CURR_STATE_COMPARE(gl_state, 0, real_obj) {             \
-                       IF_GL_SUCCESS(_orig_fastpath_glBindFramebufferOES(target, real_obj)) { \
-                               if (real_obj == 0)                                                                                                      \
-                                       current_ctx->flagid &= (~flagbit##_##gl_state);                                 \
-                               else                                                                                                                            \
-                                       current_ctx->flagid |= flagbit##_##gl_state;                                    \
-                               CURR_STATE_UPDATE(gl_state, 0, real_obj)                                                        \
-                               if((target == GL_FRAMEBUFFER || target == GL_READ_FRAMEBUFFER) &&       \
-                                       current_ctx->gl_framebuffer_binding_read_used)                                  \
-                                       CURR_STATE_CLEAR(gl_read_buffer, 0)                                                     \
-                       }                                                                                                                                               \
-               }                                                                                                                                                       \
-       }
+       _COREGL_FASTPATH_FUNC_END();
+}
 
-       switch (target) {
-       case GL_FRAMEBUFFER:
-               if (current_ctx->gl_framebuffer_binding_read_used &&
-                               current_ctx->gl_framebuffer_binding_draw_used) {
-                       STATE_PROC(gl_framebuffer_binding_read, _bind_flag1, _BIND_FLAG1_BIT)
-                       STATE_PROC(gl_framebuffer_binding_draw, _bind_flag1, _BIND_FLAG1_BIT)
-               } else
-                       STATE_PROC(gl_framebuffer_binding, _bind_flag1, _BIND_FLAG1_BIT)
-                       break;
-       case GL_READ_FRAMEBUFFER:
-               if (current_ctx->gl_framebuffer_binding_read_used) {
-                       STATE_PROC(gl_framebuffer_binding_read, _bind_flag1, _BIND_FLAG1_BIT)
-               }
-               break;
-       case GL_DRAW_FRAMEBUFFER:
-               if (current_ctx->gl_framebuffer_binding_draw_used) {
-                       STATE_PROC(gl_framebuffer_binding_draw, _bind_flag1, _BIND_FLAG1_BIT)
-               }
-               break;
-       default:
-               _set_gl_error(GL_INVALID_ENUM);
-               goto finish;
-       }
+void
+fastpath_glDeleteFramebuffersOES(GLsizei n, const GLuint *framebuffers)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
 
-#undef STATE_PROC
+       _fp_glDeleteFramebuffers(n, framebuffers, FASTPATH_FUNC_TYPE_OES);
 
-       goto finish;
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+void
+fastpath_glDeleteRenderbuffersOES(GLsizei n, const GLuint *renderbuffers)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glDeleteRenderbuffers(n, renderbuffers, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
-fastpath_glBindRenderbufferOES(GLenum target, GLuint renderbuffer)
+fastpath_glDepthRangefOES(GLclampf zNear, GLclampf zFar)
 {
-       GLuint real_obj;
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glDepthRangef(zNear, zFar, FASTPATH_FUNC_TYPE_OES);
 
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+void
+fastpath_glDepthRangexOES(GLclampx zNear, GLclampx zFar)
+{
        DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       if (target == GL_RENDERBUFFER) {
-               if CURR_STATE_COMPARE(gl_renderbuffer_binding, 0, real_obj) {
-                       IF_GL_SUCCESS(_orig_fastpath_glBindRenderbufferOES(target, real_obj)) {
-                               if (real_obj == 0)
-                                       current_ctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_renderbuffer_binding);
-                               else
-                                       current_ctx->_bind_flag1 |= _BIND_FLAG1_BIT_gl_renderbuffer_binding;
-
-                               CURR_STATE_UPDATE(gl_renderbuffer_binding, 0, real_obj)
-                       }
+       if (CURR_STATE_COMPARE(gl_depth_range, 0, zNear) ||
+                       CURR_STATE_COMPARE(gl_depth_range, 1, zFar)) {
+               IF_GL_SUCCESS(_orig_fastpath_glDepthRangexOES(zNear, zFar)) {
+                       current_ctx->_clear_flag2 |= _CLEAR_FLAG2_BIT_gl_depth_range;
+                       CURR_STATE_UPDATE(gl_depth_range, 0, zNear)
+                       CURR_STATE_UPDATE(gl_depth_range, 1, zFar)
                }
-       } else {
-               _set_gl_error(GL_INVALID_ENUM);
-               goto finish;
        }
-
        goto finish;
 
 finish:
@@ -7521,310 +7963,46 @@ finish:
 }
 
 void
-fastpath_glDeleteFramebuffersOES(GLsizei n, const GLuint *framebuffers)
+fastpath_glFramebufferRenderbufferOES(GLenum target, GLenum attachment,
+                                                                         GLenum renderbuffertarget, GLuint renderbuffer)
 {
-       int i;
-       GLuint *objid_array = NULL;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _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;
+       _fp_glFramebufferRenderbuffer(target, attachment, renderbuffertarget,
+               renderbuffer, FASTPATH_FUNC_TYPE_OES);
 
-       AST(current_ctx->ostate.shared != NULL);
+       _COREGL_FASTPATH_FUNC_END();
+}
 
-       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-       if (objid_array == NULL) goto finish;
-       {
-               int real_n = 0;
+void
+fastpath_glFramebufferTexture2DOES(GLenum target, GLenum attachment,
+                                                                  GLenum textarget, GLuint texture, GLint level)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
 
-               for (i = 0; i < n; i++) {
-                       int real_objid = _COREGL_INT_INIT_VALUE;
-                       if (framebuffers[i] == 0) continue;
+       _fp_glFramebufferTexture2D(target, attachment, textarget,
+               texture, level, 0, FASTPATH_FUNC_TYPE_OES);
 
-                       real_objid = fastpath_ostate_get_object(&current_ctx->ostate,
-                                                                                                       GL_OBJECT_TYPE_FRAMEBUFFER, framebuffers[i]);
-                       if (real_objid == 0) continue;
+       _COREGL_FASTPATH_FUNC_END();
+}
 
-                       AST(fastpath_ostate_remove_object(&current_ctx->ostate,
-                                                                                         GL_OBJECT_TYPE_FRAMEBUFFER, framebuffers[i]) == 1);
-                       objid_array[real_n++] = real_objid;
-               }
+void
+fastpath_glGenFramebuffersOES(GLsizei n, GLuint *framebuffers)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
 
-               IF_GL_SUCCESS(_orig_fastpath_glDeleteFramebuffersOES(real_n, objid_array)) {
-                       for (i = 0; i < real_n; i++) {
-                               General_Trace_List *current = NULL;
-                               current = current_ctx->ostate.shared->using_gctxs;
+       _fp_glGenFramebuffers(n, framebuffers, FASTPATH_FUNC_TYPE_OES);
 
-                               while (current != NULL) {
-                                       GLGlueContext *cur_gctx = (GLGlueContext *)current->value;
-
-                                       if (cur_gctx->initialized == 1) {
-                                               if (cur_gctx->gl_framebuffer_binding[0] == objid_array[i]) {
-                                                       cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding);
-                                                       CURR_STATE_CLEAR(gl_framebuffer_binding, 0)
-                                               }
-                                               if (cur_gctx->gl_framebuffer_binding_read[0] == objid_array[i]) {
-                                                       cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding_read);
-                                                       CURR_STATE_CLEAR(gl_framebuffer_binding_read, 0)
-                                               }
-                                               if (cur_gctx->gl_framebuffer_binding_draw[0] == objid_array[i]) {
-                                                       cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding_draw);
-                                                       CURR_STATE_CLEAR(gl_framebuffer_binding_draw, 0)
-                                               }
-                                       }
-                                       current = current->next;
-                               }
-                       }
-               }
-       }
-
-       goto finish;
-
-finish:
-       if (objid_array != NULL) {
-               free(objid_array);
-               objid_array = NULL;
-       }
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-void
-fastpath_glDeleteRenderbuffersOES(GLsizei n, const GLuint *renderbuffers)
-{
-       int i;
-       GLuint *objid_array = NULL;
-
-       DEFINE_FASTPAH_GL_FUNC();
-       _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->ostate.shared != NULL);
-
-       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-       if (objid_array == NULL) goto finish;
-       {
-               int real_n = 0;
-
-               for (i = 0; i < n; i++) {
-                       int real_objid = _COREGL_INT_INIT_VALUE;
-                       if (renderbuffers[i] == 0) continue;
-
-                       real_objid = fastpath_ostate_get_object(&current_ctx->ostate,
-                                                                                                       GL_OBJECT_TYPE_RENDERBUFFER, renderbuffers[i]);
-                       if (real_objid == 0) continue;
-
-                       AST(fastpath_ostate_remove_object(&current_ctx->ostate,
-                                                                                         GL_OBJECT_TYPE_RENDERBUFFER, renderbuffers[i]) == 1);
-                       objid_array[real_n++] = real_objid;
-               }
-
-               IF_GL_SUCCESS(_orig_fastpath_glDeleteRenderbuffersOES(real_n, objid_array)) {
-                       for (i = 0; i < real_n; i++) {
-                               General_Trace_List *current = NULL;
-                               current = current_ctx->ostate.shared->using_gctxs;
-
-                               while (current != NULL) {
-                                       GLGlueContext *cur_gctx = (GLGlueContext *)current->value;
-
-                                       if (cur_gctx->initialized == 1) {
-                                               if (cur_gctx->gl_renderbuffer_binding[0] == objid_array[i]) {
-                                                       cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_renderbuffer_binding);
-                                                       CURR_STATE_CLEAR(gl_renderbuffer_binding, 0)
-                                               }
-                                       }
-                                       current = current->next;
-                               }
-                       }
-               }
-       }
-
-       goto finish;
-
-finish:
-       if (objid_array != NULL) {
-               free(objid_array);
-               objid_array = NULL;
-       }
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-void
-fastpath_glDepthRangefOES(GLclampf zNear, GLclampf zFar)
-{
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (CURR_STATE_COMPARE(gl_depth_range, 0, zNear) ||
-                       CURR_STATE_COMPARE(gl_depth_range, 1, zFar)) {
-               IF_GL_SUCCESS(_orig_fastpath_glDepthRangefOES(zNear, zFar)) {
-                       current_ctx->_clear_flag2 |= _CLEAR_FLAG2_BIT_gl_depth_range;
-                       CURR_STATE_UPDATE(gl_depth_range, 0, zNear)
-                       CURR_STATE_UPDATE(gl_depth_range, 1, zFar)
-               }
-       }
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-void
-fastpath_glDepthRangexOES(GLclampx zNear, GLclampx zFar)
-{
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (CURR_STATE_COMPARE(gl_depth_range, 0, zNear) ||
-                       CURR_STATE_COMPARE(gl_depth_range, 1, zFar)) {
-               IF_GL_SUCCESS(_orig_fastpath_glDepthRangexOES(zNear, zFar)) {
-                       current_ctx->_clear_flag2 |= _CLEAR_FLAG2_BIT_gl_depth_range;
-                       CURR_STATE_UPDATE(gl_depth_range, 0, zNear)
-                       CURR_STATE_UPDATE(gl_depth_range, 1, zFar)
-               }
-       }
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-void
-fastpath_glFramebufferRenderbufferOES(GLenum target, GLenum attachment,
-                                                                         GLenum renderbuffertarget, GLuint renderbuffer)
-{
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glFramebufferRenderbufferOES(target, attachment,
-                       renderbuffertarget, real_obj);
-
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-void
-fastpath_glFramebufferTexture2DOES(GLenum target, GLenum attachment,
-                                                                  GLenum textarget, GLuint texture, GLint level)
-{
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
-
-       _orig_fastpath_glFramebufferTexture2DOES(target, attachment, textarget,
-                       real_obj, level);
-
-       goto finish;
-
-finish:
-       _COREGL_FASTPATH_FUNC_END();
-}
-
-void
-fastpath_glGenFramebuffersOES(GLsizei n, GLuint *framebuffers)
-{
-       int i;
-       GLuint *objid_array = NULL;
-
-       DEFINE_FASTPAH_GL_FUNC();
-       _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->ostate.shared != NULL);
-
-       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-
-       IF_GL_SUCCESS(_orig_fastpath_glGenFramebuffersOES(n, objid_array)) {
-               for (i = 0; i < n; i++) {
-                       framebuffers[i] = fastpath_ostate_create_object(&current_ctx->ostate,
-                                                         GL_OBJECT_TYPE_FRAMEBUFFER, objid_array[i]);
-               }
-       }
-
-       goto finish;
-
-finish:
-       if (objid_array != NULL) {
-               free(objid_array);
-               objid_array = NULL;
-       }
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
 fastpath_glGenRenderbuffersOES(GLsizei n, GLuint *renderbuffers)
 {
-       int i;
-       GLuint *objid_array = NULL;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _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->ostate.shared != NULL);
-
-       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-
-       IF_GL_SUCCESS(_orig_fastpath_glGenRenderbuffersOES(n, objid_array)) {
-               for (i = 0; i < n; i++) {
-                       renderbuffers[i] = fastpath_ostate_create_object(&current_ctx->ostate,
-                                                          GL_OBJECT_TYPE_RENDERBUFFER, objid_array[i]);
-               }
-       }
 
-       goto finish;
+       _fp_glGenRenderbuffers(n, renderbuffers, FASTPATH_FUNC_TYPE_OES);
 
-finish:
-       if (objid_array != NULL) {
-               free(objid_array);
-               objid_array = NULL;
-       }
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -7832,44 +8010,11 @@ void
 fastpath_glGetFramebufferAttachmentParameterivOES(GLenum target,
                GLenum attachment, GLenum pname, GLint *params)
 {
-       GLint real_obj, fa_type;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       switch (pname) {
-       case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
-               params[0] = 0;
-               _orig_fastpath_glGetFramebufferAttachmentParameterivOES(target, attachment,
-                               pname, &real_obj);
-               _orig_fastpath_glGetFramebufferAttachmentParameterivOES(target, attachment,
-                               GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &fa_type);
-               switch (fa_type) {
-               case GL_TEXTURE:
-                       if (GET_GLUE_OBJ(GL_OBJECT_TYPE_TEXTURE, real_obj, (GLuint *)params) != 1) {
-                               params[0] = 0;
-                               goto finish;
-                       }
-                       break;
-               case GL_RENDERBUFFER:
-                       if (GET_GLUE_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, real_obj,
-                                                        (GLuint *)params) != 1) {
-                               params[0] = 0;
-                               goto finish;
-                       }
-                       break;
-               }
-               break;
-       default:
-               _orig_fastpath_glGetFramebufferAttachmentParameterivOES(target, attachment,
-                               pname, params);
-               break;
-       }
 
-       goto finish;
+       _fp_glGetFramebufferAttachmentParameteriv(target, attachment, pname,
+                       params, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -7942,157 +8087,50 @@ finish:
 void
 fastpath_glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_QUERY, id, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       _orig_fastpath_glGetQueryObjectuivEXT(real_obj, pname, params);
+       _fp_glGetQueryObjectuiv(id, pname, params, FASTPATH_FUNC_TYPE_EXT);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
 fastpath_glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
 {
-       GLuint glue_obj_id = _COREGL_INT_INIT_VALUE;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       _orig_fastpath_glGetQueryivEXT(target, pname, params);
-
-       switch (pname) {
-       case GL_CURRENT_QUERY:
-               if (params[0] != 0) {
-                       AST(GET_GLUE_OBJ(GL_OBJECT_TYPE_QUERY, params[0], &glue_obj_id) == 1);
-                       params[0] = glue_obj_id;
-               }
-               break;
-       }
+       _fp_glGetQueryiv(target, pname, params, FASTPATH_FUNC_TYPE_EXT);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
 fastpath_glBeginQueryEXT(GLenum target, GLuint id)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_QUERY, id, &real_obj) != 1) {
-               // TODO : Begin - Context Switch
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
-
-       _orig_fastpath_glBeginQueryEXT(target, real_obj);
 
-       goto finish;
+       _fp_glBeginQuery(target, id, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
 fastpath_glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
 {
-       int i;
-       GLuint *objid_array = NULL;
-       int real_n = 0;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _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 (ids == NULL) goto finish;
-
-       AST(current_ctx->ostate.shared != NULL);
-
-       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-       if (objid_array == NULL) goto finish;
-
-       for (i = 0; i < n; i++) {
-               GLuint real_obj;
-               if (ids[i] == 0)
-                       continue;
-
-               if (GET_REAL_OBJ(GL_OBJECT_TYPE_QUERY, ids[i], &real_obj) != 1)
-                       continue;
 
-               AST(fastpath_ostate_remove_object(&current_ctx->ostate, GL_OBJECT_TYPE_QUERY,
-                                                                                 ids[i]) == 1);
-               objid_array[real_n++] = real_obj;
-       }
-
-       _orig_fastpath_glDeleteQueriesEXT(real_n, objid_array);
-
-       goto finish;
+       _fp_glDeleteQueries(n, ids, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
-       if (objid_array != NULL) {
-               free(objid_array);
-               objid_array = NULL;
-       }
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
 fastpath_glGenQueriesEXT(GLsizei n, GLuint *ids)
 {
-       int i;
-       GLuint *objid_array = NULL;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _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 (ids == NULL) goto finish;
 
-       AST(current_ctx->ostate.shared != NULL);
+       _fp_glGenQueries(n, ids, FASTPATH_FUNC_TYPE_EXT);
 
-       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-
-       IF_GL_SUCCESS(_orig_fastpath_glGenQueriesEXT(n, objid_array)) {
-               for (i = 0; i < n; i++) {
-                       ids[i] = fastpath_ostate_create_object(&current_ctx->ostate,
-                                                                                                  GL_OBJECT_TYPE_QUERY, objid_array[i]);
-               }
-       }
-
-       goto finish;
-
-finish:
-       if (objid_array != NULL) {
-               free(objid_array);
-               objid_array = NULL;
-       }
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8100,22 +8138,11 @@ GLboolean
 fastpath_glIsFramebufferOES(GLuint framebuffer)
 {
        GLboolean ret = GL_FALSE;
-       GLuint real_obj;
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_FRAMEBUFFER, framebuffer, &real_obj) != 1) {
-               ret = GL_FALSE;
-               goto finish;
-       }
 
-       ret = _orig_fastpath_glIsFramebufferOES(real_obj);
+       ret = _fp_glIsFramebuffer(framebuffer, FASTPATH_FUNC_TYPE_OES);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
        return ret;
 }
@@ -8124,22 +8151,11 @@ GLboolean
 fastpath_glIsQueryEXT(GLuint id)
 {
        GLboolean ret = GL_FALSE;
-       GLuint real_obj;
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_QUERY, id, &real_obj) != 1) {
-               ret = GL_FALSE;
-               goto finish;
-       }
 
-       ret = _orig_fastpath_glIsQueryEXT(real_obj);
+       ret = _fp_glIsQuery(id, FASTPATH_FUNC_TYPE_EXT);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
        return ret;
 }
@@ -8148,22 +8164,11 @@ GLboolean
 fastpath_glIsRenderbufferOES(GLuint renderbuffer)
 {
        GLboolean ret = GL_FALSE;
-       GLuint real_obj;
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_RENDERBUFFER, renderbuffer, &real_obj) != 1) {
-               ret = GL_FALSE;
-               goto finish;
-       }
+       ret = _fp_glIsRenderbuffer(renderbuffer, FASTPATH_FUNC_TYPE_OES);
 
-       ret = _orig_fastpath_glIsRenderbufferOES(real_obj);
-
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
        return ret;
 }
@@ -8171,48 +8176,21 @@ finish:
 void
 fastpath_glBlendEquationOES(GLenum mode)
 {
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       IF_GL_SUCCESS(_orig_fastpath_glBlendEquationOES(mode)) {
-               current_ctx->_blend_flag |=
-                       _BLEND_FLAG_BIT_gl_blend_equation_rgb |
-                       _BLEND_FLAG_BIT_gl_blend_equation_alpha;
+       _fp_glBlendEquation(mode, FASTPATH_FUNC_TYPE_OES);
 
-               _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:
        _COREGL_FASTPATH_FUNC_END();
 }
 
 
 void
 fastpath_glBlendEquationSeparateOES(GLenum modeRGB, GLenum modeAlpha)
-{
-       DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (CURR_STATE_COMPARE(gl_blend_equation_rgb, 0, modeRGB) ||
-                       CURR_STATE_COMPARE(gl_blend_equation_alpha, 0, modeAlpha)) {
-               IF_GL_SUCCESS(_orig_fastpath_glBlendEquationSeparateOES(modeRGB, modeAlpha)) {
-                       current_ctx->_blend_flag |=
-                               _BLEND_FLAG_BIT_gl_blend_equation_rgb |
-                               _BLEND_FLAG_BIT_gl_blend_equation_alpha;
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
 
-                       CURR_STATE_UPDATE(gl_blend_equation_rgb, 0, modeRGB)
-                       CURR_STATE_UPDATE(gl_blend_equation_alpha, 0, modeAlpha)
-               }
-       }
-       goto finish;
+       _fp_glBlendEquationSeparate(modeRGB, modeAlpha, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8220,31 +8198,10 @@ void
 fastpath_glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha,
                                                                GLenum dstAlpha)
 {
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (CURR_STATE_COMPARE(gl_blend_src_rgb, 0, srcRGB) ||
-                       CURR_STATE_COMPARE(gl_blend_dst_rgb, 0, dstRGB) ||
-                       CURR_STATE_COMPARE(gl_blend_src_alpha, 0, srcAlpha) ||
-                       CURR_STATE_COMPARE(gl_blend_dst_alpha, 0, dstAlpha)) {
-               IF_GL_SUCCESS(_orig_fastpath_glBlendFuncSeparateOES(srcRGB, dstRGB, srcAlpha,
-                                         dstAlpha)) {
-                       current_ctx->_blend_flag |=
-                               _BLEND_FLAG_BIT_gl_blend_src_rgb |
-                               _BLEND_FLAG_BIT_gl_blend_src_alpha |
-                               _BLEND_FLAG_BIT_gl_blend_dst_rgb |
-                               _BLEND_FLAG_BIT_gl_blend_dst_alpha;
 
-                       CURR_STATE_UPDATE(gl_blend_src_rgb, 0, srcRGB)
-                       CURR_STATE_UPDATE(gl_blend_dst_rgb, 0, dstRGB)
-                       CURR_STATE_UPDATE(gl_blend_src_alpha, 0, srcAlpha)
-                       CURR_STATE_UPDATE(gl_blend_dst_alpha, 0, dstAlpha)
-               }
-       }
-       goto finish;
+       _fp_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8294,24 +8251,10 @@ finish:
 void
 fastpath_glSampleCoveragexOES(GLclampx value, GLboolean invert)
 {
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (CURR_STATE_COMPARE(gl_sample_coverage_value, 0, value) ||
-                       CURR_STATE_COMPARE(gl_sample_coverage_invert, 0, invert)) {
-               IF_GL_SUCCESS(_orig_fastpath_glSampleCoveragexOES(value, invert)) {
-                       current_ctx->_misc_flag1 |=
-                               _MISC_FLAG1_BIT_gl_sample_coverage_value |
-                               _MISC_FLAG1_BIT_gl_sample_coverage_invert;
 
-                       CURR_STATE_UPDATE(gl_sample_coverage_value, 0, value)
-                       CURR_STATE_UPDATE(gl_sample_coverage_invert, 0, invert)
-               }
-       }
-       goto finish;
+       _fp_glSampleCoveragex(value, invert, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8341,74 +8284,20 @@ finish:
 void
 fastpath_glGenVertexArraysOES(GLsizei n, GLuint *arrays)
 {
-       int i;
-       GLuint *objid_array = NULL;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (n < 0) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
-       if (n == 0) goto finish;
-       if (arrays == NULL) goto finish;
-
-       AST(current_ctx->ostate.shared != NULL);
-
-       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-
-       IF_GL_SUCCESS(_orig_fastpath_glGenVertexArraysOES(n, objid_array)) {
-               for (i = 0; i < n; i++) {
-                       arrays[i] = fastpath_ostate_create_object(&current_ctx->ostate,
-                                               GL_OBJECT_TYPE_VERTEXARRAY, objid_array[i]);
-               }
-       }
 
-       goto finish;
+       _fp_glGenVertexArrays(n, arrays, FASTPATH_FUNC_TYPE_OES);
 
-finish:
-       if (objid_array != NULL) {
-               free(objid_array);
-               objid_array = NULL;
-       }
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
 fastpath_glBindVertexArrayOES(GLuint array)
 {
-       GLuint real_obj;
-       int i;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_VERTEXARRAY, array, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       if (real_obj == 0) {
-               IF_GL_SUCCESS(_orig_fastpath_glBindVertexArrayOES(real_obj)) {
-                       current_ctx->_misc_flag3 &= ~(_MISC_FLAG3_BIT_gl_vertex_array_binding);
-                       CURR_STATE_CLEAR(gl_vertex_array_binding, 0)
-                       for (i = 0; i < current_ctx->gl_vertex_attribs_num[0]; i++)
-                               CURR_STATE_CLEAR(gl_vertex_array_enabled, i)
-                       }
-       } else if (CURR_STATE_COMPARE(gl_vertex_array_binding, 0, real_obj)) {
-               IF_GL_SUCCESS(_orig_fastpath_glBindVertexArrayOES(real_obj)) {
-                       current_ctx->_misc_flag3 |= _MISC_FLAG3_BIT_gl_vertex_array_binding;
-                       CURR_STATE_UPDATE(gl_vertex_array_binding, 0, real_obj)
-                       for (i = 0; i < current_ctx->gl_vertex_attribs_num[0]; i++)
-                               CURR_STATE_CLEAR(gl_vertex_array_enabled, i)
-                       }
-       }
-       goto finish;
+       _fp_glBindVertexArray(array, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8416,22 +8305,11 @@ GLboolean
 fastpath_glIsVertexArrayOES(GLuint array)
 {
        GLboolean ret = GL_FALSE;
-       GLuint real_obj;
 
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_VERTEXARRAY, array, &real_obj) != 1) {
-               ret = GL_FALSE;
-               goto finish;
-       }
-
-       ret = _orig_fastpath_glIsVertexArrayOES(real_obj);
 
-       goto finish;
+       ret = _fp_glIsVertexArray(array, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
        return ret;
 }
@@ -8440,85 +8318,20 @@ finish:
 void
 fastpath_glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays)
 {
-       int i;
-       GLuint *objid_array = NULL;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _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 (arrays == NULL) goto finish;
-
-       AST(current_ctx->ostate.shared != NULL);
-
-       objid_array = (GLuint *)calloc(1, sizeof(GLuint) * n);
-       if (objid_array == NULL) goto finish;
-       {
-               int real_n = 0;
-
-               for (i = 0; i < n; i++) {
-                       GLuint real_objid;
 
-                       if (arrays[i] == 0)
-                               continue;
-
-                       if (GET_REAL_OBJ(GL_OBJECT_TYPE_VERTEXARRAY, arrays[i], &real_objid) != 1)
-                               continue;
-
-                       AST(fastpath_ostate_remove_object(&current_ctx->ostate,
-                                                                                         GL_OBJECT_TYPE_VERTEXARRAY, arrays[i]) == 1);
-                       objid_array[real_n++] = real_objid;
-               }
-
-               IF_GL_SUCCESS(_orig_fastpath_glDeleteVertexArraysOES(real_n, objid_array)) {
-                       for (i = 0; i < real_n; i++) {
-                               General_Trace_List *current = NULL;
-                               current = current_ctx->ostate.shared->using_gctxs;
-
-                               while (current != NULL) {
-                                       GLGlueContext *cur_gctx = (GLGlueContext *)current->value;
-
-                                       if (cur_gctx->initialized == 1) {
-                                               if (cur_gctx->gl_vertex_array_binding[0] == objid_array[i])
-                                                       cur_gctx->gl_vertex_array_binding[0] = 0;
-                                       }
-                                       current = current->next;
-                               }
-                       }
-               }
-       }
-
-       goto finish;
+       _fp_glDeleteVertexArrays(n, arrays, FASTPATH_FUNC_TYPE_OES);
 
-finish:
-       if (objid_array != NULL) {
-               free(objid_array);
-               objid_array = NULL;
-       }
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
 fastpath_glClearDepthfOES(GLclampf depth)
 {
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if CURR_STATE_COMPARE(gl_depth_clear_value, 0, depth) {
-               IF_GL_SUCCESS(_orig_fastpath_glClearDepthfOES(depth)) {
-                       current_ctx->_clear_flag2 |= _CLEAR_FLAG2_BIT_gl_depth_clear_value;
-                       CURR_STATE_UPDATE(gl_depth_clear_value, 0, depth)
-               }
-       }
-       goto finish;
+       _fp_glClearDepthf(depth, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8586,13 +8399,12 @@ finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+static void
+_fp_glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_BUFFER, buffer, &real_obj) != 1) {
@@ -8600,42 +8412,54 @@ fastpath_glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
                goto finish;
        }
 
-       _orig_fastpath_glTexBuffer(target, internalformat, real_obj);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glTexBuffer(target, internalformat, real_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glTexBufferOES(target, internalformat, real_obj);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glTexBufferEXT(target, internalformat, real_obj);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glTexBuffer(target, internalformat, buffer, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
 void
 fastpath_glTexBufferOES(GLenum target, GLenum internalformat, GLuint buffer)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_BUFFER, buffer, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       _orig_fastpath_glTexBufferOES(target, internalformat, real_obj);
+       _fp_glTexBuffer(target, internalformat, buffer, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer,
-                                                 GLintptr offset, GLsizeiptr size)
+static void
+_fp_glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer,
+                                                      GLintptr offset, GLsizeiptr size, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_BUFFER, buffer, &real_obj) != 1) {
@@ -8643,11 +8467,35 @@ fastpath_glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer,
                goto finish;
        }
 
-       _orig_fastpath_glTexBufferRange(target, internalformat, real_obj, offset, size);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glTexBufferRange(target, internalformat, real_obj, offset, size);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glTexBufferRangeOES(target, internalformat, real_obj, offset, size);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glTexBufferRangeEXT(target, internalformat, real_obj, offset, size);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer,
+                                                 GLintptr offset, GLsizeiptr size)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glTexBufferRange(target, internalformat, buffer, offset, size, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8712,21 +8560,66 @@ fastpath_glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize,
                goto finish;
        }
 
-       _orig_fastpath_glGetnUniformuiv(real_obj, location, bufSize, params);
+       _orig_fastpath_glGetnUniformuiv(real_obj, location, bufSize, params);
+
+       goto finish;
+
+finish:
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glSamplerParameterIiv(GLuint sampler, GLenum pname,
+                                       const GLint *param, FASTPATH_FUNC_TYPE ftype)
+{
+       GLuint real_obj;
+
+       DEFINE_FASTPAH_GL_FUNC();
+       INIT_FASTPATH_GL_FUNC();
+
+       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
+               _set_gl_error(GL_INVALID_VALUE);
+               goto finish;
+       }
+
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glSamplerParameterIiv(real_obj, pname, param);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glSamplerParameterIivOES(real_obj, pname, param);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glSamplerParameterIivEXT(real_obj, pname, param);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
+
+       goto finish;
+
+finish:
+       return;
+}
+
+void
+fastpath_glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
 
-       goto finish;
+       _fp_glSamplerParameterIiv(sampler, pname, param, FASTPATH_FUNC_TYPE_STANDARD);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+static void
+_fp_glSamplerParameterIuiv(GLuint sampler, GLenum pname,
+                                                                    const GLuint *param, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
@@ -8734,44 +8627,45 @@ fastpath_glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
                goto finish;
        }
 
-       _orig_fastpath_glSamplerParameterIiv(real_obj, pname, param);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glSamplerParameterIuiv(real_obj, pname, param);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glSamplerParameterIuivOES(real_obj, pname, param);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glSamplerParameterIuivEXT(real_obj, pname, param);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
 void
 fastpath_glSamplerParameterIuiv(GLuint sampler, GLenum pname,
                                                                const GLuint *param)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glSamplerParameterIuiv(real_obj, pname, param);
+       _fp_glSamplerParameterIuiv(sampler, pname, param, FASTPATH_FUNC_TYPE_STANDARD);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
-void
-fastpath_glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+static void
+_fp_glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params,
+                                          FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
@@ -8779,21 +8673,44 @@ fastpath_glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
                goto finish;
        }
 
-       _orig_fastpath_glGetSamplerParameterIiv(real_obj, pname, params);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGetSamplerParameterIiv(real_obj, pname, params);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glGetSamplerParameterIivOES(real_obj, pname, params);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glGetSamplerParameterIivEXT(real_obj, pname, params);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
 void
-fastpath_glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+fastpath_glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGetSamplerParameterIiv(sampler, pname, params, FASTPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params,
+                                           FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
@@ -8801,22 +8718,44 @@ fastpath_glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
                goto finish;
        }
 
-       _orig_fastpath_glGetSamplerParameterIuiv(real_obj, pname, params);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glGetSamplerParameterIuiv(real_obj, pname, params);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glGetSamplerParameterIuivOES(real_obj, pname, params);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glGetSamplerParameterIuivEXT(real_obj, pname, params);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_FASTPATH_FUNC_END();
+       return;
 }
 
 void
-fastpath_glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture,
-                                                         GLint level)
+fastpath_glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glGetSamplerParameterIuiv(sampler, pname, params, FASTPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_FASTPATH_FUNC_END();
+}
+
+static void
+_fp_glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture,
+                                                              GLint level, FASTPATH_FUNC_TYPE ftype)
 {
        GLuint real_obj;
 
        DEFINE_FASTPAH_GL_FUNC();
-       _COREGL_FASTPATH_FUNC_BEGIN();
        INIT_FASTPATH_GL_FUNC();
 
        if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1) {
@@ -8824,11 +8763,35 @@ fastpath_glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture,
                goto finish;
        }
 
-       _orig_fastpath_glFramebufferTexture(target, attachment, real_obj, level);
+       switch (ftype) {
+       case FASTPATH_FUNC_TYPE_STANDARD:
+               _orig_fastpath_glFramebufferTexture(target, attachment, real_obj, level);
+               break;
+       case FASTPATH_FUNC_TYPE_OES:
+               _orig_fastpath_glFramebufferTextureOES(target, attachment, real_obj, level);
+               break;
+       case FASTPATH_FUNC_TYPE_EXT:
+               _orig_fastpath_glFramebufferTextureEXT(target, attachment, real_obj, level);
+               break;
+       default:
+               _set_gl_error(GL_INVALID_OPERATION);
+               goto finish;
+       }
 
        goto finish;
 
 finish:
+       return;
+}
+
+void
+fastpath_glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture,
+                                                         GLint level)
+{
+       _COREGL_FASTPATH_FUNC_BEGIN();
+
+       _fp_glFramebufferTexture(target, attachment, texture, level, FASTPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8836,89 +8799,43 @@ void
 fastpath_glFramebufferTextureOES(GLenum target, GLenum attachment,
                                                                 GLuint texture, GLint level)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glFramebufferTextureOES(target, attachment, real_obj, level);
-
-       goto finish;
+       _fp_glFramebufferTexture(target, attachment, texture, level, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
+
 void
 fastpath_glTexBufferRangeOES(GLenum target, GLenum internalformat,
                                                         GLuint buffer, GLintptr offset, GLsizeiptr size)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_BUFFER, buffer, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
-
-       _orig_fastpath_glTexBufferRangeOES(target, internalformat, real_obj, offset,
-                                                                          size);
 
-       goto finish;
+       _fp_glTexBufferRange(target, internalformat, buffer, offset, size, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
+
 void
 fastpath_glGetSamplerParameterIivOES(GLuint sampler, GLenum pname,
                                                                         GLint *params)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       _orig_fastpath_glGetSamplerParameterIivOES(real_obj, pname, params);
+       _fp_glGetSamplerParameterIiv(sampler, pname, params, FASTPATH_FUNC_TYPE_OES);
 
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
+
 void
 fastpath_glSamplerParameterIivOES(GLuint sampler, GLenum pname,
                                                                  const GLint *param)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
-
-       _orig_fastpath_glSamplerParameterIivOES(real_obj, pname, param);
 
-       goto finish;
+       _fp_glSamplerParameterIiv(sampler, pname, param, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
@@ -8926,208 +8843,90 @@ void
 fastpath_glGetSamplerParameterIuivOES(GLuint sampler, GLenum pname,
                                                                          GLuint *params)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
+       _fp_glGetSamplerParameterIuiv(sampler, pname, params, FASTPATH_FUNC_TYPE_OES);
 
-       _orig_fastpath_glGetSamplerParameterIuivOES(real_obj, pname, params);
-
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
+
 void
 fastpath_glSamplerParameterIuivOES(GLuint sampler, GLenum pname,
                                                                   const GLuint *param)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       _orig_fastpath_glSamplerParameterIuivOES(real_obj, pname, param);
-
-       goto finish;
+       _fp_glSamplerParameterIuiv(sampler, pname, param, FASTPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 void
 fastpath_glGetSamplerParameterIivEXT(GLuint sampler, GLenum pname,
                                                                         GLint *params)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       _orig_fastpath_glGetSamplerParameterIivEXT(real_obj, pname, params);
-
-       goto finish;
+       _fp_glGetSamplerParameterIiv(sampler, pname, params, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 void
 fastpath_glGetSamplerParameterIuivEXT(GLuint sampler, GLenum pname,
                                                                          GLuint *params)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       _orig_fastpath_glGetSamplerParameterIuivEXT(real_obj, pname, params);
-
-       goto finish;
+       _fp_glGetSamplerParameterIuiv(sampler, pname, params, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 void
 fastpath_glSamplerParameterIivEXT(GLuint sampler, GLenum pname,
                                                                  const GLint *param)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
 
-       _orig_fastpath_glSamplerParameterIivEXT(real_obj, pname, param);
-
-       goto finish;
+       _fp_glSamplerParameterIiv(sampler, pname, param, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 void
 fastpath_glFramebufferTextureEXT(GLenum target, GLenum attachment,
                                                                 GLuint texture, GLint level)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_TEXTURE, texture, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       _orig_fastpath_glFramebufferTextureEXT(target, attachment, real_obj, level);
-
-       goto finish;
+       _fp_glFramebufferTexture(target, attachment, texture, level, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 void
 fastpath_glTexBufferRangeEXT(GLenum target, GLenum internalformat,
                                                         GLuint buffer, GLintptr offset, GLsizeiptr size)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (target != GL_TEXTURE_BUFFER_EXT) {
-               _set_gl_error(GL_INVALID_ENUM);
-               goto finish;
-       }
-       if (offset < 0 || size <= 0) {
-               _set_gl_error(GL_INVALID_VALUE);
-               goto finish;
-       }
 
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_BUFFER, buffer, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
+       _fp_glTexBufferRange(target, internalformat, buffer, offset, size, FASTPATH_FUNC_TYPE_EXT);
 
-       _orig_fastpath_glTexBufferRangeEXT(target, internalformat, real_obj, offset,
-                                                                          size);
-
-       goto finish;
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 void
 fastpath_glSamplerParameterIuivEXT(GLuint sampler, GLenum pname,
                                                                   const GLuint *param)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_SAMPLER, sampler, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
-
-       _orig_fastpath_glSamplerParameterIuivEXT(real_obj, pname, param);
 
-       goto finish;
+       _fp_glSamplerParameterIuiv(sampler, pname, param, FASTPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 void
 fastpath_glTexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer)
 {
-       GLuint real_obj;
-
-       DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
-       INIT_FASTPATH_GL_FUNC();
 
-       if (target != GL_TEXTURE_BUFFER_EXT)
-               _set_gl_error(GL_INVALID_ENUM);
-
-       if (GET_REAL_OBJ(GL_OBJECT_TYPE_BUFFER, buffer, &real_obj) != 1) {
-               _set_gl_error(GL_INVALID_OPERATION);
-               goto finish;
-       }
+       _fp_glTexBuffer(target, internalformat, buffer, FASTPATH_FUNC_TYPE_EXT);
 
-       _orig_fastpath_glTexBufferEXT(target, internalformat, real_obj);
-
-finish:
        _COREGL_FASTPATH_FUNC_END();
 }
 
index 7e1f75e..bcb3735 100644 (file)
 # define _COREGL_TRACE_SURFACE(force_output, type, position)
 #endif
 
+#define TRACEPATH_FUNC_TYPE                 int
+#define TRACEPATH_FUNC_TYPE_STANDARD        0x10
+#define TRACEPATH_FUNC_TYPE_OES             0x20
+#define TRACEPATH_FUNC_TYPE_EXT             0x30
+
 #define _COREGL_TRACEPATH_FUNC_BEGIN() \
        if (unlikely(get_trace_api_flag() == 1)) \
                _COREGL_TRACE_API_BEGIN(__func__, NULL, 1);
index 5787722..a4a05ed 100644 (file)
@@ -1733,11 +1733,9 @@ finish:
        _COREGL_TRACEPATH_FUNC_END();
 }
 
-void
-tracepath_glBindFramebuffer(GLenum target, GLuint framebuffer)
+static void
+_tp_glBindFramebuffer(GLenum target, GLuint framebuffer, TRACEPATH_FUNC_TYPE ftype)
 {
-       _COREGL_TRACEPATH_FUNC_BEGIN();
-
 #ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
        if (unlikely(get_trace_surface_flag() == 1)) {
                GLint oldfb;
@@ -1750,7 +1748,16 @@ tracepath_glBindFramebuffer(GLenum target, GLuint framebuffer)
        }
 #endif // COREGL_TRACEPATH_TRACE_SURFACE_INFO
 
-       _orig_tracepath_glBindFramebuffer(target, framebuffer);
+       switch (ftype) {
+       case TRACEPATH_FUNC_TYPE_STANDARD:
+               _orig_tracepath_glBindFramebuffer(target, framebuffer);
+               break;
+       case TRACEPATH_FUNC_TYPE_OES:
+               _orig_tracepath_glBindFramebufferOES(target, framebuffer);
+               break;
+       default:
+               goto finish;
+       }
 
 #ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
        if (unlikely(get_trace_surface_flag() == 1)) {
@@ -1761,6 +1768,16 @@ tracepath_glBindFramebuffer(GLenum target, GLuint framebuffer)
        goto finish;
 
 finish:
+       return;
+}
+
+void
+tracepath_glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+       _COREGL_TRACEPATH_FUNC_BEGIN();
+
+       _tp_glBindFramebuffer(target, framebuffer, TRACEPATH_FUNC_TYPE_STANDARD);
+
        _COREGL_TRACEPATH_FUNC_END();
 }
 
@@ -2111,16 +2128,23 @@ finish:
        _COREGL_TRACEPATH_FUNC_END();
 }
 
-void
-tracepath_glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+static void
+_tp_glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers, TRACEPATH_FUNC_TYPE ftype)
 {
-       _COREGL_TRACEPATH_FUNC_BEGIN();
-
 #ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
        tracepath_fbdump_update(0);
 #endif // COREGL_TRACEPATH_TRACE_SURFACE_INFO
 
-       _orig_tracepath_glDeleteRenderbuffers(n, renderbuffers);
+       switch (ftype) {
+       case TRACEPATH_FUNC_TYPE_STANDARD:
+               _orig_tracepath_glDeleteRenderbuffers(n, renderbuffers);
+               break;
+       case TRACEPATH_FUNC_TYPE_OES:
+               _orig_tracepath_glDeleteRenderbuffersOES(n, renderbuffers);
+               break;
+       default:
+               goto finish;
+       }
 
 #ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
        tracepath_fbdump_update(1);
@@ -2129,7 +2153,6 @@ tracepath_glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
        goto finish;
 
 finish:
-       _COREGL_TRACEPATH_FUNC_END();
 #ifdef COREGL_TRACEPATH_TRACE_MEMUSE_INFO
        if (get_trace_mem_flag() == 1) {
                MY_MODULE_TSTATE* tstate = _get_my_state();
@@ -2145,6 +2168,16 @@ finish:
 }
 
 void
+tracepath_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+{
+       _COREGL_TRACEPATH_FUNC_BEGIN();
+
+       _tp_glDeleteRenderbuffers(n, renderbuffers, TRACEPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_TRACEPATH_FUNC_END();
+}
+
+void
 tracepath_glDeleteShader(GLuint shader)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
@@ -2543,16 +2576,21 @@ finish:
        _COREGL_TRACEPATH_FUNC_END();
 }
 
-void
-tracepath_glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+static void
+_tp_glGenRenderbuffers(GLsizei n, GLuint *renderbuffers, TRACEPATH_FUNC_TYPE ftype)
 {
-       _COREGL_TRACEPATH_FUNC_BEGIN();
-       _orig_tracepath_glGenRenderbuffers(n, renderbuffers);
+       switch (ftype) {
+       case TRACEPATH_FUNC_TYPE_STANDARD:
+               _orig_tracepath_glGenRenderbuffers(n, renderbuffers);
+               break;
+       case TRACEPATH_FUNC_TYPE_OES:
+               _orig_tracepath_glGenRenderbuffersOES(n, renderbuffers);
+               break;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_TRACEPATH_FUNC_END();
 #ifdef COREGL_TRACEPATH_TRACE_MEMUSE_INFO
        if (get_trace_mem_flag() == 1) {
                MY_MODULE_TSTATE* tstate = _get_my_state();
@@ -2568,6 +2606,16 @@ finish:
 }
 
 void
+tracepath_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
+{
+       _COREGL_TRACEPATH_FUNC_BEGIN();
+
+       _tp_glGenRenderbuffers(n, renderbuffers, TRACEPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_TRACEPATH_FUNC_END();
+}
+
+void
 tracepath_glGenTextures(GLsizei n, GLuint *textures)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
@@ -4108,18 +4156,26 @@ finish:
        _COREGL_TRACEPATH_FUNC_END();
 }
 
-void
-tracepath_glRenderbufferStorageMultisample(GLenum target, GLsizei samples,
-               GLenum internalformat, GLsizei width, GLsizei height)
+static void
+_tp_glRenderbufferStorageMultisample(GLenum target, GLsizei samples,
+               GLenum internalformat, GLsizei width, GLsizei height, TRACEPATH_FUNC_TYPE ftype)
 {
-       _COREGL_TRACEPATH_FUNC_BEGIN();
-       _orig_tracepath_glRenderbufferStorageMultisample(target, samples,
+       switch (ftype) {
+       case TRACEPATH_FUNC_TYPE_STANDARD:
+               _orig_tracepath_glRenderbufferStorageMultisample(target, samples,
                        internalformat, width, height);
+               break;
+       case TRACEPATH_FUNC_TYPE_EXT:
+               _orig_tracepath_glRenderbufferStorageMultisampleEXT(target, samples,
+                       internalformat, width, height);
+               break;
+       default:
+               goto finish;
+       }
 
        goto finish;
 
 finish:
-       _COREGL_TRACEPATH_FUNC_END();
 #ifdef COREGL_TRACEPATH_TRACE_MEMUSE_INFO
        if (get_trace_mem_flag() == 1) {
                MY_MODULE_TSTATE* tstate = _get_my_state();
@@ -4151,45 +4207,27 @@ finish:
 }
 
 void
+tracepath_glRenderbufferStorageMultisample(GLenum target, GLsizei samples,
+       GLenum internalformat, GLsizei width, GLsizei height)
+{
+       _COREGL_TRACEPATH_FUNC_BEGIN();
+
+       _tp_glRenderbufferStorageMultisample(target, samples, internalformat,
+               width, height, TRACEPATH_FUNC_TYPE_STANDARD);
+
+       _COREGL_TRACEPATH_FUNC_END();
+}
+
+void
 tracepath_glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples,
                GLenum internalformat, GLsizei width, GLsizei height)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
-       _orig_tracepath_glRenderbufferStorageMultisampleEXT(target, samples,
-                       internalformat, width, height);
 
-       goto finish;
+       _tp_glRenderbufferStorageMultisample(target, samples, internalformat,
+               width, height, TRACEPATH_FUNC_TYPE_EXT);
 
-finish:
        _COREGL_TRACEPATH_FUNC_END();
-#ifdef COREGL_TRACEPATH_TRACE_MEMUSE_INFO
-       if (get_trace_mem_flag() == 1) {
-               MY_MODULE_TSTATE* tstate = _get_my_state();
-               if (tstate && tstate->ctx != NULL) {
-                       struct _Glbuf_Data data = _get_glbuf_data(GL_RENDERBUFFER_BINDING, internalformat);
-                       _add_glbuf_object(tstate->ctx->sostate->glbuf_rb, data.obj_idx, "Renderbuffer", width,
-                                                         height, data.bpp, data.format);
-               }
-       }
-#endif // COREGL_TRACEPATH_TRACE_MEMUSE_INFO
-#ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
-       if (get_trace_surface_flag() == 1) {
-               MY_MODULE_TSTATE* tstate = _get_my_state();
-               if (tstate && tstate->ctx != NULL) {
-                       int objidx = _COREGL_INT_INIT_VALUE;
-                       _orig_tracepath_glGetIntegerv(GL_RENDERBUFFER_BINDING, &objidx);
-                       AST(objidx != _COREGL_INT_INIT_VALUE);
-
-                       {
-                               int channel = _get_channel_by_format(internalformat);
-                               char name[256];
-                               snprintf(name, sizeof(name), "FBORB_0x%X", objidx);
-                               tracepath_surface_trace_add(name, tstate->ctx->dpy, tstate->ctx->handle,
-                                                                                       tstate->surf_draw, -1, 0, objidx, width, height, channel, NULL);
-                       }
-               }
-       }
-#endif // COREGL_TRACEPATH_TRACE_SURFACE_INFO
 }
 
 void
@@ -6786,29 +6824,8 @@ tracepath_glBindFramebufferOES(GLenum target, GLuint framebuffer)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
 
-#ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
-       if (unlikely(get_trace_surface_flag() == 1)) {
-               GLint oldfb;
-               _orig_tracepath_glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldfb);
-               if (oldfb != 0) {
-                       _COREGL_TRACE_SURFACE(0, 2, "GLBINDFBO");
-               }
-
-               tracepath_fbdump_update(0);
-       }
-#endif // COREGL_TRACEPATH_TRACE_SURFACE_INFO
-
-       _orig_tracepath_glBindFramebufferOES(target, framebuffer);
-
-#ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
-       if (unlikely(get_trace_surface_flag() == 1)) {
-               tracepath_fbdump_update(1);
-       }
-#endif // COREGL_TRACEPATH_TRACE_SURFACE_INFO
+       _tp_glBindFramebuffer(target, framebuffer, TRACEPATH_FUNC_TYPE_OES);
 
-       goto finish;
-
-finish:
        _COREGL_TRACEPATH_FUNC_END();
 }
 
@@ -6850,32 +6867,9 @@ tracepath_glDeleteRenderbuffersOES(GLsizei n, const GLuint *renderbuffers)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
 
-#ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
-       tracepath_fbdump_update(0);
-#endif // COREGL_TRACEPATH_TRACE_SURFACE_INFO
-
-       _orig_tracepath_glDeleteRenderbuffersOES(n, renderbuffers);
-
-#ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
-       tracepath_fbdump_update(1);
-#endif // COREGL_TRACEPATH_TRACE_SURFACE_INFO
-
-       goto finish;
+       _tp_glDeleteRenderbuffers(n, renderbuffers, TRACEPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_TRACEPATH_FUNC_END();
-#ifdef COREGL_TRACEPATH_TRACE_MEMUSE_INFO
-       if (get_trace_mem_flag() == 1) {
-               MY_MODULE_TSTATE* tstate = _get_my_state();
-               if (tstate && tstate->ctx != NULL) {
-                       for (int i = 0; i < n; i++) {
-                               if (renderbuffers[i] == 0) continue;
-                               _remove_glbuf_object(tstate->ctx->sostate->glbuf_rb, renderbuffers[i],
-                                                                        "Renderbuffer");
-                       }
-               }
-       }
-#endif // COREGL_TRACEPATH_TRACE_MEMUSE_INFO
 }
 
 void
@@ -6964,24 +6958,10 @@ void
 tracepath_glGenRenderbuffersOES(GLsizei n, GLuint *renderbuffers)
 {
        _COREGL_TRACEPATH_FUNC_BEGIN();
-       _orig_tracepath_glGenRenderbuffersOES(n, renderbuffers);
 
-       goto finish;
+       _tp_glGenRenderbuffers(n, renderbuffers, TRACEPATH_FUNC_TYPE_OES);
 
-finish:
        _COREGL_TRACEPATH_FUNC_END();
-#ifdef COREGL_TRACEPATH_TRACE_MEMUSE_INFO
-       if (get_trace_mem_flag() == 1) {
-               MY_MODULE_TSTATE* tstate = _get_my_state();
-               if (tstate && tstate->ctx != NULL) {
-                       for (int i = 0; i < n; i++) {
-                               if (renderbuffers[i] == 0) continue;
-                               _add_glbuf_object(tstate->ctx->sostate->glbuf_rb, renderbuffers[i],
-                                                                 "Renderbuffer", 0, 0, 0, "Unknown");
-                       }
-               }
-       }
-#endif // COREGL_TRACEPATH_TRACE_MEMUSE_INFO
 }
 
 void