Mesa (master): nouveau: Recursively swizzle an NPOT sized copy

Patrice Mandin pmandin at kemper.freedesktop.org
Sun Jul 26 03:31:08 PDT 2009


Module: Mesa
Branch: master
Commit: 77a8a650e61047582794512ef61c8e6525aea059
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=77a8a650e61047582794512ef61c8e6525aea059

Author: Patrice Mandin <patmandin at gmail.com>
Date:   Sun Jul 26 12:30:12 2009 +0200

nouveau: Recursively swizzle an NPOT sized copy

---

 src/gallium/drivers/nv04/nv04_surface_2d.c |   26 +++++++++++++++++++++-----
 1 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/nv04/nv04_surface_2d.c b/src/gallium/drivers/nv04/nv04_surface_2d.c
index c0adf7c..143b858 100644
--- a/src/gallium/drivers/nv04/nv04_surface_2d.c
+++ b/src/gallium/drivers/nv04/nv04_surface_2d.c
@@ -111,8 +111,6 @@ nv04_surface_copy_swizzle(struct nv04_surface_2d *ctx,
 	unsigned cy;
 
 #if 0
-	/* POT or GTFO */
-	assert(!(w & (w - 1)) && !(h & (h - 1)));
 	/* That's the way she likes it */
 	assert(src_pitch == ((struct nv04_surface *)dst)->pitch);
 #endif
@@ -260,9 +258,27 @@ nv04_surface_copy(struct nv04_surface_2d *ctx, struct pipe_surface *dst,
 	assert(src->format == dst->format);
 
 	/* Setup transfer to swizzle the texture to vram if needed */
-	if (src_linear && !dst_linear && w > 1 && h > 1 &&
-	    !(w & (w - 1)) && !(h & (h - 1))) { /* POT only */
-		nv04_surface_copy_swizzle(ctx, dst, dx, dy, src, sx, sy, w, h);
+	if (src_linear && !dst_linear && w > 1 && h > 1) {
+		int potWidth = 1<<log2i(w);
+		int potHeight = 1<<log2i(h);
+		int remainWidth = w-potWidth;
+		int remainHeight = h-potHeight;
+
+		nv04_surface_copy_swizzle(ctx, dst, dx, dy, src, sx, sy,
+		                          potWidth, potHeight);
+
+		if (remainWidth>0) {
+			nv04_surface_copy(ctx, dst, dx+potWidth, dy,
+			                  src, sx+potWidth, sy,
+			                  remainWidth, potHeight);
+		}
+
+		if (remainHeight>0) {
+			nv04_surface_copy(ctx, dst, dx, dy+potHeight,
+			                  src, sx, sy+potHeight,
+			                  w, remainHeight);
+		}
+
 		return;
 	}
 



More information about the mesa-commit mailing list