zink_prune_query(screen, bs, query);
}
- set_foreach_remove(&bs->surfaces, entry) {
- struct zink_surface *surf = (struct zink_surface *)entry->key;
- zink_batch_usage_unset(&surf->batch_uses, bs);
- zink_surface_reference(screen, &surf, NULL);
- }
- set_foreach_remove(&bs->bufferviews, entry) {
- struct zink_buffer_view *buffer_view = (struct zink_buffer_view *)entry->key;
- zink_batch_usage_unset(&buffer_view->batch_uses, bs);
- zink_buffer_view_reference(screen, &buffer_view, NULL);
- }
-
util_dynarray_foreach(&bs->dead_framebuffers, struct zink_framebuffer*, fb) {
zink_framebuffer_reference(screen, fb, NULL);
}
bs->ctx = ctx;
- SET_CREATE_OR_FAIL(&bs->surfaces);
- SET_CREATE_OR_FAIL(&bs->bufferviews);
SET_CREATE_OR_FAIL(&bs->programs);
SET_CREATE_OR_FAIL(&bs->active_queries);
util_dynarray_init(&bs->wait_semaphores, NULL);
}
void
-zink_batch_reference_bufferview(struct zink_batch *batch, struct zink_buffer_view *buffer_view)
-{
- if (!batch_ptr_add_usage(batch, &batch->state->bufferviews, buffer_view))
- 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 (!batch_ptr_add_usage(batch, &batch->state->surfaces, surface))
- 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)
- zink_batch_reference_bufferview(batch, sv->buffer_view);
- else {
- zink_batch_reference_surface(batch, sv->image_view);
- if (sv->cube_array)
- zink_batch_reference_surface(batch, sv->cube_array);
- }
-}
-
-void
zink_batch_reference_program(struct zink_batch *batch,
struct zink_program *pg)
{
batch->has_work = true;
}
-void
-zink_batch_reference_image_view(struct zink_batch *batch,
- struct zink_image_view *image_view)
-{
- 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);
-}
-
bool
zink_screen_usage_check_completion(struct zink_screen *screen, const struct zink_batch_usage *u)
{
assert(he);
_mesa_hash_table_remove(&res->bufferview_cache, he);
simple_mtx_unlock(&res->bufferview_mtx);
+ simple_mtx_lock(&res->obj->view_lock);
+ util_dynarray_append(&res->obj->views, VkBufferView, buffer_view->buffer_view);
+ simple_mtx_unlock(&res->obj->view_lock);
pipe_resource_reference(&buffer_view->pres, NULL);
- VKSCR(DestroyBufferView)(screen->dev, buffer_view->buffer_view, NULL);
FREE(buffer_view);
}
if (image_view->base.resource->target == PIPE_BUFFER) {
unbind_buffer_descriptor_stage(res, stage);
unbind_buffer_descriptor_reads(res, stage);
- if (zink_batch_usage_exists(image_view->buffer_view->batch_uses))
- zink_batch_reference_bufferview(&ctx->batch, image_view->buffer_view);
zink_buffer_view_reference(zink_screen(ctx->base.screen), &image_view->buffer_view, NULL);
} else {
unbind_descriptor_stage(res, stage);
if (!res->image_bind_count[is_compute])
check_for_layout_update(ctx, res, is_compute);
- if (zink_batch_usage_exists(image_view->surface->batch_uses))
- zink_batch_reference_surface(&ctx->batch, image_view->surface);
zink_surface_reference(zink_screen(ctx->base.screen), &image_view->surface, NULL);
}
image_view->base.resource = NULL;
unbind_shader_image(ctx, p_stage, start_slot + i);
}
image_view->buffer_view = bv;
- zink_batch_usage_set(&image_view->buffer_view->batch_uses, ctx->batch.state);
zink_screen(ctx->base.screen)->buffer_barrier(ctx, res, access,
res->gfx_barrier);
zink_batch_resource_usage_set(&ctx->batch, res,
}
image_view->surface = surface;
finalize_image_bind(ctx, res, p_stage == MESA_SHADER_COMPUTE);
- zink_batch_usage_set(&image_view->surface->batch_uses, ctx->batch.state);
zink_batch_resource_usage_set(&ctx->batch, res,
zink_resource_access_is_write(access), false);
}
}
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, gl_shader_stage stage, unsigned slot)
{
struct zink_sampler_view *sv = zink_sampler_view(ctx->sampler_views[stage][slot]);
return;
struct zink_resource *res = zink_resource(sv->base.texture);
res->sampler_bind_count[stage == MESA_SHADER_COMPUTE]--;
- check_samplerview_for_batch_ref(ctx, sv);
update_res_bind_count(ctx, res, stage == MESA_SHADER_COMPUTE, true);
res->sampler_binds[stage] &= ~BITFIELD_BIT(slot);
if (res->obj->is_buffer) {
res->sampler_bind_count[shader_type == MESA_SHADER_COMPUTE]++;
res->gfx_barrier |= zink_pipeline_flags_from_pipe_stage(shader_type);
res->barrier_access[shader_type == MESA_SHADER_COMPUTE] |= VK_ACCESS_SHADER_READ_BIT;
- } else if (a != b) {
- check_samplerview_for_batch_ref(ctx, a);
}
if (res->base.b.target == PIPE_BUFFER) {
if (b->buffer_view->bvci.buffer != res->obj->buffer) {
bvci.buffer = res->obj->buffer;
struct zink_buffer_view *buffer_view = get_buffer_view(ctx, res, &bvci);
assert(buffer_view != b->buffer_view);
- 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;
}
- zink_batch_usage_set(&b->buffer_view->batch_uses, ctx->batch.state);
zink_screen(ctx->base.screen)->buffer_barrier(ctx, res, VK_ACCESS_SHADER_READ_BIT,
res->gfx_barrier);
if (!a || a->buffer_view->buffer_view != b->buffer_view->buffer_view)
flush_pending_clears(ctx, res);
if (b->cube_array) {
ctx->di.cubes[shader_type] |= BITFIELD_BIT(start_slot + i);
- zink_batch_usage_set(&b->cube_array->batch_uses, ctx->batch.state);
}
check_for_layout_update(ctx, res, shader_type == MESA_SHADER_COMPUTE);
- zink_batch_usage_set(&b->image_view->batch_uses, ctx->batch.state);
if (!a)
update = true;
zink_batch_resource_usage_set(&ctx->batch, res, false, false);
uint32_t h = handle;
util_dynarray_append(&ctx->batch.state->bindless_releases[0], uint32_t, h);
- struct zink_resource *res = zink_descriptor_surface_resource(ds);
if (ds->is_buffer) {
- if (zink_resource_has_usage(res))
- zink_batch_reference_bufferview(&ctx->batch, ds->bufferview);
zink_buffer_view_reference(zink_screen(pctx->screen), &ds->bufferview, NULL);
} else {
- if (zink_resource_has_usage(res))
- zink_batch_reference_surface(&ctx->batch, ds->surface);
zink_surface_reference(zink_screen(pctx->screen), &ds->surface, NULL);
pctx->delete_sampler_state(pctx, bd->sampler);
}
bvci.buffer = res->obj->buffer;
struct zink_buffer_view *buffer_view = get_buffer_view(ctx, res, &bvci);
assert(buffer_view != ds->bufferview);
- if (zink_resource_has_usage(res))
- zink_batch_reference_bufferview(&ctx->batch, ds->bufferview);
zink_buffer_view_reference(zink_screen(ctx->base.screen), &ds->bufferview, NULL);
ds->bufferview = buffer_view;
}
uint32_t h = handle;
util_dynarray_append(&ctx->batch.state->bindless_releases[1], uint32_t, h);
- struct zink_resource *res = zink_descriptor_surface_resource(ds);
if (ds->is_buffer) {
- if (zink_resource_has_usage(res))
- zink_batch_reference_bufferview(&ctx->batch, ds->bufferview);
zink_buffer_view_reference(zink_screen(pctx->screen), &ds->bufferview, NULL);
} else {
- if (zink_resource_has_usage(res))
- zink_batch_reference_surface(&ctx->batch, ds->surface);
zink_surface_reference(zink_screen(pctx->screen), &ds->surface, NULL);
}
free(ds);
} else {
res = zink_resource(surf->base.texture);
zink_batch_resource_usage_set(&ctx->batch, res, true, false);
- zink_batch_usage_set(&surf->batch_uses, ctx->batch.state);
}
VkAccessFlags access;
else
res->obj->unordered_read = false;
- struct zink_sampler_view *sv = zink_sampler_view(ctx->sampler_views[stage][j]);
struct zink_sampler_state *sampler_state = ctx->sampler_states[stage][j];
- struct zink_image_view *iv = &ctx->image_views[stage][j];
if (sampler_state && i == ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW && j <= ctx->di.num_samplers[stage])
zink_batch_usage_set(&sampler_state->batch_uses, ctx->batch.state);
- if (sv && i == ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW && j <= ctx->di.num_sampler_views[stage]) {
- if (is_buffer) {
- zink_batch_usage_set(&sv->buffer_view->batch_uses, ctx->batch.state);
- } else {
- zink_batch_usage_set(&sv->image_view->batch_uses, ctx->batch.state);
- if (sv->cube_array)
- zink_batch_usage_set(&sv->cube_array->batch_uses, ctx->batch.state);
- }
- zink_batch_reference_sampler_view(batch, sv);
- } else if (i == ZINK_DESCRIPTOR_TYPE_IMAGE && j <= ctx->di.num_images[stage]) {
- if (is_buffer)
- zink_batch_usage_set(&iv->buffer_view->batch_uses, ctx->batch.state);
- else
- zink_batch_usage_set(&iv->surface->batch_uses, ctx->batch.state);
- zink_batch_reference_image_view(batch, iv);
- }
}
}
}
ctx->dynamic_fb.attachments[idx].imageView = VK_NULL_HANDLE;
if (!surf)
return;
- struct zink_surface *transient = zink_transient_surface(surf);
struct zink_resource *res = zink_resource(surf->texture);
if (changed) {
- if (zink_batch_usage_exists(zink_csurface(surf)->batch_uses)) {
- zink_batch_reference_surface(&ctx->batch, zink_csurface(surf));
- if (transient)
- zink_batch_reference_surface(&ctx->batch, transient);
- }
ctx->rp_changed = true;
}
res->fb_binds--;
if (!sampler_view || sampler_view->base.texture->target != PIPE_BUFFER)
return NULL;
struct zink_resource *res = zink_resource(sampler_view->base.texture);
- if (zink_batch_usage_exists(sampler_view->buffer_view->batch_uses))
- zink_batch_reference_bufferview(&ctx->batch, sampler_view->buffer_view);
VkBufferViewCreateInfo bvci = sampler_view->buffer_view->bvci;
bvci.buffer = res->obj->buffer;
zink_buffer_view_reference(zink_screen(ctx->base.screen), &sampler_view->buffer_view, NULL);
struct zink_resource *res = zink_resource(image_view->base.resource);
if (!res || res->base.b.target != PIPE_BUFFER)
return NULL;
- if (zink_batch_usage_exists(image_view->buffer_view->batch_uses))
- zink_batch_reference_bufferview(&ctx->batch, image_view->buffer_view);
VkBufferViewCreateInfo bvci = image_view->buffer_view->bvci;
bvci.buffer = res->obj->buffer;
zink_buffer_view_reference(zink_screen(ctx->base.screen), &image_view->buffer_view, NULL);
_mesa_hash_table_remove(&res->surface_cache, he);
simple_mtx_unlock(&res->surface_mtx);
}
+ simple_mtx_lock(&res->obj->view_lock);
if (surface->simage_view)
- VKSCR(DestroyImageView)(screen->dev, surface->simage_view, NULL);
+ util_dynarray_append(&res->obj->views, VkImageView, surface->simage_view);
if (surface->is_swapchain) {
for (unsigned i = 0; i < surface->old_swapchain_size; i++)
- VKSCR(DestroyImageView)(screen->dev, surface->old_swapchain[i], NULL);
+ util_dynarray_append(&res->obj->views, VkImageView, surface->old_swapchain[i]);
for (unsigned i = 0; i < surface->swapchain_size; i++)
- VKSCR(DestroyImageView)(screen->dev, surface->swapchain[i], NULL);
+ util_dynarray_append(&res->obj->views, VkImageView, surface->swapchain[i]);
free(surface->swapchain);
} else
- VKSCR(DestroyImageView)(screen->dev, surface->image_view, NULL);
+ util_dynarray_append(&res->obj->views, VkImageView, surface->image_view);
+ simple_mtx_unlock(&res->obj->view_lock);
pipe_resource_reference(&psurface->texture, NULL);
FREE(surface);
}
simple_mtx_lock(&res->surface_mtx);
struct hash_entry *new_entry = _mesa_hash_table_search_pre_hashed(&res->surface_cache, hash, &ivci);
- if (zink_batch_usage_exists(surface->batch_uses))
- zink_batch_reference_surface(&ctx->batch, surface);
if (new_entry) {
/* reuse existing surface; old one will be cleaned up naturally */
struct zink_surface *new_surface = new_entry->data;
simple_mtx_unlock(&res->surface_mtx);
- zink_batch_usage_set(&new_surface->batch_uses, ctx->batch.state);
zink_surface_reference(screen, (struct zink_surface**)psurface, new_surface);
return true;
}
surface->info.flags = res->obj->vkflags;
surface->info.usage = res->obj->vkusage;
surface->info_hash = _mesa_hash_data(&surface->info, sizeof(surface->info));
- zink_batch_usage_set(&surface->batch_uses, ctx->batch.state);
simple_mtx_unlock(&res->surface_mtx);
return true;
}