diff options
author | Dave Airlie <airlied@redhat.com> | 2009-10-14 17:44:19 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-10-14 17:44:19 +1000 |
commit | 51d1cf55da6f8b8a215814589a189b6e5e537fe5 (patch) | |
tree | 07d2b29ece39155fe8b8401fbdc1e9e0f800b81b | |
parent | 47791697ab6eb6965f0ba8ba3f20373b3753ca2a (diff) | |
download | external_mesa3d-51d1cf55da6f8b8a215814589a189b6e5e537fe5.zip external_mesa3d-51d1cf55da6f8b8a215814589a189b6e5e537fe5.tar.gz external_mesa3d-51d1cf55da6f8b8a215814589a189b6e5e537fe5.tar.bz2 |
r300g: port over last parts of oq support.
Add support for begin/end in each CS so we don't get any other
processes rendering in between.
TODO:
blame other parts of driver for this not working like Z.
-rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_emit.c | 11 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_emit.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_flush.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_query.c | 7 |
5 files changed, 16 insertions, 9 deletions
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index 3a01869..7826ed1 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -175,6 +175,8 @@ struct r300_query { unsigned offset; /* if we've flushed the query */ boolean flushed; + /* if begin has been emitted */ + boolean begin_emitted; /* Linked list members. */ struct r300_query* prev; struct r300_query* next; diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index babbe0d..6e616cd 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -340,6 +340,7 @@ void r300_emit_query_start(struct r300_context *r300) } OUT_CS_REG(R300_ZB_ZPASS_DATA, 0); END_CS; + query->begin_emitted = TRUE; } @@ -429,10 +430,16 @@ static void rv530_emit_query_double(struct r300_context *r300, END_CS; } -void r300_emit_query_end(struct r300_context* r300, - struct r300_query* query) +void r300_emit_query_end(struct r300_context* r300) { struct r300_capabilities *caps = r300_screen(r300->context.screen)->caps; + struct r300_query *query = r300->query_current; + + if (!query) + return; + + if (query->begin_emitted == FALSE) + return; if (!r300->winsys->add_buffer(r300->winsys, r300->oqbo, 0, RADEON_GEM_DOMAIN_GTT)) { diff --git a/src/gallium/drivers/r300/r300_emit.h b/src/gallium/drivers/r300/r300_emit.h index c4002b8..b62aa9f 100644 --- a/src/gallium/drivers/r300/r300_emit.h +++ b/src/gallium/drivers/r300/r300_emit.h @@ -58,8 +58,7 @@ void r300_emit_fb_state(struct r300_context* r300, void r300_emit_query_begin(struct r300_context* r300, struct r300_query* query); -void r300_emit_query_end(struct r300_context* r300, - struct r300_query* query); +void r300_emit_query_end(struct r300_context* r300); void r300_emit_rs_state(struct r300_context* r300, struct r300_rs_state* rs); diff --git a/src/gallium/drivers/r300/r300_flush.c b/src/gallium/drivers/r300/r300_flush.c index a8ab0d7..241ea71 100644 --- a/src/gallium/drivers/r300/r300_flush.c +++ b/src/gallium/drivers/r300/r300_flush.c @@ -36,6 +36,8 @@ static void r300_flush(struct pipe_context* pipe, draw_flush(r300->draw); } + r300_emit_query_end(r300); + if (r300->dirty_hw) { FLUSH_CS; r300_emit_invariant_state(r300); diff --git a/src/gallium/drivers/r300/r300_query.c b/src/gallium/drivers/r300/r300_query.c index fb4340f..2b0fbfb 100644 --- a/src/gallium/drivers/r300/r300_query.c +++ b/src/gallium/drivers/r300/r300_query.c @@ -88,14 +88,11 @@ static void r300_begin_query(struct pipe_context* pipe, } static void r300_end_query(struct pipe_context* pipe, - struct pipe_query* query) + struct pipe_query* query) { struct r300_context* r300 = r300_context(pipe); - struct r300_query* q = (struct r300_query*)query; - - r300_emit_dirty_state(r300); - r300_emit_query_end(r300, q); + r300_emit_query_end(r300); r300->query_current = NULL; } |