[Mesa-stable] [PATCH 3/3] gallium/radeon/gfx9: fix PBO texture uploads to compressed textures
Marek Olšák
maraeo at gmail.com
Tue Jun 13 22:45:58 UTC 2017
For the series:
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Thanks for fixing this VM fault / hang!
Marek
On Mon, Jun 12, 2017 at 9:33 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> 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 at lists.freedesktop.org>
> ---
> src/gallium/drivers/radeon/r600_texture.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
> index 32275b1..88b3403 100644
> --- a/src/gallium/drivers/radeon/r600_texture.c
> +++ b/src/gallium/drivers/radeon/r600_texture.c
> @@ -1960,43 +1960,48 @@ struct pipe_surface *r600_create_surface_custom(struct pipe_context *pipe,
> return &surface->base;
> }
>
> static struct pipe_surface *r600_create_surface(struct pipe_context *pipe,
> struct pipe_resource *tex,
> const struct pipe_surface *templ)
> {
> 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
> = util_format_description(tex->format);
> const struct util_format_description *templ_desc
> = util_format_description(templ->format);
>
> assert(tex_desc->block.bits == templ_desc->block.bits);
>
> /* Adjust size of surface if and only if the block width or
> * height is changed. */
> if (tex_desc->block.width != templ_desc->block.width ||
> tex_desc->block.height != templ_desc->block.height) {
> unsigned nblks_x = util_format_get_nblocksx(tex->format, width);
> unsigned nblks_y = util_format_get_nblocksy(tex->format, height);
>
> 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);
> }
>
> static void r600_surface_destroy(struct pipe_context *pipe,
> struct pipe_surface *surface)
> {
> struct r600_surface *surf = (struct r600_surface*)surface;
> r600_resource_reference(&surf->cb_buffer_fmask, NULL);
> r600_resource_reference(&surf->cb_buffer_cmask, NULL);
> pipe_resource_reference(&surface->texture, NULL);
> --
> 2.9.3
>
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-stable
More information about the mesa-stable
mailing list