[Mesa-dev] [PATCH 63/84] st/nine: Avoid flushing the queue for queries GetData

Axel Davy axel.davy at ens.fr
Wed Dec 7 22:55:36 UTC 2016


Use the newly introduced counter to know when we don't
need synchronization.

Signed-off-by: Axel Davy <axel.davy at ens.fr>
---
 src/gallium/state_trackers/nine/nine_state.c | 33 +++++++++++++++++++---------
 src/gallium/state_trackers/nine/nine_state.h |  6 ++---
 src/gallium/state_trackers/nine/query9.c     | 12 +++++-----
 src/gallium/state_trackers/nine/query9.h     |  1 +
 4 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c
index 265fde8..75ebcf3 100644
--- a/src/gallium/state_trackers/nine/nine_state.c
+++ b/src/gallium/state_trackers/nine/nine_state.c
@@ -2716,16 +2716,16 @@ CSMT_ITEM_DO_WAIT(nine_context_destroy_query,
     context->pipe->destroy_query(context->pipe, query);
 }
 
-CSMT_ITEM_NO_WAIT(nine_context_begin_query,
-                  ARG_REF(struct pipe_query, query))
+CSMT_ITEM_NO_WAIT_WITH_COUNTER(nine_context_begin_query,
+                               ARG_REF(struct pipe_query, query))
 {
     struct nine_context *context = &device->context;
 
     (void) context->pipe->begin_query(context->pipe, query);
 }
 
-CSMT_ITEM_NO_WAIT(nine_context_end_query,
-                  ARG_REF(struct pipe_query, query))
+CSMT_ITEM_NO_WAIT_WITH_COUNTER(nine_context_end_query,
+                               ARG_REF(struct pipe_query, query))
 {
     struct nine_context *context = &device->context;
 
@@ -2734,15 +2734,28 @@ CSMT_ITEM_NO_WAIT(nine_context_end_query,
 
 boolean
 nine_context_get_query_result(struct NineDevice9 *device, struct pipe_query *query,
-                              boolean flush, boolean wait,
+                              unsigned *counter, boolean flush, boolean wait,
                               union pipe_query_result *result)
 {
-    struct nine_context *context = &device->context;
+    struct pipe_context *pipe;
+    boolean ret;
 
-    (void) flush;
-    if (device->csmt_active)
-        nine_csmt_process(device);
-    return context->pipe->get_query_result(context->pipe, query, wait, result);
+    if (wait) {
+        if (device->csmt_active)
+            nine_csmt_process(device);
+    } else if (p_atomic_read(counter) > 0) {
+        if (flush && device->csmt_active)
+            nine_queue_flush(device->csmt_ctx->pool);
+        DBG("Pending begin/end. Returning\n");
+        return false;
+    }
+
+    pipe = nine_context_get_pipe_acquire(device);
+    ret = pipe->get_query_result(pipe, query, wait, result);
+    nine_context_get_pipe_release(device);
+
+    DBG("Query result %s\n", ret ? "found" : "not yet available");
+    return ret;
 }
 
 /* State defaults */
diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h
index 421f8f9..6578be3 100644
--- a/src/gallium/state_trackers/nine/nine_state.h
+++ b/src/gallium/state_trackers/nine/nine_state.h
@@ -546,14 +546,14 @@ void
 nine_context_destroy_query(struct NineDevice9 *device, struct pipe_query *query);
 
 void
-nine_context_begin_query(struct NineDevice9 *device, struct pipe_query *query);
+nine_context_begin_query(struct NineDevice9 *device, unsigned *counter, struct pipe_query *query);
 
 void
-nine_context_end_query(struct NineDevice9 *device, struct pipe_query *query);
+nine_context_end_query(struct NineDevice9 *device, unsigned *counter, struct pipe_query *query);
 
 boolean
 nine_context_get_query_result(struct NineDevice9 *device, struct pipe_query *query,
-                              boolean flush, boolean wait,
+                              unsigned *counter, boolean flush, boolean wait,
                               union pipe_query_result *result);
 
 void nine_state_restore_non_cso(struct NineDevice9 *device);
diff --git a/src/gallium/state_trackers/nine/query9.c b/src/gallium/state_trackers/nine/query9.c
index 6bba4a7..d98db9e 100644
--- a/src/gallium/state_trackers/nine/query9.c
+++ b/src/gallium/state_trackers/nine/query9.c
@@ -139,7 +139,7 @@ NineQuery9_dtor( struct NineQuery9 *This )
 
     if (This->pq) {
         if (This->state == NINE_QUERY_STATE_RUNNING)
-            nine_context_end_query(device, This->pq);
+            nine_context_end_query(device, &This->counter, This->pq);
         nine_context_destroy_query(device, This->pq);
     }
 
@@ -177,15 +177,15 @@ NineQuery9_Issue( struct NineQuery9 *This,
 
     if (dwIssueFlags == D3DISSUE_BEGIN) {
         if (This->state == NINE_QUERY_STATE_RUNNING)
-            nine_context_end_query(device, This->pq);
-        nine_context_begin_query(device, This->pq);
+            nine_context_end_query(device, &This->counter, This->pq);
+        nine_context_begin_query(device, &This->counter, This->pq);
         This->state = NINE_QUERY_STATE_RUNNING;
     } else {
         if (This->state != NINE_QUERY_STATE_RUNNING &&
             This->type != D3DQUERYTYPE_EVENT &&
             This->type != D3DQUERYTYPE_TIMESTAMP)
-            nine_context_begin_query(device, This->pq);
-        nine_context_end_query(device, This->pq);
+            nine_context_begin_query(device, &This->counter, This->pq);
+        nine_context_end_query(device, &This->counter, This->pq);
         This->state = NINE_QUERY_STATE_ENDED;
     }
     return D3D_OK;
@@ -240,7 +240,7 @@ NineQuery9_GetData( struct NineQuery9 *This,
     /* Note: We ignore dwGetDataFlags, because get_query_result will
      * flush automatically if needed */
 
-    ok = nine_context_get_query_result(device, This->pq,
+    ok = nine_context_get_query_result(device, This->pq, &This->counter,
                                        !!(dwGetDataFlags & D3DGETDATA_FLUSH),
                                        wait_query_result, &presult);
 
diff --git a/src/gallium/state_trackers/nine/query9.h b/src/gallium/state_trackers/nine/query9.h
index 6397a4c..cc6c717 100644
--- a/src/gallium/state_trackers/nine/query9.h
+++ b/src/gallium/state_trackers/nine/query9.h
@@ -40,6 +40,7 @@ struct NineQuery9
     D3DQUERYTYPE type;
     enum nine_query_state state;
     boolean instant; /* true if D3DISSUE_BEGIN is not needed / invalid */
+    unsigned counter; /* Number of pending Begin/End (0 if internal multithreading off) */
 };
 static inline struct NineQuery9 *
 NineQuery9( void *data )
-- 
2.10.2



More information about the mesa-dev mailing list