X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=src%2Fvoglcommon%2Fvogl_general_context_state.cpp;h=95ceaee2d1935a3bb470d048b7d2220923327ca2;hb=ca705ac05c794d5e1eb7be54c1c613831591d7ce;hp=a6637daf3350dec7252d8f4f3f231bd80ecda3e5;hpb=efdbc27f2074c559c8bbd4c118c45fda53e7aa7a;p=vogl diff --git a/src/voglcommon/vogl_general_context_state.cpp b/src/voglcommon/vogl_general_context_state.cpp index a6637da..95ceaee 100644 --- a/src/voglcommon/vogl_general_context_state.cpp +++ b/src/voglcommon/vogl_general_context_state.cpp @@ -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 @@ -278,10 +278,13 @@ public: m_can_use_glGetPointerv = (GL_ENTRYPOINT(glGetPointerv) != NULL) && !context_info.is_core_profile(); m_max_texture_units = 0; - GL_ENTRYPOINT(glGetIntegerv)(GL_MAX_TEXTURE_UNITS, &m_max_texture_units); - m_max_texture_coords = 0; - GL_ENTRYPOINT(glGetIntegerv)(GL_MAX_TEXTURE_COORDS, &m_max_texture_coords); + + if (!context_info.is_core_profile()) + { + GL_ENTRYPOINT(glGetIntegerv)(GL_MAX_TEXTURE_UNITS, &m_max_texture_units); + GL_ENTRYPOINT(glGetIntegerv)(GL_MAX_TEXTURE_COORDS, &m_max_texture_coords); + } m_max_combined_texture_coords = 0; GL_ENTRYPOINT(glGetIntegerv)(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &m_max_combined_texture_coords); @@ -294,6 +297,8 @@ public: m_max_vertex_attribs = 0; GL_ENTRYPOINT(glGetIntegerv)(GL_MAX_VERTEX_ATTRIBS, &m_max_vertex_attribs); + + VOGL_CHECK_GL_ERROR; } bool m_can_use_glGetBooleani_v; @@ -328,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(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; @@ -350,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) { @@ -941,7 +949,10 @@ bool vogl_general_context_state::restore(const vogl_context_info &context_info, #endif GLint prev_client_active_texture = 0; - GL_ENTRYPOINT(glGetIntegerv)(GL_CLIENT_ACTIVE_TEXTURE, &prev_client_active_texture); + if (!context_info.is_core_profile()) + { + GL_ENTRYPOINT(glGetIntegerv)(GL_CLIENT_ACTIVE_TEXTURE, &prev_client_active_texture); + } GLint prev_active_texture = 0; GL_ENTRYPOINT(glGetIntegerv)(GL_ACTIVE_TEXTURE, &prev_active_texture); @@ -1828,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); @@ -1838,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); @@ -1849,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); @@ -2296,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; @@ -2622,8 +2657,10 @@ bool vogl_polygon_stipple_state::snapshot(const vogl_context_info &context_info) clear(); - GL_ENTRYPOINT(glGetPolygonStipple)(reinterpret_cast(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; @@ -2642,8 +2679,10 @@ bool vogl_polygon_stipple_state::restore(const vogl_context_info &context_info) VOGL_CHECK_GL_ERROR; - GL_ENTRYPOINT(glPolygonStipple)(reinterpret_cast(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; @@ -2667,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; @@ -2685,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(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; @@ -2701,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); }