| |
| |
| |
| //********************************************************* |
| // |
| // Copyright (c) Microsoft Corporation. |
| // Licensed under the MIT License (MIT). |
| // |
| //********************************************************* |
| |
| #ifndef WIN32_LEAN_AND_MEAN |
| #define WIN32_LEAN_AND_MEAN |
| #endif |
| #ifndef NOMINMAX |
| #define NOMINMAX 1 |
| #endif |
| #ifdef __MINGW32__ |
| #include <unknwn.h> |
| #endif |
| #ifndef _WIN32 |
| #include <wsl/winadapter.h> |
| #endif |
| #include "d3dx12_property_format_table.h" |
| #include <assert.h> |
| #include <algorithm> |
| #include "D3D12TokenizedProgramFormat.hpp" |
| #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606) |
| #ifndef ASSUME |
| #define ASSUME(x) assert(x) |
| #endif |
| |
| #define R D3DFCN_R |
| #define G D3DFCN_G |
| #define B D3DFCN_B |
| #define A D3DFCN_A |
| #define D D3DFCN_D |
| #define S D3DFCN_S |
| #define X D3DFCN_X |
| |
| #define _TYPELESS D3DFCI_TYPELESS |
| #define _FLOAT D3DFCI_FLOAT |
| #define _SNORM D3DFCI_SNORM |
| #define _UNORM D3DFCI_UNORM |
| #define _SINT D3DFCI_SINT |
| #define _UINT D3DFCI_UINT |
| #define _UNORM_SRGB D3DFCI_UNORM_SRGB |
| #define _FIXED_2_8 D3DFCI_BIASED_FIXED_2_8 |
| |
| #ifndef INTSAFE_E_ARITHMETIC_OVERFLOW |
| #define INTSAFE_E_ARITHMETIC_OVERFLOW ((HRESULT)0x80070216L) |
| #endif |
| |
| // |
| // UINT addition |
| // |
| inline HRESULT Safe_UIntAdd(UINT uAugend, UINT uAddend, UINT* puResult) |
| { |
| if ((uAugend + uAddend) >= uAugend) |
| { |
| *puResult = (uAugend + uAddend); |
| return S_OK; |
| } |
| *puResult = UINT_MAX; |
| return E_FAIL; |
| } |
| |
| // |
| // UINT multiplication |
| // |
| inline HRESULT Safe_UIntMult(UINT uMultiplicand, UINT uMultiplier, UINT* puResult) |
| { |
| ULONGLONG ull64Result = (ULONGLONG)uMultiplicand * (ULONGLONG)uMultiplier; |
| |
| if (ull64Result <= UINT_MAX) |
| { |
| *puResult = (UINT)ull64Result; |
| return S_OK; |
| } |
| *puResult = UINT_MAX; |
| return E_FAIL; |
| } |
| |
| const LPCSTR D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::s_FormatNames[] = // separate from above structure so it can be compiled out of the runtime. |
| { |
| // Name |
| "UNKNOWN", |
| "R32G32B32A32_TYPELESS", |
| "R32G32B32A32_FLOAT", |
| "R32G32B32A32_UINT", |
| "R32G32B32A32_SINT", |
| "R32G32B32_TYPELESS", |
| "R32G32B32_FLOAT", |
| "R32G32B32_UINT", |
| "R32G32B32_SINT", |
| "R16G16B16A16_TYPELESS", |
| "R16G16B16A16_FLOAT", |
| "R16G16B16A16_UNORM", |
| "R16G16B16A16_UINT", |
| "R16G16B16A16_SNORM", |
| "R16G16B16A16_SINT", |
| "R32G32_TYPELESS", |
| "R32G32_FLOAT", |
| "R32G32_UINT", |
| "R32G32_SINT", |
| "R32G8X24_TYPELESS", |
| "D32_FLOAT_S8X24_UINT", |
| "R32_FLOAT_X8X24_TYPELESS", |
| "X32_TYPELESS_G8X24_UINT", |
| "R10G10B10A2_TYPELESS", |
| "R10G10B10A2_UNORM", |
| "R10G10B10A2_UINT", |
| "R11G11B10_FLOAT", |
| "R8G8B8A8_TYPELESS", |
| "R8G8B8A8_UNORM", |
| "R8G8B8A8_UNORM_SRGB", |
| "R8G8B8A8_UINT", |
| "R8G8B8A8_SNORM", |
| "R8G8B8A8_SINT", |
| "R16G16_TYPELESS", |
| "R16G16_FLOAT", |
| "R16G16_UNORM", |
| "R16G16_UINT", |
| "R16G16_SNORM", |
| "R16G16_SINT", |
| "R32_TYPELESS", |
| "D32_FLOAT", |
| "R32_FLOAT", |
| "R32_UINT", |
| "R32_SINT", |
| "R24G8_TYPELESS", |
| "D24_UNORM_S8_UINT", |
| "R24_UNORM_X8_TYPELESS", |
| "X24_TYPELESS_G8_UINT", |
| "R8G8_TYPELESS", |
| "R8G8_UNORM", |
| "R8G8_UINT", |
| "R8G8_SNORM", |
| "R8G8_SINT", |
| "R16_TYPELESS", |
| "R16_FLOAT", |
| "D16_UNORM", |
| "R16_UNORM", |
| "R16_UINT", |
| "R16_SNORM", |
| "R16_SINT", |
| "R8_TYPELESS", |
| "R8_UNORM", |
| "R8_UINT", |
| "R8_SNORM", |
| "R8_SINT", |
| "A8_UNORM", |
| "R1_UNORM", |
| "R9G9B9E5_SHAREDEXP", |
| "R8G8_B8G8_UNORM", |
| "G8R8_G8B8_UNORM", |
| "BC1_TYPELESS", |
| "BC1_UNORM", |
| "BC1_UNORM_SRGB", |
| "BC2_TYPELESS", |
| "BC2_UNORM", |
| "BC2_UNORM_SRGB", |
| "BC3_TYPELESS", |
| "BC3_UNORM", |
| "BC3_UNORM_SRGB", |
| "BC4_TYPELESS", |
| "BC4_UNORM", |
| "BC4_SNORM", |
| "BC5_TYPELESS", |
| "BC5_UNORM", |
| "BC5_SNORM", |
| "B5G6R5_UNORM", |
| "B5G5R5A1_UNORM", |
| "B8G8R8A8_UNORM", |
| "B8G8R8X8_UNORM", |
| "R10G10B10_XR_BIAS_A2_UNORM", |
| "B8G8R8A8_TYPELESS", |
| "B8G8R8A8_UNORM_SRGB", |
| "B8G8R8X8_TYPELESS", |
| "B8G8R8X8_UNORM_SRGB", |
| "BC6H_TYPELESS", |
| "BC6H_UF16", |
| "BC6H_SF16", |
| "BC7_TYPELESS", |
| "BC7_UNORM", |
| "BC7_UNORM_SRGB", |
| "AYUV", |
| "Y410", |
| "Y416", |
| "NV12", |
| "P010", |
| "P016", |
| "420_OPAQUE", |
| "YUY2", |
| "Y210", |
| "Y216", |
| "NV11", |
| "AI44", |
| "IA44", |
| "P8", |
| "A8P8", |
| }; |
| |
| // -------------------------------------------------------------------------------------------------------------------------------- |
| // Format Cast Sets |
| // -------------------------------------------------------------------------------------------------------------------------------- |
| constexpr DXGI_FORMAT D3DFCS_UNKNOWN[] = |
| { |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R32G32B32A32[] = |
| { |
| DXGI_FORMAT_R32G32B32A32_TYPELESS, |
| DXGI_FORMAT_R32G32B32A32_FLOAT, |
| DXGI_FORMAT_R32G32B32A32_UINT, |
| DXGI_FORMAT_R32G32B32A32_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R32G32B32[] = |
| { |
| DXGI_FORMAT_R32G32B32_TYPELESS, |
| DXGI_FORMAT_R32G32B32_FLOAT, |
| DXGI_FORMAT_R32G32B32_UINT, |
| DXGI_FORMAT_R32G32B32_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R16G16B16A16[] = |
| { |
| DXGI_FORMAT_R16G16B16A16_TYPELESS, |
| DXGI_FORMAT_R16G16B16A16_FLOAT, |
| DXGI_FORMAT_R16G16B16A16_UNORM, |
| DXGI_FORMAT_R16G16B16A16_UINT, |
| DXGI_FORMAT_R16G16B16A16_SNORM, |
| DXGI_FORMAT_R16G16B16A16_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R32G32[] = |
| { |
| DXGI_FORMAT_R32G32_TYPELESS, |
| DXGI_FORMAT_R32G32_FLOAT, |
| DXGI_FORMAT_R32G32_UINT, |
| DXGI_FORMAT_R32G32_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R32G8X24[] = |
| { |
| DXGI_FORMAT_R32G8X24_TYPELESS, |
| DXGI_FORMAT_D32_FLOAT_S8X24_UINT, |
| DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, |
| DXGI_FORMAT_X32_TYPELESS_G8X24_UINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R11G11B10[] = |
| { |
| DXGI_FORMAT_R11G11B10_FLOAT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R8G8B8A8[] = |
| { |
| DXGI_FORMAT_R8G8B8A8_TYPELESS, |
| DXGI_FORMAT_R8G8B8A8_UNORM, |
| DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, |
| DXGI_FORMAT_R8G8B8A8_UINT, |
| DXGI_FORMAT_R8G8B8A8_SNORM, |
| DXGI_FORMAT_R8G8B8A8_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R16G16[] = |
| { |
| DXGI_FORMAT_R16G16_TYPELESS, |
| DXGI_FORMAT_R16G16_FLOAT, |
| DXGI_FORMAT_R16G16_UNORM, |
| DXGI_FORMAT_R16G16_UINT, |
| DXGI_FORMAT_R16G16_SNORM, |
| DXGI_FORMAT_R16G16_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R32[] = |
| { |
| DXGI_FORMAT_R32_TYPELESS, |
| DXGI_FORMAT_D32_FLOAT, |
| DXGI_FORMAT_R32_FLOAT, |
| DXGI_FORMAT_R32_UINT, |
| DXGI_FORMAT_R32_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R24G8[] = |
| { |
| DXGI_FORMAT_R24G8_TYPELESS, |
| DXGI_FORMAT_D24_UNORM_S8_UINT, |
| DXGI_FORMAT_R24_UNORM_X8_TYPELESS, |
| DXGI_FORMAT_X24_TYPELESS_G8_UINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R8G8[] = |
| { |
| DXGI_FORMAT_R8G8_TYPELESS, |
| DXGI_FORMAT_R8G8_UNORM, |
| DXGI_FORMAT_R8G8_UINT, |
| DXGI_FORMAT_R8G8_SNORM, |
| DXGI_FORMAT_R8G8_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R16[] = |
| { |
| DXGI_FORMAT_R16_TYPELESS, |
| DXGI_FORMAT_R16_FLOAT, |
| DXGI_FORMAT_D16_UNORM, |
| DXGI_FORMAT_R16_UNORM, |
| DXGI_FORMAT_R16_UINT, |
| DXGI_FORMAT_R16_SNORM, |
| DXGI_FORMAT_R16_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R8[] = |
| { |
| DXGI_FORMAT_R8_TYPELESS, |
| DXGI_FORMAT_R8_UNORM, |
| DXGI_FORMAT_R8_UINT, |
| DXGI_FORMAT_R8_SNORM, |
| DXGI_FORMAT_R8_SINT, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_A8[] = |
| { |
| DXGI_FORMAT_A8_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R1[] = |
| { |
| DXGI_FORMAT_R1_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R9G9B9E5[] = |
| { |
| DXGI_FORMAT_R9G9B9E5_SHAREDEXP, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R8G8_B8G8[] = |
| { |
| DXGI_FORMAT_R8G8_B8G8_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_G8R8_G8B8[] = |
| { |
| DXGI_FORMAT_G8R8_G8B8_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_BC1[] = |
| { |
| DXGI_FORMAT_BC1_TYPELESS, |
| DXGI_FORMAT_BC1_UNORM, |
| DXGI_FORMAT_BC1_UNORM_SRGB, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_BC2[] = |
| { |
| DXGI_FORMAT_BC2_TYPELESS, |
| DXGI_FORMAT_BC2_UNORM, |
| DXGI_FORMAT_BC2_UNORM_SRGB, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_BC3[] = |
| { |
| DXGI_FORMAT_BC3_TYPELESS, |
| DXGI_FORMAT_BC3_UNORM, |
| DXGI_FORMAT_BC3_UNORM_SRGB, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_BC4[] = |
| { |
| DXGI_FORMAT_BC4_TYPELESS, |
| DXGI_FORMAT_BC4_UNORM, |
| DXGI_FORMAT_BC4_SNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_BC5[] = |
| { |
| DXGI_FORMAT_BC5_TYPELESS, |
| DXGI_FORMAT_BC5_UNORM, |
| DXGI_FORMAT_BC5_SNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_B5G6R5[] = |
| { |
| DXGI_FORMAT_B5G6R5_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_B5G5R5A1[] = |
| { |
| DXGI_FORMAT_B5G5R5A1_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_B8G8R8A8[] = |
| { |
| DXGI_FORMAT_B8G8R8A8_TYPELESS, |
| DXGI_FORMAT_B8G8R8A8_UNORM, |
| DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_B8G8R8X8[] = |
| { |
| DXGI_FORMAT_B8G8R8X8_TYPELESS, |
| DXGI_FORMAT_B8G8R8X8_UNORM, |
| DXGI_FORMAT_B8G8R8X8_UNORM_SRGB, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_R10G10B10A2[] = |
| { |
| DXGI_FORMAT_R10G10B10A2_TYPELESS, |
| DXGI_FORMAT_R10G10B10A2_UNORM, |
| DXGI_FORMAT_R10G10B10A2_UINT, |
| DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_BC6H[] = |
| { |
| DXGI_FORMAT_BC6H_TYPELESS, |
| DXGI_FORMAT_BC6H_UF16, |
| DXGI_FORMAT_BC6H_SF16, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_BC7[] = |
| { |
| DXGI_FORMAT_BC7_TYPELESS, |
| DXGI_FORMAT_BC7_UNORM, |
| DXGI_FORMAT_BC7_UNORM_SRGB, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_AYUV[] = |
| { |
| DXGI_FORMAT_AYUV, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_NV12[] = |
| { |
| DXGI_FORMAT_NV12, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_YUY2[] = |
| { |
| DXGI_FORMAT_YUY2, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_P010[] = |
| { |
| DXGI_FORMAT_P010, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_P016[] = |
| { |
| DXGI_FORMAT_P016, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_NV11[] = |
| { |
| DXGI_FORMAT_NV11, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_420_OPAQUE[] = |
| { |
| DXGI_FORMAT_420_OPAQUE, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_Y410[] = |
| { |
| DXGI_FORMAT_Y410, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_Y416[] = |
| { |
| DXGI_FORMAT_Y416, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_Y210[] = |
| { |
| DXGI_FORMAT_Y210, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_Y216[] = |
| { |
| DXGI_FORMAT_Y216, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_AI44[] = |
| { |
| DXGI_FORMAT_AI44, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_IA44[] = |
| { |
| DXGI_FORMAT_IA44, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_P8[] = |
| { |
| DXGI_FORMAT_P8, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_A8P8[] = |
| { |
| DXGI_FORMAT_A8P8, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_B4G4R4A4[] = |
| { |
| DXGI_FORMAT_B4G4R4A4_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_P208[] = |
| { |
| DXGI_FORMAT_P208, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_V208[] = |
| { |
| DXGI_FORMAT_V208, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_V408[] = |
| { |
| DXGI_FORMAT_V408, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr DXGI_FORMAT D3DFCS_A4B4G4R4[] = |
| { |
| DXGI_FORMAT_A4B4G4R4_UNORM, |
| DXGI_FORMAT_UNKNOWN // not part of cast set, just the "null terminator" |
| }; |
| |
| constexpr D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FORMAT_DETAIL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::s_FormatDetail[] = |
| { |
| // DXGI_FORMAT ParentFormat pDefaultFormatCastSet BitsPerComponent[4], BitsPerUnit, SRGB, WidthAlignment, HeightAlignment, DepthAlignment, Layout, TypeLevel, ComponentName[4],ComponentInterpretation[4], bDX9VertexOrIndexFormat bDX9TextureFormat, bFloatNormFormat, bPlanar, bYUV bDependantFormatCastSet bInternal |
| {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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| {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, }, |
| {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, }, |
| {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, }, |
| {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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| {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, }, |
| {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, }, |
| {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, }, |
| {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, }, |
| {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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| {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, }, |
| { 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, }, |
| { 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, }, |
| // YUV 4:4:4 formats |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| // YUV 4:2:0 formats |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| // YUV 4:2:2 formats |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| // YUV 4:1:1 formats |
| { 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, }, |
| // Legacy substream formats |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| |
| { 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, }, |
| |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| |
| { 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, }, |
| { 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, }, |
| { 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, }, |
| //DXGI_FORMAT ParentFormat pDefaultFormatCastSet BitsPerComponent[4], BitsPerUnit, SRGB, WidthAlignment, HeightAlignment, DepthAlignment, Layout, TypeLevel, ComponentName[4],ComponentInterpretation[4], bDX9VertexOrIndexFormat bDX9TextureFormat, bFloatNormFormat, bPlanar, bYUV bDependantFormatCastSet bInternal |
| |
| }; |
| |
| const UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::s_NumFormats = (sizeof(D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::s_FormatDetail) / sizeof(D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FORMAT_DETAIL)); |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetHighestDefinedFeatureLevel |
| D3D_FEATURE_LEVEL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetHighestDefinedFeatureLevel() |
| { |
| return D3D_FEATURE_LEVEL_12_2; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetNumFormats |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetNumFormats() |
| { |
| return s_NumFormats; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetFormatTable |
| const D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FORMAT_DETAIL* D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatTable() |
| { |
| return &s_FormatDetail[0]; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetFormatTable |
| BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Opaque(DXGI_FORMAT Format) |
| { |
| return Format == DXGI_FORMAT_420_OPAQUE; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // FormatExists |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FormatExists(DXGI_FORMAT Format) |
| { |
| return GetFormat( Format) != (DXGI_FORMAT) -1 ? true : false; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetDetailTableIndex |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndex(DXGI_FORMAT Format ) |
| { |
| if( (UINT)Format < _countof( s_FormatDetail ) ) |
| { |
| assert( s_FormatDetail[(UINT)Format].DXGIFormat == Format ); |
| return static_cast<UINT>(Format); |
| } |
| |
| return (UINT)-1; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // IsBlockCompressFormat - returns true if format is block compressed. This function is a helper function for GetBitsPerUnit and |
| // if this function returns true then GetBitsPerUnit returns block size. |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::IsBlockCompressFormat(DXGI_FORMAT Format) |
| { |
| // Returns true if BC1, BC2, BC3, BC4, BC5, BC6, BC7, or ASTC |
| return (Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC5_SNORM) || |
| (Format >= DXGI_FORMAT_BC6H_TYPELESS && Format <= DXGI_FORMAT_BC7_UNORM_SRGB); |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetByteAlignment |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetByteAlignment(DXGI_FORMAT Format) |
| { |
| UINT bits = GetBitsPerUnit(Format); |
| if (!IsBlockCompressFormat(Format)) |
| { |
| bits *= GetWidthAlignment(Format)*GetHeightAlignment(Format)*GetDepthAlignment(Format); |
| } |
| |
| assert((bits & 0x7) == 0); // Unit must be byte-aligned |
| return bits >> 3; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetBitsPerUnitThrow |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerUnitThrow(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexThrow( Format )].BitsPerUnit; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // FormatExistsInHeader |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FormatExistsInHeader(DXGI_FORMAT Format, bool bExternalHeader) |
| { |
| const UINT Index = GetDetailTableIndex( Format ); |
| if (UINT( -1 ) == Index || (bExternalHeader && GetFormatDetail( Format )->bInternal)) |
| { |
| return false; |
| } |
| else |
| { |
| return true; |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetName |
| LPCSTR D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetName(DXGI_FORMAT Format, bool bHideInternalFormats) |
| { |
| const UINT Index = GetDetailTableIndex( Format ); |
| if (UINT( -1 ) == Index || (bHideInternalFormats && GetFormatDetail( Format )->bInternal)) |
| { |
| return "Unrecognized"; |
| } |
| else |
| { |
| return s_FormatNames[ Index ]; |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // IsSRGBFormat |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::IsSRGBFormat(DXGI_FORMAT Format) |
| { |
| const UINT Index = GetDetailTableIndex(Format); |
| if(UINT( -1 ) == Index ) |
| { |
| return false; |
| } |
| |
| return s_FormatDetail[Index].SRGBFormat ? true : false; |
| } |
| |
| //---------------------------------------------------------------------------- |
| // DivideAndRoundUp |
| inline HRESULT DivideAndRoundUp(UINT dividend, UINT divisor, _Out_ UINT& result) |
| { |
| HRESULT hr = S_OK; |
| |
| UINT adjustedDividend; |
| hr = Safe_UIntAdd(dividend, (divisor - 1), &adjustedDividend); |
| |
| result = SUCCEEDED(hr) ? (adjustedDividend / divisor) : 0; |
| |
| return hr; |
| } |
| |
| //---------------------------------------------------------------------------- |
| // CalculateExtraPlanarRows |
| HRESULT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateExtraPlanarRows( |
| DXGI_FORMAT format, |
| UINT plane0Height, |
| _Out_ UINT& totalHeight |
| ) |
| { |
| if (!D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Planar(format)) |
| { |
| totalHeight = plane0Height; |
| return S_OK; |
| } |
| |
| // blockWidth, blockHeight, and blockSize only reflect the size of plane 0. Each planar format has additonal planes that must |
| // be counted. Each format increases size by another 0.5x, 1x, or 2x. Grab the number of "half allocation" increments so integer |
| // math can be used to calculate the extra size. |
| UINT extraHalfHeight; |
| UINT round; |
| |
| switch (D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetParentFormat(format)) |
| { |
| case DXGI_FORMAT_NV12: |
| case DXGI_FORMAT_P010: |
| case DXGI_FORMAT_P016: |
| case DXGI_FORMAT_420_OPAQUE: |
| extraHalfHeight = 1; |
| round = 1; |
| break; |
| |
| case DXGI_FORMAT_NV11: |
| case DXGI_FORMAT_P208: |
| extraHalfHeight = 2; |
| round = 0; |
| break; |
| case DXGI_FORMAT_V208: |
| extraHalfHeight = 2; |
| round = 1; |
| break; |
| |
| case DXGI_FORMAT_V408: |
| extraHalfHeight = 4; |
| round = 0; |
| break; |
| |
| case DXGI_FORMAT_R24G8_TYPELESS: |
| case DXGI_FORMAT_R32G8X24_TYPELESS: |
| totalHeight = plane0Height; |
| return S_OK; |
| |
| default: |
| assert(false); |
| return S_OK; |
| } |
| |
| UINT extraPlaneHeight; |
| if (FAILED(Safe_UIntMult(plane0Height, extraHalfHeight, &extraPlaneHeight)) |
| || FAILED(Safe_UIntAdd(extraPlaneHeight, round, &extraPlaneHeight)) |
| || FAILED(Safe_UIntAdd(plane0Height, (extraPlaneHeight >> 1), &totalHeight))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| |
| return S_OK; |
| } |
| |
| //---------------------------------------------------------------------------- |
| // CalculateResourceSize |
| HRESULT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateResourceSize( |
| UINT width, |
| UINT height, |
| UINT depth, |
| DXGI_FORMAT format, |
| UINT mipLevels, |
| UINT subresources, |
| _Out_ SIZE_T& totalByteSize, |
| _Out_writes_opt_(subresources) D3D12_MEMCPY_DEST *pDst) |
| { |
| UINT tableIndex = GetDetailTableIndexNoThrow( format ); |
| const FORMAT_DETAIL& formatDetail = s_FormatDetail[tableIndex]; |
| |
| bool fIsBlockCompressedFormat = IsBlockCompressFormat(format ); |
| |
| // No format currently requires depth alignment. |
| assert(formatDetail.DepthAlignment == 1); |
| |
| UINT subWidth = width; |
| UINT subHeight = height; |
| UINT subDepth = depth; |
| for (UINT s = 0, iM = 0; s < subresources; ++s) |
| { |
| UINT blockWidth; |
| if (FAILED(DivideAndRoundUp(subWidth, formatDetail.WidthAlignment, /*_Out_*/ blockWidth))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| |
| UINT blockSize, blockHeight; |
| if (fIsBlockCompressedFormat) |
| { |
| if (FAILED(DivideAndRoundUp(subHeight, formatDetail.HeightAlignment, /*_Out_*/ blockHeight))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| |
| // Block Compressed formats use BitsPerUnit as block size. |
| blockSize = formatDetail.BitsPerUnit; |
| } |
| else |
| { |
| // The height must *not* be aligned to HeightAlign. As there is no plane pitch/stride, the expectation is that the 2nd plane |
| // begins immediately after the first. The only formats with HeightAlignment other than 1 are planar or block compressed, and |
| // block compressed is handled above. |
| assert(formatDetail.bPlanar || formatDetail.HeightAlignment == 1); |
| blockHeight = subHeight; |
| |
| // Combined with the division os subWidth by the width alignment above, this helps achieve rounding the stride up to an even multiple of |
| // block width. This is especially important for formats like NV12 and P208 whose chroma plane is wider than the luma. |
| blockSize = formatDetail.BitsPerUnit * formatDetail.WidthAlignment; |
| } |
| |
| if (DXGI_FORMAT_UNKNOWN == formatDetail.DXGIFormat) |
| { |
| blockSize = 8; |
| } |
| |
| // Convert block width size to bytes. |
| assert((blockSize & 0x7) == 0); |
| blockSize = blockSize >> 3; |
| |
| if (formatDetail.bPlanar) |
| { |
| if (FAILED(CalculateExtraPlanarRows(format, blockHeight, /*_Out_*/ blockHeight))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| } |
| |
| // Calculate rowPitch, depthPitch, and total subresource size. |
| UINT rowPitch, depthPitch; |
| |
| if ( FAILED(Safe_UIntMult(blockWidth, blockSize, &rowPitch)) |
| || FAILED(Safe_UIntMult(blockHeight, rowPitch, &depthPitch))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| SIZE_T subresourceByteSize = subDepth * depthPitch; |
| |
| if (pDst) |
| { |
| D3D12_MEMCPY_DEST& dst = pDst[s]; |
| |
| // This data will be returned straight from the API to satisfy Map. So, strides/ alignment must be API-correct. |
| dst.pData = reinterpret_cast<void*>(totalByteSize); |
| assert(s != 0 || dst.pData == nullptr); |
| |
| dst.RowPitch = rowPitch; |
| dst.SlicePitch = depthPitch; |
| } |
| |
| // Align the subresource size. |
| static_assert((MAP_ALIGN_REQUIREMENT & (MAP_ALIGN_REQUIREMENT - 1)) == 0, "This code expects MAP_ALIGN_REQUIREMENT to be a power of 2."); |
| |
| SIZE_T subresourceByteSizeAligned = subresourceByteSize + MAP_ALIGN_REQUIREMENT - 1; |
| subresourceByteSizeAligned = subresourceByteSizeAligned & ~(MAP_ALIGN_REQUIREMENT - 1); |
| totalByteSize = totalByteSize + subresourceByteSizeAligned; |
| |
| |
| // Iterate over mip levels and array elements |
| if (++iM >= mipLevels) |
| { |
| iM = 0; |
| |
| subWidth = width; |
| subHeight = height; |
| subDepth = depth; |
| } |
| else |
| { |
| subWidth /= (1 == subWidth ? 1 : 2); |
| subHeight /= (1 == subHeight ? 1 : 2); |
| subDepth /= (1 == subDepth ? 1 : 2); |
| } |
| } |
| |
| return S_OK; |
| } |
| |
| inline bool IsPow2( UINT Val ) |
| { |
| return 0 == (Val & (Val - 1)); |
| } |
| |
| // This helper function calculates the Row Pitch for a given format. For Planar formats this function returns |
| // the row major RowPitch of the resource. The RowPitch is the same for all the planes. For Planar |
| // also use the CalculateExtraPlanarRows function to calculate the corresonding height or use the CalculateMinimumRowMajorSlicePitch |
| // function. For Block Compressed Formats, this function returns the RowPitch of a row of blocks. For packed subsampled formats and other formats, |
| // this function returns the row pitch of one single row of pixels. |
| HRESULT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateMinimumRowMajorRowPitch(DXGI_FORMAT Format, UINT Width, _Out_ UINT &RowPitch) |
| { |
| // Early out for DXGI_FORMAT_UNKNOWN special case. |
| if (Format == DXGI_FORMAT_UNKNOWN) |
| { |
| RowPitch = Width; |
| return S_OK; |
| } |
| |
| UINT WidthAlignment = GetWidthAlignment(Format); |
| |
| UINT NumUnits; |
| if (IsBlockCompressFormat(Format)) |
| { |
| // This function calculates the minimum stride needed for a block row when the format |
| // is block compressed.The GetBitsPerUnit value stored in the format table indicates |
| // the size of a compressed block for block compressed formats. |
| assert(WidthAlignment != 0); |
| if (FAILED(DivideAndRoundUp(Width, WidthAlignment, NumUnits))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| } |
| else |
| { |
| // All other formats must have strides aligned to their width alignment requirements. |
| // The Width may not be aligned to the WidthAlignment. This is not an error for this |
| // function as we expect to allow formats like NV12 to have odd dimensions in the future. |
| |
| // The following alignement code expects only pow2 alignment requirements. Only block |
| // compressed formats currently have non-pow2 alignment requriements. |
| assert(IsPow2(WidthAlignment)); |
| |
| UINT Mask = WidthAlignment - 1; |
| if (FAILED(Safe_UIntAdd(Width, Mask, &NumUnits))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| |
| NumUnits &= ~Mask; |
| } |
| |
| if (FAILED(Safe_UIntMult(NumUnits, GetBitsPerUnit(Format), &RowPitch))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| |
| // This must to always be Byte aligned. |
| assert((RowPitch & 7) == 0); |
| RowPitch >>= 3; |
| |
| return S_OK; |
| } |
| |
| // This helper function calculates the SlicePitch for a given format. For Planar formats the slice pitch includes the extra |
| // planes. |
| HRESULT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateMinimumRowMajorSlicePitch(DXGI_FORMAT Format, UINT TightRowPitch, UINT Height, _Out_ UINT &SlicePitch) |
| { |
| if (Planar(Format)) |
| { |
| UINT PlanarHeight; |
| if (FAILED(CalculateExtraPlanarRows(Format, Height, PlanarHeight))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| |
| return Safe_UIntMult(TightRowPitch, PlanarHeight, &SlicePitch); |
| } |
| else if (Format == DXGI_FORMAT_UNKNOWN) |
| { |
| return Safe_UIntMult(TightRowPitch, Height, &SlicePitch); |
| } |
| |
| UINT HeightAlignment = GetHeightAlignment(Format); |
| |
| // Caution assert to make sure that no new format breaks this assumption that all HeightAlignment formats are BC or Planar. |
| // This is to make sure that Height handled correctly for this calculation. |
| assert(HeightAlignment == 1 || IsBlockCompressFormat(Format)); |
| |
| UINT HeightOfPacked; |
| if (FAILED(DivideAndRoundUp(Height, HeightAlignment, HeightOfPacked))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| |
| if (FAILED(Safe_UIntMult(HeightOfPacked, TightRowPitch, &SlicePitch))) |
| { |
| return INTSAFE_E_ARITHMETIC_OVERFLOW; |
| } |
| |
| return S_OK; |
| } |
| |
| |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetBitsPerUnit - returns bits per pixel unless format is a block compress format then it returns bits per block. |
| // use IsBlockCompressFormat() to determine if block size is returned. |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerUnit(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].BitsPerUnit; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetWidthAlignment(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].WidthAlignment; |
| } |
| |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetHeightAlignment(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].HeightAlignment; |
| } |
| |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDepthAlignment(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].DepthAlignment; |
| } |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetFormat |
| DXGI_FORMAT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormat(SIZE_T Index) |
| { |
| if( Index < GetNumFormats() ) |
| { |
| return s_FormatDetail[Index].DXGIFormat; |
| } |
| return (DXGI_FORMAT)-1; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // CanBeCastEvenFullyTyped |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CanBeCastEvenFullyTyped(DXGI_FORMAT Format, D3D_FEATURE_LEVEL fl) |
| { |
| //SRGB can be cast away/back, and XR_BIAS can be cast to/from UNORM |
| switch(fl) |
| { |
| case D3D_FEATURE_LEVEL_1_0_GENERIC: |
| case D3D_FEATURE_LEVEL_1_0_CORE: |
| return false; |
| default: |
| break; |
| } |
| switch( Format ) |
| { |
| case DXGI_FORMAT_R8G8B8A8_UNORM: |
| case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: |
| case DXGI_FORMAT_B8G8R8A8_UNORM: |
| case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: |
| return true; |
| case DXGI_FORMAT_R10G10B10A2_UNORM: |
| case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: |
| return fl >= D3D_FEATURE_LEVEL_10_0; |
| default: |
| return false; |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetFormatDetail |
| const D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FORMAT_DETAIL* D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatDetail( DXGI_FORMAT Format ) |
| { |
| const UINT Index = GetDetailTableIndex(Format); |
| if(UINT( -1 ) == Index ) |
| { |
| return nullptr; |
| } |
| |
| return &s_FormatDetail[ Index ]; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetBitsPerStencil |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerStencil(DXGI_FORMAT Format) |
| { |
| const UINT Index = GetDetailTableIndexThrow( Format ); |
| if( (s_FormatDetail[Index].TypeLevel != D3DFTL_PARTIAL_TYPE) && |
| (s_FormatDetail[Index].TypeLevel != D3DFTL_FULL_TYPE) ) |
| { |
| return 0; |
| } |
| for( UINT comp = 0; comp < 4; comp++ ) |
| { |
| D3D_FORMAT_COMPONENT_NAME name = D3DFCN_D; |
| switch(comp) |
| { |
| case 0: name = s_FormatDetail[Index].ComponentName0; break; |
| case 1: name = s_FormatDetail[Index].ComponentName1; break; |
| case 2: name = s_FormatDetail[Index].ComponentName2; break; |
| case 3: name = s_FormatDetail[Index].ComponentName3; break; |
| } |
| if( name == D3DFCN_S ) |
| { |
| return s_FormatDetail[Index].BitsPerComponent[comp]; |
| } |
| } |
| return 0; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetFormatReturnTypes |
| void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatReturnTypes( |
| DXGI_FORMAT Format, |
| D3D_FORMAT_COMPONENT_INTERPRETATION* pInterpretations ) // return array with 4 entries |
| { |
| const UINT Index = GetDetailTableIndexThrow(Format); |
| pInterpretations[D3D10_SB_4_COMPONENT_R] = s_FormatDetail[Index].ComponentInterpretation0; |
| pInterpretations[D3D10_SB_4_COMPONENT_G] = s_FormatDetail[Index].ComponentInterpretation1; |
| pInterpretations[D3D10_SB_4_COMPONENT_B] = s_FormatDetail[Index].ComponentInterpretation2; |
| pInterpretations[D3D10_SB_4_COMPONENT_A] = s_FormatDetail[Index].ComponentInterpretation3; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetAddressingBitsPerAlignedSize |
| UINT8 D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetAddressingBitsPerAlignedSize(DXGI_FORMAT Format) |
| { |
| UINT byteAlignment = GetByteAlignment(Format); |
| UINT8 addressBitsPerElement = 0; |
| |
| switch(byteAlignment) |
| { |
| case 1: addressBitsPerElement = 0; break; |
| case 2: addressBitsPerElement = 1; break; |
| case 4: addressBitsPerElement = 2; break; |
| case 8: addressBitsPerElement = 3; break; |
| case 16: addressBitsPerElement = 4; break; |
| |
| // The format is not supported |
| default: return UINT8( -1 ); |
| } |
| |
| return addressBitsPerElement; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetNumComponentsInFormat |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetNumComponentsInFormat( DXGI_FORMAT Format ) |
| { |
| UINT n = 0; |
| const UINT Index = GetDetailTableIndexThrow(Format); |
| for( UINT comp = 0; comp < 4; comp++ ) |
| { |
| D3D_FORMAT_COMPONENT_NAME name = D3DFCN_D; |
| switch(comp) |
| { |
| case 0: name = s_FormatDetail[Index].ComponentName0; break; |
| case 1: name = s_FormatDetail[Index].ComponentName1; break; |
| case 2: name = s_FormatDetail[Index].ComponentName2; break; |
| case 3: name = s_FormatDetail[Index].ComponentName3; break; |
| } |
| if( name != D3DFCN_X ) |
| { |
| n++; |
| } |
| } |
| return n; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Sequential2AbsoluteComponentIndex |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Sequential2AbsoluteComponentIndex( DXGI_FORMAT Format, UINT SequentialComponentIndex) |
| { |
| UINT n = 0; |
| const UINT Index = GetDetailTableIndexThrow(Format); |
| for( UINT comp = 0; comp < 4; comp++ ) |
| { |
| D3D_FORMAT_COMPONENT_NAME name = static_cast<D3D_FORMAT_COMPONENT_NAME>(0); |
| switch(comp) |
| { |
| case 0: name = s_FormatDetail[Index].ComponentName0; break; |
| case 1: name = s_FormatDetail[Index].ComponentName1; break; |
| case 2: name = s_FormatDetail[Index].ComponentName2; break; |
| case 3: name = s_FormatDetail[Index].ComponentName3; break; |
| } |
| if( name != D3DFCN_X ) |
| { |
| if (SequentialComponentIndex == n) |
| { |
| return comp; |
| } |
| n++; |
| } |
| } |
| return UINT(-1); |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Depth Only Format |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::DepthOnlyFormat(DXGI_FORMAT Format) |
| { |
| switch( Format ) |
| { |
| case DXGI_FORMAT_D32_FLOAT: |
| case DXGI_FORMAT_D16_UNORM: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::SupportsSamplerFeedback(DXGI_FORMAT Format) |
| { |
| switch (Format) |
| { |
| case DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE: |
| case DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetParentFormat |
| DXGI_FORMAT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetParentFormat(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[Format].ParentFormat; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetFormatCastSet |
| const DXGI_FORMAT* D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatCastSet(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[Format].pDefaultFormatCastSet; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetTypeLevel |
| D3D_FORMAT_TYPE_LEVEL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetTypeLevel(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].TypeLevel; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetLayout |
| D3D_FORMAT_LAYOUT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetLayout(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].Layout; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetComponentName |
| D3D_FORMAT_COMPONENT_NAME D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetComponentName(DXGI_FORMAT Format, UINT AbsoluteComponentIndex) |
| { |
| D3D_FORMAT_COMPONENT_NAME name; |
| switch( AbsoluteComponentIndex ) |
| { |
| case 0: name = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentName0; break; |
| case 1: name = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentName1; break; |
| case 2: name = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentName2; break; |
| case 3: name = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentName3; break; |
| default: throw E_FAIL; |
| } |
| return name; |
| } |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetBitsPerComponent |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetBitsPerComponent(DXGI_FORMAT Format, UINT AbsoluteComponentIndex) |
| { |
| if( AbsoluteComponentIndex > 3 ) |
| { |
| throw E_FAIL; |
| } |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].BitsPerComponent[AbsoluteComponentIndex]; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetFormatComponentInterpretation |
| D3D_FORMAT_COMPONENT_INTERPRETATION D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetFormatComponentInterpretation(DXGI_FORMAT Format, UINT AbsoluteComponentIndex) |
| { |
| D3D_FORMAT_COMPONENT_INTERPRETATION interp {}; |
| |
| switch( AbsoluteComponentIndex ) |
| { |
| case 0: interp = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentInterpretation0; break; |
| case 1: interp = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentInterpretation1; break; |
| case 2: interp = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentInterpretation2; break; |
| case 3: interp = s_FormatDetail[GetDetailTableIndexNoThrow( Format )].ComponentInterpretation3; break; |
| // default: throw E_FAIL; |
| } |
| return interp; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Planar |
| BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Planar(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].bPlanar; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Non-opaque Planar |
| BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::NonOpaquePlanar(DXGI_FORMAT Format) |
| { |
| return Planar(Format) && !Opaque(Format); |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // YUV |
| BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::YUV(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[GetDetailTableIndexNoThrow( Format )].bYUV; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Format family supports stencil |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FamilySupportsStencil(DXGI_FORMAT Format) |
| { |
| switch( GetParentFormat(Format) ) |
| { |
| case DXGI_FORMAT_R32G8X24_TYPELESS: |
| case DXGI_FORMAT_R24G8_TYPELESS: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetDetailTableIndexThrow |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexThrow(DXGI_FORMAT Format) |
| { |
| UINT Index = GetDetailTableIndex( Format ); |
| if(UINT( -1 ) == Index ) |
| { |
| throw E_FAIL; |
| } |
| return Index; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetDetailTableIndexNoThrow |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexNoThrow(DXGI_FORMAT Format) |
| { |
| UINT Index = GetDetailTableIndex( Format ); |
| assert(UINT( -1 ) != Index ); // Needs to be validated externally. |
| return Index; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetYCbCrChromaSubsampling |
| void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetYCbCrChromaSubsampling( |
| DXGI_FORMAT Format, |
| _Out_ UINT& HorizontalSubsampling, |
| _Out_ UINT& VerticalSubsampling |
| ) |
| { |
| switch( Format) |
| { |
| // YCbCr 4:2:0 |
| case DXGI_FORMAT_NV12: |
| case DXGI_FORMAT_P010: |
| case DXGI_FORMAT_P016: |
| case DXGI_FORMAT_420_OPAQUE: |
| HorizontalSubsampling = 2; |
| VerticalSubsampling = 2; |
| break; |
| |
| // YCbCr 4:2:2 |
| case DXGI_FORMAT_P208: |
| case DXGI_FORMAT_YUY2: |
| case DXGI_FORMAT_Y210: |
| HorizontalSubsampling = 2; |
| VerticalSubsampling = 1; |
| break; |
| |
| // YCbCr 4:4:0 |
| case DXGI_FORMAT_V208: |
| HorizontalSubsampling = 1; |
| VerticalSubsampling = 2; |
| break; |
| |
| // YCbCr 4:4:4 |
| case DXGI_FORMAT_AYUV: |
| case DXGI_FORMAT_V408: |
| case DXGI_FORMAT_Y410: |
| case DXGI_FORMAT_Y416: |
| // Fallthrough |
| |
| // YCbCr palletized 4:4:4: |
| case DXGI_FORMAT_AI44: |
| case DXGI_FORMAT_IA44: |
| case DXGI_FORMAT_P8: |
| case DXGI_FORMAT_A8P8: |
| HorizontalSubsampling = 1; |
| VerticalSubsampling = 1; |
| break; |
| |
| // YCbCr 4:1:1 |
| case DXGI_FORMAT_NV11: |
| HorizontalSubsampling = 4; |
| VerticalSubsampling = 1; |
| break; |
| |
| default: |
| // All YCbCr formats should be in this list. |
| assert( !YUV(Format) ); |
| HorizontalSubsampling = 1; |
| VerticalSubsampling = 1; |
| break; |
| }; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Plane count for non-opaque planar formats |
| UINT D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::NonOpaquePlaneCount(DXGI_FORMAT Format) |
| { |
| if (!D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::NonOpaquePlanar(Format)) |
| { |
| return 1; |
| } |
| |
| // V208 and V408 are the only 3-plane formats. |
| return (Format == DXGI_FORMAT_V208 || Format == DXGI_FORMAT_V408) ? 3 : 2; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetTileShape |
| // |
| // Retrieve 64K Tiled Resource tile shape |
| void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetTileShape( |
| D3D12_TILE_SHAPE* pTileShape, |
| DXGI_FORMAT Format, |
| D3D12_RESOURCE_DIMENSION Dimension, |
| UINT SampleCount |
| ) |
| { |
| UINT BPU = GetBitsPerUnit(Format); |
| |
| switch(Dimension) |
| { |
| case D3D12_RESOURCE_DIMENSION_UNKNOWN: |
| case D3D12_RESOURCE_DIMENSION_BUFFER: |
| case D3D12_RESOURCE_DIMENSION_TEXTURE1D: |
| { |
| assert(!IsBlockCompressFormat(Format)); |
| pTileShape->WidthInTexels = (BPU == 0) ? D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES : D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES*8 / BPU; |
| pTileShape->HeightInTexels = 1; |
| pTileShape->DepthInTexels = 1; |
| } |
| break; |
| case D3D12_RESOURCE_DIMENSION_TEXTURE2D: |
| { |
| if (IsBlockCompressFormat(Format)) |
| { |
| // Currently only supported block sizes are 64 and 128. |
| // 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. |
| assert(BPU == 64 || BPU == 128); |
| pTileShape->WidthInTexels = 64 * GetWidthAlignment(Format); |
| pTileShape->HeightInTexels = 64 * GetHeightAlignment(Format); |
| pTileShape->DepthInTexels = 1; |
| if (BPU == 64) |
| { |
| // If bits per block are 64 we double width so it takes up the full tile size. |
| // This is only true for BC1 and BC4 |
| assert((Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC1_UNORM_SRGB) || |
| (Format >= DXGI_FORMAT_BC4_TYPELESS && Format <= DXGI_FORMAT_BC4_SNORM)); |
| pTileShape->WidthInTexels *= 2; |
| } |
| } |
| else |
| { |
| pTileShape->DepthInTexels = 1; |
| if (BPU <= 8) |
| { |
| pTileShape->WidthInTexels = 256; |
| pTileShape->HeightInTexels = 256; |
| } |
| else if (BPU <= 16) |
| { |
| pTileShape->WidthInTexels = 256; |
| pTileShape->HeightInTexels = 128; |
| } |
| else if (BPU <= 32) |
| { |
| pTileShape->WidthInTexels = 128; |
| pTileShape->HeightInTexels = 128; |
| } |
| else if (BPU <= 64) |
| { |
| pTileShape->WidthInTexels = 128; |
| pTileShape->HeightInTexels = 64; |
| } |
| else if (BPU <= 128) |
| { |
| pTileShape->WidthInTexels = 64; |
| pTileShape->HeightInTexels = 64; |
| } |
| else |
| { |
| ASSUME( FALSE ); |
| } |
| |
| if (SampleCount <= 1) |
| { /* Do nothing */ } |
| else if (SampleCount <= 2) |
| { |
| pTileShape->WidthInTexels /= 2; |
| pTileShape->HeightInTexels /= 1; |
| } |
| else if (SampleCount <= 4) |
| { |
| pTileShape->WidthInTexels /= 2; |
| pTileShape->HeightInTexels /= 2; |
| } |
| else if (SampleCount <= 8) |
| { |
| pTileShape->WidthInTexels /= 4; |
| pTileShape->HeightInTexels /= 2; |
| } |
| else if (SampleCount <= 16) |
| { |
| pTileShape->WidthInTexels /= 4; |
| pTileShape->HeightInTexels /= 4; |
| } |
| else |
| { |
| ASSUME( FALSE ); |
| } |
| } |
| } |
| break; |
| case D3D12_RESOURCE_DIMENSION_TEXTURE3D: |
| { |
| if (IsBlockCompressFormat(Format)) |
| { |
| // Currently only supported block sizes are 64 and 128. |
| // 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. |
| assert(BPU == 64 || BPU == 128); |
| pTileShape->WidthInTexels = 16 * GetWidthAlignment(Format); |
| pTileShape->HeightInTexels = 16 * GetHeightAlignment(Format); |
| pTileShape->DepthInTexels = 16 * GetDepthAlignment(Format); |
| if (BPU == 64) |
| { |
| // If bits per block are 64 we double width so it takes up the full tile size. |
| // This is only true for BC1 and BC4 |
| assert((Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC1_UNORM_SRGB) || |
| (Format >= DXGI_FORMAT_BC4_TYPELESS && Format <= DXGI_FORMAT_BC4_SNORM)); |
| pTileShape->WidthInTexels *= 2; |
| } |
| } |
| else if (Format == DXGI_FORMAT_R8G8_B8G8_UNORM || Format == DXGI_FORMAT_G8R8_G8B8_UNORM) |
| { |
| //RGBG and GRGB are treated as 2x1 block format |
| pTileShape->WidthInTexels = 64; |
| pTileShape->HeightInTexels = 32; |
| pTileShape->DepthInTexels = 16; |
| } |
| else |
| { |
| // Not a block format so BPU is bits per pixel. |
| assert(GetWidthAlignment(Format) == 1 && GetHeightAlignment(Format) == 1 && GetDepthAlignment(Format)); |
| switch(BPU) |
| { |
| case 8: |
| pTileShape->WidthInTexels = 64; |
| pTileShape->HeightInTexels = 32; |
| pTileShape->DepthInTexels = 32; |
| break; |
| case 16: |
| pTileShape->WidthInTexels = 32; |
| pTileShape->HeightInTexels = 32; |
| pTileShape->DepthInTexels = 32; |
| break; |
| case 32: |
| pTileShape->WidthInTexels = 32; |
| pTileShape->HeightInTexels = 32; |
| pTileShape->DepthInTexels = 16; |
| break; |
| case 64: |
| pTileShape->WidthInTexels = 32; |
| pTileShape->HeightInTexels = 16; |
| pTileShape->DepthInTexels = 16; |
| break; |
| case 128: |
| pTileShape->WidthInTexels = 16; |
| pTileShape->HeightInTexels = 16; |
| pTileShape->DepthInTexels = 16; |
| break; |
| } |
| } |
| break; |
| } |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Get4KTileShape |
| // |
| // Retrieve 4K Tiled Resource tile shape |
| void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::Get4KTileShape( |
| D3D12_TILE_SHAPE* pTileShape, |
| DXGI_FORMAT Format, |
| D3D12_RESOURCE_DIMENSION Dimension, |
| UINT SampleCount |
| ) |
| { |
| UINT BPU = GetBitsPerUnit(Format); |
| |
| switch(Dimension) |
| { |
| case D3D12_RESOURCE_DIMENSION_UNKNOWN: |
| case D3D12_RESOURCE_DIMENSION_BUFFER: |
| case D3D12_RESOURCE_DIMENSION_TEXTURE1D: |
| { |
| assert(!IsBlockCompressFormat(Format)); |
| pTileShape->WidthInTexels = (BPU == 0) ? 4096 : 4096*8 / BPU; |
| pTileShape->HeightInTexels = 1; |
| pTileShape->DepthInTexels = 1; |
| } |
| break; |
| case D3D12_RESOURCE_DIMENSION_TEXTURE2D: |
| { |
| pTileShape->DepthInTexels = 1; |
| if (IsBlockCompressFormat(Format)) |
| { |
| // Currently only supported block sizes are 64 and 128. |
| // 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. |
| assert(BPU == 64 || BPU == 128); |
| pTileShape->WidthInTexels = 16 * GetWidthAlignment(Format); |
| pTileShape->HeightInTexels = 16 * GetHeightAlignment(Format); |
| if (BPU == 64) |
| { |
| // If bits per block are 64 we double width so it takes up the full tile size. |
| // This is only true for BC1 and BC4 |
| assert((Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC1_UNORM_SRGB) || |
| (Format >= DXGI_FORMAT_BC4_TYPELESS && Format <= DXGI_FORMAT_BC4_SNORM)); |
| pTileShape->WidthInTexels *= 2; |
| } |
| } |
| else |
| { |
| if (BPU <= 8) |
| { |
| pTileShape->WidthInTexels = 64; |
| pTileShape->HeightInTexels = 64; |
| } |
| else if (BPU <= 16) |
| { |
| pTileShape->WidthInTexels = 64; |
| pTileShape->HeightInTexels = 32; |
| } |
| else if (BPU <= 32) |
| { |
| pTileShape->WidthInTexels = 32; |
| pTileShape->HeightInTexels = 32; |
| } |
| else if (BPU <= 64) |
| { |
| pTileShape->WidthInTexels = 32; |
| pTileShape->HeightInTexels = 16; |
| } |
| else if (BPU <= 128) |
| { |
| pTileShape->WidthInTexels = 16; |
| pTileShape->HeightInTexels = 16; |
| } |
| else |
| { |
| ASSUME( FALSE ); |
| } |
| |
| if (SampleCount <= 1) |
| { /* Do nothing */ } |
| else if (SampleCount <= 2) |
| { |
| pTileShape->WidthInTexels /= 2; |
| pTileShape->HeightInTexels /= 1; |
| } |
| else if (SampleCount <= 4) |
| { |
| pTileShape->WidthInTexels /= 2; |
| pTileShape->HeightInTexels /= 2; |
| } |
| else if (SampleCount <= 8) |
| { |
| pTileShape->WidthInTexels /= 4; |
| pTileShape->HeightInTexels /= 2; |
| } |
| else if (SampleCount <= 16) |
| { |
| pTileShape->WidthInTexels /= 4; |
| pTileShape->HeightInTexels /= 4; |
| } |
| else |
| { |
| ASSUME( FALSE ); |
| } |
| |
| assert(GetWidthAlignment(Format) == 1); |
| assert(GetHeightAlignment(Format) == 1); |
| assert(GetDepthAlignment(Format) == 1); |
| } |
| |
| break; |
| } |
| case D3D12_RESOURCE_DIMENSION_TEXTURE3D: |
| { |
| if (IsBlockCompressFormat(Format)) |
| { |
| // Currently only supported block sizes are 64 and 128. |
| // 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. |
| assert(BPU == 64 || BPU == 128); |
| pTileShape->WidthInTexels = 8 * GetWidthAlignment(Format); |
| pTileShape->HeightInTexels = 8 * GetHeightAlignment(Format); |
| pTileShape->DepthInTexels = 4; |
| if (BPU == 64) |
| { |
| // If bits per block are 64 we double width so it takes up the full tile size. |
| // This is only true for BC1 and BC4 |
| assert((Format >= DXGI_FORMAT_BC1_TYPELESS && Format <= DXGI_FORMAT_BC1_UNORM_SRGB) || |
| (Format >= DXGI_FORMAT_BC4_TYPELESS && Format <= DXGI_FORMAT_BC4_SNORM)); |
| pTileShape->DepthInTexels *= 2; |
| } |
| } |
| else |
| { |
| if (BPU <= 8) |
| { |
| pTileShape->WidthInTexels = 16; |
| pTileShape->HeightInTexels = 16; |
| pTileShape->DepthInTexels = 16; |
| } |
| else if (BPU <= 16) |
| { |
| pTileShape->WidthInTexels = 16; |
| pTileShape->HeightInTexels = 16; |
| pTileShape->DepthInTexels = 8; |
| } |
| else if (BPU <= 32) |
| { |
| pTileShape->WidthInTexels = 16; |
| pTileShape->HeightInTexels = 8; |
| pTileShape->DepthInTexels = 8; |
| } |
| else if (BPU <= 64) |
| { |
| pTileShape->WidthInTexels = 8; |
| pTileShape->HeightInTexels = 8; |
| pTileShape->DepthInTexels = 8; |
| } |
| else if (BPU <= 128) |
| { |
| pTileShape->WidthInTexels = 8; |
| pTileShape->HeightInTexels = 8; |
| pTileShape->DepthInTexels = 4; |
| } |
| else |
| { |
| ASSUME( FALSE ); |
| } |
| |
| assert(GetWidthAlignment(Format) == 1); |
| assert(GetHeightAlignment(Format) == 1); |
| assert(GetDepthAlignment(Format) == 1); |
| } |
| } |
| break; |
| } |
| } |
| |
| //---------------------------------------------------------------------------------------------------------------------------------- |
| // GetPlaneSliceFromViewFormat |
| // Maps resource format + view format to a plane index for resource formats where the plane index can be inferred from this information. |
| // For planar formats where the plane index is ambiguous given this information (examples: V208, V408), this function returns 0. |
| // This function returns 0 for non-planar formats. |
| UINT8 D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetPlaneSliceFromViewFormat( |
| DXGI_FORMAT ResourceFormat, |
| DXGI_FORMAT ViewFormat |
| ) |
| { |
| switch(GetParentFormat(ResourceFormat)) |
| { |
| case DXGI_FORMAT_R24G8_TYPELESS: |
| switch(ViewFormat) |
| { |
| case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: |
| return 0; |
| case DXGI_FORMAT_X24_TYPELESS_G8_UINT: |
| return 1; |
| default: |
| ASSUME( false ); |
| } |
| break; |
| case DXGI_FORMAT_R32G8X24_TYPELESS: |
| switch(ViewFormat) |
| { |
| case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: |
| return 0; |
| case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: |
| return 1; |
| default: |
| ASSUME( false ); |
| } |
| break; |
| case DXGI_FORMAT_NV12: |
| case DXGI_FORMAT_NV11: |
| case DXGI_FORMAT_P208: |
| switch(ViewFormat) |
| { |
| case DXGI_FORMAT_R8_UNORM: |
| case DXGI_FORMAT_R8_UINT: |
| return 0; |
| case DXGI_FORMAT_R8G8_UNORM: |
| case DXGI_FORMAT_R8G8_UINT: |
| return 1; |
| default: |
| ASSUME( false ); |
| } |
| break; |
| case DXGI_FORMAT_P016: |
| case DXGI_FORMAT_P010: |
| switch(ViewFormat) |
| { |
| case DXGI_FORMAT_R16_UNORM: |
| case DXGI_FORMAT_R16_UINT: |
| return 0; |
| case DXGI_FORMAT_R16G16_UNORM: |
| case DXGI_FORMAT_R16G16_UINT: |
| case DXGI_FORMAT_R32_UINT: |
| return 1; |
| default: |
| ASSUME( false ); |
| } |
| break; |
| default: |
| break; |
| } |
| return 0; |
| } |
| |
| //---------------------------------------------------------------------------------------------------------------------------------- |
| void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetPlaneSubsampledSizeAndFormatForCopyableLayout( |
| UINT PlaneSlice, |
| DXGI_FORMAT Format, |
| UINT Width, |
| UINT Height, |
| _Out_ DXGI_FORMAT& PlaneFormat, |
| _Out_ UINT& MinPlanePitchWidth, |
| _Out_ UINT& PlaneWidth, |
| _Out_ UINT& PlaneHeight) |
| { |
| DXGI_FORMAT ParentFormat = GetParentFormat(Format); |
| |
| if (Planar(ParentFormat)) |
| { |
| switch (ParentFormat) |
| { |
| // YCbCr 4:2:0 |
| case DXGI_FORMAT_NV12: |
| switch(PlaneSlice) |
| { |
| case 0: |
| PlaneFormat = DXGI_FORMAT_R8_TYPELESS; |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| break; |
| case 1: |
| PlaneFormat = DXGI_FORMAT_R8G8_TYPELESS; |
| PlaneWidth = (Width + 1) >> 1; |
| PlaneHeight = (Height + 1) >> 1; |
| break; |
| default: |
| ASSUME(FALSE); |
| }; |
| |
| MinPlanePitchWidth = PlaneWidth; |
| break; |
| |
| case DXGI_FORMAT_P010: |
| case DXGI_FORMAT_P016: |
| switch(PlaneSlice) |
| { |
| case 0: |
| PlaneFormat = DXGI_FORMAT_R16_TYPELESS; |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| break; |
| case 1: |
| PlaneFormat = DXGI_FORMAT_R16G16_TYPELESS; |
| PlaneWidth = (Width + 1) >> 1; |
| PlaneHeight = (Height + 1) >> 1; |
| break; |
| default: |
| ASSUME(FALSE); |
| }; |
| |
| MinPlanePitchWidth = PlaneWidth; |
| break; |
| |
| // YCbCr 4:2:2 |
| case DXGI_FORMAT_P208: |
| switch(PlaneSlice) |
| { |
| case 0: |
| PlaneFormat = DXGI_FORMAT_R8_TYPELESS; |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| break; |
| case 1: |
| PlaneFormat = DXGI_FORMAT_R8G8_TYPELESS; |
| PlaneWidth = (Width + 1) >> 1; |
| PlaneHeight = Height; |
| break; |
| default: |
| ASSUME(FALSE); |
| }; |
| |
| MinPlanePitchWidth = PlaneWidth; |
| break; |
| |
| // YCbCr 4:4:0 |
| case DXGI_FORMAT_V208: |
| PlaneFormat = DXGI_FORMAT_R8_TYPELESS; |
| switch(PlaneSlice) |
| { |
| case 0: |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| break; |
| case 1: |
| case 2: |
| PlaneWidth = Width; |
| PlaneHeight = (Height + 1) >> 1; |
| break; |
| default: |
| ASSUME(FALSE); |
| }; |
| |
| MinPlanePitchWidth = PlaneWidth; |
| break; |
| |
| // YCbCr 4:4:4 |
| case DXGI_FORMAT_V408: |
| |
| switch(PlaneSlice) |
| { |
| case 0: |
| case 1: |
| case 2: |
| PlaneFormat = DXGI_FORMAT_R8_TYPELESS; |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| MinPlanePitchWidth = PlaneWidth; |
| break; |
| default: |
| ASSUME(FALSE); |
| }; |
| break; |
| |
| // YCbCr 4:1:1 |
| case DXGI_FORMAT_NV11: |
| switch(PlaneSlice) |
| { |
| case 0: |
| PlaneFormat = DXGI_FORMAT_R8_TYPELESS; |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| MinPlanePitchWidth = Width; |
| break; |
| case 1: |
| PlaneFormat = DXGI_FORMAT_R8G8_TYPELESS; |
| PlaneWidth = (Width + 3) >> 2; |
| PlaneHeight = Height; |
| |
| // NV11 has unused padding to the right of the chroma plane in the RowMajor (linear) copyable layout. |
| MinPlanePitchWidth = (Width + 1) >> 1; |
| break; |
| default: |
| ASSUME(FALSE); |
| }; |
| |
| break; |
| |
| case DXGI_FORMAT_R32G8X24_TYPELESS: |
| case DXGI_FORMAT_R24G8_TYPELESS: |
| switch(PlaneSlice) |
| { |
| case 0: |
| PlaneFormat = DXGI_FORMAT_R32_TYPELESS; |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| MinPlanePitchWidth = Width; |
| break; |
| case 1: |
| PlaneFormat = DXGI_FORMAT_R8_TYPELESS; |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| MinPlanePitchWidth = Width; |
| break; |
| default: |
| ASSUME(FALSE); |
| }; |
| break; |
| |
| default: |
| ASSUME( FALSE ); |
| }; |
| } |
| else |
| { |
| assert(PlaneSlice == 0); |
| PlaneFormat = Format; |
| PlaneWidth = Width; |
| PlaneHeight = Height; |
| MinPlanePitchWidth = PlaneWidth; |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // GetPlaneCount |
| UINT8 D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetPlaneCount(DXGI_FORMAT Format) |
| { |
| switch( GetParentFormat(Format) ) |
| { |
| case DXGI_FORMAT_NV12: |
| case DXGI_FORMAT_NV11: |
| case DXGI_FORMAT_P208: |
| case DXGI_FORMAT_P016: |
| case DXGI_FORMAT_P010: |
| case DXGI_FORMAT_R24G8_TYPELESS: |
| case DXGI_FORMAT_R32G8X24_TYPELESS: |
| return 2; |
| case DXGI_FORMAT_V208: |
| case DXGI_FORMAT_V408: |
| return 3; |
| default: |
| return 1; |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| void D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetMipDimensions(UINT8 mipSlice, _Inout_ UINT64 *pWidth, _Inout_opt_ UINT64 *pHeight, _Inout_opt_ UINT64 *pDepth) |
| { |
| UINT denominator = (1 << mipSlice); // 2 ^ subresource |
| UINT64 mipWidth = *pWidth / denominator; |
| UINT64 mipHeight = pHeight ? *pHeight / denominator : 1; |
| UINT64 mipDepth = pDepth ? *pDepth / denominator : 1; |
| |
| // Adjust dimensions for degenerate mips |
| if(mipHeight == 0 ) |
| mipHeight = 1; |
| if(mipWidth == 0 ) |
| mipWidth = 1; |
| if(mipDepth == 0) |
| mipDepth = 1; |
| |
| *pWidth = mipWidth; |
| if(pHeight) *pHeight = mipHeight; |
| if(pDepth) *pDepth = mipDepth; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // DX9VertexOrIndexFormat |
| BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::DX9VertexOrIndexFormat(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexThrow( Format )].bDX9VertexOrIndexFormat; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // DX9TextureFormat |
| BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::DX9TextureFormat(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexThrow( Format )].bDX9TextureFormat; |
| } |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // FloatNormTextureFormat |
| BOOL D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FloatNormTextureFormat(DXGI_FORMAT Format) |
| { |
| return s_FormatDetail[D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::GetDetailTableIndexThrow( Format )].bFloatNormFormat; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // ValidCastToR32UAV |
| // |
| // 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 |
| // can be written though, with type conversion (e.g. R8G8B8A8_*). If an API user wants to do image processing in-place, in either |
| // the Compute Shader or the Pixel Shader, the only format available is R32_* (since it can be read and written at the same time). |
| // |
| // 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 |
| // (such as R8G8B8A8_TYPELESS), to be cast to R32_* when creating a UAV. This means the Compute Shader or Pixel Shader can |
| // do simultaneous read+write on the resource when bound as an R32_* UAV, with the caveat that the shader code has to do manual |
| // 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 |
| // thus have access to filtering/blending where the hardware knows what the format is. |
| // |
| // If we didn't have this ability to cast some formats to R32_* UAVs, applications would have to keep an extra allocation around |
| // and do a rendering pass that copies from the R32_* UAV to whatever typed resource they really wanted. For formats not included |
| // 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 |
| // R24G8 or R11G11B10_FLOAT there is no alternative for an application but to do the extra copy as mentioned, or avoid in-place |
| // image editing in favor of ping-ponging between buffers with multiple passes. |
| // |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::ValidCastToR32UAV(DXGI_FORMAT from, DXGI_FORMAT to) |
| { |
| // Allow casting of 32 bit formats to R32_* |
| if( |
| ((to == DXGI_FORMAT_R32_UINT)||(to == DXGI_FORMAT_R32_SINT)||(to == DXGI_FORMAT_R32_FLOAT)) |
| && |
| ( |
| (from == DXGI_FORMAT_R10G10B10A2_TYPELESS) || |
| (from == DXGI_FORMAT_R8G8B8A8_TYPELESS) || |
| (from == DXGI_FORMAT_B8G8R8A8_TYPELESS) || |
| (from == DXGI_FORMAT_B8G8R8X8_TYPELESS) || |
| (from == DXGI_FORMAT_R16G16_TYPELESS) || |
| (from == DXGI_FORMAT_R32_TYPELESS) |
| ) |
| ) |
| { |
| return true; |
| } |
| return false; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // IsSupportedTextureDisplayableFormat |
| // |
| // List of formats associated with Feature_D3D1XDisplayable |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::IsSupportedTextureDisplayableFormat |
| ( DXGI_FORMAT Format |
| , bool bMediaFormatOnly |
| ) |
| { |
| if (bMediaFormatOnly) |
| { |
| return (false |
| || ( Format == DXGI_FORMAT_NV12 |
| || Format == DXGI_FORMAT_YUY2 |
| ) |
| ); |
| } |
| else |
| { |
| return (false // eases evolution |
| || ( Format == DXGI_FORMAT_B8G8R8A8_UNORM |
| || Format == DXGI_FORMAT_R8G8B8A8_UNORM |
| || Format == DXGI_FORMAT_R16G16B16A16_FLOAT |
| || Format == DXGI_FORMAT_R10G10B10A2_UNORM |
| || Format == DXGI_FORMAT_NV12 |
| || Format == DXGI_FORMAT_YUY2 |
| ) |
| ); |
| } |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::FloatAndNotFloatFormats(DXGI_FORMAT FormatA, DXGI_FORMAT FormatB) |
| { |
| UINT NumComponents = (std::min)(GetNumComponentsInFormat(FormatA), GetNumComponentsInFormat(FormatB)); |
| for (UINT c = 0; c < NumComponents; c++) |
| { |
| D3D_FORMAT_COMPONENT_INTERPRETATION fciA = GetFormatComponentInterpretation(FormatA, c); |
| D3D_FORMAT_COMPONENT_INTERPRETATION fciB = GetFormatComponentInterpretation(FormatB, c); |
| if ((fciA != fciB) && ((fciA == D3DFCI_FLOAT) || (fciB == D3DFCI_FLOAT))) |
| { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::SNORMAndUNORMFormats(DXGI_FORMAT FormatA, DXGI_FORMAT FormatB) |
| { |
| UINT NumComponents = (std::min)(GetNumComponentsInFormat(FormatA), GetNumComponentsInFormat(FormatB)); |
| for (UINT c = 0; c < NumComponents; c++) |
| { |
| D3D_FORMAT_COMPONENT_INTERPRETATION fciA = GetFormatComponentInterpretation(FormatA, c); |
| D3D_FORMAT_COMPONENT_INTERPRETATION fciB = GetFormatComponentInterpretation(FormatB, c); |
| if (((fciA == D3DFCI_SNORM) && (fciB == D3DFCI_UNORM)) || |
| ((fciB == D3DFCI_SNORM) && (fciA == D3DFCI_UNORM))) |
| { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Formats allowed by runtime for decode histogram. |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::DecodeHistogramAllowedForOutputFormatSupport(DXGI_FORMAT Format) |
| { |
| return ( |
| /* YUV 4:2:0 */ |
| Format == DXGI_FORMAT_NV12 |
| || Format == DXGI_FORMAT_P010 |
| || Format == DXGI_FORMAT_P016 |
| /* YUV 4:2:2 */ |
| || Format == DXGI_FORMAT_YUY2 |
| || Format == DXGI_FORMAT_Y210 |
| || Format == DXGI_FORMAT_Y216 |
| /* YUV 4:4:4 */ |
| || Format == DXGI_FORMAT_AYUV |
| || Format == DXGI_FORMAT_Y410 |
| || Format == DXGI_FORMAT_Y416 |
| ); |
| } |
| |
| //--------------------------------------------------------------------------------------------------------------------------------- |
| // Formats allowed by runtime for decode histogram. Scopes to tested formats. |
| bool D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::MotionEstimatorAllowedInputFormat(DXGI_FORMAT Format) |
| { |
| return Format == DXGI_FORMAT_NV12; |
| } |
| |
| #undef R |
| #undef G |
| #undef B |
| #undef A |
| #undef D |
| #undef S |
| #undef X |
| |
| #undef _TYPELESS |
| #undef _FLOAT |
| #undef _SNORM |
| #undef _UNORM |
| #undef _SINT |
| #undef _UINT |
| #undef _UNORM_SRGB |
| #undef _FIXED_2_8 |
| |
| #endif // D3D12_SDK_VERSION >= 606 |
| |