1 // Copyright 2019 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "VkFormat.hpp"
16
17 #include "System/Debug.hpp"
18 #include "System/Math.hpp"
19
20 namespace vk {
21
isUnsignedNormalized() const22 bool Format::isUnsignedNormalized() const
23 {
24 switch(format)
25 {
26 case VK_FORMAT_R4G4_UNORM_PACK8:
27 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
28 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
29 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
30 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
31 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
32 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
33 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
34 case VK_FORMAT_R5G6B5_UNORM_PACK16:
35 case VK_FORMAT_B5G6R5_UNORM_PACK16:
36 case VK_FORMAT_R8_UNORM:
37 case VK_FORMAT_R8G8_UNORM:
38 case VK_FORMAT_R8G8B8A8_UNORM:
39 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
40 case VK_FORMAT_B8G8R8A8_UNORM:
41 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
42 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
43 case VK_FORMAT_R16_UNORM:
44 case VK_FORMAT_R16G16_UNORM:
45 case VK_FORMAT_R16G16B16_UNORM:
46 case VK_FORMAT_R16G16B16A16_UNORM:
47 case VK_FORMAT_D16_UNORM:
48 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
49 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
50 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
51 return true;
52 default:
53 // sRGB encoded formats are also unsigned normalized.
54 // Note that floating-pont formats have no need for nonlinear encoding,
55 // and the sRGB transfer function is only defined for [0.0, 1.0].
56 return isSRGBformat();
57 }
58 }
59
isSignedNormalized() const60 bool Format::isSignedNormalized() const
61 {
62 switch(format)
63 {
64 case VK_FORMAT_R8_SNORM:
65 case VK_FORMAT_R8G8_SNORM:
66 case VK_FORMAT_R8G8B8A8_SNORM:
67 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
68 case VK_FORMAT_B8G8R8A8_SNORM:
69 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
70 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
71 case VK_FORMAT_R16_SNORM:
72 case VK_FORMAT_R16G16_SNORM:
73 case VK_FORMAT_R16G16B16_SNORM:
74 case VK_FORMAT_R16G16B16A16_SNORM:
75 return true;
76 default:
77 return false;
78 }
79 }
80
isSignedUnnormalizedInteger() const81 bool Format::isSignedUnnormalizedInteger() const
82 {
83 switch(format)
84 {
85 case VK_FORMAT_R8_SINT:
86 case VK_FORMAT_R8G8_SINT:
87 case VK_FORMAT_R8G8B8A8_SINT:
88 case VK_FORMAT_B8G8R8A8_SINT:
89 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
90 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
91 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
92 case VK_FORMAT_R16_SINT:
93 case VK_FORMAT_R16G16_SINT:
94 case VK_FORMAT_R16G16B16_SINT:
95 case VK_FORMAT_R16G16B16A16_SINT:
96 case VK_FORMAT_R32_SINT:
97 case VK_FORMAT_R32G32_SINT:
98 case VK_FORMAT_R32G32B32_SINT:
99 case VK_FORMAT_R32G32B32A32_SINT:
100 case VK_FORMAT_R64_SINT:
101 case VK_FORMAT_R64G64_SINT:
102 case VK_FORMAT_R64G64B64_SINT:
103 case VK_FORMAT_R64G64B64A64_SINT:
104 return true;
105 default:
106 return false;
107 }
108 }
109
isUnsignedUnnormalizedInteger() const110 bool Format::isUnsignedUnnormalizedInteger() const
111 {
112 switch(format)
113 {
114 case VK_FORMAT_R8_UINT:
115 case VK_FORMAT_R8G8_UINT:
116 case VK_FORMAT_R8G8B8A8_UINT:
117 case VK_FORMAT_B8G8R8A8_UINT:
118 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
119 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
120 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
121 case VK_FORMAT_R16_UINT:
122 case VK_FORMAT_R16G16_UINT:
123 case VK_FORMAT_R16G16B16_UINT:
124 case VK_FORMAT_R16G16B16A16_UINT:
125 case VK_FORMAT_R32_UINT:
126 case VK_FORMAT_R32G32_UINT:
127 case VK_FORMAT_R32G32B32_UINT:
128 case VK_FORMAT_R32G32B32A32_UINT:
129 case VK_FORMAT_R64_UINT:
130 case VK_FORMAT_R64G64_UINT:
131 case VK_FORMAT_R64G64B64_UINT:
132 case VK_FORMAT_R64G64B64A64_UINT:
133 case VK_FORMAT_S8_UINT:
134 return true;
135 default:
136 return false;
137 }
138 }
139
isUnnormalizedInteger() const140 bool Format::isUnnormalizedInteger() const
141 {
142 return isSignedUnnormalizedInteger() || isUnsignedUnnormalizedInteger();
143 }
144
getAspects() const145 VkImageAspectFlags Format::getAspects() const
146 {
147 // TODO: probably just flatten this out to a full format list, and alter
148 // isDepth / isStencil etc to check for their aspect
149
150 VkImageAspectFlags aspects = 0;
151 if(isDepth()) aspects |= VK_IMAGE_ASPECT_DEPTH_BIT;
152 if(isStencil()) aspects |= VK_IMAGE_ASPECT_STENCIL_BIT;
153
154 // YCbCr formats
155 switch(format)
156 {
157 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
158 aspects = VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT;
159 break;
160 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
161 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
162 aspects = VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT;
163 break;
164 default:
165 ASSERT(!isYcbcrFormat());
166 break;
167 }
168
169 // Anything else is "color".
170 if(!aspects) aspects |= VK_IMAGE_ASPECT_COLOR_BIT;
171 return aspects;
172 }
173
getAspectFormat(VkImageAspectFlags aspect) const174 Format Format::getAspectFormat(VkImageAspectFlags aspect) const
175 {
176 switch(aspect)
177 {
178 case VK_IMAGE_ASPECT_COLOR_BIT:
179 case(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT):
180 case(VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT):
181 case(VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT):
182 return format;
183
184 case VK_IMAGE_ASPECT_DEPTH_BIT:
185 switch(format)
186 {
187 case VK_FORMAT_D16_UNORM:
188 case VK_FORMAT_D16_UNORM_S8_UINT:
189 return VK_FORMAT_D16_UNORM;
190 case VK_FORMAT_D24_UNORM_S8_UINT:
191 return VK_FORMAT_X8_D24_UNORM_PACK32;
192 case VK_FORMAT_D32_SFLOAT:
193 case VK_FORMAT_D32_SFLOAT_S8_UINT:
194 return VK_FORMAT_D32_SFLOAT;
195 default:
196 UNSUPPORTED("format %d", int(format));
197 break;
198 }
199 break;
200
201 case VK_IMAGE_ASPECT_STENCIL_BIT:
202 switch(format)
203 {
204 case VK_FORMAT_S8_UINT:
205 case VK_FORMAT_D16_UNORM_S8_UINT:
206 case VK_FORMAT_D24_UNORM_S8_UINT:
207 case VK_FORMAT_D32_SFLOAT_S8_UINT:
208 return VK_FORMAT_S8_UINT;
209 default:
210 UNSUPPORTED("format %d", int(format));
211 break;
212 }
213 break;
214
215 // YCbCr formats
216 // Vulkan 1.1 section 32.1.1. Compatible formats of planes of multi-planar formats
217 case VK_IMAGE_ASPECT_PLANE_0_BIT:
218 switch(format)
219 {
220 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
221 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
222 return VK_FORMAT_R8_UNORM;
223 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
224 return VK_FORMAT_R10X6_UNORM_PACK16;
225 // 8-bit compatibility class
226 // Compatible format for VK_FORMAT_R8_UNORM
227 case VK_FORMAT_R8_UNORM:
228 case VK_FORMAT_R8_UINT:
229 case VK_FORMAT_R8_SINT:
230 // 16-bit compatibility class
231 // Compatible formats with VK_FORMAT_R8G8_UNORM, VK_FORMAT_R10X6_UNORM_PACK16, VK_FORMAT_R12X4_UNORM_PACK16 and VK_FORMAT_R16_UNORM
232 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
233 case VK_FORMAT_R8G8_UNORM:
234 case VK_FORMAT_R8G8_UINT:
235 case VK_FORMAT_R16_UNORM:
236 case VK_FORMAT_R16_UINT:
237 case VK_FORMAT_R16_SINT:
238 return format;
239 default:
240 UNSUPPORTED("format %d", int(format));
241 break;
242 }
243 break;
244
245 case VK_IMAGE_ASPECT_PLANE_1_BIT:
246 switch(format)
247 {
248 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
249 return VK_FORMAT_R8_UNORM;
250 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
251 return VK_FORMAT_R8G8_UNORM;
252 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
253 return VK_FORMAT_R10X6G10X6_UNORM_2PACK16;
254 // 8-bit compatibility class
255 // Compatible format for VK_FORMAT_R8_UNORM
256 case VK_FORMAT_R8_UNORM:
257 case VK_FORMAT_R8_UINT:
258 case VK_FORMAT_R8_SINT:
259 // 16-bit compatibility class
260 // Compatible formats with VK_FORMAT_R8G8_UNORM, VK_FORMAT_R10X6_UNORM_PACK16, VK_FORMAT_R12X4_UNORM_PACK16 and VK_FORMAT_R16_UNORM
261 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
262 case VK_FORMAT_R8G8_UNORM:
263 case VK_FORMAT_R8G8_UINT:
264 case VK_FORMAT_R8G8_SINT:
265 case VK_FORMAT_R16_UNORM:
266 case VK_FORMAT_R16_UINT:
267 case VK_FORMAT_R16_SINT:
268 // 32-bit compatibility class
269 // Compatible formats for VK_FORMAT_R10X6G10X6_UNORM_2PACK16, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 and VK_FORMAT_R16G16_UNORM
270 case VK_FORMAT_R8G8B8A8_UNORM:
271 case VK_FORMAT_R8G8B8A8_UINT:
272 case VK_FORMAT_R16G16_UNORM:
273 case VK_FORMAT_R32_UINT:
274 return format;
275 default:
276 UNSUPPORTED("format %d", int(format));
277 break;
278 }
279 break;
280
281 case VK_IMAGE_ASPECT_PLANE_2_BIT:
282 switch(format)
283 {
284 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
285 return VK_FORMAT_R8_UNORM;
286 // 8-bit compatibility class
287 // Compatible format for VK_FORMAT_R8_UNORM
288 case VK_FORMAT_R8_UNORM:
289 case VK_FORMAT_R8_UINT:
290 case VK_FORMAT_R8_SINT:
291 return format;
292 default:
293 UNSUPPORTED("format %d", int(format));
294 break;
295 }
296 break;
297
298 default:
299 UNSUPPORTED("aspect %x", int(aspect));
300 break;
301 }
302
303 return format;
304 }
305
getClearFormat() const306 VkFormat Format::getClearFormat() const
307 {
308 // Set the proper format for the clear value, as described here:
309 // https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#clears-values
310 if(isSignedUnnormalizedInteger())
311 {
312 return VK_FORMAT_R32G32B32A32_SINT;
313 }
314 else if(isUnsignedUnnormalizedInteger())
315 {
316 return VK_FORMAT_R32G32B32A32_UINT;
317 }
318
319 return VK_FORMAT_R32G32B32A32_SFLOAT;
320 }
321
isStencil() const322 bool Format::isStencil() const
323 {
324 switch(format)
325 {
326 case VK_FORMAT_D16_UNORM_S8_UINT:
327 case VK_FORMAT_D24_UNORM_S8_UINT:
328 case VK_FORMAT_S8_UINT:
329 case VK_FORMAT_D32_SFLOAT_S8_UINT:
330 return true;
331 case VK_FORMAT_D16_UNORM:
332 case VK_FORMAT_X8_D24_UNORM_PACK32:
333 case VK_FORMAT_D32_SFLOAT:
334 default:
335 return false;
336 }
337 }
338
isDepth() const339 bool Format::isDepth() const
340 {
341 switch(format)
342 {
343 case VK_FORMAT_D16_UNORM:
344 case VK_FORMAT_D16_UNORM_S8_UINT:
345 case VK_FORMAT_X8_D24_UNORM_PACK32:
346 case VK_FORMAT_D24_UNORM_S8_UINT:
347 case VK_FORMAT_D32_SFLOAT:
348 case VK_FORMAT_D32_SFLOAT_S8_UINT:
349 return true;
350 case VK_FORMAT_S8_UINT:
351 default:
352 return false;
353 }
354 }
355
isBGRformat() const356 bool Format::isBGRformat() const
357 {
358 switch(format)
359 {
360 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
361 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
362 case VK_FORMAT_R5G6B5_UNORM_PACK16:
363 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
364 case VK_FORMAT_B8G8R8_UNORM:
365 case VK_FORMAT_B8G8R8_SNORM:
366 case VK_FORMAT_B8G8R8_USCALED:
367 case VK_FORMAT_B8G8R8_SSCALED:
368 case VK_FORMAT_B8G8R8_UINT:
369 case VK_FORMAT_B8G8R8_SINT:
370 case VK_FORMAT_B8G8R8_SRGB:
371 case VK_FORMAT_B8G8R8A8_UNORM:
372 case VK_FORMAT_B8G8R8A8_SNORM:
373 case VK_FORMAT_B8G8R8A8_USCALED:
374 case VK_FORMAT_B8G8R8A8_SSCALED:
375 case VK_FORMAT_B8G8R8A8_UINT:
376 case VK_FORMAT_B8G8R8A8_SINT:
377 case VK_FORMAT_B8G8R8A8_SRGB:
378 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
379 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
380 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
381 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
382 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
383 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
384 return true;
385 default:
386 return false;
387 }
388 }
389
isSRGBformat() const390 bool Format::isSRGBformat() const
391 {
392 switch(format)
393 {
394 case VK_FORMAT_R8_SRGB:
395 case VK_FORMAT_R8G8_SRGB:
396 case VK_FORMAT_R8G8B8A8_SRGB:
397 case VK_FORMAT_B8G8R8A8_SRGB:
398 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
399 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
400 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
401 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
402 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
403 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
404 case VK_FORMAT_BC2_SRGB_BLOCK:
405 case VK_FORMAT_BC3_SRGB_BLOCK:
406 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
407 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
408 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
409 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
410 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
411 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
412 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
413 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
414 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
415 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
416 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
417 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
418 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
419 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
420 return true;
421 default:
422 return false;
423 }
424 }
425
isFloatFormat() const426 bool Format::isFloatFormat() const
427 {
428 switch(format)
429 {
430 case VK_FORMAT_R4G4_UNORM_PACK8:
431 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
432 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
433 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
434 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
435 case VK_FORMAT_R5G6B5_UNORM_PACK16:
436 case VK_FORMAT_B5G6R5_UNORM_PACK16:
437 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
438 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
439 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
440 case VK_FORMAT_R8_UNORM:
441 case VK_FORMAT_R8_SNORM:
442 case VK_FORMAT_R8_USCALED:
443 case VK_FORMAT_R8_SSCALED:
444 case VK_FORMAT_R8_UINT:
445 case VK_FORMAT_R8_SINT:
446 case VK_FORMAT_R8_SRGB:
447 case VK_FORMAT_R8G8_UNORM:
448 case VK_FORMAT_R8G8_SNORM:
449 case VK_FORMAT_R8G8_USCALED:
450 case VK_FORMAT_R8G8_SSCALED:
451 case VK_FORMAT_R8G8_UINT:
452 case VK_FORMAT_R8G8_SINT:
453 case VK_FORMAT_R8G8_SRGB:
454 case VK_FORMAT_R8G8B8A8_UNORM:
455 case VK_FORMAT_R8G8B8A8_SNORM:
456 case VK_FORMAT_R8G8B8A8_USCALED:
457 case VK_FORMAT_R8G8B8A8_SSCALED:
458 case VK_FORMAT_R8G8B8A8_UINT:
459 case VK_FORMAT_R8G8B8A8_SINT:
460 case VK_FORMAT_R8G8B8A8_SRGB:
461 case VK_FORMAT_B8G8R8A8_UNORM:
462 case VK_FORMAT_B8G8R8A8_SNORM:
463 case VK_FORMAT_B8G8R8A8_USCALED:
464 case VK_FORMAT_B8G8R8A8_SSCALED:
465 case VK_FORMAT_B8G8R8A8_UINT:
466 case VK_FORMAT_B8G8R8A8_SINT:
467 case VK_FORMAT_B8G8R8A8_SRGB:
468 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
469 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
470 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
471 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
472 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
473 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
474 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
475 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
476 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
477 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
478 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
479 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
480 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
481 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
482 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
483 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
484 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
485 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
486 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
487 case VK_FORMAT_R16_UNORM:
488 case VK_FORMAT_R16_SNORM:
489 case VK_FORMAT_R16_USCALED:
490 case VK_FORMAT_R16_SSCALED:
491 case VK_FORMAT_R16_UINT:
492 case VK_FORMAT_R16_SINT:
493 case VK_FORMAT_R16G16_UNORM:
494 case VK_FORMAT_R16G16_SNORM:
495 case VK_FORMAT_R16G16_USCALED:
496 case VK_FORMAT_R16G16_SSCALED:
497 case VK_FORMAT_R16G16_UINT:
498 case VK_FORMAT_R16G16_SINT:
499 case VK_FORMAT_R16G16B16_UNORM:
500 case VK_FORMAT_R16G16B16_SNORM:
501 case VK_FORMAT_R16G16B16_USCALED:
502 case VK_FORMAT_R16G16B16_SSCALED:
503 case VK_FORMAT_R16G16B16_UINT:
504 case VK_FORMAT_R16G16B16_SINT:
505 case VK_FORMAT_R16G16B16A16_UNORM:
506 case VK_FORMAT_R16G16B16A16_SNORM:
507 case VK_FORMAT_R16G16B16A16_USCALED:
508 case VK_FORMAT_R16G16B16A16_SSCALED:
509 case VK_FORMAT_R16G16B16A16_UINT:
510 case VK_FORMAT_R16G16B16A16_SINT:
511 case VK_FORMAT_R32_UINT:
512 case VK_FORMAT_R32_SINT:
513 case VK_FORMAT_R32G32_UINT:
514 case VK_FORMAT_R32G32_SINT:
515 case VK_FORMAT_R32G32B32_UINT:
516 case VK_FORMAT_R32G32B32_SINT:
517 case VK_FORMAT_R32G32B32A32_UINT:
518 case VK_FORMAT_R32G32B32A32_SINT:
519 case VK_FORMAT_R64_UINT:
520 case VK_FORMAT_R64_SINT:
521 case VK_FORMAT_R64G64_UINT:
522 case VK_FORMAT_R64G64_SINT:
523 case VK_FORMAT_R64G64B64_UINT:
524 case VK_FORMAT_R64G64B64_SINT:
525 case VK_FORMAT_R64G64B64A64_UINT:
526 case VK_FORMAT_R64G64B64A64_SINT:
527 case VK_FORMAT_D16_UNORM:
528 case VK_FORMAT_X8_D24_UNORM_PACK32:
529 case VK_FORMAT_S8_UINT:
530 case VK_FORMAT_D16_UNORM_S8_UINT:
531 case VK_FORMAT_D24_UNORM_S8_UINT:
532 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
533 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
534 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
535 return false;
536 case VK_FORMAT_R16_SFLOAT:
537 case VK_FORMAT_R16G16_SFLOAT:
538 case VK_FORMAT_R16G16B16_SFLOAT:
539 case VK_FORMAT_R16G16B16A16_SFLOAT:
540 case VK_FORMAT_R32_SFLOAT:
541 case VK_FORMAT_R32G32_SFLOAT:
542 case VK_FORMAT_R32G32B32_SFLOAT:
543 case VK_FORMAT_R32G32B32A32_SFLOAT:
544 case VK_FORMAT_R64_SFLOAT:
545 case VK_FORMAT_R64G64_SFLOAT:
546 case VK_FORMAT_R64G64B64_SFLOAT:
547 case VK_FORMAT_R64G64B64A64_SFLOAT:
548 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
549 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
550 case VK_FORMAT_D32_SFLOAT:
551 case VK_FORMAT_D32_SFLOAT_S8_UINT:
552 return true;
553 default:
554 UNSUPPORTED("Format: %d", int(format));
555 }
556
557 return false;
558 }
559
isYcbcrFormat() const560 bool Format::isYcbcrFormat() const
561 {
562 switch(format)
563 {
564 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
565 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
566 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
567 return true;
568 default:
569 return false;
570 }
571 }
572
isCompressed() const573 bool Format::isCompressed() const
574 {
575 switch(format)
576 {
577 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
578 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
579 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
580 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
581 case VK_FORMAT_BC2_UNORM_BLOCK:
582 case VK_FORMAT_BC2_SRGB_BLOCK:
583 case VK_FORMAT_BC3_UNORM_BLOCK:
584 case VK_FORMAT_BC3_SRGB_BLOCK:
585 case VK_FORMAT_BC4_UNORM_BLOCK:
586 case VK_FORMAT_BC4_SNORM_BLOCK:
587 case VK_FORMAT_BC5_UNORM_BLOCK:
588 case VK_FORMAT_BC5_SNORM_BLOCK:
589 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
590 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
591 case VK_FORMAT_BC7_UNORM_BLOCK:
592 case VK_FORMAT_BC7_SRGB_BLOCK:
593 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
594 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
595 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
596 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
597 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
598 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
599 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
600 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
601 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
602 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
603 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
604 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
605 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
606 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
607 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
608 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
609 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
610 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
611 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
612 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
613 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
614 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
615 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
616 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
617 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
618 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
619 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
620 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
621 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
622 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
623 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
624 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
625 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
626 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
627 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
628 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
629 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
630 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
631 return true;
632 default:
633 return false;
634 }
635 }
636
getDecompressedFormat() const637 VkFormat Format::getDecompressedFormat() const
638 {
639 // Note: our ETC2 decoder decompresses the 64 bit RGB compressed texel data to B8G8R8
640 switch(format)
641 {
642 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
643 return VK_FORMAT_B8G8R8A8_UNORM;
644 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
645 return VK_FORMAT_B8G8R8A8_SRGB;
646 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
647 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
648 return VK_FORMAT_B8G8R8A8_UNORM;
649 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
650 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
651 return VK_FORMAT_B8G8R8A8_SRGB;
652 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
653 return VK_FORMAT_R16_UNORM;
654 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
655 return VK_FORMAT_R16_SNORM;
656 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
657 return VK_FORMAT_R16G16_UNORM;
658 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
659 return VK_FORMAT_R16G16_SNORM;
660 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
661 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
662 case VK_FORMAT_BC2_UNORM_BLOCK:
663 case VK_FORMAT_BC3_UNORM_BLOCK:
664 case VK_FORMAT_BC7_UNORM_BLOCK:
665 return VK_FORMAT_B8G8R8A8_UNORM;
666 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
667 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
668 case VK_FORMAT_BC2_SRGB_BLOCK:
669 case VK_FORMAT_BC3_SRGB_BLOCK:
670 case VK_FORMAT_BC7_SRGB_BLOCK:
671 return VK_FORMAT_B8G8R8A8_SRGB;
672 case VK_FORMAT_BC4_UNORM_BLOCK:
673 return VK_FORMAT_R8_UNORM;
674 case VK_FORMAT_BC4_SNORM_BLOCK:
675 return VK_FORMAT_R8_SNORM;
676 case VK_FORMAT_BC5_UNORM_BLOCK:
677 return VK_FORMAT_R8G8_UNORM;
678 case VK_FORMAT_BC5_SNORM_BLOCK:
679 return VK_FORMAT_R8G8_SNORM;
680 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
681 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
682 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
683 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
684 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
685 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
686 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
687 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
688 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
689 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
690 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
691 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
692 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
693 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
694 return VK_FORMAT_R8G8B8A8_UNORM;
695 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
696 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
697 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
698 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
699 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
700 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
701 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
702 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
703 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
704 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
705 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
706 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
707 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
708 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
709 return VK_FORMAT_R8G8B8A8_SRGB;
710 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
711 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
712 return VK_FORMAT_R16G16B16A16_SFLOAT;
713 default:
714 UNSUPPORTED("format: %d", int(format));
715 return VK_FORMAT_UNDEFINED;
716 }
717 }
718
getCompatibleFormats() const719 std::vector<Format> Format::getCompatibleFormats() const
720 {
721 switch(getCompatibilityClassRepresentative())
722 {
723 // 8 - bit, Block size 1 byte, 1 texel / block
724 case VK_FORMAT_R8_UNORM:
725 return {
726 VK_FORMAT_R4G4_UNORM_PACK8,
727 VK_FORMAT_R8_UNORM,
728 VK_FORMAT_R8_SNORM,
729 VK_FORMAT_R8_USCALED,
730 VK_FORMAT_R8_SSCALED,
731 VK_FORMAT_R8_UINT,
732 VK_FORMAT_R8_SINT,
733 VK_FORMAT_R8_SRGB,
734 };
735
736 // 16 - bit, Block size 2 bytes, 1 texel / block
737 case VK_FORMAT_R16_UNORM:
738 return {
739 VK_FORMAT_R4G4B4A4_UNORM_PACK16,
740 VK_FORMAT_B4G4R4A4_UNORM_PACK16,
741 VK_FORMAT_A4R4G4B4_UNORM_PACK16,
742 VK_FORMAT_A4B4G4R4_UNORM_PACK16,
743 VK_FORMAT_R5G6B5_UNORM_PACK16,
744 VK_FORMAT_B5G6R5_UNORM_PACK16,
745 VK_FORMAT_R5G5B5A1_UNORM_PACK16,
746 VK_FORMAT_B5G5R5A1_UNORM_PACK16,
747 VK_FORMAT_A1R5G5B5_UNORM_PACK16,
748 VK_FORMAT_R8G8_UNORM,
749 VK_FORMAT_R8G8_SNORM,
750 VK_FORMAT_R8G8_USCALED,
751 VK_FORMAT_R8G8_SSCALED,
752 VK_FORMAT_R8G8_UINT,
753 VK_FORMAT_R8G8_SINT,
754 VK_FORMAT_R8G8_SRGB,
755 VK_FORMAT_R16_UNORM,
756 VK_FORMAT_R16_SNORM,
757 VK_FORMAT_R16_USCALED,
758 VK_FORMAT_R16_SSCALED,
759 VK_FORMAT_R16_UINT,
760 VK_FORMAT_R16_SINT,
761 VK_FORMAT_R16_SFLOAT,
762 VK_FORMAT_R10X6_UNORM_PACK16,
763 VK_FORMAT_R12X4_UNORM_PACK16,
764 };
765
766 // 32 - bit, Block size 4 bytes, 1 texel / block
767 case VK_FORMAT_R8G8B8A8_UNORM:
768 return {
769 VK_FORMAT_R8G8B8A8_UNORM,
770 VK_FORMAT_R8G8B8A8_SNORM,
771 VK_FORMAT_R8G8B8A8_USCALED,
772 VK_FORMAT_R8G8B8A8_SSCALED,
773 VK_FORMAT_R8G8B8A8_UINT,
774 VK_FORMAT_R8G8B8A8_SINT,
775 VK_FORMAT_R8G8B8A8_SRGB,
776 VK_FORMAT_B8G8R8A8_UNORM,
777 VK_FORMAT_B8G8R8A8_SNORM,
778 VK_FORMAT_B8G8R8A8_USCALED,
779 VK_FORMAT_B8G8R8A8_SSCALED,
780 VK_FORMAT_B8G8R8A8_UINT,
781 VK_FORMAT_B8G8R8A8_SINT,
782 VK_FORMAT_B8G8R8A8_SRGB,
783 VK_FORMAT_A8B8G8R8_UNORM_PACK32,
784 VK_FORMAT_A8B8G8R8_SNORM_PACK32,
785 VK_FORMAT_A8B8G8R8_USCALED_PACK32,
786 VK_FORMAT_A8B8G8R8_SSCALED_PACK32,
787 VK_FORMAT_A8B8G8R8_UINT_PACK32,
788 VK_FORMAT_A8B8G8R8_SINT_PACK32,
789 VK_FORMAT_A8B8G8R8_SRGB_PACK32,
790 VK_FORMAT_A2R10G10B10_UNORM_PACK32,
791 VK_FORMAT_A2R10G10B10_SNORM_PACK32,
792 VK_FORMAT_A2R10G10B10_USCALED_PACK32,
793 VK_FORMAT_A2R10G10B10_SSCALED_PACK32,
794 VK_FORMAT_A2R10G10B10_UINT_PACK32,
795 VK_FORMAT_A2R10G10B10_SINT_PACK32,
796 VK_FORMAT_A2B10G10R10_UNORM_PACK32,
797 VK_FORMAT_A2B10G10R10_SNORM_PACK32,
798 VK_FORMAT_A2B10G10R10_USCALED_PACK32,
799 VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
800 VK_FORMAT_A2B10G10R10_UINT_PACK32,
801 VK_FORMAT_A2B10G10R10_SINT_PACK32,
802 VK_FORMAT_R16G16_UNORM,
803 VK_FORMAT_R16G16_SNORM,
804 VK_FORMAT_R16G16_USCALED,
805 VK_FORMAT_R16G16_SSCALED,
806 VK_FORMAT_R16G16_UINT,
807 VK_FORMAT_R16G16_SINT,
808 VK_FORMAT_R16G16_SFLOAT,
809 VK_FORMAT_R32_UINT,
810 VK_FORMAT_R32_SINT,
811 VK_FORMAT_R32_SFLOAT,
812 VK_FORMAT_B10G11R11_UFLOAT_PACK32,
813 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
814 VK_FORMAT_R10X6G10X6_UNORM_2PACK16,
815 VK_FORMAT_R12X4G12X4_UNORM_2PACK16,
816 };
817
818 // 48 - bit, Block size 6 bytes, 1 texel / block
819 case VK_FORMAT_R16G16B16_UNORM:
820 return {
821 VK_FORMAT_R16G16B16_UNORM,
822 VK_FORMAT_R16G16B16_SNORM,
823 VK_FORMAT_R16G16B16_USCALED,
824 VK_FORMAT_R16G16B16_SSCALED,
825 VK_FORMAT_R16G16B16_UINT,
826 VK_FORMAT_R16G16B16_SINT,
827 VK_FORMAT_R16G16B16_SFLOAT,
828 };
829
830 // 64 - bit, Block size 8 bytes, 1 texel / block
831 case VK_FORMAT_R16G16B16A16_UNORM:
832 return {
833 VK_FORMAT_R16G16B16A16_UNORM,
834 VK_FORMAT_R16G16B16A16_SNORM,
835 VK_FORMAT_R16G16B16A16_USCALED,
836 VK_FORMAT_R16G16B16A16_SSCALED,
837 VK_FORMAT_R16G16B16A16_UINT,
838 VK_FORMAT_R16G16B16A16_SINT,
839 VK_FORMAT_R16G16B16A16_SFLOAT,
840 VK_FORMAT_R32G32_UINT,
841 VK_FORMAT_R32G32_SINT,
842 VK_FORMAT_R32G32_SFLOAT,
843 VK_FORMAT_R64_UINT,
844 VK_FORMAT_R64_SINT,
845 VK_FORMAT_R64_SFLOAT,
846 };
847
848 // 96 - bit, Block size 12 bytes, 1 texel / block
849 case VK_FORMAT_R32G32B32_UINT:
850 return {
851 VK_FORMAT_R32G32B32_UINT,
852 VK_FORMAT_R32G32B32_SINT,
853 VK_FORMAT_R32G32B32_SFLOAT,
854 };
855
856 // 128 - bit, Block size 16 bytes, 1 texel / block
857 case VK_FORMAT_R32G32B32A32_UINT:
858 return {
859 VK_FORMAT_R32G32B32A32_UINT,
860 VK_FORMAT_R32G32B32A32_SINT,
861 VK_FORMAT_R32G32B32A32_SFLOAT,
862 VK_FORMAT_R64G64_UINT,
863 VK_FORMAT_R64G64_SINT,
864 VK_FORMAT_R64G64_SFLOAT,
865 };
866
867 // 192 - bit, Block size 24 bytes, 1 texel / block
868 case VK_FORMAT_R64G64B64_UINT:
869 return {
870 VK_FORMAT_R64G64B64_UINT,
871 VK_FORMAT_R64G64B64_SINT,
872 VK_FORMAT_R64G64B64_SFLOAT,
873 };
874
875 // 256 - bit, Block size 32 bytes, 1 texel / block
876 case VK_FORMAT_R64G64B64A64_UINT:
877 return {
878 VK_FORMAT_R64G64B64A64_UINT,
879 VK_FORMAT_R64G64B64A64_SINT,
880 VK_FORMAT_R64G64B64A64_SFLOAT,
881 };
882
883 // BC1_RGB(64 bit), Block size 8 bytes, 16 texels / block
884 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
885 return {
886 VK_FORMAT_BC1_RGB_UNORM_BLOCK,
887 VK_FORMAT_BC1_RGB_SRGB_BLOCK,
888 };
889
890 // BC1_RGBA(64 bit), Block size 8 bytes, 16 texels / block
891 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
892 return {
893 VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
894 VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
895 };
896
897 // BC2(128 bit), Block size 16 bytes, 16 texels / block
898 case VK_FORMAT_BC2_UNORM_BLOCK:
899 return {
900 VK_FORMAT_BC2_UNORM_BLOCK,
901 VK_FORMAT_BC2_SRGB_BLOCK,
902 };
903
904 // BC3(128 bit), Block size 16 bytes, 16 texels / block
905 case VK_FORMAT_BC3_UNORM_BLOCK:
906 return {
907 VK_FORMAT_BC3_UNORM_BLOCK,
908 VK_FORMAT_BC3_SRGB_BLOCK,
909 };
910
911 // BC4(64 bit), Block size 8 bytes, 16 texels / block
912 case VK_FORMAT_BC4_UNORM_BLOCK:
913 return {
914 VK_FORMAT_BC4_UNORM_BLOCK,
915 VK_FORMAT_BC4_SNORM_BLOCK,
916 };
917
918 // BC5(128 bit), Block size 16 bytes, 16 texels / block
919 case VK_FORMAT_BC5_UNORM_BLOCK:
920 return {
921 VK_FORMAT_BC5_UNORM_BLOCK,
922 VK_FORMAT_BC5_SNORM_BLOCK,
923 };
924
925 // BC6H(128 bit), Block size 16 bytes, 16 texels / block
926 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
927 return {
928 VK_FORMAT_BC6H_UFLOAT_BLOCK,
929 VK_FORMAT_BC6H_SFLOAT_BLOCK,
930 };
931
932 // BC7(128 bit), Block size 16 bytes, 16 texels / block
933 case VK_FORMAT_BC7_UNORM_BLOCK:
934 return {
935 VK_FORMAT_BC7_UNORM_BLOCK,
936 VK_FORMAT_BC7_SRGB_BLOCK,
937 };
938
939 // ETC2_RGB(64 bit), Block size 8 bytes, 16 texels / block
940 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
941 return {
942 VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
943 VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
944 };
945
946 // ETC2_RGBA(64 bit), Block size 8 bytes, 16 texels / block
947 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
948 return {
949 VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
950 VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
951 };
952
953 // ETC2_EAC_RGBA(64 bit), Block size 8 bytes, 16 texels / block
954 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
955 return {
956 VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
957 VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
958 };
959
960 // EAC_R(64 bit), Block size 8 bytes, 16 texels / block
961 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
962 return {
963 VK_FORMAT_EAC_R11_UNORM_BLOCK,
964 VK_FORMAT_EAC_R11_SNORM_BLOCK,
965 };
966
967 // EAC_RG(128 bit), Block size 16 bytes, 16 texels / block
968 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
969 return {
970 VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
971 VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
972 };
973
974 // ASTC_4x4(128 bit), Block size 16 bytes, 16 texels / block
975 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
976 return {
977 VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
978 VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
979 };
980
981 // ASTC_5x4(128 bit), Block size 16 bytes, 20 texels / block
982 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
983 return {
984 VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
985 VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
986 };
987
988 // ASTC_5x5(128 bit), Block size 16 bytes, 25 texels / block
989 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
990 return {
991 VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
992 VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
993 };
994
995 // ASTC_6x5(128 bit), Block size 16 bytes, 30 texels / block
996 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
997 return {
998 VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
999 VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
1000 };
1001
1002 // ASTC_6x6(128 bit), Block size 16 bytes, 36 texels / block
1003 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
1004 return {
1005 VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
1006 VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
1007 };
1008
1009 // ASTC_8x5(128 bit), Block size 16 bytes, 40 texels / block
1010 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
1011 return {
1012 VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
1013 VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
1014 };
1015
1016 // ASTC_8x6(128 bit), Block size 16 bytes, 48 texels / block
1017 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
1018 return {
1019 VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
1020 VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
1021 };
1022
1023 // ASTC_8x8(128 bit), Block size 16 bytes, 64 texels / block
1024 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
1025 return {
1026 VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
1027 VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
1028 };
1029
1030 // ASTC_10x5(128 bit), Block size 16 bytes, 50 texels / block
1031 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
1032 return {
1033 VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
1034 VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
1035 };
1036
1037 // ASTC_10x6(128 bit), Block size 16 bytes, 60 texels / block
1038 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
1039 return {
1040 VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
1041 VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
1042 };
1043
1044 // ASTC_10x8(128 bit), Block size 16 bytes, 80 texels / block
1045 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
1046 return {
1047 VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
1048 VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
1049 };
1050
1051 // ASTC_10x10(128 bit), Block size 16 bytes, 100 texels / block
1052 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
1053 return {
1054 VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
1055 VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
1056 };
1057
1058 // ASTC_12x10(128 bit), Block size 16 bytes, 120 texels / block
1059 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
1060 return {
1061 VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
1062 VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
1063 };
1064
1065 // ASTC_12x12(128 bit), Block size 16 bytes, 144 texels / block
1066 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
1067 return {
1068 VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
1069 VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
1070 };
1071
1072 // All other formats are only compatible with themselves
1073 default:
1074 ASSERT(getCompatibilityClassRepresentative() == format);
1075 return { format };
1076 }
1077 }
1078
1079 // Returns a single format per class of compatible formats.
getCompatibilityClassRepresentative() const1080 VkFormat Format::getCompatibilityClassRepresentative() const
1081 {
1082 // According to the Vulkan 1.1 Spec, 37.1.6. Format Compatibility Classes:
1083 // "Uncompressed color formats are compatible with each other if they occupy
1084 // the same number of bits per texel block. Compressed color formats are
1085 // compatible with each other if the only difference between them is the
1086 // numerical type of the uncompressed pixels (e.g. signed vs. unsigned, or
1087 // SRGB vs. UNORM encoding). Each depth/stencil format is only compatible
1088 // with itself. In the following table, all the formats in the same row are
1089 // compatible."
1090
1091 switch(format)
1092 {
1093 // 8 - bit, Block size 1 byte, 1 texel / block
1094 case VK_FORMAT_R4G4_UNORM_PACK8:
1095 case VK_FORMAT_R8_UNORM:
1096 case VK_FORMAT_R8_SNORM:
1097 case VK_FORMAT_R8_USCALED:
1098 case VK_FORMAT_R8_SSCALED:
1099 case VK_FORMAT_R8_UINT:
1100 case VK_FORMAT_R8_SINT:
1101 case VK_FORMAT_R8_SRGB:
1102 return VK_FORMAT_R8_UNORM;
1103
1104 // 16 - bit, Block size 2 bytes, 1 texel / block
1105 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
1106 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
1107 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
1108 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
1109 case VK_FORMAT_R5G6B5_UNORM_PACK16:
1110 case VK_FORMAT_B5G6R5_UNORM_PACK16:
1111 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
1112 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
1113 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
1114 case VK_FORMAT_R8G8_UNORM:
1115 case VK_FORMAT_R8G8_SNORM:
1116 case VK_FORMAT_R8G8_USCALED:
1117 case VK_FORMAT_R8G8_SSCALED:
1118 case VK_FORMAT_R8G8_UINT:
1119 case VK_FORMAT_R8G8_SINT:
1120 case VK_FORMAT_R8G8_SRGB:
1121 case VK_FORMAT_R16_UNORM:
1122 case VK_FORMAT_R16_SNORM:
1123 case VK_FORMAT_R16_USCALED:
1124 case VK_FORMAT_R16_SSCALED:
1125 case VK_FORMAT_R16_UINT:
1126 case VK_FORMAT_R16_SINT:
1127 case VK_FORMAT_R16_SFLOAT:
1128 case VK_FORMAT_R10X6_UNORM_PACK16:
1129 case VK_FORMAT_R12X4_UNORM_PACK16:
1130 return VK_FORMAT_R16_UNORM;
1131
1132 // 32 - bit, Block size 4 bytes, 1 texel / block
1133 case VK_FORMAT_R8G8B8A8_UNORM:
1134 case VK_FORMAT_R8G8B8A8_SNORM:
1135 case VK_FORMAT_R8G8B8A8_USCALED:
1136 case VK_FORMAT_R8G8B8A8_SSCALED:
1137 case VK_FORMAT_R8G8B8A8_UINT:
1138 case VK_FORMAT_R8G8B8A8_SINT:
1139 case VK_FORMAT_R8G8B8A8_SRGB:
1140 case VK_FORMAT_B8G8R8A8_UNORM:
1141 case VK_FORMAT_B8G8R8A8_SNORM:
1142 case VK_FORMAT_B8G8R8A8_USCALED:
1143 case VK_FORMAT_B8G8R8A8_SSCALED:
1144 case VK_FORMAT_B8G8R8A8_UINT:
1145 case VK_FORMAT_B8G8R8A8_SINT:
1146 case VK_FORMAT_B8G8R8A8_SRGB:
1147 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
1148 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
1149 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
1150 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
1151 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
1152 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
1153 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
1154 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
1155 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
1156 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
1157 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
1158 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
1159 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
1160 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
1161 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
1162 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
1163 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
1164 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
1165 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
1166 case VK_FORMAT_R16G16_UNORM:
1167 case VK_FORMAT_R16G16_SNORM:
1168 case VK_FORMAT_R16G16_USCALED:
1169 case VK_FORMAT_R16G16_SSCALED:
1170 case VK_FORMAT_R16G16_UINT:
1171 case VK_FORMAT_R16G16_SINT:
1172 case VK_FORMAT_R16G16_SFLOAT:
1173 case VK_FORMAT_R32_UINT:
1174 case VK_FORMAT_R32_SINT:
1175 case VK_FORMAT_R32_SFLOAT:
1176 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
1177 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
1178 case VK_FORMAT_R10X6G10X6_UNORM_2PACK16:
1179 case VK_FORMAT_R12X4G12X4_UNORM_2PACK16:
1180 return VK_FORMAT_R8G8B8A8_UNORM;
1181
1182 // 48 - bit, Block size 6 bytes, 1 texel / block
1183 case VK_FORMAT_R16G16B16_UNORM:
1184 case VK_FORMAT_R16G16B16_SNORM:
1185 case VK_FORMAT_R16G16B16_USCALED:
1186 case VK_FORMAT_R16G16B16_SSCALED:
1187 case VK_FORMAT_R16G16B16_UINT:
1188 case VK_FORMAT_R16G16B16_SINT:
1189 case VK_FORMAT_R16G16B16_SFLOAT:
1190 return VK_FORMAT_R16G16B16_UNORM;
1191
1192 // 64 - bit, Block size 8 bytes, 1 texel / block
1193 case VK_FORMAT_R16G16B16A16_UNORM:
1194 case VK_FORMAT_R16G16B16A16_SNORM:
1195 case VK_FORMAT_R16G16B16A16_USCALED:
1196 case VK_FORMAT_R16G16B16A16_SSCALED:
1197 case VK_FORMAT_R16G16B16A16_UINT:
1198 case VK_FORMAT_R16G16B16A16_SINT:
1199 case VK_FORMAT_R16G16B16A16_SFLOAT:
1200 case VK_FORMAT_R32G32_UINT:
1201 case VK_FORMAT_R32G32_SINT:
1202 case VK_FORMAT_R32G32_SFLOAT:
1203 case VK_FORMAT_R64_UINT:
1204 case VK_FORMAT_R64_SINT:
1205 case VK_FORMAT_R64_SFLOAT:
1206 return VK_FORMAT_R16G16B16A16_UNORM;
1207
1208 // 96 - bit, Block size 12 bytes, 1 texel / block
1209 case VK_FORMAT_R32G32B32_UINT:
1210 case VK_FORMAT_R32G32B32_SINT:
1211 case VK_FORMAT_R32G32B32_SFLOAT:
1212 return VK_FORMAT_R32G32B32_UINT;
1213
1214 // 128 - bit, Block size 16 bytes, 1 texel / block
1215 case VK_FORMAT_R32G32B32A32_UINT:
1216 case VK_FORMAT_R32G32B32A32_SINT:
1217 case VK_FORMAT_R32G32B32A32_SFLOAT:
1218 case VK_FORMAT_R64G64_UINT:
1219 case VK_FORMAT_R64G64_SINT:
1220 case VK_FORMAT_R64G64_SFLOAT:
1221 return VK_FORMAT_R32G32B32A32_UINT;
1222
1223 // 192 - bit, Block size 24 bytes, 1 texel / block
1224 case VK_FORMAT_R64G64B64_UINT:
1225 case VK_FORMAT_R64G64B64_SINT:
1226 case VK_FORMAT_R64G64B64_SFLOAT:
1227 return VK_FORMAT_R64G64B64_UINT;
1228
1229 // 256 - bit, Block size 32 bytes, 1 texel / block
1230 case VK_FORMAT_R64G64B64A64_UINT:
1231 case VK_FORMAT_R64G64B64A64_SINT:
1232 case VK_FORMAT_R64G64B64A64_SFLOAT:
1233 return VK_FORMAT_R64G64B64A64_UINT;
1234
1235 // BC1_RGB(64 bit), Block size 8 bytes, 16 texels / block
1236 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
1237 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
1238 return VK_FORMAT_BC1_RGB_UNORM_BLOCK;
1239
1240 // BC1_RGBA(64 bit), Block size 8 bytes, 16 texels / block
1241 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
1242 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
1243 return VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
1244
1245 // BC2(128 bit), Block size 16 bytes, 16 texels / block
1246 case VK_FORMAT_BC2_UNORM_BLOCK:
1247 case VK_FORMAT_BC2_SRGB_BLOCK:
1248 return VK_FORMAT_BC2_UNORM_BLOCK;
1249
1250 // BC3(128 bit), Block size 16 bytes, 16 texels / block
1251 case VK_FORMAT_BC3_UNORM_BLOCK:
1252 case VK_FORMAT_BC3_SRGB_BLOCK:
1253 return VK_FORMAT_BC3_UNORM_BLOCK;
1254
1255 // BC4(64 bit), Block size 8 bytes, 16 texels / block
1256 case VK_FORMAT_BC4_UNORM_BLOCK:
1257 case VK_FORMAT_BC4_SNORM_BLOCK:
1258 return VK_FORMAT_BC4_UNORM_BLOCK;
1259
1260 // BC5(128 bit), Block size 16 bytes, 16 texels / block
1261 case VK_FORMAT_BC5_UNORM_BLOCK:
1262 case VK_FORMAT_BC5_SNORM_BLOCK:
1263 return VK_FORMAT_BC5_UNORM_BLOCK;
1264
1265 // BC6H(128 bit), Block size 16 bytes, 16 texels / block
1266 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
1267 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
1268 return VK_FORMAT_BC6H_UFLOAT_BLOCK;
1269
1270 // BC7(128 bit), Block size 16 bytes, 16 texels / block
1271 case VK_FORMAT_BC7_UNORM_BLOCK:
1272 case VK_FORMAT_BC7_SRGB_BLOCK:
1273 return VK_FORMAT_BC7_UNORM_BLOCK;
1274
1275 // ETC2_RGB(64 bit), Block size 8 bytes, 16 texels / block
1276 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
1277 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
1278 return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
1279
1280 // ETC2_RGBA(64 bit), Block size 8 bytes, 16 texels / block
1281 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
1282 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
1283 return VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
1284
1285 // ETC2_EAC_RGBA(64 bit), Block size 8 bytes, 16 texels / block
1286 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
1287 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
1288 return VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1289
1290 // EAC_R(64 bit), Block size 8 bytes, 16 texels / block
1291 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
1292 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
1293 return VK_FORMAT_EAC_R11_UNORM_BLOCK;
1294
1295 // EAC_RG(128 bit), Block size 16 bytes, 16 texels / block
1296 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
1297 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
1298 return VK_FORMAT_EAC_R11G11_UNORM_BLOCK;
1299
1300 // ASTC_4x4(128 bit), Block size 16 bytes, 16 texels / block
1301 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
1302 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
1303 return VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1304
1305 // ASTC_5x4(128 bit), Block size 16 bytes, 20 texels / block
1306 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
1307 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
1308 return VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
1309
1310 // ASTC_5x5(128 bit), Block size 16 bytes, 25 texels / block
1311 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
1312 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
1313 return VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
1314
1315 // ASTC_6x5(128 bit), Block size 16 bytes, 30 texels / block
1316 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
1317 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
1318 return VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
1319
1320 // ASTC_6x6(128 bit), Block size 16 bytes, 36 texels / block
1321 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
1322 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
1323 return VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
1324
1325 // ASTC_8x5(128 bit), Block size 16 bytes, 40 texels / block
1326 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
1327 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
1328 return VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
1329
1330 // ASTC_8x6(128 bit), Block size 16 bytes, 48 texels / block
1331 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
1332 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
1333 return VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
1334
1335 // ASTC_8x8(128 bit), Block size 16 bytes, 64 texels / block
1336 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
1337 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
1338 return VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
1339
1340 // ASTC_10x5(128 bit), Block size 16 bytes, 50 texels / block
1341 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
1342 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
1343 return VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
1344
1345 // ASTC_10x6(128 bit), Block size 16 bytes, 60 texels / block
1346 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
1347 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
1348 return VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
1349
1350 // ASTC_10x8(128 bit), Block size 16 bytes, 80 texels / block
1351 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
1352 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
1353 return VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
1354
1355 // ASTC_10x10(128 bit), Block size 16 bytes, 100 texels / block
1356 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
1357 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
1358 return VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
1359
1360 // ASTC_12x10(128 bit), Block size 16 bytes, 120 texels / block
1361 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
1362 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
1363 return VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
1364
1365 // ASTC_12x12(128 bit), Block size 16 bytes, 144 texels / block
1366 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
1367 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
1368 return VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
1369
1370 // All other formats are only compatible with themselves
1371 default:
1372 return format;
1373 }
1374 }
1375
isCompatible(Format other) const1376 bool Format::isCompatible(Format other) const
1377 {
1378 return getCompatibilityClassRepresentative() == other.getCompatibilityClassRepresentative();
1379 }
1380
blockWidth() const1381 int Format::blockWidth() const
1382 {
1383 switch(format)
1384 {
1385 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
1386 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
1387 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
1388 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
1389 case VK_FORMAT_BC2_UNORM_BLOCK:
1390 case VK_FORMAT_BC2_SRGB_BLOCK:
1391 case VK_FORMAT_BC3_UNORM_BLOCK:
1392 case VK_FORMAT_BC3_SRGB_BLOCK:
1393 case VK_FORMAT_BC4_UNORM_BLOCK:
1394 case VK_FORMAT_BC4_SNORM_BLOCK:
1395 case VK_FORMAT_BC5_UNORM_BLOCK:
1396 case VK_FORMAT_BC5_SNORM_BLOCK:
1397 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
1398 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
1399 case VK_FORMAT_BC7_UNORM_BLOCK:
1400 case VK_FORMAT_BC7_SRGB_BLOCK:
1401 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
1402 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
1403 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
1404 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
1405 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
1406 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
1407 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
1408 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
1409 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
1410 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
1411 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
1412 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
1413 return 4;
1414 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
1415 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
1416 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
1417 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
1418 return 5;
1419 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
1420 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
1421 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
1422 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
1423 return 6;
1424 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
1425 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
1426 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
1427 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
1428 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
1429 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
1430 return 8;
1431 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
1432 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
1433 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
1434 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
1435 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
1436 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
1437 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
1438 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
1439 return 10;
1440 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
1441 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
1442 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
1443 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
1444 return 12;
1445 default:
1446 return 1;
1447 }
1448 }
1449
blockHeight() const1450 int Format::blockHeight() const
1451 {
1452 switch(format)
1453 {
1454 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
1455 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
1456 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
1457 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
1458 case VK_FORMAT_BC2_UNORM_BLOCK:
1459 case VK_FORMAT_BC2_SRGB_BLOCK:
1460 case VK_FORMAT_BC3_UNORM_BLOCK:
1461 case VK_FORMAT_BC3_SRGB_BLOCK:
1462 case VK_FORMAT_BC4_UNORM_BLOCK:
1463 case VK_FORMAT_BC4_SNORM_BLOCK:
1464 case VK_FORMAT_BC5_UNORM_BLOCK:
1465 case VK_FORMAT_BC5_SNORM_BLOCK:
1466 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
1467 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
1468 case VK_FORMAT_BC7_UNORM_BLOCK:
1469 case VK_FORMAT_BC7_SRGB_BLOCK:
1470 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
1471 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
1472 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
1473 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
1474 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
1475 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
1476 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
1477 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
1478 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
1479 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
1480 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
1481 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
1482 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
1483 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
1484 return 4;
1485 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
1486 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
1487 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
1488 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
1489 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
1490 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
1491 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
1492 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
1493 return 5;
1494 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
1495 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
1496 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
1497 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
1498 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
1499 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
1500 return 6;
1501 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
1502 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
1503 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
1504 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
1505 return 8;
1506 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
1507 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
1508 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
1509 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
1510 return 10;
1511 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
1512 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
1513 return 12;
1514 default:
1515 return 1;
1516 }
1517 }
1518
bytesPerBlock() const1519 int Format::bytesPerBlock() const
1520 {
1521 switch(format)
1522 {
1523 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
1524 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
1525 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
1526 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
1527 case VK_FORMAT_BC4_UNORM_BLOCK:
1528 case VK_FORMAT_BC4_SNORM_BLOCK:
1529 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
1530 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
1531 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
1532 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
1533 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
1534 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
1535 return 8;
1536 case VK_FORMAT_BC2_UNORM_BLOCK:
1537 case VK_FORMAT_BC2_SRGB_BLOCK:
1538 case VK_FORMAT_BC3_UNORM_BLOCK:
1539 case VK_FORMAT_BC3_SRGB_BLOCK:
1540 case VK_FORMAT_BC5_UNORM_BLOCK:
1541 case VK_FORMAT_BC5_SNORM_BLOCK:
1542 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
1543 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
1544 case VK_FORMAT_BC7_UNORM_BLOCK:
1545 case VK_FORMAT_BC7_SRGB_BLOCK:
1546 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
1547 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
1548 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
1549 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
1550 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
1551 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
1552 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
1553 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
1554 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
1555 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
1556 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
1557 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
1558 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
1559 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
1560 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
1561 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
1562 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
1563 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
1564 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
1565 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
1566 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
1567 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
1568 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
1569 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
1570 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
1571 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
1572 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
1573 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
1574 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
1575 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
1576 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
1577 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
1578 return 16;
1579 default:
1580 return bytes();
1581 }
1582 }
1583
componentCount() const1584 int Format::componentCount() const
1585 {
1586 switch(format)
1587 {
1588 case VK_FORMAT_R8_UNORM:
1589 case VK_FORMAT_R8_SNORM:
1590 case VK_FORMAT_R8_USCALED:
1591 case VK_FORMAT_R8_SSCALED:
1592 case VK_FORMAT_R8_UINT:
1593 case VK_FORMAT_R8_SINT:
1594 case VK_FORMAT_R8_SRGB:
1595 case VK_FORMAT_R16_UNORM:
1596 case VK_FORMAT_R16_SNORM:
1597 case VK_FORMAT_R16_USCALED:
1598 case VK_FORMAT_R16_SSCALED:
1599 case VK_FORMAT_R16_UINT:
1600 case VK_FORMAT_R16_SINT:
1601 case VK_FORMAT_R16_SFLOAT:
1602 case VK_FORMAT_R32_UINT:
1603 case VK_FORMAT_R32_SINT:
1604 case VK_FORMAT_R32_SFLOAT:
1605 case VK_FORMAT_R64_UINT:
1606 case VK_FORMAT_R64_SINT:
1607 case VK_FORMAT_R64_SFLOAT:
1608 case VK_FORMAT_D16_UNORM:
1609 case VK_FORMAT_X8_D24_UNORM_PACK32:
1610 case VK_FORMAT_D32_SFLOAT:
1611 case VK_FORMAT_S8_UINT:
1612 case VK_FORMAT_D16_UNORM_S8_UINT:
1613 case VK_FORMAT_D24_UNORM_S8_UINT:
1614 case VK_FORMAT_D32_SFLOAT_S8_UINT:
1615 case VK_FORMAT_BC4_UNORM_BLOCK:
1616 case VK_FORMAT_BC4_SNORM_BLOCK:
1617 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
1618 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
1619 return 1;
1620 case VK_FORMAT_R4G4_UNORM_PACK8:
1621 case VK_FORMAT_R8G8_UNORM:
1622 case VK_FORMAT_R8G8_SNORM:
1623 case VK_FORMAT_R8G8_USCALED:
1624 case VK_FORMAT_R8G8_SSCALED:
1625 case VK_FORMAT_R8G8_UINT:
1626 case VK_FORMAT_R8G8_SINT:
1627 case VK_FORMAT_R8G8_SRGB:
1628 case VK_FORMAT_R16G16_UNORM:
1629 case VK_FORMAT_R16G16_SNORM:
1630 case VK_FORMAT_R16G16_USCALED:
1631 case VK_FORMAT_R16G16_SSCALED:
1632 case VK_FORMAT_R16G16_UINT:
1633 case VK_FORMAT_R16G16_SINT:
1634 case VK_FORMAT_R16G16_SFLOAT:
1635 case VK_FORMAT_R32G32_UINT:
1636 case VK_FORMAT_R32G32_SINT:
1637 case VK_FORMAT_R32G32_SFLOAT:
1638 case VK_FORMAT_R64G64_UINT:
1639 case VK_FORMAT_R64G64_SINT:
1640 case VK_FORMAT_R64G64_SFLOAT:
1641 case VK_FORMAT_BC5_UNORM_BLOCK:
1642 case VK_FORMAT_BC5_SNORM_BLOCK:
1643 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
1644 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
1645 return 2;
1646 case VK_FORMAT_R5G6B5_UNORM_PACK16:
1647 case VK_FORMAT_B5G6R5_UNORM_PACK16:
1648 case VK_FORMAT_R16G16B16_UNORM:
1649 case VK_FORMAT_R16G16B16_SNORM:
1650 case VK_FORMAT_R16G16B16_USCALED:
1651 case VK_FORMAT_R16G16B16_SSCALED:
1652 case VK_FORMAT_R16G16B16_UINT:
1653 case VK_FORMAT_R16G16B16_SINT:
1654 case VK_FORMAT_R16G16B16_SFLOAT:
1655 case VK_FORMAT_R32G32B32_UINT:
1656 case VK_FORMAT_R32G32B32_SINT:
1657 case VK_FORMAT_R32G32B32_SFLOAT:
1658 case VK_FORMAT_R64G64B64_UINT:
1659 case VK_FORMAT_R64G64B64_SINT:
1660 case VK_FORMAT_R64G64B64_SFLOAT:
1661 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
1662 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
1663 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
1664 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
1665 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
1666 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
1667 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
1668 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
1669 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
1670 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
1671 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
1672 return 3;
1673 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
1674 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
1675 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
1676 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
1677 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
1678 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
1679 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
1680 case VK_FORMAT_R8G8B8A8_UNORM:
1681 case VK_FORMAT_R8G8B8A8_SNORM:
1682 case VK_FORMAT_R8G8B8A8_USCALED:
1683 case VK_FORMAT_R8G8B8A8_SSCALED:
1684 case VK_FORMAT_R8G8B8A8_UINT:
1685 case VK_FORMAT_R8G8B8A8_SINT:
1686 case VK_FORMAT_R8G8B8A8_SRGB:
1687 case VK_FORMAT_B8G8R8A8_UNORM:
1688 case VK_FORMAT_B8G8R8A8_SNORM:
1689 case VK_FORMAT_B8G8R8A8_USCALED:
1690 case VK_FORMAT_B8G8R8A8_SSCALED:
1691 case VK_FORMAT_B8G8R8A8_UINT:
1692 case VK_FORMAT_B8G8R8A8_SINT:
1693 case VK_FORMAT_B8G8R8A8_SRGB:
1694 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
1695 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
1696 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
1697 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
1698 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
1699 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
1700 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
1701 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
1702 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
1703 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
1704 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
1705 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
1706 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
1707 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
1708 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
1709 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
1710 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
1711 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
1712 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
1713 case VK_FORMAT_R16G16B16A16_UNORM:
1714 case VK_FORMAT_R16G16B16A16_SNORM:
1715 case VK_FORMAT_R16G16B16A16_USCALED:
1716 case VK_FORMAT_R16G16B16A16_SSCALED:
1717 case VK_FORMAT_R16G16B16A16_UINT:
1718 case VK_FORMAT_R16G16B16A16_SINT:
1719 case VK_FORMAT_R16G16B16A16_SFLOAT:
1720 case VK_FORMAT_R32G32B32A32_UINT:
1721 case VK_FORMAT_R32G32B32A32_SINT:
1722 case VK_FORMAT_R32G32B32A32_SFLOAT:
1723 case VK_FORMAT_R64G64B64A64_UINT:
1724 case VK_FORMAT_R64G64B64A64_SINT:
1725 case VK_FORMAT_R64G64B64A64_SFLOAT:
1726 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
1727 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
1728 case VK_FORMAT_BC2_UNORM_BLOCK:
1729 case VK_FORMAT_BC2_SRGB_BLOCK:
1730 case VK_FORMAT_BC3_UNORM_BLOCK:
1731 case VK_FORMAT_BC3_SRGB_BLOCK:
1732 case VK_FORMAT_BC7_UNORM_BLOCK:
1733 case VK_FORMAT_BC7_SRGB_BLOCK:
1734 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
1735 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
1736 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
1737 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
1738 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
1739 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
1740 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
1741 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
1742 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
1743 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
1744 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
1745 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
1746 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
1747 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
1748 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
1749 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
1750 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
1751 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
1752 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
1753 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
1754 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
1755 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
1756 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
1757 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
1758 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
1759 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
1760 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
1761 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
1762 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
1763 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
1764 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
1765 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
1766 return 4;
1767 default:
1768 UNSUPPORTED("Format: %d", int(format));
1769 }
1770
1771 return 1;
1772 }
1773
isUnsigned() const1774 bool Format::isUnsigned() const
1775 {
1776 // TODO(b/203068380): create a proper check for signedness
1777 return isUnsignedComponent(0);
1778 }
1779
isUnsignedComponent(int component) const1780 bool Format::isUnsignedComponent(int component) const
1781 {
1782 switch(format)
1783 {
1784 case VK_FORMAT_UNDEFINED:
1785 case VK_FORMAT_R4G4_UNORM_PACK8:
1786 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
1787 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
1788 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
1789 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
1790 case VK_FORMAT_R5G6B5_UNORM_PACK16:
1791 case VK_FORMAT_B5G6R5_UNORM_PACK16:
1792 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
1793 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
1794 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
1795 case VK_FORMAT_R8_UNORM:
1796 case VK_FORMAT_R8_UINT:
1797 case VK_FORMAT_R8_SRGB:
1798 case VK_FORMAT_R8G8_UNORM:
1799 case VK_FORMAT_R8G8_USCALED:
1800 case VK_FORMAT_R8G8_UINT:
1801 case VK_FORMAT_R8G8_SRGB:
1802 case VK_FORMAT_R8G8B8A8_UNORM:
1803 case VK_FORMAT_R8G8B8A8_USCALED:
1804 case VK_FORMAT_R8G8B8A8_UINT:
1805 case VK_FORMAT_R8G8B8A8_SRGB:
1806 case VK_FORMAT_B8G8R8A8_UNORM:
1807 case VK_FORMAT_B8G8R8A8_USCALED:
1808 case VK_FORMAT_B8G8R8A8_UINT:
1809 case VK_FORMAT_B8G8R8A8_SRGB:
1810 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
1811 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
1812 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
1813 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
1814 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
1815 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
1816 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
1817 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
1818 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
1819 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
1820 case VK_FORMAT_R16_UNORM:
1821 case VK_FORMAT_R16_USCALED:
1822 case VK_FORMAT_R16_UINT:
1823 case VK_FORMAT_R16G16_UNORM:
1824 case VK_FORMAT_R16G16_USCALED:
1825 case VK_FORMAT_R16G16_UINT:
1826 case VK_FORMAT_R16G16B16_UNORM:
1827 case VK_FORMAT_R16G16B16_USCALED:
1828 case VK_FORMAT_R16G16B16_UINT:
1829 case VK_FORMAT_R16G16B16A16_UNORM:
1830 case VK_FORMAT_R16G16B16A16_USCALED:
1831 case VK_FORMAT_R16G16B16A16_UINT:
1832 case VK_FORMAT_R32_UINT:
1833 case VK_FORMAT_R32G32_UINT:
1834 case VK_FORMAT_R32G32B32_UINT:
1835 case VK_FORMAT_R32G32B32A32_UINT:
1836 case VK_FORMAT_R64_UINT:
1837 case VK_FORMAT_R64G64_UINT:
1838 case VK_FORMAT_R64G64B64_UINT:
1839 case VK_FORMAT_R64G64B64A64_UINT:
1840 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
1841 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
1842 case VK_FORMAT_D16_UNORM:
1843 case VK_FORMAT_X8_D24_UNORM_PACK32:
1844 case VK_FORMAT_S8_UINT:
1845 case VK_FORMAT_D16_UNORM_S8_UINT:
1846 case VK_FORMAT_D24_UNORM_S8_UINT:
1847 case VK_FORMAT_D32_SFLOAT:
1848 case VK_FORMAT_D32_SFLOAT_S8_UINT:
1849 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
1850 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
1851 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
1852 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
1853 case VK_FORMAT_BC2_UNORM_BLOCK:
1854 case VK_FORMAT_BC2_SRGB_BLOCK:
1855 case VK_FORMAT_BC3_UNORM_BLOCK:
1856 case VK_FORMAT_BC3_SRGB_BLOCK:
1857 case VK_FORMAT_BC4_UNORM_BLOCK:
1858 case VK_FORMAT_BC5_UNORM_BLOCK:
1859 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
1860 case VK_FORMAT_BC7_UNORM_BLOCK:
1861 case VK_FORMAT_BC7_SRGB_BLOCK:
1862 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
1863 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
1864 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
1865 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
1866 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
1867 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
1868 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
1869 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
1870 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
1871 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
1872 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
1873 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
1874 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
1875 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
1876 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
1877 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
1878 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
1879 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
1880 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
1881 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
1882 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
1883 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
1884 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
1885 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
1886 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
1887 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
1888 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
1889 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
1890 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
1891 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
1892 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
1893 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
1894 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
1895 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
1896 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
1897 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
1898 return true;
1899 case VK_FORMAT_R8G8B8A8_SNORM:
1900 case VK_FORMAT_R8G8B8A8_SSCALED:
1901 case VK_FORMAT_R8G8B8A8_SINT:
1902 case VK_FORMAT_B8G8R8A8_SNORM:
1903 case VK_FORMAT_B8G8R8A8_SSCALED:
1904 case VK_FORMAT_B8G8R8A8_SINT:
1905 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
1906 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
1907 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
1908 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
1909 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
1910 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
1911 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
1912 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
1913 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
1914 case VK_FORMAT_R16G16B16A16_SNORM:
1915 case VK_FORMAT_R16G16B16A16_SSCALED:
1916 case VK_FORMAT_R16G16B16A16_SINT:
1917 case VK_FORMAT_R16G16B16A16_SFLOAT:
1918 case VK_FORMAT_R32G32B32A32_SINT:
1919 case VK_FORMAT_R32G32B32A32_SFLOAT:
1920 case VK_FORMAT_R64G64B64A64_SINT:
1921 case VK_FORMAT_R64G64B64A64_SFLOAT:
1922 case VK_FORMAT_BC4_SNORM_BLOCK:
1923 case VK_FORMAT_BC5_SNORM_BLOCK:
1924 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
1925 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
1926 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
1927 // YCbCr formats treated as signed because VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY
1928 // expects chroma components to be in range [-0.5, 0.5]
1929 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
1930 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
1931 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
1932 return false;
1933 case VK_FORMAT_R8_SNORM:
1934 case VK_FORMAT_R8_USCALED:
1935 case VK_FORMAT_R8_SSCALED:
1936 case VK_FORMAT_R8_SINT:
1937 case VK_FORMAT_R16_SNORM:
1938 case VK_FORMAT_R16_SSCALED:
1939 case VK_FORMAT_R16_SINT:
1940 case VK_FORMAT_R16_SFLOAT:
1941 case VK_FORMAT_R32_SINT:
1942 case VK_FORMAT_R32_SFLOAT:
1943 case VK_FORMAT_R64_SINT:
1944 case VK_FORMAT_R64_SFLOAT:
1945 return component >= 1;
1946 case VK_FORMAT_R8G8_SNORM:
1947 case VK_FORMAT_R8G8_SSCALED:
1948 case VK_FORMAT_R8G8_SINT:
1949 case VK_FORMAT_R16G16_SNORM:
1950 case VK_FORMAT_R16G16_SSCALED:
1951 case VK_FORMAT_R16G16_SINT:
1952 case VK_FORMAT_R16G16_SFLOAT:
1953 case VK_FORMAT_R32G32_SINT:
1954 case VK_FORMAT_R32G32_SFLOAT:
1955 case VK_FORMAT_R64G64_SINT:
1956 case VK_FORMAT_R64G64_SFLOAT:
1957 return component >= 2;
1958 case VK_FORMAT_R16G16B16_SNORM:
1959 case VK_FORMAT_R16G16B16_SSCALED:
1960 case VK_FORMAT_R16G16B16_SINT:
1961 case VK_FORMAT_R16G16B16_SFLOAT:
1962 case VK_FORMAT_R32G32B32_SINT:
1963 case VK_FORMAT_R32G32B32_SFLOAT:
1964 case VK_FORMAT_R64G64B64_SINT:
1965 case VK_FORMAT_R64G64B64_SFLOAT:
1966 return component >= 3;
1967 default:
1968 UNSUPPORTED("Format: %d", int(format));
1969 }
1970
1971 return false;
1972 }
1973
bytes() const1974 size_t Format::bytes() const
1975 {
1976 switch(format)
1977 {
1978 case VK_FORMAT_UNDEFINED:
1979 return 0;
1980 case VK_FORMAT_R4G4_UNORM_PACK8:
1981 return 1;
1982 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
1983 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
1984 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
1985 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
1986 case VK_FORMAT_R5G6B5_UNORM_PACK16:
1987 case VK_FORMAT_B5G6R5_UNORM_PACK16:
1988 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
1989 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
1990 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
1991 return 2;
1992 case VK_FORMAT_R8_UNORM:
1993 case VK_FORMAT_R8_SNORM:
1994 case VK_FORMAT_R8_USCALED:
1995 case VK_FORMAT_R8_SSCALED:
1996 case VK_FORMAT_R8_UINT:
1997 case VK_FORMAT_R8_SINT:
1998 case VK_FORMAT_R8_SRGB:
1999 return 1;
2000 case VK_FORMAT_R8G8_UNORM:
2001 case VK_FORMAT_R8G8_SNORM:
2002 case VK_FORMAT_R8G8_USCALED:
2003 case VK_FORMAT_R8G8_SSCALED:
2004 case VK_FORMAT_R8G8_UINT:
2005 case VK_FORMAT_R8G8_SINT:
2006 case VK_FORMAT_R8G8_SRGB:
2007 case VK_FORMAT_R10X6_UNORM_PACK16:
2008 return 2;
2009 case VK_FORMAT_R8G8B8A8_UNORM:
2010 case VK_FORMAT_R8G8B8A8_SNORM:
2011 case VK_FORMAT_R8G8B8A8_USCALED:
2012 case VK_FORMAT_R8G8B8A8_SSCALED:
2013 case VK_FORMAT_R8G8B8A8_UINT:
2014 case VK_FORMAT_R8G8B8A8_SINT:
2015 case VK_FORMAT_R8G8B8A8_SRGB:
2016 case VK_FORMAT_B8G8R8A8_UNORM:
2017 case VK_FORMAT_B8G8R8A8_SNORM:
2018 case VK_FORMAT_B8G8R8A8_USCALED:
2019 case VK_FORMAT_B8G8R8A8_SSCALED:
2020 case VK_FORMAT_B8G8R8A8_UINT:
2021 case VK_FORMAT_B8G8R8A8_SINT:
2022 case VK_FORMAT_B8G8R8A8_SRGB:
2023 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2024 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
2025 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
2026 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
2027 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
2028 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
2029 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2030 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
2031 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
2032 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
2033 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
2034 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
2035 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
2036 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
2037 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
2038 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
2039 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
2040 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
2041 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
2042 case VK_FORMAT_R10X6G10X6_UNORM_2PACK16:
2043 return 4;
2044 case VK_FORMAT_R16_UNORM:
2045 case VK_FORMAT_R16_SNORM:
2046 case VK_FORMAT_R16_USCALED:
2047 case VK_FORMAT_R16_SSCALED:
2048 case VK_FORMAT_R16_UINT:
2049 case VK_FORMAT_R16_SINT:
2050 case VK_FORMAT_R16_SFLOAT:
2051 return 2;
2052 case VK_FORMAT_R16G16_UNORM:
2053 case VK_FORMAT_R16G16_SNORM:
2054 case VK_FORMAT_R16G16_USCALED:
2055 case VK_FORMAT_R16G16_SSCALED:
2056 case VK_FORMAT_R16G16_UINT:
2057 case VK_FORMAT_R16G16_SINT:
2058 case VK_FORMAT_R16G16_SFLOAT:
2059 return 4;
2060 case VK_FORMAT_R16G16B16_UNORM:
2061 case VK_FORMAT_R16G16B16_SNORM:
2062 case VK_FORMAT_R16G16B16_USCALED:
2063 case VK_FORMAT_R16G16B16_SSCALED:
2064 case VK_FORMAT_R16G16B16_UINT:
2065 case VK_FORMAT_R16G16B16_SINT:
2066 case VK_FORMAT_R16G16B16_SFLOAT:
2067 return 6;
2068 case VK_FORMAT_R16G16B16A16_UNORM:
2069 case VK_FORMAT_R16G16B16A16_SNORM:
2070 case VK_FORMAT_R16G16B16A16_USCALED:
2071 case VK_FORMAT_R16G16B16A16_SSCALED:
2072 case VK_FORMAT_R16G16B16A16_UINT:
2073 case VK_FORMAT_R16G16B16A16_SINT:
2074 case VK_FORMAT_R16G16B16A16_SFLOAT:
2075 return 8;
2076 case VK_FORMAT_R32_UINT:
2077 case VK_FORMAT_R32_SINT:
2078 case VK_FORMAT_R32_SFLOAT:
2079 return 4;
2080 case VK_FORMAT_R32G32_UINT:
2081 case VK_FORMAT_R32G32_SINT:
2082 case VK_FORMAT_R32G32_SFLOAT:
2083 return 8;
2084 case VK_FORMAT_R32G32B32_UINT:
2085 case VK_FORMAT_R32G32B32_SINT:
2086 case VK_FORMAT_R32G32B32_SFLOAT:
2087 return 12;
2088 case VK_FORMAT_R32G32B32A32_UINT:
2089 case VK_FORMAT_R32G32B32A32_SINT:
2090 case VK_FORMAT_R32G32B32A32_SFLOAT:
2091 return 16;
2092 case VK_FORMAT_R64_UINT:
2093 case VK_FORMAT_R64_SINT:
2094 case VK_FORMAT_R64_SFLOAT:
2095 return 8;
2096 case VK_FORMAT_R64G64_UINT:
2097 case VK_FORMAT_R64G64_SINT:
2098 case VK_FORMAT_R64G64_SFLOAT:
2099 return 16;
2100 case VK_FORMAT_R64G64B64_UINT:
2101 case VK_FORMAT_R64G64B64_SINT:
2102 case VK_FORMAT_R64G64B64_SFLOAT:
2103 return 24;
2104 case VK_FORMAT_R64G64B64A64_UINT:
2105 case VK_FORMAT_R64G64B64A64_SINT:
2106 case VK_FORMAT_R64G64B64A64_SFLOAT:
2107 return 32;
2108 case VK_FORMAT_B10G11R11_UFLOAT_PACK32: return 4;
2109 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: return 4;
2110 case VK_FORMAT_D16_UNORM: return 2;
2111 case VK_FORMAT_X8_D24_UNORM_PACK32: return 4;
2112 case VK_FORMAT_D32_SFLOAT: return 4;
2113 case VK_FORMAT_S8_UINT: return 1;
2114 case VK_FORMAT_D16_UNORM_S8_UINT: return 2; // Separate depth and stencil planes // TODO: ASSERT to ensure this is only called per-aspect?
2115 case VK_FORMAT_D24_UNORM_S8_UINT: return 4; // Combined depth and stencil planes // TODO: ASSERT to ensure this is only called per-aspect?
2116 case VK_FORMAT_D32_SFLOAT_S8_UINT:
2117 return 4; // Separate depth and stencil planes // TODO: ASSERT to ensure this is only called per-aspect?
2118 // Note: Compressed formats don't return bytes per pixel,
2119 // since these would be fractional. The returned value
2120 // is bytes per pixel for 1 column, so 2 for 64 bit 4x4
2121 // blocks and 4 for 128 bit 4x4 blocks.
2122 case VK_FORMAT_BC1_RGB_UNORM_BLOCK: return 2;
2123 case VK_FORMAT_BC1_RGB_SRGB_BLOCK: return 2;
2124 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: return 2;
2125 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: return 2;
2126 case VK_FORMAT_BC2_UNORM_BLOCK: return 4;
2127 case VK_FORMAT_BC2_SRGB_BLOCK: return 4;
2128 case VK_FORMAT_BC3_UNORM_BLOCK: return 4;
2129 case VK_FORMAT_BC3_SRGB_BLOCK: return 4;
2130 case VK_FORMAT_BC4_UNORM_BLOCK: return 2;
2131 case VK_FORMAT_BC4_SNORM_BLOCK: return 2;
2132 case VK_FORMAT_BC5_UNORM_BLOCK: return 4;
2133 case VK_FORMAT_BC5_SNORM_BLOCK: return 4;
2134 case VK_FORMAT_BC6H_UFLOAT_BLOCK: return 4;
2135 case VK_FORMAT_BC6H_SFLOAT_BLOCK: return 4;
2136 case VK_FORMAT_BC7_UNORM_BLOCK: return 4;
2137 case VK_FORMAT_BC7_SRGB_BLOCK: return 4;
2138 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: return 2;
2139 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: return 2;
2140 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: return 2;
2141 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: return 2;
2142 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: return 4;
2143 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: return 4;
2144 case VK_FORMAT_EAC_R11_UNORM_BLOCK: return 2;
2145 case VK_FORMAT_EAC_R11_SNORM_BLOCK: return 2;
2146 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: return 4;
2147 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: return 4;
2148 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: return 4;
2149 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: return 4;
2150 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
2151 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
2152 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
2153 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
2154 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
2155 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
2156 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
2157 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
2158 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
2159 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
2160 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
2161 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
2162 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
2163 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
2164 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
2165 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
2166 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
2167 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
2168 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
2169 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
2170 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
2171 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
2172 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
2173 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
2174 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
2175 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
2176 UNSUPPORTED("format: %d", int(format));
2177 return 0;
2178 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
2179 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
2180 // TODO: ASSERT to ensure this is only called per-aspect?
2181 return 1; // Y plane only
2182 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
2183 // TODO: ASSERT to ensure this is only called per-aspect?
2184 return 2; // Y plane only
2185 default:
2186 UNSUPPORTED("Format: %d", int(format));
2187 }
2188
2189 return 0;
2190 }
2191
pitchB(int width,int border) const2192 size_t Format::pitchB(int width, int border) const
2193 {
2194 // Render targets require 2x2 quads
2195 width = sw::align<2>(width + 2 * border);
2196
2197 switch(format)
2198 {
2199 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
2200 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
2201 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
2202 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
2203 case VK_FORMAT_BC4_UNORM_BLOCK:
2204 case VK_FORMAT_BC4_SNORM_BLOCK:
2205 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
2206 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
2207 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
2208 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
2209 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
2210 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
2211 return 8 * ((width + 3) / 4); // 64 bit per 4x4 block, computed per 4 rows
2212 case VK_FORMAT_BC2_UNORM_BLOCK:
2213 case VK_FORMAT_BC2_SRGB_BLOCK:
2214 case VK_FORMAT_BC3_UNORM_BLOCK:
2215 case VK_FORMAT_BC3_SRGB_BLOCK:
2216 case VK_FORMAT_BC5_UNORM_BLOCK:
2217 case VK_FORMAT_BC5_SNORM_BLOCK:
2218 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
2219 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
2220 case VK_FORMAT_BC7_UNORM_BLOCK:
2221 case VK_FORMAT_BC7_SRGB_BLOCK:
2222 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
2223 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
2224 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
2225 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
2226 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
2227 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
2228 return 16 * ((width + 3) / 4); // 128 bit per 4x4 block, computed per 4 rows
2229 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
2230 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
2231 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
2232 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
2233 return 16 * ((width + 4) / 5);
2234 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
2235 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
2236 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
2237 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
2238 return 16 * ((width + 5) / 6);
2239 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
2240 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
2241 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
2242 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
2243 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
2244 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
2245 return 16 * ((width + 7) / 8);
2246 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
2247 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
2248 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
2249 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
2250 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
2251 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
2252 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
2253 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
2254 return 16 * ((width + 9) / 10);
2255 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
2256 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
2257 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
2258 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
2259 return 16 * ((width + 11) / 12);
2260 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
2261 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
2262 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
2263 return sw::align<16>(width); // Y plane only // TODO: ASSERT to ensure this is only called per-aspect?
2264 default:
2265 return bytes() * width;
2266 }
2267 }
2268
sliceBUnpadded(int width,int height,int border) const2269 size_t Format::sliceBUnpadded(int width, int height, int border) const
2270 {
2271 // Render targets require 2x2 quads
2272 height = sw::align<2>(height + 2 * border);
2273
2274 switch(format)
2275 {
2276 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
2277 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
2278 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
2279 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
2280 case VK_FORMAT_BC2_UNORM_BLOCK:
2281 case VK_FORMAT_BC2_SRGB_BLOCK:
2282 case VK_FORMAT_BC3_UNORM_BLOCK:
2283 case VK_FORMAT_BC3_SRGB_BLOCK:
2284 case VK_FORMAT_BC4_UNORM_BLOCK:
2285 case VK_FORMAT_BC4_SNORM_BLOCK:
2286 case VK_FORMAT_BC5_UNORM_BLOCK:
2287 case VK_FORMAT_BC5_SNORM_BLOCK:
2288 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
2289 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
2290 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
2291 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
2292 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
2293 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
2294 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
2295 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
2296 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
2297 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
2298 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
2299 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
2300 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
2301 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
2302 return pitchB(width, border) * ((height + 3) / 4); // Pitch computed per 4 rows
2303 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
2304 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
2305 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
2306 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
2307 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
2308 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
2309 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
2310 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
2311 return pitchB(width, border) * ((height + 4) / 5); // Pitch computed per 5 rows
2312 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
2313 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
2314 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
2315 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
2316 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
2317 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
2318 return pitchB(width, border) * ((height + 5) / 6); // Pitch computed per 6 rows
2319 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
2320 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
2321 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
2322 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
2323 return pitchB(width, border) * ((height + 7) / 8); // Pitch computed per 8 rows
2324 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
2325 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
2326 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
2327 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
2328 return pitchB(width, border) * ((height + 9) / 10); // Pitch computed per 10 rows
2329 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
2330 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
2331 return pitchB(width, border) * ((height + 11) / 12); // Pitch computed per 12 rows
2332 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
2333 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
2334 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
2335 // "Images in this format must be defined with a width and height that is a multiple of two."
2336 return pitchB(width, border) * (height + height / 2); // U and V planes are 1/4 size of Y plane.
2337 default:
2338 return pitchB(width, border) * height; // Pitch computed per row
2339 }
2340 }
2341
sliceB(int width,int height,int border) const2342 size_t Format::sliceB(int width, int height, int border) const
2343 {
2344 return sw::align<16>(sliceBUnpadded(width, height, border));
2345 }
2346
getScale() const2347 sw::float4 Format::getScale() const
2348 {
2349 switch(format)
2350 {
2351 case VK_FORMAT_R4G4_UNORM_PACK8:
2352 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
2353 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
2354 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
2355 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
2356 return sw::float4(0xF, 0xF, 0xF, 0xF);
2357 case VK_FORMAT_R8_UNORM:
2358 case VK_FORMAT_R8G8_UNORM:
2359 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2360 case VK_FORMAT_R8G8B8A8_UNORM:
2361 case VK_FORMAT_B8G8R8A8_UNORM:
2362 case VK_FORMAT_R8_SRGB:
2363 case VK_FORMAT_R8G8_SRGB:
2364 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2365 case VK_FORMAT_R8G8B8A8_SRGB:
2366 case VK_FORMAT_B8G8R8A8_SRGB:
2367 return sw::float4(0xFF, 0xFF, 0xFF, 0xFF);
2368 case VK_FORMAT_R8_SNORM:
2369 case VK_FORMAT_R8G8_SNORM:
2370 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
2371 case VK_FORMAT_R8G8B8A8_SNORM:
2372 case VK_FORMAT_B8G8R8A8_SNORM:
2373 return sw::float4(0x7F, 0x7F, 0x7F, 0x7F);
2374 case VK_FORMAT_R16_UNORM:
2375 case VK_FORMAT_R16G16_UNORM:
2376 case VK_FORMAT_R16G16B16_UNORM:
2377 case VK_FORMAT_R16G16B16A16_UNORM:
2378 return sw::float4(0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF);
2379 case VK_FORMAT_R16_SNORM:
2380 case VK_FORMAT_R16G16_SNORM:
2381 case VK_FORMAT_R16G16B16_SNORM:
2382 case VK_FORMAT_R16G16B16A16_SNORM:
2383 return sw::float4(0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF);
2384 case VK_FORMAT_R8_SINT:
2385 case VK_FORMAT_R8_UINT:
2386 case VK_FORMAT_R8G8_SINT:
2387 case VK_FORMAT_R8G8_UINT:
2388 case VK_FORMAT_R8G8B8A8_SINT:
2389 case VK_FORMAT_R8G8B8A8_UINT:
2390 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
2391 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
2392 case VK_FORMAT_B8G8R8A8_SINT:
2393 case VK_FORMAT_B8G8R8A8_UINT:
2394 case VK_FORMAT_R8_USCALED:
2395 case VK_FORMAT_R8G8_USCALED:
2396 case VK_FORMAT_R8G8B8A8_USCALED:
2397 case VK_FORMAT_B8G8R8A8_USCALED:
2398 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
2399 case VK_FORMAT_R8_SSCALED:
2400 case VK_FORMAT_R8G8_SSCALED:
2401 case VK_FORMAT_R8G8B8A8_SSCALED:
2402 case VK_FORMAT_B8G8R8A8_SSCALED:
2403 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
2404 case VK_FORMAT_R16_SINT:
2405 case VK_FORMAT_R16_UINT:
2406 case VK_FORMAT_R16G16_SINT:
2407 case VK_FORMAT_R16G16_UINT:
2408 case VK_FORMAT_R16G16B16A16_SINT:
2409 case VK_FORMAT_R16G16B16A16_UINT:
2410 case VK_FORMAT_R16_SSCALED:
2411 case VK_FORMAT_R16G16_SSCALED:
2412 case VK_FORMAT_R16G16B16_SSCALED:
2413 case VK_FORMAT_R16G16B16A16_SSCALED:
2414 case VK_FORMAT_R16_USCALED:
2415 case VK_FORMAT_R16G16_USCALED:
2416 case VK_FORMAT_R16G16B16_USCALED:
2417 case VK_FORMAT_R16G16B16A16_USCALED:
2418 case VK_FORMAT_R32_SINT:
2419 case VK_FORMAT_R32_UINT:
2420 case VK_FORMAT_R32G32_SINT:
2421 case VK_FORMAT_R32G32_UINT:
2422 case VK_FORMAT_R32G32B32_SINT:
2423 case VK_FORMAT_R32G32B32_UINT:
2424 case VK_FORMAT_R32G32B32A32_SINT:
2425 case VK_FORMAT_R32G32B32A32_UINT:
2426 case VK_FORMAT_R32G32B32A32_SFLOAT:
2427 case VK_FORMAT_R32G32B32_SFLOAT:
2428 case VK_FORMAT_R32G32_SFLOAT:
2429 case VK_FORMAT_R32_SFLOAT:
2430 case VK_FORMAT_R16G16B16A16_SFLOAT:
2431 case VK_FORMAT_R16G16B16_SFLOAT:
2432 case VK_FORMAT_R16G16_SFLOAT:
2433 case VK_FORMAT_R16_SFLOAT:
2434 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
2435 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
2436 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
2437 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
2438 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
2439 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
2440 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
2441 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
2442 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
2443 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
2444 return sw::float4(1.0f, 1.0f, 1.0f, 1.0f);
2445 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
2446 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
2447 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
2448 return sw::float4(0x1F, 0x1F, 0x1F, 0x01);
2449 case VK_FORMAT_R5G6B5_UNORM_PACK16:
2450 case VK_FORMAT_B5G6R5_UNORM_PACK16:
2451 return sw::float4(0x1F, 0x3F, 0x1F, 1.0f);
2452 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
2453 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
2454 return sw::float4(0x3FF, 0x3FF, 0x3FF, 0x03);
2455 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
2456 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
2457 return sw::float4(0x1FF, 0x1FF, 0x1FF, 0x01);
2458 case VK_FORMAT_D16_UNORM:
2459 return sw::float4(0xFFFF, 0.0f, 0.0f, 0.0f);
2460 case VK_FORMAT_D24_UNORM_S8_UINT:
2461 case VK_FORMAT_X8_D24_UNORM_PACK32:
2462 return sw::float4(0xFFFFFF, 0.0f, 0.0f, 0.0f);
2463 case VK_FORMAT_D32_SFLOAT:
2464 case VK_FORMAT_D32_SFLOAT_S8_UINT:
2465 case VK_FORMAT_S8_UINT:
2466 return sw::float4(1.0f, 1.0f, 1.0f, 1.0f);
2467 default:
2468 UNSUPPORTED("format %d", int(format));
2469 break;
2470 }
2471
2472 return sw::float4(1.0f, 1.0f, 1.0f, 1.0f);
2473 }
2474
bitsPerComponent() const2475 sw::int4 Format::bitsPerComponent() const
2476 {
2477 switch(format)
2478 {
2479 case VK_FORMAT_R4G4_UNORM_PACK8:
2480 return sw::int4(4, 4, 0, 0);
2481 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
2482 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
2483 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
2484 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
2485 return sw::int4(4, 4, 4, 4);
2486 case VK_FORMAT_R8_UNORM:
2487 case VK_FORMAT_R8_SNORM:
2488 case VK_FORMAT_R8_SRGB:
2489 case VK_FORMAT_R8_SINT:
2490 case VK_FORMAT_R8_UINT:
2491 case VK_FORMAT_R8_USCALED:
2492 case VK_FORMAT_R8_SSCALED:
2493 case VK_FORMAT_S8_UINT:
2494 return sw::int4(8, 0, 0, 0);
2495 case VK_FORMAT_R8G8_SRGB:
2496 case VK_FORMAT_R8G8_UNORM:
2497 case VK_FORMAT_R8G8_SNORM:
2498 case VK_FORMAT_R8G8_SINT:
2499 case VK_FORMAT_R8G8_UINT:
2500 case VK_FORMAT_R8G8_USCALED:
2501 case VK_FORMAT_R8G8_SSCALED:
2502 return sw::int4(8, 8, 0, 0);
2503 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2504 case VK_FORMAT_R8G8B8A8_UNORM:
2505 case VK_FORMAT_B8G8R8A8_UNORM:
2506 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2507 case VK_FORMAT_R8G8B8A8_SRGB:
2508 case VK_FORMAT_B8G8R8A8_SRGB:
2509 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
2510 case VK_FORMAT_R8G8B8A8_SNORM:
2511 case VK_FORMAT_B8G8R8A8_SNORM:
2512 case VK_FORMAT_R8G8B8A8_SINT:
2513 case VK_FORMAT_R8G8B8A8_UINT:
2514 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
2515 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
2516 case VK_FORMAT_B8G8R8A8_SINT:
2517 case VK_FORMAT_B8G8R8A8_UINT:
2518 case VK_FORMAT_R8G8B8A8_USCALED:
2519 case VK_FORMAT_B8G8R8A8_USCALED:
2520 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
2521 case VK_FORMAT_R8G8B8A8_SSCALED:
2522 case VK_FORMAT_B8G8R8A8_SSCALED:
2523 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
2524 return sw::int4(8, 8, 8, 8);
2525 case VK_FORMAT_R16_UNORM:
2526 case VK_FORMAT_R16_SNORM:
2527 case VK_FORMAT_R16_SINT:
2528 case VK_FORMAT_R16_UINT:
2529 case VK_FORMAT_R16_SSCALED:
2530 case VK_FORMAT_R16_USCALED:
2531 case VK_FORMAT_R16_SFLOAT:
2532 case VK_FORMAT_D16_UNORM:
2533 return sw::int4(16, 0, 0, 0);
2534 case VK_FORMAT_R16G16_UNORM:
2535 case VK_FORMAT_R16G16_SNORM:
2536 case VK_FORMAT_R16G16_SINT:
2537 case VK_FORMAT_R16G16_UINT:
2538 case VK_FORMAT_R16G16_SSCALED:
2539 case VK_FORMAT_R16G16_USCALED:
2540 case VK_FORMAT_R16G16_SFLOAT:
2541 return sw::int4(16, 16, 0, 0);
2542 case VK_FORMAT_R16G16B16_UNORM:
2543 case VK_FORMAT_R16G16B16_SNORM:
2544 case VK_FORMAT_R16G16B16_SSCALED:
2545 case VK_FORMAT_R16G16B16_USCALED:
2546 case VK_FORMAT_R16G16B16_SFLOAT:
2547 return sw::int4(16, 16, 16, 0);
2548 case VK_FORMAT_R16G16B16A16_UNORM:
2549 case VK_FORMAT_R16G16B16A16_SNORM:
2550 case VK_FORMAT_R16G16B16A16_SINT:
2551 case VK_FORMAT_R16G16B16A16_UINT:
2552 case VK_FORMAT_R16G16B16A16_SSCALED:
2553 case VK_FORMAT_R16G16B16A16_USCALED:
2554 case VK_FORMAT_R16G16B16A16_SFLOAT:
2555 return sw::int4(16, 16, 16, 16);
2556 case VK_FORMAT_D24_UNORM_S8_UINT:
2557 case VK_FORMAT_X8_D24_UNORM_PACK32:
2558 return sw::int4(24, 0, 0, 0);
2559 case VK_FORMAT_R32_SINT:
2560 case VK_FORMAT_R32_UINT:
2561 case VK_FORMAT_R32_SFLOAT:
2562 case VK_FORMAT_D32_SFLOAT:
2563 case VK_FORMAT_D32_SFLOAT_S8_UINT:
2564 return sw::int4(32, 0, 0, 0);
2565 case VK_FORMAT_R32G32_SINT:
2566 case VK_FORMAT_R32G32_UINT:
2567 case VK_FORMAT_R32G32_SFLOAT:
2568 return sw::int4(32, 32, 0, 0);
2569 case VK_FORMAT_R32G32B32_SINT:
2570 case VK_FORMAT_R32G32B32_UINT:
2571 case VK_FORMAT_R32G32B32_SFLOAT:
2572 return sw::int4(32, 32, 32, 0);
2573 case VK_FORMAT_R32G32B32A32_SINT:
2574 case VK_FORMAT_R32G32B32A32_UINT:
2575 case VK_FORMAT_R32G32B32A32_SFLOAT:
2576 return sw::int4(32, 32, 32, 32);
2577 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
2578 return sw::int4(11, 11, 10, 0);
2579 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
2580 return sw::int4(9, 9, 9, 0);
2581 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
2582 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
2583 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
2584 return sw::int4(5, 5, 5, 1);
2585 case VK_FORMAT_R5G6B5_UNORM_PACK16:
2586 case VK_FORMAT_B5G6R5_UNORM_PACK16:
2587 return sw::int4(5, 6, 5, 0);
2588 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
2589 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
2590 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
2591 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
2592 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
2593 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
2594 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
2595 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
2596 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
2597 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
2598 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
2599 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
2600 return sw::int4(10, 10, 10, 2);
2601 default:
2602 UNSUPPORTED("format %d", int(format));
2603 break;
2604 }
2605
2606 return sw::int4(0, 0, 0, 0);
2607 }
2608
supportsColorAttachmentBlend() const2609 bool Format::supportsColorAttachmentBlend() const
2610 {
2611 switch(format)
2612 {
2613 // Vulkan 1.1 mandatory
2614 case VK_FORMAT_R5G6B5_UNORM_PACK16:
2615 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
2616 case VK_FORMAT_R8_UNORM:
2617 case VK_FORMAT_R8G8_UNORM:
2618 case VK_FORMAT_R8G8B8A8_UNORM:
2619 case VK_FORMAT_R8G8B8A8_SRGB:
2620 case VK_FORMAT_B8G8R8A8_UNORM:
2621 case VK_FORMAT_B8G8R8A8_SRGB:
2622 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2623 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2624 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
2625 case VK_FORMAT_R16_SFLOAT:
2626 case VK_FORMAT_R16G16_SFLOAT:
2627 case VK_FORMAT_R16G16B16A16_SFLOAT:
2628 // Optional
2629 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
2630 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
2631 case VK_FORMAT_B5G6R5_UNORM_PACK16:
2632 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
2633 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
2634 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
2635 case VK_FORMAT_R16_UNORM:
2636 case VK_FORMAT_R16G16_UNORM:
2637 case VK_FORMAT_R16G16B16A16_UNORM:
2638 case VK_FORMAT_R32_SFLOAT:
2639 case VK_FORMAT_R32G32_SFLOAT:
2640 case VK_FORMAT_R32G32B32A32_SFLOAT:
2641 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
2642 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
2643 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
2644 return true;
2645 default:
2646 return false;
2647 }
2648 }
2649
has16bitPackedTextureFormat() const2650 bool Format::has16bitPackedTextureFormat() const
2651 {
2652 if(bytes() != 2)
2653 {
2654 return false;
2655 }
2656
2657 switch(format)
2658 {
2659 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
2660 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
2661 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
2662 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
2663 case VK_FORMAT_R5G6B5_UNORM_PACK16:
2664 case VK_FORMAT_B5G6R5_UNORM_PACK16:
2665 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
2666 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
2667 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
2668 return true;
2669 case VK_FORMAT_R8G8_SINT:
2670 case VK_FORMAT_R8G8_UINT:
2671 case VK_FORMAT_R8G8_UNORM:
2672 case VK_FORMAT_R8G8_SNORM:
2673 case VK_FORMAT_R8G8_SRGB:
2674 case VK_FORMAT_R16_UNORM:
2675 case VK_FORMAT_R16_SNORM:
2676 case VK_FORMAT_R16_SINT:
2677 case VK_FORMAT_R16_UINT:
2678 case VK_FORMAT_R16_SFLOAT:
2679 case VK_FORMAT_D16_UNORM:
2680 return false;
2681 default:
2682 UNSUPPORTED("Format: %d", int(format));
2683 }
2684
2685 return false;
2686 }
2687
has8bitTextureComponents() const2688 bool Format::has8bitTextureComponents() const
2689 {
2690 switch(format)
2691 {
2692 case VK_FORMAT_R8_UNORM:
2693 case VK_FORMAT_R8_SNORM:
2694 case VK_FORMAT_R8_UINT:
2695 case VK_FORMAT_R8_SINT:
2696 case VK_FORMAT_R8_SRGB:
2697 case VK_FORMAT_R8G8_UNORM:
2698 case VK_FORMAT_R8G8_SNORM:
2699 case VK_FORMAT_R8G8_UINT:
2700 case VK_FORMAT_R8G8_SINT:
2701 case VK_FORMAT_R8G8_SRGB:
2702 case VK_FORMAT_R8G8B8A8_UNORM:
2703 case VK_FORMAT_R8G8B8A8_SNORM:
2704 case VK_FORMAT_R8G8B8A8_UINT:
2705 case VK_FORMAT_R8G8B8A8_SINT:
2706 case VK_FORMAT_R8G8B8A8_SRGB:
2707 case VK_FORMAT_B8G8R8A8_UNORM:
2708 case VK_FORMAT_B8G8R8A8_SNORM:
2709 case VK_FORMAT_B8G8R8A8_UINT:
2710 case VK_FORMAT_B8G8R8A8_SINT:
2711 case VK_FORMAT_B8G8R8A8_SRGB:
2712 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2713 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
2714 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
2715 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
2716 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2717 case VK_FORMAT_S8_UINT:
2718 return true;
2719 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
2720 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
2721 case VK_FORMAT_R5G6B5_UNORM_PACK16:
2722 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
2723 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
2724 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
2725 case VK_FORMAT_B5G6R5_UNORM_PACK16:
2726 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
2727 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
2728 case VK_FORMAT_R32_SFLOAT:
2729 case VK_FORMAT_R32G32_SFLOAT:
2730 case VK_FORMAT_R32G32B32A32_SFLOAT:
2731 case VK_FORMAT_R16_UNORM:
2732 case VK_FORMAT_R16_SNORM:
2733 case VK_FORMAT_R16G16_UNORM:
2734 case VK_FORMAT_R16G16_SNORM:
2735 case VK_FORMAT_R16G16B16A16_UNORM:
2736 case VK_FORMAT_R16G16B16A16_SNORM:
2737 case VK_FORMAT_R32_SINT:
2738 case VK_FORMAT_R32_UINT:
2739 case VK_FORMAT_R32G32_SINT:
2740 case VK_FORMAT_R32G32_UINT:
2741 case VK_FORMAT_R32G32B32A32_SINT:
2742 case VK_FORMAT_R32G32B32A32_UINT:
2743 case VK_FORMAT_R16_SINT:
2744 case VK_FORMAT_R16_UINT:
2745 case VK_FORMAT_R16_SFLOAT:
2746 case VK_FORMAT_R16G16_SINT:
2747 case VK_FORMAT_R16G16_UINT:
2748 case VK_FORMAT_R16G16_SFLOAT:
2749 case VK_FORMAT_R16G16B16A16_SINT:
2750 case VK_FORMAT_R16G16B16A16_UINT:
2751 case VK_FORMAT_R16G16B16A16_SFLOAT:
2752 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
2753 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
2754 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
2755 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
2756 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
2757 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
2758 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
2759 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
2760 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
2761 case VK_FORMAT_D16_UNORM:
2762 return false;
2763 default:
2764 UNSUPPORTED("Format: %d", int(format));
2765 }
2766
2767 return false;
2768 }
2769
has16bitTextureComponents() const2770 bool Format::has16bitTextureComponents() const
2771 {
2772 switch(format)
2773 {
2774 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
2775 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
2776 case VK_FORMAT_R5G6B5_UNORM_PACK16:
2777 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
2778 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
2779 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
2780 case VK_FORMAT_B5G6R5_UNORM_PACK16:
2781 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
2782 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
2783 case VK_FORMAT_R8_UNORM:
2784 case VK_FORMAT_R8_SNORM:
2785 case VK_FORMAT_R8_UINT:
2786 case VK_FORMAT_R8_SINT:
2787 case VK_FORMAT_R8_SRGB:
2788 case VK_FORMAT_R8G8_UNORM:
2789 case VK_FORMAT_R8G8_SNORM:
2790 case VK_FORMAT_R8G8_UINT:
2791 case VK_FORMAT_R8G8_SINT:
2792 case VK_FORMAT_R8G8_SRGB:
2793 case VK_FORMAT_R8G8B8A8_UNORM:
2794 case VK_FORMAT_R8G8B8A8_SNORM:
2795 case VK_FORMAT_R8G8B8A8_UINT:
2796 case VK_FORMAT_R8G8B8A8_SINT:
2797 case VK_FORMAT_R8G8B8A8_SRGB:
2798 case VK_FORMAT_B8G8R8A8_UNORM:
2799 case VK_FORMAT_B8G8R8A8_SNORM:
2800 case VK_FORMAT_B8G8R8A8_UINT:
2801 case VK_FORMAT_B8G8R8A8_SINT:
2802 case VK_FORMAT_B8G8R8A8_SRGB:
2803 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2804 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
2805 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
2806 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
2807 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2808 case VK_FORMAT_R32_UINT:
2809 case VK_FORMAT_R32_SINT:
2810 case VK_FORMAT_R32_SFLOAT:
2811 case VK_FORMAT_R32G32_UINT:
2812 case VK_FORMAT_R32G32_SINT:
2813 case VK_FORMAT_R32G32_SFLOAT:
2814 case VK_FORMAT_R32G32B32A32_UINT:
2815 case VK_FORMAT_R32G32B32A32_SINT:
2816 case VK_FORMAT_R32G32B32A32_SFLOAT:
2817 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
2818 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
2819 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
2820 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
2821 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
2822 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
2823 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
2824 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
2825 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
2826 case VK_FORMAT_S8_UINT:
2827 return false;
2828 case VK_FORMAT_R16_UNORM:
2829 case VK_FORMAT_R16_SNORM:
2830 case VK_FORMAT_R16_UINT:
2831 case VK_FORMAT_R16_SINT:
2832 case VK_FORMAT_R16_SFLOAT:
2833 case VK_FORMAT_R16G16_UNORM:
2834 case VK_FORMAT_R16G16_SNORM:
2835 case VK_FORMAT_R16G16_UINT:
2836 case VK_FORMAT_R16G16_SINT:
2837 case VK_FORMAT_R16G16_SFLOAT:
2838 case VK_FORMAT_R16G16B16A16_UNORM:
2839 case VK_FORMAT_R16G16B16A16_SNORM:
2840 case VK_FORMAT_R16G16B16A16_UINT:
2841 case VK_FORMAT_R16G16B16A16_SINT:
2842 case VK_FORMAT_R16G16B16A16_SFLOAT:
2843 case VK_FORMAT_D16_UNORM:
2844 return true;
2845 default:
2846 UNSUPPORTED("Format: %d", int(format));
2847 }
2848
2849 return false;
2850 }
2851
has32bitIntegerTextureComponents() const2852 bool Format::has32bitIntegerTextureComponents() const
2853 {
2854 switch(format)
2855 {
2856 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
2857 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
2858 case VK_FORMAT_R5G6B5_UNORM_PACK16:
2859 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
2860 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
2861 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
2862 case VK_FORMAT_B5G6R5_UNORM_PACK16:
2863 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
2864 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
2865 case VK_FORMAT_R8_UNORM:
2866 case VK_FORMAT_R8_SNORM:
2867 case VK_FORMAT_R8_UINT:
2868 case VK_FORMAT_R8_SINT:
2869 case VK_FORMAT_R8_SRGB:
2870 case VK_FORMAT_R8G8_UNORM:
2871 case VK_FORMAT_R8G8_SNORM:
2872 case VK_FORMAT_R8G8_UINT:
2873 case VK_FORMAT_R8G8_SINT:
2874 case VK_FORMAT_R8G8_SRGB:
2875 case VK_FORMAT_R8G8B8A8_UNORM:
2876 case VK_FORMAT_R8G8B8A8_SNORM:
2877 case VK_FORMAT_R8G8B8A8_UINT:
2878 case VK_FORMAT_R8G8B8A8_SINT:
2879 case VK_FORMAT_R8G8B8A8_SRGB:
2880 case VK_FORMAT_B8G8R8A8_UNORM:
2881 case VK_FORMAT_B8G8R8A8_SNORM:
2882 case VK_FORMAT_B8G8R8A8_UINT:
2883 case VK_FORMAT_B8G8R8A8_SINT:
2884 case VK_FORMAT_B8G8R8A8_SRGB:
2885 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2886 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
2887 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
2888 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
2889 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2890 case VK_FORMAT_R16_UNORM:
2891 case VK_FORMAT_R16_SNORM:
2892 case VK_FORMAT_R16_UINT:
2893 case VK_FORMAT_R16_SINT:
2894 case VK_FORMAT_R16_SFLOAT:
2895 case VK_FORMAT_R16G16_UNORM:
2896 case VK_FORMAT_R16G16_SNORM:
2897 case VK_FORMAT_R16G16_UINT:
2898 case VK_FORMAT_R16G16_SINT:
2899 case VK_FORMAT_R16G16_SFLOAT:
2900 case VK_FORMAT_R16G16B16A16_UNORM:
2901 case VK_FORMAT_R16G16B16A16_SNORM:
2902 case VK_FORMAT_R16G16B16A16_UINT:
2903 case VK_FORMAT_R16G16B16A16_SINT:
2904 case VK_FORMAT_R16G16B16A16_SFLOAT:
2905 case VK_FORMAT_R32_SFLOAT:
2906 case VK_FORMAT_R32G32_SFLOAT:
2907 case VK_FORMAT_R32G32B32A32_SFLOAT:
2908 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
2909 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
2910 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
2911 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
2912 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
2913 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
2914 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
2915 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
2916 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
2917 case VK_FORMAT_D16_UNORM:
2918 case VK_FORMAT_S8_UINT:
2919 return false;
2920 case VK_FORMAT_R32_SINT:
2921 case VK_FORMAT_R32_UINT:
2922 case VK_FORMAT_R32G32_SINT:
2923 case VK_FORMAT_R32G32_UINT:
2924 case VK_FORMAT_R32G32B32A32_SINT:
2925 case VK_FORMAT_R32G32B32A32_UINT:
2926 return true;
2927 default:
2928 UNSUPPORTED("Format: %d", int(format));
2929 }
2930
2931 return false;
2932 }
2933
isRGBComponent(int component) const2934 bool Format::isRGBComponent(int component) const
2935 {
2936 switch(format)
2937 {
2938 case VK_FORMAT_R8_UNORM:
2939 case VK_FORMAT_R8_SNORM:
2940 case VK_FORMAT_R8_UINT:
2941 case VK_FORMAT_R8_SINT:
2942 case VK_FORMAT_R8_SRGB:
2943 case VK_FORMAT_R16_UNORM:
2944 case VK_FORMAT_R16_SNORM:
2945 case VK_FORMAT_R16_UINT:
2946 case VK_FORMAT_R16_SINT:
2947 case VK_FORMAT_R16_SFLOAT:
2948 case VK_FORMAT_R32_UINT:
2949 case VK_FORMAT_R32_SINT:
2950 case VK_FORMAT_R32_SFLOAT:
2951 return component < 1;
2952 case VK_FORMAT_R8G8_UNORM:
2953 case VK_FORMAT_R8G8_SNORM:
2954 case VK_FORMAT_R8G8_UINT:
2955 case VK_FORMAT_R8G8_SINT:
2956 case VK_FORMAT_R8G8_SRGB:
2957 case VK_FORMAT_R16G16_UNORM:
2958 case VK_FORMAT_R16G16_SNORM:
2959 case VK_FORMAT_R16G16_UINT:
2960 case VK_FORMAT_R16G16_SINT:
2961 case VK_FORMAT_R16G16_SFLOAT:
2962 case VK_FORMAT_R32G32_UINT:
2963 case VK_FORMAT_R32G32_SINT:
2964 case VK_FORMAT_R32G32_SFLOAT:
2965 return component < 2;
2966 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
2967 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
2968 case VK_FORMAT_R5G6B5_UNORM_PACK16:
2969 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
2970 case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
2971 case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
2972 case VK_FORMAT_B5G6R5_UNORM_PACK16:
2973 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
2974 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
2975 case VK_FORMAT_R8G8B8A8_UNORM:
2976 case VK_FORMAT_R8G8B8A8_SNORM:
2977 case VK_FORMAT_R8G8B8A8_UINT:
2978 case VK_FORMAT_R8G8B8A8_SINT:
2979 case VK_FORMAT_R8G8B8A8_SRGB:
2980 case VK_FORMAT_B8G8R8A8_UNORM:
2981 case VK_FORMAT_B8G8R8A8_SNORM:
2982 case VK_FORMAT_B8G8R8A8_UINT:
2983 case VK_FORMAT_B8G8R8A8_SINT:
2984 case VK_FORMAT_B8G8R8A8_SRGB:
2985 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2986 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
2987 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
2988 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
2989 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2990 case VK_FORMAT_R16G16B16A16_UNORM:
2991 case VK_FORMAT_R16G16B16A16_SINT:
2992 case VK_FORMAT_R16G16B16A16_UINT:
2993 case VK_FORMAT_R16G16B16A16_SFLOAT:
2994 case VK_FORMAT_R32G32B32A32_SINT:
2995 case VK_FORMAT_R32G32B32A32_UINT:
2996 case VK_FORMAT_R32G32B32A32_SFLOAT:
2997 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
2998 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
2999 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
3000 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
3001 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
3002 return component < 3;
3003 case VK_FORMAT_D32_SFLOAT:
3004 case VK_FORMAT_D16_UNORM:
3005 case VK_FORMAT_S8_UINT:
3006 return false;
3007 default:
3008 UNSUPPORTED("Format: %d", int(format));
3009 }
3010
3011 return false;
3012 }
3013
pack(VkFormat format)3014 static constexpr uint8_t pack(VkFormat format)
3015 {
3016 if(format > VK_FORMAT_A4B4G4R4_UNORM_PACK16)
3017 {
3018 return 0;
3019 }
3020
3021 // 0 - 184 direct mapping
3022 if(format >= 0 && format <= VK_FORMAT_ASTC_12x12_SRGB_BLOCK)
3023 {
3024 return uint8_t(format);
3025 }
3026
3027 // 10001560xx -> 185 - 218
3028 if(format >= VK_FORMAT_G8B8G8R8_422_UNORM && format <= VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM)
3029 {
3030 return uint8_t(format - VK_FORMAT_G8B8G8R8_422_UNORM + 185);
3031 }
3032
3033 // 100005400x -> 219 - 226
3034 if(format >= VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG && format <= VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG)
3035 {
3036 return uint8_t(format - VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG + 219);
3037 }
3038
3039 // 10000660xx -> 227 - 240
3040 if(format >= VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK && format <= VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK)
3041 {
3042 return uint8_t(format - VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK + 227);
3043 }
3044
3045 // 100034000x -> 241 - 242
3046 if(format >= VK_FORMAT_A4R4G4B4_UNORM_PACK16 && format <= VK_FORMAT_A4B4G4R4_UNORM_PACK16)
3047 {
3048 return uint8_t(format - VK_FORMAT_A4R4G4B4_UNORM_PACK16 + 241);
3049 }
3050
3051 return 0;
3052 }
3053
3054 static_assert(pack(VK_FORMAT_UNDEFINED) == 0, "Incorrect VkFormat packed value");
3055 static_assert(pack(VK_FORMAT_ASTC_12x12_SRGB_BLOCK) == 184, "Incorrect VkFormat packed value");
3056 static_assert(pack(VK_FORMAT_G8B8G8R8_422_UNORM) == 185, "Incorrect VkFormat packed value");
3057 static_assert(pack(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM) == 218, "Incorrect VkFormat packed value");
3058 static_assert(pack(VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG) == 219, "Incorrect VkFormat packed value");
3059 static_assert(pack(VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG) == 226, "Incorrect VkFormat packed value");
3060 static_assert(pack(VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK) == 227, "Incorrect VkFormat packed value");
3061 static_assert(pack(VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK) == 240, "Incorrect VkFormat packed value");
3062 static_assert(pack(VK_FORMAT_A4R4G4B4_UNORM_PACK16) == 241, "Incorrect VkFormat packed value");
3063 static_assert(pack(VK_FORMAT_A4B4G4R4_UNORM_PACK16) == 242, "Incorrect VkFormat packed value");
3064
unpack(uint8_t format)3065 static constexpr VkFormat unpack(uint8_t format)
3066 {
3067 // 0 - 184 direct mapping
3068 if(format >= 0 && format <= 184)
3069 {
3070 return static_cast<VkFormat>(format);
3071 }
3072
3073 // 185 - 218 -> 10001560xx
3074 if(format >= 185 && format <= 218)
3075 {
3076 return static_cast<VkFormat>(VK_FORMAT_G8B8G8R8_422_UNORM + (format - 185));
3077 }
3078
3079 // 219 - 226 -> 100005400x
3080 if(format >= 219 && format <= 226)
3081 {
3082 return static_cast<VkFormat>(VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG + (format - 219));
3083 }
3084
3085 // 227 - 240 -> 10000660xx
3086 if(format >= 227 && format <= 240)
3087 {
3088 return static_cast<VkFormat>(VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK + (format - 227));
3089 }
3090
3091 // 241 - 242 -> 100034000x
3092 if(format >= 241 && format <= 242)
3093 {
3094 return static_cast<VkFormat>(VK_FORMAT_A4R4G4B4_UNORM_PACK16 + (format - 241));
3095 }
3096
3097 return VK_FORMAT_UNDEFINED;
3098 }
3099
3100 static_assert(unpack(0) == VK_FORMAT_UNDEFINED, "Incorrect VkFormat unpacked value");
3101 static_assert(unpack(184) == VK_FORMAT_ASTC_12x12_SRGB_BLOCK, "Incorrect VkFormat unpacked value");
3102 static_assert(unpack(185) == VK_FORMAT_G8B8G8R8_422_UNORM, "Incorrect VkFormat unpacked value");
3103 static_assert(unpack(218) == VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, "Incorrect VkFormat unpacked value");
3104 static_assert(unpack(219) == VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, "Incorrect VkFormat unpacked value");
3105 static_assert(unpack(226) == VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, "Incorrect VkFormat unpacked value");
3106 static_assert(unpack(227) == VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK, "Incorrect VkFormat unpacked value");
3107 static_assert(unpack(240) == VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK, "Incorrect VkFormat unpacked value");
3108 static_assert(unpack(241) == VK_FORMAT_A4R4G4B4_UNORM_PACK16, "Incorrect VkFormat unpacked value");
3109 static_assert(unpack(242) == VK_FORMAT_A4B4G4R4_UNORM_PACK16, "Incorrect VkFormat unpacked value");
3110 static_assert(unpack(243) == VK_FORMAT_UNDEFINED, "Incorrect VkFormat unpacked value");
3111
mapTo8bit(VkFormat format)3112 uint8_t Format::mapTo8bit(VkFormat format)
3113 {
3114 ASSERT(format <= VK_FORMAT_A4B4G4R4_UNORM_PACK16);
3115 uint8_t packed = pack(format);
3116 ASSERT_MSG(packed > 0, "Update VkFormat to uint8_t mapping");
3117 return packed;
3118 }
3119
mapFrom8bit(uint8_t format)3120 VkFormat Format::mapFrom8bit(uint8_t format)
3121 {
3122 ASSERT(format <= 242);
3123 VkFormat unpacked = unpack(format);
3124 ASSERT_MSG(unpacked != VK_FORMAT_UNDEFINED, "Update uint8_t to VkFormat mapping");
3125 return unpacked;
3126 }
3127
3128 } // namespace vk
3129