[Mesa-dev] [PATCH] gallium/radeon: make sure HTILE address is aligned properly

Nicolai Hähnle nhaehnle at gmail.com
Tue Oct 25 14:32:41 UTC 2016


Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

On 24.10.2016 21:39, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> This should fix random GPU hangs on Hawaii and Fiji.
> It's already been fixed in 13.0 and later.
>
> Cc: 11.2 12.0 <mesa-stable at lists.freedesktop.org>
> ---
>  src/gallium/drivers/radeon/r600_texture.c | 17 ++++++++++-------
>  1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
> index 23ddff4..b867f85 100644
> --- a/src/gallium/drivers/radeon/r600_texture.c
> +++ b/src/gallium/drivers/radeon/r600_texture.c
> @@ -722,10 +722,11 @@ static void r600_texture_alloc_cmask_separate(struct r600_common_screen *rscreen
>  }
>
>  static unsigned r600_texture_get_htile_size(struct r600_common_screen *rscreen,
> -					    struct r600_texture *rtex)
> +					    struct r600_texture *rtex,
> +					    unsigned *base_align)
>  {
>  	unsigned cl_width, cl_height, width, height;
> -	unsigned slice_elements, slice_bytes, pipe_interleave_bytes, base_align;
> +	unsigned slice_elements, slice_bytes, pipe_interleave_bytes;
>  	unsigned num_pipes = rscreen->info.num_tile_pipes;
>
>  	if (rscreen->chip_class <= EVERGREEN &&
> @@ -787,7 +788,7 @@ static unsigned r600_texture_get_htile_size(struct r600_common_screen *rscreen,
>  	slice_bytes = slice_elements * 4;
>
>  	pipe_interleave_bytes = rscreen->info.pipe_interleave_bytes;
> -	base_align = num_pipes * pipe_interleave_bytes;
> +	*base_align = num_pipes * pipe_interleave_bytes;
>
>  	rtex->htile.pitch = width;
>  	rtex->htile.height = height;
> @@ -795,20 +796,22 @@ static unsigned r600_texture_get_htile_size(struct r600_common_screen *rscreen,
>  	rtex->htile.yalign = cl_height * 8;
>
>  	return (util_max_layer(&rtex->resource.b.b, 0) + 1) *
> -		align(slice_bytes, base_align);
> +		align(slice_bytes, *base_align);
>  }
>
>  static void r600_texture_allocate_htile(struct r600_common_screen *rscreen,
>  					struct r600_texture *rtex)
>  {
> -	unsigned htile_size = r600_texture_get_htile_size(rscreen, rtex);
> +	unsigned alignment = 0;
> +	unsigned htile_size = r600_texture_get_htile_size(rscreen, rtex,
> +							  &alignment);
>
>  	if (!htile_size)
>  		return;
>
>  	rtex->htile_buffer = (struct r600_resource*)
> -			     pipe_buffer_create(&rscreen->b, PIPE_BIND_CUSTOM,
> -						PIPE_USAGE_DEFAULT, htile_size);
> +		r600_aligned_buffer_create(&rscreen->b, 0, PIPE_USAGE_DEFAULT,
> +					   htile_size, alignment);
>  	if (rtex->htile_buffer == NULL) {
>  		/* this is not a fatal error as we can still keep rendering
>  		 * without htile buffer */
>


More information about the mesa-dev mailing list