Mesa (master): r300g: don't render if everything is culled by scissoring

Corbin Simpson csimpson at kemper.freedesktop.org
Sun Dec 6 01:18:25 PST 2009


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Sat Dec  5 20:39:11 2009 +0100

r300g: don't render if everything is culled by scissoring

Otherwise a CS is refused by kernel 2.6.31 (and maybe all later
versions, not sure).

---

 src/gallium/drivers/r300/r300_context.h |    3 +++
 src/gallium/drivers/r300/r300_render.c  |   23 +++++++++++++++++++++++
 src/gallium/drivers/r300/r300_state.c   |    3 +++
 3 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 23ea32c..0be1903 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -101,6 +101,9 @@ struct r300_sampler_state {
 struct r300_scissor_regs {
     uint32_t top_left;     /* R300_SC_SCISSORS_TL: 0x43e0 */
     uint32_t bottom_right; /* R300_SC_SCISSORS_BR: 0x43e4 */
+
+    /* Whether everything is culled by scissoring. */
+    boolean empty_area;
 };
 
 struct r300_scissor_state {
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index 4c5fb40..35b335d 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -70,6 +70,12 @@ uint32_t r300_translate_primitive(unsigned prim)
     }
 }
 
+static boolean r300_nothing_to_draw(struct r300_context *r300)
+{
+    return r300->rs_state->rs.scissor &&
+           r300->scissor_state->scissor.empty_area;
+}
+
 static void r300_emit_draw_arrays(struct r300_context *r300,
                                   unsigned mode,
                                   unsigned count)
@@ -173,10 +179,15 @@ boolean r300_draw_range_elements(struct pipe_context* pipe,
         return FALSE;
     }
 
+
     if (count > 65535) {
         return FALSE;
     }
 
+    if (r300_nothing_to_draw(r300)) {
+        return TRUE;
+    }
+
     r300_update_derived_state(r300);
 
     if (!r300_setup_vertex_buffers(r300)) {
@@ -218,6 +229,10 @@ boolean r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
         return FALSE;
     }
 
+    if (r300_nothing_to_draw(r300)) {
+        return TRUE;
+    }
+
     r300_update_derived_state(r300);
 
     if (!r300_setup_vertex_buffers(r300)) {
@@ -251,6 +266,10 @@ boolean r300_swtcl_draw_arrays(struct pipe_context* pipe,
         return FALSE;
     }
 
+    if (r300_nothing_to_draw(r300)) {
+        return TRUE;
+    }
+
     for (i = 0; i < r300->vertex_buffer_count; i++) {
         void* buf = pipe_buffer_map(pipe->screen,
                                     r300->vertex_buffer[i].buffer,
@@ -292,6 +311,10 @@ boolean r300_swtcl_draw_range_elements(struct pipe_context* pipe,
         return FALSE;
     }
 
+    if (r300_nothing_to_draw(r300)) {
+        return TRUE;
+    }
+
     for (i = 0; i < r300->vertex_buffer_count; i++) {
         void* buf = pipe_buffer_map(pipe->screen,
                                     r300->vertex_buffer[i].buffer,
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index d323355..8ef0b3b 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -309,6 +309,9 @@ static void r300_set_scissor_regs(const struct pipe_scissor_state* state,
             (((state->maxx - 1) + 1440) << R300_SCISSORS_X_SHIFT) |
             (((state->maxy - 1) + 1440) << R300_SCISSORS_Y_SHIFT);
     }
+
+    scissor->empty_area = state->minx >= state->maxx ||
+                          state->miny >= state->maxy;
 }
 
 static void



More information about the mesa-commit mailing list