nouveau: Take into account destination position for copy_swizzle, need to split copy...
authorPatrice Mandin <patmandin@gmail.com>
Sun, 26 Jul 2009 14:18:06 +0000 (16:18 +0200)
committerPatrice Mandin <patmandin@gmail.com>
Sun, 26 Jul 2009 14:18:06 +0000 (16:18 +0200)
src/gallium/drivers/nv04/nv04_surface_2d.c

index 143b8589e8eab4738fbe76d6c2566f1ee51c4207..ff4e51178dc8a6ab43713595c45ce7d532fdb071 100644 (file)
@@ -133,7 +133,7 @@ nv04_surface_copy_swizzle(struct nv04_surface_2d *ctx,
        for (cy = 0; cy < h; cy += sub_h) {
          for (cx = 0; cx < w; cx += sub_w) {
            BEGIN_RING(chan, swzsurf, NV04_SWIZZLED_SURFACE_OFFSET, 1);
-           OUT_RELOCl(chan, dst_bo, dst->offset + nv04_swizzle_bits(cx, cy) *
+           OUT_RELOCl(chan, dst_bo, dst->offset + nv04_swizzle_bits(cx+dx, cy+dy) *
                             dst->texture->block.size, NOUVEAU_BO_GART |
                             NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
 
@@ -264,19 +264,29 @@ nv04_surface_copy(struct nv04_surface_2d *ctx, struct pipe_surface *dst,
                int remainWidth = w-potWidth;
                int remainHeight = h-potHeight;
 
+               /* top left is always POT */
                nv04_surface_copy_swizzle(ctx, dst, dx, dy, src, sx, sy,
                                          potWidth, potHeight);
 
+               /* top right */
                if (remainWidth>0) {
                        nv04_surface_copy(ctx, dst, dx+potWidth, dy,
                                          src, sx+potWidth, sy,
                                          remainWidth, potHeight);
                }
 
+               /* bottom left */
                if (remainHeight>0) {
                        nv04_surface_copy(ctx, dst, dx, dy+potHeight,
                                          src, sx, sy+potHeight,
-                                         w, remainHeight);
+                                         potWidth, remainHeight);
+               }
+
+               /* bottom right */
+               if ((remainWidth>0) && (remainHeight>0)) {
+                       nv04_surface_copy(ctx, dst, dx+potWidth, dy+potHeight,
+                                         src, sx+potWidth, sy+potHeight,
+                                         remainWidth, remainHeight);
                }
 
                return;