diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 44b084bca..5e6dfef85 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -727,6 +727,10 @@ re-initialise any data, including e.g. bindless feedback, printf results or mesh )"); virtual void ClearReplayCache() = 0; + DOCUMENT(R"(Reload the shader debug information for all shaders in the capture. +)"); + virtual void ReloadShaderDebugInformation() = 0; + DOCUMENT(R"(Remove any previously specified replacement for an object. See :meth:`ReplaceResource`. diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index 646b68418..b4223dbcb 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -368,6 +368,7 @@ public: } void ReplaceResource(ResourceId from, ResourceId to) {} void ClearReplayCache() {} + void ReloadShaderDebugInformation() {} void RemoveReplacement(ResourceId id) {} // these are proxy functions, and will never be used ResourceId CreateProxyTexture(const TextureDescription &templateTex) diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 70749b13c..ef6875a7e 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -1369,6 +1369,32 @@ void ReplayProxy::ClearReplayCache() PROXY_FUNCTION(ClearReplayCache); } +template +void ReplayProxy::Proxied_ReloadShaderDebugInformation(ParamSerialiser ¶mser, + ReturnSerialiser &retser) +{ + const ReplayProxyPacket expectedPacket = eReplayProxy_ReloadShaderDebugInformation; + ReplayProxyPacket packet = eReplayProxy_ReloadShaderDebugInformation; + + { + BEGIN_PARAMS(); + END_PARAMS(); + } + + { + REMOTE_EXECUTION(); + if(paramser.IsReading() && !paramser.IsErrored() && !m_IsErrored) + m_Remote->ReloadShaderDebugInformation(); + } + + SERIALISE_RETURN_VOID(); +} + +void ReplayProxy::ReloadShaderDebugInformation() +{ + PROXY_FUNCTION(ReloadShaderDebugInformation); +} + template rdcarray ReplayProxy::Proxied_GetTargetShaderEncodings(ParamSerialiser ¶mser, ReturnSerialiser &retser) @@ -3135,6 +3161,7 @@ bool ReplayProxy::Tick(int type) case eReplayProxy_ReplaceResource: ReplaceResource(ResourceId(), ResourceId()); break; case eReplayProxy_RemoveReplacement: RemoveReplacement(ResourceId()); break; case eReplayProxy_ClearReplayCache: ClearReplayCache(); break; + case eReplayProxy_ReloadShaderDebugInformation: ReloadShaderDebugInformation(); break; case eReplayProxy_DebugVertex: DebugVertex(0, 0, 0, 0, 0); break; case eReplayProxy_DebugPixel: DebugPixel(0, 0, 0, DebugPixelInputs()); break; case eReplayProxy_DebugThread: diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index c6fe71ba6..a94e951ff 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -113,6 +113,7 @@ enum ReplayProxyPacket eReplayProxy_GetDescriptorStores, eReplayProxy_ClearReplayCache, + eReplayProxy_ReloadShaderDebugInformation, }; DECLARE_REFLECTION_ENUM(ReplayProxyPacket); @@ -561,6 +562,7 @@ public: IMPLEMENT_FUNCTION_PROXIED(void, ReplaceResource, ResourceId from, ResourceId to); IMPLEMENT_FUNCTION_PROXIED(void, RemoveReplacement, ResourceId id); IMPLEMENT_FUNCTION_PROXIED(void, ClearReplayCache); + IMPLEMENT_FUNCTION_PROXIED(void, ReloadShaderDebugInformation); // these functions are not part of the replay driver interface - they are similar to GetBufferData // and GetTextureData, but they do extra work to try and optimise transfer by delta-encoding the diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index f01d5729f..2061b260c 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -2701,6 +2701,13 @@ void D3D11Replay::ClearReplayCache() ClearPostVSCache(); } +void D3D11Replay::ReloadShaderDebugInformation() +{ + DXBC::ResetSearchDirsCache(); + WrappedID3D11Shader::ReloadShaderDebugInformation(); + ClearReplayCache(); +} + D3D11DebugManager *D3D11Replay::GetDebugManager() { return m_pDevice->GetDebugManager(); diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index ccdf148bc..7ef6272a7 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -255,6 +255,7 @@ public: void ReplaceResource(ResourceId from, ResourceId to); void RemoveReplacement(ResourceId id); void ClearReplayCache(); + void ReloadShaderDebugInformation(); rdcarray EnumerateCounters(); CounterDescription DescribeCounter(GPUCounter counterID); diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 7d4638ca0..7618976e5 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -3634,6 +3634,13 @@ void D3D12Replay::ClearReplayCache() ClearFeedbackCache(); } +void D3D12Replay::ReloadShaderDebugInformation() +{ + DXBC::ResetSearchDirsCache(); + WrappedID3D12Shader::ReloadShaderDebugInformation(); + ClearReplayCache(); +} + void D3D12Replay::RefreshDerivedReplacements() { D3D12ResourceManager *rm = m_pDevice->GetResourceManager(); diff --git a/renderdoc/driver/d3d12/d3d12_replay.h b/renderdoc/driver/d3d12/d3d12_replay.h index ff21711f1..0f433908d 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.h +++ b/renderdoc/driver/d3d12/d3d12_replay.h @@ -225,6 +225,7 @@ public: void ReplaceResource(ResourceId from, ResourceId to); void RemoveReplacement(ResourceId id); void ClearReplayCache(); + void ReloadShaderDebugInformation(); rdcarray EnumerateCounters(); CounterDescription DescribeCounter(GPUCounter counterID); diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index f3ce1c127..649464ac8 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -3747,6 +3747,11 @@ void GLReplay::ClearReplayCache() ClearPostVSCache(); } +void GLReplay::ReloadShaderDebugInformation() +{ + // Nop : GL does not have seperate debug information +} + ResourceId GLReplay::CreateProxyTexture(const TextureDescription &templateTex) { WrappedOpenGL &drv = *m_pDriver; diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 5ea86a464..51b2b65fa 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -274,6 +274,7 @@ public: void ReplaceResource(ResourceId from, ResourceId to); void RemoveReplacement(ResourceId id); void ClearReplayCache(); + void ReloadShaderDebugInformation(); rdcarray EnumerateCounters(); CounterDescription DescribeCounter(GPUCounter counterID); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index c4f6a1cc3..6f099d8b8 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -5203,6 +5203,12 @@ void VulkanReplay::ClearReplayCache() ClearFeedbackCache(); } +void VulkanReplay::ReloadShaderDebugInformation() +{ + m_pDriver->ReloadShaderDebugInformation(); + ClearReplayCache(); +} + void VulkanReplay::ReplaceResource(ResourceId from, ResourceId to) { // remove existing shader replacement diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index 052d4b915..d3a408050 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -422,6 +422,7 @@ public: void ReplaceResource(ResourceId from, ResourceId to); void RemoveReplacement(ResourceId id); void ClearReplayCache(); + void ReloadShaderDebugInformation(); void RenderMesh(uint32_t eventId, const rdcarray &secondaryDraws, const MeshDisplay &cfg); diff --git a/renderdoc/replay/dummy_driver.cpp b/renderdoc/replay/dummy_driver.cpp index 8416c8c2b..fb6993ce3 100644 --- a/renderdoc/replay/dummy_driver.cpp +++ b/renderdoc/replay/dummy_driver.cpp @@ -262,6 +262,10 @@ void DummyDriver::ClearReplayCache() { } +void DummyDriver::ReloadShaderDebugInformation() +{ +} + rdcarray DummyDriver::EnumerateCounters() { return {}; diff --git a/renderdoc/replay/dummy_driver.h b/renderdoc/replay/dummy_driver.h index 6704911bf..527c279d0 100644 --- a/renderdoc/replay/dummy_driver.h +++ b/renderdoc/replay/dummy_driver.h @@ -97,6 +97,7 @@ public: void RemoveReplacement(ResourceId id); void FreeTargetResource(ResourceId id); void ClearReplayCache(); + void ReloadShaderDebugInformation(); rdcarray EnumerateCounters(); CounterDescription DescribeCounter(GPUCounter counterID); diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index 609aff9c6..6499a8e99 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -2164,6 +2164,13 @@ void ReplayController::ClearReplayCache() m_pDevice->ClearReplayCache(); } +void ReplayController::ReloadShaderDebugInformation() +{ + CHECK_REPLAY_THREAD(); + + m_pDevice->ReloadShaderDebugInformation(); +} + RDResult ReplayController::CreateDevice(RDCFile *rdc, const ReplayOptions &opts) { CHECK_REPLAY_THREAD(); diff --git a/renderdoc/replay/replay_controller.h b/renderdoc/replay/replay_controller.h index 5eb2e1b27..38a36b7f9 100644 --- a/renderdoc/replay/replay_controller.h +++ b/renderdoc/replay/replay_controller.h @@ -179,6 +179,7 @@ public: void RemoveReplacement(ResourceId id); void FreeTargetResource(ResourceId id); void ClearReplayCache(); + void ReloadShaderDebugInformation(); FrameDescription GetFrameInfo(); const SDFile &GetStructuredFile(); diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 138a4146f..ad6ce6061 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -212,6 +212,7 @@ public: virtual void RemoveReplacement(ResourceId id) = 0; virtual void FreeTargetResource(ResourceId id) = 0; virtual void ClearReplayCache() = 0; + virtual void ReloadShaderDebugInformation() = 0; virtual rdcarray EnumerateCounters() = 0; virtual CounterDescription DescribeCounter(GPUCounter counterID) = 0;