1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL (ES) Module
3 * -----------------------------------------------
5 * Copyright 2015 The Android Open Source Project
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief Texture State Query tests.
22 *//*--------------------------------------------------------------------*/
24 #include "glsTextureStateQueryTests.hpp"
25 #include "gluStrUtil.hpp"
26 #include "gluObjectWrapper.hpp"
27 #include "gluCallLogWrapper.hpp"
28 #include "gluContextInfo.hpp"
29 #include "gluTextureUtil.hpp"
30 #include "glwEnums.hpp"
31 #include "deUniquePtr.hpp"
32 #include "deRandom.hpp"
33 #include "deStringUtil.hpp"
39 namespace TextureStateQueryTests
45 using namespace gls::StateQueryUtil;
47 static glw::GLenum mapTesterToPname (TesterType tester)
50 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
54 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R): return GL_TEXTURE_SWIZZLE_R;
55 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G): return GL_TEXTURE_SWIZZLE_G;
56 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B): return GL_TEXTURE_SWIZZLE_B;
57 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A): return GL_TEXTURE_SWIZZLE_A;
59 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
60 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_S;
62 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
63 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_T;
65 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
66 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_R;
68 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER): return GL_TEXTURE_MAG_FILTER;
69 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER): return GL_TEXTURE_MIN_FILTER;
70 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD): return GL_TEXTURE_MIN_LOD;
71 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD): return GL_TEXTURE_MAX_LOD;
72 CASE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL): return GL_TEXTURE_BASE_LEVEL;
73 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL): return GL_TEXTURE_MAX_LEVEL;
74 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE): return GL_TEXTURE_COMPARE_MODE;
75 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC): return GL_TEXTURE_COMPARE_FUNC;
76 case TESTER_TEXTURE_IMMUTABLE_LEVELS: return GL_TEXTURE_IMMUTABLE_LEVELS;
77 case TESTER_TEXTURE_IMMUTABLE_FORMAT: return GL_TEXTURE_IMMUTABLE_FORMAT;
78 CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE): return GL_DEPTH_STENCIL_TEXTURE_MODE;
79 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): return GL_TEXTURE_SRGB_DECODE_EXT;
80 case TESTER_TEXTURE_BORDER_COLOR: return GL_TEXTURE_BORDER_COLOR;
87 #undef CASE_PURE_SETTERS
90 static bool querySupportsSigned (QueryType type)
92 return type != QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER &&
93 type != QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER;
96 static bool isPureIntTester (TesterType tester)
98 #define HANDLE_ALL_SETTERS(X) \
100 case X ## _SET_PURE_UINT: return false; \
101 case X ## _SET_PURE_INT: return true;
105 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R)
106 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G)
107 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B)
108 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A)
109 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S)
110 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T)
111 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R)
112 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER)
113 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER)
114 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD)
115 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD)
116 HANDLE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL)
117 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL)
118 HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE)
119 HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC)
120 HANDLE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE)
121 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT)
123 case TESTER_TEXTURE_IMMUTABLE_LEVELS:
124 case TESTER_TEXTURE_IMMUTABLE_FORMAT:
125 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
126 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
127 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
128 case TESTER_TEXTURE_BORDER_COLOR:
136 #undef HANDLE_ALL_SETTERS
139 static bool isPureUintTester (TesterType tester)
141 #define HANDLE_ALL_SETTERS(X) \
143 case X ## _SET_PURE_INT: return false; \
144 case X ## _SET_PURE_UINT: return true;
148 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R)
149 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G)
150 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B)
151 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A)
152 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S)
153 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T)
154 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R)
155 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER)
156 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER)
157 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD)
158 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD)
159 HANDLE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL)
160 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL)
161 HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE)
162 HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC)
163 HANDLE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE)
164 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT)
166 case TESTER_TEXTURE_IMMUTABLE_LEVELS:
167 case TESTER_TEXTURE_IMMUTABLE_FORMAT:
168 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
169 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
170 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
171 case TESTER_TEXTURE_BORDER_COLOR:
179 #undef HANDLE_ALL_SETTERS
182 class RequiredExtensions
185 RequiredExtensions (void) { }
186 explicit RequiredExtensions (const char* ext) { add(ext); }
187 RequiredExtensions (const char* extA, const char* extB) { add(extA); add(extB); }
189 void add (const char* ext);
190 void add (const RequiredExtensions& other);
191 void check (const glu::ContextInfo&) const;
194 std::vector<const char*> m_extensions;
197 void RequiredExtensions::add (const char* ext)
199 for (int ndx = 0; ndx < (int)m_extensions.size(); ++ndx)
200 if (deStringEqual(m_extensions[ndx], ext) == DE_TRUE)
202 m_extensions.push_back(ext);
205 void RequiredExtensions::add (const RequiredExtensions& other)
207 for (int ndx = 0; ndx < (int)other.m_extensions.size(); ++ndx)
208 add(other.m_extensions[ndx]);
211 void RequiredExtensions::check (const glu::ContextInfo& ctxInfo) const
213 std::vector<const char*> failedExtensions;
215 for (int ndx = 0; ndx < (int)m_extensions.size(); ++ndx)
216 if (!ctxInfo.isExtensionSupported(m_extensions[ndx]))
217 failedExtensions.push_back(m_extensions[ndx]);
219 if (!failedExtensions.empty())
221 std::ostringstream buf;
222 buf << "Test requires extension: ";
224 for (int ndx = 0; ndx < (int)failedExtensions.size(); ++ndx)
228 buf << failedExtensions[ndx];
231 throw tcu::NotSupportedError(buf.str());
238 static bool isCoreTextureTarget (glw::GLenum target)
240 return target == GL_TEXTURE_2D ||
241 target == GL_TEXTURE_3D ||
242 target == GL_TEXTURE_2D_ARRAY ||
243 target == GL_TEXTURE_CUBE_MAP;
246 static RequiredExtensions getTextureTargetExtension (glw::GLenum target)
250 return RequiredExtensions();
253 static bool isCoreTextureParam (glw::GLenum pname)
255 return pname == GL_TEXTURE_BASE_LEVEL ||
256 pname == GL_TEXTURE_COMPARE_MODE ||
257 pname == GL_TEXTURE_COMPARE_FUNC ||
258 pname == GL_TEXTURE_MAG_FILTER ||
259 pname == GL_TEXTURE_MAX_LEVEL ||
260 pname == GL_TEXTURE_MAX_LOD ||
261 pname == GL_TEXTURE_MIN_FILTER ||
262 pname == GL_TEXTURE_MIN_LOD ||
263 pname == GL_TEXTURE_SWIZZLE_R ||
264 pname == GL_TEXTURE_SWIZZLE_G ||
265 pname == GL_TEXTURE_SWIZZLE_B ||
266 pname == GL_TEXTURE_SWIZZLE_A ||
267 pname == GL_TEXTURE_WRAP_S ||
268 pname == GL_TEXTURE_WRAP_T ||
269 pname == GL_TEXTURE_WRAP_R ||
270 pname == GL_TEXTURE_IMMUTABLE_FORMAT ||
271 pname == GL_TEXTURE_IMMUTABLE_LEVELS;
274 static RequiredExtensions getTextureParamExtension (glw::GLenum pname)
278 return RequiredExtensions();
281 static bool isCoreQuery (QueryType query)
283 return query == QUERY_TEXTURE_PARAM_INTEGER ||
284 query == QUERY_TEXTURE_PARAM_FLOAT ||
285 query == QUERY_TEXTURE_PARAM_INTEGER_VEC4 ||
286 query == QUERY_TEXTURE_PARAM_FLOAT_VEC4 ||
287 query == QUERY_SAMPLER_PARAM_INTEGER ||
288 query == QUERY_SAMPLER_PARAM_FLOAT ||
289 query == QUERY_SAMPLER_PARAM_INTEGER_VEC4 ||
290 query == QUERY_SAMPLER_PARAM_FLOAT_VEC4;
293 static RequiredExtensions getQueryExtension (QueryType query)
297 return RequiredExtensions();
300 static bool isCoreTester (TesterType tester)
302 return tester == TESTER_TEXTURE_SWIZZLE_R ||
303 tester == TESTER_TEXTURE_SWIZZLE_G ||
304 tester == TESTER_TEXTURE_SWIZZLE_B ||
305 tester == TESTER_TEXTURE_SWIZZLE_A ||
306 tester == TESTER_TEXTURE_WRAP_S ||
307 tester == TESTER_TEXTURE_WRAP_T ||
308 tester == TESTER_TEXTURE_WRAP_R ||
309 tester == TESTER_TEXTURE_MAG_FILTER ||
310 tester == TESTER_TEXTURE_MIN_FILTER ||
311 tester == TESTER_TEXTURE_MIN_LOD ||
312 tester == TESTER_TEXTURE_MAX_LOD ||
313 tester == TESTER_TEXTURE_BASE_LEVEL ||
314 tester == TESTER_TEXTURE_MAX_LEVEL ||
315 tester == TESTER_TEXTURE_COMPARE_MODE ||
316 tester == TESTER_TEXTURE_COMPARE_FUNC ||
317 tester == TESTER_TEXTURE_IMMUTABLE_LEVELS ||
318 tester == TESTER_TEXTURE_IMMUTABLE_FORMAT;
321 static RequiredExtensions getTesterExtension (TesterType tester)
325 return RequiredExtensions();
333 static bool isCoreTextureTarget (glw::GLenum target)
335 return es30::isCoreTextureTarget(target) ||
336 target == GL_TEXTURE_2D_MULTISAMPLE;
339 static RequiredExtensions getTextureTargetExtension (glw::GLenum target)
343 case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: return RequiredExtensions("GL_OES_texture_storage_multisample_2d_array");
344 case GL_TEXTURE_BUFFER: return RequiredExtensions("GL_EXT_texture_buffer");
345 case GL_TEXTURE_CUBE_MAP_ARRAY: return RequiredExtensions("GL_EXT_texture_cube_map_array");
348 return RequiredExtensions();
352 static bool isCoreTextureParam (glw::GLenum pname)
354 return es30::isCoreTextureParam(pname) ||
355 pname == GL_DEPTH_STENCIL_TEXTURE_MODE;
358 static RequiredExtensions getTextureParamExtension (glw::GLenum pname)
362 case GL_TEXTURE_SRGB_DECODE_EXT: return RequiredExtensions("GL_EXT_texture_sRGB_decode");
363 case GL_TEXTURE_BORDER_COLOR: return RequiredExtensions("GL_EXT_texture_border_clamp");
366 return RequiredExtensions();
370 static bool isCoreQuery (QueryType query)
372 return es30::isCoreQuery(query);
375 static RequiredExtensions getQueryExtension (QueryType query)
379 case QUERY_TEXTURE_PARAM_PURE_INTEGER:
380 case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER:
381 case QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4:
382 case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4:
383 case QUERY_SAMPLER_PARAM_PURE_INTEGER:
384 case QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER:
385 case QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4:
386 case QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4:
387 return RequiredExtensions("GL_EXT_texture_border_clamp");
391 return RequiredExtensions();
395 static bool isCoreTester (TesterType tester)
397 return es30::isCoreTester(tester) ||
398 tester == TESTER_DEPTH_STENCIL_TEXTURE_MODE;
401 static RequiredExtensions getTesterExtension (TesterType tester)
403 #define CASE_PURE_SETTERS(X) case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
407 CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_R):
408 CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_G):
409 CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_B):
410 CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_A):
411 CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_S):
412 CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_T):
413 CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_R):
414 CASE_PURE_SETTERS(TESTER_TEXTURE_MAG_FILTER):
415 CASE_PURE_SETTERS(TESTER_TEXTURE_MIN_FILTER):
416 CASE_PURE_SETTERS(TESTER_TEXTURE_MIN_LOD):
417 CASE_PURE_SETTERS(TESTER_TEXTURE_MAX_LOD):
418 CASE_PURE_SETTERS(TESTER_TEXTURE_BASE_LEVEL):
419 CASE_PURE_SETTERS(TESTER_TEXTURE_MAX_LEVEL):
420 CASE_PURE_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
421 CASE_PURE_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
422 CASE_PURE_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE):
423 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
424 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
425 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
426 case TESTER_TEXTURE_BORDER_COLOR:
427 return RequiredExtensions("GL_EXT_texture_border_clamp");
429 case TESTER_TEXTURE_SRGB_DECODE_EXT:
430 return RequiredExtensions("GL_EXT_texture_sRGB_decode");
432 CASE_PURE_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
433 return RequiredExtensions("GL_EXT_texture_sRGB_decode", "GL_EXT_texture_border_clamp");
437 return RequiredExtensions();
440 #undef CASE_PURE_SETTERS
448 static bool isCoreTextureTarget (glw::GLenum target)
450 return es31::isCoreTextureTarget(target) ||
451 target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY ||
452 target == GL_TEXTURE_BUFFER ||
453 target == GL_TEXTURE_CUBE_MAP_ARRAY;
456 static RequiredExtensions getTextureTargetExtension (glw::GLenum target)
460 return RequiredExtensions();
463 static bool isCoreTextureParam (glw::GLenum pname)
465 return es31::isCoreTextureParam(pname) ||
466 pname == GL_TEXTURE_BORDER_COLOR;
469 static RequiredExtensions getTextureParamExtension (glw::GLenum pname)
473 case GL_TEXTURE_SRGB_DECODE_EXT: return RequiredExtensions("GL_EXT_texture_sRGB_decode");
476 return RequiredExtensions();
480 static bool isCoreQuery (QueryType query)
482 return es31::isCoreQuery(query) ||
483 query == QUERY_TEXTURE_PARAM_PURE_INTEGER ||
484 query == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER ||
485 query == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4 ||
486 query == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4 ||
487 query == QUERY_SAMPLER_PARAM_PURE_INTEGER ||
488 query == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER ||
489 query == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4 ||
490 query == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4;
493 static RequiredExtensions getQueryExtension (QueryType query)
497 return RequiredExtensions();
500 static bool isCoreTester (TesterType tester)
502 #define COMPARE_PURE_SETTERS(TESTER, X) ((TESTER) == X ## _SET_PURE_INT) || ((TESTER) == X ## _SET_PURE_UINT)
504 return es31::isCoreTester(tester) ||
505 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_R) ||
506 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_G) ||
507 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_B) ||
508 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_A) ||
509 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_S) ||
510 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_T) ||
511 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_R) ||
512 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAG_FILTER) ||
513 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MIN_FILTER) ||
514 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MIN_LOD) ||
515 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAX_LOD) ||
516 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_BASE_LEVEL) ||
517 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAX_LEVEL) ||
518 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_COMPARE_MODE) ||
519 COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_COMPARE_FUNC) ||
520 COMPARE_PURE_SETTERS(tester, TESTER_DEPTH_STENCIL_TEXTURE_MODE) ||
521 tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER ||
522 tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER ||
523 tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER ||
524 tester == TESTER_TEXTURE_BORDER_COLOR;
526 #undef COMPARE_PURE_SETTERS
529 static RequiredExtensions getTesterExtension (TesterType tester)
531 #define CASE_PURE_SETTERS(X) case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
535 CASE_PURE_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
536 case TESTER_TEXTURE_SRGB_DECODE_EXT:
537 return RequiredExtensions("GL_EXT_texture_sRGB_decode");
541 return RequiredExtensions();
544 #undef CASE_PURE_SETTERS
552 static bool isCoreTextureTarget (glw::GLenum target)
554 return es31::isCoreTextureTarget(target);
557 static RequiredExtensions getTextureTargetExtension (glw::GLenum target)
560 return RequiredExtensions();
563 static bool isCoreTextureParam (glw::GLenum pname)
565 return es31::isCoreTextureParam(pname);
568 static RequiredExtensions getTextureParamExtension (glw::GLenum pname)
571 return RequiredExtensions();
574 static bool isCoreQuery (QueryType query)
576 return es31::isCoreQuery(query);
579 static RequiredExtensions getQueryExtension (QueryType query)
582 return RequiredExtensions();
585 static bool isCoreTester (TesterType tester)
587 return es31::isCoreTester(tester);
590 static RequiredExtensions getTesterExtension (TesterType tester)
593 return RequiredExtensions();
598 static bool isCoreTextureTarget (const glu::ContextType& contextType, glw::GLenum target)
600 if (contextSupports(contextType, glu::ApiType::core(4,5)))
601 return gl45::isCoreTextureTarget(target);
602 else if (contextSupports(contextType, glu::ApiType::es(3,2)))
603 return es32::isCoreTextureTarget(target);
604 else if (contextSupports(contextType, glu::ApiType::es(3,1)))
605 return es31::isCoreTextureTarget(target);
606 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
607 return es30::isCoreTextureTarget(target);
615 static bool isCoreTextureParam (const glu::ContextType& contextType, glw::GLenum pname)
617 if (contextSupports(contextType, glu::ApiType::core(4,5)))
618 return gl45::isCoreTextureParam(pname);
619 else if (contextSupports(contextType, glu::ApiType::es(3,2)))
620 return es32::isCoreTextureParam(pname);
621 else if (contextSupports(contextType, glu::ApiType::es(3,1)))
622 return es31::isCoreTextureParam(pname);
623 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
624 return es30::isCoreTextureParam(pname);
632 static bool isCoreQuery (const glu::ContextType& contextType, QueryType query)
634 if (contextSupports(contextType, glu::ApiType::core(4,5)))
635 return gl45::isCoreQuery(query);
636 else if (contextSupports(contextType, glu::ApiType::es(3,2)))
637 return es32::isCoreQuery(query);
638 else if (contextSupports(contextType, glu::ApiType::es(3,1)))
639 return es31::isCoreQuery(query);
640 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
641 return es30::isCoreQuery(query);
649 static bool isCoreTester (const glu::ContextType& contextType, TesterType tester)
651 if (contextSupports(contextType, glu::ApiType::core(4,5)))
652 return gl45::isCoreTester(tester);
653 else if (contextSupports(contextType, glu::ApiType::es(3,2)))
654 return es32::isCoreTester(tester);
655 else if (contextSupports(contextType, glu::ApiType::es(3,1)))
656 return es31::isCoreTester(tester);
657 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
658 return es30::isCoreTester(tester);
666 static RequiredExtensions getTextureTargetExtension (const glu::ContextType& contextType, glw::GLenum target)
668 DE_ASSERT(!isCoreTextureTarget(contextType, target));
670 if (contextSupports(contextType, glu::ApiType::core(4,5)))
671 return gl45::getTextureTargetExtension(target);
672 else if (contextSupports(contextType, glu::ApiType::es(3,2)))
673 return es32::getTextureTargetExtension(target);
674 else if (contextSupports(contextType, glu::ApiType::es(3,1)))
675 return es31::getTextureTargetExtension(target);
676 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
677 return es30::getTextureTargetExtension(target);
681 return RequiredExtensions();
685 static RequiredExtensions getTextureParamExtension (const glu::ContextType& contextType, glw::GLenum pname)
687 DE_ASSERT(!isCoreTextureParam(contextType, pname));
689 if (contextSupports(contextType, glu::ApiType::core(4,5)))
690 return gl45::getTextureParamExtension(pname);
691 else if (contextSupports(contextType, glu::ApiType::es(3,2)))
692 return es32::getTextureParamExtension(pname);
693 else if (contextSupports(contextType, glu::ApiType::es(3,1)))
694 return es31::getTextureParamExtension(pname);
695 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
696 return es30::getTextureParamExtension(pname);
700 return RequiredExtensions();
704 static RequiredExtensions getQueryExtension (const glu::ContextType& contextType, QueryType query)
706 DE_ASSERT(!isCoreQuery(contextType, query));
708 if (contextSupports(contextType, glu::ApiType::core(4,5)))
709 return gl45::getQueryExtension(query);
710 else if (contextSupports(contextType, glu::ApiType::es(3,2)))
711 return es32::getQueryExtension(query);
712 else if (contextSupports(contextType, glu::ApiType::es(3,1)))
713 return es31::getQueryExtension(query);
714 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
715 return es30::getQueryExtension(query);
719 return RequiredExtensions();
723 static RequiredExtensions getTesterExtension (const glu::ContextType& contextType, TesterType tester)
725 DE_ASSERT(!isCoreTester(contextType, tester));
727 if (contextSupports(contextType, glu::ApiType::core(4,5)))
728 return gl45::getTesterExtension(tester);
729 else if (contextSupports(contextType, glu::ApiType::es(3,2)))
730 return es32::getTesterExtension(tester);
731 else if (contextSupports(contextType, glu::ApiType::es(3,1)))
732 return es31::getTesterExtension(tester);
733 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
734 return es30::getTesterExtension(tester);
738 return RequiredExtensions();
742 class TextureTest : public tcu::TestCase
745 TextureTest (tcu::TestContext& testCtx,
746 const glu::RenderContext& renderCtx,
754 IterateResult iterate (void);
756 virtual void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
759 const glu::RenderContext& m_renderCtx;
760 const glw::GLenum m_target;
761 const glw::GLenum m_pname;
762 const TesterType m_tester;
763 const QueryType m_type;
766 TextureTest::TextureTest (tcu::TestContext& testCtx,
767 const glu::RenderContext& renderCtx,
773 : TestCase (testCtx, name, desc)
774 , m_renderCtx (renderCtx)
776 , m_pname (mapTesterToPname(tester))
782 void TextureTest::init (void)
784 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx));
785 RequiredExtensions extensions;
788 if (!isCoreTextureTarget(m_renderCtx.getType(), m_target))
789 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target));
792 if (!isCoreTextureParam(m_renderCtx.getType(), m_pname))
793 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname));
796 if (!isCoreQuery(m_renderCtx.getType(), m_type))
797 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type));
800 if (!isCoreTester(m_renderCtx.getType(), m_tester))
801 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester));
803 extensions.check(*ctxInfo);
806 TextureTest::IterateResult TextureTest::iterate (void)
808 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog());
809 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
811 gl.enableLogging(true);
814 result.setTestContextResult(m_testCtx);
818 class IsTextureCase : public tcu::TestCase
821 IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target);
824 IterateResult iterate (void);
827 const glu::RenderContext& m_renderCtx;
828 const glw::GLenum m_target;
831 IsTextureCase::IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target)
832 : tcu::TestCase (testCtx, name, desc)
833 , m_renderCtx (renderCtx)
838 void IsTextureCase::init (void)
840 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx));
841 RequiredExtensions extensions;
844 if (!isCoreTextureTarget(m_renderCtx.getType(), m_target))
845 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target));
847 extensions.check(*ctxInfo);
850 IsTextureCase::IterateResult IsTextureCase::iterate (void)
852 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog());
853 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
854 glw::GLuint textureId = 0;
856 gl.enableLogging(true);
858 gl.glGenTextures(1, &textureId);
859 gl.glBindTexture(m_target, textureId);
860 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
862 verifyStateObjectBoolean(result, gl, textureId, true, QUERY_ISTEXTURE);
864 gl.glDeleteTextures(1, &textureId);
865 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
867 verifyStateObjectBoolean(result, gl, textureId, false, QUERY_ISTEXTURE);
869 result.setTestContextResult(m_testCtx);
873 class DepthStencilModeCase : public TextureTest
876 DepthStencilModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
877 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
880 DepthStencilModeCase::DepthStencilModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
881 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
885 void DepthStencilModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
887 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
888 glu::Texture texture (m_renderCtx);
890 gl.glBindTexture(m_target, *texture);
891 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind");
895 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
896 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
901 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle");
902 const glw::GLint depthComponentInt = GL_DEPTH_COMPONENT;
903 const glw::GLfloat depthComponentFloat = (glw::GLfloat)GL_DEPTH_COMPONENT;
905 gl.glTexParameteri(m_target, m_pname, GL_STENCIL_INDEX);
906 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
907 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
909 gl.glTexParameteriv(m_target, m_pname, &depthComponentInt);
910 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
911 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
913 gl.glTexParameterf(m_target, m_pname, GL_STENCIL_INDEX);
914 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
915 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
917 gl.glTexParameterfv(m_target, m_pname, &depthComponentFloat);
918 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
919 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
922 if (isPureIntTester(m_tester))
924 const glw::GLint depthComponent = GL_DEPTH_COMPONENT;
925 const glw::GLint stencilIndex = GL_STENCIL_INDEX;
927 gl.glTexParameterIiv(m_target, m_pname, &stencilIndex);
928 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
929 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
931 gl.glTexParameterIiv(m_target, m_pname, &depthComponent);
932 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
933 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
936 if (isPureUintTester(m_tester))
938 const glw::GLuint depthComponent = GL_DEPTH_COMPONENT;
939 const glw::GLuint stencilIndex = GL_STENCIL_INDEX;
941 gl.glTexParameterIuiv(m_target, m_pname, &stencilIndex);
942 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
943 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
945 gl.glTexParameterIuiv(m_target, m_pname, &depthComponent);
946 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
947 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
951 class TextureSRGBDecodeCase : public TextureTest
954 TextureSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
955 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
958 TextureSRGBDecodeCase::TextureSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
959 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
963 void TextureSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
965 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
966 glu::Texture texture (m_renderCtx);
968 gl.glBindTexture(m_target, *texture);
969 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind");
973 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
974 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
979 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle");
980 const glw::GLint decodeInt = GL_DECODE_EXT;
981 const glw::GLfloat decodeFloat = (glw::GLfloat)GL_DECODE_EXT;
983 gl.glTexParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT);
984 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
985 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
987 gl.glTexParameteriv(m_target, m_pname, &decodeInt);
988 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
989 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
991 gl.glTexParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT);
992 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
993 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
995 gl.glTexParameterfv(m_target, m_pname, &decodeFloat);
996 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
997 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
1000 if (isPureIntTester(m_tester))
1002 const glw::GLint skipDecode = GL_SKIP_DECODE_EXT;
1003 const glw::GLint decode = GL_DECODE_EXT;
1005 gl.glTexParameterIiv(m_target, m_pname, &skipDecode);
1006 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1007 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
1009 gl.glTexParameterIiv(m_target, m_pname, &decode);
1010 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1011 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
1014 if (isPureUintTester(m_tester))
1016 const glw::GLuint skipDecode = GL_SKIP_DECODE_EXT;
1017 const glw::GLuint decode = GL_DECODE_EXT;
1019 gl.glTexParameterIuiv(m_target, m_pname, &skipDecode);
1020 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1021 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
1023 gl.glTexParameterIuiv(m_target, m_pname, &decode);
1024 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1025 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
1029 class TextureSwizzleCase : public TextureTest
1032 TextureSwizzleCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1033 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1036 TextureSwizzleCase::TextureSwizzleCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1037 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1041 void TextureSwizzleCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1043 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1044 const int initialValue = (m_pname == GL_TEXTURE_SWIZZLE_R) ? (GL_RED) :
1045 (m_pname == GL_TEXTURE_SWIZZLE_G) ? (GL_GREEN) :
1046 (m_pname == GL_TEXTURE_SWIZZLE_B) ? (GL_BLUE) :
1047 (m_pname == GL_TEXTURE_SWIZZLE_A) ? (GL_ALPHA) :
1052 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1053 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1057 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1058 const GLenum swizzleValues[] = {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_ZERO, GL_ONE};
1062 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
1064 if (isPureIntTester(m_tester))
1066 const glw::GLint value = (glw::GLint)swizzleValues[ndx];
1067 gl.glTexParameterIiv(m_target, m_pname, &value);
1068 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1072 DE_ASSERT(isPureUintTester(m_tester));
1074 const glw::GLuint value = swizzleValues[ndx];
1075 gl.glTexParameterIuiv(m_target, m_pname, &value);
1076 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1079 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
1084 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
1086 gl.glTexParameteri(m_target, m_pname, swizzleValues[ndx]);
1087 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1089 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
1092 //check unit conversions with float
1094 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
1096 gl.glTexParameterf(m_target, m_pname, (GLfloat)swizzleValues[ndx]);
1097 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1099 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
1105 class TextureWrapCase : public TextureTest
1108 TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1109 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1112 TextureWrapCase::TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1113 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1117 void TextureWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1119 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1123 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1124 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type);
1128 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1129 const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
1133 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1135 if (isPureIntTester(m_tester))
1137 const glw::GLint value = (glw::GLint)wrapValues[ndx];
1138 gl.glTexParameterIiv(m_target, m_pname, &value);
1139 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1143 DE_ASSERT(isPureUintTester(m_tester));
1145 const glw::GLuint value = wrapValues[ndx];
1146 gl.glTexParameterIuiv(m_target, m_pname, &value);
1147 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1150 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1155 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1157 gl.glTexParameteri(m_target, m_pname, wrapValues[ndx]);
1158 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1160 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1163 //check unit conversions with float
1165 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1167 gl.glTexParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]);
1168 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1170 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1176 class TextureFilterCase : public TextureTest
1179 TextureFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1180 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1183 TextureFilterCase::TextureFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1184 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1188 void TextureFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1190 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1191 glw::GLenum initial = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR)
1192 : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR)
1195 const glu::ContextType& contextType = m_renderCtx.getType();
1196 const bool isCoreGL45 = glu::contextSupports(contextType, glu::ApiType::core(4, 5));
1198 /* Update initial values to match desktop context. */
1201 GLenum initialMin = (m_target == GL_TEXTURE_CUBE_MAP_ARRAY) ?
1202 GL_NEAREST_MIPMAP_LINEAR : GL_LINEAR_MIPMAP_NEAREST;
1204 if (m_pname == GL_TEXTURE_MIN_FILTER)
1206 initial = initialMin;
1208 else if (m_pname == GL_TEXTURE_MAG_FILTER)
1210 initial = GL_LINEAR;
1216 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1217 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initial, m_type);
1221 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1222 std::vector<GLenum> values;
1224 values.push_back(GL_NEAREST);
1225 values.push_back(GL_LINEAR);
1226 if (m_pname == GL_TEXTURE_MIN_FILTER)
1228 values.push_back(GL_NEAREST_MIPMAP_NEAREST);
1229 values.push_back(GL_NEAREST_MIPMAP_LINEAR);
1230 values.push_back(GL_LINEAR_MIPMAP_NEAREST);
1231 values.push_back(GL_LINEAR_MIPMAP_LINEAR);
1236 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1238 if (isPureIntTester(m_tester))
1240 const glw::GLint value = (glw::GLint)values[ndx];
1241 gl.glTexParameterIiv(m_target, m_pname, &value);
1242 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1246 DE_ASSERT(isPureUintTester(m_tester));
1248 const glw::GLuint value = values[ndx];
1249 gl.glTexParameterIuiv(m_target, m_pname, &value);
1250 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1253 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1258 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1260 gl.glTexParameteri(m_target, m_pname, values[ndx]);
1261 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1263 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1266 //check unit conversions with float
1268 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1270 gl.glTexParameterf(m_target, m_pname, (GLfloat)values[ndx]);
1271 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1273 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1279 class TextureLODCase : public TextureTest
1282 TextureLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1283 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1286 TextureLODCase::TextureLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1287 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1291 void TextureLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1293 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1294 const int initialValue = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000)
1295 : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000)
1298 if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase)
1300 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1301 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1305 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1306 const int numIterations = 20;
1307 de::Random rnd (0xabcdef);
1311 if (isPureIntTester(m_tester))
1313 for (int ndx = 0; ndx < numIterations; ++ndx)
1315 const GLint ref = rnd.getInt(-1000, 1000);
1317 gl.glTexParameterIiv(m_target, m_pname, &ref);
1318 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1320 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1325 DE_ASSERT(isPureUintTester(m_tester));
1327 for (int ndx = 0; ndx < numIterations; ++ndx)
1329 const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000);
1331 gl.glTexParameterIuiv(m_target, m_pname, &ref);
1332 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1334 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1340 const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0);
1342 for (int ndx = 0; ndx < numIterations; ++ndx)
1344 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f);
1346 gl.glTexParameterf(m_target, m_pname, ref);
1347 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1349 verifyStateTextureParamFloat(result, gl, m_target, m_pname, ref, m_type);
1352 // check unit conversions with int
1354 for (int ndx = 0; ndx < numIterations; ++ndx)
1356 const GLint ref = rnd.getInt(minLimit, 1000);
1358 gl.glTexParameteri(m_target, m_pname, ref);
1359 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1361 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1367 class TextureLevelCase : public TextureTest
1370 TextureLevelCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1371 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1374 TextureLevelCase::TextureLevelCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1375 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1379 void TextureLevelCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1381 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1382 const int initialValue = (m_pname == GL_TEXTURE_BASE_LEVEL) ? (0)
1383 : (m_pname == GL_TEXTURE_MAX_LEVEL) ? (1000)
1388 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1389 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1392 if (m_target == GL_TEXTURE_2D_MULTISAMPLE ||
1393 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1397 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Set");
1399 gl.glTexParameteri(m_target, m_pname, 0);
1400 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1401 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1403 gl.glTexParameterf(m_target, m_pname, 0.0f);
1404 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1405 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1410 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1411 const int numIterations = 20;
1412 de::Random rnd (0xabcdef);
1416 for (int ndx = 0; ndx < numIterations; ++ndx)
1418 const GLint ref = rnd.getInt(0, 64000);
1419 const GLuint uRef = (glw::GLuint)ref;
1421 if (isPureIntTester(m_tester))
1423 gl.glTexParameterIiv(m_target, m_pname, &ref);
1424 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1428 DE_ASSERT(isPureUintTester(m_tester));
1429 gl.glTexParameterIuiv(m_target, m_pname, &uRef);
1430 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1433 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1438 for (int ndx = 0; ndx < numIterations; ++ndx)
1440 const GLint ref = rnd.getInt(0, 64000);
1442 gl.glTexParameteri(m_target, m_pname, ref);
1443 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1445 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1448 // check unit conversions with float
1450 const float nonSignificantOffsets[] = {-0.45f, -0.25f, 0, 0.45f}; // offsets O so that for any integers z in Z, o in O roundToClosestInt(z+o)==z
1452 const int numConversionIterations = 30;
1453 for (int ndx = 0; ndx < numConversionIterations; ++ndx)
1455 const GLint ref = rnd.getInt(1, 64000);
1457 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(nonSignificantOffsets); ++offsetNdx)
1459 gl.glTexParameterf(m_target, m_pname, ((GLfloat)ref) + nonSignificantOffsets[offsetNdx]);
1460 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1462 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1469 class TextureCompareModeCase : public TextureTest
1472 TextureCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1473 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1476 TextureCompareModeCase::TextureCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1477 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1481 void TextureCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1483 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1487 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1488 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type);
1492 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1493 const GLenum modes[] = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE};
1497 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1499 if (isPureIntTester(m_tester))
1501 const glw::GLint value = (glw::GLint)modes[ndx];
1502 gl.glTexParameterIiv(m_target, m_pname, &value);
1503 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1507 DE_ASSERT(isPureUintTester(m_tester));
1509 const glw::GLuint value = modes[ndx];
1510 gl.glTexParameterIuiv(m_target, m_pname, &value);
1511 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1514 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1519 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1521 gl.glTexParameteri(m_target, m_pname, modes[ndx]);
1522 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1524 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1527 //check unit conversions with float
1529 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1531 gl.glTexParameterf(m_target, m_pname, (GLfloat)modes[ndx]);
1532 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1534 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1540 class TextureCompareFuncCase : public TextureTest
1543 TextureCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1544 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1547 TextureCompareFuncCase::TextureCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1548 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1552 void TextureCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1554 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1558 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1559 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type);
1563 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1564 const GLenum compareFuncs[] = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER};
1568 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1570 if (isPureIntTester(m_tester))
1572 const glw::GLint value = (glw::GLint)compareFuncs[ndx];
1573 gl.glTexParameterIiv(m_target, m_pname, &value);
1574 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1578 DE_ASSERT(isPureUintTester(m_tester));
1580 const glw::GLuint value = compareFuncs[ndx];
1581 gl.glTexParameterIuiv(m_target, m_pname, &value);
1582 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1585 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1590 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1592 gl.glTexParameteri(m_target, m_pname, compareFuncs[ndx]);
1593 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1595 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1598 //check unit conversions with float
1600 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1602 gl.glTexParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]);
1603 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1605 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1611 class TextureImmutableLevelsCase : public TextureTest
1614 TextureImmutableLevelsCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1615 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1618 TextureImmutableLevelsCase::TextureImmutableLevelsCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1619 : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_LEVELS, type)
1623 void TextureImmutableLevelsCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1626 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1627 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1630 if (m_target == GL_TEXTURE_2D_MULTISAMPLE ||
1631 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1634 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Level", "Level");
1635 GLuint textureID = 0;
1637 gl.glGenTextures(1, &textureID);
1638 gl.glBindTexture(m_target, textureID);
1639 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1641 if (m_target == GL_TEXTURE_2D_MULTISAMPLE)
1642 gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE);
1643 else if (m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1644 gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE);
1647 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage");
1649 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type);
1651 gl.glDeleteTextures(1, &textureID);
1652 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1656 for (int level = 1; level <= 7; ++level)
1658 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Levels", "Levels = " + de::toString(level));
1659 GLuint textureID = 0;
1661 gl.glGenTextures(1, &textureID);
1662 gl.glBindTexture(m_target, textureID);
1663 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1665 if (m_target == GL_TEXTURE_2D || m_target == GL_TEXTURE_CUBE_MAP)
1666 gl.glTexStorage2D(m_target, level, GL_RGB8, 64, 64);
1667 else if (m_target == GL_TEXTURE_2D_ARRAY || m_target == GL_TEXTURE_3D)
1668 gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 64);
1669 else if (m_target == GL_TEXTURE_CUBE_MAP_ARRAY)
1670 gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 6 * 2);
1673 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage");
1675 verifyStateTextureParamInteger(result, gl, m_target, m_pname, level, m_type);
1677 gl.glDeleteTextures(1, &textureID);
1678 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1683 class TextureImmutableFormatCase : public TextureTest
1686 TextureImmutableFormatCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1687 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1690 TextureImmutableFormatCase::TextureImmutableFormatCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1691 : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_FORMAT, type)
1695 void TextureImmutableFormatCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1698 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1699 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1703 const tcu::ScopedLogSection subsection (m_testCtx.getLog(), "Immutable", "Immutable");
1704 GLuint textureID = 0;
1706 gl.glGenTextures(1, &textureID);
1707 gl.glBindTexture(m_target, textureID);
1708 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1713 case GL_TEXTURE_CUBE_MAP:
1715 gl.glTexStorage2D(m_target, 1, GL_RGBA8, 32, 32);
1718 case GL_TEXTURE_2D_ARRAY:
1721 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 8);
1724 case GL_TEXTURE_2D_MULTISAMPLE:
1726 gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE);
1729 case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
1731 gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE);
1734 case GL_TEXTURE_CUBE_MAP_ARRAY:
1736 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 6 * 2);
1742 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture");
1744 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type);
1746 gl.glDeleteTextures(1, &textureID);
1747 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1751 if (m_target == GL_TEXTURE_2D_MULTISAMPLE ||
1752 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1757 const tcu::ScopedLogSection subsection (m_testCtx.getLog(), "Mutable", "Mutable");
1758 GLuint textureID = 0;
1760 gl.glGenTextures(1, &textureID);
1761 gl.glBindTexture(m_target, textureID);
1762 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1768 gl.glTexImage2D(m_target, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1771 case GL_TEXTURE_CUBE_MAP:
1773 gl.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1776 case GL_TEXTURE_2D_ARRAY:
1779 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1782 case GL_TEXTURE_CUBE_MAP_ARRAY:
1784 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 6 * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1790 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture");
1792 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1794 gl.glDeleteTextures(1, &textureID);
1795 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1799 class TextureWrapClampToBorderCase : public TextureTest
1802 TextureWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1803 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1806 TextureWrapClampToBorderCase::TextureWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1807 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1811 void TextureWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1813 gl.glTexParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT);
1814 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1815 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
1817 gl.glTexParameteri(m_target, m_pname, GL_REPEAT);
1818 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1820 gl.glTexParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT);
1821 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1823 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
1826 class TextureBorderColorCase : public TextureTest
1829 TextureBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1830 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1833 TextureBorderColorCase::TextureBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1834 : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_BORDER_COLOR, type)
1838 void TextureBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1840 // border color is undefined if queried with pure type and was not set to pure value
1841 if (m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4)
1843 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1844 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type);
1847 if (m_type == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4)
1849 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1850 const tcu::IVec4 color (0x7FFFFFFF, -2, 3, -128);
1852 gl.glTexParameterIiv(m_target, m_pname, color.getPtr());
1853 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1855 verifyStateTextureParamIntegerVec4(result, gl, m_target, m_pname, color, m_type);
1857 else if (m_type == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4)
1859 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1860 const tcu::UVec4 color (0x8000000ul, 2, 3, 128);
1862 gl.glTexParameterIuiv(m_target, m_pname, color.getPtr());
1863 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1865 verifyStateTextureParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type);
1869 DE_ASSERT(m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4);
1871 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1872 const tcu::Vec4 color (0.25f, 1.0f, 0.0f, 0.77f);
1873 const tcu::IVec4 icolor (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF);
1875 gl.glTexParameterfv(m_target, m_pname, color.getPtr());
1876 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterfv");
1878 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, color, m_type);
1880 gl.glTexParameteriv(m_target, m_pname, icolor.getPtr());
1881 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteriv");
1883 verifyStateTextureParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type);
1887 class SamplerTest : public tcu::TestCase
1890 SamplerTest (tcu::TestContext& testCtx,
1891 const glu::RenderContext& renderCtx,
1898 IterateResult iterate (void);
1900 virtual void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
1903 const glu::RenderContext& m_renderCtx;
1904 const glw::GLenum m_pname;
1905 const TesterType m_tester;
1906 const QueryType m_type;
1907 glw::GLuint m_target;
1910 SamplerTest::SamplerTest (tcu::TestContext& testCtx,
1911 const glu::RenderContext& renderCtx,
1916 : TestCase (testCtx, name, desc)
1917 , m_renderCtx (renderCtx)
1918 , m_pname (mapTesterToPname(tester))
1925 void SamplerTest::init (void)
1927 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx));
1928 RequiredExtensions extensions;
1931 if (!isCoreTextureParam(m_renderCtx.getType(), m_pname))
1932 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname));
1935 if (!isCoreQuery(m_renderCtx.getType(), m_type))
1936 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type));
1939 if (!isCoreTester(m_renderCtx.getType(), m_tester))
1940 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester));
1942 extensions.check(*ctxInfo);
1945 SamplerTest::IterateResult SamplerTest::iterate (void)
1947 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog());
1948 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
1949 glu::Sampler sampler (m_renderCtx);
1951 gl.enableLogging(true);
1953 m_target = *sampler;
1957 result.setTestContextResult(m_testCtx);
1961 class SamplerWrapCase : public SamplerTest
1964 SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1965 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1968 SamplerWrapCase::SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1969 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1973 void SamplerWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1975 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1979 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1980 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type);
1984 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1985 const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
1989 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1991 if (isPureIntTester(m_tester))
1993 const glw::GLint value = (glw::GLint)wrapValues[ndx];
1994 gl.glSamplerParameterIiv(m_target, m_pname, &value);
1995 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1999 DE_ASSERT(isPureUintTester(m_tester));
2001 const glw::GLuint value = wrapValues[ndx];
2002 gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2003 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2006 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
2011 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
2013 gl.glSamplerParameteri(m_target, m_pname, wrapValues[ndx]);
2014 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2016 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
2019 //check unit conversions with float
2021 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
2023 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]);
2024 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2026 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
2032 class SamplerFilterCase : public SamplerTest
2035 SamplerFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2036 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2039 SamplerFilterCase::SamplerFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2040 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2044 void SamplerFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2046 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2047 const glw::GLenum initial = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR)
2048 : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR)
2053 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2054 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initial, m_type);
2058 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2059 std::vector<GLenum> values;
2061 values.push_back(GL_NEAREST);
2062 values.push_back(GL_LINEAR);
2063 if (m_pname == GL_TEXTURE_MIN_FILTER)
2065 values.push_back(GL_NEAREST_MIPMAP_NEAREST);
2066 values.push_back(GL_NEAREST_MIPMAP_LINEAR);
2067 values.push_back(GL_LINEAR_MIPMAP_NEAREST);
2068 values.push_back(GL_LINEAR_MIPMAP_LINEAR);
2073 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
2075 if (isPureIntTester(m_tester))
2077 const glw::GLint value = (glw::GLint)values[ndx];
2078 gl.glSamplerParameterIiv(m_target, m_pname, &value);
2079 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2083 DE_ASSERT(isPureUintTester(m_tester));
2085 const glw::GLuint value = values[ndx];
2086 gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2087 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2090 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
2095 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
2097 gl.glSamplerParameteri(m_target, m_pname, values[ndx]);
2098 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2100 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
2103 //check unit conversions with float
2105 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
2107 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)values[ndx]);
2108 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2110 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
2116 class SamplerLODCase : public SamplerTest
2119 SamplerLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2120 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2123 SamplerLODCase::SamplerLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2124 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2128 void SamplerLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2130 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2131 const int initialValue = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000)
2132 : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000)
2135 if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase)
2137 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2138 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
2142 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2143 const int numIterations = 20;
2144 de::Random rnd (0xabcdef);
2148 if (isPureIntTester(m_tester))
2150 for (int ndx = 0; ndx < numIterations; ++ndx)
2152 const GLint ref = rnd.getInt(-1000, 1000);
2154 gl.glSamplerParameterIiv(m_target, m_pname, &ref);
2155 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2157 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
2162 DE_ASSERT(isPureUintTester(m_tester));
2164 for (int ndx = 0; ndx < numIterations; ++ndx)
2166 const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000);
2168 gl.glSamplerParameterIuiv(m_target, m_pname, &ref);
2169 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2171 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
2177 const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0);
2179 for (int ndx = 0; ndx < numIterations; ++ndx)
2181 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f);
2183 gl.glSamplerParameterf(m_target, m_pname, ref);
2184 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2186 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, ref, m_type);
2189 // check unit conversions with int
2191 for (int ndx = 0; ndx < numIterations; ++ndx)
2193 const GLint ref = rnd.getInt(minLimit, 1000);
2195 gl.glSamplerParameteri(m_target, m_pname, ref);
2196 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2198 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
2204 class SamplerCompareModeCase : public SamplerTest
2207 SamplerCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2208 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2211 SamplerCompareModeCase::SamplerCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2212 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2216 void SamplerCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2218 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2222 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2223 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type);
2227 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2228 const GLenum modes[] = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE};
2232 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2234 if (isPureIntTester(m_tester))
2236 const glw::GLint value = (glw::GLint)modes[ndx];
2237 gl.glSamplerParameterIiv(m_target, m_pname, &value);
2238 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2242 DE_ASSERT(isPureUintTester(m_tester));
2244 const glw::GLuint value = modes[ndx];
2245 gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2246 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2249 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2254 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2256 gl.glSamplerParameteri(m_target, m_pname, modes[ndx]);
2257 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2259 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2262 //check unit conversions with float
2264 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2266 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)modes[ndx]);
2267 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2269 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2275 class SamplerCompareFuncCase : public SamplerTest
2278 SamplerCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2279 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2282 SamplerCompareFuncCase::SamplerCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2283 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2287 void SamplerCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2289 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2293 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2294 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type);
2298 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2299 const GLenum compareFuncs[] = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER};
2303 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2305 if (isPureIntTester(m_tester))
2307 const glw::GLint value = (glw::GLint)compareFuncs[ndx];
2308 gl.glSamplerParameterIiv(m_target, m_pname, &value);
2309 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2313 DE_ASSERT(isPureUintTester(m_tester));
2315 const glw::GLuint value = compareFuncs[ndx];
2316 gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2317 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2320 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2325 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2327 gl.glSamplerParameteri(m_target, m_pname, compareFuncs[ndx]);
2328 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2330 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2333 //check unit conversions with float
2335 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2337 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]);
2338 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2340 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2346 class SamplerWrapClampToBorderCase : public SamplerTest
2349 SamplerWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2350 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2353 SamplerWrapClampToBorderCase::SamplerWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2354 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2358 void SamplerWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2360 gl.glSamplerParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT);
2361 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2362 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
2364 gl.glSamplerParameteri(m_target, m_pname, GL_REPEAT);
2365 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2367 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT);
2368 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2370 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
2373 class SamplerSRGBDecodeCase : public SamplerTest
2376 SamplerSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2377 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2380 SamplerSRGBDecodeCase::SamplerSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2381 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2385 void SamplerSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2387 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2391 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2392 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2396 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle");
2397 const glw::GLint decodeInt = GL_DECODE_EXT;
2398 const glw::GLfloat decodeFloat = (glw::GLfloat)GL_DECODE_EXT;
2400 gl.glSamplerParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT);
2401 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2402 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2404 gl.glSamplerParameteriv(m_target, m_pname, &decodeInt);
2405 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2406 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2408 gl.glSamplerParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT);
2409 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2410 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2412 gl.glSamplerParameterfv(m_target, m_pname, &decodeFloat);
2413 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2414 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2417 if (isPureIntTester(m_tester))
2419 const glw::GLint skipDecode = GL_SKIP_DECODE_EXT;
2420 const glw::GLint decode = GL_DECODE_EXT;
2422 gl.glSamplerParameterIiv(m_target, m_pname, &skipDecode);
2423 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2424 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2426 gl.glSamplerParameterIiv(m_target, m_pname, &decode);
2427 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2428 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2431 if (isPureUintTester(m_tester))
2433 const glw::GLuint skipDecode = GL_SKIP_DECODE_EXT;
2434 const glw::GLuint decode = GL_DECODE_EXT;
2436 gl.glSamplerParameterIuiv(m_target, m_pname, &skipDecode);
2437 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2438 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2440 gl.glSamplerParameterIuiv(m_target, m_pname, &decode);
2441 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2442 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2446 class SamplerBorderColorCase : public SamplerTest
2449 SamplerBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, QueryType type);
2450 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2453 SamplerBorderColorCase::SamplerBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, QueryType type)
2454 : SamplerTest(testCtx, renderCtx, name, desc, TESTER_TEXTURE_BORDER_COLOR, type)
2456 DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 ||
2457 m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4 ||
2458 m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4 ||
2459 m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4);
2462 void SamplerBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2464 // border color is undefined if queried with pure type and was not set to pure value
2465 if (m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4)
2467 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2468 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type);
2471 if (m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4)
2473 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2474 const tcu::IVec4 color (0x7FFFFFFF, -2, 3, -128);
2476 gl.glSamplerParameterIiv(m_target, m_pname, color.getPtr());
2477 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2479 verifyStateSamplerParamIntegerVec4(result, gl, m_target, m_pname, color, m_type);
2481 else if (m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4)
2483 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2484 const tcu::UVec4 color (0x8000000ul, 2, 3, 128);
2486 gl.glSamplerParameterIuiv(m_target, m_pname, color.getPtr());
2487 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2489 verifyStateSamplerParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type);
2493 DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4);
2495 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2496 const tcu::Vec4 color (0.25f, 1.0f, 0.0f, 0.77f);
2497 const tcu::IVec4 icolor (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF);
2499 gl.glSamplerParameterfv(m_target, m_pname, color.getPtr());
2500 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterfv");
2502 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, color, m_type);
2504 gl.glSamplerParameteriv(m_target, m_pname, icolor.getPtr());
2505 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteriv");
2507 verifyStateSamplerParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type);
2513 bool isLegalTesterForTarget (glw::GLenum target, TesterType tester)
2515 // no 3d filtering on 2d targets
2516 if ((tester == TESTER_TEXTURE_WRAP_R || tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER) && target != GL_TEXTURE_3D)
2519 // no sampling on multisample
2520 if (isMultisampleTarget(target) && isSamplerStateTester(tester))
2523 // no states in buffer
2524 if (target == GL_TEXTURE_BUFFER)
2530 bool isMultisampleTarget (glw::GLenum target)
2532 return target == GL_TEXTURE_2D_MULTISAMPLE ||
2533 target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
2536 bool isSamplerStateTester (TesterType tester)
2538 return tester == TESTER_TEXTURE_WRAP_S ||
2539 tester == TESTER_TEXTURE_WRAP_T ||
2540 tester == TESTER_TEXTURE_WRAP_R ||
2541 tester == TESTER_TEXTURE_MAG_FILTER ||
2542 tester == TESTER_TEXTURE_MIN_FILTER ||
2543 tester == TESTER_TEXTURE_MIN_LOD ||
2544 tester == TESTER_TEXTURE_MAX_LOD ||
2545 tester == TESTER_TEXTURE_COMPARE_MODE ||
2546 tester == TESTER_TEXTURE_COMPARE_FUNC ||
2547 tester == TESTER_TEXTURE_SRGB_DECODE_EXT ||
2548 tester == TESTER_TEXTURE_BORDER_COLOR ||
2549 tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER ||
2550 tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER ||
2551 tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER;
2554 tcu::TestCase* createIsTextureTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, glw::GLenum target)
2556 return new IsTextureCase(testCtx, renderCtx, name.c_str(), description.c_str(), target);
2559 tcu::TestCase* createTexParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, QueryType queryType, glw::GLenum target, TesterType tester)
2561 if (isMultisampleTarget(target) && isSamplerStateTester(tester))
2563 DE_FATAL("Multisample textures have no sampler state");
2566 if (target == GL_TEXTURE_BUFFER)
2568 DE_FATAL("Buffer textures have no texture state");
2571 if (target != GL_TEXTURE_3D && mapTesterToPname(tester) == GL_TEXTURE_WRAP_R)
2573 DE_FATAL("Only 3D textures have wrap r filter");
2577 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
2581 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R):
2582 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G):
2583 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B):
2584 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A):
2585 return new TextureSwizzleCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2587 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
2588 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
2589 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
2590 return new TextureWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2592 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):
2593 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):
2594 return new TextureFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2596 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):
2597 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):
2598 return new TextureLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2600 CASE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL):
2601 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL):
2602 return new TextureLevelCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2604 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
2605 return new TextureCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2607 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
2608 return new TextureCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2610 case TESTER_TEXTURE_IMMUTABLE_LEVELS:
2611 return new TextureImmutableLevelsCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2613 case TESTER_TEXTURE_IMMUTABLE_FORMAT:
2614 return new TextureImmutableFormatCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2616 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
2617 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
2618 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
2619 return new TextureWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2621 CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE):
2622 return new DepthStencilModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2624 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
2625 return new TextureSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2627 case TESTER_TEXTURE_BORDER_COLOR:
2628 return new TextureBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2634 #undef CASE_ALL_SETTERS
2640 tcu::TestCase* createSamplerParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, StateQueryUtil::QueryType queryType, TesterType tester)
2642 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
2646 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
2647 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
2648 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
2649 return new SamplerWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2651 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):
2652 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):
2653 return new SamplerFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2655 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):
2656 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):
2657 return new SamplerLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2659 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
2660 return new SamplerCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2662 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
2663 return new SamplerCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2665 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
2666 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
2667 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
2668 return new SamplerWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2670 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
2671 return new SamplerSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2673 case TESTER_TEXTURE_BORDER_COLOR:
2674 return new SamplerBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), queryType);
2680 #undef CASE_ALL_SETTERS
2686 } // TextureStateQueryTests