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