[Mesa-stable] [PATCH 1/4] radeonsi: fix primitive ID in fragment shader when using tessellation

Andres Gomez agomez at igalia.com
Wed May 10 00:02:30 UTC 2017


Nicolai, patches 1, 2 and 3 are just tagged with:

Cc: mesa-stable at lists.freedesktop.org

However, patches 1 and 2 depend on 5f99c490089 and 9fd9a7d0ba3,
respectively, that didn't make it for the 17.0 branch.

Maybe you were just intending to nominate this series for the 17.1
branch only?

Notice that the patch 3 applies cleanly on top of 17.0 but I wonder
whether it is OK to land it alone.

Please, let me know what do you think.


On Wed, 2017-05-03 at 15:58 +0200, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
> 
> In a VS->TCS->TES->PS pipeline, the primitive ID is read from TES exports,
> so it is as if TES were using the primitive ID.
> 
> Specifically, this fixes a bug where the primitive ID is not reset at
> the start of a new instance.
> 
> Cc: mesa-stable at lists.freedesktop.org
> ---
>  src/gallium/drivers/radeonsi/si_state_shaders.c | 27 ++++++++++++++++---------
>  1 file changed, 17 insertions(+), 10 deletions(-)
> 
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index e479422..d756f30 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -2132,50 +2132,55 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *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));
>  }
>  
> +static void si_update_tcs_tes_uses_prim_id(struct si_context *sctx)
> +{
> +	sctx->ia_multi_vgt_param_key.u.tcs_tes_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->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 *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)
> +	if (enable_changed) {
>  		si_shader_change_notify(sctx);
> +		if (sctx->ia_multi_vgt_param_key.u.uses_tess)
> +			si_update_tcs_tes_uses_prim_id(sctx);
> +	}
>  	r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx));
>  }
>  
> -static void si_update_tcs_tes_uses_prim_id(struct si_context *sctx)
> -{
> -	sctx->ia_multi_vgt_param_key.u.tcs_tes_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);
> -}
> -
>  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;
>  
>  	sctx->tcs_shader.cso = sel;
> @@ -2216,20 +2221,22 @@ 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;
>  
>  	sctx->ps_shader.cso = sel;
>  	sctx->ps_shader.current = sel ? sel->first_variant : NULL;
>  	sctx->do_update_shaders = true;
> +	if (sel && sctx->ia_multi_vgt_param_key.u.uses_tess)
> +		si_update_tcs_tes_uses_prim_id(sctx);
>  	si_mark_atom_dirty(sctx, &sctx->cb_render_state);
>  }
>  
>  static void si_delete_shader(struct si_context *sctx, struct si_shader *shader)
>  {
>  	if (shader->is_optimized) {
>  		util_queue_fence_wait(&shader->optimized_ready);
>  		util_queue_fence_destroy(&shader->optimized_ready);
>  	}
>  
-- 
Br,

Andres


More information about the mesa-stable mailing list