Refactor handling of device/window pairs and overlay text

This commit is contained in:
baldurk
2022-06-14 18:05:07 +01:00
parent ed9ac9f7bf
commit 1e8425c3e6
20 changed files with 377 additions and 295 deletions
+190 -116
View File
@@ -754,51 +754,46 @@ void RenderDoc::RegisterShutdownFunction(ShutdownFunction func)
m_ShutdownFunctions.insert(it - m_ShutdownFunctions.begin(), func);
}
bool RenderDoc::MatchClosestWindow(void *&dev, void *&wnd)
bool RenderDoc::MatchClosestWindow(DeviceOwnedWindow &devWnd)
{
DeviceWnd dw(dev, wnd);
// lower_bound and the DeviceWnd ordering (pointer compares, dev over wnd) means that if either
// element in dw is NULL we can go forward from this iterator and find the first wildcardMatch
// element in devWnd is NULL we can go forward from this iterator and find the first wildcardMatch
// note that if dev is specified and wnd is NULL, this will actually point at the first
// wildcardMatch already and we can use it immediately (since which window of multiple we
// choose is undefined, so up to us). If dev is NULL there is no window ordering (since dev is
// the primary sorting value) so we just iterate through the whole map. It should be small in
// the majority of cases
auto it = m_WindowFrameCapturers.lower_bound(dw);
auto it = m_WindowFrameCapturers.lower_bound(devWnd);
while(it != m_WindowFrameCapturers.end())
{
if(it->first.wildcardMatch(dw))
if(it->first.wildcardMatch(devWnd))
break;
++it;
}
if(it != m_WindowFrameCapturers.end())
{
dev = it->first.dev;
wnd = it->first.wnd;
devWnd = it->first;
return true;
}
return false;
}
IFrameCapturer *RenderDoc::MatchFrameCapturer(void *dev, void *wnd)
IFrameCapturer *RenderDoc::MatchFrameCapturer(DeviceOwnedWindow devWnd)
{
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);
// the values in devWnd to point to it precisely
bool exactMatch = MatchClosestWindow(devWnd);
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
if(wnd == NULL)
if(devWnd.windowHandle == NULL)
{
auto defaultit = m_DeviceFrameCapturers.find(dev);
auto defaultit = m_DeviceFrameCapturers.find(devWnd.device);
if(defaultit == m_DeviceFrameCapturers.end() && !m_DeviceFrameCapturers.empty())
defaultit = m_DeviceFrameCapturers.begin();
@@ -809,11 +804,12 @@ IFrameCapturer *RenderDoc::MatchFrameCapturer(void *dev, void *wnd)
RDCERR(
"Couldn't find matching frame capturer for device %p window %p "
"from %zu device frame capturers and %zu frame capturers",
dev, wnd, m_DeviceFrameCapturers.size(), m_WindowFrameCapturers.size());
devWnd.device, devWnd.windowHandle, m_DeviceFrameCapturers.size(),
m_WindowFrameCapturers.size());
return NULL;
}
auto it = m_WindowFrameCapturers.find(dw);
auto it = m_WindowFrameCapturers.find(devWnd);
if(it == m_WindowFrameCapturers.end())
{
@@ -824,48 +820,47 @@ IFrameCapturer *RenderDoc::MatchFrameCapturer(void *dev, void *wnd)
return it->second.FrameCapturer;
}
void RenderDoc::StartFrameCapture(void *dev, void *wnd)
void RenderDoc::StartFrameCapture(DeviceOwnedWindow devWnd)
{
IFrameCapturer *frameCap = MatchFrameCapturer(dev, wnd);
IFrameCapturer *frameCap = MatchFrameCapturer(devWnd);
if(frameCap)
{
frameCap->StartFrameCapture(dev, wnd);
frameCap->StartFrameCapture(devWnd);
m_CapturesActive++;
}
}
void RenderDoc::SetActiveWindow(void *dev, void *wnd)
void RenderDoc::SetActiveWindow(DeviceOwnedWindow devWnd)
{
DeviceWnd dw(dev, wnd);
auto it = m_WindowFrameCapturers.find(dw);
auto it = m_WindowFrameCapturers.find(devWnd);
if(it == m_WindowFrameCapturers.end())
{
RDCERR("Couldn't find frame capturer for device %p window %p", dev, wnd);
RDCERR("Couldn't find frame capturer for device %p window %p", devWnd.device,
devWnd.windowHandle);
return;
}
m_ActiveWindow = dw;
m_ActiveWindow = devWnd;
}
bool RenderDoc::EndFrameCapture(void *dev, void *wnd)
bool RenderDoc::EndFrameCapture(DeviceOwnedWindow devWnd)
{
IFrameCapturer *frameCap = MatchFrameCapturer(dev, wnd);
IFrameCapturer *frameCap = MatchFrameCapturer(devWnd);
if(frameCap)
{
bool ret = frameCap->EndFrameCapture(dev, wnd);
bool ret = frameCap->EndFrameCapture(devWnd);
m_CapturesActive--;
return ret;
}
return false;
}
bool RenderDoc::DiscardFrameCapture(void *dev, void *wnd)
bool RenderDoc::DiscardFrameCapture(DeviceOwnedWindow devWnd)
{
IFrameCapturer *frameCap = MatchFrameCapturer(dev, wnd);
IFrameCapturer *frameCap = MatchFrameCapturer(devWnd);
if(frameCap)
{
bool ret = frameCap->DiscardFrameCapture(dev, wnd);
bool ret = frameCap->DiscardFrameCapture(devWnd);
m_CapturesActive--;
return ret;
}
@@ -965,21 +960,127 @@ void RenderDoc::CycleActiveWindow()
}
}
rdcstr RenderDoc::GetOverlayText(RDCDriver driver, uint32_t frameNumber, int flags)
rdcstr RenderDoc::GetOverlayText(RDCDriver driver, DeviceOwnedWindow devWnd, uint32_t frameNumber,
int flags)
{
const bool activeWindow = (flags & eOverlay_ActiveWindow);
const bool activeWindow = (devWnd == m_ActiveWindow);
const bool capturesEnabled = (flags & eOverlay_CaptureDisabled) == 0;
uint32_t overlay = GetOverlayBits();
rdcstr overlayText = ToStr(driver) + ". ";
RDCDriver activeDriver = RDCDriver::Unknown;
RDCDriver curDriver = RDCDriver::Unknown;
int activeIdx = -1, curIdx = -1, idx = 0;
for(auto it = m_WindowFrameCapturers.begin(); it != m_WindowFrameCapturers.end(); ++it, ++idx)
{
if(it->first == m_ActiveWindow)
{
activeIdx = idx;
activeDriver = it->second.FrameCapturer->GetFrameCaptureDriver();
}
if(it->first == devWnd)
{
curIdx = idx;
curDriver = it->second.FrameCapturer->GetFrameCaptureDriver();
}
}
if(activeDriver == RDCDriver::Unknown)
activeDriver = curDriver;
if(activeDriver == RDCDriver::Unknown)
activeDriver = driver;
// example layout:
//
// Capturing D3D11. Frame: 1234. 33ms (30 FPS)
// F12, PrtScrn to capture. 3 Captures saved.
// Captured frame 1200.
//
// Frame number, FPS, capture list are optional. If capture list is disabled
// the second line still displays the keys as long as capturing is allowed.
// if capturing is disabled, only the first line displays.
//
// On platforms without keyboards, the keys are replaced by a remote access connection status
// message.
//
// with multiple windows the active window will look like:
//
// Capturing D3D11. Window 1 active. Frame: 1234. 33ms (30 FPS)
// F12, PrtScrn to capture. 3 Captures saved.
// Captured frame 1200.
//
// Inactive windows will look like:
//
// Capturing D3D11. Window 1 active.
// F11 to cycle. OpenGL window 2.
rdcstr overlayText = ToStr(activeDriver) + ".";
// pad this so it's the same length regardless of API length
while(overlayText.length() < 8)
overlayText.push_back(' ');
overlayText = "Capturing " + overlayText;
size_t numWindows = m_WindowFrameCapturers.size();
if(numWindows > 1)
{
if(activeIdx >= 0)
overlayText += StringFormat::Fmt(" Window %d active.", activeIdx);
else
overlayText += " No window active.";
}
if(activeWindow)
{
rdcarray<RENDERDOC_InputButton> keys = GetCaptureKeys();
if(overlay & eRENDERDOC_Overlay_FrameNumber)
overlayText += StringFormat::Fmt(" Frame: %d.", frameNumber);
if(capturesEnabled)
if(overlay & eRENDERDOC_Overlay_FrameRate)
{
const double frameTime = m_FrameTimer.GetAvgFrameTime();
// max with 0.01ms so that we don't divide by zero
const double fps = 1000.0f / RDCMAX(0.01, frameTime);
if(frameTime < 0.0001)
{
overlayText += " --- ms (--- FPS)";
}
else
{
// only display frametime fractions if it's relevant (sub-integer frame time or FPS)
if(frameTime < 1.0)
overlayText += StringFormat::Fmt(" %.2lf ms", m_FrameTimer.GetAvgFrameTime());
else
overlayText += StringFormat::Fmt(" %d ms", int(m_FrameTimer.GetAvgFrameTime()));
if(fps < 1.0)
overlayText += StringFormat::Fmt(" (%.2lf FPS)", fps);
else
overlayText += StringFormat::Fmt(" (%d FPS)", int(fps));
}
}
}
overlayText += "\n";
#if ENABLED(RDOC_DEVEL)
{
overlayText += StringFormat::Fmt("%llu chunks - %.2f MB\n", Chunk::NumLiveChunks(),
float(Chunk::TotalMem()) / 1024.0f / 1024.0f);
}
#endif
if(capturesEnabled)
{
if(activeWindow)
{
rdcarray<RENDERDOC_InputButton> keys = GetCaptureKeys();
if(Keyboard::PlatformHasKeyInput())
{
for(size_t i = 0; i < keys.size(); i++)
@@ -1000,80 +1101,56 @@ rdcstr RenderDoc::GetOverlayText(RDCDriver driver, uint32_t frameNumber, int fla
else
overlayText += "No remote access connection.";
}
}
if(overlay & eRENDERDOC_Overlay_FrameNumber)
{
overlayText += StringFormat::Fmt(" Frame: %d.", frameNumber);
}
if(overlay & eRENDERDOC_Overlay_FrameRate)
{
overlayText +=
StringFormat::Fmt(" %.2lf ms (%.2lf .. %.2lf) (%.0lf FPS)", m_FrameTimer.GetAvgFrameTime(),
m_FrameTimer.GetMinFrameTime(), m_FrameTimer.GetMaxFrameTime(),
// max with 0.01ms so that we don't divide by zero
1000.0f / RDCMAX(0.01, m_FrameTimer.GetAvgFrameTime()));
}
overlayText += "\n";
if((overlay & eRENDERDOC_Overlay_CaptureList) && capturesEnabled)
{
overlayText += StringFormat::Fmt("%d Captures saved.\n", (uint32_t)m_Captures.size());
uint64_t now = Timing::GetUnixTimestamp();
for(size_t i = 0; i < m_Captures.size(); i++)
if(overlay & eRENDERDOC_Overlay_CaptureList)
{
if(now - m_Captures[i].timestamp < 20)
overlayText += StringFormat::Fmt(" %d Captures saved.\n", (uint32_t)m_Captures.size());
uint64_t now = Timing::GetUnixTimestamp();
for(size_t i = 0; i < m_Captures.size(); i++)
{
if(m_Captures[i].frameNumber == ~0U)
overlayText += "Captured user-defined capture.\n";
else
overlayText += StringFormat::Fmt("Captured frame %d.\n", m_Captures[i].frameNumber);
if(now - m_Captures[i].timestamp < 20)
{
if(m_Captures[i].frameNumber == ~0U)
overlayText += "Captured user-defined capture.\n";
else
overlayText += StringFormat::Fmt("Captured frame %d.\n", m_Captures[i].frameNumber);
}
}
}
}
#if ENABLED(RDOC_DEVEL)
overlayText += StringFormat::Fmt("%llu chunks - %.2f MB\n", Chunk::NumLiveChunks(),
float(Chunk::TotalMem()) / 1024.0f / 1024.0f);
#endif
}
else if(capturesEnabled)
{
rdcarray<RENDERDOC_InputButton> keys = GetFocusKeys();
overlayText += "Inactive window.";
size_t activeIdx = 0;
for(auto it = m_WindowFrameCapturers.begin(); it != m_WindowFrameCapturers.end();
++it, ++activeIdx)
if(it->first == m_ActiveWindow)
break;
if(activeIdx < m_WindowFrameCapturers.size())
else
{
overlayText += StringFormat::Fmt(" Active Window: %zu of %zu.", activeIdx + 1,
m_WindowFrameCapturers.size());
}
rdcarray<RENDERDOC_InputButton> keys = GetFocusKeys();
if(Keyboard::PlatformHasKeyInput())
{
for(size_t i = 0; i < keys.size(); i++)
if(Keyboard::PlatformHasKeyInput())
{
if(i == 0)
overlayText += " ";
else
overlayText += ", ";
for(size_t i = 0; i < keys.size(); i++)
{
if(i > 0)
overlayText += ", ";
overlayText += ToStr(keys[i]);
overlayText += ToStr(keys[i]);
}
if(!keys.empty())
overlayText += " to cycle.";
}
else
{
if(IsTargetControlConnected())
overlayText += "Connected by " + GetTargetControlUsername() + ".";
else
overlayText += "No remote access connection.";
}
if(!keys.empty())
overlayText += " to cycle between windows";
if(curIdx >= 0)
overlayText += StringFormat::Fmt(" %s window %d.", ToStr(curDriver).c_str(), curIdx);
else if(curDriver != RDCDriver::Unknown)
overlayText += StringFormat::Fmt(" Unknown %s window.", ToStr(curDriver).c_str());
else
overlayText += " Unknown window.";
}
overlayText += "\n";
}
return overlayText;
@@ -1884,23 +1961,22 @@ void RenderDoc::RemoveDeviceFrameCapturer(void *dev)
m_DeviceFrameCapturers.erase(dev);
}
void RenderDoc::AddFrameCapturer(void *dev, void *wnd, IFrameCapturer *cap)
void RenderDoc::AddFrameCapturer(DeviceOwnedWindow devWnd, IFrameCapturer *cap)
{
if(IsReplayApp())
return;
if(dev == NULL || wnd == NULL || cap == NULL)
if(devWnd.device == NULL || devWnd.windowHandle == NULL || cap == NULL)
{
RDCERR("Invalid FrameCapturer %#p for combination: %#p / %#p", cap, dev, wnd);
RDCERR("Invalid FrameCapturer %#p for combination: %#p / %#p", cap, devWnd.device,
devWnd.windowHandle);
return;
}
RDCLOG("Adding %s frame capturer for %#p / %#p", ToStr(cap->GetFrameCaptureDriver()).c_str(), dev,
wnd);
RDCLOG("Adding %s frame capturer for %#p / %#p", ToStr(cap->GetFrameCaptureDriver()).c_str(),
devWnd.device, devWnd.windowHandle);
DeviceWnd dw(dev, wnd);
auto it = m_WindowFrameCapturers.find(dw);
auto it = m_WindowFrameCapturers.find(devWnd);
if(it != m_WindowFrameCapturers.end())
{
if(it->second.FrameCapturer != cap)
@@ -1910,24 +1986,22 @@ void RenderDoc::AddFrameCapturer(void *dev, void *wnd, IFrameCapturer *cap)
}
else
{
m_WindowFrameCapturers[dw].FrameCapturer = cap;
m_WindowFrameCapturers[devWnd].FrameCapturer = cap;
}
// the first one we see becomes the default
if(m_ActiveWindow == DeviceWnd())
m_ActiveWindow = dw;
if(m_ActiveWindow == DeviceOwnedWindow())
m_ActiveWindow = devWnd;
}
void RenderDoc::RemoveFrameCapturer(void *dev, void *wnd)
void RenderDoc::RemoveFrameCapturer(DeviceOwnedWindow devWnd)
{
if(IsReplayApp())
return;
DeviceWnd dw(dev, wnd);
RDCLOG("Removing frame capturer for %#p / %#p", devWnd.device, devWnd.windowHandle);
RDCLOG("Removing frame capturer for %#p / %#p", dev, wnd);
auto it = m_WindowFrameCapturers.find(dw);
auto it = m_WindowFrameCapturers.find(devWnd);
if(it != m_WindowFrameCapturers.end())
{
it->second.RefCount--;
@@ -1936,13 +2010,13 @@ void RenderDoc::RemoveFrameCapturer(void *dev, void *wnd)
{
RDCLOG("Removed last refcount");
if(m_ActiveWindow == dw)
if(m_ActiveWindow == devWnd)
{
RDCLOG("Removed active window");
if(m_WindowFrameCapturers.size() == 1)
{
m_ActiveWindow = DeviceWnd();
m_ActiveWindow = DeviceOwnedWindow();
}
else
{
+47 -54
View File
@@ -67,12 +67,42 @@ struct ICrashHandler
virtual void UnregisterMemoryRegion(void *mem) = 0;
};
struct DeviceOwnedWindow
{
DeviceOwnedWindow() : device(NULL), windowHandle(NULL) {}
DeviceOwnedWindow(void *dev, void *wnd) : device(dev), windowHandle(wnd) {}
void *device;
void *windowHandle;
bool operator==(const DeviceOwnedWindow &o) const
{
return device == o.device && windowHandle == o.windowHandle;
}
bool operator<(const DeviceOwnedWindow &o) const
{
if(device != o.device)
return device < o.device;
return windowHandle < o.windowHandle;
}
bool wildcardMatch(const DeviceOwnedWindow &o) const
{
if(device == NULL || o.device == NULL)
return windowHandle == NULL || o.windowHandle == NULL || windowHandle == o.windowHandle;
if(windowHandle == NULL || o.windowHandle == NULL)
return device == o.device;
return *this == o;
}
};
struct IFrameCapturer
{
virtual RDCDriver GetFrameCaptureDriver() = 0;
virtual void StartFrameCapture(void *dev, void *wnd) = 0;
virtual bool EndFrameCapture(void *dev, void *wnd) = 0;
virtual bool DiscardFrameCapture(void *dev, void *wnd) = 0;
virtual void StartFrameCapture(DeviceOwnedWindow devWnd) = 0;
virtual bool EndFrameCapture(DeviceOwnedWindow devWnd) = 0;
virtual bool DiscardFrameCapture(DeviceOwnedWindow devWnd) = 0;
};
struct IDeviceProtocolHandler;
@@ -526,8 +556,8 @@ public:
void Tick();
void AddFrameCapturer(void *dev, void *wnd, IFrameCapturer *cap);
void RemoveFrameCapturer(void *dev, void *wnd);
void AddFrameCapturer(DeviceOwnedWindow devWnd, IFrameCapturer *cap);
void RemoveFrameCapturer(DeviceOwnedWindow devWnd);
bool HasActiveFrameCapturer(RDCDriver driver) const;
// add window-less frame capturers for use via users capturing
@@ -535,25 +565,16 @@ public:
void AddDeviceFrameCapturer(void *dev, IFrameCapturer *cap);
void RemoveDeviceFrameCapturer(void *dev);
void StartFrameCapture(void *dev, void *wnd);
void StartFrameCapture(DeviceOwnedWindow devWnd);
bool IsFrameCapturing() { return m_CapturesActive > 0; }
void SetActiveWindow(void *dev, void *wnd);
bool EndFrameCapture(void *dev, void *wnd);
bool DiscardFrameCapture(void *dev, void *wnd);
void SetActiveWindow(DeviceOwnedWindow devWnd);
bool EndFrameCapture(DeviceOwnedWindow devWnd);
bool DiscardFrameCapture(DeviceOwnedWindow devWnd);
bool MatchClosestWindow(void *&dev, void *&wnd);
bool IsActiveWindow(void *dev, void *wnd)
{
return dev == m_ActiveWindow.dev && wnd == m_ActiveWindow.wnd;
}
void GetActiveWindow(void *&dev, void *&wnd)
{
dev = m_ActiveWindow.dev;
wnd = m_ActiveWindow.wnd;
}
bool MatchClosestWindow(DeviceOwnedWindow &devWnd);
bool IsActiveWindow(DeviceOwnedWindow devWnd) { return devWnd == m_ActiveWindow; }
void GetActiveWindow(DeviceOwnedWindow &devWnd) { devWnd = m_ActiveWindow; }
void TriggerCapture(uint32_t numFrames) { m_Cap = numFrames; }
uint32_t GetOverlayBits() { return m_Overlay; }
void MaskOverlayBits(uint32_t And, uint32_t Or) { m_Overlay = (m_Overlay & And) | Or; }
@@ -577,11 +598,10 @@ public:
enum
{
eOverlay_ActiveWindow = 0x1,
eOverlay_CaptureDisabled = 0x2,
eOverlay_CaptureDisabled = 0x1,
};
rdcstr GetOverlayText(RDCDriver driver, uint32_t frameNumber, int flags);
rdcstr GetOverlayText(RDCDriver driver, DeviceOwnedWindow devWnd, uint32_t frameNumber, int flags);
void CycleActiveWindow();
uint32_t GetCapturableWindowCount() { return (uint32_t)m_WindowFrameCapturers.size(); }
@@ -659,44 +679,17 @@ private:
int RefCount;
};
struct DeviceWnd
{
DeviceWnd() : dev(NULL), wnd(NULL) {}
DeviceWnd(void *d, void *w) : dev(d), wnd(w) {}
void *dev;
void *wnd;
bool operator==(const DeviceWnd &o) const { return dev == o.dev && wnd == o.wnd; }
bool operator<(const DeviceWnd &o) const
{
if(dev != o.dev)
return dev < o.dev;
return wnd < o.wnd;
}
bool wildcardMatch(const DeviceWnd &o) const
{
if(dev == NULL || o.dev == NULL)
return wnd == NULL || o.wnd == NULL || wnd == o.wnd;
if(wnd == NULL || o.wnd == NULL)
return dev == o.dev;
return *this == o;
}
};
FloatVector m_LightChecker = FloatVector(0.81f, 0.81f, 0.81f, 1.0f);
FloatVector m_DarkChecker = FloatVector(0.57f, 0.57f, 0.57f, 1.0f);
bool m_DarkTheme = false;
int m_CapturesActive;
std::map<DeviceWnd, FrameCap> m_WindowFrameCapturers;
DeviceWnd m_ActiveWindow;
std::map<DeviceOwnedWindow, FrameCap> m_WindowFrameCapturers;
DeviceOwnedWindow m_ActiveWindow;
std::map<void *, IFrameCapturer *> m_DeviceFrameCapturers;
IFrameCapturer *MatchFrameCapturer(void *dev, void *wnd);
IFrameCapturer *MatchFrameCapturer(DeviceOwnedWindow devWnd);
bool m_VendorExts[arraydim<VendorExtensions>()] = {};
+15 -12
View File
@@ -1918,7 +1918,7 @@ int WrappedID3D11Device::EndEvent()
return m_pCurrentWrappedDevice->m_pImmediateContext->ThreadSafe_EndEvent();
}
void WrappedID3D11Device::StartFrameCapture(void *dev, void *wnd)
void WrappedID3D11Device::StartFrameCapture(DeviceOwnedWindow devWnd)
{
SCOPED_LOCK(m_D3DLock);
@@ -1975,7 +1975,7 @@ void WrappedID3D11Device::StartFrameCapture(void *dev, void *wnd)
m_pInfoQueue->ClearStoredMessages();
}
bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd)
bool WrappedID3D11Device::EndFrameCapture(DeviceOwnedWindow devWnd)
{
SCOPED_LOCK(m_D3DLock);
@@ -1986,11 +1986,11 @@ bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd)
IDXGISwapper *swapper = NULL;
if(wnd)
if(devWnd.windowHandle)
{
for(auto it = m_SwapChains.begin(); it != m_SwapChains.end(); ++it)
{
if(it->first->GetHWND() == wnd)
if(it->first->GetHWND() == devWnd.windowHandle)
{
swapper = it->first;
break;
@@ -1999,7 +1999,8 @@ bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd)
if(swapper == NULL)
{
RDCERR("Output window %p provided for frame capture corresponds with no known swap chain", wnd);
RDCERR("Output window %p provided for frame capture corresponds with no known swap chain",
devWnd.windowHandle);
return false;
}
}
@@ -2404,7 +2405,7 @@ bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd)
}
}
bool WrappedID3D11Device::DiscardFrameCapture(void *dev, void *wnd)
bool WrappedID3D11Device::DiscardFrameCapture(DeviceOwnedWindow devWnd)
{
SCOPED_LOCK(m_D3DLock);
@@ -2563,7 +2564,7 @@ void WrappedID3D11Device::FirstFrame(IDXGISwapper *swapper)
// if we have to capture the first frame, begin capturing immediately
if(IsBackgroundCapturing(m_State) && RenderDoc::Inst().ShouldTriggerCapture(0))
{
RenderDoc::Inst().StartFrameCapture((ID3D11Device *)this, swapper->GetHWND());
RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow((ID3D11Device *)this, swapper->GetHWND()));
m_AppControlledCapture = false;
m_CapturedFrames.back().frameNumber = 0;
@@ -2617,7 +2618,9 @@ HRESULT WrappedID3D11Device::Present(IDXGISwapper *swapper, UINT SyncInterval, U
m_pImmediateContext->BeginFrame();
bool activeWindow = RenderDoc::Inst().IsActiveWindow((ID3D11Device *)this, swapper->GetHWND());
DeviceOwnedWindow devWnd((ID3D11Device *)this, swapper->GetHWND());
bool activeWindow = RenderDoc::Inst().IsActiveWindow(devWnd);
m_LastSwap = swapper;
@@ -2636,8 +2639,8 @@ HRESULT WrappedID3D11Device::Present(IDXGISwapper *swapper, UINT SyncInterval, U
m_TextRenderer->SetOutputDimensions(swapper->GetWidth(), swapper->GetHeight());
m_TextRenderer->SetOutputWindow(swapper->GetHWND());
int flags = activeWindow ? RenderDoc::eOverlay_ActiveWindow : 0;
rdcstr overlayText = RenderDoc::Inst().GetOverlayText(RDCDriver::D3D11, m_FrameCounter, flags);
rdcstr overlayText =
RenderDoc::Inst().GetOverlayText(RDCDriver::D3D11, devWnd, m_FrameCounter, 0);
if(activeWindow && m_FailedFrame > 0)
{
@@ -2671,12 +2674,12 @@ HRESULT WrappedID3D11Device::Present(IDXGISwapper *swapper, UINT SyncInterval, U
// kill any current capture that isn't application defined
if(IsActiveCapturing(m_State) && !m_AppControlledCapture)
{
RenderDoc::Inst().EndFrameCapture((ID3D11Device *)this, swapper->GetHWND());
RenderDoc::Inst().EndFrameCapture(devWnd);
}
if(IsBackgroundCapturing(m_State) && RenderDoc::Inst().ShouldTriggerCapture(m_FrameCounter))
{
RenderDoc::Inst().StartFrameCapture((ID3D11Device *)this, swapper->GetHWND());
RenderDoc::Inst().StartFrameCapture(devWnd);
m_AppControlledCapture = false;
m_CapturedFrames.back().frameNumber = m_FrameCounter;
+3 -3
View File
@@ -697,9 +697,9 @@ public:
bool Serialise_CaptureScope(SerialiserType &ser);
RDCDriver GetFrameCaptureDriver() { return RDCDriver::D3D11; }
void StartFrameCapture(void *dev, void *wnd);
bool EndFrameCapture(void *dev, void *wnd);
bool DiscardFrameCapture(void *dev, void *wnd);
void StartFrameCapture(DeviceOwnedWindow devWnd);
bool EndFrameCapture(DeviceOwnedWindow devWnd);
bool DiscardFrameCapture(DeviceOwnedWindow devWnd);
ID3DUserDefinedAnnotation *GetAnnotations() { return m_RealAnnotations; }
ID3D11InfoQueue *GetInfoQueue() { return m_pInfoQueue; }
@@ -1341,13 +1341,15 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12CommandQueue::Present(
if(m_pPresentHWND != NULL)
{
Keyboard::RemoveInputWindow(WindowingSystem::Win32, m_pPresentHWND);
RenderDoc::Inst().RemoveFrameCapturer(m_pDevice->GetFrameCapturerDevice(), m_pPresentHWND);
RenderDoc::Inst().RemoveFrameCapturer(
DeviceOwnedWindow(m_pDevice->GetFrameCapturerDevice(), m_pPresentHWND));
}
Keyboard::AddInputWindow(WindowingSystem::Win32, hWindow);
RenderDoc::Inst().AddFrameCapturer(m_pDevice->GetFrameCapturerDevice(), hWindow,
m_pDevice->GetFrameCapturer());
RenderDoc::Inst().AddFrameCapturer(
DeviceOwnedWindow(m_pDevice->GetFrameCapturerDevice(), hWindow),
m_pDevice->GetFrameCapturer());
}
m_pPresentSource = pSourceTex2D;
+19 -15
View File
@@ -226,13 +226,14 @@ void STDMETHODCALLTYPE WrappedID3D12SharingContract::Present(_In_ ID3D12Resource
if(m_pPresentHWND != NULL)
{
Keyboard::RemoveInputWindow(WindowingSystem::Win32, m_pPresentHWND);
RenderDoc::Inst().RemoveFrameCapturer(m_pDevice.GetFrameCapturerDevice(), m_pPresentHWND);
RenderDoc::Inst().RemoveFrameCapturer(
DeviceOwnedWindow(m_pDevice.GetFrameCapturerDevice(), m_pPresentHWND));
}
Keyboard::AddInputWindow(WindowingSystem::Win32, window);
RenderDoc::Inst().AddFrameCapturer(m_pDevice.GetFrameCapturerDevice(), window,
m_pDevice.GetFrameCapturer());
RenderDoc::Inst().AddFrameCapturer(
DeviceOwnedWindow(m_pDevice.GetFrameCapturerDevice(), window), m_pDevice.GetFrameCapturer());
}
m_pPresentSource = pResource;
@@ -1383,7 +1384,8 @@ void WrappedID3D12Device::FirstFrame(IDXGISwapper *swapper)
// if we have to capture the first frame, begin capturing immediately
if(IsBackgroundCapturing(m_State) && RenderDoc::Inst().ShouldTriggerCapture(0))
{
RenderDoc::Inst().StartFrameCapture((ID3D12Device *)this, swapper ? swapper->GetHWND() : NULL);
RenderDoc::Inst().StartFrameCapture(
DeviceOwnedWindow((ID3D12Device *)this, swapper ? swapper->GetHWND() : NULL));
m_AppControlledCapture = false;
m_CapturedFrames.back().frameNumber = 0;
@@ -2034,7 +2036,9 @@ HRESULT WrappedID3D12Device::Present(ID3D12GraphicsCommandList *pOverlayCommandL
m_FrameCounter++; // first present becomes frame #1, this function is at the end of the frame
bool activeWindow = RenderDoc::Inst().IsActiveWindow((ID3D12Device *)this, swapper->GetHWND());
DeviceOwnedWindow devWnd((ID3D12Device *)this, swapper->GetHWND());
bool activeWindow = RenderDoc::Inst().IsActiveWindow(devWnd);
m_LastSwap = swapper;
@@ -2073,9 +2077,8 @@ HRESULT WrappedID3D12Device::Present(ID3D12GraphicsCommandList *pOverlayCommandL
list->OMSetRenderTargets(1, &rtv, FALSE, NULL);
int flags = activeWindow ? RenderDoc::eOverlay_ActiveWindow : 0;
rdcstr overlayText =
RenderDoc::Inst().GetOverlayText(RDCDriver::D3D12, m_FrameCounter, flags);
RenderDoc::Inst().GetOverlayText(RDCDriver::D3D12, devWnd, m_FrameCounter, 0);
m_TextRenderer->RenderText(list, 0.0f, 0.0f, overlayText);
@@ -2119,11 +2122,11 @@ HRESULT WrappedID3D12Device::Present(ID3D12GraphicsCommandList *pOverlayCommandL
// kill any current capture that isn't application defined
if(IsActiveCapturing(m_State) && !m_AppControlledCapture)
RenderDoc::Inst().EndFrameCapture((ID3D12Device *)this, swapper->GetHWND());
RenderDoc::Inst().EndFrameCapture(devWnd);
if(IsBackgroundCapturing(m_State) && RenderDoc::Inst().ShouldTriggerCapture(m_FrameCounter))
{
RenderDoc::Inst().StartFrameCapture((ID3D12Device *)this, swapper->GetHWND());
RenderDoc::Inst().StartFrameCapture(devWnd);
m_AppControlledCapture = false;
m_CapturedFrames.back().frameNumber = m_FrameCounter;
@@ -2242,7 +2245,7 @@ void WrappedID3D12Device::EndCaptureFrame()
m_FrameCaptureRecord->AddChunk(scope.Get());
}
void WrappedID3D12Device::StartFrameCapture(void *dev, void *wnd)
void WrappedID3D12Device::StartFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsBackgroundCapturing(m_State))
return;
@@ -2328,7 +2331,7 @@ void WrappedID3D12Device::StartFrameCapture(void *dev, void *wnd)
GetResourceManager()->MarkResourceFrameReferenced(m_ResourceID, eFrameRef_Read);
}
bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd)
bool WrappedID3D12Device::EndFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsActiveCapturing(m_State))
return true;
@@ -2336,11 +2339,11 @@ bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd)
IDXGISwapper *swapper = NULL;
SwapPresentInfo swapInfo = {};
if(wnd)
if(devWnd.windowHandle)
{
for(auto it = m_SwapChains.begin(); it != m_SwapChains.end(); ++it)
{
if(it->first->GetHWND() == wnd)
if(it->first->GetHWND() == devWnd.windowHandle)
{
swapper = it->first;
swapInfo = it->second;
@@ -2350,7 +2353,8 @@ bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd)
if(swapper == NULL)
{
RDCERR("Output window %p provided for frame capture corresponds with no known swap chain", wnd);
RDCERR("Output window %p provided for frame capture corresponds with no known swap chain",
devWnd.windowHandle);
return false;
}
}
@@ -2720,7 +2724,7 @@ bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd)
return true;
}
bool WrappedID3D12Device::DiscardFrameCapture(void *dev, void *wnd)
bool WrappedID3D12Device::DiscardFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsActiveCapturing(m_State))
return true;
+3 -3
View File
@@ -914,9 +914,9 @@ public:
void GPUSyncAllQueues();
RDCDriver GetFrameCaptureDriver() { return RDCDriver::D3D12; }
void StartFrameCapture(void *dev, void *wnd);
bool EndFrameCapture(void *dev, void *wnd);
bool DiscardFrameCapture(void *dev, void *wnd);
void StartFrameCapture(DeviceOwnedWindow devWnd);
bool EndFrameCapture(DeviceOwnedWindow devWnd);
bool DiscardFrameCapture(DeviceOwnedWindow devWnd);
template <typename SerialiserType>
bool Serialise_Present(SerialiserType &ser, ID3D12Resource *PresentedImage, UINT SyncInterval,
+8 -10
View File
@@ -52,7 +52,7 @@ WrappedD3DDevice8::WrappedD3DDevice8(IDirect3DDevice8 *device, HWND wnd,
m_Wnd = wnd;
if(wnd != NULL)
RenderDoc::Inst().AddFrameCapturer((IDirect3DDevice8 *)this, wnd, this);
RenderDoc::Inst().AddFrameCapturer(DeviceOwnedWindow((IDirect3DDevice8 *)this, wnd), this);
}
else
{
@@ -86,7 +86,7 @@ WrappedD3DDevice8::~WrappedD3DDevice8()
RenderDoc::Inst().RemoveDeviceFrameCapturer((IDirect3DDevice8 *)this);
if(m_Wnd != NULL)
RenderDoc::Inst().RemoveFrameCapturer((IDirect3DDevice8 *)this, m_Wnd);
RenderDoc::Inst().RemoveFrameCapturer(DeviceOwnedWindow((IDirect3DDevice8 *)this, m_Wnd));
SAFE_DELETE(m_DebugManager);
@@ -149,18 +149,18 @@ void WrappedD3DDevice8::LazyInit()
m_DebugManager = new D3D8DebugManager(this);
}
void WrappedD3DDevice8::StartFrameCapture(void *dev, void *wnd)
void WrappedD3DDevice8::StartFrameCapture(DeviceOwnedWindow devWnd)
{
RDCERR("Capture not supported on D3D8");
}
bool WrappedD3DDevice8::EndFrameCapture(void *dev, void *wnd)
bool WrappedD3DDevice8::EndFrameCapture(DeviceOwnedWindow devWnd)
{
RDCERR("Capture not supported on D3D8");
return false;
}
bool WrappedD3DDevice8::DiscardFrameCapture(void *dev, void *wnd)
bool WrappedD3DDevice8::DiscardFrameCapture(DeviceOwnedWindow devWnd)
{
RDCERR("Capture not supported on D3D8");
return false;
@@ -239,7 +239,7 @@ HRESULT __stdcall WrappedD3DDevice8::Present(CONST RECT *pSourceRect, CONST RECT
if(hDestWindowOverride != NULL)
wnd = hDestWindowOverride;
bool activeWindow = RenderDoc::Inst().IsActiveWindow((IDirect3DDevice8 *)this, wnd);
DeviceOwnedWindow devWnd((IDirect3DDevice8 *)this, wnd);
m_FrameCounter++;
@@ -270,10 +270,8 @@ HRESULT __stdcall WrappedD3DDevice8::Present(CONST RECT *pSourceRect, CONST RECT
GetDebugManager()->SetOutputDimensions(bbDesc.Width, bbDesc.Height);
GetDebugManager()->SetOutputWindow(m_PresentParameters.hDeviceWindow);
int flags = activeWindow ? RenderDoc::eOverlay_ActiveWindow : 0;
flags |= RenderDoc::eOverlay_CaptureDisabled;
rdcstr overlayText = RenderDoc::Inst().GetOverlayText(RDCDriver::D3D8, m_FrameCounter, flags);
rdcstr overlayText = RenderDoc::Inst().GetOverlayText(RDCDriver::D3D8, devWnd, m_FrameCounter,
RenderDoc::eOverlay_CaptureDisabled);
overlayText += "Captures not supported with D3D8\n";
+3 -3
View File
@@ -39,9 +39,9 @@ public:
void LazyInit();
RDCDriver GetFrameCaptureDriver() { return RDCDriver::D3D8; }
void StartFrameCapture(void *dev, void *wnd);
bool EndFrameCapture(void *dev, void *wnd);
bool DiscardFrameCapture(void *dev, void *wnd);
void StartFrameCapture(DeviceOwnedWindow devWnd);
bool EndFrameCapture(DeviceOwnedWindow devWnd);
bool DiscardFrameCapture(DeviceOwnedWindow devWnd);
void InternalRef() { InterlockedIncrement(&m_InternalRefcount); }
void InternalRelease() { InterlockedDecrement(&m_InternalRefcount); }
+8 -10
View File
@@ -47,7 +47,7 @@ WrappedD3DDevice9::WrappedD3DDevice9(IDirect3DDevice9 *device, HWND wnd)
m_Wnd = wnd;
if(wnd != NULL)
RenderDoc::Inst().AddFrameCapturer((IDirect3DDevice9 *)this, wnd, this);
RenderDoc::Inst().AddFrameCapturer(DeviceOwnedWindow((IDirect3DDevice9 *)this, wnd), this);
}
else
{
@@ -77,7 +77,7 @@ WrappedD3DDevice9::~WrappedD3DDevice9()
RenderDoc::Inst().RemoveDeviceFrameCapturer((IDirect3DDevice9 *)this);
if(m_Wnd != NULL)
RenderDoc::Inst().RemoveFrameCapturer((IDirect3DDevice9 *)this, m_Wnd);
RenderDoc::Inst().RemoveFrameCapturer(DeviceOwnedWindow((IDirect3DDevice9 *)this, m_Wnd));
SAFE_DELETE(m_DebugManager);
@@ -109,18 +109,18 @@ void WrappedD3DDevice9::LazyInit()
m_DebugManager = new D3D9DebugManager(this);
}
void WrappedD3DDevice9::StartFrameCapture(void *dev, void *wnd)
void WrappedD3DDevice9::StartFrameCapture(DeviceOwnedWindow wnd)
{
RDCERR("Capture not supported on D3D9");
}
bool WrappedD3DDevice9::EndFrameCapture(void *dev, void *wnd)
bool WrappedD3DDevice9::EndFrameCapture(DeviceOwnedWindow wnd)
{
RDCERR("Capture not supported on D3D9");
return false;
}
bool WrappedD3DDevice9::DiscardFrameCapture(void *dev, void *wnd)
bool WrappedD3DDevice9::DiscardFrameCapture(DeviceOwnedWindow wnd)
{
RDCERR("Capture not supported on D3D9");
return false;
@@ -214,7 +214,7 @@ HRESULT __stdcall WrappedD3DDevice9::Present(CONST RECT *pSourceRect, CONST RECT
if(hDestWindowOverride != NULL)
wnd = hDestWindowOverride;
bool activeWindow = RenderDoc::Inst().IsActiveWindow((IDirect3DDevice9 *)this, wnd);
DeviceOwnedWindow devWnd((IDirect3DDevice9 *)this, wnd);
m_FrameCounter++;
@@ -244,10 +244,8 @@ HRESULT __stdcall WrappedD3DDevice9::Present(CONST RECT *pSourceRect, CONST RECT
GetDebugManager()->SetOutputDimensions(bbDesc.Width, bbDesc.Height);
GetDebugManager()->SetOutputWindow(presentParams.hDeviceWindow);
int flags = activeWindow ? RenderDoc::eOverlay_ActiveWindow : 0;
flags |= RenderDoc::eOverlay_CaptureDisabled;
rdcstr overlayText = RenderDoc::Inst().GetOverlayText(RDCDriver::D3D9, m_FrameCounter, flags);
rdcstr overlayText = RenderDoc::Inst().GetOverlayText(RDCDriver::D3D9, devWnd, m_FrameCounter,
RenderDoc::eOverlay_CaptureDisabled);
overlayText += "Captures not supported with D3D9\n";
+3 -3
View File
@@ -37,9 +37,9 @@ public:
void LazyInit();
RDCDriver GetFrameCaptureDriver() { return RDCDriver::D3D9; }
void StartFrameCapture(void *dev, void *wnd);
bool EndFrameCapture(void *dev, void *wnd);
bool DiscardFrameCapture(void *dev, void *wnd);
void StartFrameCapture(DeviceOwnedWindow devWnd);
bool EndFrameCapture(DeviceOwnedWindow devWnd);
bool DiscardFrameCapture(DeviceOwnedWindow devWnd);
void InternalRef() { InterlockedIncrement(&m_InternalRefcount); }
void InternalRelease() { InterlockedDecrement(&m_InternalRefcount); }
+6 -6
View File
@@ -54,18 +54,18 @@ struct RenderDocAnalysis : IDXGraphicsAnalysis
// IDXGraphicsAnalysis
void STDMETHODCALLTYPE BeginCapture()
{
void *dev = NULL, *wnd = NULL;
RenderDoc::Inst().GetActiveWindow(dev, wnd);
DeviceOwnedWindow devWnd;
RenderDoc::Inst().GetActiveWindow(devWnd);
RenderDoc::Inst().StartFrameCapture(dev, wnd);
RenderDoc::Inst().StartFrameCapture(devWnd);
}
void STDMETHODCALLTYPE EndCapture()
{
void *dev = NULL, *wnd = NULL;
RenderDoc::Inst().GetActiveWindow(dev, wnd);
DeviceOwnedWindow devWnd;
RenderDoc::Inst().GetActiveWindow(devWnd);
RenderDoc::Inst().EndFrameCapture(dev, wnd);
RenderDoc::Inst().EndFrameCapture(devWnd);
}
};
+2 -2
View File
@@ -237,7 +237,7 @@ WrappedIDXGISwapChain4::WrappedIDXGISwapChain4(IDXGISwapChain *real, HWND w, ID3
{
Keyboard::AddInputWindow(WindowingSystem::Win32, wnd);
RenderDoc::Inst().AddFrameCapturer(m_pDevice->GetFrameCapturerDevice(), wnd,
RenderDoc::Inst().AddFrameCapturer(DeviceOwnedWindow(m_pDevice->GetFrameCapturerDevice(), wnd),
m_pDevice->GetFrameCapturer());
}
@@ -254,7 +254,7 @@ WrappedIDXGISwapChain4::~WrappedIDXGISwapChain4()
{
Keyboard::RemoveInputWindow(WindowingSystem::Win32, wnd);
RenderDoc::Inst().RemoveFrameCapturer(m_pDevice->GetFrameCapturerDevice(), wnd);
RenderDoc::Inst().RemoveFrameCapturer(DeviceOwnedWindow(m_pDevice->GetFrameCapturerDevice(), wnd));
}
m_pDevice->ReleaseSwapchainResources(this, 0, NULL, NULL);
+17 -13
View File
@@ -1133,7 +1133,7 @@ void WrappedOpenGL::ContextData::UnassociateWindow(WrappedOpenGL *driver, void *
Keyboard::RemoveInputWindow(it->second.first, wndHandle);
windows.erase(wndHandle);
RenderDoc::Inst().RemoveFrameCapturer(ctx, wndHandle);
RenderDoc::Inst().RemoveFrameCapturer(DeviceOwnedWindow(ctx, wndHandle));
}
}
@@ -1143,7 +1143,7 @@ void WrappedOpenGL::ContextData::AssociateWindow(WrappedOpenGL *driver, Windowin
auto it = windows.find(wndHandle);
if(it == windows.end())
{
RenderDoc::Inst().AddFrameCapturer(ctx, wndHandle, driver);
RenderDoc::Inst().AddFrameCapturer(DeviceOwnedWindow(ctx, wndHandle), driver);
if(winSystem != WindowingSystem::Headless && IsCaptureMode(driver->GetState()))
Keyboard::AddInputWindow(winSystem, wndHandle);
@@ -2013,7 +2013,9 @@ void WrappedOpenGL::SwapBuffers(WindowingSystem winSystem, void *windowHandle)
if(!ctxdata.ready)
ctxdata.CreateDebugData();
bool activeWindow = RenderDoc::Inst().IsActiveWindow(ctxdata.ctx, windowHandle);
DeviceOwnedWindow devWnd(ctxdata.ctx, windowHandle);
bool activeWindow = RenderDoc::Inst().IsActiveWindow(devWnd);
// look at previous associations and decay any that are too old
uint64_t ref = Timing::GetUnixTimestamp() - 5; // 5 seconds
@@ -2042,11 +2044,12 @@ void WrappedOpenGL::SwapBuffers(WindowingSystem winSystem, void *windowHandle)
if(overlay & eRENDERDOC_Overlay_Enabled)
{
int flags = activeWindow ? RenderDoc::eOverlay_ActiveWindow : 0;
int flags = 0;
// capturing is disabled if unsupported functions have been used, or this context is legacy
if(ctxdata.Legacy() || !m_UnsupportedFunctions.empty())
flags |= RenderDoc::eOverlay_CaptureDisabled;
rdcstr overlayText = RenderDoc::Inst().GetOverlayText(GetDriverType(), m_FrameCounter, flags);
rdcstr overlayText =
RenderDoc::Inst().GetOverlayText(GetDriverType(), devWnd, m_FrameCounter, flags);
if(ctxdata.Legacy())
{
@@ -2132,11 +2135,11 @@ void WrappedOpenGL::SwapBuffers(WindowingSystem winSystem, void *windowHandle)
// kill any current capture that isn't application defined
if(IsActiveCapturing(m_State) && !m_AppControlledCapture)
RenderDoc::Inst().EndFrameCapture(ctxdata.ctx, windowHandle);
RenderDoc::Inst().EndFrameCapture(devWnd);
if(RenderDoc::Inst().ShouldTriggerCapture(m_FrameCounter) && IsBackgroundCapturing(m_State))
{
RenderDoc::Inst().StartFrameCapture(ctxdata.ctx, windowHandle);
RenderDoc::Inst().StartFrameCapture(devWnd);
m_AppControlledCapture = false;
m_CapturedFrames.back().frameNumber = m_FrameCounter;
@@ -2169,7 +2172,7 @@ GLWindowingData *WrappedOpenGL::MakeValidContextCurrent(GLWindowingData existing
return NULL;
}
void WrappedOpenGL::StartFrameCapture(void *dev, void *wnd)
void WrappedOpenGL::StartFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsBackgroundCapturing(m_State))
return;
@@ -2230,7 +2233,7 @@ void WrappedOpenGL::StartFrameCapture(void *dev, void *wnd)
}
}
bool WrappedOpenGL::EndFrameCapture(void *dev, void *wnd)
bool WrappedOpenGL::EndFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsActiveCapturing(m_State))
return true;
@@ -2258,9 +2261,10 @@ bool WrappedOpenGL::EndFrameCapture(void *dev, void *wnd)
// if the specified context isn't current, try and see if we've saved
// an appropriate backbuffer image during capture.
if((dev != NULL && existing.ctx != dev) || (wnd != 0 && (void *)existing.wnd != wnd))
if((devWnd.device != NULL && existing.ctx != devWnd.device) ||
(devWnd.windowHandle != 0 && (void *)existing.wnd != devWnd.windowHandle))
{
auto it = m_BackbufferImages.find(wnd);
auto it = m_BackbufferImages.find(devWnd.windowHandle);
if(it != m_BackbufferImages.end())
{
// pop this backbuffer image out of the map
@@ -2532,7 +2536,7 @@ bool WrappedOpenGL::EndFrameCapture(void *dev, void *wnd)
}
}
bool WrappedOpenGL::DiscardFrameCapture(void *dev, void *wnd)
bool WrappedOpenGL::DiscardFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsActiveCapturing(m_State))
return true;
@@ -2588,7 +2592,7 @@ void WrappedOpenGL::FirstFrame(void *ctx, void *wndHandle)
{
// since we haven't associated the window we can't capture by window, so we have to capture just
// on the device - the very next present to any window on this context will end the capture.
RenderDoc::Inst().StartFrameCapture(ctx, NULL);
RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow(ctx, NULL));
m_AppControlledCapture = false;
m_CapturedFrames.back().frameNumber = 0;
+3 -3
View File
@@ -696,9 +696,9 @@ public:
void ReplayMarkers(bool replay) { m_ReplayMarkers = replay; }
RDCDriver GetFrameCaptureDriver() { return GetDriverType(); }
void StartFrameCapture(void *dev, void *wnd);
bool EndFrameCapture(void *dev, void *wnd);
bool DiscardFrameCapture(void *dev, void *wnd);
void StartFrameCapture(DeviceOwnedWindow devWnd);
bool EndFrameCapture(DeviceOwnedWindow devWnd);
bool DiscardFrameCapture(DeviceOwnedWindow devWnd);
// map with key being mip level, value being stored data
typedef std::map<int, bytebuf> CompressedDataStore;
+15 -14
View File
@@ -1765,7 +1765,7 @@ void WrappedVulkan::FirstFrame()
// if we have to capture the first frame, begin capturing immediately
if(IsBackgroundCapturing(m_State) && RenderDoc::Inst().ShouldTriggerCapture(0))
{
RenderDoc::Inst().StartFrameCapture(LayerDisp(m_Instance), NULL);
RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
m_AppControlledCapture = false;
m_CapturedFrames.back().frameNumber = 0;
@@ -1789,7 +1789,7 @@ bool WrappedVulkan::Serialise_BeginCaptureFrame(SerialiserType &ser)
return true;
}
void WrappedVulkan::StartFrameCapture(void *dev, void *wnd)
void WrappedVulkan::StartFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsBackgroundCapturing(m_State))
return;
@@ -1897,25 +1897,26 @@ void WrappedVulkan::StartFrameCapture(void *dev, void *wnd)
}
}
bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd)
bool WrappedVulkan::EndFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsActiveCapturing(m_State))
return true;
VkSwapchainKHR swap = VK_NULL_HANDLE;
if(wnd)
if(devWnd.windowHandle)
{
{
SCOPED_LOCK(m_SwapLookupLock);
auto it = m_SwapLookup.find(wnd);
auto it = m_SwapLookup.find(devWnd.windowHandle);
if(it != m_SwapLookup.end())
swap = it->second;
}
if(swap == VK_NULL_HANDLE)
{
RDCERR("Output window %p provided for frame capture corresponds with no known swap chain", wnd);
RDCERR("Output window %p provided for frame capture corresponds with no known swap chain",
devWnd.windowHandle);
return false;
}
}
@@ -2356,7 +2357,7 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd)
return true;
}
bool WrappedVulkan::DiscardFrameCapture(void *dev, void *wnd)
bool WrappedVulkan::DiscardFrameCapture(DeviceOwnedWindow devWnd)
{
if(!IsActiveCapturing(m_State))
return true;
@@ -2418,9 +2419,9 @@ void WrappedVulkan::AdvanceFrame()
m_FrameCounter++; // first present becomes frame #1, this function is at the end of the frame
}
void WrappedVulkan::Present(void *dev, void *wnd)
void WrappedVulkan::Present(DeviceOwnedWindow devWnd)
{
bool activeWindow = wnd == NULL || RenderDoc::Inst().IsActiveWindow(dev, wnd);
bool activeWindow = devWnd.windowHandle == NULL || RenderDoc::Inst().IsActiveWindow(devWnd);
RenderDoc::Inst().AddActiveDriver(RDCDriver::Vulkan, true);
@@ -2428,11 +2429,11 @@ void WrappedVulkan::Present(void *dev, void *wnd)
return;
if(IsActiveCapturing(m_State) && !m_AppControlledCapture)
RenderDoc::Inst().EndFrameCapture(dev, wnd);
RenderDoc::Inst().EndFrameCapture(devWnd);
if(RenderDoc::Inst().ShouldTriggerCapture(m_FrameCounter) && IsBackgroundCapturing(m_State))
{
RenderDoc::Inst().StartFrameCapture(dev, wnd);
RenderDoc::Inst().StartFrameCapture(devWnd);
m_AppControlledCapture = false;
m_CapturedFrames.back().frameNumber = m_FrameCounter;
@@ -2468,11 +2469,11 @@ void WrappedVulkan::HandleFrameMarkers(const char *marker, VkQueue queue)
if(strstr(marker, "capture-marker,begin_capture") != NULL)
{
RenderDoc::Inst().StartFrameCapture(LayerDisp(m_Instance), NULL);
RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
}
if(strstr(marker, "capture-marker,end_capture") != NULL)
{
RenderDoc::Inst().EndFrameCapture(LayerDisp(m_Instance), NULL);
RenderDoc::Inst().EndFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
}
}
@@ -3736,7 +3737,7 @@ VkResourceRecord *WrappedVulkan::RegisterSurface(WindowingSystem system, void *h
{
Keyboard::AddInputWindow(system, handle);
RenderDoc::Inst().AddFrameCapturer(LayerDisp(m_Instance), handle, this);
RenderDoc::Inst().AddFrameCapturer(DeviceOwnedWindow(LayerDisp(m_Instance), handle), this);
return (VkResourceRecord *)new PackedWindowHandle(system, handle);
}
+4 -4
View File
@@ -918,12 +918,12 @@ private:
bool IsDrawInRenderPass();
RDCDriver GetFrameCaptureDriver() { return RDCDriver::Vulkan; }
void StartFrameCapture(void *dev, void *wnd);
bool EndFrameCapture(void *dev, void *wnd);
bool DiscardFrameCapture(void *dev, void *wnd);
void StartFrameCapture(DeviceOwnedWindow devWnd);
bool EndFrameCapture(DeviceOwnedWindow devWnd);
bool DiscardFrameCapture(DeviceOwnedWindow devWnd);
void AdvanceFrame();
void Present(void *dev, void *wnd);
void Present(DeviceOwnedWindow devWnd);
void HandleFrameMarkers(const char *marker, VkCommandBuffer commandBuffer);
void HandleFrameMarkers(const char *marker, VkQueue queue);
@@ -1337,7 +1337,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount,
if(beginCapture)
{
RenderDoc::Inst().StartFrameCapture(LayerDisp(m_Instance), NULL);
RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
}
{
@@ -1391,13 +1391,13 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount,
if(endCapture)
{
RenderDoc::Inst().EndFrameCapture(LayerDisp(m_Instance), NULL);
RenderDoc::Inst().EndFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
}
if(present)
{
AdvanceFrame();
Present(LayerDisp(m_Instance), NULL);
Present(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
}
return ret;
@@ -1505,7 +1505,7 @@ VkResult WrappedVulkan::vkQueueSubmit2(VkQueue queue, uint32_t submitCount,
if(beginCapture)
{
RenderDoc::Inst().StartFrameCapture(LayerDisp(m_Instance), NULL);
RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
}
{
@@ -1559,13 +1559,13 @@ VkResult WrappedVulkan::vkQueueSubmit2(VkQueue queue, uint32_t submitCount,
if(endCapture)
{
RenderDoc::Inst().EndFrameCapture(LayerDisp(m_Instance), NULL);
RenderDoc::Inst().EndFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
}
if(present)
{
AdvanceFrame();
Present(LayerDisp(m_Instance), NULL);
Present(DeviceOwnedWindow(LayerDisp(m_Instance), NULL));
}
return ret;
@@ -730,8 +730,9 @@ bool WrappedVulkan::Serialise_vkQueuePresentKHR(SerialiserType &ser, VkQueue que
SwapchainInfo &swapInfo = *swaprecord->swapInfo;
const bool activeWindow =
RenderDoc::Inst().IsActiveWindow(LayerDisp(m_Instance), swapInfo.wndHandle);
DeviceOwnedWindow devWnd(LayerDisp(m_Instance), swapInfo.wndHandle);
const bool activeWindow = RenderDoc::Inst().IsActiveWindow(devWnd);
if(activeWindow || PresentedImage == ResourceId())
PresentedImage = GetResID(swapInfo.images[pPresentInfo->pImageIndices[i]].im);
@@ -893,7 +894,7 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR
SwapchainInfo &swapInfo = *swaprecord->swapInfo;
Present(LayerDisp(m_Instance), swapInfo.wndHandle);
Present(DeviceOwnedWindow(LayerDisp(m_Instance), swapInfo.wndHandle));
}
return vkr;
@@ -911,7 +912,9 @@ void WrappedVulkan::HandlePresent(VkQueue queue, const VkPresentInfoKHR *pPresen
SwapchainInfo &swapInfo = *swaprecord->swapInfo;
bool activeWindow = RenderDoc::Inst().IsActiveWindow(LayerDisp(m_Instance), swapInfo.wndHandle);
DeviceOwnedWindow devWnd(LayerDisp(m_Instance), swapInfo.wndHandle);
const bool activeWindow = RenderDoc::Inst().IsActiveWindow(devWnd);
// need to record which image was last flipped so we can get the correct backbuffer
// for a thumbnail in EndFrameCapture
@@ -1057,8 +1060,8 @@ void WrappedVulkan::HandlePresent(VkQueue queue, const VkPresentInfoKHR *pPresen
UnwrapPtr(m_ExternalQueues[swapQueueIndex].ring[ringIdx].toext);
}
int flags = activeWindow ? RenderDoc::eOverlay_ActiveWindow : 0;
rdcstr overlayText = RenderDoc::Inst().GetOverlayText(RDCDriver::Vulkan, m_FrameCounter, flags);
rdcstr overlayText =
RenderDoc::Inst().GetOverlayText(RDCDriver::Vulkan, devWnd, m_FrameCounter, 0);
if(!overlayText.empty())
{
@@ -1145,7 +1148,7 @@ void WrappedVulkan::vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surfac
PackedWindowHandle *wnd = (PackedWindowHandle *)wrapper->record;
Keyboard::RemoveInputWindow(wnd->system, wnd->handle);
RenderDoc::Inst().RemoveFrameCapturer(LayerDisp(m_Instance), wnd->handle);
RenderDoc::Inst().RemoveFrameCapturer(DeviceOwnedWindow(LayerDisp(m_Instance), wnd->handle));
delete wnd;
}
+10 -8
View File
@@ -210,18 +210,20 @@ static uint32_t LaunchReplayUI(uint32_t connectTargetControl, const char *cmdlin
static void SetActiveWindow(void *device, void *wndHandle)
{
RenderDoc::Inst().SetActiveWindow(device, wndHandle);
RenderDoc::Inst().SetActiveWindow(DeviceOwnedWindow(device, wndHandle));
}
static void StartFrameCapture(void *device, void *wndHandle)
{
RenderDoc::Inst().StartFrameCapture(device, wndHandle);
DeviceOwnedWindow devWnd(device, wndHandle);
if(device == NULL || wndHandle == NULL)
RenderDoc::Inst().MatchClosestWindow(device, wndHandle);
RenderDoc::Inst().StartFrameCapture(devWnd);
if(device != NULL && wndHandle != NULL)
RenderDoc::Inst().SetActiveWindow(device, wndHandle);
if(devWnd.device == NULL || devWnd.windowHandle == NULL)
RenderDoc::Inst().MatchClosestWindow(devWnd);
if(devWnd.device != NULL && devWnd.windowHandle != NULL)
RenderDoc::Inst().SetActiveWindow(devWnd);
}
static uint32_t IsFrameCapturing()
@@ -231,12 +233,12 @@ static uint32_t IsFrameCapturing()
static uint32_t EndFrameCapture(void *device, void *wndHandle)
{
return RenderDoc::Inst().EndFrameCapture(device, wndHandle) ? 1 : 0;
return RenderDoc::Inst().EndFrameCapture(DeviceOwnedWindow(device, wndHandle)) ? 1 : 0;
}
static uint32_t DiscardFrameCapture(void *device, void *wndHandle)
{
return RenderDoc::Inst().DiscardFrameCapture(device, wndHandle) ? 1 : 0;
return RenderDoc::Inst().DiscardFrameCapture(DeviceOwnedWindow(device, wndHandle)) ? 1 : 0;
}
static uint32_t ShowReplayUI()