[Title] Fixed fastpath bugs
authorHaegeun Park <haegeun.park@samsung.com>
Fri, 13 Dec 2013 10:29:13 +0000 (02:29 -0800)
committerHaegeun Park <haegeun.park@samsung.com>
Fri, 13 Dec 2013 10:33:02 +0000 (02:33 -0800)
[Issue#]
[Problem]
[Cause] memory leaks in tizen-graphics-test-suite
[Solution]
- Added reference counting mechanism for Hard-Makecurrent
- Modified duplicated binding flags
- Other stabilization

src/headers/sym_egl.h
src/modules/fastpath/coregl_fastpath.c
src/modules/fastpath/coregl_fastpath.h
src/modules/fastpath/coregl_fastpath_egl.c
src/modules/fastpath/coregl_fastpath_gl.c

index a089821..861f27b 100644 (file)
@@ -81,6 +81,10 @@ _COREGL_EXT_SYMBOL(EGLBoolean, eglSwapBuffersRegionEXT, (EGLDisplay dpy, EGLSurf
 
 /* Fastpath Verified extensions */
 //_COREGL_EXT_SYMBOL_FASTPATH_PASS(eglSwapBuffersRegionSEC)
+_COREGL_EXT_SYMBOL_FASTPATH_PASS(eglCreateSyncKHR)
+_COREGL_EXT_SYMBOL_FASTPATH_PASS(eglDestroySyncKHR)
+_COREGL_EXT_SYMBOL_FASTPATH_PASS(eglClientWaitSyncKHR)
+_COREGL_EXT_SYMBOL_FASTPATH_PASS(eglGetSyncAttribKHR)
 
 /* Fastpath Blocked extensions */
 //_COREGL_EXT_SYMBOL_FASTPATH_BLOCK()
index a7e81cd..41af949 100644 (file)
@@ -1374,6 +1374,14 @@ fastpath_init_context_states(GLGlueContext *ctx)
                {
                        COREGL_WRN("\E[40;31;1mNumber of texture unit is too big! (%d-%d)\E[0m\n", MAX_TEXTURE_UNITS, initial_ctx->gl_num_tex_units[0]);
                }
+               if (initial_ctx->gl_num_transform_feedback_separate_attribs[0] > MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)
+               {
+                       COREGL_WRN("\E[40;31;1mNumber of transform feedback separate attrib is too big! (%d-%d)\E[0m\n", MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, initial_ctx->gl_num_transform_feedback_separate_attribs[0]);
+               }
+               if (initial_ctx->gl_num_uniform_buffer_bindings[0] > MAX_UNIFORM_BUFFER_BINDINGS)
+               {
+                       COREGL_WRN("\E[40;31;1mNumber of uniform buffer binding is too big! (%d-%d)\E[0m\n", MAX_UNIFORM_BUFFER_BINDINGS, initial_ctx->gl_num_uniform_buffer_bindings[0]);
+               }
        }
 
        {
@@ -1536,51 +1544,28 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
 #endif // COREGL_USE_MODULE_TRACEPATH
 
        //------------------//
-       // _bind_flag
-       flag = oldctx->_bind_flag | newctx->_bind_flag;
+       // _bind_flag1
+       flag = oldctx->_bind_flag1 | newctx->_bind_flag1;
        if (flag)
        {
                STATE_COMPARE(gl_array_buffer_binding[0])
                {
                        CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding[0]))
                }
-               STATE_COMPARE(gl_copy_read_buffer_binding[0])
-               {
-                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_COPY_READ_BUFFER, newctx->gl_copy_read_buffer_binding[0]))
-               }
-               STATE_COMPARE(gl_copy_write_buffer_binding[0])
-               {
-                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_COPY_WRITE_BUFFER, newctx->gl_copy_write_buffer_binding[0]))
-               }
                STATE_COMPARE(gl_element_array_buffer_binding[0])
                {
                        CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding[0]))
                }
