From 3ee81ffe14c62b7c38dbe136aef88a88165a0900 Mon Sep 17 00:00:00 2001 From: Zan Dobersek Date: Wed, 28 Feb 2024 12:20:45 +0100 Subject: [PATCH] tu: fix memory leaks in tu_shader When tu_shader object is destroyed through vk_pipeline_cache, the relevant destroy callback should relay to the general tu_shader_destroy function that will also clean up owned resources. During shader creation, the ir3_shader object should be destroyed once the shader variants are retrieved. Since those variants are owned by tu_shader they should be freed up in tu_shader_destroy. Signed-off-by: Zan Dobersek Fixes: a03525d8db7 ("tu: Split program draw state into per-shader states") Reviewed-by: Connor Abbott Part-of: --- src/freedreno/vulkan/tu_shader.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc index 608420e47eb..f10bd484e04 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -2251,20 +2251,21 @@ tu_shader_deserialize(struct vk_pipeline_cache *cache, struct blob_reader *blob); static void -tu_shader_destroy(struct vk_device *device, - struct vk_pipeline_cache_object *object) +tu_shader_pipeline_cache_object_destroy(struct vk_device *vk_device, + struct vk_pipeline_cache_object *object) { + struct tu_device *device = container_of(vk_device, struct tu_device, vk); struct tu_shader *shader = container_of(object, struct tu_shader, base); vk_pipeline_cache_object_finish(&shader->base); - vk_free(&device->alloc, shader); + tu_shader_destroy(device, shader); } const struct vk_pipeline_cache_object_ops tu_shader_ops = { .serialize = tu_shader_serialize, .deserialize = tu_shader_deserialize, - .destroy = tu_shader_destroy, + .destroy = tu_shader_pipeline_cache_object_destroy, }; static struct tu_shader * @@ -2527,6 +2528,8 @@ tu_shader_create(struct tu_device *dev, executable_info); } + ir3_shader_destroy(ir3_shader); + shader->view_mask = key->multiview_mask; switch (shader->variant->type) { @@ -2930,6 +2933,7 @@ tu_empty_fs_create(struct tu_device *dev, struct tu_shader **shader, struct ir3_shader *ir3_shader = ir3_shader_from_nir(dev->compiler, fs_b.shader, &options, &so_info); (*shader)->variant = ir3_shader_create_variant(ir3_shader, &key, false); + ir3_shader_destroy(ir3_shader); return tu_upload_shader(dev, *shader); } @@ -2999,5 +3003,10 @@ tu_shader_destroy(struct tu_device *dev, if (shader->pvtmem_bo) tu_bo_finish(dev, shader->pvtmem_bo); + if (shader->variant) + ralloc_free((void *)shader->variant); + if (shader->safe_const_variant) + ralloc_free((void *)shader->safe_const_variant); + vk_free(&dev->vk.alloc, shader); }