[Mesa-dev] [PATCH] gallium/radeon: handle vertex shaders that disable clipping & viewport

Axel Davy axel.davy at ens.fr
Fri Apr 15 22:07:40 UTC 2016


The patch seems unneeded, as a lot of nine apps with the disabled 
clipping behaviour are working fine.

It seems the bug is with the scissor bound computation:
for power of two RT, nine is removing a small offset to the viewport for 
radeon to workaround a raterizer
precision bug.

The scissor computation does convert to lowest (float->int), and for 
example an 1x1 RT gets a 0x0 scissor.
Thus the bug is the scissor computation

On 13/04/2016 17:37, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> This should fix Nine.
> ---
>   src/gallium/drivers/radeon/r600_pipe_common.h |  1 +
>   src/gallium/drivers/radeon/r600_viewport.c    | 20 +++++++++++++++++++-
>   2 files changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
> index a6abe09..b23a780 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.h
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.h
> @@ -455,6 +455,7 @@ struct r600_common_context {
>   	struct r600_viewports		viewports;
>   	bool				scissor_enabled;
>   	bool				vs_writes_viewport_index;
> +	bool				vs_disables_clipping_viewport;
>   
>   	/* Additional context states. */
>   	unsigned flags; /* flush flags */
> diff --git a/src/gallium/drivers/radeon/r600_viewport.c b/src/gallium/drivers/radeon/r600_viewport.c
> index ea558cd..980c5ef 100644
> --- a/src/gallium/drivers/radeon/r600_viewport.c
> +++ b/src/gallium/drivers/radeon/r600_viewport.c
> @@ -130,7 +130,12 @@ static void r600_emit_one_scissor(struct r600_common_context *rctx,
>   {
>   	struct pipe_scissor_state final;
>   
> -	r600_clamp_scissor(rctx, &final, vp_scissor);
> +	if (rctx->vs_disables_clipping_viewport) {
> +		final.minx = final.miny = 0;
> +		final.maxx = final.maxy = GET_MAX_SCISSOR(rctx);
> +	} else {
> +		r600_clamp_scissor(rctx, &final, vp_scissor);
> +	}
>   
>   	if (scissor)
>   		r600_clip_scissor(&final, scissor);
> @@ -324,9 +329,22 @@ void r600_set_scissor_enable(struct r600_common_context *rctx, bool enable)
>   void r600_update_vs_writes_viewport_index(struct r600_common_context *rctx,
>   					  struct tgsi_shader_info *info)
>   {
> +	bool vs_window_space;
> +
>   	if (!info)
>   		return;
>   
> +	/* When the VS disables clipping and viewport transformation. */
> +	vs_window_space =
> +		info->properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION];
> +
> +	if (rctx->vs_disables_clipping_viewport != vs_window_space) {
> +		rctx->vs_disables_clipping_viewport = vs_window_space;
> +		rctx->scissors.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1;
> +		rctx->set_atom_dirty(rctx, &rctx->scissors.atom, true);
> +	}
> +
> +	/* Viewport index handling. */
>   	rctx->vs_writes_viewport_index = info->writes_viewport_index;
>   	if (!rctx->vs_writes_viewport_index)
>   		return;



More information about the mesa-dev mailing list