Add simple wrapper implementation of DXGI 1.6. Closes #864

This commit is contained in:
baldurk
2018-05-24 21:42:30 +01:00
parent 246e379c52
commit 66d29073e7
4 changed files with 78 additions and 39 deletions
+25 -19
View File
@@ -76,7 +76,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
else if(riid == __uuidof(IDXGIAdapter))
{
IDXGIAdapter *real = (IDXGIAdapter *)(*ppvObject);
*ppvObject = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(real));
*ppvObject = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(real));
return true;
}
else if(riid == __uuidof(IDXGIFactory))
@@ -100,7 +100,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
else if(riid == __uuidof(IDXGIAdapter1))
{
IDXGIAdapter1 *real = (IDXGIAdapter1 *)(*ppvObject);
*ppvObject = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter3(real));
*ppvObject = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(real));
return true;
}
else if(riid == __uuidof(IDXGIFactory1))
@@ -112,13 +112,13 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
else if(riid == __uuidof(IDXGIAdapter2))
{
IDXGIAdapter2 *real = (IDXGIAdapter2 *)(*ppvObject);
*ppvObject = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter3(real));
*ppvObject = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(real));
return true;
}
else if(riid == __uuidof(IDXGIAdapter3))
{
IDXGIAdapter3 *real = (IDXGIAdapter3 *)(*ppvObject);
*ppvObject = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter3(real));
*ppvObject = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(real));
return true;
}
else if(riid == __uuidof(IDXGIFactory2))
@@ -350,7 +350,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::GetContainingOutput(IDXGIOutpu
HRESULT ret = m_pReal->GetContainingOutput(ppOutput);
if(SUCCEEDED(ret) && ppOutput && *ppOutput)
*ppOutput = (IDXGIOutput *)(new WrappedIDXGIOutput5(this, *ppOutput));
*ppOutput = (IDXGIOutput *)(new WrappedIDXGIOutput6(this, *ppOutput));
return ret;
}
@@ -383,7 +383,7 @@ HRESULT WrappedIDXGISwapChain4::SetFullscreenState(
/* [in] */ BOOL Fullscreen,
/* [in] */ IDXGIOutput *pTarget)
{
WrappedIDXGIOutput5 *wrappedOutput = (WrappedIDXGIOutput5 *)pTarget;
WrappedIDXGIOutput6 *wrappedOutput = (WrappedIDXGIOutput6 *)pTarget;
IDXGIOutput *unwrappedOutput = wrappedOutput ? wrappedOutput->GetReal() : NULL;
if(RenderDoc::Inst().GetCaptureOptions().allowFullscreen)
@@ -399,7 +399,7 @@ HRESULT WrappedIDXGISwapChain4::GetFullscreenState(
HRESULT ret = m_pReal->GetFullscreenState(pFullscreen, ppTarget);
if(SUCCEEDED(ret) && ppTarget && *ppTarget)
*ppTarget = (IDXGIOutput *)(new WrappedIDXGIOutput5(this, *ppTarget));
*ppTarget = (IDXGIOutput *)(new WrappedIDXGIOutput6(this, *ppTarget));
return ret;
}
@@ -545,12 +545,12 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::GetRestrictToOutput(IDXGIOutpu
HRESULT ret = m_pReal2->GetRestrictToOutput(ppRestrictToOutput);
if(SUCCEEDED(ret) && ppRestrictToOutput && *ppRestrictToOutput)
*ppRestrictToOutput = (IDXGIOutput *)(new WrappedIDXGIOutput5(this, *ppRestrictToOutput));
*ppRestrictToOutput = (IDXGIOutput *)(new WrappedIDXGIOutput6(this, *ppRestrictToOutput));
return ret;
}
WrappedIDXGIOutput5::WrappedIDXGIOutput5(RefCountDXGIObject *owner, IDXGIOutput *real)
WrappedIDXGIOutput6::WrappedIDXGIOutput6(RefCountDXGIObject *owner, IDXGIOutput *real)
: RefCountDXGIObject(real), m_Owner(owner), m_pReal(real)
{
SAFE_ADDREF(m_Owner);
@@ -565,20 +565,23 @@ WrappedIDXGIOutput5::WrappedIDXGIOutput5(RefCountDXGIObject *owner, IDXGIOutput
real->QueryInterface(__uuidof(IDXGIOutput4), (void **)&m_pReal4);
m_pReal5 = NULL;
real->QueryInterface(__uuidof(IDXGIOutput5), (void **)&m_pReal5);
m_pReal6 = NULL;
real->QueryInterface(__uuidof(IDXGIOutput6), (void **)&m_pReal6);
}
WrappedIDXGIOutput5::~WrappedIDXGIOutput5()
WrappedIDXGIOutput6::~WrappedIDXGIOutput6()
{
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_pReal);
SAFE_RELEASE(m_Owner);
}
HRESULT STDMETHODCALLTYPE WrappedIDXGIOutput5::QueryInterface(REFIID riid, void **ppvObject)
HRESULT STDMETHODCALLTYPE WrappedIDXGIOutput6::QueryInterface(REFIID riid, void **ppvObject)
{
if(riid == __uuidof(IDXGIOutput))
{
@@ -659,7 +662,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIOutput5::QueryInterface(REFIID riid, void
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
}
WrappedIDXGIAdapter3::WrappedIDXGIAdapter3(IDXGIAdapter *real)
WrappedIDXGIAdapter4::WrappedIDXGIAdapter4(IDXGIAdapter *real)
: RefCountDXGIObject(real), m_pReal(real)
{
m_pReal1 = NULL;
@@ -668,17 +671,20 @@ WrappedIDXGIAdapter3::WrappedIDXGIAdapter3(IDXGIAdapter *real)
real->QueryInterface(__uuidof(IDXGIAdapter2), (void **)&m_pReal2);
m_pReal3 = NULL;
real->QueryInterface(__uuidof(IDXGIAdapter3), (void **)&m_pReal3);
m_pReal4 = NULL;
real->QueryInterface(__uuidof(IDXGIAdapter4), (void **)&m_pReal4);
}
WrappedIDXGIAdapter3::~WrappedIDXGIAdapter3()
WrappedIDXGIAdapter4::~WrappedIDXGIAdapter4()
{
SAFE_RELEASE(m_pReal1);
SAFE_RELEASE(m_pReal2);
SAFE_RELEASE(m_pReal3);
SAFE_RELEASE(m_pReal4);
SAFE_RELEASE(m_pReal);
}
HRESULT STDMETHODCALLTYPE WrappedIDXGIAdapter3::QueryInterface(REFIID riid, void **ppvObject)
HRESULT STDMETHODCALLTYPE WrappedIDXGIAdapter4::QueryInterface(REFIID riid, void **ppvObject)
{
if(riid == __uuidof(IDXGIAdapter))
{
@@ -838,8 +844,8 @@ std::vector<IDXGIResource *> UnwrapResourceSet(UINT NumResources, IDXGIResource
resources.resize(NumResources);
for(UINT i = 0; i < NumResources; i++)
{
WrappedDXGIInterface<WrappedIDXGIOutput5> *wrapped =
(WrappedDXGIInterface<WrappedIDXGIOutput5> *)ppResources[i];
WrappedDXGIInterface<WrappedIDXGIOutput6> *wrapped =
(WrappedDXGIInterface<WrappedIDXGIOutput6> *)ppResources[i];
resources[i] = UnwrapDXGIResource(wrapped->GetWrapped());
if(resources[i] == NULL)
{
@@ -1025,7 +1031,7 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChainForHwnd(
{
ID3DDevice *wrapDevice = GetD3DDevice(pDevice);
WrappedIDXGIOutput5 *wrappedOutput = (WrappedIDXGIOutput5 *)pRestrictToOutput;
WrappedIDXGIOutput6 *wrappedOutput = (WrappedIDXGIOutput6 *)pRestrictToOutput;
IDXGIOutput *unwrappedOutput = wrappedOutput ? wrappedOutput->GetReal() : NULL;
if(wrapDevice)
@@ -1061,7 +1067,7 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChainForCoreWindow(IUnknown *pDevice, IU
{
ID3DDevice *wrapDevice = GetD3DDevice(pDevice);
WrappedIDXGIOutput5 *wrappedOutput = (WrappedIDXGIOutput5 *)pRestrictToOutput;
WrappedIDXGIOutput6 *wrappedOutput = (WrappedIDXGIOutput6 *)pRestrictToOutput;
IDXGIOutput *unwrappedOutput = wrappedOutput ? wrappedOutput->GetReal() : NULL;
if(!RenderDoc::Inst().GetCaptureOptions().allowFullscreen)
@@ -1101,7 +1107,7 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChainForComposition(IUnknown *pDevice,
{
ID3DDevice *wrapDevice = GetD3DDevice(pDevice);
WrappedIDXGIOutput5 *wrappedOutput = (WrappedIDXGIOutput5 *)pRestrictToOutput;
WrappedIDXGIOutput6 *wrappedOutput = (WrappedIDXGIOutput6 *)pRestrictToOutput;
IDXGIOutput *unwrappedOutput = wrappedOutput ? wrappedOutput->GetReal() : NULL;
if(!RenderDoc::Inst().GetCaptureOptions().allowFullscreen)
+49 -20
View File
@@ -27,7 +27,7 @@
#include "common/common.h"
#include "common/wrapped_pool.h"
#include "driver/dx/official/dxgi1_5.h"
#include "driver/dx/official/dxgi1_6.h"
MIDL_INTERFACE("6f15aaf2-d208-4e89-9ab4-489535d34f9c") ID3D11Texture2D;
MIDL_INTERFACE("dc8e63f3-d12b-4952-b47b-5e45026a862d") ID3D11Resource;
@@ -838,7 +838,7 @@ public:
}
};
class WrappedIDXGIOutput5 : public IDXGIOutput5, public RefCountDXGIObject
class WrappedIDXGIOutput6 : public IDXGIOutput6, public RefCountDXGIObject
{
RefCountDXGIObject *m_Owner;
IDXGIOutput *m_pReal;
@@ -847,13 +847,14 @@ class WrappedIDXGIOutput5 : public IDXGIOutput5, public RefCountDXGIObject
IDXGIOutput3 *m_pReal3;
IDXGIOutput4 *m_pReal4;
IDXGIOutput5 *m_pReal5;
IDXGIOutput6 *m_pReal6;
public:
IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY;
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
WrappedIDXGIOutput5(RefCountDXGIObject *owner, IDXGIOutput *real);
~WrappedIDXGIOutput5();
WrappedIDXGIOutput6(RefCountDXGIObject *owner, IDXGIOutput *real);
~WrappedIDXGIOutput6();
IDXGIOutput *GetReal() { return m_pReal; }
//////////////////////////////
@@ -1031,18 +1032,36 @@ public:
return m_pReal5->DuplicateOutput1(pDevice, Flags, SupportedFormatsCount, pSupportedFormats,
ppOutputDuplication);
}
//////////////////////////////
// implement IDXGIOutput6
virtual HRESULT STDMETHODCALLTYPE GetDesc1(
/* [annotation][out] */
_Out_ DXGI_OUTPUT_DESC1 *pDesc)
{
return m_pReal6->GetDesc1(pDesc);
}
virtual HRESULT STDMETHODCALLTYPE CheckHardwareCompositionSupport(
/* [annotation][out] */
_Out_ UINT *pFlags)
{
return m_pReal6->CheckHardwareCompositionSupport(pFlags);
}
};
class WrappedIDXGIAdapter3 : public IDXGIAdapter3, public RefCountDXGIObject
class WrappedIDXGIAdapter4 : public IDXGIAdapter4, public RefCountDXGIObject
{
IDXGIAdapter *m_pReal;
IDXGIAdapter1 *m_pReal1;
IDXGIAdapter2 *m_pReal2;
IDXGIAdapter3 *m_pReal3;
IDXGIAdapter4 *m_pReal4;
public:
WrappedIDXGIAdapter3(IDXGIAdapter *real);
virtual ~WrappedIDXGIAdapter3();
WrappedIDXGIAdapter4(IDXGIAdapter *real);
virtual ~WrappedIDXGIAdapter4();
IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY;
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
@@ -1058,7 +1077,7 @@ public:
HRESULT ret = m_pReal->EnumOutputs(Output, ppOutput);
if(SUCCEEDED(ret) && ppOutput && *ppOutput)
*ppOutput = (IDXGIOutput *)(new WrappedIDXGIOutput5(this, *ppOutput));
*ppOutput = (IDXGIOutput *)(new WrappedIDXGIOutput6(this, *ppOutput));
return ret;
}
@@ -1154,6 +1173,16 @@ public:
{
return m_pReal3->UnregisterVideoMemoryBudgetChangeNotification(dwCookie);
}
//////////////////////////////
// implement IDXGIAdapter4
virtual HRESULT STDMETHODCALLTYPE GetDesc3(
/* [annotation][out] */
_Out_ DXGI_ADAPTER_DESC3 *pDesc)
{
return m_pReal4->GetDesc3(pDesc);
}
};
class WrappedIDXGIDevice4 : public IDXGIDevice4, public RefCountDXGIObject
@@ -1185,7 +1214,7 @@ public:
{
HRESULT ret = m_pReal->GetAdapter(pAdapter);
if(SUCCEEDED(ret))
*pAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(*pAdapter));
*pAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(*pAdapter));
return ret;
}
@@ -1319,7 +1348,7 @@ public:
{
HRESULT ret = m_pReal->EnumAdapters(Adapter, ppAdapter);
if(SUCCEEDED(ret))
*ppAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(*ppAdapter));
*ppAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(*ppAdapter));
return ret;
}
@@ -1350,7 +1379,7 @@ public:
{
HRESULT ret = m_pReal->CreateSoftwareAdapter(Module, ppAdapter);
if(SUCCEEDED(ret))
*ppAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(*ppAdapter));
*ppAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(*ppAdapter));
return ret;
}
@@ -1373,7 +1402,7 @@ public:
HRESULT ret = factory->EnumAdapters1(Adapter, ppAdapter);
if(SUCCEEDED(ret))
*ppAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter3(*ppAdapter));
*ppAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(*ppAdapter));
return ret;
}
@@ -1506,22 +1535,22 @@ public:
if(riid == __uuidof(IDXGIAdapter3))
{
IDXGIAdapter3 *adapter = (IDXGIAdapter3 *)*ppvAdapter;
*ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter3(adapter));
*ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(adapter));
}
else if(riid == __uuidof(IDXGIAdapter2))
{
IDXGIAdapter2 *adapter = (IDXGIAdapter2 *)*ppvAdapter;
*ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter3(adapter));
*ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(adapter));
}
else if(riid == __uuidof(IDXGIAdapter1))
{
IDXGIAdapter1 *adapter = (IDXGIAdapter1 *)*ppvAdapter;
*ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter3(adapter));
*ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(adapter));
}
else
{
IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter;
*ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(adapter));
*ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(adapter));
}
}
return ret;
@@ -1539,22 +1568,22 @@ public:
if(riid == __uuidof(IDXGIAdapter3))
{
IDXGIAdapter3 *adapter = (IDXGIAdapter3 *)*ppvAdapter;
*ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter3(adapter));
*ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(adapter));
}
else if(riid == __uuidof(IDXGIAdapter2))
{
IDXGIAdapter2 *adapter = (IDXGIAdapter2 *)*ppvAdapter;
*ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter3(adapter));
*ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(adapter));
}
else if(riid == __uuidof(IDXGIAdapter1))
{
IDXGIAdapter1 *adapter = (IDXGIAdapter1 *)*ppvAdapter;
*ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter3(adapter));
*ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(adapter));
}
else
{
IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter;
*ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(adapter));
*ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(adapter));
}
}
return ret;
@@ -112,6 +112,7 @@
<ClInclude Include="..\dx\official\dxgi1_3.h" />
<ClInclude Include="..\dx\official\dxgi1_4.h" />
<ClInclude Include="..\dx\official\dxgi1_5.h" />
<ClInclude Include="..\dx\official\dxgi1_6.h" />
<ClInclude Include="..\dx\official\dxgiformat.h" />
<ClInclude Include="..\dx\official\dxgitype.h" />
<ClInclude Include="dxgi_common.h" />
@@ -48,6 +48,9 @@
<ClInclude Include="precompiled.h">
<Filter>PCH</Filter>
</ClInclude>
<ClInclude Include="..\dx\official\dxgi1_6.h">
<Filter>official</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="official">