Mesa (main): zink: change vbo_bind_count to a mask of slots

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 22 00:21:05 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri May 14 10:44:02 2021 -0400

zink: change vbo_bind_count to a mask of slots

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

---

 src/gallium/drivers/zink/zink_context.c  | 17 +++++++++++------
 src/gallium/drivers/zink/zink_draw.cpp   |  4 ++--
 src/gallium/drivers/zink/zink_resource.h |  2 +-
 3 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index e4599292dc2..613ab845e13 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -899,7 +899,7 @@ update_existing_vbo(struct zink_context *ctx, unsigned slot)
    if (!ctx->vertex_buffers[slot].buffer.resource)
       return;
    struct zink_resource *res = zink_resource(ctx->vertex_buffers[slot].buffer.resource);
-   res->vbo_bind_count--;
+   res->vbo_bind_mask &= ~BITFIELD_BIT(slot);
    update_res_bind_count(ctx, res, false, true);
 }
 
@@ -932,7 +932,7 @@ zink_set_vertex_buffers(struct pipe_context *pctx,
          }
          if (vb->buffer.resource) {
             struct zink_resource *res = zink_resource(vb->buffer.resource);
-            res->vbo_bind_count++;
+            res->vbo_bind_mask |= BITFIELD_BIT(start_slot + i);
             update_res_bind_count(ctx, res, false, false);
             ctx_vb->stride = vb->stride;
             ctx_vb->buffer_offset = vb->buffer_offset;
@@ -2247,8 +2247,8 @@ resource_check_defer_buffer_barrier(struct zink_context *ctx, struct zink_resour
 {
    assert(res->obj->is_buffer);
    if (res->bind_count[0]) {
-      if ((res->obj->is_buffer && res->vbo_bind_count && !(pipeline & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT)) ||
-          ((!res->obj->is_buffer || res->vbo_bind_count != res->bind_count[0]) && !is_shader_pipline_stage(pipeline)))
+      if ((res->obj->is_buffer && res->vbo_bind_mask && !(pipeline & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT)) ||
+          ((!res->obj->is_buffer || util_bitcount(res->vbo_bind_mask) != res->bind_count[0]) && !is_shader_pipline_stage(pipeline)))
          /* gfx rebind */
          _mesa_set_add(ctx->need_barriers[0], res);
    }
@@ -3124,9 +3124,14 @@ rebind_buffer(struct zink_context *ctx, struct zink_resource *res)
    unsigned num_rebinds = 0, num_image_rebinds_remaining[2] = {res->image_bind_count[0], res->image_bind_count[1]};
    bool has_write = false;
 
-   if (res->vbo_bind_count) {
+   if (res->vbo_bind_mask) {
+      u_foreach_bit(slot, res->vbo_bind_mask) {
+         if (ctx->vertex_buffers[slot].buffer.resource != &res->base.b) //wrong context
+            return;
+         break;
+      }
       ctx->vertex_buffers_dirty = true;
-      num_rebinds += res->vbo_bind_count;
+      num_rebinds += util_bitcount(res->vbo_bind_mask);
    }
    for (unsigned shader = 0; num_rebinds < total_rebinds && shader < PIPE_SHADER_TYPES; shader++) {
       u_foreach_bit(slot, res->ubo_bind_mask[shader]) {
diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index 1557f267bfb..6c3d597c4ec 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -360,10 +360,10 @@ update_barriers(struct zink_context *ctx, bool is_compute)
                   access |= VK_ACCESS_UNIFORM_READ_BIT;
                   bind_count -= res->ubo_bind_count[is_compute];
                }
-               if (!is_compute && res->vbo_bind_count) {
+               if (!is_compute && res->vbo_bind_mask) {
                   access |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
                   pipeline |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
-                  bind_count -= res->vbo_bind_count;
+                  bind_count -= util_bitcount(res->vbo_bind_mask);
                }
             }
             if (bind_count)
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index 406b7d70b81..3c362e6ba6a 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -105,7 +105,7 @@ struct zink_resource {
    union {
       struct {
          struct util_range valid_buffer_range;
-         uint16_t vbo_bind_count;
+         uint32_t vbo_bind_mask : PIPE_MAX_ATTRIBS;
          uint8_t ubo_bind_count[2];
          uint32_t ubo_bind_mask[PIPE_SHADER_TYPES];
          uint32_t ssbo_bind_mask[PIPE_SHADER_TYPES];



More information about the mesa-commit mailing list