Implement DXGI 1.6 & 1.7. Closes #1174

This commit is contained in:
baldurk
2018-11-15 17:18:45 +00:00
parent 6ba66f0fba
commit c56cc1922f
2 changed files with 145 additions and 69 deletions
+64 -20
View File
@@ -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);
+81 -49
View File
@@ -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);
}
};