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
445 static bool isCoreTextureTarget (const glu::ContextType& contextType, glw::GLenum target)
447 if (contextSupports(contextType, glu::ApiType::es(3,1)))
448 return es31::isCoreTextureTarget(target);
449 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
450 return es30::isCoreTextureTarget(target);
458 static bool isCoreTextureParam (const glu::ContextType& contextType, glw::GLenum pname)
460 if (contextSupports(contextType, glu::ApiType::es(3,1)))
461 return es31::isCoreTextureParam(pname);
462 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
463 return es30::isCoreTextureParam(pname);
471 static bool isCoreQuery (const glu::ContextType& contextType, QueryType query)
473 if (contextSupports(contextType, glu::ApiType::es(3,1)))
474 return es31::isCoreQuery(query);
475 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
476 return es30::isCoreQuery(query);
484 static bool isCoreTester (const glu::ContextType& contextType, TesterType tester)
486 if (contextSupports(contextType, glu::ApiType::es(3,1)))
487 return es31::isCoreTester(tester);
488 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
489 return es30::isCoreTester(tester);
497 static RequiredExtensions getTextureTargetExtension (const glu::ContextType& contextType, glw::GLenum target)
499 DE_ASSERT(!isCoreTextureTarget(contextType, target));
501 if (contextSupports(contextType, glu::ApiType::es(3,1)))
502 return es31::getTextureTargetExtension(target);
503 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
504 return es30::getTextureTargetExtension(target);
508 return RequiredExtensions();
512 static RequiredExtensions getTextureParamExtension (const glu::ContextType& contextType, glw::GLenum pname)
514 DE_ASSERT(!isCoreTextureParam(contextType, pname));
516 if (contextSupports(contextType, glu::ApiType::es(3,1)))
517 return es31::getTextureParamExtension(pname);
518 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
519 return es30::getTextureParamExtension(pname);
523 return RequiredExtensions();
527 static RequiredExtensions getQueryExtension (const glu::ContextType& contextType, QueryType query)
529 DE_ASSERT(!isCoreQuery(contextType, query));
531 if (contextSupports(contextType, glu::ApiType::es(3,1)))
532 return es31::getQueryExtension(query);
533 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
534 return es30::getQueryExtension(query);
538 return RequiredExtensions();
542 static RequiredExtensions getTesterExtension (const glu::ContextType& contextType, TesterType tester)
544 DE_ASSERT(!isCoreTester(contextType, tester));
546 if (contextSupports(contextType, glu::ApiType::es(3,1)))
547 return es31::getTesterExtension(tester);
548 else if (contextSupports(contextType, glu::ApiType::es(3,0)))
549 return es30::getTesterExtension(tester);
553 return RequiredExtensions();
557 class TextureTest : public tcu::TestCase
560 TextureTest (tcu::TestContext& testCtx,
561 const glu::RenderContext& renderCtx,
569 IterateResult iterate (void);
571 virtual void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
574 const glu::RenderContext& m_renderCtx;
575 const glw::GLenum m_target;
576 const glw::GLenum m_pname;
577 const TesterType m_tester;
578 const QueryType m_type;
581 TextureTest::TextureTest (tcu::TestContext& testCtx,
582 const glu::RenderContext& renderCtx,
588 : TestCase (testCtx, name, desc)
589 , m_renderCtx (renderCtx)
591 , m_pname (mapTesterToPname(tester))
597 void TextureTest::init (void)
599 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx));
600 RequiredExtensions extensions;
603 if (!isCoreTextureTarget(m_renderCtx.getType(), m_target))
604 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target));
607 if (!isCoreTextureParam(m_renderCtx.getType(), m_pname))
608 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname));
611 if (!isCoreQuery(m_renderCtx.getType(), m_type))
612 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type));
615 if (!isCoreTester(m_renderCtx.getType(), m_tester))
616 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester));
618 extensions.check(*ctxInfo);
621 TextureTest::IterateResult TextureTest::iterate (void)
623 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog());
624 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
626 gl.enableLogging(true);
629 result.setTestContextResult(m_testCtx);
633 class IsTextureCase : public tcu::TestCase
636 IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target);
639 IterateResult iterate (void);
642 const glu::RenderContext& m_renderCtx;
643 const glw::GLenum m_target;
646 IsTextureCase::IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target)
647 : tcu::TestCase (testCtx, name, desc)
648 , m_renderCtx (renderCtx)
653 void IsTextureCase::init (void)
655 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx));
656 RequiredExtensions extensions;
659 if (!isCoreTextureTarget(m_renderCtx.getType(), m_target))
660 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target));
662 extensions.check(*ctxInfo);
665 IsTextureCase::IterateResult IsTextureCase::iterate (void)
667 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog());
668 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
669 glw::GLuint textureId = 0;
671 gl.enableLogging(true);
673 gl.glGenTextures(1, &textureId);
674 gl.glBindTexture(m_target, textureId);
675 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
677 verifyStateObjectBoolean(result, gl, textureId, true, QUERY_ISTEXTURE);
679 gl.glDeleteTextures(1, &textureId);
680 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
682 verifyStateObjectBoolean(result, gl, textureId, false, QUERY_ISTEXTURE);
684 result.setTestContextResult(m_testCtx);
688 class DepthStencilModeCase : public TextureTest
691 DepthStencilModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
692 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
695 DepthStencilModeCase::DepthStencilModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
696 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
700 void DepthStencilModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
702 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
703 glu::Texture texture (m_renderCtx);
705 gl.glBindTexture(m_target, *texture);
706 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind");
710 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
711 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
716 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle");
717 const glw::GLint depthComponentInt = GL_DEPTH_COMPONENT;
718 const glw::GLfloat depthComponentFloat = (glw::GLfloat)GL_DEPTH_COMPONENT;
720 gl.glTexParameteri(m_target, m_pname, GL_STENCIL_INDEX);
721 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
722 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
724 gl.glTexParameteriv(m_target, m_pname, &depthComponentInt);
725 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
726 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
728 gl.glTexParameterf(m_target, m_pname, GL_STENCIL_INDEX);
729 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
730 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
732 gl.glTexParameterfv(m_target, m_pname, &depthComponentFloat);
733 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
734 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
737 if (isPureIntTester(m_tester))
739 const glw::GLint depthComponent = GL_DEPTH_COMPONENT;
740 const glw::GLint stencilIndex = GL_STENCIL_INDEX;
742 gl.glTexParameterIiv(m_target, m_pname, &stencilIndex);
743 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
744 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
746 gl.glTexParameterIiv(m_target, m_pname, &depthComponent);
747 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
748 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
751 if (isPureUintTester(m_tester))
753 const glw::GLuint depthComponent = GL_DEPTH_COMPONENT;
754 const glw::GLuint stencilIndex = GL_STENCIL_INDEX;
756 gl.glTexParameterIuiv(m_target, m_pname, &stencilIndex);
757 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
758 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
760 gl.glTexParameterIuiv(m_target, m_pname, &depthComponent);
761 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
762 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
766 class TextureSRGBDecodeCase : public TextureTest
769 TextureSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
770 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
773 TextureSRGBDecodeCase::TextureSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
774 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
778 void TextureSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
780 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
781 glu::Texture texture (m_renderCtx);
783 gl.glBindTexture(m_target, *texture);
784 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind");
788 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
789 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
794 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle");
795 const glw::GLint decodeInt = GL_DECODE_EXT;
796 const glw::GLfloat decodeFloat = (glw::GLfloat)GL_DECODE_EXT;
798 gl.glTexParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT);
799 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
800 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
802 gl.glTexParameteriv(m_target, m_pname, &decodeInt);
803 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
804 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
806 gl.glTexParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT);
807 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
808 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
810 gl.glTexParameterfv(m_target, m_pname, &decodeFloat);
811 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
812 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
815 if (isPureIntTester(m_tester))
817 const glw::GLint skipDecode = GL_SKIP_DECODE_EXT;
818 const glw::GLint decode = GL_DECODE_EXT;
820 gl.glTexParameterIiv(m_target, m_pname, &skipDecode);
821 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
822 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
824 gl.glTexParameterIiv(m_target, m_pname, &decode);
825 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
826 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
829 if (isPureUintTester(m_tester))
831 const glw::GLuint skipDecode = GL_SKIP_DECODE_EXT;
832 const glw::GLuint decode = GL_DECODE_EXT;
834 gl.glTexParameterIuiv(m_target, m_pname, &skipDecode);
835 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
836 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
838 gl.glTexParameterIuiv(m_target, m_pname, &decode);
839 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
840 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
844 class TextureSwizzleCase : public TextureTest
847 TextureSwizzleCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
848 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
851 TextureSwizzleCase::TextureSwizzleCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
852 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
856 void TextureSwizzleCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
858 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
859 const int initialValue = (m_pname == GL_TEXTURE_SWIZZLE_R) ? (GL_RED) :
860 (m_pname == GL_TEXTURE_SWIZZLE_G) ? (GL_GREEN) :
861 (m_pname == GL_TEXTURE_SWIZZLE_B) ? (GL_BLUE) :
862 (m_pname == GL_TEXTURE_SWIZZLE_A) ? (GL_ALPHA) :
867 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
868 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
872 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
873 const GLenum swizzleValues[] = {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_ZERO, GL_ONE};
877 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
879 if (isPureIntTester(m_tester))
881 const glw::GLint value = (glw::GLint)swizzleValues[ndx];
882 gl.glTexParameterIiv(m_target, m_pname, &value);
883 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
887 DE_ASSERT(isPureUintTester(m_tester));
889 const glw::GLuint value = swizzleValues[ndx];
890 gl.glTexParameterIuiv(m_target, m_pname, &value);
891 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
894 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
899 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
901 gl.glTexParameteri(m_target, m_pname, swizzleValues[ndx]);
902 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
904 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
907 //check unit conversions with float
909 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
911 gl.glTexParameterf(m_target, m_pname, (GLfloat)swizzleValues[ndx]);
912 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
914 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
920 class TextureWrapCase : public TextureTest
923 TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
924 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
927 TextureWrapCase::TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
928 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
932 void TextureWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
934 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
938 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
939 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type);
943 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
944 const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
948 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
950 if (isPureIntTester(m_tester))
952 const glw::GLint value = (glw::GLint)wrapValues[ndx];
953 gl.glTexParameterIiv(m_target, m_pname, &value);
954 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
958 DE_ASSERT(isPureUintTester(m_tester));
960 const glw::GLuint value = wrapValues[ndx];
961 gl.glTexParameterIuiv(m_target, m_pname, &value);
962 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
965 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
970 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
972 gl.glTexParameteri(m_target, m_pname, wrapValues[ndx]);
973 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
975 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
978 //check unit conversions with float
980 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
982 gl.glTexParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]);
983 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
985 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
991 class TextureFilterCase : public TextureTest
994 TextureFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
995 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
998 TextureFilterCase::TextureFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
999 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1003 void TextureFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1005 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1006 const glw::GLenum initial = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR)
1007 : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR)
1012 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1013 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initial, m_type);
1017 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1018 std::vector<GLenum> values;
1020 values.push_back(GL_NEAREST);
1021 values.push_back(GL_LINEAR);
1022 if (m_pname == GL_TEXTURE_MIN_FILTER)
1024 values.push_back(GL_NEAREST_MIPMAP_NEAREST);
1025 values.push_back(GL_NEAREST_MIPMAP_LINEAR);
1026 values.push_back(GL_LINEAR_MIPMAP_NEAREST);
1027 values.push_back(GL_LINEAR_MIPMAP_LINEAR);
1032 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1034 if (isPureIntTester(m_tester))
1036 const glw::GLint value = (glw::GLint)values[ndx];
1037 gl.glTexParameterIiv(m_target, m_pname, &value);
1038 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1042 DE_ASSERT(isPureUintTester(m_tester));
1044 const glw::GLuint value = values[ndx];
1045 gl.glTexParameterIuiv(m_target, m_pname, &value);
1046 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1049 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1054 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1056 gl.glTexParameteri(m_target, m_pname, values[ndx]);
1057 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1059 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1062 //check unit conversions with float
1064 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1066 gl.glTexParameterf(m_target, m_pname, (GLfloat)values[ndx]);
1067 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1069 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1075 class TextureLODCase : public TextureTest
1078 TextureLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1079 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1082 TextureLODCase::TextureLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1083 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1087 void TextureLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1089 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1090 const int initialValue = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000)
1091 : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000)
1094 if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase)
1096 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1097 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1101 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1102 const int numIterations = 20;
1103 de::Random rnd (0xabcdef);
1107 if (isPureIntTester(m_tester))
1109 for (int ndx = 0; ndx < numIterations; ++ndx)
1111 const GLint ref = rnd.getInt(-1000, 1000);
1113 gl.glTexParameterIiv(m_target, m_pname, &ref);
1114 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1116 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1121 DE_ASSERT(isPureUintTester(m_tester));
1123 for (int ndx = 0; ndx < numIterations; ++ndx)
1125 const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000);
1127 gl.glTexParameterIuiv(m_target, m_pname, &ref);
1128 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1130 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1136 const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0);
1138 for (int ndx = 0; ndx < numIterations; ++ndx)
1140 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f);
1142 gl.glTexParameterf(m_target, m_pname, ref);
1143 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1145 verifyStateTextureParamFloat(result, gl, m_target, m_pname, ref, m_type);
1148 // check unit conversions with int
1150 for (int ndx = 0; ndx < numIterations; ++ndx)
1152 const GLint ref = rnd.getInt(minLimit, 1000);
1154 gl.glTexParameteri(m_target, m_pname, ref);
1155 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1157 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1163 class TextureLevelCase : public TextureTest
1166 TextureLevelCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1167 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1170 TextureLevelCase::TextureLevelCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1171 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1175 void TextureLevelCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1177 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1178 const int initialValue = (m_pname == GL_TEXTURE_BASE_LEVEL) ? (0)
1179 : (m_pname == GL_TEXTURE_MAX_LEVEL) ? (1000)
1184 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1185 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1188 if (m_target == GL_TEXTURE_2D_MULTISAMPLE ||
1189 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1193 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Set");
1195 gl.glTexParameteri(m_target, m_pname, 0);
1196 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1197 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1199 gl.glTexParameterf(m_target, m_pname, 0.0f);
1200 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1201 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1206 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1207 const int numIterations = 20;
1208 de::Random rnd (0xabcdef);
1212 for (int ndx = 0; ndx < numIterations; ++ndx)
1214 const GLint ref = rnd.getInt(0, 64000);
1215 const GLuint uRef = (glw::GLuint)ref;
1217 if (isPureIntTester(m_tester))
1219 gl.glTexParameterIiv(m_target, m_pname, &ref);
1220 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1224 DE_ASSERT(isPureUintTester(m_tester));
1225 gl.glTexParameterIuiv(m_target, m_pname, &uRef);
1226 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1229 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1234 for (int ndx = 0; ndx < numIterations; ++ndx)
1236 const GLint ref = rnd.getInt(0, 64000);
1238 gl.glTexParameteri(m_target, m_pname, ref);
1239 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1241 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1244 // check unit conversions with float
1246 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
1248 const int numConversionIterations = 30;
1249 for (int ndx = 0; ndx < numConversionIterations; ++ndx)
1251 const GLint ref = rnd.getInt(1, 64000);
1253 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(nonSignificantOffsets); ++offsetNdx)
1255 gl.glTexParameterf(m_target, m_pname, ((GLfloat)ref) + nonSignificantOffsets[offsetNdx]);
1256 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1258 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1265 class TextureCompareModeCase : public TextureTest
1268 TextureCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1269 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1272 TextureCompareModeCase::TextureCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1273 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1277 void TextureCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1279 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1283 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1284 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type);
1288 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1289 const GLenum modes[] = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE};
1293 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1295 if (isPureIntTester(m_tester))
1297 const glw::GLint value = (glw::GLint)modes[ndx];
1298 gl.glTexParameterIiv(m_target, m_pname, &value);
1299 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1303 DE_ASSERT(isPureUintTester(m_tester));
1305 const glw::GLuint value = modes[ndx];
1306 gl.glTexParameterIuiv(m_target, m_pname, &value);
1307 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1310 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1315 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1317 gl.glTexParameteri(m_target, m_pname, modes[ndx]);
1318 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1320 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1323 //check unit conversions with float
1325 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1327 gl.glTexParameterf(m_target, m_pname, (GLfloat)modes[ndx]);
1328 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1330 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1336 class TextureCompareFuncCase : public TextureTest
1339 TextureCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1340 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1343 TextureCompareFuncCase::TextureCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1344 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1348 void TextureCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1350 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1354 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1355 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type);
1359 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1360 const GLenum compareFuncs[] = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER};
1364 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1366 if (isPureIntTester(m_tester))
1368 const glw::GLint value = (glw::GLint)compareFuncs[ndx];
1369 gl.glTexParameterIiv(m_target, m_pname, &value);
1370 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1374 DE_ASSERT(isPureUintTester(m_tester));
1376 const glw::GLuint value = compareFuncs[ndx];
1377 gl.glTexParameterIuiv(m_target, m_pname, &value);
1378 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1381 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1386 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1388 gl.glTexParameteri(m_target, m_pname, compareFuncs[ndx]);
1389 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1391 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1394 //check unit conversions with float
1396 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1398 gl.glTexParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]);
1399 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1401 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1407 class TextureImmutableLevelsCase : public TextureTest
1410 TextureImmutableLevelsCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1411 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1414 TextureImmutableLevelsCase::TextureImmutableLevelsCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1415 : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_LEVELS, type)
1419 void TextureImmutableLevelsCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1422 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1423 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1426 if (m_target == GL_TEXTURE_2D_MULTISAMPLE ||
1427 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1430 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Level", "Level");
1431 GLuint textureID = 0;
1433 gl.glGenTextures(1, &textureID);
1434 gl.glBindTexture(m_target, textureID);
1435 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1437 if (m_target == GL_TEXTURE_2D_MULTISAMPLE)
1438 gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE);
1439 else if (m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1440 gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE);
1443 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage");
1445 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type);
1447 gl.glDeleteTextures(1, &textureID);
1448 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1452 for (int level = 1; level <= 7; ++level)
1454 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Levels", "Levels = " + de::toString(level));
1455 GLuint textureID = 0;
1457 gl.glGenTextures(1, &textureID);
1458 gl.glBindTexture(m_target, textureID);
1459 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1461 if (m_target == GL_TEXTURE_2D || m_target == GL_TEXTURE_CUBE_MAP)
1462 gl.glTexStorage2D(m_target, level, GL_RGB8, 64, 64);
1463 else if (m_target == GL_TEXTURE_2D_ARRAY || m_target == GL_TEXTURE_3D)
1464 gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 64);
1465 else if (m_target == GL_TEXTURE_CUBE_MAP_ARRAY)
1466 gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 6 * 2);
1469 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage");
1471 verifyStateTextureParamInteger(result, gl, m_target, m_pname, level, m_type);
1473 gl.glDeleteTextures(1, &textureID);
1474 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1479 class TextureImmutableFormatCase : public TextureTest
1482 TextureImmutableFormatCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1483 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1486 TextureImmutableFormatCase::TextureImmutableFormatCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1487 : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_FORMAT, type)
1491 void TextureImmutableFormatCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1494 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1495 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1499 const tcu::ScopedLogSection subsection (m_testCtx.getLog(), "Immutable", "Immutable");
1500 GLuint textureID = 0;
1502 gl.glGenTextures(1, &textureID);
1503 gl.glBindTexture(m_target, textureID);
1504 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1509 case GL_TEXTURE_CUBE_MAP:
1511 gl.glTexStorage2D(m_target, 1, GL_RGBA8, 32, 32);
1514 case GL_TEXTURE_2D_ARRAY:
1517 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 8);
1520 case GL_TEXTURE_2D_MULTISAMPLE:
1522 gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE);
1525 case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
1527 gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE);
1530 case GL_TEXTURE_CUBE_MAP_ARRAY:
1532 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 6 * 2);
1538 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture");
1540 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type);
1542 gl.glDeleteTextures(1, &textureID);
1543 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1547 if (m_target == GL_TEXTURE_2D_MULTISAMPLE ||
1548 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1553 const tcu::ScopedLogSection subsection (m_testCtx.getLog(), "Mutable", "Mutable");
1554 GLuint textureID = 0;
1556 gl.glGenTextures(1, &textureID);
1557 gl.glBindTexture(m_target, textureID);
1558 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1564 gl.glTexImage2D(m_target, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1567 case GL_TEXTURE_CUBE_MAP:
1569 gl.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1572 case GL_TEXTURE_2D_ARRAY:
1575 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1578 case GL_TEXTURE_CUBE_MAP_ARRAY:
1580 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 6 * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1586 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture");
1588 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1590 gl.glDeleteTextures(1, &textureID);
1591 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1595 class TextureWrapClampToBorderCase : public TextureTest
1598 TextureWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1599 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1602 TextureWrapClampToBorderCase::TextureWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1603 : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1607 void TextureWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1609 gl.glTexParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT);
1610 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1611 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
1613 gl.glTexParameteri(m_target, m_pname, GL_REPEAT);
1614 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1616 gl.glTexParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT);
1617 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1619 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
1622 class TextureBorderColorCase : public TextureTest
1625 TextureBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1626 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1629 TextureBorderColorCase::TextureBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1630 : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_BORDER_COLOR, type)
1634 void TextureBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1636 // border color is undefined if queried with pure type and was not set to pure value
1637 if (m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4)
1639 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1640 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type);
1643 if (m_type == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4)
1645 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1646 const tcu::IVec4 color (0x7FFFFFFF, -2, 3, -128);
1648 gl.glTexParameterIiv(m_target, m_pname, color.getPtr());
1649 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1651 verifyStateTextureParamIntegerVec4(result, gl, m_target, m_pname, color, m_type);
1653 else if (m_type == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4)
1655 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1656 const tcu::UVec4 color (0x8000000ul, 2, 3, 128);
1658 gl.glTexParameterIuiv(m_target, m_pname, color.getPtr());
1659 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1661 verifyStateTextureParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type);
1665 DE_ASSERT(m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4);
1667 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1668 const tcu::Vec4 color (0.25f, 1.0f, 0.0f, 0.77f);
1669 const tcu::IVec4 icolor (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF);
1671 gl.glTexParameterfv(m_target, m_pname, color.getPtr());
1672 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterfv");
1674 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, color, m_type);
1676 gl.glTexParameteriv(m_target, m_pname, icolor.getPtr());
1677 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteriv");
1679 verifyStateTextureParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type);
1683 class SamplerTest : public tcu::TestCase
1686 SamplerTest (tcu::TestContext& testCtx,
1687 const glu::RenderContext& renderCtx,
1694 IterateResult iterate (void);
1696 virtual void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
1699 const glu::RenderContext& m_renderCtx;
1700 const glw::GLenum m_pname;
1701 const TesterType m_tester;
1702 const QueryType m_type;
1703 glw::GLuint m_target;
1706 SamplerTest::SamplerTest (tcu::TestContext& testCtx,
1707 const glu::RenderContext& renderCtx,
1712 : TestCase (testCtx, name, desc)
1713 , m_renderCtx (renderCtx)
1714 , m_pname (mapTesterToPname(tester))
1721 void SamplerTest::init (void)
1723 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx));
1724 RequiredExtensions extensions;
1727 if (!isCoreTextureParam(m_renderCtx.getType(), m_pname))
1728 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname));
1731 if (!isCoreQuery(m_renderCtx.getType(), m_type))
1732 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type));
1735 if (!isCoreTester(m_renderCtx.getType(), m_tester))
1736 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester));
1738 extensions.check(*ctxInfo);
1741 SamplerTest::IterateResult SamplerTest::iterate (void)
1743 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog());
1744 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
1745 glu::Sampler sampler (m_renderCtx);
1747 gl.enableLogging(true);
1749 m_target = *sampler;
1753 result.setTestContextResult(m_testCtx);
1757 class SamplerWrapCase : public SamplerTest
1760 SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1761 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1764 SamplerWrapCase::SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1765 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1769 void SamplerWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1771 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1775 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1776 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type);
1780 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1781 const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
1785 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1787 if (isPureIntTester(m_tester))
1789 const glw::GLint value = (glw::GLint)wrapValues[ndx];
1790 gl.glSamplerParameterIiv(m_target, m_pname, &value);
1791 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1795 DE_ASSERT(isPureUintTester(m_tester));
1797 const glw::GLuint value = wrapValues[ndx];
1798 gl.glSamplerParameterIuiv(m_target, m_pname, &value);
1799 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
1802 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1807 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1809 gl.glSamplerParameteri(m_target, m_pname, wrapValues[ndx]);
1810 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
1812 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1815 //check unit conversions with float
1817 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1819 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]);
1820 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
1822 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1828 class SamplerFilterCase : public SamplerTest
1831 SamplerFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1832 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1835 SamplerFilterCase::SamplerFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1836 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1840 void SamplerFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1842 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1843 const glw::GLenum initial = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR)
1844 : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR)
1849 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1850 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initial, m_type);
1854 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1855 std::vector<GLenum> values;
1857 values.push_back(GL_NEAREST);
1858 values.push_back(GL_LINEAR);
1859 if (m_pname == GL_TEXTURE_MIN_FILTER)
1861 values.push_back(GL_NEAREST_MIPMAP_NEAREST);
1862 values.push_back(GL_NEAREST_MIPMAP_LINEAR);
1863 values.push_back(GL_LINEAR_MIPMAP_NEAREST);
1864 values.push_back(GL_LINEAR_MIPMAP_LINEAR);
1869 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1871 if (isPureIntTester(m_tester))
1873 const glw::GLint value = (glw::GLint)values[ndx];
1874 gl.glSamplerParameterIiv(m_target, m_pname, &value);
1875 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1879 DE_ASSERT(isPureUintTester(m_tester));
1881 const glw::GLuint value = values[ndx];
1882 gl.glSamplerParameterIuiv(m_target, m_pname, &value);
1883 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
1886 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1891 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1893 gl.glSamplerParameteri(m_target, m_pname, values[ndx]);
1894 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
1896 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1899 //check unit conversions with float
1901 for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1903 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)values[ndx]);
1904 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
1906 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1912 class SamplerLODCase : public SamplerTest
1915 SamplerLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1916 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1919 SamplerLODCase::SamplerLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1920 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1924 void SamplerLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1926 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1927 const int initialValue = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000)
1928 : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000)
1931 if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase)
1933 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1934 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1938 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
1939 const int numIterations = 20;
1940 de::Random rnd (0xabcdef);
1944 if (isPureIntTester(m_tester))
1946 for (int ndx = 0; ndx < numIterations; ++ndx)
1948 const GLint ref = rnd.getInt(-1000, 1000);
1950 gl.glSamplerParameterIiv(m_target, m_pname, &ref);
1951 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1953 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1958 DE_ASSERT(isPureUintTester(m_tester));
1960 for (int ndx = 0; ndx < numIterations; ++ndx)
1962 const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000);
1964 gl.glSamplerParameterIuiv(m_target, m_pname, &ref);
1965 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
1967 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1973 const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0);
1975 for (int ndx = 0; ndx < numIterations; ++ndx)
1977 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f);
1979 gl.glSamplerParameterf(m_target, m_pname, ref);
1980 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
1982 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, ref, m_type);
1985 // check unit conversions with int
1987 for (int ndx = 0; ndx < numIterations; ++ndx)
1989 const GLint ref = rnd.getInt(minLimit, 1000);
1991 gl.glSamplerParameteri(m_target, m_pname, ref);
1992 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
1994 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
2000 class SamplerCompareModeCase : public SamplerTest
2003 SamplerCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2004 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2007 SamplerCompareModeCase::SamplerCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2008 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2012 void SamplerCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2014 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2018 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2019 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type);
2023 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2024 const GLenum modes[] = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE};
2028 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2030 if (isPureIntTester(m_tester))
2032 const glw::GLint value = (glw::GLint)modes[ndx];
2033 gl.glSamplerParameterIiv(m_target, m_pname, &value);
2034 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2038 DE_ASSERT(isPureUintTester(m_tester));
2040 const glw::GLuint value = modes[ndx];
2041 gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2042 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2045 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2050 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2052 gl.glSamplerParameteri(m_target, m_pname, modes[ndx]);
2053 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2055 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2058 //check unit conversions with float
2060 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2062 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)modes[ndx]);
2063 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2065 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2071 class SamplerCompareFuncCase : public SamplerTest
2074 SamplerCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2075 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2078 SamplerCompareFuncCase::SamplerCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2079 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2083 void SamplerCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2085 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2089 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2090 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type);
2094 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2095 const GLenum compareFuncs[] = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER};
2099 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2101 if (isPureIntTester(m_tester))
2103 const glw::GLint value = (glw::GLint)compareFuncs[ndx];
2104 gl.glSamplerParameterIiv(m_target, m_pname, &value);
2105 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2109 DE_ASSERT(isPureUintTester(m_tester));
2111 const glw::GLuint value = compareFuncs[ndx];
2112 gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2113 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2116 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2121 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2123 gl.glSamplerParameteri(m_target, m_pname, compareFuncs[ndx]);
2124 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2126 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2129 //check unit conversions with float
2131 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2133 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]);
2134 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2136 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2142 class SamplerWrapClampToBorderCase : public SamplerTest
2145 SamplerWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2146 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2149 SamplerWrapClampToBorderCase::SamplerWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2150 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2154 void SamplerWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2156 gl.glSamplerParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT);
2157 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2158 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
2160 gl.glSamplerParameteri(m_target, m_pname, GL_REPEAT);
2161 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2163 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT);
2164 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2166 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
2169 class SamplerSRGBDecodeCase : public SamplerTest
2172 SamplerSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2173 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2176 SamplerSRGBDecodeCase::SamplerSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2177 : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2181 void SamplerSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2183 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2187 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2188 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2192 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle");
2193 const glw::GLint decodeInt = GL_DECODE_EXT;
2194 const glw::GLfloat decodeFloat = (glw::GLfloat)GL_DECODE_EXT;
2196 gl.glSamplerParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT);
2197 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2198 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2200 gl.glSamplerParameteriv(m_target, m_pname, &decodeInt);
2201 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2202 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2204 gl.glSamplerParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT);
2205 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2206 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2208 gl.glSamplerParameterfv(m_target, m_pname, &decodeFloat);
2209 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2210 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2213 if (isPureIntTester(m_tester))
2215 const glw::GLint skipDecode = GL_SKIP_DECODE_EXT;
2216 const glw::GLint decode = GL_DECODE_EXT;
2218 gl.glSamplerParameterIiv(m_target, m_pname, &skipDecode);
2219 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2220 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2222 gl.glSamplerParameterIiv(m_target, m_pname, &decode);
2223 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2224 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2227 if (isPureUintTester(m_tester))
2229 const glw::GLuint skipDecode = GL_SKIP_DECODE_EXT;
2230 const glw::GLuint decode = GL_DECODE_EXT;
2232 gl.glSamplerParameterIuiv(m_target, m_pname, &skipDecode);
2233 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2234 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2236 gl.glSamplerParameterIuiv(m_target, m_pname, &decode);
2237 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2238 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2242 class SamplerBorderColorCase : public SamplerTest
2245 SamplerBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, QueryType type);
2246 void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2249 SamplerBorderColorCase::SamplerBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, QueryType type)
2250 : SamplerTest(testCtx, renderCtx, name, desc, TESTER_TEXTURE_BORDER_COLOR, type)
2252 DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 ||
2253 m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4 ||
2254 m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4 ||
2255 m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4);
2258 void SamplerBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2260 // border color is undefined if queried with pure type and was not set to pure value
2261 if (m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4)
2263 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2264 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type);
2267 if (m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4)
2269 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2270 const tcu::IVec4 color (0x7FFFFFFF, -2, 3, -128);
2272 gl.glSamplerParameterIiv(m_target, m_pname, color.getPtr());
2273 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2275 verifyStateSamplerParamIntegerVec4(result, gl, m_target, m_pname, color, m_type);
2277 else if (m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4)
2279 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2280 const tcu::UVec4 color (0x8000000ul, 2, 3, 128);
2282 gl.glSamplerParameterIuiv(m_target, m_pname, color.getPtr());
2283 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2285 verifyStateSamplerParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type);
2289 DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4);
2291 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set");
2292 const tcu::Vec4 color (0.25f, 1.0f, 0.0f, 0.77f);
2293 const tcu::IVec4 icolor (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF);
2295 gl.glSamplerParameterfv(m_target, m_pname, color.getPtr());
2296 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterfv");
2298 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, color, m_type);
2300 gl.glSamplerParameteriv(m_target, m_pname, icolor.getPtr());
2301 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteriv");
2303 verifyStateSamplerParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type);
2309 bool isLegalTesterForTarget (glw::GLenum target, TesterType tester)
2311 // no 3d filtering on 2d targets
2312 if ((tester == TESTER_TEXTURE_WRAP_R || tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER) && target != GL_TEXTURE_3D)
2315 // no sampling on multisample
2316 if (isMultisampleTarget(target) && isSamplerStateTester(tester))
2319 // no states in buffer
2320 if (target == GL_TEXTURE_BUFFER)
2326 bool isMultisampleTarget (glw::GLenum target)
2328 return target == GL_TEXTURE_2D_MULTISAMPLE ||
2329 target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
2332 bool isSamplerStateTester (TesterType tester)
2334 return tester == TESTER_TEXTURE_WRAP_S ||
2335 tester == TESTER_TEXTURE_WRAP_T ||
2336 tester == TESTER_TEXTURE_WRAP_R ||
2337 tester == TESTER_TEXTURE_MAG_FILTER ||
2338 tester == TESTER_TEXTURE_MIN_FILTER ||
2339 tester == TESTER_TEXTURE_MIN_LOD ||
2340 tester == TESTER_TEXTURE_MAX_LOD ||
2341 tester == TESTER_TEXTURE_COMPARE_MODE ||
2342 tester == TESTER_TEXTURE_COMPARE_FUNC ||
2343 tester == TESTER_TEXTURE_SRGB_DECODE_EXT ||
2344 tester == TESTER_TEXTURE_BORDER_COLOR ||
2345 tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER ||
2346 tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER ||
2347 tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER;
2350 tcu::TestCase* createIsTextureTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, glw::GLenum target)
2352 return new IsTextureCase(testCtx, renderCtx, name.c_str(), description.c_str(), target);
2355 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)
2357 if (isMultisampleTarget(target) && isSamplerStateTester(tester))
2359 DE_ASSERT(!"Multisample textures have no sampler state");
2362 if (target == GL_TEXTURE_BUFFER)
2364 DE_ASSERT(!"Buffer textures have no texture state");
2367 if (target != GL_TEXTURE_3D && mapTesterToPname(tester) == GL_TEXTURE_WRAP_R)
2369 DE_ASSERT(!"Only 3D textures have wrap r filter");
2373 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
2377 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R):
2378 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G):
2379 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B):
2380 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A):
2381 return new TextureSwizzleCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2383 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
2384 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
2385 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
2386 return new TextureWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2388 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):
2389 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):
2390 return new TextureFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2392 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):
2393 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):
2394 return new TextureLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2396 CASE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL):
2397 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL):
2398 return new TextureLevelCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2400 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
2401 return new TextureCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2403 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
2404 return new TextureCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2406 case TESTER_TEXTURE_IMMUTABLE_LEVELS:
2407 return new TextureImmutableLevelsCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2409 case TESTER_TEXTURE_IMMUTABLE_FORMAT:
2410 return new TextureImmutableFormatCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2412 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
2413 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
2414 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
2415 return new TextureWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2417 CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE):
2418 return new DepthStencilModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2420 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
2421 return new TextureSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2423 case TESTER_TEXTURE_BORDER_COLOR:
2424 return new TextureBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2430 #undef CASE_ALL_SETTERS
2436 tcu::TestCase* createSamplerParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, StateQueryUtil::QueryType queryType, TesterType tester)
2438 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
2442 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
2443 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
2444 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
2445 return new SamplerWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2447 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):
2448 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):
2449 return new SamplerFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2451 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):
2452 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):
2453 return new SamplerLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2455 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
2456 return new SamplerCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2458 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
2459 return new SamplerCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2461 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
2462 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
2463 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
2464 return new SamplerWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2466 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
2467 return new SamplerSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2469 case TESTER_TEXTURE_BORDER_COLOR:
2470 return new SamplerBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), queryType);
2476 #undef CASE_ALL_SETTERS
2482 } // TextureStateQueryTests