From: Marek Olšák <marek.ol...@amd.com>

---
 src/gallium/drivers/radeonsi/si_pipe.h          |  1 +
 src/gallium/drivers/radeonsi/si_state.c         |  2 ++
 src/gallium/drivers/radeonsi/si_state_shaders.c | 19 ++++++++++++++++++-
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index 847281e..42cbecb 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -160,20 +160,21 @@ struct si_images_info {
        uint32_t                        compressed_colortex_mask;
        unsigned                        enabled_mask;
 };
 
 struct si_framebuffer {
        struct r600_atom                atom;
        struct pipe_framebuffer_state   state;
        unsigned                        nr_samples;
        unsigned                        log_samples;
        unsigned                        compressed_cb_mask;
+       unsigned                        colorbuf_enabled_4bit;
        unsigned                        spi_shader_col_format;
        unsigned                        spi_shader_col_format_alpha;
        unsigned                        spi_shader_col_format_blend;
        unsigned                        spi_shader_col_format_blend_alpha;
        unsigned                        color_is_int8; /* bitmask */
        unsigned                        dirty_cbufs;
        bool                            dirty_zsbuf;
        bool                            any_dst_linear;
 };
 
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index b30bec1..c459d37 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2325,20 +2325,21 @@ static void si_set_framebuffer_state(struct 
pipe_context *ctx,
        /* Take the maximum of the old and new count. If the new count is lower,
         * dirtying is needed to disable the unbound colorbuffers.
         */
        sctx->framebuffer.dirty_cbufs |=
                (1 << MAX2(sctx->framebuffer.state.nr_cbufs, state->nr_cbufs)) 
- 1;
        sctx->framebuffer.dirty_zsbuf |= sctx->framebuffer.state.zsbuf != 
state->zsbuf;
 
        si_dec_framebuffer_counters(&sctx->framebuffer.state);
        util_copy_framebuffer_state(&sctx->framebuffer.state, state);
 
+       sctx->framebuffer.colorbuf_enabled_4bit = 0;
        sctx->framebuffer.spi_shader_col_format = 0;
        sctx->framebuffer.spi_shader_col_format_alpha = 0;
        sctx->framebuffer.spi_shader_col_format_blend = 0;
        sctx->framebuffer.spi_shader_col_format_blend_alpha = 0;
        sctx->framebuffer.color_is_int8 = 0;
 
        sctx->framebuffer.compressed_cb_mask = 0;
        sctx->framebuffer.nr_samples = util_framebuffer_get_num_samples(state);
        sctx->framebuffer.log_samples = 
util_logbase2(sctx->framebuffer.nr_samples);
        sctx->framebuffer.any_dst_linear = false;
@@ -2347,20 +2348,21 @@ static void si_set_framebuffer_state(struct 
pipe_context *ctx,
                if (!state->cbufs[i])
                        continue;
 
                surf = (struct r600_surface*)state->cbufs[i];
                rtex = (struct r600_texture*)surf->base.texture;
 
                if (!surf->color_initialized) {
                        si_initialize_color_surface(sctx, surf);
                }
 
+               sctx->framebuffer.colorbuf_enabled_4bit |= 0xf << (i * 4);
                sctx->framebuffer.spi_shader_col_format |=
                        surf->spi_shader_col_format << (i * 4);
                sctx->framebuffer.spi_shader_col_format_alpha |=
                        surf->spi_shader_col_format_alpha << (i * 4);
                sctx->framebuffer.spi_shader_col_format_blend |=
                        surf->spi_shader_col_format_blend << (i * 4);
                sctx->framebuffer.spi_shader_col_format_blend_alpha |=
                        surf->spi_shader_col_format_blend_alpha << (i * 4);
 
                if (surf->color_is_int8)
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 7834f87..cd4b339 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -860,21 +860,38 @@ static void si_shader_selector_key_hw_vs(struct 
si_context *sctx,
 {
        struct si_shader_selector *ps = sctx->ps_shader.cso;
 
        key->opt.hw_vs.clip_disable =
                sctx->queued.named.rasterizer->clip_plane_enable == 0 &&
                (vs->info.clipdist_writemask ||
                 vs->info.writes_clipvertex) &&
                !vs->info.culldist_writemask;
 
        /* Find out if PS is disabled. */
-       bool ps_disabled = ps == NULL;
+       bool ps_disabled = true;
+       if (ps) {
+               bool ps_modifies_zs = ps->info.uses_kill ||
+                                     ps->info.writes_z ||
+                                     ps->info.writes_stencil ||
+                                     ps->info.writes_samplemask ||
+                                     si_get_alpha_test_func(sctx) != 
PIPE_FUNC_ALWAYS;
+
+               unsigned ps_colormask = sctx->framebuffer.colorbuf_enabled_4bit 
&
+                                       
sctx->queued.named.blend->cb_target_mask;
+               if 
(!ps->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS])
+                       ps_colormask &= ps->colors_written_4bit;
+
+               ps_disabled = sctx->queued.named.rasterizer->rasterizer_discard 
||
+                             (!ps_colormask &&
+                              !ps_modifies_zs &&
+                              !ps->info.writes_memory);
+       }
 
        /* Find out which VS outputs aren't used by the PS. */
        uint64_t outputs_written = vs->outputs_written;
        uint32_t outputs_written2 = vs->outputs_written2;
        uint64_t inputs_read = 0;
        uint32_t inputs_read2 = 0;
 
        outputs_written &= ~0x3; /* ignore POSITION, PSIZE */
 
        if (!ps_disabled) {
-- 
2.7.4

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

Reply via email to