Mesa (master): r300-gallium: Make UCP and clip work again for SW TCL.

Corbin Simpson csimpson at kemper.freedesktop.org
Tue Jun 9 03:03:53 UTC 2009


Module: Mesa
Branch: master
Commit: cb3b91f2d633ded4fb3e0c595a2c34ee139e9b10
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cb3b91f2d633ded4fb3e0c595a2c34ee139e9b10

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Mon Jun  8 20:01:57 2009 -0700

r300-gallium: Make UCP and clip work again for SW TCL.

SW TCL: tri-clip works, tri-userclip works
HW TCL: tri-clip fails, tri-userclip works

That is a 200% improvement over the previous situation. Woot.

---

 src/gallium/drivers/r300/r300_context.c |    4 +-
 src/gallium/drivers/r300/r300_emit.c    |   36 ++++++++++++++++--------------
 2 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
index 21c0fe2..233a32b 100644
--- a/src/gallium/drivers/r300/r300_context.c
+++ b/src/gallium/drivers/r300/r300_context.c
@@ -149,8 +149,8 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
     r300->draw = draw_create();
     /* Enable our renderer. */
     draw_set_rasterize_stage(r300->draw, r300_draw_stage(r300));
-    /* Tell Draw that we can always do non-UCP clipping. */
-    draw_set_driver_clipping(r300->draw, TRUE);
+    /* Disable Draw's clipping if TCL is present. */
+    draw_set_driver_clipping(r300->draw, r300_screen(screen)->caps->has_tcl);
     /* Force Draw to never do viewport transform, since (again) we can do
      * transform in hardware, always. */
     draw_set_viewport_state(r300->draw, &r300_viewport_identity);
diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
index 818880c..8b9fcd7 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -63,25 +63,27 @@ void r300_emit_clip_state(struct r300_context* r300,
     struct r300_screen* r300screen = r300_screen(r300->context.screen);
     CS_LOCALS(r300);
 
-    if (!r300screen->caps->has_tcl) {
-        return;
-    }
-
-    BEGIN_CS(5 + (6 * 4));
-    OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG,
-            (r300screen->caps->is_r500 ?
-             R500_PVS_UCP_START : R300_PVS_UCP_START));
-    OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, 6 * 4);
-    for (i = 0; i < 6; i++) {
-        OUT_CS_32F(clip->ucp[i][0]);
-        OUT_CS_32F(clip->ucp[i][1]);
-        OUT_CS_32F(clip->ucp[i][2]);
-        OUT_CS_32F(clip->ucp[i][3]);
+    if (r300screen->caps->has_tcl) {
+        BEGIN_CS(5 + (6 * 4));
+        OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG,
+                (r300screen->caps->is_r500 ?
+                 R500_PVS_UCP_START : R300_PVS_UCP_START));
+        OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, 6 * 4);
+        for (i = 0; i < 6; i++) {
+            OUT_CS_32F(clip->ucp[i][0]);
+            OUT_CS_32F(clip->ucp[i][1]);
+            OUT_CS_32F(clip->ucp[i][2]);
+            OUT_CS_32F(clip->ucp[i][3]);
+        }
+        OUT_CS_REG(R300_VAP_CLIP_CNTL, ((1 << clip->nr) - 1) |
+                R300_PS_UCP_MODE_CLIP_AS_TRIFAN);
+        END_CS;
+    } else {
+        BEGIN_CS(2);
+        OUT_CS_REG(R300_VAP_CLIP_CNTL, R300_CLIP_DISABLE);
+        END_CS;
     }
 
-    OUT_CS_REG(R300_VAP_CLIP_CNTL, ((1 << clip->nr) - 1) |
-            R300_PS_UCP_MODE_CLIP_AS_TRIFAN);
-    END_CS;
 }
 
 void r300_emit_dsa_state(struct r300_context* r300,




More information about the mesa-commit mailing list