]> git.cworth.org Git - vogl/blobdiff - src/voglcommon/vogl_general_context_state.cpp
- fixing restoring of transform feedback and uniform buffer bindings when indexed...
[vogl] / src / voglcommon / vogl_general_context_state.cpp
index 94a71891d919d5790602bc04e8437133d7163024..c47a298515247882807bce32bef2bbd76c24e51f 100644 (file)
@@ -333,10 +333,13 @@ bool vogl_general_context_state::restore_buffer_binding(GLenum binding_enum, GLe
     VOGL_FUNC_TRACER
 
     uint buffer = 0;
-    if (get(binding_enum, 0, &buffer))
+    if (get(binding_enum, 0, &buffer, 1, false))
     {
         buffer = static_cast<uint>(remapper.remap_handle(VOGL_NAMESPACE_BUFFERS, buffer));
 
+        GL_ENTRYPOINT(glBindBuffer)(set_enum, 0);
+        VOGL_CHECK_GL_ERROR;
+
         GL_ENTRYPOINT(glBindBuffer)(set_enum, buffer);
         VOGL_CHECK_GL_ERROR;
 
@@ -355,9 +358,9 @@ bool vogl_general_context_state::restore_buffer_binding_range(GLenum binding_enu
 
     uint64_t start, size = 0;
     uint buffer = 0;
-    if (get(binding_enum, index, &buffer, indexed_variant) &&
-        get(start_enum, index, &start, indexed_variant) &&
-        get(size_enum, index, &size, indexed_variant))
+    if (get(binding_enum, index, &buffer, 1, indexed_variant) &&
+        get(start_enum, index, &start, 1, indexed_variant) &&
+        get(size_enum, index, &size, 1, indexed_variant))
     {
         if (buffer)
         {
@@ -1836,8 +1839,6 @@ bool vogl_general_context_state::restore(const vogl_context_info &context_info,
     ADD_PROCESSED_STATE(GL_ELEMENT_ARRAY_BUFFER_BINDING, 0);
 
     // restore transform feedback targets
-    restore_buffer_binding(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, GL_TRANSFORM_FEEDBACK_BUFFER, remapper);
-    ADD_PROCESSED_STATE(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, 0);
     for (uint i = 0; i < context_info.get_max_transform_feedback_separate_attribs(); i++)
     {
         restore_buffer_binding_range(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, GL_TRANSFORM_FEEDBACK_BUFFER_START, GL_TRANSFORM_FEEDBACK_BUFFER_SIZE, GL_TRANSFORM_FEEDBACK_BUFFER, i, true, remapper);
@@ -1846,9 +1847,10 @@ bool vogl_general_context_state::restore(const vogl_context_info &context_info,
         ADD_PROCESSED_STATE_INDEXED_VARIANT(GL_TRANSFORM_FEEDBACK_BUFFER_SIZE, i);
     }
 
+    restore_buffer_binding(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, GL_TRANSFORM_FEEDBACK_BUFFER, remapper);
+    ADD_PROCESSED_STATE(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, 0);
+
     // restore uniform buffer binding target, and the indexed variants
-    restore_buffer_binding(GL_UNIFORM_BUFFER_BINDING, GL_UNIFORM_BUFFER, remapper);
-    ADD_PROCESSED_STATE(GL_UNIFORM_BUFFER_BINDING, 0);
     for (uint i = 0; i < context_info.get_max_uniform_buffer_bindings(); i++)
     {
         restore_buffer_binding_range(GL_UNIFORM_BUFFER_BINDING, GL_UNIFORM_BUFFER_START, GL_UNIFORM_BUFFER_SIZE, GL_UNIFORM_BUFFER, i, true, remapper);
@@ -1857,6 +1859,9 @@ bool vogl_general_context_state::restore(const vogl_context_info &context_info,
         ADD_PROCESSED_STATE_INDEXED_VARIANT(GL_UNIFORM_BUFFER_SIZE, i);
     }
 
+    restore_buffer_binding(GL_UNIFORM_BUFFER_BINDING, GL_UNIFORM_BUFFER, remapper);
+    ADD_PROCESSED_STATE(GL_UNIFORM_BUFFER_BINDING, 0);
+
     // TODO: these GL4 guys have indexed and offset/size variants
     restore_buffer_binding(GL_ATOMIC_COUNTER_BUFFER_BINDING, GL_ATOMIC_COUNTER_BUFFER, remapper);
     ADD_PROCESSED_STATE(GL_ATOMIC_COUNTER_BUFFER_BINDING, 0);
@@ -2304,6 +2309,9 @@ bool vogl_general_context_state::restore(const vogl_context_info &context_info,
 
     //----------------------------------------
 
+    GL_ENTRYPOINT(glBindBuffer)(GL_ARRAY_BUFFER, 0);
+    VOGL_CHECK_GL_ERROR;
+
     GL_ENTRYPOINT(glBindBuffer)(GL_ARRAY_BUFFER, prev_array_buffer_binding);
     VOGL_CHECK_GL_ERROR;