From: Marek Olšák <marek.ol...@amd.com> The previous patch is required for this. --- src/gallium/drivers/radeonsi/si_blit.c | 5 +++++ src/gallium/drivers/radeonsi/si_pipe.h | 17 +++++++++++++++++ src/gallium/drivers/radeonsi/si_state_shaders.c | 6 +----- 3 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 45770b0d9bf..8dd8bc2a4dd 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -706,20 +706,25 @@ static void si_check_render_feedback_resident_images(struct si_context *sctx) si_check_render_feedback_texture(sctx, tex, view->u.tex.level, view->u.tex.level, view->u.tex.first_layer, view->u.tex.last_layer); } } static void si_check_render_feedback(struct si_context *sctx) { + /* There is no render feedback if color writes are disabled. + * (e.g. a pixel shader with image stores) + */ + if (!si_get_total_colormask(sctx)) + return; if (!sctx->need_check_render_feedback) return; for (int i = 0; i < SI_NUM_SHADERS; ++i) { si_check_render_feedback_images(sctx, &sctx->images[i]); si_check_render_feedback_textures(sctx, &sctx->samplers[i]); } si_check_render_feedback_resident_images(sctx); diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index e3d45ef6c3b..e65c946d186 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -933,11 +933,28 @@ vi_tc_compat_htile_enabled(struct r600_texture *tex, unsigned level) } static inline unsigned si_get_ps_iter_samples(struct si_context *sctx) { if (sctx->ps_uses_fbfetch) return sctx->framebuffer.nr_samples; return sctx->ps_iter_samples; } +static inline unsigned si_get_total_colormask(struct si_context *sctx) +{ + if (sctx->queued.named.rasterizer->rasterizer_discard) + return 0; + + struct si_shader_selector *ps = sctx->ps_shader.cso; + unsigned colormask = sctx->framebuffer.colorbuf_enabled_4bit & + sctx->queued.named.blend->cb_target_mask; + + if (!ps->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS]) + colormask &= ps->colors_written_4bit; + else if (!ps->colors_written_4bit) + colormask = 0; /* color0 writes all cbufs, but it's not written */ + + return colormask; +} + #endif diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index d7742eafb04..f2d29e40744 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1208,25 +1208,21 @@ static void si_shader_selector_key_hw_vs(struct si_context *sctx, bool ps_disabled = true; if (ps) { const struct si_state_blend *blend = sctx->queued.named.blend; bool alpha_to_coverage = blend && blend->alpha_to_coverage; bool ps_modifies_zs = ps->info.uses_kill || ps->info.writes_z || ps->info.writes_stencil || ps->info.writes_samplemask || alpha_to_coverage || 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; + unsigned ps_colormask = si_get_total_colormask(sctx); 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; uint64_t inputs_read = 0; -- 2.15.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev