From 447b64fd14e11b3fa38d21ac166e1914b0c16dec Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 26 Oct 2016 17:10:05 +0200 Subject: [PATCH] Wrap DXGI 1.5 passthrough, to ensure the wrapping ecosystem isn't broken --- renderdoc/driver/d3d11/d3d11_device.cpp | 20 ++-- renderdoc/driver/d3d11/d3d11_device.h | 10 +- renderdoc/driver/d3d11/d3d11_hooks.cpp | 4 +- renderdoc/driver/d3d11/d3d11_replay.cpp | 2 +- renderdoc/driver/d3d12/d3d12_command_queue.h | 8 +- renderdoc/driver/d3d12/d3d12_device.cpp | 20 ++-- renderdoc/driver/d3d12/d3d12_device.h | 12 +- renderdoc/driver/d3d12/d3d12_hooks.cpp | 2 +- renderdoc/driver/d3d12/d3d12_replay.cpp | 2 +- renderdoc/driver/dxgi/dxgi_wrapped.cpp | 115 +++++++++++++------ renderdoc/driver/dxgi/dxgi_wrapped.h | 85 +++++++++++--- 11 files changed, 188 insertions(+), 92 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index c22bdfaa9..c2c9ebfc2 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -621,7 +621,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject) if(SUCCEEDED(hr)) { IDXGIDevice *real = (IDXGIDevice *)(*ppvObject); - *ppvObject = (IDXGIDevice *)(new WrappedIDXGIDevice3(real, this)); + *ppvObject = (IDXGIDevice *)(new WrappedIDXGIDevice4(real, this)); return S_OK; } else @@ -637,7 +637,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject) if(SUCCEEDED(hr)) { IDXGIDevice1 *real = (IDXGIDevice1 *)(*ppvObject); - *ppvObject = (IDXGIDevice1 *)(new WrappedIDXGIDevice3(real, this)); + *ppvObject = (IDXGIDevice1 *)(new WrappedIDXGIDevice4(real, this)); return S_OK; } else @@ -653,7 +653,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject) if(SUCCEEDED(hr)) { IDXGIDevice2 *real = (IDXGIDevice2 *)(*ppvObject); - *ppvObject = (IDXGIDevice2 *)(new WrappedIDXGIDevice3(real, this)); + *ppvObject = (IDXGIDevice2 *)(new WrappedIDXGIDevice4(real, this)); return S_OK; } else @@ -669,7 +669,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject) if(SUCCEEDED(hr)) { IDXGIDevice3 *real = (IDXGIDevice3 *)(*ppvObject); - *ppvObject = (IDXGIDevice3 *)(new WrappedIDXGIDevice3(real, this)); + *ppvObject = (IDXGIDevice3 *)(new WrappedIDXGIDevice4(real, this)); return S_OK; } else @@ -2408,7 +2408,7 @@ void WrappedID3D11Device::ReplayLog(uint32_t startEventID, uint32_t endEventID, RDCFATAL("Unexpected replay type"); } -void WrappedID3D11Device::ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap) +void WrappedID3D11Device::ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap) { for(int i = 0; i < swap->GetNumBackbuffers(); i++) { @@ -2444,7 +2444,7 @@ void WrappedID3D11Device::ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap } } -bool WrappedID3D11Device::Serialise_WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, +bool WrappedID3D11Device::Serialise_WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer, IUnknown *realSurface) { @@ -2498,7 +2498,7 @@ bool WrappedID3D11Device::Serialise_WrapSwapchainBuffer(WrappedIDXGISwapChain3 * return true; } -IUnknown *WrappedID3D11Device::WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, +IUnknown *WrappedID3D11Device::WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer, IUnknown *realSurface) { @@ -2659,7 +2659,7 @@ bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd) CaptureFailReason reason; - WrappedIDXGISwapChain3 *swap = NULL; + WrappedIDXGISwapChain4 *swap = NULL; if(wnd) { @@ -3198,7 +3198,7 @@ void WrappedID3D11Device::UnlockForChunkRemoval() } } -void WrappedID3D11Device::FirstFrame(WrappedIDXGISwapChain3 *swapChain) +void WrappedID3D11Device::FirstFrame(WrappedIDXGISwapChain4 *swapChain) { DXGI_SWAP_CHAIN_DESC swapdesc; swapChain->GetDesc(&swapdesc); @@ -3212,7 +3212,7 @@ void WrappedID3D11Device::FirstFrame(WrappedIDXGISwapChain3 *swapChain) } } -HRESULT WrappedID3D11Device::Present(WrappedIDXGISwapChain3 *swap, UINT SyncInterval, UINT Flags) +HRESULT WrappedID3D11Device::Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags) { if((Flags & DXGI_PRESENT_TEST) != 0) return S_OK; diff --git a/renderdoc/driver/d3d11/d3d11_device.h b/renderdoc/driver/d3d11/d3d11_device.h index 9626cb819..4025a806c 100644 --- a/renderdoc/driver/d3d11/d3d11_device.h +++ b/renderdoc/driver/d3d11/d3d11_device.h @@ -340,7 +340,7 @@ private: static WrappedID3D11Device *m_pCurrentWrappedDevice; - map m_SwapChains; + map m_SwapChains; uint32_t m_FrameCounter; uint32_t m_FailedFrame; @@ -393,7 +393,7 @@ public: void LockForChunkRemoval(); void UnlockForChunkRemoval(); - void FirstFrame(WrappedIDXGISwapChain3 *swapChain); + void FirstFrame(WrappedIDXGISwapChain4 *swapChain); vector GetDebugMessages(); void AddDebugMessage(DebugMessage msg); @@ -473,14 +473,14 @@ public: ID3D11ClassInstance *inst)); // Swap Chain - IMPLEMENT_FUNCTION_SERIALISED(IUnknown *, WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, + IMPLEMENT_FUNCTION_SERIALISED(IUnknown *, WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *desc, UINT buffer, IUnknown *realSurface)); - HRESULT Present(WrappedIDXGISwapChain3 *swap, UINT SyncInterval, UINT Flags); + HRESULT Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags); void NewSwapchainBuffer(IUnknown *backbuffer); - void ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap); + void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap); void InternalRef() { InterlockedIncrement(&m_InternalRefcount); } void InternalRelease() { InterlockedDecrement(&m_InternalRefcount); } diff --git a/renderdoc/driver/d3d11/d3d11_hooks.cpp b/renderdoc/driver/d3d11/d3d11_hooks.cpp index df25462a1..ca7608b41 100644 --- a/renderdoc/driver/d3d11/d3d11_hooks.cpp +++ b/renderdoc/driver/d3d11/d3d11_hooks.cpp @@ -53,7 +53,7 @@ public: { bool success = true; - WrappedIDXGISwapChain3::RegisterD3DDeviceCallback(GetD3D11DeviceIfAlloc); + WrappedIDXGISwapChain4::RegisterD3DDeviceCallback(GetD3D11DeviceIfAlloc); // also require d3dcompiler_??.dll if(GetD3DCompiler() == NULL) @@ -258,7 +258,7 @@ private: wrap->GetImmediateContext(ppImmediateContext); if(ppSwapChain && *ppSwapChain) - *ppSwapChain = new WrappedIDXGISwapChain3( + *ppSwapChain = new WrappedIDXGISwapChain4( *ppSwapChain, pSwapChainDesc ? pSwapChainDesc->OutputWindow : NULL, wrap); } } diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index dc2125f7b..75e36e2fa 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -1931,7 +1931,7 @@ ReplayCreateStatus D3D11_CreateReplayDevice(const char *logfile, IReplayDriver * { RDCDEBUG("Creating a D3D11 replay device"); - WrappedIDXGISwapChain3::RegisterD3DDeviceCallback(GetD3D11DeviceIfAlloc); + WrappedIDXGISwapChain4::RegisterD3DDeviceCallback(GetD3D11DeviceIfAlloc); HMODULE lib = NULL; lib = LoadLibraryA("d3d11.dll"); diff --git a/renderdoc/driver/d3d12/d3d12_command_queue.h b/renderdoc/driver/d3d12/d3d12_command_queue.h index 0146dab25..acc57046a 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue.h +++ b/renderdoc/driver/d3d12/d3d12_command_queue.h @@ -143,22 +143,22 @@ public: return NULL; } // the rest forward to the device - virtual void FirstFrame(WrappedIDXGISwapChain3 *swapChain) { m_pDevice->FirstFrame(swapChain); } + virtual void FirstFrame(WrappedIDXGISwapChain4 *swapChain) { m_pDevice->FirstFrame(swapChain); } virtual void NewSwapchainBuffer(IUnknown *backbuffer) { m_pDevice->NewSwapchainBuffer(backbuffer); } - virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swapChain) + virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swapChain) { m_pDevice->ReleaseSwapchainResources(swapChain); } - virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, + virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer, IUnknown *realSurface) { return m_pDevice->WrapSwapchainBuffer(swap, swapDesc, buffer, realSurface); } - virtual HRESULT Present(WrappedIDXGISwapChain3 *swapChain, UINT SyncInterval, UINT Flags) + virtual HRESULT Present(WrappedIDXGISwapChain4 *swapChain, UINT SyncInterval, UINT Flags) { return m_pDevice->Present(swapChain, SyncInterval, Flags); } diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index b7e700555..4601c8e51 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -392,7 +392,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject) if(SUCCEEDED(hr)) { IDXGIDevice *real = (IDXGIDevice *)(*ppvObject); - *ppvObject = (IDXGIDevice *)(new WrappedIDXGIDevice3(real, this)); + *ppvObject = (IDXGIDevice *)(new WrappedIDXGIDevice4(real, this)); return S_OK; } else @@ -408,7 +408,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject) if(SUCCEEDED(hr)) { IDXGIDevice1 *real = (IDXGIDevice1 *)(*ppvObject); - *ppvObject = (IDXGIDevice1 *)(new WrappedIDXGIDevice3(real, this)); + *ppvObject = (IDXGIDevice1 *)(new WrappedIDXGIDevice4(real, this)); return S_OK; } else @@ -424,7 +424,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject) if(SUCCEEDED(hr)) { IDXGIDevice2 *real = (IDXGIDevice2 *)(*ppvObject); - *ppvObject = (IDXGIDevice2 *)(new WrappedIDXGIDevice3(real, this)); + *ppvObject = (IDXGIDevice2 *)(new WrappedIDXGIDevice4(real, this)); return S_OK; } else @@ -440,7 +440,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject) if(SUCCEEDED(hr)) { IDXGIDevice3 *real = (IDXGIDevice3 *)(*ppvObject); - *ppvObject = (IDXGIDevice3 *)(new WrappedIDXGIDevice3(real, this)); + *ppvObject = (IDXGIDevice3 *)(new WrappedIDXGIDevice4(real, this)); return S_OK; } else @@ -509,7 +509,7 @@ void WrappedID3D12Device::CheckForDeath() } } -void WrappedID3D12Device::FirstFrame(WrappedIDXGISwapChain3 *swap) +void WrappedID3D12Device::FirstFrame(WrappedIDXGISwapChain4 *swap) { DXGI_SWAP_CHAIN_DESC swapdesc; swap->GetDesc(&swapdesc); @@ -529,7 +529,7 @@ void WrappedID3D12Device::ApplyBarriers(vector &barriers GetResourceManager()->ApplyBarriers(barriers, m_ResourceStates); } -void WrappedID3D12Device::ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap) +void WrappedID3D12Device::ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap) { for(int i = 0; i < swap->GetNumBackbuffers(); i++) { @@ -558,7 +558,7 @@ void WrappedID3D12Device::ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap } bool WrappedID3D12Device::Serialise_WrapSwapchainBuffer(Serialiser *localSerialiser, - WrappedIDXGISwapChain3 *swap, + WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer, IUnknown *realSurface) { @@ -618,7 +618,7 @@ bool WrappedID3D12Device::Serialise_WrapSwapchainBuffer(Serialiser *localSeriali return true; } -IUnknown *WrappedID3D12Device::WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, +IUnknown *WrappedID3D12Device::WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer, IUnknown *realSurface) { @@ -891,7 +891,7 @@ void WrappedID3D12Device::WriteToSubresource(WrappedID3D12Resource *Resource, UI } } -HRESULT WrappedID3D12Device::Present(WrappedIDXGISwapChain3 *swap, UINT SyncInterval, UINT Flags) +HRESULT WrappedID3D12Device::Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags) { if((Flags & DXGI_PRESENT_TEST) != 0) return S_OK; @@ -1123,7 +1123,7 @@ bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd) if(m_State != WRITING_CAPFRAME) return true; - WrappedIDXGISwapChain3 *swap = NULL; + WrappedIDXGISwapChain4 *swap = NULL; SwapPresentInfo swapInfo = {}; if(wnd) diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 209128da4..95cf31dd1 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -320,10 +320,10 @@ private: int32_t lastPresentedBuffer; }; - map m_SwapChains; + map m_SwapChains; pair m_BackbufferFormat; - WrappedIDXGISwapChain3 *m_LastSwap; + WrappedIDXGISwapChain4 *m_LastSwap; UINT m_DescriptorIncrements[D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES]; @@ -353,7 +353,7 @@ public: ResourceId GetResourceID() { return m_ResourceID; } Threading::CriticalSection &GetCapTransitionLock() { return m_CapTransitionLock; } void ReleaseSwapchainResources(IDXGISwapChain *swap, IUnknown **backbuffers, int numBackbuffers); - void FirstFrame(WrappedIDXGISwapChain3 *swap); + void FirstFrame(WrappedIDXGISwapChain4 *swap); FetchFrameRecord &GetFrameRecord() { return m_FrameRecord; } const FetchDrawcall *GetDrawcall(uint32_t eventID); @@ -440,12 +440,12 @@ public: } // Swap Chain IMPLEMENT_FUNCTION_THREAD_SERIALISED(IUnknown *, WrapSwapchainBuffer, - WrappedIDXGISwapChain3 *swap, DXGI_SWAP_CHAIN_DESC *desc, + WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *desc, UINT buffer, IUnknown *realSurface); - HRESULT Present(WrappedIDXGISwapChain3 *swap, UINT SyncInterval, UINT Flags); + HRESULT Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags); void NewSwapchainBuffer(IUnknown *backbuffer) {} - void ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap); + void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap); void Map(WrappedID3D12Resource *Resource, UINT Subresource); void Unmap(WrappedID3D12Resource *Resource, UINT Subresource, byte *mapPtr, diff --git a/renderdoc/driver/d3d12/d3d12_hooks.cpp b/renderdoc/driver/d3d12/d3d12_hooks.cpp index 870f90931..5813718bd 100644 --- a/renderdoc/driver/d3d12/d3d12_hooks.cpp +++ b/renderdoc/driver/d3d12/d3d12_hooks.cpp @@ -96,7 +96,7 @@ public: { bool success = true; - WrappedIDXGISwapChain3::RegisterD3DDeviceCallback(GetD3D12DeviceIfAlloc); + WrappedIDXGISwapChain4::RegisterD3DDeviceCallback(GetD3D12DeviceIfAlloc); // also require d3dcompiler_??.dll if(GetD3DCompiler() == NULL) diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 2b8a99579..cd5abcce4 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -1605,7 +1605,7 @@ ReplayCreateStatus D3D12_CreateReplayDevice(const char *logfile, IReplayDriver * { RDCDEBUG("Creating a D3D12 replay device"); - WrappedIDXGISwapChain3::RegisterD3DDeviceCallback(GetD3D12DeviceIfAlloc); + WrappedIDXGISwapChain4::RegisterD3DDeviceCallback(GetD3D12DeviceIfAlloc); HMODULE lib = NULL; lib = LoadLibraryA("d3d12.dll"); diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.cpp b/renderdoc/driver/dxgi/dxgi_wrapped.cpp index 0f7fc764d..80c50f6da 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.cpp +++ b/renderdoc/driver/dxgi/dxgi_wrapped.cpp @@ -40,19 +40,19 @@ string ToStrHelper::Get(const IID &el) return tostrBuf; } -WRAPPED_POOL_INST(WrappedIDXGIDevice3); +WRAPPED_POOL_INST(WrappedIDXGIDevice4); -std::vector WrappedIDXGISwapChain3::m_D3DCallbacks; +std::vector WrappedIDXGISwapChain4::m_D3DCallbacks; ID3DDevice *GetD3DDevice(IUnknown *pDevice) { ID3DDevice *wrapDevice = NULL; - if(WrappedIDXGIDevice3::IsAlloc(pDevice)) - wrapDevice = ((WrappedIDXGIDevice3 *)(IDXGIDevice3 *)pDevice)->GetD3DDevice(); + if(WrappedIDXGIDevice4::IsAlloc(pDevice)) + wrapDevice = ((WrappedIDXGIDevice4 *)(IDXGIDevice3 *)pDevice)->GetD3DDevice(); if(wrapDevice == NULL) - wrapDevice = WrappedIDXGISwapChain3::GetD3DDevice(pDevice); + wrapDevice = WrappedIDXGISwapChain4::GetD3DDevice(pDevice); return wrapDevice; } @@ -85,7 +85,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject) // IDXGIFactory1 like a IDXGIFactory should all just work by definition, but there's no way to // know now if someone trying to create a IDXGIFactory really means it or not. IDXGIFactory *real = (IDXGIFactory *)(*ppvObject); - *ppvObject = (IDXGIFactory *)(new WrappedIDXGIFactory4(real)); + *ppvObject = (IDXGIFactory *)(new WrappedIDXGIFactory5(real)); return true; } @@ -104,7 +104,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject) else if(riid == __uuidof(IDXGIFactory1)) { IDXGIFactory1 *real = (IDXGIFactory1 *)(*ppvObject); - *ppvObject = (IDXGIFactory1 *)(new WrappedIDXGIFactory4(real)); + *ppvObject = (IDXGIFactory1 *)(new WrappedIDXGIFactory5(real)); return true; } else if(riid == __uuidof(IDXGIAdapter2)) @@ -122,19 +122,25 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject) else if(riid == __uuidof(IDXGIFactory2)) { IDXGIFactory2 *real = (IDXGIFactory2 *)(*ppvObject); - *ppvObject = (IDXGIFactory2 *)(new WrappedIDXGIFactory4(real)); + *ppvObject = (IDXGIFactory2 *)(new WrappedIDXGIFactory5(real)); return true; } else if(riid == __uuidof(IDXGIFactory3)) { IDXGIFactory3 *real = (IDXGIFactory3 *)(*ppvObject); - *ppvObject = (IDXGIFactory3 *)(new WrappedIDXGIFactory4(real)); + *ppvObject = (IDXGIFactory3 *)(new WrappedIDXGIFactory5(real)); return true; } else if(riid == __uuidof(IDXGIFactory4)) { IDXGIFactory4 *real = (IDXGIFactory4 *)(*ppvObject); - *ppvObject = (IDXGIFactory4 *)(new WrappedIDXGIFactory4(real)); + *ppvObject = (IDXGIFactory4 *)(new WrappedIDXGIFactory5(real)); + return true; + } + else if(riid == __uuidof(IDXGIFactory5)) + { + IDXGIFactory5 *real = (IDXGIFactory5 *)(*ppvObject); + *ppvObject = (IDXGIFactory5 *)(new WrappedIDXGIFactory5(real)); return true; } else @@ -168,7 +174,7 @@ HRESULT RefCountDXGIObject::WrapQueryInterface(IUnknown *real, REFIID riid, void return ret; } -WrappedIDXGISwapChain3::WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, ID3DDevice *device) +WrappedIDXGISwapChain4::WrappedIDXGISwapChain4(IDXGISwapChain *real, HWND wnd, ID3DDevice *device) : RefCountDXGIObject(real), m_pReal(real), m_pDevice(device), m_iRefcount(1), m_Wnd(wnd) { DXGI_SWAP_CHAIN_DESC desc; @@ -182,6 +188,8 @@ WrappedIDXGISwapChain3::WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, I real->QueryInterface(__uuidof(IDXGISwapChain2), (void **)&m_pReal2); m_pReal3 = NULL; real->QueryInterface(__uuidof(IDXGISwapChain3), (void **)&m_pReal3); + m_pReal4 = NULL; + real->QueryInterface(__uuidof(IDXGISwapChain4), (void **)&m_pReal4); WrapBuffersAfterResize(); @@ -190,7 +198,7 @@ WrappedIDXGISwapChain3::WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, I m_pDevice->FirstFrame(this); } -WrappedIDXGISwapChain3::~WrappedIDXGISwapChain3() +WrappedIDXGISwapChain4::~WrappedIDXGISwapChain4() { m_pDevice->ReleaseSwapchainResources(this); @@ -199,10 +207,11 @@ WrappedIDXGISwapChain3::~WrappedIDXGISwapChain3() SAFE_RELEASE(m_pReal1); SAFE_RELEASE(m_pReal2); SAFE_RELEASE(m_pReal3); + SAFE_RELEASE(m_pReal4); SAFE_RELEASE(m_pReal); } -HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain3::QueryInterface(REFIID riid, void **ppvObject) +HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::QueryInterface(REFIID riid, void **ppvObject) { if(riid == __uuidof(IDXGISwapChain)) { @@ -258,12 +267,12 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain3::QueryInterface(REFIID riid, vo return RefCountDXGIObject::QueryInterface(riid, ppvObject); } -void WrappedIDXGISwapChain3::ReleaseBuffersForResize() +void WrappedIDXGISwapChain4::ReleaseBuffersForResize() { m_pDevice->ReleaseSwapchainResources(this); } -void WrappedIDXGISwapChain3::WrapBuffersAfterResize() +void WrappedIDXGISwapChain4::WrapBuffersAfterResize() { DXGI_SWAP_CHAIN_DESC desc; m_pReal->GetDesc(&desc); @@ -287,7 +296,7 @@ void WrappedIDXGISwapChain3::WrapBuffersAfterResize() } } -HRESULT WrappedIDXGISwapChain3::ResizeBuffers( +HRESULT WrappedIDXGISwapChain4::ResizeBuffers( /* [in] */ UINT BufferCount, /* [in] */ UINT Width, /* [in] */ UINT Height, @@ -303,7 +312,7 @@ HRESULT WrappedIDXGISwapChain3::ResizeBuffers( return ret; } -HRESULT WrappedIDXGISwapChain3::ResizeBuffers1(_In_ UINT BufferCount, _In_ UINT Width, +HRESULT WrappedIDXGISwapChain4::ResizeBuffers1(_In_ UINT BufferCount, _In_ UINT Width, _In_ UINT Height, _In_ DXGI_FORMAT Format, _In_ UINT SwapChainFlags, _In_reads_(BufferCount) const UINT *pCreationNodeMask, @@ -320,7 +329,7 @@ HRESULT WrappedIDXGISwapChain3::ResizeBuffers1(_In_ UINT BufferCount, _In_ UINT return ret; } -HRESULT WrappedIDXGISwapChain3::SetFullscreenState( +HRESULT WrappedIDXGISwapChain4::SetFullscreenState( /* [in] */ BOOL Fullscreen, /* [in] */ IDXGIOutput *pTarget) { @@ -330,14 +339,14 @@ HRESULT WrappedIDXGISwapChain3::SetFullscreenState( return S_OK; } -HRESULT WrappedIDXGISwapChain3::GetFullscreenState( +HRESULT WrappedIDXGISwapChain4::GetFullscreenState( /* [out] */ BOOL *pFullscreen, /* [out] */ IDXGIOutput **ppTarget) { return m_pReal->GetFullscreenState(pFullscreen, ppTarget); } -HRESULT WrappedIDXGISwapChain3::GetBuffer( +HRESULT WrappedIDXGISwapChain4::GetBuffer( /* [in] */ UINT Buffer, /* [in] */ REFIID riid, /* [out][in] */ void **ppSurface) @@ -394,7 +403,7 @@ HRESULT WrappedIDXGISwapChain3::GetBuffer( return ret; } -HRESULT WrappedIDXGISwapChain3::GetDevice( +HRESULT WrappedIDXGISwapChain4::GetDevice( /* [in] */ REFIID riid, /* [retval][out] */ void **ppDevice) { @@ -426,7 +435,7 @@ HRESULT WrappedIDXGISwapChain3::GetDevice( return ret; } -HRESULT WrappedIDXGISwapChain3::Present( +HRESULT WrappedIDXGISwapChain4::Present( /* [in] */ UINT SyncInterval, /* [in] */ UINT Flags) { @@ -440,7 +449,7 @@ HRESULT WrappedIDXGISwapChain3::Present( return m_pReal->Present(SyncInterval, Flags); } -HRESULT WrappedIDXGISwapChain3::Present1(UINT SyncInterval, UINT Flags, +HRESULT WrappedIDXGISwapChain4::Present1(UINT SyncInterval, UINT Flags, const DXGI_PRESENT_PARAMETERS *pPresentParameters) { if(!RenderDoc::Inst().GetCaptureOptions().AllowVSync) @@ -528,7 +537,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIAdapter3::QueryInterface(REFIID riid, void return RefCountDXGIObject::QueryInterface(riid, ppvObject); } -WrappedIDXGIDevice3::WrappedIDXGIDevice3(IDXGIDevice *real, ID3DDevice *d3d) +WrappedIDXGIDevice4::WrappedIDXGIDevice4(IDXGIDevice *real, ID3DDevice *d3d) : RefCountDXGIObject(real), m_pReal(real), m_pD3DDevice(d3d) { m_pD3DDevice->AddRef(); @@ -539,18 +548,21 @@ WrappedIDXGIDevice3::WrappedIDXGIDevice3(IDXGIDevice *real, ID3DDevice *d3d) real->QueryInterface(__uuidof(IDXGIDevice2), (void **)&m_pReal2); m_pReal3 = NULL; real->QueryInterface(__uuidof(IDXGIDevice3), (void **)&m_pReal3); + m_pReal4 = NULL; + real->QueryInterface(__uuidof(IDXGIDevice4), (void **)&m_pReal4); } -WrappedIDXGIDevice3::~WrappedIDXGIDevice3() +WrappedIDXGIDevice4::~WrappedIDXGIDevice4() { SAFE_RELEASE(m_pReal1); SAFE_RELEASE(m_pReal2); SAFE_RELEASE(m_pReal3); + SAFE_RELEASE(m_pReal4); SAFE_RELEASE(m_pReal); SAFE_RELEASE(m_pD3DDevice); } -HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice3::QueryInterface(REFIID riid, void **ppvObject) +HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice4::QueryInterface(REFIID riid, void **ppvObject) { if(m_pD3DDevice->IsDeviceUUID(riid)) { @@ -603,6 +615,19 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice3::QueryInterface(REFIID riid, void return E_NOINTERFACE; } } + else if(riid == __uuidof(IDXGIDevice4)) + { + if(m_pReal4) + { + AddRef(); + *ppvObject = (IDXGIDevice4 *)this; + return S_OK; + } + else + { + return E_NOINTERFACE; + } + } else { string guid = ToStr::Get(riid); @@ -612,7 +637,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice3::QueryInterface(REFIID riid, void return RefCountDXGIObject::QueryInterface(riid, ppvObject); } -WrappedIDXGIFactory4::WrappedIDXGIFactory4(IDXGIFactory *real) +WrappedIDXGIFactory5::WrappedIDXGIFactory5(IDXGIFactory *real) : RefCountDXGIObject(real), m_pReal(real), m_iRefcount(1) { m_pReal1 = NULL; @@ -623,18 +648,21 @@ WrappedIDXGIFactory4::WrappedIDXGIFactory4(IDXGIFactory *real) real->QueryInterface(__uuidof(IDXGIFactory3), (void **)&m_pReal3); m_pReal4 = NULL; real->QueryInterface(__uuidof(IDXGIFactory4), (void **)&m_pReal4); + m_pReal5 = NULL; + real->QueryInterface(__uuidof(IDXGIFactory5), (void **)&m_pReal5); } -WrappedIDXGIFactory4::~WrappedIDXGIFactory4() +WrappedIDXGIFactory5::~WrappedIDXGIFactory5() { SAFE_RELEASE(m_pReal1); SAFE_RELEASE(m_pReal2); SAFE_RELEASE(m_pReal3); SAFE_RELEASE(m_pReal4); + SAFE_RELEASE(m_pReal5); SAFE_RELEASE(m_pReal); } -HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory4::QueryInterface(REFIID riid, void **ppvObject) +HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory5::QueryInterface(REFIID riid, void **ppvObject) { if(riid == __uuidof(IDXGIFactory)) { @@ -694,6 +722,19 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory4::QueryInterface(REFIID riid, void return E_NOINTERFACE; } } + else if(riid == __uuidof(IDXGIFactory5)) + { + if(m_pReal5) + { + AddRef(); + *ppvObject = (IDXGIFactory5 *)this; + return S_OK; + } + else + { + return E_NOINTERFACE; + } + } else { string guid = ToStr::Get(riid); @@ -703,7 +744,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory4::QueryInterface(REFIID riid, void return RefCountDXGIObject::QueryInterface(riid, ppvObject); } -HRESULT WrappedIDXGIFactory4::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, +HRESULT WrappedIDXGIFactory5::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, IDXGISwapChain **ppSwapChain) { ID3DDevice *wrapDevice = GetD3DDevice(pDevice); @@ -720,7 +761,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN if(SUCCEEDED(ret)) { *ppSwapChain = - new WrappedIDXGISwapChain3(*ppSwapChain, pDesc ? pDesc->OutputWindow : NULL, wrapDevice); + new WrappedIDXGISwapChain4(*ppSwapChain, pDesc ? pDesc->OutputWindow : NULL, wrapDevice); } return ret; @@ -731,7 +772,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN return m_pReal->CreateSwapChain(pDevice, pDesc, ppSwapChain); } -HRESULT WrappedIDXGIFactory4::CreateSwapChainForHwnd( +HRESULT WrappedIDXGIFactory5::CreateSwapChainForHwnd( IUnknown *pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1 *pDesc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc, IDXGIOutput *pRestrictToOutput, IDXGISwapChain1 **ppSwapChain) @@ -750,7 +791,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForHwnd( if(SUCCEEDED(ret)) { - *ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, hWnd, wrapDevice); + *ppSwapChain = new WrappedIDXGISwapChain4(*ppSwapChain, hWnd, wrapDevice); } return ret; @@ -764,7 +805,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForHwnd( ppSwapChain); } -HRESULT WrappedIDXGIFactory4::CreateSwapChainForCoreWindow(IUnknown *pDevice, IUnknown *pWindow, +HRESULT WrappedIDXGIFactory5::CreateSwapChainForCoreWindow(IUnknown *pDevice, IUnknown *pWindow, const DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, IDXGISwapChain1 **ppSwapChain) @@ -785,7 +826,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForCoreWindow(IUnknown *pDevice, IU { HWND wnd = NULL; (*ppSwapChain)->GetHwnd(&wnd); - *ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, wnd, wrapDevice); + *ppSwapChain = new WrappedIDXGISwapChain4(*ppSwapChain, wnd, wrapDevice); } return ret; @@ -799,7 +840,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForCoreWindow(IUnknown *pDevice, IU ppSwapChain); } -HRESULT WrappedIDXGIFactory4::CreateSwapChainForComposition(IUnknown *pDevice, +HRESULT WrappedIDXGIFactory5::CreateSwapChainForComposition(IUnknown *pDevice, const DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, IDXGISwapChain1 **ppSwapChain) @@ -820,7 +861,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForComposition(IUnknown *pDevice, { HWND wnd = NULL; (*ppSwapChain)->GetHwnd(&wnd); - *ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, wnd, wrapDevice); + *ppSwapChain = new WrappedIDXGISwapChain4(*ppSwapChain, wnd, wrapDevice); } return ret; diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.h b/renderdoc/driver/dxgi/dxgi_wrapped.h index ab41ba2ca..f9ee20d47 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.h +++ b/renderdoc/driver/dxgi/dxgi_wrapped.h @@ -151,7 +151,7 @@ public: return RefCountDXGIObject::GetParent(riid, ppvObject); \ } -class WrappedIDXGISwapChain3; +class WrappedIDXGISwapChain4; struct ID3DDevice { @@ -167,14 +167,14 @@ struct ID3DDevice virtual bool IsDeviceUUID(REFIID guid) = 0; virtual IUnknown *GetDeviceInterface(REFIID guid) = 0; - virtual void FirstFrame(WrappedIDXGISwapChain3 *swapChain) = 0; + virtual void FirstFrame(WrappedIDXGISwapChain4 *swapChain) = 0; virtual void NewSwapchainBuffer(IUnknown *backbuffer) = 0; - virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swapChain) = 0; - virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, + virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swapChain) = 0; + virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer, IUnknown *realSurface) = 0; - virtual HRESULT Present(WrappedIDXGISwapChain3 *swapChain, UINT SyncInterval, UINT Flags) = 0; + virtual HRESULT Present(WrappedIDXGISwapChain4 *swapChain, UINT SyncInterval, UINT Flags) = 0; }; typedef ID3DDevice *(*D3DDeviceCallback)(IUnknown *dev); @@ -538,12 +538,13 @@ public: } }; -class WrappedIDXGISwapChain3 : public IDXGISwapChain3, public RefCountDXGIObject +class WrappedIDXGISwapChain4 : public IDXGISwapChain4, public RefCountDXGIObject { IDXGISwapChain *m_pReal; IDXGISwapChain1 *m_pReal1; IDXGISwapChain2 *m_pReal2; IDXGISwapChain3 *m_pReal3; + IDXGISwapChain4 *m_pReal4; ID3DDevice *m_pDevice; unsigned int m_iRefcount; @@ -559,8 +560,8 @@ class WrappedIDXGISwapChain3 : public IDXGISwapChain3, public RefCountDXGIObject void WrapBuffersAfterResize(); public: - WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, ID3DDevice *device); - virtual ~WrappedIDXGISwapChain3(); + WrappedIDXGISwapChain4(IDXGISwapChain *real, HWND wnd, ID3DDevice *device); + virtual ~WrappedIDXGISwapChain4(); static void RegisterD3DDeviceCallback(D3DDeviceCallback callback) { @@ -811,6 +812,20 @@ public: _In_reads_(BufferCount) const UINT *pCreationNodeMask, /* [annotation][in] */ _In_reads_(BufferCount) IUnknown *const *ppPresentQueue); + + ////////////////////////////// + // implement IDXGISwapChain4 + + virtual HRESULT STDMETHODCALLTYPE SetHDRMetaData( + /* [annotation][in] */ + _In_ DXGI_HDR_METADATA_TYPE Type, + /* [annotation][in] */ + _In_ UINT Size, + /* [annotation][size_is][in] */ + _In_reads_opt_(Size) void *pMetaData) + { + return m_pReal4->SetHDRMetaData(Type, Size, pMetaData); + } }; class WrappedIDXGIAdapter3 : public IDXGIAdapter3, public RefCountDXGIObject @@ -932,20 +947,21 @@ public: } }; -class WrappedIDXGIDevice3 : public IDXGIDevice3, public RefCountDXGIObject +class WrappedIDXGIDevice4 : public IDXGIDevice4, public RefCountDXGIObject { IDXGIDevice *m_pReal; IDXGIDevice1 *m_pReal1; IDXGIDevice2 *m_pReal2; IDXGIDevice3 *m_pReal3; + IDXGIDevice4 *m_pReal4; ID3DDevice *m_pD3DDevice; public: - WrappedIDXGIDevice3(IDXGIDevice *real, ID3DDevice *d3d); - virtual ~WrappedIDXGIDevice3(); + WrappedIDXGIDevice4(IDXGIDevice *real, ID3DDevice *d3d); + virtual ~WrappedIDXGIDevice4(); static const int AllocPoolCount = 4; - ALLOCATE_WITH_WRAPPED_POOL(WrappedIDXGIDevice3, AllocPoolCount); + ALLOCATE_WITH_WRAPPED_POOL(WrappedIDXGIDevice4, AllocPoolCount); IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY; HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject); @@ -1052,20 +1068,47 @@ public: // implement IDXGIDevice3 virtual void STDMETHODCALLTYPE Trim() { m_pReal3->Trim(); } + ////////////////////////////// + // implement IDXGIDevice4 + + virtual HRESULT STDMETHODCALLTYPE OfferResources1( + /* [annotation][in] */ + _In_ UINT NumResources, + /* [annotation][size_is][in] */ + _In_reads_(NumResources) IDXGIResource *const *ppResources, + /* [annotation][in] */ + _In_ DXGI_OFFER_RESOURCE_PRIORITY Priority, + /* [annotation][in] */ + _In_ UINT Flags) + { + return m_pReal4->OfferResources1(NumResources, ppResources, Priority, Flags); + } + + virtual HRESULT STDMETHODCALLTYPE ReclaimResources1( + /* [annotation][in] */ + _In_ UINT NumResources, + /* [annotation][size_is][in] */ + _In_reads_(NumResources) IDXGIResource *const *ppResources, + /* [annotation][size_is][out] */ + _Out_writes_all_(NumResources) DXGI_RECLAIM_RESOURCE_RESULTS *pResults) + { + return m_pReal4->ReclaimResources1(NumResources, ppResources, pResults); + } }; -class WrappedIDXGIFactory4 : public IDXGIFactory4, public RefCountDXGIObject +class WrappedIDXGIFactory5 : public IDXGIFactory5, public RefCountDXGIObject { IDXGIFactory *m_pReal; IDXGIFactory1 *m_pReal1; IDXGIFactory2 *m_pReal2; IDXGIFactory3 *m_pReal3; IDXGIFactory4 *m_pReal4; + IDXGIFactory5 *m_pReal5; unsigned int m_iRefcount; public: - WrappedIDXGIFactory4(IDXGIFactory *real); - virtual ~WrappedIDXGIFactory4(); + WrappedIDXGIFactory5(IDXGIFactory *real); + virtual ~WrappedIDXGIFactory5(); IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY; HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject); @@ -1311,4 +1354,16 @@ public: } return ret; } + + ////////////////////////////// + // implement IDXGIFactory5 + + virtual HRESULT STDMETHODCALLTYPE + CheckFeatureSupport(DXGI_FEATURE Feature, + /* [annotation] */ + _Inout_updates_bytes_(FeatureSupportDataSize) void *pFeatureSupportData, + UINT FeatureSupportDataSize) + { + return m_pReal5->CheckFeatureSupport(Feature, pFeatureSupportData, FeatureSupportDataSize); + } };