From 2750853894797fa36bfaeeae60e7e4ff28ddb4f0 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 7 Oct 2021 11:31:49 -0400 Subject: [PATCH] zink: stop leaking resource surface cache hash tables these are owned by the resource, so stick them on a resource context instead of the screen context Reviewed-by: Dave Airlie Reviewed-by: Adam Jackson Part-of: --- src/gallium/drivers/zink/zink_resource.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index ff9420f22ff..232a66a4deb 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -108,15 +108,18 @@ zink_resource_destroy(struct pipe_screen *pscreen, if (pres->target == PIPE_BUFFER) { util_range_destroy(&res->valid_buffer_range); util_idalloc_mt_free(&screen->buffer_ids, res->base.buffer_id_unique); + assert(!_mesa_hash_table_num_entries(&res->bufferview_cache)); simple_mtx_destroy(&res->bufferview_mtx); - } else + } else { + assert(!_mesa_hash_table_num_entries(&res->surface_cache)); simple_mtx_destroy(&res->surface_mtx); + } /* no need to do anything for the caches, these objects own the resource lifetimes */ zink_resource_object_reference(screen, &res->obj, NULL); zink_resource_object_reference(screen, &res->scanout_obj, NULL); threaded_resource_deinit(pres); - FREE(res); + ralloc_free(res); } static VkImageAspectFlags @@ -730,14 +733,14 @@ resource_create(struct pipe_screen *pscreen, const uint64_t *modifiers, int modifiers_count) { struct zink_screen *screen = zink_screen(pscreen); - struct zink_resource *res = CALLOC_STRUCT(zink_resource); + struct zink_resource *res = rzalloc(NULL, struct zink_resource); if (modifiers_count > 0) { /* for rebinds */ res->modifiers_count = modifiers_count; res->modifiers = mem_dup(modifiers, modifiers_count * sizeof(uint64_t)); if (!res->modifiers) { - FREE(res); + ralloc_free(res); return NULL; } /* TODO: remove this when multi-plane modifiers are supported */ @@ -767,7 +770,7 @@ resource_create(struct pipe_screen *pscreen, res->obj = resource_object_create(screen, &templ2, whandle, &optimal_tiling, NULL, 0); if (!res->obj) { free(res->modifiers); - FREE(res); + ralloc_free(res); return NULL; } @@ -811,10 +814,10 @@ resource_create(struct pipe_screen *pscreen, } if (res->obj->is_buffer) { res->base.buffer_id_unique = util_idalloc_mt_alloc(&screen->buffer_ids); - _mesa_hash_table_init(&res->bufferview_cache, screen, NULL, equals_bvci); + _mesa_hash_table_init(&res->bufferview_cache, res, NULL, equals_bvci); simple_mtx_init(&res->bufferview_mtx, mtx_plain); } else { - _mesa_hash_table_init(&res->surface_cache, screen, NULL, equals_ivci); + _mesa_hash_table_init(&res->surface_cache, res, NULL, equals_ivci); simple_mtx_init(&res->surface_mtx, mtx_plain); } return &res->base.b;