From 623ea8153018e7874bb133921c5da7d9ce546a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 25 Nov 2020 03:02:17 -0500 Subject: [PATCH] radeonsi: don't update provoking vertex and outprim states in SGPR if unused Acked-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_shader.c | 16 ++++++++++++++++ src/gallium/drivers/radeonsi/si_shader.h | 4 ++++ src/gallium/drivers/radeonsi/si_state_draw.c | 16 ++++++++++++---- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 58bf609779f..252a7a58679 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2614,6 +2614,22 @@ bool si_create_shader_variant(struct si_screen *sscreen, struct ac_llvm_compiler gfx9_get_gs_info(shader->previous_stage_sel, sel, &shader->gs_info); } + shader->uses_vs_state_provoking_vertex = + sscreen->use_ngg && + /* Used to convert triangle strips from GS to triangles. */ + ((sel->info.stage == MESA_SHADER_GEOMETRY && + util_rast_prim_is_triangles(sel->info.base.gs.output_primitive)) || + (sel->info.stage == MESA_SHADER_VERTEX && + /* Used to export PrimitiveID from the correct vertex. */ + (shader->key.mono.u.vs_export_prim_id || + /* Used to generate triangle strip vertex IDs for all threads. */ + shader->key.opt.ngg_culling & SI_NGG_CULL_GS_FAST_LAUNCH_TRI_STRIP))); + + shader->uses_vs_state_outprim = sscreen->use_ngg && + /* Only used by streamout in vertex shaders. */ + sel->info.stage == MESA_SHADER_VERTEX && + sel->so.num_outputs; + si_fix_resource_usage(sscreen, shader); si_shader_dump(sscreen, shader, debug, stderr, true); diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index c91ed02dbe2..05e596c6027 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -748,6 +748,10 @@ struct si_shader { struct ac_shader_config config; struct si_shader_binary_info info; + /* SI_SGPR_VS_STATE_BITS */ + bool uses_vs_state_provoking_vertex; + bool uses_vs_state_outprim; + struct { uint16_t ngg_emit_size; /* in dwords */ uint16_t hw_max_esverts; diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 9279bd5c3bd..4235731df0d 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -629,11 +629,19 @@ static void si_emit_rasterizer_prim_state(struct si_context *sctx) sctx->context_roll = true; if (sctx->ngg) { - unsigned vtx_index = rs->flatshade_first ? 0 : gs_out_prim; + struct si_shader *hw_vs = si_get_vs_state(sctx); - sctx->current_vs_state &= C_VS_STATE_OUTPRIM & C_VS_STATE_PROVOKING_VTX_INDEX; - sctx->current_vs_state |= - S_VS_STATE_OUTPRIM(gs_out_prim) | S_VS_STATE_PROVOKING_VTX_INDEX(vtx_index); + if (hw_vs->uses_vs_state_provoking_vertex) { + unsigned vtx_index = rs->flatshade_first ? 0 : gs_out_prim; + + sctx->current_vs_state &= C_VS_STATE_PROVOKING_VTX_INDEX; + sctx->current_vs_state |= S_VS_STATE_PROVOKING_VTX_INDEX(vtx_index); + } + + if (hw_vs->uses_vs_state_outprim) { + sctx->current_vs_state &= C_VS_STATE_OUTPRIM; + sctx->current_vs_state |= S_VS_STATE_OUTPRIM(gs_out_prim); + } } }