Home | History | Annotate | Download | only in functional
      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 
     33 using namespace glw; // GLint and other GL types
     34 using deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard;
     35 
     36 
     37 namespace deqp
     38 {
     39 namespace gles3
     40 {
     41 namespace Functional
     42 {
     43 namespace
     44 {
     45 
     46 void 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 
     83 void 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 
    120 void 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 
    132 void 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 
    144 void 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 
    153 void 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 
    158 class DefaultFramebufferCase : public ApiCase
    159 {
    160 public:
    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 
    209 private:
    210 	GLenum m_framebufferTarget;
    211 };
    212 
    213 class AttachmentObjectCase : public ApiCase
    214 {
    215 public:
    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 
    276 class AttachmentTextureLevelCase : public ApiCase
    277 {
    278 public:
    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 
    313 class AttachmentTextureCubeMapFaceCase : public ApiCase
    314 {
    315 public:
    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 
    359 class AttachmentTextureLayerCase : public ApiCase
    360 {
    361 public:
    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 
    412 class AttachmentTextureColorCodingCase : public ApiCase
    413 {
    414 public:
    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 
    483 class AttachmentTextureComponentTypeCase : public ApiCase
    484 {
    485 public:
    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 
    559 class AttachmentSizeInitialCase : public ApiCase
    560 {
    561 public:
    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 
    629 class AttachmentSizeCase : public ApiCase
    630 {
    631 public:
    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 
    690 class AttachmentSizeRboCase : public AttachmentSizeCase
    691 {
    692 public:
    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 
    735 class AttachmentSizeTextureCase : public AttachmentSizeCase
    736 {
    737 public:
    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 
    784 class UnspecifiedAttachmentTextureColorCodingCase : public ApiCase
    785 {
    786 public:
    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 
    837 class UnspecifiedAttachmentTextureComponentTypeCase : public ApiCase
    838 {
    839 public:
    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 
    873 class UnspecifiedAttachmentSizeCase : public ApiCase
    874 {
    875 public:
    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 
    903 class UnspecifiedAttachmentSizeRboCase : public UnspecifiedAttachmentSizeCase
    904 {
    905 public:
    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 
    946 class UnspecifiedAttachmentSizeTextureCase : public UnspecifiedAttachmentSizeCase
    947 {
    948 public:
    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 
    992 FboStateQueryTests::FboStateQueryTests (Context& context)
    993 	: TestCaseGroup(context, "fbo", "Fbo State Query tests")
    994 {
    995 }
    996 
    997 void 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