From 77a8a650e61047582794512ef61c8e6525aea059 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Sun, 26 Jul 2009 12:30:12 +0200 Subject: [PATCH] nouveau: Recursively swizzle an NPOT sized copy --- src/gallium/drivers/nv04/nv04_surface_2d.c | 26 +++++++++++++++++----- 1 file 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 c0adf7ce85f..143b8589e8e 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<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; } -- 2.30.2