diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 42d882967bb..e5a502f2f0d 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 a1879d344cf..e63875b7dd2 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 81d0d40d3a6..c2e7f1aab5b 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;