Mesa (main): zink: remove samplerview refs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 7 00:31:25 UTC 2021


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

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

zink: remove samplerview refs

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

---

 src/gallium/drivers/zink/zink_context.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index ef96d2c15a5..634ea775a9d 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -1320,6 +1320,15 @@ zink_set_shader_images(struct pipe_context *pctx,
       zink_screen(pctx->screen)->context_invalidate_descriptor_state(ctx, p_stage, ZINK_DESCRIPTOR_TYPE_IMAGE, start_slot, count);
 }
 
+ALWAYS_INLINE static void
+check_samplerview_for_batch_ref(struct zink_context *ctx, struct zink_sampler_view *sv)
+{
+   const struct zink_resource *res = zink_resource(sv->base.texture);
+   if ((res->obj->is_buffer && zink_batch_usage_exists(sv->buffer_view->batch_uses)) ||
+       (!res->obj->is_buffer && zink_batch_usage_exists(sv->image_view->batch_uses)))
+      zink_batch_reference_sampler_view(&ctx->batch, sv);
+}
+
 ALWAYS_INLINE static void
 unbind_samplerview(struct zink_context *ctx, enum pipe_shader_type stage, unsigned slot)
 {
@@ -1327,6 +1336,7 @@ unbind_samplerview(struct zink_context *ctx, enum pipe_shader_type stage, unsign
    if (!sv || !sv->base.texture)
       return;
    struct zink_resource *res = zink_resource(sv->base.texture);
+   check_samplerview_for_batch_ref(ctx, sv);
    update_res_bind_count(ctx, res, stage == PIPE_SHADER_COMPUTE, true);
    if (!res->obj->is_buffer)
       res->sampler_binds[stage] &= ~BITFIELD_BIT(slot);
@@ -1356,6 +1366,8 @@ zink_set_sampler_views(struct pipe_context *pctx,
             update_res_bind_count(ctx, res, shader_type == PIPE_SHADER_COMPUTE, false);
             res->bind_history |= BITFIELD64_BIT(ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW);
             res->bind_stages |= 1 << shader_type;
+         } else if (a != b) {
+            check_samplerview_for_batch_ref(ctx, a);
          }
          if (res->base.b.target == PIPE_BUFFER) {
             if (res->bind_history & BITFIELD64_BIT(ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW)) {
@@ -1367,6 +1379,8 @@ zink_set_sampler_views(struct pipe_context *pctx,
                if (buffer_view == b->buffer_view)
                   p_atomic_dec(&buffer_view->reference.count);
                else {
+                  if (zink_batch_usage_exists(b->buffer_view->batch_uses))
+                     zink_batch_reference_bufferview(&ctx->batch, b->buffer_view);
                   zink_buffer_view_reference(zink_screen(ctx->base.screen), &b->buffer_view, NULL);
                   b->buffer_view = buffer_view;
                   update = true;
@@ -1393,9 +1407,6 @@ zink_set_sampler_views(struct pipe_context *pctx,
              if (!a)
                 update = true;
          }
-         if (!ctx->descriptor_refs_dirty[shader_type == PIPE_SHADER_COMPUTE]) {
-            zink_batch_reference_sampler_view(&ctx->batch, b);
-         }
          zink_batch_resource_usage_set(&ctx->batch, res, false);
       } else if (a) {
          unbind_samplerview(ctx, shader_type, start_slot + i);
@@ -3138,6 +3149,8 @@ check_and_rebind_buffer(struct zink_context *ctx, struct zink_resource *res, uns
    }
    case ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW: {
       struct zink_sampler_view *sampler_view = zink_sampler_view(ctx->sampler_views[shader][i]);
+      if (zink_batch_usage_exists(sampler_view->buffer_view->batch_uses))
+         zink_batch_reference_bufferview(&ctx->batch, sampler_view->buffer_view);
       zink_buffer_view_reference(zink_screen(ctx->base.screen), &sampler_view->buffer_view, NULL);
       sampler_view->buffer_view = get_buffer_view(ctx, res, sampler_view->base.format,
                                                   sampler_view->base.u.buf.offset, sampler_view->base.u.buf.size);



More information about the mesa-commit mailing list