From 1a05f4fc4ab4bdef2d2004f0e545636dfbb0696d Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 21 Feb 2016 16:10:46 +0100 Subject: [PATCH] Forcibly refresh UI state after editing a shader or removing an edit --- renderdoc/api/replay/renderdoc_replay.h | 4 ++-- renderdoc/replay/replay_renderer.cpp | 9 ++------- renderdoc/replay/replay_renderer.h | 1 - renderdoccmd/renderdoccmd_win32.cpp | 2 +- renderdocui/Code/Core.cs | 16 +++++++++++++--- renderdocui/Interop/ReplayRenderer.cs | 6 +++--- .../PipelineState/D3D11PipelineStateViewer.cs | 5 +++++ .../PipelineState/GLPipelineStateViewer.cs | 5 +++++ 8 files changed, 31 insertions(+), 17 deletions(-) diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 5103e4990..58ff8b539 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -177,7 +177,7 @@ struct IReplayRenderer virtual bool InitResolver() = 0; virtual bool SetContextFilter(ResourceId id, uint32_t firstDefEv, uint32_t lastDefEv) = 0; - virtual bool SetFrameEvent(uint32_t frameID, uint32_t eventID) = 0; + virtual bool SetFrameEvent(uint32_t frameID, uint32_t eventID, bool force) = 0; virtual bool GetD3D11PipelineState(D3D11PipelineState *state) = 0; virtual bool GetGLPipelineState(GLPipelineState *state) = 0; virtual bool GetVulkanPipelineState(VulkanPipelineState *state) = 0; @@ -244,7 +244,7 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_HasCallstacks(Replay extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_InitResolver(ReplayRenderer *rend); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SetContextFilter(ReplayRenderer *rend, ResourceId id, uint32_t firstDefEv, uint32_t lastDefEv); -extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SetFrameEvent(ReplayRenderer *rend, uint32_t frameID, uint32_t eventID); +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SetFrameEvent(ReplayRenderer *rend, uint32_t frameID, uint32_t eventID, bool32 force); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetD3D11PipelineState(ReplayRenderer *rend, D3D11PipelineState *state); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetGLPipelineState(ReplayRenderer *rend, GLPipelineState *state); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetVulkanPipelineState(ReplayRenderer *rend, VulkanPipelineState *state); diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 35ee6493d..e62fe48d4 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -186,11 +186,6 @@ bool ReplayRenderer::SetContextFilter(ResourceId id, uint32_t firstDefEv, uint32 return true; } -bool ReplayRenderer::SetFrameEvent(uint32_t frameID, uint32_t eventID) -{ - return SetFrameEvent(frameID, eventID, false); -} - bool ReplayRenderer::SetFrameEvent(uint32_t frameID, uint32_t eventID, bool force) { if(m_FrameID != frameID || eventID != m_EventID || force) @@ -1565,8 +1560,8 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_InitResolver(ReplayR extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SetContextFilter(ReplayRenderer *rend, ResourceId id, uint32_t firstDefEv, uint32_t lastDefEv) { return rend->SetContextFilter(id, firstDefEv, lastDefEv); } -extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SetFrameEvent(ReplayRenderer *rend, uint32_t frameID, uint32_t eventID) -{ return rend->SetFrameEvent(frameID, eventID); } +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SetFrameEvent(ReplayRenderer *rend, uint32_t frameID, uint32_t eventID, bool32 force) +{ return rend->SetFrameEvent(frameID, eventID, force != 0); } extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetD3D11PipelineState(ReplayRenderer *rend, D3D11PipelineState *state) { return rend->GetD3D11PipelineState(state); } extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetGLPipelineState(ReplayRenderer *rend, GLPipelineState *state) diff --git a/renderdoc/replay/replay_renderer.h b/renderdoc/replay/replay_renderer.h index 6c2ceff08..5e203f78a 100644 --- a/renderdoc/replay/replay_renderer.h +++ b/renderdoc/replay/replay_renderer.h @@ -144,7 +144,6 @@ struct ReplayRenderer : public IReplayRenderer bool InitResolver(); bool SetContextFilter(ResourceId id, uint32_t firstDefEv, uint32_t lastDefEv); - bool SetFrameEvent(uint32_t frameID, uint32_t eventID); bool SetFrameEvent(uint32_t frameID, uint32_t eventID, bool force); void FetchPipelineState(); diff --git a/renderdoccmd/renderdoccmd_win32.cpp b/renderdoccmd/renderdoccmd_win32.cpp index da534a6e2..3f38fdf0a 100644 --- a/renderdoccmd/renderdoccmd_win32.cpp +++ b/renderdoccmd/renderdoccmd_win32.cpp @@ -241,7 +241,7 @@ void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay displayCfg) if(msg.message == WM_QUIT) break; // set to random event beyond the end of the frame to ensure output is marked as dirty - ReplayRenderer_SetFrameEvent(renderer, 0, 10000000+rand()%1000); + ReplayRenderer_SetFrameEvent(renderer, 0, 10000000+rand()%1000, true); ReplayOutput_Display(out); Sleep(40); diff --git a/renderdocui/Code/Core.cs b/renderdocui/Code/Core.cs index f2a543257..7ac4ef9eb 100644 --- a/renderdocui/Code/Core.cs +++ b/renderdocui/Code/Core.cs @@ -616,7 +616,7 @@ namespace renderdocui.Code m_Renderer.Invoke((ReplayRenderer r) => { r.FileChanged(); - r.SetFrameEvent(m_FrameID, m_EventID > 0 ? m_EventID-1 : 1); + r.SetFrameEvent(m_FrameID, m_EventID > 0 ? m_EventID-1 : 1, true); }); SetEventID(null, CurFrame, CurEvent); @@ -846,7 +846,7 @@ namespace renderdocui.Code m_Renderer.Invoke((ReplayRenderer r) => { r.SetContextFilter(ctx, firstDeferred, lastDeferred); }); m_Renderer.Invoke((ReplayRenderer r) => { - r.SetFrameEvent(m_FrameID, m_EventID); + r.SetFrameEvent(m_FrameID, m_EventID, true); m_D3D11PipelineState = r.GetD3D11PipelineState(); m_GLPipelineState = r.GetGLPipelineState(); m_VulkanPipelineState = r.GetVulkanPipelineState(); @@ -866,7 +866,17 @@ namespace renderdocui.Code } } + public void RefreshStatus() + { + SetEventID(null, m_FrameID, m_EventID, true); + } + public void SetEventID(ILogViewerForm exclude, UInt32 frameID, UInt32 eventID) + { + SetEventID(exclude, frameID, eventID, false); + } + + private void SetEventID(ILogViewerForm exclude, UInt32 frameID, UInt32 eventID, bool force) { m_FrameID = frameID; m_EventID = eventID; @@ -876,7 +886,7 @@ namespace renderdocui.Code m_Renderer.Invoke((ReplayRenderer r) => { r.SetContextFilter(ResourceId.Null, 0, 0); }); m_Renderer.Invoke((ReplayRenderer r) => { - r.SetFrameEvent(m_FrameID, m_EventID); + r.SetFrameEvent(m_FrameID, m_EventID, force); m_D3D11PipelineState = r.GetD3D11PipelineState(); m_GLPipelineState = r.GetGLPipelineState(); m_VulkanPipelineState = r.GetVulkanPipelineState(); diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index c4377d6bd..b695fd64b 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -209,7 +209,7 @@ namespace renderdoc [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern bool ReplayRenderer_SetContextFilter(IntPtr real, ResourceId id, UInt32 firstDefEv, UInt32 lastDefEv); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] - private static extern bool ReplayRenderer_SetFrameEvent(IntPtr real, UInt32 frameID, UInt32 eventID); + private static extern bool ReplayRenderer_SetFrameEvent(IntPtr real, UInt32 frameID, UInt32 eventID, bool force); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern bool ReplayRenderer_GetD3D11PipelineState(IntPtr real, IntPtr mem); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] @@ -328,8 +328,8 @@ namespace renderdoc public bool SetContextFilter(ResourceId id, UInt32 firstDefEv, UInt32 lastDefEv) { return ReplayRenderer_SetContextFilter(m_Real, id, firstDefEv, lastDefEv); } - public bool SetFrameEvent(UInt32 frameID, UInt32 eventID) - { return ReplayRenderer_SetFrameEvent(m_Real, frameID, eventID); } + public bool SetFrameEvent(UInt32 frameID, UInt32 eventID, bool force) + { return ReplayRenderer_SetFrameEvent(m_Real, frameID, eventID, force); } public GLPipelineState GetGLPipelineState() { diff --git a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs index 5e4db77ca..aac58a78d 100644 --- a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs @@ -2008,6 +2008,8 @@ namespace renderdocui.Windows.PipelineState if (files.Count == 0) return; + D3D11PipelineStateViewer pipeviewer = this; + ShaderViewer sv = new ShaderViewer(m_Core, false, entryFunc, files, // Save Callback @@ -2101,10 +2103,12 @@ namespace renderdocui.Windows.PipelineState if (to == ResourceId.Null) { r.RemoveReplacement(from); + pipeviewer.BeginInvoke((MethodInvoker)delegate { m_Core.RefreshStatus(); }); } else { r.ReplaceResource(from, to); + pipeviewer.BeginInvoke((MethodInvoker)delegate { m_Core.RefreshStatus(); }); } }); }, @@ -2117,6 +2121,7 @@ namespace renderdocui.Windows.PipelineState m_Core.Renderer.BeginInvoke((ReplayRenderer r) => { r.RemoveReplacement(stage.Shader); + pipeviewer.BeginInvoke((MethodInvoker)delegate { m_Core.RefreshStatus(); }); }); }); diff --git a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs index 69ecce463..7271c6182 100644 --- a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs @@ -1884,6 +1884,8 @@ namespace renderdocui.Windows.PipelineState if (files.Count == 0) return; + GLPipelineStateViewer pipeviewer = this; + ShaderViewer sv = new ShaderViewer(m_Core, false, "main", files, // Save Callback @@ -1906,10 +1908,12 @@ namespace renderdocui.Windows.PipelineState if (to == ResourceId.Null) { r.RemoveReplacement(from); + pipeviewer.BeginInvoke((MethodInvoker)delegate { m_Core.RefreshStatus(); }); } else { r.ReplaceResource(from, to); + pipeviewer.BeginInvoke((MethodInvoker)delegate { m_Core.RefreshStatus(); }); } }); }, @@ -1922,6 +1926,7 @@ namespace renderdocui.Windows.PipelineState m_Core.Renderer.BeginInvoke((ReplayRenderer r) => { r.RemoveReplacement(stage.Shader); + pipeviewer.BeginInvoke((MethodInvoker)delegate { m_Core.RefreshStatus(); }); }); });