[Mesa-dev] [PATCH 2/2] radeonsi: eliminate PS color outputs when colormask kills them

Nicolai Hähnle nhaehnle at gmail.com
Mon Sep 4 12:32:32 UTC 2017


Both patches:

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

On 30.08.2017 00:26, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> ---
>   src/gallium/drivers/radeonsi/si_state.c         | 4 ++++
>   src/gallium/drivers/radeonsi/si_state.h         | 1 +
>   src/gallium/drivers/radeonsi/si_state_shaders.c | 1 +
>   3 files changed, 6 insertions(+)
> 
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index 41b08f8..5ee8bb9 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -434,20 +434,22 @@ static void *si_create_blend_state_mode(struct pipe_context *ctx,
>   		       S_028B70_ALPHA_TO_MASK_ENABLE(state->alpha_to_coverage) |
>   		       S_028B70_ALPHA_TO_MASK_OFFSET0(2) |
>   		       S_028B70_ALPHA_TO_MASK_OFFSET1(2) |
>   		       S_028B70_ALPHA_TO_MASK_OFFSET2(2) |
>   		       S_028B70_ALPHA_TO_MASK_OFFSET3(2));
>   
>   	if (state->alpha_to_coverage)
>   		blend->need_src_alpha_4bit |= 0xf;
>   
>   	blend->cb_target_mask = 0;
> +	blend->cb_target_enabled_4bit = 0;
> +
>   	for (int i = 0; i < 8; i++) {
>   		/* state->rt entries > 0 only written if independent blending */
>   		const int j = state->independent_blend_enable ? i : 0;
>   
>   		unsigned eqRGB = state->rt[j].rgb_func;
>   		unsigned srcRGB = state->rt[j].rgb_src_factor;
>   		unsigned dstRGB = state->rt[j].rgb_dst_factor;
>   		unsigned eqA = state->rt[j].alpha_func;
>   		unsigned srcA = state->rt[j].alpha_src_factor;
>   		unsigned dstA = state->rt[j].alpha_dst_factor;
> @@ -475,20 +477,22 @@ static void *si_create_blend_state_mode(struct pipe_context *ctx,
>   		if (blend->dual_src_blend &&
>   		    (eqRGB == PIPE_BLEND_MIN || eqRGB == PIPE_BLEND_MAX ||
>   		     eqA == PIPE_BLEND_MIN || eqA == PIPE_BLEND_MAX)) {
>   			assert(!"Unsupported equation for dual source blending");
>   			si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl);
>   			continue;
>   		}
>   
>   		/* cb_render_state will disable unused ones */
>   		blend->cb_target_mask |= (unsigned)state->rt[j].colormask << (4 * i);
> +		if (state->rt[j].colormask)
> +			blend->cb_target_enabled_4bit |= 0xf << (4 * i);
>   
>   		if (!state->rt[j].colormask || !state->rt[j].blend_enable) {
>   			si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl);
>   			continue;
>   		}
>   
>   		/* Blending optimizations for RB+.
>   		 * These transformations don't change the behavior.
>   		 *
>   		 * First, get rid of DST in the blend factors:
> diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h
> index 26c7b4c..7b7d96c 100644
> --- a/src/gallium/drivers/radeonsi/si_state.h
> +++ b/src/gallium/drivers/radeonsi/si_state.h
> @@ -48,20 +48,21 @@ struct si_shader_selector;
>   
>   struct si_state_blend {
>   	struct si_pm4_state	pm4;
>   	uint32_t		cb_target_mask;
>   	bool			alpha_to_coverage;
>   	bool			alpha_to_one;
>   	bool			dual_src_blend;
>   	/* Set 0xf or 0x0 (4 bits) per render target if the following is
>   	 * true. ANDed with spi_shader_col_format.
>   	 */
> +	unsigned		cb_target_enabled_4bit;
>   	unsigned		blend_enable_4bit;
>   	unsigned		need_src_alpha_4bit;
>   };
>   
>   struct si_state_rasterizer {
>   	struct si_pm4_state	pm4;
>   	/* poly offset states for 16-bit, 24-bit, and 32-bit zbuffers */
>   	struct si_pm4_state	*pm4_poly_offset;
>   	unsigned		pa_sc_line_stipple;
>   	unsigned		pa_cl_clip_cntl;
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index 71d7987..061b3d2 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -1348,20 +1348,21 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
>   			 */
>   			key->part.ps.epilog.spi_shader_col_format =
>   				(blend->blend_enable_4bit & blend->need_src_alpha_4bit &
>   				 sctx->framebuffer.spi_shader_col_format_blend_alpha) |
>   				(blend->blend_enable_4bit & ~blend->need_src_alpha_4bit &
>   				 sctx->framebuffer.spi_shader_col_format_blend) |
>   				(~blend->blend_enable_4bit & blend->need_src_alpha_4bit &
>   				 sctx->framebuffer.spi_shader_col_format_alpha) |
>   				(~blend->blend_enable_4bit & ~blend->need_src_alpha_4bit &
>   				 sctx->framebuffer.spi_shader_col_format);
> +			key->part.ps.epilog.spi_shader_col_format &= blend->cb_target_enabled_4bit;
>   
>   			/* The output for dual source blending should have
>   			 * the same format as the first output.
>   			 */
>   			if (blend->dual_src_blend)
>   				key->part.ps.epilog.spi_shader_col_format |=
>   					(key->part.ps.epilog.spi_shader_col_format & 0xf) << 4;
>   		} else
>   			key->part.ps.epilog.spi_shader_col_format = sctx->framebuffer.spi_shader_col_format;
>   
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list