From 2795cf7422d4246a0b514975c8f7099271287466 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 25 Apr 2023 16:12:19 +0200 Subject: [PATCH] radv/rt: properly destroy radv_ray_tracing_lib_pipeline on error Also return the correct error code. Fixes: 4dafb69d61820c4a9b71856e62797b51f13df91c ('radv/rt: defer library_pipeline allocation') Part-of: --- src/amd/vulkan/radv_pipeline_rt.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline_rt.c b/src/amd/vulkan/radv_pipeline_rt.c index 137b7f7..db6afe3 100644 --- a/src/amd/vulkan/radv_pipeline_rt.c +++ b/src/amd/vulkan/radv_pipeline_rt.c @@ -329,6 +329,7 @@ radv_rt_pipeline_library_create(VkDevice _device, VkPipelineCache _cache, { RADV_FROM_HANDLE(radv_device, device, _device); struct radv_ray_tracing_lib_pipeline *pipeline; + VkResult result = VK_SUCCESS; VkRayTracingPipelineCreateInfoKHR local_create_info = radv_create_merged_rt_create_info(pCreateInfo); @@ -339,22 +340,26 @@ radv_rt_pipeline_library_create(VkDevice _device, VkPipelineCache _cache, sizeof(*pipeline) + local_create_info.groupCount * sizeof(struct radv_ray_tracing_module); pipeline = vk_zalloc2(&device->vk.alloc, pAllocator, pipeline_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (pipeline == NULL) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + if (!pipeline) { + result = VK_ERROR_OUT_OF_HOST_MEMORY; + goto fail; + } radv_pipeline_init(device, &pipeline->base, RADV_PIPELINE_RAY_TRACING_LIB); pipeline->ctx = ralloc_context(NULL); - VkResult result = radv_create_group_handles(device, &local_create_info, pipeline->groups); + result = radv_create_group_handles(device, &local_create_info, pipeline->groups); if (result != VK_SUCCESS) - goto fail; + goto pipeline_fail; if (local_create_info.stageCount) { pipeline->stages = radv_copy_shader_stage_create_info( device, local_create_info.stageCount, local_create_info.pStages, pipeline->ctx); - if (!pipeline->stages) - goto fail; + if (!pipeline->stages) { + result = VK_ERROR_OUT_OF_HOST_MEMORY; + goto pipeline_fail; + } pipeline->stage_count = local_create_info.stageCount; } @@ -363,22 +368,22 @@ radv_rt_pipeline_library_create(VkDevice _device, VkPipelineCache _cache, size_t size = sizeof(VkRayTracingShaderGroupCreateInfoKHR) * local_create_info.groupCount; pipeline->group_count = local_create_info.groupCount; pipeline->group_infos = ralloc_size(pipeline->ctx, size); - if (!pipeline->group_infos) - goto fail; + if (!pipeline->group_infos) { + result = VK_ERROR_OUT_OF_HOST_MEMORY; + goto pipeline_fail; + } memcpy(pipeline->group_infos, local_create_info.pGroups, size); } *pPipeline = radv_pipeline_to_handle(&pipeline->base); - free((void *)local_create_info.pGroups); - free((void *)local_create_info.pStages); - return VK_SUCCESS; +pipeline_fail: + if (result != VK_SUCCESS) + radv_pipeline_destroy(device, &pipeline->base, pAllocator); fail: - free(pipeline->group_infos); - ralloc_free(pipeline->ctx); free((void *)local_create_info.pGroups); free((void *)local_create_info.pStages); - return VK_ERROR_OUT_OF_HOST_MEMORY; + return result; } void -- 2.7.4