]> git.cworth.org Git - apitrace/blob - retrace/d3dretrace_dxgi.hpp
d3dretrace: Force DWM traces to run on a window.
[apitrace] / retrace / d3dretrace_dxgi.hpp
1 /**************************************************************************
2  *
3  * Copyright 2012 VMware Inc
4  * All Rights Reserved.
5  *
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:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
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
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26 #ifndef _D3DRETRACE_DXGI_HPP_
27 #define _D3DRETRACE_DXGI_HPP_
28
29
30 #include "dxgiint.h"
31
32
33 /*
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.
39  */
40
41
42 #define FORCE_WINDOWED 1
43
44
45 namespace d3dretrace {
46
47
48 class CDXGISwapChainDWM : public IDXGISwapChainDWM
49 {
50 private:
51     IDXGISwapChain *m_pSwapChain;
52
53 public:
54     CDXGISwapChainDWM(IDXGISwapChain *pSwapChain);
55     ~CDXGISwapChainDWM();
56
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);
65
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);
76 };
77
78 CDXGISwapChainDWM::CDXGISwapChainDWM(IDXGISwapChain *pSwapChain) :
79     m_pSwapChain(pSwapChain)
80 {
81 }
82
83 CDXGISwapChainDWM::~CDXGISwapChainDWM()
84 {
85     m_pSwapChain->SetFullscreenState(FALSE, NULL);
86     m_pSwapChain->Release();
87 }
88
89
90 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::QueryInterface(REFIID riid, void **ppvObj)
91 {
92     return m_pSwapChain->QueryInterface(riid, ppvObj);
93 }
94
95 ULONG STDMETHODCALLTYPE CDXGISwapChainDWM::AddRef(void)
96 {
97     // FIXME
98     return 1;
99 }
100
101 ULONG STDMETHODCALLTYPE CDXGISwapChainDWM::Release(void)
102 {
103     // FIXME
104     return 1;
105 }
106
107 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetPrivateData(REFGUID Name, UINT DataSize, const void *pData)
108 {
109     return m_pSwapChain->SetPrivateData(Name, DataSize, pData);
110 }
111
112 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetPrivateDataInterface(REFGUID Name, const IUnknown *pUnknown)
113 {
114     return m_pSwapChain->SetPrivateDataInterface(Name, pUnknown);
115 }
116
117 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetPrivateData(REFGUID Name, UINT *pDataSize, void *pData)
118 {
119     return m_pSwapChain->GetPrivateData(Name, pDataSize, pData);
120 }
121
122 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetParent(REFIID riid, void **ppParent)
123 {
124     return m_pSwapChain->GetParent(riid, ppParent);
125 }
126
127 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetDevice(REFIID riid, void **ppDevice)
128 {
129     return m_pSwapChain->GetDevice(riid, ppDevice);
130 }
131
132
133 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::Present(UINT SyncInterval, UINT Flags)
134 {
135     return m_pSwapChain->Present(SyncInterval, Flags);
136 }
137
138 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetBuffer(UINT Buffer, REFIID riid, void **ppSurface)
139 {
140     return m_pSwapChain->GetBuffer(Buffer, riid, ppSurface);
141 }
142
143 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetDesc(DXGI_SWAP_CHAIN_DESC *pDesc)
144 {
145     return m_pSwapChain->GetDesc(pDesc);
146 }
147
148 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::ResizeBuffers(UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags)
149 {
150     return m_pSwapChain->ResizeBuffers(BufferCount, Width, Height, NewFormat, SwapChainFlags);
151 }
152
153 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::ResizeTarget(const DXGI_MODE_DESC *pNewTargetParameters)
154 {
155     return m_pSwapChain->ResizeTarget(pNewTargetParameters);
156 }
157
158 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetContainingOutput(IDXGIOutput **ppOutput)
159 {
160     return m_pSwapChain->GetContainingOutput(ppOutput);
161 }
162
163 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetFrameStatistics(DXGI_FRAME_STATISTICS *pStats)
164 {
165     return m_pSwapChain->GetFrameStatistics(pStats);
166 }
167
168 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetLastPresentCount(UINT *pLastPresentCount)
169 {
170     return m_pSwapChain->GetLastPresentCount(pLastPresentCount);
171 }
172
173 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetFullscreenState(BOOL Fullscreen, IDXGIOutput *pTarget)
174 {
175     return m_pSwapChain->SetFullscreenState(Fullscreen, pTarget);
176 }
177
178 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetFullscreenState(BOOL *pFullscreen, IDXGIOutput **ppTarget)
179 {
180     return m_pSwapChain->GetFullscreenState(pFullscreen, ppTarget);
181 }
182
183
184
185 class CDXGIFactoryDWM : public IDXGIFactoryDWM
186 {
187 private:
188     IDXGIFactory *m_pFactory;
189
190     ~CDXGIFactoryDWM();
191
192 public:
193     CDXGIFactoryDWM(IDXGIFactory *pFactory);
194
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);
199 };
200
201 CDXGIFactoryDWM::CDXGIFactoryDWM(IDXGIFactory *pFactory) :
202     m_pFactory(pFactory)
203 {}
204
205 CDXGIFactoryDWM::~CDXGIFactoryDWM()
206 {
207     m_pFactory->Release();
208 }
209
210
211 HRESULT STDMETHODCALLTYPE CDXGIFactoryDWM::QueryInterface(REFIID riid, void **ppvObj)
212 {
213     return m_pFactory->QueryInterface(riid, ppvObj);
214 }
215
216 ULONG STDMETHODCALLTYPE CDXGIFactoryDWM::AddRef(void)
217 {
218     // FIXME
219     return 1;
220 }
221
222 ULONG STDMETHODCALLTYPE CDXGIFactoryDWM::Release(void)
223 {
224     // FIXME
225     return 1;
226 }
227
228 HRESULT STDMETHODCALLTYPE CDXGIFactoryDWM::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, IDXGISwapChainDWM **ppSwapChain)
229 {
230     IDXGISwapChain *pSwapChain = NULL;
231     if (FORCE_WINDOWED) {
232         pDesc->Windowed = TRUE;
233     }
234     HRESULT hr = m_pFactory->CreateSwapChain(pDevice, pDesc, &pSwapChain);
235     if (SUCCEEDED(hr)) {
236         if (!FORCE_WINDOWED) {
237             pSwapChain->SetFullscreenState(TRUE, pOutput);
238         }
239         *ppSwapChain = new CDXGISwapChainDWM(pSwapChain);
240     }
241     return hr;
242 }
243
244
245
246 } /* namespace d3dretrace */
247
248
249 #endif /* _D3DRETRACE_DXGI_HPP_ */