[Mesa-dev] [PATCH 7/8] radeonsi: update clip_regs on shader state changes only when it's needed
Nicolai Hähnle
nhaehnle at gmail.com
Wed Jun 7 12:35:28 UTC 2017
I've sent out comments on patches #4 and #8, the rest are:
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
On 05.06.2017 18:51, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> src/gallium/drivers/radeonsi/si_state_shaders.c | 35 ++++++++++++++++++++++---
> 1 file changed, 32 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index 2e33138..c21f855 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -2173,74 +2173,100 @@ static void si_update_streamout_state(struct si_context *sctx)
> struct si_shader_selector *shader_with_so = si_get_vs(sctx)->cso;
>
> if (!shader_with_so)
> return;
>
> sctx->b.streamout.enabled_stream_buffers_mask =
> shader_with_so->enabled_streamout_buffer_mask;
> sctx->b.streamout.stride_in_dw = shader_with_so->so.stride;
> }
>
> +static void si_update_clip_regs(struct si_context *sctx,
> + struct si_shader_selector *old_hw_vs,
> + struct si_shader *old_hw_vs_variant,
> + struct si_shader_selector *next_hw_vs,
> + struct si_shader *next_hw_vs_variant)
> +{
> + if (next_hw_vs &&
> + (!old_hw_vs ||
> + old_hw_vs->info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION] !=
> + next_hw_vs->info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION] ||
> + old_hw_vs->pa_cl_vs_out_cntl != next_hw_vs->pa_cl_vs_out_cntl ||
> + old_hw_vs->clipdist_mask != next_hw_vs->clipdist_mask ||
> + old_hw_vs->culldist_mask != next_hw_vs->culldist_mask ||
> + !old_hw_vs_variant ||
> + !next_hw_vs_variant ||
> + old_hw_vs_variant->key.opt.hw_vs.clip_disable !=
> + next_hw_vs_variant->key.opt.hw_vs.clip_disable))
> + si_mark_atom_dirty(sctx, &sctx->clip_regs);
> +}
> +
> static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
> {
> struct si_context *sctx = (struct si_context *)ctx;
> + struct si_shader_selector *old_hw_vs = si_get_vs(sctx)->cso;
> + struct si_shader *old_hw_vs_variant = si_get_vs_state(sctx);
> struct si_shader_selector *sel = state;
>
> if (sctx->vs_shader.cso == sel)
> return;
>
> sctx->vs_shader.cso = sel;
> sctx->vs_shader.current = sel ? sel->first_variant : NULL;
> sctx->do_update_shaders = true;
> - si_mark_atom_dirty(sctx, &sctx->clip_regs);
> r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx));
> si_set_active_descriptors_for_shader(sctx, sel);
> si_update_streamout_state(sctx);
> + si_update_clip_regs(sctx, old_hw_vs, old_hw_vs_variant,
> + si_get_vs(sctx)->cso, si_get_vs_state(sctx));
> }
>
> static void si_update_tess_uses_prim_id(struct si_context *sctx)
> {
> sctx->ia_multi_vgt_param_key.u.tess_uses_prim_id =
> (sctx->tes_shader.cso &&
> sctx->tes_shader.cso->info.uses_primid) ||
> (sctx->tcs_shader.cso &&
> sctx->tcs_shader.cso->info.uses_primid) ||
> (sctx->gs_shader.cso &&
> sctx->gs_shader.cso->info.uses_primid) ||
> (sctx->ps_shader.cso && !sctx->gs_shader.cso &&
> sctx->ps_shader.cso->info.uses_primid);
> }
>
> static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
> {
> struct si_context *sctx = (struct si_context *)ctx;
> + struct si_shader_selector *old_hw_vs = si_get_vs(sctx)->cso;
> + struct si_shader *old_hw_vs_variant = si_get_vs_state(sctx);
> struct si_shader_selector *sel = state;
> bool enable_changed = !!sctx->gs_shader.cso != !!sel;
>
> if (sctx->gs_shader.cso == sel)
> return;
>
> sctx->gs_shader.cso = sel;
> sctx->gs_shader.current = sel ? sel->first_variant : NULL;
> sctx->ia_multi_vgt_param_key.u.uses_gs = sel != NULL;
> sctx->do_update_shaders = true;
> - si_mark_atom_dirty(sctx, &sctx->clip_regs);
> sctx->last_rast_prim = -1; /* reset this so that it gets updated */
>
> if (enable_changed) {
> si_shader_change_notify(sctx);
> if (sctx->ia_multi_vgt_param_key.u.uses_tess)
> si_update_tess_uses_prim_id(sctx);
> }
> r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx));
> si_set_active_descriptors_for_shader(sctx, sel);
> si_update_streamout_state(sctx);
> + si_update_clip_regs(sctx, old_hw_vs, old_hw_vs_variant,
> + si_get_vs(sctx)->cso, si_get_vs_state(sctx));
> }
>
> static void si_bind_tcs_shader(struct pipe_context *ctx, void *state)
> {
> struct si_context *sctx = (struct si_context *)ctx;
> struct si_shader_selector *sel = state;
> bool enable_changed = !!sctx->tcs_shader.cso != !!sel;
>
> if (sctx->tcs_shader.cso == sel)
> return;
> @@ -2252,41 +2278,44 @@ static void si_bind_tcs_shader(struct pipe_context *ctx, void *state)
>
> if (enable_changed)
> sctx->last_tcs = NULL; /* invalidate derived tess state */
>
> si_set_active_descriptors_for_shader(sctx, sel);
> }
>
> static void si_bind_tes_shader(struct pipe_context *ctx, void *state)
> {
> struct si_context *sctx = (struct si_context *)ctx;
> + struct si_shader_selector *old_hw_vs = si_get_vs(sctx)->cso;
> + struct si_shader *old_hw_vs_variant = si_get_vs_state(sctx);
> struct si_shader_selector *sel = state;
> bool enable_changed = !!sctx->tes_shader.cso != !!sel;
>
> if (sctx->tes_shader.cso == sel)
> return;
>
> sctx->tes_shader.cso = sel;
> sctx->tes_shader.current = sel ? sel->first_variant : NULL;
> sctx->ia_multi_vgt_param_key.u.uses_tess = sel != NULL;
> si_update_tess_uses_prim_id(sctx);
> sctx->do_update_shaders = true;
> - si_mark_atom_dirty(sctx, &sctx->clip_regs);
> sctx->last_rast_prim = -1; /* reset this so that it gets updated */
>
> if (enable_changed) {
> si_shader_change_notify(sctx);
> sctx->last_tes_sh_base = -1; /* invalidate derived tess state */
> }
> r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx));
> si_set_active_descriptors_for_shader(sctx, sel);
> si_update_streamout_state(sctx);
> + si_update_clip_regs(sctx, old_hw_vs, old_hw_vs_variant,
> + si_get_vs(sctx)->cso, si_get_vs_state(sctx));
> }
>
> static void si_bind_ps_shader(struct pipe_context *ctx, void *state)
> {
> struct si_context *sctx = (struct si_context *)ctx;
> struct si_shader_selector *sel = state;
>
> /* skip if supplied shader is one already in use */
> if (sctx->ps_shader.cso == sel)
> return;
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list