From 4641dca269cb72fd9f2bd6d078f7055c855d9ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 25 Nov 2020 02:25:59 -0500 Subject: [PATCH] radeonsi: don't update indexed flag in SGPR if it's unused to skip the register update when switching between indexed and non-indexed Acked-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_shader.h | 1 + src/gallium/drivers/radeonsi/si_shader_nir.c | 1 + src/gallium/drivers/radeonsi/si_state_draw.c | 6 ++++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 1f06324e562..c91ed02dbe2 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -367,6 +367,7 @@ struct si_shader_info { bool uses_linear_sample; bool uses_interp_at_sample; bool uses_instanceid; + bool uses_base_vertex; bool uses_drawid; bool uses_primid; bool uses_frontface; diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 0a2367aa93a..9ce534f3591 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -345,6 +345,7 @@ void si_nir_scan_shader(const struct nir_shader *nir, struct si_shader_info *inf info->uses_frontface = nir->info.system_values_read & BITFIELD64_BIT(SYSTEM_VALUE_FRONT_FACE); info->uses_instanceid = nir->info.system_values_read & BITFIELD64_BIT(SYSTEM_VALUE_INSTANCE_ID); + info->uses_base_vertex = nir->info.system_values_read & BITFIELD64_BIT(SYSTEM_VALUE_BASE_VERTEX); info->uses_invocationid = nir->info.system_values_read & BITFIELD64_BIT(SYSTEM_VALUE_INVOCATION_ID); info->uses_grid_size = nir->info.system_values_read & BITFIELD64_BIT(SYSTEM_VALUE_NUM_WORK_GROUPS); info->uses_subgroup_info = nir->info.system_values_read & BITFIELD64_BIT(SYSTEM_VALUE_LOCAL_INVOCATION_INDEX) || diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 831555a0f54..9279bd5c3bd 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -640,8 +640,10 @@ static void si_emit_rasterizer_prim_state(struct si_context *sctx) ALWAYS_INLINE static void si_emit_vs_state(struct si_context *sctx, const struct pipe_draw_info *info) { - sctx->current_vs_state &= C_VS_STATE_INDEXED; - sctx->current_vs_state |= S_VS_STATE_INDEXED(!!info->index_size); + if (sctx->vs_shader.cso->info.uses_base_vertex) { + sctx->current_vs_state &= C_VS_STATE_INDEXED; + sctx->current_vs_state |= S_VS_STATE_INDEXED(!!info->index_size); + } if (sctx->num_vs_blit_sgprs) { /* Re-emit the state after we leave u_blitter. */