Mesa (master): zink: hook up resource bind history

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


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Oct 27 12:44:58 2020 -0400

zink: hook up resource bind history

seems like this should be a gallium thing with how many drivers copy/paste it

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  | 16 +++++++++++++++-
 src/gallium/drivers/zink/zink_resource.h |  3 +++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 149c636f7ec..5f17455d87c 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -826,8 +826,13 @@ zink_set_constant_buffer(struct pipe_context *pctx,
                        cb->user_buffer, &offset, &buffer);
       }
       struct zink_resource *res = zink_resource(ctx->ubos[shader][index].buffer);
+      struct zink_resource *new_res = zink_resource(buffer);
+      if (new_res) {
+         new_res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_UBO);
+         new_res->bind_stages |= 1 << shader;
+      }
       update |= (index && ctx->ubos[shader][index].buffer_offset != offset) ||
-                !!res != !!buffer || (res && res->obj->buffer != zink_resource(buffer)->obj->buffer) ||
+                !!res != !!buffer || (res && res->obj->buffer != new_res->obj->buffer) ||
                 ctx->ubos[shader][index].buffer_size != cb->buffer_size;
 
       if (take_ownership) {
@@ -872,6 +877,8 @@ zink_set_shader_buffers(struct pipe_context *pctx,
       struct pipe_shader_buffer *ssbo = &ctx->ssbos[p_stage][start_slot + i];
       if (buffers && buffers[i].buffer) {
          struct zink_resource *res = zink_resource(buffers[i].buffer);
+         res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_SSBO);
+         res->bind_stages |= 1 << p_stage;
          pipe_resource_reference(&ssbo->buffer, &res->base);
          ssbo->buffer_offset = buffers[i].buffer_offset;
          ssbo->buffer_size = MIN2(buffers[i].buffer_size, res->obj->size - ssbo->buffer_offset);
@@ -921,6 +928,8 @@ zink_set_shader_images(struct pipe_context *pctx,
       if (images && images[i].resource) {
          util_dynarray_init(&image_view->desc_set_refs.refs, NULL);
          struct zink_resource *res = zink_resource(images[i].resource);
+         res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_IMAGE);
+         res->bind_stages |= 1 << p_stage;
          util_copy_image_view(&image_view->base, images + i);
          if (images[i].resource->target == PIPE_BUFFER) {
             image_view->buffer_view = get_buffer_view(ctx, res, images[i].format, images[i].u.buf.offset, images[i].u.buf.size);
@@ -968,6 +977,11 @@ zink_set_sampler_views(struct pipe_context *pctx,
       struct pipe_sampler_view *pview = views ? views[i] : NULL;
       struct zink_sampler_view *a = zink_sampler_view(ctx->sampler_views[shader_type][start_slot + i]);
       struct zink_sampler_view *b = zink_sampler_view(pview);
+      if (b && b->base.texture) {
+         struct zink_resource *res = zink_resource(b->base.texture);
+         res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW);
+         res->bind_stages |= 1 << shader_type;
+      }
       uint32_t hash_a = get_sampler_view_hash(a);
       uint32_t hash_b = get_sampler_view_hash(b);
       update |= !!a != !!b || hash_a != hash_b;
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index ada3edcdb14..4a6be36fa56 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -86,6 +86,9 @@ struct zink_resource {
 
    struct sw_displaytarget *dt;
    unsigned dt_stride;
+
+   uint32_t bind_history; // enum zink_descriptor_type bitmask
+   uint32_t bind_stages;
 };
 
 struct zink_transfer {



More information about the mesa-commit mailing list