Mesa (master): r300g: don't render if everything is culled by scissoring
Corbin Simpson
csimpson at kemper.freedesktop.org
Sun Dec 6 09:18:25 UTC 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