Both patches:

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>

On 30.08.2017 00:26, Marek Olšák wrote:
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;


--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to