diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index 99e4033c4..428852117 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -319,7 +319,7 @@ void RenderDoc::Shutdown() } } -IFrameCapturer *RenderDoc::MatchFrameCapturer(void *dev, void *wnd) +bool RenderDoc::MatchClosestWindow(void *&dev, void *&wnd) { DeviceWnd dw(dev, wnd); @@ -338,7 +338,25 @@ IFrameCapturer *RenderDoc::MatchFrameCapturer(void *dev, void *wnd) ++it; } - if(it == m_WindowFrameCapturers.end()) + if(it != m_WindowFrameCapturers.end()) + { + dev = it->first.dev; + wnd = it->first.wnd; + return true; + } + + return false; +} + +IFrameCapturer *RenderDoc::MatchFrameCapturer(void *dev, void *wnd) +{ + DeviceWnd dw(dev, wnd); + + // try and find the closest frame capture registered, and update + // the values in dw to point to it precisely + bool exactMatch = MatchClosestWindow(dw.dev, dw.wnd); + + if(!exactMatch) { // handle off-screen rendering where there are no device/window pairs in // m_WindowFrameCapturers, instead we use the first matching device frame capturer @@ -356,6 +374,14 @@ IFrameCapturer *RenderDoc::MatchFrameCapturer(void *dev, void *wnd) return NULL; } + auto it = m_WindowFrameCapturers.find(dw); + + if(it == m_WindowFrameCapturers.end()) + { + RDCERR("Couldn't find frame capturer after exact match!"); + return NULL; + } + return it->second.FrameCapturer; } diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 2a64ee1d1..ad3eb8de8 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -258,6 +258,8 @@ class RenderDoc void SetActiveWindow(void *dev, void *wnd); bool EndFrameCapture(void *dev, void *wnd); + bool MatchClosestWindow(void *&dev, void *&wnd); + bool IsActiveWindow(void *dev, void *wnd) { return dev == m_ActiveWindow.dev && wnd == m_ActiveWindow.wnd; } void TriggerCapture() { m_Cap = true; } diff --git a/renderdoc/replay/app_api.cpp b/renderdoc/replay/app_api.cpp index 0dda65043..17285b756 100644 --- a/renderdoc/replay/app_api.cpp +++ b/renderdoc/replay/app_api.cpp @@ -133,6 +133,12 @@ static void SetActiveWindow(void *device, void *wndHandle) static void StartFrameCapture(void *device, void *wndHandle) { RenderDoc::Inst().StartFrameCapture(device, wndHandle); + + if(device == NULL || wndHandle == NULL) + RenderDoc::Inst().MatchClosestWindow(device, wndHandle); + + if(device != NULL && wndHandle != NULL) + RenderDoc::Inst().SetActiveWindow(device, wndHandle); } static uint32_t IsFrameCapturing()