Home | History | Annotate | Download | only in opengl
      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 		default:
    421 			DE_ASSERT(false);
    422 			return TextureFormat::CHANNELTYPE_LAST;
    423 	}
    424 }
    425 
    426 /*--------------------------------------------------------------------*//*!
    427  * \brief Map GL pixel transfer format to tcu::TextureFormat.
    428  *
    429  * If no mapping is found, throws tcu::InternalError.
    430  *
    431  * \param format	GL pixel format.
    432  * \param dataType	GL data type.
    433  * \return Generic texture format.
    434  *//*--------------------------------------------------------------------*/
    435 tcu::TextureFormat mapGLTransferFormat (deUint32 format, deUint32 dataType)
    436 {
    437 	using tcu::TextureFormat;
    438 	switch (format)
    439 	{
    440 		case GL_ALPHA:				return TextureFormat(TextureFormat::A,		mapGLChannelType(dataType, true));
    441 		case GL_LUMINANCE:			return TextureFormat(TextureFormat::L,		mapGLChannelType(dataType, true));
    442 		case GL_LUMINANCE_ALPHA:	return TextureFormat(TextureFormat::LA,		mapGLChannelType(dataType, true));
    443 		case GL_RGB:				return TextureFormat(TextureFormat::RGB,	mapGLChannelType(dataType, true));
    444 		case GL_RGBA:				return TextureFormat(TextureFormat::RGBA,	mapGLChannelType(dataType, true));
    445 		case GL_BGRA:				return TextureFormat(TextureFormat::BGRA,	mapGLChannelType(dataType, true));
    446 		case GL_RG:					return TextureFormat(TextureFormat::RG,		mapGLChannelType(dataType, true));
    447 		case GL_RED:				return TextureFormat(TextureFormat::R,		mapGLChannelType(dataType, true));
    448 		case GL_RGBA_INTEGER:		return TextureFormat(TextureFormat::RGBA,	mapGLChannelType(dataType, false));
    449 		case GL_RGB_INTEGER:		return TextureFormat(TextureFormat::RGB,	mapGLChannelType(dataType, false));
    450 		case GL_RG_INTEGER:			return TextureFormat(TextureFormat::RG,		mapGLChannelType(dataType, false));
    451 		case GL_RED_INTEGER:		return TextureFormat(TextureFormat::R,		mapGLChannelType(dataType, false));
    452 
    453 		case GL_DEPTH_COMPONENT:	return TextureFormat(TextureFormat::D,		mapGLChannelType(dataType, true));
    454 		case GL_DEPTH_STENCIL:		return TextureFormat(TextureFormat::DS,		mapGLChannelType(dataType, true));
    455 
    456 		default:
    457 			throw tcu::InternalError(string("Can't map GL pixel format (") + tcu::toHex(format).toString() + ", " + tcu::toHex(dataType).toString() + ") to texture format");
    458 	}
    459 }
    460 
    461 /*--------------------------------------------------------------------*//*!
    462  * \brief Map GL internal texture format to tcu::TextureFormat.
    463  *
    464  * If no mapping is found, throws tcu::InternalError.
    465  *
    466  * \param internalFormat Sized internal format.
    467  * \return Generic texture format.
    468  *//*--------------------------------------------------------------------*/
    469 tcu::TextureFormat mapGLInternalFormat (deUint32 internalFormat)
    470 {
    471 	using tcu::TextureFormat;
    472 	switch (internalFormat)
    473 	{
    474 		case GL_RGB5_A1:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_SHORT_5551);
    475 		case GL_RGBA4:				return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_SHORT_4444);
    476 		case GL_RGB565:				return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_SHORT_565);
    477 		case GL_DEPTH_COMPONENT16:	return TextureFormat(TextureFormat::D,		TextureFormat::UNORM_INT16);
    478 		case GL_STENCIL_INDEX8:		return TextureFormat(TextureFormat::S,		TextureFormat::UNSIGNED_INT8);
    479 
    480 		case GL_RGBA32F:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::FLOAT);
    481 		case GL_RGBA32I:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT32);
    482 		case GL_RGBA32UI:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT32);
    483 		case GL_RGBA16:				return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT16);
    484 		case GL_RGBA16_SNORM:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT16);
    485 		case GL_RGBA16F:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::HALF_FLOAT);
    486 		case GL_RGBA16I:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT16);
    487 		case GL_RGBA16UI:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT16);
    488 		case GL_RGBA8:				return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT8);
    489 		case GL_RGBA8I:				return TextureFormat(TextureFormat::RGBA,	TextureFormat::SIGNED_INT8);
    490 		case GL_RGBA8UI:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT8);
    491 		case GL_SRGB8_ALPHA8:		return TextureFormat(TextureFormat::sRGBA,	TextureFormat::UNORM_INT8);
    492 		case GL_RGB10_A2:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNORM_INT_1010102_REV);
    493 		case GL_RGB10_A2UI:			return TextureFormat(TextureFormat::RGBA,	TextureFormat::UNSIGNED_INT_1010102_REV);
    494 		case GL_RGBA8_SNORM:		return TextureFormat(TextureFormat::RGBA,	TextureFormat::SNORM_INT8);
    495 
    496 		case GL_RGB8:				return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_INT8);
    497 		case GL_R11F_G11F_B10F:		return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT_11F_11F_10F_REV);
    498 		case GL_RGB32F:				return TextureFormat(TextureFormat::RGB,	TextureFormat::FLOAT);
    499 		case GL_RGB32I:				return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT32);
    500 		case GL_RGB32UI:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT32);
    501 		case GL_RGB16:				return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_INT16);
    502 		case GL_RGB16_SNORM:		return TextureFormat(TextureFormat::RGB,	TextureFormat::SNORM_INT16);
    503 		case GL_RGB16F:				return TextureFormat(TextureFormat::RGB,	TextureFormat::HALF_FLOAT);
    504 		case GL_RGB16I:				return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT16);
    505 		case GL_RGB16UI:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT16);
    506 		case GL_RGB8_SNORM:			return TextureFormat(TextureFormat::RGB,	TextureFormat::SNORM_INT8);
    507 		case GL_RGB8I:				return TextureFormat(TextureFormat::RGB,	TextureFormat::SIGNED_INT8);
    508 		case GL_RGB8UI:				return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT8);
    509 		case GL_SRGB8:				return TextureFormat(TextureFormat::sRGB,	TextureFormat::UNORM_INT8);
    510 		case GL_RGB9_E5:			return TextureFormat(TextureFormat::RGB,	TextureFormat::UNSIGNED_INT_999_E5_REV);
    511 		case GL_RGB10:				return TextureFormat(TextureFormat::RGB,	TextureFormat::UNORM_INT_1010102_REV);
    512 
    513 		case GL_RG32F:				return TextureFormat(TextureFormat::RG,		TextureFormat::FLOAT);
    514 		case GL_RG32I:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT32);
    515 		case GL_RG32UI:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT32);
    516 		case GL_RG16:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_INT16);
    517 		case GL_RG16_SNORM:			return TextureFormat(TextureFormat::RG,		TextureFormat::SNORM_INT16);
    518 		case GL_RG16F:				return TextureFormat(TextureFormat::RG,		TextureFormat::HALF_FLOAT);
    519 		case GL_RG16I:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT16);
    520 		case GL_RG16UI:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT16);
    521 		case GL_RG8:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNORM_INT8);
    522 		case GL_RG8I:				return TextureFormat(TextureFormat::RG,		TextureFormat::SIGNED_INT8);
    523 		case GL_RG8UI:				return TextureFormat(TextureFormat::RG,		TextureFormat::UNSIGNED_INT8);
    524 		case GL_RG8_SNORM:			return TextureFormat(TextureFormat::RG,		TextureFormat::SNORM_INT8);
    525 		case GL_SRG8_EXT:			return TextureFormat(TextureFormat::sRG,	TextureFormat::UNORM_INT8);
    526 
    527 		case GL_R32F:				return TextureFormat(TextureFormat::R,		TextureFormat::FLOAT);
    528 		case GL_R32I:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT32);
    529 		case GL_R32UI:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT32);
    530 		case GL_R16:				return TextureFormat(TextureFormat::R,		TextureFormat::UNORM_INT16);
    531 		case GL_R16_SNORM:			return TextureFormat(TextureFormat::R,		TextureFormat::SNORM_INT16);
    532 		case GL_R16F:				return TextureFormat(TextureFormat::R,		TextureFormat::HALF_FLOAT);
    533 		case GL_R16I:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT16);
    534 		case GL_R16UI:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT16);
    535 		case GL_R8:					return TextureFormat(TextureFormat::R,		TextureFormat::UNORM_INT8);
    536 		case GL_R8I:				return TextureFormat(TextureFormat::R,		TextureFormat::SIGNED_INT8);
    537 		case GL_R8UI:				return TextureFormat(TextureFormat::R,		TextureFormat::UNSIGNED_INT8);
    538 		case GL_R8_SNORM:			return TextureFormat(TextureFormat::R,		TextureFormat::SNORM_INT8);
    539 		case GL_SR8_EXT:			return TextureFormat(TextureFormat::sR,		TextureFormat::UNORM_INT8);
    540 
    541 		case GL_DEPTH_COMPONENT32F:	return TextureFormat(TextureFormat::D,		TextureFormat::FLOAT);
    542 		case GL_DEPTH_COMPONENT24:	return TextureFormat(TextureFormat::D,		TextureFormat::UNSIGNED_INT_24_8);
    543 		case GL_DEPTH_COMPONENT32:	return TextureFormat(TextureFormat::D,		TextureFormat::UNSIGNED_INT32);
    544 		case GL_DEPTH32F_STENCIL8:	return TextureFormat(TextureFormat::DS,		TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV);
    545 		case GL_DEPTH24_STENCIL8:	return TextureFormat(TextureFormat::DS,		TextureFormat::UNSIGNED_INT_24_8);
    546 
    547 		default:
    548 			throw tcu::InternalError(string("Can't map GL sized internal format (") + tcu::toHex(internalFormat).toString() + ") to texture format");
    549 	}
    550 }
    551 
    552 bool isGLInternalColorFormatFilterable (deUint32 format)
    553 {
    554 	switch (format)
    555 	{
    556 		case GL_R8:
    557 		case GL_R8_SNORM:
    558 		case GL_RG8:
    559 		case GL_RG8_SNORM:
    560 		case GL_RGB8:
    561 		case GL_RGB8_SNORM:
    562 		case GL_RGB565:
    563 		case GL_RGBA4:
    564 		case GL_RGB5_A1:
    565 		case GL_RGBA8:
    566 		case GL_RGBA8_SNORM:
    567 		case GL_RGB10_A2:
    568 		case GL_SR8_EXT:
    569 		case GL_SRG8_EXT:
    570 		case GL_SRGB8:
    571 		case GL_SRGB8_ALPHA8:
    572 		case GL_R16F:
    573 		case GL_RG16F:
    574 		case GL_RGB16F:
    575 		case GL_RGBA16F:
    576 		case GL_R11F_G11F_B10F:
    577 		case GL_RGB9_E5:
    578 			return true;
    579 
    580 		case GL_RGB10_A2UI:
    581 		case GL_R32F:
    582 		case GL_RG32F:
    583 		case GL_RGB32F:
    584 		case GL_RGBA32F:
    585 		case GL_R8I:
    586 		case GL_R8UI:
    587 		case GL_R16I:
    588 		case GL_R16UI:
    589 		case GL_R32I:
    590 		case GL_R32UI:
    591 		case GL_RG8I:
    592 		case GL_RG8UI:
    593 		case GL_RG16I:
    594 		case GL_RG16UI:
    595 		case GL_RG32I:
    596 		case GL_RG32UI:
    597 		case GL_RGB8I:
    598 		case GL_RGB8UI:
    599 		case GL_RGB16I:
    600 		case GL_RGB16UI:
    601 		case GL_RGB32I:
    602 		case GL_RGB32UI:
    603 		case GL_RGBA8I:
    604 		case GL_RGBA8UI:
    605 		case GL_RGBA16I:
    606 		case GL_RGBA16UI:
    607 		case GL_RGBA32I:
    608 		case GL_RGBA32UI:
    609 			return false;
    610 
    611 		default:
    612 			DE_ASSERT(false);
    613 			return false;
    614 	}
    615 }
    616 
    617 static inline tcu::Sampler::WrapMode mapGLWrapMode (deUint32 wrapMode)
    618 {
    619 	switch (wrapMode)
    620 	{
    621 		case GL_CLAMP_TO_EDGE:		return tcu::Sampler::CLAMP_TO_EDGE;
    622 		case GL_CLAMP_TO_BORDER:	return tcu::Sampler::CLAMP_TO_BORDER;
    623 		case GL_REPEAT:				return tcu::Sampler::REPEAT_GL;
    624 		case GL_MIRRORED_REPEAT:	return tcu::Sampler::MIRRORED_REPEAT_GL;
    625 		default:
    626 			throw tcu::InternalError("Can't map GL wrap mode " + tcu::toHex(wrapMode).toString());
    627 	}
    628 }
    629 
    630 static inline tcu::Sampler::FilterMode mapGLMinFilterMode (deUint32 filterMode)
    631 {
    632 	switch (filterMode)
    633 	{
    634 		case GL_NEAREST:				return tcu::Sampler::NEAREST;
    635 		case GL_LINEAR:					return tcu::Sampler::LINEAR;
    636 		case GL_NEAREST_MIPMAP_NEAREST:	return tcu::Sampler::NEAREST_MIPMAP_NEAREST;
    637 		case GL_NEAREST_MIPMAP_LINEAR:	return tcu::Sampler::NEAREST_MIPMAP_LINEAR;
    638 		case GL_LINEAR_MIPMAP_NEAREST:	return tcu::Sampler::LINEAR_MIPMAP_NEAREST;
    639 		case GL_LINEAR_MIPMAP_LINEAR:	return tcu::Sampler::LINEAR_MIPMAP_LINEAR;
    640 		default:
    641 			throw tcu::InternalError("Can't map GL min filter mode" + tcu::toHex(filterMode).toString());
    642 	}
    643 }
    644 
    645 static inline tcu::Sampler::FilterMode mapGLMagFilterMode (deUint32 filterMode)
    646 {
    647 	switch (filterMode)
    648 	{
    649 		case GL_NEAREST:				return tcu::Sampler::NEAREST;
    650 		case GL_LINEAR:					return tcu::Sampler::LINEAR;
    651 		default:
    652 			throw tcu::InternalError("Can't map GL mag filter mode" + tcu::toHex(filterMode).toString());
    653 	}
    654 }
    655 
    656 /*--------------------------------------------------------------------*//*!
    657  * \brief Map GL sampler parameters to tcu::Sampler.
    658  *
    659  * If no mapping is found, throws tcu::InternalError.
    660  *
    661  * \param wrapS		S-component wrap mode
    662  * \param minFilter	Minification filter mode
    663  * \param magFilter	Magnification filter mode
    664  * \return Sampler description.
    665  *//*--------------------------------------------------------------------*/
    666 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 minFilter, deUint32 magFilter)
    667 {
    668 	return mapGLSampler(wrapS, wrapS, wrapS, minFilter, magFilter);
    669 }
    670 
    671 
    672 /*--------------------------------------------------------------------*//*!
    673  * \brief Map GL sampler parameters to tcu::Sampler.
    674  *
    675  * If no mapping is found, throws tcu::InternalError.
    676  *
    677  * \param wrapS		S-component wrap mode
    678  * \param wrapT		T-component wrap mode
    679  * \param minFilter	Minification filter mode
    680  * \param magFilter	Magnification filter mode
    681  * \return Sampler description.
    682  *//*--------------------------------------------------------------------*/
    683 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 wrapT, deUint32 minFilter, deUint32 magFilter)
    684 {
    685 	return mapGLSampler(wrapS, wrapT, wrapS, minFilter, magFilter);
    686 }
    687 
    688 /*--------------------------------------------------------------------*//*!
    689  * \brief Map GL sampler parameters to tcu::Sampler.
    690  *
    691  * If no mapping is found, throws tcu::InternalError.
    692  *
    693  * \param wrapS		S-component wrap mode
    694  * \param wrapT		T-component wrap mode
    695  * \param wrapR		R-component wrap mode
    696  * \param minFilter	Minification filter mode
    697  * \param magFilter	Magnification filter mode
    698  * \return Sampler description.
    699  *//*--------------------------------------------------------------------*/
    700 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 wrapT, deUint32 wrapR, deUint32 minFilter, deUint32 magFilter)
    701 {
    702 	return tcu::Sampler(mapGLWrapMode(wrapS), mapGLWrapMode(wrapT), mapGLWrapMode(wrapR),
    703 						mapGLMinFilterMode(minFilter), mapGLMagFilterMode(magFilter),
    704 						0.0f /* lod threshold */,
    705 						true /* normalized coords */,
    706 						tcu::Sampler::COMPAREMODE_NONE /* no compare */,
    707 						0 /* compare channel */,
    708 						tcu::Vec4(0.0f) /* border color, not used */);
    709 }
    710 
    711 /*--------------------------------------------------------------------*//*!
    712  * \brief Map GL compare function to tcu::Sampler::CompareMode.
    713  *
    714  * If no mapping is found, throws tcu::InternalError.
    715  *
    716  * \param mode GL compare mode
    717  * \return Compare mode
    718  *//*--------------------------------------------------------------------*/
    719 tcu::Sampler::CompareMode mapGLCompareFunc (deUint32 mode)
    720 {
    721 	switch (mode)
    722 	{
    723 		case GL_LESS:		return tcu::Sampler::COMPAREMODE_LESS;
    724 		case GL_LEQUAL:		return tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL;
    725 		case GL_GREATER:	return tcu::Sampler::COMPAREMODE_GREATER;
    726 		case GL_GEQUAL:		return tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL;
    727 		case GL_EQUAL:		return tcu::Sampler::COMPAREMODE_EQUAL;
    728 		case GL_NOTEQUAL:	return tcu::Sampler::COMPAREMODE_NOT_EQUAL;
    729 		case GL_ALWAYS:		return tcu::Sampler::COMPAREMODE_ALWAYS;
    730 		case GL_NEVER:		return tcu::Sampler::COMPAREMODE_NEVER;
    731 		default:
    732 			throw tcu::InternalError("Can't map GL compare mode " + tcu::toHex(mode).toString());
    733 	}
    734 }
    735 
    736 /*--------------------------------------------------------------------*//*!
    737  * \brief Get GL wrap mode.
    738  *
    739  * If no mapping is found, throws tcu::InternalError.
    740  *
    741  * \param wrapMode Wrap mode
    742  * \return GL wrap mode
    743  *//*--------------------------------------------------------------------*/
    744 deUint32 getGLWrapMode (tcu::Sampler::WrapMode wrapMode)
    745 {
    746 	DE_ASSERT(wrapMode != tcu::Sampler::WRAPMODE_LAST);
    747 	switch (wrapMode)
    748 	{
    749 		case tcu::Sampler::CLAMP_TO_EDGE:		return GL_CLAMP_TO_EDGE;
    750 		case tcu::Sampler::CLAMP_TO_BORDER:		return GL_CLAMP_TO_BORDER;
    751 		case tcu::Sampler::REPEAT_GL:			return GL_REPEAT;
    752 		case tcu::Sampler::MIRRORED_REPEAT_GL:	return GL_MIRRORED_REPEAT;
    753 		default:
    754 			throw tcu::InternalError("Can't map wrap mode");
    755 	}
    756 }
    757 
    758 /*--------------------------------------------------------------------*//*!
    759  * \brief Get GL filter mode.
    760  *
    761  * If no mapping is found, throws tcu::InternalError.
    762  *
    763  * \param filterMode Filter mode
    764  * \return GL filter mode
    765  *//*--------------------------------------------------------------------*/
    766 deUint32 getGLFilterMode (tcu::Sampler::FilterMode filterMode)
    767 {
    768 	DE_ASSERT(filterMode != tcu::Sampler::FILTERMODE_LAST);
    769 	switch (filterMode)
    770 	{
    771 		case tcu::Sampler::NEAREST:					return GL_NEAREST;
    772 		case tcu::Sampler::LINEAR:					return GL_LINEAR;
    773 		case tcu::Sampler::NEAREST_MIPMAP_NEAREST:	return GL_NEAREST_MIPMAP_NEAREST;
    774 		case tcu::Sampler::NEAREST_MIPMAP_LINEAR:	return GL_NEAREST_MIPMAP_LINEAR;
    775 		case tcu::Sampler::LINEAR_MIPMAP_NEAREST:	return GL_LINEAR_MIPMAP_NEAREST;
    776 		case tcu::Sampler::LINEAR_MIPMAP_LINEAR:	return GL_LINEAR_MIPMAP_LINEAR;
    777 		default:
    778 			throw tcu::InternalError("Can't map filter mode");
    779 	}
    780 }
    781 
    782 /*--------------------------------------------------------------------*//*!
    783  * \brief Get GL compare mode.
    784  *
    785  * If no mapping is found, throws tcu::InternalError.
    786  *
    787  * \param compareMode Compare mode
    788  * \return GL compare mode
    789  *//*--------------------------------------------------------------------*/
    790 deUint32 getGLCompareFunc (tcu::Sampler::CompareMode compareMode)
    791 {
    792 	DE_ASSERT(compareMode != tcu::Sampler::COMPAREMODE_NONE);
    793 	switch (compareMode)
    794 	{
    795 		case tcu::Sampler::COMPAREMODE_NONE:				return GL_NONE;
    796 		case tcu::Sampler::COMPAREMODE_LESS:				return GL_LESS;
    797 		case tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL:		return GL_LEQUAL;
    798 		case tcu::Sampler::COMPAREMODE_GREATER:				return GL_GREATER;
    799 		case tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL:	return GL_GEQUAL;
    800 		case tcu::Sampler::COMPAREMODE_EQUAL:				return GL_EQUAL;
    801 		case tcu::Sampler::COMPAREMODE_NOT_EQUAL:			return GL_NOTEQUAL;
    802 		case tcu::Sampler::COMPAREMODE_ALWAYS:				return GL_ALWAYS;
    803 		case tcu::Sampler::COMPAREMODE_NEVER:				return GL_NEVER;
    804 		default:
    805 			throw tcu::InternalError("Can't map compare mode");
    806 	}
    807 }
    808 
    809 /*--------------------------------------------------------------------*//*!
    810  * \brief Get GL cube face.
    811  *
    812  * If no mapping is found, throws tcu::InternalError.
    813  *
    814  * \param face Cube face
    815  * \return GL cube face
    816  *//*--------------------------------------------------------------------*/
    817 deUint32 getGLCubeFace (tcu::CubeFace face)
    818 {
    819 	DE_ASSERT(face != tcu::CUBEFACE_LAST);
    820 	switch (face)
    821 	{
    822 		case tcu::CUBEFACE_NEGATIVE_X:	return GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
    823 		case tcu::CUBEFACE_POSITIVE_X:	return GL_TEXTURE_CUBE_MAP_POSITIVE_X;
    824 		case tcu::CUBEFACE_NEGATIVE_Y:	return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
    825 		case tcu::CUBEFACE_POSITIVE_Y:	return GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
    826 		case tcu::CUBEFACE_NEGATIVE_Z:	return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
    827 		case tcu::CUBEFACE_POSITIVE_Z:	return GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
    828 		default:
    829 			throw tcu::InternalError("Can't map cube face");
    830 	}
    831 }
    832 
    833 tcu::CubeFace getCubeFaceFromGL (deUint32 face)
    834 {
    835 	switch (face)
    836 	{
    837 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:	return tcu::CUBEFACE_NEGATIVE_X;
    838 		case GL_TEXTURE_CUBE_MAP_POSITIVE_X:	return tcu::CUBEFACE_POSITIVE_X;
    839 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:	return tcu::CUBEFACE_NEGATIVE_Y;
    840 		case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:	return tcu::CUBEFACE_POSITIVE_Y;
    841 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:	return tcu::CUBEFACE_NEGATIVE_Z;
    842 		case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:	return tcu::CUBEFACE_POSITIVE_Z;
    843 		default:
    844 			throw tcu::InternalError("Can't map cube face");
    845 	}
    846 }
    847 
    848 /*--------------------------------------------------------------------*//*!
    849  * \brief Get GLSL sampler type for texture format.
    850  *
    851  * If no mapping is found, glu::TYPE_LAST is returned.
    852  *
    853  * \param format Texture format
    854  * \return GLSL 1D sampler type for format
    855  *//*--------------------------------------------------------------------*/
    856 DataType getSampler1DType (tcu::TextureFormat format)
    857 {
    858 	using tcu::TextureFormat;
    859 
    860 	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
    861 		return TYPE_SAMPLER_1D;
    862 
    863 	if (format.order == TextureFormat::S)
    864 		return TYPE_LAST;
    865 
    866 	switch (tcu::getTextureChannelClass(format.type))
    867 	{
    868 		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
    869 		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
    870 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
    871 			return glu::TYPE_SAMPLER_1D;
    872 
    873 		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
    874 			return glu::TYPE_INT_SAMPLER_1D;
    875 
    876 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
    877 			return glu::TYPE_UINT_SAMPLER_1D;
    878 
    879 		default:
    880 			return glu::TYPE_LAST;
    881 	}
    882 }
    883 
    884 /*--------------------------------------------------------------------*//*!
    885  * \brief Get GLSL sampler type for texture format.
    886  *
    887  * If no mapping is found, glu::TYPE_LAST is returned.
    888  *
    889  * \param format Texture format
    890  * \return GLSL 2D sampler type for format
    891  *//*--------------------------------------------------------------------*/
    892 DataType getSampler2DType (tcu::TextureFormat format)
    893 {
    894 	using tcu::TextureFormat;
    895 
    896 	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
    897 		return TYPE_SAMPLER_2D;
    898 
    899 	if (format.order == TextureFormat::S)
    900 		return TYPE_LAST;
    901 
    902 	switch (tcu::getTextureChannelClass(format.type))
    903 	{
    904 		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
    905 		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
    906 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
    907 			return glu::TYPE_SAMPLER_2D;
    908 
    909 		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
    910 			return glu::TYPE_INT_SAMPLER_2D;
    911 
    912 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
    913 			return glu::TYPE_UINT_SAMPLER_2D;
    914 
    915 		default:
    916 			return glu::TYPE_LAST;
    917 	}
    918 }
    919 
    920 /*--------------------------------------------------------------------*//*!
    921  * \brief Get GLSL sampler type for texture format.
    922  *
    923  * If no mapping is found, glu::TYPE_LAST is returned.
    924  *
    925  * \param format Texture format
    926  * \return GLSL cube map sampler type for format
    927  *//*--------------------------------------------------------------------*/
    928 DataType getSamplerCubeType (tcu::TextureFormat format)
    929 {
    930 	using tcu::TextureFormat;
    931 
    932 	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
    933 		return TYPE_SAMPLER_CUBE;
    934 
    935 	if (format.order == TextureFormat::S)
    936 		return TYPE_LAST;
    937 
    938 	switch (tcu::getTextureChannelClass(format.type))
    939 	{
    940 		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
    941 		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
    942 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
    943 			return glu::TYPE_SAMPLER_CUBE;
    944 
    945 		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
    946 			return glu::TYPE_INT_SAMPLER_CUBE;
    947 
    948 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
    949 			return glu::TYPE_UINT_SAMPLER_CUBE;
    950 
    951 		default:
    952 			return glu::TYPE_LAST;
    953 	}
    954 }
    955 
    956 /*--------------------------------------------------------------------*//*!
    957  * \brief Get GLSL sampler type for texture format.
    958  *
    959  * If no mapping is found, glu::TYPE_LAST is returned.
    960  *
    961  * \param format Texture format
    962  * \return GLSL 1D array sampler type for format
    963  *//*--------------------------------------------------------------------*/
    964 DataType getSampler1DArrayType (tcu::TextureFormat format)
    965 {
    966 	using tcu::TextureFormat;
    967 
    968 	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
    969 		return TYPE_SAMPLER_1D_ARRAY;
    970 
    971 	if (format.order == TextureFormat::S)
    972 		return TYPE_LAST;
    973 
    974 	switch (tcu::getTextureChannelClass(format.type))
    975 	{
    976 		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
    977 		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
    978 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
    979 			return glu::TYPE_SAMPLER_1D_ARRAY;
    980 
    981 		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
    982 			return glu::TYPE_INT_SAMPLER_1D_ARRAY;
    983 
    984 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
    985 			return glu::TYPE_UINT_SAMPLER_1D_ARRAY;
    986 
    987 		default:
    988 			return glu::TYPE_LAST;
    989 	}
    990 }
    991 
    992 /*--------------------------------------------------------------------*//*!
    993  * \brief Get GLSL sampler type for texture format.
    994  *
    995  * If no mapping is found, glu::TYPE_LAST is returned.
    996  *
    997  * \param format Texture format
    998  * \return GLSL 2D array sampler type for format
    999  *//*--------------------------------------------------------------------*/
   1000 DataType getSampler2DArrayType (tcu::TextureFormat format)
   1001 {
   1002 	using tcu::TextureFormat;
   1003 
   1004 	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
   1005 		return TYPE_SAMPLER_2D_ARRAY;
   1006 
   1007 	if (format.order == TextureFormat::S)
   1008 		return TYPE_LAST;
   1009 
   1010 	switch (tcu::getTextureChannelClass(format.type))
   1011 	{
   1012 		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
   1013 		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
   1014 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
   1015 			return glu::TYPE_SAMPLER_2D_ARRAY;
   1016 
   1017 		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
   1018 			return glu::TYPE_INT_SAMPLER_2D_ARRAY;
   1019 
   1020 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
   1021 			return glu::TYPE_UINT_SAMPLER_2D_ARRAY;
   1022 
   1023 		default:
   1024 			return glu::TYPE_LAST;
   1025 	}
   1026 }
   1027 
   1028 /*--------------------------------------------------------------------*//*!
   1029  * \brief Get GLSL sampler type for texture format.
   1030  *
   1031  * If no mapping is found, glu::TYPE_LAST is returned.
   1032  *
   1033  * \param format Texture format
   1034  * \return GLSL 3D sampler type for format
   1035  *//*--------------------------------------------------------------------*/
   1036 DataType getSampler3DType (tcu::TextureFormat format)
   1037 {
   1038 	using tcu::TextureFormat;
   1039 
   1040 	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
   1041 		return TYPE_SAMPLER_3D;
   1042 
   1043 	if (format.order == TextureFormat::S)
   1044 		return TYPE_LAST;
   1045 
   1046 	switch (tcu::getTextureChannelClass(format.type))
   1047 	{
   1048 		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
   1049 		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
   1050 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
   1051 			return glu::TYPE_SAMPLER_3D;
   1052 
   1053 		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
   1054 			return glu::TYPE_INT_SAMPLER_3D;
   1055 
   1056 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
   1057 			return glu::TYPE_UINT_SAMPLER_3D;
   1058 
   1059 		default:
   1060 			return glu::TYPE_LAST;
   1061 	}
   1062 }
   1063 
   1064 /*--------------------------------------------------------------------*//*!
   1065  * \brief Get GLSL sampler type for texture format.
   1066  *
   1067  * If no mapping is found, glu::TYPE_LAST is returned.
   1068  *
   1069  * \param format Texture format
   1070  * \return GLSL cube map array sampler type for format
   1071  *//*--------------------------------------------------------------------*/
   1072 DataType getSamplerCubeArrayType (tcu::TextureFormat format)
   1073 {
   1074 	using tcu::TextureFormat;
   1075 
   1076 	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
   1077 		return TYPE_SAMPLER_CUBE_ARRAY;
   1078 
   1079 	if (format.order == TextureFormat::S)
   1080 		return TYPE_LAST;
   1081 
   1082 	switch (tcu::getTextureChannelClass(format.type))
   1083 	{
   1084 		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
   1085 		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
   1086 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
   1087 			return glu::TYPE_SAMPLER_CUBE_ARRAY;
   1088 
   1089 		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
   1090 			return glu::TYPE_INT_SAMPLER_CUBE_ARRAY;
   1091 
   1092 		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
   1093 			return glu::TYPE_UINT_SAMPLER_CUBE_ARRAY;
   1094 
   1095 		default:
   1096 			return glu::TYPE_LAST;
   1097 	}
   1098 }
   1099 
   1100 enum RenderableType
   1101 {
   1102 	RENDERABLE_COLOR	= (1<<0),
   1103 	RENDERABLE_DEPTH	= (1<<1),
   1104 	RENDERABLE_STENCIL	= (1<<2)
   1105 };
   1106 
   1107 static deUint32 getRenderableBitsES3 (const ContextInfo& contextInfo, deUint32 internalFormat)
   1108 {
   1109 	switch (internalFormat)
   1110 	{
   1111 		// Color-renderable formats
   1112 		case GL_RGBA32I:
   1113 		case GL_RGBA32UI:
   1114 		case GL_RGBA16I:
   1115 		case GL_RGBA16UI:
   1116 		case GL_RGBA8:
   1117 		case GL_RGBA8I:
   1118 		case GL_RGBA8UI:
   1119 		case GL_SRGB8_ALPHA8:
   1120 		case GL_RGB10_A2:
   1121 		case GL_RGB10_A2UI:
   1122 		case GL_RGBA4:
   1123 		case GL_RGB5_A1:
   1124 		case GL_RGB8:
   1125 		case GL_RGB565:
   1126 		case GL_RG32I:
   1127 		case GL_RG32UI:
   1128 		case GL_RG16I:
   1129 		case GL_RG16UI:
   1130 		case GL_RG8:
   1131 		case GL_RG8I:
   1132 		case GL_RG8UI:
   1133 		case GL_R32I:
   1134 		case GL_R32UI:
   1135 		case GL_R16I:
   1136 		case GL_R16UI:
   1137 		case GL_R8:
   1138 		case GL_R8I:
   1139 		case GL_R8UI:
   1140 			return RENDERABLE_COLOR;
   1141 
   1142 		// GL_EXT_color_buffer_float
   1143 		case GL_RGBA32F:
   1144 		case GL_R11F_G11F_B10F:
   1145 		case GL_RG32F:
   1146 		case GL_R32F:
   1147 			if (contextInfo.isExtensionSupported("GL_EXT_color_buffer_float"))
   1148 				return RENDERABLE_COLOR;
   1149 			else
   1150 				return 0;
   1151 
   1152 		// GL_EXT_color_buffer_float / GL_EXT_color_buffer_half_float
   1153 		case GL_RGBA16F:
   1154 		case GL_RG16F:
   1155 		case GL_R16F:
   1156 			if (contextInfo.isExtensionSupported("GL_EXT_color_buffer_float") ||
   1157 				contextInfo.isExtensionSupported("GL_EXT_color_buffer_half_float"))
   1158 				return RENDERABLE_COLOR;
   1159 			else
   1160 				return 0;
   1161 
   1162 		// Depth formats
   1163 		case GL_DEPTH_COMPONENT32F:
   1164 		case GL_DEPTH_COMPONENT24:
   1165 		case GL_DEPTH_COMPONENT16:
   1166 			return RENDERABLE_DEPTH;
   1167 
   1168 		// Depth+stencil formats
   1169 		case GL_DEPTH32F_STENCIL8:
   1170 		case GL_DEPTH24_STENCIL8:
   1171 			return RENDERABLE_DEPTH|RENDERABLE_STENCIL;
   1172 
   1173 		// Stencil formats
   1174 		case GL_STENCIL_INDEX8:
   1175 			return RENDERABLE_STENCIL;
   1176 
   1177 		default:
   1178 			return 0;
   1179 	}
   1180 }
   1181 
   1182 /*--------------------------------------------------------------------*//*!
   1183  * \brief Check if sized internal format is color-renderable.
   1184  * \note Works currently only on ES3 context.
   1185  *//*--------------------------------------------------------------------*/
   1186 bool isSizedFormatColorRenderable (const RenderContext& renderCtx, const ContextInfo& contextInfo, deUint32 sizedFormat)
   1187 {
   1188 	deUint32 renderable = 0;
   1189 
   1190 	if (renderCtx.getType().getAPI() == ApiType::es(3,0))
   1191 		renderable = getRenderableBitsES3(contextInfo, sizedFormat);
   1192 	else
   1193 		throw tcu::InternalError("Context type not supported in query");
   1194 
   1195 	return (renderable & RENDERABLE_COLOR) != 0;
   1196 }
   1197 
   1198 const tcu::IVec2 (&getDefaultGatherOffsets (void))[4]
   1199 {
   1200 	static const tcu::IVec2 s_defaultOffsets[4] =
   1201 	{
   1202 		tcu::IVec2(0, 1),
   1203 		tcu::IVec2(1, 1),
   1204 		tcu::IVec2(1, 0),
   1205 		tcu::IVec2(0, 0),
   1206 	};
   1207 	return s_defaultOffsets;
   1208 }
   1209 
   1210 tcu::PixelBufferAccess getTextureBufferEffectiveRefTexture (TextureBuffer& buffer, int maxTextureBufferSize)
   1211 {
   1212 	DE_ASSERT(maxTextureBufferSize > 0);
   1213 
   1214 	const tcu::PixelBufferAccess& fullAccess = buffer.getFullRefTexture();
   1215 
   1216 	return tcu::PixelBufferAccess(fullAccess.getFormat(),
   1217 								  tcu::IVec3(de::min(fullAccess.getWidth(), maxTextureBufferSize), 1, 1),
   1218 								  fullAccess.getPitch(),
   1219 								  fullAccess.getDataPtr());
   1220 }
   1221 
   1222 tcu::ConstPixelBufferAccess getTextureBufferEffectiveRefTexture (const TextureBuffer& buffer, int maxTextureBufferSize)
   1223 {
   1224 	return getTextureBufferEffectiveRefTexture(const_cast<TextureBuffer&>(buffer), maxTextureBufferSize);
   1225 }
   1226 
   1227 } // glu
   1228