blob: 1a5a08f3307bab3852adb2588c2aa0341c0cb0b7 [file] [log] [blame]
Dave Houlton3c9fca72017-03-27 17:25:54 -06001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * Author: Mark Lobodzinski <mark@lunarg.com>
18 * Author: Dave Houlton <daveh@lunarg.com>
19 *
20 */
21
22#include <string.h>
23#include <string>
24#include <vector>
25#include <map>
26#include "vulkan/vulkan.h"
27#include "vk_format_utils.h"
28
29struct VULKAN_FORMAT_INFO {
30 size_t size;
31 uint32_t channel_count;
32 VkFormatCompatibilityClass format_class;
33};
34
35// Disable auto-formatting for this large table
36// clang-format off
37
38// Set up data structure with number of bytes and number of channels for each Vulkan format
39const std::map<VkFormat, VULKAN_FORMAT_INFO> vk_format_table = {
40 {VK_FORMAT_UNDEFINED, {0, 0, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }},
41 {VK_FORMAT_R4G4_UNORM_PACK8, {1, 2, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
42 {VK_FORMAT_R4G4B4A4_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
43 {VK_FORMAT_B4G4R4A4_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
44 {VK_FORMAT_R5G6B5_UNORM_PACK16, {2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
45 {VK_FORMAT_B5G6R5_UNORM_PACK16, {2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
46 {VK_FORMAT_R5G5B5A1_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
47 {VK_FORMAT_B5G5R5A1_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
48 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
49 {VK_FORMAT_R8_UNORM, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
50 {VK_FORMAT_R8_SNORM, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
51 {VK_FORMAT_R8_USCALED, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
52 {VK_FORMAT_R8_SSCALED, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
53 {VK_FORMAT_R8_UINT, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
54 {VK_FORMAT_R8_SINT, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
55 {VK_FORMAT_R8_SRGB, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
56 {VK_FORMAT_R8G8_UNORM, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
57 {VK_FORMAT_R8G8_SNORM, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
58 {VK_FORMAT_R8G8_USCALED, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
59 {VK_FORMAT_R8G8_SSCALED, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
60 {VK_FORMAT_R8G8_UINT, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
61 {VK_FORMAT_R8G8_SINT, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
62 {VK_FORMAT_R8G8_SRGB, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
63 {VK_FORMAT_R8G8B8_UNORM, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
64 {VK_FORMAT_R8G8B8_SNORM, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
65 {VK_FORMAT_R8G8B8_USCALED, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
66 {VK_FORMAT_R8G8B8_SSCALED, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
67 {VK_FORMAT_R8G8B8_UINT, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
68 {VK_FORMAT_R8G8B8_SINT, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
69 {VK_FORMAT_R8G8B8_SRGB, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
70 {VK_FORMAT_B8G8R8_UNORM, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
71 {VK_FORMAT_B8G8R8_SNORM, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
72 {VK_FORMAT_B8G8R8_USCALED, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
73 {VK_FORMAT_B8G8R8_SSCALED, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
74 {VK_FORMAT_B8G8R8_UINT, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
75 {VK_FORMAT_B8G8R8_SINT, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
76 {VK_FORMAT_B8G8R8_SRGB, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
77 {VK_FORMAT_R8G8B8A8_UNORM, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
78 {VK_FORMAT_R8G8B8A8_SNORM, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
79 {VK_FORMAT_R8G8B8A8_USCALED, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
80 {VK_FORMAT_R8G8B8A8_SSCALED, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
81 {VK_FORMAT_R8G8B8A8_UINT, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
82 {VK_FORMAT_R8G8B8A8_SINT, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
83 {VK_FORMAT_R8G8B8A8_SRGB, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
84 {VK_FORMAT_B8G8R8A8_UNORM, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
85 {VK_FORMAT_B8G8R8A8_SNORM, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
86 {VK_FORMAT_B8G8R8A8_USCALED, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
87 {VK_FORMAT_B8G8R8A8_SSCALED, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
88 {VK_FORMAT_B8G8R8A8_UINT, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
89 {VK_FORMAT_B8G8R8A8_SINT, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
90 {VK_FORMAT_B8G8R8A8_SRGB, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
91 {VK_FORMAT_A8B8G8R8_UNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
92 {VK_FORMAT_A8B8G8R8_SNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
93 {VK_FORMAT_A8B8G8R8_USCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
94 {VK_FORMAT_A8B8G8R8_SSCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
95 {VK_FORMAT_A8B8G8R8_UINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
96 {VK_FORMAT_A8B8G8R8_SINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
97 {VK_FORMAT_A8B8G8R8_SRGB_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
98 {VK_FORMAT_A2R10G10B10_UNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
99 {VK_FORMAT_A2R10G10B10_SNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
100 {VK_FORMAT_A2R10G10B10_USCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
101 {VK_FORMAT_A2R10G10B10_SSCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
102 {VK_FORMAT_A2R10G10B10_UINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
103 {VK_FORMAT_A2R10G10B10_SINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
104 {VK_FORMAT_A2B10G10R10_UNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
105 {VK_FORMAT_A2B10G10R10_SNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
106 {VK_FORMAT_A2B10G10R10_USCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
107 {VK_FORMAT_A2B10G10R10_SSCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
108 {VK_FORMAT_A2B10G10R10_UINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
109 {VK_FORMAT_A2B10G10R10_SINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
110 {VK_FORMAT_R16_UNORM, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
111 {VK_FORMAT_R16_SNORM, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
112 {VK_FORMAT_R16_USCALED, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
113 {VK_FORMAT_R16_SSCALED, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
114 {VK_FORMAT_R16_UINT, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
115 {VK_FORMAT_R16_SINT, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
116 {VK_FORMAT_R16_SFLOAT, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
117 {VK_FORMAT_R16G16_UNORM, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
118 {VK_FORMAT_R16G16_SNORM, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
119 {VK_FORMAT_R16G16_USCALED, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
120 {VK_FORMAT_R16G16_SSCALED, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
121 {VK_FORMAT_R16G16_UINT, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
122 {VK_FORMAT_R16G16_SINT, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
123 {VK_FORMAT_R16G16_SFLOAT, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
124 {VK_FORMAT_R16G16B16_UNORM, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
125 {VK_FORMAT_R16G16B16_SNORM, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
126 {VK_FORMAT_R16G16B16_USCALED, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
127 {VK_FORMAT_R16G16B16_SSCALED, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
128 {VK_FORMAT_R16G16B16_UINT, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
129 {VK_FORMAT_R16G16B16_SINT, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
130 {VK_FORMAT_R16G16B16_SFLOAT, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
131 {VK_FORMAT_R16G16B16A16_UNORM, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
132 {VK_FORMAT_R16G16B16A16_SNORM, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
133 {VK_FORMAT_R16G16B16A16_USCALED, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
134 {VK_FORMAT_R16G16B16A16_SSCALED, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
135 {VK_FORMAT_R16G16B16A16_UINT, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
136 {VK_FORMAT_R16G16B16A16_SINT, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
137 {VK_FORMAT_R16G16B16A16_SFLOAT, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
138 {VK_FORMAT_R32_UINT, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
139 {VK_FORMAT_R32_SINT, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
140 {VK_FORMAT_R32_SFLOAT, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
141 {VK_FORMAT_R32G32_UINT, {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
142 {VK_FORMAT_R32G32_SINT, {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
143 {VK_FORMAT_R32G32_SFLOAT, {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
144 {VK_FORMAT_R32G32B32_UINT, {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
145 {VK_FORMAT_R32G32B32_SINT, {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
146 {VK_FORMAT_R32G32B32_SFLOAT, {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
147 {VK_FORMAT_R32G32B32A32_UINT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
148 {VK_FORMAT_R32G32B32A32_SINT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
149 {VK_FORMAT_R32G32B32A32_SFLOAT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
150 {VK_FORMAT_R64_UINT, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
151 {VK_FORMAT_R64_SINT, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
152 {VK_FORMAT_R64_SFLOAT, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
153 {VK_FORMAT_R64G64_UINT, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
154 {VK_FORMAT_R64G64_SINT, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
155 {VK_FORMAT_R64G64_SFLOAT, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
156 {VK_FORMAT_R64G64B64_UINT, {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
157 {VK_FORMAT_R64G64B64_SINT, {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
158 {VK_FORMAT_R64G64B64_SFLOAT, {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
159 {VK_FORMAT_R64G64B64A64_UINT, {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
160 {VK_FORMAT_R64G64B64A64_SINT, {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
161 {VK_FORMAT_R64G64B64A64_SFLOAT, {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
162 {VK_FORMAT_B10G11R11_UFLOAT_PACK32, {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
163 {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
164 {VK_FORMAT_D16_UNORM, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
Tony Barbourd7b9aeb2017-04-28 10:44:23 -0600165 {VK_FORMAT_X8_D24_UNORM_PACK32, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
Dave Houlton3c9fca72017-03-27 17:25:54 -0600166 {VK_FORMAT_D32_SFLOAT, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
167 {VK_FORMAT_S8_UINT, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
168 {VK_FORMAT_D16_UNORM_S8_UINT, {3, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
169 {VK_FORMAT_D24_UNORM_S8_UINT, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
Dave Houlton7a152562017-04-28 14:03:39 -0600170 {VK_FORMAT_D32_SFLOAT_S8_UINT, {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
Dave Houlton3c9fca72017-03-27 17:25:54 -0600171 {VK_FORMAT_BC1_RGB_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}},
172 {VK_FORMAT_BC1_RGB_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}},
173 {VK_FORMAT_BC1_RGBA_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}},
174 {VK_FORMAT_BC1_RGBA_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}},
175 {VK_FORMAT_BC2_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}},
176 {VK_FORMAT_BC2_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}},
177 {VK_FORMAT_BC3_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}},
178 {VK_FORMAT_BC3_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}},
179 {VK_FORMAT_BC4_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}},
180 {VK_FORMAT_BC4_SNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}},
181 {VK_FORMAT_BC5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}},
182 {VK_FORMAT_BC5_SNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}},
183 {VK_FORMAT_BC6H_UFLOAT_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}},
184 {VK_FORMAT_BC6H_SFLOAT_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}},
185 {VK_FORMAT_BC7_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}},
186 {VK_FORMAT_BC7_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}},
187 {VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}},
188 {VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}},
189 {VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}},
190 {VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}},
191 {VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
Dave Houlton0ef27492018-04-04 11:41:48 -0600192 {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
Dave Houlton3c9fca72017-03-27 17:25:54 -0600193 {VK_FORMAT_EAC_R11_UNORM_BLOCK, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}},
194 {VK_FORMAT_EAC_R11_SNORM_BLOCK, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}},
195 {VK_FORMAT_EAC_R11G11_UNORM_BLOCK, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
196 {VK_FORMAT_EAC_R11G11_SNORM_BLOCK, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
197 {VK_FORMAT_ASTC_4x4_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
198 {VK_FORMAT_ASTC_4x4_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
199 {VK_FORMAT_ASTC_5x4_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
200 {VK_FORMAT_ASTC_5x4_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
201 {VK_FORMAT_ASTC_5x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
202 {VK_FORMAT_ASTC_5x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
203 {VK_FORMAT_ASTC_6x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
204 {VK_FORMAT_ASTC_6x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
205 {VK_FORMAT_ASTC_6x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
206 {VK_FORMAT_ASTC_6x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
207 {VK_FORMAT_ASTC_8x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
208 {VK_FORMAT_ASTC_8x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
209 {VK_FORMAT_ASTC_8x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
210 {VK_FORMAT_ASTC_8x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
211 {VK_FORMAT_ASTC_8x8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
212 {VK_FORMAT_ASTC_8x8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
213 {VK_FORMAT_ASTC_10x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
214 {VK_FORMAT_ASTC_10x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
215 {VK_FORMAT_ASTC_10x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
216 {VK_FORMAT_ASTC_10x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
217 {VK_FORMAT_ASTC_10x8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
218 {VK_FORMAT_ASTC_10x8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
219 {VK_FORMAT_ASTC_10x10_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
220 {VK_FORMAT_ASTC_10x10_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
221 {VK_FORMAT_ASTC_12x10_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
222 {VK_FORMAT_ASTC_12x10_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
223 {VK_FORMAT_ASTC_12x12_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
224 {VK_FORMAT_ASTC_12x12_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
Dave Houlton23cdab92017-05-23 16:16:54 -0600225 {VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
226 {VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
227 {VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
228 {VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}},
229 {VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
230 {VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
231 {VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
Dave Houltonc991cc92018-03-06 11:08:51 -0700232 {VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}},
233 /* KHR_sampler_YCbCr_conversion */
234 {VK_FORMAT_G8B8G8R8_422_UNORM_KHR, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32BIT_G8B8G8R8}},
235 {VK_FORMAT_B8G8R8G8_422_UNORM_KHR, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32BIT_B8G8R8G8}},
236 {VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R10G10B10A10}},
237 {VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G10B10G10R10}},
238 {VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B10G10R10G10}},
239 {VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R12G12B12A12}},
240 {VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G12B12G12R12}},
241 {VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B12G12R12G12}},
242 {VK_FORMAT_G16B16G16R16_422_UNORM_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G16B16G16R16}},
Dave Houlton832325a2018-03-08 14:34:47 -0700243 {VK_FORMAT_B16G16R16G16_422_UNORM_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B16G16R16G16}}
244#if 0 // TBD - Figure out what 'size' means for multi-planar formats
Dave Houltonc991cc92018-03-06 11:08:51 -0700245 {VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_420}},
246 {VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_420}},
247 {VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_422}},
248 {VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_422}},
249 {VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_444}},
250 {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_420}},
251 {VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_420}},
252 {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_422}},
253 {VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_422}},
254 {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_444}},
255 {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_420}},
256 {VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_420}},
257 {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_422}},
258 {VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_422}},
259 {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_444}},
260 {VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_420}},
261 {VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_420}},
262 {VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_422}},
263 {VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_422}},
264 {VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_444}}
265#endif
Dave Houlton3c9fca72017-03-27 17:25:54 -0600266};
267
268// Renable formatting
269// clang-format on
270
271// Return true if format is an ETC2 or EAC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600272VK_LAYER_EXPORT bool FormatIsCompressed_ETC2_EAC(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600273 bool found = false;
274
275 switch (format) {
276 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
277 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
278 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
279 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
280 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
281 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
282 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
283 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
284 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
285 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
286 found = true;
287 break;
288 default:
289 break;
290 }
291 return found;
292}
293
Dave Houlton23cdab92017-05-23 16:16:54 -0600294// Return true if format is an ASTC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600295VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_LDR(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600296 bool found = false;
297
298 switch (format) {
299 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
300 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
301 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
302 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
303 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
304 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
305 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
306 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
307 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
308 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
309 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
310 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
311 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
312 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
313 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
314 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
315 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
316 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
317 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
318 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
319 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
320 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
321 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
322 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
323 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
324 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
325 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
326 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
327 found = true;
328 break;
329 default:
330 break;
331 }
332 return found;
333}
334
335// Return true if format is a BC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600336VK_LAYER_EXPORT bool FormatIsCompressed_BC(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600337 bool found = false;
338
339 switch (format) {
340 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
341 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
342 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
343 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
344 case VK_FORMAT_BC2_UNORM_BLOCK:
345 case VK_FORMAT_BC2_SRGB_BLOCK:
346 case VK_FORMAT_BC3_UNORM_BLOCK:
347 case VK_FORMAT_BC3_SRGB_BLOCK:
348 case VK_FORMAT_BC4_UNORM_BLOCK:
349 case VK_FORMAT_BC4_SNORM_BLOCK:
350 case VK_FORMAT_BC5_UNORM_BLOCK:
351 case VK_FORMAT_BC5_SNORM_BLOCK:
352 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
353 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
354 case VK_FORMAT_BC7_UNORM_BLOCK:
355 case VK_FORMAT_BC7_SRGB_BLOCK:
356 found = true;
357 break;
358 default:
359 break;
360 }
361 return found;
362}
363
Dave Houlton23cdab92017-05-23 16:16:54 -0600364// Return true if format is a PVRTC compressed texture format
365VK_LAYER_EXPORT bool FormatIsCompressed_PVRTC(VkFormat format) {
366 bool found = false;
367
368 switch (format) {
369 case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
370 case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
371 case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
372 case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
373 case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
374 case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
375 case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
376 case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
377 found = true;
378 break;
379 default:
380 break;
381 }
382 return found;
383}
384
Dave Houltonc991cc92018-03-06 11:08:51 -0700385// Single-plane "_422" formats are treated as 2x1 compressed (for copies)
386VK_LAYER_EXPORT bool FormatIsSinglePlane_422(VkFormat format) {
387 bool found = false;
388
389 switch (format) {
390 case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
391 case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
392 case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
393 case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
394 case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
395 case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
396 case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
397 case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
398 found = true;
399 break;
400 default:
401 break;
402 }
403 return found;
404}
405
Dave Houlton23cdab92017-05-23 16:16:54 -0600406// Return true if format is compressed
407VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format) {
Dave Houltona9df0ce2018-02-07 10:51:23 -0700408 return (FormatIsCompressed_ASTC_LDR(format) || FormatIsCompressed_BC(format) || FormatIsCompressed_ETC2_EAC(format) ||
Dave Houlton23cdab92017-05-23 16:16:54 -0600409 FormatIsCompressed_PVRTC(format));
410}
411
Dave Houlton3c9fca72017-03-27 17:25:54 -0600412// Return true if format is a depth or stencil format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600413VK_LAYER_EXPORT bool FormatIsDepthOrStencil(VkFormat format) {
414 return (FormatIsDepthAndStencil(format) || FormatIsDepthOnly(format) || FormatIsStencilOnly(format));
Dave Houlton3c9fca72017-03-27 17:25:54 -0600415}
416
417// Return true if format contains depth and stencil information
Dave Houlton1d2022c2017-03-29 11:43:58 -0600418VK_LAYER_EXPORT bool FormatIsDepthAndStencil(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600419 bool is_ds = false;
420
421 switch (format) {
422 case VK_FORMAT_D16_UNORM_S8_UINT:
423 case VK_FORMAT_D24_UNORM_S8_UINT:
424 case VK_FORMAT_D32_SFLOAT_S8_UINT:
425 is_ds = true;
426 break;
427 default:
428 break;
429 }
430 return is_ds;
431}
432
433// Return true if format is a stencil-only format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600434VK_LAYER_EXPORT bool FormatIsStencilOnly(VkFormat format) { return (format == VK_FORMAT_S8_UINT); }
Dave Houlton3c9fca72017-03-27 17:25:54 -0600435
436// Return true if format is a depth-only format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600437VK_LAYER_EXPORT bool FormatIsDepthOnly(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600438 bool is_depth = false;
439
440 switch (format) {
441 case VK_FORMAT_D16_UNORM:
442 case VK_FORMAT_X8_D24_UNORM_PACK32:
443 case VK_FORMAT_D32_SFLOAT:
444 is_depth = true;
445 break;
446 default:
447 break;
448 }
449
450 return is_depth;
451}
452
453// Return true if format is of type NORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600454VK_LAYER_EXPORT bool FormatIsNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600455 bool is_norm = false;
456
457 switch (format) {
458 case VK_FORMAT_R4G4_UNORM_PACK8:
459 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
460 case VK_FORMAT_R5G6B5_UNORM_PACK16:
461 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
462 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
463 case VK_FORMAT_R8_UNORM:
464 case VK_FORMAT_R8_SNORM:
465 case VK_FORMAT_R8G8_UNORM:
466 case VK_FORMAT_R8G8_SNORM:
467 case VK_FORMAT_R8G8B8_UNORM:
468 case VK_FORMAT_R8G8B8_SNORM:
469 case VK_FORMAT_R8G8B8A8_UNORM:
470 case VK_FORMAT_R8G8B8A8_SNORM:
471 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
472 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
473 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
474 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
475 case VK_FORMAT_R16_UNORM:
476 case VK_FORMAT_R16_SNORM:
477 case VK_FORMAT_R16G16_UNORM:
478 case VK_FORMAT_R16G16_SNORM:
479 case VK_FORMAT_R16G16B16_UNORM:
480 case VK_FORMAT_R16G16B16_SNORM:
481 case VK_FORMAT_R16G16B16A16_UNORM:
482 case VK_FORMAT_R16G16B16A16_SNORM:
483 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
484 case VK_FORMAT_BC2_UNORM_BLOCK:
485 case VK_FORMAT_BC3_UNORM_BLOCK:
486 case VK_FORMAT_BC4_UNORM_BLOCK:
487 case VK_FORMAT_BC4_SNORM_BLOCK:
488 case VK_FORMAT_BC5_UNORM_BLOCK:
489 case VK_FORMAT_BC5_SNORM_BLOCK:
490 case VK_FORMAT_BC7_UNORM_BLOCK:
491 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
492 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
493 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
494 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
495 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
496 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
497 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
498 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
499 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
500 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
501 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
502 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
503 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
504 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
505 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
506 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
507 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
508 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
509 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
510 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
511 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
512 case VK_FORMAT_B5G6R5_UNORM_PACK16:
513 case VK_FORMAT_B8G8R8_UNORM:
514 case VK_FORMAT_B8G8R8_SNORM:
515 case VK_FORMAT_B8G8R8A8_UNORM:
516 case VK_FORMAT_B8G8R8A8_SNORM:
517 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
518 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
519 is_norm = true;
520 break;
521 default:
522 break;
523 }
524
525 return is_norm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100526}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600527
528// Return true if format is of type UNORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600529VK_LAYER_EXPORT bool FormatIsUNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600530 bool is_unorm = false;
531
532 switch (format) {
533 case VK_FORMAT_R4G4_UNORM_PACK8:
534 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
535 case VK_FORMAT_R5G6B5_UNORM_PACK16:
536 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
537 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
538 case VK_FORMAT_R8_UNORM:
539 case VK_FORMAT_R8G8_UNORM:
540 case VK_FORMAT_R8G8B8_UNORM:
541 case VK_FORMAT_R8G8B8A8_UNORM:
542 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
543 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
544 case VK_FORMAT_R16_UNORM:
545 case VK_FORMAT_R16G16_UNORM:
546 case VK_FORMAT_R16G16B16_UNORM:
547 case VK_FORMAT_R16G16B16A16_UNORM:
548 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
549 case VK_FORMAT_BC2_UNORM_BLOCK:
550 case VK_FORMAT_BC3_UNORM_BLOCK:
551 case VK_FORMAT_BC4_UNORM_BLOCK:
552 case VK_FORMAT_BC5_UNORM_BLOCK:
553 case VK_FORMAT_BC7_UNORM_BLOCK:
554 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
555 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
556 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
557 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
558 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
559 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
560 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
561 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
562 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
563 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
564 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
565 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
566 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
567 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
568 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
569 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
570 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
571 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
572 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
573 case VK_FORMAT_B5G6R5_UNORM_PACK16:
574 case VK_FORMAT_B8G8R8_UNORM:
575 case VK_FORMAT_B8G8R8A8_UNORM:
576 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
577 is_unorm = true;
578 break;
579 default:
580 break;
581 }
582
583 return is_unorm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100584}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600585
586// Return true if format is of type SNORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600587VK_LAYER_EXPORT bool FormatIsSNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600588 bool is_snorm = false;
589
590 switch (format) {
591 case VK_FORMAT_R8_SNORM:
592 case VK_FORMAT_R8G8_SNORM:
593 case VK_FORMAT_R8G8B8_SNORM:
594 case VK_FORMAT_R8G8B8A8_SNORM:
595 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
596 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
597 case VK_FORMAT_R16_SNORM:
598 case VK_FORMAT_R16G16_SNORM:
599 case VK_FORMAT_R16G16B16_SNORM:
600 case VK_FORMAT_R16G16B16A16_SNORM:
601 case VK_FORMAT_BC4_SNORM_BLOCK:
602 case VK_FORMAT_BC5_SNORM_BLOCK:
603 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
604 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
605 case VK_FORMAT_B8G8R8_SNORM:
606 case VK_FORMAT_B8G8R8A8_SNORM:
607 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
608 is_snorm = true;
609 break;
610 default:
611 break;
612 }
613
614 return is_snorm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100615}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600616
617// Return true if format is an integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600618VK_LAYER_EXPORT bool FormatIsInt(VkFormat format) { return (FormatIsSInt(format) || FormatIsUInt(format)); }
Dave Houlton3c9fca72017-03-27 17:25:54 -0600619
620// Return true if format is an unsigned integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600621VK_LAYER_EXPORT bool FormatIsUInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600622 bool is_uint = false;
623
624 switch (format) {
625 case VK_FORMAT_R8_UINT:
Dave Houltona2dcecd2017-05-22 13:52:20 -0600626 case VK_FORMAT_S8_UINT:
Dave Houlton3c9fca72017-03-27 17:25:54 -0600627 case VK_FORMAT_R8G8_UINT:
628 case VK_FORMAT_R8G8B8_UINT:
629 case VK_FORMAT_R8G8B8A8_UINT:
630 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
631 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
632 case VK_FORMAT_R16_UINT:
633 case VK_FORMAT_R16G16_UINT:
634 case VK_FORMAT_R16G16B16_UINT:
635 case VK_FORMAT_R16G16B16A16_UINT:
636 case VK_FORMAT_R32_UINT:
637 case VK_FORMAT_R32G32_UINT:
638 case VK_FORMAT_R32G32B32_UINT:
639 case VK_FORMAT_R32G32B32A32_UINT:
640 case VK_FORMAT_R64_UINT:
641 case VK_FORMAT_R64G64_UINT:
642 case VK_FORMAT_R64G64B64_UINT:
643 case VK_FORMAT_R64G64B64A64_UINT:
644 case VK_FORMAT_B8G8R8_UINT:
645 case VK_FORMAT_B8G8R8A8_UINT:
646 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
647 is_uint = true;
648 break;
649 default:
650 break;
651 }
652
653 return is_uint;
654}
655
656// Return true if format is a signed integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600657VK_LAYER_EXPORT bool FormatIsSInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600658 bool is_sint = false;
659
660 switch (format) {
661 case VK_FORMAT_R8_SINT:
662 case VK_FORMAT_R8G8_SINT:
663 case VK_FORMAT_R8G8B8_SINT:
664 case VK_FORMAT_R8G8B8A8_SINT:
665 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
666 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
667 case VK_FORMAT_R16_SINT:
668 case VK_FORMAT_R16G16_SINT:
669 case VK_FORMAT_R16G16B16_SINT:
670 case VK_FORMAT_R16G16B16A16_SINT:
671 case VK_FORMAT_R32_SINT:
672 case VK_FORMAT_R32G32_SINT:
673 case VK_FORMAT_R32G32B32_SINT:
674 case VK_FORMAT_R32G32B32A32_SINT:
675 case VK_FORMAT_R64_SINT:
676 case VK_FORMAT_R64G64_SINT:
677 case VK_FORMAT_R64G64B64_SINT:
678 case VK_FORMAT_R64G64B64A64_SINT:
679 case VK_FORMAT_B8G8R8_SINT:
680 case VK_FORMAT_B8G8R8A8_SINT:
681 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
682 is_sint = true;
683 break;
684 default:
685 break;
686 }
687
688 return is_sint;
689}
690
691// Return true if format is a floating-point format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600692VK_LAYER_EXPORT bool FormatIsFloat(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600693 bool is_float = false;
694
695 switch (format) {
696 case VK_FORMAT_R16_SFLOAT:
697 case VK_FORMAT_R16G16_SFLOAT:
698 case VK_FORMAT_R16G16B16_SFLOAT:
699 case VK_FORMAT_R16G16B16A16_SFLOAT:
700 case VK_FORMAT_R32_SFLOAT:
701 case VK_FORMAT_R32G32_SFLOAT:
702 case VK_FORMAT_R32G32B32_SFLOAT:
703 case VK_FORMAT_R32G32B32A32_SFLOAT:
704 case VK_FORMAT_R64_SFLOAT:
705 case VK_FORMAT_R64G64_SFLOAT:
706 case VK_FORMAT_R64G64B64_SFLOAT:
707 case VK_FORMAT_R64G64B64A64_SFLOAT:
708 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
709 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
710 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
711 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
712 is_float = true;
713 break;
714 default:
715 break;
716 }
717
718 return is_float;
719}
720
721// Return true if format is in the SRGB colorspace
Dave Houlton1d2022c2017-03-29 11:43:58 -0600722VK_LAYER_EXPORT bool FormatIsSRGB(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600723 bool is_srgb = false;
724
725 switch (format) {
726 case VK_FORMAT_R8_SRGB:
727 case VK_FORMAT_R8G8_SRGB:
728 case VK_FORMAT_R8G8B8_SRGB:
729 case VK_FORMAT_R8G8B8A8_SRGB:
730 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
731 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
732 case VK_FORMAT_BC2_SRGB_BLOCK:
733 case VK_FORMAT_BC3_SRGB_BLOCK:
734 case VK_FORMAT_BC7_SRGB_BLOCK:
735 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
736 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
737 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
738 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
739 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
740 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
741 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
742 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
743 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
744 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
745 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
746 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
747 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
748 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
749 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
750 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
751 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
752 case VK_FORMAT_B8G8R8_SRGB:
753 case VK_FORMAT_B8G8R8A8_SRGB:
754 is_srgb = true;
755 break;
756 default:
757 break;
758 }
759
760 return is_srgb;
761}
762
Chris Forbes568cd692017-04-24 18:41:23 -0700763// Return true if format is a USCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600764VK_LAYER_EXPORT bool FormatIsUScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600765 bool is_uscaled = false;
766
767 switch (format) {
768 case VK_FORMAT_R8_USCALED:
769 case VK_FORMAT_R8G8_USCALED:
770 case VK_FORMAT_R8G8B8_USCALED:
771 case VK_FORMAT_B8G8R8_USCALED:
772 case VK_FORMAT_R8G8B8A8_USCALED:
773 case VK_FORMAT_B8G8R8A8_USCALED:
774 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
775 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
776 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
777 case VK_FORMAT_R16_USCALED:
778 case VK_FORMAT_R16G16_USCALED:
779 case VK_FORMAT_R16G16B16_USCALED:
780 case VK_FORMAT_R16G16B16A16_USCALED:
781 is_uscaled = true;
782 break;
783 default:
784 break;
785 }
786
787 return is_uscaled;
788}
789
Chris Forbes568cd692017-04-24 18:41:23 -0700790// Return true if format is a SSCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600791VK_LAYER_EXPORT bool FormatIsSScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600792 bool is_sscaled = false;
793
794 switch (format) {
795 case VK_FORMAT_R8_SSCALED:
796 case VK_FORMAT_R8G8_SSCALED:
797 case VK_FORMAT_R8G8B8_SSCALED:
798 case VK_FORMAT_B8G8R8_SSCALED:
799 case VK_FORMAT_R8G8B8A8_SSCALED:
800 case VK_FORMAT_B8G8R8A8_SSCALED:
801 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
802 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
803 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
804 case VK_FORMAT_R16_SSCALED:
805 case VK_FORMAT_R16G16_SSCALED:
806 case VK_FORMAT_R16G16B16_SSCALED:
807 case VK_FORMAT_R16G16B16A16_SSCALED:
808 is_sscaled = true;
809 break;
810 default:
811 break;
812 }
813
814 return is_sscaled;
815}
816
Dave Houlton3c9fca72017-03-27 17:25:54 -0600817// Return compressed texel block sizes for block compressed formats
Dave Houlton1d2022c2017-03-29 11:43:58 -0600818VK_LAYER_EXPORT VkExtent3D FormatCompressedTexelBlockExtent(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600819 VkExtent3D block_size = {1, 1, 1};
820 switch (format) {
821 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
822 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
823 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
824 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
825 case VK_FORMAT_BC2_UNORM_BLOCK:
826 case VK_FORMAT_BC2_SRGB_BLOCK:
827 case VK_FORMAT_BC3_UNORM_BLOCK:
828 case VK_FORMAT_BC3_SRGB_BLOCK:
829 case VK_FORMAT_BC4_UNORM_BLOCK:
830 case VK_FORMAT_BC4_SNORM_BLOCK:
831 case VK_FORMAT_BC5_UNORM_BLOCK:
832 case VK_FORMAT_BC5_SNORM_BLOCK:
833 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
834 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
835 case VK_FORMAT_BC7_UNORM_BLOCK:
836 case VK_FORMAT_BC7_SRGB_BLOCK:
837 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
838 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
839 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
840 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
841 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
842 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
843 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
844 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
845 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
846 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
847 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
848 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
849 block_size = {4, 4, 1};
850 break;
851 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
852 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
853 block_size = {5, 4, 1};
854 break;
855 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
856 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
857 block_size = {5, 5, 1};
858 break;
859 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
860 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
861 block_size = {6, 5, 1};
862 break;
863 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
864 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
865 block_size = {6, 6, 1};
866 break;
867 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
868 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
869 block_size = {8, 5, 1};
870 break;
871 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
872 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
873 block_size = {8, 6, 1};
874 break;
875 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
876 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
877 block_size = {8, 8, 1};
878 break;
879 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
880 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
881 block_size = {10, 5, 1};
882 break;
883 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
884 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
885 block_size = {10, 6, 1};
886 break;
887 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
888 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
889 block_size = {10, 8, 1};
890 break;
891 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
892 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
893 block_size = {10, 10, 1};
894 break;
895 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
896 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
897 block_size = {12, 10, 1};
898 break;
899 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
900 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
901 block_size = {12, 12, 1};
902 break;
Dave Houlton23cdab92017-05-23 16:16:54 -0600903 case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
904 case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
905 case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
906 case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
907 block_size = {8, 4, 1};
908 break;
909 case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
910 case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
911 case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
912 case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
913 block_size = {4, 4, 1};
914 break;
Dave Houltonc991cc92018-03-06 11:08:51 -0700915 // With KHR_sampler_ycbcr_conversion, these formats are treated as 2x1 compressed (for copies)
916 case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
917 case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
918 case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
919 case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
920 case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
921 case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
922 case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
923 case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
924 block_size = {2, 1, 1};
925 break;
926
Dave Houlton3c9fca72017-03-27 17:25:54 -0600927 default:
928 break;
929 }
930 return block_size;
931}
932
Dave Houlton1d960ff2018-01-19 12:17:05 -0700933VK_LAYER_EXPORT uint32_t FormatPlaneCount(VkFormat format) {
934 switch (format) {
935 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
936 case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
937 case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
938 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
939 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
940 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
941 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
942 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
943 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
944 case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
945 case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
946 case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
Dave Houltonc991cc92018-03-06 11:08:51 -0700947 return 3;
Dave Houlton1d960ff2018-01-19 12:17:05 -0700948 break;
949 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
950 case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
951 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
952 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
953 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
954 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
955 case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
956 case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
Dave Houltonc991cc92018-03-06 11:08:51 -0700957 return 2;
Dave Houlton1d960ff2018-01-19 12:17:05 -0700958 break;
959 default:
Dave Houltonc991cc92018-03-06 11:08:51 -0700960 return 1;
Dave Houlton1d960ff2018-01-19 12:17:05 -0700961 break;
962 }
963}
964
Dave Houlton3c9fca72017-03-27 17:25:54 -0600965// Return format class of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600966VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600967 auto item = vk_format_table.find(format);
968 if (item != vk_format_table.end()) {
969 return item->second.format_class;
970 }
971 return VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT;
972}
973
974// Return size, in bytes, of a pixel of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600975VK_LAYER_EXPORT size_t FormatSize(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600976 auto item = vk_format_table.find(format);
977 if (item != vk_format_table.end()) {
978 return item->second.size;
979 }
980 return 0;
981}
982
983// Return the number of channels for a given format
Dave Houlton1d960ff2018-01-19 12:17:05 -0700984uint32_t FormatChannelCount(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600985 auto item = vk_format_table.find(format);
986 if (item != vk_format_table.end()) {
987 return item->second.channel_count;
988 }
989 return 0;
990}
991
992// Perform a zero-tolerant modulo operation
Dave Houlton1d2022c2017-03-29 11:43:58 -0600993VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600994 VkDeviceSize result = 0;
995 if (divisor != 0) {
996 result = dividend % divisor;
997 }
998 return result;
999}
Dave Houltonc991cc92018-03-06 11:08:51 -07001000
1001struct VULKAN_PER_PLANE_COMPATIBILITY {
1002 uint32_t width_divisor;
1003 uint32_t height_divisor;
1004 VkFormat compatible_format;
1005};
1006
1007struct VULKAN_MULTIPLANE_COMPATIBILITY {
1008 VULKAN_PER_PLANE_COMPATIBILITY per_plane[VK_MULTIPLANE_FORMAT_MAX_PLANES];
1009};
1010
1011// Source: Vulkan spec Table 45. Plane Format Compatibility Table
1012// clang-format off
1013const std::map<VkFormat, VULKAN_MULTIPLANE_COMPATIBILITY> vk_multiplane_compatibility_map {
1014 { VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1015 { 2, 2, VK_FORMAT_R8_UNORM },
1016 { 2, 2, VK_FORMAT_R8_UNORM } } } },
1017 { VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1018 { 2, 2, VK_FORMAT_R8G8_UNORM },
1019 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1020 { VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1021 { 2, 1, VK_FORMAT_R8_UNORM },
1022 { 2, 1, VK_FORMAT_R8_UNORM } } } },
1023 { VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1024 { 2, 1, VK_FORMAT_R8G8_UNORM },
1025 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1026 { VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1027 { 1, 1, VK_FORMAT_R8_UNORM },
1028 { 1, 1, VK_FORMAT_R8_UNORM } } } },
1029 { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1030 { 2, 2, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1031 { 2, 2, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } },
1032 { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1033 { 2, 2, VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR },
1034 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1035 { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1036 { 2, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1037 { 2, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } },
1038 { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1039 { 2, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR },
1040 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1041 { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1042 { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1043 { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } },
1044 { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1045 { 2, 2, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1046 { 2, 2, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } },
1047 { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1048 { 2, 2, VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR },
1049 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1050 { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1051 { 2, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1052 { 2, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } },
1053 { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1054 { 2, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR },
1055 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1056 { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1057 { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1058 { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } },
1059 { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1060 { 2, 2, VK_FORMAT_R16_UNORM },
1061 { 2, 2, VK_FORMAT_R16_UNORM } } } },
1062 { VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1063 { 2, 2, VK_FORMAT_R16G16_UNORM },
1064 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1065 { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1066 { 2, 1, VK_FORMAT_R16_UNORM },
1067 { 2, 1, VK_FORMAT_R16_UNORM } } } },
1068 { VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1069 { 2, 1, VK_FORMAT_R16G16_UNORM },
1070 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1071 { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1072 { 1, 1, VK_FORMAT_R16_UNORM },
1073 { 1, 1, VK_FORMAT_R16_UNORM } } } }
1074};
1075// clang-format on
1076
1077VK_LAYER_EXPORT VkFormat FindMultiplaneCompatibleFormat(VkFormat mp_fmt, uint32_t plane) {
1078 auto it = vk_multiplane_compatibility_map.find(mp_fmt);
1079 if ((it == vk_multiplane_compatibility_map.end()) || (plane >= VK_MULTIPLANE_FORMAT_MAX_PLANES)) {
1080 return VK_FORMAT_UNDEFINED;
1081 }
1082
1083 return it->second.per_plane[plane].compatible_format;
1084}