diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 15bcb593e27..a34f289c766 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 b806e84b1ba..7cfc4b5b8db 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 46fe23648b8..701560904c3 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 d3bfa0e849d..a9043b5841b 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 afa55f212f0..1fd37505ddc 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 d9606c2bdaf..357fefae43f 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);