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

Corbin Simpson csimpson at kemper.freedesktop.org
Wed Mar 18 22:44:49 UTC 2009


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

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Wed Mar 18 15:17:38 2009 -0700

r300-gallium: Emit viewport state.

Note that this will break you, hard, if you're not using RADEON_NO_TCL.
I really need to start vertex shaders soon.

---

 src/gallium/drivers/r300/r300_context.h         |   13 +++++++------
 src/gallium/drivers/r300/r300_emit.c            |   23 +++++++++++++++++++++++
 src/gallium/drivers/r300/r300_state.c           |   22 ++++++++++++++++++++--
 src/gallium/drivers/r300/r300_state_invariant.c |    2 +-
 4 files changed, 51 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 5431cf2..0e5e471 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -103,12 +103,13 @@ struct r300_texture_state {
 };
 
 struct r300_viewport_state {
-    float xscale;  /* R300_VAP_VPORT_XSCALE:  0x2098 */
-    float xoffset; /* R300_VAP_VPORT_XOFFSET: 0x209c */
-    float yscale;  /* R300_VAP_VPORT_YSCALE:  0x20a0 */
-    float yoffset; /* R300_VAP_VPORT_YOFFSET: 0x20a4 */
-    float zscale;  /* R300_VAP_VPORT_ZSCALE:  0x20a8 */
-    float zoffset; /* R300_VAP_VPORT_ZOFFSET: 0x20ac */
+    float xscale;         /* R300_VAP_VPORT_XSCALE:  0x2098 */
+    float xoffset;        /* R300_VAP_VPORT_XOFFSET: 0x209c */
+    float yscale;         /* R300_VAP_VPORT_YSCALE:  0x20a0 */
+    float yoffset;        /* R300_VAP_VPORT_YOFFSET: 0x20a4 */
+    float zscale;         /* R300_VAP_VPORT_ZSCALE:  0x20a8 */
+    float zoffset;        /* R300_VAP_VPORT_ZOFFSET: 0x20ac */
+    uint32_t vte_control; /* R300_VAP_VTE_CNTL:      0x20b0 */
 };
 
 #define R300_NEW_BLEND           0x0000001
diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
index 7bd3420..a2e771b 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -340,6 +340,24 @@ void r300_emit_vertex_format_state(struct r300_context* r300)
     END_CS;
 }
 
+void r300_emit_viewport_state(struct r300_context* r300,
+                              struct r300_viewport_state* viewport)
+{
+    return;
+    CS_LOCALS(r300);
+
+    BEGIN_CS(7);
+    OUT_CS_REG_SEQ(R300_SE_VPORT_XSCALE, 7);
+    OUT_CS_32F(viewport->xscale);
+    OUT_CS_32F(viewport->xoffset);
+    OUT_CS_32F(viewport->yscale);
+    OUT_CS_32F(viewport->yoffset);
+    OUT_CS_32F(viewport->zscale);
+    OUT_CS_32F(viewport->zoffset);
+    OUT_CS(viewport->vte_control);
+    END_CS;
+}
+
 static void r300_flush_textures(struct r300_context* r300)
 {
     CS_LOCALS(r300);
@@ -431,6 +449,11 @@ void r300_emit_dirty_state(struct r300_context* r300)
         }
     }
 
+    if (r300->dirty_state & R300_NEW_VIEWPORT) {
+        r300_emit_viewport_state(r300, r300->viewport_state);
+        r300->dirty_state &= ~R300_NEW_VIEWPORT;
+    }
+
     if (dirty_tex) {
         r300_flush_textures(r300);
     }
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 04cbf71..58bce22 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -529,8 +529,26 @@ static void r300_set_viewport_state(struct pipe_context* pipe,
                                     const struct pipe_viewport_state* state)
 {
     struct r300_context* r300 = r300_context(pipe);
-    /* XXX handing this off to Draw for now */
-    draw_set_viewport_state(r300->draw, state);
+
+    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;
+    } else {
+        /* Have Draw do the actual transform. */
+        draw_set_viewport_state(r300->draw, state);
+    }
 }
 
 static void r300_set_vertex_buffers(struct pipe_context* pipe,
diff --git a/src/gallium/drivers/r300/r300_state_invariant.c b/src/gallium/drivers/r300/r300_state_invariant.c
index e584bfb..3d51a8e 100644
--- a/src/gallium/drivers/r300/r300_state_invariant.c
+++ b/src/gallium/drivers/r300/r300_state_invariant.c
@@ -78,7 +78,7 @@ void r300_emit_invariant_state(struct r300_context* r300)
     END_CS;
 
     /* XXX unsorted stuff from surface_fill */
-    BEGIN_CS(99 + (caps->has_tcl ? 28 : 0));
+    BEGIN_CS(99 + (caps->has_tcl ? 26 : 0));
     /* Flush PVS. */
     OUT_CS_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0x0);
 




More information about the mesa-commit mailing list