glsStateQueryUtil.cpp revision 654d8c53a77c4fac3c57c6e7abf1fa940e715899
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 State Query test utils. 22 *//*--------------------------------------------------------------------*/ 23#include "glsStateQueryUtil.hpp" 24#include "tcuTestContext.hpp" 25#include "tcuFormatUtil.hpp" 26#include "gluCallLogWrapper.hpp" 27#include "gluStrUtil.hpp" 28#include "glwEnums.hpp" 29#include "deStringUtil.hpp" 30 31namespace deqp 32{ 33namespace gls 34{ 35namespace StateQueryUtil 36{ 37 38static bool checkError (tcu::ResultCollector& result, glu::CallLogWrapper& gl, const char* msg) 39{ 40 const glw::GLenum errorCode = gl.glGetError(); 41 42 if (errorCode == GL_NO_ERROR) 43 return true; 44 45 result.fail(std::string(msg) + ": glGetError() returned " + glu::getErrorStr(errorCode).toString()); 46 return false; 47} 48 49QueriedState::QueriedState (void) 50 : m_type(DATATYPE_LAST) 51{ 52} 53 54QueriedState::QueriedState (glw::GLint v) 55 : m_type(DATATYPE_INTEGER) 56{ 57 m_v.vInt = v; 58} 59 60QueriedState::QueriedState (glw::GLint64 v) 61 : m_type(DATATYPE_INTEGER64) 62{ 63 m_v.vInt64 = v; 64} 65 66QueriedState::QueriedState (glw::GLboolean v) 67 : m_type(DATATYPE_BOOLEAN) 68{ 69 m_v.vBool = v; 70} 71 72QueriedState::QueriedState (glw::GLfloat v) 73 : m_type(DATATYPE_FLOAT) 74{ 75 m_v.vFloat = v; 76} 77 78QueriedState::QueriedState (glw::GLuint v) 79 : m_type(DATATYPE_UNSIGNED_INTEGER) 80{ 81 m_v.vUint = v; 82} 83 84QueriedState::QueriedState (const GLIntVec3& v) 85 : m_type(DATATYPE_INTEGER_VEC3) 86{ 87 m_v.vIntVec3[0] = v[0]; 88 m_v.vIntVec3[1] = v[1]; 89 m_v.vIntVec3[2] = v[2]; 90} 91 92bool QueriedState::isUndefined (void) const 93{ 94 return m_type == DATATYPE_LAST; 95} 96 97DataType QueriedState::getType (void) const 98{ 99 return m_type; 100} 101 102glw::GLint& QueriedState::getIntAccess (void) 103{ 104 DE_ASSERT(m_type == DATATYPE_INTEGER); 105 return m_v.vInt; 106} 107 108glw::GLint64& QueriedState::getInt64Access (void) 109{ 110 DE_ASSERT(m_type == DATATYPE_INTEGER64); 111 return m_v.vInt64; 112} 113 114glw::GLboolean& QueriedState::getBoolAccess (void) 115{ 116 DE_ASSERT(m_type == DATATYPE_BOOLEAN); 117 return m_v.vBool; 118} 119 120glw::GLfloat& QueriedState::getFloatAccess (void) 121{ 122 DE_ASSERT(m_type == DATATYPE_FLOAT); 123 return m_v.vFloat; 124} 125 126glw::GLuint& QueriedState::getUintAccess (void) 127{ 128 DE_ASSERT(m_type == DATATYPE_UNSIGNED_INTEGER); 129 return m_v.vUint; 130} 131 132QueriedState::GLIntVec3& QueriedState::getIntVec3Access (void) 133{ 134 DE_ASSERT(m_type == DATATYPE_INTEGER_VEC3); 135 return m_v.vIntVec3; 136} 137 138// query 139 140void queryState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, QueriedState& state) 141{ 142 switch (type) 143 { 144 case QUERY_ISENABLED: 145 { 146 const glw::GLboolean value = gl.glIsEnabled(target); 147 148 if (!checkError(result, gl, "glIsEnabled")) 149 return; 150 151 state = QueriedState(value); 152 break; 153 } 154 155 case QUERY_BOOLEAN: 156 { 157 StateQueryMemoryWriteGuard<glw::GLboolean> value; 158 gl.glGetBooleanv(target, &value); 159 160 if (!checkError(result, gl, "glGetBooleanv")) 161 return; 162 163 if (!value.verifyValidity(result)) 164 return; 165 166 state = QueriedState(value); 167 break; 168 } 169 170 case QUERY_INTEGER: 171 { 172 StateQueryMemoryWriteGuard<glw::GLint> value; 173 gl.glGetIntegerv(target, &value); 174 175 if (!checkError(result, gl, "glGetIntegerv")) 176 return; 177 178 if (!value.verifyValidity(result)) 179 return; 180 181 state = QueriedState(value); 182 break; 183 } 184 185 case QUERY_INTEGER64: 186 { 187 StateQueryMemoryWriteGuard<glw::GLint64> value; 188 gl.glGetInteger64v(target, &value); 189 190 if (!checkError(result, gl, "glGetInteger64v")) 191 return; 192 193 if (!value.verifyValidity(result)) 194 return; 195 196 state = QueriedState(value); 197 break; 198 } 199 200 case QUERY_FLOAT: 201 { 202 StateQueryMemoryWriteGuard<glw::GLfloat> value; 203 gl.glGetFloatv(target, &value); 204 205 if (!checkError(result, gl, "glGetFloatv")) 206 return; 207 208 if (!value.verifyValidity(result)) 209 return; 210 211 state = QueriedState(value); 212 break; 213 } 214 215 default: 216 DE_ASSERT(DE_FALSE); 217 break; 218 } 219} 220 221void queryIndexedState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int index, QueriedState& state) 222{ 223 switch (type) 224 { 225 case QUERY_INDEXED_BOOLEAN: 226 { 227 StateQueryMemoryWriteGuard<glw::GLboolean> value; 228 gl.glGetBooleani_v(target, index, &value); 229 230 if (!checkError(result, gl, "glGetBooleani_v")) 231 return; 232 233 if (!value.verifyValidity(result)) 234 return; 235 236 state = QueriedState(value); 237 break; 238 } 239 240 case QUERY_INDEXED_INTEGER: 241 { 242 StateQueryMemoryWriteGuard<glw::GLint> value; 243 gl.glGetIntegeri_v(target, index, &value); 244 245 if (!checkError(result, gl, "glGetIntegeri_v")) 246 return; 247 248 if (!value.verifyValidity(result)) 249 return; 250 251 state = QueriedState(value); 252 break; 253 } 254 255 case QUERY_INDEXED_INTEGER64: 256 { 257 StateQueryMemoryWriteGuard<glw::GLint64> value; 258 gl.glGetInteger64i_v(target, index, &value); 259 260 if (!checkError(result, gl, "glGetInteger64i_v")) 261 return; 262 263 if (!value.verifyValidity(result)) 264 return; 265 266 state = QueriedState(value); 267 break; 268 } 269 270 default: 271 DE_ASSERT(DE_FALSE); 272 break; 273 } 274} 275 276void queryAttributeState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int index, QueriedState& state) 277{ 278 switch (type) 279 { 280 case QUERY_ATTRIBUTE_INTEGER: 281 { 282 StateQueryMemoryWriteGuard<glw::GLint> value; 283 gl.glGetVertexAttribiv(index, target, &value); 284 285 if (!checkError(result, gl, "glGetVertexAttribiv")) 286 return; 287 288 if (!value.verifyValidity(result)) 289 return; 290 291 state = QueriedState(value); 292 break; 293 } 294 case QUERY_ATTRIBUTE_FLOAT: 295 { 296 StateQueryMemoryWriteGuard<glw::GLfloat> value; 297 gl.glGetVertexAttribfv(index, target, &value); 298 299 if (!checkError(result, gl, "glGetVertexAttribfv")) 300 return; 301 302 if (!value.verifyValidity(result)) 303 return; 304 305 state = QueriedState(value); 306 break; 307 } 308 case QUERY_ATTRIBUTE_PURE_INTEGER: 309 { 310 StateQueryMemoryWriteGuard<glw::GLint> value; 311 gl.glGetVertexAttribIiv(index, target, &value); 312 313 if (!checkError(result, gl, "glGetVertexAttribIiv")) 314 return; 315 316 if (!value.verifyValidity(result)) 317 return; 318 319 state = QueriedState(value); 320 break; 321 } 322 case QUERY_ATTRIBUTE_PURE_UNSIGNED_INTEGER: 323 { 324 StateQueryMemoryWriteGuard<glw::GLuint> value; 325 gl.glGetVertexAttribIuiv(index, target, &value); 326 327 if (!checkError(result, gl, "glGetVertexAttribIuiv")) 328 return; 329 330 if (!value.verifyValidity(result)) 331 return; 332 333 state = QueriedState(value); 334 break; 335 } 336 default: 337 DE_ASSERT(false); 338 } 339} 340 341void queryFramebufferState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, glw::GLenum pname, QueriedState& state) 342{ 343 switch (type) 344 { 345 case QUERY_FRAMEBUFFER_INTEGER: 346 { 347 StateQueryMemoryWriteGuard<glw::GLint> value; 348 gl.glGetFramebufferParameteriv(target, pname, &value); 349 350 if (!checkError(result, gl, "glGetVertexAttribiv")) 351 return; 352 353 if (!value.verifyValidity(result)) 354 return; 355 356 state = QueriedState(value); 357 break; 358 } 359 default: 360 DE_ASSERT(false); 361 } 362} 363 364void queryProgramState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLuint program, glw::GLenum pname, QueriedState& state) 365{ 366 switch (type) 367 { 368 case QUERY_PROGRAM_INTEGER: 369 { 370 StateQueryMemoryWriteGuard<glw::GLint> value; 371 gl.glGetProgramiv(program, pname, &value); 372 373 if (!checkError(result, gl, "glGetProgramiv")) 374 return; 375 376 if (!value.verifyValidity(result)) 377 return; 378 379 state = QueriedState(value); 380 break; 381 } 382 case QUERY_PROGRAM_INTEGER_VEC3: 383 { 384 StateQueryMemoryWriteGuard<glw::GLint[3]> value; 385 gl.glGetProgramiv(program, pname, value); 386 387 if (!checkError(result, gl, "glGetProgramiv")) 388 return; 389 390 if (!value.verifyValidity(result)) 391 return; 392 393 state = QueriedState(value); 394 break; 395 } 396 default: 397 DE_ASSERT(false); 398 } 399} 400 401void queryPipelineState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLuint pipeline, glw::GLenum pname, QueriedState& state) 402{ 403 switch (type) 404 { 405 case QUERY_PIPELINE_INTEGER: 406 { 407 StateQueryMemoryWriteGuard<glw::GLint> value; 408 gl.glGetProgramPipelineiv(pipeline, pname, &value); 409 410 if (!checkError(result, gl, "glGetProgramiv")) 411 return; 412 413 if (!value.verifyValidity(result)) 414 return; 415 416 state = QueriedState(value); 417 break; 418 } 419 default: 420 DE_ASSERT(false); 421 } 422} 423 424void queryTextureParamState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, glw::GLenum pname, QueriedState& state) 425{ 426 switch (type) 427 { 428 case QUERY_TEXTURE_PARAM_INTEGER: 429 { 430 StateQueryMemoryWriteGuard<glw::GLint> value; 431 gl.glGetTexParameteriv(target, pname, &value); 432 433 if (!checkError(result, gl, "glGetTexParameteriv")) 434 return; 435 436 if (!value.verifyValidity(result)) 437 return; 438 439 state = QueriedState(value); 440 break; 441 } 442 case QUERY_TEXTURE_PARAM_FLOAT: 443 { 444 StateQueryMemoryWriteGuard<glw::GLfloat> value; 445 gl.glGetTexParameterfv(target, pname, &value); 446 447 if (!checkError(result, gl, "glGetTexParameterfv")) 448 return; 449 450 if (!value.verifyValidity(result)) 451 return; 452 453 state = QueriedState(value); 454 break; 455 } 456 default: 457 DE_ASSERT(false); 458 } 459} 460 461void queryTextureLevelState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int level, glw::GLenum pname, QueriedState& state) 462{ 463 switch (type) 464 { 465 case QUERY_TEXTURE_LEVEL_INTEGER: 466 { 467 StateQueryMemoryWriteGuard<glw::GLint> value; 468 gl.glGetTexLevelParameteriv(target, level, pname, &value); 469 470 if (!checkError(result, gl, "glGetTexLevelParameteriv")) 471 return; 472 473 if (!value.verifyValidity(result)) 474 return; 475 476 state = QueriedState(value); 477 break; 478 } 479 case QUERY_TEXTURE_LEVEL_FLOAT: 480 { 481 StateQueryMemoryWriteGuard<glw::GLfloat> value; 482 gl.glGetTexLevelParameterfv(target, level, pname, &value); 483 484 if (!checkError(result, gl, "glGetTexLevelParameterfv")) 485 return; 486 487 if (!value.verifyValidity(result)) 488 return; 489 490 state = QueriedState(value); 491 break; 492 } 493 default: 494 DE_ASSERT(false); 495 } 496} 497 498// verify 499 500void verifyBoolean (tcu::ResultCollector& result, QueriedState& state, bool expected) 501{ 502 switch (state.getType()) 503 { 504 case DATATYPE_BOOLEAN: 505 { 506 const glw::GLboolean reference = expected ? GL_TRUE : GL_FALSE; 507 if (state.getBoolAccess() != reference) 508 { 509 std::ostringstream buf; 510 buf << "Expected " << glu::getBooleanStr(reference) << ", got " << glu::getBooleanStr(state.getBoolAccess()); 511 result.fail(buf.str()); 512 } 513 break; 514 } 515 516 case DATATYPE_INTEGER: 517 { 518 const glw::GLint reference = expected ? 1 : 0; 519 if (state.getIntAccess() != reference) 520 { 521 std::ostringstream buf; 522 buf << "Expected " << reference << ", got " << state.getIntAccess(); 523 result.fail(buf.str()); 524 } 525 break; 526 } 527 528 case DATATYPE_INTEGER64: 529 { 530 const glw::GLint64 reference = expected ? 1 : 0; 531 if (state.getInt64Access() != reference) 532 { 533 std::ostringstream buf; 534 buf << "Expected " << reference << ", got " << state.getInt64Access(); 535 result.fail(buf.str()); 536 } 537 break; 538 } 539 540 case DATATYPE_FLOAT: 541 { 542 const glw::GLfloat reference = expected ? 1.0f : 0.0f; 543 if (state.getFloatAccess() != reference) 544 { 545 std::ostringstream buf; 546 buf << "Expected " << reference << ", got " << state.getFloatAccess(); 547 result.fail(buf.str()); 548 } 549 break; 550 } 551 552 default: 553 DE_ASSERT(DE_FALSE); 554 break; 555 } 556} 557 558void verifyInteger (tcu::ResultCollector& result, QueriedState& state, int expected) 559{ 560 switch (state.getType()) 561 { 562 case DATATYPE_BOOLEAN: 563 { 564 const glw::GLboolean reference = (expected == 0) ? (GL_FALSE) : (GL_TRUE); 565 if (state.getBoolAccess() != reference) 566 { 567 std::ostringstream buf; 568 buf << "Expected " << glu::getBooleanStr(reference) << ", got " << glu::getBooleanStr(state.getBoolAccess()); 569 result.fail(buf.str()); 570 } 571 break; 572 } 573 574 case DATATYPE_INTEGER: 575 { 576 const glw::GLint reference = expected; 577 if (state.getIntAccess() != reference) 578 { 579 std::ostringstream buf; 580 buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference)) 581 << ") , got " << state.getIntAccess() << "(" << de::toString(tcu::Format::Hex<8>(state.getIntAccess())) << ")"; 582 result.fail(buf.str()); 583 } 584 break; 585 } 586 587 case DATATYPE_INTEGER64: 588 { 589 const glw::GLint64 reference = (glw::GLint64)expected; 590 if (state.getInt64Access() != reference) 591 { 592 std::ostringstream buf; 593 buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference)) << "), got " 594 << state.getInt64Access() << "(" << de::toString(tcu::Format::Hex<8>(state.getInt64Access())) << ")"; 595 result.fail(buf.str()); 596 } 597 break; 598 } 599 600 case DATATYPE_FLOAT: 601 { 602 const glw::GLfloat reference = (glw::GLfloat)expected; 603 if (state.getFloatAccess() != reference) 604 { 605 std::ostringstream buf; 606 buf << "Expected " << reference << ", got " << state.getFloatAccess(); 607 result.fail(buf.str()); 608 } 609 break; 610 } 611 612 case DATATYPE_UNSIGNED_INTEGER: 613 { 614 const glw::GLuint reference = (glw::GLuint)expected; 615 if (state.getUintAccess() != reference) 616 { 617 std::ostringstream buf; 618 buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference)) << "), got " 619 << state.getInt64Access() << "(" << de::toString(tcu::Format::Hex<8>(state.getInt64Access())) << ")"; 620 result.fail(buf.str()); 621 } 622 break; 623 } 624 625 default: 626 DE_ASSERT(DE_FALSE); 627 break; 628 } 629} 630 631void verifyIntegerMin (tcu::ResultCollector& result, QueriedState& state, int minValue) 632{ 633 switch (state.getType()) 634 { 635 case DATATYPE_BOOLEAN: 636 { 637 if (minValue > 0 && state.getBoolAccess() != GL_TRUE) 638 { 639 std::ostringstream buf; 640 buf << "Expected GL_TRUE, got GL_FALSE"; 641 result.fail(buf.str()); 642 } 643 break; 644 } 645 646 case DATATYPE_INTEGER: 647 { 648 if (state.getIntAccess() < minValue) 649 { 650 std::ostringstream buf; 651 buf << "Expected greater or equal to " << minValue << ", got " << state.getIntAccess(); 652 result.fail(buf.str()); 653 } 654 break; 655 } 656 657 case DATATYPE_INTEGER64: 658 { 659 if (state.getInt64Access() < minValue) 660 { 661 std::ostringstream buf; 662 buf << "Expected greater or equal to " << minValue << ", got " << state.getInt64Access(); 663 result.fail(buf.str()); 664 } 665 break; 666 } 667 668 case DATATYPE_FLOAT: 669 { 670 if (state.getFloatAccess() < minValue) 671 { 672 std::ostringstream buf; 673 buf << "Expected greater or equal to " << minValue << ", got " << state.getFloatAccess(); 674 result.fail(buf.str()); 675 } 676 break; 677 } 678 679 default: 680 DE_ASSERT(DE_FALSE); 681 break; 682 } 683} 684 685void verifyIntegerMax (tcu::ResultCollector& result, QueriedState& state, int maxValue) 686{ 687 switch (state.getType()) 688 { 689 case DATATYPE_BOOLEAN: 690 { 691 if (maxValue < 0 && state.getBoolAccess() != GL_TRUE) 692 { 693 std::ostringstream buf; 694 buf << "Expected GL_TRUE, got GL_FALSE"; 695 result.fail(buf.str()); 696 } 697 break; 698 } 699 700 case DATATYPE_INTEGER: 701 { 702 if (state.getIntAccess() > maxValue) 703 { 704 std::ostringstream buf; 705 buf << "Expected less or equal to " << maxValue << ", got " << state.getIntAccess(); 706 result.fail(buf.str()); 707 } 708 break; 709 } 710 711 case DATATYPE_INTEGER64: 712 { 713 if (state.getInt64Access() > maxValue) 714 { 715 std::ostringstream buf; 716 buf << "Expected less or equal to " << maxValue << ", got " << state.getInt64Access(); 717 result.fail(buf.str()); 718 } 719 break; 720 } 721 722 case DATATYPE_FLOAT: 723 { 724 if (state.getFloatAccess() > maxValue) 725 { 726 std::ostringstream buf; 727 buf << "Expected less or equal to " << maxValue << ", got " << state.getFloatAccess(); 728 result.fail(buf.str()); 729 } 730 break; 731 } 732 733 default: 734 DE_ASSERT(DE_FALSE); 735 break; 736 } 737} 738 739void verifyFloat (tcu::ResultCollector& result, QueriedState& state, float expected) 740{ 741 switch (state.getType()) 742 { 743 case DATATYPE_BOOLEAN: 744 { 745 const glw::GLboolean reference = (expected == 0.0f) ? (GL_FALSE) : (GL_TRUE); 746 if (state.getBoolAccess() != reference) 747 { 748 std::ostringstream buf; 749 buf << "Expected " << glu::getBooleanStr(reference) << ", got " << glu::getBooleanStr(state.getBoolAccess()); 750 result.fail(buf.str()); 751 } 752 break; 753 } 754 755 case DATATYPE_INTEGER: 756 { 757 const glw::GLint refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLint>(expected); 758 const glw::GLint refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLint>(expected); 759 760 if (state.getIntAccess() < refValueMin || 761 state.getIntAccess() > refValueMax) 762 { 763 std::ostringstream buf; 764 765 if (refValueMin == refValueMax) 766 buf << "Expected " << refValueMin << ", got " << state.getIntAccess(); 767 else 768 buf << "Expected in range [" << refValueMin << ", " << refValueMax << "], got " << state.getIntAccess(); 769 770 result.fail(buf.str()); 771 } 772 break; 773 } 774 775 case DATATYPE_FLOAT: 776 { 777 if (state.getFloatAccess() != expected) 778 { 779 std::ostringstream buf; 780 buf << "Expected " << expected << ", got " << state.getFloatAccess(); 781 result.fail(buf.str()); 782 } 783 break; 784 } 785 786 case DATATYPE_INTEGER64: 787 { 788 const glw::GLint64 refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLint64>(expected); 789 const glw::GLint64 refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLint64>(expected); 790 791 if (state.getInt64Access() < refValueMin || 792 state.getInt64Access() > refValueMax) 793 { 794 std::ostringstream buf; 795 796 if (refValueMin == refValueMax) 797 buf << "Expected " << refValueMin << ", got " << state.getInt64Access(); 798 else 799 buf << "Expected in range [" << refValueMin << ", " << refValueMax << "], got " << state.getInt64Access(); 800 801 result.fail(buf.str()); 802 } 803 break; 804 } 805 806 default: 807 DE_ASSERT(DE_FALSE); 808 break; 809 } 810} 811 812void verifyFloatMin (tcu::ResultCollector& result, QueriedState& state, float minValue) 813{ 814 switch (state.getType()) 815 { 816 case DATATYPE_BOOLEAN: 817 { 818 if (minValue > 0.0f && state.getBoolAccess() != GL_TRUE) 819 result.fail("expected GL_TRUE, got GL_FALSE"); 820 break; 821 } 822 823 case DATATYPE_INTEGER: 824 { 825 const glw::GLint refValue = roundGLfloatToNearestIntegerHalfDown<glw::GLint>(minValue); 826 827 if (state.getIntAccess() < refValue) 828 { 829 std::ostringstream buf; 830 buf << "Expected greater or equal to " << refValue << ", got " << state.getIntAccess(); 831 result.fail(buf.str()); 832 } 833 break; 834 } 835 836 case DATATYPE_FLOAT: 837 { 838 if (state.getFloatAccess() < minValue) 839 { 840 std::ostringstream buf; 841 buf << "Expected greater or equal to " << minValue << ", got " << state.getFloatAccess(); 842 result.fail(buf.str()); 843 } 844 break; 845 } 846 847 case DATATYPE_INTEGER64: 848 { 849 const glw::GLint64 refValue = roundGLfloatToNearestIntegerHalfDown<glw::GLint64>(minValue); 850 851 if (state.getInt64Access() < refValue) 852 { 853 std::ostringstream buf; 854 buf << "Expected greater or equal to " << refValue << ", got " << state.getInt64Access(); 855 result.fail(buf.str()); 856 } 857 break; 858 } 859 860 default: 861 DE_ASSERT(DE_FALSE); 862 break; 863 } 864} 865 866void verifyFloatMax (tcu::ResultCollector& result, QueriedState& state, float maxValue) 867{ 868 switch (state.getType()) 869 { 870 case DATATYPE_BOOLEAN: 871 { 872 if (maxValue < 0.0f && state.getBoolAccess() != GL_TRUE) 873 result.fail("expected GL_TRUE, got GL_FALSE"); 874 break; 875 } 876 877 case DATATYPE_INTEGER: 878 { 879 const glw::GLint refValue = roundGLfloatToNearestIntegerHalfUp<glw::GLint>(maxValue); 880 881 if (state.getIntAccess() > refValue) 882 { 883 std::ostringstream buf; 884 buf << "Expected less or equal to " << refValue << ", got " << state.getIntAccess(); 885 result.fail(buf.str()); 886 } 887 break; 888 } 889 890 case DATATYPE_FLOAT: 891 { 892 if (state.getFloatAccess() > maxValue) 893 { 894 std::ostringstream buf; 895 buf << "Expected less or equal to " << maxValue << ", got " << state.getFloatAccess(); 896 result.fail(buf.str()); 897 } 898 break; 899 } 900 901 case DATATYPE_INTEGER64: 902 { 903 const glw::GLint64 refValue = roundGLfloatToNearestIntegerHalfUp<glw::GLint64>(maxValue); 904 905 if (state.getInt64Access() > refValue) 906 { 907 std::ostringstream buf; 908 buf << "Expected less or equal to " << refValue << ", got " << state.getInt64Access(); 909 result.fail(buf.str()); 910 } 911 break; 912 } 913 914 default: 915 DE_ASSERT(DE_FALSE); 916 break; 917 } 918} 919 920void verifyIntegerVec3 (tcu::ResultCollector& result, QueriedState& state, const tcu::IVec3& expected) 921{ 922 switch (state.getType()) 923 { 924 case DATATYPE_INTEGER_VEC3: 925 { 926 if (state.getIntVec3Access()[0] != expected[0] || 927 state.getIntVec3Access()[1] != expected[1] || 928 state.getIntVec3Access()[2] != expected[2]) 929 { 930 std::ostringstream buf; 931 buf << "Expected " << expected << ", got " << state.getIntVec3Access(); 932 result.fail(buf.str()); 933 } 934 break; 935 } 936 937 default: 938 DE_ASSERT(DE_FALSE); 939 break; 940 } 941} 942 943// helpers 944 945void verifyStateBoolean (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, bool refValue, QueryType type) 946{ 947 QueriedState state; 948 949 queryState(result, gl, type, target, state); 950 951 if (!state.isUndefined()) 952 verifyBoolean(result, state, refValue); 953} 954 955void verifyStateInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int refValue, QueryType type) 956{ 957 QueriedState state; 958 959 queryState(result, gl, type, target, state); 960 961 if (!state.isUndefined()) 962 verifyInteger(result, state, refValue); 963} 964 965void verifyStateIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int minValue, QueryType type) 966{ 967 QueriedState state; 968 969 queryState(result, gl, type, target, state); 970 971 if (!state.isUndefined()) 972 verifyIntegerMin(result, state, minValue); 973} 974 975void verifyStateIntegerMax (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int maxValue, QueryType type) 976{ 977 QueriedState state; 978 979 queryState(result, gl, type, target, state); 980 981 if (!state.isUndefined()) 982 verifyIntegerMax(result, state, maxValue); 983} 984 985void verifyStateIntegerEqualToOther (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum other, QueryType type) 986{ 987 QueriedState stateA; 988 QueriedState stateB; 989 990 queryState(result, gl, type, target, stateA); 991 queryState(result, gl, type, other, stateB); 992 993 if (stateA.isUndefined() || stateB.isUndefined()) 994 return; 995 996 switch (type) 997 { 998 case QUERY_BOOLEAN: 999 { 1000 if (stateA.getBoolAccess() != stateB.getBoolAccess()) 1001 result.fail("expected equal results"); 1002 break; 1003 } 1004 1005 case QUERY_INTEGER: 1006 { 1007 if (stateA.getIntAccess() != stateB.getIntAccess()) 1008 result.fail("expected equal results"); 1009 break; 1010 } 1011 1012 case QUERY_INTEGER64: 1013 { 1014 if (stateA.getInt64Access() != stateB.getInt64Access()) 1015 result.fail("expected equal results"); 1016 break; 1017 } 1018 1019 case QUERY_FLOAT: 1020 { 1021 if (stateA.getFloatAccess() != stateB.getFloatAccess()) 1022 result.fail("expected equal results"); 1023 break; 1024 } 1025 1026 default: 1027 DE_ASSERT(DE_FALSE); 1028 break; 1029 } 1030} 1031 1032void verifyStateFloat (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float reference, QueryType type) 1033{ 1034 QueriedState state; 1035 1036 queryState(result, gl, type, target, state); 1037 1038 if (!state.isUndefined()) 1039 verifyFloat(result, state, reference); 1040} 1041 1042void verifyStateFloatMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float minValue, QueryType type) 1043{ 1044 QueriedState state; 1045 1046 queryState(result, gl, type, target, state); 1047 1048 if (!state.isUndefined()) 1049 verifyFloatMin(result, state, minValue); 1050} 1051 1052void verifyStateFloatMax (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float maxValue, QueryType type) 1053{ 1054 QueriedState state; 1055 1056 queryState(result, gl, type, target, state); 1057 1058 if (!state.isUndefined()) 1059 verifyFloatMax(result, state, maxValue); 1060} 1061 1062void verifyStateIndexedBoolean (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, bool expected, QueryType type) 1063{ 1064 QueriedState state; 1065 1066 queryIndexedState(result, gl, type, target, index, state); 1067 1068 if (!state.isUndefined()) 1069 verifyBoolean(result, state, expected); 1070} 1071 1072void verifyStateIndexedInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int expected, QueryType type) 1073{ 1074 QueriedState state; 1075 1076 queryIndexedState(result, gl, type, target, index, state); 1077 1078 if (!state.isUndefined()) 1079 verifyInteger(result, state, expected); 1080} 1081 1082void verifyStateIndexedIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int minValue, QueryType type) 1083{ 1084 QueriedState state; 1085 1086 queryIndexedState(result, gl, type, target, index, state); 1087 1088 if (!state.isUndefined()) 1089 verifyIntegerMin(result, state, minValue); 1090} 1091 1092void verifyStateAttributeInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int expected, QueryType type) 1093{ 1094 QueriedState state; 1095 1096 queryAttributeState(result, gl, type, target, index, state); 1097 1098 if (!state.isUndefined()) 1099 verifyInteger(result, state, expected); 1100} 1101 1102void verifyStateFramebufferInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int expected, QueryType type) 1103{ 1104 QueriedState state; 1105 1106 queryFramebufferState(result, gl, type, target, pname, state); 1107 1108 if (!state.isUndefined()) 1109 verifyInteger(result, state, expected); 1110} 1111 1112void verifyStateFramebufferIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int minValue, QueryType type) 1113{ 1114 QueriedState state; 1115 1116 queryFramebufferState(result, gl, type, target, pname, state); 1117 1118 if (!state.isUndefined()) 1119 verifyIntegerMin(result, state, minValue); 1120} 1121 1122void verifyStateProgramInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint program, glw::GLenum pname, int expected, QueryType type) 1123{ 1124 QueriedState state; 1125 1126 queryProgramState(result, gl, type, program, pname, state); 1127 1128 if (!state.isUndefined()) 1129 verifyInteger(result, state, expected); 1130} 1131 1132void verifyStateProgramIntegerVec3 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint program, glw::GLenum pname, const tcu::IVec3& expected, QueryType type) 1133{ 1134 QueriedState state; 1135 1136 queryProgramState(result, gl, type, program, pname, state); 1137 1138 if (!state.isUndefined()) 1139 verifyIntegerVec3(result, state, expected); 1140} 1141 1142void verifyStatePipelineInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint pipeline, glw::GLenum pname, int expected, QueryType type) 1143{ 1144 QueriedState state; 1145 1146 queryPipelineState(result, gl, type, pipeline, pname, state); 1147 1148 if (!state.isUndefined()) 1149 verifyInteger(result, state, expected); 1150} 1151 1152void verifyStateTextureParamInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int expected, QueryType type) 1153{ 1154 QueriedState state; 1155 1156 queryTextureParamState(result, gl, type, target, pname, state); 1157 1158 if (!state.isUndefined()) 1159 verifyInteger(result, state, expected); 1160} 1161 1162} // StateQueryUtil 1163} // gls 1164} // deqp 1165