Mesa (master): zink: flag ssbo buffer resources as having pending writes on batch

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jan 14 18:35:22 UTC 2021


Module: Mesa
Branch: master
Commit: e79d905f5a0d5bf0f83276ed08fc5d3affd65952
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e79d905f5a0d5bf0f83276ed08fc5d3affd65952

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Aug  4 14:57:06 2020 -0400

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 <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8330>

---

 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 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;



More information about the mesa-commit mailing list