From 5cecf826d3b4ed4282a6979e0c00713d0a5f8909 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 7 May 2021 08:10:00 -0400 Subject: [PATCH] zink: don't clear batch resources on fence finish this eliminates the need for locking here and has no noticeable increase in overhead, so the reduction of complexity seems worthwhile Acked-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_batch.c | 14 +++++++++----- src/gallium/drivers/zink/zink_batch.h | 2 ++ src/gallium/drivers/zink/zink_fence.c | 16 ---------------- src/gallium/drivers/zink/zink_fence.h | 2 -- 4 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 9d39799..a469c56 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -33,7 +33,13 @@ zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs) if (vkResetCommandPool(screen->dev, bs->cmdpool, 0) != VK_SUCCESS) debug_printf("vkResetCommandPool failed\n"); - zink_fence_clear_resources(screen, &bs->fence); + /* unref all used resources */ + set_foreach_remove(bs->resources, entry) { + struct zink_resource_object *obj = (struct zink_resource_object *)entry->key; + zink_batch_usage_unset(&obj->reads, bs); + zink_batch_usage_unset(&obj->writes, bs); + zink_resource_object_reference(screen, &obj, NULL); + } set_foreach_remove(bs->active_queries, entry) { struct zink_query *query = (void*)entry->key; @@ -149,7 +155,6 @@ zink_batch_state_destroy(struct zink_screen *screen, struct zink_batch_state *bs _mesa_set_destroy(bs->programs, NULL); _mesa_set_destroy(bs->active_queries, NULL); screen->batch_descriptor_deinit(screen, bs); - simple_mtx_destroy(&bs->fence.resource_mtx); ralloc_free(bs); } @@ -187,7 +192,7 @@ create_batch_state(struct zink_context *ctx) pipe_reference_init(&bs->reference, 1); SET_CREATE_OR_FAIL(bs->fbs); - SET_CREATE_OR_FAIL(bs->fence.resources); + SET_CREATE_OR_FAIL(bs->resources); SET_CREATE_OR_FAIL(bs->surfaces); SET_CREATE_OR_FAIL(bs->bufferviews); SET_CREATE_OR_FAIL(bs->programs); @@ -207,7 +212,6 @@ create_batch_state(struct zink_context *ctx) if (vkCreateFence(screen->dev, &fci, NULL, &bs->fence.fence) != VK_SUCCESS) goto fail; - simple_mtx_init(&bs->fence.resource_mtx, mtx_plain); util_queue_fence_init(&bs->flush_completed); return bs; @@ -579,7 +583,7 @@ zink_batch_reference_resource_rw(struct zink_batch *batch, struct zink_resource if (!zink_batch_usage_matches(res->obj->reads, batch->state) && !zink_batch_usage_matches(res->obj->writes, batch->state)) { bool found = false; - _mesa_set_search_and_add(batch->state->fence.resources, res->obj, &found); + _mesa_set_search_and_add(batch->state->resources, res->obj, &found); if (!found) { pipe_reference(NULL, &res->obj->reference); if (!batch->last_batch_usage || res->obj->reads != batch->last_batch_usage) diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h index def6bf5..02178c0 100644 --- a/src/gallium/drivers/zink/zink_batch.h +++ b/src/gallium/drivers/zink/zink_batch.h @@ -27,6 +27,7 @@ #include #include "util/list.h" +#include "util/set.h" #include "util/u_dynarray.h" #include "zink_fence.h" @@ -77,6 +78,7 @@ struct zink_batch_state { struct set *fbs; struct set *programs; + struct set *resources; struct set *surfaces; struct set *bufferviews; diff --git a/src/gallium/drivers/zink/zink_fence.c b/src/gallium/drivers/zink/zink_fence.c index 8e634be..e0fadd8 100644 --- a/src/gallium/drivers/zink/zink_fence.c +++ b/src/gallium/drivers/zink/zink_fence.c @@ -31,21 +31,6 @@ #include "util/set.h" #include "util/u_memory.h" - -void -zink_fence_clear_resources(struct zink_screen *screen, struct zink_fence *fence) -{ - simple_mtx_lock(&fence->resource_mtx); - /* unref all used resources */ - set_foreach_remove(fence->resources, entry) { - struct zink_resource_object *obj = (struct zink_resource_object *)entry->key; - zink_batch_usage_unset(&obj->reads, zink_batch_state(fence)); - zink_batch_usage_unset(&obj->writes, zink_batch_state(fence)); - zink_resource_object_reference(screen, &obj, NULL); - } - simple_mtx_unlock(&fence->resource_mtx); -} - static void destroy_fence(struct zink_screen *screen, struct zink_tc_fence *mfence) { @@ -160,7 +145,6 @@ zink_vkfence_wait(struct zink_screen *screen, struct zink_fence *fence, uint64_t p_atomic_set(&fence->completed, true); zink_batch_state(fence)->usage.usage = 0; zink_screen_update_last_finished(screen, fence->batch_id); - zink_fence_clear_resources(screen, fence); } return success; } diff --git a/src/gallium/drivers/zink/zink_fence.h b/src/gallium/drivers/zink/zink_fence.h index 876788e..e900a4c 100644 --- a/src/gallium/drivers/zink/zink_fence.h +++ b/src/gallium/drivers/zink/zink_fence.h @@ -51,8 +51,6 @@ struct zink_tc_fence { struct zink_fence { VkFence fence; uint32_t batch_id; - simple_mtx_t resource_mtx; - struct set *resources; /* resources need access removed asap, so they're on the fence */ bool submitted; bool completed; }; -- 2.7.4