[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