Merge branch 'jekstrand_renderpass_transfer_bit_fix' into 'master'
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / framework / vulkan / vkImageUtil.cpp
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
40 namespace vk
41 {
42
43 bool isFloatFormat (VkFormat format)
44 {
45         return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
46 }
47
48 bool isUnormFormat (VkFormat format)
49 {
50         return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
51 }
52
53 bool isSnormFormat (VkFormat format)
54 {
55         return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
56 }
57
58 bool isIntFormat (VkFormat format)
59 {
60         return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER;
61 }
62
63 bool isUintFormat (VkFormat format)
64 {
65         return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
66 }
67
68 bool 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
77 bool 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
145 VkFormat 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
281 tcu::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
449 tcu::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_5x4_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_8x5_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
501 VkComponentMapping 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
545 static 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
583 static 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
632 void 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
661 VkFilter 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
680 VkSamplerMipmapMode 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
702 VkSamplerAddressMode 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
717 vk::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
736 static 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_FLOAT_TRANSPARENT_BLACK;
759                 else if (fColor == tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)) return VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
760                 else if (fColor == tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f)) return VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
761         }
762
763         DE_FATAL("Unsupported border color");
764         return VK_BORDER_COLOR_LAST;
765 }
766
767 VkSamplerCreateInfo 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                 (VkBool32)(sampler.normalizedCoords ? VK_FALSE : VK_TRUE),      // unnormalizedCoords
794         };
795
796         return createInfo;
797 }
798
799 tcu::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
849 tcu::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
869 tcu::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
886 tcu::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
918 tcu::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
933 int 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
951 tcu::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.
965 tcu::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.
990 tcu::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