Module: Mesa
Branch: main
Commit: 2795cf7422d4246a0b514975c8f7099271287466
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=2795cf7422d4246a0b514975c8f7099271287466

Author: Daniel Schürmann <[email protected]>
Date:   Tue Apr 25 16:12:19 2023 +0200

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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22684>

---

 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 137b7f70d24..db6afe3b71c 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

Reply via email to