From ed8aeae74fef7e82b0287c6a6d54b7e5b05762e8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 26 May 2020 12:47:09 +0100 Subject: [PATCH] Replace entry point when editing shaders in vulkan * We assume the replaced module only has one entry point, which won't necessarily always hold... --- renderdoc/driver/vulkan/vk_replay.cpp | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) 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