mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 13:00:09 +01:00
radeonsi/sqtt: update the shader after scratch config
scratch_buffer is updated in si_update_spi_tmpring_size, so it must be done before we swap the shaders. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37332>
This commit is contained in:
parent
714a149396
commit
eaeff6ba0e
1 changed files with 55 additions and 55 deletions
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue