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