-               STATE_COMPARE(gl_pixel_pack_buffer_binding[0])
-               {
-                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_PIXEL_PACK_BUFFER, newctx->gl_pixel_pack_buffer_binding[0]))
-               }
-               STATE_COMPARE(gl_pixel_unpack_buffer_binding[0])
-               {
-                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, newctx->gl_pixel_unpack_buffer_binding[0]))
-               }
-               STATE_COMPARE(gl_transform_feedback_buffer_binding[0])
-               {
-                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, newctx->gl_transform_feedback_buffer_binding[0]))
-               }
-               STATE_COMPARE(gl_uniform_buffer_binding[0])
-               {
-                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_UNIFORM_BUFFER, newctx->gl_uniform_buffer_binding[0]))
-               }
+
                if (newctx->gl_framebuffer_binding_read_used == 1)
                {
                        STATE_COMPARE(gl_framebuffer_binding_read[0])
                        {
-                               CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, newctx->gl_framebuffer_binding_read[0]))
+                               CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_READ_FRAMEBUFFER, newctx->gl_framebuffer_binding_read[0]))
                        }
                        STATE_COMPARE(gl_framebuffer_binding_draw[0])
                        {
-                               CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, newctx->gl_framebuffer_binding_draw[0]))
+                               CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, newctx->gl_framebuffer_binding_draw[0]))
                        }
                }
                else
@@ -1596,6 +1581,36 @@ fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
                }
        }
 
+       //------------------//
+       // _bind_flag2
+       flag = oldctx->_bind_flag2 | newctx->_bind_flag2;
+       if (flag)
+       {
+               STATE_COMPARE(gl_copy_read_buffer_binding[0])
+               {
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_COPY_READ_BUFFER, newctx->gl_copy_read_buffer_binding[0]))
+               }
+               STATE_COMPARE(gl_copy_write_buffer_binding[0])
+               {
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_COPY_WRITE_BUFFER, newctx->gl_copy_write_buffer_binding[0]))
+               }
+               STATE_COMPARE(gl_pixel_pack_buffer_binding[0])
+               {
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_PIXEL_PACK_BUFFER, newctx->gl_pixel_pack_buffer_binding[0]))
+               }
+               STATE_COMPARE(gl_pixel_unpack_buffer_binding[0])
+               {
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, newctx->gl_pixel_unpack_buffer_binding[0]))
+               }
+               STATE_COMPARE(gl_transform_feedback_buffer_binding[0])
+               {
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, newctx->gl_transform_feedback_buffer_binding[0]))
+               }
+               STATE_COMPARE(gl_uniform_buffer_binding[0])
+               {
+                       CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_UNIFORM_BUFFER, newctx->gl_uniform_buffer_binding[0]))
+               }
+       }
 #ifdef COREGL_USE_MODULE_TRACEPATH
        tracepath_api_trace_end("eglMakeCurrent(FP bind buffers)", trace_hint_bindbuffers, 0);
 #endif // COREGL_USE_MODULE_TRACEPATH
index e686a51..0e0684a 100644 (file)
@@ -216,19 +216,21 @@ typedef struct _GLGlueContext
 
 
 
-       unsigned char           _bind_flag;
-#define _BIND_FLAG_BIT_gl_array_buffer_binding               FLAG_BIT_0
-#define _BIND_FLAG_BIT_gl_copy_read_buffer_binding           FLAG_BIT_1
-#define _BIND_FLAG_BIT_gl_copy_write_buffer_binding          FLAG_BIT_1
-#define _BIND_FLAG_BIT_gl_element_array_buffer_binding       FLAG_BIT_1
-#define _BIND_FLAG_BIT_gl_pixel_pack_buffer_binding          FLAG_BIT_1
-#define _BIND_FLAG_BIT_gl_pixel_unpack_buffer_binding        FLAG_BIT_1
-#define _BIND_FLAG_BIT_gl_transform_feedback_buffer_binding  FLAG_BIT_1
-#define _BIND_FLAG_BIT_gl_uniform_buffer_binding             FLAG_BIT_1
-#define _BIND_FLAG_BIT_gl_framebuffer_binding                FLAG_BIT_2
-#define _BIND_FLAG_BIT_gl_renderbuffer_binding               FLAG_BIT_3
-#define _BIND_FLAG_BIT_gl_framebuffer_binding_read           FLAG_BIT_4
-#define _BIND_FLAG_BIT_gl_framebuffer_binding_draw           FLAG_BIT_5
+   unsigned char           _bind_flag1;
+#define _BIND_FLAG1_BIT_gl_array_buffer_binding               FLAG_BIT_0
+#define _BIND_FLAG1_BIT_gl_element_array_buffer_binding       FLAG_BIT_1
+#define _BIND_FLAG1_BIT_gl_framebuffer_binding                FLAG_BIT_2
+#define _BIND_FLAG1_BIT_gl_renderbuffer_binding               FLAG_BIT_3
+#define _BIND_FLAG1_BIT_gl_framebuffer_binding_read           FLAG_BIT_4
+#define _BIND_FLAG1_BIT_gl_framebuffer_binding_draw           FLAG_BIT_5
+
+       unsigned char           _bind_flag2;
+#define _BIND_FLAG2_BIT_gl_copy_read_buffer_binding           FLAG_BIT_0
+#define _BIND_FLAG2_BIT_gl_copy_write_buffer_binding          FLAG_BIT_1
+#define _BIND_FLAG2_BIT_gl_pixel_pack_buffer_binding          FLAG_BIT_2
+#define _BIND_FLAG2_BIT_gl_pixel_unpack_buffer_binding        FLAG_BIT_3
+#define _BIND_FLAG2_BIT_gl_transform_feedback_buffer_binding  FLAG_BIT_4
+#define _BIND_FLAG2_BIT_gl_uniform_buffer_binding             FLAG_BIT_5
 
        unsigned char           _enable_flag1;
 #define _ENABLE_FLAG1_BIT_gl_blend        FLAG_BIT_0
