1/*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES 3.0 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 Fbo state query tests. 22 *//*--------------------------------------------------------------------*/ 23 24#include "es3fFboStateQueryTests.hpp" 25#include "glsStateQueryUtil.hpp" 26#include "es3fApiCase.hpp" 27#include "gluRenderContext.hpp" 28#include "glwEnums.hpp" 29#include "glwFunctions.hpp" 30#include "tcuRenderTarget.hpp" 31#include "deMath.h" 32 33using namespace glw; // GLint and other GL types 34using deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard; 35 36 37namespace deqp 38{ 39namespace gles3 40{ 41namespace Functional 42{ 43namespace 44{ 45 46void checkAttachmentComponentSizeAtLeast (tcu::TestContext& testCtx, glu::CallLogWrapper& gl, GLenum target, GLenum attachment, int r, int g, int b, int a, int d, int s) 47{ 48 using tcu::TestLog; 49 50 const int referenceSizes[] = {r, g, b, a, d, s}; 51 const GLenum paramNames[] = 52 { 53 GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE, GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE, 54 GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE, 55 GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 56 }; 57 58 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(referenceSizes) == DE_LENGTH_OF_ARRAY(paramNames)); 59 60 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(referenceSizes); ++ndx) 61 { 62 if (referenceSizes[ndx] == -1) 63 continue; 64 65 StateQueryMemoryWriteGuard<GLint> state; 66 gl.glGetFramebufferAttachmentParameteriv(target, attachment, paramNames[ndx], &state); 67 68 if (!state.verifyValidity(testCtx)) 69 { 70 gl.glGetError(); // just log the error 71 continue; 72 } 73 74 if (state < referenceSizes[ndx]) 75 { 76 testCtx.getLog() << TestLog::Message << "// ERROR: Expected greater or equal to " << referenceSizes[ndx] << "; got " << state << TestLog::EndMessage; 77 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS) 78 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value"); 79 } 80 } 81} 82 83void checkAttachmentComponentSizeExactly (tcu::TestContext& testCtx, glu::CallLogWrapper& gl, GLenum target, GLenum attachment, int r, int g, int b, int a, int d, int s) 84{ 85 using tcu::TestLog; 86 87 const int referenceSizes[] = {r, g, b, a, d, s}; 88 const GLenum paramNames[] = 89 { 90 GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE, GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE, 91 GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE, 92 GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 93 }; 94 95 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(referenceSizes) == DE_LENGTH_OF_ARRAY(paramNames)); 96 97 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(referenceSizes); ++ndx) 98 { 99 if (referenceSizes[ndx] == -1) 100 continue; 101 102 StateQueryMemoryWriteGuard<GLint> state; 103 gl.glGetFramebufferAttachmentParameteriv(target, attachment, paramNames[ndx], &state); 104 105 if (!state.verifyValidity(testCtx)) 106 { 107 gl.glGetError(); // just log the error 108 continue; 109 } 110 111 if (state != referenceSizes[ndx]) 112 { 113 testCtx.getLog() << TestLog::Message << "// ERROR: Expected " << referenceSizes[ndx] << "; got " << state << TestLog::EndMessage; 114 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS) 115 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value"); 116 } 117 } 118} 119 120void checkIntEquals (tcu::TestContext& testCtx, GLint got, GLint expected) 121{ 122 using tcu::TestLog; 123 124 if (got != expected) 125 { 126 testCtx.getLog() << TestLog::Message << "// ERROR: Expected " << expected << "; got " << got << TestLog::EndMessage; 127 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS) 128 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value"); 129 } 130} 131 132void checkIntEqualsAny (tcu::TestContext& testCtx, GLint got, GLint expected0, GLint expected1) 133{ 134 using tcu::TestLog; 135 136 if (got != expected0 && got != expected1) 137 { 138 testCtx.getLog() << TestLog::Message << "// ERROR: Expected " << expected0 << " or " << expected1 << "; got " << got << TestLog::EndMessage; 139 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS) 140 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value"); 141 } 142} 143 144void checkAttachmentParam(tcu::TestContext& testCtx, glu::CallLogWrapper& gl, GLenum target, GLenum attachment, GLenum pname, GLenum reference) 145{ 146 StateQueryMemoryWriteGuard<GLint> state; 147 gl.glGetFramebufferAttachmentParameteriv(target, attachment, pname, &state); 148 149 if (state.verifyValidity(testCtx)) 150 checkIntEquals(testCtx, state, reference); 151} 152 153void checkColorAttachmentParam(tcu::TestContext& testCtx, glu::CallLogWrapper& gl, GLenum target, GLenum pname, GLenum reference) 154{ 155 checkAttachmentParam(testCtx, gl, target, GL_COLOR_ATTACHMENT0, pname, reference); 156} 157 158class DefaultFramebufferCase : public ApiCase 159{ 160public: 161 DefaultFramebufferCase (Context& context, const char* name, const char* description, GLenum framebufferTarget) 162 : ApiCase (context, name, description) 163 , m_framebufferTarget (framebufferTarget) 164 { 165 } 166 167 void test (void) 168 { 169 const bool hasColorBuffer = m_context.getRenderTarget().getPixelFormat().redBits > 0 || 170 m_context.getRenderTarget().getPixelFormat().greenBits > 0 || 171 m_context.getRenderTarget().getPixelFormat().blueBits > 0 || 172 m_context.getRenderTarget().getPixelFormat().alphaBits > 0; 173 const GLenum attachments[] = 174 { 175 GL_BACK, 176 GL_DEPTH, 177 GL_STENCIL 178 }; 179 const bool attachmentExists[] = 180 { 181 hasColorBuffer, 182 m_context.getRenderTarget().getDepthBits() > 0, 183 m_context.getRenderTarget().getStencilBits() > 0 184 }; 185 186 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(attachments); ++ndx) 187 { 188 StateQueryMemoryWriteGuard<GLint> state; 189 glGetFramebufferAttachmentParameteriv(m_framebufferTarget, attachments[ndx], GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &state); 190 expectError(GL_NO_ERROR); 191 192 if (state.verifyValidity(m_testCtx)) 193 { 194 if (attachmentExists[ndx]) 195 { 196 checkIntEquals(m_testCtx, state, GL_FRAMEBUFFER_DEFAULT); 197 } 198 else 199 { 200 // \note [jarkko] FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE "identifes the type of object which contains the attached image". However, it 201 // is unclear if an object of type FRAMEBUFFER_DEFAULT can contain a null image (or a 0-bits-per-pixel image). Accept both 202 // FRAMEBUFFER_DEFAULT and NONE as valid results in these cases. 203 checkIntEqualsAny(m_testCtx, state, GL_FRAMEBUFFER_DEFAULT, GL_NONE); 204 } 205 } 206 } 207 } 208 209private: 210 GLenum m_framebufferTarget; 211}; 212 213class AttachmentObjectCase : public ApiCase 214{ 215public: 216 AttachmentObjectCase (Context& context, const char* name, const char* description) 217 : ApiCase(context, name, description) 218 { 219 } 220 221 void test (void) 222 { 223 GLuint framebufferID = 0; 224 glGenFramebuffers(1, &framebufferID); 225 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 226 expectError(GL_NO_ERROR); 227 228 // initial 229 { 230 checkAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE); 231 checkAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 0); 232 expectError(GL_NO_ERROR); 233 } 234 235 // texture 236 { 237 GLuint textureID = 0; 238 glGenTextures(1, &textureID); 239 glBindTexture(GL_TEXTURE_2D, textureID); 240 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); 241 expectError(GL_NO_ERROR); 242 243 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0); 244 expectError(GL_NO_ERROR); 245 246 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); 247 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, textureID); 248 249 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 250 glDeleteTextures(1, &textureID); 251 } 252 253 // rb 254 { 255 GLuint renderbufferID = 0; 256 glGenRenderbuffers(1, &renderbufferID); 257 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 258 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, 128, 128); 259 expectError(GL_NO_ERROR); 260 261 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbufferID); 262 expectError(GL_NO_ERROR); 263 264 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER); 265 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, renderbufferID); 266 267 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 268 glDeleteRenderbuffers(1, &renderbufferID); 269 } 270 271 glDeleteFramebuffers(1, &framebufferID); 272 expectError(GL_NO_ERROR); 273 } 274}; 275 276class AttachmentTextureLevelCase : public ApiCase 277{ 278public: 279 AttachmentTextureLevelCase (Context& context, const char* name, const char* description) 280 : ApiCase(context, name, description) 281 { 282 } 283 284 void test (void) 285 { 286 GLuint framebufferID = 0; 287 glGenFramebuffers(1, &framebufferID); 288 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 289 expectError(GL_NO_ERROR); 290 291 for (int mipmapLevel = 0; mipmapLevel < 7; ++mipmapLevel) 292 { 293 GLuint textureID = 0; 294 glGenTextures(1, &textureID); 295 glBindTexture(GL_TEXTURE_2D, textureID); 296 glTexStorage2D(GL_TEXTURE_2D, 7, GL_RGB8, 128, 128); 297 expectError(GL_NO_ERROR); 298 299 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, mipmapLevel); 300 expectError(GL_NO_ERROR); 301 302 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, mipmapLevel); 303 304 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 305 glDeleteTextures(1, &textureID); 306 } 307 308 glDeleteFramebuffers(1, &framebufferID); 309 expectError(GL_NO_ERROR); 310 } 311}; 312 313class AttachmentTextureCubeMapFaceCase : public ApiCase 314{ 315public: 316 AttachmentTextureCubeMapFaceCase (Context& context, const char* name, const char* description) 317 : ApiCase(context, name, description) 318 { 319 } 320 321 void test (void) 322 { 323 GLuint framebufferID = 0; 324 glGenFramebuffers(1, &framebufferID); 325 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 326 expectError(GL_NO_ERROR); 327 328 { 329 GLuint textureID = 0; 330 glGenTextures(1, &textureID); 331 glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); 332 expectError(GL_NO_ERROR); 333 334 glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGB8, 128, 128); 335 expectError(GL_NO_ERROR); 336 337 const GLenum faces[] = 338 { 339 GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 340 GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 341 GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 342 }; 343 344 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(faces); ++ndx) 345 { 346 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, faces[ndx], textureID, 0); 347 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, faces[ndx]); 348 } 349 350 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 351 glDeleteTextures(1, &textureID); 352 } 353 354 glDeleteFramebuffers(1, &framebufferID); 355 expectError(GL_NO_ERROR); 356 } 357}; 358 359class AttachmentTextureLayerCase : public ApiCase 360{ 361public: 362 AttachmentTextureLayerCase (Context& context, const char* name, const char* description) 363 : ApiCase(context, name, description) 364 { 365 } 366 367 void test (void) 368 { 369 GLuint framebufferID = 0; 370 glGenFramebuffers(1, &framebufferID); 371 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 372 expectError(GL_NO_ERROR); 373 374 // tex3d 375 { 376 GLuint textureID = 0; 377 glGenTextures(1, &textureID); 378 glBindTexture(GL_TEXTURE_3D, textureID); 379 glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 16, 16, 16); 380 381 for (int layer = 0; layer < 16; ++layer) 382 { 383 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0, layer); 384 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, layer); 385 } 386 387 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 388 glDeleteTextures(1, &textureID); 389 } 390 // tex2d array 391 { 392 GLuint textureID = 0; 393 glGenTextures(1, &textureID); 394 glBindTexture(GL_TEXTURE_2D_ARRAY, textureID); 395 glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 16, 16, 16); 396 397 for (int layer = 0; layer < 16; ++layer) 398 { 399 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0, layer); 400 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, layer); 401 } 402 403 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 404 glDeleteTextures(1, &textureID); 405 } 406 407 glDeleteFramebuffers(1, &framebufferID); 408 expectError(GL_NO_ERROR); 409 } 410}; 411 412class AttachmentTextureColorCodingCase : public ApiCase 413{ 414public: 415 AttachmentTextureColorCodingCase (Context& context, const char* name, const char* description) 416 : ApiCase(context, name, description) 417 { 418 } 419 420 void test (void) 421 { 422 GLuint framebufferID = 0; 423 glGenFramebuffers(1, &framebufferID); 424 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 425 expectError(GL_NO_ERROR); 426 427 // rgb8 color 428 { 429 GLuint renderbufferID = 0; 430 glGenRenderbuffers(1, &renderbufferID); 431 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 432 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, 128, 128); 433 expectError(GL_NO_ERROR); 434 435 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbufferID); 436 expectError(GL_NO_ERROR); 437 438 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, GL_LINEAR); 439 440 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 441 glDeleteRenderbuffers(1, &renderbufferID); 442 } 443 444 // srgb8_alpha8 color 445 { 446 GLuint renderbufferID = 0; 447 glGenRenderbuffers(1, &renderbufferID); 448 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 449 glRenderbufferStorage(GL_RENDERBUFFER, GL_SRGB8_ALPHA8, 128, 128); 450 expectError(GL_NO_ERROR); 451 452 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbufferID); 453 expectError(GL_NO_ERROR); 454 455 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, GL_SRGB); 456 457 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 458 glDeleteRenderbuffers(1, &renderbufferID); 459 } 460 461 // depth 462 { 463 GLuint renderbufferID = 0; 464 glGenRenderbuffers(1, &renderbufferID); 465 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 466 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 128, 128); 467 expectError(GL_NO_ERROR); 468 469 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbufferID); 470 expectError(GL_NO_ERROR); 471 472 checkAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, GL_LINEAR); 473 474 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 475 glDeleteRenderbuffers(1, &renderbufferID); 476 } 477 478 glDeleteFramebuffers(1, &framebufferID); 479 expectError(GL_NO_ERROR); 480 } 481}; 482 483class AttachmentTextureComponentTypeCase : public ApiCase 484{ 485public: 486 AttachmentTextureComponentTypeCase (Context& context, const char* name, const char* description) 487 : ApiCase(context, name, description) 488 { 489 } 490 491 void test (void) 492 { 493 GLuint framebufferID = 0; 494 glGenFramebuffers(1, &framebufferID); 495 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 496 expectError(GL_NO_ERROR); 497 498 // color-renderable required texture formats 499 const struct RequiredColorFormat 500 { 501 GLenum internalFormat; 502 GLenum componentType; 503 } requiredColorformats[] = 504 { 505 { GL_R8, GL_UNSIGNED_NORMALIZED }, 506 { GL_RG8, GL_UNSIGNED_NORMALIZED }, 507 { GL_RGB8, GL_UNSIGNED_NORMALIZED }, 508 { GL_RGB565, GL_UNSIGNED_NORMALIZED }, 509 { GL_RGBA4, GL_UNSIGNED_NORMALIZED }, 510 { GL_RGB5_A1, GL_UNSIGNED_NORMALIZED }, 511 { GL_RGBA8, GL_UNSIGNED_NORMALIZED }, 512 { GL_RGB10_A2, GL_UNSIGNED_NORMALIZED }, 513 { GL_RGB10_A2UI, GL_UNSIGNED_INT }, 514 { GL_SRGB8_ALPHA8, GL_UNSIGNED_NORMALIZED }, 515 { GL_R8I, GL_INT }, 516 { GL_R8UI, GL_UNSIGNED_INT }, 517 { GL_R16I, GL_INT }, 518 { GL_R16UI, GL_UNSIGNED_INT }, 519 { GL_R32I, GL_INT }, 520 { GL_R32UI, GL_UNSIGNED_INT }, 521 { GL_RG8I, GL_INT }, 522 { GL_RG8UI, GL_UNSIGNED_INT }, 523 { GL_RG16I, GL_INT }, 524 { GL_RG16UI, GL_UNSIGNED_INT }, 525 { GL_RG32I, GL_INT }, 526 { GL_RG32UI, GL_UNSIGNED_INT }, 527 { GL_RGBA8I, GL_INT }, 528 { GL_RGBA8UI, GL_UNSIGNED_INT }, 529 { GL_RGBA16I, GL_INT }, 530 { GL_RGBA16UI, GL_UNSIGNED_INT }, 531 { GL_RGBA32I, GL_INT }, 532 { GL_RGBA32UI, GL_UNSIGNED_INT } 533 }; 534 535 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(requiredColorformats); ++ndx) 536 { 537 const GLenum colorFormat = requiredColorformats[ndx].internalFormat; 538 539 GLuint textureID = 0; 540 glGenTextures(1, &textureID); 541 glBindTexture(GL_TEXTURE_2D, textureID); 542 glTexStorage2D(GL_TEXTURE_2D, 1, colorFormat, 128, 128); 543 expectError(GL_NO_ERROR); 544 545 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0); 546 expectError(GL_NO_ERROR); 547 548 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, requiredColorformats[ndx].componentType); 549 550 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 551 glDeleteTextures(1, &textureID); 552 } 553 554 glDeleteFramebuffers(1, &framebufferID); 555 expectError(GL_NO_ERROR); 556 } 557}; 558 559class AttachmentSizeInitialCase : public ApiCase 560{ 561public: 562 AttachmentSizeInitialCase (Context& context, const char* name, const char* description) 563 : ApiCase(context, name, description) 564 { 565 } 566 567 void test (void) 568 { 569 // check default 570 if (attachmentExists(GL_BACK)) 571 { 572 checkAttachmentComponentSizeAtLeast( 573 m_testCtx, 574 *this, 575 GL_FRAMEBUFFER, 576 GL_BACK, 577 m_context.getRenderTarget().getPixelFormat().redBits, 578 m_context.getRenderTarget().getPixelFormat().greenBits, 579 m_context.getRenderTarget().getPixelFormat().blueBits, 580 m_context.getRenderTarget().getPixelFormat().alphaBits, 581 -1, 582 -1); 583 expectError(GL_NO_ERROR); 584 } 585 586 if (attachmentExists(GL_DEPTH)) 587 { 588 checkAttachmentComponentSizeAtLeast( 589 m_testCtx, 590 *this, 591 GL_FRAMEBUFFER, 592 GL_DEPTH, 593 -1, 594 -1, 595 -1, 596 -1, 597 m_context.getRenderTarget().getDepthBits(), 598 -1); 599 expectError(GL_NO_ERROR); 600 } 601 602 if (attachmentExists(GL_STENCIL)) 603 { 604 checkAttachmentComponentSizeAtLeast( 605 m_testCtx, 606 *this, 607 GL_FRAMEBUFFER, 608 GL_STENCIL, 609 -1, 610 -1, 611 -1, 612 -1, 613 -1, 614 m_context.getRenderTarget().getStencilBits()); 615 expectError(GL_NO_ERROR); 616 } 617 } 618 619 bool attachmentExists (GLenum attachment) 620 { 621 StateQueryMemoryWriteGuard<GLint> state; 622 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, attachment, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &state); 623 expectError(GL_NO_ERROR); 624 625 return !state.isUndefined() && state != GL_NONE; 626 } 627}; 628 629class AttachmentSizeCase : public ApiCase 630{ 631public: 632 AttachmentSizeCase (Context& context, const char* name, const char* description) 633 : ApiCase(context, name, description) 634 { 635 } 636 637 virtual void testColorAttachment (GLenum internalFormat, GLenum attachment, GLint bitsR, GLint bitsG, GLint bitsB, GLint bitsA) = DE_NULL; 638 639 virtual void testDepthAttachment (GLenum internalFormat, GLenum attachment, GLint bitsD, GLint bitsS) = DE_NULL; 640 641 void test (void) 642 { 643 GLuint framebufferID = 0; 644 glGenFramebuffers(1, &framebufferID); 645 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 646 expectError(GL_NO_ERROR); 647 648 // check some color targets 649 650 const struct ColorAttachment 651 { 652 GLenum internalFormat; 653 int bitsR, bitsG, bitsB, bitsA; 654 } colorAttachments[] = 655 { 656 { GL_RGBA8, 8, 8, 8, 8 }, 657 { GL_RGB565, 5, 6, 5, 0 }, 658 { GL_RGBA4, 4, 4, 4, 4 }, 659 { GL_RGB5_A1, 5, 5, 5, 1 }, 660 { GL_RGBA8I, 8, 8, 8, 8 }, 661 { GL_RG32UI, 32, 32, 0, 0 } 662 }; 663 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(colorAttachments); ++ndx) 664 testColorAttachment(colorAttachments[ndx].internalFormat, GL_COLOR_ATTACHMENT0, colorAttachments[ndx].bitsR, colorAttachments[ndx].bitsG, colorAttachments[ndx].bitsB, colorAttachments[ndx].bitsA); 665 666 // check some depth targets 667 668 const struct DepthAttachment 669 { 670 GLenum internalFormat; 671 GLenum attachment; 672 int dbits; 673 int sbits; 674 } depthAttachments[] = 675 { 676 { GL_DEPTH_COMPONENT16, GL_DEPTH_ATTACHMENT, 16, 0 }, 677 { GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT, 24, 0 }, 678 { GL_DEPTH_COMPONENT32F, GL_DEPTH_ATTACHMENT, 32, 0 }, 679 { GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL_ATTACHMENT, 24, 8 }, 680 { GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL_ATTACHMENT, 32, 8 }, 681 }; 682 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthAttachments); ++ndx) 683 testDepthAttachment(depthAttachments[ndx].internalFormat, depthAttachments[ndx].attachment, depthAttachments[ndx].dbits, depthAttachments[ndx].sbits); 684 685 glDeleteFramebuffers(1, &framebufferID); 686 expectError(GL_NO_ERROR); 687 } 688}; 689 690class AttachmentSizeRboCase : public AttachmentSizeCase 691{ 692public: 693 AttachmentSizeRboCase (Context& context, const char* name, const char* description) 694 : AttachmentSizeCase(context, name, description) 695 { 696 } 697 698 void testColorAttachment (GLenum internalFormat, GLenum attachment, GLint bitsR, GLint bitsG, GLint bitsB, GLint bitsA) 699 { 700 GLuint renderbufferID = 0; 701 glGenRenderbuffers(1, &renderbufferID); 702 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 703 glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, 128, 128); 704 expectError(GL_NO_ERROR); 705 706 glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, renderbufferID); 707 expectError(GL_NO_ERROR); 708 709 checkAttachmentComponentSizeAtLeast (m_testCtx, *this, GL_FRAMEBUFFER, attachment, bitsR, bitsG, bitsB, bitsA, -1, -1); 710 checkAttachmentComponentSizeExactly (m_testCtx, *this, GL_FRAMEBUFFER, attachment, -1, -1, -1, -1, 0, 0); 711 712 glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, 0); 713 glDeleteRenderbuffers(1, &renderbufferID); 714 } 715 716 void testDepthAttachment (GLenum internalFormat, GLenum attachment, GLint bitsD, GLint bitsS) 717 { 718 GLuint renderbufferID = 0; 719 glGenRenderbuffers(1, &renderbufferID); 720 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 721 glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, 128, 128); 722 expectError(GL_NO_ERROR); 723 724 glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, renderbufferID); 725 expectError(GL_NO_ERROR); 726 727 checkAttachmentComponentSizeAtLeast (m_testCtx, *this, GL_FRAMEBUFFER, attachment, -1, -1, -1, -1, bitsD, bitsS); 728 checkAttachmentComponentSizeExactly (m_testCtx, *this, GL_FRAMEBUFFER, attachment, 0, 0, 0, 0, -1, -1); 729 730 glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, 0); 731 glDeleteRenderbuffers(1, &renderbufferID); 732 } 733}; 734 735class AttachmentSizeTextureCase : public AttachmentSizeCase 736{ 737public: 738 AttachmentSizeTextureCase (Context& context, const char* name, const char* description) 739 : AttachmentSizeCase(context, name, description) 740 { 741 } 742 743 void testColorAttachment (GLenum internalFormat, GLenum attachment, GLint bitsR, GLint bitsG, GLint bitsB, GLint bitsA) 744 { 745 GLuint textureID = 0; 746 glGenTextures(1, &textureID); 747 glBindTexture(GL_TEXTURE_2D, textureID); 748 glTexStorage2D(GL_TEXTURE_2D, 1, internalFormat, 128, 128); 749 expectError(GL_NO_ERROR); 750 751 glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, textureID, 0); 752 expectError(GL_NO_ERROR); 753 754 checkAttachmentComponentSizeAtLeast (m_testCtx, *this, GL_FRAMEBUFFER, attachment, bitsR, bitsG, bitsB, bitsA, -1, -1); 755 checkAttachmentComponentSizeExactly (m_testCtx, *this, GL_FRAMEBUFFER, attachment, -1, -1, -1, -1, 0, 0); 756 757 glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, 0, 0); 758 glDeleteTextures(1, &textureID); 759 } 760 761 void testDepthAttachment (GLenum internalFormat, GLenum attachment, GLint bitsD, GLint bitsS) 762 { 763 // don't test stencil formats with textures 764 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) 765 return; 766 767 GLuint textureID = 0; 768 glGenTextures(1, &textureID); 769 glBindTexture(GL_TEXTURE_2D, textureID); 770 glTexStorage2D(GL_TEXTURE_2D, 1, internalFormat, 128, 128); 771 expectError(GL_NO_ERROR); 772 773 glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, textureID, 0); 774 expectError(GL_NO_ERROR); 775 776 checkAttachmentComponentSizeAtLeast (m_testCtx, *this, GL_FRAMEBUFFER, attachment, -1, -1, -1, -1, bitsD, bitsS); 777 checkAttachmentComponentSizeExactly (m_testCtx, *this, GL_FRAMEBUFFER, attachment, 0, 0, 0, 0, -1, -1); 778 779 glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, 0, 0); 780 glDeleteTextures(1, &textureID); 781 } 782}; 783 784class UnspecifiedAttachmentTextureColorCodingCase : public ApiCase 785{ 786public: 787 UnspecifiedAttachmentTextureColorCodingCase (Context& context, const char* name, const char* description) 788 : ApiCase(context, name, description) 789 { 790 } 791 792 void test (void) 793 { 794 GLuint framebufferID = 0; 795 glGenFramebuffers(1, &framebufferID); 796 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 797 expectError(GL_NO_ERROR); 798 799 // color 800 { 801 GLuint renderbufferID = 0; 802 glGenRenderbuffers(1, &renderbufferID); 803 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 804 expectError(GL_NO_ERROR); 805 806 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbufferID); 807 expectError(GL_NO_ERROR); 808 809 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, GL_LINEAR); 810 expectError(GL_NO_ERROR); 811 812 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 813 glDeleteRenderbuffers(1, &renderbufferID); 814 } 815 816 // depth 817 { 818 GLuint renderbufferID = 0; 819 glGenRenderbuffers(1, &renderbufferID); 820 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 821 expectError(GL_NO_ERROR); 822 823 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbufferID); 824 expectError(GL_NO_ERROR); 825 826 checkAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, GL_LINEAR); 827 828 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 829 glDeleteRenderbuffers(1, &renderbufferID); 830 } 831 832 glDeleteFramebuffers(1, &framebufferID); 833 expectError(GL_NO_ERROR); 834 } 835}; 836 837class UnspecifiedAttachmentTextureComponentTypeCase : public ApiCase 838{ 839public: 840 UnspecifiedAttachmentTextureComponentTypeCase (Context& context, const char* name, const char* description) 841 : ApiCase(context, name, description) 842 { 843 } 844 845 void test (void) 846 { 847 GLuint framebufferID = 0; 848 glGenFramebuffers(1, &framebufferID); 849 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 850 expectError(GL_NO_ERROR); 851 852 { 853 GLuint textureID = 0; 854 glGenTextures(1, &textureID); 855 glBindTexture(GL_TEXTURE_2D, textureID); 856 expectError(GL_NO_ERROR); 857 858 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0); 859 expectError(GL_NO_ERROR); 860 861 checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, GL_NONE); 862 expectError(GL_NO_ERROR); 863 864 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 865 glDeleteTextures(1, &textureID); 866 } 867 868 glDeleteFramebuffers(1, &framebufferID); 869 expectError(GL_NO_ERROR); 870 } 871}; 872 873class UnspecifiedAttachmentSizeCase : public ApiCase 874{ 875public: 876 UnspecifiedAttachmentSizeCase (Context& context, const char* name, const char* description) 877 : ApiCase(context, name, description) 878 { 879 } 880 881 virtual void testColorAttachment (void) = DE_NULL; 882 883 virtual void testDepthAttachment (void) = DE_NULL; 884 885 void test (void) 886 { 887 GLuint framebufferID = 0; 888 glGenFramebuffers(1, &framebufferID); 889 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 890 expectError(GL_NO_ERROR); 891 892 // check color target 893 testColorAttachment(); 894 895 // check depth target 896 testDepthAttachment(); 897 898 glDeleteFramebuffers(1, &framebufferID); 899 expectError(GL_NO_ERROR); 900 } 901}; 902 903class UnspecifiedAttachmentSizeRboCase : public UnspecifiedAttachmentSizeCase 904{ 905public: 906 UnspecifiedAttachmentSizeRboCase (Context& context, const char* name, const char* description) 907 : UnspecifiedAttachmentSizeCase(context, name, description) 908 { 909 } 910 911 void testColorAttachment (void) 912 { 913 GLuint renderbufferID = 0; 914 glGenRenderbuffers(1, &renderbufferID); 915 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 916 expectError(GL_NO_ERROR); 917 918 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbufferID); 919 expectError(GL_NO_ERROR); 920 921 checkAttachmentComponentSizeExactly (m_testCtx, *this, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0, 0, 0, 0, 0); 922 expectError(GL_NO_ERROR); 923 924 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 925 glDeleteRenderbuffers(1, &renderbufferID); 926 } 927 928 void testDepthAttachment (void) 929 { 930 GLuint renderbufferID = 0; 931 glGenRenderbuffers(1, &renderbufferID); 932 glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID); 933 expectError(GL_NO_ERROR); 934 935 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbufferID); 936 expectError(GL_NO_ERROR); 937 938 checkAttachmentComponentSizeExactly (m_testCtx, *this, GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 0, 0, 0, 0, 0, 0); 939 expectError(GL_NO_ERROR); 940 941 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); 942 glDeleteRenderbuffers(1, &renderbufferID); 943 } 944}; 945 946class UnspecifiedAttachmentSizeTextureCase : public UnspecifiedAttachmentSizeCase 947{ 948public: 949 UnspecifiedAttachmentSizeTextureCase (Context& context, const char* name, const char* description) 950 : UnspecifiedAttachmentSizeCase(context, name, description) 951 { 952 } 953 954 void testColorAttachment (void) 955 { 956 GLuint textureID = 0; 957 glGenTextures(1, &textureID); 958 glBindTexture(GL_TEXTURE_2D, textureID); 959 expectError(GL_NO_ERROR); 960 961 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0); 962 expectError(GL_NO_ERROR); 963 964 checkAttachmentComponentSizeExactly (m_testCtx, *this, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0, 0, 0, 0, 0); 965 expectError(GL_NO_ERROR); 966 967 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 968 glDeleteTextures(1, &textureID); 969 } 970 971 void testDepthAttachment (void) 972 { 973 GLuint textureID = 0; 974 glGenTextures(1, &textureID); 975 glBindTexture(GL_TEXTURE_2D, textureID); 976 expectError(GL_NO_ERROR); 977 978 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureID, 0); 979 expectError(GL_NO_ERROR); 980 981 checkAttachmentComponentSizeExactly (m_testCtx, *this, GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 0, 0, 0, 0, 0, 0); 982 expectError(GL_NO_ERROR); 983 984 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); 985 glDeleteTextures(1, &textureID); 986 } 987}; 988 989} // anonymous 990 991 992FboStateQueryTests::FboStateQueryTests (Context& context) 993 : TestCaseGroup(context, "fbo", "Fbo State Query tests") 994{ 995} 996 997void FboStateQueryTests::init (void) 998{ 999 const struct FramebufferTarget 1000 { 1001 const char* name; 1002 GLenum target; 1003 } fboTargets[] = 1004 { 1005 { "draw_framebuffer_", GL_DRAW_FRAMEBUFFER }, 1006 { "read_framebuffer_", GL_READ_FRAMEBUFFER } 1007 }; 1008 1009 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(fboTargets); ++ndx) 1010 addChild(new DefaultFramebufferCase(m_context, (std::string(fboTargets[ndx].name) + "default_framebuffer").c_str(), "default framebuffer", fboTargets[ndx].target)); 1011 1012 addChild(new AttachmentObjectCase (m_context, "framebuffer_attachment_object", "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE and FRAMEBUFFER_ATTACHMENT_OBJECT_NAME")); 1013 addChild(new AttachmentTextureLevelCase (m_context, "framebuffer_attachment_texture_level", "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL")); 1014 addChild(new AttachmentTextureCubeMapFaceCase (m_context, "framebuffer_attachment_texture_cube_map_face", "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE")); 1015 addChild(new AttachmentTextureLayerCase (m_context, "framebuffer_attachment_texture_layer", "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER")); 1016 addChild(new AttachmentTextureColorCodingCase (m_context, "framebuffer_attachment_color_encoding", "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING")); 1017 addChild(new AttachmentTextureComponentTypeCase (m_context, "framebuffer_attachment_component_type", "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE")); 1018 addChild(new AttachmentSizeInitialCase (m_context, "framebuffer_attachment_x_size_initial", "FRAMEBUFFER_ATTACHMENT_x_SIZE")); 1019 addChild(new AttachmentSizeRboCase (m_context, "framebuffer_attachment_x_size_rbo", "FRAMEBUFFER_ATTACHMENT_x_SIZE")); 1020 addChild(new AttachmentSizeTextureCase (m_context, "framebuffer_attachment_x_size_texture", "FRAMEBUFFER_ATTACHMENT_x_SIZE")); 1021 1022 addChild(new UnspecifiedAttachmentTextureColorCodingCase (m_context, "framebuffer_unspecified_attachment_color_encoding", "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING")); 1023 addChild(new UnspecifiedAttachmentTextureComponentTypeCase (m_context, "framebuffer_unspecified_attachment_component_type", "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE")); 1024 addChild(new UnspecifiedAttachmentSizeRboCase (m_context, "framebuffer_unspecified_attachment_x_size_rbo", "FRAMEBUFFER_ATTACHMENT_x_SIZE")); 1025 addChild(new UnspecifiedAttachmentSizeTextureCase (m_context, "framebuffer_unspecified_attachment_x_size_texture", "FRAMEBUFFER_ATTACHMENT_x_SIZE")); 1026} 1027 1028} // Functional 1029} // gles3 1030} // deqp 1031