From 5b52bd7724afb885b6d947358d9027f07e54d2f2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 14 Apr 2021 16:56:14 +0100 Subject: [PATCH] Treat API as unsupported if no frame capturers handle it. Closes #2222 * This is a bit coarse, as e.g. if you have one window that is unsupported on an API and another that is this will treat both as supported even if the active window doesn't support capturing. This is an unlikely case and needs a new UI to properly represent that. --- renderdoc/core/core.cpp | 13 +++++++++++++ renderdoc/core/core.h | 1 + renderdoc/core/target_control.cpp | 2 ++ renderdoc/driver/gl/gl_driver.cpp | 6 ++++-- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index 7bad47778..fc0ad99c5 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -1914,6 +1914,19 @@ void RenderDoc::RemoveFrameCapturer(void *dev, void *wnd) } } +bool RenderDoc::HasActiveFrameCapturer(RDCDriver driver) const +{ + for(auto cap = m_WindowFrameCapturers.begin(); cap != m_WindowFrameCapturers.end(); cap++) + if(cap->second.FrameCapturer->GetFrameCaptureDriver() == driver) + return true; + + for(auto cap = m_DeviceFrameCapturers.begin(); cap != m_DeviceFrameCapturers.end(); cap++) + if(cap->second->GetFrameCaptureDriver() == driver) + return true; + + return false; +} + #if ENABLED(ENABLE_UNIT_TESTS) #undef None diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 7343d64b2..513af572f 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -525,6 +525,7 @@ public: void AddFrameCapturer(void *dev, void *wnd, IFrameCapturer *cap); void RemoveFrameCapturer(void *dev, void *wnd); + bool HasActiveFrameCapturer(RDCDriver driver) const; // add window-less frame capturers for use via users capturing // manually through the renderdoc API with NULL device/window handles diff --git a/renderdoc/core/target_control.cpp b/renderdoc/core/target_control.cpp index 121e3ad18..14fcb5d7d 100644 --- a/renderdoc/core/target_control.cpp +++ b/renderdoc/core/target_control.cpp @@ -196,6 +196,8 @@ void RenderDoc::TargetControlClientThread(uint32_t version, Network::Socket *cli bool supported = RenderDoc::Inst().HasRemoteDriver(driver) || RenderDoc::Inst().HasReplayDriver(driver); + supported &= RenderDoc::Inst().HasActiveFrameCapturer(driver); + WRITE_DATA_SCOPE(); { SCOPED_SERIALISE_CHUNK(ePacket_APIUse); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index bc94615bf..6f0786966 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1030,7 +1030,8 @@ void WrappedOpenGL::DeleteContext(void *contextHandle) RDCLOG("Deleting context %p", contextHandle); - RenderDoc::Inst().RemoveDeviceFrameCapturer(ctxdata.ctx); + if(ctxdata.Modern()) + RenderDoc::Inst().RemoveDeviceFrameCapturer(ctxdata.ctx); // delete the context GetResourceManager()->DeleteContext(contextHandle); @@ -1161,7 +1162,8 @@ void WrappedOpenGL::CreateContext(GLWindowingData winData, void *shareContext, RDCLOG("Reusing old sharegroup %p", ctxdata.shareGroup); } - RenderDoc::Inst().AddDeviceFrameCapturer(ctxdata.ctx, this); + if(ctxdata.Modern()) + RenderDoc::Inst().AddDeviceFrameCapturer(ctxdata.ctx, this); // re-configure callstack capture, since WrappedOpenGL constructor may run too early uint32_t flags = m_ScratchSerialiser.GetChunkMetadataRecording();