index 90ed838..937e6a2 100644 (file)
@@ -517,6 +517,10 @@ _remove_context_ref(GLGlueContext *gctx, Mutex *ctx_list_mtx)
                        remove_from_general_trace_list(&glue_ctx_trace_list, gctx);
 #endif // COREGL_FASTPATH_TRACE_CONTEXT_INFO
 
+               AST(gctx->cstate != NULL);
+               if (gctx->cstate->data == gctx)
+                       gctx->cstate->data = NULL;
+
                _unlink_context_state(gctx, ctx_list_mtx);
 
                AST(gctx->ostate.shared != NULL);
@@ -1199,8 +1203,15 @@ fastpath_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLCon
                        goto finish;
                }
 
+               if (tstate->cstate != NULL && tstate->cstate->data != NULL)
+                       _remove_context_ref((GLGlueContext *)tstate->cstate->data, &ctx_list_access_mutex);
+
+               AST(tstate->cstate != gctx->cstate);
                tstate->cstate = gctx->cstate;
 
+               if (tstate->cstate->data != NULL)
+                       _add_context_ref((GLGlueContext *)tstate->cstate->data);
+
                tstate->rsurf_draw = draw;
                tstate->rsurf_read = read;
        }
index 16b7d0a..774214b 100644 (file)
@@ -838,28 +838,28 @@ fastpath_glBindBuffer(GLenum target, GLuint buffer)
        switch (target)
        {
                case GL_ARRAY_BUFFER:
-                       STATE_PROC(gl_array_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC(gl_array_buffer_binding, _bind_flag1, _BIND_FLAG1_BIT);
                        break;
                case GL_COPY_READ_BUFFER:
-                       STATE_PROC_WITH_CHECK(gl_copy_read_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC_WITH_CHECK(gl_copy_read_buffer_binding, _bind_flag2, _BIND_FLAG2_BIT);
                        break;
                case GL_COPY_WRITE_BUFFER:
-                       STATE_PROC_WITH_CHECK(gl_copy_write_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC_WITH_CHECK(gl_copy_write_buffer_binding, _bind_flag2, _BIND_FLAG2_BIT);
                        break;
                case GL_ELEMENT_ARRAY_BUFFER:
-                       STATE_PROC(gl_element_array_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC(gl_element_array_buffer_binding, _bind_flag1, _BIND_FLAG1_BIT);
                        break;
                case GL_PIXEL_PACK_BUFFER:
-                       STATE_PROC_WITH_CHECK(gl_pixel_pack_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC_WITH_CHECK(gl_pixel_pack_buffer_binding, _bind_flag2, _BIND_FLAG2_BIT);
                        break;
                case GL_PIXEL_UNPACK_BUFFER:
-                       STATE_PROC_WITH_CHECK(gl_pixel_unpack_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC_WITH_CHECK(gl_pixel_unpack_buffer_binding, _bind_flag2, _BIND_FLAG2_BIT);
                        break;
                case GL_TRANSFORM_FEEDBACK_BUFFER:
-                       STATE_PROC_WITH_CHECK(gl_transform_feedback_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC_WITH_CHECK(gl_transform_feedback_buffer_binding, _bind_flag2, _BIND_FLAG2_BIT);
                        break;
                case GL_UNIFORM_BUFFER:
-                       STATE_PROC_WITH_CHECK(gl_uniform_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC_WITH_CHECK(gl_uniform_buffer_binding, _bind_flag2, _BIND_FLAG2_BIT);
                        break;
                default:
                        _set_gl_error(GL_INVALID_ENUM);
@@ -951,42 +951,42 @@ fastpath_glDeleteBuffers(GLsizei n, const GLuint* buffers)
 
                                        if (cur_gctx->gl_array_buffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_array_buffer_binding);
+                                               cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_array_buffer_binding);
                                                cur_gctx->gl_array_buffer_binding[0] = 0;
                                        }
                                        if (cur_gctx->gl_copy_read_buffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_copy_read_buffer_binding);
+                                               cur_gctx->_bind_flag2 &= (~_BIND_FLAG2_BIT_gl_copy_read_buffer_binding);
                                                cur_gctx->gl_copy_read_buffer_binding[0] = 0;
                                        }
                                        if (cur_gctx->gl_copy_write_buffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_copy_write_buffer_binding);
+                                               cur_gctx->_bind_flag2 &= (~_BIND_FLAG2_BIT_gl_copy_write_buffer_binding);
                                                cur_gctx->gl_copy_write_buffer_binding[0] = 0;
                                        }
                                        if (cur_gctx->gl_element_array_buffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_element_array_buffer_binding);
+                                               cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_element_array_buffer_binding);
                                                cur_gctx->gl_element_array_buffer_binding[0] = 0;
                                        }
                                        if (cur_gctx->gl_pixel_pack_buffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_pixel_pack_buffer_binding);
+                                               cur_gctx->_bind_flag2 &= (~_BIND_FLAG2_BIT_gl_pixel_pack_buffer_binding);
                                                cur_gctx->gl_pixel_pack_buffer_binding[0] = 0;
                                        }
                                        if (cur_gctx->gl_pixel_unpack_buffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_pixel_unpack_buffer_binding);
+                                               cur_gctx->_bind_flag2 &= (~_BIND_FLAG2_BIT_gl_pixel_unpack_buffer_binding);
                                                cur_gctx->gl_pixel_unpack_buffer_binding[0] = 0;
                                        }
                                        if (cur_gctx->gl_transform_feedback_buffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_transform_feedback_buffer_binding);
+                                               cur_gctx->_bind_flag2 &= (~_BIND_FLAG2_BIT_gl_transform_feedback_buffer_binding);
                                                cur_gctx->gl_transform_feedback_buffer_binding[0] = 0;
                                        }
                                        if (cur_gctx->gl_uniform_buffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_uniform_buffer_binding);
