[Mesa-dev] [PATCH 1/2] radeonsi: use better DCC clear codes

Dieter Nützel Dieter at nuetzel-hh.de
Wed Oct 31 03:22:14 UTC 2018


Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>

I only have Polaris 20...;-)

Am 30.10.2018 21:03, schrieb Marek Olšák:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> ---
>  src/gallium/drivers/radeonsi/si_clear.c | 26 ++++++++++++++++++++-----
>  1 file changed, 21 insertions(+), 5 deletions(-)
> 
> diff --git a/src/gallium/drivers/radeonsi/si_clear.c
> b/src/gallium/drivers/radeonsi/si_clear.c
> index 8aa3355afc8..2900c31fd21 100644
> --- a/src/gallium/drivers/radeonsi/si_clear.c
> +++ b/src/gallium/drivers/radeonsi/si_clear.c
> @@ -27,20 +27,29 @@
> 
>  #include "util/u_format.h"
>  #include "util/u_pack_color.h"
>  #include "util/u_surface.h"
> 
>  enum {
>  	SI_CLEAR         = SI_SAVE_FRAGMENT_STATE,
>  	SI_CLEAR_SURFACE = SI_SAVE_FRAMEBUFFER | SI_SAVE_FRAGMENT_STATE,
>  };
> 
> +enum si_dcc_clear_code
> +{
> +    DCC_CLEAR_COLOR_0000         = 0x00000000,
> +    DCC_CLEAR_COLOR_0001         = 0x40404040,
> +    DCC_CLEAR_COLOR_1110         = 0x80808080,
> +    DCC_CLEAR_COLOR_1111         = 0xC0C0C0C0,
> +    DCC_CLEAR_COLOR_REG          = 0x20202020,
> +};
> +
>  static void si_alloc_separate_cmask(struct si_screen *sscreen,
>  				    struct si_texture *tex)
>  {
>  	if (tex->cmask_buffer || !tex->surface.cmask_size)
>                  return;
> 
>  	tex->cmask_buffer =
>  		si_aligned_buffer_create(&sscreen->b,
>  					 SI_RESOURCE_FLAG_UNMAPPABLE,
>  					 PIPE_USAGE_DEFAULT,
> @@ -126,21 +135,21 @@ static bool vi_get_fast_clear_parameters(enum
> pipe_format base_format,
>  	const struct util_format_description *desc =
>  		util_format_description(si_simplify_cb_format(surface_format));
> 
>  	/* 128-bit fast clear with different R,G,B values is unsupported. */
>  	if (desc->block.bits == 128 &&
>  	    (color->ui[0] != color->ui[1] ||
>  	     color->ui[0] != color->ui[2]))
>  		return false;
> 
>  	*eliminate_needed = true;
> -	*clear_value = 0x20202020U; /* use CB clear color registers */
> +	*clear_value = DCC_CLEAR_COLOR_REG;
> 
>  	if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
>  		return true; /* need ELIMINATE_FAST_CLEAR */
> 
>  	bool base_alpha_is_on_msb = vi_alpha_is_on_msb(base_format);
>  	bool surf_alpha_is_on_msb = vi_alpha_is_on_msb(surface_format);
> 
>  	/* Formats with 3 channels can't have alpha. */
>  	if (desc->nr_channels == 3)
>  		alpha_channel = -1;
> @@ -201,24 +210,31 @@ static bool vi_get_fast_clear_parameters(enum
> pipe_format base_format,
>  		    values[i] != color_value)
>  			return true; /* require ELIMINATE_FAST_CLEAR */
>  	}
> 
>  	/* This doesn't need ELIMINATE_FAST_CLEAR.
>  	 * CB uses both the DCC clear codes and the CB clear color registers,
>  	 * so they must match.
>  	 */
>  	*eliminate_needed = false;
> 
> -	if (color_value)
> -		*clear_value |= 0x80808080U;
> -	if (alpha_value)
> -		*clear_value |= 0x40404040U;
> +	if (color_value) {
> +		if (alpha_value)
> +			*clear_value = DCC_CLEAR_COLOR_1111;
> +		else
> +			*clear_value = DCC_CLEAR_COLOR_1110;
> +	} else {
> +		if (alpha_value)
> +			*clear_value = DCC_CLEAR_COLOR_0001;
> +		else
> +			*clear_value = DCC_CLEAR_COLOR_0000;
> +	}
>  	return true;
>  }
> 
>  void vi_dcc_clear_level(struct si_context *sctx,
>  			struct si_texture *tex,
>  			unsigned level, unsigned clear_value)
>  {
>  	struct pipe_resource *dcc_buffer;
>  	uint64_t dcc_offset, clear_size;


More information about the mesa-dev mailing list