vkImageUtil.cpp revision 689c095f881a410da6a315795452a8e00ad95a9d
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 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and/or associated documentation files (the
11 * "Materials"), to deal in the Materials without restriction, including
12 * without limitation the rights to use, copy, modify, merge, publish,
13 * distribute, sublicense, and/or sell copies of the Materials, and to
14 * permit persons to whom the Materials are furnished to do so, subject to
15 * the following conditions:
16 *
17 * The above copyright notice(s) and this permission notice shall be
18 * included in all copies or substantial portions of the Materials.
19 *
20 * The Materials are Confidential Information as defined by the
21 * Khronos Membership Agreement until designated non-confidential by
22 * Khronos, at which point this condition clause shall be removed.
23 *
24 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
28 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
31 *
32 *//*!
33 * \file
34 * \brief Utilities for images.
35 *//*--------------------------------------------------------------------*/
36
37#include "vkImageUtil.hpp"
38#include "tcuTextureUtil.hpp"
39
40namespace vk
41{
42
43bool isFloatFormat (VkFormat format)
44{
45	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
46}
47
48bool isUnormFormat (VkFormat format)
49{
50	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
51}
52
53bool isSnormFormat (VkFormat format)
54{
55	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
56}
57
58bool isIntFormat (VkFormat format)
59{
60	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER;
61}
62
63bool isUintFormat (VkFormat format)
64{
65	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
66}
67
68bool isDepthStencilFormat (VkFormat format)
69{
70	if (isCompressedFormat(format))
71		return false;
72
73	const tcu::TextureFormat tcuFormat = mapVkFormat(format);
74	return tcuFormat.order == tcu::TextureFormat::D || tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS;
75}
76
77bool isCompressedFormat (VkFormat format)
78{
79	// update this mapping if VkFormat changes
80	DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
81
82	switch (format)
83	{
84		case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
85		case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
86		case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
87		case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
88		case VK_FORMAT_BC2_UNORM_BLOCK:
89		case VK_FORMAT_BC2_SRGB_BLOCK:
90		case VK_FORMAT_BC3_UNORM_BLOCK:
91		case VK_FORMAT_BC3_SRGB_BLOCK:
92		case VK_FORMAT_BC4_UNORM_BLOCK:
93		case VK_FORMAT_BC4_SNORM_BLOCK:
94		case VK_FORMAT_BC5_UNORM_BLOCK:
95		case VK_FORMAT_BC5_SNORM_BLOCK:
96		case VK_FORMAT_BC6H_UFLOAT_BLOCK:
97		case VK_FORMAT_BC6H_SFLOAT_BLOCK:
98		case VK_FORMAT_BC7_UNORM_BLOCK:
99		case VK_FORMAT_BC7_SRGB_BLOCK:
100		case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
101		case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
102		case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
103		case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
104		case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
105		case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
106		case VK_FORMAT_EAC_R11_UNORM_BLOCK:
107		case VK_FORMAT_EAC_R11_SNORM_BLOCK:
108		case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
109		case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
110		case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
111		case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
112		case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
113		case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
114		case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
115		case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
116		case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
117		case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
118		case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
119		case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
120		case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
121		case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
122		case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
123		case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
124		case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
125		case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
126		case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
127		case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
128		case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
129		case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
130		case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
131		case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
132		case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
133		case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
134		case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
135		case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
136		case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
137		case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
138			return true;
139
140		default:
141			return false;
142	}
143}
144
145VkFormat mapTextureFormat (const tcu::TextureFormat& format)
146{
147	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST < (1<<16));
148	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST < (1<<16));
149
150#define PACK_FMT(ORDER, TYPE) ((int(ORDER) << 16) | int(TYPE))
151#define FMT_CASE(ORDER, TYPE) PACK_FMT(tcu::TextureFormat::ORDER, tcu::TextureFormat::TYPE)
152
153	// update this mapping if VkFormat changes
154	DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
155
156	switch (PACK_FMT(format.order, format.type))
157	{
158		case FMT_CASE(RG, UNORM_BYTE_44):					return VK_FORMAT_R4G4_UNORM_PACK8;
159		case FMT_CASE(RGB, UNORM_SHORT_565):				return VK_FORMAT_R5G6B5_UNORM_PACK16;
160		case FMT_CASE(RGBA, UNORM_SHORT_4444):				return VK_FORMAT_R4G4B4A4_UNORM_PACK16;
161		case FMT_CASE(RGBA, UNORM_SHORT_5551):				return VK_FORMAT_R5G5B5A1_UNORM_PACK16;
162
163		case FMT_CASE(BGR, UNORM_SHORT_565):				return VK_FORMAT_B5G6R5_UNORM_PACK16;
164		case FMT_CASE(BGRA, UNORM_SHORT_4444):				return VK_FORMAT_B4G4R4A4_UNORM_PACK16;
165		case FMT_CASE(BGRA, UNORM_SHORT_5551):				return VK_FORMAT_B5G5R5A1_UNORM_PACK16;
166
167		case FMT_CASE(ARGB, UNORM_SHORT_1555):				return VK_FORMAT_A1R5G5B5_UNORM_PACK16;
168
169		case FMT_CASE(R, UNORM_INT8):						return VK_FORMAT_R8_UNORM;
170		case FMT_CASE(R, SNORM_INT8):						return VK_FORMAT_R8_SNORM;
171		case FMT_CASE(R, UNSIGNED_INT8):					return VK_FORMAT_R8_UINT;
172		case FMT_CASE(R, SIGNED_INT8):						return VK_FORMAT_R8_SINT;
173		case FMT_CASE(sR, UNORM_INT8):						return VK_FORMAT_R8_SRGB;
174
175		case FMT_CASE(RG, UNORM_INT8):						return VK_FORMAT_R8G8_UNORM;
176		case FMT_CASE(RG, SNORM_INT8):						return VK_FORMAT_R8G8_SNORM;
177		case FMT_CASE(RG, UNSIGNED_INT8):					return VK_FORMAT_R8G8_UINT;
178		case FMT_CASE(RG, SIGNED_INT8):						return VK_FORMAT_R8G8_SINT;
179		case FMT_CASE(sRG, UNORM_INT8):						return VK_FORMAT_R8G8_SRGB;
180
181		case FMT_CASE(RGB, UNORM_INT8):						return VK_FORMAT_R8G8B8_UNORM;
182		case FMT_CASE(RGB, SNORM_INT8):						return VK_FORMAT_R8G8B8_SNORM;
183		case FMT_CASE(RGB, UNSIGNED_INT8):					return VK_FORMAT_R8G8B8_UINT;
184		case FMT_CASE(RGB, SIGNED_INT8):					return VK_FORMAT_R8G8B8_SINT;
185		case FMT_CASE(sRGB, UNORM_INT8):					return VK_FORMAT_R8G8B8_SRGB;
186
187		case FMT_CASE(RGBA, UNORM_INT8):					return VK_FORMAT_R8G8B8A8_UNORM;
188		case FMT_CASE(RGBA, SNORM_INT8):					return VK_FORMAT_R8G8B8A8_SNORM;
189		case FMT_CASE(RGBA, UNSIGNED_INT8):					return VK_FORMAT_R8G8B8A8_UINT;
190		case FMT_CASE(RGBA, SIGNED_INT8):					return VK_FORMAT_R8G8B8A8_SINT;
191		case FMT_CASE(sRGBA, UNORM_INT8):					return VK_FORMAT_R8G8B8A8_SRGB;
192
193		case FMT_CASE(RGBA, UNORM_INT_1010102_REV):			return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
194		case FMT_CASE(RGBA, SNORM_INT_1010102_REV):			return VK_FORMAT_A2B10G10R10_SNORM_PACK32;
195		case FMT_CASE(RGBA, UNSIGNED_INT_1010102_REV):		return VK_FORMAT_A2B10G10R10_UINT_PACK32;
196		case FMT_CASE(RGBA, SIGNED_INT_1010102_REV):		return VK_FORMAT_A2B10G10R10_SINT_PACK32;
197
198		case FMT_CASE(R, UNORM_INT16):						return VK_FORMAT_R16_UNORM;
199		case FMT_CASE(R, SNORM_INT16):						return VK_FORMAT_R16_SNORM;
200		case FMT_CASE(R, UNSIGNED_INT16):					return VK_FORMAT_R16_UINT;
201		case FMT_CASE(R, SIGNED_INT16):						return VK_FORMAT_R16_SINT;
202		case FMT_CASE(R, HALF_FLOAT):						return VK_FORMAT_R16_SFLOAT;
203
204		case FMT_CASE(RG, UNORM_INT16):						return VK_FORMAT_R16G16_UNORM;
205		case FMT_CASE(RG, SNORM_INT16):						return VK_FORMAT_R16G16_SNORM;
206		case FMT_CASE(RG, UNSIGNED_INT16):					return VK_FORMAT_R16G16_UINT;
207		case FMT_CASE(RG, SIGNED_INT16):					return VK_FORMAT_R16G16_SINT;
208		case FMT_CASE(RG, HALF_FLOAT):						return VK_FORMAT_R16G16_SFLOAT;
209
210		case FMT_CASE(RGB, UNORM_INT16):					return VK_FORMAT_R16G16B16_UNORM;
211		case FMT_CASE(RGB, SNORM_INT16):					return VK_FORMAT_R16G16B16_SNORM;
212		case FMT_CASE(RGB, UNSIGNED_INT16):					return VK_FORMAT_R16G16B16_UINT;
213		case FMT_CASE(RGB, SIGNED_INT16):					return VK_FORMAT_R16G16B16_SINT;
214		case FMT_CASE(RGB, HALF_FLOAT):						return VK_FORMAT_R16G16B16_SFLOAT;
215
216		case FMT_CASE(RGBA, UNORM_INT16):					return VK_FORMAT_R16G16B16A16_UNORM;
217		case FMT_CASE(RGBA, SNORM_INT16):					return VK_FORMAT_R16G16B16A16_SNORM;
218		case FMT_CASE(RGBA, UNSIGNED_INT16):				return VK_FORMAT_R16G16B16A16_UINT;
219		case FMT_CASE(RGBA, SIGNED_INT16):					return VK_FORMAT_R16G16B16A16_SINT;
220		case FMT_CASE(RGBA, HALF_FLOAT):					return VK_FORMAT_R16G16B16A16_SFLOAT;
221
222		case FMT_CASE(R, UNSIGNED_INT32):					return VK_FORMAT_R32_UINT;
223		case FMT_CASE(R, SIGNED_INT32):						return VK_FORMAT_R32_SINT;
224		case FMT_CASE(R, FLOAT):							return VK_FORMAT_R32_SFLOAT;
225
226		case FMT_CASE(RG, UNSIGNED_INT32):					return VK_FORMAT_R32G32_UINT;
227		case FMT_CASE(RG, SIGNED_INT32):					return VK_FORMAT_R32G32_SINT;
228		case FMT_CASE(RG, FLOAT):							return VK_FORMAT_R32G32_SFLOAT;
229
230		case FMT_CASE(RGB, UNSIGNED_INT32):					return VK_FORMAT_R32G32B32_UINT;
231		case FMT_CASE(RGB, SIGNED_INT32):					return VK_FORMAT_R32G32B32_SINT;
232		case FMT_CASE(RGB, FLOAT):							return VK_FORMAT_R32G32B32_SFLOAT;
233
234		case FMT_CASE(RGBA, UNSIGNED_INT32):				return VK_FORMAT_R32G32B32A32_UINT;
235		case FMT_CASE(RGBA, SIGNED_INT32):					return VK_FORMAT_R32G32B32A32_SINT;
236		case FMT_CASE(RGBA, FLOAT):							return VK_FORMAT_R32G32B32A32_SFLOAT;
237
238		case FMT_CASE(R, FLOAT64):							return VK_FORMAT_R64_SFLOAT;
239		case FMT_CASE(RG, FLOAT64):							return VK_FORMAT_R64G64_SFLOAT;
240		case FMT_CASE(RGB, FLOAT64):						return VK_FORMAT_R64G64B64_SFLOAT;
241		case FMT_CASE(RGBA, FLOAT64):						return VK_FORMAT_R64G64B64A64_SFLOAT;
242
243		case FMT_CASE(RGB, UNSIGNED_INT_11F_11F_10F_REV):	return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
244		case FMT_CASE(RGB, UNSIGNED_INT_999_E5_REV):		return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
245
246		case FMT_CASE(BGR, UNORM_INT8):						return VK_FORMAT_B8G8R8_UNORM;
247		case FMT_CASE(BGR, SNORM_INT8):						return VK_FORMAT_B8G8R8_SNORM;
248		case FMT_CASE(BGR, UNSIGNED_INT8):					return VK_FORMAT_B8G8R8_UINT;
249		case FMT_CASE(BGR, SIGNED_INT8):					return VK_FORMAT_B8G8R8_SINT;
250		case FMT_CASE(sBGR, UNORM_INT8):					return VK_FORMAT_B8G8R8_SRGB;
251
252		case FMT_CASE(BGRA, UNORM_INT8):					return VK_FORMAT_B8G8R8A8_UNORM;
253		case FMT_CASE(BGRA, SNORM_INT8):					return VK_FORMAT_B8G8R8A8_SNORM;
254		case FMT_CASE(BGRA, UNSIGNED_INT8):					return VK_FORMAT_B8G8R8A8_UINT;
255		case FMT_CASE(BGRA, SIGNED_INT8):					return VK_FORMAT_B8G8R8A8_SINT;
256		case FMT_CASE(sBGRA, UNORM_INT8):					return VK_FORMAT_B8G8R8A8_SRGB;
257
258		case FMT_CASE(BGRA, UNORM_INT_1010102_REV):			return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
259		case FMT_CASE(BGRA, SNORM_INT_1010102_REV):			return VK_FORMAT_A2R10G10B10_SNORM_PACK32;
260		case FMT_CASE(BGRA, UNSIGNED_INT_1010102_REV):		return VK_FORMAT_A2R10G10B10_UINT_PACK32;
261		case FMT_CASE(BGRA, SIGNED_INT_1010102_REV):		return VK_FORMAT_A2R10G10B10_SINT_PACK32;
262
263		case FMT_CASE(D, UNORM_INT16):						return VK_FORMAT_D16_UNORM;
264		case FMT_CASE(D, UNSIGNED_INT_24_8_REV):			return VK_FORMAT_X8_D24_UNORM_PACK32;
265		case FMT_CASE(D, FLOAT):							return VK_FORMAT_D32_SFLOAT;
266
267		case FMT_CASE(S, UNSIGNED_INT8):					return VK_FORMAT_S8_UINT;
268
269		case FMT_CASE(DS, UNSIGNED_INT_16_8_8):				return VK_FORMAT_D16_UNORM_S8_UINT;
270		case FMT_CASE(DS, UNSIGNED_INT_24_8_REV):			return VK_FORMAT_D24_UNORM_S8_UINT;
271		case FMT_CASE(DS, FLOAT_UNSIGNED_INT_24_8_REV):		return VK_FORMAT_D32_SFLOAT_S8_UINT;
272
273		default:
274			TCU_THROW(InternalError, "Unknown texture format");
275	}
276
277#undef PACK_FMT
278#undef FMT_CASE
279}
280
281tcu::TextureFormat mapVkFormat (VkFormat format)
282{
283	using tcu::TextureFormat;
284
285	// update this mapping if VkFormat changes
286	DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
287
288	switch (format)
289	{
290		case VK_FORMAT_R4G4_UNORM_PACK8:		return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_BYTE_44);
291		case VK_FORMAT_R5G6B5_UNORM_PACK16:		return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_SHORT_565);
292		case VK_FORMAT_R4G4B4A4_UNORM_PACK16:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_SHORT_4444);
293		case VK_FORMAT_R5G5B5A1_UNORM_PACK16:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_SHORT_5551);
294
295		case VK_FORMAT_B5G6R5_UNORM_PACK16:		return TextureFormat(TextureFormat::BGR,	TextureFormat::UNORM_SHORT_565);
296		case VK_FORMAT_B4G4R4A4_UNORM_PACK16:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNORM_SHORT_4444);
297		case VK_FORMAT_B5G5R5A1_UNORM_PACK16:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNORM_SHORT_5551);
298
299		case VK_FORMAT_A1R5G5B5_UNORM_PACK16:	return TextureFormat(TextureFormat::ARGB,	TextureFormat::UNORM_SHORT_1555);
300
301		case VK_FORMAT_R8_UNORM:				return TextureFormat(TextureFormat::R,		TextureFormat::UNORM_INT8);
302		case VK_FORMAT_R8_SNORM:				return TextureFormat(TextureFormat::R,		TextureFormat::SNORM_INT8);
303		case VK_FORMAT_R8_USCALED:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT8);
304		case VK_FORMAT_R8_SSCALED:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT8);
305		case VK_FORMAT_R8_UINT:					return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT8);
306		case VK_FORMAT_R8_SINT:					return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT8);
307		case VK_FORMAT_R8_SRGB:					return TextureFormat(TextureFormat::sR,		TextureFormat::UNORM_INT8);
308
309		case VK_FORMAT_R8G8_UNORM:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_INT8);
310		case VK_FORMAT_R8G8_SNORM:				return TextureFormat(TextureFormat::RG,		TextureFormat::SNORM_INT8);
311		case VK_FORMAT_R8G8_USCALED:			return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT8);
312		case VK_FORMAT_R8G8_SSCALED:			return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT8);
313		case VK_FORMAT_R8G8_UINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT8);
314		case VK_FORMAT_R8G8_SINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT8);
315		case VK_FORMAT_R8G8_SRGB:				return TextureFormat(TextureFormat::sRG,	TextureFormat::UNORM_INT8);
316
317		case VK_FORMAT_R8G8B8_UNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_INT8);
318		case VK_FORMAT_R8G8B8_SNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SNORM_INT8);
319		case VK_FORMAT_R8G8B8_USCALED:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT8);
320		case VK_FORMAT_R8G8B8_SSCALED:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT8);
321		case VK_FORMAT_R8G8B8_UINT:				return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT8);
322		case VK_FORMAT_R8G8B8_SINT:				return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT8);
323		case VK_FORMAT_R8G8B8_SRGB:				return TextureFormat(TextureFormat::sRGB,	TextureFormat::UNORM_INT8);
324
325		case VK_FORMAT_R8G8B8A8_UNORM:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT8);
326		case VK_FORMAT_R8G8B8A8_SNORM:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT8);
327		case VK_FORMAT_R8G8B8A8_USCALED:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
328		case VK_FORMAT_R8G8B8A8_SSCALED:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
329		case VK_FORMAT_R8G8B8A8_UINT:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
330		case VK_FORMAT_R8G8B8A8_SINT:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
331		case VK_FORMAT_R8G8B8A8_SRGB:			return TextureFormat(TextureFormat::sRGBA,	TextureFormat::UNORM_INT8);
332
333		case VK_FORMAT_R16_UNORM:				return TextureFormat(TextureFormat::R,		TextureFormat::UNORM_INT16);
334		case VK_FORMAT_R16_SNORM:				return TextureFormat(TextureFormat::R,		TextureFormat::SNORM_INT16);
335		case VK_FORMAT_R16_USCALED:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT16);
336		case VK_FORMAT_R16_SSCALED:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT16);
337		case VK_FORMAT_R16_UINT:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT16);
338		case VK_FORMAT_R16_SINT:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT16);
339		case VK_FORMAT_R16_SFLOAT:				return TextureFormat(TextureFormat::R,		TextureFormat::HALF_FLOAT);
340
341		case VK_FORMAT_R16G16_UNORM:			return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_INT16);
342		case VK_FORMAT_R16G16_SNORM:			return TextureFormat(TextureFormat::RG,		TextureFormat::SNORM_INT16);
343		case VK_FORMAT_R16G16_USCALED:			return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT16);
344		case VK_FORMAT_R16G16_SSCALED:			return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT16);
345		case VK_FORMAT_R16G16_UINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT16);
346		case VK_FORMAT_R16G16_SINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT16);
347		case VK_FORMAT_R16G16_SFLOAT:			return TextureFormat(TextureFormat::RG,		TextureFormat::HALF_FLOAT);
348
349		case VK_FORMAT_R16G16B16_UNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_INT16);
350		case VK_FORMAT_R16G16B16_SNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SNORM_INT16);
351		case VK_FORMAT_R16G16B16_USCALED:		return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT16);
352		case VK_FORMAT_R16G16B16_SSCALED:		return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT16);
353		case VK_FORMAT_R16G16B16_UINT:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT16);
354		case VK_FORMAT_R16G16B16_SINT:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT16);
355		case VK_FORMAT_R16G16B16_SFLOAT:		return TextureFormat(TextureFormat::RGB,	TextureFormat::HALF_FLOAT);
356
357		case VK_FORMAT_R16G16B16A16_UNORM:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT16);
358		case VK_FORMAT_R16G16B16A16_SNORM:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT16);
359		case VK_FORMAT_R16G16B16A16_USCALED:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT16);
360		case VK_FORMAT_R16G16B16A16_SSCALED:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT16);
361		case VK_FORMAT_R16G16B16A16_UINT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT16);
362		case VK_FORMAT_R16G16B16A16_SINT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT16);
363		case VK_FORMAT_R16G16B16A16_SFLOAT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::HALF_FLOAT);
364
365		case VK_FORMAT_R32_UINT:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT32);
366		case VK_FORMAT_R32_SINT:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT32);
367		case VK_FORMAT_R32_SFLOAT:				return TextureFormat(TextureFormat::R,		TextureFormat::FLOAT);
368
369		case VK_FORMAT_R32G32_UINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT32);
370		case VK_FORMAT_R32G32_SINT:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT32);
371		case VK_FORMAT_R32G32_SFLOAT:			return TextureFormat(TextureFormat::RG,		TextureFormat::FLOAT);
372
373		case VK_FORMAT_R32G32B32_UINT:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT32);
374		case VK_FORMAT_R32G32B32_SINT:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT32);
375		case VK_FORMAT_R32G32B32_SFLOAT:		return TextureFormat(TextureFormat::RGB,	TextureFormat::FLOAT);
376
377		case VK_FORMAT_R32G32B32A32_UINT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT32);
378		case VK_FORMAT_R32G32B32A32_SINT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT32);
379		case VK_FORMAT_R32G32B32A32_SFLOAT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::FLOAT);
380
381		case VK_FORMAT_R64_SFLOAT:				return TextureFormat(TextureFormat::R,		TextureFormat::FLOAT64);
382		case VK_FORMAT_R64G64_SFLOAT:			return TextureFormat(TextureFormat::RG,		TextureFormat::FLOAT64);
383		case VK_FORMAT_R64G64B64_SFLOAT:		return TextureFormat(TextureFormat::RGB,	TextureFormat::FLOAT64);
384		case VK_FORMAT_R64G64B64A64_SFLOAT:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::FLOAT64);
385
386		case VK_FORMAT_B10G11R11_UFLOAT_PACK32:	return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT_11F_11F_10F_REV);
387		case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:	return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT_999_E5_REV);
388
389		case VK_FORMAT_B8G8R8_UNORM:			return TextureFormat(TextureFormat::BGR,	TextureFormat::UNORM_INT8);
390		case VK_FORMAT_B8G8R8_SNORM:			return TextureFormat(TextureFormat::BGR,	TextureFormat::SNORM_INT8);
391		case VK_FORMAT_B8G8R8_USCALED:			return TextureFormat(TextureFormat::BGR,	TextureFormat::UNSIGNED_INT8);
392		case VK_FORMAT_B8G8R8_SSCALED:			return TextureFormat(TextureFormat::BGR,	TextureFormat::SIGNED_INT8);
393		case VK_FORMAT_B8G8R8_UINT:				return TextureFormat(TextureFormat::BGR,	TextureFormat::UNSIGNED_INT8);
394		case VK_FORMAT_B8G8R8_SINT:				return TextureFormat(TextureFormat::BGR,	TextureFormat::SIGNED_INT8);
395		case VK_FORMAT_B8G8R8_SRGB:				return TextureFormat(TextureFormat::sBGR,	TextureFormat::UNORM_INT8);
396
397		case VK_FORMAT_B8G8R8A8_UNORM:			return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNORM_INT8);
398		case VK_FORMAT_B8G8R8A8_SNORM:			return TextureFormat(TextureFormat::BGRA,	TextureFormat::SNORM_INT8);
399		case VK_FORMAT_B8G8R8A8_USCALED:		return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNSIGNED_INT8);
400		case VK_FORMAT_B8G8R8A8_SSCALED:		return TextureFormat(TextureFormat::BGRA,	TextureFormat::SIGNED_INT8);
401		case VK_FORMAT_B8G8R8A8_UINT:			return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNSIGNED_INT8);
402		case VK_FORMAT_B8G8R8A8_SINT:			return TextureFormat(TextureFormat::BGRA,	TextureFormat::SIGNED_INT8);
403		case VK_FORMAT_B8G8R8A8_SRGB:			return TextureFormat(TextureFormat::sBGRA,	TextureFormat::UNORM_INT8);
404
405		case VK_FORMAT_D16_UNORM:				return TextureFormat(TextureFormat::D,		TextureFormat::UNORM_INT16);
406		case VK_FORMAT_X8_D24_UNORM_PACK32:		return TextureFormat(TextureFormat::D,		TextureFormat::UNSIGNED_INT_24_8_REV);
407		case VK_FORMAT_D32_SFLOAT:				return TextureFormat(TextureFormat::D,		TextureFormat::FLOAT);
408
409		case VK_FORMAT_S8_UINT:					return TextureFormat(TextureFormat::S,		TextureFormat::UNSIGNED_INT8);
410
411		// \note There is no standard interleaved memory layout for DS formats; buffer-image copies
412		//		 will always operate on either D or S aspect only. See Khronos bug 12998
413		case VK_FORMAT_D16_UNORM_S8_UINT:		return TextureFormat(TextureFormat::DS,		TextureFormat::UNSIGNED_INT_16_8_8);
414		case VK_FORMAT_D24_UNORM_S8_UINT:		return TextureFormat(TextureFormat::DS,		TextureFormat::UNSIGNED_INT_24_8_REV);
415		case VK_FORMAT_D32_SFLOAT_S8_UINT:		return TextureFormat(TextureFormat::DS,		TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV);
416
417#if (DE_ENDIANNESS == DE_LITTLE_ENDIAN)
418		case VK_FORMAT_A8B8G8R8_UNORM_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT8);
419		case VK_FORMAT_A8B8G8R8_SNORM_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT8);
420		case VK_FORMAT_A8B8G8R8_USCALED_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
421		case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
422		case VK_FORMAT_A8B8G8R8_UINT_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
423		case VK_FORMAT_A8B8G8R8_SINT_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
424		case VK_FORMAT_A8B8G8R8_SRGB_PACK32:	return TextureFormat(TextureFormat::sRGBA,	TextureFormat::UNORM_INT8);
425#else
426#	error "Big-endian not supported"
427#endif
428
429		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNORM_INT_1010102_REV);
430		case VK_FORMAT_A2R10G10B10_SNORM_PACK32:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::SNORM_INT_1010102_REV);
431		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNSIGNED_INT_1010102_REV);
432		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:	return TextureFormat(TextureFormat::BGRA,	TextureFormat::SIGNED_INT_1010102_REV);
433		case VK_FORMAT_A2R10G10B10_UINT_PACK32:		return TextureFormat(TextureFormat::BGRA,	TextureFormat::UNSIGNED_INT_1010102_REV);
434		case VK_FORMAT_A2R10G10B10_SINT_PACK32:		return TextureFormat(TextureFormat::BGRA,	TextureFormat::SIGNED_INT_1010102_REV);
435
436		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT_1010102_REV);
437		case VK_FORMAT_A2B10G10R10_SNORM_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT_1010102_REV);
438		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT_1010102_REV);
439		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:	return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT_1010102_REV);
440		case VK_FORMAT_A2B10G10R10_UINT_PACK32:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT_1010102_REV);
441		case VK_FORMAT_A2B10G10R10_SINT_PACK32:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT_1010102_REV);
442
443
444		default:
445			TCU_THROW(InternalError, "Unknown image format");
446	}
447}
448
449tcu::CompressedTexFormat mapVkCompressedFormat (VkFormat format)
450{
451	// update this mapping if VkFormat changes
452	DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
453
454	switch (format)
455	{
456		case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8;
457		case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8;
458		case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:	return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
459		case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:	return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
460		case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:	return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8;
461		case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:	return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8;
462		case VK_FORMAT_EAC_R11_UNORM_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_EAC_R11;
463		case VK_FORMAT_EAC_R11_SNORM_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11;
464		case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_EAC_RG11;
465		case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11;
466		case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA;
467		case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8;
468		case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA;
469		case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8;
470		case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA;
471		case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8;
472		case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA;
473		case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8;
474		case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA;
475		case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8;
476		case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA;
477		case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8;
478		case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA;
479		case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8;
480		case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA;
481		case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:			return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8;
482		case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA;
483		case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8;
484		case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA;
485		case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8;
486		case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA;
487		case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8;
488		case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA;
489		case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8;
490		case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA;
491		case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8;
492		case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA;
493		case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:		return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8;
494		default:
495			break;
496	}
497
498	return tcu::COMPRESSEDTEXFORMAT_LAST;
499}
500
501VkComponentMapping getFormatComponentMapping (VkFormat format)
502{
503	using tcu::TextureFormat;
504
505	static const VkComponentMapping	R		= {	VK_COMPONENT_SWIZZLE_R,		VK_COMPONENT_SWIZZLE_ZERO,	VK_COMPONENT_SWIZZLE_ZERO,	VK_COMPONENT_SWIZZLE_ONE	};
506	static const VkComponentMapping	RG		= {	VK_COMPONENT_SWIZZLE_R,		VK_COMPONENT_SWIZZLE_G,		VK_COMPONENT_SWIZZLE_ZERO,	VK_COMPONENT_SWIZZLE_ONE	};
507	static const VkComponentMapping	RGB		= {	VK_COMPONENT_SWIZZLE_R,		VK_COMPONENT_SWIZZLE_G,		VK_COMPONENT_SWIZZLE_B,		VK_COMPONENT_SWIZZLE_ONE	};
508	static const VkComponentMapping	RGBA	= {	VK_COMPONENT_SWIZZLE_R,		VK_COMPONENT_SWIZZLE_G,		VK_COMPONENT_SWIZZLE_B,		VK_COMPONENT_SWIZZLE_A		};
509	static const VkComponentMapping	S		= { VK_COMPONENT_SWIZZLE_ZERO,	VK_COMPONENT_SWIZZLE_ZERO,	VK_COMPONENT_SWIZZLE_ZERO,	VK_COMPONENT_SWIZZLE_A		};
510	static const VkComponentMapping	DS		= {	VK_COMPONENT_SWIZZLE_R,		VK_COMPONENT_SWIZZLE_ZERO,	VK_COMPONENT_SWIZZLE_ZERO,	VK_COMPONENT_SWIZZLE_A		};
511	static const VkComponentMapping	BGRA	= {	VK_COMPONENT_SWIZZLE_B,		VK_COMPONENT_SWIZZLE_G,		VK_COMPONENT_SWIZZLE_R,		VK_COMPONENT_SWIZZLE_A		};
512	static const VkComponentMapping	BGR		= {	VK_COMPONENT_SWIZZLE_B,		VK_COMPONENT_SWIZZLE_G,		VK_COMPONENT_SWIZZLE_R,		VK_COMPONENT_SWIZZLE_ONE	};
513
514	if (format == VK_FORMAT_UNDEFINED)
515		return RGBA;
516
517	const tcu::TextureFormat tcuFormat = (isCompressedFormat(format)) ? tcu::getUncompressedFormat(mapVkCompressedFormat(format))
518																	  : mapVkFormat(format);
519
520	switch (tcuFormat.order)
521	{
522		case TextureFormat::R:		return R;
523		case TextureFormat::RG:		return RG;
524		case TextureFormat::RGB:	return RGB;
525		case TextureFormat::RGBA:	return RGBA;
526		case TextureFormat::BGRA:	return BGRA;
527		case TextureFormat::BGR:	return BGR;
528		case TextureFormat::sR:		return R;
529		case TextureFormat::sRG:	return RG;
530		case TextureFormat::sRGB:	return RGB;
531		case TextureFormat::sRGBA:	return RGBA;
532		case TextureFormat::sBGR:	return BGR;
533		case TextureFormat::sBGRA:	return BGRA;
534		case TextureFormat::D:		return R;
535		case TextureFormat::S:		return S;
536		case TextureFormat::DS:		return DS;
537		default:
538			break;
539	}
540
541	DE_ASSERT(false);
542	return RGBA;
543}
544
545static bool isScaledFormat (VkFormat format)
546{
547	// update this mapping if VkFormat changes
548	DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
549
550	switch (format)
551	{
552		case VK_FORMAT_R8_USCALED:
553		case VK_FORMAT_R8_SSCALED:
554		case VK_FORMAT_R8G8_USCALED:
555		case VK_FORMAT_R8G8_SSCALED:
556		case VK_FORMAT_R8G8B8_USCALED:
557		case VK_FORMAT_R8G8B8_SSCALED:
558		case VK_FORMAT_R8G8B8A8_USCALED:
559		case VK_FORMAT_R8G8B8A8_SSCALED:
560		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
561		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
562		case VK_FORMAT_R16_USCALED:
563		case VK_FORMAT_R16_SSCALED:
564		case VK_FORMAT_R16G16_USCALED:
565		case VK_FORMAT_R16G16_SSCALED:
566		case VK_FORMAT_R16G16B16_USCALED:
567		case VK_FORMAT_R16G16B16_SSCALED:
568		case VK_FORMAT_R16G16B16A16_USCALED:
569		case VK_FORMAT_R16G16B16A16_SSCALED:
570		case VK_FORMAT_B8G8R8_USCALED:
571		case VK_FORMAT_B8G8R8_SSCALED:
572		case VK_FORMAT_B8G8R8A8_USCALED:
573		case VK_FORMAT_B8G8R8A8_SSCALED:
574		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
575		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
576			return true;
577
578		default:
579			return false;
580	}
581}
582
583static bool fullTextureFormatRoundTripSupported (VkFormat format)
584{
585	if (isScaledFormat(format))
586	{
587		// *SCALED formats get mapped to correspoding (u)int formats since
588		// accessing them through (float) getPixel/setPixel has same behavior
589		// as in shader access in Vulkan.
590		// Unfortunately full round-trip between tcu::TextureFormat and VkFormat
591		// for most SCALED formats is not supported though.
592
593		const tcu::TextureFormat	tcuFormat	= mapVkFormat(format);
594
595		switch (tcuFormat.type)
596		{
597			case tcu::TextureFormat::UNSIGNED_INT8:
598			case tcu::TextureFormat::UNSIGNED_INT16:
599			case tcu::TextureFormat::UNSIGNED_INT32:
600			case tcu::TextureFormat::SIGNED_INT8:
601			case tcu::TextureFormat::SIGNED_INT16:
602			case tcu::TextureFormat::SIGNED_INT32:
603			case tcu::TextureFormat::UNSIGNED_INT_1010102_REV:
604			case tcu::TextureFormat::SIGNED_INT_1010102_REV:
605				return false;
606
607			default:
608				return true;
609		}
610	}
611	else
612	{
613		switch (format)
614		{
615			case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
616			case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
617			case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
618			case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
619			case VK_FORMAT_A8B8G8R8_UINT_PACK32:
620			case VK_FORMAT_A8B8G8R8_SINT_PACK32:
621			case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
622				return false; // These map to regular byte array formats
623
624			default:
625				break;
626		}
627
628		return (format != VK_FORMAT_UNDEFINED);
629	}
630}
631
632void imageUtilSelfTest (void)
633{
634	for (int formatNdx = 0; formatNdx < VK_FORMAT_LAST; formatNdx++)
635	{
636		const VkFormat	format	= (VkFormat)formatNdx;
637
638		if (format == VK_FORMAT_R64_UINT			||
639			format == VK_FORMAT_R64_SINT			||
640			format == VK_FORMAT_R64G64_UINT			||
641			format == VK_FORMAT_R64G64_SINT			||
642			format == VK_FORMAT_R64G64B64_UINT		||
643			format == VK_FORMAT_R64G64B64_SINT		||
644			format == VK_FORMAT_R64G64B64A64_UINT	||
645			format == VK_FORMAT_R64G64B64A64_SINT)
646			continue; // \todo [2015-12-05 pyry] Add framework support for (u)int64 channel type
647
648		if (format != VK_FORMAT_UNDEFINED && !isCompressedFormat(format))
649		{
650			const tcu::TextureFormat	tcuFormat		= mapVkFormat(format);
651			const VkFormat				remappedFormat	= mapTextureFormat(tcuFormat);
652
653			DE_TEST_ASSERT(isValid(tcuFormat));
654
655			if (fullTextureFormatRoundTripSupported(format))
656				DE_TEST_ASSERT(format == remappedFormat);
657		}
658	}
659}
660
661VkFilter mapFilterMode (tcu::Sampler::FilterMode filterMode)
662{
663	DE_STATIC_ASSERT(tcu::Sampler::FILTERMODE_LAST == 6);
664
665	switch (filterMode)
666	{
667		case tcu::Sampler::NEAREST:					return VK_FILTER_NEAREST;
668		case tcu::Sampler::LINEAR:					return VK_FILTER_LINEAR;
669		case tcu::Sampler::NEAREST_MIPMAP_NEAREST:	return VK_FILTER_NEAREST;
670		case tcu::Sampler::NEAREST_MIPMAP_LINEAR:	return VK_FILTER_NEAREST;
671		case tcu::Sampler::LINEAR_MIPMAP_NEAREST:	return VK_FILTER_LINEAR;
672		case tcu::Sampler::LINEAR_MIPMAP_LINEAR:	return VK_FILTER_LINEAR;
673		default:
674			DE_FATAL("Illegal filter mode");
675			return (VkFilter)0;
676
677	}
678}
679
680VkSamplerMipmapMode mapMipmapMode (tcu::Sampler::FilterMode filterMode)
681{
682	DE_STATIC_ASSERT(tcu::Sampler::FILTERMODE_LAST == 6);
683
684	// \note VkSamplerCreateInfo doesn't have a flag for disabling mipmapping. Instead
685	//		 minLod = 0 and maxLod = 0.25 should be used to match OpenGL NEAREST and LINEAR
686	//		 filtering mode behavior.
687
688	switch (filterMode)
689	{
690		case tcu::Sampler::NEAREST:					return VK_SAMPLER_MIPMAP_MODE_NEAREST;
691		case tcu::Sampler::LINEAR:					return VK_SAMPLER_MIPMAP_MODE_NEAREST;
692		case tcu::Sampler::NEAREST_MIPMAP_NEAREST:	return VK_SAMPLER_MIPMAP_MODE_NEAREST;
693		case tcu::Sampler::NEAREST_MIPMAP_LINEAR:	return VK_SAMPLER_MIPMAP_MODE_LINEAR;
694		case tcu::Sampler::LINEAR_MIPMAP_NEAREST:	return VK_SAMPLER_MIPMAP_MODE_NEAREST;
695		case tcu::Sampler::LINEAR_MIPMAP_LINEAR:	return VK_SAMPLER_MIPMAP_MODE_LINEAR;
696		default:
697			DE_FATAL("Illegal filter mode");
698			return (VkSamplerMipmapMode)0;
699	}
700}
701
702VkSamplerAddressMode mapWrapMode (tcu::Sampler::WrapMode wrapMode)
703{
704	switch (wrapMode)
705	{
706		case tcu::Sampler::CLAMP_TO_EDGE:		return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
707		case tcu::Sampler::CLAMP_TO_BORDER:		return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
708		case tcu::Sampler::REPEAT_GL:			return VK_SAMPLER_ADDRESS_MODE_REPEAT;
709		case tcu::Sampler::MIRRORED_REPEAT_GL:	return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
710		case tcu::Sampler::MIRRORED_ONCE:		return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
711		default:
712			DE_FATAL("Wrap mode can't be mapped to Vulkan");
713			return (vk::VkSamplerAddressMode)0;
714	}
715}
716
717vk::VkCompareOp mapCompareMode (tcu::Sampler::CompareMode mode)
718{
719	switch (mode)
720	{
721		case tcu::Sampler::COMPAREMODE_NONE:				return vk::VK_COMPARE_OP_NEVER;
722		case tcu::Sampler::COMPAREMODE_LESS:				return vk::VK_COMPARE_OP_LESS;
723		case tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL:		return vk::VK_COMPARE_OP_LESS_OR_EQUAL;
724		case tcu::Sampler::COMPAREMODE_GREATER:				return vk::VK_COMPARE_OP_GREATER;
725		case tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL:	return vk::VK_COMPARE_OP_GREATER_OR_EQUAL;
726		case tcu::Sampler::COMPAREMODE_EQUAL:				return vk::VK_COMPARE_OP_EQUAL;
727		case tcu::Sampler::COMPAREMODE_NOT_EQUAL:			return vk::VK_COMPARE_OP_NOT_EQUAL;
728		case tcu::Sampler::COMPAREMODE_ALWAYS:				return vk::VK_COMPARE_OP_ALWAYS;
729		case tcu::Sampler::COMPAREMODE_NEVER:				return vk::VK_COMPARE_OP_NEVER;
730		default:
731			DE_FATAL("Illegal compare mode");
732			return (vk::VkCompareOp)0;
733	}
734}
735
736static VkBorderColor mapBorderColor (tcu::TextureChannelClass channelClass, const rr::GenericVec4& color)
737{
738	if (channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
739	{
740		const tcu::UVec4	uColor	= color.get<deUint32>();
741
742		if (uColor		== tcu::UVec4(0, 0, 0, 0)) return VK_BORDER_COLOR_INT_TRANSPARENT_BLACK;
743		else if (uColor	== tcu::UVec4(0, 0, 0, 1)) return VK_BORDER_COLOR_INT_OPAQUE_BLACK;
744		else if (uColor == tcu::UVec4(1, 1, 1, 1)) return VK_BORDER_COLOR_INT_OPAQUE_WHITE;
745	}
746	else if (channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
747	{
748		const tcu::IVec4	sColor	= color.get<deInt32>();
749
750		if (sColor		== tcu::IVec4(0, 0, 0, 0)) return VK_BORDER_COLOR_INT_TRANSPARENT_BLACK;
751		else if (sColor	== tcu::IVec4(0, 0, 0, 1)) return VK_BORDER_COLOR_INT_OPAQUE_BLACK;
752		else if (sColor == tcu::IVec4(1, 1, 1, 1)) return VK_BORDER_COLOR_INT_OPAQUE_WHITE;
753	}
754	else
755	{
756		const tcu::Vec4		fColor	= color.get<float>();
757
758		if (fColor		== tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f)) return VK_BORDER_COLOR_INT_TRANSPARENT_BLACK;
759		else if (fColor	== tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)) return VK_BORDER_COLOR_INT_OPAQUE_BLACK;
760		else if (fColor == tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f)) return VK_BORDER_COLOR_INT_OPAQUE_WHITE;
761	}
762
763	DE_FATAL("Unsupported border color");
764	return VK_BORDER_COLOR_LAST;
765}
766
767VkSamplerCreateInfo mapSampler (const tcu::Sampler& sampler, const tcu::TextureFormat& format)
768{
769	const bool					compareEnabled	= (sampler.compare != tcu::Sampler::COMPAREMODE_NONE);
770	const VkCompareOp			compareOp		= (compareEnabled) ? (mapCompareMode(sampler.compare)) : (VK_COMPARE_OP_ALWAYS);
771	const VkBorderColor			borderColor		= mapBorderColor(getTextureChannelClass(format.type), sampler.borderColor);
772	const bool					isMipmapEnabled	= (sampler.minFilter != tcu::Sampler::NEAREST && sampler.minFilter != tcu::Sampler::LINEAR);
773
774	const VkSamplerCreateInfo	createInfo		=
775	{
776		VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
777		DE_NULL,
778		(VkSamplerCreateFlags)0,
779		mapFilterMode(sampler.magFilter),					// magFilter
780		mapFilterMode(sampler.minFilter),					// minFilter
781		mapMipmapMode(sampler.minFilter),					// mipMode
782		mapWrapMode(sampler.wrapS),							// addressU
783		mapWrapMode(sampler.wrapT),							// addressV
784		mapWrapMode(sampler.wrapR),							// addressW
785		0.0f,												// mipLodBias
786		VK_FALSE,											// anisotropyEnable
787		1.0f,												// maxAnisotropy
788		(VkBool32)(compareEnabled ? VK_TRUE : VK_FALSE),	// compareEnable
789		compareOp,											// compareOp
790		0.0f,												// minLod
791		(isMipmapEnabled ? 1000.0f : 0.25f),				// maxLod
792		borderColor,										// borderColor
793		(sampler.normalizedCoords ? VK_FALSE : VK_TRUE),	// unnormalizedCoords
794	};
795
796	return createInfo;
797}
798
799tcu::Sampler mapVkSampler (const VkSamplerCreateInfo& samplerCreateInfo)
800{
801	// \note minLod & maxLod are not supported by tcu::Sampler. LOD must be clamped
802	//       before passing it to tcu::Texture*::sample*()
803
804	tcu::Sampler sampler(mapVkSamplerAddressMode(samplerCreateInfo.addressModeU),
805						 mapVkSamplerAddressMode(samplerCreateInfo.addressModeV),
806						 mapVkSamplerAddressMode(samplerCreateInfo.addressModeW),
807						 mapVkMinTexFilter(samplerCreateInfo.minFilter, samplerCreateInfo.mipmapMode),
808						 mapVkMagTexFilter(samplerCreateInfo.magFilter),
809						 0.0f,
810						 !samplerCreateInfo.unnormalizedCoordinates,
811						 samplerCreateInfo.compareEnable ? mapVkSamplerCompareOp(samplerCreateInfo.compareOp)
812														 : tcu::Sampler::COMPAREMODE_NONE,
813						 0,
814						 tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f),
815						 true);
816
817	if (samplerCreateInfo.anisotropyEnable)
818		TCU_THROW(InternalError, "Anisotropic filtering is not supported by tcu::Sampler");
819
820	switch (samplerCreateInfo.borderColor)
821	{
822		case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
823			sampler.borderColor = tcu::UVec4(0,0,0,1);
824			break;
825		case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
826			sampler.borderColor = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
827			break;
828		case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
829			sampler.borderColor = tcu::UVec4(1, 1, 1, 1);
830			break;
831		case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
832			sampler.borderColor = tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f);
833			break;
834		case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
835			sampler.borderColor = tcu::UVec4(0,0,0,0);
836			break;
837		case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
838			sampler.borderColor = tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f);
839			break;
840
841		default:
842			DE_ASSERT(false);
843			break;
844	}
845
846	return sampler;
847}
848
849tcu::Sampler::CompareMode mapVkSamplerCompareOp (VkCompareOp compareOp)
850{
851	switch (compareOp)
852	{
853		case VK_COMPARE_OP_NEVER:				return tcu::Sampler::COMPAREMODE_NEVER;
854		case VK_COMPARE_OP_LESS:				return tcu::Sampler::COMPAREMODE_LESS;
855		case VK_COMPARE_OP_EQUAL:				return tcu::Sampler::COMPAREMODE_EQUAL;
856		case VK_COMPARE_OP_LESS_OR_EQUAL:		return tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL;
857		case VK_COMPARE_OP_GREATER:				return tcu::Sampler::COMPAREMODE_GREATER;
858		case VK_COMPARE_OP_NOT_EQUAL:			return tcu::Sampler::COMPAREMODE_NOT_EQUAL;
859		case VK_COMPARE_OP_GREATER_OR_EQUAL:	return tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL;
860		case VK_COMPARE_OP_ALWAYS:				return tcu::Sampler::COMPAREMODE_ALWAYS;
861		default:
862			break;
863	}
864
865	DE_ASSERT(false);
866	return tcu::Sampler::COMPAREMODE_LAST;
867}
868
869tcu::Sampler::WrapMode mapVkSamplerAddressMode (VkSamplerAddressMode addressMode)
870{
871	switch (addressMode)
872	{
873		case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE:			return tcu::Sampler::CLAMP_TO_EDGE;
874		case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER:		return tcu::Sampler::CLAMP_TO_BORDER;
875		case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT:		return tcu::Sampler::MIRRORED_REPEAT_GL;
876		case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE:	return tcu::Sampler::MIRRORED_ONCE;
877		case VK_SAMPLER_ADDRESS_MODE_REPEAT:				return tcu::Sampler::REPEAT_GL;
878		default:
879			break;
880	}
881
882	DE_ASSERT(false);
883	return tcu::Sampler::WRAPMODE_LAST;
884}
885
886tcu::Sampler::FilterMode mapVkMinTexFilter (VkFilter filter, VkSamplerMipmapMode mipMode)
887{
888	switch (filter)
889	{
890		case VK_FILTER_LINEAR:
891			switch (mipMode)
892			{
893				case VK_SAMPLER_MIPMAP_MODE_LINEAR:		return tcu::Sampler::LINEAR_MIPMAP_LINEAR;
894				case VK_SAMPLER_MIPMAP_MODE_NEAREST:	return tcu::Sampler::LINEAR_MIPMAP_NEAREST;
895				default:
896					break;
897			}
898			break;
899
900		case VK_FILTER_NEAREST:
901			switch (mipMode)
902			{
903				case VK_SAMPLER_MIPMAP_MODE_LINEAR:		return tcu::Sampler::NEAREST_MIPMAP_LINEAR;
904				case VK_SAMPLER_MIPMAP_MODE_NEAREST:	return tcu::Sampler::NEAREST_MIPMAP_NEAREST;
905				default:
906					break;
907			}
908			break;
909
910		default:
911			break;
912	}
913
914	DE_ASSERT(false);
915	return tcu::Sampler::FILTERMODE_LAST;
916}
917
918tcu::Sampler::FilterMode mapVkMagTexFilter (VkFilter filter)
919{
920	switch (filter)
921	{
922		case VK_FILTER_LINEAR:		return tcu::Sampler::LINEAR;
923		case VK_FILTER_NEAREST:		return tcu::Sampler::NEAREST;
924		default:
925			break;
926	}
927
928	DE_ASSERT(false);
929	return tcu::Sampler::FILTERMODE_LAST;
930}
931
932
933int mapVkComponentSwizzle (const vk::VkComponentSwizzle& channelSwizzle)
934{
935	switch (channelSwizzle)
936	{
937		case vk::VK_COMPONENT_SWIZZLE_ZERO:	return 0;
938		case vk::VK_COMPONENT_SWIZZLE_ONE:	return 1;
939		case vk::VK_COMPONENT_SWIZZLE_R:	return 2;
940		case vk::VK_COMPONENT_SWIZZLE_G:	return 3;
941		case vk::VK_COMPONENT_SWIZZLE_B:	return 4;
942		case vk::VK_COMPONENT_SWIZZLE_A:	return 5;
943		default:
944			break;
945	}
946
947	DE_ASSERT(false);
948	return 0;
949}
950
951tcu::UVec4 mapVkComponentMapping (const vk::VkComponentMapping& mapping)
952{
953	tcu::UVec4 swizzle;
954
955	swizzle.x() = mapVkComponentSwizzle(mapping.r);
956	swizzle.y() = mapVkComponentSwizzle(mapping.g);
957	swizzle.z() = mapVkComponentSwizzle(mapping.b);
958	swizzle.w() = mapVkComponentSwizzle(mapping.a);
959
960	return swizzle;
961}
962
963//! Get a format the matches the layout in buffer memory used for a
964//! buffer<->image copy on a depth/stencil format.
965tcu::TextureFormat getDepthCopyFormat (VkFormat combinedFormat)
966{
967	switch (combinedFormat)
968	{
969		case VK_FORMAT_D16_UNORM:
970		case VK_FORMAT_X8_D24_UNORM_PACK32:
971		case VK_FORMAT_D32_SFLOAT:
972			return mapVkFormat(combinedFormat);
973
974		case VK_FORMAT_D16_UNORM_S8_UINT:
975			return mapVkFormat(VK_FORMAT_D16_UNORM);
976		case VK_FORMAT_D24_UNORM_S8_UINT:
977			return mapVkFormat(VK_FORMAT_X8_D24_UNORM_PACK32);
978		case VK_FORMAT_D32_SFLOAT_S8_UINT:
979			return mapVkFormat(VK_FORMAT_D32_SFLOAT);
980
981		case VK_FORMAT_S8_UINT:
982		default:
983			DE_FATAL("Unexpected depth/stencil format");
984			return tcu::TextureFormat();
985	}
986}
987
988//! Get a format the matches the layout in buffer memory used for a
989//! buffer<->image copy on a depth/stencil format.
990tcu::TextureFormat getStencilCopyFormat (VkFormat combinedFormat)
991{
992	switch (combinedFormat)
993	{
994		case VK_FORMAT_D16_UNORM_S8_UINT:
995		case VK_FORMAT_D24_UNORM_S8_UINT:
996		case VK_FORMAT_D32_SFLOAT_S8_UINT:
997		case VK_FORMAT_S8_UINT:
998			return mapVkFormat(VK_FORMAT_S8_UINT);
999
1000		case VK_FORMAT_D16_UNORM:
1001		case VK_FORMAT_X8_D24_UNORM_PACK32:
1002		case VK_FORMAT_D32_SFLOAT:
1003		default:
1004			DE_FATAL("Unexpected depth/stencil format");
1005			return tcu::TextureFormat();
1006	}
1007}
1008
1009} // vk
1010