From c1a2fe7fd1ce7e58517a00c3031d786e8b9849f8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 13 Apr 2016 17:28:30 +0200 Subject: [PATCH] gallium/radeon: handle vertex shaders that disable clipping & viewport MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Nicolai Hähnle --- 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; -- 2.7.4