From c56cc1922fdb48f3084e3717c22e29d4e516f837 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 15 Nov 2018 17:18:45 +0000 Subject: [PATCH] Implement DXGI 1.6 & 1.7. Closes #1174 --- renderdoc/driver/dxgi/dxgi_wrapped.cpp | 84 ++++++++++++---- renderdoc/driver/dxgi/dxgi_wrapped.h | 130 +++++++++++++++---------- 2 files changed, 145 insertions(+), 69 deletions(-) diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.cpp b/renderdoc/driver/dxgi/dxgi_wrapped.cpp index 77a709f2d..912725fd9 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.cpp +++ b/renderdoc/driver/dxgi/dxgi_wrapped.cpp @@ -87,7 +87,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 WrappedIDXGIFactory5(real)); + *ppvObject = (IDXGIFactory *)(new WrappedIDXGIFactory(real)); return true; } @@ -106,7 +106,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject) else if(riid == __uuidof(IDXGIFactory1)) { IDXGIFactory1 *real = (IDXGIFactory1 *)(*ppvObject); - *ppvObject = (IDXGIFactory1 *)(new WrappedIDXGIFactory5(real)); + *ppvObject = (IDXGIFactory1 *)(new WrappedIDXGIFactory(real)); return true; } else if(riid == __uuidof(IDXGIAdapter2)) @@ -124,25 +124,37 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject) else if(riid == __uuidof(IDXGIFactory2)) { IDXGIFactory2 *real = (IDXGIFactory2 *)(*ppvObject); - *ppvObject = (IDXGIFactory2 *)(new WrappedIDXGIFactory5(real)); + *ppvObject = (IDXGIFactory2 *)(new WrappedIDXGIFactory(real)); return true; } else if(riid == __uuidof(IDXGIFactory3)) { IDXGIFactory3 *real = (IDXGIFactory3 *)(*ppvObject); - *ppvObject = (IDXGIFactory3 *)(new WrappedIDXGIFactory5(real)); + *ppvObject = (IDXGIFactory3 *)(new WrappedIDXGIFactory(real)); return true; } else if(riid == __uuidof(IDXGIFactory4)) { IDXGIFactory4 *real = (IDXGIFactory4 *)(*ppvObject); - *ppvObject = (IDXGIFactory4 *)(new WrappedIDXGIFactory5(real)); + *ppvObject = (IDXGIFactory4 *)(new WrappedIDXGIFactory(real)); return true; } else if(riid == __uuidof(IDXGIFactory5)) { IDXGIFactory5 *real = (IDXGIFactory5 *)(*ppvObject); - *ppvObject = (IDXGIFactory5 *)(new WrappedIDXGIFactory5(real)); + *ppvObject = (IDXGIFactory5 *)(new WrappedIDXGIFactory(real)); + return true; + } + else if(riid == __uuidof(IDXGIFactory6)) + { + IDXGIFactory6 *real = (IDXGIFactory6 *)(*ppvObject); + *ppvObject = (IDXGIFactory6 *)(new WrappedIDXGIFactory(real)); + return true; + } + else if(riid == __uuidof(IDXGIFactory7)) + { + IDXGIFactory7 *real = (IDXGIFactory7 *)(*ppvObject); + *ppvObject = (IDXGIFactory7 *)(new WrappedIDXGIFactory(real)); return true; } else if(riid == ID3D10Texture2D_uuid) @@ -890,7 +902,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice4::ReclaimResources1(UINT NumResourc return m_pReal4->ReclaimResources1(NumResources, resources.data(), pResults); } -WrappedIDXGIFactory5::WrappedIDXGIFactory5(IDXGIFactory *real) +WrappedIDXGIFactory::WrappedIDXGIFactory(IDXGIFactory *real) : RefCountDXGIObject(real), m_pReal(real) { m_pReal1 = NULL; @@ -903,19 +915,25 @@ WrappedIDXGIFactory5::WrappedIDXGIFactory5(IDXGIFactory *real) real->QueryInterface(__uuidof(IDXGIFactory4), (void **)&m_pReal4); m_pReal5 = NULL; real->QueryInterface(__uuidof(IDXGIFactory5), (void **)&m_pReal5); + m_pReal6 = NULL; + real->QueryInterface(__uuidof(IDXGIFactory6), (void **)&m_pReal6); + m_pReal7 = NULL; + real->QueryInterface(__uuidof(IDXGIFactory7), (void **)&m_pReal7); } -WrappedIDXGIFactory5::~WrappedIDXGIFactory5() +WrappedIDXGIFactory::~WrappedIDXGIFactory() { SAFE_RELEASE(m_pReal1); SAFE_RELEASE(m_pReal2); SAFE_RELEASE(m_pReal3); SAFE_RELEASE(m_pReal4); SAFE_RELEASE(m_pReal5); + SAFE_RELEASE(m_pReal6); + SAFE_RELEASE(m_pReal7); SAFE_RELEASE(m_pReal); } -HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory5::QueryInterface(REFIID riid, void **ppvObject) +HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory::QueryInterface(REFIID riid, void **ppvObject) { if(riid == __uuidof(IDXGIFactory)) { @@ -988,6 +1006,32 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory5::QueryInterface(REFIID riid, void return E_NOINTERFACE; } } + else if(riid == __uuidof(IDXGIFactory6)) + { + if(m_pReal6) + { + AddRef(); + *ppvObject = (IDXGIFactory6 *)this; + return S_OK; + } + else + { + return E_NOINTERFACE; + } + } + else if(riid == __uuidof(IDXGIFactory7)) + { + if(m_pReal7) + { + AddRef(); + *ppvObject = (IDXGIFactory7 *)this; + return S_OK; + } + else + { + return E_NOINTERFACE; + } + } else { WarnUnknownGUID("IDXGIFactory", riid); @@ -996,8 +1040,8 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory5::QueryInterface(REFIID riid, void return RefCountDXGIObject::QueryInterface(riid, ppvObject); } -HRESULT WrappedIDXGIFactory5::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, - IDXGISwapChain **ppSwapChain) +HRESULT WrappedIDXGIFactory::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, + IDXGISwapChain **ppSwapChain) { ID3DDevice *wrapDevice = GetD3DDevice(pDevice); @@ -1024,7 +1068,7 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN return m_pReal->CreateSwapChain(pDevice, pDesc, ppSwapChain); } -HRESULT WrappedIDXGIFactory5::CreateSwapChainForHwnd( +HRESULT WrappedIDXGIFactory::CreateSwapChainForHwnd( IUnknown *pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1 *pDesc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc, IDXGIOutput *pRestrictToOutput, IDXGISwapChain1 **ppSwapChain) @@ -1060,10 +1104,10 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChainForHwnd( ppSwapChain); } -HRESULT WrappedIDXGIFactory5::CreateSwapChainForCoreWindow(IUnknown *pDevice, IUnknown *pWindow, - const DXGI_SWAP_CHAIN_DESC1 *pDesc, - IDXGIOutput *pRestrictToOutput, - IDXGISwapChain1 **ppSwapChain) +HRESULT WrappedIDXGIFactory::CreateSwapChainForCoreWindow(IUnknown *pDevice, IUnknown *pWindow, + const DXGI_SWAP_CHAIN_DESC1 *pDesc, + IDXGIOutput *pRestrictToOutput, + IDXGISwapChain1 **ppSwapChain) { ID3DDevice *wrapDevice = GetD3DDevice(pDevice); @@ -1100,10 +1144,10 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChainForCoreWindow(IUnknown *pDevice, IU ppSwapChain); } -HRESULT WrappedIDXGIFactory5::CreateSwapChainForComposition(IUnknown *pDevice, - const DXGI_SWAP_CHAIN_DESC1 *pDesc, - IDXGIOutput *pRestrictToOutput, - IDXGISwapChain1 **ppSwapChain) +HRESULT WrappedIDXGIFactory::CreateSwapChainForComposition(IUnknown *pDevice, + const DXGI_SWAP_CHAIN_DESC1 *pDesc, + IDXGIOutput *pRestrictToOutput, + IDXGISwapChain1 **ppSwapChain) { ID3DDevice *wrapDevice = GetD3DDevice(pDevice); diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.h b/renderdoc/driver/dxgi/dxgi_wrapped.h index 3df77ecbc..7149aa936 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.h +++ b/renderdoc/driver/dxgi/dxgi_wrapped.h @@ -1322,7 +1322,7 @@ public: _Out_writes_all_(NumResources) DXGI_RECLAIM_RESOURCE_RESULTS *pResults); }; -class WrappedIDXGIFactory5 : public IDXGIFactory5, public RefCountDXGIObject +class WrappedIDXGIFactory : public IDXGIFactory7, public RefCountDXGIObject { IDXGIFactory *m_pReal; IDXGIFactory1 *m_pReal1; @@ -1330,10 +1330,12 @@ class WrappedIDXGIFactory5 : public IDXGIFactory5, public RefCountDXGIObject IDXGIFactory3 *m_pReal3; IDXGIFactory4 *m_pReal4; IDXGIFactory5 *m_pReal5; + IDXGIFactory6 *m_pReal6; + IDXGIFactory7 *m_pReal7; public: - WrappedIDXGIFactory5(IDXGIFactory *real); - virtual ~WrappedIDXGIFactory5(); + WrappedIDXGIFactory(IDXGIFactory *real); + virtual ~WrappedIDXGIFactory(); IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY; HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject); @@ -1521,6 +1523,40 @@ public: ////////////////////////////// // implement IDXGIFactory4 + void WrapAdapter(REFIID riid, void **ppvAdapter) + { + if(ppvAdapter == NULL || *ppvAdapter == NULL) + return; + + if(riid == __uuidof(IDXGIAdapter4)) + { + IDXGIAdapter4 *adapter = (IDXGIAdapter4 *)*ppvAdapter; + *ppvAdapter = (IDXGIAdapter4 *)(new WrappedIDXGIAdapter4(adapter)); + } + else if(riid == __uuidof(IDXGIAdapter3)) + { + IDXGIAdapter3 *adapter = (IDXGIAdapter3 *)*ppvAdapter; + *ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(adapter)); + } + else if(riid == __uuidof(IDXGIAdapter2)) + { + IDXGIAdapter2 *adapter = (IDXGIAdapter2 *)*ppvAdapter; + *ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(adapter)); + } + else if(riid == __uuidof(IDXGIAdapter1)) + { + IDXGIAdapter1 *adapter = (IDXGIAdapter1 *)*ppvAdapter; + *ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(adapter)); + } + else + { + RDCASSERT(riid == __uuidof(IDXGIAdapter), riid); + + IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter; + *ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(adapter)); + } + } + virtual HRESULT STDMETHODCALLTYPE EnumAdapterByLuid( /* [annotation] */ _In_ LUID AdapterLuid, @@ -1530,29 +1566,8 @@ public: _COM_Outptr_ void **ppvAdapter) { HRESULT ret = m_pReal4->EnumAdapterByLuid(AdapterLuid, riid, ppvAdapter); - if(SUCCEEDED(ret) && ppvAdapter && *ppvAdapter) - { - if(riid == __uuidof(IDXGIAdapter3)) - { - IDXGIAdapter3 *adapter = (IDXGIAdapter3 *)*ppvAdapter; - *ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(adapter)); - } - else if(riid == __uuidof(IDXGIAdapter2)) - { - IDXGIAdapter2 *adapter = (IDXGIAdapter2 *)*ppvAdapter; - *ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(adapter)); - } - else if(riid == __uuidof(IDXGIAdapter1)) - { - IDXGIAdapter1 *adapter = (IDXGIAdapter1 *)*ppvAdapter; - *ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(adapter)); - } - else - { - IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter; - *ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(adapter)); - } - } + if(SUCCEEDED(ret)) + WrapAdapter(riid, ppvAdapter); return ret; } @@ -1563,29 +1578,8 @@ public: _COM_Outptr_ void **ppvAdapter) { HRESULT ret = m_pReal4->EnumWarpAdapter(riid, ppvAdapter); - if(SUCCEEDED(ret) && ppvAdapter && *ppvAdapter) - { - if(riid == __uuidof(IDXGIAdapter3)) - { - IDXGIAdapter3 *adapter = (IDXGIAdapter3 *)*ppvAdapter; - *ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(adapter)); - } - else if(riid == __uuidof(IDXGIAdapter2)) - { - IDXGIAdapter2 *adapter = (IDXGIAdapter2 *)*ppvAdapter; - *ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(adapter)); - } - else if(riid == __uuidof(IDXGIAdapter1)) - { - IDXGIAdapter1 *adapter = (IDXGIAdapter1 *)*ppvAdapter; - *ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(adapter)); - } - else - { - IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter; - *ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(adapter)); - } - } + if(SUCCEEDED(ret)) + WrapAdapter(riid, ppvAdapter); return ret; } @@ -1600,4 +1594,42 @@ public: { return m_pReal5->CheckFeatureSupport(Feature, pFeatureSupportData, FeatureSupportDataSize); } + + ////////////////////////////// + // implement IDXGIFactory6 + + virtual HRESULT STDMETHODCALLTYPE EnumAdapterByGpuPreference( + /* [annotation] */ + _In_ UINT Adapter, + /* [annotation] */ + _In_ DXGI_GPU_PREFERENCE GpuPreference, + /* [annotation] */ + _In_ REFIID riid, + /* [annotation] */ + _COM_Outptr_ void **ppvAdapter) + { + HRESULT ret = m_pReal6->EnumAdapterByGpuPreference(Adapter, GpuPreference, riid, ppvAdapter); + if(SUCCEEDED(ret)) + WrapAdapter(riid, ppvAdapter); + return ret; + } + + ////////////////////////////// + // implement IDXGIFactory7 + + virtual HRESULT STDMETHODCALLTYPE RegisterAdaptersChangedEvent( + /* [annotation][in] */ + _In_ HANDLE hEvent, + /* [annotation][out] */ + _Out_ DWORD *pdwCookie) + { + return m_pReal7->RegisterAdaptersChangedEvent(hEvent, pdwCookie); + } + + virtual HRESULT STDMETHODCALLTYPE UnregisterAdaptersChangedEvent( + /* [annotation][in] */ + _In_ DWORD dwCookie) + { + return m_pReal7->UnregisterAdaptersChangedEvent(dwCookie); + } };