xf86-video-ati: Branch 'r6xx-r7xx-support'

Alex Deucher agd5f at kemper.freedesktop.org
Thu Feb 5 16:26:52 PST 2009


 src/r600_exa.c |   36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

New commits:
commit 3d17bd199423e92d201c20f047d5e699942af976
Author: Alex Deucher <alexdeucher at gmail.com>
Date:   Thu Feb 5 19:25:03 2009 -0500

    Revert "R6xx/R7xx EXA: improve overlapping copy performance"
    
    This reverts commit b24827c9d211e8a35da53b665385a7733d19910d.
    
    This seems to cause corruption in some cases.

diff --git a/src/r600_exa.c b/src/r600_exa.c
index cca82cb..80f8dd2 100644
--- a/src/r600_exa.c
+++ b/src/r600_exa.c
@@ -719,42 +719,66 @@ R600OverlapCopy(PixmapPtr pDst,
     uint32_t dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset;
     int i;
 
-    R600DoPrepareCopy(pScrn,
-		      dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
-		      dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
-		      accel_state->rop, accel_state->planemask);
-
     if (is_overlap(srcX, srcX + w, srcY, srcY + h,
 		   dstX, dstX + w, dstY, dstY + h)) {
 	if (srcY == dstY) { // left/right
 	    if (srcX < dstX) { // right
 		// copy right to left
 		for (i = w; i > 0; i--) {
+		    R600DoPrepareCopy(pScrn,
+				      dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+				      dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+				      accel_state->rop, accel_state->planemask);
+
 		    R600AppendCopyVertex(pScrn, srcX + i - 1, srcY, dstX + i - 1, dstY, 1, h);
+		    R600DoCopy(pScrn);
 		}
 	    } else { //left
 		// copy left to right
 		for (i = 0; i < w; i++) {
+		    R600DoPrepareCopy(pScrn,
+				      dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+				      dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+				      accel_state->rop, accel_state->planemask);
+
 		    R600AppendCopyVertex(pScrn, srcX + i, srcY, dstX + i, dstY, 1, h);
+		    R600DoCopy(pScrn);
 		}
 	    }
 	} else { //up/down
 	    if (srcY > dstY) { // up
 		// copy top to bottom
 		for (i = 0; i < h; i++) {
+		    R600DoPrepareCopy(pScrn,
+				      dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+				      dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+				      accel_state->rop, accel_state->planemask);
+
 		    R600AppendCopyVertex(pScrn, srcX, srcY + i, dstX, dstY + i, w, 1);
+		    R600DoCopy(pScrn);
 		}
 	    } else { // down
 		// copy bottom to top
 		for (i = h; i > 0; i--) {
+		    R600DoPrepareCopy(pScrn,
+				      dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+				      dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+				      accel_state->rop, accel_state->planemask);
+
 		    R600AppendCopyVertex(pScrn, srcX, srcY + i - 1, dstX, dstY + i - 1, w, 1);
+		    R600DoCopy(pScrn);
 		}
 	    }
 	}
     } else {
+	R600DoPrepareCopy(pScrn,
+			  dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+			  dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel,
+			  accel_state->rop, accel_state->planemask);
+
 	R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h);
+	R600DoCopy(pScrn);
     }
-    R600DoCopy(pScrn);
 }
 
 static void


More information about the xorg-commit mailing list