es31fIntegerStateQueryTests.cpp revision d2246f12e33c86e2db0eb09cdda77737243c674a
1/*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES 3.1 Module 3 * ------------------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Integer state query tests 22 *//*--------------------------------------------------------------------*/ 23 24#include "es31fIntegerStateQueryTests.hpp" 25#include "tcuTestLog.hpp" 26#include "gluRenderContext.hpp" 27#include "gluCallLogWrapper.hpp" 28#include "gluContextInfo.hpp" 29#include "gluObjectWrapper.hpp" 30#include "gluShaderProgram.hpp" 31#include "gluStrUtil.hpp" 32#include "glwFunctions.hpp" 33#include "glwEnums.hpp" 34#include "glsStateQueryUtil.hpp" 35#include "deRandom.hpp" 36#include "deStringUtil.hpp" 37 38namespace deqp 39{ 40namespace gles31 41{ 42namespace Functional 43{ 44namespace 45{ 46 47using namespace gls::StateQueryUtil; 48 49static const char* getVerifierSuffix (QueryType type) 50{ 51 switch (type) 52 { 53 case QUERY_BOOLEAN: return "getboolean"; 54 case QUERY_INTEGER: return "getinteger"; 55 case QUERY_INTEGER64: return "getinteger64"; 56 case QUERY_FLOAT: return "getfloat"; 57 default: 58 DE_ASSERT(DE_FALSE); 59 return DE_NULL; 60 } 61} 62 63class MaxSamplesCase : public TestCase 64{ 65public: 66 MaxSamplesCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType); 67private: 68 IterateResult iterate (void); 69 70 const glw::GLenum m_target; 71 const int m_minValue; 72 const QueryType m_verifierType; 73}; 74 75MaxSamplesCase::MaxSamplesCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType) 76 : TestCase (context, name, desc) 77 , m_target (target) 78 , m_minValue (minValue) 79 , m_verifierType (verifierType) 80{ 81} 82 83MaxSamplesCase::IterateResult MaxSamplesCase::iterate (void) 84{ 85 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 86 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 87 88 gl.enableLogging(true); 89 verifyStateIntegerMin(result, gl, m_target, m_minValue, m_verifierType); 90 91 result.setTestContextResult(m_testCtx); 92 return STOP; 93} 94 95class TexBindingCase : public TestCase 96{ 97public: 98 TexBindingCase (Context& context, const char* name, const char* desc, glw::GLenum texTarget, glw::GLenum bindTarget, QueryType verifierType); 99private: 100 void init (void); 101 IterateResult iterate (void); 102 103 const glw::GLenum m_texTarget; 104 const glw::GLenum m_bindTarget; 105 const QueryType m_verifierType; 106}; 107 108TexBindingCase::TexBindingCase (Context& context, const char* name, const char* desc, glw::GLenum texTarget, glw::GLenum bindTarget, QueryType verifierType) 109 : TestCase (context, name, desc) 110 , m_texTarget (texTarget) 111 , m_bindTarget (bindTarget) 112 , m_verifierType (verifierType) 113{ 114} 115 116void TexBindingCase::init (void) 117{ 118 if (m_texTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array")) 119 throw tcu::NotSupportedError("Test requires OES_texture_storage_multisample_2d_array extension"); 120 if (m_texTarget == GL_TEXTURE_CUBE_MAP_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array")) 121 throw tcu::NotSupportedError("Test requires GL_EXT_texture_cube_map_array extension"); 122} 123 124TexBindingCase::IterateResult TexBindingCase::iterate (void) 125{ 126 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 127 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 128 129 gl.enableLogging(true); 130 131 // initial 132 { 133 const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial value"); 134 135 verifyStateInteger(result, gl, m_bindTarget, 0, m_verifierType); 136 } 137 138 // bind 139 { 140 const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After bind"); 141 142 glw::GLuint texture; 143 144 gl.glGenTextures(1, &texture); 145 gl.glBindTexture(m_texTarget, texture); 146 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind texture"); 147 148 verifyStateInteger(result, gl, m_bindTarget, texture, m_verifierType); 149 150 gl.glDeleteTextures(1, &texture); 151 } 152 153 // after delete 154 { 155 const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After delete"); 156 157 verifyStateInteger(result, gl, m_bindTarget, 0, m_verifierType); 158 } 159 160 result.setTestContextResult(m_testCtx); 161 return STOP; 162} 163 164class MinimumValueCase : public TestCase 165{ 166public: 167 MinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType); 168private: 169 IterateResult iterate (void); 170 171 const glw::GLenum m_target; 172 const int m_minValue; 173 const QueryType m_verifierType; 174}; 175 176MinimumValueCase::MinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType) 177 : TestCase (context, name, desc) 178 , m_target (target) 179 , m_minValue (minValue) 180 , m_verifierType (verifierType) 181{ 182} 183 184MinimumValueCase::IterateResult MinimumValueCase::iterate (void) 185{ 186 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 187 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 188 189 gl.enableLogging(true); 190 verifyStateIntegerMin(result, gl, m_target, m_minValue, m_verifierType); 191 192 result.setTestContextResult(m_testCtx); 193 return STOP; 194} 195 196class AlignmentCase : public TestCase 197{ 198public: 199 AlignmentCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType); 200private: 201 IterateResult iterate (void); 202 203 const glw::GLenum m_target; 204 const int m_minValue; 205 const QueryType m_verifierType; 206}; 207 208AlignmentCase::AlignmentCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType) 209 : TestCase (context, name, desc) 210 , m_target (target) 211 , m_minValue (minValue) 212 , m_verifierType (verifierType) 213{ 214} 215 216AlignmentCase::IterateResult AlignmentCase::iterate (void) 217{ 218 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 219 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 220 221 gl.enableLogging(true); 222 verifyStateIntegerMax(result, gl, m_target, m_minValue, m_verifierType); 223 224 result.setTestContextResult(m_testCtx); 225 return STOP; 226} 227 228class BufferBindingCase : public TestCase 229{ 230public: 231 BufferBindingCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bindingPoint, QueryType verifierType); 232private: 233 IterateResult iterate (void); 234 235 const glw::GLenum m_queryTarget; 236 const glw::GLenum m_bindingPoint; 237 const QueryType m_verifierType; 238}; 239 240BufferBindingCase::BufferBindingCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bindingPoint, QueryType verifierType) 241 : TestCase (context, name, desc) 242 , m_queryTarget (queryTarget) 243 , m_bindingPoint (bindingPoint) 244 , m_verifierType (verifierType) 245{ 246} 247 248BufferBindingCase::IterateResult BufferBindingCase::iterate (void) 249{ 250 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 251 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 252 253 gl.enableLogging(true); 254 255 { 256 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value"); 257 258 verifyStateInteger(result, gl, m_queryTarget, 0, m_verifierType); 259 } 260 261 { 262 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterBinding", "After binding"); 263 glu::Buffer buf (m_context.getRenderContext()); 264 265 gl.glBindBuffer(m_bindingPoint, *buf); 266 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup"); 267 268 verifyStateInteger(result, gl, m_queryTarget, *buf, m_verifierType); 269 } 270 271 { 272 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterDelete", "After deleting"); 273 glw::GLuint buf = 0; 274 275 gl.glGenBuffers(1, &buf); 276 gl.glBindBuffer(m_bindingPoint, buf); 277 gl.glDeleteBuffers(1, &buf); 278 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup"); 279 280 verifyStateInteger(result, gl, m_queryTarget, 0, m_verifierType); 281 } 282 283 result.setTestContextResult(m_testCtx); 284 return STOP; 285} 286 287class ProgramPipelineBindingCase : public TestCase 288{ 289public: 290 ProgramPipelineBindingCase (Context& context, const char* name, const char* desc, QueryType verifierType); 291private: 292 IterateResult iterate (void); 293 294 const QueryType m_verifierType; 295}; 296 297ProgramPipelineBindingCase::ProgramPipelineBindingCase (Context& context, const char* name, const char* desc, QueryType verifierType) 298 : TestCase (context, name, desc) 299 , m_verifierType (verifierType) 300{ 301} 302 303ProgramPipelineBindingCase::IterateResult ProgramPipelineBindingCase::iterate (void) 304{ 305 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 306 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 307 308 gl.enableLogging(true); 309 310 { 311 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value"); 312 313 verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, 0, m_verifierType); 314 } 315 316 { 317 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterBinding", "After binding"); 318 glu::ProgramPipeline pipeline (m_context.getRenderContext()); 319 320 gl.glBindProgramPipeline(pipeline.getPipeline()); 321 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup"); 322 323 verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, pipeline.getPipeline(), m_verifierType); 324 } 325 326 { 327 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterDelete", "After deleting"); 328 glw::GLuint pipeline = 0; 329 330 gl.glGenProgramPipelines(1, &pipeline); 331 gl.glBindProgramPipeline(pipeline); 332 gl.glDeleteProgramPipelines(1, &pipeline); 333 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup"); 334 335 verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, 0, m_verifierType); 336 } 337 338 result.setTestContextResult(m_testCtx); 339 return STOP; 340} 341 342class FramebufferMinimumValueCase : public TestCase 343{ 344public: 345 FramebufferMinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, glw::GLenum tiedTo, QueryType verifierType); 346private: 347 IterateResult iterate (void); 348 349 const glw::GLenum m_target; 350 const glw::GLenum m_tiedTo; 351 const int m_minValue; 352 const QueryType m_verifierType; 353}; 354 355FramebufferMinimumValueCase::FramebufferMinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, glw::GLenum tiedTo, QueryType verifierType) 356 : TestCase (context, name, desc) 357 , m_target (target) 358 , m_tiedTo (tiedTo) 359 , m_minValue (minValue) 360 , m_verifierType (verifierType) 361{ 362} 363 364FramebufferMinimumValueCase::IterateResult FramebufferMinimumValueCase::iterate (void) 365{ 366 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 367 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 368 369 gl.enableLogging(true); 370 371 { 372 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Minimum", "Specified minimum is " + de::toString(m_minValue)); 373 374 verifyStateIntegerMin(result, gl, m_target, m_minValue, m_verifierType); 375 } 376 { 377 const tcu::ScopedLogSection section (m_testCtx.getLog(), "Ties", "The limit is tied to the value of " + de::toString(glu::getGettableStateStr(m_tiedTo))); 378 StateQueryMemoryWriteGuard<glw::GLint> tiedToValue; 379 380 gl.glGetIntegerv(m_tiedTo, &tiedToValue); 381 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv"); 382 383 if (tiedToValue.verifyValidity(result)) 384 verifyStateIntegerMin(result, gl, m_target, tiedToValue, m_verifierType); 385 } 386 387 result.setTestContextResult(m_testCtx); 388 return STOP; 389} 390 391class LegacyVectorLimitCase : public TestCase 392{ 393public: 394 LegacyVectorLimitCase (Context& context, const char* name, const char* desc, glw::GLenum legacyTarget, glw::GLenum componentTarget, QueryType verifierType); 395private: 396 IterateResult iterate (void); 397 398 const glw::GLenum m_legacyTarget; 399 const glw::GLenum m_componentTarget; 400 const QueryType m_verifierType; 401}; 402 403LegacyVectorLimitCase::LegacyVectorLimitCase (Context& context, const char* name, const char* desc, glw::GLenum legacyTarget, glw::GLenum componentTarget, QueryType verifierType) 404 : TestCase (context, name, desc) 405 , m_legacyTarget (legacyTarget) 406 , m_componentTarget (componentTarget) 407 , m_verifierType (verifierType) 408{ 409} 410 411LegacyVectorLimitCase::IterateResult LegacyVectorLimitCase::iterate (void) 412{ 413 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 414 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 415 416 gl.enableLogging(true); 417 418 { 419 const tcu::ScopedLogSection section(m_testCtx.getLog(), "TiedTo", de::toString(glu::getGettableStateStr(m_legacyTarget)) + 420 " is " + 421 de::toString(glu::getGettableStateStr(m_componentTarget)) + 422 " divided by four"); 423 424 StateQueryMemoryWriteGuard<glw::GLint> value; 425 gl.glGetIntegerv(m_componentTarget, &value); 426 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv"); 427 428 if (value.verifyValidity(result)) 429 verifyStateInteger(result, gl, m_legacyTarget, ((int)value) / 4, m_verifierType); 430 } 431 432 result.setTestContextResult(m_testCtx); 433 return STOP; 434} 435 436class CombinedComputeUniformComponentsCase : public TestCase 437{ 438public: 439 CombinedComputeUniformComponentsCase (Context& context, const char* name, const char* desc, QueryType verifierType); 440private: 441 IterateResult iterate (void); 442 443 const QueryType m_verifierType; 444}; 445 446CombinedComputeUniformComponentsCase::CombinedComputeUniformComponentsCase (Context& context, const char* name, const char* desc, QueryType verifierType) 447 : TestCase (context, name, desc) 448 , m_verifierType (verifierType) 449{ 450} 451 452CombinedComputeUniformComponentsCase::IterateResult CombinedComputeUniformComponentsCase::iterate (void) 453{ 454 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 455 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 456 457 gl.enableLogging(true); 458 459 m_testCtx.getLog() << tcu::TestLog::Message 460 << "The minimum value of MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS is MAX_COMPUTE_UNIFORM_BLOCKS x MAX_UNIFORM_BLOCK_SIZE / 4 + MAX_COMPUTE_UNIFORM_COMPONENTS" 461 << tcu::TestLog::EndMessage; 462 463 StateQueryMemoryWriteGuard<glw::GLint> maxUniformBlocks; 464 gl.glGetIntegerv(GL_MAX_COMPUTE_UNIFORM_BLOCKS, &maxUniformBlocks); 465 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv"); 466 467 StateQueryMemoryWriteGuard<glw::GLint> maxUniformBlockSize; 468 gl.glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize); 469 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv"); 470 471 StateQueryMemoryWriteGuard<glw::GLint> maxUniformComponents; 472 gl.glGetIntegerv(GL_MAX_COMPUTE_UNIFORM_COMPONENTS, &maxUniformComponents); 473 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv"); 474 475 if (maxUniformBlocks.verifyValidity(result) && maxUniformBlockSize.verifyValidity(result) && maxUniformComponents.verifyValidity(result)) 476 verifyStateIntegerMin(result, gl, GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS, ((int)maxUniformBlocks) * ((int)maxUniformBlockSize) / 4 + (int)maxUniformComponents, m_verifierType); 477 478 result.setTestContextResult(m_testCtx); 479 return STOP; 480} 481 482class TextureGatherLimitCase : public TestCase 483{ 484public: 485 TextureGatherLimitCase (Context& context, const char* name, const char* desc, bool isMaxCase, QueryType verifierType); 486private: 487 IterateResult iterate (void); 488 489 const bool m_isMaxCase; 490 const QueryType m_verifierType; 491}; 492 493TextureGatherLimitCase::TextureGatherLimitCase (Context& context, const char* name, const char* desc, bool isMaxCase, QueryType verifierType) 494 : TestCase (context, name, desc) 495 , m_isMaxCase (isMaxCase) 496 , m_verifierType (verifierType) 497{ 498} 499 500TextureGatherLimitCase::IterateResult TextureGatherLimitCase::iterate (void) 501{ 502 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 503 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 504 505 gl.enableLogging(true); 506 507 if (m_isMaxCase) 508 { 509 // range [0, inf) 510 verifyStateIntegerMin(result, gl, GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, 0, m_verifierType); 511 } 512 else 513 { 514 // range (-inf, 0] 515 verifyStateIntegerMax(result, gl, GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, 0, m_verifierType); 516 } 517 518 result.setTestContextResult(m_testCtx); 519 return STOP; 520} 521 522class MaxUniformBufferBindingsCase : public TestCase 523{ 524public: 525 MaxUniformBufferBindingsCase (Context& context, const char* name, const char* desc, QueryType verifierType); 526private: 527 IterateResult iterate (void); 528 529 const QueryType m_verifierType; 530}; 531 532MaxUniformBufferBindingsCase::MaxUniformBufferBindingsCase (Context& context, const char* name, const char* desc, QueryType verifierType) 533 : TestCase (context, name, desc) 534 , m_verifierType (verifierType) 535{ 536} 537 538MaxUniformBufferBindingsCase::IterateResult MaxUniformBufferBindingsCase::iterate (void) 539{ 540 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 541 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 542 int minMax; 543 544 gl.enableLogging(true); 545 546 if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader")) 547 { 548 m_testCtx.getLog() << tcu::TestLog::Message 549 << "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_UNIFORM_BUFFER_BINDINGS to 72" 550 << tcu::TestLog::EndMessage; 551 minMax = 72; 552 } 553 else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) 554 { 555 m_testCtx.getLog() << tcu::TestLog::Message 556 << "GL_EXT_geometry_shader increases the minimum value of GL_MAX_UNIFORM_BUFFER_BINDINGS to 48" 557 << tcu::TestLog::EndMessage; 558 minMax = 48; 559 } 560 else 561 { 562 minMax = 36; 563 } 564 565 // range [0, inf) 566 verifyStateIntegerMin(result, gl, GL_MAX_UNIFORM_BUFFER_BINDINGS, minMax, m_verifierType); 567 568 result.setTestContextResult(m_testCtx); 569 return STOP; 570} 571 572class MaxCombinedUniformBlocksCase : public TestCase 573{ 574public: 575 MaxCombinedUniformBlocksCase (Context& context, const char* name, const char* desc, QueryType verifierType); 576private: 577 IterateResult iterate (void); 578 579 const QueryType m_verifierType; 580}; 581 582MaxCombinedUniformBlocksCase::MaxCombinedUniformBlocksCase (Context& context, const char* name, const char* desc, QueryType verifierType) 583 : TestCase (context, name, desc) 584 , m_verifierType (verifierType) 585{ 586} 587 588MaxCombinedUniformBlocksCase::IterateResult MaxCombinedUniformBlocksCase::iterate (void) 589{ 590 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 591 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 592 int minMax; 593 594 gl.enableLogging(true); 595 596 if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader")) 597 { 598 m_testCtx.getLog() << tcu::TestLog::Message 599 << "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_COMBINED_UNIFORM_BLOCKS to 60" 600 << tcu::TestLog::EndMessage; 601 minMax = 60; 602 } 603 else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) 604 { 605 m_testCtx.getLog() << tcu::TestLog::Message 606 << "GL_EXT_geometry_shader increases the minimum value of GL_MAX_COMBINED_UNIFORM_BLOCKS to 36" 607 << tcu::TestLog::EndMessage; 608 minMax = 36; 609 } 610 else 611 { 612 minMax = 24; 613 } 614 615 // range [0, inf) 616 verifyStateIntegerMin(result, gl, GL_MAX_COMBINED_UNIFORM_BLOCKS, minMax, m_verifierType); 617 618 result.setTestContextResult(m_testCtx); 619 return STOP; 620} 621 622class MaxCombinedTexImageUnitsCase : public TestCase 623{ 624public: 625 MaxCombinedTexImageUnitsCase (Context& context, const char* name, const char* desc, QueryType verifierType); 626private: 627 IterateResult iterate (void); 628 629 const QueryType m_verifierType; 630}; 631 632MaxCombinedTexImageUnitsCase::MaxCombinedTexImageUnitsCase (Context& context, const char* name, const char* desc, QueryType verifierType) 633 : TestCase (context, name, desc) 634 , m_verifierType (verifierType) 635{ 636} 637 638MaxCombinedTexImageUnitsCase::IterateResult MaxCombinedTexImageUnitsCase::iterate (void) 639{ 640 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 641 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 642 int minMax; 643 644 gl.enableLogging(true); 645 646 if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader")) 647 { 648 m_testCtx.getLog() << tcu::TestLog::Message 649 << "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS to 96" 650 << tcu::TestLog::EndMessage; 651 minMax = 96; 652 } 653 else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) 654 { 655 m_testCtx.getLog() << tcu::TestLog::Message 656 << "GL_EXT_geometry_shader increases the minimum value of GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS to 36" 657 << tcu::TestLog::EndMessage; 658 minMax = 64; 659 } 660 else 661 { 662 minMax = 48; 663 } 664 665 // range [0, inf) 666 verifyStateIntegerMin(result, gl, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, minMax, m_verifierType); 667 668 result.setTestContextResult(m_testCtx); 669 return STOP; 670} 671 672} // anonymous 673 674IntegerStateQueryTests::IntegerStateQueryTests (Context& context) 675 : TestCaseGroup(context, "integer", "Integer state query tests") 676{ 677} 678 679IntegerStateQueryTests::~IntegerStateQueryTests (void) 680{ 681} 682 683void IntegerStateQueryTests::init (void) 684{ 685 // Verifiers 686 const QueryType verifiers[] = { QUERY_BOOLEAN, QUERY_INTEGER, QUERY_INTEGER64, QUERY_FLOAT }; 687 688#define FOR_EACH_VERIFIER(X) \ 689 for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx) \ 690 { \ 691 const char* verifierSuffix = getVerifierSuffix(verifiers[verifierNdx]); \ 692 const QueryType verifier = verifiers[verifierNdx]; \ 693 this->addChild(X); \ 694 } 695 696 FOR_EACH_VERIFIER(new MaxSamplesCase(m_context, (std::string() + "max_color_texture_samples_" + verifierSuffix).c_str(), "Test GL_MAX_COLOR_TEXTURE_SAMPLES", GL_MAX_COLOR_TEXTURE_SAMPLES, 1, verifier)) 697 FOR_EACH_VERIFIER(new MaxSamplesCase(m_context, (std::string() + "max_depth_texture_samples_" + verifierSuffix).c_str(), "Test GL_MAX_DEPTH_TEXTURE_SAMPLES", GL_MAX_DEPTH_TEXTURE_SAMPLES, 1, verifier)) 698 FOR_EACH_VERIFIER(new MaxSamplesCase(m_context, (std::string() + "max_integer_samples_" + verifierSuffix).c_str(), "Test GL_MAX_INTEGER_SAMPLES", GL_MAX_INTEGER_SAMPLES, 1, verifier)) 699 700 FOR_EACH_VERIFIER(new TexBindingCase(m_context, (std::string() + "texture_binding_2d_multisample_" + verifierSuffix).c_str(), "Test TEXTURE_BINDING_2D_MULTISAMPLE", GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BINDING_2D_MULTISAMPLE, verifier)) 701 FOR_EACH_VERIFIER(new TexBindingCase(m_context, (std::string() + "texture_binding_2d_multisample_array_" + verifierSuffix).c_str(), "Test TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY", GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY, verifier)) 702 FOR_EACH_VERIFIER(new TexBindingCase(m_context, (std::string() + "texture_binding_cube_map_array_" + verifierSuffix).c_str(), "Test TEXTURE_BINDING_CUBE_MAP_ARRAY", GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_BINDING_CUBE_MAP_ARRAY, verifier)) 703 704 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_vertex_attrib_relative_offset_" + verifierSuffix).c_str(), "Test MAX_VERTEX_ATTRIB_RELATIVE_OFFSET", GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, 2047, verifier)) 705 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_vertex_attrib_bindings_" + verifierSuffix).c_str(), "Test MAX_VERTEX_ATTRIB_BINDINGS", GL_MAX_VERTEX_ATTRIB_BINDINGS, 16, verifier)) 706 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_vertex_attrib_stride_" + verifierSuffix).c_str(), "Test MAX_VERTEX_ATTRIB_STRIDE", GL_MAX_VERTEX_ATTRIB_STRIDE, 2048, verifier)) 707 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_sample_mask_words_" + verifierSuffix).c_str(), "Test MAX_SAMPLE_MASK_WORDS", GL_MAX_SAMPLE_MASK_WORDS, 1, verifier)) 708 709 FOR_EACH_VERIFIER(new AlignmentCase(m_context, (std::string() + "shader_storage_buffer_offset_alignment_" + verifierSuffix).c_str(), "Test SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT", GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, 256, verifier)) 710 711 FOR_EACH_VERIFIER(new BufferBindingCase(m_context, (std::string() + "draw_indirect_buffer_binding_" + verifierSuffix).c_str(), "Test DRAW_INDIRECT_BUFFER_BINDING", GL_DRAW_INDIRECT_BUFFER_BINDING, GL_DRAW_INDIRECT_BUFFER, verifier)) 712 FOR_EACH_VERIFIER(new BufferBindingCase(m_context, (std::string() + "atomic_counter_buffer_binding_" + verifierSuffix).c_str(), "Test ATOMIC_COUNTER_BUFFER_BINDING", GL_ATOMIC_COUNTER_BUFFER_BINDING, GL_ATOMIC_COUNTER_BUFFER, verifier)) 713 FOR_EACH_VERIFIER(new BufferBindingCase(m_context, (std::string() + "shader_storage_buffer_binding_" + verifierSuffix).c_str(), "Test SHADER_STORAGE_BUFFER_BINDING", GL_SHADER_STORAGE_BUFFER_BINDING, GL_SHADER_STORAGE_BUFFER, verifier)) 714 FOR_EACH_VERIFIER(new BufferBindingCase(m_context, (std::string() + "dispatch_indirect_buffer_binding_" + verifierSuffix).c_str(), "Test DISPATCH_INDIRECT_BUFFER_BINDING", GL_DISPATCH_INDIRECT_BUFFER_BINDING, GL_DISPATCH_INDIRECT_BUFFER, verifier)) 715 716 FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context, (std::string() + "max_framebuffer_width_" + verifierSuffix).c_str(), "Test MAX_FRAMEBUFFER_WIDTH", GL_MAX_FRAMEBUFFER_WIDTH, 2048, GL_MAX_TEXTURE_SIZE, verifier)) 717 FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context, (std::string() + "max_framebuffer_height_" + verifierSuffix).c_str(), "Test MAX_FRAMEBUFFER_HEIGHT", GL_MAX_FRAMEBUFFER_HEIGHT, 2048, GL_MAX_TEXTURE_SIZE, verifier)) 718 FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context, (std::string() + "max_framebuffer_samples_" + verifierSuffix).c_str(), "Test MAX_FRAMEBUFFER_SAMPLES", GL_MAX_FRAMEBUFFER_SAMPLES, 4, GL_MAX_SAMPLES, verifier)) 719 720 FOR_EACH_VERIFIER(new ProgramPipelineBindingCase(m_context, (std::string() + "program_pipeline_binding_" + verifierSuffix).c_str(), "Test PROGRAM_PIPELINE_BINDING", verifier)) 721 722 // vertex 723 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_vertex_atomic_counter_buffers_" + verifierSuffix).c_str(), "Test MAX_VERTEX_ATOMIC_COUNTER_BUFFERS", GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS, 0, verifier)) 724 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_vertex_atomic_counters_" + verifierSuffix).c_str(), "Test MAX_VERTEX_ATOMIC_COUNTERS", GL_MAX_VERTEX_ATOMIC_COUNTERS, 0, verifier)) 725 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_vertex_image_uniforms_" + verifierSuffix).c_str(), "Test MAX_VERTEX_IMAGE_UNIFORMS", GL_MAX_VERTEX_IMAGE_UNIFORMS, 0, verifier)) 726 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_vertex_shader_storage_blocks_" + verifierSuffix).c_str(), "Test MAX_VERTEX_SHADER_STORAGE_BLOCKS", GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, 0, verifier)) 727 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_vertex_uniform_components_" + verifierSuffix).c_str(), "Test MAX_VERTEX_UNIFORM_COMPONENTS", GL_MAX_VERTEX_UNIFORM_COMPONENTS, 1024, verifier)) 728 729 // fragment 730 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_fragment_atomic_counter_buffers_" + verifierSuffix).c_str(), "Test MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS", GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, 0, verifier)) 731 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_fragment_atomic_counters_" + verifierSuffix).c_str(), "Test MAX_FRAGMENT_ATOMIC_COUNTERS", GL_MAX_FRAGMENT_ATOMIC_COUNTERS, 0, verifier)) 732 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_fragment_image_uniforms_" + verifierSuffix).c_str(), "Test MAX_FRAGMENT_IMAGE_UNIFORMS", GL_MAX_FRAGMENT_IMAGE_UNIFORMS, 0, verifier)) 733 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_fragment_shader_storage_blocks_" + verifierSuffix).c_str(), "Test MAX_FRAGMENT_SHADER_STORAGE_BLOCKS", GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, 0, verifier)) 734 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_fragment_uniform_components_" + verifierSuffix).c_str(), "Test MAX_FRAGMENT_UNIFORM_COMPONENTS", GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, 1024, verifier)) 735 736 // compute 737 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_work_group_invocations_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_WORK_GROUP_INVOCATIONS", GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, 128, verifier)) 738 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_uniform_blocks_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_UNIFORM_BLOCKS", GL_MAX_COMPUTE_UNIFORM_BLOCKS, 12, verifier)) 739 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_texture_image_units_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_TEXTURE_IMAGE_UNITS", GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS, 16, verifier)) 740 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_shared_memory_size_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_SHARED_MEMORY_SIZE", GL_MAX_COMPUTE_SHARED_MEMORY_SIZE, 16384, verifier)) 741 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_uniform_components_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_UNIFORM_COMPONENTS", GL_MAX_COMPUTE_UNIFORM_COMPONENTS, 1024, verifier)) 742 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_atomic_counter_buffers_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS", GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, 1, verifier)) 743 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_atomic_counters_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_ATOMIC_COUNTERS", GL_MAX_COMPUTE_ATOMIC_COUNTERS, 8, verifier)) 744 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_image_uniforms_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_IMAGE_UNIFORMS", GL_MAX_COMPUTE_IMAGE_UNIFORMS, 4, verifier)) 745 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_compute_shader_storage_blocks_" + verifierSuffix).c_str(), "Test MAX_COMPUTE_SHADER_STORAGE_BLOCKS", GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS, 4, verifier)) 746 747 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_uniform_locations_" + verifierSuffix).c_str(), "Test MAX_UNIFORM_LOCATIONS", GL_MAX_UNIFORM_LOCATIONS, 1024, verifier)) 748 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_atomic_counter_buffer_bindings_" + verifierSuffix).c_str(), "Test MAX_ATOMIC_COUNTER_BUFFER_BINDINGS", GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, 1, verifier)) 749 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_atomic_counter_buffer_size_" + verifierSuffix).c_str(), "Test MAX_ATOMIC_COUNTER_BUFFER_SIZE", GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE, 32, verifier)) 750 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_combined_atomic_counter_buffers_" + verifierSuffix).c_str(), "Test MAX_COMBINED_ATOMIC_COUNTER_BUFFERS", GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, 1, verifier)) 751 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_combined_atomic_counters_" + verifierSuffix).c_str(), "Test MAX_COMBINED_ATOMIC_COUNTERS", GL_MAX_COMBINED_ATOMIC_COUNTERS, 8, verifier)) 752 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_image_units_" + verifierSuffix).c_str(), "Test MAX_IMAGE_UNITS", GL_MAX_IMAGE_UNITS, 4, verifier)) 753 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_combined_image_uniforms_" + verifierSuffix).c_str(), "Test MAX_COMBINED_IMAGE_UNIFORMS", GL_MAX_COMBINED_IMAGE_UNIFORMS, 4, verifier)) 754 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_shader_storage_buffer_bindings_" + verifierSuffix).c_str(), "Test MAX_SHADER_STORAGE_BUFFER_BINDINGS", GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, 4, verifier)) 755 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_shader_storage_block_size_" + verifierSuffix).c_str(), "Test MAX_SHADER_STORAGE_BLOCK_SIZE", GL_MAX_SHADER_STORAGE_BLOCK_SIZE, 1<<27, verifier)) 756 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_combined_shader_storage_blocks_" + verifierSuffix).c_str(), "Test MAX_COMBINED_SHADER_STORAGE_BLOCKS", GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS, 4, verifier)) 757 FOR_EACH_VERIFIER(new MinimumValueCase(m_context, (std::string() + "max_combined_shader_output_resources_" + verifierSuffix).c_str(), "Test MAX_COMBINED_SHADER_OUTPUT_RESOURCES", GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES, 4, verifier)) 758 759 FOR_EACH_VERIFIER(new MaxUniformBufferBindingsCase (m_context, (std::string() + "max_uniform_buffer_bindings_" + verifierSuffix).c_str(), "Test MAX_UNIFORM_BUFFER_BINDINGS", verifier)) 760 FOR_EACH_VERIFIER(new MaxCombinedUniformBlocksCase (m_context, (std::string() + "max_combined_uniform_blocks_" + verifierSuffix).c_str(), "Test MAX_COMBINED_UNIFORM_BLOCKS", verifier)) 761 FOR_EACH_VERIFIER(new MaxCombinedTexImageUnitsCase (m_context, (std::string() + "max_combined_texture_image_units_" + verifierSuffix).c_str(), "Test MAX_COMBINED_TEXTURE_IMAGE_UNITS", verifier)) 762 FOR_EACH_VERIFIER(new CombinedComputeUniformComponentsCase (m_context, (std::string() + "max_combined_compute_uniform_components_" + verifierSuffix).c_str(), "Test MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS", verifier)) 763 764 FOR_EACH_VERIFIER(new LegacyVectorLimitCase(m_context, (std::string() + "max_vertex_uniform_vectors_" + verifierSuffix).c_str(), "Test MAX_VERTEX_UNIFORM_VECTORS", GL_MAX_VERTEX_UNIFORM_VECTORS, GL_MAX_VERTEX_UNIFORM_COMPONENTS, verifier)) 765 FOR_EACH_VERIFIER(new LegacyVectorLimitCase(m_context, (std::string() + "max_fragment_uniform_vectors_" + verifierSuffix).c_str(), "Test MAX_FRAGMENT_UNIFORM_VECTORS", GL_MAX_FRAGMENT_UNIFORM_VECTORS, GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, verifier)) 766 767 FOR_EACH_VERIFIER(new TextureGatherLimitCase(m_context, (std::string() + "min_program_texture_gather_offset_" + verifierSuffix).c_str(), "Test MIN_PROGRAM_TEXTURE_GATHER_OFFSET", false, verifier)) 768 FOR_EACH_VERIFIER(new TextureGatherLimitCase(m_context, (std::string() + "max_program_texture_gather_offset_" + verifierSuffix).c_str(), "Test MAX_PROGRAM_TEXTURE_GATHER_OFFSET", true, verifier)) 769 770#undef FOR_EACH_VERIFIER 771} 772 773} // Functional 774} // gles31 775} // deqp 776