blob: dd59186d92c9643daba48f195f171cfb38fcd766 [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06004 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07005 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and/or associated documentation files (the "Materials"), to
7 * deal in the Materials without restriction, including without limitation the
8 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9 * sell copies of the Materials, and to permit persons to whom the Materials
10 * are furnished to do so, subject to the following conditions:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060011 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070012 * The above copyright notice(s) and this permission notice shall be included
13 * in all copies or substantial portions of the Materials.
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070015 * The Materials are Confidential Information as defined by the Khronos
16 * Membership Agreement until designated non-confidential by Khronos, at which
17 * point this condition clause shall be removed.
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060018 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070019 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060020 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070021 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 *
23 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
24 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
25 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
26 * USE OR OTHER DEALINGS IN THE MATERIALS
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060027 *
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060028 * Author: Mark Lobodzinski <mark@lunarg.com>
29 *
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060030 */
31
32#include <string.h>
Mark Lobodzinski882655d2016-01-05 11:32:53 -070033#include <string>
David Pinedo9316d3b2015-11-06 12:54:48 -070034#include "vulkan/vulkan.h"
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060035#include "vk_layer_utils.h"
36
37typedef struct _VULKAN_FORMAT_INFO {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070038 size_t size;
39 uint32_t channel_count;
40 VkFormatCompatibilityClass format_class;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060041} VULKAN_FORMAT_INFO;
42
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060043// Set up data structure with number of bytes and number of channels
44// for each Vulkan format.
Chia-I Wu3432a0c2015-10-27 18:04:07 +080045static const VULKAN_FORMAT_INFO vk_format_table[VK_FORMAT_RANGE_SIZE] = {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070046 {0, 0, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}, // [VK_FORMAT_UNDEFINED]
47 {1, 2,
48 VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}, // [VK_FORMAT_R4G4_UNORM_PACK8]
49 {2, 4,
50 VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R4G4B4A4_UNORM_PACK16]
51 {2, 4,
52 VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_B4G4R4A4_UNORM_PACK16]
53 {2, 3,
54 VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R5G6B5_UNORM_PACK16]
55 {2, 3,
56 VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_B5G6R5_UNORM_PACK16]
57 {2, 4,
58 VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R5G5B5A1_UNORM_PACK16]
59 {2, 4,
60 VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_B5G5R5A1_UNORM_PACK16]
61 {2, 4,
62 VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_A1R5G5B5_UNORM_PACK16]
63 {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}, // [VK_FORMAT_R8_UNORM]
64 {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}, // [VK_FORMAT_R8_SNORM]
65 {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}, // [VK_FORMAT_R8_USCALED]
66 {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}, // [VK_FORMAT_R8_SSCALED]
67 {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}, // [VK_FORMAT_R8_UINT]
68 {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}, // [VK_FORMAT_R8_SINT]
69 {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}, // [VK_FORMAT_R8_SRGB]
70 {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R8G8_UNORM]
71 {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R8G8_SNORM]
72 {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R8G8_USCALED]
73 {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R8G8_SSCALED]
74 {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R8G8_UINT]
75 {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R8G8_SINT]
76 {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R8G8_SRGB]
77 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_R8G8B8_UNORM]
78 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_R8G8B8_SNORM]
79 {3, 3,
80 VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_R8G8B8_USCALED]
81 {3, 3,
82 VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_R8G8B8_SSCALED]
83 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_R8G8B8_UINT]
84 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_R8G8B8_SINT]
85 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_R8G8B8_SRGB]
86 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_B8G8R8_UNORM]
87 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_B8G8R8_SNORM]
88 {3, 3,
89 VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_B8G8R8_USCALED]
90 {3, 3,
91 VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_B8G8R8_SSCALED]
92 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_B8G8R8_UINT]
93 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_B8G8R8_SINT]
94 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}, // [VK_FORMAT_B8G8R8_SRGB]
95 {4, 4,
96 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R8G8B8A8_UNORM]
97 {4, 4,
98 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R8G8B8A8_SNORM]
99 {4, 4,
100 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R8G8B8A8_USCALED]
101 {4, 4,
102 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R8G8B8A8_SSCALED]
103 {4, 4,
104 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R8G8B8A8_UINT]
105 {4, 4,
106 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R8G8B8A8_SINT]
107 {4, 4,
108 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R8G8B8A8_SRGB]
109 {4, 4,
110 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B8G8R8A8_UNORM]
111 {4, 4,
112 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B8G8R8A8_SNORM]
113 {4, 4,
114 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B8G8R8A8_USCALED]
115 {4, 4,
116 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B8G8R8A8_SSCALED]
117 {4, 4,
118 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B8G8R8A8_UINT]
119 {4, 4,
120 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B8G8R8A8_SINT]
121 {4, 4,
122 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B8G8R8A8_SRGB]
123 {4, 4,
124 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A8B8G8R8_UNORM_PACK32]
125 {4, 4,
126 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A8B8G8R8_SNORM_PACK32]
127 {4, 4,
128 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A8B8G8R8_USCALED_PACK32]
129 {4, 4,
130 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A8B8G8R8_SSCALED_PACK32]
131 {4, 4,
132 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A8B8G8R8_UINT_PACK32]
133 {4, 4,
134 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A8B8G8R8_SINT_PACK32]
135 {4, 4,
136 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B8G8R8A8_SRGB_PACK32]
137 {4, 4,
138 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2R10G10B10_UNORM_PACK32]
139 {4, 4,
140 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2R10G10B10_SNORM_PACK32]
141 {4, 4,
142 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2R10G10B10_USCALED_PACK32]
143 {4, 4,
144 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2R10G10B10_SSCALED_PACK32]
145 {4, 4,
146 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2R10G10B10_UINT_PACK32]
147 {4, 4,
148 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2R10G10B10_SINT_PACK32]
149 {4, 4,
150 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2B10G10R10_UNORM_PACK32]
151 {4, 4,
152 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2B10G10R10_SNORM_PACK32]
153 {4, 4,
154 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2B10G10R10_USCALED_PACK32]
155 {4, 4,
156 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2B10G10R10_SSCALED_PACK32]
157 {4, 4,
158 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2B10G10R10_UINT_PACK32]
159 {4, 4,
160 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_A2B10G10R10_SINT_PACK32]
161 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R16_UNORM]
162 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R16_SNORM]
163 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R16_USCALED]
164 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R16_SSCALED]
165 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R16_UINT]
166 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R16_SINT]
167 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}, // [VK_FORMAT_R16_SFLOAT]
168 {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R16G16_UNORM]
169 {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R16G16_SNORM]
170 {4, 2,
171 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R16G16_USCALED]
172 {4, 2,
173 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R16G16_SSCALED]
174 {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R16G16_UINT]
175 {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R16G16_SINT]
176 {4, 2,
177 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R16G16_SFLOAT]
178 {6, 3,
179 VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}, // [VK_FORMAT_R16G16B16_UNORM]
180 {6, 3,
181 VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}, // [VK_FORMAT_R16G16B16_SNORM]
182 {6, 3,
183 VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}, // [VK_FORMAT_R16G16B16_USCALED]
184 {6, 3,
185 VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}, // [VK_FORMAT_R16G16B16_SSCALED]
186 {6, 3,
187 VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}, // [VK_FORMAT_R16G16B16_UINT]
188 {6, 3,
189 VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}, // [VK_FORMAT_R16G16B16_SINT]
190 {6, 3,
191 VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}, // [VK_FORMAT_R16G16B16_SFLOAT]
192 {8, 4,
193 VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R16G16B16A16_UNORM]
194 {8, 4,
195 VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R16G16B16A16_SNORM]
196 {8, 4,
197 VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R16G16B16A16_USCALED]
198 {8, 4,
199 VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R16G16B16A16_SSCALED]
200 {8, 4,
201 VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R16G16B16A16_UINT]
202 {8, 4,
203 VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R16G16B16A16_SINT]
204 {8, 4,
205 VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R16G16B16A16_SFLOAT]
206 {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R32_UINT]
207 {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R32_SINT]
208 {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_R32_SFLOAT]
209 {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R32G32_UINT]
210 {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R32G32_SINT]
211 {8, 2,
212 VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R32G32_SFLOAT]
213 {12, 3,
214 VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}, // [VK_FORMAT_R32G32B32_UINT]
215 {12, 3,
216 VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}, // [VK_FORMAT_R32G32B32_SINT]
217 {12, 3,
218 VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}, // [VK_FORMAT_R32G32B32_SFLOAT]
219 {16, 4,
220 VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}, // [VK_FORMAT_R32G32B32A32_UINT]
221 {16, 4,
222 VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}, // [VK_FORMAT_R32G32B32A32_SINT]
223 {16, 4,
224 VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}, // [VK_FORMAT_R32G32B32A32_SFLOAT]
225 {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R64_UINT]
226 {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R64_SINT]
227 {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}, // [VK_FORMAT_R64_SFLOAT]
228 {16, 2,
229 VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}, // [VK_FORMAT_R64G64_UINT]
230 {16, 2,
231 VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}, // [VK_FORMAT_R64G64_SINT]
232 {16, 2,
233 VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}, // [VK_FORMAT_R64G64_SFLOAT]
234 {24, 3,
235 VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}, // [VK_FORMAT_R64G64B64_UINT]
236 {24, 3,
237 VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}, // [VK_FORMAT_R64G64B64_SINT]
238 {24, 3,
239 VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}, // [VK_FORMAT_R64G64B64_SFLOAT]
240 {32, 4,
241 VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}, // [VK_FORMAT_R64G64B64A64_UINT]
242 {32, 4,
243 VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}, // [VK_FORMAT_R64G64B64A64_SINT]
244 {32, 4,
245 VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}, // [VK_FORMAT_R64G64B64A64_SFLOAT]
246 {4, 3,
247 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_B10G11R11_UFLOAT_PACK32]
248 {4, 3,
249 VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}, // [VK_FORMAT_E5B9G9R9_UFLOAT_PACK32]
250 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}, // [VK_FORMAT_D16_UNORM]
251 {3, 1,
252 VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}, // [VK_FORMAT_X8_D24_UNORM_PACK32]
253 {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}, // [VK_FORMAT_D32_SFLOAT]
254 {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}, // [VK_FORMAT_S8_UINT]
255 {3, 2,
256 VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}, // [VK_FORMAT_D16_UNORM_S8_UINT]
257 {4, 2,
258 VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}, // [VK_FORMAT_D24_UNORM_S8_UINT]
259 {4, 2,
260 VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}, // [VK_FORMAT_D32_SFLOAT_S8_UINT]
261 {8, 4,
262 VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}, // [VK_FORMAT_BC1_RGB_UNORM_BLOCK]
263 {8, 4,
264 VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}, // [VK_FORMAT_BC1_RGB_SRGB_BLOCK]
265 {8, 4,
266 VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}, // [VK_FORMAT_BC1_RGBA_UNORM_BLOCK]
267 {8, 4,
268 VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}, // [VK_FORMAT_BC1_RGBA_SRGB_BLOCK]
269 {16, 4,
270 VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}, // [VK_FORMAT_BC2_UNORM_BLOCK]
271 {16, 4,
272 VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}, // [VK_FORMAT_BC2_SRGB_BLOCK]
273 {16, 4,
274 VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}, // [VK_FORMAT_BC3_UNORM_BLOCK]
275 {16, 4,
276 VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}, // [VK_FORMAT_BC3_SRGB_BLOCK]
277 {8, 4,
278 VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}, // [VK_FORMAT_BC4_UNORM_BLOCK]
279 {8, 4,
280 VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}, // [VK_FORMAT_BC4_SNORM_BLOCK]
281 {16, 4,
282 VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}, // [VK_FORMAT_BC5_UNORM_BLOCK]
283 {16, 4,
284 VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}, // [VK_FORMAT_BC5_SNORM_BLOCK]
285 {16, 4,
286 VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}, // [VK_FORMAT_BC6H_UFLOAT_BLOCK]
287 {16, 4,
288 VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}, // [VK_FORMAT_BC6H_SFLOAT_BLOCK]
289 {16, 4,
290 VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}, // [VK_FORMAT_BC7_UNORM_BLOCK]
291 {16, 4,
292 VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}, // [VK_FORMAT_BC7_SRGB_BLOCK]
293 {8, 3,
294 VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}, // [VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK]
295 {8, 3,
296 VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}, // [VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK]
297 {8, 4,
298 VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}, // [VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK]
299 {8, 4,
300 VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}, // [VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK]
301 {8, 4,
302 VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}, // [VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK]
303 {8, 4,
304 VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}, // [VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK]
305 {8, 1,
306 VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}, // [VK_FORMAT_EAC_R11_UNORM_BLOCK]
307 {8, 1,
308 VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}, // [VK_FORMAT_EAC_R11_SNORM_BLOCK]
309 {16, 2,
310 VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}, // [VK_FORMAT_EAC_R11G11_UNORM_BLOCK]
311 {16, 2,
312 VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}, // [VK_FORMAT_EAC_R11G11_SNORM_BLOCK]
313 {16, 4,
314 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}, // [VK_FORMAT_ASTC_4x4_UNORM_BLOCK]
315 {16, 4,
316 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}, // [VK_FORMAT_ASTC_4x4_SRGB_BLOCK]
317 {16, 4,
318 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}, // [VK_FORMAT_ASTC_5x4_UNORM_BLOCK]
319 {16, 4,
320 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}, // [VK_FORMAT_ASTC_5x4_SRGB_BLOCK]
321 {16, 4,
322 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}, // [VK_FORMAT_ASTC_5x5_UNORM_BLOCK]
323 {16, 4,
324 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}, // [VK_FORMAT_ASTC_5x5_SRGB_BLOCK]
325 {16, 4,
326 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}, // [VK_FORMAT_ASTC_6x5_UNORM_BLOCK]
327 {16, 4,
328 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}, // [VK_FORMAT_ASTC_6x5_SRGB_BLOCK]
329 {16, 4,
330 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}, // [VK_FORMAT_ASTC_6x6_UNORM_BLOCK]
331 {16, 4,
332 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}, // [VK_FORMAT_ASTC_6x6_SRGB_BLOCK]
333 {16, 4,
334 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}, // [VK_FORMAT_ASTC_8x5_UNORM_BLOCK]
335 {16, 4,
336 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}, // [VK_FORMAT_ASTC_8x5_SRGB_BLOCK]
337 {16, 4,
338 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}, // [VK_FORMAT_ASTC_8x6_UNORM_BLOCK]
339 {16, 4,
340 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}, // [VK_FORMAT_ASTC_8x6_SRGB_BLOCK]
341 {16, 4,
342 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}, // [VK_FORMAT_ASTC_8x8_UNORM_BLOCK]
343 {16, 4,
344 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}, // [VK_FORMAT_ASTC_8x8_SRGB_BLOCK]
345 {16, 4,
346 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}, // [VK_FORMAT_ASTC_10x5_UNORM_BLOCK]
347 {16, 4,
348 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}, // [VK_FORMAT_ASTC_10x5_SRGB_BLOCK]
349 {16, 4,
350 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}, // [VK_FORMAT_ASTC_10x6_UNORM_BLOCK]
351 {16, 4,
352 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}, // [VK_FORMAT_ASTC_10x6_SRGB_BLOCK]
353 {16, 4,
354 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}, // [VK_FORMAT_ASTC_10x8_UNORM_BLOCK]
355 {16, 4,
356 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}, // [VK_FORMAT_ASTC_10x8_SRGB_BLOCK]
357 {16, 4,
358 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}, // [VK_FORMAT_ASTC_10x10_UNORM_BLOCK]
359 {16, 4,
360 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}, // [VK_FORMAT_ASTC_10x10_SRGB_BLOCK]
361 {16, 4,
362 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}, // [VK_FORMAT_ASTC_12x10_UNORM_BLOCK]
363 {16, 4,
364 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}, // [VK_FORMAT_ASTC_12x10_SRGB_BLOCK]
365 {16, 4,
366 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}, // [VK_FORMAT_ASTC_12x12_UNORM_BLOCK]
367 {16, 4,
368 VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}, // [VK_FORMAT_ASTC_12x12_SRGB_BLOCK]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600369};
370
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600371// Return true if format is a depth or stencil format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700372bool vk_format_is_depth_or_stencil(VkFormat format) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600373 return (vk_format_is_depth_and_stencil(format) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700374 vk_format_is_depth_only(format) ||
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600375 vk_format_is_stencil_only(format));
376}
377
378// Return true if format contains depth and stencil information
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700379bool vk_format_is_depth_and_stencil(VkFormat format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600380 bool is_ds = false;
381
382 switch (format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600383 case VK_FORMAT_D16_UNORM_S8_UINT:
384 case VK_FORMAT_D24_UNORM_S8_UINT:
385 case VK_FORMAT_D32_SFLOAT_S8_UINT:
386 is_ds = true;
387 break;
388 default:
389 break;
390 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600391 return is_ds;
392}
393
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600394// Return true if format is a stencil-only format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700395bool vk_format_is_stencil_only(VkFormat format) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600396 return (format == VK_FORMAT_S8_UINT);
397}
398
399// Return true if format is a depth-only format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700400bool vk_format_is_depth_only(VkFormat format) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600401 bool is_depth = false;
402
403 switch (format) {
404 case VK_FORMAT_D16_UNORM:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800405 case VK_FORMAT_X8_D24_UNORM_PACK32:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600406 case VK_FORMAT_D32_SFLOAT:
407 is_depth = true;
408 break;
409 default:
410 break;
411 }
412
413 return is_depth;
414}
415
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600416// Return true if format is of time UNORM
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700417bool vk_format_is_norm(VkFormat format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600418 bool is_norm = false;
419
420 switch (format) {
Chia-I Wucaa5aaa2015-11-10 17:01:22 +0800421 case VK_FORMAT_R4G4_UNORM_PACK8:
422 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
423 case VK_FORMAT_R5G6B5_UNORM_PACK16:
424 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
Chia-I Wu0a84a702015-11-10 17:01:22 +0800425 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600426 case VK_FORMAT_R8_UNORM:
427 case VK_FORMAT_R8_SNORM:
428 case VK_FORMAT_R8G8_UNORM:
429 case VK_FORMAT_R8G8_SNORM:
430 case VK_FORMAT_R8G8B8_UNORM:
431 case VK_FORMAT_R8G8B8_SNORM:
432 case VK_FORMAT_R8G8B8A8_UNORM:
433 case VK_FORMAT_R8G8B8A8_SNORM:
Chia-I Wu0a84a702015-11-10 17:01:22 +0800434 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
435 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800436 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
437 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600438 case VK_FORMAT_R16_UNORM:
439 case VK_FORMAT_R16_SNORM:
440 case VK_FORMAT_R16G16_UNORM:
441 case VK_FORMAT_R16G16_SNORM:
442 case VK_FORMAT_R16G16B16_UNORM:
443 case VK_FORMAT_R16G16B16_SNORM:
444 case VK_FORMAT_R16G16B16A16_UNORM:
445 case VK_FORMAT_R16G16B16A16_SNORM:
Chia-I Wu53638c12015-11-10 16:44:23 +0800446 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
447 case VK_FORMAT_BC2_UNORM_BLOCK:
448 case VK_FORMAT_BC3_UNORM_BLOCK:
449 case VK_FORMAT_BC4_UNORM_BLOCK:
450 case VK_FORMAT_BC4_SNORM_BLOCK:
451 case VK_FORMAT_BC5_UNORM_BLOCK:
452 case VK_FORMAT_BC5_SNORM_BLOCK:
453 case VK_FORMAT_BC7_UNORM_BLOCK:
454 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
455 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
456 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
457 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
458 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
459 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
460 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
461 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
462 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
463 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
464 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
465 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
466 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
467 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
468 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
469 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
470 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
471 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
472 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
473 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
474 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
Chia-I Wucaa5aaa2015-11-10 17:01:22 +0800475 case VK_FORMAT_B5G6R5_UNORM_PACK16:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600476 case VK_FORMAT_B8G8R8_UNORM:
477 case VK_FORMAT_B8G8R8_SNORM:
478 case VK_FORMAT_B8G8R8A8_UNORM:
479 case VK_FORMAT_B8G8R8A8_SNORM:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800480 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
481 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600482 is_norm = true;
483 break;
484 default:
485 break;
486 }
487
488 return is_norm;
489};
490
491// Return true if format is an integer format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700492bool vk_format_is_int(VkFormat format) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600493 return (vk_format_is_sint(format) || vk_format_is_uint(format));
494}
495
496// Return true if format is an unsigned integer format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700497bool vk_format_is_uint(VkFormat format) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600498 bool is_uint = false;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600499
500 switch (format) {
501 case VK_FORMAT_R8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600502 case VK_FORMAT_R8G8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600503 case VK_FORMAT_R8G8B8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600504 case VK_FORMAT_R8G8B8A8_UINT:
Chia-I Wu0a84a702015-11-10 17:01:22 +0800505 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800506 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600507 case VK_FORMAT_R16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600508 case VK_FORMAT_R16G16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600509 case VK_FORMAT_R16G16B16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600510 case VK_FORMAT_R16G16B16A16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600511 case VK_FORMAT_R32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600512 case VK_FORMAT_R32G32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600513 case VK_FORMAT_R32G32B32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600514 case VK_FORMAT_R32G32B32A32_UINT:
Chia-I Wu0a84a702015-11-10 17:01:22 +0800515 case VK_FORMAT_R64_UINT:
516 case VK_FORMAT_R64G64_UINT:
517 case VK_FORMAT_R64G64B64_UINT:
518 case VK_FORMAT_R64G64B64A64_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600519 case VK_FORMAT_B8G8R8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600520 case VK_FORMAT_B8G8R8A8_UINT:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800521 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600522 is_uint = true;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600523 break;
524 default:
525 break;
526 }
527
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600528 return is_uint;
529}
530
531// Return true if format is a signed integer format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700532bool vk_format_is_sint(VkFormat format) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600533 bool is_sint = false;
534
535 switch (format) {
536 case VK_FORMAT_R8_SINT:
537 case VK_FORMAT_R8G8_SINT:
538 case VK_FORMAT_R8G8B8_SINT:
539 case VK_FORMAT_R8G8B8A8_SINT:
Chia-I Wu0a84a702015-11-10 17:01:22 +0800540 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800541 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600542 case VK_FORMAT_R16_SINT:
543 case VK_FORMAT_R16G16_SINT:
544 case VK_FORMAT_R16G16B16_SINT:
545 case VK_FORMAT_R16G16B16A16_SINT:
546 case VK_FORMAT_R32_SINT:
547 case VK_FORMAT_R32G32_SINT:
548 case VK_FORMAT_R32G32B32_SINT:
549 case VK_FORMAT_R32G32B32A32_SINT:
Chia-I Wu0a84a702015-11-10 17:01:22 +0800550 case VK_FORMAT_R64_SINT:
551 case VK_FORMAT_R64G64_SINT:
552 case VK_FORMAT_R64G64B64_SINT:
553 case VK_FORMAT_R64G64B64A64_SINT:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600554 case VK_FORMAT_B8G8R8_SINT:
555 case VK_FORMAT_B8G8R8A8_SINT:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800556 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600557 is_sint = true;
558 break;
559 default:
560 break;
561 }
562
563 return is_sint;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600564}
565
566// Return true if format is a floating-point format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700567bool vk_format_is_float(VkFormat format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600568 bool is_float = false;
569
570 switch (format) {
571 case VK_FORMAT_R16_SFLOAT:
572 case VK_FORMAT_R16G16_SFLOAT:
573 case VK_FORMAT_R16G16B16_SFLOAT:
574 case VK_FORMAT_R16G16B16A16_SFLOAT:
575 case VK_FORMAT_R32_SFLOAT:
576 case VK_FORMAT_R32G32_SFLOAT:
577 case VK_FORMAT_R32G32B32_SFLOAT:
578 case VK_FORMAT_R32G32B32A32_SFLOAT:
579 case VK_FORMAT_R64_SFLOAT:
580 case VK_FORMAT_R64G64_SFLOAT:
581 case VK_FORMAT_R64G64B64_SFLOAT:
582 case VK_FORMAT_R64G64B64A64_SFLOAT:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800583 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
584 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
Chia-I Wu53638c12015-11-10 16:44:23 +0800585 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
586 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600587 is_float = true;
588 break;
589 default:
590 break;
591 }
592
593 return is_float;
594}
595
596// Return true if format is in the SRGB colorspace
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700597bool vk_format_is_srgb(VkFormat format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600598 bool is_srgb = false;
599
600 switch (format) {
601 case VK_FORMAT_R8_SRGB:
602 case VK_FORMAT_R8G8_SRGB:
603 case VK_FORMAT_R8G8B8_SRGB:
604 case VK_FORMAT_R8G8B8A8_SRGB:
Chia-I Wu0a84a702015-11-10 17:01:22 +0800605 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
Chia-I Wu53638c12015-11-10 16:44:23 +0800606 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
607 case VK_FORMAT_BC2_SRGB_BLOCK:
608 case VK_FORMAT_BC3_SRGB_BLOCK:
609 case VK_FORMAT_BC7_SRGB_BLOCK:
610 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
611 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
612 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
613 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
614 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
615 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
616 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
617 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
618 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
619 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
620 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
621 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
622 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
623 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
624 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
625 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
626 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600627 case VK_FORMAT_B8G8R8_SRGB:
628 case VK_FORMAT_B8G8R8A8_SRGB:
629 is_srgb = true;
630 break;
631 default:
632 break;
633 }
634
635 return is_srgb;
636}
637
638// Return true if format is compressed
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700639bool vk_format_is_compressed(VkFormat format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600640 switch (format) {
Chia-I Wu53638c12015-11-10 16:44:23 +0800641 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
642 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
643 case VK_FORMAT_BC2_UNORM_BLOCK:
644 case VK_FORMAT_BC2_SRGB_BLOCK:
645 case VK_FORMAT_BC3_UNORM_BLOCK:
646 case VK_FORMAT_BC3_SRGB_BLOCK:
647 case VK_FORMAT_BC4_UNORM_BLOCK:
648 case VK_FORMAT_BC4_SNORM_BLOCK:
649 case VK_FORMAT_BC5_UNORM_BLOCK:
650 case VK_FORMAT_BC5_SNORM_BLOCK:
651 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
652 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
653 case VK_FORMAT_BC7_UNORM_BLOCK:
654 case VK_FORMAT_BC7_SRGB_BLOCK:
655 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
656 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
657 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
658 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
659 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
660 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
661 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
662 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
663 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
664 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
665 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
666 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
667 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
668 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
669 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
670 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
671 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
672 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
673 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
674 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
675 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
676 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
677 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
678 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
679 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
680 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
681 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
682 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
683 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
684 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
685 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
686 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
687 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
688 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
689 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
690 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
691 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
692 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600693 return true;
694 default:
695 return false;
696 }
697}
698
Mark Lobodzinskiadaac9d2016-01-08 11:07:56 -0700699// Return format class of the specified format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700700VkFormatCompatibilityClass vk_format_get_compatibility_class(VkFormat format) {
Mark Lobodzinskiadaac9d2016-01-08 11:07:56 -0700701 return vk_format_table[format].format_class;
702}
703
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600704// Return size, in bytes, of a pixel of the specified format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700705size_t vk_format_get_size(VkFormat format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600706 return vk_format_table[format].size;
707}
708
709// Return the number of channels for a given format
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700710unsigned int vk_format_get_channel_count(VkFormat format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600711 return vk_format_table[format].channel_count;
712}
Mark Lobodzinski941aea92016-01-13 10:23:15 -0700713
714// Perform a zero-tolerant modulo operation
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700715VkDeviceSize vk_safe_modulo(VkDeviceSize dividend, VkDeviceSize divisor) {
Mark Lobodzinski941aea92016-01-13 10:23:15 -0700716 VkDeviceSize result = 0;
717 if (divisor != 0) {
718 result = dividend % divisor;
719 }
720 return result;
721}