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