r300-gallium: Make UCP and clip work again for SW TCL.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Tue, 9 Jun 2009 03:01:57 +0000 (20:01 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Tue, 9 Jun 2009 03:01:57 +0000 (20:01 -0700)
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
src/gallium/drivers/r300/r300_emit.c

index 21c0fe2..233a32b 100644 (file)
@@ -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);
index 818880c..8b9fcd7 100644 (file)
@@ -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,