From 206fbd9640f076ada23368edf158b6d40f673ba7 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 21 Oct 2010 13:20:14 +1000 Subject: 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 file changed, 13 insertions(+), 5 deletions(-) (limited to 'src/gallium/drivers') diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c index 95906a74eb..b9348baf0d 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; -- cgit v1.2.3