i965/blorp: Fixup scissoring of blits to window system buffers.
authorPaul Berry <stereotype441@gmail.com>
Sat, 14 Jul 2012 01:30:55 +0000 (18:30 -0700)
committerPaul Berry <stereotype441@gmail.com>
Tue, 24 Jul 2012 21:52:57 +0000 (14:52 -0700)
This patch modifies the order of operations in the blorp engine so
that clipping and scissoring are performed before adjusting the
coordinates to account for the difference in origin convention between
window system buffers and framebuffer objects.  Previously, we would
do clipping and scissoring after adjusting for origin conventions, so
we would get scissoring wrong in window system buffers.

Fixes Piglit test "fbo-scissor-blit window".

Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/i965/brw_blorp_blit.cpp

index eb7935969dae481815ad5cc1daf0a3c7f4f59db8..038489fffbd973005069ff7f845ce78e3c3c7ce7 100644 (file)
@@ -171,18 +171,6 @@ try_blorp_blit(struct intel_context *intel,
    if (src_mt->format != dst_mt->format)
       return false;
 
-   /* Account for the fact that in the system framebuffer, the origin is at
-    * the lower left.
-    */
-   if (read_fb->Name == 0) {
-      srcY0 = read_fb->Height - srcY0;
-      srcY1 = read_fb->Height - srcY1;
-   }
-   if (draw_fb->Name == 0) {
-      dstY0 = draw_fb->Height - dstY0;
-      dstY1 = draw_fb->Height - dstY1;
-   }
-
    /* Detect if the blit needs to be mirrored */
    bool mirror_x = false, mirror_y = false;
    fixup_mirroring(mirror_x, srcX0, srcX1);
@@ -213,6 +201,22 @@ try_blorp_blit(struct intel_context *intel,
       return true;
    }
 
+   /* Account for the fact that in the system framebuffer, the origin is at
+    * the lower left.
+    */
+   if (read_fb->Name == 0) {
+      GLint tmp = read_fb->Height - srcY0;
+      srcY0 = read_fb->Height - srcY1;
+      srcY1 = tmp;
+      mirror_y = !mirror_y;
+   }
+   if (draw_fb->Name == 0) {
+      GLint tmp = draw_fb->Height - dstY0;
+      dstY0 = draw_fb->Height - dstY1;
+      dstY1 = tmp;
+      mirror_y = !mirror_y;
+   }
+
    /* Get ready to blit.  This includes depth resolving the src and dst
     * buffers if necessary.
     */