nv30: fix viewport clipping settings to be based on viewport, not rt
authorIlia Mirkin <imirkin@alum.mit.edu>
Wed, 22 Jun 2016 02:51:36 +0000 (22:51 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Fri, 1 Jul 2016 04:02:23 +0000 (00:02 -0400)
This fixes a ton of "*clip*" dEQP GLES2 tests, as well as
triangle-guardband-viewport in piglit.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/nv30/nv30_draw.c
src/gallium/drivers/nouveau/nv30/nv30_state_validate.c

index 7b0d0745766332a4461492100dc43f050d47c87e..041c73ca72aa934b9a24ffa9c9a523abcbc04510 100644 (file)
@@ -342,19 +342,6 @@ nv30_render_validate(struct nv30_context *nv30)
    for (; i < 16; i++)
       r->vtxfmt[i]  = NV30_3D_VTXFMT_TYPE_V32_FLOAT;
 
-   BEGIN_NV04(push, NV30_3D(VIEWPORT_TRANSLATE_X), 8);
-   PUSH_DATAf(push, 0.0);
-   PUSH_DATAf(push, 0.0);
-   PUSH_DATAf(push, 0.0);
-   PUSH_DATAf(push, 0.0);
-   PUSH_DATAf(push, 1.0);
-   PUSH_DATAf(push, 1.0);
-   PUSH_DATAf(push, 1.0);
-   PUSH_DATAf(push, 1.0);
-   BEGIN_NV04(push, NV30_3D(DEPTH_RANGE_NEAR), 2);
-   PUSH_DATAf(push, 0.0);
-   PUSH_DATAf(push, 1.0);
-
    BEGIN_NV04(push, NV30_3D(VTXFMT(0)), 16);
    PUSH_DATAp(push, r->vtxfmt, 16);
 
index 8957634f0fae512218e50cd1130cf2532ba09f9e..6f54ca0fd709f4438cc60c7d00b6f34d984a8142 100644 (file)
@@ -107,9 +107,6 @@ nv30_validate_fb(struct nv30_context *nv30)
    PUSH_DATA (push, w << 16);
    PUSH_DATA (push, h << 16);
    PUSH_DATA (push, rt_format);
-   BEGIN_NV04(push, NV30_3D(VIEWPORT_HORIZ), 2);
-   PUSH_DATA (push, w << 16);
-   PUSH_DATA (push, h << 16);
    BEGIN_NV04(push, NV30_3D(VIEWPORT_TX_ORIGIN), 4);
    PUSH_DATA (push, (y << 16) | x);
    PUSH_DATA (push, 0);
@@ -250,6 +247,11 @@ nv30_validate_viewport(struct nv30_context *nv30)
    struct nouveau_pushbuf *push = nv30->base.pushbuf;
    struct pipe_viewport_state *vp = &nv30->viewport;
 
+   unsigned x = CLAMP(vp->translate[0] - fabsf(vp->scale[0]), 0, 4095);
+   unsigned y = CLAMP(vp->translate[1] - fabsf(vp->scale[1]), 0, 4095);
+   unsigned w = CLAMP(2.0f * fabsf(vp->scale[0]), 0, 4096);
+   unsigned h = CLAMP(2.0f * fabsf(vp->scale[1]), 0, 4096);
+
    BEGIN_NV04(push, NV30_3D(VIEWPORT_TRANSLATE_X), 8);
    PUSH_DATAf(push, vp->translate[0]);
    PUSH_DATAf(push, vp->translate[1]);
@@ -258,10 +260,14 @@ nv30_validate_viewport(struct nv30_context *nv30)
    PUSH_DATAf(push, vp->scale[0]);
    PUSH_DATAf(push, vp->scale[1]);
    PUSH_DATAf(push, vp->scale[2]);
-   PUSH_DATAf(push, 1.0f);
+   PUSH_DATAf(push, 0.0f);
    BEGIN_NV04(push, NV30_3D(DEPTH_RANGE_NEAR), 2);
    PUSH_DATAf(push, vp->translate[2] - fabsf(vp->scale[2]));
    PUSH_DATAf(push, vp->translate[2] + fabsf(vp->scale[2]));
+
+   BEGIN_NV04(push, NV30_3D(VIEWPORT_HORIZ), 2);
+   PUSH_DATA (push, (w << 16) | x);
+   PUSH_DATA (push, (h << 16) | y);
 }
 
 static void
@@ -419,6 +425,7 @@ static struct state_validate swtnl_validate_list[] = {
     { nv30_validate_stencil_ref,   NV30_NEW_STENCIL_REF },
     { nv30_validate_stipple,       NV30_NEW_STIPPLE },
     { nv30_validate_scissor,       NV30_NEW_SCISSOR | NV30_NEW_RASTERIZER },
+    { nv30_validate_viewport,      NV30_NEW_VIEWPORT },
     { nv30_fragprog_validate,      NV30_NEW_FRAGPROG | NV30_NEW_FRAGCONST },
     { nv30_validate_fragment,      NV30_NEW_FRAMEBUFFER | NV30_NEW_FRAGPROG },
     { nv30_fragtex_validate,       NV30_NEW_FRAGTEX },