From 3f6d104ba8a163bb0b928f691c4fb6d720cceeee Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 20 Aug 2020 09:53:54 -0400 Subject: [PATCH] zink: add barriers for index and draw param buffers need to ensure synchronization here too Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/gallium/drivers/zink/zink_draw.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 7a07f0b10f5..080f6fbcb1e 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -144,6 +144,31 @@ barrier_vertex_buffers(struct zink_context *ctx) } } +static void +check_buffer_barrier(struct zink_context *ctx, struct pipe_resource *pres, VkAccessFlags flags, VkPipelineStageFlags pipeline) +{ + struct zink_resource *res = zink_resource(pres); + if (zink_resource_buffer_needs_barrier(res, flags, pipeline)) { + struct zink_batch *batch = zink_batch_no_rp(ctx); + zink_resource_buffer_barrier(batch, res, flags, pipeline); + } +} + +static void +barrier_draw_buffers(struct zink_context *ctx, const struct pipe_draw_info *dinfo, + const struct pipe_draw_indirect_info *dindirect, struct pipe_resource *index_buffer) +{ + if (index_buffer) + check_buffer_barrier(ctx, index_buffer, VK_ACCESS_INDEX_READ_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT); + if (dindirect && dindirect->buffer) { + check_buffer_barrier(ctx, dindirect->buffer, + VK_ACCESS_INDIRECT_COMMAND_READ_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT); + if (dindirect->indirect_draw_count) + check_buffer_barrier(ctx, dindirect->indirect_draw_count, + VK_ACCESS_INDIRECT_COMMAND_READ_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT); + } +} + static void zink_bind_vertex_buffers(struct zink_batch *batch, struct zink_context *ctx) { @@ -706,6 +731,7 @@ zink_draw_vbo(struct pipe_context *pctx, zink_emit_xfb_vertex_input_barrier(ctx, zink_resource(so_target->base.buffer)); barrier_vertex_buffers(ctx); + barrier_draw_buffers(ctx, dinfo, dindirect, index_buffer); update_descriptors(ctx, screen, false);