Wrap DXGI 1.5 passthrough, to ensure the wrapping ecosystem isn't broken

This commit is contained in:
baldurk committed 2016-10-26 17:10:05 +02:00
1 parent 2c7791c7bd
commit 447b64fd14
11 files changed
+188 -92

No files matched your search

+10 -10
View File
@@ -621,7 +621,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject)
if(SUCCEEDED(hr))
{
IDXGIDevice *real = (IDXGIDevice *)(*ppvObject);
*ppvObject = (IDXGIDevice *)(new WrappedIDXGIDevice3(real, this));
*ppvObject = (IDXGIDevice *)(new WrappedIDXGIDevice4(real, this));
return S_OK;
}
else
@@ -637,7 +637,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject)
if(SUCCEEDED(hr))
{
IDXGIDevice1 *real = (IDXGIDevice1 *)(*ppvObject);
*ppvObject = (IDXGIDevice1 *)(new WrappedIDXGIDevice3(real, this));
*ppvObject = (IDXGIDevice1 *)(new WrappedIDXGIDevice4(real, this));
return S_OK;
}
else
@@ -653,7 +653,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject)
if(SUCCEEDED(hr))
{
IDXGIDevice2 *real = (IDXGIDevice2 *)(*ppvObject);
*ppvObject = (IDXGIDevice2 *)(new WrappedIDXGIDevice3(real, this));
*ppvObject = (IDXGIDevice2 *)(new WrappedIDXGIDevice4(real, this));
return S_OK;
}
else
@@ -669,7 +669,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject)
if(SUCCEEDED(hr))
{
IDXGIDevice3 *real = (IDXGIDevice3 *)(*ppvObject);
*ppvObject = (IDXGIDevice3 *)(new WrappedIDXGIDevice3(real, this));
*ppvObject = (IDXGIDevice3 *)(new WrappedIDXGIDevice4(real, this));
return S_OK;
}
else
@@ -2408,7 +2408,7 @@ void WrappedID3D11Device::ReplayLog(uint32_t startEventID, uint32_t endEventID,
RDCFATAL("Unexpected replay type");
}
void WrappedID3D11Device::ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap)
void WrappedID3D11Device::ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap)
{
for(int i = 0; i < swap->GetNumBackbuffers(); i++)
{
@@ -2444,7 +2444,7 @@ void WrappedID3D11Device::ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap
}
}
bool WrappedID3D11Device::Serialise_WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap,
bool WrappedID3D11Device::Serialise_WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap,
DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer,
IUnknown *realSurface)
{
@@ -2498,7 +2498,7 @@ bool WrappedID3D11Device::Serialise_WrapSwapchainBuffer(WrappedIDXGISwapChain3 *
return true;
}
IUnknown *WrappedID3D11Device::WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap,
IUnknown *WrappedID3D11Device::WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap,
DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer,
IUnknown *realSurface)
{
@@ -2659,7 +2659,7 @@ bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd)
CaptureFailReason reason;
WrappedIDXGISwapChain3 *swap = NULL;
WrappedIDXGISwapChain4 *swap = NULL;
if(wnd)
{
@@ -3198,7 +3198,7 @@ void WrappedID3D11Device::UnlockForChunkRemoval()
}
}
void WrappedID3D11Device::FirstFrame(WrappedIDXGISwapChain3 *swapChain)
void WrappedID3D11Device::FirstFrame(WrappedIDXGISwapChain4 *swapChain)
{
DXGI_SWAP_CHAIN_DESC swapdesc;
swapChain->GetDesc(&swapdesc);
@@ -3212,7 +3212,7 @@ void WrappedID3D11Device::FirstFrame(WrappedIDXGISwapChain3 *swapChain)
}
}
HRESULT WrappedID3D11Device::Present(WrappedIDXGISwapChain3 *swap, UINT SyncInterval, UINT Flags)
HRESULT WrappedID3D11Device::Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags)
{
if((Flags & DXGI_PRESENT_TEST) != 0)
return S_OK;
+5 -5
View File
@@ -340,7 +340,7 @@ private:
static WrappedID3D11Device *m_pCurrentWrappedDevice;
map<WrappedIDXGISwapChain3 *, ID3D11RenderTargetView *> m_SwapChains;
map<WrappedIDXGISwapChain4 *, ID3D11RenderTargetView *> m_SwapChains;
uint32_t m_FrameCounter;
uint32_t m_FailedFrame;
@@ -393,7 +393,7 @@ public:
void LockForChunkRemoval();
void UnlockForChunkRemoval();
void FirstFrame(WrappedIDXGISwapChain3 *swapChain);
void FirstFrame(WrappedIDXGISwapChain4 *swapChain);
vector<DebugMessage> GetDebugMessages();
void AddDebugMessage(DebugMessage msg);
@@ -473,14 +473,14 @@ public:
ID3D11ClassInstance *inst));
// Swap Chain
IMPLEMENT_FUNCTION_SERIALISED(IUnknown *, WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap,
IMPLEMENT_FUNCTION_SERIALISED(IUnknown *, WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap,
DXGI_SWAP_CHAIN_DESC *desc,
UINT buffer, IUnknown *realSurface));
HRESULT Present(WrappedIDXGISwapChain3 *swap, UINT SyncInterval, UINT Flags);
HRESULT Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags);
void NewSwapchainBuffer(IUnknown *backbuffer);
void ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap);
void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap);
void InternalRef() { InterlockedIncrement(&m_InternalRefcount); }
void InternalRelease() { InterlockedDecrement(&m_InternalRefcount); }
+2 -2
View File
@@ -53,7 +53,7 @@ public:
{
bool success = true;
WrappedIDXGISwapChain3::RegisterD3DDeviceCallback(GetD3D11DeviceIfAlloc);
WrappedIDXGISwapChain4::RegisterD3DDeviceCallback(GetD3D11DeviceIfAlloc);
// also require d3dcompiler_??.dll
if(GetD3DCompiler() == NULL)
@@ -258,7 +258,7 @@ private:
wrap->GetImmediateContext(ppImmediateContext);
if(ppSwapChain && *ppSwapChain)
*ppSwapChain = new WrappedIDXGISwapChain3(
*ppSwapChain = new WrappedIDXGISwapChain4(
*ppSwapChain, pSwapChainDesc ? pSwapChainDesc->OutputWindow : NULL, wrap);
}
}
+1 -1
View File
@@ -1931,7 +1931,7 @@ ReplayCreateStatus D3D11_CreateReplayDevice(const char *logfile, IReplayDriver *
{
RDCDEBUG("Creating a D3D11 replay device");
WrappedIDXGISwapChain3::RegisterD3DDeviceCallback(GetD3D11DeviceIfAlloc);
WrappedIDXGISwapChain4::RegisterD3DDeviceCallback(GetD3D11DeviceIfAlloc);
HMODULE lib = NULL;
lib = LoadLibraryA("d3d11.dll");
+4 -4
View File
@@ -143,22 +143,22 @@ public:
return NULL;
}
// the rest forward to the device
virtual void FirstFrame(WrappedIDXGISwapChain3 *swapChain) { m_pDevice->FirstFrame(swapChain); }
virtual void FirstFrame(WrappedIDXGISwapChain4 *swapChain) { m_pDevice->FirstFrame(swapChain); }
virtual void NewSwapchainBuffer(IUnknown *backbuffer)
{
m_pDevice->NewSwapchainBuffer(backbuffer);
}
virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swapChain)
virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swapChain)
{
m_pDevice->ReleaseSwapchainResources(swapChain);
}
virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc,
virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc,
UINT buffer, IUnknown *realSurface)
{
return m_pDevice->WrapSwapchainBuffer(swap, swapDesc, buffer, realSurface);
}
virtual HRESULT Present(WrappedIDXGISwapChain3 *swapChain, UINT SyncInterval, UINT Flags)
virtual HRESULT Present(WrappedIDXGISwapChain4 *swapChain, UINT SyncInterval, UINT Flags)
{
return m_pDevice->Present(swapChain, SyncInterval, Flags);
}
+10 -10
View File
@@ -392,7 +392,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject)
if(SUCCEEDED(hr))
{
IDXGIDevice *real = (IDXGIDevice *)(*ppvObject);
*ppvObject = (IDXGIDevice *)(new WrappedIDXGIDevice3(real, this));
*ppvObject = (IDXGIDevice *)(new WrappedIDXGIDevice4(real, this));
return S_OK;
}
else
@@ -408,7 +408,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject)
if(SUCCEEDED(hr))
{
IDXGIDevice1 *real = (IDXGIDevice1 *)(*ppvObject);
*ppvObject = (IDXGIDevice1 *)(new WrappedIDXGIDevice3(real, this));
*ppvObject = (IDXGIDevice1 *)(new WrappedIDXGIDevice4(real, this));
return S_OK;
}
else
@@ -424,7 +424,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject)
if(SUCCEEDED(hr))
{
IDXGIDevice2 *real = (IDXGIDevice2 *)(*ppvObject);
*ppvObject = (IDXGIDevice2 *)(new WrappedIDXGIDevice3(real, this));
*ppvObject = (IDXGIDevice2 *)(new WrappedIDXGIDevice4(real, this));
return S_OK;
}
else
@@ -440,7 +440,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject)
if(SUCCEEDED(hr))
{
IDXGIDevice3 *real = (IDXGIDevice3 *)(*ppvObject);
*ppvObject = (IDXGIDevice3 *)(new WrappedIDXGIDevice3(real, this));
*ppvObject = (IDXGIDevice3 *)(new WrappedIDXGIDevice4(real, this));
return S_OK;
}
else
@@ -509,7 +509,7 @@ void WrappedID3D12Device::CheckForDeath()
}
}
void WrappedID3D12Device::FirstFrame(WrappedIDXGISwapChain3 *swap)
void WrappedID3D12Device::FirstFrame(WrappedIDXGISwapChain4 *swap)
{
DXGI_SWAP_CHAIN_DESC swapdesc;
swap->GetDesc(&swapdesc);
@@ -529,7 +529,7 @@ void WrappedID3D12Device::ApplyBarriers(vector<D3D12_RESOURCE_BARRIER> &barriers
GetResourceManager()->ApplyBarriers(barriers, m_ResourceStates);
}
void WrappedID3D12Device::ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap)
void WrappedID3D12Device::ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap)
{
for(int i = 0; i < swap->GetNumBackbuffers(); i++)
{
@@ -558,7 +558,7 @@ void WrappedID3D12Device::ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap
}
bool WrappedID3D12Device::Serialise_WrapSwapchainBuffer(Serialiser *localSerialiser,
WrappedIDXGISwapChain3 *swap,
WrappedIDXGISwapChain4 *swap,
DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer,
IUnknown *realSurface)
{
@@ -618,7 +618,7 @@ bool WrappedID3D12Device::Serialise_WrapSwapchainBuffer(Serialiser *localSeriali
return true;
}
IUnknown *WrappedID3D12Device::WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap,
IUnknown *WrappedID3D12Device::WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap,
DXGI_SWAP_CHAIN_DESC *swapDesc, UINT buffer,
IUnknown *realSurface)
{
@@ -891,7 +891,7 @@ void WrappedID3D12Device::WriteToSubresource(WrappedID3D12Resource *Resource, UI
}
}
HRESULT WrappedID3D12Device::Present(WrappedIDXGISwapChain3 *swap, UINT SyncInterval, UINT Flags)
HRESULT WrappedID3D12Device::Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags)
{
if((Flags & DXGI_PRESENT_TEST) != 0)
return S_OK;
@@ -1123,7 +1123,7 @@ bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd)
if(m_State != WRITING_CAPFRAME)
return true;
WrappedIDXGISwapChain3 *swap = NULL;
WrappedIDXGISwapChain4 *swap = NULL;
SwapPresentInfo swapInfo = {};
if(wnd)
+6 -6
View File
@@ -320,10 +320,10 @@ private:
int32_t lastPresentedBuffer;
};
map<WrappedIDXGISwapChain3 *, SwapPresentInfo> m_SwapChains;
map<WrappedIDXGISwapChain4 *, SwapPresentInfo> m_SwapChains;
pair<ResourceId, DXGI_FORMAT> m_BackbufferFormat;
WrappedIDXGISwapChain3 *m_LastSwap;
WrappedIDXGISwapChain4 *m_LastSwap;
UINT m_DescriptorIncrements[D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES];
@@ -353,7 +353,7 @@ public:
ResourceId GetResourceID() { return m_ResourceID; }
Threading::CriticalSection &GetCapTransitionLock() { return m_CapTransitionLock; }
void ReleaseSwapchainResources(IDXGISwapChain *swap, IUnknown **backbuffers, int numBackbuffers);
void FirstFrame(WrappedIDXGISwapChain3 *swap);
void FirstFrame(WrappedIDXGISwapChain4 *swap);
FetchFrameRecord &GetFrameRecord() { return m_FrameRecord; }
const FetchDrawcall *GetDrawcall(uint32_t eventID);
@@ -440,12 +440,12 @@ public:
}
// Swap Chain
IMPLEMENT_FUNCTION_THREAD_SERIALISED(IUnknown *, WrapSwapchainBuffer,
WrappedIDXGISwapChain3 *swap, DXGI_SWAP_CHAIN_DESC *desc,
WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *desc,
UINT buffer, IUnknown *realSurface);
HRESULT Present(WrappedIDXGISwapChain3 *swap, UINT SyncInterval, UINT Flags);
HRESULT Present(WrappedIDXGISwapChain4 *swap, UINT SyncInterval, UINT Flags);
void NewSwapchainBuffer(IUnknown *backbuffer) {}
void ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swap);
void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swap);
void Map(WrappedID3D12Resource *Resource, UINT Subresource);
void Unmap(WrappedID3D12Resource *Resource, UINT Subresource, byte *mapPtr,
+1 -1
View File
@@ -96,7 +96,7 @@ public:
{
bool success = true;
WrappedIDXGISwapChain3::RegisterD3DDeviceCallback(GetD3D12DeviceIfAlloc);
WrappedIDXGISwapChain4::RegisterD3DDeviceCallback(GetD3D12DeviceIfAlloc);
// also require d3dcompiler_??.dll
if(GetD3DCompiler() == NULL)
+1 -1
View File
@@ -1605,7 +1605,7 @@ ReplayCreateStatus D3D12_CreateReplayDevice(const char *logfile, IReplayDriver *
{
RDCDEBUG("Creating a D3D12 replay device");
WrappedIDXGISwapChain3::RegisterD3DDeviceCallback(GetD3D12DeviceIfAlloc);
WrappedIDXGISwapChain4::RegisterD3DDeviceCallback(GetD3D12DeviceIfAlloc);
HMODULE lib = NULL;
lib = LoadLibraryA("d3d12.dll");
+78 -37
View File
@@ -40,19 +40,19 @@ string ToStrHelper<false, IID>::Get(const IID &el)
return tostrBuf;
}
WRAPPED_POOL_INST(WrappedIDXGIDevice3);
WRAPPED_POOL_INST(WrappedIDXGIDevice4);
std::vector<D3DDeviceCallback> WrappedIDXGISwapChain3::m_D3DCallbacks;
std::vector<D3DDeviceCallback> WrappedIDXGISwapChain4::m_D3DCallbacks;
ID3DDevice *GetD3DDevice(IUnknown *pDevice)
{
ID3DDevice *wrapDevice = NULL;
if(WrappedIDXGIDevice3::IsAlloc(pDevice))
wrapDevice = ((WrappedIDXGIDevice3 *)(IDXGIDevice3 *)pDevice)->GetD3DDevice();
if(WrappedIDXGIDevice4::IsAlloc(pDevice))
wrapDevice = ((WrappedIDXGIDevice4 *)(IDXGIDevice3 *)pDevice)->GetD3DDevice();
if(wrapDevice == NULL)
wrapDevice = WrappedIDXGISwapChain3::GetD3DDevice(pDevice);
wrapDevice = WrappedIDXGISwapChain4::GetD3DDevice(pDevice);
return wrapDevice;
}
@@ -85,7 +85,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 WrappedIDXGIFactory4(real));
*ppvObject = (IDXGIFactory *)(new WrappedIDXGIFactory5(real));
return true;
}
@@ -104,7 +104,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
else if(riid == __uuidof(IDXGIFactory1))
{
IDXGIFactory1 *real = (IDXGIFactory1 *)(*ppvObject);
*ppvObject = (IDXGIFactory1 *)(new WrappedIDXGIFactory4(real));
*ppvObject = (IDXGIFactory1 *)(new WrappedIDXGIFactory5(real));
return true;
}
else if(riid == __uuidof(IDXGIAdapter2))
@@ -122,19 +122,25 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
else if(riid == __uuidof(IDXGIFactory2))
{
IDXGIFactory2 *real = (IDXGIFactory2 *)(*ppvObject);
*ppvObject = (IDXGIFactory2 *)(new WrappedIDXGIFactory4(real));
*ppvObject = (IDXGIFactory2 *)(new WrappedIDXGIFactory5(real));
return true;
}
else if(riid == __uuidof(IDXGIFactory3))
{
IDXGIFactory3 *real = (IDXGIFactory3 *)(*ppvObject);
*ppvObject = (IDXGIFactory3 *)(new WrappedIDXGIFactory4(real));
*ppvObject = (IDXGIFactory3 *)(new WrappedIDXGIFactory5(real));
return true;
}
else if(riid == __uuidof(IDXGIFactory4))
{
IDXGIFactory4 *real = (IDXGIFactory4 *)(*ppvObject);
*ppvObject = (IDXGIFactory4 *)(new WrappedIDXGIFactory4(real));
*ppvObject = (IDXGIFactory4 *)(new WrappedIDXGIFactory5(real));
return true;
}
else if(riid == __uuidof(IDXGIFactory5))
{
IDXGIFactory5 *real = (IDXGIFactory5 *)(*ppvObject);
*ppvObject = (IDXGIFactory5 *)(new WrappedIDXGIFactory5(real));
return true;
}
else
@@ -168,7 +174,7 @@ HRESULT RefCountDXGIObject::WrapQueryInterface(IUnknown *real, REFIID riid, void
return ret;
}
WrappedIDXGISwapChain3::WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, ID3DDevice *device)
WrappedIDXGISwapChain4::WrappedIDXGISwapChain4(IDXGISwapChain *real, HWND wnd, ID3DDevice *device)
: RefCountDXGIObject(real), m_pReal(real), m_pDevice(device), m_iRefcount(1), m_Wnd(wnd)
{
DXGI_SWAP_CHAIN_DESC desc;
@@ -182,6 +188,8 @@ WrappedIDXGISwapChain3::WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, I
real->QueryInterface(__uuidof(IDXGISwapChain2), (void **)&m_pReal2);
m_pReal3 = NULL;
real->QueryInterface(__uuidof(IDXGISwapChain3), (void **)&m_pReal3);
m_pReal4 = NULL;
real->QueryInterface(__uuidof(IDXGISwapChain4), (void **)&m_pReal4);
WrapBuffersAfterResize();
@@ -190,7 +198,7 @@ WrappedIDXGISwapChain3::WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, I
m_pDevice->FirstFrame(this);
}
WrappedIDXGISwapChain3::~WrappedIDXGISwapChain3()
WrappedIDXGISwapChain4::~WrappedIDXGISwapChain4()
{
m_pDevice->ReleaseSwapchainResources(this);
@@ -199,10 +207,11 @@ WrappedIDXGISwapChain3::~WrappedIDXGISwapChain3()
SAFE_RELEASE(m_pReal1);
SAFE_RELEASE(m_pReal2);
SAFE_RELEASE(m_pReal3);
SAFE_RELEASE(m_pReal4);
SAFE_RELEASE(m_pReal);
}
HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain3::QueryInterface(REFIID riid, void **ppvObject)
HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::QueryInterface(REFIID riid, void **ppvObject)
{
if(riid == __uuidof(IDXGISwapChain))
{
@@ -258,12 +267,12 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain3::QueryInterface(REFIID riid, vo
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
}
void WrappedIDXGISwapChain3::ReleaseBuffersForResize()
void WrappedIDXGISwapChain4::ReleaseBuffersForResize()
{
m_pDevice->ReleaseSwapchainResources(this);
}
void WrappedIDXGISwapChain3::WrapBuffersAfterResize()
void WrappedIDXGISwapChain4::WrapBuffersAfterResize()
{
DXGI_SWAP_CHAIN_DESC desc;
m_pReal->GetDesc(&desc);
@@ -287,7 +296,7 @@ void WrappedIDXGISwapChain3::WrapBuffersAfterResize()
}
}
HRESULT WrappedIDXGISwapChain3::ResizeBuffers(
HRESULT WrappedIDXGISwapChain4::ResizeBuffers(
/* [in] */ UINT BufferCount,
/* [in] */ UINT Width,
/* [in] */ UINT Height,
@@ -303,7 +312,7 @@ HRESULT WrappedIDXGISwapChain3::ResizeBuffers(
return ret;
}
HRESULT WrappedIDXGISwapChain3::ResizeBuffers1(_In_ UINT BufferCount, _In_ UINT Width,
HRESULT WrappedIDXGISwapChain4::ResizeBuffers1(_In_ UINT BufferCount, _In_ UINT Width,
_In_ UINT Height, _In_ DXGI_FORMAT Format,
_In_ UINT SwapChainFlags,
_In_reads_(BufferCount) const UINT *pCreationNodeMask,
@@ -320,7 +329,7 @@ HRESULT WrappedIDXGISwapChain3::ResizeBuffers1(_In_ UINT BufferCount, _In_ UINT
return ret;
}
HRESULT WrappedIDXGISwapChain3::SetFullscreenState(
HRESULT WrappedIDXGISwapChain4::SetFullscreenState(
/* [in] */ BOOL Fullscreen,
/* [in] */ IDXGIOutput *pTarget)
{
@@ -330,14 +339,14 @@ HRESULT WrappedIDXGISwapChain3::SetFullscreenState(
return S_OK;
}
HRESULT WrappedIDXGISwapChain3::GetFullscreenState(
HRESULT WrappedIDXGISwapChain4::GetFullscreenState(
/* [out] */ BOOL *pFullscreen,
/* [out] */ IDXGIOutput **ppTarget)
{
return m_pReal->GetFullscreenState(pFullscreen, ppTarget);
}
HRESULT WrappedIDXGISwapChain3::GetBuffer(
HRESULT WrappedIDXGISwapChain4::GetBuffer(
/* [in] */ UINT Buffer,
/* [in] */ REFIID riid,
/* [out][in] */ void **ppSurface)
@@ -394,7 +403,7 @@ HRESULT WrappedIDXGISwapChain3::GetBuffer(
return ret;
}
HRESULT WrappedIDXGISwapChain3::GetDevice(
HRESULT WrappedIDXGISwapChain4::GetDevice(
/* [in] */ REFIID riid,
/* [retval][out] */ void **ppDevice)
{
@@ -426,7 +435,7 @@ HRESULT WrappedIDXGISwapChain3::GetDevice(
return ret;
}
HRESULT WrappedIDXGISwapChain3::Present(
HRESULT WrappedIDXGISwapChain4::Present(
/* [in] */ UINT SyncInterval,
/* [in] */ UINT Flags)
{
@@ -440,7 +449,7 @@ HRESULT WrappedIDXGISwapChain3::Present(
return m_pReal->Present(SyncInterval, Flags);
}
HRESULT WrappedIDXGISwapChain3::Present1(UINT SyncInterval, UINT Flags,
HRESULT WrappedIDXGISwapChain4::Present1(UINT SyncInterval, UINT Flags,
const DXGI_PRESENT_PARAMETERS *pPresentParameters)
{
if(!RenderDoc::Inst().GetCaptureOptions().AllowVSync)
@@ -528,7 +537,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIAdapter3::QueryInterface(REFIID riid, void
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
}
WrappedIDXGIDevice3::WrappedIDXGIDevice3(IDXGIDevice *real, ID3DDevice *d3d)
WrappedIDXGIDevice4::WrappedIDXGIDevice4(IDXGIDevice *real, ID3DDevice *d3d)
: RefCountDXGIObject(real), m_pReal(real), m_pD3DDevice(d3d)
{
m_pD3DDevice->AddRef();
@@ -539,18 +548,21 @@ WrappedIDXGIDevice3::WrappedIDXGIDevice3(IDXGIDevice *real, ID3DDevice *d3d)
real->QueryInterface(__uuidof(IDXGIDevice2), (void **)&m_pReal2);
m_pReal3 = NULL;
real->QueryInterface(__uuidof(IDXGIDevice3), (void **)&m_pReal3);
m_pReal4 = NULL;
real->QueryInterface(__uuidof(IDXGIDevice4), (void **)&m_pReal4);
}
WrappedIDXGIDevice3::~WrappedIDXGIDevice3()
WrappedIDXGIDevice4::~WrappedIDXGIDevice4()
{
SAFE_RELEASE(m_pReal1);
SAFE_RELEASE(m_pReal2);
SAFE_RELEASE(m_pReal3);
SAFE_RELEASE(m_pReal4);
SAFE_RELEASE(m_pReal);
SAFE_RELEASE(m_pD3DDevice);
}
HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice3::QueryInterface(REFIID riid, void **ppvObject)
HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice4::QueryInterface(REFIID riid, void **ppvObject)
{
if(m_pD3DDevice->IsDeviceUUID(riid))
{
@@ -603,6 +615,19 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice3::QueryInterface(REFIID riid, void
return E_NOINTERFACE;
}
}
else if(riid == __uuidof(IDXGIDevice4))
{
if(m_pReal4)
{
AddRef();
*ppvObject = (IDXGIDevice4 *)this;
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
else
{
string guid = ToStr::Get(riid);
@@ -612,7 +637,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice3::QueryInterface(REFIID riid, void
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
}
WrappedIDXGIFactory4::WrappedIDXGIFactory4(IDXGIFactory *real)
WrappedIDXGIFactory5::WrappedIDXGIFactory5(IDXGIFactory *real)
: RefCountDXGIObject(real), m_pReal(real), m_iRefcount(1)
{
m_pReal1 = NULL;
@@ -623,18 +648,21 @@ WrappedIDXGIFactory4::WrappedIDXGIFactory4(IDXGIFactory *real)
real->QueryInterface(__uuidof(IDXGIFactory3), (void **)&m_pReal3);
m_pReal4 = NULL;
real->QueryInterface(__uuidof(IDXGIFactory4), (void **)&m_pReal4);
m_pReal5 = NULL;
real->QueryInterface(__uuidof(IDXGIFactory5), (void **)&m_pReal5);
}
WrappedIDXGIFactory4::~WrappedIDXGIFactory4()
WrappedIDXGIFactory5::~WrappedIDXGIFactory5()
{
SAFE_RELEASE(m_pReal1);
SAFE_RELEASE(m_pReal2);
SAFE_RELEASE(m_pReal3);
SAFE_RELEASE(m_pReal4);
SAFE_RELEASE(m_pReal5);
SAFE_RELEASE(m_pReal);
}
HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory4::QueryInterface(REFIID riid, void **ppvObject)
HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory5::QueryInterface(REFIID riid, void **ppvObject)
{
if(riid == __uuidof(IDXGIFactory))
{
@@ -694,6 +722,19 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory4::QueryInterface(REFIID riid, void
return E_NOINTERFACE;
}
}
else if(riid == __uuidof(IDXGIFactory5))
{
if(m_pReal5)
{
AddRef();
*ppvObject = (IDXGIFactory5 *)this;
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
else
{
string guid = ToStr::Get(riid);
@@ -703,7 +744,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory4::QueryInterface(REFIID riid, void
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
}
HRESULT WrappedIDXGIFactory4::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc,
HRESULT WrappedIDXGIFactory5::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc,
IDXGISwapChain **ppSwapChain)
{
ID3DDevice *wrapDevice = GetD3DDevice(pDevice);
@@ -720,7 +761,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN
if(SUCCEEDED(ret))
{
*ppSwapChain =
new WrappedIDXGISwapChain3(*ppSwapChain, pDesc ? pDesc->OutputWindow : NULL, wrapDevice);
new WrappedIDXGISwapChain4(*ppSwapChain, pDesc ? pDesc->OutputWindow : NULL, wrapDevice);
}
return ret;
@@ -731,7 +772,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN
return m_pReal->CreateSwapChain(pDevice, pDesc, ppSwapChain);
}
HRESULT WrappedIDXGIFactory4::CreateSwapChainForHwnd(
HRESULT WrappedIDXGIFactory5::CreateSwapChainForHwnd(
IUnknown *pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1 *pDesc,
const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc, IDXGIOutput *pRestrictToOutput,
IDXGISwapChain1 **ppSwapChain)
@@ -750,7 +791,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForHwnd(
if(SUCCEEDED(ret))
{
*ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, hWnd, wrapDevice);
*ppSwapChain = new WrappedIDXGISwapChain4(*ppSwapChain, hWnd, wrapDevice);
}
return ret;
@@ -764,7 +805,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForHwnd(
ppSwapChain);
}
HRESULT WrappedIDXGIFactory4::CreateSwapChainForCoreWindow(IUnknown *pDevice, IUnknown *pWindow,
HRESULT WrappedIDXGIFactory5::CreateSwapChainForCoreWindow(IUnknown *pDevice, IUnknown *pWindow,
const DXGI_SWAP_CHAIN_DESC1 *pDesc,
IDXGIOutput *pRestrictToOutput,
IDXGISwapChain1 **ppSwapChain)
@@ -785,7 +826,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForCoreWindow(IUnknown *pDevice, IU
{
HWND wnd = NULL;
(*ppSwapChain)->GetHwnd(&wnd);
*ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, wnd, wrapDevice);
*ppSwapChain = new WrappedIDXGISwapChain4(*ppSwapChain, wnd, wrapDevice);
}
return ret;
@@ -799,7 +840,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForCoreWindow(IUnknown *pDevice, IU
ppSwapChain);
}
HRESULT WrappedIDXGIFactory4::CreateSwapChainForComposition(IUnknown *pDevice,
HRESULT WrappedIDXGIFactory5::CreateSwapChainForComposition(IUnknown *pDevice,
const DXGI_SWAP_CHAIN_DESC1 *pDesc,
IDXGIOutput *pRestrictToOutput,
IDXGISwapChain1 **ppSwapChain)
@@ -820,7 +861,7 @@ HRESULT WrappedIDXGIFactory4::CreateSwapChainForComposition(IUnknown *pDevice,
{
HWND wnd = NULL;
(*ppSwapChain)->GetHwnd(&wnd);
*ppSwapChain = new WrappedIDXGISwapChain3(*ppSwapChain, wnd, wrapDevice);
*ppSwapChain = new WrappedIDXGISwapChain4(*ppSwapChain, wnd, wrapDevice);
}
return ret;
+70 -15
View File
@@ -151,7 +151,7 @@ public:
return RefCountDXGIObject::GetParent(riid, ppvObject); \
}
class WrappedIDXGISwapChain3;
class WrappedIDXGISwapChain4;
struct ID3DDevice
{
@@ -167,14 +167,14 @@ struct ID3DDevice
virtual bool IsDeviceUUID(REFIID guid) = 0;
virtual IUnknown *GetDeviceInterface(REFIID guid) = 0;
virtual void FirstFrame(WrappedIDXGISwapChain3 *swapChain) = 0;
virtual void FirstFrame(WrappedIDXGISwapChain4 *swapChain) = 0;
virtual void NewSwapchainBuffer(IUnknown *backbuffer) = 0;
virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain3 *swapChain) = 0;
virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc,
virtual void ReleaseSwapchainResources(WrappedIDXGISwapChain4 *swapChain) = 0;
virtual IUnknown *WrapSwapchainBuffer(WrappedIDXGISwapChain4 *swap, DXGI_SWAP_CHAIN_DESC *swapDesc,
UINT buffer, IUnknown *realSurface) = 0;
virtual HRESULT Present(WrappedIDXGISwapChain3 *swapChain, UINT SyncInterval, UINT Flags) = 0;
virtual HRESULT Present(WrappedIDXGISwapChain4 *swapChain, UINT SyncInterval, UINT Flags) = 0;
};
typedef ID3DDevice *(*D3DDeviceCallback)(IUnknown *dev);
@@ -538,12 +538,13 @@ public:
}
};
class WrappedIDXGISwapChain3 : public IDXGISwapChain3, public RefCountDXGIObject
class WrappedIDXGISwapChain4 : public IDXGISwapChain4, public RefCountDXGIObject
{
IDXGISwapChain *m_pReal;
IDXGISwapChain1 *m_pReal1;
IDXGISwapChain2 *m_pReal2;
IDXGISwapChain3 *m_pReal3;
IDXGISwapChain4 *m_pReal4;
ID3DDevice *m_pDevice;
unsigned int m_iRefcount;
@@ -559,8 +560,8 @@ class WrappedIDXGISwapChain3 : public IDXGISwapChain3, public RefCountDXGIObject
void WrapBuffersAfterResize();
public:
WrappedIDXGISwapChain3(IDXGISwapChain *real, HWND wnd, ID3DDevice *device);
virtual ~WrappedIDXGISwapChain3();
WrappedIDXGISwapChain4(IDXGISwapChain *real, HWND wnd, ID3DDevice *device);
virtual ~WrappedIDXGISwapChain4();
static void RegisterD3DDeviceCallback(D3DDeviceCallback callback)
{
@@ -811,6 +812,20 @@ public:
_In_reads_(BufferCount) const UINT *pCreationNodeMask,
/* [annotation][in] */
_In_reads_(BufferCount) IUnknown *const *ppPresentQueue);
//////////////////////////////
// implement IDXGISwapChain4
virtual HRESULT STDMETHODCALLTYPE SetHDRMetaData(
/* [annotation][in] */
_In_ DXGI_HDR_METADATA_TYPE Type,
/* [annotation][in] */
_In_ UINT Size,
/* [annotation][size_is][in] */
_In_reads_opt_(Size) void *pMetaData)
{
return m_pReal4->SetHDRMetaData(Type, Size, pMetaData);
}
};
class WrappedIDXGIAdapter3 : public IDXGIAdapter3, public RefCountDXGIObject
@@ -932,20 +947,21 @@ public:
}
};
class WrappedIDXGIDevice3 : public IDXGIDevice3, public RefCountDXGIObject
class WrappedIDXGIDevice4 : public IDXGIDevice4, public RefCountDXGIObject
{
IDXGIDevice *m_pReal;
IDXGIDevice1 *m_pReal1;
IDXGIDevice2 *m_pReal2;
IDXGIDevice3 *m_pReal3;
IDXGIDevice4 *m_pReal4;
ID3DDevice *m_pD3DDevice;
public:
WrappedIDXGIDevice3(IDXGIDevice *real, ID3DDevice *d3d);
virtual ~WrappedIDXGIDevice3();
WrappedIDXGIDevice4(IDXGIDevice *real, ID3DDevice *d3d);
virtual ~WrappedIDXGIDevice4();
static const int AllocPoolCount = 4;
ALLOCATE_WITH_WRAPPED_POOL(WrappedIDXGIDevice3, AllocPoolCount);
ALLOCATE_WITH_WRAPPED_POOL(WrappedIDXGIDevice4, AllocPoolCount);
IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY;
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
@@ -1052,20 +1068,47 @@ public:
// implement IDXGIDevice3
virtual void STDMETHODCALLTYPE Trim() { m_pReal3->Trim(); }
//////////////////////////////
// implement IDXGIDevice4
virtual HRESULT STDMETHODCALLTYPE OfferResources1(
/* [annotation][in] */
_In_ UINT NumResources,
/* [annotation][size_is][in] */
_In_reads_(NumResources) IDXGIResource *const *ppResources,
/* [annotation][in] */
_In_ DXGI_OFFER_RESOURCE_PRIORITY Priority,
/* [annotation][in] */
_In_ UINT Flags)
{
return m_pReal4->OfferResources1(NumResources, ppResources, Priority, Flags);
}
virtual HRESULT STDMETHODCALLTYPE ReclaimResources1(
/* [annotation][in] */
_In_ UINT NumResources,
/* [annotation][size_is][in] */
_In_reads_(NumResources) IDXGIResource *const *ppResources,
/* [annotation][size_is][out] */
_Out_writes_all_(NumResources) DXGI_RECLAIM_RESOURCE_RESULTS *pResults)
{
return m_pReal4->ReclaimResources1(NumResources, ppResources, pResults);
}
};
class WrappedIDXGIFactory4 : public IDXGIFactory4, public RefCountDXGIObject
class WrappedIDXGIFactory5 : public IDXGIFactory5, public RefCountDXGIObject
{
IDXGIFactory *m_pReal;
IDXGIFactory1 *m_pReal1;
IDXGIFactory2 *m_pReal2;
IDXGIFactory3 *m_pReal3;
IDXGIFactory4 *m_pReal4;
IDXGIFactory5 *m_pReal5;
unsigned int m_iRefcount;
public:
WrappedIDXGIFactory4(IDXGIFactory *real);
virtual ~WrappedIDXGIFactory4();
WrappedIDXGIFactory5(IDXGIFactory *real);
virtual ~WrappedIDXGIFactory5();
IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY;
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
@@ -1311,4 +1354,16 @@ public:
}
return ret;
}
//////////////////////////////
// implement IDXGIFactory5
virtual HRESULT STDMETHODCALLTYPE
CheckFeatureSupport(DXGI_FEATURE Feature,
/* [annotation] */
_Inout_updates_bytes_(FeatureSupportDataSize) void *pFeatureSupportData,
UINT FeatureSupportDataSize)
{
return m_pReal5->CheckFeatureSupport(Feature, pFeatureSupportData, FeatureSupportDataSize);
}
};