Skip to content

Commit

Permalink
Always pass CAPTURE_REPLAY RT pipeline create flags
Browse files Browse the repository at this point in the history
This is required for RT pipelines when capture/replay handles are used,
both during capture and replay.
  • Loading branch information
pixelcluster committed Dec 10, 2024
1 parent 15b4126 commit 27fc6ee
Showing 1 changed file with 20 additions and 9 deletions.
29 changes: 20 additions & 9 deletions renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
}
}

Expand Down

0 comments on commit 27fc6ee

Please sign in to comment.