[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