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 <zdobersek@igalia.com>
Fixes: a03525d8db ("tu: Split program draw state into per-shader states")
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27847>
This commit is contained in:
Zan Dobersek
2024-02-28 12:20:45 +01:00
parent fcf1a8062b
commit 3ee81ffe14
+13 -4
View File
@@ -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);
}