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

Marek Olšák maraeo at gmail.com
Wed Apr 13 15:37:30 UTC 2016


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;
-- 
2.5.0



More information about the mesa-dev mailing list