mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-05 17:40:39 +00:00
Implement DXGI 1.6 & 1.7. Closes #1174
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user