From: Marek Olšák <marek.ol...@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;
 
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to