Mesa (master): r300-gallium: Use viewport state.

Corbin Simpson csimpson at kemper.freedesktop.org
Wed Apr 15 22:36:44 UTC 2009


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

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Wed Apr 15 15:09:43 2009 -0700

r300-gallium: Use viewport state.

---

 src/gallium/drivers/r300/r300_state.c |   42 ++++++++++++++++++++++----------
 1 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 2a77fd1..c9507ae 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -555,25 +555,41 @@ static void r300_set_viewport_state(struct pipe_context* pipe,
 {
     struct r300_context* r300 = r300_context(pipe);
 
-    r300->viewport_state->xscale = state->scale[0];
-    r300->viewport_state->yscale = state->scale[1];
-    r300->viewport_state->zscale = state->scale[2];
-
-    r300->viewport_state->xoffset = state->translate[0];
-    r300->viewport_state->yoffset = state->translate[1];
-    r300->viewport_state->zoffset = state->translate[2];
-
-    r300->viewport_state->vte_control = 0;
     if (r300_screen(r300->context.screen)->caps->has_tcl) {
         /* Do the transform in HW. */
-        r300->viewport_state->vte_control |=
-            R300_VPORT_X_SCALE_ENA | R300_VPORT_X_OFFSET_ENA |
-            R300_VPORT_Y_SCALE_ENA | R300_VPORT_Y_OFFSET_ENA |
-            R300_VPORT_Z_SCALE_ENA | R300_VPORT_Z_OFFSET_ENA;
+        r300->viewport_state->vte_control = R300_VTX_W0_FMT;
+
+        if (state->scale[0] != 1.0f) {
+            r300->viewport_state->xscale = state->scale[0];
+            r300->viewport_state->vte_control |= R300_VPORT_X_SCALE_ENA;
+        }
+        if (state->scale[1] != 1.0f) {
+            r300->viewport_state->yscale = state->scale[1];
+            r300->viewport_state->vte_control |= R300_VPORT_Y_SCALE_ENA;
+        }
+        if (state->scale[2] != 1.0f) {
+            r300->viewport_state->zscale = state->scale[2];
+            r300->viewport_state->vte_control |= R300_VPORT_Z_SCALE_ENA;
+        }
+        if (state->translate[0] != 0.0f) {
+            r300->viewport_state->xoffset = state->translate[0];
+            r300->viewport_state->vte_control |= R300_VPORT_X_OFFSET_ENA;
+        }
+        if (state->translate[1] != 0.0f) {
+            r300->viewport_state->yoffset = state->translate[1];
+            r300->viewport_state->vte_control |= R300_VPORT_Y_OFFSET_ENA;
+        }
+        if (state->translate[2] != 0.0f) {
+            r300->viewport_state->zoffset = state->translate[2];
+            r300->viewport_state->vte_control |= R300_VPORT_Z_OFFSET_ENA;
+        }
     } else {
+        r300->viewport_state->vte_control = 0;
         /* Have Draw do the actual transform. */
         draw_set_viewport_state(r300->draw, state);
     }
+
+    r300->dirty_state |= R300_NEW_VIEWPORT;
 }
 
 static void r300_set_vertex_buffers(struct pipe_context* pipe,




More information about the mesa-commit mailing list