From e79d905f5a0d5bf0f83276ed08fc5d3affd65952 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 4 Aug 2020 14:57:06 -0400 Subject: [PATCH] zink: flag ssbo buffer resources as having pending writes on batch ssbos are the only descriptor type we support (so far) that allows writes during the draw, so we have to ensure that we set the right flag on the batch reference to handle sync if the buffer is later read from Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/zink/zink_context.c | 4 ++++ src/gallium/drivers/zink/zink_context.h | 1 + src/gallium/drivers/zink/zink_draw.c | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 42d8829..e5a502f 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -583,6 +583,10 @@ zink_set_shader_buffers(struct pipe_context *pctx, { struct zink_context *ctx = zink_context(pctx); + unsigned modified_bits = u_bit_consecutive(start_slot, count); + ctx->writable_ssbos &= ~modified_bits; + ctx->writable_ssbos |= writable_bitmask << start_slot; + for (unsigned i = 0; i < count; i++) { struct pipe_shader_buffer *ssbo = &ctx->ssbos[p_stage][start_slot + i]; if (buffers && buffers[i].buffer) { diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index a1879d3..e63875b 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -92,6 +92,7 @@ struct zink_context { struct pipe_constant_buffer ubos[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS]; struct pipe_shader_buffer ssbos[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_BUFFERS]; + uint32_t writable_ssbos; struct pipe_framebuffer_state fb_state; struct zink_vertex_elements_state *element_state; diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 81d0d40..c2e7f1a 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -356,7 +356,10 @@ zink_draw_vbo(struct pipe_context *pctx, assert(ctx->ssbos[i][index].buffer_size <= screen->info.props.limits.maxStorageBufferRange); assert(ctx->ssbos[i][index].buffer); struct zink_resource *res = zink_resource(ctx->ssbos[i][index].buffer); - write_desc_resources[num_wds] = res; + if (ctx->writable_ssbos & (1 << index)) + write_desc_resources[num_wds] = res; + else + read_desc_resources[num_wds] = res; buffer_infos[num_buffer_info].buffer = res->buffer; buffer_infos[num_buffer_info].offset = ctx->ssbos[i][index].buffer_offset; buffer_infos[num_buffer_info].range = ctx->ssbos[i][index].buffer_size; -- 2.7.4