Home | History | Annotate | Download | only in vulkan
      1 /*-------------------------------------------------------------------------
      2  * Vulkan CTS Framework
      3  * --------------------
      4  *
      5  * Copyright (c) 2015 The Khronos Group Inc.
      6  * Copyright (c) 2015 Imagination Technologies Ltd.
      7  * Copyright (c) 2015 Google Inc.
      8  *
      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
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     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.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Utilities for images.
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "vkImageUtil.hpp"
     27 #include "tcuTextureUtil.hpp"
     28 
     29 namespace vk
     30 {
     31 
     32 bool isFloatFormat (VkFormat format)
     33 {
     34 	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
     35 }
     36 
     37 bool isUnormFormat (VkFormat format)
     38 {
     39 	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
     40 }
     41 
     42 bool isSnormFormat (VkFormat format)
     43 {
     44 	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
     45 }
     46 
     47 bool isIntFormat (VkFormat format)
     48 {
     49 	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER;
     50 }
     51 
     52 bool isUintFormat (VkFormat format)
     53 {
     54 	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
     55 }
     56 
     57 bool isDepthStencilFormat (VkFormat format)
     58 {
     59 	if (isCompressedFormat(format))
     60 		return false;
     61 
     62 	const tcu::TextureFormat tcuFormat = mapVkFormat(format);
     63 	return tcuFormat.order == tcu::TextureFormat::D || tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS;
     64 }
     65 
     66 bool isSrgbFormat (VkFormat format)
     67 {
     68 	switch (mapVkFormat(format).order)
     69 	{
     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:
     76 			return true;
     77 
     78 		default:
     79 			return false;
     80 	}
     81 }
     82 
     83 bool isCompressedFormat (VkFormat format)
     84 {
     85 	// update this mapping if VkFormat changes
     86 	DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
     87 
     88 	switch (format)
     89 	{
     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:
    144 			return true;
    145 
    146 		default:
    147 			return false;
    148 	}
    149 }
    150 
    151 bool isYCbCrFormat (VkFormat format)
    152 {
    153 	switch (format)
    154 	{
    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:
    189 			return true;
    190 
    191 		default:
    192 			return false;
    193 	}
    194 }
    195 
    196 const PlanarFormatDescription& getYCbCrPlanarFormatDescription (VkFormat format)
    197 {
    198 	using tcu::TextureFormat;
    199 
    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;
    204 
    205 	const deUint8	unorm			= (deUint8)tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
    206 
    207 	static const PlanarFormatDescription s_formatInfo[] =
    208 	{
    209 		// VK_FORMAT_G8B8G8R8_422_UNORM_KHR
    210 		{
    211 			1, // planes
    212 			chanR|chanG|chanB,
    213 			{
    214 			//		Size	WDiv	HDiv
    215 				{	4,		2,		1	},
    216 				{	0,		0,		0	},
    217 				{	0,		0,		0	},
    218 			},
    219 			{
    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
    224 				{ 0, 0, 0, 0, 0 }
    225 			}
    226 		},
    227 		// VK_FORMAT_B8G8R8G8_422_UNORM_KHR
    228 		{
    229 			1, // planes
    230 			chanR|chanG|chanB,
    231 			{
    232 			//		Size	WDiv	HDiv
    233 				{	4,		2,		1 },
    234 				{	0,		0,		0 },
    235 				{	0,		0,		0 },
    236 			},
    237 			{
    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
    242 				{ 0, 0, 0, 0, 0 }
    243 			}
    244 		},
    245 		// VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR
    246 		{
    247 			3, // planes
    248 			chanR|chanG|chanB,
    249 			{
    250 			//		Size	WDiv	HDiv
    251 				{  1, 1, 1 },
    252 				{  1, 2, 2 },
    253 				{  1, 2, 2 },
    254 			},
    255 			{
    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
    260 				{ 0, 0, 0, 0, 0 }
    261 			}
    262 		},
    263 		// VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR
    264 		{
    265 			2, // planes
    266 			chanR|chanG|chanB,
    267 			{
    268 			//		Size	WDiv	HDiv
    269 				{  1, 1, 1 },
    270 				{  2, 2, 2 },
    271 				{  0, 0, 0 },
    272 			},
    273 			{
    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
    278 				{ 0, 0, 0, 0, 0 }
    279 			}
    280 		},
    281 		// VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR
    282 		{
    283 			3, // planes
    284 			chanR|chanG|chanB,
    285 			{
    286 			//		Size	WDiv	HDiv
    287 				{  1, 1, 1 },
    288 				{  1, 2, 1 },
    289 				{  1, 2, 1 },
    290 			},
    291 			{
    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
    296 				{ 0, 0, 0, 0, 0 }
    297 			}
    298 		},
    299 		// VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR
    300 		{
    301 			2, // planes
    302 			chanR|chanG|chanB,
    303 			{
    304 			//		Size	WDiv	HDiv
    305 				{  1, 1, 1 },
    306 				{  2, 2, 1 },
    307 				{  0, 0, 0 },
    308 			},
    309 			{
    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
    314 				{ 0, 0, 0, 0, 0 }
    315 			}
    316 		},
    317 		// VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR
    318 		{
    319 			3, // planes
    320 			chanR|chanG|chanB,
    321 			{
    322 			//		Size	WDiv	HDiv
    323 				{  1, 1, 1 },
    324 				{  1, 1, 1 },
    325 				{  1, 1, 1 },
    326 			},
    327 			{
    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
    332 				{ 0, 0, 0, 0, 0 }
    333 			}
    334 		},
    335 		// VK_FORMAT_R10X6_UNORM_PACK16_KHR
    336 		{
    337 			1, // planes
    338 			chanR,
    339 			{
    340 			//		Size	WDiv	HDiv
    341 				{	2,		1,		1 },
    342 				{	0,		0,		0 },
    343 				{	0,		0,		0 },
    344 			},
    345 			{
    346 			//		Plane	Type	Offs	Size	Stride
    347 				{	0,		unorm,	6,		10,		2 },	// R
    348 				{ 0, 0, 0, 0, 0 },
    349 				{ 0, 0, 0, 0, 0 },
    350 				{ 0, 0, 0, 0, 0 },
    351 			}
    352 		},
    353 		// VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR
    354 		{
    355 			1, // planes
    356 			chanR|chanG,
    357 			{
    358 			//		Size	WDiv	HDiv
    359 				{	4,		1,		1 },
    360 				{	0,		0,		0 },
    361 				{	0,		0,		0 },
    362 			},
    363 			{
    364 			//		Plane	Type	Offs	Size	Stride
    365 				{	0,		unorm,	6,		10,		4 },	// R
    366 				{	0,		unorm,	22,		10,		4 },	// G
    367 				{ 0, 0, 0, 0, 0 },
    368 				{ 0, 0, 0, 0, 0 },
    369 			}
    370 		},
    371 		// VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR
    372 		{
    373 			1, // planes
    374 			chanR|chanG|chanB|chanA,
    375 			{
    376 			//		Size	WDiv	HDiv
    377 				{	8,		1,		1 },
    378 				{	0,		0,		0 },
    379 				{	0,		0,		0 },
    380 			},
    381 			{
    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
    387 			}
    388 		},
    389 		// VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR
    390 		{
    391 			1, // planes
    392 			chanR|chanG|chanB,
    393 			{
    394 			//		Size	WDiv	HDiv
    395 				{	8,		2,		1 },
    396 				{	0,		0,		0 },
    397 				{	0,		0,		0 },
    398 			},
    399 			{
    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
    404 				{ 0, 0, 0, 0, 0 }
    405 			}
    406 		},
    407 		// VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR
    408 		{
    409 			1, // planes
    410 			chanR|chanG|chanB,
    411 			{
    412 			//		Size	WDiv	HDiv
    413 				{	8,		2,		1 },
    414 				{	0,		0,		0 },
    415 				{	0,		0,		0 },
    416 			},
    417 			{
    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
    422 				{ 0, 0, 0, 0, 0 }
    423 			}
    424 		},
    425 		// VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR
    426 		{
    427 			3, // planes
    428 			chanR|chanG|chanB,
    429 			{
    430 			//		Size	WDiv	HDiv
    431 				{	2,		1,		1 },
    432 				{	2,		2,		2 },
    433 				{	2,		2,		2 },
    434 			},
    435 			{
    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
    440 				{ 0, 0, 0, 0, 0 }
    441 			}
    442 		},
    443 		// VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR
    444 		{
    445 			2, // planes
    446 			chanR|chanG|chanB,
    447 			{
    448 			//		Size	WDiv	HDiv
    449 				{	2,		1,		1 },
    450 				{	4,		2,		2 },
    451 				{	0,		0,		0 },
    452 			},
    453 			{
    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
    458 				{ 0, 0, 0, 0, 0 }
    459 			}
    460 		},
    461 		// VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR
    462 		{
    463 			3, // planes
    464 			chanR|chanG|chanB,
    465 			{
    466 			//		Size	WDiv	HDiv
    467 				{	2,		1,		1 },
    468 				{	2,		2,		1 },
    469 				{	2,		2,		1 },
    470 			},
    471 			{
    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
    476 				{ 0, 0, 0, 0, 0 }
    477 			}
    478 		},
    479 		// VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR
    480 		{
    481 			2, // planes
    482 			chanR|chanG|chanB,
    483 			{
    484 			//		Size	WDiv	HDiv
    485 				{	2,		1,		1 },
    486 				{	4,		2,		1 },
    487 				{	0,		0,		0 },
    488 			},
    489 			{
    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
    494 				{ 0, 0, 0, 0, 0 }
    495 			}
    496 		},
    497 		// VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR
    498 		{
    499 			3, // planes
    500 			chanR|chanG|chanB,
    501 			{
    502 			//		Size	WDiv	HDiv
    503 				{	2,		1,		1 },
    504 				{	2,		1,		1 },
    505 				{	2,		1,		1 },
    506 			},
    507 			{
    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
    512 				{ 0, 0, 0, 0, 0 }
    513 			}
    514 		},
    515 		// VK_FORMAT_R12X4_UNORM_PACK16_KHR
    516 		{
    517 			1, // planes
    518 			chanR,
    519 			{
    520 			//		Size	WDiv	HDiv
    521 				{	2,		1,		1 },
    522 				{	0,		0,		0 },
    523 				{	0,		0,		0 },
    524 			},
    525 			{
    526 			//		Plane	Type	Offs	Size	Stride
    527 				{	0,		unorm,	4,		12,		2 },	// R
    528 				{ 0, 0, 0, 0, 0 },
    529 				{ 0, 0, 0, 0, 0 },
    530 				{ 0, 0, 0, 0, 0 },
    531 			}
    532 		},
    533 		// VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR
    534 		{
    535 			1, // planes
    536 			chanR|chanG,
    537 			{
    538 			//		Size	WDiv	HDiv
    539 				{	4,		1,		1 },
    540 				{	0,		0,		0 },
    541 				{	0,		0,		0 },
    542 			},
    543 			{
    544 			//		Plane	Type	Offs	Size	Stride
    545 				{	0,		unorm,	4,		12,		4 },	// R
    546 				{	0,		unorm,	20,		12,		4 },	// G
    547 				{ 0, 0, 0, 0, 0 },
    548 				{ 0, 0, 0, 0, 0 },
    549 			}
    550 		},
    551 		// VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR
    552 		{
    553 			1, // planes
    554 			chanR|chanG|chanB|chanA,
    555 			{
    556 			//		Size	WDiv	HDiv
    557 				{	8,		1,		1 },
    558 				{	0,		0,		0 },
    559 				{	0,		0,		0 },
    560 			},
    561 			{
    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
    567 			}
    568 		},
    569 		// VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR
    570 		{
    571 			1, // planes
    572 			chanR|chanG|chanB,
    573 			{
    574 			//		Size	WDiv	HDiv
    575 				{	8,		2,		1 },
    576 				{	0,		0,		0 },
    577 				{	0,		0,		0 },
    578 			},
    579 			{
    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
    584 				{ 0, 0, 0, 0, 0 }
    585 			}
    586 		},
    587 		// VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR
    588 		{
    589 			1, // planes
    590 			chanR|chanG|chanB,
    591 			{
    592 			//		Size	WDiv	HDiv
    593 				{	8,		2,		1 },
    594 				{	0,		0,		0 },
    595 				{	0,		0,		0 },
    596 			},
    597 			{
    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
    602 				{ 0, 0, 0, 0, 0 }
    603 			}
    604 		},
    605 		// VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR
    606 		{
    607 			3, // planes
    608 			chanR|chanG|chanB,
    609 			{
    610 			//		Size	WDiv	HDiv
    611 				{	2,		1,		1 },
    612 				{	2,		2,		2 },
    613 				{	2,		2,		2 },
    614 			},
    615 			{
    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
    620 				{ 0, 0, 0, 0, 0 }
    621 			}
    622 		},
    623 		// VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR
    624 		{
    625 			2, // planes
    626 			chanR|chanG|chanB,
    627 			{
    628 			//		Size	WDiv	HDiv
    629 				{	2,		1,		1 },
    630 				{	4,		2,		2 },
    631 				{	0,		0,		0 },
    632 			},
    633 			{
    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
    638 				{ 0, 0, 0, 0, 0 }
    639 			}
    640 		},
    641 		// VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR
    642 		{
    643 			3, // planes
    644 			chanR|chanG|chanB,
    645 			{
    646 			//		Size	WDiv	HDiv
    647 				{	2,		1,		1 },
    648 				{	2,		2,		1 },
    649 				{	2,		2,		1 },
    650 			},
    651 			{
    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
    656 				{ 0, 0, 0, 0, 0 }
    657 			}
    658 		},
    659 		// VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR
    660 		{
    661 			2, // planes
    662 			chanR|chanG|chanB,
    663 			{
    664 			//		Size	WDiv	HDiv
    665 				{	2,		1,		1 },
    666 				{	4,		2,		1 },
    667 				{	0,		0,		0 },
    668 			},
    669 			{
    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
    674 				{ 0, 0, 0, 0, 0 }
    675 			}
    676 		},
    677 		// VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR
    678 		{
    679 			3, // planes
    680 			chanR|chanG|chanB,
    681 			{
    682 			//		Size	WDiv	HDiv
    683 				{	2,		1,		1 },
    684 				{	2,		1,		1 },
    685 				{	2,		1,		1 },
    686 			},
    687 			{
    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
    692 				{ 0, 0, 0, 0, 0 }
    693 			}
    694 		},
    695 		// VK_FORMAT_G16B16G16R16_422_UNORM_KHR
    696 		{
    697 			1, // planes
    698 			chanR|chanG|chanB,
    699 			{
    700 			//		Size	WDiv	HDiv
    701 				{	8,		2,		1 },
    702 				{	0,		0,		0 },
    703 				{	0,		0,		0 },
    704 			},
    705 			{
    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
    710 				{ 0, 0, 0, 0, 0 }
    711 			}
    712 		},
    713 		// VK_FORMAT_B16G16R16G16_422_UNORM_KHR
    714 		{
    715 			1, // planes
    716 			chanR|chanG|chanB,
    717 			{
    718 			//		Size	WDiv	HDiv
    719 				{	8,		2,		1 },
    720 				{	0,		0,		0 },
    721 				{	0,		0,		0 },
    722 			},
    723 			{
    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
    728 				{ 0, 0, 0, 0, 0 }
    729 			}
    730 		},
    731 		// VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR
    732 		{
    733 			3, // planes
    734 			chanR|chanG|chanB,
    735 			{
    736 			//		Size	WDiv	HDiv
    737 				{	2,		1,		1 },
    738 				{	2,		2,		2 },
    739 				{	2,		2,		2 },
    740 			},
    741 			{
    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
    746 				{ 0, 0, 0, 0, 0 }
    747 			}
    748 		},
    749 		// VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR
    750 		{
    751 			2, // planes
    752 			chanR|chanG|chanB,
    753 			{
    754 			//		Size	WDiv	HDiv
    755 				{	2,		1,		1 },
    756 				{	4,		2,		2 },
    757 				{	0,		0,		0 },
    758 			},
    759 			{
    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
    764 				{ 0, 0, 0, 0, 0 }
    765 			}
    766 		},
    767 		// VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR
    768 		{
    769 			3, // planes
    770 			chanR|chanG|chanB,
    771 			{
    772 			//		Size	WDiv	HDiv
    773 				{	2,		1,		1 },
    774 				{	2,		2,		1 },
    775 				{	2,		2,		1 },
    776 			},
    777 			{
    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
    782 				{ 0, 0, 0, 0, 0 }
    783 			}
    784 		},
    785 		// VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR
    786 		{
    787 			2, // planes
    788 			chanR|chanG|chanB,
    789 			{
    790 			//		Size	WDiv	HDiv
    791 				{	2,		1,		1 },
    792 				{	4,		2,		1 },
    793 				{	0,		0,		0 },
    794 			},
    795 			{
    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
    800 				{ 0, 0, 0, 0, 0 }
    801 			}
    802 		},
    803 		// VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR
    804 		{
    805 			3, // planes
    806 			chanR|chanG|chanB,
    807 			{
    808 			//		Size	WDiv	HDiv
    809 				{	2,		1,		1 },
    810 				{	2,		1,		1 },
    811 				{	2,		1,		1 },
    812 			},
    813 			{
    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
    818 				{ 0, 0, 0, 0, 0 }
    819 			}
    820 		},
    821 	};
    822 
    823 	const size_t	offset	= (size_t)VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
    824 
    825 	DE_ASSERT(de::inBounds<size_t>((size_t)format, offset, offset+(size_t)DE_LENGTH_OF_ARRAY(s_formatInfo)));
    826 
    827 	return s_formatInfo[(size_t)format-offset];
    828 }
    829 
    830 PlanarFormatDescription getCorePlanarFormatDescription (VkFormat format)
    831 {
    832 	const deUint8			unorm	= (deUint8)tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
    833 
    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;
    838 
    839 	DE_ASSERT(de::inBounds<deUint32>(format, VK_FORMAT_UNDEFINED+1, VK_CORE_FORMAT_LAST));
    840 
    841 #if (DE_ENDIANNESS != DE_LITTLE_ENDIAN)
    842 #	error "Big-endian is not supported"
    843 #endif
    844 
    845 	switch (format)
    846 	{
    847 		case VK_FORMAT_R8_UNORM:
    848 		{
    849 			const PlanarFormatDescription	desc	=
    850 			{
    851 				1, // planes
    852 				chanR,
    853 				{
    854 				//		Size	WDiv	HDiv
    855 					{	1,		1,		1 },
    856 					{	0,		0,		0 },
    857 					{	0,		0,		0 },
    858 				},
    859 				{
    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
    865 				}
    866 			};
    867 			return desc;
    868 		}
    869 
    870 		case VK_FORMAT_R8G8_UNORM:
    871 		{
    872 			const PlanarFormatDescription	desc	=
    873 			{
    874 				1, // planes
    875 				chanR|chanG,
    876 				{
    877 				//		Size	WDiv	HDiv
    878 					{	2,		1,		1 },
    879 					{	0,		0,		0 },
    880 					{	0,		0,		0 },
    881 				},
    882 				{
    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
    888 				}
    889 			};
    890 			return desc;
    891 		}
    892 
    893 		case VK_FORMAT_R16_UNORM:
    894 		{
    895 			const PlanarFormatDescription	desc	=
    896 			{
    897 				1, // planes
    898 				chanR,
    899 				{
    900 				//		Size	WDiv	HDiv
    901 					{	2,		1,		1 },
    902 					{	0,		0,		0 },
    903 					{	0,		0,		0 },
    904 				},
    905 				{
    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
    911 				}
    912 			};
    913 			return desc;
    914 		}
    915 
    916 		case VK_FORMAT_R16G16_UNORM:
    917 		{
    918 			const PlanarFormatDescription	desc	=
    919 			{
    920 				1, // planes
    921 				chanR|chanG,
    922 				{
    923 				//		Size	WDiv	HDiv
    924 					{	4,		1,		1 },
    925 					{	0,		0,		0 },
    926 					{	0,		0,		0 },
    927 				},
    928 				{
    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
    934 				}
    935 			};
    936 			return desc;
    937 		}
    938 
    939 		case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
    940 		{
    941 			const PlanarFormatDescription	desc	=
    942 			{
    943 				1, // planes
    944 				chanR|chanG|chanB,
    945 				{
    946 				//		Size	WDiv	HDiv
    947 					{	4,		1,		1 },
    948 					{	0,		0,		0 },
    949 					{	0,		0,		0 },
    950 				},
    951 				{
    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
    957 				}
    958 			};
    959 			return desc;
    960 		}
    961 
    962 		case VK_FORMAT_R4G4_UNORM_PACK8:
    963 		{
    964 			const PlanarFormatDescription	desc	=
    965 			{
    966 				1, // planes
    967 				chanR|chanG,
    968 				{
    969 				//		Size	WDiv	HDiv
    970 					{	1,		1,		1 },
    971 					{	0,		0,		0 },
    972 					{	0,		0,		0 },
    973 				},
    974 				{
    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
    980 				}
    981 			};
    982 			return desc;
    983 		}
    984 
    985 		case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
    986 		{
    987 			const PlanarFormatDescription	desc	=
    988 			{
    989 				1, // planes
    990 				chanR|chanG|chanB|chanA,
    991 				{
    992 				//		Size	WDiv	HDiv
    993 					{	2,		1,		1 },
    994 					{	0,		0,		0 },
    995 					{	0,		0,		0 },
    996 				},
    997 				{
    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
   1003 				}
   1004 			};
   1005 			return desc;
   1006 		}
   1007 
   1008 		case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
   1009 		{
   1010 			const PlanarFormatDescription	desc	=
   1011 			{
   1012 				1, // planes
   1013 				chanR|chanG|chanB|chanA,
   1014 				{
   1015 				//		Size	WDiv	HDiv
   1016 					{	2,		1,		1 },
   1017 					{	0,		0,		0 },
   1018 					{	0,		0,		0 },
   1019 				},
   1020 				{
   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
   1026 				}
   1027 			};
   1028 			return desc;
   1029 		}
   1030 
   1031 		case VK_FORMAT_R5G6B5_UNORM_PACK16:
   1032 		{
   1033 			const PlanarFormatDescription	desc	=
   1034 			{
   1035 				1, // planes
   1036 				chanR|chanG|chanB,
   1037 				{
   1038 				//		Size	WDiv	HDiv
   1039 					{	2,		1,		1 },
   1040 					{	0,		0,		0 },
   1041 					{	0,		0,		0 },
   1042 				},
   1043 				{
   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
   1049 				}
   1050 			};
   1051 			return desc;
   1052 		}
   1053 
   1054 		case VK_FORMAT_B5G6R5_UNORM_PACK16:
   1055 		{
   1056 			const PlanarFormatDescription	desc	=
   1057 			{
   1058 				1, // planes
   1059 				chanR|chanG|chanB,
   1060 				{
   1061 				//		Size	WDiv	HDiv
   1062 					{	2,		1,		1 },
   1063 					{	0,		0,		0 },
   1064 					{	0,		0,		0 },
   1065 				},
   1066 				{
   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
   1072 				}
   1073 			};
   1074 			return desc;
   1075 		}
   1076 
   1077 		case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
   1078 		{
   1079 			const PlanarFormatDescription	desc	=
   1080 			{
   1081 				1, // planes
   1082 				chanR|chanG|chanB|chanA,
   1083 				{
   1084 				//		Size	WDiv	HDiv
   1085 					{	2,		1,		1 },
   1086 					{	0,		0,		0 },
   1087 					{	0,		0,		0 },
   1088 				},
   1089 				{
   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
   1095 				}
   1096 			};
   1097 			return desc;
   1098 		}
   1099 
   1100 		case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
   1101 		{
   1102 			const PlanarFormatDescription	desc	=
   1103 			{
   1104 				1, // planes
   1105 				chanR|chanG|chanB|chanA,
   1106 				{
   1107 				//		Size	WDiv	HDiv
   1108 					{	2,		1,		1 },
   1109 					{	0,		0,		0 },
   1110 					{	0,		0,		0 },
   1111 				},
   1112 				{
   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
   1118 				}
   1119 			};
   1120 			return desc;
   1121 		}
   1122 
   1123 		case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
   1124 		{
   1125 			const PlanarFormatDescription	desc	=
   1126 			{
   1127 				1, // planes
   1128 				chanR|chanG|chanB|chanA,
   1129 				{
   1130 				//		Size	WDiv	HDiv
   1131 					{	2,		1,		1 },
   1132 					{	0,		0,		0 },
   1133 					{	0,		0,		0 },
   1134 				},
   1135 				{
   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
   1141 				}
   1142 			};
   1143 			return desc;
   1144 		}
   1145 
   1146 		case VK_FORMAT_R8G8B8_UNORM:
   1147 		{
   1148 			const PlanarFormatDescription	desc	=
   1149 			{
   1150 				1, // planes
   1151 				chanR|chanG|chanB,
   1152 				{
   1153 				//		Size	WDiv	HDiv
   1154 					{	3,		1,		1 },
   1155 					{	0,		0,		0 },
   1156 					{	0,		0,		0 },
   1157 				},
   1158 				{
   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
   1164 				}
   1165 			};
   1166 			return desc;
   1167 		}
   1168 
   1169 		case VK_FORMAT_B8G8R8_UNORM:
   1170 		{
   1171 			const PlanarFormatDescription	desc	=
   1172 			{
   1173 				1, // planes
   1174 				chanR|chanG|chanB,
   1175 				{
   1176 				//		Size	WDiv	HDiv
   1177 					{	3,		1,		1 },
   1178 					{	0,		0,		0 },
   1179 					{	0,		0,		0 },
   1180 				},
   1181 				{
   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
   1187 				}
   1188 			};
   1189 			return desc;
   1190 		}
   1191 
   1192 		case VK_FORMAT_R8G8B8A8_UNORM:
   1193 		case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
   1194 		{
   1195 			const PlanarFormatDescription	desc	=
   1196 			{
   1197 				1, // planes
   1198 				chanR|chanG|chanB|chanA,
   1199 				{
   1200 				//		Size	WDiv	HDiv
   1201 					{	4,		1,		1 },
   1202 					{	0,		0,		0 },
   1203 					{	0,		0,		0 },
   1204 				},
   1205 				{
   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
   1211 				}
   1212 			};
   1213 			return desc;
   1214 		}
   1215 
   1216 		case VK_FORMAT_B8G8R8A8_UNORM:
   1217 		{
   1218 			const PlanarFormatDescription	desc	=
   1219 			{
   1220 				1, // planes
   1221 				chanR|chanG|chanB|chanA,
   1222 				{
   1223 				//		Size	WDiv	HDiv
   1224 					{	4,		1,		1 },
   1225 					{	0,		0,		0 },
   1226 					{	0,		0,		0 },
   1227 				},
   1228 				{
   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
   1234 				}
   1235 			};
   1236 			return desc;
   1237 		}
   1238 
   1239 		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
   1240 		{
   1241 			const PlanarFormatDescription	desc	=
   1242 			{
   1243 				1, // planes
   1244 				chanR|chanG|chanB|chanA,
   1245 				{
   1246 				//		Size	WDiv	HDiv
   1247 					{	4,		1,		1 },
   1248 					{	0,		0,		0 },
   1249 					{	0,		0,		0 },
   1250 				},
   1251 				{
   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
   1257 				}
   1258 			};
   1259 			return desc;
   1260 		}
   1261 
   1262 		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
   1263 		{
   1264 			const PlanarFormatDescription	desc	=
   1265 			{
   1266 				1, // planes
   1267 				chanR|chanG|chanB|chanA,
   1268 				{
   1269 				//		Size	WDiv	HDiv
   1270 					{	4,		1,		1 },
   1271 					{	0,		0,		0 },
   1272 					{	0,		0,		0 },
   1273 				},
   1274 				{
   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
   1280 				}
   1281 			};
   1282 			return desc;
   1283 		}
   1284 
   1285 		case VK_FORMAT_R16G16B16_UNORM:
   1286 		{
   1287 			const PlanarFormatDescription	desc	=
   1288 			{
   1289 				1, // planes
   1290 				chanR|chanG|chanB,
   1291 				{
   1292 				//		Size	WDiv	HDiv
   1293 					{	6,		1,		1 },
   1294 					{	0,		0,		0 },
   1295 					{	0,		0,		0 },
   1296 				},
   1297 				{
   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
   1303 				}
   1304 			};
   1305 			return desc;
   1306 		}
   1307 
   1308 		case VK_FORMAT_R16G16B16A16_UNORM:
   1309 		{
   1310 			const PlanarFormatDescription	desc	=
   1311 			{
   1312 				1, // planes
   1313 				chanR|chanG|chanB|chanA,
   1314 				{
   1315 				//		Size	WDiv	HDiv
   1316 					{	16,		1,		1 },
   1317 					{	0,		0,		0 },
   1318 					{	0,		0,		0 },
   1319 				},
   1320 				{
   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
   1326 				}
   1327 			};
   1328 			return desc;
   1329 		}
   1330 
   1331 		default:
   1332 			TCU_THROW(InternalError, "Not implemented");
   1333 	}
   1334 }
   1335 
   1336 PlanarFormatDescription getPlanarFormatDescription (VkFormat format)
   1337 {
   1338 	if (isYCbCrFormat(format))
   1339 		return getYCbCrPlanarFormatDescription(format);
   1340 	else
   1341 		return getCorePlanarFormatDescription(format);
   1342 }
   1343 
   1344 int getPlaneCount (VkFormat format)
   1345 {
   1346 	switch (format)
   1347 	{
   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:
   1362 			return 1;
   1363 
   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:
   1372 			return 2;
   1373 
   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:
   1386 			return 3;
   1387 
   1388 		default:
   1389 			DE_FATAL("Not YCbCr format");
   1390 			return 0;
   1391 	}
   1392 }
   1393 
   1394 VkImageAspectFlagBits getPlaneAspect (deUint32 planeNdx)
   1395 {
   1396 	DE_ASSERT(de::inBounds(planeNdx, 0u, 3u));
   1397 	return (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_PLANE_0_BIT_KHR << planeNdx);
   1398 }
   1399 
   1400 deUint32 getAspectPlaneNdx (VkImageAspectFlagBits flags)
   1401 {
   1402 	switch (flags)
   1403 	{
   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;
   1407 		default:
   1408 			DE_FATAL("Invalid plane aspect");
   1409 			return 0;
   1410 	}
   1411 }
   1412 
   1413 bool isChromaSubsampled (VkFormat format)
   1414 {
   1415 	switch (format)
   1416 	{
   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:
   1445 			return true;
   1446 
   1447 		default:
   1448 			return false;
   1449 	}
   1450 }
   1451 
   1452 bool isSupportedByFramework (VkFormat format)
   1453 {
   1454 	if (format == VK_FORMAT_UNDEFINED || format > VK_CORE_FORMAT_LAST)
   1455 		return false;
   1456 
   1457 	switch (format)
   1458 	{
   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
   1472 			return false;
   1473 
   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:
   1490 			return false;
   1491 
   1492 		default:
   1493 			return true;
   1494 	}
   1495 }
   1496 
   1497 VkFormat mapTextureFormat (const tcu::TextureFormat& format)
   1498 {
   1499 	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST < (1<<16));
   1500 	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST < (1<<16));
   1501 
   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)
   1504 
   1505 	// update this mapping if VkFormat changes
   1506 	DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
   1507 
   1508 	switch (PACK_FMT(format.order, format.type))
   1509 	{
   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;
   1514 
   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;
   1518 
   1519 		case FMT_CASE(ARGB, UNORM_SHORT_1555):				return VK_FORMAT_A1R5G5B5_UNORM_PACK16;
   1520 
   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;
   1526 
   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;
   1532 
   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;
   1538 
   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;
   1544 
   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;
   1549 
   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;
   1555 
   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;
   1561 
   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;
   1567 
   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;
   1573 
   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;
   1577 
   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;
   1581 
   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;
   1585 
   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;
   1589 
   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;
   1594 
   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;
   1597 
   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;
   1603 
   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;
   1609 
   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;
   1614 
   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;
   1618 
   1619 		case FMT_CASE(S, UNSIGNED_INT8):					return VK_FORMAT_S8_UINT;
   1620 
   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;
   1624 
   1625 
   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;
   1629 
   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;
   1633 
   1634 		default:
   1635 			TCU_THROW(InternalError, "Unknown texture format");
   1636 	}
   1637 
   1638 #undef PACK_FMT
   1639 #undef FMT_CASE
   1640 }
   1641 
   1642 VkFormat mapCompressedTextureFormat (const tcu::CompressedTexFormat format)
   1643 {
   1644 	// update this mapping if CompressedTexFormat changes
   1645 	DE_STATIC_ASSERT(tcu::COMPRESSEDTEXFORMAT_LAST == 39);
   1646 
   1647 	switch (format)
   1648 	{
   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;
   1655 
   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;
   1660 
   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;
   1689 
   1690 		default:
   1691 			TCU_THROW(InternalError, "Unknown texture format");
   1692 			return VK_FORMAT_UNDEFINED;
   1693 	}
   1694 }
   1695 
   1696 tcu::TextureFormat mapVkFormat (VkFormat format)
   1697 {
   1698 	using tcu::TextureFormat;
   1699 
   1700 	// update this mapping if VkFormat changes
   1701 	DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
   1702 
   1703 	switch (format)
   1704 	{
   1705 		case VK_FORMAT_R4G4_UNORM_PACK8:		return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_BYTE_44);
   1706 		case VK_FORMAT_R5G6B5_UNORM_PACK16:		return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_SHORT_565);
   1707 		case VK_FORMAT_R4G4B4A4_UNORM_PACK16:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_SHORT_4444);
   1708 		case VK_FORMAT_R5G5B5A1_UNORM_PACK16:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_SHORT_5551);
   1709 
   1710 		case VK_FORMAT_B5G6R5_UNORM_PACK16:		return TextureFormat(TextureFormat::BGR,	TextureFormat::UNORM_SHORT_565);
   1711 		case VK_FORMAT_B4G4R4A4_UNORM_PACK16:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNORM_SHORT_4444);
   1712 		case VK_FORMAT_B5G5R5A1_UNORM_PACK16:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNORM_SHORT_5551);
   1713 
   1714 		case VK_FORMAT_A1R5G5B5_UNORM_PACK16:	return TextureFormat(TextureFormat::ARGB,	TextureFormat::UNORM_SHORT_1555);
   1715 
   1716 		case VK_FORMAT_R8_UNORM:				return TextureFormat(TextureFormat::R,		TextureFormat::UNORM_INT8);
   1717 		case VK_FORMAT_R8_SNORM:				return TextureFormat(TextureFormat::R,		TextureFormat::SNORM_INT8);
   1718 		case VK_FORMAT_R8_USCALED:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT8);
   1719 		case VK_FORMAT_R8_SSCALED:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT8);
   1720 		case VK_FORMAT_R8_UINT:					return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT8);
   1721 		case VK_FORMAT_R8_SINT:					return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT8);
   1722 		case VK_FORMAT_R8_SRGB:					return TextureFormat(TextureFormat::sR,		TextureFormat::UNORM_INT8);
   1723 
   1724 		case VK_FORMAT_R8G8_UNORM:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_INT8);
   1725 		case VK_FORMAT_R8G8_SNORM:				return TextureFormat(TextureFormat::RG,		TextureFormat::SNORM_INT8);
   1726 		case VK_FORMAT_R8G8_USCALED:			return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT8);
   1727 		case VK_FORMAT_R8G8_SSCALED:			return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT8);
   1728 		case VK_FORMAT_R8G8_UINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT8);
   1729 		case VK_FORMAT_R8G8_SINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT8);
   1730 		case VK_FORMAT_R8G8_SRGB:				return TextureFormat(TextureFormat::sRG,	TextureFormat::UNORM_INT8);
   1731 
   1732 		case VK_FORMAT_R8G8B8_UNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_INT8);
   1733 		case VK_FORMAT_R8G8B8_SNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SNORM_INT8);
   1734 		case VK_FORMAT_R8G8B8_USCALED:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT8);
   1735 		case VK_FORMAT_R8G8B8_SSCALED:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT8);
   1736 		case VK_FORMAT_R8G8B8_UINT:				return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT8);
   1737 		case VK_FORMAT_R8G8B8_SINT:				return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT8);
   1738 		case VK_FORMAT_R8G8B8_SRGB:				return TextureFormat(TextureFormat::sRGB,	TextureFormat::UNORM_INT8);
   1739 
   1740 		case VK_FORMAT_R8G8B8A8_UNORM:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT8);
   1741 		case VK_FORMAT_R8G8B8A8_SNORM:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT8);
   1742 		case VK_FORMAT_R8G8B8A8_USCALED:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
   1743 		case VK_FORMAT_R8G8B8A8_SSCALED:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
   1744 		case VK_FORMAT_R8G8B8A8_UINT:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
   1745 		case VK_FORMAT_R8G8B8A8_SINT:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
   1746 		case VK_FORMAT_R8G8B8A8_SRGB:			return TextureFormat(TextureFormat::sRGBA,	TextureFormat::UNORM_INT8);
   1747 
   1748 		case VK_FORMAT_R16_UNORM:				return TextureFormat(TextureFormat::R,		TextureFormat::UNORM_INT16);
   1749 		case VK_FORMAT_R16_SNORM:				return TextureFormat(TextureFormat::R,		TextureFormat::SNORM_INT16);
   1750 		case VK_FORMAT_R16_USCALED:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT16);
   1751 		case VK_FORMAT_R16_SSCALED:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT16);
   1752 		case VK_FORMAT_R16_UINT:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT16);
   1753 		case VK_FORMAT_R16_SINT:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT16);
   1754 		case VK_FORMAT_R16_SFLOAT:				return TextureFormat(TextureFormat::R,		TextureFormat::HALF_FLOAT);
   1755 
   1756 		case VK_FORMAT_R16G16_UNORM:			return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_INT16);
   1757 		case VK_FORMAT_R16G16_SNORM:			return TextureFormat(TextureFormat::RG,		TextureFormat::SNORM_INT16);
   1758 		case VK_FORMAT_R16G16_USCALED:			return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT16);
   1759 		case VK_FORMAT_R16G16_SSCALED:			return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT16);
   1760 		case VK_FORMAT_R16G16_UINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT16);
   1761 		case VK_FORMAT_R16G16_SINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT16);
   1762 		case VK_FORMAT_R16G16_SFLOAT:			return TextureFormat(TextureFormat::RG,		TextureFormat::HALF_FLOAT);
   1763 
   1764 		case VK_FORMAT_R16G16B16_UNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_INT16);
   1765 		case VK_FORMAT_R16G16B16_SNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SNORM_INT16);
   1766 		case VK_FORMAT_R16G16B16_USCALED:		return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT16);
   1767 		case VK_FORMAT_R16G16B16_SSCALED:		return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT16);
   1768 		case VK_FORMAT_R16G16B16_UINT:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT16);
   1769 		case VK_FORMAT_R16G16B16_SINT:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT16);
   1770 		case VK_FORMAT_R16G16B16_SFLOAT:		return TextureFormat(TextureFormat::RGB,	TextureFormat::HALF_FLOAT);
   1771 
   1772 		case VK_FORMAT_R16G16B16A16_UNORM:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT16);
   1773 		case VK_FORMAT_R16G16B16A16_SNORM:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT16);
   1774 		case VK_FORMAT_R16G16B16A16_USCALED:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT16);
   1775 		case VK_FORMAT_R16G16B16A16_SSCALED:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT16);
   1776 		case VK_FORMAT_R16G16B16A16_UINT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT16);
   1777 		case VK_FORMAT_R16G16B16A16_SINT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT16);
   1778 		case VK_FORMAT_R16G16B16A16_SFLOAT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::HALF_FLOAT);
   1779 
   1780 		case VK_FORMAT_R32_UINT:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT32);
   1781 		case VK_FORMAT_R32_SINT:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT32);
   1782 		case VK_FORMAT_R32_SFLOAT:				return TextureFormat(TextureFormat::R,		TextureFormat::FLOAT);
   1783 
   1784 		case VK_FORMAT_R32G32_UINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT32);
   1785 		case VK_FORMAT_R32G32_SINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT32);
   1786 		case VK_FORMAT_R32G32_SFLOAT:			return TextureFormat(TextureFormat::RG,		TextureFormat::FLOAT);
   1787 
   1788 		case VK_FORMAT_R32G32B32_UINT:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT32);
   1789 		case VK_FORMAT_R32G32B32_SINT:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT32);
   1790 		case VK_FORMAT_R32G32B32_SFLOAT:		return TextureFormat(TextureFormat::RGB,	TextureFormat::FLOAT);
   1791 
   1792 		case VK_FORMAT_R32G32B32A32_UINT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT32);
   1793 		case VK_FORMAT_R32G32B32A32_SINT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT32);
   1794 		case VK_FORMAT_R32G32B32A32_SFLOAT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::FLOAT);
   1795 
   1796 		case VK_FORMAT_R64_SFLOAT:				return TextureFormat(TextureFormat::R,		TextureFormat::FLOAT64);
   1797 		case VK_FORMAT_R64G64_SFLOAT:			return TextureFormat(TextureFormat::RG,		TextureFormat::FLOAT64);
   1798 		case VK_FORMAT_R64G64B64_SFLOAT:		return TextureFormat(TextureFormat::RGB,	TextureFormat::FLOAT64);
   1799 		case VK_FORMAT_R64G64B64A64_SFLOAT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::FLOAT64);
   1800 
   1801 		case VK_FORMAT_B10G11R11_UFLOAT_PACK32:	return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT_11F_11F_10F_REV);
   1802 		case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:	return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT_999_E5_REV);
   1803 
   1804 		case VK_FORMAT_B8G8R8_UNORM:			return TextureFormat(TextureFormat::BGR,	TextureFormat::UNORM_INT8);
   1805 		case VK_FORMAT_B8G8R8_SNORM:			return TextureFormat(TextureFormat::BGR,	TextureFormat::SNORM_INT8);
   1806 		case VK_FORMAT_B8G8R8_USCALED:			return TextureFormat(TextureFormat::BGR,	TextureFormat::UNSIGNED_INT8);
   1807 		case VK_FORMAT_B8G8R8_SSCALED:			return TextureFormat(TextureFormat::BGR,	TextureFormat::SIGNED_INT8);
   1808 		case VK_FORMAT_B8G8R8_UINT:				return TextureFormat(TextureFormat::BGR,	TextureFormat::UNSIGNED_INT8);
   1809 		case VK_FORMAT_B8G8R8_SINT:				return TextureFormat(TextureFormat::BGR,	TextureFormat::SIGNED_INT8);
   1810 		case VK_FORMAT_B8G8R8_SRGB:				return TextureFormat(TextureFormat::sBGR,	TextureFormat::UNORM_INT8);
   1811 
   1812 		case VK_FORMAT_B8G8R8A8_UNORM:			return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNORM_INT8);
   1813 		case VK_FORMAT_B8G8R8A8_SNORM:			return TextureFormat(TextureFormat::BGRA,	TextureFormat::SNORM_INT8);
   1814 		case VK_FORMAT_B8G8R8A8_USCALED:		return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNSIGNED_INT8);
   1815 		case VK_FORMAT_B8G8R8A8_SSCALED:		return TextureFormat(TextureFormat::BGRA,	TextureFormat::SIGNED_INT8);
   1816 		case VK_FORMAT_B8G8R8A8_UINT:			return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNSIGNED_INT8);
   1817 		case VK_FORMAT_B8G8R8A8_SINT:			return TextureFormat(TextureFormat::BGRA,	TextureFormat::SIGNED_INT8);
   1818 		case VK_FORMAT_B8G8R8A8_SRGB:			return TextureFormat(TextureFormat::sBGRA,	TextureFormat::UNORM_INT8);
   1819 
   1820 		case VK_FORMAT_D16_UNORM:				return TextureFormat(TextureFormat::D,		TextureFormat::UNORM_INT16);
   1821 		case VK_FORMAT_X8_D24_UNORM_PACK32:		return TextureFormat(TextureFormat::D,		TextureFormat::UNSIGNED_INT_24_8_REV);
   1822 		case VK_FORMAT_D32_SFLOAT:				return TextureFormat(TextureFormat::D,		TextureFormat::FLOAT);
   1823 
   1824 		case VK_FORMAT_S8_UINT:					return TextureFormat(TextureFormat::S,		TextureFormat::UNSIGNED_INT8);
   1825 
   1826 		// \note There is no standard interleaved memory layout for DS formats; buffer-image copies
   1827 		//		 will always operate on either D or S aspect only. See Khronos bug 12998
   1828 		case VK_FORMAT_D16_UNORM_S8_UINT:		return TextureFormat(TextureFormat::DS,		TextureFormat::UNSIGNED_INT_16_8_8);
   1829 		case VK_FORMAT_D24_UNORM_S8_UINT:		return TextureFormat(TextureFormat::DS,		TextureFormat::UNSIGNED_INT_24_8_REV);
   1830 		case VK_FORMAT_D32_SFLOAT_S8_UINT:		return TextureFormat(TextureFormat::DS,		TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV);
   1831 
   1832 #if (DE_ENDIANNESS == DE_LITTLE_ENDIAN)
   1833 		case VK_FORMAT_A8B8G8R8_UNORM_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT8);
   1834 		case VK_FORMAT_A8B8G8R8_SNORM_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT8);
   1835 		case VK_FORMAT_A8B8G8R8_USCALED_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
   1836 		case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
   1837 		case VK_FORMAT_A8B8G8R8_UINT_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
   1838 		case VK_FORMAT_A8B8G8R8_SINT_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
   1839 		case VK_FORMAT_A8B8G8R8_SRGB_PACK32:	return TextureFormat(TextureFormat::sRGBA,	TextureFormat::UNORM_INT8);
   1840 #else
   1841 #	error "Big-endian not supported"
   1842 #endif
   1843 
   1844 		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNORM_INT_1010102_REV);
   1845 		case VK_FORMAT_A2R10G10B10_SNORM_PACK32:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::SNORM_INT_1010102_REV);
   1846 		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNSIGNED_INT_1010102_REV);
   1847 		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::SIGNED_INT_1010102_REV);
   1848 		case VK_FORMAT_A2R10G10B10_UINT_PACK32:		return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNSIGNED_INT_1010102_REV);
   1849 		case VK_FORMAT_A2R10G10B10_SINT_PACK32:		return TextureFormat(TextureFormat::BGRA,	TextureFormat::SIGNED_INT_1010102_REV);
   1850 
   1851 		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT_1010102_REV);
   1852 		case VK_FORMAT_A2B10G10R10_SNORM_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT_1010102_REV);
   1853 		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT_1010102_REV);
   1854 		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT_1010102_REV);
   1855 		case VK_FORMAT_A2B10G10R10_UINT_PACK32:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT_1010102_REV);
   1856 		case VK_FORMAT_A2B10G10R10_SINT_PACK32:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT_1010102_REV);
   1857 
   1858 		// YCbCr formats that can be mapped
   1859 		case VK_FORMAT_R10X6_UNORM_PACK16_KHR:					return TextureFormat(TextureFormat::R,		TextureFormat::UNORM_SHORT_10);
   1860 		case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR:			return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_SHORT_10);
   1861 		case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_SHORT_10);
   1862 
   1863 		case VK_FORMAT_R12X4_UNORM_PACK16_KHR:					return TextureFormat(TextureFormat::R,		TextureFormat::UNORM_SHORT_12);
   1864 		case VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR:			return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_SHORT_12);
   1865 		case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_SHORT_12);
   1866 
   1867 		default:
   1868 			TCU_THROW(InternalError, "Unknown image format");
   1869 	}
   1870 }
   1871 
   1872 tcu::CompressedTexFormat mapVkCompressedFormat (VkFormat format)
   1873 {
   1874 	// update this mapping if VkFormat changes
   1875 	DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
   1876 
   1877 	switch (format)
   1878 	{
   1879 		case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8;
   1880 		case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8;
   1881 		case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:	return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
   1882 		case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:	return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
   1883 		case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:	return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8;
   1884 		case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:	return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8;
   1885 
   1886 		case VK_FORMAT_EAC_R11_UNORM_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_EAC_R11;
   1887 		case VK_FORMAT_EAC_R11_SNORM_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11;
   1888 		case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_EAC_RG11;
   1889 		case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11;
   1890 
   1891 		case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA;
   1892 		case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8;
   1893 		case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA;
   1894 		case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_SRGB8_ALPHA8;
   1895 		case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA;
   1896 		case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8;
   1897 		case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA;
   1898 		case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8;
   1899 		case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA;
   1900 		case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8;
   1901 		case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA;
   1902 		case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_SRGB8_ALPHA8;
   1903 		case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA;
   1904 		case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8;
   1905 		case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA;
   1906 		case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8;
   1907 		case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA;
   1908 		case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8;
   1909 		case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA;
   1910 		case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8;
   1911 		case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA;
   1912 		case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8;
   1913 		case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA;
   1914 		case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8;
   1915 		case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA;
   1916 		case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8;
   1917 		case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA;
   1918 		case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8;
   1919 
   1920 		default:
   1921 			TCU_THROW(InternalError, "Unknown image format");
   1922 			return tcu::COMPRESSEDTEXFORMAT_LAST;
   1923 	}
   1924 }
   1925 
   1926 static bool isScaledFormat (VkFormat format)
   1927 {
   1928 	// update this mapping if VkFormat changes
   1929 	DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
   1930 
   1931 	switch (format)
   1932 	{
   1933 		case VK_FORMAT_R8_USCALED:
   1934 		case VK_FORMAT_R8_SSCALED:
   1935 		case VK_FORMAT_R8G8_USCALED:
   1936 		case VK_FORMAT_R8G8_SSCALED:
   1937 		case VK_FORMAT_R8G8B8_USCALED:
   1938 		case VK_FORMAT_R8G8B8_SSCALED:
   1939 		case VK_FORMAT_R8G8B8A8_USCALED:
   1940 		case VK_FORMAT_R8G8B8A8_SSCALED:
   1941 		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
   1942 		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
   1943 		case VK_FORMAT_R16_USCALED:
   1944 		case VK_FORMAT_R16_SSCALED:
   1945 		case VK_FORMAT_R16G16_USCALED:
   1946 		case VK_FORMAT_R16G16_SSCALED:
   1947 		case VK_FORMAT_R16G16B16_USCALED:
   1948 		case VK_FORMAT_R16G16B16_SSCALED:
   1949 		case VK_FORMAT_R16G16B16A16_USCALED:
   1950 		case VK_FORMAT_R16G16B16A16_SSCALED:
   1951 		case VK_FORMAT_B8G8R8_USCALED:
   1952 		case VK_FORMAT_B8G8R8_SSCALED:
   1953 		case VK_FORMAT_B8G8R8A8_USCALED:
   1954 		case VK_FORMAT_B8G8R8A8_SSCALED:
   1955 		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
   1956 		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
   1957 			return true;
   1958 
   1959 		default:
   1960 			return false;
   1961 	}
   1962 }
   1963 
   1964 static bool fullTextureFormatRoundTripSupported (VkFormat format)
   1965 {
   1966 	if (isScaledFormat(format))
   1967 	{
   1968 		// *SCALED formats get mapped to correspoding (u)int formats since
   1969 		// accessing them through (float) getPixel/setPixel has same behavior
   1970 		// as in shader access in Vulkan.
   1971 		// Unfortunately full round-trip between tcu::TextureFormat and VkFormat
   1972 		// for most SCALED formats is not supported though.
   1973 
   1974 		const tcu::TextureFormat	tcuFormat	= mapVkFormat(format);
   1975 
   1976 		switch (tcuFormat.type)
   1977 		{
   1978 			case tcu::TextureFormat::UNSIGNED_INT8:
   1979 			case tcu::TextureFormat::UNSIGNED_INT16:
   1980 			case tcu::TextureFormat::UNSIGNED_INT32:
   1981 			case tcu::TextureFormat::SIGNED_INT8:
   1982 			case tcu::TextureFormat::SIGNED_INT16:
   1983 			case tcu::TextureFormat::SIGNED_INT32:
   1984 			case tcu::TextureFormat::UNSIGNED_INT_1010102_REV:
   1985 			case tcu::TextureFormat::SIGNED_INT_1010102_REV:
   1986 				return false;
   1987 
   1988 			default:
   1989 				return true;
   1990 		}
   1991 	}
   1992 	else
   1993 	{
   1994 		switch (format)
   1995 		{
   1996 			case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
   1997 			case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
   1998 			case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
   1999 			case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
   2000 			case VK_FORMAT_A8B8G8R8_UINT_PACK32:
   2001 			case VK_FORMAT_A8B8G8R8_SINT_PACK32:
   2002 			case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
   2003 				return false; // These map to regular byte array formats
   2004 
   2005 			default:
   2006 				break;
   2007 		}
   2008 
   2009 		return (format != VK_FORMAT_UNDEFINED);
   2010 	}
   2011 }
   2012 
   2013 tcu::TextureFormat getChannelAccessFormat (tcu::TextureChannelClass	type,
   2014 										   deUint32					offsetBits,
   2015 										   deUint32					sizeBits)
   2016 {
   2017 	using tcu::TextureFormat;
   2018 
   2019 	if (offsetBits == 0)
   2020 	{
   2021 		static const TextureFormat::ChannelType	s_size8[tcu::TEXTURECHANNELCLASS_LAST] =
   2022 		{
   2023 			TextureFormat::SNORM_INT8,			// snorm
   2024 			TextureFormat::UNORM_INT8,			// unorm
   2025 			TextureFormat::SIGNED_INT8,			// sint
   2026 			TextureFormat::UNSIGNED_INT8,		// uint
   2027 			TextureFormat::CHANNELTYPE_LAST,	// float
   2028 		};
   2029 		static const TextureFormat::ChannelType	s_size16[tcu::TEXTURECHANNELCLASS_LAST] =
   2030 		{
   2031 			TextureFormat::SNORM_INT16,			// snorm
   2032 			TextureFormat::UNORM_INT16,			// unorm
   2033 			TextureFormat::SIGNED_INT16,		// sint
   2034 			TextureFormat::UNSIGNED_INT16,		// uint
   2035 			TextureFormat::HALF_FLOAT,			// float
   2036 		};
   2037 		static const TextureFormat::ChannelType	s_size32[tcu::TEXTURECHANNELCLASS_LAST] =
   2038 		{
   2039 			TextureFormat::SNORM_INT32,			// snorm
   2040 			TextureFormat::UNORM_INT32,			// unorm
   2041 			TextureFormat::SIGNED_INT32,		// sint
   2042 			TextureFormat::UNSIGNED_INT32,		// uint
   2043 			TextureFormat::FLOAT,				// float
   2044 		};
   2045 
   2046 		TextureFormat::ChannelType	chnType		= TextureFormat::CHANNELTYPE_LAST;
   2047 
   2048 		if (sizeBits == 8)
   2049 			chnType = s_size8[type];
   2050 		else if (sizeBits == 16)
   2051 			chnType = s_size16[type];
   2052 		else if (sizeBits == 32)
   2053 			chnType = s_size32[type];
   2054 
   2055 		if (chnType != TextureFormat::CHANNELTYPE_LAST)
   2056 			return TextureFormat(TextureFormat::R, chnType);
   2057 	}
   2058 	else
   2059 	{
   2060 		if (type		== tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT	&&
   2061 			offsetBits	== 6												&&
   2062 			sizeBits	== 10)
   2063 			return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_10);
   2064 		else if (type		== tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT	&&
   2065 				 offsetBits	== 4												&&
   2066 				 sizeBits	== 12)
   2067 			return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_12);
   2068 	}
   2069 
   2070 	TCU_THROW(InternalError, "Channel access format is not supported");
   2071 }
   2072 
   2073 tcu::PixelBufferAccess getChannelAccess (const PlanarFormatDescription&	formatInfo,
   2074 										 const tcu::UVec2&				size,
   2075 										 const deUint32*				planeRowPitches,
   2076 										 void* const*					planePtrs,
   2077 										 deUint32						channelNdx)
   2078 {
   2079 	DE_ASSERT(formatInfo.hasChannelNdx(channelNdx));
   2080 
   2081 	const deUint32	planeNdx			= formatInfo.channels[channelNdx].planeNdx;
   2082 	const deUint32	planeOffsetBytes	= formatInfo.channels[channelNdx].offsetBits / 8;
   2083 	const deUint32	valueOffsetBits		= formatInfo.channels[channelNdx].offsetBits % 8;
   2084 	const deUint32	pixelStrideBytes	= formatInfo.channels[channelNdx].strideBytes;
   2085 
   2086 	DE_ASSERT(size.x() % formatInfo.planes[planeNdx].widthDivisor == 0);
   2087 	DE_ASSERT(size.y() % formatInfo.planes[planeNdx].heightDivisor == 0);
   2088 
   2089 	deUint32		accessWidth			= size.x() / formatInfo.planes[planeNdx].widthDivisor;
   2090 	const deUint32	accessHeight		= size.y() / formatInfo.planes[planeNdx].heightDivisor;
   2091 	const deUint32	elementSizeBytes	= formatInfo.planes[planeNdx].elementSizeBytes;
   2092 
   2093 	const deUint32	rowPitch			= planeRowPitches[planeNdx];
   2094 
   2095 	if (pixelStrideBytes != elementSizeBytes)
   2096 	{
   2097 		DE_ASSERT(elementSizeBytes % pixelStrideBytes == 0);
   2098 		accessWidth *= elementSizeBytes/pixelStrideBytes;
   2099 	}
   2100 
   2101 	return tcu::PixelBufferAccess(getChannelAccessFormat((tcu::TextureChannelClass)formatInfo.channels[channelNdx].type,
   2102 														 valueOffsetBits,
   2103 														 formatInfo.channels[channelNdx].sizeBits),
   2104 								  tcu::IVec3((int)accessWidth, (int)accessHeight, 1),
   2105 								  tcu::IVec3((int)pixelStrideBytes, (int)rowPitch, 0),
   2106 								  (deUint8*)planePtrs[planeNdx] + planeOffsetBytes);
   2107 }
   2108 
   2109 
   2110 tcu::ConstPixelBufferAccess getChannelAccess (const PlanarFormatDescription&	formatInfo,
   2111 											  const tcu::UVec2&					size,
   2112 											  const deUint32*					planeRowPitches,
   2113 											  const void* const*				planePtrs,
   2114 											  deUint32							channelNdx)
   2115 {
   2116 	return getChannelAccess(formatInfo, size, planeRowPitches, const_cast<void* const*>(planePtrs), channelNdx);
   2117 }
   2118 
   2119 void imageUtilSelfTest (void)
   2120 {
   2121 	for (int formatNdx = 0; formatNdx < VK_CORE_FORMAT_LAST; formatNdx++)
   2122 	{
   2123 		const VkFormat	format	= (VkFormat)formatNdx;
   2124 
   2125 		if (format == VK_FORMAT_R64_UINT			||
   2126 			format == VK_FORMAT_R64_SINT			||
   2127 			format == VK_FORMAT_R64G64_UINT			||
   2128 			format == VK_FORMAT_R64G64_SINT			||
   2129 			format == VK_FORMAT_R64G64B64_UINT		||
   2130 			format == VK_FORMAT_R64G64B64_SINT		||
   2131 			format == VK_FORMAT_R64G64B64A64_UINT	||
   2132 			format == VK_FORMAT_R64G64B64A64_SINT)
   2133 			continue; // \todo [2015-12-05 pyry] Add framework support for (u)int64 channel type
   2134 
   2135 		if (format != VK_FORMAT_UNDEFINED && !isCompressedFormat(format))
   2136 		{
   2137 			const tcu::TextureFormat	tcuFormat		= mapVkFormat(format);
   2138 			const VkFormat				remappedFormat	= mapTextureFormat(tcuFormat);
   2139 
   2140 			DE_TEST_ASSERT(isValid(tcuFormat));
   2141 
   2142 			if (fullTextureFormatRoundTripSupported(format))
   2143 				DE_TEST_ASSERT(format == remappedFormat);
   2144 		}
   2145 	}
   2146 
   2147 	for (int formatNdx = VK_FORMAT_G8B8G8R8_422_UNORM_KHR; formatNdx <= VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR; formatNdx++)
   2148 	{
   2149 		const VkFormat					format	= (VkFormat)formatNdx;
   2150 		const PlanarFormatDescription&	info	= getPlanarFormatDescription(format);
   2151 
   2152 		DE_TEST_ASSERT(isYCbCrFormat(format));
   2153 		DE_TEST_ASSERT(de::inRange<deUint8>(info.numPlanes, 1u, 3u));
   2154 		DE_TEST_ASSERT(info.numPlanes == getPlaneCount(format));
   2155 	}
   2156 }
   2157 
   2158 VkFilter mapFilterMode (tcu::Sampler::FilterMode filterMode)
   2159 {
   2160 	DE_STATIC_ASSERT(tcu::Sampler::FILTERMODE_LAST == 6);
   2161 
   2162 	switch (filterMode)
   2163 	{
   2164 		case tcu::Sampler::NEAREST:					return VK_FILTER_NEAREST;
   2165 		case tcu::Sampler::LINEAR:					return VK_FILTER_LINEAR;
   2166 		case tcu::Sampler::NEAREST_MIPMAP_NEAREST:	return VK_FILTER_NEAREST;
   2167 		case tcu::Sampler::NEAREST_MIPMAP_LINEAR:	return VK_FILTER_NEAREST;
   2168 		case tcu::Sampler::LINEAR_MIPMAP_NEAREST:	return VK_FILTER_LINEAR;
   2169 		case tcu::Sampler::LINEAR_MIPMAP_LINEAR:	return VK_FILTER_LINEAR;
   2170 		default:
   2171 			DE_FATAL("Illegal filter mode");
   2172 			return (VkFilter)0;
   2173 	}
   2174 }
   2175 
   2176 VkSamplerMipmapMode mapMipmapMode (tcu::Sampler::FilterMode filterMode)
   2177 {
   2178 	DE_STATIC_ASSERT(tcu::Sampler::FILTERMODE_LAST == 6);
   2179 
   2180 	// \note VkSamplerCreateInfo doesn't have a flag for disabling mipmapping. Instead
   2181 	//		 minLod = 0 and maxLod = 0.25 should be used to match OpenGL NEAREST and LINEAR
   2182 	//		 filtering mode behavior.
   2183 
   2184 	switch (filterMode)
   2185 	{
   2186 		case tcu::Sampler::NEAREST:					return VK_SAMPLER_MIPMAP_MODE_NEAREST;
   2187 		case tcu::Sampler::LINEAR:					return VK_SAMPLER_MIPMAP_MODE_NEAREST;
   2188 		case tcu::Sampler::NEAREST_MIPMAP_NEAREST:	return VK_SAMPLER_MIPMAP_MODE_NEAREST;
   2189 		case tcu::Sampler::NEAREST_MIPMAP_LINEAR:	return VK_SAMPLER_MIPMAP_MODE_LINEAR;
   2190 		case tcu::Sampler::LINEAR_MIPMAP_NEAREST:	return VK_SAMPLER_MIPMAP_MODE_NEAREST;
   2191 		case tcu::Sampler::LINEAR_MIPMAP_LINEAR:	return VK_SAMPLER_MIPMAP_MODE_LINEAR;
   2192 		default:
   2193 			DE_FATAL("Illegal filter mode");
   2194 			return (VkSamplerMipmapMode)0;
   2195 	}
   2196 }
   2197 
   2198 VkSamplerAddressMode mapWrapMode (tcu::Sampler::WrapMode wrapMode)
   2199 {
   2200 	switch (wrapMode)
   2201 	{
   2202 		case tcu::Sampler::CLAMP_TO_EDGE:		return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
   2203 		case tcu::Sampler::CLAMP_TO_BORDER:		return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
   2204 		case tcu::Sampler::REPEAT_GL:			return VK_SAMPLER_ADDRESS_MODE_REPEAT;
   2205 		case tcu::Sampler::MIRRORED_REPEAT_GL:	return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
   2206 		case tcu::Sampler::MIRRORED_ONCE:		return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
   2207 		default:
   2208 			DE_FATAL("Wrap mode can't be mapped to Vulkan");
   2209 			return (vk::VkSamplerAddressMode)0;
   2210 	}
   2211 }
   2212 
   2213 vk::VkCompareOp mapCompareMode (tcu::Sampler::CompareMode mode)
   2214 {
   2215 	switch (mode)
   2216 	{
   2217 		case tcu::Sampler::COMPAREMODE_NONE:				return vk::VK_COMPARE_OP_NEVER;
   2218 		case tcu::Sampler::COMPAREMODE_LESS:				return vk::VK_COMPARE_OP_LESS;
   2219 		case tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL:		return vk::VK_COMPARE_OP_LESS_OR_EQUAL;
   2220 		case tcu::Sampler::COMPAREMODE_GREATER:				return vk::VK_COMPARE_OP_GREATER;
   2221 		case tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL:	return vk::VK_COMPARE_OP_GREATER_OR_EQUAL;
   2222 		case tcu::Sampler::COMPAREMODE_EQUAL:				return vk::VK_COMPARE_OP_EQUAL;
   2223 		case tcu::Sampler::COMPAREMODE_NOT_EQUAL:			return vk::VK_COMPARE_OP_NOT_EQUAL;
   2224 		case tcu::Sampler::COMPAREMODE_ALWAYS:				return vk::VK_COMPARE_OP_ALWAYS;
   2225 		case tcu::Sampler::COMPAREMODE_NEVER:				return vk::VK_COMPARE_OP_NEVER;
   2226 		default:
   2227 			DE_FATAL("Illegal compare mode");
   2228 			return (vk::VkCompareOp)0;
   2229 	}
   2230 }
   2231 
   2232 static VkBorderColor mapBorderColor (tcu::TextureChannelClass channelClass, const rr::GenericVec4& color)
   2233 {
   2234 	if (channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
   2235 	{
   2236 		const tcu::UVec4	uColor	= color.get<deUint32>();
   2237 
   2238 		if (uColor		== tcu::UVec4(0, 0, 0, 0)) return VK_BORDER_COLOR_INT_TRANSPARENT_BLACK;
   2239 		else if (uColor	== tcu::UVec4(0, 0, 0, 1)) return VK_BORDER_COLOR_INT_OPAQUE_BLACK;
   2240 		else if (uColor == tcu::UVec4(1, 1, 1, 1)) return VK_BORDER_COLOR_INT_OPAQUE_WHITE;
   2241 	}
   2242 	else if (channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
   2243 	{
   2244 		const tcu::IVec4	sColor	= color.get<deInt32>();
   2245 
   2246 		if (sColor		== tcu::IVec4(0, 0, 0, 0)) return VK_BORDER_COLOR_INT_TRANSPARENT_BLACK;
   2247 		else if (sColor	== tcu::IVec4(0, 0, 0, 1)) return VK_BORDER_COLOR_INT_OPAQUE_BLACK;
   2248 		else if (sColor == tcu::IVec4(1, 1, 1, 1)) return VK_BORDER_COLOR_INT_OPAQUE_WHITE;
   2249 	}
   2250 	else
   2251 	{
   2252 		const tcu::Vec4		fColor	= color.get<float>();
   2253 
   2254 		if (fColor		== tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f)) return VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
   2255 		else if (fColor == tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)) return VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
   2256 		else if (fColor == tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f)) return VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
   2257 	}
   2258 
   2259 	DE_FATAL("Unsupported border color");
   2260 	return VK_BORDER_COLOR_LAST;
   2261 }
   2262 
   2263 VkSamplerCreateInfo mapSampler (const tcu::Sampler& sampler, const tcu::TextureFormat& format, float minLod, float maxLod)
   2264 {
   2265 	const bool					compareEnabled	= (sampler.compare != tcu::Sampler::COMPAREMODE_NONE);
   2266 	const VkCompareOp			compareOp		= (compareEnabled) ? (mapCompareMode(sampler.compare)) : (VK_COMPARE_OP_ALWAYS);
   2267 	const VkBorderColor			borderColor		= mapBorderColor(getTextureChannelClass(format.type), sampler.borderColor);
   2268 	const bool					isMipmapEnabled	= (sampler.minFilter != tcu::Sampler::NEAREST && sampler.minFilter != tcu::Sampler::LINEAR);
   2269 
   2270 	const VkSamplerCreateInfo	createInfo		=
   2271 	{
   2272 		VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
   2273 		DE_NULL,
   2274 		(VkSamplerCreateFlags)0,
   2275 		mapFilterMode(sampler.magFilter),							// magFilter
   2276 		mapFilterMode(sampler.minFilter),							// minFilter
   2277 		mapMipmapMode(sampler.minFilter),							// mipMode
   2278 		mapWrapMode(sampler.wrapS),									// addressU
   2279 		mapWrapMode(sampler.wrapT),									// addressV
   2280 		mapWrapMode(sampler.wrapR),									// addressW
   2281 		0.0f,														// mipLodBias
   2282 		VK_FALSE,													// anisotropyEnable
   2283 		1.0f,														// maxAnisotropy
   2284 		(VkBool32)(compareEnabled ? VK_TRUE : VK_FALSE),			// compareEnable
   2285 		compareOp,													// compareOp
   2286 		(isMipmapEnabled ? minLod : 0.0f),							// minLod
   2287 		(isMipmapEnabled ? maxLod : 0.25f),							// maxLod
   2288 		borderColor,												// borderColor
   2289 		(VkBool32)(sampler.normalizedCoords ? VK_FALSE : VK_TRUE),	// unnormalizedCoords
   2290 	};
   2291 
   2292 	return createInfo;
   2293 }
   2294 
   2295 tcu::Sampler mapVkSampler (const VkSamplerCreateInfo& samplerCreateInfo)
   2296 {
   2297 	// \note minLod & maxLod are not supported by tcu::Sampler. LOD must be clamped
   2298 	//       before passing it to tcu::Texture*::sample*()
   2299 
   2300 	tcu::Sampler sampler(mapVkSamplerAddressMode(samplerCreateInfo.addressModeU),
   2301 						 mapVkSamplerAddressMode(samplerCreateInfo.addressModeV),
   2302 						 mapVkSamplerAddressMode(samplerCreateInfo.addressModeW),
   2303 						 mapVkMinTexFilter(samplerCreateInfo.minFilter, samplerCreateInfo.mipmapMode),
   2304 						 mapVkMagTexFilter(samplerCreateInfo.magFilter),
   2305 						 0.0f,
   2306 						 !samplerCreateInfo.unnormalizedCoordinates,
   2307 						 samplerCreateInfo.compareEnable ? mapVkSamplerCompareOp(samplerCreateInfo.compareOp)
   2308 														 : tcu::Sampler::COMPAREMODE_NONE,
   2309 						 0,
   2310 						 tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f),
   2311 						 true);
   2312 
   2313 	if (samplerCreateInfo.anisotropyEnable)
   2314 		TCU_THROW(InternalError, "Anisotropic filtering is not supported by tcu::Sampler");
   2315 
   2316 	switch (samplerCreateInfo.borderColor)
   2317 	{
   2318 		case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
   2319 			sampler.borderColor = tcu::UVec4(0,0,0,1);
   2320 			break;
   2321 		case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
   2322 			sampler.borderColor = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
   2323 			break;
   2324 		case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
   2325 			sampler.borderColor = tcu::UVec4(1, 1, 1, 1);
   2326 			break;
   2327 		case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
   2328 			sampler.borderColor = tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f);
   2329 			break;
   2330 		case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
   2331 			sampler.borderColor = tcu::UVec4(0,0,0,0);
   2332 			break;
   2333 		case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
   2334 			sampler.borderColor = tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f);
   2335 			break;
   2336 
   2337 		default:
   2338 			DE_ASSERT(false);
   2339 			break;
   2340 	}
   2341 
   2342 	return sampler;
   2343 }
   2344 
   2345 tcu::Sampler::CompareMode mapVkSamplerCompareOp (VkCompareOp compareOp)
   2346 {
   2347 	switch (compareOp)
   2348 	{
   2349 		case VK_COMPARE_OP_NEVER:				return tcu::Sampler::COMPAREMODE_NEVER;
   2350 		case VK_COMPARE_OP_LESS:				return tcu::Sampler::COMPAREMODE_LESS;
   2351 		case VK_COMPARE_OP_EQUAL:				return tcu::Sampler::COMPAREMODE_EQUAL;
   2352 		case VK_COMPARE_OP_LESS_OR_EQUAL:		return tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL;
   2353 		case VK_COMPARE_OP_GREATER:				return tcu::Sampler::COMPAREMODE_GREATER;
   2354 		case VK_COMPARE_OP_NOT_EQUAL:			return tcu::Sampler::COMPAREMODE_NOT_EQUAL;
   2355 		case VK_COMPARE_OP_GREATER_OR_EQUAL:	return tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL;
   2356 		case VK_COMPARE_OP_ALWAYS:				return tcu::Sampler::COMPAREMODE_ALWAYS;
   2357 		default:
   2358 			break;
   2359 	}
   2360 
   2361 	DE_ASSERT(false);
   2362 	return tcu::Sampler::COMPAREMODE_LAST;
   2363 }
   2364 
   2365 tcu::Sampler::WrapMode mapVkSamplerAddressMode (VkSamplerAddressMode addressMode)
   2366 {
   2367 	switch (addressMode)
   2368 	{
   2369 		case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE:			return tcu::Sampler::CLAMP_TO_EDGE;
   2370 		case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER:		return tcu::Sampler::CLAMP_TO_BORDER;
   2371 		case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT:		return tcu::Sampler::MIRRORED_REPEAT_GL;
   2372 		case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE:	return tcu::Sampler::MIRRORED_ONCE;
   2373 		case VK_SAMPLER_ADDRESS_MODE_REPEAT:				return tcu::Sampler::REPEAT_GL;
   2374 		default:
   2375 			break;
   2376 	}
   2377 
   2378 	DE_ASSERT(false);
   2379 	return tcu::Sampler::WRAPMODE_LAST;
   2380 }
   2381 
   2382 tcu::Sampler::FilterMode mapVkMinTexFilter (VkFilter filter, VkSamplerMipmapMode mipMode)
   2383 {
   2384 	switch (filter)
   2385 	{
   2386 		case VK_FILTER_LINEAR:
   2387 			switch (mipMode)
   2388 			{
   2389 				case VK_SAMPLER_MIPMAP_MODE_LINEAR:		return tcu::Sampler::LINEAR_MIPMAP_LINEAR;
   2390 				case VK_SAMPLER_MIPMAP_MODE_NEAREST:	return tcu::Sampler::LINEAR_MIPMAP_NEAREST;
   2391 				default:
   2392 					break;
   2393 			}
   2394 			break;
   2395 
   2396 		case VK_FILTER_NEAREST:
   2397 			switch (mipMode)
   2398 			{
   2399 				case VK_SAMPLER_MIPMAP_MODE_LINEAR:		return tcu::Sampler::NEAREST_MIPMAP_LINEAR;
   2400 				case VK_SAMPLER_MIPMAP_MODE_NEAREST:	return tcu::Sampler::NEAREST_MIPMAP_NEAREST;
   2401 				default:
   2402 					break;
   2403 			}
   2404 			break;
   2405 
   2406 		default:
   2407 			break;
   2408 	}
   2409 
   2410 	DE_ASSERT(false);
   2411 	return tcu::Sampler::FILTERMODE_LAST;
   2412 }
   2413 
   2414 tcu::Sampler::FilterMode mapVkMagTexFilter (VkFilter filter)
   2415 {
   2416 	switch (filter)
   2417 	{
   2418 		case VK_FILTER_LINEAR:		return tcu::Sampler::LINEAR;
   2419 		case VK_FILTER_NEAREST:		return tcu::Sampler::NEAREST;
   2420 		default:
   2421 			break;
   2422 	}
   2423 
   2424 	DE_ASSERT(false);
   2425 	return tcu::Sampler::FILTERMODE_LAST;
   2426 }
   2427 
   2428 //! Get a format the matches the layout in buffer memory used for a
   2429 //! buffer<->image copy on a depth/stencil format.
   2430 tcu::TextureFormat getDepthCopyFormat (VkFormat combinedFormat)
   2431 {
   2432 	switch (combinedFormat)
   2433 	{
   2434 		case VK_FORMAT_D16_UNORM:
   2435 		case VK_FORMAT_X8_D24_UNORM_PACK32:
   2436 		case VK_FORMAT_D32_SFLOAT:
   2437 			return mapVkFormat(combinedFormat);
   2438 
   2439 		case VK_FORMAT_D16_UNORM_S8_UINT:
   2440 			return mapVkFormat(VK_FORMAT_D16_UNORM);
   2441 		case VK_FORMAT_D24_UNORM_S8_UINT:
   2442 			return mapVkFormat(VK_FORMAT_X8_D24_UNORM_PACK32);
   2443 		case VK_FORMAT_D32_SFLOAT_S8_UINT:
   2444 			return mapVkFormat(VK_FORMAT_D32_SFLOAT);
   2445 
   2446 		case VK_FORMAT_S8_UINT:
   2447 		default:
   2448 			DE_FATAL("Unexpected depth/stencil format");
   2449 			return tcu::TextureFormat();
   2450 	}
   2451 }
   2452 
   2453 //! Get a format the matches the layout in buffer memory used for a
   2454 //! buffer<->image copy on a depth/stencil format.
   2455 tcu::TextureFormat getStencilCopyFormat (VkFormat combinedFormat)
   2456 {
   2457 	switch (combinedFormat)
   2458 	{
   2459 		case VK_FORMAT_D16_UNORM_S8_UINT:
   2460 		case VK_FORMAT_D24_UNORM_S8_UINT:
   2461 		case VK_FORMAT_D32_SFLOAT_S8_UINT:
   2462 		case VK_FORMAT_S8_UINT:
   2463 			return mapVkFormat(VK_FORMAT_S8_UINT);
   2464 
   2465 		case VK_FORMAT_D16_UNORM:
   2466 		case VK_FORMAT_X8_D24_UNORM_PACK32:
   2467 		case VK_FORMAT_D32_SFLOAT:
   2468 		default:
   2469 			DE_FATAL("Unexpected depth/stencil format");
   2470 			return tcu::TextureFormat();
   2471 	}
   2472 }
   2473 
   2474 } // vk
   2475