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 Texture buffer tests 22 *//*--------------------------------------------------------------------*/ 23 24 #include "es31fTextureBufferTests.hpp" 25 26 #include "glsTextureBufferCase.hpp" 27 #include "glsStateQueryUtil.hpp" 28 29 #include "tcuTestLog.hpp" 30 31 #include "gluRenderContext.hpp" 32 #include "gluContextInfo.hpp" 33 #include "gluCallLogWrapper.hpp" 34 #include "gluStrUtil.hpp" 35 36 #include "glwEnums.hpp" 37 38 #include "deStringUtil.hpp" 39 40 #include <string> 41 42 using std::string; 43 using namespace deqp::gls::TextureBufferCaseUtil; 44 using deqp::gls::TextureBufferCase; 45 46 namespace deqp 47 { 48 namespace gles31 49 { 50 namespace Functional 51 { 52 namespace 53 { 54 55 string toTestName (RenderBits renderBits) 56 { 57 struct 58 { 59 RenderBits bit; 60 const char* str; 61 } bitInfos[] = 62 { 63 { RENDERBITS_AS_VERTEX_ARRAY, "as_vertex_array" }, 64 { RENDERBITS_AS_INDEX_ARRAY, "as_index_array" }, 65 { RENDERBITS_AS_VERTEX_TEXTURE, "as_vertex_texture" }, 66 { RENDERBITS_AS_FRAGMENT_TEXTURE, "as_fragment_texture" } 67 }; 68 69 std::ostringstream stream; 70 bool first = true; 71 72 DE_ASSERT(renderBits != 0); 73 74 for (int infoNdx = 0; infoNdx < DE_LENGTH_OF_ARRAY(bitInfos); infoNdx++) 75 { 76 if (renderBits & bitInfos[infoNdx].bit) 77 { 78 stream << (first ? "" : "_") << bitInfos[infoNdx].str; 79 first = false; 80 } 81 } 82 83 return stream.str(); 84 } 85 86 string toTestName (ModifyBits modifyBits) 87 { 88 struct 89 { 90 ModifyBits bit; 91 const char* str; 92 } bitInfos[] = 93 { 94 { MODIFYBITS_BUFFERDATA, "bufferdata" }, 95 { MODIFYBITS_BUFFERSUBDATA, "buffersubdata" }, 96 { MODIFYBITS_MAPBUFFER_WRITE, "mapbuffer_write" }, 97 { MODIFYBITS_MAPBUFFER_READWRITE, "mapbuffer_readwrite" } 98 }; 99 100 std::ostringstream stream; 101 bool first = true; 102 103 DE_ASSERT(modifyBits != 0); 104 105 for (int infoNdx = 0; infoNdx < DE_LENGTH_OF_ARRAY(bitInfos); infoNdx++) 106 { 107 if (modifyBits & bitInfos[infoNdx].bit) 108 { 109 stream << (first ? "" : "_") << bitInfos[infoNdx].str; 110 first = false; 111 } 112 } 113 114 return stream.str(); 115 } 116 117 RenderBits operator| (RenderBits a, RenderBits b) 118 { 119 return (RenderBits)(deUint32(a) | deUint32(b)); 120 } 121 122 } // anonymous 123 124 // Queries 125 126 namespace 127 { 128 129 using namespace gls::StateQueryUtil; 130 131 class LimitQueryCase : public TestCase 132 { 133 public: 134 LimitQueryCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, int minLimit, QueryType type); 135 136 private: 137 IterateResult iterate (void); 138 139 const glw::GLenum m_target; 140 const int m_minValue; 141 const QueryType m_type; 142 }; 143 144 LimitQueryCase::LimitQueryCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minLimit, QueryType type) 145 : TestCase (context, name, desc) 146 , m_target (target) 147 , m_minValue (minLimit) 148 , m_type (type) 149 { 150 } 151 152 LimitQueryCase::IterateResult LimitQueryCase::iterate (void) 153 { 154 TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported"); 155 156 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 157 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 158 159 gl.enableLogging(true); 160 verifyStateIntegerMin(result, gl, m_target, m_minValue, m_type); 161 162 result.setTestContextResult(m_testCtx); 163 return STOP; 164 } 165 166 class AlignmentQueryCase : public TestCase 167 { 168 public: 169 AlignmentQueryCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, int maxAlign, QueryType type); 170 171 private: 172 IterateResult iterate (void); 173 174 const glw::GLenum m_target; 175 const int m_maxValue; 176 const QueryType m_type; 177 }; 178 179 AlignmentQueryCase::AlignmentQueryCase (Context& context, const char* name, const char* desc, glw::GLenum target, int maxAlign, QueryType type) 180 : TestCase (context, name, desc) 181 , m_target (target) 182 , m_maxValue (maxAlign) 183 , m_type (type) 184 { 185 } 186 187 AlignmentQueryCase::IterateResult AlignmentQueryCase::iterate (void) 188 { 189 TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported"); 190 191 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 192 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 193 194 gl.enableLogging(true); 195 verifyStateIntegerMax(result, gl, m_target, m_maxValue, m_type); 196 197 result.setTestContextResult(m_testCtx); 198 return STOP; 199 } 200 201 class TextureBufferBindingQueryCase : public TestCase 202 { 203 public: 204 TextureBufferBindingQueryCase (Context& ctx, const char* name, const char* desc, QueryType type); 205 206 private: 207 IterateResult iterate (void); 208 209 const QueryType m_type; 210 }; 211 212 TextureBufferBindingQueryCase::TextureBufferBindingQueryCase (Context& context, const char* name, const char* desc, QueryType type) 213 : TestCase (context, name, desc) 214 , m_type (type) 215 { 216 } 217 218 TextureBufferBindingQueryCase::IterateResult TextureBufferBindingQueryCase::iterate (void) 219 { 220 TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported"); 221 222 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 223 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 224 225 gl.enableLogging(true); 226 227 // initial 228 { 229 const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial value"); 230 231 verifyStateInteger(result, gl, GL_TEXTURE_BUFFER_BINDING, 0, m_type); 232 } 233 234 // bind 235 { 236 const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After bind"); 237 238 glw::GLuint buffer; 239 240 gl.glGenBuffers(1, &buffer); 241 gl.glBindBuffer(GL_TEXTURE_BUFFER, buffer); 242 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind buffer"); 243 244 verifyStateInteger(result, gl, GL_TEXTURE_BUFFER_BINDING, buffer, m_type); 245 246 gl.glDeleteBuffers(1, &buffer); 247 } 248 249 // after delete 250 { 251 const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After delete"); 252 253 verifyStateInteger(result, gl, GL_TEXTURE_BUFFER_BINDING, 0, m_type); 254 } 255 256 result.setTestContextResult(m_testCtx); 257 return STOP; 258 } 259 260 class TextureBindingBufferQueryCase : public TestCase 261 { 262 public: 263 TextureBindingBufferQueryCase (Context& ctx, const char* name, const char* desc, QueryType type); 264 265 private: 266 IterateResult iterate (void); 267 268 const QueryType m_type; 269 }; 270 271 TextureBindingBufferQueryCase::TextureBindingBufferQueryCase (Context& context, const char* name, const char* desc, QueryType type) 272 : TestCase (context, name, desc) 273 , m_type (type) 274 { 275 } 276 277 TextureBindingBufferQueryCase::IterateResult TextureBindingBufferQueryCase::iterate (void) 278 { 279 TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported"); 280 281 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 282 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 283 284 gl.enableLogging(true); 285 286 // initial 287 { 288 const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial value"); 289 290 verifyStateInteger(result, gl, GL_TEXTURE_BINDING_BUFFER, 0, m_type); 291 } 292 293 // bind 294 { 295 const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After bind"); 296 297 glw::GLuint texture; 298 299 gl.glGenTextures(1, &texture); 300 gl.glBindTexture(GL_TEXTURE_BUFFER, texture); 301 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind texture"); 302 303 verifyStateInteger(result, gl, GL_TEXTURE_BINDING_BUFFER, texture, m_type); 304 305 gl.glDeleteTextures(1, &texture); 306 } 307 308 // after delete 309 { 310 const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After delete"); 311 312 verifyStateInteger(result, gl, GL_TEXTURE_BINDING_BUFFER, 0, m_type); 313 } 314 315 result.setTestContextResult(m_testCtx); 316 return STOP; 317 } 318 319 class TextureBufferDataStoreQueryCase : public TestCase 320 { 321 public: 322 TextureBufferDataStoreQueryCase (Context& ctx, const char* name, const char* desc, QueryType type); 323 324 private: 325 IterateResult iterate (void); 326 327 const QueryType m_type; 328 }; 329 330 TextureBufferDataStoreQueryCase::TextureBufferDataStoreQueryCase (Context& context, const char* name, const char* desc, QueryType type) 331 : TestCase (context, name, desc) 332 , m_type (type) 333 { 334 } 335 336 TextureBufferDataStoreQueryCase::IterateResult TextureBufferDataStoreQueryCase::iterate (void) 337 { 338 TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported"); 339 340 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 341 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 342 343 gl.enableLogging(true); 344 345 // non-buffer 346 { 347 const tcu::ScopedLogSection section(m_testCtx.getLog(), "NonBuffer", "Non-buffer"); 348 349 glw::GLuint texture; 350 351 gl.glGenTextures(1, &texture); 352 gl.glBindTexture(GL_TEXTURE_2D, texture); 353 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32); 354 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "gen texture"); 355 356 verifyStateTextureLevelInteger(result, gl, GL_TEXTURE_2D, 0, GL_TEXTURE_BUFFER_DATA_STORE_BINDING, 0, m_type); 357 358 gl.glDeleteTextures(1, &texture); 359 } 360 361 // buffer 362 { 363 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Buffer", "Texture buffer"); 364 365 glw::GLuint texture; 366 glw::GLuint buffer; 367 368 gl.glGenTextures(1, &texture); 369 gl.glBindTexture(GL_TEXTURE_BUFFER, texture); 370 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind texture"); 371 372 gl.glGenBuffers(1, &buffer); 373 gl.glBindBuffer(GL_TEXTURE_BUFFER, buffer); 374 gl.glBufferData(GL_TEXTURE_BUFFER, 32, DE_NULL, GL_STATIC_DRAW); 375 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind buf"); 376 377 gl.glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, buffer); 378 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "tex buffer"); 379 380 verifyStateTextureLevelInteger(result, gl, GL_TEXTURE_BUFFER, 0, GL_TEXTURE_BUFFER_DATA_STORE_BINDING, buffer, m_type); 381 382 gl.glDeleteTextures(1, &texture); 383 gl.glDeleteBuffers(1, &buffer); 384 } 385 386 result.setTestContextResult(m_testCtx); 387 return STOP; 388 } 389 390 class TextureBufferOffsetQueryCase : public TestCase 391 { 392 public: 393 TextureBufferOffsetQueryCase (Context& ctx, const char* name, const char* desc, QueryType type); 394 395 private: 396 IterateResult iterate (void); 397 398 const QueryType m_type; 399 }; 400 401 TextureBufferOffsetQueryCase::TextureBufferOffsetQueryCase (Context& context, const char* name, const char* desc, QueryType type) 402 : TestCase (context, name, desc) 403 , m_type (type) 404 { 405 } 406 407 TextureBufferOffsetQueryCase::IterateResult TextureBufferOffsetQueryCase::iterate (void) 408 { 409 TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported"); 410 411 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 412 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 413 414 gl.enableLogging(true); 415 416 // non-buffer 417 { 418 const tcu::ScopedLogSection section(m_testCtx.getLog(), "NonBuffer", "Non-buffer"); 419 420 glw::GLuint texture; 421 422 gl.glGenTextures(1, &texture); 423 gl.glBindTexture(GL_TEXTURE_2D, texture); 424 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32); 425 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "gen texture"); 426 427 verifyStateTextureLevelInteger(result, gl, GL_TEXTURE_2D, 0, GL_TEXTURE_BUFFER_OFFSET, 0, m_type); 428 429 gl.glDeleteTextures(1, &texture); 430 } 431 432 // buffer 433 { 434 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Buffer", "Texture buffer"); 435 436 glw::GLuint texture; 437 glw::GLuint buffer; 438 439 gl.glGenTextures(1, &texture); 440 gl.glBindTexture(GL_TEXTURE_BUFFER, texture); 441 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind texture"); 442 443 gl.glGenBuffers(1, &buffer); 444 gl.glBindBuffer(GL_TEXTURE_BUFFER, buffer); 445 gl.glBufferData(GL_TEXTURE_BUFFER, 1024, DE_NULL, GL_STATIC_DRAW); 446 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind buf"); 447 448 { 449 const tcu::ScopedLogSection subsection(m_testCtx.getLog(), "Offset0", "Offset 0"); 450 gl.glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, buffer); 451 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "tex buffer"); 452 453 verifyStateTextureLevelInteger(result, gl, GL_TEXTURE_BUFFER, 0, GL_TEXTURE_BUFFER_OFFSET, 0, m_type); 454 } 455 { 456 const tcu::ScopedLogSection subsection(m_testCtx.getLog(), "Offset256", "Offset 256"); 457 gl.glTexBufferRange(GL_TEXTURE_BUFFER, GL_R32UI, buffer, 256, 512); 458 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "tex buffer"); 459 460 verifyStateTextureLevelInteger(result, gl, GL_TEXTURE_BUFFER, 0, GL_TEXTURE_BUFFER_OFFSET, 256, m_type); 461 } 462 463 gl.glDeleteTextures(1, &texture); 464 gl.glDeleteBuffers(1, &buffer); 465 } 466 467 result.setTestContextResult(m_testCtx); 468 return STOP; 469 } 470 471 class TextureBufferSizeQueryCase : public TestCase 472 { 473 public: 474 TextureBufferSizeQueryCase (Context& ctx, const char* name, const char* desc, QueryType type); 475 476 private: 477 IterateResult iterate (void); 478 479 const QueryType m_type; 480 }; 481 482 TextureBufferSizeQueryCase::TextureBufferSizeQueryCase (Context& context, const char* name, const char* desc, QueryType type) 483 : TestCase (context, name, desc) 484 , m_type (type) 485 { 486 } 487 488 TextureBufferSizeQueryCase::IterateResult TextureBufferSizeQueryCase::iterate (void) 489 { 490 TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported"); 491 492 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 493 tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 494 495 gl.enableLogging(true); 496 497 // non-buffer 498 { 499 const tcu::ScopedLogSection section(m_testCtx.getLog(), "NonBuffer", "Non-buffer"); 500 501 glw::GLuint texture; 502 503 gl.glGenTextures(1, &texture); 504 gl.glBindTexture(GL_TEXTURE_2D, texture); 505 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32); 506 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "gen texture"); 507 508 verifyStateTextureLevelInteger(result, gl, GL_TEXTURE_2D, 0, GL_TEXTURE_BUFFER_SIZE, 0, m_type); 509 510 gl.glDeleteTextures(1, &texture); 511 } 512 513 // buffer 514 { 515 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Buffer", "Texture buffer"); 516 517 glw::GLuint texture; 518 glw::GLuint buffer; 519 520 gl.glGenTextures(1, &texture); 521 gl.glBindTexture(GL_TEXTURE_BUFFER, texture); 522 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind texture"); 523 524 gl.glGenBuffers(1, &buffer); 525 gl.glBindBuffer(GL_TEXTURE_BUFFER, buffer); 526 gl.glBufferData(GL_TEXTURE_BUFFER, 1024, DE_NULL, GL_STATIC_DRAW); 527 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind buf"); 528 529 { 530 const tcu::ScopedLogSection subsection(m_testCtx.getLog(), "SizeAll", "Bind whole buffer"); 531 gl.glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, buffer); 532 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "tex buffer"); 533 534 verifyStateTextureLevelInteger(result, gl, GL_TEXTURE_BUFFER, 0, GL_TEXTURE_BUFFER_SIZE, 1024, m_type); 535 } 536 { 537 const tcu::ScopedLogSection subsection(m_testCtx.getLog(), "Partial", "Partial buffer"); 538 gl.glTexBufferRange(GL_TEXTURE_BUFFER, GL_R32UI, buffer, 256, 512); 539 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "tex buffer"); 540 541 verifyStateTextureLevelInteger(result, gl, GL_TEXTURE_BUFFER, 0, GL_TEXTURE_BUFFER_SIZE, 512, m_type); 542 } 543 544 gl.glDeleteTextures(1, &texture); 545 gl.glDeleteBuffers(1, &buffer); 546 } 547 548 result.setTestContextResult(m_testCtx); 549 return STOP; 550 } 551 552 } // anonymous 553 554 TestCaseGroup* createTextureBufferTests (Context& context) 555 { 556 TestCaseGroup* const root = new TestCaseGroup(context, "texture_buffer", "Texture buffer syncronization tests"); 557 558 const size_t bufferSizes[] = 559 { 560 512, 561 513, 562 65536, 563 65537, 564 131071 565 }; 566 567 const size_t rangeSizes[] = 568 { 569 512, 570 513, 571 65537, 572 98304, 573 }; 574 575 const size_t offsets[] = 576 { 577 1, 578 7 579 }; 580 581 const RenderBits renderTypeCombinations[] = 582 { 583 RENDERBITS_AS_VERTEX_ARRAY, 584 RENDERBITS_AS_INDEX_ARRAY, 585 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_INDEX_ARRAY, 586 587 RENDERBITS_AS_VERTEX_TEXTURE, 588 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE, 589 RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE, 590 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE, 591 592 RENDERBITS_AS_FRAGMENT_TEXTURE, 593 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_FRAGMENT_TEXTURE, 594 RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_FRAGMENT_TEXTURE, 595 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_FRAGMENT_TEXTURE, 596 RENDERBITS_AS_VERTEX_TEXTURE | RENDERBITS_AS_FRAGMENT_TEXTURE, 597 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE | RENDERBITS_AS_FRAGMENT_TEXTURE, 598 RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE | RENDERBITS_AS_FRAGMENT_TEXTURE, 599 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE | RENDERBITS_AS_FRAGMENT_TEXTURE 600 }; 601 602 const ModifyBits modifyTypes[] = 603 { 604 MODIFYBITS_BUFFERDATA, 605 MODIFYBITS_BUFFERSUBDATA, 606 MODIFYBITS_MAPBUFFER_WRITE, 607 MODIFYBITS_MAPBUFFER_READWRITE 608 }; 609 610 // State and limit queries 611 { 612 TestCaseGroup* const queryGroup = new TestCaseGroup(context, "state_query", "Query states and limits"); 613 root->addChild(queryGroup); 614 615 queryGroup->addChild(new LimitQueryCase (context, "max_texture_buffer_size_getboolean", "Test MAX_TEXTURE_BUFFER_SIZE", GL_MAX_TEXTURE_BUFFER_SIZE, 65536, QUERY_BOOLEAN)); 616 queryGroup->addChild(new LimitQueryCase (context, "max_texture_buffer_size_getinteger", "Test MAX_TEXTURE_BUFFER_SIZE", GL_MAX_TEXTURE_BUFFER_SIZE, 65536, QUERY_INTEGER)); 617 queryGroup->addChild(new LimitQueryCase (context, "max_texture_buffer_size_getinteger64", "Test MAX_TEXTURE_BUFFER_SIZE", GL_MAX_TEXTURE_BUFFER_SIZE, 65536, QUERY_INTEGER64)); 618 queryGroup->addChild(new LimitQueryCase (context, "max_texture_buffer_size_getfloat", "Test MAX_TEXTURE_BUFFER_SIZE", GL_MAX_TEXTURE_BUFFER_SIZE, 65536, QUERY_FLOAT)); 619 queryGroup->addChild(new AlignmentQueryCase (context, "texture_buffer_offset_alignment_getboolean", "Test TEXTURE_BUFFER_OFFSET_ALIGNMENT", GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, 256, QUERY_BOOLEAN)); 620 queryGroup->addChild(new AlignmentQueryCase (context, "texture_buffer_offset_alignment_getinteger", "Test TEXTURE_BUFFER_OFFSET_ALIGNMENT", GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, 256, QUERY_INTEGER)); 621 queryGroup->addChild(new AlignmentQueryCase (context, "texture_buffer_offset_alignment_getinteger64", "Test TEXTURE_BUFFER_OFFSET_ALIGNMENT", GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, 256, QUERY_INTEGER64)); 622 queryGroup->addChild(new AlignmentQueryCase (context, "texture_buffer_offset_alignment_getfloat", "Test TEXTURE_BUFFER_OFFSET_ALIGNMENT", GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, 256, QUERY_FLOAT)); 623 624 queryGroup->addChild(new TextureBufferBindingQueryCase(context, "texture_buffer_binding_getboolean", "TEXTURE_BUFFER_BINDING", QUERY_BOOLEAN)); 625 queryGroup->addChild(new TextureBufferBindingQueryCase(context, "texture_buffer_binding_getinteger", "TEXTURE_BUFFER_BINDING", QUERY_INTEGER)); 626 queryGroup->addChild(new TextureBufferBindingQueryCase(context, "texture_buffer_binding_getinteger64", "TEXTURE_BUFFER_BINDING", QUERY_INTEGER64)); 627 queryGroup->addChild(new TextureBufferBindingQueryCase(context, "texture_buffer_binding_getfloat", "TEXTURE_BUFFER_BINDING", QUERY_FLOAT)); 628 629 queryGroup->addChild(new TextureBindingBufferQueryCase(context, "texture_binding_buffer_getboolean", "TEXTURE_BINDING_BUFFER", QUERY_BOOLEAN)); 630 queryGroup->addChild(new TextureBindingBufferQueryCase(context, "texture_binding_buffer_getinteger", "TEXTURE_BINDING_BUFFER", QUERY_INTEGER)); 631 queryGroup->addChild(new TextureBindingBufferQueryCase(context, "texture_binding_buffer_getinteger64", "TEXTURE_BINDING_BUFFER", QUERY_INTEGER64)); 632 queryGroup->addChild(new TextureBindingBufferQueryCase(context, "texture_binding_buffer_getfloat", "TEXTURE_BINDING_BUFFER", QUERY_FLOAT)); 633 634 queryGroup->addChild(new TextureBufferDataStoreQueryCase(context, "texture_buffer_data_store_binding_integer", "TEXTURE_BUFFER_DATA_STORE_BINDING", QUERY_TEXTURE_LEVEL_INTEGER)); 635 queryGroup->addChild(new TextureBufferDataStoreQueryCase(context, "texture_buffer_data_store_binding_float", "TEXTURE_BUFFER_DATA_STORE_BINDING", QUERY_TEXTURE_LEVEL_FLOAT)); 636 637 queryGroup->addChild(new TextureBufferOffsetQueryCase(context, "texture_buffer_offset_integer", "TEXTURE_BUFFER_OFFSET", QUERY_TEXTURE_LEVEL_INTEGER)); 638 queryGroup->addChild(new TextureBufferOffsetQueryCase(context, "texture_buffer_offset_float", "TEXTURE_BUFFER_OFFSET", QUERY_TEXTURE_LEVEL_FLOAT)); 639 640 queryGroup->addChild(new TextureBufferSizeQueryCase(context, "texture_buffer_size_integer", "TEXTURE_BUFFER_SIZE", QUERY_TEXTURE_LEVEL_INTEGER)); 641 queryGroup->addChild(new TextureBufferSizeQueryCase(context, "texture_buffer_size_float", "TEXTURE_BUFFER_SIZE", QUERY_TEXTURE_LEVEL_FLOAT)); 642 } 643 644 // Rendering test 645 { 646 TestCaseGroup* const renderGroup = new TestCaseGroup(context, "render", "Setup texture buffer with glBufferData and render data in different ways"); 647 root->addChild(renderGroup); 648 649 for (int renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypeCombinations); renderTypeNdx++) 650 { 651 const RenderBits renderType = renderTypeCombinations[renderTypeNdx]; 652 TestCaseGroup* const renderTypeGroup = new TestCaseGroup(context, toTestName(renderType).c_str(), toTestName(renderType).c_str()); 653 654 renderGroup->addChild(renderTypeGroup); 655 656 for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(bufferSizes); sizeNdx++) 657 { 658 const size_t size = bufferSizes[sizeNdx]; 659 const string name ("buffer_size_" + de::toString(size)); 660 661 renderTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, size, 0, 0, RENDERBITS_NONE, MODIFYBITS_NONE, renderType, name.c_str(), name.c_str())); 662 } 663 664 for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(rangeSizes); sizeNdx++) 665 { 666 const size_t size = rangeSizes[sizeNdx]; 667 const string name ("range_size_" + de::toString(size)); 668 const size_t bufferSize = 131072; 669 670 renderTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, bufferSize, 0, size, RENDERBITS_NONE, MODIFYBITS_NONE, renderType, name.c_str(), name.c_str())); 671 } 672 673 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++) 674 { 675 const size_t offset = offsets[offsetNdx]; 676 const size_t bufferSize = 131072; 677 const size_t size = 65537; 678 const string name ("offset_" + de::toString(offset) + "_alignments"); 679 680 renderTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, bufferSize, offset, size, RENDERBITS_NONE, MODIFYBITS_NONE, renderType, name.c_str(), name.c_str())); 681 } 682 } 683 } 684 685 // Modify tests 686 { 687 TestCaseGroup* const modifyGroup = new TestCaseGroup(context, "modify", "Modify texture buffer content in multiple ways"); 688 root->addChild(modifyGroup); 689 690 for (int modifyNdx = 0; modifyNdx < DE_LENGTH_OF_ARRAY(modifyTypes); modifyNdx++) 691 { 692 const ModifyBits modifyType = modifyTypes[modifyNdx]; 693 TestCaseGroup* const modifyTypeGroup = new TestCaseGroup(context, toTestName(modifyType).c_str(), toTestName(modifyType).c_str()); 694 695 modifyGroup->addChild(modifyTypeGroup); 696 697 for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(bufferSizes); sizeNdx++) 698 { 699 const size_t size = bufferSizes[sizeNdx]; 700 const string name ("buffer_size_" + de::toString(size)); 701 702 modifyTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, size, 0, 0, RENDERBITS_NONE, modifyType, RENDERBITS_AS_FRAGMENT_TEXTURE, name.c_str(), name.c_str())); 703 } 704 705 for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(rangeSizes); sizeNdx++) 706 { 707 const size_t size = rangeSizes[sizeNdx]; 708 const string name ("range_size_" + de::toString(size)); 709 const size_t bufferSize = 131072; 710 711 modifyTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, bufferSize, 0, size, RENDERBITS_NONE, modifyType, RENDERBITS_AS_FRAGMENT_TEXTURE, name.c_str(), name.c_str())); 712 } 713 714 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++) 715 { 716 const size_t offset = offsets[offsetNdx]; 717 const size_t bufferSize = 131072; 718 const size_t size = 65537; 719 const string name ("offset_" + de::toString(offset) + "_alignments"); 720 721 modifyTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, bufferSize, offset, size, RENDERBITS_NONE, modifyType, RENDERBITS_AS_FRAGMENT_TEXTURE, name.c_str(), name.c_str())); 722 } 723 } 724 } 725 726 // Modify-Render tests 727 { 728 TestCaseGroup* const modifyRenderGroup = new TestCaseGroup(context, "modify_render", "Modify texture buffer content in multiple ways and render in different ways"); 729 root->addChild(modifyRenderGroup); 730 731 for (int modifyNdx = 0; modifyNdx < DE_LENGTH_OF_ARRAY(modifyTypes); modifyNdx++) 732 { 733 const ModifyBits modifyType = modifyTypes[modifyNdx]; 734 TestCaseGroup* const modifyTypeGroup = new TestCaseGroup(context, toTestName(modifyType).c_str(), toTestName(modifyType).c_str()); 735 736 modifyRenderGroup->addChild(modifyTypeGroup); 737 738 for (int renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypeCombinations); renderTypeNdx++) 739 { 740 const RenderBits renderType = renderTypeCombinations[renderTypeNdx]; 741 const size_t size = 16*1024; 742 const string name (toTestName(renderType)); 743 744 modifyTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, size, 0, 0, RENDERBITS_NONE, modifyType, renderType, name.c_str(), name.c_str())); 745 } 746 } 747 } 748 749 // Render-Modify tests 750 { 751 TestCaseGroup* const renderModifyGroup = new TestCaseGroup(context, "render_modify", "Render texture buffer and modify."); 752 root->addChild(renderModifyGroup); 753 754 for (int renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypeCombinations); renderTypeNdx++) 755 { 756 const RenderBits renderType = renderTypeCombinations[renderTypeNdx]; 757 TestCaseGroup* const renderTypeGroup = new TestCaseGroup(context, toTestName(renderType).c_str(), toTestName(renderType).c_str()); 758 759 renderModifyGroup->addChild(renderTypeGroup); 760 761 for (int modifyNdx = 0; modifyNdx < DE_LENGTH_OF_ARRAY(modifyTypes); modifyNdx++) 762 { 763 const ModifyBits modifyType = modifyTypes[modifyNdx]; 764 const size_t size = 16*1024; 765 const string name (toTestName(modifyType)); 766 767 renderTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, size, 0, 0, renderType, modifyType, RENDERBITS_AS_FRAGMENT_TEXTURE, name.c_str(), name.c_str())); 768 } 769 } 770 } 771 772 return root; 773 } 774 775 } // Functional 776 } // gles31 777 } // deqp 778