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