From fc27594943fe8c11c0d49cd50a60ad68ff2b3928 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 5 Nov 2020 12:10:57 -0500 Subject: [PATCH] zink: move active query pruning to batch reset this didn't ever really need to be on the fence in the first place Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_batch.c | 6 ++++++ src/gallium/drivers/zink/zink_context.c | 1 + src/gallium/drivers/zink/zink_fence.c | 8 -------- src/gallium/drivers/zink/zink_fence.h | 1 - src/gallium/drivers/zink/zink_query.c | 13 ++++--------- src/gallium/drivers/zink/zink_query.h | 3 ++- 6 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 15bcb59..a34f289 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -39,6 +39,12 @@ zink_reset_batch(struct zink_context *ctx, struct zink_batch *batch) zink_batch_clear_resources(screen, batch); + set_foreach(batch->active_queries, entry) { + struct zink_query *query = (void*)entry->key; + zink_prune_query(screen, query); + _mesa_set_remove(batch->active_queries, entry); + } + set_foreach(batch->surfaces, entry) { struct zink_surface *surf = (struct zink_surface *)entry->key; surf->batch_uses &= ~BITFIELD64_BIT(batch->batch_id); diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index b806e84..7cfc4b5 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2267,6 +2267,7 @@ init_batch(struct zink_context *ctx, struct zink_batch *batch, unsigned idx) return false; batch->fbs = _mesa_pointer_set_create(NULL); + batch->active_queries = _mesa_pointer_set_create(NULL); batch->resources = _mesa_pointer_set_create(NULL); batch->surfaces = _mesa_pointer_set_create(NULL); batch->bufferviews = _mesa_pointer_set_create(NULL); diff --git a/src/gallium/drivers/zink/zink_fence.c b/src/gallium/drivers/zink/zink_fence.c index 46fe236..7015609 100644 --- a/src/gallium/drivers/zink/zink_fence.c +++ b/src/gallium/drivers/zink/zink_fence.c @@ -25,7 +25,6 @@ #include "zink_context.h" #include "zink_fence.h" -#include "zink_query.h" #include "zink_resource.h" #include "zink_screen.h" @@ -73,10 +72,6 @@ fail: void zink_fence_init(struct zink_fence *fence, struct zink_batch *batch) { - assert(!fence->active_queries); - fence->active_queries = batch->active_queries; - batch->active_queries = NULL; - set_foreach(batch->resources, entry) { /* the fence needs its own reference to ensure it can safely access lifetime-dependent * resource members @@ -135,9 +130,6 @@ zink_fence_finish(struct zink_screen *screen, struct pipe_context *pctx, struct success = vkGetFenceStatus(screen->dev, fence->fence) == VK_SUCCESS; if (success) { - if (fence->active_queries) - zink_prune_queries(screen, fence); - /* unref all used resources */ util_dynarray_foreach(&fence->resources, struct zink_resource_object*, obj) { fence_remove_resource_access(fence, *obj); diff --git a/src/gallium/drivers/zink/zink_fence.h b/src/gallium/drivers/zink/zink_fence.h index d3bfa0e..a9043b5 100644 --- a/src/gallium/drivers/zink/zink_fence.h +++ b/src/gallium/drivers/zink/zink_fence.h @@ -38,7 +38,6 @@ struct zink_fence { struct pipe_reference reference; unsigned batch_id : 3; VkFence fence; - struct set *active_queries; /* zink_query objects which were active at some point in this batch */ struct util_dynarray resources; struct pipe_context *deferred_ctx; bool submitted; diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c index afa55f2..1fd3750 100644 --- a/src/gallium/drivers/zink/zink_query.c +++ b/src/gallium/drivers/zink/zink_query.c @@ -241,17 +241,12 @@ zink_destroy_query(struct pipe_context *pctx, } void -zink_prune_queries(struct zink_screen *screen, struct zink_fence *fence) +zink_prune_query(struct zink_screen *screen, struct zink_query *query) { - set_foreach(fence->active_queries, entry) { - struct zink_query *query = (void*)entry->key; - if (!p_atomic_dec_return(&query->fences)) { - if (p_atomic_read(&query->dead)) - destroy_query(screen, query); - } + 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; } static void diff --git a/src/gallium/drivers/zink/zink_query.h b/src/gallium/drivers/zink/zink_query.h index d9606c2..357fefa 100644 --- a/src/gallium/drivers/zink/zink_query.h +++ b/src/gallium/drivers/zink/zink_query.h @@ -27,6 +27,7 @@ struct zink_batch; struct zink_context; struct zink_fence; +struct zink_query; struct zink_screen; void @@ -36,7 +37,7 @@ void zink_resume_queries(struct zink_context *ctx, struct zink_batch *batch); void -zink_prune_queries(struct zink_screen *screen, struct zink_fence *fence); +zink_prune_query(struct zink_screen *screen, struct zink_query *query); void zink_query_update_gs_states(struct zink_context *ctx); -- 2.7.4