]> git.cworth.org Git - apitrace/blob - retrace/d3dretrace_dxgi.hpp
Get DWM traces working.
[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 namespace d3dretrace {
43
44
45 class CDXGISwapChainDWM : public IDXGISwapChainDWM
46 {
47 private:
48     IDXGISwapChain *m_pSwapChain;
49
50 public:
51     CDXGISwapChainDWM(IDXGISwapChain *pSwapChain);
52     ~CDXGISwapChainDWM();
53
54     HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObj);
55     ULONG STDMETHODCALLTYPE AddRef(void);
56     ULONG STDMETHODCALLTYPE Release(void);
57     HRESULT STDMETHODCALLTYPE SetPrivateData(REFGUID Name, UINT DataSize, const void *pData);
58     HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(REFGUID Name, const IUnknown *pUnknown);
59     HRESULT STDMETHODCALLTYPE GetPrivateData(REFGUID Name, UINT *pDataSize, void *pData);
60     HRESULT STDMETHODCALLTYPE GetParent(REFIID riid, void **ppParent);
61     HRESULT STDMETHODCALLTYPE GetDevice(REFIID riid, void **ppDevice);
62
63     HRESULT STDMETHODCALLTYPE Present(UINT SyncInterval, UINT Flags);
64     HRESULT STDMETHODCALLTYPE GetBuffer(UINT Buffer, REFIID riid, void **ppSurface);
65     HRESULT STDMETHODCALLTYPE GetDesc(DXGI_SWAP_CHAIN_DESC *pDesc);
66     HRESULT STDMETHODCALLTYPE ResizeBuffers(UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags);
67     HRESULT STDMETHODCALLTYPE ResizeTarget(const DXGI_MODE_DESC *pNewTargetParameters);
68     HRESULT STDMETHODCALLTYPE GetContainingOutput(IDXGIOutput **ppOutput);
69     HRESULT STDMETHODCALLTYPE GetFrameStatistics(DXGI_FRAME_STATISTICS *pStats);
70     HRESULT STDMETHODCALLTYPE GetLastPresentCount(UINT *pLastPresentCount);
71     HRESULT STDMETHODCALLTYPE SetFullscreenState(BOOL Fullscreen, IDXGIOutput *pTarget);
72     HRESULT STDMETHODCALLTYPE GetFullscreenState(BOOL *pFullscreen, IDXGIOutput **ppTarget);
73 };
74
75 CDXGISwapChainDWM::CDXGISwapChainDWM(IDXGISwapChain *pSwapChain) :
76     m_pSwapChain(pSwapChain)
77 {
78 }
79
80 CDXGISwapChainDWM::~CDXGISwapChainDWM()
81 {
82     m_pSwapChain->SetFullscreenState(FALSE, NULL);
83     m_pSwapChain->Release();
84 }
85
86
87 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::QueryInterface(REFIID riid, void **ppvObj)
88 {
89     return m_pSwapChain->QueryInterface(riid, ppvObj);
90 }
91
92 ULONG STDMETHODCALLTYPE CDXGISwapChainDWM::AddRef(void)
93 {
94     // FIXME
95     return 1;
96 }
97
98 ULONG STDMETHODCALLTYPE CDXGISwapChainDWM::Release(void)
99 {
100     // FIXME
101     return 1;
102 }
103
104 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetPrivateData(REFGUID Name, UINT DataSize, const void *pData)
105 {
106     return m_pSwapChain->SetPrivateData(Name, DataSize, pData);
107 }
108
109 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetPrivateDataInterface(REFGUID Name, const IUnknown *pUnknown)
110 {
111     return m_pSwapChain->SetPrivateDataInterface(Name, pUnknown);
112 }
113
114 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetPrivateData(REFGUID Name, UINT *pDataSize, void *pData)
115 {
116     return m_pSwapChain->GetPrivateData(Name, pDataSize, pData);
117 }
118
119 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetParent(REFIID riid, void **ppParent)
120 {
121     return m_pSwapChain->GetParent(riid, ppParent);
122 }
123
124 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetDevice(REFIID riid, void **ppDevice)
125 {
126     return m_pSwapChain->GetDevice(riid, ppDevice);
127 }
128
129
130 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::Present(UINT SyncInterval, UINT Flags)
131 {
132     return m_pSwapChain->Present(SyncInterval, Flags);
133 }
134
135 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetBuffer(UINT Buffer, REFIID riid, void **ppSurface)
136 {
137     return m_pSwapChain->GetBuffer(Buffer, riid, ppSurface);
138 }
139
140 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetDesc(DXGI_SWAP_CHAIN_DESC *pDesc)
141 {
142     return m_pSwapChain->GetDesc(pDesc);
143 }
144
145 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::ResizeBuffers(UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags)
146 {
147     return m_pSwapChain->ResizeBuffers(BufferCount, Width, Height, NewFormat, SwapChainFlags);
148 }
149
150 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::ResizeTarget(const DXGI_MODE_DESC *pNewTargetParameters)
151 {
152     return m_pSwapChain->ResizeTarget(pNewTargetParameters);
153 }
154
155 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetContainingOutput(IDXGIOutput **ppOutput)
156 {
157     return m_pSwapChain->GetContainingOutput(ppOutput);
158 }
159
160 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetFrameStatistics(DXGI_FRAME_STATISTICS *pStats)
161 {
162     return m_pSwapChain->GetFrameStatistics(pStats);
163 }
164
165 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetLastPresentCount(UINT *pLastPresentCount)
166 {
167     return m_pSwapChain->GetLastPresentCount(pLastPresentCount);
168 }
169
170 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::SetFullscreenState(BOOL Fullscreen, IDXGIOutput *pTarget)
171 {
172     return m_pSwapChain->SetFullscreenState(Fullscreen, pTarget);
173 }
174
175 HRESULT STDMETHODCALLTYPE CDXGISwapChainDWM::GetFullscreenState(BOOL *pFullscreen, IDXGIOutput **ppTarget)
176 {
177     return m_pSwapChain->GetFullscreenState(pFullscreen, ppTarget);
178 }
179
180
181
182 class CDXGIFactoryDWM : public IDXGIFactoryDWM
183 {
184 private:
185     IDXGIFactory *m_pFactory;
186
187     ~CDXGIFactoryDWM();
188
189 public:
190     CDXGIFactoryDWM(IDXGIFactory *pFactory);
191
192     HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObj);
193     ULONG STDMETHODCALLTYPE AddRef(void);
194     ULONG STDMETHODCALLTYPE Release(void);
195     HRESULT STDMETHODCALLTYPE CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, IDXGISwapChainDWM **ppSwapChain);
196 };
197
198 CDXGIFactoryDWM::CDXGIFactoryDWM(IDXGIFactory *pFactory) :
199     m_pFactory(pFactory)
200 {}
201
202 CDXGIFactoryDWM::~CDXGIFactoryDWM()
203 {
204     m_pFactory->Release();
205 }
206
207
208 HRESULT STDMETHODCALLTYPE CDXGIFactoryDWM::QueryInterface(REFIID riid, void **ppvObj)
209 {
210     return m_pFactory->QueryInterface(riid, ppvObj);
211 }
212
213 ULONG STDMETHODCALLTYPE CDXGIFactoryDWM::AddRef(void)
214 {
215     // FIXME
216     return 1;
217 }
218
219 ULONG STDMETHODCALLTYPE CDXGIFactoryDWM::Release(void)
220 {
221     // FIXME
222     return 1;
223 }
224
225 HRESULT STDMETHODCALLTYPE CDXGIFactoryDWM::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, IDXGISwapChainDWM **ppSwapChain)
226 {
227     IDXGISwapChain *pSwapChain = NULL;
228     HRESULT hr = m_pFactory->CreateSwapChain(pDevice, pDesc, &pSwapChain);
229     if (SUCCEEDED(hr)) {
230         pSwapChain->SetFullscreenState(TRUE, pOutput);
231         *ppSwapChain = new CDXGISwapChainDWM(pSwapChain);
232     }
233     return hr;
234 }
235
236
237
238 } /* namespace d3dretrace */
239
240
241 #endif /* _D3DRETRACE_DXGI_HPP_ */