zink: add explicit surface/bufferview batch-tracking functions

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9665>
This commit is contained in:
Mike Blumenkrantz 2020-12-22 10:24:26 -05:00
parent 73fa8c2bdb
commit 17ef151f62
2 changed files with 33 additions and 20 deletions

View File

@ -393,20 +393,33 @@ ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr, struct zink_ba
return true;
}
void
zink_batch_reference_bufferview(struct zink_batch *batch, struct zink_buffer_view *buffer_view)
{
if (!ptr_add_usage(batch, batch->state->bufferviews, buffer_view, &buffer_view->batch_uses))
return;
pipe_reference(NULL, &buffer_view->reference);
batch->has_work = true;
}
void
zink_batch_reference_surface(struct zink_batch *batch, struct zink_surface *surface)
{
if (!ptr_add_usage(batch, batch->state->surfaces, surface, &surface->batch_uses))
return;
struct pipe_surface *surf = NULL;
pipe_surface_reference(&surf, &surface->base);
batch->has_work = true;
}
void
zink_batch_reference_sampler_view(struct zink_batch *batch,
struct zink_sampler_view *sv)
{
if (sv->base.target == PIPE_BUFFER) {
if (!ptr_add_usage(batch, batch->state->bufferviews, sv->buffer_view, &sv->buffer_view->batch_uses))
return;
pipe_reference(NULL, &sv->buffer_view->reference);
} else {
if (!ptr_add_usage(batch, batch->state->surfaces, sv->image_view, &sv->image_view->batch_uses))
return;
pipe_reference(NULL, &sv->image_view->base.reference);
}
batch->has_work = true;
if (sv->base.target == PIPE_BUFFER)
zink_batch_reference_bufferview(batch, sv->buffer_view);
else
zink_batch_reference_surface(batch, sv->image_view);
}
void
@ -443,16 +456,10 @@ void
zink_batch_reference_image_view(struct zink_batch *batch,
struct zink_image_view *image_view)
{
if (image_view->base.resource->target == PIPE_BUFFER) {
if (!ptr_add_usage(batch, batch->state->bufferviews, image_view->buffer_view, &image_view->buffer_view->batch_uses))
return;
pipe_reference(NULL, &image_view->buffer_view->reference);
} else {
if (!ptr_add_usage(batch, batch->state->surfaces, image_view->surface, &image_view->surface->batch_uses))
return;
pipe_reference(NULL, &image_view->surface->base.reference);
}
batch->has_work = true;
if (image_view->base.resource->target == PIPE_BUFFER)
zink_batch_reference_bufferview(batch, image_view->buffer_view);
else
zink_batch_reference_surface(batch, image_view->surface);
}
void

View File

@ -33,6 +33,7 @@
struct pipe_reference;
struct zink_buffer_view;
struct zink_context;
struct zink_descriptor_set;
struct zink_framebuffer;
@ -139,6 +140,11 @@ void
zink_batch_reference_image_view(struct zink_batch *batch,
struct zink_image_view *image_view);
void
zink_batch_reference_bufferview(struct zink_batch *batch, struct zink_buffer_view *buffer_view);
void
zink_batch_reference_surface(struct zink_batch *batch, struct zink_surface *surface);
bool
zink_batch_add_desc_set(struct zink_batch *batch, struct zink_descriptor_set *zds);