From 1d5fc3febf3470b94c423a1eda5e0683856909df Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Fri, 6 Feb 2009 14:43:30 -0500 Subject: Revert "r6xx/r7xx EXA: Optimize overlapping copy" This reverts commit 0dfadc1843e0d14b9cc1ee19a72f4fd60a2c495b. This doesn't always work properly. --- src/r600_exa.c | 80 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/src/r600_exa.c b/src/r600_exa.c index 88a9d913..155f9135 100644 --- a/src/r600_exa.c +++ b/src/r600_exa.c @@ -717,37 +717,59 @@ R600OverlapCopy(PixmapPtr pDst, struct radeon_accel_state *accel_state = info->accel_state; uint32_t dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); uint32_t dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; - int i, chunk; + int i; if (is_overlap(srcX, srcX + w, srcY, srcY + h, - dstX, dstX + w, dstY, dstY + h) && (srcY != dstY)) { - if (srcY > dstY) { // up - // copy top to bottom - chunk = srcY - dstY; - for (i = 0; i < h; i += chunk) { - if (chunk > h - i) chunk = 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, chunk); - R600DoCopy(pScrn); - } - } else { // down - // copy bottom to top - chunk = dstY - srcY; - for (i = h; i > 0; i -= chunk) { - if (chunk > i) chunk = 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 - chunk, dstX, dstY + i - chunk, w, chunk); - R600DoCopy(pScrn); - } - } + 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, -- cgit v1.2.3