Mesa (main): zink: more effectively utilize batch_usage for query destruction
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Aug 27 14:36:37 UTC 2021
Module: Mesa
Branch: main
Commit: 3990f9582229bf110bbefe8f43f34c3d91d44b97
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3990f9582229bf110bbefe8f43f34c3d91d44b97
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Mon Aug 2 13:44:30 2021 -0400
zink: more effectively utilize batch_usage for query destruction
there's no need to track the number of batches that a query is referenced on,
as all the tracking is already done by the batch_usage mechanism, so this
can be simplified to manage destruction based on whether batch_usage exists
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12578>
---
src/gallium/drivers/zink/zink_batch.c | 2 +-
src/gallium/drivers/zink/zink_query.c | 30 ++++++++++++++++--------------
src/gallium/drivers/zink/zink_query.h | 3 ++-
3 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index 383e06fba5f..25a9a749c5b 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -42,7 +42,7 @@ zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs)
set_foreach_remove(bs->active_queries, entry) {
struct zink_query *query = (void*)entry->key;
- zink_prune_query(screen, query);
+ zink_prune_query(screen, bs, query);
}
set_foreach_remove(bs->surfaces, entry) {
diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c
index a62bb375563..b26cc96547a 100644
--- a/src/gallium/drivers/zink/zink_query.c
+++ b/src/gallium/drivers/zink/zink_query.c
@@ -39,7 +39,6 @@ struct zink_query {
bool dead; /* query should be destroyed when its fence finishes */
bool needs_update; /* query needs to update its qbos */
- unsigned fences;
struct list_head active_list;
struct list_head stats_list; /* when active, statistics queries are added to ctx->primitives_generated_queries */
@@ -244,7 +243,7 @@ fail:
static void
destroy_query(struct zink_screen *screen, struct zink_query *query)
{
- assert(!p_atomic_read(&query->fences));
+ assert(zink_screen_usage_check_completion(screen, query->batch_id));
if (query->query_pool)
vkDestroyQueryPool(screen->dev, query->query_pool, NULL);
struct zink_query_buffer *qbo, *next;
@@ -345,10 +344,11 @@ zink_destroy_query(struct pipe_context *pctx,
struct zink_screen *screen = zink_screen(pctx->screen);
struct zink_query *query = (struct zink_query *)q;
- p_atomic_set(&query->dead, true);
- if (p_atomic_read(&query->fences)) {
- if (query->xfb_running)
- zink_fence_wait(pctx);
+ /* only destroy if this query isn't active on any batches,
+ * otherwise just mark dead and wait
+ */
+ if (query->batch_id) {
+ p_atomic_set(&query->dead, true);
return;
}
@@ -356,12 +356,13 @@ zink_destroy_query(struct pipe_context *pctx,
}
void
-zink_prune_query(struct zink_screen *screen, struct zink_query *query)
+zink_prune_query(struct zink_screen *screen, struct zink_batch_state *bs, struct zink_query *query)
{
- if (!p_atomic_dec_return(&query->fences)) {
- if (p_atomic_read(&query->dead))
- destroy_query(screen, query);
- }
+ if (!zink_batch_usage_matches(query->batch_id, bs))
+ return;
+ query->batch_id = NULL;
+ if (p_atomic_read(&query->dead))
+ destroy_query(screen, query);
}
static void
@@ -661,6 +662,8 @@ begin_query(struct zink_context *ctx, struct zink_batch *batch, struct zink_quer
vkCmdWriteTimestamp(batch->state->cmdbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, q->query_pool, q->curr_query);
q->curr_query++;
update_qbo(ctx, q);
+ zink_batch_usage_set(&q->batch_id, batch->state);
+ _mesa_set_add(batch->state->active_queries, q);
}
/* ignore the rest of begin_query for timestamps */
if (is_time_query(q))
@@ -694,7 +697,6 @@ begin_query(struct zink_context *ctx, struct zink_batch *batch, struct zink_quer
vkCmdBeginQuery(batch->state->cmdbuf, q->query_pool, q->curr_query, flags);
if (needs_stats_list(q))
list_addtail(&q->stats_list, &ctx->primitives_generated_queries);
- p_atomic_inc(&q->fences);
zink_batch_usage_set(&q->batch_id, batch->state);
_mesa_set_add(batch->state->active_queries, q);
}
@@ -786,6 +788,7 @@ zink_end_query(struct pipe_context *pctx,
vkCmdWriteTimestamp(batch->state->cmdbuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
query->query_pool, query->curr_query);
zink_batch_usage_set(&query->batch_id, batch->state);
+ _mesa_set_add(batch->state->active_queries, query);
update_query_id(ctx, query);
} else if (query->active)
end_query(ctx, batch, query);
@@ -979,7 +982,6 @@ zink_get_query_result_resource(struct pipe_context *pctx,
VkQueryResultFlagBits size_flags = result_type <= PIPE_QUERY_TYPE_U32 ? 0 : VK_QUERY_RESULT_64_BIT;
unsigned num_queries = query->curr_query - query->last_start;
unsigned query_id = query->last_start;
- unsigned fences = p_atomic_read(&query->fences);
if (index == -1) {
/* VK_QUERY_RESULT_WITH_AVAILABILITY_BIT will ALWAYS write some kind of result data
@@ -991,7 +993,7 @@ zink_get_query_result_resource(struct pipe_context *pctx,
*/
VkQueryResultFlags flag = is_time_query(query) ? 0 : VK_QUERY_RESULT_PARTIAL_BIT;
- if (!fences) {
+ if (zink_batch_usage_check_completion(ctx, query->batch_id)) {
uint64_t u64[2] = {0};
if (vkGetQueryPoolResults(screen->dev, query->query_pool, query_id, 1, 2 * result_size, u64,
0, size_flags | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT | flag) == VK_SUCCESS) {
diff --git a/src/gallium/drivers/zink/zink_query.h b/src/gallium/drivers/zink/zink_query.h
index 1f90ecc226e..e6fb7b894c2 100644
--- a/src/gallium/drivers/zink/zink_query.h
+++ b/src/gallium/drivers/zink/zink_query.h
@@ -25,6 +25,7 @@
#define ZINK_QUERY_H
struct zink_batch;
+struct zink_batch_state;
struct zink_context;
struct zink_fence;
struct zink_query;
@@ -40,7 +41,7 @@ void
zink_resume_queries(struct zink_context *ctx, struct zink_batch *batch);
void
-zink_prune_query(struct zink_screen *screen, struct zink_query *query);
+zink_prune_query(struct zink_screen *screen, struct zink_batch_state *bs, struct zink_query *query);
void
zink_query_update_gs_states(struct zink_context *ctx);
More information about the mesa-commit
mailing list