Mesa (master): zink: handle streamout buffer rebinds

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Mar 17 01:49:51 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Mar 12 17:42:28 2021 -0500

zink: handle streamout buffer rebinds

this really just means to nuke the counter buffer, and this can be done
by using a special bind_history bit that can be unset when the buffer has
been rebound

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9546>

---

 src/gallium/drivers/zink/zink_context.c  | 7 +++++++
 src/gallium/drivers/zink/zink_draw.c     | 4 ++++
 src/gallium/drivers/zink/zink_resource.c | 5 +++++
 src/gallium/drivers/zink/zink_resource.h | 2 ++
 4 files changed, 18 insertions(+)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index e503a7b3fb2..7b6ff77cb01 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -2116,6 +2116,8 @@ zink_create_stream_output_target(struct pipe_context *pctx,
    t->base.buffer_offset = buffer_offset;
    t->base.buffer_size = buffer_size;
 
+   zink_resource(t->base.buffer)->bind_history |= ZINK_RESOURCE_USAGE_STREAMOUT;
+
    return &t->base;
 }
 
@@ -2171,6 +2173,11 @@ zink_resource_rebind(struct zink_context *ctx, struct zink_resource *res)
 {
    assert(res->base.target == PIPE_BUFFER);
 
+   if (res->bind_history & ZINK_RESOURCE_USAGE_STREAMOUT)
+      ctx->dirty_so_targets = true;
+   /* force counter buffer reset */
+   res->bind_history &= ~ZINK_RESOURCE_USAGE_STREAMOUT;
+
    for (unsigned shader = 0; shader < PIPE_SHADER_TYPES; shader++) {
       if (!(res->bind_stages & (1 << shader)))
          continue;
diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c
index 6992bb72315..6796f663ec9 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -141,12 +141,16 @@ zink_emit_stream_output_targets(struct pipe_context *pctx)
          continue;
       }
       struct zink_resource *res = zink_resource(t->base.buffer);
+      if (!(res->bind_history & ZINK_RESOURCE_USAGE_STREAMOUT))
+         /* resource has been rebound */
+         t->counter_buffer_valid = false;
       buffers[i] = res->obj->buffer;
       zink_resource_buffer_barrier(ctx, NULL, zink_resource(t->base.buffer),
                                    VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT);
       zink_batch_reference_resource_rw(batch, res, true);
       buffer_offsets[i] = t->base.buffer_offset;
       buffer_sizes[i] = t->base.buffer_size;
+      res->bind_history |= ZINK_RESOURCE_USAGE_STREAMOUT;
       util_range_add(t->base.buffer, &res->valid_buffer_range, t->base.buffer_offset,
                      t->base.buffer_offset + t->base.buffer_size);
    }
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index b0f73b006df..5484cd77cc9 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -586,6 +586,11 @@ zink_resource_invalidate(struct pipe_context *pctx, struct pipe_resource *pres)
    if (res->valid_buffer_range.start > res->valid_buffer_range.end)
       return;
 
+   if (res->bind_history & ZINK_RESOURCE_USAGE_STREAMOUT)
+      ctx->dirty_so_targets = true;
+   /* force counter buffer reset */
+   res->bind_history &= ~ZINK_RESOURCE_USAGE_STREAMOUT;
+
    util_range_set_empty(&res->valid_buffer_range);
    if (!zink_get_resource_usage(res))
       return;
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index 4a6be36fa56..bcce7986d83 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -29,6 +29,8 @@ struct sw_displaytarget;
 struct zink_batch;
 struct zink_context;
 
+#define ZINK_RESOURCE_USAGE_STREAMOUT (1 << 10) //much greater than ZINK_DESCRIPTOR_TYPES
+
 #include "util/u_transfer.h"
 #include "util/u_range.h"
 #include "util/u_dynarray.h"



More information about the mesa-commit mailing list