1 /*-------------------------------------------------------------------------
5 * Copyright (c) 2015 The Khronos Group Inc.
6 * Copyright (c) 2015 Imagination Technologies Ltd.
7 * Copyright (c) 2015 Google Inc.
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
23 * \brief Utilities for images.
24 *//*--------------------------------------------------------------------*/
26 #include "vkImageUtil.hpp"
27 #include "tcuTextureUtil.hpp"
32 bool isFloatFormat (VkFormat format)
34 return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
37 bool isUnormFormat (VkFormat format)
39 return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
42 bool isSnormFormat (VkFormat format)
44 return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
47 bool isIntFormat (VkFormat format)
49 return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER;
52 bool isUintFormat (VkFormat format)
54 return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
57 bool isDepthStencilFormat (VkFormat format)
59 if (isCompressedFormat(format))
62 const tcu::TextureFormat tcuFormat = mapVkFormat(format);
63 return tcuFormat.order == tcu::TextureFormat::D || tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS;
66 bool isSrgbFormat (VkFormat format)
68 switch (mapVkFormat(format).order)
70 case tcu::TextureFormat::sR:
71 case tcu::TextureFormat::sRG:
72 case tcu::TextureFormat::sRGB:
73 case tcu::TextureFormat::sRGBA:
74 case tcu::TextureFormat::sBGR:
75 case tcu::TextureFormat::sBGRA:
83 bool isCompressedFormat (VkFormat format)
85 // update this mapping if VkFormat changes
86 DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
90 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
91 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
92 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
93 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
94 case VK_FORMAT_BC2_UNORM_BLOCK:
95 case VK_FORMAT_BC2_SRGB_BLOCK:
96 case VK_FORMAT_BC3_UNORM_BLOCK:
97 case VK_FORMAT_BC3_SRGB_BLOCK:
98 case VK_FORMAT_BC4_UNORM_BLOCK:
99 case VK_FORMAT_BC4_SNORM_BLOCK:
100 case VK_FORMAT_BC5_UNORM_BLOCK:
101 case VK_FORMAT_BC5_SNORM_BLOCK:
102 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
103 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
104 case VK_FORMAT_BC7_UNORM_BLOCK:
105 case VK_FORMAT_BC7_SRGB_BLOCK:
106 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
107 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
108 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
109 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
110 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
111 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
112 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
113 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
114 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
115 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
116 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
117 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
118 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
119 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
120 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
121 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
122 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
123 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
124 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
125 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
126 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
127 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
128 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
129 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
130 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
131 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
132 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
133 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
134 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
135 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
136 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
137 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
138 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
139 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
140 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
141 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
142 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
143 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
151 bool isYCbCrFormat (VkFormat format)
155 case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
156 case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
157 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
158 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
159 case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
160 case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
161 case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
162 case VK_FORMAT_R10X6_UNORM_PACK16_KHR:
163 case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR:
164 case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR:
165 case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
166 case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
167 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
168 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
169 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
170 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
171 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
172 case VK_FORMAT_R12X4_UNORM_PACK16_KHR:
173 case VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR:
174 case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR:
175 case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
176 case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
177 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
178 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
179 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
180 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
181 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
182 case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
183 case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
184 case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
185 case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
186 case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
187 case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
188 case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
196 const PlanarFormatDescription& getYCbCrPlanarFormatDescription (VkFormat format)
198 using tcu::TextureFormat;
200 const deUint32 chanR = PlanarFormatDescription::CHANNEL_R;
201 const deUint32 chanG = PlanarFormatDescription::CHANNEL_G;
202 const deUint32 chanB = PlanarFormatDescription::CHANNEL_B;
203 const deUint32 chanA = PlanarFormatDescription::CHANNEL_A;
205 const deUint8 unorm = (deUint8)tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
207 static const PlanarFormatDescription s_formatInfo[] =
209 // VK_FORMAT_G8B8G8R8_422_UNORM_KHR
220 // Plane Type Offs Size Stride
221 { 0, unorm, 24, 8, 4 }, // R
222 { 0, unorm, 0, 8, 2 }, // G
223 { 0, unorm, 8, 8, 4 }, // B
227 // VK_FORMAT_B8G8R8G8_422_UNORM_KHR
238 // Plane Type Offs Size Stride
239 { 0, unorm, 16, 8, 4 }, // R
240 { 0, unorm, 8, 8, 2 }, // G
241 { 0, unorm, 0, 8, 4 }, // B
245 // VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR
256 // Plane Type Offs Size Stride
257 { 2, unorm, 0, 8, 1 }, // R
258 { 0, unorm, 0, 8, 1 }, // G
259 { 1, unorm, 0, 8, 1 }, // B
263 // VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR
274 // Plane Type Offs Size Stride
275 { 1, unorm, 8, 8, 2 }, // R
276 { 0, unorm, 0, 8, 1 }, // G
277 { 1, unorm, 0, 8, 2 }, // B
281 // VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR
292 // Plane Type Offs Size Stride
293 { 2, unorm, 0, 8, 1 }, // R
294 { 0, unorm, 0, 8, 1 }, // G
295 { 1, unorm, 0, 8, 1 }, // B
299 // VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR
310 // Plane Type Offs Size Stride
311 { 1, unorm, 8, 8, 2 }, // R
312 { 0, unorm, 0, 8, 1 }, // G
313 { 1, unorm, 0, 8, 2 }, // B
317 // VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR
328 // Plane Type Offs Size Stride
329 { 2, unorm, 0, 8, 1 }, // R
330 { 0, unorm, 0, 8, 1 }, // G
331 { 1, unorm, 0, 8, 1 }, // B
335 // VK_FORMAT_R10X6_UNORM_PACK16_KHR
346 // Plane Type Offs Size Stride
347 { 0, unorm, 6, 10, 2 }, // R
353 // VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR
364 // Plane Type Offs Size Stride
365 { 0, unorm, 6, 10, 4 }, // R
366 { 0, unorm, 22, 10, 4 }, // G
371 // VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR
374 chanR|chanG|chanB|chanA,
382 // Plane Type Offs Size Stride
383 { 0, unorm, 6, 10, 8 }, // R
384 { 0, unorm, 22, 10, 8 }, // G
385 { 0, unorm, 38, 10, 8 }, // B
386 { 0, unorm, 54, 10, 8 }, // A
389 // VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR
400 // Plane Type Offs Size Stride
401 { 0, unorm, 54, 10, 8 }, // R
402 { 0, unorm, 6, 10, 4 }, // G
403 { 0, unorm, 22, 10, 8 }, // B
407 // VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR
418 // Plane Type Offs Size Stride
419 { 0, unorm, 38, 10, 8 }, // R
420 { 0, unorm, 22, 10, 4 }, // G
421 { 0, unorm, 6, 10, 8 }, // B
425 // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR
436 // Plane Type Offs Size Stride
437 { 2, unorm, 6, 10, 2 }, // R
438 { 0, unorm, 6, 10, 2 }, // G
439 { 1, unorm, 6, 10, 2 }, // B
443 // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR
454 // Plane Type Offs Size Stride
455 { 1, unorm, 22, 10, 4 }, // R
456 { 0, unorm, 6, 10, 2 }, // G
457 { 1, unorm, 6, 10, 4 }, // B
461 // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR
472 // Plane Type Offs Size Stride
473 { 2, unorm, 6, 10, 2 }, // R
474 { 0, unorm, 6, 10, 2 }, // G
475 { 1, unorm, 6, 10, 2 }, // B
479 // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR
490 // Plane Type Offs Size Stride
491 { 1, unorm, 22, 10, 4 }, // R
492 { 0, unorm, 6, 10, 2 }, // G
493 { 1, unorm, 6, 10, 4 }, // B
497 // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR
508 // Plane Type Offs Size Stride
509 { 2, unorm, 6, 10, 2 }, // R
510 { 0, unorm, 6, 10, 2 }, // G
511 { 1, unorm, 6, 10, 2 }, // B
515 // VK_FORMAT_R12X4_UNORM_PACK16_KHR
526 // Plane Type Offs Size Stride
527 { 0, unorm, 4, 12, 2 }, // R
533 // VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR
544 // Plane Type Offs Size Stride
545 { 0, unorm, 4, 12, 4 }, // R
546 { 0, unorm, 20, 12, 4 }, // G
551 // VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR
554 chanR|chanG|chanB|chanA,
562 // Plane Type Offs Size Stride
563 { 0, unorm, 4, 12, 8 }, // R
564 { 0, unorm, 20, 12, 8 }, // G
565 { 0, unorm, 36, 12, 8 }, // B
566 { 0, unorm, 52, 12, 8 }, // A
569 // VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR
580 // Plane Type Offs Size Stride
581 { 0, unorm, 52, 12, 8 }, // R
582 { 0, unorm, 4, 12, 4 }, // G
583 { 0, unorm, 20, 12, 8 }, // B
587 // VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR
598 // Plane Type Offs Size Stride
599 { 0, unorm, 36, 12, 8 }, // R
600 { 0, unorm, 20, 12, 4 }, // G
601 { 0, unorm, 4, 12, 8 }, // B
605 // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR
616 // Plane Type Offs Size Stride
617 { 2, unorm, 4, 12, 2 }, // R
618 { 0, unorm, 4, 12, 2 }, // G
619 { 1, unorm, 4, 12, 2 }, // B
623 // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR
634 // Plane Type Offs Size Stride
635 { 1, unorm, 20, 12, 4 }, // R
636 { 0, unorm, 4, 12, 2 }, // G
637 { 1, unorm, 4, 12, 4 }, // B
641 // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR
652 // Plane Type Offs Size Stride
653 { 2, unorm, 4, 12, 2 }, // R
654 { 0, unorm, 4, 12, 2 }, // G
655 { 1, unorm, 4, 12, 2 }, // B
659 // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR
670 // Plane Type Offs Size Stride
671 { 1, unorm, 20, 12, 4 }, // R
672 { 0, unorm, 4, 12, 2 }, // G
673 { 1, unorm, 4, 12, 4 }, // B
677 // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR
688 // Plane Type Offs Size Stride
689 { 2, unorm, 4, 12, 2 }, // R
690 { 0, unorm, 4, 12, 2 }, // G
691 { 1, unorm, 4, 12, 2 }, // B
695 // VK_FORMAT_G16B16G16R16_422_UNORM_KHR
706 // Plane Type Offs Size Stride
707 { 0, unorm, 48, 16, 8 }, // R
708 { 0, unorm, 0, 16, 4 }, // G
709 { 0, unorm, 16, 16, 8 }, // B
713 // VK_FORMAT_B16G16R16G16_422_UNORM_KHR
724 // Plane Type Offs Size Stride
725 { 0, unorm, 32, 16, 8 }, // R
726 { 0, unorm, 16, 16, 4 }, // G
727 { 0, unorm, 0, 16, 8 }, // B
731 // VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR
742 // Plane Type Offs Size Stride
743 { 2, unorm, 0, 16, 2 }, // R
744 { 0, unorm, 0, 16, 2 }, // G
745 { 1, unorm, 0, 16, 2 }, // B
749 // VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR
760 // Plane Type Offs Size Stride
761 { 1, unorm, 16, 16, 4 }, // R
762 { 0, unorm, 0, 16, 2 }, // G
763 { 1, unorm, 0, 16, 4 }, // B
767 // VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR
778 // Plane Type Offs Size Stride
779 { 2, unorm, 0, 16, 2 }, // R
780 { 0, unorm, 0, 16, 2 }, // G
781 { 1, unorm, 0, 16, 2 }, // B
785 // VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR
796 // Plane Type Offs Size Stride
797 { 1, unorm, 16, 16, 4 }, // R
798 { 0, unorm, 0, 16, 2 }, // G
799 { 1, unorm, 0, 16, 4 }, // B
803 // VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR
814 // Plane Type Offs Size Stride
815 { 2, unorm, 0, 16, 2 }, // R
816 { 0, unorm, 0, 16, 2 }, // G
817 { 1, unorm, 0, 16, 2 }, // B
823 const size_t offset = (size_t)VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
825 DE_ASSERT(de::inBounds<size_t>((size_t)format, offset, offset+(size_t)DE_LENGTH_OF_ARRAY(s_formatInfo)));
827 return s_formatInfo[(size_t)format-offset];
830 PlanarFormatDescription getCorePlanarFormatDescription (VkFormat format)
832 const deUint8 unorm = (deUint8)tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
834 const deUint8 chanR = (deUint8)PlanarFormatDescription::CHANNEL_R;
835 const deUint8 chanG = (deUint8)PlanarFormatDescription::CHANNEL_G;
836 const deUint8 chanB = (deUint8)PlanarFormatDescription::CHANNEL_B;
837 const deUint8 chanA = (deUint8)PlanarFormatDescription::CHANNEL_A;
839 DE_ASSERT(de::inBounds<deUint32>(format, VK_FORMAT_UNDEFINED+1, VK_CORE_FORMAT_LAST));
841 #if (DE_ENDIANNESS != DE_LITTLE_ENDIAN)
842 # error "Big-endian is not supported"
847 case VK_FORMAT_R8_UNORM:
849 const PlanarFormatDescription desc =
860 // Plane Type Offs Size Stride
861 { 0, unorm, 0, 8, 1 }, // R
862 { 0, 0, 0, 0, 0 }, // G
863 { 0, 0, 0, 0, 0 }, // B
864 { 0, 0, 0, 0, 0 } // A
870 case VK_FORMAT_R8G8_UNORM:
872 const PlanarFormatDescription desc =
883 // Plane Type Offs Size Stride
884 { 0, unorm, 0, 8, 2 }, // R
885 { 0, unorm, 8, 8, 2 }, // G
886 { 0, 0, 0, 0, 0 }, // B
887 { 0, 0, 0, 0, 0 } // A
893 case VK_FORMAT_R16_UNORM:
895 const PlanarFormatDescription desc =
906 // Plane Type Offs Size Stride
907 { 0, unorm, 0, 16, 2 }, // R
908 { 0, 0, 0, 0, 0 }, // G
909 { 0, 0, 0, 0, 0 }, // B
910 { 0, 0, 0, 0, 0 } // A
916 case VK_FORMAT_R16G16_UNORM:
918 const PlanarFormatDescription desc =
929 // Plane Type Offs Size Stride
930 { 0, unorm, 0, 16, 4 }, // R
931 { 0, unorm, 16, 16, 4 }, // G
932 { 0, 0, 0, 0, 0 }, // B
933 { 0, 0, 0, 0, 0 } // A
939 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
941 const PlanarFormatDescription desc =
952 // Plane Type Offs Size Stride
953 { 0, unorm, 0, 11, 4 }, // R
954 { 0, unorm, 11, 11, 4 }, // G
955 { 0, unorm, 22, 10, 4 }, // B
956 { 0, 0, 0, 0, 0 } // A
962 case VK_FORMAT_R4G4_UNORM_PACK8:
964 const PlanarFormatDescription desc =
975 // Plane Type Offs Size Stride
976 { 0, unorm, 4, 4, 1 }, // R
977 { 0, unorm, 0, 4, 1 }, // G
978 { 0, 0, 0, 0, 0 }, // B
979 { 0, 0, 0, 0, 0 } // A
985 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
987 const PlanarFormatDescription desc =
990 chanR|chanG|chanB|chanA,
998 // Plane Type Offs Size Stride
999 { 0, unorm, 12, 4, 2 }, // R
1000 { 0, unorm, 8, 4, 2 }, // G
1001 { 0, unorm, 4, 4, 2 }, // B
1002 { 0, unorm, 0, 4, 2 } // A
1008 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
1010 const PlanarFormatDescription desc =
1013 chanR|chanG|chanB|chanA,
1021 // Plane Type Offs Size Stride
1022 { 0, unorm, 4, 4, 2 }, // R
1023 { 0, unorm, 8, 4, 2 }, // G
1024 { 0, unorm, 12, 4, 2 }, // B
1025 { 0, unorm, 0, 4, 2 } // A
1031 case VK_FORMAT_R5G6B5_UNORM_PACK16:
1033 const PlanarFormatDescription desc =
1044 // Plane Type Offs Size Stride
1045 { 0, unorm, 11, 5, 2 }, // R
1046 { 0, unorm, 5, 6, 2 }, // G
1047 { 0, unorm, 0, 5, 2 }, // B
1048 { 0, 0, 0, 0, 0 } // A
1054 case VK_FORMAT_B5G6R5_UNORM_PACK16:
1056 const PlanarFormatDescription desc =
1067 // Plane Type Offs Size Stride
1068 { 0, unorm, 0, 5, 2 }, // R
1069 { 0, unorm, 5, 6, 2 }, // G
1070 { 0, unorm, 11, 5, 2 }, // B
1071 { 0, 0, 0, 0, 0 } // A
1077 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
1079 const PlanarFormatDescription desc =
1082 chanR|chanG|chanB|chanA,
1090 // Plane Type Offs Size Stride
1091 { 0, unorm, 11, 5, 2 }, // R
1092 { 0, unorm, 6, 5, 2 }, // G
1093 { 0, unorm, 1, 5, 2 }, // B
1094 { 0, unorm, 0, 1, 2 } // A
1100 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
1102 const PlanarFormatDescription desc =
1105 chanR|chanG|chanB|chanA,
1113 // Plane Type Offs Size Stride
1114 { 0, unorm, 1, 5, 2 }, // R
1115 { 0, unorm, 6, 5, 2 }, // G
1116 { 0, unorm, 11, 5, 2 }, // B
1117 { 0, unorm, 0, 1, 2 } // A
1123 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
1125 const PlanarFormatDescription desc =
1128 chanR|chanG|chanB|chanA,
1136 // Plane Type Offs Size Stride
1137 { 0, unorm, 10, 5, 2 }, // R
1138 { 0, unorm, 5, 5, 2 }, // G
1139 { 0, unorm, 0, 5, 2 }, // B
1140 { 0, unorm, 15, 1, 2 } // A
1146 case VK_FORMAT_R8G8B8_UNORM:
1148 const PlanarFormatDescription desc =
1159 // Plane Type Offs Size Stride
1160 { 0, unorm, 0, 8, 3 }, // R
1161 { 0, unorm, 8, 8, 3 }, // G
1162 { 0, unorm, 16, 8, 3 }, // B
1163 { 0, 0, 0, 0, 0 } // A
1169 case VK_FORMAT_B8G8R8_UNORM:
1171 const PlanarFormatDescription desc =
1182 // Plane Type Offs Size Stride
1183 { 0, unorm, 16, 8, 3 }, // R
1184 { 0, unorm, 8, 8, 3 }, // G
1185 { 0, unorm, 0, 8, 3 }, // B
1186 { 0, 0, 0, 0, 0 } // A
1192 case VK_FORMAT_R8G8B8A8_UNORM:
1193 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
1195 const PlanarFormatDescription desc =
1198 chanR|chanG|chanB|chanA,
1206 // Plane Type Offs Size Stride
1207 { 0, unorm, 0, 8, 4 }, // R
1208 { 0, unorm, 8, 8, 4 }, // G
1209 { 0, unorm, 16, 8, 4 }, // B
1210 { 0, unorm, 24, 8, 4 } // A
1216 case VK_FORMAT_B8G8R8A8_UNORM:
1218 const PlanarFormatDescription desc =
1221 chanR|chanG|chanB|chanA,
1229 // Plane Type Offs Size Stride
1230 { 0, unorm, 16, 8, 4 }, // R
1231 { 0, unorm, 8, 8, 4 }, // G
1232 { 0, unorm, 0, 8, 4 }, // B
1233 { 0, unorm, 24, 8, 4 } // A
1239 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
1241 const PlanarFormatDescription desc =
1244 chanR|chanG|chanB|chanA,
1252 // Plane Type Offs Size Stride
1253 { 0, unorm, 20, 10, 4 }, // R
1254 { 0, unorm, 10, 10, 4 }, // G
1255 { 0, unorm, 0, 10, 4 }, // B
1256 { 0, unorm, 30, 2, 4 } // A
1262 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
1264 const PlanarFormatDescription desc =
1267 chanR|chanG|chanB|chanA,
1275 // Plane Type Offs Size Stride
1276 { 0, unorm, 0, 10, 4 }, // R
1277 { 0, unorm, 10, 10, 4 }, // G
1278 { 0, unorm, 20, 10, 4 }, // B
1279 { 0, unorm, 30, 2, 4 } // A
1285 case VK_FORMAT_R16G16B16_UNORM:
1287 const PlanarFormatDescription desc =
1298 // Plane Type Offs Size Stride
1299 { 0, unorm, 0, 16, 6 }, // R
1300 { 0, unorm, 16, 16, 6 }, // G
1301 { 0, unorm, 32, 16, 6 }, // B
1302 { 0, 0, 0, 0, 0 } // A
1308 case VK_FORMAT_R16G16B16A16_UNORM:
1310 const PlanarFormatDescription desc =
1313 chanR|chanG|chanB|chanA,
1321 // Plane Type Offs Size Stride
1322 { 0, unorm, 0, 16, 8 }, // R
1323 { 0, unorm, 16, 16, 8 }, // G
1324 { 0, unorm, 32, 16, 8 }, // B
1325 { 0, unorm, 48, 16, 8 } // A
1332 TCU_THROW(InternalError, "Not implemented");
1336 PlanarFormatDescription getPlanarFormatDescription (VkFormat format)
1338 if (isYCbCrFormat(format))
1339 return getYCbCrPlanarFormatDescription(format);
1341 return getCorePlanarFormatDescription(format);
1344 int getPlaneCount (VkFormat format)
1348 case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
1349 case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
1350 case VK_FORMAT_R10X6_UNORM_PACK16_KHR:
1351 case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR:
1352 case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR:
1353 case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
1354 case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
1355 case VK_FORMAT_R12X4_UNORM_PACK16_KHR:
1356 case VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR:
1357 case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR:
1358 case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
1359 case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
1360 case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
1361 case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
1364 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
1365 case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
1366 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
1367 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
1368 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
1369 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
1370 case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
1371 case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
1374 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
1375 case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
1376 case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
1377 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
1378 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
1379 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
1380 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
1381 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
1382 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
1383 case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
1384 case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
1385 case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
1389 DE_FATAL("Not YCbCr format");
1394 VkImageAspectFlagBits getPlaneAspect (deUint32 planeNdx)
1396 DE_ASSERT(de::inBounds(planeNdx, 0u, 3u));
1397 return (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_PLANE_0_BIT_KHR << planeNdx);
1400 deUint32 getAspectPlaneNdx (VkImageAspectFlagBits flags)
1404 case VK_IMAGE_ASPECT_PLANE_0_BIT_KHR: return 0;
1405 case VK_IMAGE_ASPECT_PLANE_1_BIT_KHR: return 1;
1406 case VK_IMAGE_ASPECT_PLANE_2_BIT_KHR: return 2;
1408 DE_FATAL("Invalid plane aspect");
1413 bool isChromaSubsampled (VkFormat format)
1417 case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
1418 case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
1419 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
1420 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
1421 case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
1422 case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
1423 case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
1424 case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
1425 case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
1426 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
1427 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
1428 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
1429 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
1430 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
1431 case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
1432 case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
1433 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
1434 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
1435 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
1436 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
1437 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
1438 case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
1439 case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
1440 case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
1441 case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
1442 case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
1443 case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
1444 case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
1452 bool isSupportedByFramework (VkFormat format)
1454 if (format == VK_FORMAT_UNDEFINED || format > VK_CORE_FORMAT_LAST)
1459 case VK_FORMAT_R64_UINT:
1460 case VK_FORMAT_R64_SINT:
1461 case VK_FORMAT_R64_SFLOAT:
1462 case VK_FORMAT_R64G64_UINT:
1463 case VK_FORMAT_R64G64_SINT:
1464 case VK_FORMAT_R64G64_SFLOAT:
1465 case VK_FORMAT_R64G64B64_UINT:
1466 case VK_FORMAT_R64G64B64_SINT:
1467 case VK_FORMAT_R64G64B64_SFLOAT:
1468 case VK_FORMAT_R64G64B64A64_UINT:
1469 case VK_FORMAT_R64G64B64A64_SINT:
1470 case VK_FORMAT_R64G64B64A64_SFLOAT:
1471 // \todo [2016-12-01 pyry] Support 64-bit channel types
1474 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
1475 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
1476 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
1477 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
1478 case VK_FORMAT_BC2_UNORM_BLOCK:
1479 case VK_FORMAT_BC2_SRGB_BLOCK:
1480 case VK_FORMAT_BC3_UNORM_BLOCK:
1481 case VK_FORMAT_BC3_SRGB_BLOCK:
1482 case VK_FORMAT_BC4_UNORM_BLOCK:
1483 case VK_FORMAT_BC4_SNORM_BLOCK:
1484 case VK_FORMAT_BC5_UNORM_BLOCK:
1485 case VK_FORMAT_BC5_SNORM_BLOCK:
1486 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
1487 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
1488 case VK_FORMAT_BC7_UNORM_BLOCK:
1489 case VK_FORMAT_BC7_SRGB_BLOCK:
1497 VkFormat mapTextureFormat (const tcu::TextureFormat& format)
1499 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST < (1<<16));
1500 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST < (1<<16));
1502 #define PACK_FMT(ORDER, TYPE) ((int(ORDER) << 16) | int(TYPE))
1503 #define FMT_CASE(ORDER, TYPE) PACK_FMT(tcu::TextureFormat::ORDER, tcu::TextureFormat::TYPE)
1505 // update this mapping if VkFormat changes
1506 DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
1508 switch (PACK_FMT(format.order, format.type))
1510 case FMT_CASE(RG, UNORM_BYTE_44): return VK_FORMAT_R4G4_UNORM_PACK8;
1511 case FMT_CASE(RGB, UNORM_SHORT_565): return VK_FORMAT_R5G6B5_UNORM_PACK16;
1512 case FMT_CASE(RGBA, UNORM_SHORT_4444): return VK_FORMAT_R4G4B4A4_UNORM_PACK16;
1513 case FMT_CASE(RGBA, UNORM_SHORT_5551): return VK_FORMAT_R5G5B5A1_UNORM_PACK16;
1515 case FMT_CASE(BGR, UNORM_SHORT_565): return VK_FORMAT_B5G6R5_UNORM_PACK16;
1516 case FMT_CASE(BGRA, UNORM_SHORT_4444): return VK_FORMAT_B4G4R4A4_UNORM_PACK16;
1517 case FMT_CASE(BGRA, UNORM_SHORT_5551): return VK_FORMAT_B5G5R5A1_UNORM_PACK16;
1519 case FMT_CASE(ARGB, UNORM_SHORT_1555): return VK_FORMAT_A1R5G5B5_UNORM_PACK16;
1521 case FMT_CASE(R, UNORM_INT8): return VK_FORMAT_R8_UNORM;
1522 case FMT_CASE(R, SNORM_INT8): return VK_FORMAT_R8_SNORM;
1523 case FMT_CASE(R, UNSIGNED_INT8): return VK_FORMAT_R8_UINT;
1524 case FMT_CASE(R, SIGNED_INT8): return VK_FORMAT_R8_SINT;
1525 case FMT_CASE(sR, UNORM_INT8): return VK_FORMAT_R8_SRGB;
1527 case FMT_CASE(RG, UNORM_INT8): return VK_FORMAT_R8G8_UNORM;
1528 case FMT_CASE(RG, SNORM_INT8): return VK_FORMAT_R8G8_SNORM;
1529 case FMT_CASE(RG, UNSIGNED_INT8): return VK_FORMAT_R8G8_UINT;
1530 case FMT_CASE(RG, SIGNED_INT8): return VK_FORMAT_R8G8_SINT;
1531 case FMT_CASE(sRG, UNORM_INT8): return VK_FORMAT_R8G8_SRGB;
1533 case FMT_CASE(RGB, UNORM_INT8): return VK_FORMAT_R8G8B8_UNORM;
1534 case FMT_CASE(RGB, SNORM_INT8): return VK_FORMAT_R8G8B8_SNORM;
1535 case FMT_CASE(RGB, UNSIGNED_INT8): return VK_FORMAT_R8G8B8_UINT;
1536 case FMT_CASE(RGB, SIGNED_INT8): return VK_FORMAT_R8G8B8_SINT;
1537 case FMT_CASE(sRGB, UNORM_INT8): return VK_FORMAT_R8G8B8_SRGB;
1539 case FMT_CASE(RGBA, UNORM_INT8): return VK_FORMAT_R8G8B8A8_UNORM;
1540 case FMT_CASE(RGBA, SNORM_INT8): return VK_FORMAT_R8G8B8A8_SNORM;
1541 case FMT_CASE(RGBA, UNSIGNED_INT8): return VK_FORMAT_R8G8B8A8_UINT;
1542 case FMT_CASE(RGBA, SIGNED_INT8): return VK_FORMAT_R8G8B8A8_SINT;
1543 case FMT_CASE(sRGBA, UNORM_INT8): return VK_FORMAT_R8G8B8A8_SRGB;
1545 case FMT_CASE(RGBA, UNORM_INT_1010102_REV): return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
1546 case FMT_CASE(RGBA, SNORM_INT_1010102_REV): return VK_FORMAT_A2B10G10R10_SNORM_PACK32;
1547 case FMT_CASE(RGBA, UNSIGNED_INT_1010102_REV): return VK_FORMAT_A2B10G10R10_UINT_PACK32;
1548 case FMT_CASE(RGBA, SIGNED_INT_1010102_REV): return VK_FORMAT_A2B10G10R10_SINT_PACK32;
1550 case FMT_CASE(R, UNORM_INT16): return VK_FORMAT_R16_UNORM;
1551 case FMT_CASE(R, SNORM_INT16): return VK_FORMAT_R16_SNORM;
1552 case FMT_CASE(R, UNSIGNED_INT16): return VK_FORMAT_R16_UINT;
1553 case FMT_CASE(R, SIGNED_INT16): return VK_FORMAT_R16_SINT;
1554 case FMT_CASE(R, HALF_FLOAT): return VK_FORMAT_R16_SFLOAT;
1556 case FMT_CASE(RG, UNORM_INT16): return VK_FORMAT_R16G16_UNORM;
1557 case FMT_CASE(RG, SNORM_INT16): return VK_FORMAT_R16G16_SNORM;
1558 case FMT_CASE(RG, UNSIGNED_INT16): return VK_FORMAT_R16G16_UINT;
1559 case FMT_CASE(RG, SIGNED_INT16): return VK_FORMAT_R16G16_SINT;
1560 case FMT_CASE(RG, HALF_FLOAT): return VK_FORMAT_R16G16_SFLOAT;
1562 case FMT_CASE(RGB, UNORM_INT16): return VK_FORMAT_R16G16B16_UNORM;
1563 case FMT_CASE(RGB, SNORM_INT16): return VK_FORMAT_R16G16B16_SNORM;
1564 case FMT_CASE(RGB, UNSIGNED_INT16): return VK_FORMAT_R16G16B16_UINT;
1565 case FMT_CASE(RGB, SIGNED_INT16): return VK_FORMAT_R16G16B16_SINT;
1566 case FMT_CASE(RGB, HALF_FLOAT): return VK_FORMAT_R16G16B16_SFLOAT;
1568 case FMT_CASE(RGBA, UNORM_INT16): return VK_FORMAT_R16G16B16A16_UNORM;
1569 case FMT_CASE(RGBA, SNORM_INT16): return VK_FORMAT_R16G16B16A16_SNORM;
1570 case FMT_CASE(RGBA, UNSIGNED_INT16): return VK_FORMAT_R16G16B16A16_UINT;
1571 case FMT_CASE(RGBA, SIGNED_INT16): return VK_FORMAT_R16G16B16A16_SINT;
1572 case FMT_CASE(RGBA, HALF_FLOAT): return VK_FORMAT_R16G16B16A16_SFLOAT;
1574 case FMT_CASE(R, UNSIGNED_INT32): return VK_FORMAT_R32_UINT;
1575 case FMT_CASE(R, SIGNED_INT32): return VK_FORMAT_R32_SINT;
1576 case FMT_CASE(R, FLOAT): return VK_FORMAT_R32_SFLOAT;
1578 case FMT_CASE(RG, UNSIGNED_INT32): return VK_FORMAT_R32G32_UINT;
1579 case FMT_CASE(RG, SIGNED_INT32): return VK_FORMAT_R32G32_SINT;
1580 case FMT_CASE(RG, FLOAT): return VK_FORMAT_R32G32_SFLOAT;
1582 case FMT_CASE(RGB, UNSIGNED_INT32): return VK_FORMAT_R32G32B32_UINT;
1583 case FMT_CASE(RGB, SIGNED_INT32): return VK_FORMAT_R32G32B32_SINT;
1584 case FMT_CASE(RGB, FLOAT): return VK_FORMAT_R32G32B32_SFLOAT;
1586 case FMT_CASE(RGBA, UNSIGNED_INT32): return VK_FORMAT_R32G32B32A32_UINT;
1587 case FMT_CASE(RGBA, SIGNED_INT32): return VK_FORMAT_R32G32B32A32_SINT;
1588 case FMT_CASE(RGBA, FLOAT): return VK_FORMAT_R32G32B32A32_SFLOAT;
1590 case FMT_CASE(R, FLOAT64): return VK_FORMAT_R64_SFLOAT;
1591 case FMT_CASE(RG, FLOAT64): return VK_FORMAT_R64G64_SFLOAT;
1592 case FMT_CASE(RGB, FLOAT64): return VK_FORMAT_R64G64B64_SFLOAT;
1593 case FMT_CASE(RGBA, FLOAT64): return VK_FORMAT_R64G64B64A64_SFLOAT;
1595 case FMT_CASE(RGB, UNSIGNED_INT_11F_11F_10F_REV): return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
1596 case FMT_CASE(RGB, UNSIGNED_INT_999_E5_REV): return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
1598 case FMT_CASE(BGR, UNORM_INT8): return VK_FORMAT_B8G8R8_UNORM;
1599 case FMT_CASE(BGR, SNORM_INT8): return VK_FORMAT_B8G8R8_SNORM;
1600 case FMT_CASE(BGR, UNSIGNED_INT8): return VK_FORMAT_B8G8R8_UINT;
1601 case FMT_CASE(BGR, SIGNED_INT8): return VK_FORMAT_B8G8R8_SINT;
1602 case FMT_CASE(sBGR, UNORM_INT8): return VK_FORMAT_B8G8R8_SRGB;
1604 case FMT_CASE(BGRA, UNORM_INT8): return VK_FORMAT_B8G8R8A8_UNORM;
1605 case FMT_CASE(BGRA, SNORM_INT8): return VK_FORMAT_B8G8R8A8_SNORM;
1606 case FMT_CASE(BGRA, UNSIGNED_INT8): return VK_FORMAT_B8G8R8A8_UINT;
1607 case FMT_CASE(BGRA, SIGNED_INT8): return VK_FORMAT_B8G8R8A8_SINT;
1608 case FMT_CASE(sBGRA, UNORM_INT8): return VK_FORMAT_B8G8R8A8_SRGB;
1610 case FMT_CASE(BGRA, UNORM_INT_1010102_REV): return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
1611 case FMT_CASE(BGRA, SNORM_INT_1010102_REV): return VK_FORMAT_A2R10G10B10_SNORM_PACK32;
1612 case FMT_CASE(BGRA, UNSIGNED_INT_1010102_REV): return VK_FORMAT_A2R10G10B10_UINT_PACK32;
1613 case FMT_CASE(BGRA, SIGNED_INT_1010102_REV): return VK_FORMAT_A2R10G10B10_SINT_PACK32;
1615 case FMT_CASE(D, UNORM_INT16): return VK_FORMAT_D16_UNORM;
1616 case FMT_CASE(D, UNSIGNED_INT_24_8_REV): return VK_FORMAT_X8_D24_UNORM_PACK32;
1617 case FMT_CASE(D, FLOAT): return VK_FORMAT_D32_SFLOAT;
1619 case FMT_CASE(S, UNSIGNED_INT8): return VK_FORMAT_S8_UINT;
1621 case FMT_CASE(DS, UNSIGNED_INT_16_8_8): return VK_FORMAT_D16_UNORM_S8_UINT;
1622 case FMT_CASE(DS, UNSIGNED_INT_24_8_REV): return VK_FORMAT_D24_UNORM_S8_UINT;
1623 case FMT_CASE(DS, FLOAT_UNSIGNED_INT_24_8_REV): return VK_FORMAT_D32_SFLOAT_S8_UINT;
1626 case FMT_CASE(R, UNORM_SHORT_10): return VK_FORMAT_R10X6_UNORM_PACK16_KHR;
1627 case FMT_CASE(RG, UNORM_SHORT_10): return VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR;
1628 case FMT_CASE(RGBA, UNORM_SHORT_10): return VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR;
1630 case FMT_CASE(R, UNORM_SHORT_12): return VK_FORMAT_R12X4_UNORM_PACK16_KHR;
1631 case FMT_CASE(RG, UNORM_SHORT_12): return VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR;
1632 case FMT_CASE(RGBA, UNORM_SHORT_12): return VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR;
1635 TCU_THROW(InternalError, "Unknown texture format");
1642 VkFormat mapCompressedTextureFormat (const tcu::CompressedTexFormat format)
1644 // update this mapping if CompressedTexFormat changes
1645 DE_STATIC_ASSERT(tcu::COMPRESSEDTEXFORMAT_LAST == 55);
1649 case tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8: return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
1650 case tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8: return VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK;
1651 case tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1: return VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
1652 case tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1: return VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK;
1653 case tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8: return VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1654 case tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8: return VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK;
1656 case tcu::COMPRESSEDTEXFORMAT_EAC_R11: return VK_FORMAT_EAC_R11_UNORM_BLOCK;
1657 case tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11: return VK_FORMAT_EAC_R11_SNORM_BLOCK;
1658 case tcu::COMPRESSEDTEXFORMAT_EAC_RG11: return VK_FORMAT_EAC_R11G11_UNORM_BLOCK;
1659 case tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11: return VK_FORMAT_EAC_R11G11_SNORM_BLOCK;
1661 case tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA: return VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1662 case tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8: return VK_FORMAT_ASTC_4x4_SRGB_BLOCK;
1663 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA: return VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
1664 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_SRGB8_ALPHA8: return VK_FORMAT_ASTC_5x4_SRGB_BLOCK;
1665 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA: return VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
1666 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8: return VK_FORMAT_ASTC_5x5_SRGB_BLOCK;
1667 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA: return VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
1668 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8: return VK_FORMAT_ASTC_6x5_SRGB_BLOCK;
1669 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA: return VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
1670 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8: return VK_FORMAT_ASTC_6x6_SRGB_BLOCK;
1671 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA: return VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
1672 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_SRGB8_ALPHA8: return VK_FORMAT_ASTC_8x5_SRGB_BLOCK;
1673 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA: return VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
1674 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8: return VK_FORMAT_ASTC_8x6_SRGB_BLOCK;
1675 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA: return VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
1676 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8: return VK_FORMAT_ASTC_8x8_SRGB_BLOCK;
1677 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA: return VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
1678 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8: return VK_FORMAT_ASTC_10x5_SRGB_BLOCK;
1679 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA: return VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
1680 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8: return VK_FORMAT_ASTC_10x6_SRGB_BLOCK;
1681 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA: return VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
1682 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8: return VK_FORMAT_ASTC_10x8_SRGB_BLOCK;
1683 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA: return VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
1684 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8: return VK_FORMAT_ASTC_10x10_SRGB_BLOCK;
1685 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA: return VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
1686 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8: return VK_FORMAT_ASTC_12x10_SRGB_BLOCK;
1687 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA: return VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
1688 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8: return VK_FORMAT_ASTC_12x12_SRGB_BLOCK;
1690 case tcu::COMPRESSEDTEXFORMAT_BC1_RGB_UNORM_BLOCK: return VK_FORMAT_BC1_RGB_UNORM_BLOCK;
1691 case tcu::COMPRESSEDTEXFORMAT_BC1_RGB_SRGB_BLOCK: return VK_FORMAT_BC1_RGB_SRGB_BLOCK;
1692 case tcu::COMPRESSEDTEXFORMAT_BC1_RGBA_UNORM_BLOCK: return VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
1693 case tcu::COMPRESSEDTEXFORMAT_BC1_RGBA_SRGB_BLOCK: return VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
1694 case tcu::COMPRESSEDTEXFORMAT_BC2_UNORM_BLOCK: return VK_FORMAT_BC2_UNORM_BLOCK;
1695 case tcu::COMPRESSEDTEXFORMAT_BC2_SRGB_BLOCK: return VK_FORMAT_BC2_SRGB_BLOCK;
1696 case tcu::COMPRESSEDTEXFORMAT_BC3_UNORM_BLOCK: return VK_FORMAT_BC3_UNORM_BLOCK;
1697 case tcu::COMPRESSEDTEXFORMAT_BC3_SRGB_BLOCK: return VK_FORMAT_BC3_SRGB_BLOCK;
1698 case tcu::COMPRESSEDTEXFORMAT_BC4_UNORM_BLOCK: return VK_FORMAT_BC4_UNORM_BLOCK;
1699 case tcu::COMPRESSEDTEXFORMAT_BC4_SNORM_BLOCK: return VK_FORMAT_BC4_SNORM_BLOCK;
1700 case tcu::COMPRESSEDTEXFORMAT_BC5_UNORM_BLOCK: return VK_FORMAT_BC5_UNORM_BLOCK;
1701 case tcu::COMPRESSEDTEXFORMAT_BC5_SNORM_BLOCK: return VK_FORMAT_BC5_SNORM_BLOCK;
1702 case tcu::COMPRESSEDTEXFORMAT_BC6H_UFLOAT_BLOCK: return VK_FORMAT_BC6H_UFLOAT_BLOCK;
1703 case tcu::COMPRESSEDTEXFORMAT_BC6H_SFLOAT_BLOCK: return VK_FORMAT_BC6H_SFLOAT_BLOCK;
1704 case tcu::COMPRESSEDTEXFORMAT_BC7_UNORM_BLOCK: return VK_FORMAT_BC7_UNORM_BLOCK;
1705 case tcu::COMPRESSEDTEXFORMAT_BC7_SRGB_BLOCK: return VK_FORMAT_BC7_SRGB_BLOCK;
1708 TCU_THROW(InternalError, "Unknown texture format");
1709 return VK_FORMAT_UNDEFINED;
1713 tcu::TextureFormat mapVkFormat (VkFormat format)
1715 using tcu::TextureFormat;
1717 // update this mapping if VkFormat changes
1718 DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
1722 case VK_FORMAT_R4G4_UNORM_PACK8: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_BYTE_44);
1723 case VK_FORMAT_R5G6B5_UNORM_PACK16: return TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_SHORT_565);
1724 case VK_FORMAT_R4G4B4A4_UNORM_PACK16: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_4444);
1725 case VK_FORMAT_R5G5B5A1_UNORM_PACK16: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_5551);
1727 case VK_FORMAT_B5G6R5_UNORM_PACK16: return TextureFormat(TextureFormat::BGR, TextureFormat::UNORM_SHORT_565);
1728 case VK_FORMAT_B4G4R4A4_UNORM_PACK16: return TextureFormat(TextureFormat::BGRA, TextureFormat::UNORM_SHORT_4444);
1729 case VK_FORMAT_B5G5R5A1_UNORM_PACK16: return TextureFormat(TextureFormat::BGRA, TextureFormat::UNORM_SHORT_5551);
1731 case VK_FORMAT_A1R5G5B5_UNORM_PACK16: return TextureFormat(TextureFormat::ARGB, TextureFormat::UNORM_SHORT_1555);
1733 case VK_FORMAT_R8_UNORM: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_INT8);
1734 case VK_FORMAT_R8_SNORM: return TextureFormat(TextureFormat::R, TextureFormat::SNORM_INT8);
1735 case VK_FORMAT_R8_USCALED: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT8);
1736 case VK_FORMAT_R8_SSCALED: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT8);
1737 case VK_FORMAT_R8_UINT: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT8);
1738 case VK_FORMAT_R8_SINT: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT8);
1739 case VK_FORMAT_R8_SRGB: return TextureFormat(TextureFormat::sR, TextureFormat::UNORM_INT8);
1741 case VK_FORMAT_R8G8_UNORM: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_INT8);
1742 case VK_FORMAT_R8G8_SNORM: return TextureFormat(TextureFormat::RG, TextureFormat::SNORM_INT8);
1743 case VK_FORMAT_R8G8_USCALED: return TextureFormat(TextureFormat::RG, TextureFormat::UNSIGNED_INT8);
1744 case VK_FORMAT_R8G8_SSCALED: return TextureFormat(TextureFormat::RG, TextureFormat::SIGNED_INT8);
1745 case VK_FORMAT_R8G8_UINT: return TextureFormat(TextureFormat::RG, TextureFormat::UNSIGNED_INT8);
1746 case VK_FORMAT_R8G8_SINT: return TextureFormat(TextureFormat::RG, TextureFormat::SIGNED_INT8);
1747 case VK_FORMAT_R8G8_SRGB: return TextureFormat(TextureFormat::sRG, TextureFormat::UNORM_INT8);
1749 case VK_FORMAT_R8G8B8_UNORM: return TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_INT8);
1750 case VK_FORMAT_R8G8B8_SNORM: return TextureFormat(TextureFormat::RGB, TextureFormat::SNORM_INT8);
1751 case VK_FORMAT_R8G8B8_USCALED: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT8);
1752 case VK_FORMAT_R8G8B8_SSCALED: return TextureFormat(TextureFormat::RGB, TextureFormat::SIGNED_INT8);
1753 case VK_FORMAT_R8G8B8_UINT: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT8);
1754 case VK_FORMAT_R8G8B8_SINT: return TextureFormat(TextureFormat::RGB, TextureFormat::SIGNED_INT8);
1755 case VK_FORMAT_R8G8B8_SRGB: return TextureFormat(TextureFormat::sRGB, TextureFormat::UNORM_INT8);
1757 case VK_FORMAT_R8G8B8A8_UNORM: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT8);
1758 case VK_FORMAT_R8G8B8A8_SNORM: return TextureFormat(TextureFormat::RGBA, TextureFormat::SNORM_INT8);
1759 case VK_FORMAT_R8G8B8A8_USCALED: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT8);
1760 case VK_FORMAT_R8G8B8A8_SSCALED: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT8);
1761 case VK_FORMAT_R8G8B8A8_UINT: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT8);
1762 case VK_FORMAT_R8G8B8A8_SINT: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT8);
1763 case VK_FORMAT_R8G8B8A8_SRGB: return TextureFormat(TextureFormat::sRGBA, TextureFormat::UNORM_INT8);
1765 case VK_FORMAT_R16_UNORM: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_INT16);
1766 case VK_FORMAT_R16_SNORM: return TextureFormat(TextureFormat::R, TextureFormat::SNORM_INT16);
1767 case VK_FORMAT_R16_USCALED: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT16);
1768 case VK_FORMAT_R16_SSCALED: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT16);
1769 case VK_FORMAT_R16_UINT: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT16);
1770 case VK_FORMAT_R16_SINT: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT16);
1771 case VK_FORMAT_R16_SFLOAT: return TextureFormat(TextureFormat::R, TextureFormat::HALF_FLOAT);
1773 case VK_FORMAT_R16G16_UNORM: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_INT16);
1774 case VK_FORMAT_R16G16_SNORM: return TextureFormat(TextureFormat::RG, TextureFormat::SNORM_INT16);
1775 case VK_FORMAT_R16G16_USCALED: return TextureFormat(TextureFormat::RG, TextureFormat::UNSIGNED_INT16);
1776 case VK_FORMAT_R16G16_SSCALED: return TextureFormat(TextureFormat::RG, TextureFormat::SIGNED_INT16);
1777 case VK_FORMAT_R16G16_UINT: return TextureFormat(TextureFormat::RG, TextureFormat::UNSIGNED_INT16);
1778 case VK_FORMAT_R16G16_SINT: return TextureFormat(TextureFormat::RG, TextureFormat::SIGNED_INT16);
1779 case VK_FORMAT_R16G16_SFLOAT: return TextureFormat(TextureFormat::RG, TextureFormat::HALF_FLOAT);
1781 case VK_FORMAT_R16G16B16_UNORM: return TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_INT16);
1782 case VK_FORMAT_R16G16B16_SNORM: return TextureFormat(TextureFormat::RGB, TextureFormat::SNORM_INT16);
1783 case VK_FORMAT_R16G16B16_USCALED: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT16);
1784 case VK_FORMAT_R16G16B16_SSCALED: return TextureFormat(TextureFormat::RGB, TextureFormat::SIGNED_INT16);
1785 case VK_FORMAT_R16G16B16_UINT: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT16);
1786 case VK_FORMAT_R16G16B16_SINT: return TextureFormat(TextureFormat::RGB, TextureFormat::SIGNED_INT16);
1787 case VK_FORMAT_R16G16B16_SFLOAT: return TextureFormat(TextureFormat::RGB, TextureFormat::HALF_FLOAT);
1789 case VK_FORMAT_R16G16B16A16_UNORM: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT16);
1790 case VK_FORMAT_R16G16B16A16_SNORM: return TextureFormat(TextureFormat::RGBA, TextureFormat::SNORM_INT16);
1791 case VK_FORMAT_R16G16B16A16_USCALED: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT16);
1792 case VK_FORMAT_R16G16B16A16_SSCALED: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT16);
1793 case VK_FORMAT_R16G16B16A16_UINT: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT16);
1794 case VK_FORMAT_R16G16B16A16_SINT: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT16);
1795 case VK_FORMAT_R16G16B16A16_SFLOAT: return TextureFormat(TextureFormat::RGBA, TextureFormat::HALF_FLOAT);
1797 case VK_FORMAT_R32_UINT: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT32);
1798 case VK_FORMAT_R32_SINT: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT32);
1799 case VK_FORMAT_R32_SFLOAT: return TextureFormat(TextureFormat::R, TextureFormat::FLOAT);
1801 case VK_FORMAT_R32G32_UINT: return TextureFormat(TextureFormat::RG, TextureFormat::UNSIGNED_INT32);
1802 case VK_FORMAT_R32G32_SINT: return TextureFormat(TextureFormat::RG, TextureFormat::SIGNED_INT32);
1803 case VK_FORMAT_R32G32_SFLOAT: return TextureFormat(TextureFormat::RG, TextureFormat::FLOAT);
1805 case VK_FORMAT_R32G32B32_UINT: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT32);
1806 case VK_FORMAT_R32G32B32_SINT: return TextureFormat(TextureFormat::RGB, TextureFormat::SIGNED_INT32);
1807 case VK_FORMAT_R32G32B32_SFLOAT: return TextureFormat(TextureFormat::RGB, TextureFormat::FLOAT);
1809 case VK_FORMAT_R32G32B32A32_UINT: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT32);
1810 case VK_FORMAT_R32G32B32A32_SINT: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT32);
1811 case VK_FORMAT_R32G32B32A32_SFLOAT: return TextureFormat(TextureFormat::RGBA, TextureFormat::FLOAT);
1813 case VK_FORMAT_R64_SFLOAT: return TextureFormat(TextureFormat::R, TextureFormat::FLOAT64);
1814 case VK_FORMAT_R64G64_SFLOAT: return TextureFormat(TextureFormat::RG, TextureFormat::FLOAT64);
1815 case VK_FORMAT_R64G64B64_SFLOAT: return TextureFormat(TextureFormat::RGB, TextureFormat::FLOAT64);
1816 case VK_FORMAT_R64G64B64A64_SFLOAT: return TextureFormat(TextureFormat::RGBA, TextureFormat::FLOAT64);
1818 case VK_FORMAT_B10G11R11_UFLOAT_PACK32: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT_11F_11F_10F_REV);
1819 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT_999_E5_REV);
1821 case VK_FORMAT_B8G8R8_UNORM: return TextureFormat(TextureFormat::BGR, TextureFormat::UNORM_INT8);
1822 case VK_FORMAT_B8G8R8_SNORM: return TextureFormat(TextureFormat::BGR, TextureFormat::SNORM_INT8);
1823 case VK_FORMAT_B8G8R8_USCALED: return TextureFormat(TextureFormat::BGR, TextureFormat::UNSIGNED_INT8);
1824 case VK_FORMAT_B8G8R8_SSCALED: return TextureFormat(TextureFormat::BGR, TextureFormat::SIGNED_INT8);
1825 case VK_FORMAT_B8G8R8_UINT: return TextureFormat(TextureFormat::BGR, TextureFormat::UNSIGNED_INT8);
1826 case VK_FORMAT_B8G8R8_SINT: return TextureFormat(TextureFormat::BGR, TextureFormat::SIGNED_INT8);
1827 case VK_FORMAT_B8G8R8_SRGB: return TextureFormat(TextureFormat::sBGR, TextureFormat::UNORM_INT8);
1829 case VK_FORMAT_B8G8R8A8_UNORM: return TextureFormat(TextureFormat::BGRA, TextureFormat::UNORM_INT8);
1830 case VK_FORMAT_B8G8R8A8_SNORM: return TextureFormat(TextureFormat::BGRA, TextureFormat::SNORM_INT8);
1831 case VK_FORMAT_B8G8R8A8_USCALED: return TextureFormat(TextureFormat::BGRA, TextureFormat::UNSIGNED_INT8);
1832 case VK_FORMAT_B8G8R8A8_SSCALED: return TextureFormat(TextureFormat::BGRA, TextureFormat::SIGNED_INT8);
1833 case VK_FORMAT_B8G8R8A8_UINT: return TextureFormat(TextureFormat::BGRA, TextureFormat::UNSIGNED_INT8);
1834 case VK_FORMAT_B8G8R8A8_SINT: return TextureFormat(TextureFormat::BGRA, TextureFormat::SIGNED_INT8);
1835 case VK_FORMAT_B8G8R8A8_SRGB: return TextureFormat(TextureFormat::sBGRA, TextureFormat::UNORM_INT8);
1837 case VK_FORMAT_D16_UNORM: return TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT16);
1838 case VK_FORMAT_X8_D24_UNORM_PACK32: return TextureFormat(TextureFormat::D, TextureFormat::UNSIGNED_INT_24_8_REV);
1839 case VK_FORMAT_D32_SFLOAT: return TextureFormat(TextureFormat::D, TextureFormat::FLOAT);
1841 case VK_FORMAT_S8_UINT: return TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8);
1843 // \note There is no standard interleaved memory layout for DS formats; buffer-image copies
1844 // will always operate on either D or S aspect only. See Khronos bug 12998
1845 case VK_FORMAT_D16_UNORM_S8_UINT: return TextureFormat(TextureFormat::DS, TextureFormat::UNSIGNED_INT_16_8_8);
1846 case VK_FORMAT_D24_UNORM_S8_UINT: return TextureFormat(TextureFormat::DS, TextureFormat::UNSIGNED_INT_24_8_REV);
1847 case VK_FORMAT_D32_SFLOAT_S8_UINT: return TextureFormat(TextureFormat::DS, TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV);
1849 #if (DE_ENDIANNESS == DE_LITTLE_ENDIAN)
1850 case VK_FORMAT_A8B8G8R8_UNORM_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT8);
1851 case VK_FORMAT_A8B8G8R8_SNORM_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::SNORM_INT8);
1852 case VK_FORMAT_A8B8G8R8_USCALED_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT8);
1853 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT8);
1854 case VK_FORMAT_A8B8G8R8_UINT_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT8);
1855 case VK_FORMAT_A8B8G8R8_SINT_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT8);
1856 case VK_FORMAT_A8B8G8R8_SRGB_PACK32: return TextureFormat(TextureFormat::sRGBA, TextureFormat::UNORM_INT8);
1858 # error "Big-endian not supported"
1861 case VK_FORMAT_A2R10G10B10_UNORM_PACK32: return TextureFormat(TextureFormat::BGRA, TextureFormat::UNORM_INT_1010102_REV);
1862 case VK_FORMAT_A2R10G10B10_SNORM_PACK32: return TextureFormat(TextureFormat::BGRA, TextureFormat::SNORM_INT_1010102_REV);
1863 case VK_FORMAT_A2R10G10B10_USCALED_PACK32: return TextureFormat(TextureFormat::BGRA, TextureFormat::UNSIGNED_INT_1010102_REV);
1864 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: return TextureFormat(TextureFormat::BGRA, TextureFormat::SIGNED_INT_1010102_REV);
1865 case VK_FORMAT_A2R10G10B10_UINT_PACK32: return TextureFormat(TextureFormat::BGRA, TextureFormat::UNSIGNED_INT_1010102_REV);
1866 case VK_FORMAT_A2R10G10B10_SINT_PACK32: return TextureFormat(TextureFormat::BGRA, TextureFormat::SIGNED_INT_1010102_REV);
1868 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT_1010102_REV);
1869 case VK_FORMAT_A2B10G10R10_SNORM_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::SNORM_INT_1010102_REV);
1870 case VK_FORMAT_A2B10G10R10_USCALED_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT_1010102_REV);
1871 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT_1010102_REV);
1872 case VK_FORMAT_A2B10G10R10_UINT_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT_1010102_REV);
1873 case VK_FORMAT_A2B10G10R10_SINT_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT_1010102_REV);
1875 // YCbCr formats that can be mapped
1876 case VK_FORMAT_R10X6_UNORM_PACK16_KHR: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_10);
1877 case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_SHORT_10);
1878 case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_10);
1880 case VK_FORMAT_R12X4_UNORM_PACK16_KHR: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_12);
1881 case VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_SHORT_12);
1882 case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_12);
1885 TCU_THROW(InternalError, "Unknown image format");
1889 tcu::CompressedTexFormat mapVkCompressedFormat (VkFormat format)
1891 // update this mapping if VkFormat changes
1892 DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
1896 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8;
1897 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8;
1898 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
1899 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
1900 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8;
1901 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8;
1903 case VK_FORMAT_EAC_R11_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_EAC_R11;
1904 case VK_FORMAT_EAC_R11_SNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11;
1905 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_EAC_RG11;
1906 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11;
1908 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA;
1909 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8;
1910 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA;
1911 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_SRGB8_ALPHA8;
1912 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA;
1913 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8;
1914 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA;
1915 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8;
1916 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA;
1917 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8;
1918 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA;
1919 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_SRGB8_ALPHA8;
1920 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA;
1921 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8;
1922 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA;
1923 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8;
1924 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA;
1925 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8;
1926 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA;
1927 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8;
1928 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA;
1929 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8;
1930 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA;
1931 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8;
1932 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA;
1933 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8;
1934 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA;
1935 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8;
1937 case VK_FORMAT_BC1_RGB_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC1_RGB_UNORM_BLOCK;
1938 case VK_FORMAT_BC1_RGB_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC1_RGB_SRGB_BLOCK;
1939 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC1_RGBA_UNORM_BLOCK;
1940 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC1_RGBA_SRGB_BLOCK;
1941 case VK_FORMAT_BC2_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC2_UNORM_BLOCK;
1942 case VK_FORMAT_BC2_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC2_SRGB_BLOCK;
1943 case VK_FORMAT_BC3_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC3_UNORM_BLOCK;
1944 case VK_FORMAT_BC3_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC3_SRGB_BLOCK;
1945 case VK_FORMAT_BC4_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC4_UNORM_BLOCK;
1946 case VK_FORMAT_BC4_SNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC4_SNORM_BLOCK;
1947 case VK_FORMAT_BC5_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC5_UNORM_BLOCK;
1948 case VK_FORMAT_BC5_SNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC5_SNORM_BLOCK;
1949 case VK_FORMAT_BC6H_UFLOAT_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC6H_UFLOAT_BLOCK;
1950 case VK_FORMAT_BC6H_SFLOAT_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC6H_SFLOAT_BLOCK;
1951 case VK_FORMAT_BC7_UNORM_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC7_UNORM_BLOCK;
1952 case VK_FORMAT_BC7_SRGB_BLOCK: return tcu::COMPRESSEDTEXFORMAT_BC7_SRGB_BLOCK;
1955 TCU_THROW(InternalError, "Unknown image format");
1956 return tcu::COMPRESSEDTEXFORMAT_LAST;
1960 static bool isScaledFormat (VkFormat format)
1962 // update this mapping if VkFormat changes
1963 DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
1967 case VK_FORMAT_R8_USCALED:
1968 case VK_FORMAT_R8_SSCALED:
1969 case VK_FORMAT_R8G8_USCALED:
1970 case VK_FORMAT_R8G8_SSCALED:
1971 case VK_FORMAT_R8G8B8_USCALED:
1972 case VK_FORMAT_R8G8B8_SSCALED:
1973 case VK_FORMAT_R8G8B8A8_USCALED:
1974 case VK_FORMAT_R8G8B8A8_SSCALED:
1975 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
1976 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
1977 case VK_FORMAT_R16_USCALED:
1978 case VK_FORMAT_R16_SSCALED:
1979 case VK_FORMAT_R16G16_USCALED:
1980 case VK_FORMAT_R16G16_SSCALED:
1981 case VK_FORMAT_R16G16B16_USCALED:
1982 case VK_FORMAT_R16G16B16_SSCALED:
1983 case VK_FORMAT_R16G16B16A16_USCALED:
1984 case VK_FORMAT_R16G16B16A16_SSCALED:
1985 case VK_FORMAT_B8G8R8_USCALED:
1986 case VK_FORMAT_B8G8R8_SSCALED:
1987 case VK_FORMAT_B8G8R8A8_USCALED:
1988 case VK_FORMAT_B8G8R8A8_SSCALED:
1989 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
1990 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
1998 static bool fullTextureFormatRoundTripSupported (VkFormat format)
2000 if (isScaledFormat(format))
2002 // *SCALED formats get mapped to correspoding (u)int formats since
2003 // accessing them through (float) getPixel/setPixel has same behavior
2004 // as in shader access in Vulkan.
2005 // Unfortunately full round-trip between tcu::TextureFormat and VkFormat
2006 // for most SCALED formats is not supported though.
2008 const tcu::TextureFormat tcuFormat = mapVkFormat(format);
2010 switch (tcuFormat.type)
2012 case tcu::TextureFormat::UNSIGNED_INT8:
2013 case tcu::TextureFormat::UNSIGNED_INT16:
2014 case tcu::TextureFormat::UNSIGNED_INT32:
2015 case tcu::TextureFormat::SIGNED_INT8:
2016 case tcu::TextureFormat::SIGNED_INT16:
2017 case tcu::TextureFormat::SIGNED_INT32:
2018 case tcu::TextureFormat::UNSIGNED_INT_1010102_REV:
2019 case tcu::TextureFormat::SIGNED_INT_1010102_REV:
2030 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
2031 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
2032 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
2033 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
2034 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
2035 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
2036 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
2037 return false; // These map to regular byte array formats
2043 return (format != VK_FORMAT_UNDEFINED);
2047 tcu::TextureFormat getChannelAccessFormat (tcu::TextureChannelClass type,
2048 deUint32 offsetBits,
2051 using tcu::TextureFormat;
2053 if (offsetBits == 0)
2055 static const TextureFormat::ChannelType s_size8[tcu::TEXTURECHANNELCLASS_LAST] =
2057 TextureFormat::SNORM_INT8, // snorm
2058 TextureFormat::UNORM_INT8, // unorm
2059 TextureFormat::SIGNED_INT8, // sint
2060 TextureFormat::UNSIGNED_INT8, // uint
2061 TextureFormat::CHANNELTYPE_LAST, // float
2063 static const TextureFormat::ChannelType s_size16[tcu::TEXTURECHANNELCLASS_LAST] =
2065 TextureFormat::SNORM_INT16, // snorm
2066 TextureFormat::UNORM_INT16, // unorm
2067 TextureFormat::SIGNED_INT16, // sint
2068 TextureFormat::UNSIGNED_INT16, // uint
2069 TextureFormat::HALF_FLOAT, // float
2071 static const TextureFormat::ChannelType s_size32[tcu::TEXTURECHANNELCLASS_LAST] =
2073 TextureFormat::SNORM_INT32, // snorm
2074 TextureFormat::UNORM_INT32, // unorm
2075 TextureFormat::SIGNED_INT32, // sint
2076 TextureFormat::UNSIGNED_INT32, // uint
2077 TextureFormat::FLOAT, // float
2080 TextureFormat::ChannelType chnType = TextureFormat::CHANNELTYPE_LAST;
2083 chnType = s_size8[type];
2084 else if (sizeBits == 16)
2085 chnType = s_size16[type];
2086 else if (sizeBits == 32)
2087 chnType = s_size32[type];
2089 if (chnType != TextureFormat::CHANNELTYPE_LAST)
2090 return TextureFormat(TextureFormat::R, chnType);
2094 if (type == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT &&
2097 return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_10);
2098 else if (type == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT &&
2101 return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_12);
2104 TCU_THROW(InternalError, "Channel access format is not supported");
2107 tcu::PixelBufferAccess getChannelAccess (const PlanarFormatDescription& formatInfo,
2108 const tcu::UVec2& size,
2109 const deUint32* planeRowPitches,
2110 void* const* planePtrs,
2111 deUint32 channelNdx)
2113 DE_ASSERT(formatInfo.hasChannelNdx(channelNdx));
2115 const deUint32 planeNdx = formatInfo.channels[channelNdx].planeNdx;
2116 const deUint32 planeOffsetBytes = formatInfo.channels[channelNdx].offsetBits / 8;
2117 const deUint32 valueOffsetBits = formatInfo.channels[channelNdx].offsetBits % 8;
2118 const deUint32 pixelStrideBytes = formatInfo.channels[channelNdx].strideBytes;
2120 DE_ASSERT(size.x() % formatInfo.planes[planeNdx].widthDivisor == 0);
2121 DE_ASSERT(size.y() % formatInfo.planes[planeNdx].heightDivisor == 0);
2123 deUint32 accessWidth = size.x() / formatInfo.planes[planeNdx].widthDivisor;
2124 const deUint32 accessHeight = size.y() / formatInfo.planes[planeNdx].heightDivisor;
2125 const deUint32 elementSizeBytes = formatInfo.planes[planeNdx].elementSizeBytes;
2127 const deUint32 rowPitch = planeRowPitches[planeNdx];
2129 if (pixelStrideBytes != elementSizeBytes)
2131 DE_ASSERT(elementSizeBytes % pixelStrideBytes == 0);
2132 accessWidth *= elementSizeBytes/pixelStrideBytes;
2135 return tcu::PixelBufferAccess(getChannelAccessFormat((tcu::TextureChannelClass)formatInfo.channels[channelNdx].type,
2137 formatInfo.channels[channelNdx].sizeBits),
2138 tcu::IVec3((int)accessWidth, (int)accessHeight, 1),
2139 tcu::IVec3((int)pixelStrideBytes, (int)rowPitch, 0),
2140 (deUint8*)planePtrs[planeNdx] + planeOffsetBytes);
2144 tcu::ConstPixelBufferAccess getChannelAccess (const PlanarFormatDescription& formatInfo,
2145 const tcu::UVec2& size,
2146 const deUint32* planeRowPitches,
2147 const void* const* planePtrs,
2148 deUint32 channelNdx)
2150 return getChannelAccess(formatInfo, size, planeRowPitches, const_cast<void* const*>(planePtrs), channelNdx);
2153 void imageUtilSelfTest (void)
2155 for (int formatNdx = 0; formatNdx < VK_CORE_FORMAT_LAST; formatNdx++)
2157 const VkFormat format = (VkFormat)formatNdx;
2159 if (format == VK_FORMAT_R64_UINT ||
2160 format == VK_FORMAT_R64_SINT ||
2161 format == VK_FORMAT_R64G64_UINT ||
2162 format == VK_FORMAT_R64G64_SINT ||
2163 format == VK_FORMAT_R64G64B64_UINT ||
2164 format == VK_FORMAT_R64G64B64_SINT ||
2165 format == VK_FORMAT_R64G64B64A64_UINT ||
2166 format == VK_FORMAT_R64G64B64A64_SINT)
2167 continue; // \todo [2015-12-05 pyry] Add framework support for (u)int64 channel type
2169 if (format != VK_FORMAT_UNDEFINED && !isCompressedFormat(format))
2171 const tcu::TextureFormat tcuFormat = mapVkFormat(format);
2172 const VkFormat remappedFormat = mapTextureFormat(tcuFormat);
2174 DE_TEST_ASSERT(isValid(tcuFormat));
2176 if (fullTextureFormatRoundTripSupported(format))
2177 DE_TEST_ASSERT(format == remappedFormat);
2181 for (int formatNdx = VK_FORMAT_G8B8G8R8_422_UNORM_KHR; formatNdx <= VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR; formatNdx++)
2183 const VkFormat format = (VkFormat)formatNdx;
2184 const PlanarFormatDescription& info = getPlanarFormatDescription(format);
2186 DE_TEST_ASSERT(isYCbCrFormat(format));
2187 DE_TEST_ASSERT(de::inRange<deUint8>(info.numPlanes, 1u, 3u));
2188 DE_TEST_ASSERT(info.numPlanes == getPlaneCount(format));
2192 VkFilter mapFilterMode (tcu::Sampler::FilterMode filterMode)
2194 DE_STATIC_ASSERT(tcu::Sampler::FILTERMODE_LAST == 6);
2198 case tcu::Sampler::NEAREST: return VK_FILTER_NEAREST;
2199 case tcu::Sampler::LINEAR: return VK_FILTER_LINEAR;
2200 case tcu::Sampler::NEAREST_MIPMAP_NEAREST: return VK_FILTER_NEAREST;
2201 case tcu::Sampler::NEAREST_MIPMAP_LINEAR: return VK_FILTER_NEAREST;
2202 case tcu::Sampler::LINEAR_MIPMAP_NEAREST: return VK_FILTER_LINEAR;
2203 case tcu::Sampler::LINEAR_MIPMAP_LINEAR: return VK_FILTER_LINEAR;
2205 DE_FATAL("Illegal filter mode");
2210 VkSamplerMipmapMode mapMipmapMode (tcu::Sampler::FilterMode filterMode)
2212 DE_STATIC_ASSERT(tcu::Sampler::FILTERMODE_LAST == 6);
2214 // \note VkSamplerCreateInfo doesn't have a flag for disabling mipmapping. Instead
2215 // minLod = 0 and maxLod = 0.25 should be used to match OpenGL NEAREST and LINEAR
2216 // filtering mode behavior.
2220 case tcu::Sampler::NEAREST: return VK_SAMPLER_MIPMAP_MODE_NEAREST;
2221 case tcu::Sampler::LINEAR: return VK_SAMPLER_MIPMAP_MODE_NEAREST;
2222 case tcu::Sampler::NEAREST_MIPMAP_NEAREST: return VK_SAMPLER_MIPMAP_MODE_NEAREST;
2223 case tcu::Sampler::NEAREST_MIPMAP_LINEAR: return VK_SAMPLER_MIPMAP_MODE_LINEAR;
2224 case tcu::Sampler::LINEAR_MIPMAP_NEAREST: return VK_SAMPLER_MIPMAP_MODE_NEAREST;
2225 case tcu::Sampler::LINEAR_MIPMAP_LINEAR: return VK_SAMPLER_MIPMAP_MODE_LINEAR;
2227 DE_FATAL("Illegal filter mode");
2228 return (VkSamplerMipmapMode)0;
2232 VkSamplerAddressMode mapWrapMode (tcu::Sampler::WrapMode wrapMode)
2236 case tcu::Sampler::CLAMP_TO_EDGE: return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
2237 case tcu::Sampler::CLAMP_TO_BORDER: return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
2238 case tcu::Sampler::REPEAT_GL: return VK_SAMPLER_ADDRESS_MODE_REPEAT;
2239 case tcu::Sampler::MIRRORED_REPEAT_GL: return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
2240 case tcu::Sampler::MIRRORED_ONCE: return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
2242 DE_FATAL("Wrap mode can't be mapped to Vulkan");
2243 return (vk::VkSamplerAddressMode)0;
2247 vk::VkCompareOp mapCompareMode (tcu::Sampler::CompareMode mode)
2251 case tcu::Sampler::COMPAREMODE_NONE: return vk::VK_COMPARE_OP_NEVER;
2252 case tcu::Sampler::COMPAREMODE_LESS: return vk::VK_COMPARE_OP_LESS;
2253 case tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL: return vk::VK_COMPARE_OP_LESS_OR_EQUAL;
2254 case tcu::Sampler::COMPAREMODE_GREATER: return vk::VK_COMPARE_OP_GREATER;
2255 case tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL: return vk::VK_COMPARE_OP_GREATER_OR_EQUAL;
2256 case tcu::Sampler::COMPAREMODE_EQUAL: return vk::VK_COMPARE_OP_EQUAL;
2257 case tcu::Sampler::COMPAREMODE_NOT_EQUAL: return vk::VK_COMPARE_OP_NOT_EQUAL;
2258 case tcu::Sampler::COMPAREMODE_ALWAYS: return vk::VK_COMPARE_OP_ALWAYS;
2259 case tcu::Sampler::COMPAREMODE_NEVER: return vk::VK_COMPARE_OP_NEVER;
2261 DE_FATAL("Illegal compare mode");
2262 return (vk::VkCompareOp)0;
2266 static VkBorderColor mapBorderColor (tcu::TextureChannelClass channelClass, const rr::GenericVec4& color)
2268 if (channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
2270 const tcu::UVec4 uColor = color.get<deUint32>();
2272 if (uColor == tcu::UVec4(0, 0, 0, 0)) return VK_BORDER_COLOR_INT_TRANSPARENT_BLACK;
2273 else if (uColor == tcu::UVec4(0, 0, 0, 1)) return VK_BORDER_COLOR_INT_OPAQUE_BLACK;
2274 else if (uColor == tcu::UVec4(1, 1, 1, 1)) return VK_BORDER_COLOR_INT_OPAQUE_WHITE;
2276 else if (channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
2278 const tcu::IVec4 sColor = color.get<deInt32>();
2280 if (sColor == tcu::IVec4(0, 0, 0, 0)) return VK_BORDER_COLOR_INT_TRANSPARENT_BLACK;
2281 else if (sColor == tcu::IVec4(0, 0, 0, 1)) return VK_BORDER_COLOR_INT_OPAQUE_BLACK;
2282 else if (sColor == tcu::IVec4(1, 1, 1, 1)) return VK_BORDER_COLOR_INT_OPAQUE_WHITE;
2286 const tcu::Vec4 fColor = color.get<float>();
2288 if (fColor == tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f)) return VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
2289 else if (fColor == tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)) return VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
2290 else if (fColor == tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f)) return VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
2293 DE_FATAL("Unsupported border color");
2294 return VK_BORDER_COLOR_LAST;
2297 VkSamplerCreateInfo mapSampler (const tcu::Sampler& sampler, const tcu::TextureFormat& format, float minLod, float maxLod)
2299 const bool compareEnabled = (sampler.compare != tcu::Sampler::COMPAREMODE_NONE);
2300 const VkCompareOp compareOp = (compareEnabled) ? (mapCompareMode(sampler.compare)) : (VK_COMPARE_OP_ALWAYS);
2301 const VkBorderColor borderColor = mapBorderColor(getTextureChannelClass(format.type), sampler.borderColor);
2302 const bool isMipmapEnabled = (sampler.minFilter != tcu::Sampler::NEAREST && sampler.minFilter != tcu::Sampler::LINEAR);
2304 const VkSamplerCreateInfo createInfo =
2306 VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
2308 (VkSamplerCreateFlags)0,
2309 mapFilterMode(sampler.magFilter), // magFilter
2310 mapFilterMode(sampler.minFilter), // minFilter
2311 mapMipmapMode(sampler.minFilter), // mipMode
2312 mapWrapMode(sampler.wrapS), // addressU
2313 mapWrapMode(sampler.wrapT), // addressV
2314 mapWrapMode(sampler.wrapR), // addressW
2316 VK_FALSE, // anisotropyEnable
2317 1.0f, // maxAnisotropy
2318 (VkBool32)(compareEnabled ? VK_TRUE : VK_FALSE), // compareEnable
2319 compareOp, // compareOp
2320 (isMipmapEnabled ? minLod : 0.0f), // minLod
2321 (isMipmapEnabled ? maxLod : 0.25f), // maxLod
2322 borderColor, // borderColor
2323 (VkBool32)(sampler.normalizedCoords ? VK_FALSE : VK_TRUE), // unnormalizedCoords
2329 tcu::Sampler mapVkSampler (const VkSamplerCreateInfo& samplerCreateInfo)
2331 // \note minLod & maxLod are not supported by tcu::Sampler. LOD must be clamped
2332 // before passing it to tcu::Texture*::sample*()
2334 tcu::Sampler::ReductionMode reductionMode = tcu::Sampler::WEIGHTED_AVERAGE;
2336 void const *pNext = samplerCreateInfo.pNext;
2337 while (pNext != DE_NULL)
2339 const VkStructureType nextType = *reinterpret_cast<const VkStructureType*>(pNext);
2342 case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT:
2344 const VkSamplerReductionModeCreateInfoEXT reductionModeCreateInfo = *reinterpret_cast<const VkSamplerReductionModeCreateInfoEXT*>(pNext);
2345 reductionMode = mapVkSamplerReductionMode(reductionModeCreateInfo.reductionMode);
2346 pNext = reinterpret_cast<const VkSamplerReductionModeCreateInfoEXT*>(pNext)->pNext;
2349 case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
2350 pNext = reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(pNext)->pNext;
2353 TCU_FAIL("Unrecognized sType in chained sampler create info");
2359 tcu::Sampler sampler(mapVkSamplerAddressMode(samplerCreateInfo.addressModeU),
2360 mapVkSamplerAddressMode(samplerCreateInfo.addressModeV),
2361 mapVkSamplerAddressMode(samplerCreateInfo.addressModeW),
2362 mapVkMinTexFilter(samplerCreateInfo.minFilter, samplerCreateInfo.mipmapMode),
2363 mapVkMagTexFilter(samplerCreateInfo.magFilter),
2365 !samplerCreateInfo.unnormalizedCoordinates,
2366 samplerCreateInfo.compareEnable ? mapVkSamplerCompareOp(samplerCreateInfo.compareOp)
2367 : tcu::Sampler::COMPAREMODE_NONE,
2369 tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f),
2371 tcu::Sampler::MODE_DEPTH,
2374 if (samplerCreateInfo.anisotropyEnable)
2375 TCU_THROW(InternalError, "Anisotropic filtering is not supported by tcu::Sampler");
2377 switch (samplerCreateInfo.borderColor)
2379 case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
2380 sampler.borderColor = tcu::UVec4(0,0,0,1);
2382 case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
2383 sampler.borderColor = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
2385 case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
2386 sampler.borderColor = tcu::UVec4(1, 1, 1, 1);
2388 case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
2389 sampler.borderColor = tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f);
2391 case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
2392 sampler.borderColor = tcu::UVec4(0,0,0,0);
2394 case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
2395 sampler.borderColor = tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f);
2406 tcu::Sampler::CompareMode mapVkSamplerCompareOp (VkCompareOp compareOp)
2410 case VK_COMPARE_OP_NEVER: return tcu::Sampler::COMPAREMODE_NEVER;
2411 case VK_COMPARE_OP_LESS: return tcu::Sampler::COMPAREMODE_LESS;
2412 case VK_COMPARE_OP_EQUAL: return tcu::Sampler::COMPAREMODE_EQUAL;
2413 case VK_COMPARE_OP_LESS_OR_EQUAL: return tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL;
2414 case VK_COMPARE_OP_GREATER: return tcu::Sampler::COMPAREMODE_GREATER;
2415 case VK_COMPARE_OP_NOT_EQUAL: return tcu::Sampler::COMPAREMODE_NOT_EQUAL;
2416 case VK_COMPARE_OP_GREATER_OR_EQUAL: return tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL;
2417 case VK_COMPARE_OP_ALWAYS: return tcu::Sampler::COMPAREMODE_ALWAYS;
2423 return tcu::Sampler::COMPAREMODE_LAST;
2426 tcu::Sampler::WrapMode mapVkSamplerAddressMode (VkSamplerAddressMode addressMode)
2428 switch (addressMode)
2430 case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE: return tcu::Sampler::CLAMP_TO_EDGE;
2431 case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER: return tcu::Sampler::CLAMP_TO_BORDER;
2432 case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT: return tcu::Sampler::MIRRORED_REPEAT_GL;
2433 case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE: return tcu::Sampler::MIRRORED_ONCE;
2434 case VK_SAMPLER_ADDRESS_MODE_REPEAT: return tcu::Sampler::REPEAT_GL;
2440 return tcu::Sampler::WRAPMODE_LAST;
2443 tcu::Sampler::ReductionMode mapVkSamplerReductionMode (VkSamplerReductionModeEXT reductionMode)
2445 switch (reductionMode)
2447 case VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT: return tcu::Sampler::WEIGHTED_AVERAGE;
2448 case VK_SAMPLER_REDUCTION_MODE_MIN_EXT: return tcu::Sampler::MIN;
2449 case VK_SAMPLER_REDUCTION_MODE_MAX_EXT: return tcu::Sampler::MAX;
2455 return tcu::Sampler::REDUCTIONMODE_LAST;
2458 tcu::Sampler::FilterMode mapVkMinTexFilter (VkFilter filter, VkSamplerMipmapMode mipMode)
2462 case VK_FILTER_LINEAR:
2465 case VK_SAMPLER_MIPMAP_MODE_LINEAR: return tcu::Sampler::LINEAR_MIPMAP_LINEAR;
2466 case VK_SAMPLER_MIPMAP_MODE_NEAREST: return tcu::Sampler::LINEAR_MIPMAP_NEAREST;
2472 case VK_FILTER_NEAREST:
2475 case VK_SAMPLER_MIPMAP_MODE_LINEAR: return tcu::Sampler::NEAREST_MIPMAP_LINEAR;
2476 case VK_SAMPLER_MIPMAP_MODE_NEAREST: return tcu::Sampler::NEAREST_MIPMAP_NEAREST;
2487 return tcu::Sampler::FILTERMODE_LAST;
2490 tcu::Sampler::FilterMode mapVkMagTexFilter (VkFilter filter)
2494 case VK_FILTER_LINEAR: return tcu::Sampler::LINEAR;
2495 case VK_FILTER_NEAREST: return tcu::Sampler::NEAREST;
2501 return tcu::Sampler::FILTERMODE_LAST;
2504 //! Get a format the matches the layout in buffer memory used for a
2505 //! buffer<->image copy on a depth/stencil format.
2506 tcu::TextureFormat getDepthCopyFormat (VkFormat combinedFormat)
2508 switch (combinedFormat)
2510 case VK_FORMAT_D16_UNORM:
2511 case VK_FORMAT_X8_D24_UNORM_PACK32:
2512 case VK_FORMAT_D32_SFLOAT:
2513 return mapVkFormat(combinedFormat);
2515 case VK_FORMAT_D16_UNORM_S8_UINT:
2516 return mapVkFormat(VK_FORMAT_D16_UNORM);
2517 case VK_FORMAT_D24_UNORM_S8_UINT:
2518 return mapVkFormat(VK_FORMAT_X8_D24_UNORM_PACK32);
2519 case VK_FORMAT_D32_SFLOAT_S8_UINT:
2520 return mapVkFormat(VK_FORMAT_D32_SFLOAT);
2522 case VK_FORMAT_S8_UINT:
2524 DE_FATAL("Unexpected depth/stencil format");
2525 return tcu::TextureFormat();
2529 //! Get a format the matches the layout in buffer memory used for a
2530 //! buffer<->image copy on a depth/stencil format.
2531 tcu::TextureFormat getStencilCopyFormat (VkFormat combinedFormat)
2533 switch (combinedFormat)
2535 case VK_FORMAT_D16_UNORM_S8_UINT:
2536 case VK_FORMAT_D24_UNORM_S8_UINT:
2537 case VK_FORMAT_D32_SFLOAT_S8_UINT:
2538 case VK_FORMAT_S8_UINT:
2539 return mapVkFormat(VK_FORMAT_S8_UINT);
2541 case VK_FORMAT_D16_UNORM:
2542 case VK_FORMAT_X8_D24_UNORM_PACK32:
2543 case VK_FORMAT_D32_SFLOAT:
2545 DE_FATAL("Unexpected depth/stencil format");
2546 return tcu::TextureFormat();