From d3bf6283944cf921611089fa4bba9c293f3a7372 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 9 Feb 2018 19:03:55 +0000 Subject: [PATCH] Handle opening vulkan shaders that are not in a pipeline. * Previously we were relying on the pipeline info create to initialise the reflection for an entry point, now we do it on demand wherever it is needed. --- qrenderdoc/Windows/ShaderViewer.cpp | 13 ++-- renderdoc/api/replay/shader_types.h | 2 + renderdoc/core/image_viewer.cpp | 2 +- renderdoc/core/replay_proxy.cpp | 33 +++++----- renderdoc/core/replay_proxy.h | 8 +-- renderdoc/driver/d3d11/d3d11_replay.cpp | 4 +- renderdoc/driver/d3d11/d3d11_replay.h | 2 +- renderdoc/driver/d3d12/d3d12_replay.cpp | 2 +- renderdoc/driver/d3d12/d3d12_replay.h | 2 +- renderdoc/driver/gl/gl_overlay.cpp | 4 +- renderdoc/driver/gl/gl_postvs.cpp | 12 ++-- renderdoc/driver/gl/gl_replay.cpp | 7 ++- renderdoc/driver/gl/gl_replay.h | 2 +- renderdoc/driver/shaders/spirv/spirv_common.h | 2 +- .../shaders/spirv/spirv_disassemble.cpp | 2 +- renderdoc/driver/vulkan/vk_info.cpp | 60 +++++++++---------- renderdoc/driver/vulkan/vk_info.h | 5 +- renderdoc/driver/vulkan/vk_replay.cpp | 12 ++-- renderdoc/driver/vulkan/vk_replay.h | 2 +- renderdoc/replay/replay_controller.cpp | 2 +- renderdoc/replay/replay_driver.h | 2 +- 21 files changed, 96 insertions(+), 84 deletions(-) diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index dc25732ef..ef91935ba 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -609,12 +609,17 @@ void ShaderViewer::updateWindowTitle() { if(m_ShaderDetails) { + QString shaderName = m_Ctx.GetResourceName(m_ShaderDetails->resourceId); + + // if the shader is currently bound, look up the name through the pipeline state. This is purely + // for the benefit of D3D12 which doesn't have separate shader objects + if(m_Ctx.CurPipelineState().GetShader(m_Stage) == m_ShaderDetails->resourceId) + shaderName = m_Ctx.CurPipelineState().GetShaderName(m_Stage); + if(m_Trace) - setWindowTitle(QFormatStr("Debugging %1 - %2") - .arg(m_Ctx.CurPipelineState().GetShaderName(m_Stage)) - .arg(m_DebugContext)); + setWindowTitle(QFormatStr("Debugging %1 - %2").arg(shaderName).arg(m_DebugContext)); else - setWindowTitle(m_Ctx.CurPipelineState().GetShaderName(m_Stage)); + setWindowTitle(shaderName); } } diff --git a/renderdoc/api/replay/shader_types.h b/renderdoc/api/replay/shader_types.h index f7767a6d2..0a0f24043 100644 --- a/renderdoc/api/replay/shader_types.h +++ b/renderdoc/api/replay/shader_types.h @@ -646,6 +646,8 @@ DECLARE_REFLECTION_STRUCT(ShaderResource); DOCUMENT("Describes an entry point in a shader."); struct ShaderEntryPoint { + ShaderEntryPoint() = default; + ShaderEntryPoint(const rdcstr &n, ShaderStage s) : name(n), stage(s) {} DOCUMENT(""); bool operator==(const ShaderEntryPoint &o) const { return name == o.name && stage == o.stage; } bool operator<(const ShaderEntryPoint &o) const diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index 670a40931..4c653797e 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -207,7 +207,7 @@ public: return ResourceId(); } rdcarray GetShaderEntryPoints(ResourceId shader) { return {}; } - ShaderReflection *GetShader(ResourceId shader, string entryPoint) { return NULL; } + ShaderReflection *GetShader(ResourceId shader, ShaderEntryPoint entry) { return NULL; } vector GetDisassemblyTargets() { return {"N/A"}; } string DisassembleShader(ResourceId pipeline, const ShaderReflection *refl, const string &target) { diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 66a81bfd2..20ea78714 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -817,12 +817,12 @@ rdcarray ReplayProxy::GetShaderEntryPoints(ResourceId id) template ShaderReflection *ReplayProxy::Proxied_GetShader(ParamSerialiser ¶mser, ReturnSerialiser &retser, - ResourceId id, std::string entryPoint) + ResourceId id, ShaderEntryPoint entry) { const ReplayProxyPacket packet = eReplayProxy_GetShader; ShaderReflection *ret = NULL; - ShaderReflKey key(id, entryPoint); + ShaderReflKey key(id, entry); if(retser.IsReading() && m_ShaderReflectionCache.find(key) != m_ShaderReflectionCache.end()) return m_ShaderReflectionCache[key]; @@ -830,12 +830,12 @@ ShaderReflection *ReplayProxy::Proxied_GetShader(ParamSerialiser ¶mser, Retu { BEGIN_PARAMS(); SERIALISE_ELEMENT(id); - SERIALISE_ELEMENT(entryPoint); + SERIALISE_ELEMENT(entry); END_PARAMS(); } if(paramser.IsReading() && !paramser.IsErrored() && !m_IsErrored) - ret = m_Remote->GetShader(id, entryPoint); + ret = m_Remote->GetShader(id, entry); { ReturnSerialiser &ser = retser; @@ -855,9 +855,9 @@ ShaderReflection *ReplayProxy::Proxied_GetShader(ParamSerialiser ¶mser, Retu return m_ShaderReflectionCache[key]; } -ShaderReflection *ReplayProxy::GetShader(ResourceId id, std::string entryPoint) +ShaderReflection *ReplayProxy::GetShader(ResourceId id, ShaderEntryPoint entry) { - PROXY_FUNCTION(GetShader, id, entryPoint); + PROXY_FUNCTION(GetShader, id, entry); } template @@ -868,13 +868,14 @@ std::string ReplayProxy::Proxied_DisassembleShader(ParamSerialiser ¶mser, { const ReplayProxyPacket packet = eReplayProxy_DisassembleShader; ResourceId Shader; - std::string EntryPoint; + ShaderEntryPoint EntryPoint; std::string ret; if(refl) { Shader = refl->resourceId; - EntryPoint = refl->entryPoint; + EntryPoint.name = refl->entryPoint; + EntryPoint.stage = refl->stage; } { @@ -1229,11 +1230,11 @@ void ReplayProxy::Proxied_SavePipelineState(ParamSerialiser ¶mser, ReturnSer for(int i = 0; i < 6; i++) if(stages[i]->resourceId != ResourceId()) - stages[i]->reflection = GetShader(GetLiveID(stages[i]->resourceId), ""); + stages[i]->reflection = GetShader(GetLiveID(stages[i]->resourceId), ShaderEntryPoint()); if(m_D3D11PipelineState.inputAssembly.resourceId != ResourceId()) - m_D3D11PipelineState.inputAssembly.bytecode = - GetShader(GetLiveID(m_D3D11PipelineState.inputAssembly.resourceId), ""); + m_D3D11PipelineState.inputAssembly.bytecode = GetShader( + GetLiveID(m_D3D11PipelineState.inputAssembly.resourceId), ShaderEntryPoint()); } else if(m_APIProps.pipelineType == GraphicsAPI::D3D12) { @@ -1245,7 +1246,7 @@ void ReplayProxy::Proxied_SavePipelineState(ParamSerialiser ¶mser, ReturnSer for(int i = 0; i < 6; i++) if(stages[i]->resourceId != ResourceId()) - stages[i]->reflection = GetShader(GetLiveID(stages[i]->resourceId), ""); + stages[i]->reflection = GetShader(GetLiveID(stages[i]->resourceId), ShaderEntryPoint()); } else if(m_APIProps.pipelineType == GraphicsAPI::OpenGL) { @@ -1257,7 +1258,8 @@ void ReplayProxy::Proxied_SavePipelineState(ParamSerialiser ¶mser, ReturnSer for(int i = 0; i < 6; i++) if(stages[i]->shaderResourceId != ResourceId()) - stages[i]->reflection = GetShader(GetLiveID(stages[i]->shaderResourceId), ""); + stages[i]->reflection = + GetShader(GetLiveID(stages[i]->shaderResourceId), ShaderEntryPoint()); } else if(m_APIProps.pipelineType == GraphicsAPI::Vulkan) { @@ -1270,7 +1272,8 @@ void ReplayProxy::Proxied_SavePipelineState(ParamSerialiser ¶mser, ReturnSer for(int i = 0; i < 6; i++) if(stages[i]->resourceId != ResourceId()) stages[i]->reflection = - GetShader(GetLiveID(stages[i]->resourceId), stages[i]->entryPoint); + GetShader(GetLiveID(stages[i]->resourceId), + ShaderEntryPoint(stages[i]->entryPoint, stages[i]->stage)); } } } @@ -2012,7 +2015,7 @@ bool ReplayProxy::Tick(int type) case eReplayProxy_GetBuffers: GetBuffers(); break; case eReplayProxy_GetBuffer: GetBuffer(ResourceId()); break; case eReplayProxy_GetShaderEntryPoints: GetShaderEntryPoints(ResourceId()); break; - case eReplayProxy_GetShader: GetShader(ResourceId(), ""); break; + case eReplayProxy_GetShader: GetShader(ResourceId(), ShaderEntryPoint()); break; case eReplayProxy_GetDebugMessages: GetDebugMessages(); break; case eReplayProxy_GetBufferData: { diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 9331d92ac..8bf2761fd 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -473,7 +473,7 @@ public: IMPLEMENT_FUNCTION_PROXIED(rdcarray, GetShaderEntryPoints, ResourceId shader); IMPLEMENT_FUNCTION_PROXIED(ShaderReflection *, GetShader, ResourceId shader, - std::string entryPoint); + ShaderEntryPoint entry); IMPLEMENT_FUNCTION_PROXIED(std::vector, GetDisassemblyTargets); IMPLEMENT_FUNCTION_PROXIED(std::string, DisassembleShader, ResourceId pipeline, @@ -597,15 +597,15 @@ private: struct ShaderReflKey { ShaderReflKey() {} - ShaderReflKey(ResourceId i, string e) : id(i), entryPoint(e) {} + ShaderReflKey(ResourceId i, ShaderEntryPoint e) : id(i), entry(e) {} ResourceId id; - string entryPoint; + ShaderEntryPoint entry; bool operator<(const ShaderReflKey &o) const { if(id != o.id) return id < o.id; - return entryPoint < o.entryPoint; + return entry < o.entry; } }; diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index a551b2703..c600a2287 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -370,7 +370,7 @@ rdcarray D3D11Replay::GetShaderEntryPoints(ResourceId shader) return {{"main", ret.stage}}; } -ShaderReflection *D3D11Replay::GetShader(ResourceId shader, string entryPoint) +ShaderReflection *D3D11Replay::GetShader(ResourceId shader, ShaderEntryPoint entry) { auto it = WrappedShader::m_ShaderList.find(shader); @@ -590,7 +590,7 @@ void D3D11Replay::SavePipelineState() ResourceId layoutId = GetIDForResource(rs->IA.Layout); ret.inputAssembly.resourceId = rm->GetOriginalID(layoutId); - ret.inputAssembly.bytecode = GetShader(layoutId, ""); + ret.inputAssembly.bytecode = GetShader(layoutId, ShaderEntryPoint()); ret.inputAssembly.layouts.resize(vec.size()); for(size_t i = 0; i < vec.size(); i++) diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index 7c3718acd..a7a722641 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -116,7 +116,7 @@ public: vector GetDebugMessages(); rdcarray GetShaderEntryPoints(ResourceId shader); - ShaderReflection *GetShader(ResourceId shader, string entryPoint); + ShaderReflection *GetShader(ResourceId shader, ShaderEntryPoint entry); vector GetDisassemblyTargets(); string DisassembleShader(ResourceId pipeline, const ShaderReflection *refl, const string &target); diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 017911d91..527dc3fae 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -306,7 +306,7 @@ rdcarray D3D12Replay::GetShaderEntryPoints(ResourceId shader) return {{"main", ret.stage}}; } -ShaderReflection *D3D12Replay::GetShader(ResourceId shader, string entryPoint) +ShaderReflection *D3D12Replay::GetShader(ResourceId shader, ShaderEntryPoint entry) { WrappedID3D12Shader *sh = m_pDevice->GetResourceManager()->GetCurrentAs(shader); diff --git a/renderdoc/driver/d3d12/d3d12_replay.h b/renderdoc/driver/d3d12/d3d12_replay.h index 6705fd984..df978843a 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.h +++ b/renderdoc/driver/d3d12/d3d12_replay.h @@ -71,7 +71,7 @@ public: vector GetDebugMessages(); rdcarray GetShaderEntryPoints(ResourceId shader); - ShaderReflection *GetShader(ResourceId shader, string entryPoint); + ShaderReflection *GetShader(ResourceId shader, ShaderEntryPoint entry); vector GetDisassemblyTargets(); string DisassembleShader(ResourceId pipeline, const ShaderReflection *refl, const string &target); diff --git a/renderdoc/driver/gl/gl_overlay.cpp b/renderdoc/driver/gl/gl_overlay.cpp index df26a596e..e38d9dbec 100644 --- a/renderdoc/driver/gl/gl_overlay.cpp +++ b/renderdoc/driver/gl/gl_overlay.cpp @@ -69,7 +69,7 @@ void GLReplay::SetupOverlayPipeline(GLuint Program, GLuint Pipeline, GLuint frag if(i == 0) { CopyProgramAttribBindings(gl.GetHookset(), progsrc, progdst, - GetShader(pipeDetails.stageShaders[i], "")); + GetShader(pipeDetails.stageShaders[i], ShaderEntryPoint())); gl.glLinkProgram(progdst); } @@ -94,7 +94,7 @@ void GLReplay::SetupOverlayPipeline(GLuint Program, GLuint Pipeline, GLuint frag if(i == 0) { CopyProgramAttribBindings(gl.GetHookset(), Program, progdst, - GetShader(progDetails.stageShaders[i], "")); + GetShader(progDetails.stageShaders[i], ShaderEntryPoint())); gl.glLinkProgram(progdst); } diff --git a/renderdoc/driver/gl/gl_postvs.cpp b/renderdoc/driver/gl/gl_postvs.cpp index 11a311f99..5ad5f8da2 100644 --- a/renderdoc/driver/gl/gl_postvs.cpp +++ b/renderdoc/driver/gl/gl_postvs.cpp @@ -100,7 +100,7 @@ void GLReplay::InitPostVSBuffers(uint32_t eventId) if(pipeDetails.stageShaders[0] != ResourceId()) { - vsRefl = GetShader(pipeDetails.stageShaders[0], ""); + vsRefl = GetShader(pipeDetails.stageShaders[0], ShaderEntryPoint()); vsProg = m_pDriver->m_Shaders[pipeDetails.stageShaders[0]].prog; vsProgSrc = rm->GetCurrentResource(pipeDetails.stagePrograms[0]).name; } @@ -111,13 +111,13 @@ void GLReplay::InitPostVSBuffers(uint32_t eventId) } if(pipeDetails.stageShaders[2] != ResourceId()) { - tesRefl = GetShader(pipeDetails.stageShaders[2], ""); + tesRefl = GetShader(pipeDetails.stageShaders[2], ShaderEntryPoint()); tesProg = m_pDriver->m_Shaders[pipeDetails.stageShaders[2]].prog; tesProgSrc = rm->GetCurrentResource(pipeDetails.stagePrograms[2]).name; } if(pipeDetails.stageShaders[3] != ResourceId()) { - gsRefl = GetShader(pipeDetails.stageShaders[3], ""); + gsRefl = GetShader(pipeDetails.stageShaders[3], ShaderEntryPoint()); gsProg = m_pDriver->m_Shaders[pipeDetails.stageShaders[3]].prog; gsProgSrc = rm->GetCurrentResource(pipeDetails.stagePrograms[3]).name; } @@ -129,7 +129,7 @@ void GLReplay::InitPostVSBuffers(uint32_t eventId) if(progDetails.stageShaders[0] != ResourceId()) { - vsRefl = GetShader(progDetails.stageShaders[0], ""); + vsRefl = GetShader(progDetails.stageShaders[0], ShaderEntryPoint()); vsProg = m_pDriver->m_Shaders[progDetails.stageShaders[0]].prog; } if(progDetails.stageShaders[1] != ResourceId()) @@ -138,12 +138,12 @@ void GLReplay::InitPostVSBuffers(uint32_t eventId) } if(progDetails.stageShaders[2] != ResourceId()) { - tesRefl = GetShader(progDetails.stageShaders[2], ""); + tesRefl = GetShader(progDetails.stageShaders[2], ShaderEntryPoint()); tesProg = m_pDriver->m_Shaders[progDetails.stageShaders[2]].prog; } if(progDetails.stageShaders[3] != ResourceId()) { - gsRefl = GetShader(progDetails.stageShaders[3], ""); + gsRefl = GetShader(progDetails.stageShaders[3], ShaderEntryPoint()); gsProg = m_pDriver->m_Shaders[progDetails.stageShaders[3]].prog; } diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 0e4019002..cf7ec2ecc 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -603,7 +603,7 @@ rdcarray GLReplay::GetShaderEntryPoints(ResourceId shader) return {{"main", MakeShaderStage(shaderDetails.type)}}; } -ShaderReflection *GLReplay::GetShader(ResourceId shader, string entryPoint) +ShaderReflection *GLReplay::GetShader(ResourceId shader, ShaderEntryPoint entry) { auto &shaderDetails = m_pDriver->m_Shaders[shader]; @@ -881,7 +881,8 @@ void GLReplay::SavePipelineState() if(pipeDetails.stageShaders[i] != ResourceId()) { curProg = rm->GetCurrentResource(pipeDetails.stagePrograms[i]).name; - stages[i]->reflection = refls[i] = GetShader(pipeDetails.stageShaders[i], ""); + stages[i]->reflection = refls[i] = + GetShader(pipeDetails.stageShaders[i], ShaderEntryPoint()); GetBindpointMapping(gl.GetHookset(), curProg, (int)i, refls[i], stages[i]->bindpointMapping); mappings[i] = &stages[i]->bindpointMapping; @@ -907,7 +908,7 @@ void GLReplay::SavePipelineState() { if(progDetails.stageShaders[i] != ResourceId()) { - stages[i]->reflection = refls[i] = GetShader(progDetails.stageShaders[i], ""); + stages[i]->reflection = refls[i] = GetShader(progDetails.stageShaders[i], ShaderEntryPoint()); GetBindpointMapping(gl.GetHookset(), curProg, (int)i, refls[i], stages[i]->bindpointMapping); mappings[i] = &stages[i]->bindpointMapping; diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 1661d7d99..a06ac850e 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -103,7 +103,7 @@ public: TextureDescription GetTexture(ResourceId id); rdcarray GetShaderEntryPoints(ResourceId shader); - ShaderReflection *GetShader(ResourceId shader, string entryPoint); + ShaderReflection *GetShader(ResourceId shader, ShaderEntryPoint entry); vector GetDisassemblyTargets(); string DisassembleShader(ResourceId pipeline, const ShaderReflection *refl, const string &target); diff --git a/renderdoc/driver/shaders/spirv/spirv_common.h b/renderdoc/driver/shaders/spirv/spirv_common.h index 3f6bdf1a9..426a9d520 100644 --- a/renderdoc/driver/shaders/spirv/spirv_common.h +++ b/renderdoc/driver/shaders/spirv/spirv_common.h @@ -137,7 +137,7 @@ struct SPVModule ShaderStage StageForEntry(const string &entryPoint) const; void MakeReflection(ShaderStage stage, const string &entryPoint, ShaderReflection &reflection, - ShaderBindpointMapping &mapping, SPIRVPatchData &patchData); + ShaderBindpointMapping &mapping, SPIRVPatchData &patchData) const; }; string CompileSPIRV(const SPIRVCompilationSettings &settings, const vector &sources, diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index 42d765ab0..55ba2e9e2 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -3924,7 +3924,7 @@ ShaderStage SPVModule::StageForEntry(const string &entryPoint) const void SPVModule::MakeReflection(ShaderStage stage, const string &entryPoint, ShaderReflection &reflection, ShaderBindpointMapping &mapping, - SPIRVPatchData &patchData) + SPIRVPatchData &patchData) const { vector inputs; vector outputs; diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 063bfeabd..47d655568 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -138,23 +138,8 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk ShaderModule::Reflection &reflData = info.m_ShaderModule[id].m_Reflections[shad.entryPoint]; - if(reflData.entryPoint.empty()) - { - SPVModule &spv = info.m_ShaderModule[id].spirv; - spv.MakeReflection(ShaderStage(reflData.stage), shad.entryPoint, reflData.refl, - reflData.mapping, reflData.patchData); - - reflData.entryPoint = shad.entryPoint; - reflData.stage = stageIndex; - reflData.refl.resourceId = resourceMan->GetOriginalID(id); - - if(!spv.spirv.empty()) - { - const std::vector &spirv = spv.spirv; - reflData.refl.encoding = ShaderEncoding::SPIRV; - reflData.refl.rawBytes.assign((byte *)spirv.data(), spirv.size() * sizeof(uint32_t)); - } - } + reflData.Init(resourceMan, id, info.m_ShaderModule[id].spirv, shad.entryPoint, + pCreateInfo->pStages[i].stage); if(pCreateInfo->pStages[i].pSpecializationInfo) { @@ -364,22 +349,8 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk ShaderModule::Reflection &reflData = info.m_ShaderModule[id].m_Reflections[shad.entryPoint]; - if(reflData.entryPoint.empty()) - { - reflData.entryPoint = shad.entryPoint; - reflData.stage = StageIndex(pCreateInfo->stage.stage); - SPVModule &spv = info.m_ShaderModule[id].spirv; - spv.MakeReflection(ShaderStage::Compute, shad.entryPoint, reflData.refl, reflData.mapping, - reflData.patchData); - reflData.refl.resourceId = resourceMan->GetOriginalID(id); - - if(!spv.spirv.empty()) - { - const vector &spirv = spv.spirv; - reflData.refl.encoding = ShaderEncoding::SPIRV; - reflData.refl.rawBytes.assign((byte *)spirv.data(), spirv.size() * sizeof(uint32_t)); - } - } + reflData.Init(resourceMan, id, info.m_ShaderModule[id].spirv, shad.entryPoint, + pCreateInfo->stage.stage); if(pCreateInfo->stage.pSpecializationInfo) { @@ -638,3 +609,26 @@ void VulkanCreationInfo::ShaderModule::Init(VulkanResourceManager *resourceMan, ParseSPIRV((uint32_t *)pCreateInfo->pCode, pCreateInfo->codeSize / sizeof(uint32_t), spirv); } } + +void VulkanCreationInfo::ShaderModule::Reflection::Init(VulkanResourceManager *resourceMan, + ResourceId id, const SPVModule &spv, + const std::string &entry, + VkShaderStageFlagBits stage) +{ + if(entryPoint.empty()) + { + entryPoint = entry; + stageIndex = StageIndex(stage); + + spv.MakeReflection(ShaderStage(stageIndex), entryPoint, refl, mapping, patchData); + + refl.resourceId = resourceMan->GetOriginalID(id); + refl.entryPoint = entryPoint; + + if(!spv.spirv.empty()) + { + refl.encoding = ShaderEncoding::SPIRV; + refl.rawBytes.assign((byte *)spv.spirv.data(), spv.spirv.size() * sizeof(uint32_t)); + } + } +} \ No newline at end of file diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index 22b601be8..6f2f38e55 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -355,12 +355,15 @@ struct VulkanCreationInfo struct Reflection { - uint32_t stage; + uint32_t stageIndex; string entryPoint; string disassembly; ShaderReflection refl; ShaderBindpointMapping mapping; SPIRVPatchData patchData; + + void Init(VulkanResourceManager *resourceMan, ResourceId id, const SPVModule &spv, + const std::string &entry, VkShaderStageFlagBits stage); }; map m_Reflections; }; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 2890aca1a..dd519c913 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -318,7 +318,7 @@ rdcarray VulkanReplay::GetShaderEntryPoints(ResourceId shader) return ret; } -ShaderReflection *VulkanReplay::GetShader(ResourceId shader, string entryPoint) +ShaderReflection *VulkanReplay::GetShader(ResourceId shader, ShaderEntryPoint entry) { auto shad = m_pDriver->m_CreationInfo.m_ShaderModule.find(shader); @@ -328,7 +328,11 @@ ShaderReflection *VulkanReplay::GetShader(ResourceId shader, string entryPoint) return NULL; } - return &shad->second.m_Reflections[entryPoint].refl; + shad->second.m_Reflections[entry.name].Init(GetResourceManager(), shader, shad->second.spirv, + entry.name, + VkShaderStageFlagBits(1 << uint32_t(entry.stage))); + + return &shad->second.m_Reflections[entry.name].refl; } vector VulkanReplay::GetDisassemblyTargets() @@ -383,7 +387,7 @@ string VulkanReplay::DisassembleShader(ResourceId pipeline, const ShaderReflecti VkPipeline pipe = m_pDriver->GetResourceManager()->GetLiveHandle(pipeline); VkShaderStageFlagBits stageBit = - VkShaderStageFlagBits(1 << it->second.m_Reflections[refl->entryPoint.c_str()].stage); + VkShaderStageFlagBits(1 << it->second.m_Reflections[refl->entryPoint.c_str()].stageIndex); size_t size; vt->GetShaderInfoAMD(Unwrap(dev), Unwrap(pipe), stageBit, VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD, @@ -1636,7 +1640,7 @@ void VulkanReplay::FillCBufferVariables(ResourceId shader, string entryPoint, ui if(pipeIt != m_pDriver->m_CreationInfo.m_Pipeline.end()) { auto specInfo = - pipeIt->second.shaders[it->second.m_Reflections[entryPoint].stage].specialization; + pipeIt->second.shaders[it->second.m_Reflections[entryPoint].stageIndex].specialization; // find any actual values specified for(size_t i = 0; i < specInfo.size(); i++) diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index 4b3221185..4c34bad55 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -194,7 +194,7 @@ public: TextureDescription GetTexture(ResourceId id); rdcarray GetShaderEntryPoints(ResourceId shader); - ShaderReflection *GetShader(ResourceId shader, string entryPoint); + ShaderReflection *GetShader(ResourceId shader, ShaderEntryPoint entry); vector GetDisassemblyTargets(); string DisassembleShader(ResourceId pipeline, const ShaderReflection *refl, const string &target); diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index 25934ed38..2b0389533 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -333,7 +333,7 @@ rdcarray ReplayController::GetShaderEntryPoints(ResourceId sha ShaderReflection *ReplayController::GetShader(ResourceId shader, ShaderEntryPoint entry) { - return m_pDevice->GetShader(m_pDevice->GetLiveID(shader), entry.name); + return m_pDevice->GetShader(m_pDevice->GetLiveID(shader), entry); } rdcarray ReplayController::GetUsage(ResourceId id) diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 646632d90..368fbc371 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -101,7 +101,7 @@ public: virtual vector GetDebugMessages() = 0; virtual rdcarray GetShaderEntryPoints(ResourceId shader) = 0; - virtual ShaderReflection *GetShader(ResourceId shader, string entryPoint) = 0; + virtual ShaderReflection *GetShader(ResourceId shader, ShaderEntryPoint entry) = 0; virtual vector GetDisassemblyTargets() = 0; virtual string DisassembleShader(ResourceId pipeline, const ShaderReflection *refl,