st/mesa: fix Y inversion and optimize st_BlitFramebuffer()
authorBrian Paul <brianp@vmware.com>
Wed, 5 Aug 2009 19:26:19 +0000 (13:26 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 5 Aug 2009 19:26:19 +0000 (13:26 -0600)
Need to check for Y inversion separately for src/dest buffers.

If both the src and dest regions are upside down, make them right-side
up for a better chance at a fast path.

progs/tests/copypixrate -blit is much faster now.

src/mesa/state_tracker/st_cb_blit.c

index 2852623..9861047 100644 (file)
@@ -75,6 +75,11 @@ st_BlitFramebuffer(GLcontext *ctx,
                          ? PIPE_TEX_MIPFILTER_NEAREST
                          : PIPE_TEX_MIPFILTER_LINEAR);
 
+   if (!_mesa_clip_blit(ctx, &srcX0, &srcY0, &srcX1, &srcY1,
+                        &dstX0, &dstY0, &dstX1, &dstY1)) {
+      return; /* nothing to draw/blit */
+   }
+
    if (mask & GL_COLOR_BUFFER_BIT) {
       struct st_renderbuffer *srcRb = 
          st_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer);
@@ -84,12 +89,29 @@ st_BlitFramebuffer(GLcontext *ctx,
       struct pipe_surface *dstSurf = dstRb->surface;
 
       if (st_fb_orientation(ctx->DrawBuffer) == Y_0_TOP) {
-         /* invert Y */
+         /* invert Y for dest */
+         dstY0 = dstRb->Base.Height - dstY0;
+         dstY1 = dstRb->Base.Height - dstY1;
+      }
+
+      if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {
+         /* invert Y for src */
          srcY0 = srcRb->Base.Height - srcY0;
          srcY1 = srcRb->Base.Height - srcY1;
+      }
 
-         dstY0 = dstRb->Base.Height - dstY0;
-         dstY1 = dstRb->Base.Height - dstY1;
+      if (srcY0 > srcY1 && dstY0 > dstY1) {
+         /* Both src and dst are upside down.  Swap Y to make it
+          * right-side up to increase odds of using a fast path.
+          * Recall that all Gallium raster coords have Y=0=top.
+          */
+         GLint tmp;
+         tmp = srcY0;
+         srcY0 = srcY1;
+         srcY1 = tmp;
+         tmp = dstY0;
+         dstY0 = dstY1;
+         dstY1 = tmp;
       }
 
       util_blit_pixels(st->blit,