diff --git a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp index a7c0f577e..950a7e1d3 100644 --- a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp @@ -67,7 +67,7 @@ void AddXFBAnnotations(const ShaderReflection &refl, const SPIRVPatchData &patch rdcspv::Id entryid; for(const rdcspv::EntryPoint &entry : editor.GetEntries()) { - if(entry.name == entryName) + if(entry.name == entryName && MakeShaderStage(entry.executionModel) == refl.stage) { entryid = entry.id; break; @@ -582,23 +582,15 @@ void Reflector::PostParse() memberNames.clear(); } -rdcarray Reflector::EntryPoints() const +rdcarray Reflector::EntryPoints() const { - rdcarray ret; + rdcarray ret; ret.reserve(entries.size()); for(const EntryPoint &e : entries) - ret.push_back(e.name); + ret.push_back({e.name, MakeShaderStage(e.executionModel)}); return ret; } -ShaderStage Reflector::StageForEntry(const rdcstr &entryPoint) const -{ - for(const EntryPoint &e : entries) - if(entryPoint == e.name) - return MakeShaderStage(e.executionModel); - return ShaderStage::Count; -} - void Reflector::MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage stage, const rdcstr &entryPoint, const rdcarray &specInfo, ShaderReflection &reflection, ShaderBindpointMapping &mapping, @@ -615,7 +607,7 @@ void Reflector::MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage st const EntryPoint *entry = NULL; for(const EntryPoint &e : entries) { - if(entryPoint == e.name) + if(entryPoint == e.name && MakeShaderStage(e.executionModel) == stage) { entry = &e; break; @@ -626,7 +618,8 @@ void Reflector::MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage st if(!entry) { - RDCERR("Entry point %s not found in module", entryPoint.c_str()); + RDCERR("Entry point %s for stage %s not found in module", entryPoint.c_str(), + ToStr(stage).c_str()); return; } diff --git a/renderdoc/driver/shaders/spirv/spirv_reflect.h b/renderdoc/driver/shaders/spirv/spirv_reflect.h index e9f8436b4..e0ee49a32 100644 --- a/renderdoc/driver/shaders/spirv/spirv_reflect.h +++ b/renderdoc/driver/shaders/spirv/spirv_reflect.h @@ -84,8 +84,7 @@ public: rdcstr Disassemble(const rdcstr &entryPoint, std::map &instructionLines) const; - rdcarray EntryPoints() const; - ShaderStage StageForEntry(const rdcstr &entryPoint) const; + rdcarray EntryPoints() const; void MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage stage, const rdcstr &entryPoint, const rdcarray &specInfo, ShaderReflection &reflection, diff --git a/renderdoc/driver/vulkan/vk_bindless_feedback.cpp b/renderdoc/driver/vulkan/vk_bindless_feedback.cpp index b09f47751..0554df477 100644 --- a/renderdoc/driver/vulkan/vk_bindless_feedback.cpp +++ b/renderdoc/driver/vulkan/vk_bindless_feedback.cpp @@ -44,7 +44,7 @@ struct feedbackData uint32_t numEntries; }; -void AnnotateShader(const SPIRVPatchData &patchData, const char *entryName, +void AnnotateShader(const SPIRVPatchData &patchData, ShaderStage stage, const char *entryName, const std::map &offsetMap, uint32_t maxSlot, VkDeviceAddress addr, bool bufferAddressKHR, rdcarray &modSpirv) { @@ -227,7 +227,7 @@ void AnnotateShader(const SPIRVPatchData &patchData, const char *entryName, rdcspv::Id entryID; for(const rdcspv::EntryPoint &entry : editor.GetEntries()) { - if(entry.name == entryName) + if(entry.name == entryName && MakeShaderStage(entry.executionModel) == stage) { entryID = entry.id; break; @@ -769,8 +769,8 @@ void VulkanReplay::FetchShaderFeedback(uint32_t eventId) if(!Vulkan_Debug_FeedbackDumpDirPath().empty()) FileIO::WriteAll(Vulkan_Debug_FeedbackDumpDirPath() + "/before_" + filename[5], modSpirv); - AnnotateShader(*pipeInfo.shaders[5].patchData, stage.pName, offsetMap, maxSlot, bufferAddress, - useBufferAddressKHR, modSpirv); + AnnotateShader(*pipeInfo.shaders[5].patchData, ShaderStage(StageIndex(stage.stage)), + stage.pName, offsetMap, maxSlot, bufferAddress, useBufferAddressKHR, modSpirv); if(!Vulkan_Debug_FeedbackDumpDirPath().empty()) FileIO::WriteAll(Vulkan_Debug_FeedbackDumpDirPath() + "/after_" + filename[5], modSpirv); @@ -800,8 +800,8 @@ void VulkanReplay::FetchShaderFeedback(uint32_t eventId) if(!Vulkan_Debug_FeedbackDumpDirPath().empty()) FileIO::WriteAll(Vulkan_Debug_FeedbackDumpDirPath() + "/before_" + filename[idx], modSpirv); - AnnotateShader(*pipeInfo.shaders[idx].patchData, stage.pName, offsetMap, maxSlot, - bufferAddress, useBufferAddressKHR, modSpirv); + AnnotateShader(*pipeInfo.shaders[idx].patchData, ShaderStage(StageIndex(stage.stage)), + stage.pName, offsetMap, maxSlot, bufferAddress, useBufferAddressKHR, modSpirv); if(!Vulkan_Debug_FeedbackDumpDirPath().empty()) FileIO::WriteAll(Vulkan_Debug_FeedbackDumpDirPath() + "/after_" + filename[idx], modSpirv); diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 485e4f9b4..773955dce 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -373,6 +373,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, shad.module = shadid; shad.entryPoint = pCreateInfo->pStages[i].pName; + shad.stage = ShaderStage(stageIndex); ShaderModuleReflectionKey key(shad.entryPoint, ResourceId()); diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index 23a3dc85d..ebd549299 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -249,6 +249,7 @@ struct VulkanCreationInfo { Shader() : refl(NULL), mapping(NULL), patchData(NULL) {} ResourceId module; + ShaderStage stage; rdcstr entryPoint; ShaderReflection *refl; ShaderBindpointMapping *mapping; diff --git a/renderdoc/driver/vulkan/vk_pixelhistory.cpp b/renderdoc/driver/vulkan/vk_pixelhistory.cpp index e008d5412..63d70ceee 100644 --- a/renderdoc/driver/vulkan/vk_pixelhistory.cpp +++ b/renderdoc/driver/vulkan/vk_pixelhistory.cpp @@ -284,7 +284,8 @@ struct PixelHistoryShaderCache // Returns a shader that is equivalent to the given shader, but attempts to remove // side effects of shader execution for the given entry point (for ex., writes // to storage buffers/images). - VkShaderModule GetShaderWithoutSideEffects(ResourceId shaderId, const rdcstr &entryPoint) + VkShaderModule GetShaderWithoutSideEffects(ResourceId shaderId, const rdcstr &entryPoint, + ShaderStage stage) { ShaderKey shaderKey = make_rdcpair(shaderId, entryPoint); auto it = m_ShaderReplacements.find(shaderKey); @@ -292,13 +293,14 @@ struct PixelHistoryShaderCache if(it != m_ShaderReplacements.end()) return it->second; - VkShaderModule shaderModule = CreateShaderReplacement(shaderId, entryPoint); + VkShaderModule shaderModule = CreateShaderReplacement(shaderId, entryPoint, stage); m_ShaderReplacements.insert(std::make_pair(shaderKey, shaderModule)); return shaderModule; } private: - VkShaderModule CreateShaderReplacement(ResourceId shaderId, const rdcstr &entryName) + VkShaderModule CreateShaderReplacement(ResourceId shaderId, const rdcstr &entryName, + ShaderStage stage) { const VulkanCreationInfo::ShaderModule &moduleInfo = m_pDriver->GetDebugManager()->GetShaderInfo(shaderId); @@ -308,7 +310,7 @@ private: for(const rdcspv::EntryPoint &entry : editor.GetEntries()) { - if(entry.name == entryName) + if(entry.name == entryName && MakeShaderStage(entry.executionModel) == stage) { // In some cases a shader might just be binding a RW resource but not writing to it. // If there are no writes (shader was not modified), no need to replace the shader, @@ -595,8 +597,8 @@ protected: for(size_t i = 0; i < numberOfStages; i++) { if((eventFlags & PipeStageRWEventFlags(StageFromIndex(i))) != EventFlags::NoFlags) - replacementShaders[i] = - m_ShaderCache->GetShaderWithoutSideEffects(p.shaders[i].module, p.shaders[i].entryPoint); + replacementShaders[i] = m_ShaderCache->GetShaderWithoutSideEffects( + p.shaders[i].module, p.shaders[i].entryPoint, p.shaders[i].stage); } for(uint32_t i = 0; i < pipeCreateInfo.stageCount; i++) { @@ -1930,8 +1932,8 @@ private: ShaderStage stage = StageFromIndex(i); bool rwInStage = (eventShaderFlags & PipeStageRWEventFlags(stage)) != EventFlags::NoFlags; if(rwInStage || (stage == ShaderStage::Fragment)) - replacementShaders[i] = - m_ShaderCache->GetShaderWithoutSideEffects(p.shaders[i].module, p.shaders[i].entryPoint); + replacementShaders[i] = m_ShaderCache->GetShaderWithoutSideEffects( + p.shaders[i].module, p.shaders[i].entryPoint, p.shaders[i].stage); } VulkanRenderState &pipestate = m_pDriver->GetCmdRenderState(); @@ -2506,8 +2508,8 @@ struct VulkanPixelHistoryPerFragmentCallback : VulkanPixelHistoryCallback for(size_t i = 0; i < numberOfStages; i++) { if((eventFlags & PipeStageRWEventFlags(StageFromIndex(i))) != EventFlags::NoFlags) - replacementShaders[i] = - m_ShaderCache->GetShaderWithoutSideEffects(p.shaders[i].module, p.shaders[i].entryPoint); + replacementShaders[i] = m_ShaderCache->GetShaderWithoutSideEffects( + p.shaders[i].module, p.shaders[i].entryPoint, p.shaders[i].stage); } for(uint32_t i = 0; i < pipeCreateInfo.stageCount; i++) { diff --git a/renderdoc/driver/vulkan/vk_postvs.cpp b/renderdoc/driver/vulkan/vk_postvs.cpp index 92bed08e2..c28073c06 100644 --- a/renderdoc/driver/vulkan/vk_postvs.cpp +++ b/renderdoc/driver/vulkan/vk_postvs.cpp @@ -450,7 +450,7 @@ static void ConvertToMeshOutputCompute(const ShaderReflection &refl, const SPIRV for(const rdcspv::EntryPoint &entry : editor.GetEntries()) { - if(entry.name == entryName) + if(entry.name == entryName && entry.executionModel == rdcspv::ExecutionModel::Vertex) entryID = entry.id; entries.insert(entry.id); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 69fb9b352..2fce76d4b 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -416,14 +416,7 @@ rdcarray VulkanReplay::GetShaderEntryPoints(ResourceId shader) if(shad == m_pDriver->m_CreationInfo.m_ShaderModule.end()) return {}; - rdcarray entries = shad->second.spirv.EntryPoints(); - - rdcarray ret; - - for(const rdcstr &e : entries) - ret.push_back({e, shad->second.spirv.StageForEntry(e)}); - - return ret; + return shad->second.spirv.EntryPoints(); } ShaderReflection *VulkanReplay::GetShader(ResourceId pipeline, ResourceId shader, @@ -4024,11 +4017,11 @@ void VulkanReplay::RefreshDerivedReplacements() if(rm->HasReplacement(shadOrigId)) { - rdcarray entries = + rdcarray entries = m_pDriver->m_CreationInfo.m_ShaderModule[GetResID(sh.module)].spirv.EntryPoints(); if(entries.size() > 1) { - if(entries.contains(sh.pName)) + if(entries.contains({sh.pName, ShaderStage(StageIndex(sh.stage))})) { // nothing to do! } @@ -4037,14 +4030,14 @@ void VulkanReplay::RefreshDerivedReplacements() RDCWARN( "Multiple entry points in edited shader, none matching original, using first " "one '%s'", - entries[0].c_str()); - entrynames.push_back(entries[0]); + entries[0].name.c_str()); + entrynames.push_back(entries[0].name); sh.pName = entrynames.back().c_str(); } } else { - entrynames.push_back(entries[0]); + entrynames.push_back(entries[0].name); sh.pName = entrynames.back().c_str(); } } diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 3afc3d7ac..0464df960 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -2922,7 +2922,7 @@ static void CreatePSInputFetcher(rdcarray &fragspv, uint32_t &structSt rdcspv::Id entryID; for(const rdcspv::EntryPoint &e : editor.GetEntries()) { - if(e.name == shadRefl.entryPoint) + if(e.name == shadRefl.entryPoint && e.executionModel == rdcspv::ExecutionModel::Fragment) { entryID = e.id; break;