summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2021-03-22 10:54:14 -0400
committerMarge Bot <eric+marge@anholt.net>2021-03-30 15:12:58 +0000
commitf32079efab4def44ecd2e77edb3e5b47df608b53 (patch)
treea08e967f2358f438fba6036d78606707ea7e5c12
parent0ebc13564afda7f9568e8ec4bdc44cd6a4ded72b (diff)
zink: add locking for fence resources
Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9885>
-rw-r--r--src/gallium/drivers/zink/zink_batch.c2
-rw-r--r--src/gallium/drivers/zink/zink_fence.c2
-rw-r--r--src/gallium/drivers/zink/zink_fence.h2
3 files changed, 6 insertions, 0 deletions
diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index f9560b8df43..224c3d51223 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -125,6 +125,7 @@ zink_batch_state_destroy(struct zink_screen *screen, struct zink_batch_state *bs
_mesa_set_destroy(bs->programs, NULL);
_mesa_set_destroy(bs->desc_sets, NULL);
_mesa_set_destroy(bs->active_queries, NULL);
+ simple_mtx_destroy(&bs->fence.resource_mtx);
ralloc_free(bs);
}
@@ -168,6 +169,7 @@ create_batch_state(struct zink_context *ctx)
/* this destroys the batch state on failure */
return NULL;
+ simple_mtx_init(&bs->fence.resource_mtx, mtx_plain);
return bs;
fail:
zink_batch_state_destroy(screen, bs);
diff --git a/src/gallium/drivers/zink/zink_fence.c b/src/gallium/drivers/zink/zink_fence.c
index 188a049ff21..12d61f8c394 100644
--- a/src/gallium/drivers/zink/zink_fence.c
+++ b/src/gallium/drivers/zink/zink_fence.c
@@ -35,6 +35,7 @@
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(fence->resources, entry) {
struct zink_resource_object *obj = (struct zink_resource_object *)entry->key;
@@ -43,6 +44,7 @@ zink_fence_clear_resources(struct zink_screen *screen, struct zink_fence *fence)
zink_resource_object_reference(screen, &obj, NULL);
_mesa_set_remove(fence->resources, entry);
}
+ simple_mtx_unlock(&fence->resource_mtx);
}
static void
diff --git a/src/gallium/drivers/zink/zink_fence.h b/src/gallium/drivers/zink/zink_fence.h
index ba59de495f7..f4b2a8d97cc 100644
--- a/src/gallium/drivers/zink/zink_fence.h
+++ b/src/gallium/drivers/zink/zink_fence.h
@@ -24,6 +24,7 @@
#ifndef ZINK_FENCE_H
#define ZINK_FENCE_H
+#include "util/simple_mtx.h"
#include "util/u_inlines.h"
#include <vulkan/vulkan.h>
@@ -40,6 +41,7 @@ struct zink_fence {
VkFence fence;
struct pipe_context *deferred_ctx;
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;
};