xref: /aosp_15_r20/external/swiftshader/src/Vulkan/VkFormat.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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