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