diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index e293a428dfe..5ec4d78dfd9 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -336,6 +336,61 @@ static bool si_update_shaders(struct si_context *sctx) if (HAS_TESS && (is_vs_state_changed || is_tess_state_changed)) si_update_tess_io_layout_state(sctx); + if ((GFX_VERSION <= GFX8 && + (si_pm4_state_enabled_and_changed(sctx, ls) || si_pm4_state_enabled_and_changed(sctx, es))) || + si_pm4_state_enabled_and_changed(sctx, hs) || si_pm4_state_enabled_and_changed(sctx, gs) || + (!NGG && si_pm4_state_enabled_and_changed(sctx, vs)) || si_pm4_state_enabled_and_changed(sctx, ps)) { + unsigned scratch_size = 0; + + if (HAS_TESS) { + if (GFX_VERSION <= GFX8) /* LS */ + scratch_size = MAX2(scratch_size, sctx->shader.vs.current->config.scratch_bytes_per_wave); + + scratch_size = MAX2(scratch_size, sctx->queued.named.hs->config.scratch_bytes_per_wave); + + if (HAS_GS) { + if (GFX_VERSION <= GFX8) /* ES */ + scratch_size = MAX2(scratch_size, sctx->shader.tes.current->config.scratch_bytes_per_wave); + + scratch_size = MAX2(scratch_size, sctx->shader.gs.current->config.scratch_bytes_per_wave); + } else { + scratch_size = MAX2(scratch_size, sctx->shader.tes.current->config.scratch_bytes_per_wave); + } + } else if (HAS_GS) { + if (GFX_VERSION <= GFX8) /* ES */ + scratch_size = MAX2(scratch_size, sctx->shader.vs.current->config.scratch_bytes_per_wave); + + scratch_size = MAX2(scratch_size, sctx->shader.gs.current->config.scratch_bytes_per_wave); + } else { + scratch_size = MAX2(scratch_size, sctx->shader.vs.current->config.scratch_bytes_per_wave); + } + + scratch_size = MAX2(scratch_size, sctx->shader.ps.current->config.scratch_bytes_per_wave); + + if (scratch_size && !si_update_spi_tmpring_size(sctx, scratch_size)) + return false; + + if (GFX_VERSION >= GFX7) { + if (GFX_VERSION <= GFX8 && HAS_TESS && si_pm4_state_enabled_and_changed(sctx, ls)) + sctx->prefetch_L2_mask |= SI_PREFETCH_LS; + + if (HAS_TESS && si_pm4_state_enabled_and_changed(sctx, hs)) + sctx->prefetch_L2_mask |= SI_PREFETCH_HS; + + if (GFX_VERSION <= GFX8 && HAS_GS && si_pm4_state_enabled_and_changed(sctx, es)) + sctx->prefetch_L2_mask |= SI_PREFETCH_ES; + + if ((HAS_GS || NGG) && si_pm4_state_enabled_and_changed(sctx, gs)) + sctx->prefetch_L2_mask |= SI_PREFETCH_GS; + + if (!NGG && si_pm4_state_enabled_and_changed(sctx, vs)) + sctx->prefetch_L2_mask |= SI_PREFETCH_VS; + + if (si_pm4_state_enabled_and_changed(sctx, ps)) + sctx->prefetch_L2_mask |= SI_PREFETCH_PS; + } + } + if (GFX_VERSION >= GFX9 && unlikely(sctx->sqtt)) { /* Pretend the bound shaders form a vk pipeline. Include the scratch size in * the hash calculation to force re-emitting the pipeline if the scratch bo @@ -441,61 +496,6 @@ static bool si_update_shaders(struct si_context *sctx) si_pm4_bind_state(sctx, sqtt_pipeline, pipeline); } - if ((GFX_VERSION <= GFX8 && - (si_pm4_state_enabled_and_changed(sctx, ls) || si_pm4_state_enabled_and_changed(sctx, es))) || - si_pm4_state_enabled_and_changed(sctx, hs) || si_pm4_state_enabled_and_changed(sctx, gs) || - (!NGG && si_pm4_state_enabled_and_changed(sctx, vs)) || si_pm4_state_enabled_and_changed(sctx, ps)) { - unsigned scratch_size = 0; - - if (HAS_TESS) { - if (GFX_VERSION <= GFX8) /* LS */ - scratch_size = MAX2(scratch_size, sctx->shader.vs.current->config.scratch_bytes_per_wave); - - scratch_size = MAX2(scratch_size, sctx->queued.named.hs->config.scratch_bytes_per_wave); - - if (HAS_GS) { - if (GFX_VERSION <= GFX8) /* ES */ - scratch_size = MAX2(scratch_size, sctx->shader.tes.current->config.scratch_bytes_per_wave); - - scratch_size = MAX2(scratch_size, sctx->shader.gs.current->config.scratch_bytes_per_wave); - } else { - scratch_size = MAX2(scratch_size, sctx->shader.tes.current->config.scratch_bytes_per_wave); - } - } else if (HAS_GS) { - if (GFX_VERSION <= GFX8) /* ES */ - scratch_size = MAX2(scratch_size, sctx->shader.vs.current->config.scratch_bytes_per_wave); - - scratch_size = MAX2(scratch_size, sctx->shader.gs.current->config.scratch_bytes_per_wave); - } else { - scratch_size = MAX2(scratch_size, sctx->shader.vs.current->config.scratch_bytes_per_wave); - } - - scratch_size = MAX2(scratch_size, sctx->shader.ps.current->config.scratch_bytes_per_wave); - - if (scratch_size && !si_update_spi_tmpring_size(sctx, scratch_size)) - return false; - - if (GFX_VERSION >= GFX7) { - if (GFX_VERSION <= GFX8 && HAS_TESS && si_pm4_state_enabled_and_changed(sctx, ls)) - sctx->prefetch_L2_mask |= SI_PREFETCH_LS; - - if (HAS_TESS && si_pm4_state_enabled_and_changed(sctx, hs)) - sctx->prefetch_L2_mask |= SI_PREFETCH_HS; - - if (GFX_VERSION <= GFX8 && HAS_GS && si_pm4_state_enabled_and_changed(sctx, es)) - sctx->prefetch_L2_mask |= SI_PREFETCH_ES; - - if ((HAS_GS || NGG) && si_pm4_state_enabled_and_changed(sctx, gs)) - sctx->prefetch_L2_mask |= SI_PREFETCH_GS; - - if (!NGG && si_pm4_state_enabled_and_changed(sctx, vs)) - sctx->prefetch_L2_mask |= SI_PREFETCH_VS; - - if (si_pm4_state_enabled_and_changed(sctx, ps)) - sctx->prefetch_L2_mask |= SI_PREFETCH_PS; - } - } - /* si_shader_select_with_key can clear the ngg_culling in the shader key if the shader * compilation hasn't finished. Set it to the same value in si_context. */