From 8eed352e053f6ac544a4bff3c3c670686880154c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 31 Dec 2023 00:43:06 -0500 Subject: [PATCH] radeonsi: split si_update_ngg_prim_state_sgpr into 2 functions GS_STATE_PROVOKING_VTX_FIRST no longer depends on the primitive type, so we don't have to call it in si_set_rasterized_prim anymore. Reviewed-by: Qiang Yu Acked-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_pipe.h | 16 ++++++++-------- src/gallium/drivers/radeonsi/si_state.c | 2 +- src/gallium/drivers/radeonsi/si_state_draw.cpp | 6 ++++-- .../drivers/radeonsi/si_state_shaders.cpp | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index f916569d0d5..cc335d42880 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -2152,19 +2152,19 @@ static inline void si_set_clip_discard_distance(struct si_context *sctx, float d * It's expected that hw_vs and ngg are inline constants in draw_vbo after optimizations. */ static inline void -si_update_ngg_prim_state_sgpr(struct si_context *sctx, struct si_shader *hw_vs, bool ngg) +si_update_ngg_sgpr_state_provoking_vtx(struct si_context *sctx, struct si_shader *hw_vs, bool ngg) { - if (!ngg || !hw_vs) - return; - - if (hw_vs->uses_vs_state_provoking_vertex) { + if (ngg && hw_vs && hw_vs->uses_vs_state_provoking_vertex) { SET_FIELD(sctx->current_gs_state, GS_STATE_PROVOKING_VTX_FIRST, sctx->queued.named.rasterizer->flatshade_first); } +} - if (hw_vs->uses_gs_state_outprim) { +static inline void +si_update_ngg_sgpr_state_out_prim(struct si_context *sctx, struct si_shader *hw_vs, bool ngg) +{ + if (ngg && hw_vs && hw_vs->uses_gs_state_outprim) SET_FIELD(sctx->current_gs_state, GS_STATE_OUTPRIM, sctx->gs_out_prim); - } } /* Set the primitive type seen by the rasterizer. GS and tessellation affect this. @@ -2195,7 +2195,7 @@ si_set_rasterized_prim(struct si_context *sctx, enum mesa_prim rast_prim, sctx->current_rast_prim = rast_prim; si_vs_ps_key_update_rast_prim_smooth_stipple(sctx); - si_update_ngg_prim_state_sgpr(sctx, hw_vs, ngg); + si_update_ngg_sgpr_state_out_prim(sctx, hw_vs, ngg); } } diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 8f7ca07432f..f126ce887a9 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -1330,7 +1330,7 @@ static void si_bind_rs_state(struct pipe_context *ctx, void *state) si_update_vrs_flat_shading(sctx); if (old_rs->flatshade_first != rs->flatshade_first) - si_update_ngg_prim_state_sgpr(sctx, si_get_vs(sctx)->current, sctx->ngg); + si_update_ngg_sgpr_state_provoking_vtx(sctx, si_get_vs(sctx)->current, sctx->ngg); } static void si_delete_rs_state(struct pipe_context *ctx, void *state) diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index b74d8fc048e..5eef4bcebb8 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -247,8 +247,10 @@ static bool si_update_shaders(struct si_context *sctx) /* If we start to use any of these, we need to update the SGPR. */ if ((hw_vs->uses_vs_state_provoking_vertex && !old_uses_vs_state_provoking_vertex) || - (hw_vs->uses_gs_state_outprim && !old_uses_gs_state_outprim)) - si_update_ngg_prim_state_sgpr(sctx, hw_vs, NGG); + (hw_vs->uses_gs_state_outprim && !old_uses_gs_state_outprim)) { + si_update_ngg_sgpr_state_out_prim(sctx, hw_vs, NGG); + si_update_ngg_sgpr_state_provoking_vtx(sctx, hw_vs, NGG); + } r = si_shader_select(ctx, &sctx->shader.ps); if (r) diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index 9faa8693b3b..c7d723ed949 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -3484,7 +3484,7 @@ static void si_update_rasterized_prim(struct si_context *sctx) } /* This must be done unconditionally because it also depends on si_shader fields. */ - si_update_ngg_prim_state_sgpr(sctx, hw_vs, sctx->ngg); + si_update_ngg_sgpr_state_out_prim(sctx, hw_vs, sctx->ngg); } static void si_update_common_shader_state(struct si_context *sctx, struct si_shader_selector *sel,