Mesa (main): zink: don't clear batch resources on fence finish

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 22 21:08:01 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri May  7 08:10:00 2021 -0400

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 <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11437>

---

 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 9d3979913c8..a469c565bba 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 def6bf5e361..02178c03e1e 100644
--- a/src/gallium/drivers/zink/zink_batch.h
+++ b/src/gallium/drivers/zink/zink_batch.h
@@ -27,6 +27,7 @@
 #include <vulkan/vulkan.h>
 
 #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 8e634be024c..e0fadd86da7 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 876788e141e..e900a4c69c0 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;
 };



More information about the mesa-commit mailing list