From 765debc602ac77655a8c46fc77808e0615248ff3 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 12 Oct 2022 15:03:55 -0400 Subject: [PATCH] zink: delete view objects when unsetting resource usage in batch reset if the resource has no usage, it's guaranteed to be idle, which means view objects can be pruned to avoid memory ballooning Part-of: --- src/gallium/drivers/zink/zink_batch.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 5bc756ab4c8..39ce61c0ffa 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -21,22 +21,31 @@ debug_describe_zink_batch_state(char *buf, const struct zink_batch_state *ptr) } static void -reset_obj(struct zink_batch_state *bs, struct zink_resource_object *obj) +reset_obj(struct zink_screen *screen, struct zink_batch_state *bs, struct zink_resource_object *obj) { if (!zink_resource_object_usage_unset(obj, bs)) { obj->unordered_read = false; obj->unordered_write = false; obj->access = 0; obj->access_stage = 0; + simple_mtx_lock(&obj->view_lock); + if (obj->is_buffer) { + while (util_dynarray_contains(&obj->views, VkBufferView)) + VKSCR(DestroyBufferView)(screen->dev, util_dynarray_pop(&obj->views, VkBufferView), NULL); + } else { + while (util_dynarray_contains(&obj->views, VkImageView)) + VKSCR(DestroyImageView)(screen->dev, util_dynarray_pop(&obj->views, VkImageView), NULL); + } + simple_mtx_unlock(&obj->view_lock); } util_dynarray_append(&bs->unref_resources, struct zink_resource_object*, obj); } static void -reset_obj_list(struct zink_batch_state *bs, struct zink_batch_obj_list *list) +reset_obj_list(struct zink_screen *screen, struct zink_batch_state *bs, struct zink_batch_obj_list *list) { for (unsigned i = 0; i < list->num_buffers; i++) - reset_obj(bs, list->objs[i]); + reset_obj(screen, bs, list->objs[i]); list->num_buffers = 0; } @@ -50,12 +59,12 @@ zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs) mesa_loge("ZINK: vkResetCommandPool failed (%s)", vk_Result_to_str(result)); /* unref all used resources */ - reset_obj_list(bs, &bs->real_objs); - reset_obj_list(bs, &bs->slab_objs); - reset_obj_list(bs, &bs->sparse_objs); + reset_obj_list(screen, bs, &bs->real_objs); + reset_obj_list(screen, bs, &bs->slab_objs); + reset_obj_list(screen, bs, &bs->sparse_objs); while (util_dynarray_contains(&bs->swapchain_obj, struct zink_resource_object*)) { struct zink_resource_object *obj = util_dynarray_pop(&bs->swapchain_obj, struct zink_resource_object*); - reset_obj(bs, obj); + reset_obj(screen, bs, obj); } for (unsigned i = 0; i < 2; i++) {