#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
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);
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;
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;
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)
{
#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);
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);
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);
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);
//----------------------------------------
+ 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;
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;
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;
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;
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;
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);
}