1 //--------------------------------------------------------------------------------------
\r
2 // File: DXUTMisc.cpp
\r
4 // Shortcut macros and functions for using DX objects
\r
6 // Copyright (c) Microsoft Corporation. All rights reserved
\r
7 //--------------------------------------------------------------------------------------
\r
10 #define DXUT_GAMEPAD_TRIGGER_THRESHOLD 30
\r
11 #undef min // use __min instead
\r
12 #undef max // use __max instead
\r
14 CDXUTTimer* WINAPI DXUTGetGlobalTimer()
\r
16 // Using an accessor function gives control of the construction order
\r
17 static CDXUTTimer timer;
\r
22 //--------------------------------------------------------------------------------------
\r
23 CDXUTTimer::CDXUTTimer()
\r
25 m_bTimerStopped = true;
\r
26 m_llQPFTicksPerSec = 0;
\r
29 m_llLastElapsedTime = 0;
\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
39 //--------------------------------------------------------------------------------------
\r
40 void CDXUTTimer::Reset()
\r
42 LARGE_INTEGER qwTime = GetAdjustedCurrentTime();
\r
44 m_llBaseTime = qwTime.QuadPart;
\r
45 m_llLastElapsedTime = qwTime.QuadPart;
\r
47 m_bTimerStopped = FALSE;
\r
51 //--------------------------------------------------------------------------------------
\r
52 void CDXUTTimer::Start()
\r
54 // Get the current time
\r
55 LARGE_INTEGER qwTime = { 0 };
\r
56 QueryPerformanceCounter( &qwTime );
\r
58 if( m_bTimerStopped )
\r
59 m_llBaseTime += qwTime.QuadPart - m_llStopTime;
\r
61 m_llLastElapsedTime = qwTime.QuadPart;
\r
62 m_bTimerStopped = FALSE;
\r
66 //--------------------------------------------------------------------------------------
\r
67 void CDXUTTimer::Stop()
\r
69 if( !m_bTimerStopped )
\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
80 //--------------------------------------------------------------------------------------
\r
81 void CDXUTTimer::Advance()
\r
83 m_llStopTime += m_llQPFTicksPerSec / 10;
\r
87 //--------------------------------------------------------------------------------------
\r
88 double CDXUTTimer::GetAbsoluteTime()
\r
90 LARGE_INTEGER qwTime = { 0 };
\r
91 QueryPerformanceCounter( &qwTime );
\r
93 double fTime = qwTime.QuadPart / ( double )m_llQPFTicksPerSec;
\r
99 //--------------------------------------------------------------------------------------
\r
100 double CDXUTTimer::GetTime()
\r
102 LARGE_INTEGER qwTime = GetAdjustedCurrentTime();
\r
104 double fAppTime = ( double )( qwTime.QuadPart - m_llBaseTime ) / ( double )m_llQPFTicksPerSec;
\r
110 //--------------------------------------------------------------------------------------
\r
111 void CDXUTTimer::GetTimeValues( double* pfTime, double* pfAbsoluteTime, float* pfElapsedTime )
\r
113 assert( pfTime && pfAbsoluteTime && pfElapsedTime );
\r
115 LARGE_INTEGER qwTime = GetAdjustedCurrentTime();
\r
117 float fElapsedTime = (float) ((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec);
\r
118 m_llLastElapsedTime = qwTime.QuadPart;
\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
130 *pfAbsoluteTime = qwTime.QuadPart / ( double )m_llQPFTicksPerSec;
\r
131 *pfTime = ( qwTime.QuadPart - m_llBaseTime ) / ( double )m_llQPFTicksPerSec;
\r
132 *pfElapsedTime = fElapsedTime;
\r
136 //--------------------------------------------------------------------------------------
\r
137 float CDXUTTimer::GetElapsedTime()
\r
139 LARGE_INTEGER qwTime = GetAdjustedCurrentTime();
\r
141 double fElapsedTime = (float) ((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec);
\r
142 m_llLastElapsedTime = qwTime.QuadPart;
\r
144 // See the explanation about clamping in CDXUTTimer::GetTimeValues()
\r
145 if( fElapsedTime < 0.0f )
\r
146 fElapsedTime = 0.0f;
\r
148 return ( float )fElapsedTime;
\r
152 //--------------------------------------------------------------------------------------
\r
153 // If stopped, returns time when stopped otherwise returns current time
\r
154 //--------------------------------------------------------------------------------------
\r
155 LARGE_INTEGER CDXUTTimer::GetAdjustedCurrentTime()
\r
157 LARGE_INTEGER qwTime;
\r
158 if( m_llStopTime != 0 )
\r
159 qwTime.QuadPart = m_llStopTime;
\r
161 QueryPerformanceCounter( &qwTime );
\r
165 //--------------------------------------------------------------------------------------
\r
166 bool CDXUTTimer::IsStopped()
\r
168 return m_bTimerStopped;
\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
178 HANDLE hCurrentProcess = GetCurrentProcess();
\r
180 // Get the processor affinity mask for this process
\r
181 DWORD_PTR dwProcessAffinityMask = 0;
\r
182 DWORD_PTR dwSystemAffinityMask = 0;
\r
184 if( GetProcessAffinityMask( hCurrentProcess, &dwProcessAffinityMask, &dwSystemAffinityMask ) != 0 &&
\r
185 dwProcessAffinityMask )
\r
187 // Find the lowest processor that our process is allows to run against
\r
188 DWORD_PTR dwAffinityMask = ( dwProcessAffinityMask & ( ( ~dwProcessAffinityMask ) + 1 ) );
\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
195 SetThreadAffinityMask( hCurrentThread, dwAffinityMask );
\r
196 CloseHandle( hCurrentThread );
\r
200 CloseHandle( hCurrentProcess );
\r
204 //--------------------------------------------------------------------------------------
\r
205 // Returns the string for the given D3DFORMAT.
\r
206 //--------------------------------------------------------------------------------------
\r
207 LPCWSTR WINAPI DXUTD3DFormatToString( D3DFORMAT format, bool bWithPrefix )
\r
209 WCHAR* pstr = NULL;
\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
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
249 pstr = L"D3DFMT_A8P8"; break;
\r
251 pstr = L"D3DFMT_P8"; break;
\r
253 pstr = L"D3DFMT_L8"; break;
\r
255 pstr = L"D3DFMT_A8L8"; break;
\r
257 pstr = L"D3DFMT_A4L4"; break;
\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
271 pstr = L"D3DFMT_UYVY"; break;
\r
273 pstr = L"D3DFMT_YUY2"; break;
\r
275 pstr = L"D3DFMT_DXT1"; break;
\r
277 pstr = L"D3DFMT_DXT2"; break;
\r
279 pstr = L"D3DFMT_DXT3"; break;
\r
281 pstr = L"D3DFMT_DXT4"; break;
\r
283 pstr = L"D3DFMT_DXT5"; break;
\r
284 case D3DFMT_D16_LOCKABLE:
\r
285 pstr = L"D3DFMT_D16_LOCKABLE"; break;
\r
287 pstr = L"D3DFMT_D32"; break;
\r
289 pstr = L"D3DFMT_D15S1"; break;
\r
291 pstr = L"D3DFMT_D24S8"; break;
\r
293 pstr = L"D3DFMT_D24X8"; break;
\r
294 case D3DFMT_D24X4S4:
\r
295 pstr = L"D3DFMT_D24X4S4"; break;
\r
297 pstr = L"D3DFMT_D16"; break;
\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
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
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
325 pstr = L"Unknown format"; break;
\r
327 if( bWithPrefix || wcsstr( pstr, L"D3DFMT_" ) == NULL )
\r
330 return pstr + lstrlen( L"D3DFMT_" );
\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
339 WCHAR* pstr = NULL;
\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
517 pstr = L"Unknown format"; break;
\r
519 if( bWithPrefix || wcsstr( pstr, L"DXGI_FORMAT_" ) == NULL )
\r
522 return pstr + lstrlen( L"DXGI_FORMAT_" );
\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
531 #if defined(DEBUG) || defined(_DEBUG)
\r
532 WCHAR strBuffer[512];
\r
535 va_start(args, strMsg);
\r
536 vswprintf_s( strBuffer, 512, strMsg, args );
\r
537 strBuffer[511] = L'\0';
\r
540 OutputDebugString( strBuffer );
\r
542 UNREFERENCED_PARAMETER( strMsg );
\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
552 #if defined(DEBUG) || defined(_DEBUG)
\r
553 CHAR strBuffer[512];
\r
556 va_start(args, strMsg);
\r
557 sprintf_s( strBuffer, 512, strMsg, args );
\r
558 strBuffer[511] = '\0';
\r
561 OutputDebugStringA( strBuffer );
\r
563 UNREFERENCED_PARAMETER( strMsg );
\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
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
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
600 // Ensure function pointers are initialized
\r
601 static bool DXUT_EnsureD3D9APIs( void )
\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
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
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
622 return s_hModD3D9 != NULL;
\r
625 bool DXUT_EnsureD3D11APIs( void )
\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
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
636 s_DynamicD3D11CreateDevice = ( LPD3D11CREATEDEVICE )GetProcAddress( s_hModD3D11, "D3D11CreateDevice" );
\r
639 if( !s_DynamicCreateDXGIFactory )
\r
641 s_hModDXGI = LoadLibrary( L"dxgi.dll" );
\r
644 s_DynamicCreateDXGIFactory = ( LPCREATEDXGIFACTORY )GetProcAddress( s_hModDXGI, "CreateDXGIFactory1" );
\r
647 return ( s_hModDXGI != NULL ) && ( s_hModD3D11 != NULL );
\r
650 return ( s_hModD3D11 != NULL );
\r
653 IDirect3D9* WINAPI DXUT_Dynamic_Direct3DCreate9( UINT SDKVersion )
\r
655 if( DXUT_EnsureD3D9APIs() && s_DynamicDirect3DCreate9 != NULL )
\r
656 return s_DynamicDirect3DCreate9( SDKVersion );
\r
661 int WINAPI DXUT_Dynamic_D3DPERF_BeginEvent( D3DCOLOR col, LPCWSTR wszName )
\r
663 if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_BeginEvent != NULL )
\r
664 return s_DynamicD3DPERF_BeginEvent( col, wszName );
\r
669 int WINAPI DXUT_Dynamic_D3DPERF_EndEvent( void )
\r
671 if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_EndEvent != NULL )
\r
672 return s_DynamicD3DPERF_EndEvent();
\r
677 void WINAPI DXUT_Dynamic_D3DPERF_SetMarker( D3DCOLOR col, LPCWSTR wszName )
\r
679 if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetMarker != NULL )
\r
680 s_DynamicD3DPERF_SetMarker( col, wszName );
\r
683 void WINAPI DXUT_Dynamic_D3DPERF_SetRegion( D3DCOLOR col, LPCWSTR wszName )
\r
685 if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetRegion != NULL )
\r
686 s_DynamicD3DPERF_SetRegion( col, wszName );
\r
689 BOOL WINAPI DXUT_Dynamic_D3DPERF_QueryRepeatFrame( void )
\r
691 if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_QueryRepeatFrame != NULL )
\r
692 return s_DynamicD3DPERF_QueryRepeatFrame();
\r
697 void WINAPI DXUT_Dynamic_D3DPERF_SetOptions( DWORD dwOptions )
\r
699 if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetOptions != NULL )
\r
700 s_DynamicD3DPERF_SetOptions( dwOptions );
\r
703 DWORD WINAPI DXUT_Dynamic_D3DPERF_GetStatus( void )
\r
705 if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_GetStatus != NULL )
\r
706 return s_DynamicD3DPERF_GetStatus();
\r
711 HRESULT WINAPI DXUT_Dynamic_CreateDXGIFactory1( REFIID rInterface, void** ppOut )
\r
713 if( DXUT_EnsureD3D11APIs() && s_DynamicCreateDXGIFactory != NULL )
\r
714 return s_DynamicCreateDXGIFactory( rInterface, ppOut );
\r
716 return DXUTERR_NODIRECT3D11;
\r
721 HRESULT WINAPI DXUT_Dynamic_D3D11CreateDevice( IDXGIAdapter* pAdapter,
\r
722 D3D_DRIVER_TYPE DriverType,
\r
725 D3D_FEATURE_LEVEL* pFeatureLevels,
\r
726 UINT FeatureLevels,
\r
728 ID3D11Device** ppDevice,
\r
729 D3D_FEATURE_LEVEL* pFeatureLevel,
\r
730 ID3D11DeviceContext** ppImmediateContext )
\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
736 return DXUTERR_NODIRECT3D11;
\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
745 for( iDecl = 0; iDecl < MAX_FVF_DECL_SIZE; iDecl++ )
\r
747 if( decl[iDecl].Stream == 0xFF )
\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
759 DXUTOutputDebugString( L"decl[%d]=D3DDECL_END\n", iDecl );
\r
762 #define TRACE_ID(iD) case iD: return L#iD;
\r
764 //--------------------------------------------------------------------------------------
\r
765 WCHAR* WINAPI DXUTTraceWindowsMessage( UINT uMsg )
\r
770 TRACE_ID(WM_CREATE);
\r
771 TRACE_ID(WM_DESTROY);
\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
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
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
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
955 TRACE_ID(WM_PASTE);
\r
956 TRACE_ID(WM_CLEAR);
\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
989 //--------------------------------------------------------------------------------------
\r
990 WCHAR* WINAPI DXUTTraceD3DDECLTYPEtoString( BYTE t )
\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
1031 return L"D3DDECLTYPE Unknown";
\r
1035 WCHAR* WINAPI DXUTTraceD3DDECLMETHODtoString( BYTE m )
\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
1054 return L"D3DDECLMETHOD Unknown";
\r
1058 WCHAR* WINAPI DXUTTraceD3DDECLUSAGEtoString( BYTE u )
\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
1091 return L"D3DDECLUSAGE Unknown";
\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
1104 BOOL WINAPI DXUTGetMonitorInfo( HMONITOR hMonitor, LPMONITORINFO lpMonitorInfo )
\r
1106 static bool s_bInited = false;
\r
1107 static LPGETMONITORINFO s_pFnGetMonitorInfo = NULL;
\r
1111 HMODULE hUser32 = GetModuleHandle( L"USER32" );
\r
1114 OSVERSIONINFOA osvi =
\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
1125 if( s_pFnGetMonitorInfo )
\r
1126 return s_pFnGetMonitorInfo( hMonitor, lpMonitorInfo );
\r
1129 if( ( hMonitor == DXUT_PRIMARY_MONITOR ) && lpMonitorInfo && ( lpMonitorInfo->cbSize >= sizeof( MONITORINFO ) ) &&
\r
1130 SystemParametersInfoA( SPI_GETWORKAREA, 0, &rcWork, 0 ) )
\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
1144 HMONITOR WINAPI DXUTMonitorFromWindow( HWND hWnd, DWORD dwFlags )
\r
1146 static bool s_bInited = false;
\r
1147 static LPMONITORFROMWINDOW s_pFnGetMonitorFromWindow = NULL;
\r
1151 HMODULE hUser32 = GetModuleHandle( L"USER32" );
\r
1152 if( hUser32 ) s_pFnGetMonitorFromWindow = ( LPMONITORFROMWINDOW )GetProcAddress( hUser32,
\r
1153 "MonitorFromWindow" );
\r
1156 if( s_pFnGetMonitorFromWindow )
\r
1157 return s_pFnGetMonitorFromWindow( hWnd, dwFlags );
\r
1159 return DXUT_PRIMARY_MONITOR;
\r
1163 HMONITOR WINAPI DXUTMonitorFromRect( LPCRECT lprcScreenCoords, DWORD dwFlags )
\r
1165 static bool s_bInited = false;
\r
1166 static LPMONITORFROMRECT s_pFnGetMonitorFromRect = NULL;
\r
1170 HMODULE hUser32 = GetModuleHandle( L"USER32" );
\r
1171 if( hUser32 ) s_pFnGetMonitorFromRect = ( LPMONITORFROMRECT )GetProcAddress( hUser32, "MonitorFromRect" );
\r
1174 if( s_pFnGetMonitorFromRect )
\r
1175 return s_pFnGetMonitorFromRect( lprcScreenCoords, dwFlags );
\r
1177 return DXUT_PRIMARY_MONITOR;
\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
1187 DXUTDeviceSettings DeviceSettings = DXUTGetDeviceSettings();
\r
1189 WCHAR strDeviceName[256] = {0};
\r
1191 ZeroMemory( &devMode, sizeof( DEVMODE ) );
\r
1192 devMode.dmSize = sizeof( DEVMODE );
\r
1193 if( DeviceSettings.ver == DXUT_D3D9_DEVICE )
\r
1195 CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration();
\r
1196 CD3D9EnumAdapterInfo* pAdapterInfo = pd3dEnum->GetAdapterInfo( AdapterOrdinal );
\r
1197 if( pAdapterInfo )
\r
1199 MultiByteToWideChar( CP_ACP, 0, pAdapterInfo->AdapterIdentifier.DeviceName, -1, strDeviceName, 256 );
\r
1200 strDeviceName[255] = 0;
\r
1205 CD3D11Enumeration* pd3dEnum = DXUTGetD3D11Enumeration();
\r
1206 CD3D11EnumOutputInfo* pOutputInfo = pd3dEnum->GetOutputInfo( AdapterOrdinal, DeviceSettings.d3d11.Output );
\r
1209 wcscpy_s( strDeviceName, 256, pOutputInfo->Desc.DeviceName );
\r
1213 EnumDisplaySettings( strDeviceName, ENUM_REGISTRY_SETTINGS, &devMode );
\r
1215 *pWidth = devMode.dmPelsWidth;
\r
1217 *pHeight = devMode.dmPelsHeight;
\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
1227 bool bShowMsgBoxOnError = DXUTGetShowMsgBoxOnError();
\r
1228 if( bPopMsgBox && bShowMsgBoxOnError == false )
\r
1229 bPopMsgBox = false;
\r
1231 return DXTrace( strFile, dwLine, hr, strMsg, bPopMsgBox );
\r
1235 //--------------------------------------------------------------------------------------
\r
1237 //--------------------------------------------------------------------------------------
\r
1238 void WINAPI DXUTConvertDeviceSettings11to9( DXUTD3D11DeviceSettings* pIn, DXUTD3D9DeviceSettings* pOut )
\r
1240 pOut->AdapterOrdinal = pIn->AdapterOrdinal;
\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
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
1266 pOut->pp.FullScreen_RefreshRateInHz = pIn->sd.BufferDesc.RefreshRate.Numerator /
\r
1267 pIn->sd.BufferDesc.RefreshRate.Denominator;
\r
1269 switch( pIn->SyncInterval )
\r
1272 pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; break;
\r
1274 pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_TWO; break;
\r
1276 pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_THREE; break;
\r
1278 pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_FOUR; break;
\r
1282 pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
\r
1288 //--------------------------------------------------------------------------------------
\r
1289 void WINAPI DXUTConvertDeviceSettings9to11( DXUTD3D9DeviceSettings* pIn, DXUTD3D11DeviceSettings* pOut )
\r
1291 pOut->AdapterOrdinal = pIn->AdapterOrdinal;
\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
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
1308 if( pIn->pp.MultiSampleType == D3DMULTISAMPLE_NONMASKABLE )
\r
1310 pOut->sd.SampleDesc.Count = pIn->pp.MultiSampleQuality;
\r
1311 pOut->sd.SampleDesc.Quality = 0;
\r
1315 pOut->sd.SampleDesc.Count = pIn->pp.MultiSampleType;
\r
1316 pOut->sd.SampleDesc.Quality = pIn->pp.MultiSampleQuality;
\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
1324 #if defined(DEBUG) || defined(_DEBUG)
\r
1325 pOut->CreateFlags = D3D11_CREATE_DEVICE_DEBUG;
\r
1327 pOut->CreateFlags = 0;
\r
1330 switch( pIn->pp.PresentationInterval )
\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
1343 case D3DPRESENT_INTERVAL_DEFAULT:
\r
1345 pOut->SyncInterval = 1;
\r
1349 pOut->PresentFlags = 0;
\r
1354 DXGI_FORMAT WINAPI ConvertFormatD3D9ToDXGI( D3DFORMAT fmt )
\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
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
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
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
1403 return DXGI_FORMAT_UNKNOWN;
\r
1407 D3DFORMAT WINAPI ConvertFormatDXGIToD3D9( DXGI_FORMAT fmt )
\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
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
1442 return D3DFMT_UNKNOWN;
\r
1445 //--------------------------------------------------------------------------------------
\r
1446 IDirect3DDevice9* WINAPI DXUTCreateRefDevice9( HWND hWnd, bool bNullRef )
\r
1449 IDirect3D9* pD3D = DXUT_Dynamic_Direct3DCreate9( D3D_SDK_VERSION );
\r
1450 if( NULL == pD3D )
\r
1453 D3DDISPLAYMODE Mode;
\r
1454 pD3D->GetAdapterDisplayMode( 0, &Mode );
\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
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
1470 SAFE_RELEASE( pD3D );
\r
1471 return pd3dDevice;
\r
1475 //--------------------------------------------------------------------------------------
\r
1476 // Helper function to launch the Media Center UI after the program terminates
\r
1477 //--------------------------------------------------------------------------------------
\r
1478 bool DXUTReLaunchMediaCenter()
\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
1485 // Skip if ehshell.exe doesn't exist
\r
1486 if( GetFileAttributes( szExpandedPath ) == 0xFFFFFFFF )
\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
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
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
1506 if( dwPort >= DXUT_MAX_CONTROLLERS || pGamePad == NULL )
\r
1509 static LPXINPUTGETSTATE s_pXInputGetState = NULL;
\r
1510 static LPXINPUTGETCAPABILITIES s_pXInputGetCapabilities = NULL;
\r
1511 if( NULL == s_pXInputGetState || NULL == s_pXInputGetCapabilities )
\r
1513 HINSTANCE hInst = LoadLibrary( XINPUT_DLL );
\r
1516 s_pXInputGetState = ( LPXINPUTGETSTATE )GetProcAddress( hInst, "XInputGetState" );
\r
1517 s_pXInputGetCapabilities = ( LPXINPUTGETCAPABILITIES )GetProcAddress( hInst, "XInputGetCapabilities" );
\r
1520 if( s_pXInputGetState == NULL )
\r
1523 XINPUT_STATE InputState;
\r
1524 DWORD dwResult = s_pXInputGetState( dwPort, &InputState );
\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
1532 // Don't update rest of the state if not connected
\r
1533 if( !pGamePad->bConnected )
\r
1536 // Store the capabilities of the device
\r
1537 if( pGamePad->bInserted )
\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
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
1549 if( bSnapThumbstickToCardinals )
\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
1565 else if( bThumbstickDeadZone )
\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
1573 pGamePad->sThumbLX = 0;
\r
1574 pGamePad->sThumbLY = 0;
\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
1581 pGamePad->sThumbRX = 0;
\r
1582 pGamePad->sThumbRY = 0;
\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
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
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
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
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
1617 static LPXINPUTENABLE s_pXInputEnable = NULL;
\r
1618 if( NULL == s_pXInputEnable )
\r
1620 HINSTANCE hInst = LoadLibrary( XINPUT_DLL );
\r
1622 s_pXInputEnable = ( LPXINPUTENABLE )GetProcAddress( hInst, "XInputEnable" );
\r
1625 if( s_pXInputEnable )
\r
1626 s_pXInputEnable( bEnable );
\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
1636 static LPXINPUTSETSTATE s_pXInputSetState = NULL;
\r
1637 if( NULL == s_pXInputSetState )
\r
1639 HINSTANCE hInst = LoadLibrary( XINPUT_DLL );
\r
1641 s_pXInputSetState = ( LPXINPUTSETSTATE )GetProcAddress( hInst, "XInputSetState" );
\r
1643 if( s_pXInputSetState == NULL )
\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
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
1660 if( !DXUTIsInGammaCorrectMode() )
\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
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
1687 //--------------------------------------------------------------------------------------
\r
1688 DXGI_FORMAT MAKE_TYPELESS( DXGI_FORMAT format )
\r
1690 if( !DXUTIsInGammaCorrectMode() )
\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
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
1716 //--------------------------------------------------------------------------------------
\r
1717 HRESULT DXUTSnapD3D9Screenshot( LPCTSTR szFileName )
\r
1719 HRESULT hr = S_OK;
\r
1720 IDirect3DDevice9* pDev = DXUTGetD3D9Device();
\r
1724 IDirect3DSurface9* pBackBuffer = NULL;
\r
1725 V_RETURN( pDev->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ) );
\r
1727 return D3DXSaveSurfaceToFile( szFileName, D3DXIFF_BMP, pBackBuffer, NULL, NULL );
\r
1733 //--------------------------------------------------------------------------------------
\r
1734 HRESULT DXUTSnapD3D11Screenshot( LPCTSTR szFileName, D3DX11_IMAGE_FILE_FORMAT iff )
\r
1736 IDXGISwapChain *pSwap = DXUTGetDXGISwapChain();
\r
1741 ID3D11Texture2D* pBackBuffer;
\r
1742 HRESULT hr = pSwap->GetBuffer( 0, __uuidof( *pBackBuffer ), ( LPVOID* )&pBackBuffer );
\r
1746 ID3D11DeviceContext *dc = DXUTGetD3D11DeviceContext();
\r
1748 SAFE_RELEASE(pBackBuffer);
\r
1751 ID3D11Device *pDevice = DXUTGetD3D11Device();
\r
1753 SAFE_RELEASE(pBackBuffer);
\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
1777 hr = D3DX11SaveTextureToFileW(dc, pCompatableTexture, iff, szFileName);
\r
1780 SAFE_RELEASE(pBackBuffer);
\r
1781 SAFE_RELEASE(pCompatableTexture);
\r