diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 1f02ca042b2..bfcaa23ceae 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1498,8 +1498,7 @@ zink_set_vertex_buffers_internal(struct pipe_context *pctx, /* fastpath for viewperf */ if (res->obj->access != VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT || res->obj->access_stage != VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) /* always barrier before possible rebind */ - zink_screen(ctx->base.screen)->buffer_barrier(ctx, res, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, - VK_PIPELINE_STAGE_VERTEX_INPUT_BIT); + zink_buffer_barrier(ctx, res, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT); zink_batch_resource_usage_set(ctx->bs, res, false, true); res->obj->unordered_read = false; } else { diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index 2875b0d7a77..8b0cc212ee9 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -132,6 +132,17 @@ zink_update_fbfetch(struct zink_context *ctx); bool zink_resource_access_is_write(VkAccessFlags flags); +static ALWAYS_INLINE void +zink_buffer_barrier(struct zink_context *ctx, struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline) +{ + if (res->obj->access) { + zink_screen(ctx->base.screen)->buffer_barrier(ctx, res, flags, pipeline); + } else { + res->obj->access = res->obj->unordered_access = flags; + res->obj->access_stage = res->obj->unordered_access_stage = pipeline; + } +} + void zink_resource_image_barrier_init(VkImageMemoryBarrier *imb, struct zink_resource *res, VkImageLayout new_layout, VkAccessFlags flags, VkPipelineStageFlags pipeline); void diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index d0d4ebf9b40..828867d54d0 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -93,7 +93,7 @@ check_buffer_barrier(struct zink_context *ctx, struct pipe_resource *pres, VkAcc struct zink_resource *res = zink_resource(pres); /* fastpath for viewperf */ if (res->obj->access != flags || res->obj->access_stage != pipeline) - zink_screen(ctx->base.screen)->buffer_barrier(ctx, res, flags, pipeline); + zink_buffer_barrier(ctx, res, flags, pipeline); if (!ctx->unordered_blitting) res->obj->unordered_read = false; }