From 27fc6ee43744397a3738c79bb3ac8d7371d49496 Mon Sep 17 00:00:00 2001 From: Friedrich Vock Date: Mon, 9 Dec 2024 20:01:44 +0100 Subject: [PATCH] Always pass CAPTURE_REPLAY RT pipeline create flags This is required for RT pipelines when capture/replay handles are used, both during capture and replay. --- .../vulkan/wrappers/vk_shader_funcs.cpp | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp index fa69c4c5e5..49a254c5fc 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp @@ -1464,14 +1464,29 @@ VkResult WrappedVulkan::vkCreateRayTracingPipelinesKHR( { VkResult ret; - // to be extra sure just in case the driver doesn't, set pipelines to VK_NULL_HANDLE first. + VkRayTracingPipelineCreateInfoKHR *unwrappedCreateInfos = + UnwrapInfos(m_State, pCreateInfos, createInfoCount); + for(uint32_t i = 0; i < createInfoCount; i++) + { + // to be extra sure just in case the driver doesn't, set pipelines to VK_NULL_HANDLE first. pPipelines[i] = VK_NULL_HANDLE; + // Patch in capture/replay creation flags + VkPipelineCreateFlags2CreateInfoKHR *flagsInfo = + (VkPipelineCreateFlags2CreateInfoKHR *)FindNextStruct( + &unwrappedCreateInfos[i], VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR); + if(flagsInfo) + flagsInfo->flags |= VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR; + else + unwrappedCreateInfos[i].flags |= + VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR; + } + // deferred operations are currently not wrapped SERIALISE_TIME_CALL(ret = ObjDisp(device)->CreateRayTracingPipelinesKHR( Unwrap(device), VK_NULL_HANDLE, Unwrap(pipelineCache), createInfoCount, - UnwrapInfos(m_State, pCreateInfos, createInfoCount), NULL, pPipelines)); + unwrappedCreateInfos, NULL, pPipelines)); if(ret == VK_SUCCESS || ret == VK_PIPELINE_COMPILE_REQUIRED) { @@ -1491,19 +1506,15 @@ VkResult WrappedVulkan::vkCreateRayTracingPipelinesKHR( { CACHE_THREAD_SERIALISER(); - VkRayTracingPipelineCreateInfoKHR modifiedCreateInfo; - const VkRayTracingPipelineCreateInfoKHR *createInfo = &pCreateInfos[i]; + VkRayTracingPipelineCreateInfoKHR *createInfo = &unwrappedCreateInfos[i]; if(createInfo->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { // since we serialise one by one, we need to fixup basePipelineIndex if(createInfo->basePipelineIndex != -1 && createInfo->basePipelineIndex < (int)i) { - modifiedCreateInfo = *createInfo; - modifiedCreateInfo.basePipelineHandle = - pPipelines[modifiedCreateInfo.basePipelineIndex]; - modifiedCreateInfo.basePipelineIndex = -1; - createInfo = &modifiedCreateInfo; + createInfo->basePipelineHandle = pPipelines[createInfo->basePipelineIndex]; + createInfo->basePipelineIndex = -1; } }