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 41b08f8de4f068030168c44d209fda8be4eb60be..5ee8bb9cd574c0804f25eada40aca96502d77450 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 26c7b4ca9a37195ede712b2eae0d1dbb66446558..7b7d96c06658e3fdb513427b86b9800e6da1925c 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 71d798749c1354a3cad3e52cbeb470c9d3fd33e2..061b3d213e817bb661db9410c3f7e1304f549803 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.