Mesa (master): r300g: port over last parts of oq support.

Dave Airlie airlied at kemper.freedesktop.org
Wed Oct 14 07:45:43 UTC 2009


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Oct 14 17:44:19 2009 +1000

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.

---

 src/gallium/drivers/r300/r300_context.h |    2 ++
 src/gallium/drivers/r300/r300_emit.c    |   11 +++++++++--
 src/gallium/drivers/r300/r300_emit.h    |    3 +--
 src/gallium/drivers/r300/r300_flush.c   |    2 ++
 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;
 }
 




More information about the mesa-commit mailing list