diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index dc8415767..efcf28cfe 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -668,7 +668,10 @@ IFrameCapturer *RenderDoc::MatchFrameCapturer(void *dev, void *wnd) return defaultit->second; } - RDCERR("Couldn't find matching frame capturer for device %p window %p", dev, 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()); return NULL; } @@ -1604,34 +1607,50 @@ void RenderDoc::FinishCaptureWriting(RDCFile *rdc, uint32_t frameNumber) void RenderDoc::AddDeviceFrameCapturer(void *dev, IFrameCapturer *cap) { + if(IsReplayApp()) + return; + if(dev == NULL || cap == NULL) { - RDCERR("Invalid FrameCapturer combination: %#p / %#p", dev, cap); + RDCERR("Invalid FrameCapturer %#p for device: %#p", cap, dev); return; } + RDCLOG("Adding %s device frame capturer for %#p", ToStr(cap->GetFrameCaptureDriver()).c_str(), dev); + m_DeviceFrameCapturers[dev] = cap; } void RenderDoc::RemoveDeviceFrameCapturer(void *dev) { + if(IsReplayApp()) + return; + if(dev == NULL) { RDCERR("Invalid device pointer: %#p", dev); return; } + RDCLOG("Removing device frame capturer for %#p", dev); + m_DeviceFrameCapturers.erase(dev); } void RenderDoc::AddFrameCapturer(void *dev, void *wnd, IFrameCapturer *cap) { + if(IsReplayApp()) + return; + if(dev == NULL || wnd == NULL || cap == NULL) { - RDCERR("Invalid FrameCapturer combination: %#p / %#p", wnd, cap); + RDCERR("Invalid FrameCapturer %#p for combination: %#p / %#p", cap, dev, wnd); return; } + RDCLOG("Adding %s frame capturer for %#p / %#p", ToStr(cap->GetFrameCaptureDriver()).c_str(), dev, + wnd); + DeviceWnd dw(dev, wnd); auto it = m_WindowFrameCapturers.find(dw); @@ -1654,8 +1673,13 @@ void RenderDoc::AddFrameCapturer(void *dev, void *wnd, IFrameCapturer *cap) void RenderDoc::RemoveFrameCapturer(void *dev, void *wnd) { + if(IsReplayApp()) + return; + DeviceWnd dw(dev, wnd); + RDCLOG("Removing frame capturer for %#p / %#p", dev, wnd); + auto it = m_WindowFrameCapturers.find(dw); if(it != m_WindowFrameCapturers.end()) { diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 27efa2f24..4dba7af81 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -45,6 +45,8 @@ struct RDCThumb; bool is_exr_file(FILE *f); void LogReplayOptions(const ReplayOptions &opts); +enum class RDCDriver : uint32_t; + struct ICrashHandler { virtual ~ICrashHandler() {} @@ -54,6 +56,7 @@ struct ICrashHandler 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; diff --git a/renderdoc/driver/d3d11/d3d11_device.h b/renderdoc/driver/d3d11/d3d11_device.h index 48e77df77..67d101574 100644 --- a/renderdoc/driver/d3d11/d3d11_device.h +++ b/renderdoc/driver/d3d11/d3d11_device.h @@ -459,6 +459,7 @@ public: template 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); diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 98ce3c11b..237d4f381 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -649,6 +649,7 @@ public: void GPUSync(ID3D12CommandQueue *queue = NULL, ID3D12Fence *fence = NULL); 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); diff --git a/renderdoc/driver/d3d8/d3d8_device.h b/renderdoc/driver/d3d8/d3d8_device.h index 3f0ba3d14..c32dbefa5 100644 --- a/renderdoc/driver/d3d8/d3d8_device.h +++ b/renderdoc/driver/d3d8/d3d8_device.h @@ -38,6 +38,7 @@ 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); diff --git a/renderdoc/driver/d3d9/d3d9_device.h b/renderdoc/driver/d3d9/d3d9_device.h index 3ec9846bd..db2993029 100644 --- a/renderdoc/driver/d3d9/d3d9_device.h +++ b/renderdoc/driver/d3d9/d3d9_device.h @@ -36,6 +36,7 @@ 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); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 9b82d052a..02bead81a 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -604,6 +604,7 @@ public: void FirstFrame(void *ctx, void *wndHandle); 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); diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 52aa61900..212c34da3 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -826,6 +826,7 @@ 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);