[PATCH 2/8] nv50: fix viewport transform

Christoph Bumiller e0425955 at student.tuwien.ac.at
Tue Jul 28 16:21:41 PDT 2009


The translation also needs to be inverted, and in bypass mode
the state tracker incorrectly assumes that Y = 0 = TOP, so we
need inversion there to; NDC clipping has to be deactivated
explicitly.
---
 src/gallium/drivers/nv50/nv50_state_validate.c |   31 +++++++++++++++--------
 1 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_state_validate.c b/src/gallium/drivers/nv50/nv50_state_validate.c
index 03aed81..ce8e44f 100644
--- a/src/gallium/drivers/nv50/nv50_state_validate.c
+++ b/src/gallium/drivers/nv50/nv50_state_validate.c
@@ -258,6 +258,7 @@ scissor_uptodate:
 
 	if (nv50->dirty & (NV50_NEW_VIEWPORT | NV50_NEW_RASTERIZER)) {
 		unsigned bypass;
+		float y_translate = (float)nv50->framebuffer.height;
 
 		if (!nv50->rasterizer->pipe.bypass_vs_clip_and_viewport)
 			bypass = 0;
@@ -271,25 +272,33 @@ scissor_uptodate:
 		nv50->state.viewport_bypass = bypass;
 
 		so = so_new(12, 0);
+		so_method(so, tesla, NV50TCL_VIEW_VOLUME_CLIP_CTRL, 1);
 		if (!bypass) {
-			so_method(so, tesla, NV50TCL_VIEWPORT_UNK1(0), 3);
+			so_data(so, 0x0000);
+			y_translate -= nv50->viewport.translate[1];
+			so_method(so, tesla, NV50TCL_VIEWPORT_TRANSLATE(0), 3);
 			so_data  (so, fui(nv50->viewport.translate[0]));
-			so_data  (so, fui(nv50->viewport.translate[1]));
+			so_data  (so, fui(y_translate));
 			so_data  (so, fui(nv50->viewport.translate[2]));
-			so_method(so, tesla, NV50TCL_VIEWPORT_UNK0(0), 3);
+			so_method(so, tesla, NV50TCL_VIEWPORT_SCALE(0), 3);
 			so_data  (so, fui(nv50->viewport.scale[0]));
 			so_data  (so, fui(-nv50->viewport.scale[1]));
 			so_data  (so, fui(nv50->viewport.scale[2]));
-			so_method(so, tesla, 0x192c, 1);
-			so_data  (so, 1);
-			so_method(so, tesla, 0x0f90, 1);
-			so_data  (so, 0);
 		} else {
-			so_method(so, tesla, 0x192c, 1);
-			so_data  (so, 0);
-			so_method(so, tesla, 0x0f90, 1);
-			so_data  (so, 1);
+			/* don't do xy-clipping in NDC space */
+			so_data(so, 0x0800);
+			/* in bypass mode, y = 0 would be bottom */
+			so_method(so, tesla, NV50TCL_VIEWPORT_TRANSLATE(0), 3);
+			so_data  (so, fui(0.0f));
+			so_data  (so, fui(y_translate));
+			so_data  (so, fui(0.0f));
+			so_method(so, tesla, NV50TCL_VIEWPORT_SCALE(0), 3);
+			so_data  (so, fui(1.0f));
+			so_data  (so, fui(-1.0f));
+			so_data  (so, fui(1.0f));
 		}
+		so_method(so, tesla, NV50TCL_VIEWPORT_TRANSFORM_EN, 1);
+		so_data  (so, 1);
 
 		so_ref(so, &nv50->state.viewport);
 		so_ref(NULL, &so);
-- 
1.6.3.3


--------------030109060900080900080804
Content-Type: text/plain;
 name="0003-nv50-fix-sx-dx-typo-in-transfer_rect_m2mf.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename*0="0003-nv50-fix-sx-dx-typo-in-transfer_rect_m2mf.patch"



More information about the Nouveau mailing list