radv/rt: properly destroy radv_ray_tracing_lib_pipeline on error
authorDaniel Schürmann <daniel@schuermann.dev>
Tue, 25 Apr 2023 14:12:19 +0000 (16:12 +0200)
committerMarge Bot <emma+marge@anholt.net>
Tue, 25 Apr 2023 23:52:49 +0000 (23:52 +0000)
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

index 137b7f7..db6afe3 100644 (file)
@@ -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