radeonsi: eliminate PS color outputs when colormask kills them
authorMarek Olšák <marek.olsak@amd.com>
Tue, 29 Aug 2017 01:41:18 +0000 (03:41 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 4 Sep 2017 13:10:39 +0000 (15:10 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_state.c
src/gallium/drivers/radeonsi/si_state.h
src/gallium/drivers/radeonsi/si_state_shaders.c

index 41b08f8..5ee8bb9 100644 (file)
@@ -441,6 +441,8 @@ static void *si_create_blend_state_mode(struct pipe_context *ctx,
                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;
@@ -482,6 +484,8 @@ static void *si_create_blend_state_mode(struct pipe_context *ctx,
 
                /* 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);
index 26c7b4c..7b7d96c 100644 (file)
@@ -55,6 +55,7 @@ struct si_state_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;
 };
index 71d7987..061b3d2 100644 (file)
@@ -1355,6 +1355,7 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
                                 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.