diff --git a/renderdoc/driver/d3d11/d3d11_hooks.cpp b/renderdoc/driver/d3d11/d3d11_hooks.cpp
index 07ec50581..8c7ee331c 100644
--- a/renderdoc/driver/d3d11/d3d11_hooks.cpp
+++ b/renderdoc/driver/d3d11/d3d11_hooks.cpp
@@ -236,7 +236,7 @@ private:
wrap->GetImmediateContext(ppImmediateContext);
if(ppSwapChain && *ppSwapChain)
- *ppSwapChain = new WrappedIDXGISwapChain2(
+ *ppSwapChain = new WrappedIDXGISwapChain3(
*ppSwapChain, pSwapChainDesc ? pSwapChainDesc->OutputWindow : NULL, wrap);
}
}
diff --git a/renderdoc/driver/d3d11/renderdoc_d3d11.vcxproj b/renderdoc/driver/d3d11/renderdoc_d3d11.vcxproj
index 4afe04e3c..74d2be0f1 100644
--- a/renderdoc/driver/d3d11/renderdoc_d3d11.vcxproj
+++ b/renderdoc/driver/d3d11/renderdoc_d3d11.vcxproj
@@ -216,11 +216,16 @@
+
+
+
+
+
diff --git a/renderdoc/driver/d3d11/renderdoc_d3d11.vcxproj.filters b/renderdoc/driver/d3d11/renderdoc_d3d11.vcxproj.filters
index b79520a52..7a3fac16c 100644
--- a/renderdoc/driver/d3d11/renderdoc_d3d11.vcxproj.filters
+++ b/renderdoc/driver/d3d11/renderdoc_d3d11.vcxproj.filters
@@ -131,5 +131,20 @@
official
+
+ official
+
+
+ official
+
+
+ official
+
+
+ official
+
+
+ official
+
\ No newline at end of file
diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.cpp b/renderdoc/driver/dxgi/dxgi_wrapped.cpp
index d80dacdbc..b4972481a 100644
--- a/renderdoc/driver/dxgi/dxgi_wrapped.cpp
+++ b/renderdoc/driver/dxgi/dxgi_wrapped.cpp
@@ -67,7 +67,7 @@ HRESULT WrappedIDXGIFactory::staticCreateSwapChain(IDXGIFactory *factory, IUnkno
if(SUCCEEDED(ret))
*ppSwapChain =
- new WrappedIDXGISwapChain2(*ppSwapChain, pDesc ? pDesc->OutputWindow : NULL, wrapDevice);
+ new WrappedIDXGISwapChain3(*ppSwapChain, pDesc ? pDesc->OutputWindow : NULL, wrapDevice);
return ret;
}
@@ -112,7 +112,7 @@ HRESULT WrappedIDXGIFactory2::staticCreateSwapChainForHwnd(
pFullscreenDesc, pRestrictToOutput, ppSwapChain);
if(SUCCEEDED(ret))
- *ppSwapChain = new WrappedIDXGISwapChain2(*ppSwapChain, hWnd, wrapDevice);
+ *ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, hWnd, wrapDevice);
return ret;
}
@@ -162,7 +162,7 @@ HRESULT WrappedIDXGIFactory2::staticCreateSwapChainForCoreWindow(IDXGIFactory2 *
{
HWND wnd = NULL;
(*ppSwapChain)->GetHwnd(&wnd);
- *ppSwapChain = new WrappedIDXGISwapChain2(*ppSwapChain, wnd, wrapDevice);
+ *ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, wnd, wrapDevice);
}
return ret;
@@ -213,7 +213,7 @@ HRESULT WrappedIDXGIFactory2::staticCreateSwapChainForComposition(IDXGIFactory2
{
HWND wnd = NULL;
(*ppSwapChain)->GetHwnd(&wnd);
- *ppSwapChain = new WrappedIDXGISwapChain2(*ppSwapChain, wnd, wrapDevice);
+ *ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, wnd, wrapDevice);
}
return ret;
@@ -226,7 +226,7 @@ HRESULT WrappedIDXGIFactory2::staticCreateSwapChainForComposition(IDXGIFactory2
return factory->CreateSwapChainForComposition(pDevice, pDesc, pRestrictToOutput, ppSwapChain);
}
-WrappedIDXGISwapChain2::WrappedIDXGISwapChain2(IDXGISwapChain *real, HWND wnd,
+WrappedIDXGISwapChain3::WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd,
WrappedID3D11Device *device)
: RefCountDXGIObject(real), m_pReal(real), m_pDevice(device), m_iRefcount(1), m_Wnd(wnd)
{
@@ -237,6 +237,8 @@ WrappedIDXGISwapChain2::WrappedIDXGISwapChain2(IDXGISwapChain *real, HWND wnd,
real->QueryInterface(__uuidof(IDXGISwapChain1), (void **)&m_pReal1);
m_pReal2 = NULL;
real->QueryInterface(__uuidof(IDXGISwapChain2), (void **)&m_pReal2);
+ m_pReal3 = NULL;
+ real->QueryInterface(__uuidof(IDXGISwapChain3), (void **)&m_pReal3);
int bufCount = desc.BufferCount;
@@ -271,7 +273,7 @@ WrappedIDXGISwapChain2::WrappedIDXGISwapChain2(IDXGISwapChain *real, HWND wnd,
m_pDevice->FirstFrame(this);
}
-WrappedIDXGISwapChain2::~WrappedIDXGISwapChain2()
+WrappedIDXGISwapChain3::~WrappedIDXGISwapChain3()
{
m_pDevice->ReleaseSwapchainResources(this);
@@ -284,17 +286,13 @@ WrappedIDXGISwapChain2::~WrappedIDXGISwapChain2()
}
SAFE_RELEASE(m_pReal1);
SAFE_RELEASE(m_pReal2);
+ SAFE_RELEASE(m_pReal3);
SAFE_RELEASE(m_pReal);
SAFE_RELEASE(m_pDevice);
}
-HRESULT WrappedIDXGISwapChain2::ResizeBuffers(
- /* [in] */ UINT BufferCount,
- /* [in] */ UINT Width,
- /* [in] */ UINT Height,
- /* [in] */ DXGI_FORMAT NewFormat,
- /* [in] */ UINT SwapChainFlags)
+void WrappedIDXGISwapChain3::ReleaseBuffersForResize()
{
for(int i = 0; i < MAX_NUM_BACKBUFFERS; i++)
{
@@ -311,9 +309,10 @@ HRESULT WrappedIDXGISwapChain2::ResizeBuffers(
}
m_pDevice->ReleaseSwapchainResources(this);
+}
- HRESULT ret = m_pReal->ResizeBuffers(BufferCount, Width, Height, NewFormat, SwapChainFlags);
-
+void WrappedIDXGISwapChain3::WrapBuffersAfterResize()
+{
DXGI_SWAP_CHAIN_DESC desc;
m_pReal->GetDesc(&desc);
@@ -342,11 +341,42 @@ HRESULT WrappedIDXGISwapChain2::ResizeBuffers(
}
}
}
+}
+
+HRESULT WrappedIDXGISwapChain3::ResizeBuffers(
+ /* [in] */ UINT BufferCount,
+ /* [in] */ UINT Width,
+ /* [in] */ UINT Height,
+ /* [in] */ DXGI_FORMAT NewFormat,
+ /* [in] */ UINT SwapChainFlags)
+{
+ ReleaseBuffersForResize();
+
+ HRESULT ret = m_pReal->ResizeBuffers(BufferCount, Width, Height, NewFormat, SwapChainFlags);
+
+ WrapBuffersAfterResize();
return ret;
}
-HRESULT WrappedIDXGISwapChain2::SetFullscreenState(
+HRESULT WrappedIDXGISwapChain3::ResizeBuffers1(_In_ UINT BufferCount, _In_ UINT Width,
+ _In_ UINT Height, _In_ DXGI_FORMAT Format,
+ _In_ UINT SwapChainFlags,
+ _In_reads_(BufferCount) const UINT *pCreationNodeMask,
+ _In_reads_(BufferCount)
+ IUnknown *const *ppPresentQueue)
+{
+ ReleaseBuffersForResize();
+
+ HRESULT ret = m_pReal3->ResizeBuffers1(BufferCount, Width, Height, Format, SwapChainFlags,
+ pCreationNodeMask, ppPresentQueue);
+
+ WrapBuffersAfterResize();
+
+ return ret;
+}
+
+HRESULT WrappedIDXGISwapChain3::SetFullscreenState(
/* [in] */ BOOL Fullscreen,
/* [in] */ IDXGIOutput *pTarget)
{
@@ -356,14 +386,14 @@ HRESULT WrappedIDXGISwapChain2::SetFullscreenState(
return S_OK;
}
-HRESULT WrappedIDXGISwapChain2::GetFullscreenState(
+HRESULT WrappedIDXGISwapChain3::GetFullscreenState(
/* [out] */ BOOL *pFullscreen,
/* [out] */ IDXGIOutput **ppTarget)
{
return m_pReal->GetFullscreenState(pFullscreen, ppTarget);
}
-HRESULT WrappedIDXGISwapChain2::GetBuffer(
+HRESULT WrappedIDXGISwapChain3::GetBuffer(
/* [in] */ UINT Buffer,
/* [in] */ REFIID riid,
/* [out][in] */ void **ppSurface)
@@ -427,7 +457,7 @@ HRESULT WrappedIDXGISwapChain2::GetBuffer(
return ret;
}
-HRESULT WrappedIDXGISwapChain2::GetDevice(
+HRESULT WrappedIDXGISwapChain3::GetDevice(
/* [in] */ REFIID riid,
/* [retval][out] */ void **ppDevice)
{
@@ -459,7 +489,7 @@ HRESULT WrappedIDXGISwapChain2::GetDevice(
return ret;
}
-HRESULT WrappedIDXGISwapChain2::Present(
+HRESULT WrappedIDXGISwapChain3::Present(
/* [in] */ UINT SyncInterval,
/* [in] */ UINT Flags)
{
@@ -473,7 +503,7 @@ HRESULT WrappedIDXGISwapChain2::Present(
return m_pReal->Present(SyncInterval, Flags);
}
-HRESULT WrappedIDXGISwapChain2::Present1(UINT SyncInterval, UINT Flags,
+HRESULT WrappedIDXGISwapChain3::Present1(UINT SyncInterval, UINT Flags,
const DXGI_PRESENT_PARAMETERS *pPresentParameters)
{
if(!RenderDoc::Inst().GetCaptureOptions().AllowVSync)
@@ -546,6 +576,12 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
*ppvObject = new WrappedIDXGIAdapter2(real);
return true;
}
+ else if(riid == __uuidof(IDXGIAdapter3))
+ {
+ IDXGIAdapter3 *real = (IDXGIAdapter3 *)(*ppvObject);
+ *ppvObject = new WrappedIDXGIAdapter3(real);
+ return true;
+ }
else if(riid == __uuidof(IDXGIFactory2))
{
IDXGIFactory2 *real = (IDXGIFactory2 *)(*ppvObject);
@@ -558,6 +594,12 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
*ppvObject = new WrappedIDXGIFactory3(real);
return true;
}
+ else if(riid == __uuidof(IDXGIFactory4))
+ {
+ IDXGIFactory4 *real = (IDXGIFactory4 *)(*ppvObject);
+ *ppvObject = new WrappedIDXGIFactory4(real);
+ return true;
+ }
else
{
string guid = ToStr::Get(riid);
@@ -589,7 +631,7 @@ HRESULT RefCountDXGIObject::WrapQueryInterface(IUnknown *real, REFIID riid, void
return ret;
}
-HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain2::QueryInterface(REFIID riid, void **ppvObject)
+HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain3::QueryInterface(REFIID riid, void **ppvObject)
{
if(riid == __uuidof(IDXGISwapChain))
{
@@ -623,6 +665,19 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain2::QueryInterface(REFIID riid, vo
return E_NOINTERFACE;
}
}
+ else if(riid == __uuidof(IDXGISwapChain3))
+ {
+ if(m_pReal3)
+ {
+ AddRef();
+ *ppvObject = (IDXGISwapChain3 *)this;
+ return S_OK;
+ }
+ else
+ {
+ return E_NOINTERFACE;
+ }
+ }
else
{
string guid = ToStr::Get(riid);
diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.h b/renderdoc/driver/dxgi/dxgi_wrapped.h
index e3ed4abe7..049786dad 100644
--- a/renderdoc/driver/dxgi/dxgi_wrapped.h
+++ b/renderdoc/driver/dxgi/dxgi_wrapped.h
@@ -26,7 +26,7 @@
#pragma once
#include "../d3d11/official/d3d11_3.h"
-#include "../d3d11/official/dxgi1_3.h"
+#include "../d3d11/official/dxgi1_5.h"
#include "common/common.h"
#include "common/wrapped_pool.h"
@@ -145,11 +145,12 @@ public:
class WrappedID3D11Device;
struct ID3D11Resource;
-class WrappedIDXGISwapChain2 : public IDXGISwapChain2, public RefCountDXGIObject
+class WrappedIDXGISwapChain3 : public IDXGISwapChain3, public RefCountDXGIObject
{
IDXGISwapChain *m_pReal;
IDXGISwapChain1 *m_pReal1;
IDXGISwapChain2 *m_pReal2;
+ IDXGISwapChain3 *m_pReal3;
WrappedID3D11Device *m_pDevice;
unsigned int m_iRefcount;
@@ -159,9 +160,12 @@ class WrappedIDXGISwapChain2 : public IDXGISwapChain2, public RefCountDXGIObject
ID3D11Resource *m_pBackBuffers[MAX_NUM_BACKBUFFERS];
+ void ReleaseBuffersForResize();
+ void WrapBuffersAfterResize();
+
public:
- WrappedIDXGISwapChain2(IDXGISwapChain *real, HWND wnd, WrappedID3D11Device *device);
- virtual ~WrappedIDXGISwapChain2();
+ WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, WrappedID3D11Device *device);
+ virtual ~WrappedIDXGISwapChain3();
IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY;
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
@@ -353,6 +357,46 @@ public:
{
return m_pReal2->GetMatrixTransform(pMatrix);
}
+
+ //////////////////////////////
+ // implement IDXGISwapChain3
+
+ virtual UINT STDMETHODCALLTYPE GetCurrentBackBufferIndex(void)
+ {
+ return m_pReal3->GetCurrentBackBufferIndex();
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE CheckColorSpaceSupport(
+ /* [annotation][in] */
+ _In_ DXGI_COLOR_SPACE_TYPE ColorSpace,
+ /* [annotation][out] */
+ _Out_ UINT *pColorSpaceSupport)
+ {
+ return m_pReal3->CheckColorSpaceSupport(ColorSpace, pColorSpaceSupport);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE SetColorSpace1(
+ /* [annotation][in] */
+ _In_ DXGI_COLOR_SPACE_TYPE ColorSpace)
+ {
+ return m_pReal3->SetColorSpace1(ColorSpace);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE ResizeBuffers1(
+ /* [annotation][in] */
+ _In_ UINT BufferCount,
+ /* [annotation][in] */
+ _In_ UINT Width,
+ /* [annotation][in] */
+ _In_ UINT Height,
+ /* [annotation][in] */
+ _In_ DXGI_FORMAT Format,
+ /* [annotation][in] */
+ _In_ UINT SwapChainFlags,
+ /* [annotation][in] */
+ _In_reads_(BufferCount) const UINT *pCreationNodeMask,
+ /* [annotation][in] */
+ _In_reads_(BufferCount) IUnknown *const *ppPresentQueue);
};
//////////////////////////////////////////////////////////////////////////////
@@ -1518,3 +1562,394 @@ public:
virtual UINT STDMETHODCALLTYPE GetCreationFlags(void) { return m_pReal->GetCreationFlags(); }
};
+
+class WrappedIDXGIAdapter3 : public IDXGIAdapter3, public RefCountDXGIObject
+{
+ IDXGIAdapter3 *m_pReal;
+ unsigned int m_iRefcount;
+
+public:
+ WrappedIDXGIAdapter3(IDXGIAdapter3 *real)
+ : RefCountDXGIObject(real), m_pReal(real), m_iRefcount(1)
+ {
+ }
+ virtual ~WrappedIDXGIAdapter3() { SAFE_RELEASE(m_pReal); }
+ IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT;
+
+ //////////////////////////////
+ // implement IDXGIAdapter
+
+ virtual HRESULT STDMETHODCALLTYPE EnumOutputs(
+ /* [in] */ UINT Output,
+ /* [annotation][out][in] */
+ __out IDXGIOutput **ppOutput)
+ {
+ return m_pReal->EnumOutputs(Output, ppOutput);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetDesc(
+ /* [annotation][out] */
+ __out DXGI_ADAPTER_DESC *pDesc)
+ {
+ return m_pReal->GetDesc(pDesc);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE CheckInterfaceSupport(
+ /* [annotation][in] */
+ __in REFGUID InterfaceName,
+ /* [annotation][out] */
+ __out LARGE_INTEGER *pUMDVersion)
+ {
+ return m_pReal->CheckInterfaceSupport(InterfaceName, pUMDVersion);
+ }
+
+ //////////////////////////////
+ // implement IDXGIAdapter1
+
+ virtual HRESULT STDMETHODCALLTYPE GetDesc1(
+ /* [out] */ DXGI_ADAPTER_DESC1 *pDesc)
+ {
+ return m_pReal->GetDesc1(pDesc);
+ }
+
+ //////////////////////////////
+ // implement IDXGIAdapter2
+
+ virtual HRESULT STDMETHODCALLTYPE GetDesc2(
+ /* [annotation][out] */
+ _Out_ DXGI_ADAPTER_DESC2 *pDesc)
+ {
+ return m_pReal->GetDesc2(pDesc);
+ }
+
+ //////////////////////////////
+ // implement IDXGIAdapter3
+
+ virtual HRESULT STDMETHODCALLTYPE RegisterHardwareContentProtectionTeardownStatusEvent(
+ /* [annotation][in] */
+ _In_ HANDLE hEvent,
+ /* [annotation][out] */
+ _Out_ DWORD *pdwCookie)
+ {
+ return m_pReal->RegisterHardwareContentProtectionTeardownStatusEvent(hEvent, pdwCookie);
+ }
+
+ virtual void STDMETHODCALLTYPE UnregisterHardwareContentProtectionTeardownStatus(
+ /* [annotation][in] */
+ _In_ DWORD dwCookie)
+ {
+ return m_pReal->UnregisterHardwareContentProtectionTeardownStatus(dwCookie);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE QueryVideoMemoryInfo(
+ /* [annotation][in] */
+ _In_ UINT NodeIndex,
+ /* [annotation][in] */
+ _In_ DXGI_MEMORY_SEGMENT_GROUP MemorySegmentGroup,
+ /* [annotation][out] */
+ _Out_ DXGI_QUERY_VIDEO_MEMORY_INFO *pVideoMemoryInfo)
+ {
+ return m_pReal->QueryVideoMemoryInfo(NodeIndex, MemorySegmentGroup, pVideoMemoryInfo);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE SetVideoMemoryReservation(
+ /* [annotation][in] */
+ _In_ UINT NodeIndex,
+ /* [annotation][in] */
+ _In_ DXGI_MEMORY_SEGMENT_GROUP MemorySegmentGroup,
+ /* [annotation][in] */
+ _In_ UINT64 Reservation)
+ {
+ return m_pReal->SetVideoMemoryReservation(NodeIndex, MemorySegmentGroup, Reservation);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE RegisterVideoMemoryBudgetChangeNotificationEvent(
+ /* [annotation][in] */
+ _In_ HANDLE hEvent,
+ /* [annotation][out] */
+ _Out_ DWORD *pdwCookie)
+ {
+ return m_pReal->RegisterVideoMemoryBudgetChangeNotificationEvent(hEvent, pdwCookie);
+ }
+
+ virtual void STDMETHODCALLTYPE UnregisterVideoMemoryBudgetChangeNotification(
+ /* [annotation][in] */
+ _In_ DWORD dwCookie)
+ {
+ return m_pReal->UnregisterVideoMemoryBudgetChangeNotification(dwCookie);
+ }
+};
+
+class WrappedIDXGIFactory4 : public IDXGIFactory4, public RefCountDXGIObject
+{
+ IDXGIFactory4 *m_pReal;
+ unsigned int m_iRefcount;
+
+public:
+ WrappedIDXGIFactory4(IDXGIFactory4 *real)
+ : RefCountDXGIObject(real), m_pReal(real), m_iRefcount(1)
+ {
+ }
+ virtual ~WrappedIDXGIFactory4() { SAFE_RELEASE(m_pReal); }
+ IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT;
+
+ //////////////////////////////
+ // implement IDXGIFactory
+
+ virtual HRESULT STDMETHODCALLTYPE EnumAdapters(
+ /* [in] */ UINT Adapter,
+ /* [annotation][out] */
+ __out IDXGIAdapter **ppAdapter)
+ {
+ HRESULT ret = m_pReal->EnumAdapters(Adapter, ppAdapter);
+ if(SUCCEEDED(ret))
+ *ppAdapter = new WrappedIDXGIAdapter(*ppAdapter);
+ return ret;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE MakeWindowAssociation(HWND WindowHandle, UINT Flags)
+ {
+ return m_pReal->MakeWindowAssociation(WindowHandle, Flags);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetWindowAssociation(
+ /* [annotation][out] */
+ __out HWND *pWindowHandle)
+ {
+ return m_pReal->GetWindowAssociation(pWindowHandle);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE CreateSwapChain(
+ /* [annotation][in] */
+ __in IUnknown *pDevice,
+ /* [annotation][in] */
+ __in DXGI_SWAP_CHAIN_DESC *pDesc,
+ /* [annotation][out] */
+ __out IDXGISwapChain **ppSwapChain)
+ {
+ return WrappedIDXGIFactory::staticCreateSwapChain(m_pReal, pDevice, pDesc, ppSwapChain);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE CreateSoftwareAdapter(
+ /* [in] */ HMODULE Module,
+ /* [annotation][out] */
+ __out IDXGIAdapter **ppAdapter)
+ {
+ HRESULT ret = m_pReal->CreateSoftwareAdapter(Module, ppAdapter);
+ if(SUCCEEDED(ret))
+ *ppAdapter = new WrappedIDXGIAdapter(*ppAdapter);
+ return ret;
+ }
+
+ //////////////////////////////
+ // implement IDXGIFactory1
+
+ virtual HRESULT STDMETHODCALLTYPE EnumAdapters1(
+ /* [in] */ UINT Adapter,
+ /* [annotation][out] */
+ __out IDXGIAdapter1 **ppAdapter)
+ {
+ HRESULT ret = m_pReal->EnumAdapters1(Adapter, ppAdapter);
+ if(SUCCEEDED(ret))
+ *ppAdapter = new WrappedIDXGIAdapter1(*ppAdapter);
+ return ret;
+ }
+
+ virtual BOOL STDMETHODCALLTYPE IsCurrent(void) { return m_pReal->IsCurrent(); }
+ //////////////////////////////
+ // implement IDXGIFactory2
+
+ virtual BOOL STDMETHODCALLTYPE IsWindowedStereoEnabled(void)
+ {
+ return m_pReal->IsWindowedStereoEnabled();
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE CreateSwapChainForHwnd(
+ /* [annotation][in] */
+ _In_ IUnknown *pDevice,
+ /* [annotation][in] */
+ _In_ HWND hWnd,
+ /* [annotation][in] */
+ _In_ const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+ /* [annotation][in] */
+ _In_opt_ const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc,
+ /* [annotation][in] */
+ _In_opt_ IDXGIOutput *pRestrictToOutput,
+ /* [annotation][out] */
+ _Out_ IDXGISwapChain1 **ppSwapChain)
+ {
+ return WrappedIDXGIFactory2::staticCreateSwapChainForHwnd(
+ m_pReal, pDevice, hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE CreateSwapChainForCoreWindow(
+ /* [annotation][in] */
+ _In_ IUnknown *pDevice,
+ /* [annotation][in] */
+ _In_ IUnknown *pWindow,
+ /* [annotation][in] */
+ _In_ const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+ /* [annotation][in] */
+ _In_opt_ IDXGIOutput *pRestrictToOutput,
+ /* [annotation][out] */
+ _Out_ IDXGISwapChain1 **ppSwapChain)
+ {
+ return WrappedIDXGIFactory2::staticCreateSwapChainForCoreWindow(
+ m_pReal, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetSharedResourceAdapterLuid(
+ /* [annotation] */
+ _In_ HANDLE hResource,
+ /* [annotation] */
+ _Out_ LUID *pLuid)
+ {
+ return m_pReal->GetSharedResourceAdapterLuid(hResource, pLuid);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE RegisterStereoStatusWindow(
+ /* [annotation][in] */
+ _In_ HWND WindowHandle,
+ /* [annotation][in] */
+ _In_ UINT wMsg,
+ /* [annotation][out] */
+ _Out_ DWORD *pdwCookie)
+ {
+ return m_pReal->RegisterOcclusionStatusWindow(WindowHandle, wMsg, pdwCookie);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE RegisterStereoStatusEvent(
+ /* [annotation][in] */
+ _In_ HANDLE hEvent,
+ /* [annotation][out] */
+ _Out_ DWORD *pdwCookie)
+ {
+ return m_pReal->RegisterStereoStatusEvent(hEvent, pdwCookie);
+ }
+
+ virtual void STDMETHODCALLTYPE UnregisterStereoStatus(
+ /* [annotation][in] */
+ _In_ DWORD dwCookie)
+ {
+ return m_pReal->UnregisterStereoStatus(dwCookie);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE RegisterOcclusionStatusWindow(
+ /* [annotation][in] */
+ _In_ HWND WindowHandle,
+ /* [annotation][in] */
+ _In_ UINT wMsg,
+ /* [annotation][out] */
+ _Out_ DWORD *pdwCookie)
+ {
+ return m_pReal->RegisterOcclusionStatusWindow(WindowHandle, wMsg, pdwCookie);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE RegisterOcclusionStatusEvent(
+ /* [annotation][in] */
+ _In_ HANDLE hEvent,
+ /* [annotation][out] */
+ _Out_ DWORD *pdwCookie)
+ {
+ return m_pReal->RegisterOcclusionStatusEvent(hEvent, pdwCookie);
+ }
+
+ virtual void STDMETHODCALLTYPE UnregisterOcclusionStatus(
+ /* [annotation][in] */
+ _In_ DWORD dwCookie)
+ {
+ return m_pReal->UnregisterOcclusionStatus(dwCookie);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE CreateSwapChainForComposition(
+ /* [annotation][in] */
+ _In_ IUnknown *pDevice,
+ /* [annotation][in] */
+ _In_ const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+ /* [annotation][in] */
+ _In_opt_ IDXGIOutput *pRestrictToOutput,
+ /* [annotation][out] */
+ _Outptr_ IDXGISwapChain1 **ppSwapChain)
+ {
+ return WrappedIDXGIFactory2::staticCreateSwapChainForComposition(
+ m_pReal, pDevice, pDesc, pRestrictToOutput, ppSwapChain);
+ }
+
+ // static functions to share implementation between this and WrappedIDXGIFactory3
+
+ static HRESULT staticCreateSwapChainForHwnd(
+ IDXGIFactory2 *factory,
+ /* [annotation][in] */
+ _In_ IUnknown *pDevice,
+ /* [annotation][in] */
+ _In_ HWND hWnd,
+ /* [annotation][in] */
+ _In_ const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+ /* [annotation][in] */
+ _In_opt_ const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc,
+ /* [annotation][in] */
+ _In_opt_ IDXGIOutput *pRestrictToOutput,
+ /* [annotation][out] */
+ _Out_ IDXGISwapChain1 **ppSwapChain);
+
+ static HRESULT staticCreateSwapChainForCoreWindow(IDXGIFactory2 *factory,
+ /* [annotation][in] */
+ _In_ IUnknown *pDevice,
+ /* [annotation][in] */
+ _In_ IUnknown *pWindow,
+ /* [annotation][in] */
+ _In_ const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+ /* [annotation][in] */
+ _In_opt_ IDXGIOutput *pRestrictToOutput,
+ /* [annotation][out] */
+ _Out_ IDXGISwapChain1 **ppSwapChain);
+
+ static HRESULT staticCreateSwapChainForComposition(IDXGIFactory2 *factory,
+ /* [annotation][in] */
+ _In_ IUnknown *pDevice,
+ /* [annotation][in] */
+ _In_ const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+ /* [annotation][in] */
+ _In_opt_ IDXGIOutput *pRestrictToOutput,
+ /* [annotation][out] */
+ _Outptr_ IDXGISwapChain1 **ppSwapChain);
+
+ //////////////////////////////
+ // implement IDXGIFactory3
+
+ virtual UINT STDMETHODCALLTYPE GetCreationFlags(void) { return m_pReal->GetCreationFlags(); }
+ //////////////////////////////
+ // implement IDXGIFactory4
+
+ virtual HRESULT STDMETHODCALLTYPE EnumAdapterByLuid(
+ /* [annotation] */
+ _In_ LUID AdapterLuid,
+ /* [annotation] */
+ _In_ REFIID riid,
+ /* [annotation] */
+ _COM_Outptr_ void **ppvAdapter)
+ {
+ HRESULT ret = m_pReal->EnumAdapterByLuid(AdapterLuid, riid, ppvAdapter);
+ if(SUCCEEDED(ret) && ppvAdapter && *ppvAdapter)
+ {
+ IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter;
+ *ppvAdapter = (void *)new WrappedIDXGIAdapter(adapter);
+ }
+ return ret;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE EnumWarpAdapter(
+ /* [annotation] */
+ _In_ REFIID riid,
+ /* [annotation] */
+ _COM_Outptr_ void **ppvAdapter)
+ {
+ HRESULT ret = m_pReal->EnumWarpAdapter(riid, ppvAdapter);
+ if(SUCCEEDED(ret) && ppvAdapter && *ppvAdapter)
+ {
+ IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter;
+ *ppvAdapter = (void *)new WrappedIDXGIAdapter(adapter);
+ }
+ return ret;
+ }
+};