Mesa (main): zink/query: only reset the range of queries in use.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Mar 31 23:52:03 UTC 2022


Module: Mesa
Branch: main
Commit: b96ddc37bc93755c259d98669e5e7f0256d5dc25
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b96ddc37bc93755c259d98669e5e7f0256d5dc25

Author: Dave Airlie <airlied at redhat.com>
Date:   Mon Mar 28 15:16:10 2022 +1000

zink/query: only reset the range of queries in use.

This reduces the amount of resetting needed.

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15702>

---

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

diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c
index 7aeb78d0d8b..02e01b48635 100644
--- a/src/gallium/drivers/zink/zink_query.c
+++ b/src/gallium/drivers/zink/zink_query.c
@@ -39,6 +39,7 @@ struct zink_query {
 
    bool active; /* query is considered active by vk */
    bool needs_reset; /* query is considered active by vk and cannot be destroyed */
+   bool range_needs_reset; /* last range in query needs reset. */
    bool dead; /* query should be destroyed when its fence finishes */
    bool needs_update; /* query needs to update its qbos */
 
@@ -546,6 +547,22 @@ copy_results_to_buffer(struct zink_context *ctx, struct zink_query *query, struc
    copy_pool_results_to_buffer(ctx, query, query->query_pool[0], query->last_start, res, offset, num_results, flags);
 }
 
+
+static void
+reset_query_range(struct zink_context *ctx, struct zink_batch *batch, struct zink_query *q)
+{
+   unsigned num_query_pools = get_num_query_pools(q->type);
+   bool is_so_overflow_any = q->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE;
+   unsigned num_query = is_so_overflow_any ? PIPE_MAX_VERTEX_STREAMS : 1;
+
+   for (unsigned i = 0; i < num_query_pools; i++)
+      VKCTX(CmdResetQueryPool)(batch->state->cmdbuf, q->query_pool[i], q->curr_query, num_query);
+   memset(&q->have_gs[q->curr_query], 0, sizeof(bool) * num_query);
+   memset(&q->have_xfb[q->curr_query], 0, sizeof(bool) * num_query);
+   memset(&q->was_line_loop[q->curr_query], 0, sizeof(bool) * num_query);
+   q->range_needs_reset = false;
+}
+
 static void
 reset_pool(struct zink_context *ctx, struct zink_batch *batch, struct zink_query *q)
 {
@@ -557,16 +574,9 @@ reset_pool(struct zink_context *ctx, struct zink_batch *batch, struct zink_query
    if (q->needs_update)
       update_qbo(ctx, q);
 
-   unsigned num_query_pools = get_num_query_pools(q->type);
-
-   for (unsigned i = 0; i < num_query_pools; i++)
-      VKCTX(CmdResetQueryPool)(batch->state->cmdbuf, q->query_pool[i], 0, NUM_QUERIES);
-
-   memset(q->have_gs, 0, sizeof(q->have_gs));
-   memset(q->have_xfb, 0, sizeof(q->have_xfb));
-   memset(q->was_line_loop, 0, sizeof(q->was_line_loop));
    q->last_start = q->curr_query = 0;
    q->needs_reset = false;
+   q->range_needs_reset = true;
    /* create new qbo for non-timestamp queries:
     * timestamp queries should never need more than 2 entries in the qbo
     */
@@ -619,6 +629,8 @@ begin_query(struct zink_context *ctx, struct zink_batch *batch, struct zink_quer
    q->predicate_dirty = true;
    if (q->needs_reset)
       reset_pool(ctx, batch, q);
+   if (q->range_needs_reset)
+      reset_query_range(ctx, batch, q);
    assert(q->curr_query < NUM_QUERIES);
    q->active = true;
    batch->has_work = true;
@@ -692,6 +704,8 @@ update_query_id(struct zink_context *ctx, struct zink_query *q)
 {
    bool is_so_overflow_any = q->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE;
    q->curr_query += is_so_overflow_any ? PIPE_MAX_VERTEX_STREAMS : 1;
+
+   q->range_needs_reset = true;
    if (q->curr_query == NUM_QUERIES) {
       /* always reset on start; this ensures we can actually submit the batch that the current query is on */
       q->needs_reset = true;
@@ -765,6 +779,8 @@ zink_end_query(struct pipe_context *pctx,
    if (is_time_query(query)) {
       if (query->needs_reset)
          reset_pool(ctx, batch, query);
+      if (query->range_needs_reset)
+         reset_query_range(ctx, batch, query);
       VKCTX(CmdWriteTimestamp)(batch->state->cmdbuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
                           query->query_pool[0], query->curr_query);
       zink_batch_usage_set(&query->batch_id, batch->state);



More information about the mesa-commit mailing list