Mesa (master): zink: only stall during query destroy for xfb queries

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jul 13 21:12:51 UTC 2020


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Mon May 25 10:55:17 2020 -0400

zink: only stall during query destroy for xfb queries

xfb queries allocate vk buffer objects in the underlying driver which
can be deallocated while an xfb query is in-flight if we attempt to
defer it due to the way that gl xfb is translated to vk, so we need to
continue forcing this behavior in that case

for other query types, we can safely defer here until the current batch has
finished rather than block

Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5533>

---

 src/gallium/drivers/zink/zink_query.c | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c
index 1b37f89f74b..8c4e792eb89 100644
--- a/src/gallium/drivers/zink/zink_query.c
+++ b/src/gallium/drivers/zink/zink_query.c
@@ -23,8 +23,10 @@ struct zink_query {
    unsigned index;
    bool use_64bit;
    bool precise;
+   bool xfb_running;
 
    bool active; /* query is considered active by vk */
+   bool dead; /* query should be destroyed when its fence finishes */
 
    unsigned fences;
    struct list_head active_list;
@@ -108,6 +110,14 @@ wait_query(struct pipe_context *pctx, struct zink_query *query)
    }
 }
 
+static void
+destroy_query(struct zink_screen *screen, struct zink_query *query)
+{
+   assert(!p_atomic_read(&query->fences));
+   vkDestroyQueryPool(screen->dev, query->query_pool, NULL);
+   FREE(query);
+}
+
 static void
 zink_destroy_query(struct pipe_context *pctx,
                    struct pipe_query *q)
@@ -115,11 +125,14 @@ zink_destroy_query(struct pipe_context *pctx,
    struct zink_screen *screen = zink_screen(pctx->screen);
    struct zink_query *query = (struct zink_query *)q;
 
-   if (p_atomic_read(&query->fences))
-      wait_query(pctx, query);
+   p_atomic_set(&query->dead, true);
+   if (p_atomic_read(&query->fences)) {
+      if (query->xfb_running)
+        wait_query(pctx, query);
+      return;
+   }
 
-   vkDestroyQueryPool(screen->dev, query->query_pool, NULL);
-   FREE(query);
+   destroy_query(screen, query);
 }
 
 void
@@ -127,7 +140,10 @@ zink_prune_queries(struct zink_screen *screen, struct zink_fence *fence)
 {
    set_foreach(fence->active_queries, entry) {
       struct zink_query *query = (void*)entry->key;
-      p_atomic_dec(&query->fences);
+      if (!p_atomic_dec_return(&query->fences)) {
+         if (p_atomic_read(&query->dead))
+            destroy_query(screen, query);
+      }
    }
    _mesa_set_destroy(fence->active_queries, NULL);
    fence->active_queries = NULL;
@@ -140,13 +156,14 @@ begin_query(struct zink_context *ctx, struct zink_batch *batch, struct zink_quer
 
    if (q->precise)
       flags |= VK_QUERY_CONTROL_PRECISE_BIT;
-   if (q->vkqtype == VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT)
+   if (q->vkqtype == VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT) {
       zink_screen(ctx->base.screen)->vk_CmdBeginQueryIndexedEXT(batch->cmdbuf,
                                                                 q->query_pool,
                                                                 q->curr_query,
                                                                 flags,
                                                                 q->index);
-   else
+      q->xfb_running = true;
+   } else
       vkCmdBeginQuery(batch->cmdbuf, q->query_pool, q->curr_query, flags);
    q->active = true;
    if (!batch->active_queries)



More information about the mesa-commit mailing list