Mesa (main): zink: add a per-stage mask for ubo binds

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 7 01:42:34 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue May 11 10:09:06 2021 -0400

zink: add a per-stage mask for ubo binds

optimizing buffer replacement was never so difficult

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

---

 src/gallium/drivers/zink/zink_context.c  | 12 +++++++-----
 src/gallium/drivers/zink/zink_resource.h |  3 ++-
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 6b95aca0e8a..3aeacb50b4c 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -999,12 +999,13 @@ zink_set_inlinable_constants(struct pipe_context *pctx,
 }
 
 ALWAYS_INLINE static void
-unbind_ubo(struct zink_context *ctx, struct zink_resource *res, bool is_compute)
+unbind_ubo(struct zink_context *ctx, struct zink_resource *res, enum pipe_shader_type pstage, unsigned slot)
 {
    if (!res)
       return;
-   res->ubo_bind_count[is_compute]--;
-   update_res_bind_count(ctx, res, is_compute, true);
+   res->ubo_bind_mask[pstage] &= ~BITFIELD_BIT(slot);
+   res->ubo_bind_count[pstage == PIPE_SHADER_COMPUTE]--;
+   update_res_bind_count(ctx, res, pstage == PIPE_SHADER_COMPUTE, true);
 }
 
 static void
@@ -1029,10 +1030,11 @@ zink_set_constant_buffer(struct pipe_context *pctx,
       struct zink_resource *new_res = zink_resource(buffer);
       if (new_res) {
          if (new_res != res) {
-            unbind_ubo(ctx, res, shader == PIPE_SHADER_COMPUTE);
+            unbind_ubo(ctx, res, shader, index);
             new_res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_UBO);
             new_res->bind_stages |= 1 << shader;
             new_res->ubo_bind_count[shader == PIPE_SHADER_COMPUTE]++;
+            new_res->ubo_bind_mask[shader] |= BITFIELD_BIT(index);
             update_res_bind_count(ctx, new_res, shader == PIPE_SHADER_COMPUTE, false);
          }
          zink_batch_resource_usage_set(&ctx->batch, new_res, false);
@@ -1060,7 +1062,7 @@ zink_set_constant_buffer(struct pipe_context *pctx,
          ctx->di.num_ubos[shader] = index + 1;
    } else {
       if (res)
-         unbind_ubo(ctx, res, shader == PIPE_SHADER_COMPUTE);
+         unbind_ubo(ctx, res, shader, index);
       update = !!ctx->ubos[shader][index].buffer;
 
       pipe_resource_reference(&ctx->ubos[shader][index].buffer, NULL);
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index 0db91aedce1..c5724d5e00e 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -105,7 +105,8 @@ struct zink_resource {
       struct {
          struct util_range valid_buffer_range;
          uint16_t vbo_bind_count;
-         uint16_t ubo_bind_count[2];
+         uint8_t ubo_bind_count[2];
+         uint32_t ubo_bind_mask[PIPE_SHADER_TYPES];
       };
       struct {
          VkFormat format;



More information about the mesa-commit mailing list