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  *//*--------------------------------------------------------------------*/
getTransferFormat(tcu::TextureFormat texFormat)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  *//*--------------------------------------------------------------------*/
getInternalFormat(tcu::TextureFormat texFormat)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  *//*--------------------------------------------------------------------*/
getGLFormat(tcu::CompressedTexFormat format)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  *//*--------------------------------------------------------------------*/
mapGLCompressedTexFormat(deUint32 format)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 
isCompressedFormat(deUint32 internalFormat)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 
mapGLChannelType(deUint32 dataType,bool normalized)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  *//*--------------------------------------------------------------------*/
mapGLTransferFormat(deUint32 format,deUint32 dataType)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  *//*--------------------------------------------------------------------*/
mapGLInternalFormat(deUint32 internalFormat)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 
isGLInternalColorFormatFilterable(deUint32 format)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 
mapGLWrapMode(deUint32 wrapMode)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 
mapGLMinFilterMode(deUint32 filterMode)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 
mapGLMagFilterMode(deUint32 filterMode)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  *//*--------------------------------------------------------------------*/
mapGLSampler(deUint32 wrapS,deUint32 minFilter,deUint32 magFilter)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  *//*--------------------------------------------------------------------*/
mapGLSampler(deUint32 wrapS,deUint32 wrapT,deUint32 minFilter,deUint32 magFilter)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  *//*--------------------------------------------------------------------*/
mapGLSampler(deUint32 wrapS,deUint32 wrapT,deUint32 wrapR,deUint32 minFilter,deUint32 magFilter)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  *//*--------------------------------------------------------------------*/
mapGLCompareFunc(deUint32 mode)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  *//*--------------------------------------------------------------------*/
getGLWrapMode(tcu::Sampler::WrapMode wrapMode)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  *//*--------------------------------------------------------------------*/
getGLFilterMode(tcu::Sampler::FilterMode filterMode)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  *//*--------------------------------------------------------------------*/
getGLCompareFunc(tcu::Sampler::CompareMode compareMode)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  *//*--------------------------------------------------------------------*/
getGLCubeFace(tcu::CubeFace face)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 
getCubeFaceFromGL(deUint32 face)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  *//*--------------------------------------------------------------------*/
getSampler1DType(tcu::TextureFormat format)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  *//*--------------------------------------------------------------------*/
getSampler2DType(tcu::TextureFormat format)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  *//*--------------------------------------------------------------------*/
getSamplerCubeType(tcu::TextureFormat format)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  *//*--------------------------------------------------------------------*/
getSampler1DArrayType(tcu::TextureFormat format)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  *//*--------------------------------------------------------------------*/
getSampler2DArrayType(tcu::TextureFormat format)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  *//*--------------------------------------------------------------------*/
getSampler3DType(tcu::TextureFormat format)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  *//*--------------------------------------------------------------------*/
getSamplerCubeArrayType(tcu::TextureFormat format)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 
getRenderableBitsES3(const ContextInfo & contextInfo,deUint32 internalFormat)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  *//*--------------------------------------------------------------------*/
isSizedFormatColorRenderable(const RenderContext & renderCtx,const ContextInfo & contextInfo,deUint32 sizedFormat)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 
getDefaultGatherOffsets(void)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 
getTextureBufferEffectiveRefTexture(const TextureBuffer & buffer,int maxTextureBufferSize)1227 tcu::ConstPixelBufferAccess getTextureBufferEffectiveRefTexture (const TextureBuffer& buffer, int maxTextureBufferSize)
1228 {
1229 	return getTextureBufferEffectiveRefTexture(const_cast<TextureBuffer&>(buffer), maxTextureBufferSize);
1230 }
1231 
1232 } // glu
1233