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 <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26307>
This commit is contained in:
Marek Olšák 2023-11-20 03:41:17 -05:00 committed by Marge Bot
parent 613ea16aab
commit f9c4ac3477
2 changed files with 31 additions and 6 deletions

View file

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

View file

@ -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 */