Mesa (master): r300-gallium: Properly setup HW/SW TCL controls.

Corbin Simpson csimpson at kemper.freedesktop.org
Tue Apr 7 06:20:18 UTC 2009


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

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Mon Apr  6 23:17:33 2009 -0700

r300-gallium: Properly setup HW/SW TCL controls.

This keeps non-TCL chipsets from locking up, and also fully unbreaks
RADEON_NO_TCL rendering.

---

 src/gallium/drivers/r300/r300_state.c   |   21 ++++++++++-----------
 src/gallium/drivers/r300/r300_surface.c |    3 ++-
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 095df04..2a77fd1 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -338,11 +338,17 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
 {
     struct r300_rs_state* rs = CALLOC_STRUCT(r300_rs_state);
 
-    /* XXX endian control */
-    if (r300_screen(pipe->screen)->caps->has_tcl) {
-        rs->vap_control_status = 0;
-    } else {
+    /* Copy rasterizer state for Draw. */
+    rs->rs = *state;
+
+    /* If bypassing TCL, or if no TCL engine is present, turn off the HW TCL.
+     * Else, enable HW TCL and force Draw's TCL off. */
+    if (state->bypass_vs_clip_and_viewport ||
+            !r300_screen(pipe->screen)->caps->has_tcl) {
         rs->vap_control_status = R300_VAP_TCL_BYPASS;
+    } else {
+        rs->rs.bypass_vs_clip_and_viewport = TRUE;
+        rs->vap_control_status = 0;
     }
 
     rs->point_size = pack_float_16_6x(state->point_size) |
@@ -406,13 +412,6 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
         rs->color_control = R300_SHADE_MODEL_SMOOTH;
     }
 
-    rs->rs = *state;
-
-    /* If using HW TCL, tell Draw to not do its magic. */
-    if (r300_screen(pipe->screen)->caps->has_tcl) {
-        rs->rs.bypass_vs_clip_and_viewport = TRUE;
-    }
-
     return (void*)rs;
 }
 
diff --git a/src/gallium/drivers/r300/r300_surface.c b/src/gallium/drivers/r300/r300_surface.c
index dc4b29e..6bc3995 100644
--- a/src/gallium/drivers/r300/r300_surface.c
+++ b/src/gallium/drivers/r300/r300_surface.c
@@ -109,7 +109,8 @@ static void r300_surface_fill(struct pipe_context* pipe,
     if (caps->has_tcl) {
         r300_emit_vertex_shader(r300, &r300_passthrough_vertex_shader);
     } else {
-        BEGIN_CS(2);
+        BEGIN_CS(4);
+        OUT_CS_REG(R300_VAP_CNTL_STATUS, R300_VAP_TCL_BYPASS);
         OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(5) |
                 R300_PVS_NUM_CNTLRS(5) |
                 R300_PVS_NUM_FPUS(caps->num_vert_fpus) |




More information about the mesa-commit mailing list