diff --git a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp index fa69c4c5e5..4fc50a0e3f 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp @@ -89,6 +89,23 @@ static RDResult DeferredPipelineCompile(VkDevice device, VkRayTracingPipelineCreateInfoKHR *unwrapped = UnwrapStructAndChain(CaptureState::LoadingReplaying, mem, &createInfo); + // Patch in capture/replay creation flags + VkBaseOutStructure *nextStruct = (VkBaseOutStructure *)unwrapped->pNext; + while(nextStruct) + { + if(nextStruct->sType != VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR) + { + nextStruct = nextStruct->pNext; + continue; + } + VkPipelineCreateFlags2CreateInfoKHR *flagsInfo = + (VkPipelineCreateFlags2CreateInfoKHR *)nextStruct; + flagsInfo->flags |= VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR; + break; + } + if(!nextStruct) + unwrapped->flags |= VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR; + // patch in the capture/replay handles we saved VkRayTracingShaderGroupCreateInfoKHR *groups = (VkRayTracingShaderGroupCreateInfoKHR *)unwrapped->pGroups; @@ -1464,14 +1481,37 @@ 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 + VkBaseOutStructure *nextStruct = (VkBaseOutStructure *)unwrappedCreateInfos[i].pNext; + while(nextStruct) + { + if(nextStruct->sType != VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR) + { + nextStruct = nextStruct->pNext; + continue; + } + VkPipelineCreateFlags2CreateInfoKHR *flagsInfo = + (VkPipelineCreateFlags2CreateInfoKHR *)nextStruct; + flagsInfo->flags |= VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR; + break; + } + if(!nextStruct) + 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) {