zink: add extra batch tracking for sampler views
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 28 Oct 2020 00:25:06 +0000 (20:25 -0400)
committerMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 16 Mar 2021 14:45:32 +0000 (10:45 -0400)
we're going to start invalidating and rebinding resources, which means
we need to be extra sure that we have our lifetimes in order here

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

src/gallium/drivers/zink/zink_batch.c

index a952dd3..4de6c91 100644 (file)
@@ -38,6 +38,13 @@ zink_reset_batch(struct zink_context *ctx, struct zink_batch *batch)
       struct pipe_sampler_view *pres = (struct pipe_sampler_view *)entry->key;
       struct zink_sampler_view *sampler_view = zink_sampler_view(pres);
       sampler_view->batch_uses &= ~BITFIELD_BIT(batch->batch_id);
+      if (sampler_view->base.target == PIPE_BUFFER) {
+         struct zink_buffer_view *buffer_view = sampler_view->buffer_view;
+         zink_buffer_view_reference(ctx, &buffer_view, NULL);
+      } else {
+         struct zink_surface *surface = sampler_view->image_view;
+         pipe_surface_reference((struct pipe_surface**)&surface, NULL);
+      }
       pipe_sampler_view_reference(&pres, NULL);
       _mesa_set_remove(batch->sampler_views, entry);
    }
@@ -236,6 +243,10 @@ zink_batch_reference_sampler_view(struct zink_batch *batch,
    assert(!found);
    sv->batch_uses |= bit;
    pipe_reference(NULL, &sv->base.reference);
+   if (sv->base.target == PIPE_BUFFER)
+      pipe_reference(NULL, &sv->buffer_view->reference);
+   else
+      pipe_reference(NULL, &sv->image_view->base.reference);
    batch->has_work = true;
 }