]> git.cworth.org Git - vogl/blobdiff - src/voglcommon/vogl_general_context_state.cpp
Merge branch 'master' of https://github.com/ValveSoftware/vogl
[vogl] / src / voglcommon / vogl_general_context_state.cpp
index ef3db73a4716964dee083e4cbf8c06ab360c7230..95ceaee2d1935a3bb470d048b7d2220923327ca2 100644 (file)
@@ -28,7 +28,7 @@
 #include "vogl_general_context_state.h"
 #include "vogl_console.h"
 
-#include "gl_pname_defs.inc"
+#include "gl_pname_defs.h"
 
 // TODO: Indexed versions of glGet's
 // TODO: Add GL4 types
@@ -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,28 @@ 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);
+
+    // Restore indexed blending state (we've already restored the global state, which sets all the indexed states)
+    for (uint i = 0; i < context_info.get_max_draw_buffers(); i++)
+    {
+        GLint enabled = 0;
+        if (get(GL_BLEND, i, &enabled, 1, true))
+        {
+            if (enabled)
+            {
+                GL_ENTRYPOINT(glEnablei)(GL_BLEND, i);
+                VOGL_CHECK_GL_ERROR;
+            }
+            else
+            {
+                GL_ENTRYPOINT(glDisablei)(GL_BLEND, i);
+                VOGL_CHECK_GL_ERROR;
+            }
+        }
+    }
+
     // 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 +2328,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;
 
@@ -2630,8 +2657,10 @@ bool vogl_polygon_stipple_state::snapshot(const vogl_context_info &context_info)
 
     clear();
 
-    GL_ENTRYPOINT(glGetPolygonStipple)(reinterpret_cast<GLubyte *>(m_pattern));
+    vogl_scoped_state_saver pixelstore_state_saver(cGSTPixelStore);
+    vogl_reset_pixel_store_states();
 
+    GL_ENTRYPOINT(glGetPolygonStipple)(m_pattern);
     VOGL_CHECK_GL_ERROR;
 
     m_valid = true;
@@ -2650,8 +2679,10 @@ bool vogl_polygon_stipple_state::restore(const vogl_context_info &context_info)
 
     VOGL_CHECK_GL_ERROR;
 
-    GL_ENTRYPOINT(glPolygonStipple)(reinterpret_cast<const GLubyte *>(m_pattern));
+    vogl_scoped_state_saver pixelstore_state_saver(cGSTPixelStore);
+    vogl_reset_pixel_store_states();
 
+    GL_ENTRYPOINT(glPolygonStipple)(m_pattern);
     VOGL_CHECK_GL_ERROR;
 
     return true;
@@ -2675,7 +2706,7 @@ bool vogl_polygon_stipple_state::serialize(json_node &node, vogl_blob_manager &b
         return false;
 
     json_node &arr_node = node.add_array("pattern");
-    for (uint i = 0; i < 32; i++)
+    for (uint i = 0; i < VOGL_ARRAY_SIZE(m_pattern); i++)
         arr_node.add_value(m_pattern[i]);
 
     return true;
@@ -2693,11 +2724,19 @@ bool vogl_polygon_stipple_state::deserialize(const json_node &node, const vogl_b
     if (!pArr_node)
         return false;
 
-    if ((pArr_node->size() != 32) || (!pArr_node->are_all_children_values()))
+    if (!pArr_node->are_all_children_values())
         return false;
 
-    for (uint i = 0; i < 32; i++)
-        m_pattern[i] = pArr_node->value_as_uint32(i);
+    // An earlier version wrote the wrong size, so ignore that data.
+    if (pArr_node->size() == VOGL_ARRAY_SIZE(m_pattern))
+    {
+        for (uint i = 0; i < VOGL_ARRAY_SIZE(m_pattern); i++)
+            m_pattern[i] = static_cast<uint8>(pArr_node->value_as_uint32(i));
+    }
+    else
+    {
+        vogl_warning_printf("%s: Polygon stipple data is not valid in this older trace file so it's being ignored - please recapture (sorry)\n", VOGL_METHOD_NAME);
+    }
 
     m_valid = true;
 
@@ -2709,8 +2748,9 @@ uint vogl_polygon_stipple_state::get_num_pattern_rows() const
     return 32;
 }
 
-uint32 vogl_polygon_stipple_state::get_pattern_row(uint rowIndex) const
+uint32 vogl_polygon_stipple_state::get_pattern_row(uint row_index) const
 {
-    VOGL_ASSERT(rowIndex < 32);
-    return m_pattern[rowIndex];
+    VOGL_ASSERT(row_index < 32);
+
+    return m_pattern[4 * row_index] | (m_pattern[4 * row_index + 1] << 8U) | (m_pattern[4 * row_index + 2] << 16U) | (m_pattern[4 * row_index + 3] << 24U);
 }