This fixes a somewhat indeterministic corruption problem on nv17 when
there is stuff going on the other fifos (e.g. gallium but I've also
reproduced it with an app just SIFM-ing memory around): in some cases
it made the blits the X server had scheduled use the wrong pitch.

Signed-off-by: Francisco Jerez <[email protected]>
---
 src/nv04_exa.c |   22 ++++++++++++----------
 1 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/nv04_exa.c b/src/nv04_exa.c
index 132c9d5..7384cbc 100644
--- a/src/nv04_exa.c
+++ b/src/nv04_exa.c
@@ -197,16 +197,9 @@ NV04EXAPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr 
pDstPixmap, int dx, int dy,
                return FALSE;
 
        planemask |= ~0 << pDstPixmap->drawable.bitsPerPixel;
-       if (planemask != ~0 || alu != GXcopy) {
-               if (pDstPixmap->drawable.bitsPerPixel == 32)
-                       return FALSE;
-               BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_OPERATION, 1);
-               OUT_RING  (chan, 1); /* ROP_AND */
-               NV04EXASetROP(pScrn, alu, planemask);
-       } else {
-               BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_OPERATION, 1);
-               OUT_RING  (chan, 3); /* SRCCOPY */
-       }
+       if ((planemask != ~0 || alu != GXcopy)
+           && pDstPixmap->drawable.bitsPerPixel == 32)
+               return FALSE;
 
        if (!NVAccelGetCtxSurf2DFormatFromPixmap(pDstPixmap, &fmt))
                return FALSE;
@@ -218,6 +211,15 @@ NV04EXAPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr 
pDstPixmap, int dx, int dy,
        OUT_RELOCl(chan, src_bo, src_delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD);
        OUT_RELOCl(chan, dst_bo, dst_delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
 
+       if (planemask != ~0 || alu != GXcopy) {
+               BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_OPERATION, 1);
+               OUT_RING  (chan, 1); /* ROP_AND */
+               NV04EXASetROP(pScrn, alu, planemask);
+       } else {
+               BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_OPERATION, 1);
+               OUT_RING  (chan, 3); /* SRCCOPY */
+       }
+
        pNv->pspix = pSrcPixmap;
        pNv->pdpix = pDstPixmap;
        pNv->alu = alu;
-- 
1.6.4.4

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to