summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2012-11-20 18:33:33 +0000
committerNeil Roberts <neil@linux.intel.com>2012-11-20 18:33:33 +0000
commit0dca99ddf728c8d4e3003861a03e8a2beccf282d (patch)
tree3b56bd070a67830b99d4af55675bdc77a588fd37
parent0dea9aeb897faf029828379b120970477df3c7d5 (diff)
downloadcogl-0dca99ddf728c8d4e3003861a03e8a2beccf282d.tar.gz
Fix flushing the stencil viewport clipping workaround
There were two problems with the stencil viewport clip workaround introduced in afc5daab8: • When the viewport is changed the current clip state is not marked as dirty. That means that when the framebuffer state is next flushed it would continue to use the stencil from the previous viewport. • When the viewport is automatically updated due to the window being resized the viewport age was not incremented so the clip state wouldn't be flushed. I noticed the bugs by running cogl-sdl2-hello. This patch makes it so that the clip state is dirtied in cogl_framebuffer_set_viewport if the workaround is enabled. The automatic viewport changing code now just calls cogl_framebuffer_set_viewport instead of directly prodding the viewport values. This has the side-effect that it will also cause the journal to be flushed. This seems like the right thing to do anyway and presumably there would have been a bug before where it wouldn't have flushed the journal, although presumably this is extremely unlikely because it would have to have done a resize in the middle of painting the scene. Reviewed-by: Robert Bragg <robert@linux.intel.com>
-rw-r--r--cogl/cogl-framebuffer.c12
-rw-r--r--cogl/cogl-onscreen.c12
2 files changed, 10 insertions, 14 deletions
diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
index 49d43644..54b7797f 100644
--- a/cogl/cogl-framebuffer.c
+++ b/cogl/cogl-framebuffer.c
@@ -448,6 +448,8 @@ cogl_framebuffer_set_viewport (CoglFramebuffer *framebuffer,
float width,
float height)
{
+ CoglContext *context = framebuffer->context;
+
_COGL_RETURN_IF_FAIL (width > 0 && height > 0);
if (framebuffer->viewport_x == x &&
@@ -464,9 +466,13 @@ cogl_framebuffer_set_viewport (CoglFramebuffer *framebuffer,
framebuffer->viewport_height = height;
framebuffer->viewport_age++;
- if (framebuffer->context->current_draw_buffer == framebuffer)
- framebuffer->context->current_draw_buffer_changes |=
- COGL_FRAMEBUFFER_STATE_VIEWPORT;
+ if (context->current_draw_buffer == framebuffer)
+ {
+ context->current_draw_buffer_changes |= COGL_FRAMEBUFFER_STATE_VIEWPORT;
+
+ if (context->needs_viewport_scissor_workaround)
+ context->current_draw_buffer_changes |= COGL_FRAMEBUFFER_STATE_CLIP;
+ }
}
float
diff --git a/cogl/cogl-onscreen.c b/cogl/cogl-onscreen.c
index 4aaa5de4..3c1e148d 100644
--- a/cogl/cogl-onscreen.c
+++ b/cogl/cogl-onscreen.c
@@ -387,17 +387,7 @@ _cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer,
framebuffer->width = width;
framebuffer->height = height;
- framebuffer->viewport_x = 0;
- framebuffer->viewport_y = 0;
- framebuffer->viewport_width = width;
- framebuffer->viewport_height = height;
-
- /* If the framebuffer being updated is the current framebuffer we
- * mark the viewport state as changed so it will be updated the next
- * time _cogl_framebuffer_flush_state() is called. */
- if (framebuffer->context->current_draw_buffer == framebuffer)
- framebuffer->context->current_draw_buffer_changes |=
- COGL_FRAMEBUFFER_STATE_VIEWPORT;
+ cogl_framebuffer_set_viewport (framebuffer, 0, 0, width, height);
}
void