Mesa (master): r300-gallium: Always do VTE, never software viewport.

Corbin Simpson csimpson at kemper.freedesktop.org
Mon May 18 16:52:49 UTC 2009


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

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Mon May 18 09:40:13 2009 -0700

r300-gallium: Always do VTE, never software viewport.

This makes glxgears draw properly with SW TCL.

---

 src/gallium/drivers/r300/r300_context.c |    7 +++++++
 src/gallium/drivers/r300/r300_context.h |   10 ++++++++++
 src/gallium/drivers/r300/r300_emit.c    |    6 +++++-
 src/gallium/drivers/r300/r300_state.c   |    8 +++++---
 4 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
index a1cdea3..21c0fe2 100644
--- a/src/gallium/drivers/r300/r300_context.c
+++ b/src/gallium/drivers/r300/r300_context.c
@@ -145,8 +145,15 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
     r300->context.is_texture_referenced = r300_is_texture_referenced;
     r300->context.is_buffer_referenced = r300_is_buffer_referenced;
 
+    /* Create a Draw. This is used for vert collation and SW TCL. */
     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);
+    /* 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);
 
     r300->blend_color_state = CALLOC_STRUCT(r300_blend_color_state);
     r300->rs_block = CALLOC_STRUCT(r300_rs_block);
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 96f1f11..58f1fa0 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -63,6 +63,11 @@ struct r300_rs_state {
     /* Draw-specific rasterizer state */
     struct pipe_rasterizer_state rs;
 
+    /* Whether or not to enable the VTE. This is referenced at the very
+     * last moment during emission of VTE state, to decide whether or not
+     * the VTE should be used for transformation. */
+    boolean enable_vte;
+
     uint32_t vap_control_status;    /* R300_VAP_CNTL_STATUS: 0x2140 */
     uint32_t point_size;            /* R300_GA_POINT_SIZE: 0x421c */
     uint32_t point_minmax;          /* R300_GA_POINT_MINMAX: 0x4230 */
@@ -255,6 +260,11 @@ struct r300_vertex_shader {
     } instructions[128]; /*< XXX magic number */
 };
 
+static struct pipe_viewport_state r300_viewport_identity = {
+    .scale = {1.0, 1.0, 1.0, 1.0},
+    .translate = {0.0, 0.0, 0.0, 0.0},
+};
+
 struct r300_context {
     /* Parent class */
     struct pipe_context context;
diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
index b7d1cf8..0cb0507 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -429,7 +429,11 @@ void r300_emit_viewport_state(struct r300_context* r300,
     OUT_CS_32F(viewport->zscale);
     OUT_CS_32F(viewport->zoffset);
 
-    OUT_CS_REG(R300_VAP_VTE_CNTL, viewport->vte_control);
+    if (r300->rs_state->enable_vte) {
+        OUT_CS_REG(R300_VAP_VTE_CNTL, viewport->vte_control);
+    } else {
+        OUT_CS_REG(R300_VAP_VTE_CNTL, 0);
+    }
     END_CS;
 }
 
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index e818a77..d7825e0 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -343,6 +343,8 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
     /* Copy rasterizer state for Draw. */
     rs->rs = *state;
 
+    rs->enable_vte = !state->bypass_vs_clip_and_viewport;
+
     /* 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 ||
@@ -557,11 +559,11 @@ static void r300_set_viewport_state(struct pipe_context* pipe,
 {
     struct r300_context* r300 = r300_context(pipe);
 
-    draw_flush(r300->draw);
+    //draw_flush(r300->draw);
 
-    if (r300_screen(r300->context.screen)->caps->has_tcl) {
+    if (TRUE || r300_screen(r300->context.screen)->caps->has_tcl) {
         /* Do the transform in HW. */
-        r300->viewport_state->vte_control = R300_VTX_XY_FMT | R300_VTX_Z_FMT;
+        r300->viewport_state->vte_control = R300_VTX_W0_FMT;
 
         if (state->scale[0] != 1.0f) {
             assert(state->scale[0] != 0.0f);




More information about the mesa-commit mailing list