aboutsummaryrefslogtreecommitdiff
path: root/contrib/microsoft.direct3d.d3d12.1.618.4/build/native/src/d3dx12
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/microsoft.direct3d.d3d12.1.618.4/build/native/src/d3dx12')
-rw-r--r--contrib/microsoft.direct3d.d3d12.1.618.4/build/native/src/d3dx12/d3dx12_property_format_table.cpp2601
1 files changed, 2601 insertions, 0 deletions
diff --git a/contrib/microsoft.direct3d.d3d12.1.618.4/build/native/src/d3dx12/d3dx12_property_format_table.cpp b/contrib/microsoft.direct3d.d3d12.1.618.4/build/native/src/d3dx12/d3dx12_property_format_table.cpp
new file mode 100644
index 0000000..549bf50
--- /dev/null
+++ b/contrib/microsoft.direct3d.d3d12.1.618.4/build/native/src/d3dx12/d3dx12_property_format_table.cpp
@@ -0,0 +1,2601 @@
1
2
3
4//*********************************************************
5//
6// Copyright (c) Microsoft Corporation.
7// Licensed under the MIT License (MIT).
8//
9//*********************************************************
10
11#ifndef WIN32_LEAN_AND_MEAN
12 #define WIN32_LEAN_AND_MEAN
13#endif
14#ifndef NOMINMAX
15 #define NOMINMAX 1
16#endif
17#ifdef __MINGW32__
18 #include <unknwn.h>
19#endif
20#ifndef _WIN32
21 #include <wsl/winadapter.h>
22#endif
23#include "d3dx12_property_format_table.h"
24#include <algorithm>
25#include <cassert>
26#include "D3D12TokenizedProgramFormat.hpp"
27#if defined(__cpp_exceptions) && (!defined(_HAS_EXCEPTIONS) || _HAS_EXCEPTIONS != 0)
28#include <stdexcept>
29#endif
30#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
31#ifndef ASSUME
32 #define ASSUME(x) assert(x)
33#endif
34
35#define R D3DFCN_R
36#define G D3DFCN_G
37#define B D3DFCN_B
38#define A D3DFCN_A
39#define D D3DFCN_D
40#define S D3DFCN_S
41#define X D3DFCN_X
42
43#define _TYPELESS D3DFCI_TYPELESS
44#define _FLOAT D3DFCI_FLOAT
45#define _SNORM D3DFCI_SNORM
46#define _UNORM D3DFCI_UNORM
47#define _SINT D3DFCI_SINT
48#define _UINT D3DFCI_UINT
49#define _UNORM_SRGB D3DFCI_UNORM_SRGB
50#define _FIXED_2_8 D3DFCI_BIASED_FIXED_2_8
51
52#ifndef INTSAFE_E_ARITHMETIC_OVERFLOW
53 #define INTSAFE_E_ARITHMETIC_OVERFLOW ((HRESULT)0x80070216L)
54#endif
55
56//
57// UINT addition
58//
59inline HRESULT Safe_UIntAdd(UINT uAugend, UINT uAddend, UINT* puResult)
60{
61 if ((uAugend + uAddend) >= uAugend)
62 {
63 *puResult = (uAugend + uAddend);
64 return S_OK;
65 }
66 *puResult = UINT_MAX;
67 return E_FAIL;
68}
69
70//
71// UINT multiplication
72//
73inline HRESULT Safe_UIntMult(UINT uMultiplicand, UINT uMultiplier, UINT* puResult)
74{
75 ULONGLONG ull64Result = (ULONGLONG)uMultiplicand * (ULONGLONG)uMultiplier;
76
77 if (ull64Result <= UINT_MAX)
78 {
79 *puResult = (UINT)ull64Result;
80 return S_OK;
81 }
82 *puResult = UINT_MAX;
83 return E_FAIL;
84}
85
86const LPCSTR D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::s_FormatNames[] = // separate from above structure so it can be compiled out of the runtime.
87{
88// Name
89 "UNKNOWN",
90 "R32G32B32A32_TYPELESS",
91 "R32G32B32A32_FLOAT",
92 "R32G32B32A32_UINT",
93 "R32G32B32A32_SINT",
94 "R32G32B32_TYPELESS",
95 "R32G32B32_FLOAT",
96 "R32G32B32_UINT",
97 "R32G32B32_SINT",
98 "R16G16B16A16_TYPELESS",
99 "R16G16B16A16_FLOAT",
100 "R16G16B16A16_UNORM",
101 "R16G16B16A16_UINT",
102 "R16G16B16A16_SNORM",
103 "R16G16B16A16_SINT",
104 "R32G32_TYPELESS",
105 "R32G32_FLOAT",
106 "R32G32_UINT",
107 "R32G32_SINT",
108 "R32G8X24_TYPELESS",
109 "D32_FLOAT_S8X24_UINT",
110 "R32_FLOAT_X8X24_TYPELESS",
111 "X32_TYPELESS_G8X24_UINT",
112 "R10G10B10A2_TYPELESS",
113 "R10G10B10A2_UNORM",
114 "R10G10B10A2_UINT",
115 "R11G11B10_FLOAT",
116 "R8G8B8A8_TYPELESS",
117 "R8G8B8A8_UNORM",
118 "R8G8B8A8_UNORM_SRGB",
119 "R8G8B8A8_UINT",
120 "R8G8B8A8_SNORM",
121 "R8G8B8A8_SINT",
122 "R16G16_TYPELESS",
123 "R16G16_FLOAT",
124 "R16G16_UNORM",
125 "R16G16_UINT",
126 "R16G16_SNORM",
127 "R16G16_SINT",
128 "R32_TYPELESS",
129 "D32_FLOAT",
130 "R32_FLOAT",
131 "R32_UINT",
132 "R32_SINT",
133 "R24G8_TYPELESS",
134 "D24_UNORM_S8_UINT",
135 "R24_UNORM_X8_TYPELESS",
136 "X24_TYPELESS_G8_UINT",
137 "R8G8_TYPELESS",
138 "R8G8_UNORM",
139 "R8G8_UINT",
140 "R8G8_SNORM",
141 "R8G8_SINT",
142 "R16_TYPELESS",
143 "R16_FLOAT",
144 "D16_UNORM",
145 "R16_UNORM",
146 "R16_UINT",
147 "R16_SNORM",
148 "R16_SINT",
149 "R8_TYPELESS",
150 "R8_UNORM",
151 "R8_UINT",
152 "R8_SNORM",
153 "R8_SINT",
154 "A8_UNORM",
155 "R1_UNORM",
156 "R9G9B9E5_SHAREDEXP",
157 "R8G8_B8G8_UNORM",
158 "G8R8_G8B8_UNORM",
159 "BC1_TYPELESS",
160 "BC1_UNORM",
161 "BC1_UNORM_SRGB",
162 "BC2_TYPELESS",
163 "BC2_UNORM",
164 "BC2_UNORM_SRGB",
165 "BC3_TYPELESS",
166 "BC3_UNORM",
167 "BC3_UNORM_SRGB",
168 "BC4_TYPELESS",
169 "BC4_UNORM",
170 "BC4_SNORM",
171 "BC5_TYPELESS",
172 "BC5_UNORM",
173 "BC5_SNORM",
174 "B5G6R5_UNORM",
175 "B5G5R5A1_UNORM",
176 "B8G8R8A8_UNORM",
177 "B8G8R8X8_UNORM",
178 "R10G10B10_XR_BIAS_A2_UNORM",
179 "B8G8R8A8_TYPELESS",
180 "B8G8R8A8_UNORM_SRGB",
181 "B8G8R8X8_TYPELESS",
182 "B8G8R8X8_UNORM_SRGB",
183 "BC6H_TYPELESS",
184 "BC6H_UF16",
185 "BC6H_SF16",
186 "BC7_TYPELESS",
187 "BC7_UNORM",
188 "BC7_UNORM_SRGB",
189 "AYUV",
190 "Y410",
191 "Y416",
192 "NV12",
193 "P010",
194 "P016",
195 "420_OPAQUE",
196 "YUY2",
197 "Y210",
198 "Y216",
199 "NV11",
200 "AI44",
201 "IA44",
202 "P8",
203 "A8P8",
204 "B4G4R4A4_UNORM",
205
206 nullptr, // 116
207 nullptr, // 117
208 nullptr, // 118
209 nullptr, // 119
210 nullptr, // 120
211 nullptr, // 121
212 nullptr, // 122
213 nullptr, // 123
214 nullptr, // 124
215 nullptr, // 125
216 nullptr, // 126
217 nullptr, // 127
218 nullptr, // 128
219 nullptr, // 129
220
221 "P208",
222 "V208",
223 "V408",
224
225 NULL, // 133
226 NULL, // 134
227 NULL, // 135
228 NULL, // 136
229 NULL, // 137
230 NULL, // 138
231 NULL, // 139
232 NULL, // 140
233 NULL, // 141
234 NULL, // 142
235 NULL, // 143
236 NULL, // 144
237 NULL, // 145
238 NULL, // 146
239 NULL, // 147
240 NULL, // 148
241 NULL, // 149
242 NULL, // 150
243 NULL, // 151
244 NULL, // 152
245 NULL, // 153
246 NULL, // 154
247 NULL, // 155
248 NULL, // 156
249 NULL, // 157
250 NULL, // 158
251 NULL, // 159
252 NULL, // 160
253 NULL, // 161
254 NULL, // 162
255 NULL, // 163
256 NULL, // 164
257 NULL, // 165
258 NULL, // 166
259 NULL, // 167
260 NULL, // 168
261 NULL, // 169
262 NULL, // 170
263 NULL, // 171
264 NULL, // 172
265 NULL, // 173
266 NULL, // 174
267 NULL, // 175
268 NULL, // 176
269 NULL, // 177
270 NULL, // 178
271 NULL, // 179
272 NULL, // 180
273 NULL, // 181
274 NULL, // 182
275 NULL, // 183
276 NULL, // 184
277 NULL, // 185
278 NULL, // 186
279 NULL, // 187
280 NULL, // 188
281
282 "SAMPLER_FEEDBACK_MIN_MIP_OPAQUE",
283 "SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE",
284 "A4B4G4R4_UNORM",
285};
286
287// --------------------------------------------------------------------------------------------------------------------------------
288// Format Cast Sets
289// --------------------------------------------------------------------------------------------------------------------------------
290constexpr DXGI_FORMAT D3DFCS_UNKNOWN[] =
291{
292 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
293};
294
295constexpr DXGI_FORMAT D3DFCS_R32G32B32A32[] =
296{
297 DXGI_FORMAT_R32G32B32A32_TYPELESS,
298 DXGI_FORMAT_R32G32B32A32_FLOAT,
299 DXGI_FORMAT_R32G32B32A32_UINT,
300 DXGI_FORMAT_R32G32B32A32_SINT,
301 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
302};
303
304constexpr DXGI_FORMAT D3DFCS_R32G32B32[] =
305{
306 DXGI_FORMAT_R32G32B32_TYPELESS,
307 DXGI_FORMAT_R32G32B32_FLOAT,
308 DXGI_FORMAT_R32G32B32_UINT,
309 DXGI_FORMAT_R32G32B32_SINT,
310 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
311};
312
313constexpr DXGI_FORMAT D3DFCS_R16G16B16A16[] =
314{
315 DXGI_FORMAT_R16G16B16A16_TYPELESS,
316 DXGI_FORMAT_R16G16B16A16_FLOAT,
317 DXGI_FORMAT_R16G16B16A16_UNORM,
318 DXGI_FORMAT_R16G16B16A16_UINT,
319 DXGI_FORMAT_R16G16B16A16_SNORM,
320 DXGI_FORMAT_R16G16B16A16_SINT,
321 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
322};
323
324constexpr DXGI_FORMAT D3DFCS_R32G32[] =
325{
326 DXGI_FORMAT_R32G32_TYPELESS,
327 DXGI_FORMAT_R32G32_FLOAT,
328 DXGI_FORMAT_R32G32_UINT,
329 DXGI_FORMAT_R32G32_SINT,
330 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
331};
332
333constexpr DXGI_FORMAT D3DFCS_R32G8X24[] =
334{
335 DXGI_FORMAT_R32G8X24_TYPELESS,
336 DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
337 DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
338 DXGI_FORMAT_X32_TYPELESS_G8X24_UINT,
339 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
340};
341
342constexpr DXGI_FORMAT D3DFCS_R11G11B10[] =
343{
344 DXGI_FORMAT_R11G11B10_FLOAT,
345 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
346};
347
348constexpr DXGI_FORMAT D3DFCS_R8G8B8A8[] =
349{
350 DXGI_FORMAT_R8G8B8A8_TYPELESS,
351 DXGI_FORMAT_R8G8B8A8_UNORM,
352 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
353 DXGI_FORMAT_R8G8B8A8_UINT,
354 DXGI_FORMAT_R8G8B8A8_SNORM,
355 DXGI_FORMAT_R8G8B8A8_SINT,
356 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
357};
358
359constexpr DXGI_FORMAT D3DFCS_R16G16[] =
360{
361 DXGI_FORMAT_R16G16_TYPELESS,
362 DXGI_FORMAT_R16G16_FLOAT,
363 DXGI_FORMAT_R16G16_UNORM,
364 DXGI_FORMAT_R16G16_UINT,
365 DXGI_FORMAT_R16G16_SNORM,
366 DXGI_FORMAT_R16G16_SINT,
367 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
368};
369
370constexpr DXGI_FORMAT D3DFCS_R32[] =
371{
372 DXGI_FORMAT_R32_TYPELESS,
373 DXGI_FORMAT_D32_FLOAT,
374 DXGI_FORMAT_R32_FLOAT,
375 DXGI_FORMAT_R32_UINT,
376 DXGI_FORMAT_R32_SINT,
377 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
378};
379
380constexpr DXGI_FORMAT D3DFCS_R24G8[] =
381{
382 DXGI_FORMAT_R24G8_TYPELESS,
383 DXGI_FORMAT_D24_UNORM_S8_UINT,
384 DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
385 DXGI_FORMAT_X24_TYPELESS_G8_UINT,
386 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
387};
388
389constexpr DXGI_FORMAT D3DFCS_R8G8[] =
390{
391 DXGI_FORMAT_R8G8_TYPELESS,
392 DXGI_FORMAT_R8G8_UNORM,
393 DXGI_FORMAT_R8G8_UINT,
394 DXGI_FORMAT_R8G8_SNORM,
395 DXGI_FORMAT_R8G8_SINT,
396 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
397};
398
399constexpr DXGI_FORMAT D3DFCS_R16[] =
400{
401 DXGI_FORMAT_R16_TYPELESS,
402 DXGI_FORMAT_R16_FLOAT,
403 DXGI_FORMAT_D16_UNORM,
404 DXGI_FORMAT_R16_UNORM,
405 DXGI_FORMAT_R16_UINT,
406 DXGI_FORMAT_R16_SNORM,
407 DXGI_FORMAT_R16_SINT,
408 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
409};
410
411constexpr DXGI_FORMAT D3DFCS_R8[] =
412{
413 DXGI_FORMAT_R8_TYPELESS,
414 DXGI_FORMAT_R8_UNORM,
415 DXGI_FORMAT_R8_UINT,
416 DXGI_FORMAT_R8_SNORM,
417 DXGI_FORMAT_R8_SINT,
418 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
419};
420
421constexpr DXGI_FORMAT D3DFCS_A8[] =
422{
423 DXGI_FORMAT_A8_UNORM,
424 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
425};
426
427constexpr DXGI_FORMAT D3DFCS_R1[] =
428{
429 DXGI_FORMAT_R1_UNORM,
430 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
431};
432
433constexpr DXGI_FORMAT D3DFCS_R9G9B9E5[] =
434{
435 DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
436 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
437};
438
439constexpr DXGI_FORMAT D3DFCS_R8G8_B8G8[] =
440{
441 DXGI_FORMAT_R8G8_B8G8_UNORM,
442 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
443};
444
445constexpr DXGI_FORMAT D3DFCS_G8R8_G8B8[] =
446{
447 DXGI_FORMAT_G8R8_G8B8_UNORM,
448 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
449};
450
451constexpr DXGI_FORMAT D3DFCS_BC1[] =
452{
453 DXGI_FORMAT_BC1_TYPELESS,
454 DXGI_FORMAT_BC1_UNORM,
455 DXGI_FORMAT_BC1_UNORM_SRGB,
456 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
457};
458
459constexpr DXGI_FORMAT D3DFCS_BC2[] =
460{
461 DXGI_FORMAT_BC2_TYPELESS,
462 DXGI_FORMAT_BC2_UNORM,
463 DXGI_FORMAT_BC2_UNORM_SRGB,
464 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
465};
466
467constexpr DXGI_FORMAT D3DFCS_BC3[] =
468{
469 DXGI_FORMAT_BC3_TYPELESS,
470 DXGI_FORMAT_BC3_UNORM,
471 DXGI_FORMAT_BC3_UNORM_SRGB,
472 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
473};
474
475constexpr DXGI_FORMAT D3DFCS_BC4[] =
476{
477 DXGI_FORMAT_BC4_TYPELESS,
478 DXGI_FORMAT_BC4_UNORM,
479 DXGI_FORMAT_BC4_SNORM,
480 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
481};
482
483constexpr DXGI_FORMAT D3DFCS_BC5[] =
484{
485 DXGI_FORMAT_BC5_TYPELESS,
486 DXGI_FORMAT_BC5_UNORM,
487 DXGI_FORMAT_BC5_SNORM,
488 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
489};
490
491constexpr DXGI_FORMAT D3DFCS_B5G6R5[] =
492{
493 DXGI_FORMAT_B5G6R5_UNORM,
494 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
495};
496
497constexpr DXGI_FORMAT D3DFCS_B5G5R5A1[] =
498{
499 DXGI_FORMAT_B5G5R5A1_UNORM,
500 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
501};
502
503constexpr DXGI_FORMAT D3DFCS_B8G8R8A8[] =
504{
505 DXGI_FORMAT_B8G8R8A8_TYPELESS,
506 DXGI_FORMAT_B8G8R8A8_UNORM,
507 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
508 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
509};
510
511constexpr DXGI_FORMAT D3DFCS_B8G8R8X8[] =
512{
513 DXGI_FORMAT_B8G8R8X8_TYPELESS,
514 DXGI_FORMAT_B8G8R8X8_UNORM,
515 DXGI_FORMAT_B8G8R8X8_UNORM_SRGB,
516 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
517};
518
519constexpr DXGI_FORMAT D3DFCS_R10G10B10A2[] =
520{
521 DXGI_FORMAT_R10G10B10A2_TYPELESS,
522 DXGI_FORMAT_R10G10B10A2_UNORM,
523 DXGI_FORMAT_R10G10B10A2_UINT,
524 DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM,
525 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
526};
527
528constexpr DXGI_FORMAT D3DFCS_BC6H[] =
529{
530 DXGI_FORMAT_BC6H_TYPELESS,
531 DXGI_FORMAT_BC6H_UF16,
532 DXGI_FORMAT_BC6H_SF16,
533 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
534};
535
536constexpr DXGI_FORMAT D3DFCS_BC7[] =
537{
538 DXGI_FORMAT_BC7_TYPELESS,
539 DXGI_FORMAT_BC7_UNORM,
540 DXGI_FORMAT_BC7_UNORM_SRGB,
541 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
542};
543
544constexpr DXGI_FORMAT D3DFCS_AYUV[] =
545{
546 DXGI_FORMAT_AYUV,
547 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
548};
549
550constexpr DXGI_FORMAT D3DFCS_NV12[] =
551{
552 DXGI_FORMAT_NV12,
553 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
554};
555
556constexpr DXGI_FORMAT D3DFCS_YUY2[] =
557{
558 DXGI_FORMAT_YUY2,
559 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
560};
561
562constexpr DXGI_FORMAT D3DFCS_P010[] =
563{
564 DXGI_FORMAT_P010,
565 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
566};
567
568constexpr DXGI_FORMAT D3DFCS_P016[] =
569{
570 DXGI_FORMAT_P016,
571 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
572};
573
574constexpr DXGI_FORMAT D3DFCS_NV11[] =
575{
576 DXGI_FORMAT_NV11,
577 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
578};
579
580constexpr DXGI_FORMAT D3DFCS_420_OPAQUE[] =
581{
582 DXGI_FORMAT_420_OPAQUE,
583 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
584};
585
586constexpr DXGI_FORMAT D3DFCS_Y410[] =
587{
588 DXGI_FORMAT_Y410,
589 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
590};
591
592constexpr DXGI_FORMAT D3DFCS_Y416[] =
593{
594 DXGI_FORMAT_Y416,
595 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
596};
597
598constexpr DXGI_FORMAT D3DFCS_Y210[] =
599{
600 DXGI_FORMAT_Y210,
601 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
602};
603
604constexpr DXGI_FORMAT D3DFCS_Y216[] =
605{
606 DXGI_FORMAT_Y216,
607 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
608};
609
610constexpr DXGI_FORMAT D3DFCS_AI44[] =
611{
612 DXGI_FORMAT_AI44,
613 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
614};
615
616constexpr DXGI_FORMAT D3DFCS_IA44[] =
617{
618 DXGI_FORMAT_IA44,
619 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
620};
621
622constexpr DXGI_FORMAT D3DFCS_P8[] =
623{
624 DXGI_FORMAT_P8,
625 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
626};
627
628constexpr DXGI_FORMAT D3DFCS_A8P8[] =
629{
630 DXGI_FORMAT_A8P8,
631 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
632};
633
634constexpr DXGI_FORMAT D3DFCS_B4G4R4A4[] =
635{
636 DXGI_FORMAT_B4G4R4A4_UNORM,
637 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
638};
639
640constexpr DXGI_FORMAT D3DFCS_P208[] =
641{
642 DXGI_FORMAT_P208,
643 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
644};
645
646constexpr DXGI_FORMAT D3DFCS_V208[] =
647{
648 DXGI_FORMAT_V208,
649 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
650};
651
652constexpr DXGI_FORMAT D3DFCS_V408[] =
653{
654 DXGI_FORMAT_V408,
655 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
656};
657
658constexpr DXGI_FORMAT D3DFCS_A4B4G4R4[] =
659{
660 DXGI_FORMAT_A4B4G4R4_UNORM,
661 DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator"
662};
663
664constexpr D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FORMAT_DETAIL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::s_FormatDetail[] =
665{
666 // DXGI_FORMAT ParentFormat pDefaultFormatCastSet BitsPerComponent[4], BitsPerUnit, SRGB, WidthAlignment, HeightAlignment, DepthAlignment, Layout, TypeLevel, ComponentName[4],ComponentInterpretation[4], bDX9VertexOrIndexFormat bDX9TextureFormat, bFloatNormFormat, bPlanar, bYUV bDependantFormatCastSet bInternal
667 {DXGI_FORMAT_UNKNOWN ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
668 {DXGI_FORMAT_R32G32B32A32_TYPELESS ,DXGI_FORMAT_R32G32B32A32_TYPELESS, D3DFCS_R32G32B32A32, {32,32,32,32}, 128, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,B,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
669 { DXGI_FORMAT_R32G32B32A32_FLOAT ,DXGI_FORMAT_R32G32B32A32_TYPELESS, D3DFCS_R32G32B32A32, {32,32,32,32}, 128, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _FLOAT, _FLOAT, _FLOAT, _FLOAT, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
670 { DXGI_FORMAT_R32G32B32A32_UINT ,DXGI_FORMAT_R32G32B32A32_TYPELESS, D3DFCS_R32G32B32A32, {32,32,32,32}, 128, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _UINT, _UINT, _UINT, _UINT, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
671 { DXGI_FORMAT_R32G32B32A32_SINT ,DXGI_FORMAT_R32G32B32A32_TYPELESS, D3DFCS_R32G32B32A32, {32,32,32,32}, 128, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _SINT, _SINT, _SINT, _SINT, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
672 {DXGI_FORMAT_R32G32B32_TYPELESS ,DXGI_FORMAT_R32G32B32_TYPELESS, D3DFCS_R32G32B32, {32,32,32,0}, 96, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,B,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
673 { DXGI_FORMAT_R32G32B32_FLOAT ,DXGI_FORMAT_R32G32B32_TYPELESS, D3DFCS_R32G32B32, {32,32,32,0}, 96, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,X, _FLOAT, _FLOAT, _FLOAT, _TYPELESS, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
674 { DXGI_FORMAT_R32G32B32_UINT ,DXGI_FORMAT_R32G32B32_TYPELESS, D3DFCS_R32G32B32, {32,32,32,0}, 96, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,X, _UINT, _UINT, _UINT, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
675 { DXGI_FORMAT_R32G32B32_SINT ,DXGI_FORMAT_R32G32B32_TYPELESS, D3DFCS_R32G32B32, {32,32,32,0}, 96, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,X, _SINT, _SINT, _SINT, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
676 {DXGI_FORMAT_R16G16B16A16_TYPELESS ,DXGI_FORMAT_R16G16B16A16_TYPELESS, D3DFCS_R16G16B16A16, {16,16,16,16}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,B,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
677 { DXGI_FORMAT_R16G16B16A16_FLOAT ,DXGI_FORMAT_R16G16B16A16_TYPELESS, D3DFCS_R16G16B16A16, {16,16,16,16}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _FLOAT, _FLOAT, _FLOAT, _FLOAT, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
678 { DXGI_FORMAT_R16G16B16A16_UNORM ,DXGI_FORMAT_R16G16B16A16_TYPELESS, D3DFCS_R16G16B16A16, {16,16,16,16}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM, _UNORM, _UNORM, _UNORM, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
679 { DXGI_FORMAT_R16G16B16A16_UINT ,DXGI_FORMAT_R16G16B16A16_TYPELESS, D3DFCS_R16G16B16A16, {16,16,16,16}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _UINT, _UINT, _UINT, _UINT, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
680 { DXGI_FORMAT_R16G16B16A16_SNORM ,DXGI_FORMAT_R16G16B16A16_TYPELESS, D3DFCS_R16G16B16A16, {16,16,16,16}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _SNORM, _SNORM, _SNORM, _SNORM, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
681 { DXGI_FORMAT_R16G16B16A16_SINT ,DXGI_FORMAT_R16G16B16A16_TYPELESS, D3DFCS_R16G16B16A16, {16,16,16,16}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _SINT, _SINT, _SINT, _SINT, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
682 {DXGI_FORMAT_R32G32_TYPELESS ,DXGI_FORMAT_R32G32_TYPELESS, D3DFCS_R32G32, {32,32,0,0}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
683 { DXGI_FORMAT_R32G32_FLOAT ,DXGI_FORMAT_R32G32_TYPELESS, D3DFCS_R32G32, {32,32,0,0}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _FLOAT, _FLOAT, _TYPELESS, _TYPELESS, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
684 { DXGI_FORMAT_R32G32_UINT ,DXGI_FORMAT_R32G32_TYPELESS, D3DFCS_R32G32, {32,32,0,0}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _UINT, _UINT, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
685 { DXGI_FORMAT_R32G32_SINT ,DXGI_FORMAT_R32G32_TYPELESS, D3DFCS_R32G32, {32,32,0,0}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _SINT, _SINT, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
686 {DXGI_FORMAT_R32G8X24_TYPELESS ,DXGI_FORMAT_R32G8X24_TYPELESS, D3DFCS_R32G8X24, {32,8,24,0}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, },
687 { DXGI_FORMAT_D32_FLOAT_S8X24_UINT ,DXGI_FORMAT_R32G8X24_TYPELESS, D3DFCS_R32G8X24, {32,8,24,0}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, D,S,X,X, _FLOAT,_UINT,_TYPELESS,_TYPELESS, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, },
688 { DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS ,DXGI_FORMAT_R32G8X24_TYPELESS, D3DFCS_R32G8X24, {32,8,24,0}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _FLOAT,_TYPELESS,_TYPELESS,_TYPELESS, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, },
689 { DXGI_FORMAT_X32_TYPELESS_G8X24_UINT ,DXGI_FORMAT_R32G8X24_TYPELESS, D3DFCS_R32G8X24, {32,8,24,0}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, X,G,X,X, _TYPELESS,_UINT,_TYPELESS,_TYPELESS, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, },
690 {DXGI_FORMAT_R10G10B10A2_TYPELESS ,DXGI_FORMAT_R10G10B10A2_TYPELESS, D3DFCS_R10G10B10A2, {10,10,10,2}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,B,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, },
691 { DXGI_FORMAT_R10G10B10A2_UNORM ,DXGI_FORMAT_R10G10B10A2_TYPELESS, D3DFCS_R10G10B10A2, {10,10,10,2}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, },
692 { DXGI_FORMAT_R10G10B10A2_UINT ,DXGI_FORMAT_R10G10B10A2_TYPELESS, D3DFCS_R10G10B10A2, {10,10,10,2}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _UINT, _UINT, _UINT, _UINT, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, },
693 {DXGI_FORMAT_R11G11B10_FLOAT ,DXGI_FORMAT_R11G11B10_FLOAT, D3DFCS_R11G11B10, {11,11,10,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,X, _FLOAT, _FLOAT, _FLOAT, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
694 {DXGI_FORMAT_R8G8B8A8_TYPELESS ,DXGI_FORMAT_R8G8B8A8_TYPELESS, D3DFCS_R8G8B8A8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,B,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
695 { DXGI_FORMAT_R8G8B8A8_UNORM ,DXGI_FORMAT_R8G8B8A8_TYPELESS, D3DFCS_R8G8B8A8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM, _UNORM, _UNORM, _UNORM, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
696 { DXGI_FORMAT_R8G8B8A8_UNORM_SRGB ,DXGI_FORMAT_R8G8B8A8_TYPELESS, D3DFCS_R8G8B8A8, {8,8,8,8}, 32, TRUE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
697 { DXGI_FORMAT_R8G8B8A8_UINT ,DXGI_FORMAT_R8G8B8A8_TYPELESS, D3DFCS_R8G8B8A8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _UINT, _UINT, _UINT, _UINT, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
698 { DXGI_FORMAT_R8G8B8A8_SNORM ,DXGI_FORMAT_R8G8B8A8_TYPELESS, D3DFCS_R8G8B8A8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _SNORM, _SNORM, _SNORM, _SNORM, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
699 { DXGI_FORMAT_R8G8B8A8_SINT ,DXGI_FORMAT_R8G8B8A8_TYPELESS, D3DFCS_R8G8B8A8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _SINT, _SINT, _SINT, _SINT, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
700 {DXGI_FORMAT_R16G16_TYPELESS ,DXGI_FORMAT_R16G16_TYPELESS, D3DFCS_R16G16, {16,16,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
701 { DXGI_FORMAT_R16G16_FLOAT ,DXGI_FORMAT_R16G16_TYPELESS, D3DFCS_R16G16, {16,16,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _FLOAT, _FLOAT, _TYPELESS, _TYPELESS, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
702 { DXGI_FORMAT_R16G16_UNORM ,DXGI_FORMAT_R16G16_TYPELESS, D3DFCS_R16G16, {16,16,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _UNORM, _UNORM, _TYPELESS, _TYPELESS, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
703 { DXGI_FORMAT_R16G16_UINT ,DXGI_FORMAT_R16G16_TYPELESS, D3DFCS_R16G16, {16,16,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _UINT, _UINT, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
704 { DXGI_FORMAT_R16G16_SNORM ,DXGI_FORMAT_R16G16_TYPELESS, D3DFCS_R16G16, {16,16,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _SNORM, _SNORM, _TYPELESS, _TYPELESS, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
705 { DXGI_FORMAT_R16G16_SINT ,DXGI_FORMAT_R16G16_TYPELESS, D3DFCS_R16G16, {16,16,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _SINT, _SINT, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
706 {DXGI_FORMAT_R32_TYPELESS ,DXGI_FORMAT_R32_TYPELESS, D3DFCS_R32, {32,0,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
707 { DXGI_FORMAT_D32_FLOAT ,DXGI_FORMAT_R32_TYPELESS, D3DFCS_R32, {32,0,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, D,X,X,X, _FLOAT, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
708 { DXGI_FORMAT_R32_FLOAT ,DXGI_FORMAT_R32_TYPELESS, D3DFCS_R32, {32,0,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _FLOAT, _TYPELESS, _TYPELESS, _TYPELESS, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
709 { DXGI_FORMAT_R32_UINT ,DXGI_FORMAT_R32_TYPELESS, D3DFCS_R32, {32,0,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _UINT, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
710 { DXGI_FORMAT_R32_SINT ,DXGI_FORMAT_R32_TYPELESS, D3DFCS_R32, {32,0,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _SINT, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
711 {DXGI_FORMAT_R24G8_TYPELESS ,DXGI_FORMAT_R24G8_TYPELESS, D3DFCS_R24G8, {24,8,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, },
712 { DXGI_FORMAT_D24_UNORM_S8_UINT ,DXGI_FORMAT_R24G8_TYPELESS, D3DFCS_R24G8, {24,8,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, D,S,X,X, _UNORM,_UINT,_TYPELESS,_TYPELESS, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, },
713 { DXGI_FORMAT_R24_UNORM_X8_TYPELESS ,DXGI_FORMAT_R24G8_TYPELESS, D3DFCS_R24G8, {24,8,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM,_TYPELESS,_TYPELESS,_TYPELESS, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, },
714 { DXGI_FORMAT_X24_TYPELESS_G8_UINT ,DXGI_FORMAT_R24G8_TYPELESS, D3DFCS_R24G8, {24,8,0,0}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, X,G,X,X, _TYPELESS,_UINT,_TYPELESS,_TYPELESS, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, },
715 {DXGI_FORMAT_R8G8_TYPELESS ,DXGI_FORMAT_R8G8_TYPELESS, D3DFCS_R8G8, {8,8,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,G,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
716 { DXGI_FORMAT_R8G8_UNORM ,DXGI_FORMAT_R8G8_TYPELESS, D3DFCS_R8G8, {8,8,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _UNORM, _UNORM, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
717 { DXGI_FORMAT_R8G8_UINT ,DXGI_FORMAT_R8G8_TYPELESS, D3DFCS_R8G8, {8,8,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _UINT, _UINT, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
718 { DXGI_FORMAT_R8G8_SNORM ,DXGI_FORMAT_R8G8_TYPELESS, D3DFCS_R8G8, {8,8,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _SNORM, _SNORM, _TYPELESS, _TYPELESS, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
719 { DXGI_FORMAT_R8G8_SINT ,DXGI_FORMAT_R8G8_TYPELESS, D3DFCS_R8G8, {8,8,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,X,X, _SINT, _SINT, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
720 {DXGI_FORMAT_R16_TYPELESS ,DXGI_FORMAT_R16_TYPELESS, D3DFCS_R16, {16,0,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
721 { DXGI_FORMAT_R16_FLOAT ,DXGI_FORMAT_R16_TYPELESS, D3DFCS_R16, {16,0,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _FLOAT, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
722 { DXGI_FORMAT_D16_UNORM ,DXGI_FORMAT_R16_TYPELESS, D3DFCS_R16, {16,0,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, D,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
723 { DXGI_FORMAT_R16_UNORM ,DXGI_FORMAT_R16_TYPELESS, D3DFCS_R16, {16,0,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
724 { DXGI_FORMAT_R16_UINT ,DXGI_FORMAT_R16_TYPELESS, D3DFCS_R16, {16,0,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _UINT, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
725 { DXGI_FORMAT_R16_SNORM ,DXGI_FORMAT_R16_TYPELESS, D3DFCS_R16, {16,0,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _SNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
726 { DXGI_FORMAT_R16_SINT ,DXGI_FORMAT_R16_TYPELESS, D3DFCS_R16, {16,0,0,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _SINT, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
727 {DXGI_FORMAT_R8_TYPELESS ,DXGI_FORMAT_R8_TYPELESS, D3DFCS_R8, {8,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, R,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
728 { DXGI_FORMAT_R8_UNORM ,DXGI_FORMAT_R8_TYPELESS, D3DFCS_R8, {8,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
729 { DXGI_FORMAT_R8_UINT ,DXGI_FORMAT_R8_TYPELESS, D3DFCS_R8, {8,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _UINT, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
730 { DXGI_FORMAT_R8_SNORM ,DXGI_FORMAT_R8_TYPELESS, D3DFCS_R8, {8,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _SNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
731 { DXGI_FORMAT_R8_SINT ,DXGI_FORMAT_R8_TYPELESS, D3DFCS_R8, {8,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _SINT, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
732 {DXGI_FORMAT_A8_UNORM ,DXGI_FORMAT_A8_UNORM, D3DFCS_A8, {0,0,0,8}, 8, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, X,X,X,A, _TYPELESS, _TYPELESS, _TYPELESS, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
733 {DXGI_FORMAT_R1_UNORM ,DXGI_FORMAT_R1_UNORM, D3DFCS_R1, {1,0,0,0}, 1, FALSE, 8, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
734 {DXGI_FORMAT_R9G9B9E5_SHAREDEXP ,DXGI_FORMAT_R9G9B9E5_SHAREDEXP, D3DFCS_R9G9B9E5, {0,0,0,0}, 32, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,X, _FLOAT, _FLOAT, _FLOAT, _FLOAT, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
735 {DXGI_FORMAT_R8G8_B8G8_UNORM ,DXGI_FORMAT_R8G8_B8G8_UNORM, D3DFCS_R8G8_B8G8, {0,0,0,0}, 16, FALSE, 2, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,X, _UNORM, _UNORM, _UNORM, _TYPELESS, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
736 {DXGI_FORMAT_G8R8_G8B8_UNORM ,DXGI_FORMAT_G8R8_G8B8_UNORM, D3DFCS_G8R8_G8B8, {0,0,0,0}, 16, FALSE, 2, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,X, _UNORM, _UNORM, _UNORM, _TYPELESS, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
737 {DXGI_FORMAT_BC1_TYPELESS ,DXGI_FORMAT_BC1_TYPELESS, D3DFCS_BC1, {0,0,0,0}, 64, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_PARTIAL_TYPE, R,G,B,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, },
738 { DXGI_FORMAT_BC1_UNORM ,DXGI_FORMAT_BC1_TYPELESS, D3DFCS_BC1, {0,0,0,0}, 64, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
739 { DXGI_FORMAT_BC1_UNORM_SRGB ,DXGI_FORMAT_BC1_TYPELESS, D3DFCS_BC1, {0,0,0,0}, 64, TRUE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
740 {DXGI_FORMAT_BC2_TYPELESS ,DXGI_FORMAT_BC2_TYPELESS, D3DFCS_BC2, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_PARTIAL_TYPE, R,G,B,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, },
741 { DXGI_FORMAT_BC2_UNORM ,DXGI_FORMAT_BC2_TYPELESS, D3DFCS_BC2, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
742 { DXGI_FORMAT_BC2_UNORM_SRGB ,DXGI_FORMAT_BC2_TYPELESS, D3DFCS_BC2, {0,0,0,0}, 128, TRUE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
743 {DXGI_FORMAT_BC3_TYPELESS ,DXGI_FORMAT_BC3_TYPELESS, D3DFCS_BC3, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_PARTIAL_TYPE, R,G,B,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
744 { DXGI_FORMAT_BC3_UNORM ,DXGI_FORMAT_BC3_TYPELESS, D3DFCS_BC3, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
745 { DXGI_FORMAT_BC3_UNORM_SRGB ,DXGI_FORMAT_BC3_TYPELESS, D3DFCS_BC3, {0,0,0,0}, 128, TRUE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
746 {DXGI_FORMAT_BC4_TYPELESS ,DXGI_FORMAT_BC4_TYPELESS, D3DFCS_BC4, {0,0,0,0}, 64, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_PARTIAL_TYPE, R,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
747 { DXGI_FORMAT_BC4_UNORM ,DXGI_FORMAT_BC4_TYPELESS, D3DFCS_BC4, {0,0,0,0}, 64, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
748 { DXGI_FORMAT_BC4_SNORM ,DXGI_FORMAT_BC4_TYPELESS, D3DFCS_BC4, {0,0,0,0}, 64, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _SNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
749 {DXGI_FORMAT_BC5_TYPELESS ,DXGI_FORMAT_BC5_TYPELESS, D3DFCS_BC5, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_PARTIAL_TYPE, R,G,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
750 { DXGI_FORMAT_BC5_UNORM ,DXGI_FORMAT_BC5_TYPELESS, D3DFCS_BC5, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,X,X, _UNORM, _UNORM, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
751 { DXGI_FORMAT_BC5_SNORM ,DXGI_FORMAT_BC5_TYPELESS, D3DFCS_BC5, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,X,X, _SNORM, _SNORM, _TYPELESS, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
752 {DXGI_FORMAT_B5G6R5_UNORM ,DXGI_FORMAT_B5G6R5_UNORM, D3DFCS_B5G6R5, {5,6,5,0}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,X, _UNORM, _UNORM, _UNORM, _TYPELESS, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
753 {DXGI_FORMAT_B5G5R5A1_UNORM ,DXGI_FORMAT_B5G5R5A1_UNORM, D3DFCS_B5G5R5A1, {5,5,5,1}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
754 {DXGI_FORMAT_B8G8R8A8_UNORM ,DXGI_FORMAT_B8G8R8A8_TYPELESS, D3DFCS_B8G8R8A8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
755 {DXGI_FORMAT_B8G8R8X8_UNORM ,DXGI_FORMAT_B8G8R8X8_TYPELESS, D3DFCS_B8G8R8X8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,X, _UNORM, _UNORM, _UNORM, _TYPELESS, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
756 {DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM ,DXGI_FORMAT_R10G10B10A2_TYPELESS, D3DFCS_R10G10B10A2, {10,10,10,2}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, R,G,B,A, _FIXED_2_8, _FIXED_2_8, _FIXED_2_8, _UNORM, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, },
757 {DXGI_FORMAT_B8G8R8A8_TYPELESS ,DXGI_FORMAT_B8G8R8A8_TYPELESS, D3DFCS_B8G8R8A8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, B,G,R,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, },
758 { DXGI_FORMAT_B8G8R8A8_UNORM_SRGB ,DXGI_FORMAT_B8G8R8A8_TYPELESS, D3DFCS_B8G8R8A8, {8,8,8,8}, 32, TRUE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,A, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
759 {DXGI_FORMAT_B8G8R8X8_TYPELESS ,DXGI_FORMAT_B8G8R8X8_TYPELESS, D3DFCS_B8G8R8X8, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_PARTIAL_TYPE, B,G,R,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, },
760 { DXGI_FORMAT_B8G8R8X8_UNORM_SRGB ,DXGI_FORMAT_B8G8R8X8_TYPELESS, D3DFCS_B8G8R8X8, {8,8,8,8}, 32, TRUE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,X, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, _TYPELESS, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
761 {DXGI_FORMAT_BC6H_TYPELESS ,DXGI_FORMAT_BC6H_TYPELESS, D3DFCS_BC6H, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_PARTIAL_TYPE, R,G,B,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
762 { DXGI_FORMAT_BC6H_UF16 ,DXGI_FORMAT_BC6H_TYPELESS, D3DFCS_BC6H, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,X, _FLOAT, _FLOAT, _FLOAT, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
763 { DXGI_FORMAT_BC6H_SF16 ,DXGI_FORMAT_BC6H_TYPELESS, D3DFCS_BC6H, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,X, _FLOAT, _FLOAT, _FLOAT, _TYPELESS, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
764 {DXGI_FORMAT_BC7_TYPELESS ,DXGI_FORMAT_BC7_TYPELESS, D3DFCS_BC7, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_PARTIAL_TYPE, R,G,B,A, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
765 { DXGI_FORMAT_BC7_UNORM ,DXGI_FORMAT_BC7_TYPELESS, D3DFCS_BC7, {0,0,0,0}, 128, FALSE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
766 { DXGI_FORMAT_BC7_UNORM_SRGB ,DXGI_FORMAT_BC7_TYPELESS, D3DFCS_BC7, {0,0,0,0}, 128, TRUE, 4, 4, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,A, _UNORM_SRGB, _UNORM_SRGB, _UNORM_SRGB, _UNORM, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, },
767 // YUV 4:4:4 formats
768 { DXGI_FORMAT_AYUV ,DXGI_FORMAT_AYUV, D3DFCS_AYUV, {8,8,8,8}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, },
769 { DXGI_FORMAT_Y410 ,DXGI_FORMAT_Y410, D3DFCS_Y410, {10,10,10,2}, 32, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, },
770 { DXGI_FORMAT_Y416 ,DXGI_FORMAT_Y416, D3DFCS_Y416, {16,16,16,16}, 64, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, },
771 // YUV 4:2:0 formats
772 { DXGI_FORMAT_NV12 ,DXGI_FORMAT_NV12, D3DFCS_NV12, {0,0,0,0}, 8, FALSE, 2, 2, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, },
773 { DXGI_FORMAT_P010 ,DXGI_FORMAT_P010, D3DFCS_P010, {0,0,0,0}, 16, FALSE, 2, 2, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, },
774 { DXGI_FORMAT_P016 ,DXGI_FORMAT_P016, D3DFCS_P016, {0,0,0,0}, 16, FALSE, 2, 2, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, },
775 { DXGI_FORMAT_420_OPAQUE ,DXGI_FORMAT_420_OPAQUE, D3DFCS_420_OPAQUE, {0,0,0,0}, 8, FALSE, 2, 2, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, },
776 // YUV 4:2:2 formats
777 { DXGI_FORMAT_YUY2 ,DXGI_FORMAT_YUY2, D3DFCS_YUY2, {0,0,0,0}, 16, FALSE, 2, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,X, _UNORM, _UNORM, _UNORM, _TYPELESS, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, },
778 { DXGI_FORMAT_Y210 ,DXGI_FORMAT_Y210, D3DFCS_Y210, {0,0,0,0}, 32, FALSE, 2, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,X, _UNORM, _UNORM, _UNORM, _TYPELESS, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, },
779 { DXGI_FORMAT_Y216 ,DXGI_FORMAT_Y216, D3DFCS_Y216, {0,0,0,0}, 32, FALSE, 2, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,G,B,X, _UNORM, _UNORM, _UNORM, _TYPELESS, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, },
780 // YUV 4:1:1 formats
781 { DXGI_FORMAT_NV11 ,DXGI_FORMAT_NV11, D3DFCS_NV11, {0,0,0,0}, 8, FALSE, 4, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, },
782 // Legacy substream formats
783 { DXGI_FORMAT_AI44 ,DXGI_FORMAT_AI44, D3DFCS_AI44, {0,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, },
784 { DXGI_FORMAT_IA44 ,DXGI_FORMAT_IA44, D3DFCS_IA44, {0,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, },
785 { DXGI_FORMAT_P8 ,DXGI_FORMAT_P8, D3DFCS_P8, {0,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, },
786 { DXGI_FORMAT_A8P8 ,DXGI_FORMAT_A8P8, D3DFCS_A8P8, {0,0,0,0}, 16, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, },
787 { DXGI_FORMAT_B4G4R4A4_UNORM ,DXGI_FORMAT_B4G4R4A4_UNORM, D3DFCS_B4G4R4A4, {4,4,4,4}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, B,G,R,A, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, },
788 { DXGI_FORMAT(116) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
789 { DXGI_FORMAT(117) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
790 { DXGI_FORMAT(118) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
791 { DXGI_FORMAT(119) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
792 { DXGI_FORMAT(120) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
793 { DXGI_FORMAT(121) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
794 { DXGI_FORMAT(122) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
795
796 { DXGI_FORMAT(123) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
797
798 { DXGI_FORMAT(124) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
799 { DXGI_FORMAT(125) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
800 { DXGI_FORMAT(126) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
801 { DXGI_FORMAT(127) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
802 { DXGI_FORMAT(128) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
803 { DXGI_FORMAT(129) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
804 { DXGI_FORMAT(DXGI_FORMAT_P208) ,DXGI_FORMAT_P208, D3DFCS_P208, {0,0,0,0}, 8, FALSE, 2, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, },
805 { DXGI_FORMAT(DXGI_FORMAT_V208) ,DXGI_FORMAT_V208, D3DFCS_V208, {0,0,0,0}, 8, FALSE, 1, 2, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, },
806 { DXGI_FORMAT(DXGI_FORMAT_V408) ,DXGI_FORMAT_V408, D3DFCS_V408, {0,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, },
807
808 { DXGI_FORMAT(133) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
809 { DXGI_FORMAT(134) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
810 { DXGI_FORMAT(135) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
811 { DXGI_FORMAT(136) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
812 { DXGI_FORMAT(137) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
813 { DXGI_FORMAT(138) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
814 { DXGI_FORMAT(139) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
815 { DXGI_FORMAT(140) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
816 { DXGI_FORMAT(141) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
817 { DXGI_FORMAT(142) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
818 { DXGI_FORMAT(143) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
819 { DXGI_FORMAT(144) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
820 { DXGI_FORMAT(145) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
821 { DXGI_FORMAT(146) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
822 { DXGI_FORMAT(147) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
823 { DXGI_FORMAT(148) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
824 { DXGI_FORMAT(149) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
825 { DXGI_FORMAT(150) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
826 { DXGI_FORMAT(151) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
827 { DXGI_FORMAT(152) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
828 { DXGI_FORMAT(153) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
829 { DXGI_FORMAT(154) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
830 { DXGI_FORMAT(155) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
831 { DXGI_FORMAT(156) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
832 { DXGI_FORMAT(157) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
833 { DXGI_FORMAT(158) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
834 { DXGI_FORMAT(159) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
835 { DXGI_FORMAT(160) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
836 { DXGI_FORMAT(161) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
837 { DXGI_FORMAT(162) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
838 { DXGI_FORMAT(163) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
839 { DXGI_FORMAT(164) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
840 { DXGI_FORMAT(165) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
841 { DXGI_FORMAT(166) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
842 { DXGI_FORMAT(167) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
843 { DXGI_FORMAT(168) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
844 { DXGI_FORMAT(169) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
845 { DXGI_FORMAT(170) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
846 { DXGI_FORMAT(171) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
847 { DXGI_FORMAT(172) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
848 { DXGI_FORMAT(173) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
849 { DXGI_FORMAT(174) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
850 { DXGI_FORMAT(175) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
851 { DXGI_FORMAT(176) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
852 { DXGI_FORMAT(177) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
853 { DXGI_FORMAT(178) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
854 { DXGI_FORMAT(179) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
855 { DXGI_FORMAT(180) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
856 { DXGI_FORMAT(181) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
857 { DXGI_FORMAT(182) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
858 { DXGI_FORMAT(183) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
859 { DXGI_FORMAT(184) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
860 { DXGI_FORMAT(185) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
861 { DXGI_FORMAT(186) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
862 { DXGI_FORMAT(187) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
863 { DXGI_FORMAT(188) ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 0, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_NO_TYPE, X,X,X,X, _TYPELESS, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, },
864
865 { DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
866 { DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE ,DXGI_FORMAT_UNKNOWN, D3DFCS_UNKNOWN, {0,0,0,0}, 8, FALSE, 1, 1, 1, D3DFL_CUSTOM, D3DFTL_FULL_TYPE, R,X,X,X, _UNORM, _TYPELESS, _TYPELESS, _TYPELESS, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
867 { DXGI_FORMAT_A4B4G4R4_UNORM ,DXGI_FORMAT_A4B4G4R4_UNORM, D3DFCS_A4B4G4R4, {4,4,4,4}, 16, FALSE, 1, 1, 1, D3DFL_STANDARD, D3DFTL_FULL_TYPE, A,B,G,R, _UNORM, _UNORM, _UNORM, _UNORM, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, },
868 //DXGI_FORMAT ParentFormat pDefaultFormatCastSet BitsPerComponent[4], BitsPerUnit, SRGB, WidthAlignment, HeightAlignment, DepthAlignment, Layout, TypeLevel, ComponentName[4],ComponentInterpretation[4], bDX9VertexOrIndexFormat bDX9TextureFormat, bFloatNormFormat, bPlanar, bYUV bDependantFormatCastSet bInternal
869
870};
871
872const UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::s_NumFormats = (sizeof(D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::s_FormatDetail) / sizeof(D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FORMAT_DETAIL));
873
874//---------------------------------------------------------------------------------------------------------------------------------
875// GetHighestDefinedFeatureLevel
876D3D_FEATURE_LEVEL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetHighestDefinedFeatureLevel()
877{
878 return D3D_FEATURE_LEVEL_12_2;
879}
880
881//---------------------------------------------------------------------------------------------------------------------------------
882// GetNumFormats
883UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetNumFormats()
884{
885 return s_NumFormats;
886}
887
888//---------------------------------------------------------------------------------------------------------------------------------
889// GetFormatTable
890const D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FORMAT_DETAIL* D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatTable()
891{
892 return &s_FormatDetail[0];
893}
894
895//---------------------------------------------------------------------------------------------------------------------------------
896// GetFormatTable
897BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Opaque(DXGI_FORMAT Format)
898{
899 return Format == DXGI_FORMAT_420_OPAQUE;
900}
901
902//---------------------------------------------------------------------------------------------------------------------------------
903// FormatExists
904bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FormatExists(DXGI_FORMAT Format)
905{
906 return GetFormat( Format) != (DXGI_FORMAT) -1 ? true : false;
907}
908
909//---------------------------------------------------------------------------------------------------------------------------------
910// GetDetailTableIndex
911UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndex(DXGI_FORMAT Format )
912{
913 if( (UINT)Format < _countof( s_FormatDetail ) )
914 {
915 assert( s_FormatDetail[(UINT)Format].DXGIFormat == Format );
916 return static_cast<UINT>(Format);
917 }
918
919 return (UINT)-1;
920}
921
922//---------------------------------------------------------------------------------------------------------------------------------
923// IsBlockCompressFormat - returns true if format is block compressed. This function is a helper function for GetBitsPerUnit and
924// if this function returns true then GetBitsPerUnit returns block size.
925bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::IsBlockCompressFormat(DXGI_FORMAT Format)
926{
927 // Returns true if BC1, BC2, BC3, BC4, BC5, BC6, BC7, or ASTC
928 return (Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC5_SNORM) ||
929 (Format >= DXGI_FORMAT_BC6H_TYPELESS && Format <= DXGI_FORMAT_BC7_UNORM_SRGB);
930}
931
932//---------------------------------------------------------------------------------------------------------------------------------
933// GetByteAlignment
934UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetByteAlignment(DXGI_FORMAT Format)
935{
936 UINT bits = GetBitsPerUnit(Format);
937 if (!IsBlockCompressFormat(Format))
938 {
939 bits *= GetWidthAlignment(Format)*GetHeightAlignment(Format)*GetDepthAlignment(Format);
940 }
941
942 assert((bits & 0x7) == 0); // Unit must be byte-aligned
943 return bits >> 3;
944}
945
946//---------------------------------------------------------------------------------------------------------------------------------
947// GetBitsPerUnitThrow
948UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerUnitThrow(DXGI_FORMAT Format)
949{
950 return s_FormatDetail[GetDetailTableIndexThrow( Format )].BitsPerUnit;
951}
952
953//---------------------------------------------------------------------------------------------------------------------------------
954// FormatExistsInHeader
955bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FormatExistsInHeader(DXGI_FORMAT Format, bool bExternalHeader)
956{
957 const UINT Index = GetDetailTableIndex( Format );
958 if (UINT( -1 ) == Index || (bExternalHeader && GetFormatDetail( Format )->bInternal))
959 {
960 return false;
961 }
962 else
963 {
964 return true;
965 }
966}
967
968//---------------------------------------------------------------------------------------------------------------------------------
969// GetName
970LPCSTR D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetName(DXGI_FORMAT Format, bool bHideInternalFormats)
971{
972 const UINT Index = GetDetailTableIndex( Format );
973 if (UINT( -1 ) == Index || (bHideInternalFormats && GetFormatDetail( Format )->bInternal) || !s_FormatNames[Index])
974 {
975 return "Unrecognized";
976 }
977 else
978 {
979 return s_FormatNames[ Index ];
980 }
981}
982
983//---------------------------------------------------------------------------------------------------------------------------------
984// IsSRGBFormat
985bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::IsSRGBFormat(DXGI_FORMAT Format)
986{
987 const UINT Index = GetDetailTableIndex(Format);
988 if(UINT( -1 ) == Index )
989 {
990 return false;
991 }
992
993 return s_FormatDetail[Index].SRGBFormat ? true : false;
994}
995
996//----------------------------------------------------------------------------
997// DivideAndRoundUp
998inline HRESULT DivideAndRoundUp(UINT dividend, UINT divisor, _Out_ UINT& result)
999{
1000 HRESULT hr = S_OK;
1001
1002 UINT adjustedDividend;
1003 hr = Safe_UIntAdd(dividend, (divisor - 1), &adjustedDividend);
1004
1005 result = SUCCEEDED(hr) ? (adjustedDividend / divisor) : 0;
1006
1007 return hr;
1008}
1009
1010//----------------------------------------------------------------------------
1011// CalculateExtraPlanarRows
1012HRESULT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateExtraPlanarRows(
1013 DXGI_FORMAT format,
1014 UINT plane0Height,
1015 _Out_ UINT& totalHeight
1016 )
1017{
1018 if (!D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Planar(format))
1019 {
1020 totalHeight = plane0Height;
1021 return S_OK;
1022 }
1023
1024 // blockWidth, blockHeight, and blockSize only reflect the size of plane 0. Each planar format has additonal planes that must
1025 // be counted. Each format increases size by another 0.5x, 1x, or 2x. Grab the number of "half allocation" increments so integer
1026 // math can be used to calculate the extra size.
1027 UINT extraHalfHeight;
1028 UINT round;
1029
1030 switch (D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetParentFormat(format))
1031 {
1032 case DXGI_FORMAT_NV12:
1033 case DXGI_FORMAT_P010:
1034 case DXGI_FORMAT_P016:
1035 case DXGI_FORMAT_420_OPAQUE:
1036 extraHalfHeight = 1;
1037 round = 1;
1038 break;
1039
1040 case DXGI_FORMAT_NV11:
1041 case DXGI_FORMAT_P208:
1042 extraHalfHeight = 2;
1043 round = 0;
1044 break;
1045 case DXGI_FORMAT_V208:
1046 extraHalfHeight = 2;
1047 round = 1;
1048 break;
1049
1050 case DXGI_FORMAT_V408:
1051 extraHalfHeight = 4;
1052 round = 0;
1053 break;
1054
1055 case DXGI_FORMAT_R24G8_TYPELESS:
1056 case DXGI_FORMAT_R32G8X24_TYPELESS:
1057 totalHeight = plane0Height;
1058 return S_OK;
1059
1060 default:
1061 assert(false);
1062 return S_OK;
1063 }
1064
1065 UINT extraPlaneHeight;
1066 if (FAILED(Safe_UIntMult(plane0Height, extraHalfHeight, &extraPlaneHeight))
1067 || FAILED(Safe_UIntAdd(extraPlaneHeight, round, &extraPlaneHeight))
1068 || FAILED(Safe_UIntAdd(plane0Height, (extraPlaneHeight >> 1), &totalHeight)))
1069 {
1070 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1071 }
1072
1073 return S_OK;
1074}
1075
1076//----------------------------------------------------------------------------
1077// CalculateResourceSize
1078HRESULT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateResourceSize(
1079 UINT width,
1080 UINT height,
1081 UINT depth,
1082 DXGI_FORMAT format,
1083 UINT mipLevels,
1084 UINT subresources,
1085 _Out_ SIZE_T& totalByteSize,
1086 _Out_writes_opt_(subresources) D3D12_MEMCPY_DEST *pDst)
1087{
1088 UINT tableIndex = GetDetailTableIndexNoThrow( format );
1089 if (tableIndex == UINT(-1))
1090 return E_INVALIDARG;
1091
1092 totalByteSize = 0;
1093
1094 const FORMAT_DETAIL& formatDetail = s_FormatDetail[tableIndex];
1095
1096 bool fIsBlockCompressedFormat = IsBlockCompressFormat(format );
1097
1098 // No format currently requires depth alignment.
1099 assert(formatDetail.DepthAlignment == 1);
1100
1101 UINT subWidth = width;
1102 UINT subHeight = height;
1103 UINT subDepth = depth;
1104 for (UINT s = 0, iM = 0; s < subresources; ++s)
1105 {
1106 UINT blockWidth;
1107 if (FAILED(DivideAndRoundUp(subWidth, formatDetail.WidthAlignment, /*_Out_*/ blockWidth)))
1108 {
1109 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1110 }
1111
1112 UINT blockSize, blockHeight;
1113 if (fIsBlockCompressedFormat)
1114 {
1115 if (FAILED(DivideAndRoundUp(subHeight, formatDetail.HeightAlignment, /*_Out_*/ blockHeight)))
1116 {
1117 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1118 }
1119
1120 // Block Compressed formats use BitsPerUnit as block size.
1121 blockSize = formatDetail.BitsPerUnit;
1122 }
1123 else
1124 {
1125 // The height must *not* be aligned to HeightAlign. As there is no plane pitch/stride, the expectation is that the 2nd plane
1126 // begins immediately after the first. The only formats with HeightAlignment other than 1 are planar or block compressed, and
1127 // block compressed is handled above.
1128 assert(formatDetail.bPlanar || formatDetail.HeightAlignment == 1);
1129 blockHeight = subHeight;
1130
1131 // Combined with the division os subWidth by the width alignment above, this helps achieve rounding the stride up to an even multiple of
1132 // block width. This is especially important for formats like NV12 and P208 whose chroma plane is wider than the luma.
1133 blockSize = formatDetail.BitsPerUnit * formatDetail.WidthAlignment;
1134 }
1135
1136 if (DXGI_FORMAT_UNKNOWN == formatDetail.DXGIFormat)
1137 {
1138 blockSize = 8;
1139 }
1140
1141 // Convert block width size to bytes.
1142 assert((blockSize & 0x7) == 0);
1143 blockSize = blockSize >> 3;
1144
1145 if (formatDetail.bPlanar)
1146 {
1147 if (FAILED(CalculateExtraPlanarRows(format, blockHeight, /*_Out_*/ blockHeight)))
1148 {
1149 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1150 }
1151 }
1152
1153 // Calculate rowPitch, depthPitch, and total subresource size.
1154 UINT rowPitch, depthPitch;
1155
1156 if ( FAILED(Safe_UIntMult(blockWidth, blockSize, &rowPitch))
1157 || FAILED(Safe_UIntMult(blockHeight, rowPitch, &depthPitch)))
1158 {
1159 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1160 }
1161 SIZE_T subresourceByteSize = SIZE_T(UINT64(subDepth) * UINT64(depthPitch));
1162
1163 if (pDst)
1164 {
1165 D3D12_MEMCPY_DEST& dst = pDst[s];
1166
1167 // This data will be returned straight from the API to satisfy Map. So, strides/ alignment must be API-correct.
1168 dst.pData = reinterpret_cast<void*>(totalByteSize);
1169 assert(s != 0 || dst.pData == nullptr);
1170
1171 dst.RowPitch = rowPitch;
1172 dst.SlicePitch = depthPitch;
1173 }
1174
1175 // Align the subresource size.
1176 static_assert((MAP_ALIGN_REQUIREMENT & (MAP_ALIGN_REQUIREMENT - 1)) == 0, "This code expects MAP_ALIGN_REQUIREMENT to be a power of 2.");
1177
1178 SIZE_T subresourceByteSizeAligned = subresourceByteSize + MAP_ALIGN_REQUIREMENT - 1;
1179 subresourceByteSizeAligned = subresourceByteSizeAligned & ~(MAP_ALIGN_REQUIREMENT - 1);
1180 totalByteSize = totalByteSize + subresourceByteSizeAligned;
1181
1182
1183 // Iterate over mip levels and array elements
1184 if (++iM >= mipLevels)
1185 {
1186 iM = 0;
1187
1188 subWidth = width;
1189 subHeight = height;
1190 subDepth = depth;
1191 }
1192 else
1193 {
1194 subWidth /= (1 == subWidth ? 1 : 2);
1195 subHeight /= (1 == subHeight ? 1 : 2);
1196 subDepth /= (1 == subDepth ? 1 : 2);
1197 }
1198 }
1199
1200 return S_OK;
1201}
1202
1203inline bool IsPow2( UINT Val )
1204{
1205 return 0 == (Val & (Val - 1));
1206}
1207
1208// This helper function calculates the Row Pitch for a given format. For Planar formats this function returns
1209// the row major RowPitch of the resource. The RowPitch is the same for all the planes. For Planar
1210// also use the CalculateExtraPlanarRows function to calculate the corresonding height or use the CalculateMinimumRowMajorSlicePitch
1211// function. For Block Compressed Formats, this function returns the RowPitch of a row of blocks. For packed subsampled formats and other formats,
1212// this function returns the row pitch of one single row of pixels.
1213HRESULT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateMinimumRowMajorRowPitch(DXGI_FORMAT Format, UINT Width, _Out_ UINT &RowPitch)
1214{
1215 // Early out for DXGI_FORMAT_UNKNOWN special case.
1216 if (Format == DXGI_FORMAT_UNKNOWN)
1217 {
1218 RowPitch = Width;
1219 return S_OK;
1220 }
1221
1222 UINT WidthAlignment = GetWidthAlignment(Format);
1223
1224 UINT NumUnits;
1225 if (IsBlockCompressFormat(Format))
1226 {
1227 // This function calculates the minimum stride needed for a block row when the format
1228 // is block compressed.The GetBitsPerUnit value stored in the format table indicates
1229 // the size of a compressed block for block compressed formats.
1230 assert(WidthAlignment != 0);
1231 if (FAILED(DivideAndRoundUp(Width, WidthAlignment, NumUnits)))
1232 {
1233 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1234 }
1235 }
1236 else
1237 {
1238 // All other formats must have strides aligned to their width alignment requirements.
1239 // The Width may not be aligned to the WidthAlignment. This is not an error for this
1240 // function as we expect to allow formats like NV12 to have odd dimensions in the future.
1241
1242 // The following alignement code expects only pow2 alignment requirements. Only block
1243 // compressed formats currently have non-pow2 alignment requriements.
1244 assert(IsPow2(WidthAlignment));
1245
1246 UINT Mask = WidthAlignment - 1;
1247 if (FAILED(Safe_UIntAdd(Width, Mask, &NumUnits)))
1248 {
1249 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1250 }
1251
1252 NumUnits &= ~Mask;
1253 }
1254
1255 if (FAILED(Safe_UIntMult(NumUnits, GetBitsPerUnit(Format), &RowPitch)))
1256 {
1257 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1258 }
1259
1260 // This must to always be Byte aligned.
1261 assert((RowPitch & 7) == 0);
1262 RowPitch >>= 3;
1263
1264 return S_OK;
1265}
1266
1267// This helper function calculates the SlicePitch for a given format. For Planar formats the slice pitch includes the extra
1268// planes.
1269HRESULT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateMinimumRowMajorSlicePitch(DXGI_FORMAT Format, UINT TightRowPitch, UINT Height, _Out_ UINT &SlicePitch)
1270{
1271 if (Planar(Format))
1272 {
1273 UINT PlanarHeight;
1274 if (FAILED(CalculateExtraPlanarRows(Format, Height, PlanarHeight)))
1275 {
1276 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1277 }
1278
1279 return Safe_UIntMult(TightRowPitch, PlanarHeight, &SlicePitch);
1280 }
1281 else if (Format == DXGI_FORMAT_UNKNOWN)
1282 {
1283 return Safe_UIntMult(TightRowPitch, Height, &SlicePitch);
1284 }
1285
1286 UINT HeightAlignment = GetHeightAlignment(Format);
1287
1288 // Caution assert to make sure that no new format breaks this assumption that all HeightAlignment formats are BC or Planar.
1289 // This is to make sure that Height handled correctly for this calculation.
1290 assert(HeightAlignment == 1 || IsBlockCompressFormat(Format));
1291
1292 UINT HeightOfPacked;
1293 if (FAILED(DivideAndRoundUp(Height, HeightAlignment, HeightOfPacked)))
1294 {
1295 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1296 }
1297
1298 if (FAILED(Safe_UIntMult(HeightOfPacked, TightRowPitch, &SlicePitch)))
1299 {
1300 return INTSAFE_E_ARITHMETIC_OVERFLOW;
1301 }
1302
1303 return S_OK;
1304}
1305
1306
1307
1308//---------------------------------------------------------------------------------------------------------------------------------
1309// GetBitsPerUnit - returns bits per pixel unless format is a block compress format then it returns bits per block.
1310// use IsBlockCompressFormat() to determine if block size is returned.
1311UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerUnit(DXGI_FORMAT Format)
1312{
1313 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].BitsPerUnit;
1314}
1315
1316//---------------------------------------------------------------------------------------------------------------------------------
1317UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetWidthAlignment(DXGI_FORMAT Format)
1318{
1319 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].WidthAlignment;
1320}
1321
1322UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetHeightAlignment(DXGI_FORMAT Format)
1323{
1324 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].HeightAlignment;
1325}
1326
1327UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDepthAlignment(DXGI_FORMAT Format)
1328{
1329 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].DepthAlignment;
1330}
1331//---------------------------------------------------------------------------------------------------------------------------------
1332// GetFormat
1333DXGI_FORMAT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormat(SIZE_T Index)
1334{
1335 if( Index < GetNumFormats() )
1336 {
1337 return s_FormatDetail[Index].DXGIFormat;
1338 }
1339 return (DXGI_FORMAT)-1;
1340}
1341
1342//---------------------------------------------------------------------------------------------------------------------------------
1343// CanBeCastEvenFullyTyped
1344bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CanBeCastEvenFullyTyped(DXGI_FORMAT Format, D3D_FEATURE_LEVEL fl)
1345{
1346 //SRGB can be cast away/back, and XR_BIAS can be cast to/from UNORM
1347 switch(fl)
1348 {
1349 case D3D_FEATURE_LEVEL_1_0_GENERIC:
1350 case D3D_FEATURE_LEVEL_1_0_CORE:
1351 return false;
1352 default:
1353 break;
1354 }
1355 switch( Format )
1356 {
1357 case DXGI_FORMAT_R8G8B8A8_UNORM:
1358 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
1359 case DXGI_FORMAT_B8G8R8A8_UNORM:
1360 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
1361 return true;
1362 case DXGI_FORMAT_R10G10B10A2_UNORM:
1363 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
1364 return fl >= D3D_FEATURE_LEVEL_10_0;
1365 default:
1366 return false;
1367 }
1368}
1369
1370//---------------------------------------------------------------------------------------------------------------------------------
1371// GetFormatDetail
1372const D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FORMAT_DETAIL* D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatDetail( DXGI_FORMAT Format )
1373{
1374 const UINT Index = GetDetailTableIndex(Format);
1375 if(UINT( -1 ) == Index )
1376 {
1377 return nullptr;
1378 }
1379
1380 return &s_FormatDetail[ Index ];
1381}
1382
1383//---------------------------------------------------------------------------------------------------------------------------------
1384// GetBitsPerStencil
1385UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerStencil(DXGI_FORMAT Format)
1386{
1387 const UINT Index = GetDetailTableIndexThrow( Format );
1388 if( (s_FormatDetail[Index].TypeLevel != D3DFTL_PARTIAL_TYPE) &&
1389 (s_FormatDetail[Index].TypeLevel != D3DFTL_FULL_TYPE) )
1390 {
1391 return 0;
1392 }
1393 for( UINT comp = 0; comp < 4; comp++ )
1394 {
1395 D3D_FORMAT_COMPONENT_NAME name = D3DFCN_D;
1396 switch(comp)
1397 {
1398 case 0: name = s_FormatDetail[Index].ComponentName0; break;
1399 case 1: name = s_FormatDetail[Index].ComponentName1; break;
1400 case 2: name = s_FormatDetail[Index].ComponentName2; break;
1401 case 3: name = s_FormatDetail[Index].ComponentName3; break;
1402 }
1403 if( name == D3DFCN_S )
1404 {
1405 return s_FormatDetail[Index].BitsPerComponent[comp];
1406 }
1407 }
1408 return 0;
1409}
1410
1411//---------------------------------------------------------------------------------------------------------------------------------
1412// GetBitsPerDepth
1413UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerDepth(DXGI_FORMAT Format)
1414{
1415 const UINT Index = GetDetailTableIndexThrow( Format );
1416 if( (s_FormatDetail[Index].TypeLevel != D3DFTL_PARTIAL_TYPE) &&
1417 (s_FormatDetail[Index].TypeLevel != D3DFTL_FULL_TYPE) )
1418 {
1419 return 0;
1420 }
1421 for( UINT comp = 0; comp < 4; comp++ )
1422 {
1423 D3D_FORMAT_COMPONENT_NAME name = D3DFCN_D;
1424 switch(comp)
1425 {
1426 case 0: name = s_FormatDetail[Index].ComponentName0; break;
1427 case 1: name = s_FormatDetail[Index].ComponentName1; break;
1428 case 2: name = s_FormatDetail[Index].ComponentName2; break;
1429 case 3: name = s_FormatDetail[Index].ComponentName3; break;
1430 }
1431 if( name == D3DFCN_D )
1432 {
1433 return s_FormatDetail[Index].BitsPerComponent[comp];
1434 }
1435 }
1436 return 0;
1437}
1438
1439//---------------------------------------------------------------------------------------------------------------------------------
1440// GetFormatReturnTypes
1441void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatReturnTypes(
1442 DXGI_FORMAT Format,
1443 D3D_FORMAT_COMPONENT_INTERPRETATION* pInterpretations ) // return array with 4 entries
1444{
1445 const UINT Index = GetDetailTableIndexThrow(Format);
1446 pInterpretations[D3D10_SB_4_COMPONENT_R] = s_FormatDetail[Index].ComponentInterpretation0;
1447 pInterpretations[D3D10_SB_4_COMPONENT_G] = s_FormatDetail[Index].ComponentInterpretation1;
1448 pInterpretations[D3D10_SB_4_COMPONENT_B] = s_FormatDetail[Index].ComponentInterpretation2;
1449 pInterpretations[D3D10_SB_4_COMPONENT_A] = s_FormatDetail[Index].ComponentInterpretation3;
1450}
1451
1452//---------------------------------------------------------------------------------------------------------------------------------
1453// GetAddressingBitsPerAlignedSize
1454UINT8 D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetAddressingBitsPerAlignedSize(DXGI_FORMAT Format)
1455{
1456 UINT byteAlignment = GetByteAlignment(Format);
1457 UINT8 addressBitsPerElement = 0;
1458
1459 switch(byteAlignment)
1460 {
1461 case 1: addressBitsPerElement = 0; break;
1462 case 2: addressBitsPerElement = 1; break;
1463 case 4: addressBitsPerElement = 2; break;
1464 case 8: addressBitsPerElement = 3; break;
1465 case 16: addressBitsPerElement = 4; break;
1466
1467 // The format is not supported
1468 default: return UINT8( -1 );
1469 }
1470
1471 return addressBitsPerElement;
1472}
1473
1474//---------------------------------------------------------------------------------------------------------------------------------
1475// GetNumComponentsInFormat
1476UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetNumComponentsInFormat( DXGI_FORMAT Format )
1477{
1478 UINT n = 0;
1479 const UINT Index = GetDetailTableIndexThrow(Format);
1480 for( UINT comp = 0; comp < 4; comp++ )
1481 {
1482 D3D_FORMAT_COMPONENT_NAME name = D3DFCN_D;
1483 switch(comp)
1484 {
1485 case 0: name = s_FormatDetail[Index].ComponentName0; break;
1486 case 1: name = s_FormatDetail[Index].ComponentName1; break;
1487 case 2: name = s_FormatDetail[Index].ComponentName2; break;
1488 case 3: name = s_FormatDetail[Index].ComponentName3; break;
1489 }
1490 if( name != D3DFCN_X )
1491 {
1492 n++;
1493 }
1494 }
1495 return n;
1496}
1497
1498//---------------------------------------------------------------------------------------------------------------------------------
1499// GetMinNumComponentsInFormats
1500UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetMinNumComponentsInFormats(DXGI_FORMAT FormatA, DXGI_FORMAT FormatB)
1501{
1502 UINT NumComponentsFormatA = GetNumComponentsInFormat(FormatA);
1503 UINT NumComponentsFormatB = GetNumComponentsInFormat(FormatB);
1504 UINT NumComponents = NumComponentsFormatA < NumComponentsFormatB ? NumComponentsFormatA : NumComponentsFormatB;
1505 return NumComponents;
1506}
1507
1508//---------------------------------------------------------------------------------------------------------------------------------
1509// Sequential2AbsoluteComponentIndex
1510UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Sequential2AbsoluteComponentIndex( DXGI_FORMAT Format, UINT SequentialComponentIndex)
1511{
1512 UINT n = 0;
1513 const UINT Index = GetDetailTableIndexThrow(Format);
1514 for( UINT comp = 0; comp < 4; comp++ )
1515 {
1516 D3D_FORMAT_COMPONENT_NAME name = static_cast<D3D_FORMAT_COMPONENT_NAME>(0);
1517 switch(comp)
1518 {
1519 case 0: name = s_FormatDetail[Index].ComponentName0; break;
1520 case 1: name = s_FormatDetail[Index].ComponentName1; break;
1521 case 2: name = s_FormatDetail[Index].ComponentName2; break;
1522 case 3: name = s_FormatDetail[Index].ComponentName3; break;
1523 }
1524 if( name != D3DFCN_X )
1525 {
1526 if (SequentialComponentIndex == n)
1527 {
1528 return comp;
1529 }
1530 n++;
1531 }
1532 }
1533 return UINT( -1 );
1534}
1535
1536//---------------------------------------------------------------------------------------------------------------------------------
1537// Depth Only Format
1538bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::DepthOnlyFormat(DXGI_FORMAT Format)
1539{
1540 switch( Format )
1541 {
1542 case DXGI_FORMAT_D32_FLOAT:
1543 case DXGI_FORMAT_D16_UNORM:
1544 return true;
1545 default:
1546 return false;
1547 }
1548}
1549
1550//---------------------------------------------------------------------------------------------------------------------------------
1551bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::SupportsSamplerFeedback(DXGI_FORMAT Format)
1552{
1553 switch (Format)
1554 {
1555 case DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE:
1556 case DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE:
1557 return true;
1558 default:
1559 return false;
1560 }
1561}
1562
1563//---------------------------------------------------------------------------------------------------------------------------------
1564// GetParentFormat
1565DXGI_FORMAT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetParentFormat(DXGI_FORMAT Format)
1566{
1567 return s_FormatDetail[Format].ParentFormat;
1568}
1569
1570//---------------------------------------------------------------------------------------------------------------------------------
1571// GetFormatCastSet
1572const DXGI_FORMAT* D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatCastSet(DXGI_FORMAT Format)
1573{
1574 return s_FormatDetail[Format].pDefaultFormatCastSet;
1575}
1576
1577//---------------------------------------------------------------------------------------------------------------------------------
1578// GetTypeLevel
1579D3D_FORMAT_TYPE_LEVEL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetTypeLevel(DXGI_FORMAT Format)
1580{
1581 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].TypeLevel;
1582}
1583
1584//---------------------------------------------------------------------------------------------------------------------------------
1585// GetLayout
1586D3D_FORMAT_LAYOUT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetLayout(DXGI_FORMAT Format)
1587{
1588 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].Layout;
1589}
1590
1591//---------------------------------------------------------------------------------------------------------------------------------
1592// GetComponentName
1593D3D_FORMAT_COMPONENT_NAME D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetComponentName(DXGI_FORMAT Format, UINT AbsoluteComponentIndex)
1594{
1595 D3D_FORMAT_COMPONENT_NAME name = {};
1596 switch( AbsoluteComponentIndex )
1597 {
1598 case 0: name = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentName0; break;
1599 case 1: name = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentName1; break;
1600 case 2: name = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentName2; break;
1601 case 3: name = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentName3; break;
1602#if defined(__cpp_exceptions) && (!defined(_HAS_EXCEPTIONS) || _HAS_EXCEPTIONS != 0)
1603 default: throw std::invalid_argument("AbsoluteComponentIndex");
1604#else
1605 default: break;
1606#endif
1607 }
1608 return name;
1609}
1610//---------------------------------------------------------------------------------------------------------------------------------
1611// GetBitsPerComponent
1612UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerComponent(DXGI_FORMAT Format, UINT AbsoluteComponentIndex)
1613{
1614 if( AbsoluteComponentIndex > 3 )
1615 {
1616#if defined(__cpp_exceptions) && (!defined(_HAS_EXCEPTIONS) || _HAS_EXCEPTIONS != 0)
1617 throw std::invalid_argument("AbsoluteComponentIndex");
1618#else
1619 return UINT( -1 );
1620#endif
1621 }
1622 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].BitsPerComponent[AbsoluteComponentIndex];
1623}
1624
1625//---------------------------------------------------------------------------------------------------------------------------------
1626// GetFormatComponentInterpretation
1627D3D_FORMAT_COMPONENT_INTERPRETATION D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatComponentInterpretation(DXGI_FORMAT Format, UINT AbsoluteComponentIndex)
1628{
1629 D3D_FORMAT_COMPONENT_INTERPRETATION interp {};
1630
1631 switch( AbsoluteComponentIndex )
1632 {
1633 case 0: interp = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentInterpretation0; break;
1634 case 1: interp = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentInterpretation1; break;
1635 case 2: interp = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentInterpretation2; break;
1636 case 3: interp = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentInterpretation3; break;
1637#if defined(__cpp_exceptions) && (!defined(_HAS_EXCEPTIONS) || _HAS_EXCEPTIONS != 0)
1638 default: throw std::invalid_argument("AbsoluteComponentIndex");
1639#else
1640 default: break;
1641#endif
1642 }
1643 return interp;
1644}
1645
1646//---------------------------------------------------------------------------------------------------------------------------------
1647// Planar
1648BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Planar(DXGI_FORMAT Format)
1649{
1650 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].bPlanar;
1651}
1652
1653//---------------------------------------------------------------------------------------------------------------------------------
1654// Non-opaque Planar
1655BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::NonOpaquePlanar(DXGI_FORMAT Format)
1656{
1657 return Planar(Format) && !Opaque(Format);
1658}
1659
1660//---------------------------------------------------------------------------------------------------------------------------------
1661// YUV
1662BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::YUV(DXGI_FORMAT Format)
1663{
1664 return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].bYUV;
1665}
1666
1667//---------------------------------------------------------------------------------------------------------------------------------
1668// Format family supports stencil
1669bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FamilySupportsStencil(DXGI_FORMAT Format)
1670{
1671 switch( GetParentFormat(Format) )
1672 {
1673 case DXGI_FORMAT_R32G8X24_TYPELESS:
1674 case DXGI_FORMAT_R24G8_TYPELESS:
1675 return true;
1676 default:
1677 return false;
1678 }
1679}
1680
1681//---------------------------------------------------------------------------------------------------------------------------------
1682// GetDetailTableIndexThrow
1683UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexThrow(DXGI_FORMAT Format)
1684{
1685 UINT Index = GetDetailTableIndex( Format );
1686#if defined(__cpp_exceptions) && (!defined(_HAS_EXCEPTIONS) || _HAS_EXCEPTIONS != 0)
1687 if(UINT( -1 ) == Index )
1688 {
1689 throw std::invalid_argument("Format");
1690 }
1691#endif
1692 return Index;
1693}
1694
1695//---------------------------------------------------------------------------------------------------------------------------------
1696// GetDetailTableIndexNoThrow
1697UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexNoThrow(DXGI_FORMAT Format)
1698{
1699 UINT Index = GetDetailTableIndex( Format );
1700 assert(UINT( -1 ) != Index ); // Needs to be validated externally.
1701 return Index;
1702}
1703
1704//---------------------------------------------------------------------------------------------------------------------------------
1705// GetYCbCrChromaSubsampling
1706void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetYCbCrChromaSubsampling(
1707 DXGI_FORMAT Format,
1708 _Out_ UINT& HorizontalSubsampling,
1709 _Out_ UINT& VerticalSubsampling
1710 )
1711{
1712 switch( Format)
1713 {
1714 // YCbCr 4:2:0
1715 case DXGI_FORMAT_NV12:
1716 case DXGI_FORMAT_P010:
1717 case DXGI_FORMAT_P016:
1718 case DXGI_FORMAT_420_OPAQUE:
1719 HorizontalSubsampling = 2;
1720 VerticalSubsampling = 2;
1721 break;
1722
1723 // YCbCr 4:2:2
1724 case DXGI_FORMAT_P208:
1725 case DXGI_FORMAT_YUY2:
1726 case DXGI_FORMAT_Y210:
1727 HorizontalSubsampling = 2;
1728 VerticalSubsampling = 1;
1729 break;
1730
1731 // YCbCr 4:4:0
1732 case DXGI_FORMAT_V208:
1733 HorizontalSubsampling = 1;
1734 VerticalSubsampling = 2;
1735 break;
1736
1737 // YCbCr 4:4:4
1738 case DXGI_FORMAT_AYUV:
1739 case DXGI_FORMAT_V408:
1740 case DXGI_FORMAT_Y410:
1741 case DXGI_FORMAT_Y416:
1742 // Fallthrough
1743
1744 // YCbCr palletized 4:4:4:
1745 case DXGI_FORMAT_AI44:
1746 case DXGI_FORMAT_IA44:
1747 case DXGI_FORMAT_P8:
1748 case DXGI_FORMAT_A8P8:
1749 HorizontalSubsampling = 1;
1750 VerticalSubsampling = 1;
1751 break;
1752
1753 // YCbCr 4:1:1
1754 case DXGI_FORMAT_NV11:
1755 HorizontalSubsampling = 4;
1756 VerticalSubsampling = 1;
1757 break;
1758
1759 default:
1760 // All YCbCr formats should be in this list.
1761 assert( !YUV(Format) );
1762 HorizontalSubsampling = 1;
1763 VerticalSubsampling = 1;
1764 break;
1765 };
1766}
1767
1768//---------------------------------------------------------------------------------------------------------------------------------
1769// Plane count for non-opaque planar formats
1770UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::NonOpaquePlaneCount(DXGI_FORMAT Format)
1771{
1772 if (!D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::NonOpaquePlanar(Format))
1773 {
1774 return 1;
1775 }
1776
1777 // V208 and V408 are the only 3-plane formats.
1778 return (Format == DXGI_FORMAT_V208 || Format == DXGI_FORMAT_V408) ? 3 : 2;
1779}
1780
1781//---------------------------------------------------------------------------------------------------------------------------------
1782// GetTileShape
1783//
1784// Retrieve 64K Tiled Resource tile shape
1785void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetTileShape(
1786 D3D12_TILE_SHAPE* pTileShape,
1787 DXGI_FORMAT Format,
1788 D3D12_RESOURCE_DIMENSION Dimension,
1789 UINT SampleCount
1790 )
1791{
1792 UINT BPU = GetBitsPerUnit(Format);
1793
1794 switch(Dimension)
1795 {
1796 case D3D12_RESOURCE_DIMENSION_UNKNOWN:
1797 case D3D12_RESOURCE_DIMENSION_BUFFER:
1798 case D3D12_RESOURCE_DIMENSION_TEXTURE1D:
1799 {
1800 assert(!IsBlockCompressFormat(Format));
1801 pTileShape->WidthInTexels = (BPU == 0) ? D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES : D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES*8 / BPU;
1802 pTileShape->HeightInTexels = 1;
1803 pTileShape->DepthInTexels = 1;
1804 }
1805 break;
1806 case D3D12_RESOURCE_DIMENSION_TEXTURE2D:
1807 {
1808 if (IsBlockCompressFormat(Format))
1809 {
1810 // Currently only supported block sizes are 64 and 128.
1811 // These equations calculate the size in texels for a tile. It relies on the fact that 64 * 64 blocks fit in a tile if the block size is 128 bits.
1812 assert(BPU == 64 || BPU == 128);
1813 pTileShape->WidthInTexels = 64 * GetWidthAlignment(Format);
1814 pTileShape->HeightInTexels = 64 * GetHeightAlignment(Format);
1815 pTileShape->DepthInTexels = 1;
1816 if (BPU == 64)
1817 {
1818 // If bits per block are 64 we double width so it takes up the full tile size.
1819 // This is only true for BC1 and BC4
1820 assert((Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC1_UNORM_SRGB) ||
1821 (Format >= DXGI_FORMAT_BC4_TYPELESS && Format <= DXGI_FORMAT_BC4_SNORM));
1822 pTileShape->WidthInTexels *= 2;
1823 }
1824 }
1825 else
1826 {
1827 pTileShape->DepthInTexels = 1;
1828 if (BPU <= 8)
1829 {
1830 pTileShape->WidthInTexels = 256;
1831 pTileShape->HeightInTexels = 256;
1832 }
1833 else if (BPU <= 16)
1834 {
1835 pTileShape->WidthInTexels = 256;
1836 pTileShape->HeightInTexels = 128;
1837 }
1838 else if (BPU <= 32)
1839 {
1840 pTileShape->WidthInTexels = 128;
1841 pTileShape->HeightInTexels = 128;
1842 }
1843 else if (BPU <= 64)
1844 {
1845 pTileShape->WidthInTexels = 128;
1846 pTileShape->HeightInTexels = 64;
1847 }
1848 else if (BPU <= 128)
1849 {
1850 pTileShape->WidthInTexels = 64;
1851 pTileShape->HeightInTexels = 64;
1852 }
1853 else
1854 {
1855 ASSUME( FALSE );
1856 }
1857
1858 if (SampleCount <= 1)
1859 { /* Do nothing */ }
1860 else if (SampleCount <= 2)
1861 {
1862 pTileShape->WidthInTexels /= 2;
1863 pTileShape->HeightInTexels /= 1;
1864 }
1865 else if (SampleCount <= 4)
1866 {
1867 pTileShape->WidthInTexels /= 2;
1868 pTileShape->HeightInTexels /= 2;
1869 }
1870 else if (SampleCount <= 8)
1871 {
1872 pTileShape->WidthInTexels /= 4;
1873 pTileShape->HeightInTexels /= 2;
1874 }
1875 else if (SampleCount <= 16)
1876 {
1877 pTileShape->WidthInTexels /= 4;
1878 pTileShape->HeightInTexels /= 4;
1879 }
1880 else
1881 {
1882 ASSUME( FALSE );
1883 }
1884 }
1885 }
1886 break;
1887 case D3D12_RESOURCE_DIMENSION_TEXTURE3D:
1888 {
1889 if (IsBlockCompressFormat(Format))
1890 {
1891 // Currently only supported block sizes are 64 and 128.
1892 // These equations calculate the size in texels for a tile. It relies on the fact that 16*16*16 blocks fit in a tile if the block size is 128 bits.
1893 assert(BPU == 64 || BPU == 128);
1894 pTileShape->WidthInTexels = 16 * GetWidthAlignment(Format);
1895 pTileShape->HeightInTexels = 16 * GetHeightAlignment(Format);
1896 pTileShape->DepthInTexels = 16 * GetDepthAlignment(Format);
1897 if (BPU == 64)
1898 {
1899 // If bits per block are 64 we double width so it takes up the full tile size.
1900 // This is only true for BC1 and BC4
1901 assert((Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC1_UNORM_SRGB) ||
1902 (Format >= DXGI_FORMAT_BC4_TYPELESS && Format <= DXGI_FORMAT_BC4_SNORM));
1903 pTileShape->WidthInTexels *= 2;
1904 }
1905 }
1906 else if (Format == DXGI_FORMAT_R8G8_B8G8_UNORM || Format == DXGI_FORMAT_G8R8_G8B8_UNORM)
1907 {
1908 //RGBG and GRGB are treated as 2x1 block format
1909 pTileShape->WidthInTexels = 64;
1910 pTileShape->HeightInTexels = 32;
1911 pTileShape->DepthInTexels = 16;
1912 }
1913 else
1914 {
1915 // Not a block format so BPU is bits per pixel.
1916 assert(GetWidthAlignment(Format) == 1 && GetHeightAlignment(Format) == 1 && GetDepthAlignment(Format));
1917 switch(BPU)
1918 {
1919 case 8:
1920 pTileShape->WidthInTexels = 64;
1921 pTileShape->HeightInTexels = 32;
1922 pTileShape->DepthInTexels = 32;
1923 break;
1924 case 16:
1925 pTileShape->WidthInTexels = 32;
1926 pTileShape->HeightInTexels = 32;
1927 pTileShape->DepthInTexels = 32;
1928 break;
1929 case 32:
1930 pTileShape->WidthInTexels = 32;
1931 pTileShape->HeightInTexels = 32;
1932 pTileShape->DepthInTexels = 16;
1933 break;
1934 case 64:
1935 pTileShape->WidthInTexels = 32;
1936 pTileShape->HeightInTexels = 16;
1937 pTileShape->DepthInTexels = 16;
1938 break;
1939 case 128:
1940 pTileShape->WidthInTexels = 16;
1941 pTileShape->HeightInTexels = 16;
1942 pTileShape->DepthInTexels = 16;
1943 break;
1944 }
1945 }
1946 break;
1947 }
1948 }
1949}
1950
1951//---------------------------------------------------------------------------------------------------------------------------------
1952// Get4KTileShape
1953//
1954// Retrieve 4K Tiled Resource tile shape
1955void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Get4KTileShape(
1956 D3D12_TILE_SHAPE* pTileShape,
1957 DXGI_FORMAT Format,
1958 D3D12_RESOURCE_DIMENSION Dimension,
1959 UINT SampleCount
1960 )
1961{
1962 UINT BPU = GetBitsPerUnit(Format);
1963
1964 switch(Dimension)
1965 {
1966 case D3D12_RESOURCE_DIMENSION_UNKNOWN:
1967 case D3D12_RESOURCE_DIMENSION_BUFFER:
1968 case D3D12_RESOURCE_DIMENSION_TEXTURE1D:
1969 {
1970 assert(!IsBlockCompressFormat(Format));
1971 pTileShape->WidthInTexels = (BPU == 0) ? 4096 : 4096*8 / BPU;
1972 pTileShape->HeightInTexels = 1;
1973 pTileShape->DepthInTexels = 1;
1974 }
1975 break;
1976 case D3D12_RESOURCE_DIMENSION_TEXTURE2D:
1977 {
1978 pTileShape->DepthInTexels = 1;
1979 if (IsBlockCompressFormat(Format))
1980 {
1981 // Currently only supported block sizes are 64 and 128.
1982 // These equations calculate the size in texels for a tile. It relies on the fact that 16*16*16 blocks fit in a tile if the block size is 128 bits.
1983 assert(BPU == 64 || BPU == 128);
1984 pTileShape->WidthInTexels = 16 * GetWidthAlignment(Format);
1985 pTileShape->HeightInTexels = 16 * GetHeightAlignment(Format);
1986 if (BPU == 64)
1987 {
1988 // If bits per block are 64 we double width so it takes up the full tile size.
1989 // This is only true for BC1 and BC4
1990 assert((Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC1_UNORM_SRGB) ||
1991 (Format >= DXGI_FORMAT_BC4_TYPELESS && Format <= DXGI_FORMAT_BC4_SNORM));
1992 pTileShape->WidthInTexels *= 2;
1993 }
1994 }
1995 else
1996 {
1997 if (BPU <= 8)
1998 {
1999 pTileShape->WidthInTexels = 64;
2000 pTileShape->HeightInTexels = 64;
2001 }
2002 else if (BPU <= 16)
2003 {
2004 pTileShape->WidthInTexels = 64;
2005 pTileShape->HeightInTexels = 32;
2006 }
2007 else if (BPU <= 32)
2008 {
2009 pTileShape->WidthInTexels = 32;
2010 pTileShape->HeightInTexels = 32;
2011 }
2012 else if (BPU <= 64)
2013 {
2014 pTileShape->WidthInTexels = 32;
2015 pTileShape->HeightInTexels = 16;
2016 }
2017 else if (BPU <= 128)
2018 {
2019 pTileShape->WidthInTexels = 16;
2020 pTileShape->HeightInTexels = 16;
2021 }
2022 else
2023 {
2024 ASSUME( FALSE );
2025 }
2026
2027 if (SampleCount <= 1)
2028 { /* Do nothing */ }
2029 else if (SampleCount <= 2)
2030 {
2031 pTileShape->WidthInTexels /= 2;
2032 pTileShape->HeightInTexels /= 1;
2033 }
2034 else if (SampleCount <= 4)
2035 {
2036 pTileShape->WidthInTexels /= 2;
2037 pTileShape->HeightInTexels /= 2;
2038 }
2039 else if (SampleCount <= 8)
2040 {
2041 pTileShape->WidthInTexels /= 4;
2042 pTileShape->HeightInTexels /= 2;
2043 }
2044 else if (SampleCount <= 16)
2045 {
2046 pTileShape->WidthInTexels /= 4;
2047 pTileShape->HeightInTexels /= 4;
2048 }
2049 else
2050 {
2051 ASSUME( FALSE );
2052 }
2053
2054 assert(GetWidthAlignment(Format) == 1);
2055 assert(GetHeightAlignment(Format) == 1);
2056 assert(GetDepthAlignment(Format) == 1);
2057 }
2058
2059 break;
2060 }
2061 case D3D12_RESOURCE_DIMENSION_TEXTURE3D:
2062 {
2063 if (IsBlockCompressFormat(Format))
2064 {
2065 // Currently only supported block sizes are 64 and 128.
2066 // These equations calculate the size in texels for a tile. It relies on the fact that 16*16*16 blocks fit in a tile if the block size is 128 bits.
2067 assert(BPU == 64 || BPU == 128);
2068 pTileShape->WidthInTexels = 8 * GetWidthAlignment(Format);
2069 pTileShape->HeightInTexels = 8 * GetHeightAlignment(Format);
2070 pTileShape->DepthInTexels = 4;
2071 if (BPU == 64)
2072 {
2073 // If bits per block are 64 we double width so it takes up the full tile size.
2074 // This is only true for BC1 and BC4
2075 assert((Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC1_UNORM_SRGB) ||
2076 (Format >= DXGI_FORMAT_BC4_TYPELESS && Format <= DXGI_FORMAT_BC4_SNORM));
2077 pTileShape->DepthInTexels *= 2;
2078 }
2079 }
2080 else
2081 {
2082 if (BPU <= 8)
2083 {
2084 pTileShape->WidthInTexels = 16;
2085 pTileShape->HeightInTexels = 16;
2086 pTileShape->DepthInTexels = 16;
2087 }
2088 else if (BPU <= 16)
2089 {
2090 pTileShape->WidthInTexels = 16;
2091 pTileShape->HeightInTexels = 16;
2092 pTileShape->DepthInTexels = 8;
2093 }
2094 else if (BPU <= 32)
2095 {
2096 pTileShape->WidthInTexels = 16;
2097 pTileShape->HeightInTexels = 8;
2098 pTileShape->DepthInTexels = 8;
2099 }
2100 else if (BPU <= 64)
2101 {
2102 pTileShape->WidthInTexels = 8;
2103 pTileShape->HeightInTexels = 8;
2104 pTileShape->DepthInTexels = 8;
2105 }
2106 else if (BPU <= 128)
2107 {
2108 pTileShape->WidthInTexels = 8;
2109 pTileShape->HeightInTexels = 8;
2110 pTileShape->DepthInTexels = 4;
2111 }
2112 else
2113 {
2114 ASSUME( FALSE );
2115 }
2116
2117 assert(GetWidthAlignment(Format) == 1);
2118 assert(GetHeightAlignment(Format) == 1);
2119 assert(GetDepthAlignment(Format) == 1);
2120 }
2121 }
2122 break;
2123 }
2124}
2125
2126//----------------------------------------------------------------------------------------------------------------------------------
2127// GetPlaneSliceFromViewFormat
2128// Maps resource format + view format to a plane index for resource formats where the plane index can be inferred from this information.
2129// For planar formats where the plane index is ambiguous given this information (examples: V208, V408), this function returns 0.
2130// This function returns 0 for non-planar formats.
2131UINT8 D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetPlaneSliceFromViewFormat(
2132 DXGI_FORMAT ResourceFormat,
2133 DXGI_FORMAT ViewFormat
2134 )
2135{
2136 switch(GetParentFormat(ResourceFormat))
2137 {
2138 case DXGI_FORMAT_R24G8_TYPELESS:
2139 switch(ViewFormat)
2140 {
2141 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
2142 return 0;
2143 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
2144 return 1;
2145 default:
2146 ASSUME( false );
2147 }
2148 break;
2149 case DXGI_FORMAT_R32G8X24_TYPELESS:
2150 switch(ViewFormat)
2151 {
2152 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
2153 return 0;
2154 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
2155 return 1;
2156 default:
2157 ASSUME( false );
2158 }
2159 break;
2160 case DXGI_FORMAT_NV12:
2161 case DXGI_FORMAT_NV11:
2162 case DXGI_FORMAT_P208:
2163 switch(ViewFormat)
2164 {
2165 case DXGI_FORMAT_R8_UNORM:
2166 case DXGI_FORMAT_R8_UINT:
2167 return 0;
2168 case DXGI_FORMAT_R8G8_UNORM:
2169 case DXGI_FORMAT_R8G8_UINT:
2170 return 1;
2171 default:
2172 ASSUME( false );
2173 }
2174 break;
2175 case DXGI_FORMAT_P016:
2176 case DXGI_FORMAT_P010:
2177 switch(ViewFormat)
2178 {
2179 case DXGI_FORMAT_R16_UNORM:
2180 case DXGI_FORMAT_R16_UINT:
2181 return 0;
2182 case DXGI_FORMAT_R16G16_UNORM:
2183 case DXGI_FORMAT_R16G16_UINT:
2184 case DXGI_FORMAT_R32_UINT:
2185 return 1;
2186 default:
2187 ASSUME( false );
2188 }
2189 break;
2190 default:
2191 break;
2192 }
2193 return 0;
2194}
2195
2196//----------------------------------------------------------------------------------------------------------------------------------
2197void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetPlaneSubsampledSizeAndFormatForCopyableLayout(
2198 UINT PlaneSlice,
2199 DXGI_FORMAT Format,
2200 UINT Width,
2201 UINT Height,
2202 _Out_ DXGI_FORMAT& PlaneFormat,
2203 _Out_ UINT& MinPlanePitchWidth,
2204 _Out_ UINT& PlaneWidth,
2205 _Out_ UINT& PlaneHeight)
2206{
2207 DXGI_FORMAT ParentFormat = GetParentFormat(Format);
2208
2209 if (Planar(ParentFormat))
2210 {
2211 switch (ParentFormat)
2212 {
2213 // YCbCr 4:2:0
2214 case DXGI_FORMAT_NV12:
2215 switch(PlaneSlice)
2216 {
2217 case 0:
2218 PlaneFormat = DXGI_FORMAT_R8_TYPELESS;
2219 PlaneWidth = Width;
2220 PlaneHeight = Height;
2221 break;
2222 case 1:
2223 PlaneFormat = DXGI_FORMAT_R8G8_TYPELESS;
2224 PlaneWidth = (Width + 1) >> 1;
2225 PlaneHeight = (Height + 1) >> 1;
2226 break;
2227 default:
2228 ASSUME(FALSE);
2229 };
2230
2231 MinPlanePitchWidth = PlaneWidth;
2232 break;
2233
2234 case DXGI_FORMAT_P010:
2235 case DXGI_FORMAT_P016:
2236 switch(PlaneSlice)
2237 {
2238 case 0:
2239 PlaneFormat = DXGI_FORMAT_R16_TYPELESS;
2240 PlaneWidth = Width;
2241 PlaneHeight = Height;
2242 break;
2243 case 1:
2244 PlaneFormat = DXGI_FORMAT_R16G16_TYPELESS;
2245 PlaneWidth = (Width + 1) >> 1;
2246 PlaneHeight = (Height + 1) >> 1;
2247 break;
2248 default:
2249 ASSUME(FALSE);
2250 };
2251
2252 MinPlanePitchWidth = PlaneWidth;
2253 break;
2254
2255 // YCbCr 4:2:2
2256 case DXGI_FORMAT_P208:
2257 switch(PlaneSlice)
2258 {
2259 case 0:
2260 PlaneFormat = DXGI_FORMAT_R8_TYPELESS;
2261 PlaneWidth = Width;
2262 PlaneHeight = Height;
2263 break;
2264 case 1:
2265 PlaneFormat = DXGI_FORMAT_R8G8_TYPELESS;
2266 PlaneWidth = (Width + 1) >> 1;
2267 PlaneHeight = Height;
2268 break;
2269 default:
2270 ASSUME(FALSE);
2271 };
2272
2273 MinPlanePitchWidth = PlaneWidth;
2274 break;
2275
2276 // YCbCr 4:4:0
2277 case DXGI_FORMAT_V208:
2278 PlaneFormat = DXGI_FORMAT_R8_TYPELESS;
2279 switch(PlaneSlice)
2280 {
2281 case 0:
2282 PlaneWidth = Width;
2283 PlaneHeight = Height;
2284 break;
2285 case 1:
2286 case 2:
2287 PlaneWidth = Width;
2288 PlaneHeight = (Height + 1) >> 1;
2289 break;
2290 default:
2291 ASSUME(FALSE);
2292 };
2293
2294 MinPlanePitchWidth = PlaneWidth;
2295 break;
2296
2297 // YCbCr 4:4:4
2298 case DXGI_FORMAT_V408:
2299
2300 switch(PlaneSlice)
2301 {
2302 case 0:
2303 case 1:
2304 case 2:
2305 PlaneFormat = DXGI_FORMAT_R8_TYPELESS;
2306 PlaneWidth = Width;
2307 PlaneHeight = Height;
2308 MinPlanePitchWidth = PlaneWidth;
2309 break;
2310 default:
2311 ASSUME(FALSE);
2312 };
2313 break;
2314
2315 // YCbCr 4:1:1
2316 case DXGI_FORMAT_NV11:
2317 switch(PlaneSlice)
2318 {
2319 case 0:
2320 PlaneFormat = DXGI_FORMAT_R8_TYPELESS;
2321 PlaneWidth = Width;
2322 PlaneHeight = Height;
2323 MinPlanePitchWidth = Width;
2324 break;
2325 case 1:
2326 PlaneFormat = DXGI_FORMAT_R8G8_TYPELESS;
2327 PlaneWidth = (Width + 3) >> 2;
2328 PlaneHeight = Height;
2329
2330 // NV11 has unused padding to the right of the chroma plane in the RowMajor (linear) copyable layout.
2331 MinPlanePitchWidth = (Width + 1) >> 1;
2332 break;
2333 default:
2334 ASSUME(FALSE);
2335 };
2336
2337 break;
2338
2339 case DXGI_FORMAT_R32G8X24_TYPELESS:
2340 case DXGI_FORMAT_R24G8_TYPELESS:
2341 switch(PlaneSlice)
2342 {
2343 case 0:
2344 PlaneFormat = DXGI_FORMAT_R32_TYPELESS;
2345 PlaneWidth = Width;
2346 PlaneHeight = Height;
2347 MinPlanePitchWidth = Width;
2348 break;
2349 case 1:
2350 PlaneFormat = DXGI_FORMAT_R8_TYPELESS;
2351 PlaneWidth = Width;
2352 PlaneHeight = Height;
2353 MinPlanePitchWidth = Width;
2354 break;
2355 default:
2356 ASSUME(FALSE);
2357 };
2358 break;
2359
2360 default:
2361 ASSUME( FALSE );
2362 };
2363 }
2364 else
2365 {
2366 assert(PlaneSlice == 0);
2367 PlaneFormat = Format;
2368 PlaneWidth = Width;
2369 PlaneHeight = Height;
2370 MinPlanePitchWidth = PlaneWidth;
2371 }
2372}
2373
2374//---------------------------------------------------------------------------------------------------------------------------------
2375// GetPlaneCount
2376UINT8 D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetPlaneCount(DXGI_FORMAT Format)
2377{
2378 switch( GetParentFormat(Format) )
2379 {
2380 case DXGI_FORMAT_NV12:
2381 case DXGI_FORMAT_NV11:
2382 case DXGI_FORMAT_P208:
2383 case DXGI_FORMAT_P016:
2384 case DXGI_FORMAT_P010:
2385 case DXGI_FORMAT_R24G8_TYPELESS:
2386 case DXGI_FORMAT_R32G8X24_TYPELESS:
2387 return 2;
2388 case DXGI_FORMAT_V208:
2389 case DXGI_FORMAT_V408:
2390 return 3;
2391 default:
2392 return 1;
2393 }
2394}
2395
2396//---------------------------------------------------------------------------------------------------------------------------------
2397void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetMipDimensions(UINT8 mipSlice, _Inout_ UINT64 *pWidth, _Inout_opt_ UINT64 *pHeight, _Inout_opt_ UINT64 *pDepth)
2398{
2399 UINT denominator = (1 << mipSlice); // 2 ^ subresource
2400 UINT64 mipWidth = *pWidth / denominator;
2401 UINT64 mipHeight = pHeight ? *pHeight / denominator : 1;
2402 UINT64 mipDepth = pDepth ? *pDepth / denominator : 1;
2403
2404 // Adjust dimensions for degenerate mips
2405 if(mipHeight == 0 )
2406 mipHeight = 1;
2407 if(mipWidth == 0 )
2408 mipWidth = 1;
2409 if(mipDepth == 0)
2410 mipDepth = 1;
2411
2412 *pWidth = mipWidth;
2413 if(pHeight) *pHeight = mipHeight;
2414 if(pDepth) *pDepth = mipDepth;
2415}
2416
2417//---------------------------------------------------------------------------------------------------------------------------------
2418// DX9VertexOrIndexFormat
2419BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::DX9VertexOrIndexFormat(DXGI_FORMAT Format)
2420{
2421 return s_FormatDetail[D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexThrow( Format )].bDX9VertexOrIndexFormat;
2422}
2423
2424//---------------------------------------------------------------------------------------------------------------------------------
2425// DX9TextureFormat
2426BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::DX9TextureFormat(DXGI_FORMAT Format)
2427{
2428 return s_FormatDetail[D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexThrow( Format )].bDX9TextureFormat;
2429}
2430//---------------------------------------------------------------------------------------------------------------------------------
2431// FloatNormTextureFormat
2432BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FloatNormTextureFormat(DXGI_FORMAT Format)
2433{
2434 return s_FormatDetail[D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexThrow( Format )].bFloatNormFormat;
2435}
2436
2437//---------------------------------------------------------------------------------------------------------------------------------
2438// ValidCastToR32UAV
2439//
2440// D3D11 has a limitation on typed UAVs (e.g. Texture1D/2D/3D) whereby the only format that can be read is R32_*. Lots of formats
2441// can be written though, with type conversion (e.g. R8G8B8A8_*). If an API user wants to do image processing in-place, in either
2442// the Compute Shader or the Pixel Shader, the only format available is R32_* (since it can be read and written at the same time).
2443//
2444// We were able to allow resources (Texture1D/2D/3D), created with a format from a small set of families that have 32 bits per element
2445// (such as R8G8B8A8_TYPELESS), to be cast to R32_* when creating a UAV. This means the Compute Shader or Pixel Shader can
2446// do simultaneous read+write on the resource when bound as an R32_* UAV, with the caveat that the shader code has to do manual
2447// type conversion manually, but later on the resource can be used as an SRV or RT as the desired type (e.g. R8G8B8A8_UNORM), and
2448// thus have access to filtering/blending where the hardware knows what the format is.
2449//
2450// If we didn't have this ability to cast some formats to R32_* UAVs, applications would have to keep an extra allocation around
2451// and do a rendering pass that copies from the R32_* UAV to whatever typed resource they really wanted. For formats not included
2452// in this list, such as any format that doesn't have 32-bits per component, as well as some 32-bit per component formats like
2453// R24G8 or R11G11B10_FLOAT there is no alternative for an application but to do the extra copy as mentioned, or avoid in-place
2454// image editing in favor of ping-ponging between buffers with multiple passes.
2455//
2456bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::ValidCastToR32UAV(DXGI_FORMAT from, DXGI_FORMAT to)
2457{
2458 // Allow casting of 32 bit formats to R32_*
2459 if(
2460 ((to == DXGI_FORMAT_R32_UINT)||(to == DXGI_FORMAT_R32_SINT)||(to == DXGI_FORMAT_R32_FLOAT))
2461 &&
2462 (
2463 (from == DXGI_FORMAT_R10G10B10A2_TYPELESS) ||
2464 (from == DXGI_FORMAT_R8G8B8A8_TYPELESS) ||
2465 (from == DXGI_FORMAT_B8G8R8A8_TYPELESS) ||
2466 (from == DXGI_FORMAT_B8G8R8X8_TYPELESS) ||
2467 (from == DXGI_FORMAT_R16G16_TYPELESS) ||
2468 (from == DXGI_FORMAT_R32_TYPELESS)
2469 )
2470 )
2471 {
2472 return true;
2473 }
2474 return false;
2475}
2476
2477//---------------------------------------------------------------------------------------------------------------------------------
2478// IsSupportedTextureDisplayableFormat
2479//
2480// List of formats associated with Feature_D3D1XDisplayable
2481bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::IsSupportedTextureDisplayableFormat
2482 ( DXGI_FORMAT Format
2483 , bool bMediaFormatOnly
2484 )
2485{
2486 if (bMediaFormatOnly)
2487 {
2488 return (false
2489 || ( Format == DXGI_FORMAT_NV12
2490 || Format == DXGI_FORMAT_YUY2
2491 )
2492 );
2493 }
2494 else
2495 {
2496 return (false // eases evolution
2497 || ( Format == DXGI_FORMAT_B8G8R8A8_UNORM
2498 || Format == DXGI_FORMAT_R8G8B8A8_UNORM
2499 || Format == DXGI_FORMAT_R16G16B16A16_FLOAT
2500 || Format == DXGI_FORMAT_R10G10B10A2_UNORM
2501 || Format == DXGI_FORMAT_NV12
2502 || Format == DXGI_FORMAT_YUY2
2503 )
2504 );
2505 }
2506}
2507
2508//---------------------------------------------------------------------------------------------------------------------------------
2509bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FloatAndNotFloatFormats(DXGI_FORMAT FormatA, DXGI_FORMAT FormatB)
2510{
2511 UINT NumComponents = GetMinNumComponentsInFormats(FormatA, FormatB);
2512 for (UINT c = 0; c < NumComponents; c++)
2513 {
2514 D3D_FORMAT_COMPONENT_INTERPRETATION fciA = GetFormatComponentInterpretation(FormatA, c);
2515 D3D_FORMAT_COMPONENT_INTERPRETATION fciB = GetFormatComponentInterpretation(FormatB, c);
2516 if ((fciA != fciB) && ((fciA == D3DFCI_FLOAT) || (fciB == D3DFCI_FLOAT)))
2517 {
2518 return true;
2519 }
2520 }
2521 return false;
2522}
2523
2524//---------------------------------------------------------------------------------------------------------------------------------
2525bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::SNORMAndUNORMFormats(DXGI_FORMAT FormatA, DXGI_FORMAT FormatB)
2526{
2527 UINT NumComponents = GetMinNumComponentsInFormats(FormatA, FormatB);
2528 for (UINT c = 0; c < NumComponents; c++)
2529 {
2530 D3D_FORMAT_COMPONENT_INTERPRETATION fciA = GetFormatComponentInterpretation(FormatA, c);
2531 D3D_FORMAT_COMPONENT_INTERPRETATION fciB = GetFormatComponentInterpretation(FormatB, c);
2532 if (((fciA == D3DFCI_SNORM) && (fciB == D3DFCI_UNORM)) ||
2533 ((fciB == D3DFCI_SNORM) && (fciA == D3DFCI_UNORM)))
2534 {
2535 return true;
2536 }
2537 }
2538 return false;
2539}
2540
2541//---------------------------------------------------------------------------------------------------------------------------------
2542// Formats allowed by runtime for decode histogram.
2543 bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::DecodeHistogramAllowedForOutputFormatSupport(DXGI_FORMAT Format)
2544 {
2545 return (
2546 /* YUV 4:2:0 */
2547 Format == DXGI_FORMAT_NV12
2548 || Format == DXGI_FORMAT_P010
2549 || Format == DXGI_FORMAT_P016
2550 /* YUV 4:2:2 */
2551 || Format == DXGI_FORMAT_YUY2
2552 || Format == DXGI_FORMAT_Y210
2553 || Format == DXGI_FORMAT_Y216
2554 /* YUV 4:4:4 */
2555 || Format == DXGI_FORMAT_AYUV
2556 || Format == DXGI_FORMAT_Y410
2557 || Format == DXGI_FORMAT_Y416
2558 );
2559 }
2560
2561//---------------------------------------------------------------------------------------------------------------------------------
2562// Formats allowed by runtime for decode histogram. Scopes to tested formats.
2563 bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::MotionEstimatorAllowedInputFormat(DXGI_FORMAT Format)
2564 {
2565 return Format == DXGI_FORMAT_NV12;
2566 }
2567
2568//---------------------------------------------------------------------------------------------------------------------------------
2569 bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::SupportsDepth(DXGI_FORMAT Format)
2570 {
2571 // If the number of bits associated with depth in the format is greater then 0, then the format supports depth
2572 return (GetComponentName(Format, 0) == D3DFCN_D);
2573 }
2574
2575 //---------------------------------------------------------------------------------------------------------------------------------
2576 bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::SupportsStencil(DXGI_FORMAT Format)
2577 {
2578 // If the number of bits associated with stencil in the format is greater then 0, then the format supports stencil
2579 return GetBitsPerStencil(Format) > 0;
2580 }
2581
2582#undef R
2583#undef G
2584#undef B
2585#undef A
2586#undef D
2587#undef S
2588#undef X
2589
2590#undef _TYPELESS
2591#undef _FLOAT
2592#undef _SNORM
2593#undef _UNORM
2594#undef _SINT
2595#undef _UINT
2596#undef _UNORM_SRGB
2597#undef _FIXED_2_8
2598
2599#endif // D3D12_SDK_VERSION >= 606
2600
2601