+                                               cur_gctx->_bind_flag2 &= (~_BIND_FLAG2_BIT_gl_uniform_buffer_binding);
                                                cur_gctx->gl_uniform_buffer_binding[0] = 0;
                                        }
 
@@ -1075,9 +1075,9 @@ fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
                                IF_GL_SUCCESS(_orig_fastpath_glBindFramebuffer(target, real_obj))
                                {
                                        if (real_obj == 0)
-                                               current_ctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_framebuffer_binding_read);
+                                               current_ctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding_read);
                                        else
-                                               current_ctx->_bind_flag |= _BIND_FLAG_BIT_gl_framebuffer_binding_read;
+                                               current_ctx->_bind_flag1 |= _BIND_FLAG1_BIT_gl_framebuffer_binding_read;
                                        current_ctx->gl_framebuffer_binding_read[0] = real_obj;
                                }
                        }
@@ -1086,9 +1086,9 @@ fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
                                IF_GL_SUCCESS(_orig_fastpath_glBindFramebuffer(target, real_obj))
                                {
                                        if (real_obj == 0)
-                                               current_ctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_framebuffer_binding_draw);
+                                               current_ctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding_draw);
                                        else
-                                               current_ctx->_bind_flag |= _BIND_FLAG_BIT_gl_framebuffer_binding_draw;
+                                               current_ctx->_bind_flag1 |= _BIND_FLAG1_BIT_gl_framebuffer_binding_draw;
                                        current_ctx->gl_framebuffer_binding_draw[0] = real_obj;
                                }
                        }
@@ -1100,9 +1100,9 @@ fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
                                IF_GL_SUCCESS(_orig_fastpath_glBindFramebuffer(target, real_obj))
                                {
                                        if (real_obj == 0)
-                                               current_ctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_framebuffer_binding);
+                                               current_ctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding);
                                        else
-                                               current_ctx->_bind_flag |= _BIND_FLAG_BIT_gl_framebuffer_binding;
+                                               current_ctx->_bind_flag1 |= _BIND_FLAG1_BIT_gl_framebuffer_binding;
                                        current_ctx->gl_framebuffer_binding[0] = real_obj;
                                }
                        }
