radeonsi: don't update provoking vertex and outprim states in SGPR if unused

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7721>
This commit is contained in:
Marek Olšák 2020-11-25 03:02:17 -05:00
parent 4641dca269
commit 623ea81530
3 changed files with 32 additions and 4 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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);
}
}
}