diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 856d31451..32f823eb2 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -2566,6 +2566,8 @@ void WrappedID3D11Device::FirstFrame(IDXGISwapper *swapper) { RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow((ID3D11Device *)this, swapper->GetHWND())); + m_FirstFrameCaptureWindow = swapper->GetHWND(); + m_AppControlledCapture = false; m_CapturedFrames.back().frameNumber = 0; } @@ -2669,7 +2671,17 @@ HRESULT WrappedID3D11Device::Present(IDXGISwapper *swapper, UINT SyncInterval, U m_pImmediateContext->Present(SyncInterval, Flags); if(!activeWindow) + { + // first present to *any* window, even inactive, terminates frame 0 + if(m_FirstFrameCaptureWindow != NULL && IsActiveCapturing(m_State)) + { + RenderDoc::Inst().EndFrameCapture( + DeviceOwnedWindow((ID3D11Device *)this, m_FirstFrameCaptureWindow)); + m_FirstFrameCaptureWindow = NULL; + } + return S_OK; + } // kill any current capture that isn't application defined if(IsActiveCapturing(m_State) && !m_AppControlledCapture) diff --git a/renderdoc/driver/d3d11/d3d11_device.h b/renderdoc/driver/d3d11/d3d11_device.h index d5c64c7bc..c4cb13a8c 100644 --- a/renderdoc/driver/d3d11/d3d11_device.h +++ b/renderdoc/driver/d3d11/d3d11_device.h @@ -557,6 +557,7 @@ private: D3D11ResourceRecord *m_DeviceRecord; CaptureState m_State; + void *m_FirstFrameCaptureWindow = NULL; bool m_AppControlledCapture = false; PerformanceTimer m_CaptureTimer; diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 48c73cb61..289bae2c6 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -1387,6 +1387,8 @@ void WrappedID3D12Device::FirstFrame(IDXGISwapper *swapper) RenderDoc::Inst().StartFrameCapture( DeviceOwnedWindow((ID3D12Device *)this, swapper ? swapper->GetHWND() : NULL)); + m_FirstFrameCapture = true; + m_FirstFrameCaptureWindow = swapper ? swapper->GetHWND() : NULL; m_AppControlledCapture = false; m_CapturedFrames.back().frameNumber = 0; } @@ -2118,7 +2120,18 @@ HRESULT WrappedID3D12Device::Present(ID3D12GraphicsCommandList *pOverlayCommandL } if(!activeWindow) + { + // first present to *any* window, even inactive, terminates frame 0 + if(m_FirstFrameCapture && IsActiveCapturing(m_State)) + { + RenderDoc::Inst().EndFrameCapture( + DeviceOwnedWindow((ID3D12Device *)this, m_FirstFrameCaptureWindow)); + m_FirstFrameCaptureWindow = NULL; + m_FirstFrameCapture = false; + } + return S_OK; + } // kill any current capture that isn't application defined if(IsActiveCapturing(m_State) && !m_AppControlledCapture) diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 926d49edd..b03b63be9 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -682,6 +682,8 @@ private: RDResult m_FailedReplayResult = ResultCode::APIReplayFailed; bool m_AppControlledCapture = false; + bool m_FirstFrameCapture = false; + void *m_FirstFrameCaptureWindow = NULL; Threading::RWLock m_CapTransitionLock; CaptureState m_State; diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 2fd6d5768..84017e3ca 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -2127,7 +2127,17 @@ void WrappedOpenGL::SwapBuffers(WindowingSystem winSystem, void *windowHandle) GetResourceManager()->CleanBackgroundFrameReferences(); if(!activeWindow) + { + // first present to *any* window, even inactive, terminates frame 0 + if(m_FirstFrameCapture && IsActiveCapturing(m_State)) + { + RenderDoc::Inst().EndFrameCapture(DeviceOwnedWindow(m_FirstFrameCaptureContext, NULL)); + m_FirstFrameCapture = false; + m_FirstFrameCaptureContext = NULL; + } + return; + } // only allow capturing on 'modern' created contexts if(ctxdata.Legacy()) @@ -2594,6 +2604,8 @@ void WrappedOpenGL::FirstFrame(void *ctx, void *wndHandle) // on the device - the very next present to any window on this context will end the capture. RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow(ctx, NULL)); + m_FirstFrameCapture = true; + m_FirstFrameCaptureContext = ctx; m_AppControlledCapture = false; m_CapturedFrames.back().frameNumber = 0; } diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index e65775691..cb17b4d7a 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -145,6 +145,8 @@ private: // internals CaptureState m_State; bool m_AppControlledCapture = false; + bool m_FirstFrameCapture = false; + void *m_FirstFrameCaptureContext = NULL; PerformanceTimer m_CaptureTimer; diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 6dc6aade0..ff1f688f9 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1767,6 +1767,10 @@ void WrappedVulkan::FirstFrame() { RenderDoc::Inst().StartFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL)); + RDCLOG("frame 0 cap"); + + m_FirstFrameCapture = true; + m_AppControlledCapture = false; m_CapturedFrames.back().frameNumber = 0; } @@ -2433,8 +2437,21 @@ void WrappedVulkan::Present(DeviceOwnedWindow devWnd) RenderDoc::Inst().AddActiveDriver(RDCDriver::Vulkan, true); + RDCLOG("Present() window %p", devWnd.windowHandle); + if(!activeWindow) + { + RDCLOG("inactive"); + + // first present to *any* window, even inactive, terminates frame 0 + if(m_FirstFrameCapture && IsActiveCapturing(m_State)) + { + RenderDoc::Inst().EndFrameCapture(DeviceOwnedWindow(LayerDisp(m_Instance), NULL)); + m_FirstFrameCapture = false; + } + return; + } if(IsActiveCapturing(m_State) && !m_AppControlledCapture) RenderDoc::Inst().EndFrameCapture(devWnd); @@ -3745,6 +3762,8 @@ VkResourceRecord *WrappedVulkan::RegisterSurface(WindowingSystem system, void *h { Keyboard::AddInputWindow(system, handle); + RDCLOG("RegisterSurface() window %p", handle); + RenderDoc::Inst().AddFrameCapturer(DeviceOwnedWindow(LayerDisp(m_Instance), handle), this); return (VkResourceRecord *)new PackedWindowHandle(system, handle); diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 5800dc752..4059e6f85 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -299,6 +299,7 @@ private: RDResult m_FatalError = ResultCode::Succeeded; CaptureState m_State; bool m_AppControlledCapture = false; + bool m_FirstFrameCapture = false; int32_t m_ReuseEnabled = 1;