[Mesa-dev] [PATCH] gallium/radeon: handle vertex shaders that disable clipping & viewport
Nicolai Hähnle
nhaehnle at gmail.com
Thu Apr 14 17:30:18 UTC 2016
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
On 13.04.2016 10: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