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