Mesa (main): zink: enforce multi-context waiting for unflushed resources on foreign batches
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jun 22 21:08:01 UTC 2021
Module: Mesa
Branch: main
Commit: d4159963e3d3bb7f40cd506515e1ec189800abbf
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d4159963e3d3bb7f40cd506515e1ec189800abbf
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Wed Jun 16 21:32:14 2021 -0400
zink: enforce multi-context waiting for unflushed resources on foreign batches
this doesn't seem to be a real issue now that tc doesn't break makeCurrent
anymore, but if such a thing were to once again become a problem, at least
there will be handling for it
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 | 17 +++++++++++++++++
src/gallium/drivers/zink/zink_batch.h | 2 ++
src/gallium/drivers/zink/zink_resource.c | 3 +++
3 files changed, 22 insertions(+)
diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index 705cd53be4f..3fb4cc6eabd 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -128,6 +128,9 @@ zink_batch_state_destroy(struct zink_screen *screen, struct zink_batch_state *bs
util_queue_fence_destroy(&bs->flush_completed);
+ cnd_destroy(&bs->usage.flush);
+ mtx_destroy(&bs->usage.mtx);
+
if (bs->fence.fence)
vkDestroyFence(screen->dev, bs->fence.fence, NULL);
@@ -191,6 +194,9 @@ create_batch_state(struct zink_context *ctx)
util_dynarray_init(&bs->zombie_samplers, NULL);
util_dynarray_init(&bs->persistent_resources, NULL);
+ cnd_init(&bs->usage.flush);
+ mtx_init(&bs->usage.mtx, mtx_plain);
+
if (!screen->batch_descriptor_init(screen, bs))
goto fail;
@@ -369,6 +375,8 @@ submit_queue(void *data, void *gdata, int thread_index)
bs->is_device_lost = true;
}
bs->submit_count++;
+ cnd_broadcast(&bs->usage.flush);
+
p_atomic_set(&bs->fence.submitted, true);
}
@@ -682,5 +690,14 @@ zink_batch_usage_wait(struct zink_context *ctx, struct zink_batch_usage *u)
{
if (!zink_batch_usage_exists(u))
return;
+ if (zink_batch_usage_is_unflushed(u)) {
+ if (likely(u == &ctx->batch.state->usage))
+ ctx->base.flush(&ctx->base, NULL, PIPE_FLUSH_HINT_FINISH);
+ else { //multi-context
+ mtx_lock(&u->mtx);
+ cnd_wait(&u->flush, &u->mtx);
+ mtx_unlock(&u->mtx);
+ }
+ }
zink_wait_on_batch(ctx, u->usage);
}
diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h
index 8df4385fa38..04827bfb7e5 100644
--- a/src/gallium/drivers/zink/zink_batch.h
+++ b/src/gallium/drivers/zink/zink_batch.h
@@ -46,6 +46,8 @@ struct zink_surface;
struct zink_batch_usage {
uint32_t usage;
+ cnd_t flush;
+ mtx_t mtx;
bool unflushed;
};
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index fc60c7690b5..8c4ffe3efa5 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -1025,6 +1025,9 @@ zink_transfer_map(struct pipe_context *pctx,
struct zink_resource *staging_res = zink_resource(trans->staging_res);
if (usage & PIPE_MAP_READ) {
+ /* force multi-context sync */
+ if (zink_batch_usage_is_unflushed(res->obj->writes))
+ zink_batch_usage_wait(ctx, res->obj->writes);
zink_transfer_copy_bufimage(ctx, staging_res, res, trans);
/* need to wait for rendering to finish */
zink_fence_wait(pctx);
More information about the mesa-commit
mailing list