1 /**************************************************************************
3 * Copyright 2012 VMware Inc
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 **************************************************************************/
26 #ifndef _D3DRETRACE_DXGI_HPP_
27 #define _D3DRETRACE_DXGI_HPP_
34 * This module implements the IDXGIFactoryDWM and IDXGISwapChainDWM
35 * undocumented interfaces used by DWM, in terms of the standard IDXGIFactory
36 * and IDXGISwapChain interfaces, just for sake of d3dretrace. Retracing on
37 * top of the undocumented interfaces works, but it may interfere with running
38 * DWM and causes corruption of the desktop upon exit.
42 #define FORCE_WINDOWED 1
45 namespace d3dretrace {
48 class CDXGISwapChainDWM : public IDXGISwapChainDWM
51 IDXGISwapChain *m_pSwapChain;
54 CDXGISwapChainDWM(IDXGISwapChain *pSwapChain);
57 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObj);
58 ULONG STDMETHODCALLTYPE AddRef(void);
59 ULONG STDMETHODCALLTYPE Release(void);
60 HRESULT STDMETHODCALLTYPE SetPrivateData(REFGUID Name, UINT DataSize, const void *pData);
61 HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(REFGUID Name, const IUnknown *pUnknown);
62 HRESULT STDMETHODCALLTYPE GetPrivateData(REFGUID Name, UINT *pDataSize, void *pData);
63 HRESULT STDMETHODCALLTYPE GetParent(REFIID riid, void **ppParent);
64 HRESULT STDMETHODCALLTYPE GetDevice(REFIID riid, void **ppDevice);
66 HRESULT STDMETHODCALLTYPE Present(UINT SyncInterval, UINT Flags);
67 HRESULT STDMETHODCALLTYPE GetBuffer(UINT Buffer, REFIID riid, void **ppSurface);
68 HRESULT STDMETHODCALLTYPE GetDesc(DXGI_SWAP_CHAIN_DESC *pDesc);
69 HRESULT STDMETHODCALLTYPE ResizeBuffers(UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags);
70 HRESULT STDMETHODCALLTYPE ResizeTarget(const DXGI_MODE_DESC *pNewTargetParameters);
71 HRESULT STDMETHODCALLTYPE GetContainingOutput(IDXGIOutput **ppOutput);
72 HRESULT STDMETHODCALLTYPE GetFrameStatistics(DXGI_FRAME_STATISTICS *pStats);
73 HRESULT STDMETHODCALLTYPE GetLastPresentCount(UINT *pLastPresentCount);
74 HRESULT STDMETHODCALLTYPE SetFullscreenState(BOOL Fullscreen, IDXGIOutput *pTarget);
75 HRESULT STDMETHODCALLTYPE GetFullscreenState(BOOL *pFullscreen, IDXGIOutput **ppTarget);
78 CDXGISwapChainDWM::CDXGISwapChainDWM(IDXGISwapChain *pSwapChain) :
79 m_pSwapChain(pSwapChain)
83 CDXGISwapChainDWM::~CDXGISwapChainDWM()
85 m_pSwapChain->SetFullscreenState(FALSE, NULL);
86 m_pSwapChain->Release();
90 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::QueryInterface(REFIID riid, void **ppvObj)
92 return m_pSwapChain->QueryInterface(riid, ppvObj);
95 ULONG STDMETHODCALLTYPE CDXGISwapChainDWM::AddRef(void)
101 ULONG STDMETHODCALLTYPE CDXGISwapChainDWM::Release(void)
107 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetPrivateData(REFGUID Name, UINT DataSize, const void *pData)
109 return m_pSwapChain->SetPrivateData(Name, DataSize, pData);
112 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetPrivateDataInterface(REFGUID Name, const IUnknown *pUnknown)
114 return m_pSwapChain->SetPrivateDataInterface(Name, pUnknown);
117 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetPrivateData(REFGUID Name, UINT *pDataSize, void *pData)
119 return m_pSwapChain->GetPrivateData(Name, pDataSize, pData);
122 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetParent(REFIID riid, void **ppParent)
124 return m_pSwapChain->GetParent(riid, ppParent);
127 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetDevice(REFIID riid, void **ppDevice)
129 return m_pSwapChain->GetDevice(riid, ppDevice);
133 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::Present(UINT SyncInterval, UINT Flags)
135 return m_pSwapChain->Present(SyncInterval, Flags);
138 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetBuffer(UINT Buffer, REFIID riid, void **ppSurface)
140 return m_pSwapChain->GetBuffer(Buffer, riid, ppSurface);
143 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetDesc(DXGI_SWAP_CHAIN_DESC *pDesc)
145 return m_pSwapChain->GetDesc(pDesc);
148 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::ResizeBuffers(UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags)
150 return m_pSwapChain->ResizeBuffers(BufferCount, Width, Height, NewFormat, SwapChainFlags);
153 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::ResizeTarget(const DXGI_MODE_DESC *pNewTargetParameters)
155 return m_pSwapChain->ResizeTarget(pNewTargetParameters);
158 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetContainingOutput(IDXGIOutput **ppOutput)
160 return m_pSwapChain->GetContainingOutput(ppOutput);
163 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetFrameStatistics(DXGI_FRAME_STATISTICS *pStats)
165 return m_pSwapChain->GetFrameStatistics(pStats);
168 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetLastPresentCount(UINT *pLastPresentCount)
170 return m_pSwapChain->GetLastPresentCount(pLastPresentCount);
173 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetFullscreenState(BOOL Fullscreen, IDXGIOutput *pTarget)
175 return m_pSwapChain->SetFullscreenState(Fullscreen, pTarget);
178 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetFullscreenState(BOOL *pFullscreen, IDXGIOutput **ppTarget)
180 return m_pSwapChain->GetFullscreenState(pFullscreen, ppTarget);
185 class CDXGIFactoryDWM : public IDXGIFactoryDWM
188 IDXGIFactory *m_pFactory;
193 CDXGIFactoryDWM(IDXGIFactory *pFactory);
195 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObj);
196 ULONG STDMETHODCALLTYPE AddRef(void);
197 ULONG STDMETHODCALLTYPE Release(void);
198 HRESULT STDMETHODCALLTYPE CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, IDXGISwapChainDWM **ppSwapChain);
201 CDXGIFactoryDWM::CDXGIFactoryDWM(IDXGIFactory *pFactory) :
205 CDXGIFactoryDWM::~CDXGIFactoryDWM()
207 m_pFactory->Release();
211 HRESULT STDMETHODCALLTYPE CDXGIFactoryDWM::QueryInterface(REFIID riid, void **ppvObj)
213 return m_pFactory->QueryInterface(riid, ppvObj);
216 ULONG STDMETHODCALLTYPE CDXGIFactoryDWM::AddRef(void)
222 ULONG STDMETHODCALLTYPE CDXGIFactoryDWM::Release(void)
228 HRESULT STDMETHODCALLTYPE CDXGIFactoryDWM::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, IDXGISwapChainDWM **ppSwapChain)
230 IDXGISwapChain *pSwapChain = NULL;
231 if (FORCE_WINDOWED) {
232 pDesc->Windowed = TRUE;
234 HRESULT hr = m_pFactory->CreateSwapChain(pDevice, pDesc, &pSwapChain);
236 if (!FORCE_WINDOWED) {
237 pSwapChain->SetFullscreenState(TRUE, pOutput);
239 *ppSwapChain = new CDXGISwapChainDWM(pSwapChain);
246 } /* namespace d3dretrace */
249 #endif /* _D3DRETRACE_DXGI_HPP_ */