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();