Merge pull request #216 from werman/tests/xfb_explicit_location
[platform/upstream/VK-GL-CTS.git] / framework / opengl / gluTextureUtil.cpp
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES Utilities
3  * ------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Texture format utilities.
22  *//*--------------------------------------------------------------------*/
23
24 #include "gluTextureUtil.hpp"
25 #include "gluRenderContext.hpp"
26 #include "gluContextInfo.hpp"
27 #include "gluTexture.hpp"
28 #include "tcuTextureUtil.hpp"
29 #include "tcuFormatUtil.hpp"
30 #include "glwEnums.hpp"
31
32 namespace glu
33 {
34
35 using std::string;
36
37 /*--------------------------------------------------------------------*//*!
38  * \brief Map tcu::TextureFormat to GL pixel transfer format.
39  *
40  * Maps generic texture format description to GL pixel transfer format.
41  * If no mapping is found, throws tcu::InternalError.
42  *
43  * \param texFormat Generic texture format.
44  * \return GL pixel transfer format.
45  *//*--------------------------------------------------------------------*/
46 TransferFormat getTransferFormat (tcu::TextureFormat texFormat)
47 {
48         using tcu::TextureFormat;
49
50         deUint32        format  = GL_NONE;
51         deUint32        type    = GL_NONE;
52         bool            isInt   = false;
53
54         switch (texFormat.type)
55         {
56                 case TextureFormat::SIGNED_INT8:
57                 case TextureFormat::SIGNED_INT16:
58                 case TextureFormat::SIGNED_INT32:
59                 case TextureFormat::UNSIGNED_INT8:
60                 case TextureFormat::UNSIGNED_INT16:
61                 case TextureFormat::UNSIGNED_INT32:
62                 case TextureFormat::UNSIGNED_INT_1010102_REV:
63                         isInt = true;
64                         break;
65
66                 default:
67                         isInt = false;
68                         break;
69         }
70
71         switch (texFormat.order)
72         {
73                 case TextureFormat::A:          format = GL_ALPHA;                                                              break;
74                 case TextureFormat::L:          format = GL_LUMINANCE;                                                  break;
75                 case TextureFormat::LA:         format = GL_LUMINANCE_ALPHA;                                    break;
76                 case TextureFormat::R:          format = isInt ? GL_RED_INTEGER         : GL_RED;       break;
77                 case TextureFormat::RG:         format = isInt ? GL_RG_INTEGER          : GL_RG;        break;
78                 case TextureFormat::RGB:        format = isInt ? GL_RGB_INTEGER         : GL_RGB;       break;
79                 case TextureFormat::RGBA:       format = isInt ? GL_RGBA_INTEGER        : GL_RGBA;      break;
80                 case TextureFormat::sR:         format = GL_RED;                                                                break;
81                 case TextureFormat::sRG:        format = GL_RG;                                                                 break;
82                 case TextureFormat::sRGB:       format = GL_RGB;                                                                break;
83                 case TextureFormat::sRGBA:      format = GL_RGBA;                                                               break;
84                 case TextureFormat::D:          format = GL_DEPTH_COMPONENT;                                    break;
85                 case TextureFormat::DS:         format = GL_DEPTH_STENCIL;                                              break;
86                 case TextureFormat::S:          format = GL_STENCIL_INDEX;                                              break;
87
88                 case TextureFormat::BGRA:
89                         DE_ASSERT(!isInt);
90                         format = GL_BGRA;
91                         break;
92
93                 default:
94                         DE_ASSERT(false);
95         }
96
97         switch (texFormat.type)
98         {
99                 case TextureFormat::SNORM_INT8:                                         type = GL_BYTE;                                                         break;
100                 case TextureFormat::SNORM_INT16:                                        type = GL_SHORT;                                                        break;
101                 case TextureFormat::UNORM_INT8:                                         type = GL_UNSIGNED_BYTE;                                        break;
102                 case TextureFormat::UNORM_INT16:                                        type = GL_UNSIGNED_SHORT;                                       break;
103                 case TextureFormat::UNORM_SHORT_565:                            type = GL_UNSIGNED_SHORT_5_6_5;                         break;
104                 case TextureFormat::UNORM_SHORT_4444:                           type = GL_UNSIGNED_SHORT_4_4_4_4;                       break;
105                 case TextureFormat::UNORM_SHORT_5551:                           type = GL_UNSIGNED_SHORT_5_5_5_1;                       break;
106                 case TextureFormat::SIGNED_INT8:                                        type = GL_BYTE;                                                         break;
107                 case TextureFormat::SIGNED_INT16:                                       type = GL_SHORT;                                                        break;
108                 case TextureFormat::SIGNED_INT32:                                       type = GL_INT;                                                          break;
109                 case TextureFormat::UNSIGNED_INT8:                                      type = GL_UNSIGNED_BYTE;                                        break;
110                 case TextureFormat::UNSIGNED_INT16:                                     type = GL_UNSIGNED_SHORT;                                       break;
111                 case TextureFormat::UNSIGNED_INT32:                                     type = GL_UNSIGNED_INT;                                         break;
112                 case TextureFormat::FLOAT:                                                      type = GL_FLOAT;                                                        break;
113                 case TextureFormat::UNORM_INT_101010:                           type = GL_UNSIGNED_INT_2_10_10_10_REV;          break;
114                 case TextureFormat::UNORM_INT_1010102_REV:                      type = GL_UNSIGNED_INT_2_10_10_10_REV;          break;
115                 case TextureFormat::UNSIGNED_INT_1010102_REV:           type = GL_UNSIGNED_INT_2_10_10_10_REV;          break;
116                 case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:       type = GL_UNSIGNED_INT_10F_11F_11F_REV;         break;
117                 case TextureFormat::UNSIGNED_INT_999_E5_REV:            type = GL_UNSIGNED_INT_5_9_9_9_REV;                     break;
118                 case TextureFormat::HALF_FLOAT:                                         type = GL_HALF_FLOAT;                                           break;
119                 case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:        type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;       break;
120                 case TextureFormat::UNSIGNED_INT_24_8:                          type = texFormat.order == TextureFormat::D
121                                                                                                                                  ? GL_UNSIGNED_INT
122                                                                                                                                  : GL_UNSIGNED_INT_24_8;                                break;
123
124                 default:
125                         throw tcu::InternalError("Can't map texture format to GL transfer format");
126         }
127
128         return TransferFormat(format, type);
129 }
130
131 /*--------------------------------------------------------------------*//*!
132  * \brief Map tcu::TextureFormat to GL internal sized format.
133  *
134  * Maps generic texture format description to GL internal format.
135  * If no mapping is found, throws tcu::InternalError.
136  *
137  * \param texFormat Generic texture format.
138  * \return GL sized internal format.
139  *//*--------------------------------------------------------------------*/
140 deUint32 getInternalFormat (tcu::TextureFormat texFormat)
141 {
142         DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST < (1<<16));
143         DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST < (1<<16));
144
145 #define PACK_FMT(ORDER, TYPE) ((int(ORDER) << 16) | int(TYPE))
146 #define FMT_CASE(ORDER, TYPE) PACK_FMT(tcu::TextureFormat::ORDER, tcu::TextureFormat::TYPE)
147
148         switch (PACK_FMT(texFormat.order, texFormat.type))
149         {
150                 case FMT_CASE(RGBA,             UNORM_SHORT_5551):                              return GL_RGB5_A1;
151                 case FMT_CASE(RGBA,             UNORM_SHORT_4444):                              return GL_RGBA4;
152                 case FMT_CASE(RGB,              UNORM_SHORT_565):                               return GL_RGB565;
153                 case FMT_CASE(D,                UNORM_INT16):                                   return GL_DEPTH_COMPONENT16;
154                 case FMT_CASE(S,                UNSIGNED_INT8):                                 return GL_STENCIL_INDEX8;
155
156                 case FMT_CASE(RGBA,             FLOAT):                                                 return GL_RGBA32F;
157                 case FMT_CASE(RGBA,             SIGNED_INT32):                                  return GL_RGBA32I;
158                 case FMT_CASE(RGBA,             UNSIGNED_INT32):                                return GL_RGBA32UI;
159                 case FMT_CASE(RGBA,             UNORM_INT16):                                   return GL_RGBA16;
160                 case FMT_CASE(RGBA,             SNORM_INT16):                                   return GL_RGBA16_SNORM;
161                 case FMT_CASE(RGBA,             HALF_FLOAT):                                    return GL_RGBA16F;
162                 case FMT_CASE(RGBA,             SIGNED_INT16):                                  return GL_RGBA16I;
163                 case FMT_CASE(RGBA,             UNSIGNED_INT16):                                return GL_RGBA16UI;
164                 case FMT_CASE(RGBA,             UNORM_INT8):                                    return GL_RGBA8;
165                 case FMT_CASE(RGBA,             SIGNED_INT8):                                   return GL_RGBA8I;
166                 case FMT_CASE(RGBA,             UNSIGNED_INT8):                                 return GL_RGBA8UI;
167                 case FMT_CASE(sRGBA,    UNORM_INT8):                                    return GL_SRGB8_ALPHA8;
168                 case FMT_CASE(RGBA,             UNORM_INT_1010102_REV):                 return GL_RGB10_A2;
169                 case FMT_CASE(RGBA,             UNSIGNED_INT_1010102_REV):              return GL_RGB10_A2UI;
170                 case FMT_CASE(RGBA,             SNORM_INT8):                                    return GL_RGBA8_SNORM;
171
172                 case FMT_CASE(RGB,              UNORM_INT8):                                    return GL_RGB8;
173                 case FMT_CASE(RGB,              UNSIGNED_INT_11F_11F_10F_REV):  return GL_R11F_G11F_B10F;
174                 case FMT_CASE(RGB,              FLOAT):                                                 return GL_RGB32F;
175                 case FMT_CASE(RGB,              SIGNED_INT32):                                  return GL_RGB32I;
176                 case FMT_CASE(RGB,              UNSIGNED_INT32):                                return GL_RGB32UI;
177                 case FMT_CASE(RGB,              UNORM_INT16):                                   return GL_RGB16;
178                 case FMT_CASE(RGB,              SNORM_INT16):                                   return GL_RGB16_SNORM;
179                 case FMT_CASE(RGB,              HALF_FLOAT):                                    return GL_RGB16F;
180                 case FMT_CASE(RGB,              SIGNED_INT16):                                  return GL_RGB16I;
181                 case FMT_CASE(RGB,              UNSIGNED_INT16):                                return GL_RGB16UI;
182                 case FMT_CASE(RGB,              SNORM_INT8):                                    return GL_RGB8_SNORM;
183                 case FMT_CASE(RGB,              SIGNED_INT8):                                   return GL_RGB8I;
184                 case FMT_CASE(RGB,              UNSIGNED_INT8):                                 return GL_RGB8UI;
185                 case FMT_CASE(sRGB,             UNORM_INT8):                                    return GL_SRGB8;
186                 case FMT_CASE(RGB,              UNSIGNED_INT_999_E5_REV):               return GL_RGB9_E5;
187                 case FMT_CASE(RGB,              UNORM_INT_1010102_REV):                 return GL_RGB10;
188
189                 case FMT_CASE(RG,               FLOAT):                                                 return GL_RG32F;
190                 case FMT_CASE(RG,               SIGNED_INT32):                                  return GL_RG32I;
191                 case FMT_CASE(RG,               UNSIGNED_INT32):                                return GL_RG32UI;
192                 case FMT_CASE(RG,               UNORM_INT16):                                   return GL_RG16;
193                 case FMT_CASE(RG,               SNORM_INT16):                                   return GL_RG16_SNORM;
194                 case FMT_CASE(RG,               HALF_FLOAT):                                    return GL_RG16F;
195                 case FMT_CASE(RG,               SIGNED_INT16):                                  return GL_RG16I;
196                 case FMT_CASE(RG,               UNSIGNED_INT16):                                return GL_RG16UI;
197                 case FMT_CASE(RG,               UNORM_INT8):                                    return GL_RG8;
198                 case FMT_CASE(RG,               SIGNED_INT8):                                   return GL_RG8I;
199                 case FMT_CASE(RG,               UNSIGNED_INT8):                                 return GL_RG8UI;
200                 case FMT_CASE(RG,               SNORM_INT8):                                    return GL_RG8_SNORM;
201                 case FMT_CASE(sRG,              UNORM_INT8):                                    return GL_SRG8_EXT;
202
203                 case FMT_CASE(R,                FLOAT):                                                 return GL_R32F;
204                 case FMT_CASE(R,                SIGNED_INT32):                                  return GL_R32I;
205                 case FMT_CASE(R,                UNSIGNED_INT32):                                return GL_R32UI;
206                 case FMT_CASE(R,                UNORM_INT16):                                   return GL_R16;
207                 case FMT_CASE(R,                SNORM_INT16):                                   return GL_R16_SNORM;
208                 case FMT_CASE(R,                HALF_FLOAT):                                    return GL_R16F;
209                 case FMT_CASE(R,                SIGNED_INT16):                                  return GL_R16I;
210                 case FMT_CASE(R,                UNSIGNED_INT16):                                return GL_R16UI;
211                 case FMT_CASE(R,                UNORM_INT8):                                    return GL_R8;
212                 case FMT_CASE(R,                SIGNED_INT8):                                   return GL_R8I;
213                 case FMT_CASE(R,                UNSIGNED_INT8):                                 return GL_R8UI;
214                 case FMT_CASE(R,                SNORM_INT8):                                    return GL_R8_SNORM;
215                 case FMT_CASE(sR,               UNORM_INT8):                                    return GL_SR8_EXT;
216
217                 case FMT_CASE(D,                FLOAT):                                                 return GL_DEPTH_COMPONENT32F;
218                 case FMT_CASE(D,                UNSIGNED_INT_24_8):                             return GL_DEPTH_COMPONENT24;
219                 case FMT_CASE(D,                UNSIGNED_INT32):                                return GL_DEPTH_COMPONENT32;
220                 case FMT_CASE(DS,               FLOAT_UNSIGNED_INT_24_8_REV):   return GL_DEPTH32F_STENCIL8;
221                 case FMT_CASE(DS,               UNSIGNED_INT_24_8):                             return GL_DEPTH24_STENCIL8;
222
223                 default:
224                         throw tcu::InternalError("Can't map texture format to GL internal format");
225         }
226 }
227
228 /*--------------------------------------------------------------------*//*!
229  * \brief Map generic compressed format to GL compressed format enum.
230  *
231  * Maps generic compressed format to GL compressed format enum value.
232  * If no mapping is found, throws tcu::InternalError.
233  *
234  * \param format Generic compressed format.
235  * \return GL compressed texture format.
236  *//*--------------------------------------------------------------------*/
237 deUint32 getGLFormat (tcu::CompressedTexFormat format)
238 {
239         switch (format)
240         {
241                 case tcu::COMPRESSEDTEXFORMAT_ETC1_RGB8:                                                return GL_ETC1_RGB8_OES;
242                 case tcu::COMPRESSEDTEXFORMAT_EAC_R11:                                                  return GL_COMPRESSED_R11_EAC;
243                 case tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11:                                   return GL_COMPRESSED_SIGNED_R11_EAC;
244                 case tcu::COMPRESSEDTEXFORMAT_EAC_RG11:                                                 return GL_COMPRESSED_RG11_EAC;
245                 case tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11:                                  return GL_COMPRESSED_SIGNED_RG11_EAC;
246                 case tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8:                                                return GL_COMPRESSED_RGB8_ETC2;
247                 case tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8:                                               return GL_COMPRESSED_SRGB8_ETC2;
248                 case tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:    return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
249                 case tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:   return GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
250                 case tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8:                                   return GL_COMPRESSED_RGBA8_ETC2_EAC;
251                 case tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
252
253                 case tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA:                                    return GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
254                 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA:                                    return GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
255                 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA:                                    return GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
256                 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA:                                    return GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
257                 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA:                                    return GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
258                 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA:                                    return GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
259                 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA:                                    return GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
260                 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA:                                    return GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
261                 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA:                                   return GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
262                 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA:                                   return GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
263                 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA:                                   return GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
264                 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA:                                  return GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
265                 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA:                                  return GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
266                 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA:                                  return GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
267                 case tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
268                 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
269                 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
270                 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
271                 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
272                 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
273                 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
274                 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8:                    return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
275                 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8:                   return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
276                 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8:                   return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
277                 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8:                   return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
278                 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8:                  return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
279                 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8:                  return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
280                 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8:                  return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
281
282                 default:
283                         throw tcu::InternalError("Can't map compressed format to GL format");
284         }
285 }
286
287 /*--------------------------------------------------------------------*//*!
288  * \brief Map compressed GL format to generic compressed format.
289  *
290  * Maps compressed GL format to generic compressed format.
291  * If no mapping is found, throws tcu::InternalError.
292  *
293  * \param GL compressed texture format.
294  * \return format Generic compressed format.
295  *//*--------------------------------------------------------------------*/
296 tcu::CompressedTexFormat mapGLCompressedTexFormat (deUint32 format)
297 {
298         switch (format)
299         {
300                 case GL_ETC1_RGB8_OES:                                                          return tcu::COMPRESSEDTEXFORMAT_ETC1_RGB8;
301                 case GL_COMPRESSED_R11_EAC:                                                     return tcu::COMPRESSEDTEXFORMAT_EAC_R11;
302                 case GL_COMPRESSED_SIGNED_R11_EAC:                                      return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11;
303                 case GL_COMPRESSED_RG11_EAC:                                            return tcu::COMPRESSEDTEXFORMAT_EAC_RG11;
304                 case GL_COMPRESSED_SIGNED_RG11_EAC:                                     return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11;
305                 case GL_COMPRESSED_RGB8_ETC2:                                           return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8;
306                 case GL_COMPRESSED_SRGB8_ETC2:                                          return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8;
307                 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:       return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
308                 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:      return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
309                 case GL_COMPRESSED_RGBA8_ETC2_EAC:                                      return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8;
310                 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:                       return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8;
311
312                 case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:                           return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA;
313                 case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:                           return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA;
314                 case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:                           return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA;
315                 case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:                           return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA;
316                 case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:                           return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA;
317                 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:                           return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA;
318                 case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:                           return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA;
319                 case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:                           return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA;
320                 case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:                          return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA;
321                 case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:                          return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA;
322                 case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:                          return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA;
323                 case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:                         return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA;
324                 case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:                         return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA;
325                 case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:                         return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA;
326                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:           return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8;
327                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:           return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_SRGB8_ALPHA8;
328                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:           return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8;
329                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:           return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8;
330                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:           return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8;
331                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:           return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_SRGB8_ALPHA8;
332                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:           return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8;
333                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:           return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8;
334                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:          return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8;
335                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:          return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8;
336                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:          return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8;
337                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:         return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8;
338                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:         return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8;
339                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:         return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8;
340
341                 default:
342                         throw tcu::InternalError("Can't map compressed GL format to compressed format");
343         }
344 }
345
346 bool isCompressedFormat (deUint32 internalFormat)
347 {
348         switch (internalFormat)
349         {
350                 case GL_ETC1_RGB8_OES:
351                 case GL_COMPRESSED_R11_EAC:
352                 case GL_COMPRESSED_SIGNED_R11_EAC:
353                 case GL_COMPRESSED_RG11_EAC:
354                 case GL_COMPRESSED_SIGNED_RG11_EAC:
355                 case GL_COMPRESSED_RGB8_ETC2:
356                 case GL_COMPRESSED_SRGB8_ETC2:
357                 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
358                 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
359                 case GL_COMPRESSED_RGBA8_ETC2_EAC:
360                 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
361                 case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
362                 case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
363                 case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
364                 case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
365                 case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
366                 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
367                 case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
368                 case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
369                 case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
370                 case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
371                 case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
372                 case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
373                 case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
374                 case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
375                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
376                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
377                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
378                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
379                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
380                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
381                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
382                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
383                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
384                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
385                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
386                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
387                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
388                 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
389                         return true;
390
391                 default:
392                         return false;
393         }
394 }
395
396 static tcu::TextureFormat::ChannelType mapGLChannelType (deUint32 dataType, bool normalized)
397 {
398         // \note Normalized bit is ignored where it doesn't apply.
399         using tcu::TextureFormat;
400
401         switch (dataType)
402         {
403                 case GL_UNSIGNED_BYTE:                                  return normalized ? TextureFormat::UNORM_INT8   : TextureFormat::UNSIGNED_INT8;
404                 case GL_BYTE:                                                   return normalized ? TextureFormat::SNORM_INT8   : TextureFormat::SIGNED_INT8;
405                 case GL_UNSIGNED_SHORT:                                 return normalized ? TextureFormat::UNORM_INT16  : TextureFormat::UNSIGNED_INT16;
406                 case GL_SHORT:                                                  return normalized ? TextureFormat::SNORM_INT16  : TextureFormat::SIGNED_INT16;
407                 case GL_UNSIGNED_INT:                                   return normalized ? TextureFormat::UNORM_INT32  : TextureFormat::UNSIGNED_INT32;
408                 case GL_INT:                                                    return normalized ? TextureFormat::SNORM_INT32  : TextureFormat::SIGNED_INT32;
409                 case GL_FLOAT:                                                  return TextureFormat::FLOAT;
410                 case GL_UNSIGNED_SHORT_4_4_4_4:                 return TextureFormat::UNORM_SHORT_4444;
411                 case GL_UNSIGNED_SHORT_5_5_5_1:                 return TextureFormat::UNORM_SHORT_5551;
412                 case GL_UNSIGNED_SHORT_5_6_5:                   return TextureFormat::UNORM_SHORT_565;
413                 case GL_HALF_FLOAT:                                             return TextureFormat::HALF_FLOAT;
414                 case GL_UNSIGNED_INT_2_10_10_10_REV:    return normalized ? TextureFormat::UNORM_INT_1010102_REV : TextureFormat::UNSIGNED_INT_1010102_REV;
415                 case GL_UNSIGNED_INT_10F_11F_11F_REV:   return TextureFormat::UNSIGNED_INT_11F_11F_10F_REV;
416                 case GL_UNSIGNED_INT_24_8:                              return TextureFormat::UNSIGNED_INT_24_8;
417                 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV;
418                 case GL_UNSIGNED_INT_5_9_9_9_REV:               return TextureFormat::UNSIGNED_INT_999_E5_REV;
419
420                 // GL_OES_texture_half_float
421                 case GL_HALF_FLOAT_OES:                                 return TextureFormat::HALF_FLOAT;
422
423                 default:
424                         DE_ASSERT(false);
425                         return TextureFormat::CHANNELTYPE_LAST;
426         }
427 }
428
429 /*--------------------------------------------------------------------*//*!
430  * \brief Map GL pixel transfer format to tcu::TextureFormat.
431  *
432  * If no mapping is found, throws tcu::InternalError.
433  *
434  * \param format        GL pixel format.
435  * \param dataType      GL data type.
436  * \return Generic texture format.
437  *//*--------------------------------------------------------------------*/
438 tcu::TextureFormat mapGLTransferFormat (deUint32 format, deUint32 dataType)
439 {
440         using tcu::TextureFormat;
441         switch (format)
442         {
443                 case GL_ALPHA:                          return TextureFormat(TextureFormat::A,          mapGLChannelType(dataType, true));
444                 case GL_LUMINANCE:                      return TextureFormat(TextureFormat::L,          mapGLChannelType(dataType, true));
445                 case GL_LUMINANCE_ALPHA:        return TextureFormat(TextureFormat::LA,         mapGLChannelType(dataType, true));
446                 case GL_RGB:                            return TextureFormat(TextureFormat::RGB,        mapGLChannelType(dataType, true));
447                 case GL_RGBA:                           return TextureFormat(TextureFormat::RGBA,       mapGLChannelType(dataType, true));
448                 case GL_BGRA:                           return TextureFormat(TextureFormat::BGRA,       mapGLChannelType(dataType, true));
449                 case GL_RG:                                     return TextureFormat(TextureFormat::RG,         mapGLChannelType(dataType, true));
450                 case GL_RED:                            return TextureFormat(TextureFormat::R,          mapGLChannelType(dataType, true));
451                 case GL_RGBA_INTEGER:           return TextureFormat(TextureFormat::RGBA,       mapGLChannelType(dataType, false));
452                 case GL_RGB_INTEGER:            return TextureFormat(TextureFormat::RGB,        mapGLChannelType(dataType, false));
453                 case GL_RG_INTEGER:                     return TextureFormat(TextureFormat::RG,         mapGLChannelType(dataType, false));
454                 case GL_RED_INTEGER:            return TextureFormat(TextureFormat::R,          mapGLChannelType(dataType, false));
455                 case GL_SRGB:                           return TextureFormat(TextureFormat::sRGB,       mapGLChannelType(dataType, false));
456                 case GL_SRGB_ALPHA:                     return TextureFormat(TextureFormat::sRGBA,      mapGLChannelType(dataType, false));
457
458                 case GL_DEPTH_COMPONENT:        return TextureFormat(TextureFormat::D,          mapGLChannelType(dataType, true));
459                 case GL_DEPTH_STENCIL:          return TextureFormat(TextureFormat::DS,         mapGLChannelType(dataType, true));
460
461                 default:
462                         throw tcu::InternalError(string("Can't map GL pixel format (") + tcu::toHex(format).toString() + ", " + tcu::toHex(dataType).toString() + ") to texture format");
463         }
464 }
465
466 /*--------------------------------------------------------------------*//*!
467  * \brief Map GL internal texture format to tcu::TextureFormat.
468  *
469  * If no mapping is found, throws tcu::InternalError.
470  *
471  * \param internalFormat Sized internal format.
472  * \return Generic texture format.
473  *//*--------------------------------------------------------------------*/
474 tcu::TextureFormat mapGLInternalFormat (deUint32 internalFormat)
475 {
476         using tcu::TextureFormat;
477         switch (internalFormat)
478         {
479                 case GL_RGB5_A1:                        return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNORM_SHORT_5551);
480                 case GL_RGBA4:                          return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNORM_SHORT_4444);
481                 case GL_RGB565:                         return TextureFormat(TextureFormat::RGB,        TextureFormat::UNORM_SHORT_565);
482                 case GL_DEPTH_COMPONENT16:      return TextureFormat(TextureFormat::D,          TextureFormat::UNORM_INT16);
483                 case GL_STENCIL_INDEX8:         return TextureFormat(TextureFormat::S,          TextureFormat::UNSIGNED_INT8);
484
485                 case GL_RGBA32F:                        return TextureFormat(TextureFormat::RGBA,       TextureFormat::FLOAT);
486                 case GL_RGBA32I:                        return TextureFormat(TextureFormat::RGBA,       TextureFormat::SIGNED_INT32);
487                 case GL_RGBA32UI:                       return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNSIGNED_INT32);
488                 case GL_RGBA16:                         return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNORM_INT16);
489                 case GL_RGBA16_SNORM:           return TextureFormat(TextureFormat::RGBA,       TextureFormat::SNORM_INT16);
490                 case GL_RGBA16F:                        return TextureFormat(TextureFormat::RGBA,       TextureFormat::HALF_FLOAT);
491                 case GL_RGBA16I:                        return TextureFormat(TextureFormat::RGBA,       TextureFormat::SIGNED_INT16);
492                 case GL_RGBA16UI:                       return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNSIGNED_INT16);
493                 case GL_RGBA8:                          return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNORM_INT8);
494                 case GL_RGBA8I:                         return TextureFormat(TextureFormat::RGBA,       TextureFormat::SIGNED_INT8);
495                 case GL_RGBA8UI:                        return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNSIGNED_INT8);
496                 case GL_SRGB8_ALPHA8:           return TextureFormat(TextureFormat::sRGBA,      TextureFormat::UNORM_INT8);
497                 case GL_RGB10_A2:                       return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNORM_INT_1010102_REV);
498                 case GL_RGB10_A2UI:                     return TextureFormat(TextureFormat::RGBA,       TextureFormat::UNSIGNED_INT_1010102_REV);
499                 case GL_RGBA8_SNORM:            return TextureFormat(TextureFormat::RGBA,       TextureFormat::SNORM_INT8);
500
501                 case GL_RGB8:                           return TextureFormat(TextureFormat::RGB,        TextureFormat::UNORM_INT8);
502                 case GL_R11F_G11F_B10F:         return TextureFormat(TextureFormat::RGB,        TextureFormat::UNSIGNED_INT_11F_11F_10F_REV);
503                 case GL_RGB32F:                         return TextureFormat(TextureFormat::RGB,        TextureFormat::FLOAT);
504                 case GL_RGB32I:                         return TextureFormat(TextureFormat::RGB,        TextureFormat::SIGNED_INT32);
505                 case GL_RGB32UI:                        return TextureFormat(TextureFormat::RGB,        TextureFormat::UNSIGNED_INT32);
506                 case GL_RGB16:                          return TextureFormat(TextureFormat::RGB,        TextureFormat::UNORM_INT16);
507                 case GL_RGB16_SNORM:            return TextureFormat(TextureFormat::RGB,        TextureFormat::SNORM_INT16);
508                 case GL_RGB16F:                         return TextureFormat(TextureFormat::RGB,        TextureFormat::HALF_FLOAT);
509                 case GL_RGB16I:                         return TextureFormat(TextureFormat::RGB,        TextureFormat::SIGNED_INT16);
510                 case GL_RGB16UI:                        return TextureFormat(TextureFormat::RGB,        TextureFormat::UNSIGNED_INT16);
511                 case GL_RGB8_SNORM:                     return TextureFormat(TextureFormat::RGB,        TextureFormat::SNORM_INT8);
512                 case GL_RGB8I:                          return TextureFormat(TextureFormat::RGB,        TextureFormat::SIGNED_INT8);
513                 case GL_RGB8UI:                         return TextureFormat(TextureFormat::RGB,        TextureFormat::UNSIGNED_INT8);
514                 case GL_SRGB8:                          return TextureFormat(TextureFormat::sRGB,       TextureFormat::UNORM_INT8);
515                 case GL_RGB9_E5:                        return TextureFormat(TextureFormat::RGB,        TextureFormat::UNSIGNED_INT_999_E5_REV);
516                 case GL_RGB10:                          return TextureFormat(TextureFormat::RGB,        TextureFormat::UNORM_INT_1010102_REV);
517
518                 case GL_RG32F:                          return TextureFormat(TextureFormat::RG,         TextureFormat::FLOAT);
519                 case GL_RG32I:                          return TextureFormat(TextureFormat::RG,         TextureFormat::SIGNED_INT32);
520                 case GL_RG32UI:                         return TextureFormat(TextureFormat::RG,         TextureFormat::UNSIGNED_INT32);
521                 case GL_RG16:                           return TextureFormat(TextureFormat::RG,         TextureFormat::UNORM_INT16);
522                 case GL_RG16_SNORM:                     return TextureFormat(TextureFormat::RG,         TextureFormat::SNORM_INT16);
523                 case GL_RG16F:                          return TextureFormat(TextureFormat::RG,         TextureFormat::HALF_FLOAT);
524                 case GL_RG16I:                          return TextureFormat(TextureFormat::RG,         TextureFormat::SIGNED_INT16);
525                 case GL_RG16UI:                         return TextureFormat(TextureFormat::RG,         TextureFormat::UNSIGNED_INT16);
526                 case GL_RG8:                            return TextureFormat(TextureFormat::RG,         TextureFormat::UNORM_INT8);
527                 case GL_RG8I:                           return TextureFormat(TextureFormat::RG,         TextureFormat::SIGNED_INT8);
528                 case GL_RG8UI:                          return TextureFormat(TextureFormat::RG,         TextureFormat::UNSIGNED_INT8);
529                 case GL_RG8_SNORM:                      return TextureFormat(TextureFormat::RG,         TextureFormat::SNORM_INT8);
530                 case GL_SRG8_EXT:                       return TextureFormat(TextureFormat::sRG,        TextureFormat::UNORM_INT8);
531
532                 case GL_R32F:                           return TextureFormat(TextureFormat::R,          TextureFormat::FLOAT);
533                 case GL_R32I:                           return TextureFormat(TextureFormat::R,          TextureFormat::SIGNED_INT32);
534                 case GL_R32UI:                          return TextureFormat(TextureFormat::R,          TextureFormat::UNSIGNED_INT32);
535                 case GL_R16:                            return TextureFormat(TextureFormat::R,          TextureFormat::UNORM_INT16);
536                 case GL_R16_SNORM:                      return TextureFormat(TextureFormat::R,          TextureFormat::SNORM_INT16);
537                 case GL_R16F:                           return TextureFormat(TextureFormat::R,          TextureFormat::HALF_FLOAT);
538                 case GL_R16I:                           return TextureFormat(TextureFormat::R,          TextureFormat::SIGNED_INT16);
539                 case GL_R16UI:                          return TextureFormat(TextureFormat::R,          TextureFormat::UNSIGNED_INT16);
540                 case GL_R8:                                     return TextureFormat(TextureFormat::R,          TextureFormat::UNORM_INT8);
541                 case GL_R8I:                            return TextureFormat(TextureFormat::R,          TextureFormat::SIGNED_INT8);
542                 case GL_R8UI:                           return TextureFormat(TextureFormat::R,          TextureFormat::UNSIGNED_INT8);
543                 case GL_R8_SNORM:                       return TextureFormat(TextureFormat::R,          TextureFormat::SNORM_INT8);
544                 case GL_SR8_EXT:                        return TextureFormat(TextureFormat::sR,         TextureFormat::UNORM_INT8);
545
546                 case GL_DEPTH_COMPONENT32F:     return TextureFormat(TextureFormat::D,          TextureFormat::FLOAT);
547                 case GL_DEPTH_COMPONENT24:      return TextureFormat(TextureFormat::D,          TextureFormat::UNSIGNED_INT_24_8);
548                 case GL_DEPTH_COMPONENT32:      return TextureFormat(TextureFormat::D,          TextureFormat::UNSIGNED_INT32);
549                 case GL_DEPTH32F_STENCIL8:      return TextureFormat(TextureFormat::DS,         TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV);
550                 case GL_DEPTH24_STENCIL8:       return TextureFormat(TextureFormat::DS,         TextureFormat::UNSIGNED_INT_24_8);
551
552                 default:
553                         throw tcu::InternalError(string("Can't map GL sized internal format (") + tcu::toHex(internalFormat).toString() + ") to texture format");
554         }
555 }
556
557 bool isGLInternalColorFormatFilterable (deUint32 format)
558 {
559         switch (format)
560         {
561                 case GL_R8:
562                 case GL_R8_SNORM:
563                 case GL_RG8:
564                 case GL_RG8_SNORM:
565                 case GL_RGB8:
566                 case GL_RGB8_SNORM:
567                 case GL_RGB565:
568                 case GL_RGBA4:
569                 case GL_RGB5_A1:
570                 case GL_RGBA8:
571                 case GL_RGBA8_SNORM:
572                 case GL_RGB10_A2:
573                 case GL_SR8_EXT:
574                 case GL_SRG8_EXT:
575                 case GL_SRGB8:
576                 case GL_SRGB8_ALPHA8:
577                 case GL_R16F:
578                 case GL_RG16F:
579                 case GL_RGB16F:
580                 case GL_RGBA16F:
581                 case GL_R11F_G11F_B10F:
582                 case GL_RGB9_E5:
583                         return true;
584
585                 case GL_RGB10_A2UI:
586                 case GL_R32F:
587                 case GL_RG32F:
588                 case GL_RGB32F:
589                 case GL_RGBA32F:
590                 case GL_R8I:
591                 case GL_R8UI:
592                 case GL_R16I:
593                 case GL_R16UI:
594                 case GL_R32I:
595                 case GL_R32UI:
596                 case GL_RG8I:
597                 case GL_RG8UI:
598                 case GL_RG16I:
599                 case GL_RG16UI:
600                 case GL_RG32I:
601                 case GL_RG32UI:
602                 case GL_RGB8I:
603                 case GL_RGB8UI:
604                 case GL_RGB16I:
605                 case GL_RGB16UI:
606                 case GL_RGB32I:
607                 case GL_RGB32UI:
608                 case GL_RGBA8I:
609                 case GL_RGBA8UI:
610                 case GL_RGBA16I:
611                 case GL_RGBA16UI:
612                 case GL_RGBA32I:
613                 case GL_RGBA32UI:
614                         return false;
615
616                 default:
617                         DE_ASSERT(false);
618                         return false;
619         }
620 }
621
622 static inline tcu::Sampler::WrapMode mapGLWrapMode (deUint32 wrapMode)
623 {
624         switch (wrapMode)
625         {
626                 case GL_CLAMP_TO_EDGE:          return tcu::Sampler::CLAMP_TO_EDGE;
627                 case GL_CLAMP_TO_BORDER:        return tcu::Sampler::CLAMP_TO_BORDER;
628                 case GL_REPEAT:                         return tcu::Sampler::REPEAT_GL;
629                 case GL_MIRRORED_REPEAT:        return tcu::Sampler::MIRRORED_REPEAT_GL;
630                 default:
631                         throw tcu::InternalError("Can't map GL wrap mode " + tcu::toHex(wrapMode).toString());
632         }
633 }
634
635 static inline tcu::Sampler::FilterMode mapGLMinFilterMode (deUint32 filterMode)
636 {
637         switch (filterMode)
638         {
639                 case GL_NEAREST:                                return tcu::Sampler::NEAREST;
640                 case GL_LINEAR:                                 return tcu::Sampler::LINEAR;
641                 case GL_NEAREST_MIPMAP_NEAREST: return tcu::Sampler::NEAREST_MIPMAP_NEAREST;
642                 case GL_NEAREST_MIPMAP_LINEAR:  return tcu::Sampler::NEAREST_MIPMAP_LINEAR;
643                 case GL_LINEAR_MIPMAP_NEAREST:  return tcu::Sampler::LINEAR_MIPMAP_NEAREST;
644                 case GL_LINEAR_MIPMAP_LINEAR:   return tcu::Sampler::LINEAR_MIPMAP_LINEAR;
645                 default:
646                         throw tcu::InternalError("Can't map GL min filter mode" + tcu::toHex(filterMode).toString());
647         }
648 }
649
650 static inline tcu::Sampler::FilterMode mapGLMagFilterMode (deUint32 filterMode)
651 {
652         switch (filterMode)
653         {
654                 case GL_NEAREST:                                return tcu::Sampler::NEAREST;
655                 case GL_LINEAR:                                 return tcu::Sampler::LINEAR;
656                 default:
657                         throw tcu::InternalError("Can't map GL mag filter mode" + tcu::toHex(filterMode).toString());
658         }
659 }
660
661 /*--------------------------------------------------------------------*//*!
662  * \brief Map GL sampler parameters to tcu::Sampler.
663  *
664  * If no mapping is found, throws tcu::InternalError.
665  *
666  * \param wrapS         S-component wrap mode
667  * \param minFilter     Minification filter mode
668  * \param magFilter     Magnification filter mode
669  * \return Sampler description.
670  *//*--------------------------------------------------------------------*/
671 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 minFilter, deUint32 magFilter)
672 {
673         return mapGLSampler(wrapS, wrapS, wrapS, minFilter, magFilter);
674 }
675
676
677 /*--------------------------------------------------------------------*//*!
678  * \brief Map GL sampler parameters to tcu::Sampler.
679  *
680  * If no mapping is found, throws tcu::InternalError.
681  *
682  * \param wrapS         S-component wrap mode
683  * \param wrapT         T-component wrap mode
684  * \param minFilter     Minification filter mode
685  * \param magFilter     Magnification filter mode
686  * \return Sampler description.
687  *//*--------------------------------------------------------------------*/
688 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 wrapT, deUint32 minFilter, deUint32 magFilter)
689 {
690         return mapGLSampler(wrapS, wrapT, wrapS, minFilter, magFilter);
691 }
692
693 /*--------------------------------------------------------------------*//*!
694  * \brief Map GL sampler parameters to tcu::Sampler.
695  *
696  * If no mapping is found, throws tcu::InternalError.
697  *
698  * \param wrapS         S-component wrap mode
699  * \param wrapT         T-component wrap mode
700  * \param wrapR         R-component wrap mode
701  * \param minFilter     Minification filter mode
702  * \param magFilter     Magnification filter mode
703  * \return Sampler description.
704  *//*--------------------------------------------------------------------*/
705 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 wrapT, deUint32 wrapR, deUint32 minFilter, deUint32 magFilter)
706 {
707         return tcu::Sampler(mapGLWrapMode(wrapS), mapGLWrapMode(wrapT), mapGLWrapMode(wrapR),
708                                                 mapGLMinFilterMode(minFilter), mapGLMagFilterMode(magFilter),
709                                                 0.0f /* lod threshold */,
710                                                 true /* normalized coords */,
711                                                 tcu::Sampler::COMPAREMODE_NONE /* no compare */,
712                                                 0 /* compare channel */,
713                                                 tcu::Vec4(0.0f) /* border color, not used */);
714 }
715
716 /*--------------------------------------------------------------------*//*!
717  * \brief Map GL compare function to tcu::Sampler::CompareMode.
718  *
719  * If no mapping is found, throws tcu::InternalError.
720  *
721  * \param mode GL compare mode
722  * \return Compare mode
723  *//*--------------------------------------------------------------------*/
724 tcu::Sampler::CompareMode mapGLCompareFunc (deUint32 mode)
725 {
726         switch (mode)
727         {
728                 case GL_LESS:           return tcu::Sampler::COMPAREMODE_LESS;
729                 case GL_LEQUAL:         return tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL;
730                 case GL_GREATER:        return tcu::Sampler::COMPAREMODE_GREATER;
731                 case GL_GEQUAL:         return tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL;
732                 case GL_EQUAL:          return tcu::Sampler::COMPAREMODE_EQUAL;
733                 case GL_NOTEQUAL:       return tcu::Sampler::COMPAREMODE_NOT_EQUAL;
734                 case GL_ALWAYS:         return tcu::Sampler::COMPAREMODE_ALWAYS;
735                 case GL_NEVER:          return tcu::Sampler::COMPAREMODE_NEVER;
736                 default:
737                         throw tcu::InternalError("Can't map GL compare mode " + tcu::toHex(mode).toString());
738         }
739 }
740
741 /*--------------------------------------------------------------------*//*!
742  * \brief Get GL wrap mode.
743  *
744  * If no mapping is found, throws tcu::InternalError.
745  *
746  * \param wrapMode Wrap mode
747  * \return GL wrap mode
748  *//*--------------------------------------------------------------------*/
749 deUint32 getGLWrapMode (tcu::Sampler::WrapMode wrapMode)
750 {
751         DE_ASSERT(wrapMode != tcu::Sampler::WRAPMODE_LAST);
752         switch (wrapMode)
753         {
754                 case tcu::Sampler::CLAMP_TO_EDGE:               return GL_CLAMP_TO_EDGE;
755                 case tcu::Sampler::CLAMP_TO_BORDER:             return GL_CLAMP_TO_BORDER;
756                 case tcu::Sampler::REPEAT_GL:                   return GL_REPEAT;
757                 case tcu::Sampler::MIRRORED_REPEAT_GL:  return GL_MIRRORED_REPEAT;
758                 default:
759                         throw tcu::InternalError("Can't map wrap mode");
760         }
761 }
762
763 /*--------------------------------------------------------------------*//*!
764  * \brief Get GL filter mode.
765  *
766  * If no mapping is found, throws tcu::InternalError.
767  *
768  * \param filterMode Filter mode
769  * \return GL filter mode
770  *//*--------------------------------------------------------------------*/
771 deUint32 getGLFilterMode (tcu::Sampler::FilterMode filterMode)
772 {
773         DE_ASSERT(filterMode != tcu::Sampler::FILTERMODE_LAST);
774         switch (filterMode)
775         {
776                 case tcu::Sampler::NEAREST:                                     return GL_NEAREST;
777                 case tcu::Sampler::LINEAR:                                      return GL_LINEAR;
778                 case tcu::Sampler::NEAREST_MIPMAP_NEAREST:      return GL_NEAREST_MIPMAP_NEAREST;
779                 case tcu::Sampler::NEAREST_MIPMAP_LINEAR:       return GL_NEAREST_MIPMAP_LINEAR;
780                 case tcu::Sampler::LINEAR_MIPMAP_NEAREST:       return GL_LINEAR_MIPMAP_NEAREST;
781                 case tcu::Sampler::LINEAR_MIPMAP_LINEAR:        return GL_LINEAR_MIPMAP_LINEAR;
782                 default:
783                         throw tcu::InternalError("Can't map filter mode");
784         }
785 }
786
787 /*--------------------------------------------------------------------*//*!
788  * \brief Get GL compare mode.
789  *
790  * If no mapping is found, throws tcu::InternalError.
791  *
792  * \param compareMode Compare mode
793  * \return GL compare mode
794  *//*--------------------------------------------------------------------*/
795 deUint32 getGLCompareFunc (tcu::Sampler::CompareMode compareMode)
796 {
797         DE_ASSERT(compareMode != tcu::Sampler::COMPAREMODE_NONE);
798         switch (compareMode)
799         {
800                 case tcu::Sampler::COMPAREMODE_NONE:                            return GL_NONE;
801                 case tcu::Sampler::COMPAREMODE_LESS:                            return GL_LESS;
802                 case tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL:           return GL_LEQUAL;
803                 case tcu::Sampler::COMPAREMODE_GREATER:                         return GL_GREATER;
804                 case tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL:        return GL_GEQUAL;
805                 case tcu::Sampler::COMPAREMODE_EQUAL:                           return GL_EQUAL;
806                 case tcu::Sampler::COMPAREMODE_NOT_EQUAL:                       return GL_NOTEQUAL;
807                 case tcu::Sampler::COMPAREMODE_ALWAYS:                          return GL_ALWAYS;
808                 case tcu::Sampler::COMPAREMODE_NEVER:                           return GL_NEVER;
809                 default:
810                         throw tcu::InternalError("Can't map compare mode");
811         }
812 }
813
814 /*--------------------------------------------------------------------*//*!
815  * \brief Get GL cube face.
816  *
817  * If no mapping is found, throws tcu::InternalError.
818  *
819  * \param face Cube face
820  * \return GL cube face
821  *//*--------------------------------------------------------------------*/
822 deUint32 getGLCubeFace (tcu::CubeFace face)
823 {
824         DE_ASSERT(face != tcu::CUBEFACE_LAST);
825         switch (face)
826         {
827                 case tcu::CUBEFACE_NEGATIVE_X:  return GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
828                 case tcu::CUBEFACE_POSITIVE_X:  return GL_TEXTURE_CUBE_MAP_POSITIVE_X;
829                 case tcu::CUBEFACE_NEGATIVE_Y:  return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
830                 case tcu::CUBEFACE_POSITIVE_Y:  return GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
831                 case tcu::CUBEFACE_NEGATIVE_Z:  return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
832                 case tcu::CUBEFACE_POSITIVE_Z:  return GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
833                 default:
834                         throw tcu::InternalError("Can't map cube face");
835         }
836 }
837
838 tcu::CubeFace getCubeFaceFromGL (deUint32 face)
839 {
840         switch (face)
841         {
842                 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:    return tcu::CUBEFACE_NEGATIVE_X;
843                 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:    return tcu::CUBEFACE_POSITIVE_X;
844                 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:    return tcu::CUBEFACE_NEGATIVE_Y;
845                 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:    return tcu::CUBEFACE_POSITIVE_Y;
846                 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:    return tcu::CUBEFACE_NEGATIVE_Z;
847                 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:    return tcu::CUBEFACE_POSITIVE_Z;
848                 default:
849                         throw tcu::InternalError("Can't map cube face");
850         }
851 }
852
853 /*--------------------------------------------------------------------*//*!
854  * \brief Get GLSL sampler type for texture format.
855  *
856  * If no mapping is found, glu::TYPE_LAST is returned.
857  *
858  * \param format Texture format
859  * \return GLSL 1D sampler type for format
860  *//*--------------------------------------------------------------------*/
861 DataType getSampler1DType (tcu::TextureFormat format)
862 {
863         using tcu::TextureFormat;
864
865         if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
866                 return TYPE_SAMPLER_1D;
867
868         if (format.order == TextureFormat::S)
869                 return TYPE_LAST;
870
871         switch (tcu::getTextureChannelClass(format.type))
872         {
873                 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
874                 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
875                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
876                         return glu::TYPE_SAMPLER_1D;
877
878                 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
879                         return glu::TYPE_INT_SAMPLER_1D;
880
881                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
882                         return glu::TYPE_UINT_SAMPLER_1D;
883
884                 default:
885                         return glu::TYPE_LAST;
886         }
887 }
888
889 /*--------------------------------------------------------------------*//*!
890  * \brief Get GLSL sampler type for texture format.
891  *
892  * If no mapping is found, glu::TYPE_LAST is returned.
893  *
894  * \param format Texture format
895  * \return GLSL 2D sampler type for format
896  *//*--------------------------------------------------------------------*/
897 DataType getSampler2DType (tcu::TextureFormat format)
898 {
899         using tcu::TextureFormat;
900
901         if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
902                 return TYPE_SAMPLER_2D;
903
904         if (format.order == TextureFormat::S)
905                 return TYPE_LAST;
906
907         switch (tcu::getTextureChannelClass(format.type))
908         {
909                 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
910                 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
911                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
912                         return glu::TYPE_SAMPLER_2D;
913
914                 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
915                         return glu::TYPE_INT_SAMPLER_2D;
916
917                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
918                         return glu::TYPE_UINT_SAMPLER_2D;
919
920                 default:
921                         return glu::TYPE_LAST;
922         }
923 }
924
925 /*--------------------------------------------------------------------*//*!
926  * \brief Get GLSL sampler type for texture format.
927  *
928  * If no mapping is found, glu::TYPE_LAST is returned.
929  *
930  * \param format Texture format
931  * \return GLSL cube map sampler type for format
932  *//*--------------------------------------------------------------------*/
933 DataType getSamplerCubeType (tcu::TextureFormat format)
934 {
935         using tcu::TextureFormat;
936
937         if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
938                 return TYPE_SAMPLER_CUBE;
939
940         if (format.order == TextureFormat::S)
941                 return TYPE_LAST;
942
943         switch (tcu::getTextureChannelClass(format.type))
944         {
945                 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
946                 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
947                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
948                         return glu::TYPE_SAMPLER_CUBE;
949
950                 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
951                         return glu::TYPE_INT_SAMPLER_CUBE;
952
953                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
954                         return glu::TYPE_UINT_SAMPLER_CUBE;
955
956                 default:
957                         return glu::TYPE_LAST;
958         }
959 }
960
961 /*--------------------------------------------------------------------*//*!
962  * \brief Get GLSL sampler type for texture format.
963  *
964  * If no mapping is found, glu::TYPE_LAST is returned.
965  *
966  * \param format Texture format
967  * \return GLSL 1D array sampler type for format
968  *//*--------------------------------------------------------------------*/
969 DataType getSampler1DArrayType (tcu::TextureFormat format)
970 {
971         using tcu::TextureFormat;
972
973         if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
974                 return TYPE_SAMPLER_1D_ARRAY;
975
976         if (format.order == TextureFormat::S)
977                 return TYPE_LAST;
978
979         switch (tcu::getTextureChannelClass(format.type))
980         {
981                 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
982                 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
983                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
984                         return glu::TYPE_SAMPLER_1D_ARRAY;
985
986                 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
987                         return glu::TYPE_INT_SAMPLER_1D_ARRAY;
988
989                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
990                         return glu::TYPE_UINT_SAMPLER_1D_ARRAY;
991
992                 default:
993                         return glu::TYPE_LAST;
994         }
995 }
996
997 /*--------------------------------------------------------------------*//*!
998  * \brief Get GLSL sampler type for texture format.
999  *
1000  * If no mapping is found, glu::TYPE_LAST is returned.
1001  *
1002  * \param format Texture format
1003  * \return GLSL 2D array sampler type for format
1004  *//*--------------------------------------------------------------------*/
1005 DataType getSampler2DArrayType (tcu::TextureFormat format)
1006 {
1007         using tcu::TextureFormat;
1008
1009         if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
1010                 return TYPE_SAMPLER_2D_ARRAY;
1011
1012         if (format.order == TextureFormat::S)
1013                 return TYPE_LAST;
1014
1015         switch (tcu::getTextureChannelClass(format.type))
1016         {
1017                 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1018                 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1019                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1020                         return glu::TYPE_SAMPLER_2D_ARRAY;
1021
1022                 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1023                         return glu::TYPE_INT_SAMPLER_2D_ARRAY;
1024
1025                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1026                         return glu::TYPE_UINT_SAMPLER_2D_ARRAY;
1027
1028                 default:
1029                         return glu::TYPE_LAST;
1030         }
1031 }
1032
1033 /*--------------------------------------------------------------------*//*!
1034  * \brief Get GLSL sampler type for texture format.
1035  *
1036  * If no mapping is found, glu::TYPE_LAST is returned.
1037  *
1038  * \param format Texture format
1039  * \return GLSL 3D sampler type for format
1040  *//*--------------------------------------------------------------------*/
1041 DataType getSampler3DType (tcu::TextureFormat format)
1042 {
1043         using tcu::TextureFormat;
1044
1045         if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
1046                 return TYPE_SAMPLER_3D;
1047
1048         if (format.order == TextureFormat::S)
1049                 return TYPE_LAST;
1050
1051         switch (tcu::getTextureChannelClass(format.type))
1052         {
1053                 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1054                 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1055                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1056                         return glu::TYPE_SAMPLER_3D;
1057
1058                 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1059                         return glu::TYPE_INT_SAMPLER_3D;
1060
1061                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1062                         return glu::TYPE_UINT_SAMPLER_3D;
1063
1064                 default:
1065                         return glu::TYPE_LAST;
1066         }
1067 }
1068
1069 /*--------------------------------------------------------------------*//*!
1070  * \brief Get GLSL sampler type for texture format.
1071  *
1072  * If no mapping is found, glu::TYPE_LAST is returned.
1073  *
1074  * \param format Texture format
1075  * \return GLSL cube map array sampler type for format
1076  *//*--------------------------------------------------------------------*/
1077 DataType getSamplerCubeArrayType (tcu::TextureFormat format)
1078 {
1079         using tcu::TextureFormat;
1080
1081         if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
1082                 return TYPE_SAMPLER_CUBE_ARRAY;
1083
1084         if (format.order == TextureFormat::S)
1085                 return TYPE_LAST;
1086
1087         switch (tcu::getTextureChannelClass(format.type))
1088         {
1089                 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1090                 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1091                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1092                         return glu::TYPE_SAMPLER_CUBE_ARRAY;
1093
1094                 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1095                         return glu::TYPE_INT_SAMPLER_CUBE_ARRAY;
1096
1097                 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1098                         return glu::TYPE_UINT_SAMPLER_CUBE_ARRAY;
1099
1100                 default:
1101                         return glu::TYPE_LAST;
1102         }
1103 }
1104
1105 enum RenderableType
1106 {
1107         RENDERABLE_COLOR        = (1<<0),
1108         RENDERABLE_DEPTH        = (1<<1),
1109         RENDERABLE_STENCIL      = (1<<2)
1110 };
1111
1112 static deUint32 getRenderableBitsES3 (const ContextInfo& contextInfo, deUint32 internalFormat)
1113 {
1114         switch (internalFormat)
1115         {
1116                 // Color-renderable formats
1117                 case GL_RGBA32I:
1118                 case GL_RGBA32UI:
1119                 case GL_RGBA16I:
1120                 case GL_RGBA16UI:
1121                 case GL_RGBA8:
1122                 case GL_RGBA8I:
1123                 case GL_RGBA8UI:
1124                 case GL_SRGB8_ALPHA8:
1125                 case GL_RGB10_A2:
1126                 case GL_RGB10_A2UI:
1127                 case GL_RGBA4:
1128                 case GL_RGB5_A1:
1129                 case GL_RGB8:
1130                 case GL_RGB565:
1131                 case GL_RG32I:
1132                 case GL_RG32UI:
1133                 case GL_RG16I:
1134                 case GL_RG16UI:
1135                 case GL_RG8:
1136                 case GL_RG8I:
1137                 case GL_RG8UI:
1138                 case GL_R32I:
1139                 case GL_R32UI:
1140                 case GL_R16I:
1141                 case GL_R16UI:
1142                 case GL_R8:
1143                 case GL_R8I:
1144                 case GL_R8UI:
1145                         return RENDERABLE_COLOR;
1146
1147                 // GL_EXT_color_buffer_float
1148                 case GL_RGBA32F:
1149                 case GL_R11F_G11F_B10F:
1150                 case GL_RG32F:
1151                 case GL_R32F:
1152                         if (contextInfo.isExtensionSupported("GL_EXT_color_buffer_float"))
1153                                 return RENDERABLE_COLOR;
1154                         else
1155                                 return 0;
1156
1157                 // GL_EXT_color_buffer_float / GL_EXT_color_buffer_half_float
1158                 case GL_RGBA16F:
1159                 case GL_RG16F:
1160                 case GL_R16F:
1161                         if (contextInfo.isExtensionSupported("GL_EXT_color_buffer_float") ||
1162                                 contextInfo.isExtensionSupported("GL_EXT_color_buffer_half_float"))
1163                                 return RENDERABLE_COLOR;
1164                         else
1165                                 return 0;
1166
1167                 // Depth formats
1168                 case GL_DEPTH_COMPONENT32F:
1169                 case GL_DEPTH_COMPONENT24:
1170                 case GL_DEPTH_COMPONENT16:
1171                         return RENDERABLE_DEPTH;
1172
1173                 // Depth+stencil formats
1174                 case GL_DEPTH32F_STENCIL8:
1175                 case GL_DEPTH24_STENCIL8:
1176                         return RENDERABLE_DEPTH|RENDERABLE_STENCIL;
1177
1178                 // Stencil formats
1179                 case GL_STENCIL_INDEX8:
1180                         return RENDERABLE_STENCIL;
1181
1182                 default:
1183                         return 0;
1184         }
1185 }
1186
1187 /*--------------------------------------------------------------------*//*!
1188  * \brief Check if sized internal format is color-renderable.
1189  * \note Works currently only on ES3 context.
1190  *//*--------------------------------------------------------------------*/
1191 bool isSizedFormatColorRenderable (const RenderContext& renderCtx, const ContextInfo& contextInfo, deUint32 sizedFormat)
1192 {
1193         deUint32 renderable = 0;
1194
1195         if (renderCtx.getType().getAPI() == ApiType::es(3,0))
1196                 renderable = getRenderableBitsES3(contextInfo, sizedFormat);
1197         else
1198                 throw tcu::InternalError("Context type not supported in query");
1199
1200         return (renderable & RENDERABLE_COLOR) != 0;
1201 }
1202
1203 const tcu::IVec2 (&getDefaultGatherOffsets (void))[4]
1204 {
1205         static const tcu::IVec2 s_defaultOffsets[4] =
1206         {
1207                 tcu::IVec2(0, 1),
1208                 tcu::IVec2(1, 1),
1209                 tcu::IVec2(1, 0),
1210                 tcu::IVec2(0, 0),
1211         };
1212         return s_defaultOffsets;
1213 }
1214
1215 tcu::PixelBufferAccess getTextureBufferEffectiveRefTexture (TextureBuffer& buffer, int maxTextureBufferSize)
1216 {
1217         DE_ASSERT(maxTextureBufferSize > 0);
1218
1219         const tcu::PixelBufferAccess& fullAccess = buffer.getFullRefTexture();
1220
1221         return tcu::PixelBufferAccess(fullAccess.getFormat(),
1222                                                                   tcu::IVec3(de::min(fullAccess.getWidth(), maxTextureBufferSize), 1, 1),
1223                                                                   fullAccess.getPitch(),
1224                                                                   fullAccess.getDataPtr());
1225 }
1226
1227 tcu::ConstPixelBufferAccess getTextureBufferEffectiveRefTexture (const TextureBuffer& buffer, int maxTextureBufferSize)
1228 {
1229         return getTextureBufferEffectiveRefTexture(const_cast<TextureBuffer&>(buffer), maxTextureBufferSize);
1230 }
1231
1232 } // glu