Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Demos / DX11ClothDemo / DXUT / Core / DXUTmisc.cpp
1 //--------------------------------------------------------------------------------------\r
2 // File: DXUTMisc.cpp\r
3 //\r
4 // Shortcut macros and functions for using DX objects\r
5 //\r
6 // Copyright (c) Microsoft Corporation. All rights reserved\r
7 //--------------------------------------------------------------------------------------\r
8 #include "dxut.h"\r
9 #include <xinput.h>\r
10 #define DXUT_GAMEPAD_TRIGGER_THRESHOLD      30\r
11 #undef min // use __min instead\r
12 #undef max // use __max instead\r
13 \r
14 CDXUTTimer* WINAPI DXUTGetGlobalTimer()\r
15 {\r
16     // Using an accessor function gives control of the construction order\r
17     static CDXUTTimer timer;\r
18     return &timer;\r
19 }\r
20 \r
21 \r
22 //--------------------------------------------------------------------------------------\r
23 CDXUTTimer::CDXUTTimer()\r
24 {\r
25     m_bTimerStopped = true;\r
26     m_llQPFTicksPerSec = 0;\r
27 \r
28     m_llStopTime = 0;\r
29     m_llLastElapsedTime = 0;\r
30     m_llBaseTime = 0;\r
31 \r
32     // Use QueryPerformanceFrequency to get the frequency of the counter\r
33     LARGE_INTEGER qwTicksPerSec = { 0 };\r
34     QueryPerformanceFrequency( &qwTicksPerSec );\r
35     m_llQPFTicksPerSec = qwTicksPerSec.QuadPart;\r
36 }\r
37 \r
38 \r
39 //--------------------------------------------------------------------------------------\r
40 void CDXUTTimer::Reset()\r
41 {\r
42     LARGE_INTEGER qwTime = GetAdjustedCurrentTime();\r
43 \r
44     m_llBaseTime = qwTime.QuadPart;\r
45     m_llLastElapsedTime = qwTime.QuadPart;\r
46     m_llStopTime = 0;\r
47     m_bTimerStopped = FALSE;\r
48 }\r
49 \r
50 \r
51 //--------------------------------------------------------------------------------------\r
52 void CDXUTTimer::Start()\r
53 {\r
54     // Get the current time\r
55     LARGE_INTEGER qwTime = { 0 };\r
56     QueryPerformanceCounter( &qwTime );\r
57 \r
58     if( m_bTimerStopped )\r
59         m_llBaseTime += qwTime.QuadPart - m_llStopTime;\r
60     m_llStopTime = 0;\r
61     m_llLastElapsedTime = qwTime.QuadPart;\r
62     m_bTimerStopped = FALSE;\r
63 }\r
64 \r
65 \r
66 //--------------------------------------------------------------------------------------\r
67 void CDXUTTimer::Stop()\r
68 {\r
69     if( !m_bTimerStopped )\r
70     {\r
71         LARGE_INTEGER qwTime = { 0 };\r
72         QueryPerformanceCounter( &qwTime );\r
73         m_llStopTime = qwTime.QuadPart;\r
74         m_llLastElapsedTime = qwTime.QuadPart;\r
75         m_bTimerStopped = TRUE;\r
76     }\r
77 }\r
78 \r
79 \r
80 //--------------------------------------------------------------------------------------\r
81 void CDXUTTimer::Advance()\r
82 {\r
83     m_llStopTime += m_llQPFTicksPerSec / 10;\r
84 }\r
85 \r
86 \r
87 //--------------------------------------------------------------------------------------\r
88 double CDXUTTimer::GetAbsoluteTime()\r
89 {\r
90     LARGE_INTEGER qwTime = { 0 };\r
91     QueryPerformanceCounter( &qwTime );\r
92 \r
93     double fTime = qwTime.QuadPart / ( double )m_llQPFTicksPerSec;\r
94 \r
95     return fTime;\r
96 }\r
97 \r
98 \r
99 //--------------------------------------------------------------------------------------\r
100 double CDXUTTimer::GetTime()\r
101 {\r
102     LARGE_INTEGER qwTime = GetAdjustedCurrentTime();\r
103 \r
104     double fAppTime = ( double )( qwTime.QuadPart - m_llBaseTime ) / ( double )m_llQPFTicksPerSec;\r
105 \r
106     return fAppTime;\r
107 }\r
108 \r
109 \r
110 //--------------------------------------------------------------------------------------\r
111 void CDXUTTimer::GetTimeValues( double* pfTime, double* pfAbsoluteTime, float* pfElapsedTime )\r
112 {\r
113     assert( pfTime && pfAbsoluteTime && pfElapsedTime );\r
114 \r
115     LARGE_INTEGER qwTime = GetAdjustedCurrentTime();\r
116 \r
117     float fElapsedTime = (float) ((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec);\r
118     m_llLastElapsedTime = qwTime.QuadPart;\r
119 \r
120     // Clamp the timer to non-negative values to ensure the timer is accurate.\r
121     // fElapsedTime can be outside this range if processor goes into a \r
122     // power save mode or we somehow get shuffled to another processor.  \r
123     // However, the main thread should call SetThreadAffinityMask to ensure that \r
124     // we don't get shuffled to another processor.  Other worker threads should NOT call \r
125     // SetThreadAffinityMask, but use a shared copy of the timer data gathered from \r
126     // the main thread.\r
127     if( fElapsedTime < 0.0f )\r
128         fElapsedTime = 0.0f;\r
129 \r
130     *pfAbsoluteTime = qwTime.QuadPart / ( double )m_llQPFTicksPerSec;\r
131     *pfTime = ( qwTime.QuadPart - m_llBaseTime ) / ( double )m_llQPFTicksPerSec;\r
132     *pfElapsedTime = fElapsedTime;\r
133 }\r
134 \r
135 \r
136 //--------------------------------------------------------------------------------------\r
137 float CDXUTTimer::GetElapsedTime()\r
138 {\r
139     LARGE_INTEGER qwTime = GetAdjustedCurrentTime();\r
140 \r
141     double fElapsedTime = (float) ((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec);\r
142     m_llLastElapsedTime = qwTime.QuadPart;\r
143 \r
144     // See the explanation about clamping in CDXUTTimer::GetTimeValues()\r
145     if( fElapsedTime < 0.0f )\r
146         fElapsedTime = 0.0f;\r
147 \r
148     return ( float )fElapsedTime;\r
149 }\r
150 \r
151 \r
152 //--------------------------------------------------------------------------------------\r
153 // If stopped, returns time when stopped otherwise returns current time\r
154 //--------------------------------------------------------------------------------------\r
155 LARGE_INTEGER CDXUTTimer::GetAdjustedCurrentTime()\r
156 {\r
157     LARGE_INTEGER qwTime;\r
158     if( m_llStopTime != 0 )\r
159         qwTime.QuadPart = m_llStopTime;\r
160     else\r
161         QueryPerformanceCounter( &qwTime );\r
162     return qwTime;\r
163 }\r
164 \r
165 //--------------------------------------------------------------------------------------\r
166 bool CDXUTTimer::IsStopped()\r
167 {\r
168     return m_bTimerStopped;\r
169 }\r
170 \r
171 //--------------------------------------------------------------------------------------\r
172 // Limit the current thread to one processor (the current one). This ensures that timing code \r
173 // runs on only one processor, and will not suffer any ill effects from power management.\r
174 // See "Game Timing and Multicore Processors" for more details\r
175 //--------------------------------------------------------------------------------------\r
176 void CDXUTTimer::LimitThreadAffinityToCurrentProc()\r
177 {\r
178     HANDLE hCurrentProcess = GetCurrentProcess();\r
179 \r
180     // Get the processor affinity mask for this process\r
181     DWORD_PTR dwProcessAffinityMask = 0;\r
182     DWORD_PTR dwSystemAffinityMask = 0;\r
183 \r
184     if( GetProcessAffinityMask( hCurrentProcess, &dwProcessAffinityMask, &dwSystemAffinityMask ) != 0 &&\r
185         dwProcessAffinityMask )\r
186     {\r
187         // Find the lowest processor that our process is allows to run against\r
188         DWORD_PTR dwAffinityMask = ( dwProcessAffinityMask & ( ( ~dwProcessAffinityMask ) + 1 ) );\r
189 \r
190         // Set this as the processor that our thread must always run against\r
191         // This must be a subset of the process affinity mask\r
192         HANDLE hCurrentThread = GetCurrentThread();\r
193         if( INVALID_HANDLE_VALUE != hCurrentThread )\r
194         {\r
195             SetThreadAffinityMask( hCurrentThread, dwAffinityMask );\r
196             CloseHandle( hCurrentThread );\r
197         }\r
198     }\r
199 \r
200     CloseHandle( hCurrentProcess );\r
201 }\r
202 \r
203 \r
204 //--------------------------------------------------------------------------------------\r
205 // Returns the string for the given D3DFORMAT.\r
206 //--------------------------------------------------------------------------------------\r
207 LPCWSTR WINAPI DXUTD3DFormatToString( D3DFORMAT format, bool bWithPrefix )\r
208 {\r
209     WCHAR* pstr = NULL;\r
210     switch( format )\r
211     {\r
212         case D3DFMT_UNKNOWN:\r
213             pstr = L"D3DFMT_UNKNOWN"; break;\r
214         case D3DFMT_R8G8B8:\r
215             pstr = L"D3DFMT_R8G8B8"; break;\r
216         case D3DFMT_A8R8G8B8:\r
217             pstr = L"D3DFMT_A8R8G8B8"; break;\r
218         case D3DFMT_X8R8G8B8:\r
219             pstr = L"D3DFMT_X8R8G8B8"; break;\r
220         case D3DFMT_R5G6B5:\r
221             pstr = L"D3DFMT_R5G6B5"; break;\r
222         case D3DFMT_X1R5G5B5:\r
223             pstr = L"D3DFMT_X1R5G5B5"; break;\r
224         case D3DFMT_A1R5G5B5:\r
225             pstr = L"D3DFMT_A1R5G5B5"; break;\r
226         case D3DFMT_A4R4G4B4:\r
227             pstr = L"D3DFMT_A4R4G4B4"; break;\r
228         case D3DFMT_R3G3B2:\r
229             pstr = L"D3DFMT_R3G3B2"; break;\r
230         case D3DFMT_A8:\r
231             pstr = L"D3DFMT_A8"; break;\r
232         case D3DFMT_A8R3G3B2:\r
233             pstr = L"D3DFMT_A8R3G3B2"; break;\r
234         case D3DFMT_X4R4G4B4:\r
235             pstr = L"D3DFMT_X4R4G4B4"; break;\r
236         case D3DFMT_A2B10G10R10:\r
237             pstr = L"D3DFMT_A2B10G10R10"; break;\r
238         case D3DFMT_A8B8G8R8:\r
239             pstr = L"D3DFMT_A8B8G8R8"; break;\r
240         case D3DFMT_X8B8G8R8:\r
241             pstr = L"D3DFMT_X8B8G8R8"; break;\r
242         case D3DFMT_G16R16:\r
243             pstr = L"D3DFMT_G16R16"; break;\r
244         case D3DFMT_A2R10G10B10:\r
245             pstr = L"D3DFMT_A2R10G10B10"; break;\r
246         case D3DFMT_A16B16G16R16:\r
247             pstr = L"D3DFMT_A16B16G16R16"; break;\r
248         case D3DFMT_A8P8:\r
249             pstr = L"D3DFMT_A8P8"; break;\r
250         case D3DFMT_P8:\r
251             pstr = L"D3DFMT_P8"; break;\r
252         case D3DFMT_L8:\r
253             pstr = L"D3DFMT_L8"; break;\r
254         case D3DFMT_A8L8:\r
255             pstr = L"D3DFMT_A8L8"; break;\r
256         case D3DFMT_A4L4:\r
257             pstr = L"D3DFMT_A4L4"; break;\r
258         case D3DFMT_V8U8:\r
259             pstr = L"D3DFMT_V8U8"; break;\r
260         case D3DFMT_L6V5U5:\r
261             pstr = L"D3DFMT_L6V5U5"; break;\r
262         case D3DFMT_X8L8V8U8:\r
263             pstr = L"D3DFMT_X8L8V8U8"; break;\r
264         case D3DFMT_Q8W8V8U8:\r
265             pstr = L"D3DFMT_Q8W8V8U8"; break;\r
266         case D3DFMT_V16U16:\r
267             pstr = L"D3DFMT_V16U16"; break;\r
268         case D3DFMT_A2W10V10U10:\r
269             pstr = L"D3DFMT_A2W10V10U10"; break;\r
270         case D3DFMT_UYVY:\r
271             pstr = L"D3DFMT_UYVY"; break;\r
272         case D3DFMT_YUY2:\r
273             pstr = L"D3DFMT_YUY2"; break;\r
274         case D3DFMT_DXT1:\r
275             pstr = L"D3DFMT_DXT1"; break;\r
276         case D3DFMT_DXT2:\r
277             pstr = L"D3DFMT_DXT2"; break;\r
278         case D3DFMT_DXT3:\r
279             pstr = L"D3DFMT_DXT3"; break;\r
280         case D3DFMT_DXT4:\r
281             pstr = L"D3DFMT_DXT4"; break;\r
282         case D3DFMT_DXT5:\r
283             pstr = L"D3DFMT_DXT5"; break;\r
284         case D3DFMT_D16_LOCKABLE:\r
285             pstr = L"D3DFMT_D16_LOCKABLE"; break;\r
286         case D3DFMT_D32:\r
287             pstr = L"D3DFMT_D32"; break;\r
288         case D3DFMT_D15S1:\r
289             pstr = L"D3DFMT_D15S1"; break;\r
290         case D3DFMT_D24S8:\r
291             pstr = L"D3DFMT_D24S8"; break;\r
292         case D3DFMT_D24X8:\r
293             pstr = L"D3DFMT_D24X8"; break;\r
294         case D3DFMT_D24X4S4:\r
295             pstr = L"D3DFMT_D24X4S4"; break;\r
296         case D3DFMT_D16:\r
297             pstr = L"D3DFMT_D16"; break;\r
298         case D3DFMT_L16:\r
299             pstr = L"D3DFMT_L16"; break;\r
300         case D3DFMT_VERTEXDATA:\r
301             pstr = L"D3DFMT_VERTEXDATA"; break;\r
302         case D3DFMT_INDEX16:\r
303             pstr = L"D3DFMT_INDEX16"; break;\r
304         case D3DFMT_INDEX32:\r
305             pstr = L"D3DFMT_INDEX32"; break;\r
306         case D3DFMT_Q16W16V16U16:\r
307             pstr = L"D3DFMT_Q16W16V16U16"; break;\r
308         case D3DFMT_MULTI2_ARGB8:\r
309             pstr = L"D3DFMT_MULTI2_ARGB8"; break;\r
310         case D3DFMT_R16F:\r
311             pstr = L"D3DFMT_R16F"; break;\r
312         case D3DFMT_G16R16F:\r
313             pstr = L"D3DFMT_G16R16F"; break;\r
314         case D3DFMT_A16B16G16R16F:\r
315             pstr = L"D3DFMT_A16B16G16R16F"; break;\r
316         case D3DFMT_R32F:\r
317             pstr = L"D3DFMT_R32F"; break;\r
318         case D3DFMT_G32R32F:\r
319             pstr = L"D3DFMT_G32R32F"; break;\r
320         case D3DFMT_A32B32G32R32F:\r
321             pstr = L"D3DFMT_A32B32G32R32F"; break;\r
322         case D3DFMT_CxV8U8:\r
323             pstr = L"D3DFMT_CxV8U8"; break;\r
324         default:\r
325             pstr = L"Unknown format"; break;\r
326     }\r
327     if( bWithPrefix || wcsstr( pstr, L"D3DFMT_" ) == NULL )\r
328         return pstr;\r
329     else\r
330         return pstr + lstrlen( L"D3DFMT_" );\r
331 }\r
332 \r
333 \r
334 //--------------------------------------------------------------------------------------\r
335 // Returns the string for the given DXGI_FORMAT.\r
336 //--------------------------------------------------------------------------------------\r
337 LPCWSTR WINAPI DXUTDXGIFormatToString( DXGI_FORMAT format, bool bWithPrefix )\r
338 {\r
339     WCHAR* pstr = NULL;\r
340     switch( format )\r
341     {\r
342         case DXGI_FORMAT_R32G32B32A32_TYPELESS:\r
343             pstr = L"DXGI_FORMAT_R32G32B32A32_TYPELESS"; break;\r
344         case DXGI_FORMAT_R32G32B32A32_FLOAT:\r
345             pstr = L"DXGI_FORMAT_R32G32B32A32_FLOAT"; break;\r
346         case DXGI_FORMAT_R32G32B32A32_UINT:\r
347             pstr = L"DXGI_FORMAT_R32G32B32A32_UINT"; break;\r
348         case DXGI_FORMAT_R32G32B32A32_SINT:\r
349             pstr = L"DXGI_FORMAT_R32G32B32A32_SINT"; break;\r
350         case DXGI_FORMAT_R32G32B32_TYPELESS:\r
351             pstr = L"DXGI_FORMAT_R32G32B32_TYPELESS"; break;\r
352         case DXGI_FORMAT_R32G32B32_FLOAT:\r
353             pstr = L"DXGI_FORMAT_R32G32B32_FLOAT"; break;\r
354         case DXGI_FORMAT_R32G32B32_UINT:\r
355             pstr = L"DXGI_FORMAT_R32G32B32_UINT"; break;\r
356         case DXGI_FORMAT_R32G32B32_SINT:\r
357             pstr = L"DXGI_FORMAT_R32G32B32_SINT"; break;\r
358         case DXGI_FORMAT_R16G16B16A16_TYPELESS:\r
359             pstr = L"DXGI_FORMAT_R16G16B16A16_TYPELESS"; break;\r
360         case DXGI_FORMAT_R16G16B16A16_FLOAT:\r
361             pstr = L"DXGI_FORMAT_R16G16B16A16_FLOAT"; break;\r
362         case DXGI_FORMAT_R16G16B16A16_UNORM:\r
363             pstr = L"DXGI_FORMAT_R16G16B16A16_UNORM"; break;\r
364         case DXGI_FORMAT_R16G16B16A16_UINT:\r
365             pstr = L"DXGI_FORMAT_R16G16B16A16_UINT"; break;\r
366         case DXGI_FORMAT_R16G16B16A16_SNORM:\r
367             pstr = L"DXGI_FORMAT_R16G16B16A16_SNORM"; break;\r
368         case DXGI_FORMAT_R16G16B16A16_SINT:\r
369             pstr = L"DXGI_FORMAT_R16G16B16A16_SINT"; break;\r
370         case DXGI_FORMAT_R32G32_TYPELESS:\r
371             pstr = L"DXGI_FORMAT_R32G32_TYPELESS"; break;\r
372         case DXGI_FORMAT_R32G32_FLOAT:\r
373             pstr = L"DXGI_FORMAT_R32G32_FLOAT"; break;\r
374         case DXGI_FORMAT_R32G32_UINT:\r
375             pstr = L"DXGI_FORMAT_R32G32_UINT"; break;\r
376         case DXGI_FORMAT_R32G32_SINT:\r
377             pstr = L"DXGI_FORMAT_R32G32_SINT"; break;\r
378         case DXGI_FORMAT_R32G8X24_TYPELESS:\r
379             pstr = L"DXGI_FORMAT_R32G8X24_TYPELESS"; break;\r
380         case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:\r
381             pstr = L"DXGI_FORMAT_D32_FLOAT_S8X24_UINT"; break;\r
382         case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:\r
383             pstr = L"DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS"; break;\r
384         case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:\r
385             pstr = L"DXGI_FORMAT_X32_TYPELESS_G8X24_UINT"; break;\r
386         case DXGI_FORMAT_R10G10B10A2_TYPELESS:\r
387             pstr = L"DXGI_FORMAT_R10G10B10A2_TYPELESS"; break;\r
388         case DXGI_FORMAT_R10G10B10A2_UNORM:\r
389             pstr = L"DXGI_FORMAT_R10G10B10A2_UNORM"; break;\r
390         case DXGI_FORMAT_R10G10B10A2_UINT:\r
391             pstr = L"DXGI_FORMAT_R10G10B10A2_UINT"; break;\r
392         case DXGI_FORMAT_R11G11B10_FLOAT:\r
393             pstr = L"DXGI_FORMAT_R11G11B10_FLOAT"; break;\r
394         case DXGI_FORMAT_R8G8B8A8_TYPELESS:\r
395             pstr = L"DXGI_FORMAT_R8G8B8A8_TYPELESS"; break;\r
396         case DXGI_FORMAT_R8G8B8A8_UNORM:\r
397             pstr = L"DXGI_FORMAT_R8G8B8A8_UNORM"; break;\r
398         case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:\r
399             pstr = L"DXGI_FORMAT_R8G8B8A8_UNORM_SRGB"; break;\r
400         case DXGI_FORMAT_R8G8B8A8_UINT:\r
401             pstr = L"DXGI_FORMAT_R8G8B8A8_UINT"; break;\r
402         case DXGI_FORMAT_R8G8B8A8_SNORM:\r
403             pstr = L"DXGI_FORMAT_R8G8B8A8_SNORM"; break;\r
404         case DXGI_FORMAT_R8G8B8A8_SINT:\r
405             pstr = L"DXGI_FORMAT_R8G8B8A8_SINT"; break;\r
406         case DXGI_FORMAT_R16G16_TYPELESS:\r
407             pstr = L"DXGI_FORMAT_R16G16_TYPELESS"; break;\r
408         case DXGI_FORMAT_R16G16_FLOAT:\r
409             pstr = L"DXGI_FORMAT_R16G16_FLOAT"; break;\r
410         case DXGI_FORMAT_R16G16_UNORM:\r
411             pstr = L"DXGI_FORMAT_R16G16_UNORM"; break;\r
412         case DXGI_FORMAT_R16G16_UINT:\r
413             pstr = L"DXGI_FORMAT_R16G16_UINT"; break;\r
414         case DXGI_FORMAT_R16G16_SNORM:\r
415             pstr = L"DXGI_FORMAT_R16G16_SNORM"; break;\r
416         case DXGI_FORMAT_R16G16_SINT:\r
417             pstr = L"DXGI_FORMAT_R16G16_SINT"; break;\r
418         case DXGI_FORMAT_R32_TYPELESS:\r
419             pstr = L"DXGI_FORMAT_R32_TYPELESS"; break;\r
420         case DXGI_FORMAT_D32_FLOAT:\r
421             pstr = L"DXGI_FORMAT_D32_FLOAT"; break;\r
422         case DXGI_FORMAT_R32_FLOAT:\r
423             pstr = L"DXGI_FORMAT_R32_FLOAT"; break;\r
424         case DXGI_FORMAT_R32_UINT:\r
425             pstr = L"DXGI_FORMAT_R32_UINT"; break;\r
426         case DXGI_FORMAT_R32_SINT:\r
427             pstr = L"DXGI_FORMAT_R32_SINT"; break;\r
428         case DXGI_FORMAT_R24G8_TYPELESS:\r
429             pstr = L"DXGI_FORMAT_R24G8_TYPELESS"; break;\r
430         case DXGI_FORMAT_D24_UNORM_S8_UINT:\r
431             pstr = L"DXGI_FORMAT_D24_UNORM_S8_UINT"; break;\r
432         case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:\r
433             pstr = L"DXGI_FORMAT_R24_UNORM_X8_TYPELESS"; break;\r
434         case DXGI_FORMAT_X24_TYPELESS_G8_UINT:\r
435             pstr = L"DXGI_FORMAT_X24_TYPELESS_G8_UINT"; break;\r
436         case DXGI_FORMAT_R8G8_TYPELESS:\r
437             pstr = L"DXGI_FORMAT_R8G8_TYPELESS"; break;\r
438         case DXGI_FORMAT_R8G8_UNORM:\r
439             pstr = L"DXGI_FORMAT_R8G8_UNORM"; break;\r
440         case DXGI_FORMAT_R8G8_UINT:\r
441             pstr = L"DXGI_FORMAT_R8G8_UINT"; break;\r
442         case DXGI_FORMAT_R8G8_SNORM:\r
443             pstr = L"DXGI_FORMAT_R8G8_SNORM"; break;\r
444         case DXGI_FORMAT_R8G8_SINT:\r
445             pstr = L"DXGI_FORMAT_R8G8_SINT"; break;\r
446         case DXGI_FORMAT_R16_TYPELESS:\r
447             pstr = L"DXGI_FORMAT_R16_TYPELESS"; break;\r
448         case DXGI_FORMAT_R16_FLOAT:\r
449             pstr = L"DXGI_FORMAT_R16_FLOAT"; break;\r
450         case DXGI_FORMAT_D16_UNORM:\r
451             pstr = L"DXGI_FORMAT_D16_UNORM"; break;\r
452         case DXGI_FORMAT_R16_UNORM:\r
453             pstr = L"DXGI_FORMAT_R16_UNORM"; break;\r
454         case DXGI_FORMAT_R16_UINT:\r
455             pstr = L"DXGI_FORMAT_R16_UINT"; break;\r
456         case DXGI_FORMAT_R16_SNORM:\r
457             pstr = L"DXGI_FORMAT_R16_SNORM"; break;\r
458         case DXGI_FORMAT_R16_SINT:\r
459             pstr = L"DXGI_FORMAT_R16_SINT"; break;\r
460         case DXGI_FORMAT_R8_TYPELESS:\r
461             pstr = L"DXGI_FORMAT_R8_TYPELESS"; break;\r
462         case DXGI_FORMAT_R8_UNORM:\r
463             pstr = L"DXGI_FORMAT_R8_UNORM"; break;\r
464         case DXGI_FORMAT_R8_UINT:\r
465             pstr = L"DXGI_FORMAT_R8_UINT"; break;\r
466         case DXGI_FORMAT_R8_SNORM:\r
467             pstr = L"DXGI_FORMAT_R8_SNORM"; break;\r
468         case DXGI_FORMAT_R8_SINT:\r
469             pstr = L"DXGI_FORMAT_R8_SINT"; break;\r
470         case DXGI_FORMAT_A8_UNORM:\r
471             pstr = L"DXGI_FORMAT_A8_UNORM"; break;\r
472         case DXGI_FORMAT_R1_UNORM:\r
473             pstr = L"DXGI_FORMAT_R1_UNORM"; break;\r
474         case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:\r
475             pstr = L"DXGI_FORMAT_R9G9B9E5_SHAREDEXP"; break;\r
476         case DXGI_FORMAT_R8G8_B8G8_UNORM:\r
477             pstr = L"DXGI_FORMAT_R8G8_B8G8_UNORM"; break;\r
478         case DXGI_FORMAT_G8R8_G8B8_UNORM:\r
479             pstr = L"DXGI_FORMAT_G8R8_G8B8_UNORM"; break;\r
480         case DXGI_FORMAT_BC1_TYPELESS:\r
481             pstr = L"DXGI_FORMAT_BC1_TYPELESS"; break;\r
482         case DXGI_FORMAT_BC1_UNORM:\r
483             pstr = L"DXGI_FORMAT_BC1_UNORM"; break;\r
484         case DXGI_FORMAT_BC1_UNORM_SRGB:\r
485             pstr = L"DXGI_FORMAT_BC1_UNORM_SRGB"; break;\r
486         case DXGI_FORMAT_BC2_TYPELESS:\r
487             pstr = L"DXGI_FORMAT_BC2_TYPELESS"; break;\r
488         case DXGI_FORMAT_BC2_UNORM:\r
489             pstr = L"DXGI_FORMAT_BC2_UNORM"; break;\r
490         case DXGI_FORMAT_BC2_UNORM_SRGB:\r
491             pstr = L"DXGI_FORMAT_BC2_UNORM_SRGB"; break;\r
492         case DXGI_FORMAT_BC3_TYPELESS:\r
493             pstr = L"DXGI_FORMAT_BC3_TYPELESS"; break;\r
494         case DXGI_FORMAT_BC3_UNORM:\r
495             pstr = L"DXGI_FORMAT_BC3_UNORM"; break;\r
496         case DXGI_FORMAT_BC3_UNORM_SRGB:\r
497             pstr = L"DXGI_FORMAT_BC3_UNORM_SRGB"; break;\r
498         case DXGI_FORMAT_BC4_TYPELESS:\r
499             pstr = L"DXGI_FORMAT_BC4_TYPELESS"; break;\r
500         case DXGI_FORMAT_BC4_UNORM:\r
501             pstr = L"DXGI_FORMAT_BC4_UNORM"; break;\r
502         case DXGI_FORMAT_BC4_SNORM:\r
503             pstr = L"DXGI_FORMAT_BC4_SNORM"; break;\r
504         case DXGI_FORMAT_BC5_TYPELESS:\r
505             pstr = L"DXGI_FORMAT_BC5_TYPELESS"; break;\r
506         case DXGI_FORMAT_BC5_UNORM:\r
507             pstr = L"DXGI_FORMAT_BC5_UNORM"; break;\r
508         case DXGI_FORMAT_BC5_SNORM:\r
509             pstr = L"DXGI_FORMAT_BC5_SNORM"; break;\r
510         case DXGI_FORMAT_B5G6R5_UNORM:\r
511             pstr = L"DXGI_FORMAT_B5G6R5_UNORM"; break;\r
512         case DXGI_FORMAT_B5G5R5A1_UNORM:\r
513             pstr = L"DXGI_FORMAT_B5G5R5A1_UNORM"; break;\r
514         case DXGI_FORMAT_B8G8R8A8_UNORM:\r
515             pstr = L"DXGI_FORMAT_B8G8R8A8_UNORM"; break;\r
516         default:\r
517             pstr = L"Unknown format"; break;\r
518     }\r
519     if( bWithPrefix || wcsstr( pstr, L"DXGI_FORMAT_" ) == NULL )\r
520         return pstr;\r
521     else\r
522         return pstr + lstrlen( L"DXGI_FORMAT_" );\r
523 }\r
524 \r
525 \r
526 //--------------------------------------------------------------------------------------\r
527 // Outputs to the debug stream a formatted Unicode string with a variable-argument list.\r
528 //--------------------------------------------------------------------------------------\r
529 VOID WINAPI DXUTOutputDebugStringW( LPCWSTR strMsg, ... )\r
530 {\r
531 #if defined(DEBUG) || defined(_DEBUG)\r
532     WCHAR strBuffer[512];\r
533 \r
534     va_list args;\r
535     va_start(args, strMsg);\r
536     vswprintf_s( strBuffer, 512, strMsg, args );\r
537     strBuffer[511] = L'\0';\r
538     va_end(args);\r
539 \r
540     OutputDebugString( strBuffer );\r
541 #else\r
542     UNREFERENCED_PARAMETER( strMsg );\r
543 #endif\r
544 }\r
545 \r
546 \r
547 //--------------------------------------------------------------------------------------\r
548 // Outputs to the debug stream a formatted MBCS string with a variable-argument list.\r
549 //--------------------------------------------------------------------------------------\r
550 VOID WINAPI DXUTOutputDebugStringA( LPCSTR strMsg, ... )\r
551 {\r
552 #if defined(DEBUG) || defined(_DEBUG)\r
553     CHAR strBuffer[512];\r
554 \r
555     va_list args;\r
556     va_start(args, strMsg);\r
557     sprintf_s( strBuffer, 512, strMsg, args );\r
558     strBuffer[511] = '\0';\r
559     va_end(args);\r
560 \r
561     OutputDebugStringA( strBuffer );\r
562 #else\r
563     UNREFERENCED_PARAMETER( strMsg );\r
564 #endif\r
565 }\r
566 \r
567 \r
568 //--------------------------------------------------------------------------------------\r
569 // Direct3D9 dynamic linking support -- calls top-level D3D9 APIs with graceful\r
570 // failure if APIs are not present.\r
571 //--------------------------------------------------------------------------------------\r
572 \r
573 // Function prototypes\r
574 typedef IDirect3D9* (WINAPI * LPDIRECT3DCREATE9) (UINT);\r
575 typedef INT         (WINAPI * LPD3DPERF_BEGINEVENT)(D3DCOLOR, LPCWSTR);\r
576 typedef INT         (WINAPI * LPD3DPERF_ENDEVENT)(void);\r
577 typedef VOID        (WINAPI * LPD3DPERF_SETMARKER)(D3DCOLOR, LPCWSTR);\r
578 typedef VOID        (WINAPI * LPD3DPERF_SETREGION)(D3DCOLOR, LPCWSTR);\r
579 typedef BOOL        (WINAPI * LPD3DPERF_QUERYREPEATFRAME)(void);\r
580 typedef VOID        (WINAPI * LPD3DPERF_SETOPTIONS)( DWORD dwOptions );\r
581 typedef DWORD       (WINAPI * LPD3DPERF_GETSTATUS)( void );\r
582 typedef HRESULT     (WINAPI * LPCREATEDXGIFACTORY)(REFIID, void ** );\r
583 typedef HRESULT     (WINAPI * LPD3D11CREATEDEVICE)( IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT32, D3D_FEATURE_LEVEL*, UINT, UINT32, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext** );\r
584 \r
585 // Module and function pointers\r
586 static HMODULE                              s_hModD3D9 = NULL;\r
587 static LPDIRECT3DCREATE9                    s_DynamicDirect3DCreate9 = NULL;\r
588 static LPD3DPERF_BEGINEVENT                 s_DynamicD3DPERF_BeginEvent = NULL;\r
589 static LPD3DPERF_ENDEVENT                   s_DynamicD3DPERF_EndEvent = NULL;\r
590 static LPD3DPERF_SETMARKER                  s_DynamicD3DPERF_SetMarker = NULL;\r
591 static LPD3DPERF_SETREGION                  s_DynamicD3DPERF_SetRegion = NULL;\r
592 static LPD3DPERF_QUERYREPEATFRAME           s_DynamicD3DPERF_QueryRepeatFrame = NULL;\r
593 static LPD3DPERF_SETOPTIONS                 s_DynamicD3DPERF_SetOptions = NULL;\r
594 static LPD3DPERF_GETSTATUS                  s_DynamicD3DPERF_GetStatus = NULL;\r
595 static HMODULE                              s_hModDXGI = NULL;\r
596 static LPCREATEDXGIFACTORY                  s_DynamicCreateDXGIFactory = NULL;\r
597 static HMODULE                              s_hModD3D11 = NULL;\r
598 static LPD3D11CREATEDEVICE                  s_DynamicD3D11CreateDevice = NULL;\r
599 \r
600 // Ensure function pointers are initialized\r
601 static bool DXUT_EnsureD3D9APIs( void )\r
602 {\r
603     // If the module is non-NULL, this function has already been called.  Note\r
604     // that this doesn't guarantee that all ProcAddresses were found.\r
605     if( s_hModD3D9 != NULL )\r
606         return true;\r
607 \r
608     // This may fail if Direct3D 9 isn't installed\r
609     s_hModD3D9 = LoadLibrary( L"d3d9.dll" );\r
610     if( s_hModD3D9 != NULL )\r
611     {\r
612         s_DynamicDirect3DCreate9 = (LPDIRECT3DCREATE9)GetProcAddress( s_hModD3D9, "Direct3DCreate9" );\r
613         s_DynamicD3DPERF_BeginEvent = (LPD3DPERF_BEGINEVENT)GetProcAddress( s_hModD3D9, "D3DPERF_BeginEvent" );\r
614         s_DynamicD3DPERF_EndEvent = (LPD3DPERF_ENDEVENT)GetProcAddress( s_hModD3D9, "D3DPERF_EndEvent" );\r
615         s_DynamicD3DPERF_SetMarker = (LPD3DPERF_SETMARKER)GetProcAddress( s_hModD3D9, "D3DPERF_SetMarker" );\r
616         s_DynamicD3DPERF_SetRegion = (LPD3DPERF_SETREGION)GetProcAddress( s_hModD3D9, "D3DPERF_SetRegion" );\r
617         s_DynamicD3DPERF_QueryRepeatFrame = (LPD3DPERF_QUERYREPEATFRAME)GetProcAddress( s_hModD3D9, "D3DPERF_QueryRepeatFrame" );\r
618         s_DynamicD3DPERF_SetOptions = (LPD3DPERF_SETOPTIONS)GetProcAddress( s_hModD3D9, "D3DPERF_SetOptions" );\r
619         s_DynamicD3DPERF_GetStatus = (LPD3DPERF_GETSTATUS)GetProcAddress( s_hModD3D9, "D3DPERF_GetStatus" );\r
620     }\r
621 \r
622     return s_hModD3D9 != NULL;\r
623 }\r
624 \r
625 bool DXUT_EnsureD3D11APIs( void )\r
626 {\r
627     // If both modules are non-NULL, this function has already been called.  Note\r
628     // that this doesn't guarantee that all ProcAddresses were found.\r
629     if( s_hModD3D11 != NULL && s_hModDXGI != NULL )\r
630         return true;\r
631 \r
632     // This may fail if Direct3D 11 isn't installed\r
633     s_hModD3D11 = LoadLibrary( L"d3d11.dll" );\r
634     if( s_hModD3D11 != NULL )\r
635     {\r
636         s_DynamicD3D11CreateDevice = ( LPD3D11CREATEDEVICE )GetProcAddress( s_hModD3D11, "D3D11CreateDevice" );\r
637     }\r
638 \r
639     if( !s_DynamicCreateDXGIFactory )\r
640     {\r
641         s_hModDXGI = LoadLibrary( L"dxgi.dll" );\r
642         if( s_hModDXGI )\r
643         {\r
644             s_DynamicCreateDXGIFactory = ( LPCREATEDXGIFACTORY )GetProcAddress( s_hModDXGI, "CreateDXGIFactory1" );\r
645         }\r
646 \r
647         return ( s_hModDXGI != NULL ) && ( s_hModD3D11 != NULL );\r
648     }\r
649 \r
650     return ( s_hModD3D11 != NULL );\r
651 }\r
652 \r
653 IDirect3D9* WINAPI DXUT_Dynamic_Direct3DCreate9( UINT SDKVersion )\r
654 {\r
655     if( DXUT_EnsureD3D9APIs() && s_DynamicDirect3DCreate9 != NULL )\r
656         return s_DynamicDirect3DCreate9( SDKVersion );\r
657     else\r
658         return NULL;\r
659 }\r
660 \r
661 int WINAPI DXUT_Dynamic_D3DPERF_BeginEvent( D3DCOLOR col, LPCWSTR wszName )\r
662 {\r
663     if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_BeginEvent != NULL )\r
664         return s_DynamicD3DPERF_BeginEvent( col, wszName );\r
665     else\r
666         return -1;\r
667 }\r
668 \r
669 int WINAPI DXUT_Dynamic_D3DPERF_EndEvent( void )\r
670 {\r
671     if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_EndEvent != NULL )\r
672         return s_DynamicD3DPERF_EndEvent();\r
673     else\r
674         return -1;\r
675 }\r
676 \r
677 void WINAPI DXUT_Dynamic_D3DPERF_SetMarker( D3DCOLOR col, LPCWSTR wszName )\r
678 {\r
679     if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetMarker != NULL )\r
680         s_DynamicD3DPERF_SetMarker( col, wszName );\r
681 }\r
682 \r
683 void WINAPI DXUT_Dynamic_D3DPERF_SetRegion( D3DCOLOR col, LPCWSTR wszName )\r
684 {\r
685     if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetRegion != NULL )\r
686         s_DynamicD3DPERF_SetRegion( col, wszName );\r
687 }\r
688 \r
689 BOOL WINAPI DXUT_Dynamic_D3DPERF_QueryRepeatFrame( void )\r
690 {\r
691     if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_QueryRepeatFrame != NULL )\r
692         return s_DynamicD3DPERF_QueryRepeatFrame();\r
693     else\r
694         return FALSE;\r
695 }\r
696 \r
697 void WINAPI DXUT_Dynamic_D3DPERF_SetOptions( DWORD dwOptions )\r
698 {\r
699     if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetOptions != NULL )\r
700         s_DynamicD3DPERF_SetOptions( dwOptions );\r
701 }\r
702 \r
703 DWORD WINAPI DXUT_Dynamic_D3DPERF_GetStatus( void )\r
704 {\r
705     if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_GetStatus != NULL )\r
706         return s_DynamicD3DPERF_GetStatus();\r
707     else\r
708         return 0;\r
709 }\r
710 \r
711 HRESULT WINAPI DXUT_Dynamic_CreateDXGIFactory1( REFIID rInterface, void** ppOut )\r
712 {\r
713     if( DXUT_EnsureD3D11APIs() && s_DynamicCreateDXGIFactory != NULL )\r
714         return s_DynamicCreateDXGIFactory( rInterface, ppOut );\r
715     else\r
716         return DXUTERR_NODIRECT3D11;\r
717 }\r
718 \r
719 \r
720 \r
721 HRESULT WINAPI DXUT_Dynamic_D3D11CreateDevice( IDXGIAdapter* pAdapter,\r
722                                                D3D_DRIVER_TYPE DriverType,\r
723                                                HMODULE Software,\r
724                                                UINT32 Flags,\r
725                                                D3D_FEATURE_LEVEL* pFeatureLevels,\r
726                                                UINT FeatureLevels,\r
727                                                UINT32 SDKVersion,\r
728                                                ID3D11Device** ppDevice,\r
729                                                D3D_FEATURE_LEVEL* pFeatureLevel,\r
730                                                ID3D11DeviceContext** ppImmediateContext )\r
731 {\r
732     if( DXUT_EnsureD3D11APIs() && s_DynamicD3D11CreateDevice != NULL )\r
733         return s_DynamicD3D11CreateDevice( pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels,\r
734                                            SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext );\r
735     else\r
736         return DXUTERR_NODIRECT3D11;\r
737 }\r
738 \r
739 //--------------------------------------------------------------------------------------\r
740 // Trace a string description of a decl \r
741 //--------------------------------------------------------------------------------------\r
742 void WINAPI DXUTTraceDecl( D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE] )\r
743 {\r
744     int iDecl = 0;\r
745     for( iDecl = 0; iDecl < MAX_FVF_DECL_SIZE; iDecl++ )\r
746     {\r
747         if( decl[iDecl].Stream == 0xFF )\r
748             break;\r
749 \r
750         DXUTOutputDebugString( L"decl[%d]=Stream:%d, Offset:%d, %s, %s, %s, UsageIndex:%d\n", iDecl,\r
751                                decl[iDecl].Stream,\r
752                                decl[iDecl].Offset,\r
753                                DXUTTraceD3DDECLTYPEtoString( decl[iDecl].Type ),\r
754                                DXUTTraceD3DDECLMETHODtoString( decl[iDecl].Method ),\r
755                                DXUTTraceD3DDECLUSAGEtoString( decl[iDecl].Usage ),\r
756                                decl[iDecl].UsageIndex );\r
757     }\r
758 \r
759     DXUTOutputDebugString( L"decl[%d]=D3DDECL_END\n", iDecl );\r
760 }\r
761 \r
762 #define TRACE_ID(iD) case iD: return L#iD;\r
763 \r
764 //--------------------------------------------------------------------------------------\r
765 WCHAR* WINAPI DXUTTraceWindowsMessage( UINT uMsg )\r
766 {\r
767     switch( uMsg )\r
768     {\r
769         TRACE_ID(WM_NULL);\r
770         TRACE_ID(WM_CREATE);\r
771         TRACE_ID(WM_DESTROY);\r
772         TRACE_ID(WM_MOVE);\r
773         TRACE_ID(WM_SIZE);\r
774         TRACE_ID(WM_ACTIVATE);\r
775         TRACE_ID(WM_SETFOCUS);\r
776         TRACE_ID(WM_KILLFOCUS);\r
777         TRACE_ID(WM_ENABLE);\r
778         TRACE_ID(WM_SETREDRAW);\r
779         TRACE_ID(WM_SETTEXT);\r
780         TRACE_ID(WM_GETTEXT);\r
781         TRACE_ID(WM_GETTEXTLENGTH);\r
782         TRACE_ID(WM_PAINT);\r
783         TRACE_ID(WM_CLOSE);\r
784         TRACE_ID(WM_QUERYENDSESSION);\r
785         TRACE_ID(WM_QUERYOPEN);\r
786         TRACE_ID(WM_ENDSESSION);\r
787         TRACE_ID(WM_QUIT);\r
788         TRACE_ID(WM_ERASEBKGND);\r
789         TRACE_ID(WM_SYSCOLORCHANGE);\r
790         TRACE_ID(WM_SHOWWINDOW);\r
791         TRACE_ID(WM_WININICHANGE);\r
792         TRACE_ID(WM_DEVMODECHANGE);\r
793         TRACE_ID(WM_ACTIVATEAPP);\r
794         TRACE_ID(WM_FONTCHANGE);\r
795         TRACE_ID(WM_TIMECHANGE);\r
796         TRACE_ID(WM_CANCELMODE);\r
797         TRACE_ID(WM_SETCURSOR);\r
798         TRACE_ID(WM_MOUSEACTIVATE);\r
799         TRACE_ID(WM_CHILDACTIVATE);\r
800         TRACE_ID(WM_QUEUESYNC);\r
801         TRACE_ID(WM_GETMINMAXINFO);\r
802         TRACE_ID(WM_PAINTICON);\r
803         TRACE_ID(WM_ICONERASEBKGND);\r
804         TRACE_ID(WM_NEXTDLGCTL);\r
805         TRACE_ID(WM_SPOOLERSTATUS);\r
806         TRACE_ID(WM_DRAWITEM);\r
807         TRACE_ID(WM_MEASUREITEM);\r
808         TRACE_ID(WM_DELETEITEM);\r
809         TRACE_ID(WM_VKEYTOITEM);\r
810         TRACE_ID(WM_CHARTOITEM);\r
811         TRACE_ID(WM_SETFONT);\r
812         TRACE_ID(WM_GETFONT);\r
813         TRACE_ID(WM_SETHOTKEY);\r
814         TRACE_ID(WM_GETHOTKEY);\r
815         TRACE_ID(WM_QUERYDRAGICON);\r
816         TRACE_ID(WM_COMPAREITEM);\r
817         TRACE_ID(WM_GETOBJECT);\r
818         TRACE_ID(WM_COMPACTING);\r
819         TRACE_ID(WM_COMMNOTIFY);\r
820         TRACE_ID(WM_WINDOWPOSCHANGING);\r
821         TRACE_ID(WM_WINDOWPOSCHANGED);\r
822         TRACE_ID(WM_POWER);\r
823         TRACE_ID(WM_COPYDATA);\r
824         TRACE_ID(WM_CANCELJOURNAL);\r
825         TRACE_ID(WM_NOTIFY);\r
826         TRACE_ID(WM_INPUTLANGCHANGEREQUEST);\r
827         TRACE_ID(WM_INPUTLANGCHANGE);\r
828         TRACE_ID(WM_TCARD);\r
829         TRACE_ID(WM_HELP);\r
830         TRACE_ID(WM_USERCHANGED);\r
831         TRACE_ID(WM_NOTIFYFORMAT);\r
832         TRACE_ID(WM_CONTEXTMENU);\r
833         TRACE_ID(WM_STYLECHANGING);\r
834         TRACE_ID(WM_STYLECHANGED);\r
835         TRACE_ID(WM_DISPLAYCHANGE);\r
836         TRACE_ID(WM_GETICON);\r
837         TRACE_ID(WM_SETICON);\r
838         TRACE_ID(WM_NCCREATE);\r
839         TRACE_ID(WM_NCDESTROY);\r
840         TRACE_ID(WM_NCCALCSIZE);\r
841         TRACE_ID(WM_NCHITTEST);\r
842         TRACE_ID(WM_NCPAINT);\r
843         TRACE_ID(WM_NCACTIVATE);\r
844         TRACE_ID(WM_GETDLGCODE);\r
845         TRACE_ID(WM_SYNCPAINT);\r
846         TRACE_ID(WM_NCMOUSEMOVE);\r
847         TRACE_ID(WM_NCLBUTTONDOWN);\r
848         TRACE_ID(WM_NCLBUTTONUP);\r
849         TRACE_ID(WM_NCLBUTTONDBLCLK);\r
850         TRACE_ID(WM_NCRBUTTONDOWN);\r
851         TRACE_ID(WM_NCRBUTTONUP);\r
852         TRACE_ID(WM_NCRBUTTONDBLCLK);\r
853         TRACE_ID(WM_NCMBUTTONDOWN);\r
854         TRACE_ID(WM_NCMBUTTONUP);\r
855         TRACE_ID(WM_NCMBUTTONDBLCLK);\r
856         TRACE_ID(WM_NCXBUTTONDOWN);\r
857         TRACE_ID(WM_NCXBUTTONUP);\r
858         TRACE_ID(WM_NCXBUTTONDBLCLK);\r
859         TRACE_ID(WM_INPUT);\r
860         TRACE_ID(WM_KEYDOWN);\r
861         TRACE_ID(WM_KEYUP);\r
862         TRACE_ID(WM_CHAR);\r
863         TRACE_ID(WM_DEADCHAR);\r
864         TRACE_ID(WM_SYSKEYDOWN);\r
865         TRACE_ID(WM_SYSKEYUP);\r
866         TRACE_ID(WM_SYSCHAR);\r
867         TRACE_ID(WM_SYSDEADCHAR);\r
868         TRACE_ID(WM_UNICHAR);\r
869         TRACE_ID(WM_IME_STARTCOMPOSITION);\r
870         TRACE_ID(WM_IME_ENDCOMPOSITION);\r
871         TRACE_ID(WM_IME_COMPOSITION);\r
872         TRACE_ID(WM_INITDIALOG);\r
873         TRACE_ID(WM_COMMAND);\r
874         TRACE_ID(WM_SYSCOMMAND);\r
875         TRACE_ID(WM_TIMER);\r
876         TRACE_ID(WM_HSCROLL);\r
877         TRACE_ID(WM_VSCROLL);\r
878         TRACE_ID(WM_INITMENU);\r
879         TRACE_ID(WM_INITMENUPOPUP);\r
880         TRACE_ID(WM_MENUSELECT);\r
881         TRACE_ID(WM_MENUCHAR);\r
882         TRACE_ID(WM_ENTERIDLE);\r
883         TRACE_ID(WM_MENURBUTTONUP);\r
884         TRACE_ID(WM_MENUDRAG);\r
885         TRACE_ID(WM_MENUGETOBJECT);\r
886         TRACE_ID(WM_UNINITMENUPOPUP);\r
887         TRACE_ID(WM_MENUCOMMAND);\r
888         TRACE_ID(WM_CHANGEUISTATE);\r
889         TRACE_ID(WM_UPDATEUISTATE);\r
890         TRACE_ID(WM_QUERYUISTATE);\r
891         TRACE_ID(WM_CTLCOLORMSGBOX);\r
892         TRACE_ID(WM_CTLCOLOREDIT);\r
893         TRACE_ID(WM_CTLCOLORLISTBOX);\r
894         TRACE_ID(WM_CTLCOLORBTN);\r
895         TRACE_ID(WM_CTLCOLORDLG);\r
896         TRACE_ID(WM_CTLCOLORSCROLLBAR);\r
897         TRACE_ID(WM_CTLCOLORSTATIC);\r
898         TRACE_ID(MN_GETHMENU);\r
899         TRACE_ID(WM_MOUSEMOVE);\r
900         TRACE_ID(WM_LBUTTONDOWN);\r
901         TRACE_ID(WM_LBUTTONUP);\r
902         TRACE_ID(WM_LBUTTONDBLCLK);\r
903         TRACE_ID(WM_RBUTTONDOWN);\r
904         TRACE_ID(WM_RBUTTONUP);\r
905         TRACE_ID(WM_RBUTTONDBLCLK);\r
906         TRACE_ID(WM_MBUTTONDOWN);\r
907         TRACE_ID(WM_MBUTTONUP);\r
908         TRACE_ID(WM_MBUTTONDBLCLK);\r
909         TRACE_ID(WM_MOUSEWHEEL);\r
910         TRACE_ID(WM_XBUTTONDOWN);\r
911         TRACE_ID(WM_XBUTTONUP);\r
912         TRACE_ID(WM_XBUTTONDBLCLK);\r
913         TRACE_ID(WM_PARENTNOTIFY);\r
914         TRACE_ID(WM_ENTERMENULOOP);\r
915         TRACE_ID(WM_EXITMENULOOP);\r
916         TRACE_ID(WM_NEXTMENU);\r
917         TRACE_ID(WM_SIZING);\r
918         TRACE_ID(WM_CAPTURECHANGED);\r
919         TRACE_ID(WM_MOVING);\r
920         TRACE_ID(WM_POWERBROADCAST);\r
921         TRACE_ID(WM_DEVICECHANGE);\r
922         TRACE_ID(WM_MDICREATE);\r
923         TRACE_ID(WM_MDIDESTROY);\r
924         TRACE_ID(WM_MDIACTIVATE);\r
925         TRACE_ID(WM_MDIRESTORE);\r
926         TRACE_ID(WM_MDINEXT);\r
927         TRACE_ID(WM_MDIMAXIMIZE);\r
928         TRACE_ID(WM_MDITILE);\r
929         TRACE_ID(WM_MDICASCADE);\r
930         TRACE_ID(WM_MDIICONARRANGE);\r
931         TRACE_ID(WM_MDIGETACTIVE);\r
932         TRACE_ID(WM_MDISETMENU);\r
933         TRACE_ID(WM_ENTERSIZEMOVE);\r
934         TRACE_ID(WM_EXITSIZEMOVE);\r
935         TRACE_ID(WM_DROPFILES);\r
936         TRACE_ID(WM_MDIREFRESHMENU);\r
937         TRACE_ID(WM_IME_SETCONTEXT);\r
938         TRACE_ID(WM_IME_NOTIFY);\r
939         TRACE_ID(WM_IME_CONTROL);\r
940         TRACE_ID(WM_IME_COMPOSITIONFULL);\r
941         TRACE_ID(WM_IME_SELECT);\r
942         TRACE_ID(WM_IME_CHAR);\r
943         TRACE_ID(WM_IME_REQUEST);\r
944         TRACE_ID(WM_IME_KEYDOWN);\r
945         TRACE_ID(WM_IME_KEYUP);\r
946         TRACE_ID(WM_MOUSEHOVER);\r
947         TRACE_ID(WM_MOUSELEAVE);\r
948         TRACE_ID(WM_NCMOUSEHOVER);\r
949         TRACE_ID(WM_NCMOUSELEAVE);\r
950         TRACE_ID(WM_WTSSESSION_CHANGE);\r
951         TRACE_ID(WM_TABLET_FIRST);\r
952         TRACE_ID(WM_TABLET_LAST);\r
953         TRACE_ID(WM_CUT);\r
954         TRACE_ID(WM_COPY);\r
955         TRACE_ID(WM_PASTE);\r
956         TRACE_ID(WM_CLEAR);\r
957         TRACE_ID(WM_UNDO);\r
958         TRACE_ID(WM_RENDERFORMAT);\r
959         TRACE_ID(WM_RENDERALLFORMATS);\r
960         TRACE_ID(WM_DESTROYCLIPBOARD);\r
961         TRACE_ID(WM_DRAWCLIPBOARD);\r
962         TRACE_ID(WM_PAINTCLIPBOARD);\r
963         TRACE_ID(WM_VSCROLLCLIPBOARD);\r
964         TRACE_ID(WM_SIZECLIPBOARD);\r
965         TRACE_ID(WM_ASKCBFORMATNAME);\r
966         TRACE_ID(WM_CHANGECBCHAIN);\r
967         TRACE_ID(WM_HSCROLLCLIPBOARD);\r
968         TRACE_ID(WM_QUERYNEWPALETTE);\r
969         TRACE_ID(WM_PALETTEISCHANGING);\r
970         TRACE_ID(WM_PALETTECHANGED);\r
971         TRACE_ID(WM_HOTKEY);\r
972         TRACE_ID(WM_PRINT);\r
973         TRACE_ID(WM_PRINTCLIENT);\r
974         TRACE_ID(WM_APPCOMMAND);\r
975         TRACE_ID(WM_THEMECHANGED);\r
976         TRACE_ID(WM_HANDHELDFIRST);\r
977         TRACE_ID(WM_HANDHELDLAST);\r
978         TRACE_ID(WM_AFXFIRST);\r
979         TRACE_ID(WM_AFXLAST);\r
980         TRACE_ID(WM_PENWINFIRST);\r
981         TRACE_ID(WM_PENWINLAST);\r
982         TRACE_ID(WM_APP);\r
983         default:\r
984             return L"Unknown";\r
985     }\r
986 }\r
987 \r
988 \r
989 //--------------------------------------------------------------------------------------\r
990 WCHAR* WINAPI DXUTTraceD3DDECLTYPEtoString( BYTE t )\r
991 {\r
992     switch( t )\r
993     {\r
994         case D3DDECLTYPE_FLOAT1:\r
995             return L"D3DDECLTYPE_FLOAT1";\r
996         case D3DDECLTYPE_FLOAT2:\r
997             return L"D3DDECLTYPE_FLOAT2";\r
998         case D3DDECLTYPE_FLOAT3:\r
999             return L"D3DDECLTYPE_FLOAT3";\r
1000         case D3DDECLTYPE_FLOAT4:\r
1001             return L"D3DDECLTYPE_FLOAT4";\r
1002         case D3DDECLTYPE_D3DCOLOR:\r
1003             return L"D3DDECLTYPE_D3DCOLOR";\r
1004         case D3DDECLTYPE_UBYTE4:\r
1005             return L"D3DDECLTYPE_UBYTE4";\r
1006         case D3DDECLTYPE_SHORT2:\r
1007             return L"D3DDECLTYPE_SHORT2";\r
1008         case D3DDECLTYPE_SHORT4:\r
1009             return L"D3DDECLTYPE_SHORT4";\r
1010         case D3DDECLTYPE_UBYTE4N:\r
1011             return L"D3DDECLTYPE_UBYTE4N";\r
1012         case D3DDECLTYPE_SHORT2N:\r
1013             return L"D3DDECLTYPE_SHORT2N";\r
1014         case D3DDECLTYPE_SHORT4N:\r
1015             return L"D3DDECLTYPE_SHORT4N";\r
1016         case D3DDECLTYPE_USHORT2N:\r
1017             return L"D3DDECLTYPE_USHORT2N";\r
1018         case D3DDECLTYPE_USHORT4N:\r
1019             return L"D3DDECLTYPE_USHORT4N";\r
1020         case D3DDECLTYPE_UDEC3:\r
1021             return L"D3DDECLTYPE_UDEC3";\r
1022         case D3DDECLTYPE_DEC3N:\r
1023             return L"D3DDECLTYPE_DEC3N";\r
1024         case D3DDECLTYPE_FLOAT16_2:\r
1025             return L"D3DDECLTYPE_FLOAT16_2";\r
1026         case D3DDECLTYPE_FLOAT16_4:\r
1027             return L"D3DDECLTYPE_FLOAT16_4";\r
1028         case D3DDECLTYPE_UNUSED:\r
1029             return L"D3DDECLTYPE_UNUSED";\r
1030         default:\r
1031             return L"D3DDECLTYPE Unknown";\r
1032     }\r
1033 }\r
1034 \r
1035 WCHAR* WINAPI DXUTTraceD3DDECLMETHODtoString( BYTE m )\r
1036 {\r
1037     switch( m )\r
1038     {\r
1039         case D3DDECLMETHOD_DEFAULT:\r
1040             return L"D3DDECLMETHOD_DEFAULT";\r
1041         case D3DDECLMETHOD_PARTIALU:\r
1042             return L"D3DDECLMETHOD_PARTIALU";\r
1043         case D3DDECLMETHOD_PARTIALV:\r
1044             return L"D3DDECLMETHOD_PARTIALV";\r
1045         case D3DDECLMETHOD_CROSSUV:\r
1046             return L"D3DDECLMETHOD_CROSSUV";\r
1047         case D3DDECLMETHOD_UV:\r
1048             return L"D3DDECLMETHOD_UV";\r
1049         case D3DDECLMETHOD_LOOKUP:\r
1050             return L"D3DDECLMETHOD_LOOKUP";\r
1051         case D3DDECLMETHOD_LOOKUPPRESAMPLED:\r
1052             return L"D3DDECLMETHOD_LOOKUPPRESAMPLED";\r
1053         default:\r
1054             return L"D3DDECLMETHOD Unknown";\r
1055     }\r
1056 }\r
1057 \r
1058 WCHAR* WINAPI DXUTTraceD3DDECLUSAGEtoString( BYTE u )\r
1059 {\r
1060     switch( u )\r
1061     {\r
1062         case D3DDECLUSAGE_POSITION:\r
1063             return L"D3DDECLUSAGE_POSITION";\r
1064         case D3DDECLUSAGE_BLENDWEIGHT:\r
1065             return L"D3DDECLUSAGE_BLENDWEIGHT";\r
1066         case D3DDECLUSAGE_BLENDINDICES:\r
1067             return L"D3DDECLUSAGE_BLENDINDICES";\r
1068         case D3DDECLUSAGE_NORMAL:\r
1069             return L"D3DDECLUSAGE_NORMAL";\r
1070         case D3DDECLUSAGE_PSIZE:\r
1071             return L"D3DDECLUSAGE_PSIZE";\r
1072         case D3DDECLUSAGE_TEXCOORD:\r
1073             return L"D3DDECLUSAGE_TEXCOORD";\r
1074         case D3DDECLUSAGE_TANGENT:\r
1075             return L"D3DDECLUSAGE_TANGENT";\r
1076         case D3DDECLUSAGE_BINORMAL:\r
1077             return L"D3DDECLUSAGE_BINORMAL";\r
1078         case D3DDECLUSAGE_TESSFACTOR:\r
1079             return L"D3DDECLUSAGE_TESSFACTOR";\r
1080         case D3DDECLUSAGE_POSITIONT:\r
1081             return L"D3DDECLUSAGE_POSITIONT";\r
1082         case D3DDECLUSAGE_COLOR:\r
1083             return L"D3DDECLUSAGE_COLOR";\r
1084         case D3DDECLUSAGE_FOG:\r
1085             return L"D3DDECLUSAGE_FOG";\r
1086         case D3DDECLUSAGE_DEPTH:\r
1087             return L"D3DDECLUSAGE_DEPTH";\r
1088         case D3DDECLUSAGE_SAMPLE:\r
1089             return L"D3DDECLUSAGE_SAMPLE";\r
1090         default:\r
1091             return L"D3DDECLUSAGE Unknown";\r
1092     }\r
1093 }\r
1094 \r
1095 \r
1096 //--------------------------------------------------------------------------------------\r
1097 // Multimon API handling for OSes with or without multimon API support\r
1098 //--------------------------------------------------------------------------------------\r
1099 #define DXUT_PRIMARY_MONITOR ((HMONITOR)0x12340042)\r
1100 typedef HMONITOR ( WINAPI* LPMONITORFROMWINDOW )( HWND, DWORD );\r
1101 typedef BOOL ( WINAPI* LPGETMONITORINFO )( HMONITOR, LPMONITORINFO );\r
1102 typedef HMONITOR ( WINAPI* LPMONITORFROMRECT )( LPCRECT lprcScreenCoords, DWORD dwFlags );\r
1103 \r
1104 BOOL WINAPI DXUTGetMonitorInfo( HMONITOR hMonitor, LPMONITORINFO lpMonitorInfo )\r
1105 {\r
1106     static bool s_bInited = false;\r
1107     static LPGETMONITORINFO s_pFnGetMonitorInfo = NULL;\r
1108     if( !s_bInited )\r
1109     {\r
1110         s_bInited = true;\r
1111         HMODULE hUser32 = GetModuleHandle( L"USER32" );\r
1112         if( hUser32 )\r
1113         {\r
1114             OSVERSIONINFOA osvi =\r
1115             {\r
1116                 0\r
1117             }; osvi.dwOSVersionInfoSize = sizeof( osvi ); GetVersionExA( ( OSVERSIONINFOA* )&osvi );\r
1118             bool bNT = ( VER_PLATFORM_WIN32_NT == osvi.dwPlatformId );\r
1119             s_pFnGetMonitorInfo = ( LPGETMONITORINFO )( bNT ? GetProcAddress( hUser32,\r
1120                                                                               "GetMonitorInfoW" ) :\r
1121                                                         GetProcAddress( hUser32, "GetMonitorInfoA" ) );\r
1122         }\r
1123     }\r
1124 \r
1125     if( s_pFnGetMonitorInfo )\r
1126         return s_pFnGetMonitorInfo( hMonitor, lpMonitorInfo );\r
1127 \r
1128     RECT rcWork;\r
1129     if( ( hMonitor == DXUT_PRIMARY_MONITOR ) && lpMonitorInfo && ( lpMonitorInfo->cbSize >= sizeof( MONITORINFO ) ) &&\r
1130         SystemParametersInfoA( SPI_GETWORKAREA, 0, &rcWork, 0 ) )\r
1131     {\r
1132         lpMonitorInfo->rcMonitor.left = 0;\r
1133         lpMonitorInfo->rcMonitor.top = 0;\r
1134         lpMonitorInfo->rcMonitor.right = GetSystemMetrics( SM_CXSCREEN );\r
1135         lpMonitorInfo->rcMonitor.bottom = GetSystemMetrics( SM_CYSCREEN );\r
1136         lpMonitorInfo->rcWork = rcWork;\r
1137         lpMonitorInfo->dwFlags = MONITORINFOF_PRIMARY;\r
1138         return TRUE;\r
1139     }\r
1140     return FALSE;\r
1141 }\r
1142 \r
1143 \r
1144 HMONITOR WINAPI DXUTMonitorFromWindow( HWND hWnd, DWORD dwFlags )\r
1145 {\r
1146     static bool s_bInited = false;\r
1147     static LPMONITORFROMWINDOW s_pFnGetMonitorFromWindow = NULL;\r
1148     if( !s_bInited )\r
1149     {\r
1150         s_bInited = true;\r
1151         HMODULE hUser32 = GetModuleHandle( L"USER32" );\r
1152         if( hUser32 ) s_pFnGetMonitorFromWindow = ( LPMONITORFROMWINDOW )GetProcAddress( hUser32,\r
1153                                                                                          "MonitorFromWindow" );\r
1154     }\r
1155 \r
1156     if( s_pFnGetMonitorFromWindow )\r
1157         return s_pFnGetMonitorFromWindow( hWnd, dwFlags );\r
1158     else\r
1159         return DXUT_PRIMARY_MONITOR;\r
1160 }\r
1161 \r
1162 \r
1163 HMONITOR WINAPI DXUTMonitorFromRect( LPCRECT lprcScreenCoords, DWORD dwFlags )\r
1164 {\r
1165     static bool s_bInited = false;\r
1166     static LPMONITORFROMRECT s_pFnGetMonitorFromRect = NULL;\r
1167     if( !s_bInited )\r
1168     {\r
1169         s_bInited = true;\r
1170         HMODULE hUser32 = GetModuleHandle( L"USER32" );\r
1171         if( hUser32 ) s_pFnGetMonitorFromRect = ( LPMONITORFROMRECT )GetProcAddress( hUser32, "MonitorFromRect" );\r
1172     }\r
1173 \r
1174     if( s_pFnGetMonitorFromRect )\r
1175         return s_pFnGetMonitorFromRect( lprcScreenCoords, dwFlags );\r
1176     else\r
1177         return DXUT_PRIMARY_MONITOR;\r
1178 }\r
1179 \r
1180 \r
1181 //--------------------------------------------------------------------------------------\r
1182 // Get the desktop resolution of an adapter. This isn't the same as the current resolution \r
1183 // from GetAdapterDisplayMode since the device might be fullscreen \r
1184 //--------------------------------------------------------------------------------------\r
1185 void WINAPI DXUTGetDesktopResolution( UINT AdapterOrdinal, UINT* pWidth, UINT* pHeight )\r
1186 {\r
1187     DXUTDeviceSettings DeviceSettings = DXUTGetDeviceSettings();\r
1188 \r
1189     WCHAR strDeviceName[256] = {0};\r
1190     DEVMODE devMode;\r
1191     ZeroMemory( &devMode, sizeof( DEVMODE ) );\r
1192     devMode.dmSize = sizeof( DEVMODE );\r
1193     if( DeviceSettings.ver == DXUT_D3D9_DEVICE )\r
1194     {\r
1195         CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration();\r
1196         CD3D9EnumAdapterInfo* pAdapterInfo = pd3dEnum->GetAdapterInfo( AdapterOrdinal );\r
1197         if( pAdapterInfo )\r
1198         {\r
1199             MultiByteToWideChar( CP_ACP, 0, pAdapterInfo->AdapterIdentifier.DeviceName, -1, strDeviceName, 256 );\r
1200             strDeviceName[255] = 0;\r
1201         }\r
1202     }\r
1203     else\r
1204     {\r
1205         CD3D11Enumeration* pd3dEnum = DXUTGetD3D11Enumeration();\r
1206         CD3D11EnumOutputInfo* pOutputInfo = pd3dEnum->GetOutputInfo( AdapterOrdinal, DeviceSettings.d3d11.Output );\r
1207         if( pOutputInfo )\r
1208         {\r
1209             wcscpy_s( strDeviceName, 256, pOutputInfo->Desc.DeviceName );\r
1210         }\r
1211     }\r
1212 \r
1213     EnumDisplaySettings( strDeviceName, ENUM_REGISTRY_SETTINGS, &devMode );\r
1214     if( pWidth )\r
1215         *pWidth = devMode.dmPelsWidth;\r
1216     if( pHeight )\r
1217         *pHeight = devMode.dmPelsHeight;\r
1218 }\r
1219 \r
1220 \r
1221 //--------------------------------------------------------------------------------------\r
1222 // Display error msg box to help debug \r
1223 //--------------------------------------------------------------------------------------\r
1224 HRESULT WINAPI DXUTTrace( const CHAR* strFile, DWORD dwLine, HRESULT hr,\r
1225                           const WCHAR* strMsg, bool bPopMsgBox )\r
1226 {\r
1227     bool bShowMsgBoxOnError = DXUTGetShowMsgBoxOnError();\r
1228     if( bPopMsgBox && bShowMsgBoxOnError == false )\r
1229         bPopMsgBox = false;\r
1230 \r
1231     return DXTrace( strFile, dwLine, hr, strMsg, bPopMsgBox );\r
1232 }\r
1233 \r
1234 \r
1235 //--------------------------------------------------------------------------------------\r
1236 \r
1237 //--------------------------------------------------------------------------------------\r
1238 void WINAPI DXUTConvertDeviceSettings11to9( DXUTD3D11DeviceSettings* pIn, DXUTD3D9DeviceSettings* pOut )\r
1239 {\r
1240     pOut->AdapterOrdinal = pIn->AdapterOrdinal;\r
1241 \r
1242     if( pIn->DriverType == D3D_DRIVER_TYPE_HARDWARE )\r
1243         pOut->DeviceType = D3DDEVTYPE_HAL;\r
1244     else if( pIn->DriverType == D3D_DRIVER_TYPE_REFERENCE )\r
1245         pOut->DeviceType = D3DDEVTYPE_REF;\r
1246     else if( pIn->DriverType == D3D_DRIVER_TYPE_NULL )\r
1247         pOut->DeviceType = D3DDEVTYPE_NULLREF;\r
1248 \r
1249     pOut->AdapterFormat = ConvertFormatDXGIToD3D9( pIn->sd.BufferDesc.Format );\r
1250     pOut->BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;\r
1251     pOut->pp.BackBufferWidth = pIn->sd.BufferDesc.Width;\r
1252     pOut->pp.BackBufferHeight = pIn->sd.BufferDesc.Height;\r
1253     pOut->pp.BackBufferFormat = ConvertFormatDXGIToD3D9( pIn->sd.BufferDesc.Format );\r
1254     pOut->pp.BackBufferCount = pIn->sd.BufferCount;\r
1255     pOut->pp.MultiSampleType = ( D3DMULTISAMPLE_TYPE )pIn->sd.SampleDesc.Count;\r
1256     pOut->pp.MultiSampleQuality = pIn->sd.SampleDesc.Quality;\r
1257     pOut->pp.SwapEffect = D3DSWAPEFFECT_DISCARD;\r
1258     pOut->pp.hDeviceWindow = pIn->sd.OutputWindow;\r
1259     pOut->pp.Windowed = pIn->sd.Windowed;\r
1260     pOut->pp.EnableAutoDepthStencil = true;\r
1261     pOut->pp.AutoDepthStencilFormat = D3DFMT_D24FS8;\r
1262     pOut->pp.Flags = 0;\r
1263     if( pIn->sd.BufferDesc.RefreshRate.Denominator == 0 )\r
1264         pOut->pp.FullScreen_RefreshRateInHz = 60;\r
1265     else\r
1266         pOut->pp.FullScreen_RefreshRateInHz = pIn->sd.BufferDesc.RefreshRate.Numerator /\r
1267             pIn->sd.BufferDesc.RefreshRate.Denominator;\r
1268 \r
1269     switch( pIn->SyncInterval )\r
1270     {\r
1271         case 0:\r
1272             pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; break;\r
1273         case 2:\r
1274             pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_TWO; break;\r
1275         case 3:\r
1276             pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_THREE; break;\r
1277         case 4:\r
1278             pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_FOUR; break;\r
1279 \r
1280         case 1:\r
1281         default:\r
1282             pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;\r
1283             break;\r
1284     }\r
1285 }\r
1286 \r
1287 \r
1288 //--------------------------------------------------------------------------------------\r
1289 void WINAPI DXUTConvertDeviceSettings9to11( DXUTD3D9DeviceSettings* pIn, DXUTD3D11DeviceSettings* pOut )\r
1290 {\r
1291     pOut->AdapterOrdinal = pIn->AdapterOrdinal;\r
1292 \r
1293     if( pIn->DeviceType == D3DDEVTYPE_HAL )\r
1294         pOut->DriverType = D3D_DRIVER_TYPE_HARDWARE;\r
1295     else if( pIn->DeviceType == D3DDEVTYPE_REF )\r
1296         pOut->DriverType = D3D_DRIVER_TYPE_REFERENCE;\r
1297     else if( pIn->DeviceType == D3DDEVTYPE_NULLREF )\r
1298         pOut->DriverType = D3D_DRIVER_TYPE_NULL;\r
1299 \r
1300     pOut->Output = 0;\r
1301 \r
1302     pOut->sd.BufferDesc.Width = pIn->pp.BackBufferWidth;\r
1303     pOut->sd.BufferDesc.Height = pIn->pp.BackBufferHeight;\r
1304     pOut->sd.BufferDesc.RefreshRate.Numerator = pIn->pp.FullScreen_RefreshRateInHz;\r
1305     pOut->sd.BufferDesc.RefreshRate.Denominator = 1;\r
1306     pOut->sd.BufferDesc.Format = ConvertFormatD3D9ToDXGI( pIn->pp.BackBufferFormat );\r
1307 \r
1308     if( pIn->pp.MultiSampleType == D3DMULTISAMPLE_NONMASKABLE )\r
1309     {\r
1310         pOut->sd.SampleDesc.Count = pIn->pp.MultiSampleQuality;\r
1311         pOut->sd.SampleDesc.Quality = 0;\r
1312     }\r
1313     else\r
1314     {\r
1315         pOut->sd.SampleDesc.Count = pIn->pp.MultiSampleType;\r
1316         pOut->sd.SampleDesc.Quality = pIn->pp.MultiSampleQuality;\r
1317     }\r
1318 \r
1319     pOut->sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;\r
1320     pOut->sd.BufferCount = pIn->pp.BackBufferCount;\r
1321     pOut->sd.OutputWindow = pIn->pp.hDeviceWindow;\r
1322     pOut->sd.Windowed = pIn->pp.Windowed;\r
1323 \r
1324 #if defined(DEBUG) || defined(_DEBUG)\r
1325     pOut->CreateFlags = D3D11_CREATE_DEVICE_DEBUG;\r
1326 #else\r
1327     pOut->CreateFlags = 0;\r
1328 #endif\r
1329 \r
1330     switch( pIn->pp.PresentationInterval )\r
1331     {\r
1332         case D3DPRESENT_INTERVAL_IMMEDIATE:\r
1333             pOut->SyncInterval = 0; break;\r
1334         case D3DPRESENT_INTERVAL_ONE:\r
1335             pOut->SyncInterval = 1; break;\r
1336         case D3DPRESENT_INTERVAL_TWO:\r
1337             pOut->SyncInterval = 2; break;\r
1338         case D3DPRESENT_INTERVAL_THREE:\r
1339             pOut->SyncInterval = 3; break;\r
1340         case D3DPRESENT_INTERVAL_FOUR:\r
1341             pOut->SyncInterval = 4; break;\r
1342 \r
1343         case D3DPRESENT_INTERVAL_DEFAULT:\r
1344         default:\r
1345             pOut->SyncInterval = 1;\r
1346             break;\r
1347     }\r
1348 \r
1349     pOut->PresentFlags = 0;\r
1350 }\r
1351 \r
1352 \r
1353 \r
1354 DXGI_FORMAT WINAPI ConvertFormatD3D9ToDXGI( D3DFORMAT fmt )\r
1355 {\r
1356     switch( fmt )\r
1357     {\r
1358         case D3DFMT_UNKNOWN:\r
1359             return DXGI_FORMAT_UNKNOWN;\r
1360         case D3DFMT_R8G8B8:\r
1361         case D3DFMT_A8R8G8B8:\r
1362         case D3DFMT_X8R8G8B8:\r
1363             return DXGI_FORMAT_R8G8B8A8_UNORM;\r
1364         case D3DFMT_R5G6B5:\r
1365             return DXGI_FORMAT_B5G6R5_UNORM;\r
1366         case D3DFMT_X1R5G5B5:\r
1367         case D3DFMT_A1R5G5B5:\r
1368             return DXGI_FORMAT_B5G5R5A1_UNORM;\r
1369         case D3DFMT_A4R4G4B4:\r
1370             return DXGI_FORMAT_R8G8B8A8_UNORM;\r
1371         case D3DFMT_R3G3B2:\r
1372             return DXGI_FORMAT_R8G8B8A8_UNORM;\r
1373         case D3DFMT_A8:\r
1374             return DXGI_FORMAT_A8_UNORM;\r
1375         case D3DFMT_A8R3G3B2:\r
1376             return DXGI_FORMAT_R8G8B8A8_UNORM;\r
1377         case D3DFMT_X4R4G4B4:\r
1378             return DXGI_FORMAT_R8G8B8A8_UNORM;\r
1379         case D3DFMT_A2B10G10R10:\r
1380             return DXGI_FORMAT_R10G10B10A2_UNORM;\r
1381         case D3DFMT_A8B8G8R8:\r
1382         case D3DFMT_X8B8G8R8:\r
1383             return DXGI_FORMAT_B8G8R8A8_UNORM;\r
1384         case D3DFMT_G16R16:\r
1385             return DXGI_FORMAT_R16G16_UNORM;\r
1386         case D3DFMT_A2R10G10B10:\r
1387             return DXGI_FORMAT_R10G10B10A2_UNORM;\r
1388         case D3DFMT_A16B16G16R16:\r
1389             return DXGI_FORMAT_R16G16B16A16_UNORM;\r
1390         case D3DFMT_R16F:\r
1391             return DXGI_FORMAT_R16_FLOAT;\r
1392         case D3DFMT_G16R16F:\r
1393             return DXGI_FORMAT_R16G16_FLOAT;\r
1394         case D3DFMT_A16B16G16R16F:\r
1395             return DXGI_FORMAT_R16G16B16A16_FLOAT;\r
1396         case D3DFMT_R32F:\r
1397             return DXGI_FORMAT_R32_FLOAT;\r
1398         case D3DFMT_G32R32F:\r
1399             return DXGI_FORMAT_R32G32_FLOAT;\r
1400         case D3DFMT_A32B32G32R32F:\r
1401             return DXGI_FORMAT_R32G32B32A32_FLOAT;\r
1402     }\r
1403     return DXGI_FORMAT_UNKNOWN;\r
1404 }\r
1405 \r
1406 \r
1407 D3DFORMAT WINAPI ConvertFormatDXGIToD3D9( DXGI_FORMAT fmt )\r
1408 {\r
1409     switch( fmt )\r
1410     {\r
1411         case DXGI_FORMAT_UNKNOWN:\r
1412             return D3DFMT_UNKNOWN;\r
1413         case DXGI_FORMAT_R8G8B8A8_UNORM:\r
1414             return D3DFMT_A8R8G8B8;\r
1415         case DXGI_FORMAT_B5G6R5_UNORM:\r
1416             return D3DFMT_R5G6B5;\r
1417         case DXGI_FORMAT_B5G5R5A1_UNORM:\r
1418             return D3DFMT_A1R5G5B5;\r
1419         case DXGI_FORMAT_A8_UNORM:\r
1420             return D3DFMT_A8;\r
1421         case DXGI_FORMAT_R10G10B10A2_UNORM:\r
1422             return D3DFMT_A2B10G10R10;\r
1423         case DXGI_FORMAT_B8G8R8A8_UNORM:\r
1424             return D3DFMT_A8B8G8R8;\r
1425         case DXGI_FORMAT_R16G16_UNORM:\r
1426             return D3DFMT_G16R16;\r
1427         case DXGI_FORMAT_R16G16B16A16_UNORM:\r
1428             return D3DFMT_A16B16G16R16;\r
1429         case DXGI_FORMAT_R16_FLOAT:\r
1430             return D3DFMT_R16F;\r
1431         case DXGI_FORMAT_R16G16_FLOAT:\r
1432             return D3DFMT_G16R16F;\r
1433         case DXGI_FORMAT_R16G16B16A16_FLOAT:\r
1434             return D3DFMT_A16B16G16R16F;\r
1435         case DXGI_FORMAT_R32_FLOAT:\r
1436             return D3DFMT_R32F;\r
1437         case DXGI_FORMAT_R32G32_FLOAT:\r
1438             return D3DFMT_G32R32F;\r
1439         case DXGI_FORMAT_R32G32B32A32_FLOAT:\r
1440             return D3DFMT_A32B32G32R32F;\r
1441     }\r
1442     return D3DFMT_UNKNOWN;\r
1443 }\r
1444 \r
1445 //--------------------------------------------------------------------------------------\r
1446 IDirect3DDevice9* WINAPI DXUTCreateRefDevice9( HWND hWnd, bool bNullRef )\r
1447 {\r
1448     HRESULT hr;\r
1449     IDirect3D9* pD3D = DXUT_Dynamic_Direct3DCreate9( D3D_SDK_VERSION );\r
1450     if( NULL == pD3D )\r
1451         return NULL;\r
1452 \r
1453     D3DDISPLAYMODE Mode;\r
1454     pD3D->GetAdapterDisplayMode( 0, &Mode );\r
1455 \r
1456     D3DPRESENT_PARAMETERS pp;\r
1457     ZeroMemory( &pp, sizeof( D3DPRESENT_PARAMETERS ) );\r
1458     pp.BackBufferWidth = 1;\r
1459     pp.BackBufferHeight = 1;\r
1460     pp.BackBufferFormat = Mode.Format;\r
1461     pp.BackBufferCount = 1;\r
1462     pp.SwapEffect = D3DSWAPEFFECT_COPY;\r
1463     pp.Windowed = TRUE;\r
1464     pp.hDeviceWindow = hWnd;\r
1465 \r
1466     IDirect3DDevice9* pd3dDevice = NULL;\r
1467     hr = pD3D->CreateDevice( D3DADAPTER_DEFAULT, bNullRef ? D3DDEVTYPE_NULLREF : D3DDEVTYPE_REF,\r
1468                              hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &pd3dDevice );\r
1469 \r
1470     SAFE_RELEASE( pD3D );\r
1471     return pd3dDevice;\r
1472 }\r
1473 \r
1474 \r
1475 //--------------------------------------------------------------------------------------\r
1476 // Helper function to launch the Media Center UI after the program terminates\r
1477 //--------------------------------------------------------------------------------------\r
1478 bool DXUTReLaunchMediaCenter()\r
1479 {\r
1480     // Get the path to Media Center\r
1481     WCHAR szExpandedPath[MAX_PATH];\r
1482     if( !ExpandEnvironmentStrings( L"%SystemRoot%\\ehome\\ehshell.exe", szExpandedPath, MAX_PATH ) )\r
1483         return false;\r
1484 \r
1485     // Skip if ehshell.exe doesn't exist\r
1486     if( GetFileAttributes( szExpandedPath ) == 0xFFFFFFFF )\r
1487         return false;\r
1488 \r
1489     // Launch ehshell.exe \r
1490     INT_PTR result = ( INT_PTR )ShellExecute( NULL, TEXT( "open" ), szExpandedPath, NULL, NULL, SW_SHOWNORMAL );\r
1491     return ( result > 32 );\r
1492 }\r
1493 \r
1494 typedef DWORD ( WINAPI* LPXINPUTGETSTATE )( DWORD dwUserIndex, XINPUT_STATE* pState );\r
1495 typedef DWORD ( WINAPI* LPXINPUTSETSTATE )( DWORD dwUserIndex, XINPUT_VIBRATION* pVibration );\r
1496 typedef DWORD ( WINAPI* LPXINPUTGETCAPABILITIES )( DWORD dwUserIndex, DWORD dwFlags,\r
1497                                                    XINPUT_CAPABILITIES* pCapabilities );\r
1498 typedef void ( WINAPI* LPXINPUTENABLE )( BOOL bEnable );\r
1499 \r
1500 //--------------------------------------------------------------------------------------\r
1501 // Does extra processing on XInput data to make it slightly more convenient to use\r
1502 //--------------------------------------------------------------------------------------\r
1503 HRESULT DXUTGetGamepadState( DWORD dwPort, DXUT_GAMEPAD* pGamePad, bool bThumbstickDeadZone,\r
1504                              bool bSnapThumbstickToCardinals )\r
1505 {\r
1506     if( dwPort >= DXUT_MAX_CONTROLLERS || pGamePad == NULL )\r
1507         return E_FAIL;\r
1508 \r
1509     static LPXINPUTGETSTATE s_pXInputGetState = NULL;\r
1510     static LPXINPUTGETCAPABILITIES s_pXInputGetCapabilities = NULL;\r
1511     if( NULL == s_pXInputGetState || NULL == s_pXInputGetCapabilities )\r
1512     {\r
1513         HINSTANCE hInst = LoadLibrary( XINPUT_DLL );\r
1514         if( hInst )\r
1515         {\r
1516             s_pXInputGetState = ( LPXINPUTGETSTATE )GetProcAddress( hInst, "XInputGetState" );\r
1517             s_pXInputGetCapabilities = ( LPXINPUTGETCAPABILITIES )GetProcAddress( hInst, "XInputGetCapabilities" );\r
1518         }\r
1519     }\r
1520     if( s_pXInputGetState == NULL )\r
1521         return E_FAIL;\r
1522 \r
1523     XINPUT_STATE InputState;\r
1524     DWORD dwResult = s_pXInputGetState( dwPort, &InputState );\r
1525 \r
1526     // Track insertion and removals\r
1527     BOOL bWasConnected = pGamePad->bConnected;\r
1528     pGamePad->bConnected = ( dwResult == ERROR_SUCCESS );\r
1529     pGamePad->bRemoved = ( bWasConnected && !pGamePad->bConnected );\r
1530     pGamePad->bInserted = ( !bWasConnected && pGamePad->bConnected );\r
1531 \r
1532     // Don't update rest of the state if not connected\r
1533     if( !pGamePad->bConnected )\r
1534         return S_OK;\r
1535 \r
1536     // Store the capabilities of the device\r
1537     if( pGamePad->bInserted )\r
1538     {\r
1539         ZeroMemory( pGamePad, sizeof( DXUT_GAMEPAD ) );\r
1540         pGamePad->bConnected = true;\r
1541         pGamePad->bInserted = true;\r
1542         if( s_pXInputGetCapabilities )\r
1543             s_pXInputGetCapabilities( dwPort, XINPUT_DEVTYPE_GAMEPAD, &pGamePad->caps );\r
1544     }\r
1545 \r
1546     // Copy gamepad to local structure (assumes that XINPUT_GAMEPAD at the front in CONTROLER_STATE)\r
1547     memcpy( pGamePad, &InputState.Gamepad, sizeof( XINPUT_GAMEPAD ) );\r
1548 \r
1549     if( bSnapThumbstickToCardinals )\r
1550     {\r
1551         // Apply deadzone to each axis independantly to slightly snap to up/down/left/right\r
1552         if( pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE &&\r
1553             pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE )\r
1554             pGamePad->sThumbLX = 0;\r
1555         if( pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE &&\r
1556             pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE )\r
1557             pGamePad->sThumbLY = 0;\r
1558         if( pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&\r
1559             pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE )\r
1560             pGamePad->sThumbRX = 0;\r
1561         if( pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&\r
1562             pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE )\r
1563             pGamePad->sThumbRY = 0;\r
1564     }\r
1565     else if( bThumbstickDeadZone )\r
1566     {\r
1567         // Apply deadzone if centered\r
1568         if( ( pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE &&\r
1569               pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) &&\r
1570             ( pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE &&\r
1571               pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) )\r
1572         {\r
1573             pGamePad->sThumbLX = 0;\r
1574             pGamePad->sThumbLY = 0;\r
1575         }\r
1576         if( ( pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&\r
1577               pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) &&\r
1578             ( pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&\r
1579               pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) )\r
1580         {\r
1581             pGamePad->sThumbRX = 0;\r
1582             pGamePad->sThumbRY = 0;\r
1583         }\r
1584     }\r
1585 \r
1586     // Convert [-1,+1] range\r
1587     pGamePad->fThumbLX = pGamePad->sThumbLX / 32767.0f;\r
1588     pGamePad->fThumbLY = pGamePad->sThumbLY / 32767.0f;\r
1589     pGamePad->fThumbRX = pGamePad->sThumbRX / 32767.0f;\r
1590     pGamePad->fThumbRY = pGamePad->sThumbRY / 32767.0f;\r
1591 \r
1592     // Get the boolean buttons that have been pressed since the last call. \r
1593     // Each button is represented by one bit.\r
1594     pGamePad->wPressedButtons = ( pGamePad->wLastButtons ^ pGamePad->wButtons ) & pGamePad->wButtons;\r
1595     pGamePad->wLastButtons = pGamePad->wButtons;\r
1596 \r
1597     // Figure out if the left trigger has been pressed or released\r
1598     bool bPressed = ( pGamePad->bLeftTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD );\r
1599     pGamePad->bPressedLeftTrigger = ( bPressed ) ? !pGamePad->bLastLeftTrigger : false;\r
1600     pGamePad->bLastLeftTrigger = bPressed;\r
1601 \r
1602     // Figure out if the right trigger has been pressed or released\r
1603     bPressed = ( pGamePad->bRightTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD );\r
1604     pGamePad->bPressedRightTrigger = ( bPressed ) ? !pGamePad->bLastRightTrigger : false;\r
1605     pGamePad->bLastRightTrigger = bPressed;\r
1606 \r
1607     return S_OK;\r
1608 }\r
1609 \r
1610 \r
1611 //--------------------------------------------------------------------------------------\r
1612 // Don't pause the game or deactive the window without first stopping rumble otherwise \r
1613 // the controller will continue to rumble\r
1614 //--------------------------------------------------------------------------------------\r
1615 void DXUTEnableXInput( bool bEnable )\r
1616 {\r
1617     static LPXINPUTENABLE s_pXInputEnable = NULL;\r
1618     if( NULL == s_pXInputEnable )\r
1619     {\r
1620         HINSTANCE hInst = LoadLibrary( XINPUT_DLL );\r
1621         if( hInst )\r
1622             s_pXInputEnable = ( LPXINPUTENABLE )GetProcAddress( hInst, "XInputEnable" );\r
1623     }\r
1624 \r
1625     if( s_pXInputEnable )\r
1626         s_pXInputEnable( bEnable );\r
1627 }\r
1628 \r
1629 \r
1630 //--------------------------------------------------------------------------------------\r
1631 // Don't pause the game or deactive the window without first stopping rumble otherwise \r
1632 // the controller will continue to rumble\r
1633 //--------------------------------------------------------------------------------------\r
1634 HRESULT DXUTStopRumbleOnAllControllers()\r
1635 {\r
1636     static LPXINPUTSETSTATE s_pXInputSetState = NULL;\r
1637     if( NULL == s_pXInputSetState )\r
1638     {\r
1639         HINSTANCE hInst = LoadLibrary( XINPUT_DLL );\r
1640         if( hInst )\r
1641             s_pXInputSetState = ( LPXINPUTSETSTATE )GetProcAddress( hInst, "XInputSetState" );\r
1642     }\r
1643     if( s_pXInputSetState == NULL )\r
1644         return E_FAIL;\r
1645 \r
1646     XINPUT_VIBRATION vibration;\r
1647     vibration.wLeftMotorSpeed = 0;\r
1648     vibration.wRightMotorSpeed = 0;\r
1649     for( int iUserIndex = 0; iUserIndex < DXUT_MAX_CONTROLLERS; iUserIndex++ )\r
1650         s_pXInputSetState( iUserIndex, &vibration );\r
1651 \r
1652     return S_OK;\r
1653 }\r
1654 \r
1655 //--------------------------------------------------------------------------------------\r
1656 // Helper functions to create SRGB formats from typeless formats and vice versa\r
1657 //--------------------------------------------------------------------------------------\r
1658 DXGI_FORMAT MAKE_SRGB( DXGI_FORMAT format )\r
1659 {\r
1660     if( !DXUTIsInGammaCorrectMode() )\r
1661         return format;\r
1662 \r
1663     switch( format )\r
1664     {\r
1665         case DXGI_FORMAT_R8G8B8A8_TYPELESS:\r
1666         case DXGI_FORMAT_R8G8B8A8_UNORM:\r
1667         case DXGI_FORMAT_R8G8B8A8_UINT:\r
1668         case DXGI_FORMAT_R8G8B8A8_SNORM:\r
1669         case DXGI_FORMAT_R8G8B8A8_SINT:\r
1670             return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;\r
1671 \r
1672         case DXGI_FORMAT_BC1_TYPELESS:\r
1673         case DXGI_FORMAT_BC1_UNORM:\r
1674             return DXGI_FORMAT_BC1_UNORM_SRGB;\r
1675         case DXGI_FORMAT_BC2_TYPELESS:\r
1676         case DXGI_FORMAT_BC2_UNORM:\r
1677             return DXGI_FORMAT_BC2_UNORM_SRGB;\r
1678         case DXGI_FORMAT_BC3_TYPELESS:\r
1679         case DXGI_FORMAT_BC3_UNORM:\r
1680             return DXGI_FORMAT_BC3_UNORM_SRGB;\r
1681 \r
1682     };\r
1683 \r
1684     return format;\r
1685 }\r
1686 \r
1687 //--------------------------------------------------------------------------------------\r
1688 DXGI_FORMAT MAKE_TYPELESS( DXGI_FORMAT format )\r
1689 {\r
1690     if( !DXUTIsInGammaCorrectMode() )\r
1691         return format;\r
1692 \r
1693     switch( format )\r
1694     {\r
1695         case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:\r
1696         case DXGI_FORMAT_R8G8B8A8_UNORM:\r
1697         case DXGI_FORMAT_R8G8B8A8_UINT:\r
1698         case DXGI_FORMAT_R8G8B8A8_SNORM:\r
1699         case DXGI_FORMAT_R8G8B8A8_SINT:\r
1700             return DXGI_FORMAT_R8G8B8A8_TYPELESS;\r
1701 \r
1702         case DXGI_FORMAT_BC1_UNORM_SRGB:\r
1703         case DXGI_FORMAT_BC1_UNORM:\r
1704             return DXGI_FORMAT_BC1_TYPELESS;\r
1705         case DXGI_FORMAT_BC2_UNORM_SRGB:\r
1706         case DXGI_FORMAT_BC2_UNORM:\r
1707             return DXGI_FORMAT_BC2_TYPELESS;\r
1708         case DXGI_FORMAT_BC3_UNORM_SRGB:\r
1709         case DXGI_FORMAT_BC3_UNORM:\r
1710             return DXGI_FORMAT_BC3_TYPELESS;\r
1711     };\r
1712 \r
1713     return format;\r
1714 }\r
1715 \r
1716 //--------------------------------------------------------------------------------------\r
1717 HRESULT DXUTSnapD3D9Screenshot( LPCTSTR szFileName )\r
1718 {\r
1719     HRESULT hr = S_OK;\r
1720     IDirect3DDevice9* pDev = DXUTGetD3D9Device();\r
1721     if( !pDev )\r
1722         return E_FAIL;\r
1723 \r
1724     IDirect3DSurface9* pBackBuffer = NULL;\r
1725     V_RETURN( pDev->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ) );\r
1726 \r
1727     return D3DXSaveSurfaceToFile( szFileName, D3DXIFF_BMP, pBackBuffer, NULL, NULL );\r
1728 }\r
1729 \r
1730 \r
1731 \r
1732 \r
1733 //-------------------------------------------------------------------------------------- \r
1734 HRESULT DXUTSnapD3D11Screenshot( LPCTSTR szFileName, D3DX11_IMAGE_FILE_FORMAT iff )\r
1735 {\r
1736     IDXGISwapChain *pSwap = DXUTGetDXGISwapChain();\r
1737 \r
1738     if (!pSwap)\r
1739         return E_FAIL;\r
1740     \r
1741     ID3D11Texture2D* pBackBuffer;\r
1742     HRESULT hr = pSwap->GetBuffer( 0, __uuidof( *pBackBuffer ), ( LPVOID* )&pBackBuffer );\r
1743     if (hr != S_OK)\r
1744         return hr;\r
1745 \r
1746     ID3D11DeviceContext *dc  = DXUTGetD3D11DeviceContext();\r
1747     if (!dc) {\r
1748         SAFE_RELEASE(pBackBuffer);\r
1749         return E_FAIL;\r
1750     }\r
1751     ID3D11Device *pDevice = DXUTGetD3D11Device();\r
1752     if (!dc) {\r
1753         SAFE_RELEASE(pBackBuffer);\r
1754         return E_FAIL;\r
1755     }\r
1756 \r
1757     D3D11_TEXTURE2D_DESC dsc;\r
1758     pBackBuffer->GetDesc(&dsc);\r
1759     D3D11_RESOURCE_DIMENSION dim;\r
1760     pBackBuffer->GetType(&dim);\r
1761     // special case msaa textures\r
1762     ID3D11Texture2D *pCompatableTexture = pBackBuffer;\r
1763     if ( dsc.SampleDesc.Count > 1) {\r
1764         D3D11_TEXTURE2D_DESC dsc_new = dsc;\r
1765         dsc_new.SampleDesc.Count = 1;\r
1766         dsc_new.SampleDesc.Quality = 0;\r
1767         dsc_new.Usage = D3D11_USAGE_DEFAULT;\r
1768         dsc_new.BindFlags = 0;\r
1769         dsc_new.CPUAccessFlags = 0;\r
1770         ID3D11Texture2D *resolveTexture;\r
1771         hr = pDevice->CreateTexture2D(&dsc_new, NULL, &resolveTexture);\r
1772         dc->ResolveSubresource(resolveTexture, 0, pBackBuffer, 0, dsc.Format);\r
1773         pCompatableTexture = resolveTexture;\r
1774         pCompatableTexture->GetDesc(&dsc);\r
1775     }\r
1776 \r
1777     hr = D3DX11SaveTextureToFileW(dc, pCompatableTexture, iff, szFileName); \r
1778     \r
1779     \r
1780     SAFE_RELEASE(pBackBuffer);\r
1781     SAFE_RELEASE(pCompatableTexture);\r
1782 \r
1783     return hr;\r
1784 \r
1785 }\r