r600g: fix copying between NPOT mipmapped compressed textures
authorMarek Olšák <maraeo@gmail.com>
Thu, 16 Aug 2012 17:05:22 +0000 (19:05 +0200)
committerMarek Olšák <maraeo@gmail.com>
Thu, 16 Aug 2012 18:44:54 +0000 (20:44 +0200)
We aligned the dimensions to the blocksize, then divided by it
(in r600_blit.c), then minified, which was wrong.

The minification must be done first, not last.
This fixes piglit/fbo-generatemipmap-formats with S3TC and maybe
a bunch of other tests too. Tested on RV730.

src/gallium/drivers/r600/r600_texture.c

index ac49038c471980db73239bb814243371d6e137cd..c1499e66331b1a3c9971ec964e4be10066871939 100644 (file)
@@ -340,6 +340,7 @@ static struct pipe_surface *r600_create_surface(struct pipe_context *pipe,
                                                struct pipe_resource *texture,
                                                const struct pipe_surface *templ)
 {
+       struct r600_texture *rtex = (struct r600_texture*)texture;
        struct r600_surface *surface = CALLOC_STRUCT(r600_surface);
        unsigned level = templ->u.tex.level;
 
@@ -350,8 +351,8 @@ static struct pipe_surface *r600_create_surface(struct pipe_context *pipe,
        pipe_resource_reference(&surface->base.texture, texture);
        surface->base.context = pipe;
        surface->base.format = templ->format;
-       surface->base.width = u_minify(texture->width0, level);
-       surface->base.height = u_minify(texture->height0, level);
+       surface->base.width = rtex->surface.level[level].npix_x;
+       surface->base.height = rtex->surface.level[level].npix_y;
        surface->base.usage = templ->usage;
        surface->base.u = templ->u;
        return &surface->base;