@@ -1115,9 +1115,9 @@ fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
                        IF_GL_SUCCESS(_orig_fastpath_glBindFramebuffer(target, real_obj))
                        {
                                if (real_obj == 0)
-                                       current_ctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_framebuffer_binding_read);
+                                       current_ctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding_read);
                                else
-                                       current_ctx->_bind_flag |= _BIND_FLAG_BIT_gl_framebuffer_binding_read;
+                                       current_ctx->_bind_flag1 |= _BIND_FLAG1_BIT_gl_framebuffer_binding_read;
                                current_ctx->gl_framebuffer_binding_read[0] = real_obj;
                        }
                }
@@ -1129,9 +1129,9 @@ fastpath_glBindFramebuffer(GLenum target, GLuint framebuffer)
                        IF_GL_SUCCESS(_orig_fastpath_glBindFramebuffer(target, real_obj))
                        {
                                if (real_obj == 0)
-                                       current_ctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_framebuffer_binding_draw);
+                                       current_ctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding_draw);
                                else
-                                       current_ctx->_bind_flag |= _BIND_FLAG_BIT_gl_framebuffer_binding_draw;
+                                       current_ctx->_bind_flag1 |= _BIND_FLAG1_BIT_gl_framebuffer_binding_draw;
                                current_ctx->gl_framebuffer_binding_draw[0] = real_obj;
                        }
                }
@@ -1223,17 +1223,17 @@ fastpath_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
 
                                        if (cur_gctx->gl_framebuffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_framebuffer_binding);
+                                               cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding);
                                                cur_gctx->gl_framebuffer_binding[0] = 0;
                                        }
                                        if (cur_gctx->gl_framebuffer_binding_read[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_framebuffer_binding_read);
+                                               cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding_read);
                                                cur_gctx->gl_framebuffer_binding_read[0] = 0;
                                        }
                                        if (cur_gctx->gl_framebuffer_binding_draw[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_framebuffer_binding_draw);
+                                               cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_framebuffer_binding_draw);
                                                cur_gctx->gl_framebuffer_binding_draw[0] = 0;
                                        }
 
@@ -1320,9 +1320,9 @@ fastpath_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
                        IF_GL_SUCCESS(_orig_fastpath_glBindRenderbuffer(target, real_obj))
                        {
                                if (real_obj == 0)
-                                       current_ctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_renderbuffer_binding);
+                                       current_ctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_renderbuffer_binding);
                                else
-                                       current_ctx->_bind_flag |= _BIND_FLAG_BIT_gl_renderbuffer_binding;
+                                       current_ctx->_bind_flag1 |= _BIND_FLAG1_BIT_gl_renderbuffer_binding;
                                current_ctx->gl_renderbuffer_binding[0] = real_obj;
                        }
                }
@@ -1439,7 +1439,7 @@ fastpath_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
 
                                        if (cur_gctx->gl_renderbuffer_binding[0] == objid_array[i])
                                        {
-                                               cur_gctx->_bind_flag &= (~_BIND_FLAG_BIT_gl_renderbuffer_binding);
+                                               cur_gctx->_bind_flag1 &= (~_BIND_FLAG1_BIT_gl_renderbuffer_binding);
                                                cur_gctx->gl_renderbuffer_binding[0] = 0;
                                        }
 
@@ -5026,10 +5026,10 @@ fastpath_glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
        switch (target)
        {
                case GL_TRANSFORM_FEEDBACK_BUFFER:
-                       STATE_PROC(gl_transform_feedback_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC(gl_transform_feedback_buffer_binding, _bind_flag2, _BIND_FLAG2_BIT);
                        break;
                case GL_UNIFORM_BUFFER:
-                       STATE_PROC(gl_uniform_buffer_binding, _bind_flag, _BIND_FLAG_BIT);
+                       STATE_PROC(gl_uniform_buffer_binding, _bind_flag2, _BIND_FLAG2_BIT);
                        break;
                default:
                        _set_gl_error(GL_INVALID_ENUM);
@@ -5068,7 +5068,7 @@ fastpath_glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr
                { \
                        IF_GL_SUCCESS(_orig_fastpath_glBindBufferRange(target, index, real_obj, offset, size)) \
                        { \
-                               current_ctx->_bind_flag |= _BIND_FLAG_BIT_##gl_state; \
+                               current_ctx->_bind_flag2 |= _BIND_FLAG2_BIT_##gl_state; \
                                current_ctx->gl_state##_array[index] = real_obj; \
                                current_ctx->gl_state##_array_offset[index] = offset; \
                                current_ctx->gl_state##_array_size[index] = size; \