diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 2279a53d9..3602a3fef 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -3951,6 +3951,9 @@ void VulkanReplay::RefreshDerivedReplacements() VkGraphicsPipelineCreateInfo pipeCreateInfo; m_pDriver->GetShaderCache()->MakeGraphicsPipelineInfo(pipeCreateInfo, it->first); + rdcarray entrynames; + entrynames.reserve(pipeCreateInfo.stageCount); + // replace the modules by going via the live ID to pick up any replacements for(uint32_t i = 0; i < pipeCreateInfo.stageCount; i++) { @@ -3958,7 +3961,35 @@ void VulkanReplay::RefreshDerivedReplacements() (VkPipelineShaderStageCreateInfo &)pipeCreateInfo.pStages[i]; ResourceId shadOrigId = rm->GetOriginalID(GetResID(sh.module)); + sh.module = rm->GetLiveHandle(shadOrigId); + + if(rm->HasReplacement(shadOrigId)) + { + rdcarray entries = + m_pDriver->m_CreationInfo.m_ShaderModule[GetResID(sh.module)].spirv.EntryPoints(); + if(entries.size() > 1) + { + if(entries.contains(sh.pName)) + { + // nothing to do! + } + else + { + RDCWARN( + "Multiple entry points in edited shader, none matching original, using first " + "one '%s'", + entries[0].c_str()); + entrynames.push_back(entries[0]); + sh.pName = entrynames.back().c_str(); + } + } + else + { + entrynames.push_back(entries[0]); + sh.pName = entrynames.back().c_str(); + } + } } // if we have pipeline executable properties, capture the data