diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 080ca74e785..52b25aec6c2 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -1163,19 +1163,20 @@ zink_batch_usage_check_completion(struct zink_context *ctx, const struct zink_ba return zink_check_batch_completion(ctx, u->usage); } -static void -batch_usage_wait(struct zink_context *ctx, struct zink_batch_usage *u, unsigned submit_count, bool trywait) +ALWAYS_INLINE bool +zink_batch_usage_unflushed_wait(struct zink_context *ctx, struct zink_batch_usage *u, unsigned submit_count, bool trywait) { MESA_TRACE_FUNC(); if (!zink_batch_usage_exists(u)) - return; + return true; /* this batch state was already completed and reset */ if (u->submit_count - submit_count > 1) - return; + return true; if (zink_batch_usage_is_unflushed(u)) { - if (likely(u == &ctx->bs->usage)) + if (likely(u == &ctx->bs->usage)) { ctx->base.flush(&ctx->base, NULL, PIPE_FLUSH_HINT_FINISH); - else { //multi-context + return true; + } else { //multi-context mtx_lock(&u->mtx); if (trywait) { struct timespec ts = {0, 10000}; @@ -1185,7 +1186,20 @@ batch_usage_wait(struct zink_context *ctx, struct zink_batch_usage *u, unsigned mtx_unlock(&u->mtx); } } - zink_wait_on_batch(ctx, u->usage); + return !u->unflushed; +} + +static void +batch_usage_wait(struct zink_context *ctx, struct zink_batch_usage *u, unsigned submit_count, bool trywait) +{ + MESA_TRACE_FUNC(); + if (!zink_batch_usage_exists(u)) + return; + /* this batch state was already completed and reset */ + if (u->submit_count - submit_count > 1) + return; + if (zink_batch_usage_unflushed_wait(ctx, u, submit_count, trywait)) + zink_wait_on_batch(ctx, u->usage); } void diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h index 34d0719c3df..f97d8d51d81 100644 --- a/src/gallium/drivers/zink/zink_batch.h +++ b/src/gallium/drivers/zink/zink_batch.h @@ -121,6 +121,9 @@ zink_screen_usage_check_completion_fast(struct zink_screen *screen, const struct bool zink_batch_usage_check_completion(struct zink_context *ctx, const struct zink_batch_usage *u); +bool +zink_batch_usage_unflushed_wait(struct zink_context *ctx, struct zink_batch_usage *u, unsigned submit_count, bool trywait); + void zink_batch_usage_wait(struct zink_context *ctx, struct zink_batch_usage *u, unsigned submit_count); diff --git a/src/gallium/drivers/zink/zink_bo.h b/src/gallium/drivers/zink/zink_bo.h index f1254d8ab4a..b78a1a24a3b 100644 --- a/src/gallium/drivers/zink/zink_bo.h +++ b/src/gallium/drivers/zink/zink_bo.h @@ -187,6 +187,15 @@ zink_bo_usage_check_completion_fast(struct zink_screen *screen, struct zink_bo * return true; } +static ALWAYS_INLINE void +zink_bo_usage_unflushed_wait(struct zink_context *ctx, struct zink_bo *bo, enum zink_resource_access access) +{ + if (access & ZINK_RESOURCE_ACCESS_READ) + zink_batch_usage_unflushed_wait(ctx, bo->reads.u, bo->reads.submit_count, false); + if (access & ZINK_RESOURCE_ACCESS_WRITE) + zink_batch_usage_unflushed_wait(ctx, bo->writes.u, bo->writes.submit_count, false); +} + static ALWAYS_INLINE void zink_bo_usage_wait(struct zink_context *ctx, struct zink_bo *bo, enum zink_resource_access access) { diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index 6e7f68260c3..c1ff178bd0d 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -150,6 +150,12 @@ zink_resource_usage_check_completion_fast(struct zink_screen *screen, struct zin return zink_bo_usage_check_completion_fast(screen, res->obj->bo, access); } +static ALWAYS_INLINE void +zink_resource_usage_unflushed_wait(struct zink_context *ctx, struct zink_resource *res, enum zink_resource_access access) +{ + zink_bo_usage_unflushed_wait(ctx, res->obj->bo, access); +} + static ALWAYS_INLINE void zink_resource_usage_try_wait(struct zink_context *ctx, struct zink_resource *res, enum zink_resource_access access) {