gallium/radeon/gfx9: fix PBO texture uploads to compressed textures
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 6 Jun 2017 17:21:26 +0000 (19:21 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 19 Jun 2017 10:05:15 +0000 (12:05 +0200)
st/mesa creates a surface that reinterprets the compressed blocks as
RGBA16UI or RGBA32UI. We have to adjust width0 & height0 accordingly to
avoid out-of-bounds memory accesses by CB.

Cc: 17.1 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/r600_texture.c

index 25abdd691254362fa9503e5e437396062a21def0..d0492d68c9c23a8f0a68ab07be4ff1dee84dbf38 100644 (file)
@@ -1967,6 +1967,8 @@ static struct pipe_surface *r600_create_surface(struct pipe_context *pipe,
        unsigned level = templ->u.tex.level;
        unsigned width = u_minify(tex->width0, level);
        unsigned height = u_minify(tex->height0, level);
+       unsigned width0 = tex->width0;
+       unsigned height0 = tex->height0;
 
        if (tex->target != PIPE_BUFFER && templ->format != tex->format) {
                const struct util_format_description *tex_desc
@@ -1985,11 +1987,14 @@ static struct pipe_surface *r600_create_surface(struct pipe_context *pipe,
 
                        width = nblks_x * templ_desc->block.width;
                        height = nblks_y * templ_desc->block.height;
+
+                       width0 = util_format_get_nblocksx(tex->format, width0);
+                       height0 = util_format_get_nblocksy(tex->format, height0);
                }
        }
 
        return r600_create_surface_custom(pipe, tex, templ,
-                                         tex->width0, tex->height0,
+                                         width0, height0,
                                          width, height);
 }