From f9c4ac3477ba3beffbc1f12ba6f188ee332ba2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 20 Nov 2023 03:41:17 -0500 Subject: [PATCH] radeonsi: update shaders for rasterizer state only if the shader key changed Check if any key bit changed before setting do_update_shaders. Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_state.c | 18 ++++++++++++------ .../drivers/radeonsi/si_state_shaders.cpp | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index f4237bccbee..636ee6cf883 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -1251,24 +1251,30 @@ static void si_bind_rs_state(struct pipe_context *ctx, void *state) if (sctx->screen->dpbb_allowed && (old_rs->bottom_edge_rule != rs->bottom_edge_rule)) si_mark_atom_dirty(sctx, &sctx->atoms.s.dpbb_state); - if (old_rs->clip_plane_enable != rs->clip_plane_enable || - old_rs->rasterizer_discard != rs->rasterizer_discard || + if (old_rs->rasterizer_discard != rs->rasterizer_discard || old_rs->sprite_coord_enable != rs->sprite_coord_enable || old_rs->flatshade != rs->flatshade || old_rs->two_side != rs->two_side || old_rs->multisample_enable != rs->multisample_enable || old_rs->poly_stipple_enable != rs->poly_stipple_enable || - old_rs->poly_smooth != rs->poly_smooth || old_rs->line_smooth != rs->line_smooth || old_rs->point_smooth != rs->point_smooth || old_rs->clamp_fragment_color != rs->clamp_fragment_color || - old_rs->force_persample_interp != rs->force_persample_interp || - old_rs->polygon_mode_is_points != rs->polygon_mode_is_points) { + old_rs->force_persample_interp != rs->force_persample_interp) { si_ps_key_update_framebuffer_blend_rasterizer(sctx); si_ps_key_update_rasterizer(sctx); si_ps_key_update_framebuffer_rasterizer_sample_shading(sctx); si_update_ps_inputs_read_or_disabled(sctx); - sctx->do_update_shaders = true; } + if (/* Used by si_get_vs_key_outputs in si_update_shaders: */ + old_rs->clip_plane_enable != rs->clip_plane_enable || + old_rs->polygon_mode_is_points != rs->polygon_mode_is_points || + /* Used by si_ps_key_update_primtype_shader_rasterizer_framebuffer in si_update_shaders: */ + old_rs->poly_stipple_enable != rs->poly_stipple_enable || + old_rs->poly_smooth != rs->poly_smooth || + old_rs->line_smooth != rs->line_smooth || + old_rs->point_smooth != rs->point_smooth) + sctx->do_update_shaders = true; + if (old_rs->line_smooth != rs->line_smooth || old_rs->poly_smooth != rs->poly_smooth || old_rs->point_smooth != rs->point_smooth || diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index 20942729efa..7b193c9ad08 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -2449,9 +2449,18 @@ void si_ps_key_update_rasterizer(struct si_context *sctx) if (!sel) return; + bool old_color_two_side = key->ps.part.prolog.color_two_side; + bool old_flatshade_colors = key->ps.part.prolog.flatshade_colors; + bool old_clamp_color = key->ps.part.epilog.clamp_color; + key->ps.part.prolog.color_two_side = rs->two_side && sel->info.colors_read; key->ps.part.prolog.flatshade_colors = rs->flatshade && sel->info.uses_interp_color; key->ps.part.epilog.clamp_color = rs->clamp_fragment_color; + + if (key->ps.part.prolog.color_two_side != old_color_two_side || + key->ps.part.prolog.flatshade_colors != old_flatshade_colors || + key->ps.part.epilog.clamp_color != old_clamp_color) + sctx->do_update_shaders = true; } void si_ps_key_update_dsa(struct si_context *sctx) @@ -2501,6 +2510,11 @@ void si_ps_key_update_framebuffer_rasterizer_sample_shading(struct si_context *s if (!sel) return; + /* Old key data for comparison. */ + struct si_ps_prolog_bits old_prolog; + memcpy(&old_prolog, &key->ps.part.prolog, sizeof(old_prolog)); + bool old_interpolate_at_sample_force_center = key->ps.mono.interpolate_at_sample_force_center; + bool uses_persp_center = sel->info.uses_persp_center || (!rs->flatshade && sel->info.uses_persp_center_color); bool uses_persp_centroid = sel->info.uses_persp_centroid || @@ -2548,6 +2562,11 @@ void si_ps_key_update_framebuffer_rasterizer_sample_shading(struct si_context *s key->ps.part.prolog.bc_optimize_for_linear = 0; key->ps.mono.interpolate_at_sample_force_center = sel->info.uses_interp_at_sample; } + + /* Update shaders only if the key changed. */ + if (memcmp(&key->ps.part.prolog, &old_prolog, sizeof(old_prolog)) || + key->ps.mono.interpolate_at_sample_force_center != old_interpolate_at_sample_force_center) + sctx->do_update_shaders = true; } /* Compute the key for the hw shader variant */