summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrice Mandin <patmandin@gmail.com>2009-07-26 22:30:35 +0200
committerPatrice Mandin <patmandin@gmail.com>2009-07-26 22:30:35 +0200
commit8df35b7b57ff12721556fa7d00b4e337134da374 (patch)
tree8ecf6239109cb97a6b6324fdbf6797af552f39f0
parent2b8a8f75f33931622a46287a2bf633879f23285e (diff)
nouveau: only swizzle square textures for copy
-rw-r--r--src/gallium/drivers/nv04/nv04_surface_2d.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/gallium/drivers/nv04/nv04_surface_2d.c b/src/gallium/drivers/nv04/nv04_surface_2d.c
index ff4e51178d..aba40cfaff 100644
--- a/src/gallium/drivers/nv04/nv04_surface_2d.c
+++ b/src/gallium/drivers/nv04/nv04_surface_2d.c
@@ -263,10 +263,17 @@ nv04_surface_copy(struct nv04_surface_2d *ctx, struct pipe_surface *dst,
int potHeight = 1<<log2i(h);
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);
+ int squareDim = (potWidth>potHeight ? potHeight : potWidth);
+ int x,y;
+
+ /* top left is always POT, but we can only swizzle squares */
+ for (y=0; y<potHeight; y+=squareDim) {
+ for (x=0; x<potWidth; x+= squareDim) {
+ nv04_surface_copy_swizzle(ctx, dst, dx+x, dy+y,
+ src, sx+x, sy+y,
+ squareDim, squareDim);
+ }
+ }
/* top right */
if (remainWidth>0) {