13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL (ES) Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -----------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Framebuffer completeness tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fFboCompletenessTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsFboCompletenessTests.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sstream>
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glw;
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing deqp::gls::Range;
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls::FboUtil;
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls::FboUtil::config;
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace fboc = deqp::gls::fboc;
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef tcu::TestCase::IterateResult IterateResult;
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::ostringstream;
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3ColorRenderables[] =
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// GLES3, 4.4.4: "An internal format is color-renderable if it is one of
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// the formats from table 3.12 noted as color-renderable..."
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_R8, GL_RG8, GL_RGB8, GL_RGB565, GL_RGBA4, GL_RGB5_A1, GL_RGBA8,
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_RGB10_A2, GL_RGB10_A2UI, GL_SRGB8_ALPHA8,
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_R8I, GL_R8UI, GL_R16I, GL_R16UI, GL_R32I, GL_R32UI,
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_RG8I, GL_RG8UI, GL_RG16I, GL_RG16UI, GL_RG32I, GL_RG32UI,
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_RGBA8I, GL_RGBA8UI, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32I, GL_RGBA32UI,
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3UnsizedColorRenderables[] =
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// "...or if it is unsized format RGBA or RGB."
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// See Table 3.3 in GLES3.
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLS_UNSIZED_FORMATKEY(GL_RGBA,	GL_UNSIGNED_BYTE),
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLS_UNSIZED_FORMATKEY(GL_RGBA,	GL_UNSIGNED_SHORT_4_4_4_4),
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLS_UNSIZED_FORMATKEY(GL_RGBA,	GL_UNSIGNED_SHORT_5_5_5_1),
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLS_UNSIZED_FORMATKEY(GL_RGB,	GL_UNSIGNED_BYTE),
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLS_UNSIZED_FORMATKEY(GL_RGB,	GL_UNSIGNED_SHORT_5_6_5),
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3DepthRenderables[] =
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// GLES3, 4.4.4: "An internal format is depth-renderable if it is one of
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// the formats from table 3.13."
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32F,
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8,
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3StencilRboRenderables[] =
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// GLES3, 4.4.4: "An internal format is stencil-renderable if it is
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// STENCIL_INDEX8..."
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_STENCIL_INDEX8,
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3StencilRenderables[] =
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// "...or one of the formats from table 3.13 whose base internal format is
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// DEPTH_STENCIL."
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8,
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3TextureFloatFormats[] =
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_RGBA32F, GL_RGBA16F, GL_R11F_G11F_B10F,
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_RG32F, GL_RG16F, GL_R32F, GL_R16F,
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_RGBA16F, GL_RGB16F, GL_RG16F, GL_R16F,
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
96ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyrystatic const FormatKey s_es3NotRenderableTextureFormats[] =
97ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry{
98ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry	GL_R8_SNORM, GL_RG8_SNORM, GL_RGB8_SNORM, GL_RGBA8_SNORM,
99ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry	GL_RGB9_E5, GL_SRGB8,
100ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry	GL_RGB8I, GL_RGB16I, GL_RGB32I,
101ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry	GL_RGB8UI, GL_RGB16UI,GL_RGB32UI,
102ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry};
103ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatEntry s_es3Formats[] =
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Renderbuffers don't support unsized formats
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ REQUIRED_RENDERABLE | COLOR_RENDERABLE | TEXTURE_VALID,
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  GLS_ARRAY_RANGE(s_es3UnsizedColorRenderables) },
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ REQUIRED_RENDERABLE | COLOR_RENDERABLE | RENDERBUFFER_VALID | TEXTURE_VALID,
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  GLS_ARRAY_RANGE(s_es3ColorRenderables) },
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ REQUIRED_RENDERABLE | DEPTH_RENDERABLE | RENDERBUFFER_VALID | TEXTURE_VALID,
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  GLS_ARRAY_RANGE(s_es3DepthRenderables) },
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ REQUIRED_RENDERABLE | STENCIL_RENDERABLE | RENDERBUFFER_VALID,
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  GLS_ARRAY_RANGE(s_es3StencilRboRenderables) },
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ REQUIRED_RENDERABLE | STENCIL_RENDERABLE | RENDERBUFFER_VALID | TEXTURE_VALID,
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  GLS_ARRAY_RANGE(s_es3StencilRenderables) },
117ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry	{ TEXTURE_VALID,
118ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry	  GLS_ARRAY_RANGE(s_es3NotRenderableTextureFormats) },
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// These are not color-renderable in vanilla ES3, but we need to mark them
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// as valid for textures, since EXT_color_buffer_(half_)float brings in
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// color-renderability and only renderbuffer-validity.
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ TEXTURE_VALID,
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  GLS_ARRAY_RANGE(s_es3TextureFloatFormats) },
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// GL_EXT_color_buffer_float
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_extColorBufferFloatFormats[] =
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GL_RGBA32F, GL_RGBA16F, GL_R11F_G11F_B10F, GL_RG32F, GL_RG16F, GL_R32F, GL_R16F,
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry// GL_OES_texture_stencil8
1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic const FormatKey s_extOESTextureStencil8[] =
1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	GL_STENCIL_INDEX8,
1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatExtEntry s_es3ExtFormats[] =
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ "GL_EXT_color_buffer_float",
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  // These are already texture-valid in ES3, the extension just adds RBO
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  // support and makes them color-renderable.
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  REQUIRED_RENDERABLE | COLOR_RENDERABLE | RENDERBUFFER_VALID,
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	  GLS_ARRAY_RANGE(s_extColorBufferFloatFormats) },
1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{ "GL_OES_texture_stencil8",
1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	  // Note: es3 RBO tests actually cover the first two requirements
1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry      // - kept here for completeness
1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry      REQUIRED_RENDERABLE | STENCIL_RENDERABLE | TEXTURE_VALID,
1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	  GLS_ARRAY_RANGE(s_extOESTextureStencil8) }
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ES3Checker : public Checker
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				ES3Checker	(void)
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					: m_numSamples			(-1)
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					, m_depthStencilImage	(0)
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					, m_depthStencilType	(GL_NONE) {}
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void		check 		(GLenum attPoint, const Attachment& att, const Image* image);
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	//! The common number of samples of images.
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei		m_numSamples;
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	//! The common image for depth and stencil attachments.
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint		m_depthStencilImage;
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_depthStencilType;
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ES3Checker::check (GLenum attPoint, const Attachment& att, const Image* image)
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei imgSamples = imageNumSamples(*image);
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_numSamples == -1)
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_numSamples = imgSamples;
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// GLES3: "The value of RENDERBUFFER_SAMPLES is the same for all attached
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// renderbuffers and, if the attached images are a mix of renderbuffers
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// and textures, the value of RENDERBUFFER_SAMPLES is zero."
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		//
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// On creating a renderbuffer: "If _samples_ is zero, then
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// RENDERBUFFER_SAMPLES is set to zero. Otherwise [...] the resulting
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// value for RENDERBUFFER_SAMPLES is guaranteed to be greater than or
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// equal to _samples_ and no more than the next larger sample count
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// supported by the implementation."
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Either all attachments are zero-sample renderbuffers and/or
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// textures, or none of them are.
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		require((m_numSamples == 0) == (imgSamples == 0),
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE);
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// If the attachments requested a different number of samples, the
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// implementation is allowed to report this as incomplete. However, it
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// is also possible that despite the different requests, the
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// implementation allocated the same number of samples to both. Hence
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// reporting the framebuffer as complete is also legal.
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		canRequire(m_numSamples == imgSamples,
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				   GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE);
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// "Depth and stencil attachments, if present, are the same image."
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (attPoint == GL_DEPTH_ATTACHMENT || attPoint == GL_STENCIL_ATTACHMENT)
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_depthStencilImage == 0)
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_depthStencilImage = att.imageName;
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_depthStencilType = attachmentType(att);
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			require(m_depthStencilImage == att.imageName &&
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					m_depthStencilType == attachmentType(att),
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					GL_FRAMEBUFFER_UNSUPPORTED);
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct NumLayersParams
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		textureKind;		//< GL_TEXTURE_3D or GL_TEXTURE_2D_ARRAY
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei		numLayers;			//< Number of layers in texture
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei		attachmentLayer;	//< Layer referenced by attachment
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static string	getName			(const NumLayersParams& params);
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static string	getDescription	(const NumLayersParams& params);
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring NumLayersParams::getName (const NumLayersParams& params)
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ostringstream os;
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const string kindStr = params.textureKind == GL_TEXTURE_3D ? "3d" : "2darr";
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	os << kindStr << "_" << params.numLayers << "_" << params.attachmentLayer;
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return os.str();
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring NumLayersParams::getDescription (const NumLayersParams& params)
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ostringstream os;
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const string kindStr = (params.textureKind == GL_TEXTURE_3D
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							? "3D Texture"
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							: "2D Array Texture");
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	os << kindStr + ", "
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	   << params.numLayers << " layers, "
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	   << "attached layer " << params.attachmentLayer << ".";
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return os.str();
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NumLayersTest : public fboc::ParamTest<NumLayersParams>
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					NumLayersTest		(fboc::Context& ctx, NumLayersParams param)
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						: fboc::ParamTest<NumLayersParams> (ctx, param) {}
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult	build				(FboBuilder& builder);
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIterateResult NumLayersTest::build (FboBuilder& builder)
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureLayered* texCfg = DE_NULL;
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLenum target = GL_COLOR_ATTACHMENT0;
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_params.textureKind)
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_3D:
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			texCfg = &builder.makeConfig<Texture3D>();
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_2D_ARRAY:
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			texCfg = &builder.makeConfig<Texture2DArray>();
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(!"Impossible case");
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texCfg->internalFormat = getDefaultFormat(target, GL_TEXTURE);
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texCfg->width = 64;
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texCfg->height = 64;
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texCfg->numLayers = m_params.numLayers;
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLuint tex = builder.glCreateTexture(*texCfg);
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureLayerAttachment* att = &builder.makeConfig<TextureLayerAttachment>();
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	att->layer = m_params.attachmentLayer;
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	att->imageName = tex;
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	builder.glAttach(target, att);
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return STOP;
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SAMPLES_NONE = -2,
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SAMPLES_TEXTURE = -1
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct NumSamplesParams
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// >= 0: renderbuffer with N samples, -1: texture, -2: no attachment
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei		numSamples[3];
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static string	getName			(const NumSamplesParams& params);
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static string	getDescription	(const NumSamplesParams& params);
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring NumSamplesParams::getName (const NumSamplesParams& params)
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ostringstream os;
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool first = true;
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (const GLsizei* ns	=	DE_ARRAY_BEGIN(params.numSamples);
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 ns 				!=	DE_ARRAY_END(params.numSamples);
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 ns++)
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (first)
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			first = false;
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			os << "_";
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (*ns == SAMPLES_NONE)
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			os << "none";
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (*ns == SAMPLES_TEXTURE)
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			os << "tex";
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			os << "rbo" << *ns;
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return os.str();
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring NumSamplesParams::getDescription (const NumSamplesParams& params)
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ostringstream os;
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool first = true;
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char* const s_names[] = { "color", "depth", "stencil" };
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == DE_LENGTH_OF_ARRAY(params.numSamples));
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < DE_LENGTH_OF_ARRAY(s_names); i++)
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLsizei ns = params.numSamples[i];
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (ns == SAMPLES_NONE)
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			continue;
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (first)
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			first = false;
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			os << ", ";
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (ns == SAMPLES_TEXTURE)
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			os << "texture " << s_names[i] << " attachment";
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			os << ns << "-sample renderbuffer " << s_names[i] << " attachment";
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return os.str();
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NumSamplesTest : public fboc::ParamTest<NumSamplesParams>
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					NumSamplesTest		(fboc::Context& ctx, NumSamplesParams param)
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						: fboc::ParamTest<NumSamplesParams> (ctx, param) {}
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult	build				(FboBuilder& builder);
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3643c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIterateResult NumSamplesTest::build (FboBuilder& builder)
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const GLenum s_targets[] =
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_COLOR_ATTACHMENT0,	GL_COLOR_ATTACHMENT1,	GL_DEPTH_ATTACHMENT,
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Non-integer formats for each attachment type.
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \todo [2013-12-17 lauri] Add fixed/floating/integer metadata for formats so
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// we can pick one smartly or maybe try several.
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const GLenum s_formats[] =
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_RGBA8,				GL_RGB565,				GL_DEPTH_COMPONENT24,
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_targets) == DE_LENGTH_OF_ARRAY(m_params.numSamples));
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < DE_LENGTH_OF_ARRAY(s_targets); i++)
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum target = s_targets[i];
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const ImageFormat fmt = { s_formats[i], GL_NONE };
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLsizei ns = m_params.numSamples[i];
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (ns == -2)
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			continue;
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (ns == -1)
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachTargetToNew(target, GL_TEXTURE, fmt, 64, 64, builder);
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			Renderbuffer& rboCfg = builder.makeConfig<Renderbuffer>();
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			rboCfg.internalFormat = fmt;
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			rboCfg.width = rboCfg.height = 64;
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			rboCfg.numSamples = ns;
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const GLuint rbo = builder.glCreateRbo(rboCfg);
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Implementations do not necessarily support sample sizes greater than 1.
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TCU_CHECK_AND_THROW(NotSupportedError,
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								builder.getError() != GL_INVALID_OPERATION,
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								"Unsupported number of samples");
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RenderbufferAttachment& att = builder.makeConfig<RenderbufferAttachment>();
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			att.imageName = rbo;
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			builder.glAttach(target, &att);
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return STOP;
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ES3CheckerFactory : public CheckerFactory
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Checker*			createChecker	(void) { return new ES3Checker(); }
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TestGroup : public TestCaseGroup
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						TestGroup		(Context& context);
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				init			(void);
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3CheckerFactory	m_checkerFactory;
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	fboc::Context		m_fboc;
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TestGroup::init (void)
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(m_fboc.createRenderableTests());
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(m_fboc.createAttachmentTests());
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(m_fboc.createSizeTests());
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* layerTests = new TestCaseGroup(
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		getContext(), "layer", "Tests for layer attachments");
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const NumLayersParams s_layersParams[] =
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ //  textureKind			numLayers	attachmentKind
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ GL_TEXTURE_2D_ARRAY,	1,			0 },
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ GL_TEXTURE_2D_ARRAY,	1,			3 },
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ GL_TEXTURE_2D_ARRAY,	4,			3 },
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ GL_TEXTURE_2D_ARRAY,	4,			15 },
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ GL_TEXTURE_3D,		1,			0 },
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ GL_TEXTURE_3D,		1,			15 },
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ GL_TEXTURE_3D,		4,			15 },
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ GL_TEXTURE_3D,		64,			15 },
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (const NumLayersParams* lp	=	DE_ARRAY_BEGIN(s_layersParams);
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 lp							!=  DE_ARRAY_END(s_layersParams);
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 ++lp)
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		layerTests->addChild(new NumLayersTest(m_fboc, *lp));
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(layerTests);
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* sampleTests = new TestCaseGroup(
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		getContext(), "samples", "Tests for multisample attachments");
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const NumSamplesParams s_samplesParams[] =
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 0,					SAMPLES_NONE,		SAMPLES_NONE } },
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 1,					SAMPLES_NONE,		SAMPLES_NONE } },
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 2,					SAMPLES_NONE,		SAMPLES_NONE } },
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 0,					SAMPLES_TEXTURE,	SAMPLES_NONE } },
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 1,					SAMPLES_TEXTURE,	SAMPLES_NONE } },
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 2,					SAMPLES_TEXTURE,	SAMPLES_NONE } },
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 2,					1,					SAMPLES_NONE } },
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 2,					2,					SAMPLES_NONE } },
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 0,					0,					SAMPLES_TEXTURE } },
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 1,					2,					0 } },
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 2,					2,					0 } },
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 1,					1,					1 } },
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ { 1,					2,					4 } },
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (const NumSamplesParams* lp	=	DE_ARRAY_BEGIN(s_samplesParams);
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 lp							!=  DE_ARRAY_END(s_samplesParams);
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 ++lp)
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		sampleTests->addChild(new NumSamplesTest(m_fboc, *lp));
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(sampleTests);
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4853c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestGroup::TestGroup (Context& ctx)
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup		(ctx, "completeness", "Completeness tests")
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_checkerFactory	()
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_fboc			(ctx.getTestContext(), ctx.getRenderContext(), m_checkerFactory)
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const FormatEntries stdRange = GLS_ARRAY_RANGE(s_es3Formats);
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const FormatExtEntries extRange = GLS_ARRAY_RANGE(s_es3ExtFormats);
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_fboc.addFormats(stdRange);
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_fboc.addExtFormats(extRange);
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_fboc.setHaveMulticolorAtts(true); // Vanilla ES3 has multiple color attachments
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytcu::TestCaseGroup* createFboCompletenessTests (Context& context)
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new TestGroup(context);
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
506