1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL (ES) Module 3 * ----------------------------------------------- 4 * 5 * Copyright 2015 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Texture State Query tests. 22 *//*--------------------------------------------------------------------*/ 23 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" 34 35 namespace deqp 36 { 37 namespace gls 38 { 39 namespace TextureStateQueryTests 40 { 41 namespace 42 { 43 44 using namespace glw; 45 using namespace gls::StateQueryUtil; 46 47 static glw::GLenum mapTesterToPname (TesterType tester) 48 { 49 50 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT 51 52 switch (tester) 53 { 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; 58 59 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S): 60 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_S; 61 62 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T): 63 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_T; 64 65 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R): 66 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_R; 67 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; 81 82 default: 83 DE_ASSERT(false); 84 return -1; 85 } 86 87 #undef CASE_PURE_SETTERS 88 } 89 90 static bool querySupportsSigned (QueryType type) 91 { 92 return type != QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER && 93 type != QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER; 94 } 95 96 static bool isPureIntTester (TesterType tester) 97 { 98 #define HANDLE_ALL_SETTERS(X) \ 99 case X: \ 100 case X ## _SET_PURE_UINT: return false; \ 101 case X ## _SET_PURE_INT: return true; 102 103 switch (tester) 104 { 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) 122 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: 129 return false; 130 131 default: 132 DE_ASSERT(false); 133 return false; 134 } 135 136 #undef HANDLE_ALL_SETTERS 137 } 138 139 static bool isPureUintTester (TesterType tester) 140 { 141 #define HANDLE_ALL_SETTERS(X) \ 142 case X: \ 143 case X ## _SET_PURE_INT: return false; \ 144 case X ## _SET_PURE_UINT: return true; 145 146 switch (tester) 147 { 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) 165 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: 172 return false; 173 174 default: 175 DE_ASSERT(false); 176 return false; 177 } 178 179 #undef HANDLE_ALL_SETTERS 180 } 181 182 class RequiredExtensions 183 { 184 public: 185 RequiredExtensions (void) { } 186 explicit RequiredExtensions (const char* ext) { add(ext); } 187 RequiredExtensions (const char* extA, const char* extB) { add(extA); add(extB); } 188 189 void add (const char* ext); 190 void add (const RequiredExtensions& other); 191 void check (const glu::ContextInfo&) const; 192 193 private: 194 std::vector<const char*> m_extensions; 195 }; 196 197 void RequiredExtensions::add (const char* ext) 198 { 199 for (int ndx = 0; ndx < (int)m_extensions.size(); ++ndx) 200 if (deStringEqual(m_extensions[ndx], ext) == DE_TRUE) 201 return; 202 m_extensions.push_back(ext); 203 } 204 205 void RequiredExtensions::add (const RequiredExtensions& other) 206 { 207 for (int ndx = 0; ndx < (int)other.m_extensions.size(); ++ndx) 208 add(other.m_extensions[ndx]); 209 } 210 211 void RequiredExtensions::check (const glu::ContextInfo& ctxInfo) const 212 { 213 std::vector<const char*> failedExtensions; 214 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]); 218 219 if (!failedExtensions.empty()) 220 { 221 std::ostringstream buf; 222 buf << "Test requires extension: "; 223 224 for (int ndx = 0; ndx < (int)failedExtensions.size(); ++ndx) 225 { 226 if (ndx) 227 buf << ", "; 228 buf << failedExtensions[ndx]; 229 } 230 231 throw tcu::NotSupportedError(buf.str()); 232 } 233 } 234 235 namespace es30 236 { 237 238 static bool isCoreTextureTarget (glw::GLenum target) 239 { 240 return target == GL_TEXTURE_2D || 241 target == GL_TEXTURE_3D || 242 target == GL_TEXTURE_2D_ARRAY || 243 target == GL_TEXTURE_CUBE_MAP; 244 } 245 246 static RequiredExtensions getTextureTargetExtension (glw::GLenum target) 247 { 248 DE_UNREF(target); 249 DE_ASSERT(false); 250 return RequiredExtensions(); 251 } 252 253 static bool isCoreTextureParam (glw::GLenum pname) 254 { 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; 272 } 273 274 static RequiredExtensions getTextureParamExtension (glw::GLenum pname) 275 { 276 DE_UNREF(pname); 277 DE_ASSERT(false); 278 return RequiredExtensions(); 279 } 280 281 static bool isCoreQuery (QueryType query) 282 { 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; 291 } 292 293 static RequiredExtensions getQueryExtension (QueryType query) 294 { 295 DE_UNREF(query); 296 DE_ASSERT(false); 297 return RequiredExtensions(); 298 } 299 300 static bool isCoreTester (TesterType tester) 301 { 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; 319 } 320 321 static RequiredExtensions getTesterExtension (TesterType tester) 322 { 323 DE_UNREF(tester); 324 DE_ASSERT(false); 325 return RequiredExtensions(); 326 } 327 328 } // es30 329 330 namespace es31 331 { 332 333 static bool isCoreTextureTarget (glw::GLenum target) 334 { 335 return es30::isCoreTextureTarget(target) || 336 target == GL_TEXTURE_2D_MULTISAMPLE; 337 } 338 339 static RequiredExtensions getTextureTargetExtension (glw::GLenum target) 340 { 341 switch (target) 342 { 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"); 346 default: 347 DE_ASSERT(false); 348 return RequiredExtensions(); 349 } 350 } 351 352 static bool isCoreTextureParam (glw::GLenum pname) 353 { 354 return es30::isCoreTextureParam(pname) || 355 pname == GL_DEPTH_STENCIL_TEXTURE_MODE; 356 } 357 358 static RequiredExtensions getTextureParamExtension (glw::GLenum pname) 359 { 360 switch (pname) 361 { 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"); 364 default: 365 DE_ASSERT(false); 366 return RequiredExtensions(); 367 } 368 } 369 370 static bool isCoreQuery (QueryType query) 371 { 372 return es30::isCoreQuery(query); 373 } 374 375 static RequiredExtensions getQueryExtension (QueryType query) 376 { 377 switch (query) 378 { 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"); 388 389 default: 390 DE_ASSERT(false); 391 return RequiredExtensions(); 392 } 393 } 394 395 static bool isCoreTester (TesterType tester) 396 { 397 return es30::isCoreTester(tester) || 398 tester == TESTER_DEPTH_STENCIL_TEXTURE_MODE; 399 } 400 401 static RequiredExtensions getTesterExtension (TesterType tester) 402 { 403 #define CASE_PURE_SETTERS(X) case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT 404 405 switch (tester) 406 { 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"); 428 429 case TESTER_TEXTURE_SRGB_DECODE_EXT: 430 return RequiredExtensions("GL_EXT_texture_sRGB_decode"); 431 432 CASE_PURE_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): 433 return RequiredExtensions("GL_EXT_texture_sRGB_decode", "GL_EXT_texture_border_clamp"); 434 435 default: 436 DE_ASSERT(false); 437 return RequiredExtensions(); 438 } 439 440 #undef CASE_PURE_SETTERS 441 } 442 443 } // es31 444 445 static bool isCoreTextureTarget (const glu::ContextType& contextType, glw::GLenum target) 446 { 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); 451 else 452 { 453 DE_ASSERT(false); 454 return DE_NULL; 455 } 456 } 457 458 static bool isCoreTextureParam (const glu::ContextType& contextType, glw::GLenum pname) 459 { 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); 464 else 465 { 466 DE_ASSERT(false); 467 return DE_NULL; 468 } 469 } 470 471 static bool isCoreQuery (const glu::ContextType& contextType, QueryType query) 472 { 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); 477 else 478 { 479 DE_ASSERT(false); 480 return DE_NULL; 481 } 482 } 483 484 static bool isCoreTester (const glu::ContextType& contextType, TesterType tester) 485 { 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); 490 else 491 { 492 DE_ASSERT(false); 493 return DE_NULL; 494 } 495 } 496 497 static RequiredExtensions getTextureTargetExtension (const glu::ContextType& contextType, glw::GLenum target) 498 { 499 DE_ASSERT(!isCoreTextureTarget(contextType, target)); 500 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); 505 else 506 { 507 DE_ASSERT(false); 508 return RequiredExtensions(); 509 } 510 } 511 512 static RequiredExtensions getTextureParamExtension (const glu::ContextType& contextType, glw::GLenum pname) 513 { 514 DE_ASSERT(!isCoreTextureParam(contextType, pname)); 515 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); 520 else 521 { 522 DE_ASSERT(false); 523 return RequiredExtensions(); 524 } 525 } 526 527 static RequiredExtensions getQueryExtension (const glu::ContextType& contextType, QueryType query) 528 { 529 DE_ASSERT(!isCoreQuery(contextType, query)); 530 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); 535 else 536 { 537 DE_ASSERT(false); 538 return RequiredExtensions(); 539 } 540 } 541 542 static RequiredExtensions getTesterExtension (const glu::ContextType& contextType, TesterType tester) 543 { 544 DE_ASSERT(!isCoreTester(contextType, tester)); 545 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); 550 else 551 { 552 DE_ASSERT(false); 553 return RequiredExtensions(); 554 } 555 } 556 557 class TextureTest : public tcu::TestCase 558 { 559 public: 560 TextureTest (tcu::TestContext& testCtx, 561 const glu::RenderContext& renderCtx, 562 const char* name, 563 const char* desc, 564 glw::GLenum target, 565 TesterType tester, 566 QueryType type); 567 568 void init (void); 569 IterateResult iterate (void); 570 571 virtual void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0; 572 573 protected: 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; 579 }; 580 581 TextureTest::TextureTest (tcu::TestContext& testCtx, 582 const glu::RenderContext& renderCtx, 583 const char* name, 584 const char* desc, 585 glw::GLenum target, 586 TesterType tester, 587 QueryType type) 588 : TestCase (testCtx, name, desc) 589 , m_renderCtx (renderCtx) 590 , m_target (target) 591 , m_pname (mapTesterToPname(tester)) 592 , m_tester (tester) 593 , m_type (type) 594 { 595 } 596 597 void TextureTest::init (void) 598 { 599 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx)); 600 RequiredExtensions extensions; 601 602 // target 603 if (!isCoreTextureTarget(m_renderCtx.getType(), m_target)) 604 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target)); 605 606 // param 607 if (!isCoreTextureParam(m_renderCtx.getType(), m_pname)) 608 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname)); 609 610 // query 611 if (!isCoreQuery(m_renderCtx.getType(), m_type)) 612 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type)); 613 614 // test type 615 if (!isCoreTester(m_renderCtx.getType(), m_tester)) 616 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester)); 617 618 extensions.check(*ctxInfo); 619 } 620 621 TextureTest::IterateResult TextureTest::iterate (void) 622 { 623 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog()); 624 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 625 626 gl.enableLogging(true); 627 test(gl, result); 628 629 result.setTestContextResult(m_testCtx); 630 return STOP; 631 } 632 633 class IsTextureCase : public tcu::TestCase 634 { 635 public: 636 IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target); 637 638 void init (void); 639 IterateResult iterate (void); 640 641 protected: 642 const glu::RenderContext& m_renderCtx; 643 const glw::GLenum m_target; 644 }; 645 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) 649 , m_target (target) 650 { 651 } 652 653 void IsTextureCase::init (void) 654 { 655 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx)); 656 RequiredExtensions extensions; 657 658 // target 659 if (!isCoreTextureTarget(m_renderCtx.getType(), m_target)) 660 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target)); 661 662 extensions.check(*ctxInfo); 663 } 664 665 IsTextureCase::IterateResult IsTextureCase::iterate (void) 666 { 667 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog()); 668 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 669 glw::GLuint textureId = 0; 670 671 gl.enableLogging(true); 672 673 gl.glGenTextures(1, &textureId); 674 gl.glBindTexture(m_target, textureId); 675 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); 676 677 verifyStateObjectBoolean(result, gl, textureId, true, QUERY_ISTEXTURE); 678 679 gl.glDeleteTextures(1, &textureId); 680 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); 681 682 verifyStateObjectBoolean(result, gl, textureId, false, QUERY_ISTEXTURE); 683 684 result.setTestContextResult(m_testCtx); 685 return STOP; 686 } 687 688 class DepthStencilModeCase : public TextureTest 689 { 690 public: 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; 693 }; 694 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) 697 { 698 } 699 700 void DepthStencilModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 701 { 702 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 703 glu::Texture texture (m_renderCtx); 704 705 gl.glBindTexture(m_target, *texture); 706 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind"); 707 708 if (!isPureCase) 709 { 710 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 711 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type); 712 } 713 714 if (!isPureCase) 715 { 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; 719 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); 723 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); 727 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); 731 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); 735 } 736 737 if (isPureIntTester(m_tester)) 738 { 739 const glw::GLint depthComponent = GL_DEPTH_COMPONENT; 740 const glw::GLint stencilIndex = GL_STENCIL_INDEX; 741 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); 745 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); 749 } 750 751 if (isPureUintTester(m_tester)) 752 { 753 const glw::GLuint depthComponent = GL_DEPTH_COMPONENT; 754 const glw::GLuint stencilIndex = GL_STENCIL_INDEX; 755 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); 759 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); 763 } 764 } 765 766 class TextureSRGBDecodeCase : public TextureTest 767 { 768 public: 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; 771 }; 772 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) 775 { 776 } 777 778 void TextureSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 779 { 780 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 781 glu::Texture texture (m_renderCtx); 782 783 gl.glBindTexture(m_target, *texture); 784 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind"); 785 786 if (!isPureCase) 787 { 788 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 789 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); 790 } 791 792 if (!isPureCase) 793 { 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; 797 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); 801 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); 805 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); 809 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); 813 } 814 815 if (isPureIntTester(m_tester)) 816 { 817 const glw::GLint skipDecode = GL_SKIP_DECODE_EXT; 818 const glw::GLint decode = GL_DECODE_EXT; 819 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); 823 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); 827 } 828 829 if (isPureUintTester(m_tester)) 830 { 831 const glw::GLuint skipDecode = GL_SKIP_DECODE_EXT; 832 const glw::GLuint decode = GL_DECODE_EXT; 833 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); 837 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); 841 } 842 } 843 844 class TextureSwizzleCase : public TextureTest 845 { 846 public: 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; 849 }; 850 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) 853 { 854 } 855 856 void TextureSwizzleCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 857 { 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) : 863 (-1); 864 865 if (!isPureCase) 866 { 867 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 868 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type); 869 } 870 871 { 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}; 874 875 if (isPureCase) 876 { 877 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx) 878 { 879 if (isPureIntTester(m_tester)) 880 { 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"); 884 } 885 else 886 { 887 DE_ASSERT(isPureUintTester(m_tester)); 888 889 const glw::GLuint value = swizzleValues[ndx]; 890 gl.glTexParameterIuiv(m_target, m_pname, &value); 891 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); 892 } 893 894 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type); 895 } 896 } 897 else 898 { 899 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx) 900 { 901 gl.glTexParameteri(m_target, m_pname, swizzleValues[ndx]); 902 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); 903 904 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type); 905 } 906 907 //check unit conversions with float 908 909 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx) 910 { 911 gl.glTexParameterf(m_target, m_pname, (GLfloat)swizzleValues[ndx]); 912 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); 913 914 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type); 915 } 916 } 917 } 918 } 919 920 class TextureWrapCase : public TextureTest 921 { 922 public: 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; 925 }; 926 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) 929 { 930 } 931 932 void TextureWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 933 { 934 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 935 936 if (!isPureCase) 937 { 938 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 939 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type); 940 } 941 942 { 943 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 944 const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT}; 945 946 if (isPureCase) 947 { 948 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) 949 { 950 if (isPureIntTester(m_tester)) 951 { 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"); 955 } 956 else 957 { 958 DE_ASSERT(isPureUintTester(m_tester)); 959 960 const glw::GLuint value = wrapValues[ndx]; 961 gl.glTexParameterIuiv(m_target, m_pname, &value); 962 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); 963 } 964 965 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); 966 } 967 } 968 else 969 { 970 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) 971 { 972 gl.glTexParameteri(m_target, m_pname, wrapValues[ndx]); 973 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); 974 975 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); 976 } 977 978 //check unit conversions with float 979 980 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) 981 { 982 gl.glTexParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]); 983 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); 984 985 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); 986 } 987 } 988 } 989 } 990 991 class TextureFilterCase : public TextureTest 992 { 993 public: 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; 996 }; 997 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) 1000 { 1001 } 1002 1003 void TextureFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1004 { 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) 1008 : (0); 1009 1010 if (!isPureCase) 1011 { 1012 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1013 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initial, m_type); 1014 } 1015 1016 { 1017 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1018 std::vector<GLenum> values; 1019 1020 values.push_back(GL_NEAREST); 1021 values.push_back(GL_LINEAR); 1022 if (m_pname == GL_TEXTURE_MIN_FILTER) 1023 { 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); 1028 } 1029 1030 if (isPureCase) 1031 { 1032 for (int ndx = 0; ndx < (int)values.size(); ++ndx) 1033 { 1034 if (isPureIntTester(m_tester)) 1035 { 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"); 1039 } 1040 else 1041 { 1042 DE_ASSERT(isPureUintTester(m_tester)); 1043 1044 const glw::GLuint value = values[ndx]; 1045 gl.glTexParameterIuiv(m_target, m_pname, &value); 1046 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); 1047 } 1048 1049 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); 1050 } 1051 } 1052 else 1053 { 1054 for (int ndx = 0; ndx < (int)values.size(); ++ndx) 1055 { 1056 gl.glTexParameteri(m_target, m_pname, values[ndx]); 1057 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); 1058 1059 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); 1060 } 1061 1062 //check unit conversions with float 1063 1064 for (int ndx = 0; ndx < (int)values.size(); ++ndx) 1065 { 1066 gl.glTexParameterf(m_target, m_pname, (GLfloat)values[ndx]); 1067 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); 1068 1069 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); 1070 } 1071 } 1072 } 1073 } 1074 1075 class TextureLODCase : public TextureTest 1076 { 1077 public: 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; 1080 }; 1081 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) 1084 { 1085 } 1086 1087 void TextureLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1088 { 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) 1092 : (-1); 1093 1094 if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase) 1095 { 1096 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1097 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type); 1098 } 1099 1100 { 1101 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1102 const int numIterations = 20; 1103 de::Random rnd (0xabcdef); 1104 1105 if (isPureCase) 1106 { 1107 if (isPureIntTester(m_tester)) 1108 { 1109 for (int ndx = 0; ndx < numIterations; ++ndx) 1110 { 1111 const GLint ref = rnd.getInt(-1000, 1000); 1112 1113 gl.glTexParameterIiv(m_target, m_pname, &ref); 1114 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); 1115 1116 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); 1117 } 1118 } 1119 else 1120 { 1121 DE_ASSERT(isPureUintTester(m_tester)); 1122 1123 for (int ndx = 0; ndx < numIterations; ++ndx) 1124 { 1125 const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000); 1126 1127 gl.glTexParameterIuiv(m_target, m_pname, &ref); 1128 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); 1129 1130 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); 1131 } 1132 } 1133 } 1134 else 1135 { 1136 const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0); 1137 1138 for (int ndx = 0; ndx < numIterations; ++ndx) 1139 { 1140 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f); 1141 1142 gl.glTexParameterf(m_target, m_pname, ref); 1143 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); 1144 1145 verifyStateTextureParamFloat(result, gl, m_target, m_pname, ref, m_type); 1146 } 1147 1148 // check unit conversions with int 1149 1150 for (int ndx = 0; ndx < numIterations; ++ndx) 1151 { 1152 const GLint ref = rnd.getInt(minLimit, 1000); 1153 1154 gl.glTexParameteri(m_target, m_pname, ref); 1155 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); 1156 1157 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); 1158 } 1159 } 1160 } 1161 } 1162 1163 class TextureLevelCase : public TextureTest 1164 { 1165 public: 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; 1168 }; 1169 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) 1172 { 1173 } 1174 1175 void TextureLevelCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1176 { 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) 1180 : (-1); 1181 1182 if (!isPureCase) 1183 { 1184 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1185 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type); 1186 } 1187 1188 if (m_target == GL_TEXTURE_2D_MULTISAMPLE || 1189 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) 1190 { 1191 // only 0 allowed 1192 { 1193 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Set"); 1194 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); 1198 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); 1202 } 1203 } 1204 else 1205 { 1206 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1207 const int numIterations = 20; 1208 de::Random rnd (0xabcdef); 1209 1210 if (isPureCase) 1211 { 1212 for (int ndx = 0; ndx < numIterations; ++ndx) 1213 { 1214 const GLint ref = rnd.getInt(0, 64000); 1215 const GLuint uRef = (glw::GLuint)ref; 1216 1217 if (isPureIntTester(m_tester)) 1218 { 1219 gl.glTexParameterIiv(m_target, m_pname, &ref); 1220 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); 1221 } 1222 else 1223 { 1224 DE_ASSERT(isPureUintTester(m_tester)); 1225 gl.glTexParameterIuiv(m_target, m_pname, &uRef); 1226 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); 1227 } 1228 1229 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type); 1230 } 1231 } 1232 else 1233 { 1234 for (int ndx = 0; ndx < numIterations; ++ndx) 1235 { 1236 const GLint ref = rnd.getInt(0, 64000); 1237 1238 gl.glTexParameteri(m_target, m_pname, ref); 1239 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); 1240 1241 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type); 1242 } 1243 1244 // check unit conversions with float 1245 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 1247 1248 const int numConversionIterations = 30; 1249 for (int ndx = 0; ndx < numConversionIterations; ++ndx) 1250 { 1251 const GLint ref = rnd.getInt(1, 64000); 1252 1253 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(nonSignificantOffsets); ++offsetNdx) 1254 { 1255 gl.glTexParameterf(m_target, m_pname, ((GLfloat)ref) + nonSignificantOffsets[offsetNdx]); 1256 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); 1257 1258 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type); 1259 } 1260 } 1261 } 1262 } 1263 } 1264 1265 class TextureCompareModeCase : public TextureTest 1266 { 1267 public: 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; 1270 }; 1271 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) 1274 { 1275 } 1276 1277 void TextureCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1278 { 1279 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 1280 1281 if (!isPureCase) 1282 { 1283 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1284 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type); 1285 } 1286 1287 { 1288 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1289 const GLenum modes[] = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE}; 1290 1291 if (isPureCase) 1292 { 1293 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) 1294 { 1295 if (isPureIntTester(m_tester)) 1296 { 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"); 1300 } 1301 else 1302 { 1303 DE_ASSERT(isPureUintTester(m_tester)); 1304 1305 const glw::GLuint value = modes[ndx]; 1306 gl.glTexParameterIuiv(m_target, m_pname, &value); 1307 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); 1308 } 1309 1310 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); 1311 } 1312 } 1313 else 1314 { 1315 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) 1316 { 1317 gl.glTexParameteri(m_target, m_pname, modes[ndx]); 1318 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); 1319 1320 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); 1321 } 1322 1323 //check unit conversions with float 1324 1325 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) 1326 { 1327 gl.glTexParameterf(m_target, m_pname, (GLfloat)modes[ndx]); 1328 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); 1329 1330 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); 1331 } 1332 } 1333 } 1334 } 1335 1336 class TextureCompareFuncCase : public TextureTest 1337 { 1338 public: 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; 1341 }; 1342 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) 1345 { 1346 } 1347 1348 void TextureCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1349 { 1350 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 1351 1352 if (!isPureCase) 1353 { 1354 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1355 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type); 1356 } 1357 1358 { 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}; 1361 1362 if (isPureCase) 1363 { 1364 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) 1365 { 1366 if (isPureIntTester(m_tester)) 1367 { 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"); 1371 } 1372 else 1373 { 1374 DE_ASSERT(isPureUintTester(m_tester)); 1375 1376 const glw::GLuint value = compareFuncs[ndx]; 1377 gl.glTexParameterIuiv(m_target, m_pname, &value); 1378 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); 1379 } 1380 1381 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); 1382 } 1383 } 1384 else 1385 { 1386 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) 1387 { 1388 gl.glTexParameteri(m_target, m_pname, compareFuncs[ndx]); 1389 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); 1390 1391 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); 1392 } 1393 1394 //check unit conversions with float 1395 1396 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) 1397 { 1398 gl.glTexParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]); 1399 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); 1400 1401 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); 1402 } 1403 } 1404 } 1405 } 1406 1407 class TextureImmutableLevelsCase : public TextureTest 1408 { 1409 public: 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; 1412 }; 1413 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) 1416 { 1417 } 1418 1419 void TextureImmutableLevelsCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1420 { 1421 { 1422 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1423 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type); 1424 } 1425 1426 if (m_target == GL_TEXTURE_2D_MULTISAMPLE || 1427 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) 1428 { 1429 // no levels 1430 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Level", "Level"); 1431 GLuint textureID = 0; 1432 1433 gl.glGenTextures(1, &textureID); 1434 gl.glBindTexture(m_target, textureID); 1435 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); 1436 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); 1441 else 1442 DE_ASSERT(false); 1443 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage"); 1444 1445 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type); 1446 1447 gl.glDeleteTextures(1, &textureID); 1448 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); 1449 } 1450 else 1451 { 1452 for (int level = 1; level <= 7; ++level) 1453 { 1454 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Levels", "Levels = " + de::toString(level)); 1455 GLuint textureID = 0; 1456 1457 gl.glGenTextures(1, &textureID); 1458 gl.glBindTexture(m_target, textureID); 1459 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); 1460 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); 1467 else 1468 DE_ASSERT(false); 1469 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage"); 1470 1471 verifyStateTextureParamInteger(result, gl, m_target, m_pname, level, m_type); 1472 1473 gl.glDeleteTextures(1, &textureID); 1474 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); 1475 } 1476 } 1477 } 1478 1479 class TextureImmutableFormatCase : public TextureTest 1480 { 1481 public: 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; 1484 }; 1485 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) 1488 { 1489 } 1490 1491 void TextureImmutableFormatCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1492 { 1493 { 1494 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1495 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type); 1496 } 1497 1498 { 1499 const tcu::ScopedLogSection subsection (m_testCtx.getLog(), "Immutable", "Immutable"); 1500 GLuint textureID = 0; 1501 1502 gl.glGenTextures(1, &textureID); 1503 gl.glBindTexture(m_target, textureID); 1504 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); 1505 1506 switch (m_target) 1507 { 1508 case GL_TEXTURE_2D: 1509 case GL_TEXTURE_CUBE_MAP: 1510 { 1511 gl.glTexStorage2D(m_target, 1, GL_RGBA8, 32, 32); 1512 break; 1513 } 1514 case GL_TEXTURE_2D_ARRAY: 1515 case GL_TEXTURE_3D: 1516 { 1517 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 8); 1518 break; 1519 } 1520 case GL_TEXTURE_2D_MULTISAMPLE: 1521 { 1522 gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE); 1523 break; 1524 } 1525 case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 1526 { 1527 gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE); 1528 break; 1529 } 1530 case GL_TEXTURE_CUBE_MAP_ARRAY: 1531 { 1532 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 6 * 2); 1533 break; 1534 } 1535 default: 1536 DE_ASSERT(false); 1537 } 1538 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture"); 1539 1540 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type); 1541 1542 gl.glDeleteTextures(1, &textureID); 1543 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); 1544 } 1545 1546 // no mutable 1547 if (m_target == GL_TEXTURE_2D_MULTISAMPLE || 1548 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) 1549 return; 1550 1551 // test mutable 1552 { 1553 const tcu::ScopedLogSection subsection (m_testCtx.getLog(), "Mutable", "Mutable"); 1554 GLuint textureID = 0; 1555 1556 gl.glGenTextures(1, &textureID); 1557 gl.glBindTexture(m_target, textureID); 1558 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); 1559 1560 switch (m_target) 1561 { 1562 case GL_TEXTURE_2D: 1563 { 1564 gl.glTexImage2D(m_target, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); 1565 break; 1566 } 1567 case GL_TEXTURE_CUBE_MAP: 1568 { 1569 gl.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); 1570 break; 1571 } 1572 case GL_TEXTURE_2D_ARRAY: 1573 case GL_TEXTURE_3D: 1574 { 1575 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); 1576 break; 1577 } 1578 case GL_TEXTURE_CUBE_MAP_ARRAY: 1579 { 1580 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 6 * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); 1581 break; 1582 } 1583 default: 1584 DE_ASSERT(false); 1585 } 1586 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture"); 1587 1588 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type); 1589 1590 gl.glDeleteTextures(1, &textureID); 1591 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); 1592 } 1593 } 1594 1595 class TextureWrapClampToBorderCase : public TextureTest 1596 { 1597 public: 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; 1600 }; 1601 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) 1604 { 1605 } 1606 1607 void TextureWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1608 { 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); 1612 1613 gl.glTexParameteri(m_target, m_pname, GL_REPEAT); 1614 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); 1615 1616 gl.glTexParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT); 1617 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); 1618 1619 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type); 1620 } 1621 1622 class TextureBorderColorCase : public TextureTest 1623 { 1624 public: 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; 1627 }; 1628 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) 1631 { 1632 } 1633 1634 void TextureBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1635 { 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) 1638 { 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); 1641 } 1642 1643 if (m_type == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4) 1644 { 1645 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1646 const tcu::IVec4 color (0x7FFFFFFF, -2, 3, -128); 1647 1648 gl.glTexParameterIiv(m_target, m_pname, color.getPtr()); 1649 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); 1650 1651 verifyStateTextureParamIntegerVec4(result, gl, m_target, m_pname, color, m_type); 1652 } 1653 else if (m_type == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4) 1654 { 1655 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1656 const tcu::UVec4 color (0x8000000ul, 2, 3, 128); 1657 1658 gl.glTexParameterIuiv(m_target, m_pname, color.getPtr()); 1659 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); 1660 1661 verifyStateTextureParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type); 1662 } 1663 else 1664 { 1665 DE_ASSERT(m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4); 1666 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); 1670 1671 gl.glTexParameterfv(m_target, m_pname, color.getPtr()); 1672 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterfv"); 1673 1674 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, color, m_type); 1675 1676 gl.glTexParameteriv(m_target, m_pname, icolor.getPtr()); 1677 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteriv"); 1678 1679 verifyStateTextureParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type); 1680 } 1681 } 1682 1683 class SamplerTest : public tcu::TestCase 1684 { 1685 public: 1686 SamplerTest (tcu::TestContext& testCtx, 1687 const glu::RenderContext& renderCtx, 1688 const char* name, 1689 const char* desc, 1690 TesterType tester, 1691 QueryType type); 1692 1693 void init (void); 1694 IterateResult iterate (void); 1695 1696 virtual void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0; 1697 1698 protected: 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; 1704 }; 1705 1706 SamplerTest::SamplerTest (tcu::TestContext& testCtx, 1707 const glu::RenderContext& renderCtx, 1708 const char* name, 1709 const char* desc, 1710 TesterType tester, 1711 QueryType type) 1712 : TestCase (testCtx, name, desc) 1713 , m_renderCtx (renderCtx) 1714 , m_pname (mapTesterToPname(tester)) 1715 , m_tester (tester) 1716 , m_type (type) 1717 , m_target (0) 1718 { 1719 } 1720 1721 void SamplerTest::init (void) 1722 { 1723 const de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(m_renderCtx)); 1724 RequiredExtensions extensions; 1725 1726 // param 1727 if (!isCoreTextureParam(m_renderCtx.getType(), m_pname)) 1728 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname)); 1729 1730 // query 1731 if (!isCoreQuery(m_renderCtx.getType(), m_type)) 1732 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type)); 1733 1734 // test type 1735 if (!isCoreTester(m_renderCtx.getType(), m_tester)) 1736 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester)); 1737 1738 extensions.check(*ctxInfo); 1739 } 1740 1741 SamplerTest::IterateResult SamplerTest::iterate (void) 1742 { 1743 glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog()); 1744 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 1745 glu::Sampler sampler (m_renderCtx); 1746 1747 gl.enableLogging(true); 1748 1749 m_target = *sampler; 1750 test(gl, result); 1751 m_target = 0; 1752 1753 result.setTestContextResult(m_testCtx); 1754 return STOP; 1755 } 1756 1757 class SamplerWrapCase : public SamplerTest 1758 { 1759 public: 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; 1762 }; 1763 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) 1766 { 1767 } 1768 1769 void SamplerWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1770 { 1771 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 1772 1773 if (!isPureCase) 1774 { 1775 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1776 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type); 1777 } 1778 1779 { 1780 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1781 const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT}; 1782 1783 if (isPureCase) 1784 { 1785 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) 1786 { 1787 if (isPureIntTester(m_tester)) 1788 { 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"); 1792 } 1793 else 1794 { 1795 DE_ASSERT(isPureUintTester(m_tester)); 1796 1797 const glw::GLuint value = wrapValues[ndx]; 1798 gl.glSamplerParameterIuiv(m_target, m_pname, &value); 1799 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); 1800 } 1801 1802 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); 1803 } 1804 } 1805 else 1806 { 1807 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) 1808 { 1809 gl.glSamplerParameteri(m_target, m_pname, wrapValues[ndx]); 1810 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); 1811 1812 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); 1813 } 1814 1815 //check unit conversions with float 1816 1817 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) 1818 { 1819 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]); 1820 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); 1821 1822 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); 1823 } 1824 } 1825 } 1826 } 1827 1828 class SamplerFilterCase : public SamplerTest 1829 { 1830 public: 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; 1833 }; 1834 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) 1837 { 1838 } 1839 1840 void SamplerFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1841 { 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) 1845 : (0); 1846 1847 if (!isPureCase) 1848 { 1849 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1850 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initial, m_type); 1851 } 1852 1853 { 1854 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1855 std::vector<GLenum> values; 1856 1857 values.push_back(GL_NEAREST); 1858 values.push_back(GL_LINEAR); 1859 if (m_pname == GL_TEXTURE_MIN_FILTER) 1860 { 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); 1865 } 1866 1867 if (isPureCase) 1868 { 1869 for (int ndx = 0; ndx < (int)values.size(); ++ndx) 1870 { 1871 if (isPureIntTester(m_tester)) 1872 { 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"); 1876 } 1877 else 1878 { 1879 DE_ASSERT(isPureUintTester(m_tester)); 1880 1881 const glw::GLuint value = values[ndx]; 1882 gl.glSamplerParameterIuiv(m_target, m_pname, &value); 1883 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); 1884 } 1885 1886 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); 1887 } 1888 } 1889 else 1890 { 1891 for (int ndx = 0; ndx < (int)values.size(); ++ndx) 1892 { 1893 gl.glSamplerParameteri(m_target, m_pname, values[ndx]); 1894 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); 1895 1896 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); 1897 } 1898 1899 //check unit conversions with float 1900 1901 for (int ndx = 0; ndx < (int)values.size(); ++ndx) 1902 { 1903 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)values[ndx]); 1904 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); 1905 1906 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); 1907 } 1908 } 1909 } 1910 } 1911 1912 class SamplerLODCase : public SamplerTest 1913 { 1914 public: 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; 1917 }; 1918 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) 1921 { 1922 } 1923 1924 void SamplerLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 1925 { 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) 1929 : (-1); 1930 1931 if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase) 1932 { 1933 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 1934 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initialValue, m_type); 1935 } 1936 1937 { 1938 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 1939 const int numIterations = 20; 1940 de::Random rnd (0xabcdef); 1941 1942 if (isPureCase) 1943 { 1944 if (isPureIntTester(m_tester)) 1945 { 1946 for (int ndx = 0; ndx < numIterations; ++ndx) 1947 { 1948 const GLint ref = rnd.getInt(-1000, 1000); 1949 1950 gl.glSamplerParameterIiv(m_target, m_pname, &ref); 1951 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); 1952 1953 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); 1954 } 1955 } 1956 else 1957 { 1958 DE_ASSERT(isPureUintTester(m_tester)); 1959 1960 for (int ndx = 0; ndx < numIterations; ++ndx) 1961 { 1962 const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000); 1963 1964 gl.glSamplerParameterIuiv(m_target, m_pname, &ref); 1965 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); 1966 1967 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); 1968 } 1969 } 1970 } 1971 else 1972 { 1973 const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0); 1974 1975 for (int ndx = 0; ndx < numIterations; ++ndx) 1976 { 1977 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f); 1978 1979 gl.glSamplerParameterf(m_target, m_pname, ref); 1980 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); 1981 1982 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, ref, m_type); 1983 } 1984 1985 // check unit conversions with int 1986 1987 for (int ndx = 0; ndx < numIterations; ++ndx) 1988 { 1989 const GLint ref = rnd.getInt(minLimit, 1000); 1990 1991 gl.glSamplerParameteri(m_target, m_pname, ref); 1992 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); 1993 1994 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); 1995 } 1996 } 1997 } 1998 } 1999 2000 class SamplerCompareModeCase : public SamplerTest 2001 { 2002 public: 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; 2005 }; 2006 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) 2009 { 2010 } 2011 2012 void SamplerCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 2013 { 2014 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 2015 2016 if (!isPureCase) 2017 { 2018 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 2019 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type); 2020 } 2021 2022 { 2023 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 2024 const GLenum modes[] = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE}; 2025 2026 if (isPureCase) 2027 { 2028 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) 2029 { 2030 if (isPureIntTester(m_tester)) 2031 { 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"); 2035 } 2036 else 2037 { 2038 DE_ASSERT(isPureUintTester(m_tester)); 2039 2040 const glw::GLuint value = modes[ndx]; 2041 gl.glSamplerParameterIuiv(m_target, m_pname, &value); 2042 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); 2043 } 2044 2045 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); 2046 } 2047 } 2048 else 2049 { 2050 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) 2051 { 2052 gl.glSamplerParameteri(m_target, m_pname, modes[ndx]); 2053 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); 2054 2055 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); 2056 } 2057 2058 //check unit conversions with float 2059 2060 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) 2061 { 2062 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)modes[ndx]); 2063 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); 2064 2065 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); 2066 } 2067 } 2068 } 2069 } 2070 2071 class SamplerCompareFuncCase : public SamplerTest 2072 { 2073 public: 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; 2076 }; 2077 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) 2080 { 2081 } 2082 2083 void SamplerCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 2084 { 2085 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 2086 2087 if (!isPureCase) 2088 { 2089 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 2090 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type); 2091 } 2092 2093 { 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}; 2096 2097 if (isPureCase) 2098 { 2099 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) 2100 { 2101 if (isPureIntTester(m_tester)) 2102 { 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"); 2106 } 2107 else 2108 { 2109 DE_ASSERT(isPureUintTester(m_tester)); 2110 2111 const glw::GLuint value = compareFuncs[ndx]; 2112 gl.glSamplerParameterIuiv(m_target, m_pname, &value); 2113 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); 2114 } 2115 2116 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); 2117 } 2118 } 2119 else 2120 { 2121 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) 2122 { 2123 gl.glSamplerParameteri(m_target, m_pname, compareFuncs[ndx]); 2124 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); 2125 2126 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); 2127 } 2128 2129 //check unit conversions with float 2130 2131 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) 2132 { 2133 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]); 2134 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); 2135 2136 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); 2137 } 2138 } 2139 } 2140 } 2141 2142 class SamplerWrapClampToBorderCase : public SamplerTest 2143 { 2144 public: 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; 2147 }; 2148 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) 2151 { 2152 } 2153 2154 void SamplerWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 2155 { 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); 2159 2160 gl.glSamplerParameteri(m_target, m_pname, GL_REPEAT); 2161 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); 2162 2163 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT); 2164 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); 2165 2166 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type); 2167 } 2168 2169 class SamplerSRGBDecodeCase : public SamplerTest 2170 { 2171 public: 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; 2174 }; 2175 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) 2178 { 2179 } 2180 2181 void SamplerSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 2182 { 2183 const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); 2184 2185 if (!isPureCase) 2186 { 2187 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 2188 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); 2189 } 2190 2191 { 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; 2195 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); 2199 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); 2203 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); 2207 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); 2211 } 2212 2213 if (isPureIntTester(m_tester)) 2214 { 2215 const glw::GLint skipDecode = GL_SKIP_DECODE_EXT; 2216 const glw::GLint decode = GL_DECODE_EXT; 2217 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); 2221 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); 2225 } 2226 2227 if (isPureUintTester(m_tester)) 2228 { 2229 const glw::GLuint skipDecode = GL_SKIP_DECODE_EXT; 2230 const glw::GLuint decode = GL_DECODE_EXT; 2231 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); 2235 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); 2239 } 2240 } 2241 2242 class SamplerBorderColorCase : public SamplerTest 2243 { 2244 public: 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; 2247 }; 2248 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) 2251 { 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); 2256 } 2257 2258 void SamplerBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const 2259 { 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) 2262 { 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); 2265 } 2266 2267 if (m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4) 2268 { 2269 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 2270 const tcu::IVec4 color (0x7FFFFFFF, -2, 3, -128); 2271 2272 gl.glSamplerParameterIiv(m_target, m_pname, color.getPtr()); 2273 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); 2274 2275 verifyStateSamplerParamIntegerVec4(result, gl, m_target, m_pname, color, m_type); 2276 } 2277 else if (m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4) 2278 { 2279 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); 2280 const tcu::UVec4 color (0x8000000ul, 2, 3, 128); 2281 2282 gl.glSamplerParameterIuiv(m_target, m_pname, color.getPtr()); 2283 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); 2284 2285 verifyStateSamplerParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type); 2286 } 2287 else 2288 { 2289 DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4); 2290 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); 2294 2295 gl.glSamplerParameterfv(m_target, m_pname, color.getPtr()); 2296 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterfv"); 2297 2298 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, color, m_type); 2299 2300 gl.glSamplerParameteriv(m_target, m_pname, icolor.getPtr()); 2301 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteriv"); 2302 2303 verifyStateSamplerParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type); 2304 } 2305 } 2306 2307 } // anonymous 2308 2309 bool isLegalTesterForTarget (glw::GLenum target, TesterType tester) 2310 { 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) 2313 return false; 2314 2315 // no sampling on multisample 2316 if (isMultisampleTarget(target) && isSamplerStateTester(tester)) 2317 return false; 2318 2319 // no states in buffer 2320 if (target == GL_TEXTURE_BUFFER) 2321 return false; 2322 2323 return true; 2324 } 2325 2326 bool isMultisampleTarget (glw::GLenum target) 2327 { 2328 return target == GL_TEXTURE_2D_MULTISAMPLE || 2329 target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY; 2330 } 2331 2332 bool isSamplerStateTester (TesterType tester) 2333 { 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; 2348 } 2349 2350 tcu::TestCase* createIsTextureTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, glw::GLenum target) 2351 { 2352 return new IsTextureCase(testCtx, renderCtx, name.c_str(), description.c_str(), target); 2353 } 2354 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) 2356 { 2357 if (isMultisampleTarget(target) && isSamplerStateTester(tester)) 2358 { 2359 DE_ASSERT(!"Multisample textures have no sampler state"); 2360 return DE_NULL; 2361 } 2362 if (target == GL_TEXTURE_BUFFER) 2363 { 2364 DE_ASSERT(!"Buffer textures have no texture state"); 2365 return DE_NULL; 2366 } 2367 if (target != GL_TEXTURE_3D && mapTesterToPname(tester) == GL_TEXTURE_WRAP_R) 2368 { 2369 DE_ASSERT(!"Only 3D textures have wrap r filter"); 2370 return DE_NULL; 2371 } 2372 2373 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT 2374 2375 switch (tester) 2376 { 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); 2382 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); 2387 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); 2391 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); 2395 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); 2399 2400 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE): 2401 return new TextureCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); 2402 2403 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC): 2404 return new TextureCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); 2405 2406 case TESTER_TEXTURE_IMMUTABLE_LEVELS: 2407 return new TextureImmutableLevelsCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType); 2408 2409 case TESTER_TEXTURE_IMMUTABLE_FORMAT: 2410 return new TextureImmutableFormatCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType); 2411 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); 2416 2417 CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE): 2418 return new DepthStencilModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); 2419 2420 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): 2421 return new TextureSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); 2422 2423 case TESTER_TEXTURE_BORDER_COLOR: 2424 return new TextureBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType); 2425 2426 default: 2427 break; 2428 } 2429 2430 #undef CASE_ALL_SETTERS 2431 2432 DE_ASSERT(false); 2433 return DE_NULL; 2434 } 2435 2436 tcu::TestCase* createSamplerParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, StateQueryUtil::QueryType queryType, TesterType tester) 2437 { 2438 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT 2439 2440 switch (tester) 2441 { 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); 2446 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); 2450 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); 2454 2455 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE): 2456 return new SamplerCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); 2457 2458 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC): 2459 return new SamplerCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); 2460 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); 2465 2466 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): 2467 return new SamplerSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); 2468 2469 case TESTER_TEXTURE_BORDER_COLOR: 2470 return new SamplerBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), queryType); 2471 2472 default: 2473 break; 2474 } 2475 2476 #undef CASE_ALL_SETTERS 2477 2478 DE_ASSERT(false); 2479 return DE_NULL; 2480 } 2481 2482 } // TextureStateQueryTests 2483 } // gls 2484 } // deqp 2485