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:
parent
4641dca269
commit
623ea81530
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue