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
32namespace glu
33{
34
35using 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 *//*--------------------------------------------------------------------*/
46TransferFormat 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 *//*--------------------------------------------------------------------*/
140deUint32 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 *//*--------------------------------------------------------------------*/
237deUint32 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 *//*--------------------------------------------------------------------*/
296tcu::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
346bool 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
396static 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 *//*--------------------------------------------------------------------*/
435tcu::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 *//*--------------------------------------------------------------------*/
469tcu::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
552bool 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
617static 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
630static 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
645static 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 *//*--------------------------------------------------------------------*/
666tcu::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 *//*--------------------------------------------------------------------*/
683tcu::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 *//*--------------------------------------------------------------------*/
700tcu::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 *//*--------------------------------------------------------------------*/
719tcu::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 *//*--------------------------------------------------------------------*/
744deUint32 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 *//*--------------------------------------------------------------------*/
766deUint32 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 *//*--------------------------------------------------------------------*/
790deUint32 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 *//*--------------------------------------------------------------------*/
817deUint32 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
833tcu::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 *//*--------------------------------------------------------------------*/
856DataType 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 *//*--------------------------------------------------------------------*/
892DataType 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 *//*--------------------------------------------------------------------*/
928DataType 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 2D array sampler type for format
963 *//*--------------------------------------------------------------------*/
964DataType getSampler2DArrayType (tcu::TextureFormat format)
965{
966	using tcu::TextureFormat;
967
968	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
969		return TYPE_SAMPLER_2D_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_2D_ARRAY;
980
981		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
982			return glu::TYPE_INT_SAMPLER_2D_ARRAY;
983
984		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
985			return glu::TYPE_UINT_SAMPLER_2D_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 3D sampler type for format
999 *//*--------------------------------------------------------------------*/
1000DataType getSampler3DType (tcu::TextureFormat format)
1001{
1002	using tcu::TextureFormat;
1003
1004	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
1005		return TYPE_SAMPLER_3D;
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_3D;
1016
1017		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1018			return glu::TYPE_INT_SAMPLER_3D;
1019
1020		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1021			return glu::TYPE_UINT_SAMPLER_3D;
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 cube map array sampler type for format
1035 *//*--------------------------------------------------------------------*/
1036DataType getSamplerCubeArrayType (tcu::TextureFormat format)
1037{
1038	using tcu::TextureFormat;
1039
1040	if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
1041		return TYPE_SAMPLER_CUBE_ARRAY;
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_CUBE_ARRAY;
1052
1053		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1054			return glu::TYPE_INT_SAMPLER_CUBE_ARRAY;
1055
1056		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1057			return glu::TYPE_UINT_SAMPLER_CUBE_ARRAY;
1058
1059		default:
1060			return glu::TYPE_LAST;
1061	}
1062}
1063
1064enum RenderableType
1065{
1066	RENDERABLE_COLOR	= (1<<0),
1067	RENDERABLE_DEPTH	= (1<<1),
1068	RENDERABLE_STENCIL	= (1<<2)
1069};
1070
1071static deUint32 getRenderableBitsES3 (const ContextInfo& contextInfo, deUint32 internalFormat)
1072{
1073	switch (internalFormat)
1074	{
1075		// Color-renderable formats
1076		case GL_RGBA32I:
1077		case GL_RGBA32UI:
1078		case GL_RGBA16I:
1079		case GL_RGBA16UI:
1080		case GL_RGBA8:
1081		case GL_RGBA8I:
1082		case GL_RGBA8UI:
1083		case GL_SRGB8_ALPHA8:
1084		case GL_RGB10_A2:
1085		case GL_RGB10_A2UI:
1086		case GL_RGBA4:
1087		case GL_RGB5_A1:
1088		case GL_RGB8:
1089		case GL_RGB565:
1090		case GL_RG32I:
1091		case GL_RG32UI:
1092		case GL_RG16I:
1093		case GL_RG16UI:
1094		case GL_RG8:
1095		case GL_RG8I:
1096		case GL_RG8UI:
1097		case GL_R32I:
1098		case GL_R32UI:
1099		case GL_R16I:
1100		case GL_R16UI:
1101		case GL_R8:
1102		case GL_R8I:
1103		case GL_R8UI:
1104			return RENDERABLE_COLOR;
1105
1106		// GL_EXT_color_buffer_float
1107		case GL_RGBA32F:
1108		case GL_R11F_G11F_B10F:
1109		case GL_RG32F:
1110		case GL_R32F:
1111			if (contextInfo.isExtensionSupported("GL_EXT_color_buffer_float"))
1112				return RENDERABLE_COLOR;
1113			else
1114				return 0;
1115
1116		// GL_EXT_color_buffer_float / GL_EXT_color_buffer_half_float
1117		case GL_RGBA16F:
1118		case GL_RG16F:
1119		case GL_R16F:
1120			if (contextInfo.isExtensionSupported("GL_EXT_color_buffer_float") ||
1121				contextInfo.isExtensionSupported("GL_EXT_color_buffer_half_float"))
1122				return RENDERABLE_COLOR;
1123			else
1124				return 0;
1125
1126		// Depth formats
1127		case GL_DEPTH_COMPONENT32F:
1128		case GL_DEPTH_COMPONENT24:
1129		case GL_DEPTH_COMPONENT16:
1130			return RENDERABLE_DEPTH;
1131
1132		// Depth+stencil formats
1133		case GL_DEPTH32F_STENCIL8:
1134		case GL_DEPTH24_STENCIL8:
1135			return RENDERABLE_DEPTH|RENDERABLE_STENCIL;
1136
1137		// Stencil formats
1138		case GL_STENCIL_INDEX8:
1139			return RENDERABLE_STENCIL;
1140
1141		default:
1142			return 0;
1143	}
1144}
1145
1146/*--------------------------------------------------------------------*//*!
1147 * \brief Check if sized internal format is color-renderable.
1148 * \note Works currently only on ES3 context.
1149 *//*--------------------------------------------------------------------*/
1150bool isSizedFormatColorRenderable (const RenderContext& renderCtx, const ContextInfo& contextInfo, deUint32 sizedFormat)
1151{
1152	deUint32 renderable = 0;
1153
1154	if (renderCtx.getType().getAPI() == ApiType::es(3,0))
1155		renderable = getRenderableBitsES3(contextInfo, sizedFormat);
1156	else
1157		throw tcu::InternalError("Context type not supported in query");
1158
1159	return (renderable & RENDERABLE_COLOR) != 0;
1160}
1161
1162const tcu::IVec2 (&getDefaultGatherOffsets (void))[4]
1163{
1164	static const tcu::IVec2 s_defaultOffsets[4] =
1165	{
1166		tcu::IVec2(0, 1),
1167		tcu::IVec2(1, 1),
1168		tcu::IVec2(1, 0),
1169		tcu::IVec2(0, 0),
1170	};
1171	return s_defaultOffsets;
1172}
1173
1174tcu::PixelBufferAccess getTextureBufferEffectiveRefTexture (TextureBuffer& buffer, int maxTextureBufferSize)
1175{
1176	DE_ASSERT(maxTextureBufferSize > 0);
1177
1178	const tcu::PixelBufferAccess& fullAccess = buffer.getFullRefTexture();
1179
1180	return tcu::PixelBufferAccess(fullAccess.getFormat(),
1181								  tcu::IVec3(de::min(fullAccess.getWidth(), maxTextureBufferSize), 1, 1),
1182								  fullAccess.getPitch(),
1183								  fullAccess.getDataPtr());
1184}
1185
1186tcu::ConstPixelBufferAccess getTextureBufferEffectiveRefTexture (const TextureBuffer& buffer, int maxTextureBufferSize)
1187{
1188	return getTextureBufferEffectiveRefTexture(const_cast<TextureBuffer&>(buffer), maxTextureBufferSize);
1189}
1190
1191} // glu
1192