diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index c2c9ebfc2..e9c52e865 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -2408,8 +2408,19 @@ void WrappedID3D11Device::ReplayLog(uint32_t startEventID, uint32_t endEventID, RDCFATAL("Unexpected replay type"); } -void WrappedID3D11Device::ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap) +void WrappedID3D11Device::ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap, UINT QueueCount, + IUnknown *const *ppPresentQueue, + IUnknown **unwrappedQueues) { + RDCASSERT(ppPresentQueue == NULL); + + if(ppPresentQueue) + { + RDCERR("D3D11 doesn't support present queues - passing through unmodified"); + for(UINT i = 0; i < QueueCount; i++) + unwrappedQueues[i] = ppPresentQueue[i]; + } + for(int i = 0; i < swap->GetNumBackbuffers(); i++) { WrappedID3D11Texture2D1 *wrapped11 = (WrappedID3D11Texture2D1 *)swap->GetBackbuffers()[i]; diff --git a/renderdoc/driver/d3d11/d3d11_device.h b/renderdoc/driver/d3d11/d3d11_device.h index 4025a806c..8ec2b3c99 100644 --- a/renderdoc/driver/d3d11/d3d11_device.h +++ b/renderdoc/driver/d3d11/d3d11_device.h @@ -480,7 +480,8 @@ public: void NewSwapchainBuffer(IUnknown *backbuffer); - void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap); + void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap, UINT QueueCount, + IUnknown *const *ppPresentQueue, IUnknown **unwrappedQueues); void InternalRef() { InterlockedIncrement(&m_InternalRefcount); } void InternalRelease() { InterlockedDecrement(&m_InternalRefcount); } diff --git a/renderdoc/driver/d3d12/d3d12_command_queue.h b/renderdoc/driver/d3d12/d3d12_command_queue.h index acc57046a..b1d96c82e 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue.h +++ b/renderdoc/driver/d3d12/d3d12_command_queue.h @@ -148,9 +148,10 @@ public: { m_pDevice->NewSwapchainBuffer(backbuffer); } - virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swapChain) + virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swapChain, UINT QueueCount, + IUnknown *const *ppPresentQueue, IUnknown **unwrappedQueues) { - m_pDevice->ReleaseSwapchainResources(swapChain); + m_pDevice->ReleaseSwapchainResources(swapChain, QueueCount, ppPresentQueue, unwrappedQueues); } virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer, IUnknown *realSurface) diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 8bfe8f184..d04c1a19b 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -542,8 +542,21 @@ void WrappedID3D12Device::ApplyBarriers(vector &barriers GetResourceManager()->ApplyBarriers(barriers, m_ResourceStates); } -void WrappedID3D12Device::ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap) +void WrappedID3D12Device::ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap, UINT QueueCount, + IUnknown *const *ppPresentQueue, + IUnknown **unwrappedQueues) { + if(ppPresentQueue) + { + for(UINT i = 0; i < QueueCount; i++) + { + WrappedID3D12CommandQueue *wrappedQ = (WrappedID3D12CommandQueue *)ppPresentQueue[i]; + RDCASSERT(WrappedID3D12CommandQueue::IsAlloc(wrappedQ)); + + unwrappedQueues[i] = wrappedQ->GetReal(); + } + } + for(int i = 0; i < swap->GetNumBackbuffers(); i++) { WrappedID3D12Resource *wrapped = (WrappedID3D12Resource *)swap->GetBackbuffers()[i]; diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 939d680ee..60138aa4c 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -448,7 +448,8 @@ public: HRESULT Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags); void NewSwapchainBuffer(IUnknown *backbuffer) {} - void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap); + void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap, UINT QueueCount, + IUnknown *const *ppPresentQueue, IUnknown **unwrappedQueues); void Map(WrappedID3D12Resource *Resource, UINT Subresource); void Unmap(WrappedID3D12Resource *Resource, UINT Subresource, byte *mapPtr, diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.cpp b/renderdoc/driver/dxgi/dxgi_wrapped.cpp index 80c50f6da..2faa70aed 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.cpp +++ b/renderdoc/driver/dxgi/dxgi_wrapped.cpp @@ -200,7 +200,7 @@ WrappedIDXGISwapChain4::WrappedIDXGISwapChain4(IDXGISwapChain *real, HWND wnd, I WrappedIDXGISwapChain4::~WrappedIDXGISwapChain4() { - m_pDevice->ReleaseSwapchainResources(this); + m_pDevice->ReleaseSwapchainResources(this, 0, NULL, NULL); SAFE_RELEASE(m_pDevice); @@ -267,9 +267,10 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::QueryInterface(REFIID riid, vo return RefCountDXGIObject::QueryInterface(riid, ppvObject); } -void WrappedIDXGISwapChain4::ReleaseBuffersForResize() +void WrappedIDXGISwapChain4::ReleaseBuffersForResize(UINT QueueCount, IUnknown *const *ppPresentQueue, + IUnknown **unwrappedQueues) { - m_pDevice->ReleaseSwapchainResources(this); + m_pDevice->ReleaseSwapchainResources(this, QueueCount, ppPresentQueue, unwrappedQueues); } void WrappedIDXGISwapChain4::WrapBuffersAfterResize() @@ -303,7 +304,7 @@ HRESULT WrappedIDXGISwapChain4::ResizeBuffers( /* [in] */ DXGI_FORMAT NewFormat, /* [in] */ UINT SwapChainFlags) { - ReleaseBuffersForResize(); + ReleaseBuffersForResize(0, NULL, NULL); HRESULT ret = m_pReal->ResizeBuffers(BufferCount, Width, Height, NewFormat, SwapChainFlags); @@ -319,10 +320,17 @@ HRESULT WrappedIDXGISwapChain4::ResizeBuffers1(_In_ UINT BufferCount, _In_ UINT _In_reads_(BufferCount) IUnknown *const *ppPresentQueue) { - ReleaseBuffersForResize(); + IUnknown **unwrappedQueues = NULL; + + if(ppPresentQueue) + unwrappedQueues = new IUnknown *[BufferCount]; + + ReleaseBuffersForResize(BufferCount, ppPresentQueue, unwrappedQueues); HRESULT ret = m_pReal3->ResizeBuffers1(BufferCount, Width, Height, Format, SwapChainFlags, - pCreationNodeMask, ppPresentQueue); + pCreationNodeMask, unwrappedQueues); + + SAFE_DELETE_ARRAY(unwrappedQueues); WrapBuffersAfterResize(); diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.h b/renderdoc/driver/dxgi/dxgi_wrapped.h index 401d331be..73239ce0f 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.h +++ b/renderdoc/driver/dxgi/dxgi_wrapped.h @@ -170,7 +170,9 @@ struct ID3DDevice virtual void FirstFrame(WrappedIDXGISwapChain4 *swapChain) = 0; virtual void NewSwapchainBuffer(IUnknown *backbuffer) = 0; - virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swapChain) = 0; + virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swapChain, UINT QueueCount, + IUnknown *const *ppPresentQueue, + IUnknown **unwrappedQueues) = 0; virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer, IUnknown *realSurface) = 0; @@ -556,7 +558,8 @@ class WrappedIDXGISwapChain4 : public IDXGISwapChain4, public RefCountDXGIObject IUnknown *m_pBackBuffers[MAX_NUM_BACKBUFFERS]; - void ReleaseBuffersForResize(); + void ReleaseBuffersForResize(UINT QueueCount, IUnknown *const *ppPresentQueue, + IUnknown **unwrappedQueues); void WrapBuffersAfterResize(); public: