From: José Fonseca Date: Wed, 23 Jan 2013 16:15:40 +0000 (+0000) Subject: glretrace: Fix snapshots on GL 3.2 core contexts (issue #106). X-Git-Url: https://git.cworth.org/git?p=apitrace;a=commitdiff_plain;h=72351ecd47e6c68c01c1ee8bbe5085dda9260b10 glretrace: Fix snapshots on GL 3.2 core contexts (issue #106). glPush/PopClientAttrib() are not available in core contexts. Simply save/restore the state via glGet and pack API. --- diff --git a/retrace/glstate.cpp b/retrace/glstate.cpp index 0d5a5f3..e2c6978 100644 --- a/retrace/glstate.cpp +++ b/retrace/glstate.cpp @@ -66,29 +66,56 @@ Context::Context(void) { void Context::resetPixelPackState(void) { + // Start with default state + pack_alignment = 4; + pack_image_height = 0; + pack_lsb_first = GL_FALSE; + pack_row_length = 0; + pack_skip_images = 0; + pack_skip_pixels = 0; + pack_skip_rows = 0; + pack_swap_bytes = GL_FALSE; + pixel_pack_buffer_binding = 0; + + // Get current state + glGetIntegerv(GL_PACK_ALIGNMENT, &pack_alignment); if (!ES) { - glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); - glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); - glPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE); + glGetIntegerv(GL_PACK_IMAGE_HEIGHT, &pack_image_height); + glGetIntegerv(GL_PACK_LSB_FIRST, &pack_lsb_first); + glGetIntegerv(GL_PACK_ROW_LENGTH, &pack_row_length); + glGetIntegerv(GL_PACK_SKIP_IMAGES, &pack_skip_images); + glGetIntegerv(GL_PACK_SKIP_PIXELS, &pack_skip_pixels); + glGetIntegerv(GL_PACK_SKIP_ROWS, &pack_skip_rows); + glGetIntegerv(GL_PACK_SWAP_BYTES, &pack_swap_bytes); + glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &pixel_pack_buffer_binding); + } + + // Reset state for compact images + glPixelStorei(GL_PACK_ALIGNMENT, 1); + if (!ES) { + glPixelStorei(GL_PACK_IMAGE_HEIGHT, 0); glPixelStorei(GL_PACK_LSB_FIRST, GL_FALSE); glPixelStorei(GL_PACK_ROW_LENGTH, 0); - glPixelStorei(GL_PACK_IMAGE_HEIGHT, 0); - glPixelStorei(GL_PACK_SKIP_ROWS, 0); - glPixelStorei(GL_PACK_SKIP_PIXELS, 0); glPixelStorei(GL_PACK_SKIP_IMAGES, 0); - } else { - packAlignment = 4; - glGetIntegerv(GL_PACK_ALIGNMENT, &packAlignment); + glPixelStorei(GL_PACK_SKIP_PIXELS, 0); + glPixelStorei(GL_PACK_SKIP_ROWS, 0); + glPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE); + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); } - glPixelStorei(GL_PACK_ALIGNMENT, 1); } void Context::restorePixelPackState(void) { + glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment); if (!ES) { - glPopClientAttrib(); - } else { - glPixelStorei(GL_PACK_ALIGNMENT, packAlignment); + glPixelStorei(GL_PACK_IMAGE_HEIGHT, pack_image_height); + glPixelStorei(GL_PACK_LSB_FIRST, pack_lsb_first); + glPixelStorei(GL_PACK_ROW_LENGTH, pack_row_length); + glPixelStorei(GL_PACK_SKIP_IMAGES, pack_skip_images); + glPixelStorei(GL_PACK_SKIP_PIXELS, pack_skip_pixels); + glPixelStorei(GL_PACK_SKIP_ROWS, pack_skip_rows); + glPixelStorei(GL_PACK_SWAP_BYTES, pack_swap_bytes); + glBindBuffer(GL_PIXEL_PACK_BUFFER, pixel_pack_buffer_binding); } } diff --git a/retrace/glstate_internal.hpp b/retrace/glstate_internal.hpp index a709da3..6b74b1d 100644 --- a/retrace/glstate_internal.hpp +++ b/retrace/glstate_internal.hpp @@ -44,13 +44,23 @@ struct Context Context(void); - GLint packAlignment; - void resetPixelPackState(void); void restorePixelPackState(void); + +private: + // Pack state + GLint pack_alignment; + GLint pack_image_height; + GLint pack_lsb_first; + GLint pack_row_length; + GLint pack_skip_images; + GLint pack_skip_pixels; + GLint pack_skip_rows; + GLint pack_swap_bytes; + GLint pixel_pack_buffer_binding; };