Mesa (master): r600g: all non-0 mipmap levels need to be w/h aligned to POT .

Dave Airlie airlied at kemper.freedesktop.org
Thu Oct 21 03:42:33 UTC 2010


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Oct 21 13:20:14 2010 +1000

r600g: all non-0 mipmap levels need to be w/h aligned to POT.

this adds a new minify function to the driver to ensure this.

---

 src/gallium/drivers/r600/r600_texture.c |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
index 95906a7..b9348ba 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -92,6 +92,15 @@ static unsigned r600_texture_get_offset(struct r600_resource_texture *rtex,
 	}
 }
 
+static unsigned mip_minify(unsigned size, unsigned level)
+{
+	unsigned val;
+	val = u_minify(size, level);
+	if (level > 0)
+		val = util_next_power_of_two(val);
+	return val;
+}
+
 static unsigned r600_texture_get_stride(struct pipe_screen *screen,
 					struct r600_resource_texture *rtex,
 					unsigned level)
@@ -104,7 +113,7 @@ static unsigned r600_texture_get_stride(struct pipe_screen *screen,
 	if (rtex->pitch_override)
 		return rtex->pitch_override;
 
-	width = u_minify(ptex->width0, level);
+	width = mip_minify(ptex->width0, level);
 
 	stride = util_format_get_stride(ptex->format, align(width, 64));
 	if (chipc == EVERGREEN)
@@ -121,8 +130,7 @@ static unsigned r600_texture_get_nblocksy(struct pipe_screen *screen,
 	struct pipe_resource *ptex = &rtex->resource.base.b;
 	unsigned height;
 
-	height = u_minify(ptex->height0, level);
-	height = util_next_power_of_two(height);
+	height = mip_minify(ptex->height0, level);
 	return util_format_get_nblocksy(ptex->format, height);
 }
 
@@ -249,8 +257,8 @@ static struct pipe_surface *r600_get_tex_surface(struct pipe_screen *screen,
 	pipe_reference_init(&surface->reference, 1);
 	pipe_resource_reference(&surface->texture, texture);
 	surface->format = texture->format;
-	surface->width = u_minify(texture->width0, level);
-	surface->height = u_minify(texture->height0, level);
+	surface->width = mip_minify(texture->width0, level);
+	surface->height = mip_minify(texture->height0, level);
 	surface->offset = offset;
 	surface->usage = flags;
 	surface->zslice = zslice;




More information about the mesa-commit mailing list