diff --git a/src/gallium/drivers/zink/zink_synchronization.cpp b/src/gallium/drivers/zink/zink_synchronization.cpp index 381531ed8a7..fb440566421 100644 --- a/src/gallium/drivers/zink/zink_synchronization.cpp +++ b/src/gallium/drivers/zink/zink_synchronization.cpp @@ -547,13 +547,18 @@ zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_resource *res pipeline = pipeline_access_stage(flags); bool is_write = zink_resource_access_is_write(flags); - bool unordered = unordered_res_exec(ctx, res, is_write); - if (!buffer_needs_barrier(res, flags, pipeline, unordered)) - return; enum zink_resource_access rw = is_write ? ZINK_RESOURCE_ACCESS_RW : ZINK_RESOURCE_ACCESS_WRITE; bool completed = zink_resource_usage_check_completion_fast(zink_screen(ctx->base.screen), res, rw); bool usage_matches = !completed && zink_resource_usage_matches(res, ctx->batch.state); + if (!usage_matches) { + res->obj->unordered_write = true; + if (is_write || zink_resource_usage_check_completion_fast(zink_screen(ctx->base.screen), res, ZINK_RESOURCE_ACCESS_RW)) + res->obj->unordered_read = true; + } bool unordered_usage_matches = res->obj->unordered_access && usage_matches; + bool unordered = unordered_res_exec(ctx, res, is_write); + if (!buffer_needs_barrier(res, flags, pipeline, unordered)) + return; if (completed) { /* reset access on complete */ res->obj->access = VK_ACCESS_NONE;