radv/rt: properly destroy radv_ray_tracing_lib_pipeline on error

Also return the correct error code.

Fixes: 4dafb69d61 ('radv/rt: defer library_pipeline allocation')
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22684>
This commit is contained in:
Daniel Schürmann 2023-04-25 16:12:19 +02:00 committed by Marge Bot
parent 74a8f118a2
commit 2795cf7422

View 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