18852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry/*-------------------------------------------------------------------------
28852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module
38852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * -------------------------------------------------
48852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *
58852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Copyright 2014 The Android Open Source Project
68852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *
78852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
88852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * you may not use this file except in compliance with the License.
98852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * You may obtain a copy of the License at
108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *
118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *
138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * See the License for the specific language governing permissions and
178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * limitations under the License.
188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *
198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *//*!
208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * \file
218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * \brief FBO colorbuffer tests.
228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *//*--------------------------------------------------------------------*/
238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "es31fFboColorbufferTests.hpp"
258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "es31fFboTestCase.hpp"
268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "es31fFboTestUtil.hpp"
278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluTextureUtil.hpp"
298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluContextInfo.hpp"
308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuCommandLine.hpp"
328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuImageCompare.hpp"
338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuRGBA.hpp"
348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuTestLog.hpp"
358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuTextureUtil.hpp"
368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "sglrContextUtil.hpp"
388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deRandom.hpp"
408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deString.h"
418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glwEnums.hpp"
438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace deqp
458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace gles31
478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace Functional
498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::string;
528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec2;
538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec3;
548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec4;
558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::IVec2;
568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::IVec3;
578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::IVec4;
588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::UVec4;
598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::TestLog;
608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing namespace FboTestUtil;
618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryconst tcu::RGBA MIN_THRESHOLD(12, 12, 12, 12);
638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic tcu::Vec4 generateRandomColor (de::Random& random)
658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	tcu::Vec4 retVal;
678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	retVal[0] = random.getFloat();
698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	retVal[1] = random.getFloat();
708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	retVal[2] = random.getFloat();
718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	retVal[3] = 1.0f;
728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return retVal;
748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic tcu::CubeFace getCubeFaceFromNdx (int ndx)
778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch (ndx)
798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case 0:	return tcu::CUBEFACE_POSITIVE_X;
818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case 1:	return tcu::CUBEFACE_NEGATIVE_X;
828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case 2:	return tcu::CUBEFACE_POSITIVE_Y;
838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case 3:	return tcu::CUBEFACE_NEGATIVE_Y;
848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case 4:	return tcu::CUBEFACE_POSITIVE_Z;
858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case 5:	return tcu::CUBEFACE_NEGATIVE_Z;
868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			DE_ASSERT(false);
888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			return tcu::CUBEFACE_LAST;
898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass FboColorbufferCase : public FboTestCase
938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic:
958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	FboColorbufferCase (Context& context, const char* name, const char* desc, const deUint32 format)
968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		: FboTestCase	(context, name, desc)
978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		, m_format		(format)
988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
1008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	bool compare (const tcu::Surface& reference, const tcu::Surface& result)
1028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
1038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const tcu::RGBA threshold (tcu::max(getFormatThreshold(m_format), MIN_THRESHOLD));
1048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_testCtx.getLog() << TestLog::Message << "Comparing images, threshold: " << threshold << TestLog::EndMessage;
1068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		return tcu::bilinearCompare(m_testCtx.getLog(), "Result", "Image comparison result", reference.getAccess(), result.getAccess(), threshold, tcu::COMPARE_LOG_RESULT);
1088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
1098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprotected:
1118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32	m_format;
1128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
1138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass FboColorTexCubeArrayCase : public FboColorbufferCase
1158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
1168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic:
1178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	FboColorTexCubeArrayCase (Context& context, const char* name, const char* description, deUint32 texFmt, const IVec3& texSize)
1188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		: FboColorbufferCase	(context, name, description, texFmt)
1198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		, m_texSize				(texSize)
1208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
1218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		DE_ASSERT(texSize.z() % 6 == 0);
1228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
1238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprotected:
1258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	void preCheck (void)
1268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
1275ed2b23bea6e56762a7aef8c8a086ec724517f26Daniel Andrade Groppe		if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array"))
1285ed2b23bea6e56762a7aef8c8a086ec724517f26Daniel Andrade Groppe			TCU_THROW(NotSupportedError, "Test requires extension GL_EXT_texture_cube_map_array or a context version equal or higher than 3.2");
1298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		checkFormatSupport(m_format);
1318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
1328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	void render (tcu::Surface& dst)
1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		TestLog&				log					= m_testCtx.getLog();
1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		de::Random				rnd					(deStringHash(getName()) ^ 0xed607a89 ^ m_testCtx.getCommandLine().getBaseSeed());
1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		tcu::TextureFormat		texFmt				= glu::mapGLInternalFormat(m_format);
1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		tcu::TextureFormatInfo	fmtInfo				= tcu::getTextureFormatInfo(texFmt);
1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		Texture2DShader			texToFboShader		(DataTypes() << glu::TYPE_SAMPLER_2D, getFragmentOutputType(texFmt), fmtInfo.valueMax-fmtInfo.valueMin, fmtInfo.valueMin);
141cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos		TextureCubeArrayShader	arrayTexShader		(glu::getSamplerCubeArrayType(texFmt), glu::TYPE_FLOAT_VEC4, glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType()));
1428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deUint32				texToFboShaderID	= getCurrentContext()->createProgram(&texToFboShader);
1448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deUint32				arrayTexShaderID	= getCurrentContext()->createProgram(&arrayTexShader);
1458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Setup textures
1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		texToFboShader.setUniforms(*getCurrentContext(), texToFboShaderID);
1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		arrayTexShader.setTexScaleBias(fmtInfo.lookupScale, fmtInfo.lookupBias);
1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Framebuffers.
1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		std::vector<deUint32>	fbos;
1528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deUint32				tex;
1538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
1558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glu::TransferFormat	transferFmt		= glu::getTransferFormat(texFmt);
1568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			bool				isFilterable	= glu::isGLInternalColorFormatFilterable(m_format);
1578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const IVec3&		size			= m_texSize;
1588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			log << TestLog::Message
1608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				<< "Creating a cube map array texture ("
1618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				<< size.x() << "x" << size.y()
1628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				<< ", depth: "
1638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				<< size.z() << ")"
1648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				<< TestLog::EndMessage;
1658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glGenTextures(1, &tex);
1678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
1698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY,	GL_TEXTURE_WRAP_S,		GL_CLAMP_TO_EDGE);
1708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY,	GL_TEXTURE_WRAP_T,		GL_CLAMP_TO_EDGE);
1718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY,	GL_TEXTURE_WRAP_R,		GL_CLAMP_TO_EDGE);
1728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY,	GL_TEXTURE_MIN_FILTER,	isFilterable ? GL_LINEAR : GL_NEAREST);
1738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY,	GL_TEXTURE_MAG_FILTER,	isFilterable ? GL_LINEAR : GL_NEAREST);
1748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, m_format, size.x(), size.y(), size.z(), 0, transferFmt.format, transferFmt.dataType, DE_NULL);
1758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			log << TestLog::Message << "Creating a framebuffer object for each layer-face" << TestLog::EndMessage;
1778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			// Generate an FBO for each layer-face
1798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (int ndx = 0; ndx < m_texSize.z(); ndx++)
1808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
1818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				deUint32 layerFbo;
1828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glGenFramebuffers(1, &layerFbo);
1848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glBindFramebuffer(GL_FRAMEBUFFER, layerFbo);
1858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, ndx);
1868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				checkError();
1878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				checkFramebufferStatus(GL_FRAMEBUFFER);
1888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				fbos.push_back(layerFbo);
1908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
1918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
1928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << TestLog::Message << "Rendering test images to layer-faces in randomized order" << TestLog::EndMessage;
1948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
1968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			std::vector<int> order(fbos.size());
1978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (size_t n = 0; n < order.size(); n++)
1998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				order[n] = (int)n;
2008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			rnd.shuffle(order.begin(), order.end());
2018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (size_t ndx = 0; ndx < order.size(); ndx++)
2038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
2048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const int			layerFace	= order[ndx];
2058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const deUint32		format		= GL_RGBA;
2068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const deUint32		dataType	= GL_UNSIGNED_BYTE;
2078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const int			texW		= 128;
2088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const int			texH		= 128;
2098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				deUint32			tmpTex		= 0;
2108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const deUint32		fbo			= fbos[layerFace];
2118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const IVec3&		viewport	= m_texSize;
2128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				tcu::TextureLevel	data		(glu::mapGLTransferFormat(format, dataType), texW, texH, 1);
2138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				tcu::fillWithGrid(data.getAccess(), 8, generateRandomColor(rnd), Vec4(0.0f));
2158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glGenTextures(1, &tmpTex);
2178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glBindTexture(GL_TEXTURE_2D, tmpTex);
2188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glTexParameteri(GL_TEXTURE_2D,	GL_TEXTURE_WRAP_S,		GL_CLAMP_TO_EDGE);
2198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glTexParameteri(GL_TEXTURE_2D,	GL_TEXTURE_WRAP_T,		GL_CLAMP_TO_EDGE);
2208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glTexParameteri(GL_TEXTURE_2D,	GL_TEXTURE_MIN_FILTER,	GL_LINEAR);
2218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glTexParameteri(GL_TEXTURE_2D,	GL_TEXTURE_MAG_FILTER,	GL_LINEAR);
2228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glTexImage2D(GL_TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr());
2238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				glViewport(0, 0, viewport.x(), viewport.y());
2268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				sglr::drawQuad(*getCurrentContext(), texToFboShaderID, Vec3(-1.0f, -1.0f, 0.0f), Vec3(1.0f, 1.0f, 0.0f));
2278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				checkError();
2288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				// Render to framebuffer
2308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				{
2318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const Vec3			p0		= Vec3(float(ndx % 2) - 1.0f, float(ndx / 2) - 1.0f, 0.0f);
2328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const Vec3			p1		= p0 + Vec3(1.0f, 1.0f, 0.0f);
2338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const int			layer	= layerFace / 6;
2348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const tcu::CubeFace	face	= getCubeFaceFromNdx(layerFace % 6);
2358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					glBindFramebuffer(GL_FRAMEBUFFER, 0);
2378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					glViewport(0, 0, getWidth(), getHeight());
2388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					glActiveTexture(GL_TEXTURE0);
2408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
2418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					arrayTexShader.setLayer(layer);
2438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					arrayTexShader.setFace(face);
2448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					arrayTexShader.setUniforms(*getCurrentContext(), arrayTexShaderID);
2458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					sglr::drawQuad(*getCurrentContext(), arrayTexShaderID, p0, p1);
2478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					checkError();
2488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				}
2498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
2508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
2518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		readPixels(dst, 0, 0, getWidth(), getHeight());
2538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
2548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprivate:
2568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	IVec3 m_texSize;
2578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
2588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFboColorTests::FboColorTests (Context& context)
2608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	: TestCaseGroup(context, "color", "Colorbuffer tests")
2618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
2628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
2638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFboColorTests::~FboColorTests (void)
2658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
2668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
2678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FboColorTests::init (void)
2698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
2708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static const deUint32 colorFormats[] =
2718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
2728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// RGBA formats
2738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA32I,
2748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA32UI,
2758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA16I,
2768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA16UI,
2778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA8,
2788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA8I,
2798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA8UI,
2808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_SRGB8_ALPHA8,
2818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGB10_A2,
2828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGB10_A2UI,
2838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA4,
2848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGB5_A1,
2858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// RGB formats
2878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGB8,
2888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGB565,
2898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// RG formats
2918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG32I,
2928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG32UI,
2938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG16I,
2948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG16UI,
2958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG8,
2968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG8I,
2978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG8UI,
2988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// R formats
3008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R32I,
3018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R32UI,
3028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R16I,
3038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R16UI,
3048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R8,
3058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R8I,
3068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R8UI,
3078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// GL_EXT_color_buffer_float
3098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA32F,
3108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGBA16F,
3118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R11F_G11F_B10F,
3128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG32F,
3138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RG16F,
3148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R32F,
3158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_R16F,
3168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// GL_EXT_color_buffer_half_float
3188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GL_RGB16F
3198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
3208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// .texcubearray
3228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
3238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		tcu::TestCaseGroup* texCubeArrayGroup = new tcu::TestCaseGroup(m_testCtx, "texcubearray", "Cube map array texture tests");
3248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		addChild(texCubeArrayGroup);
3258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(colorFormats); fmtNdx++)
3278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			texCubeArrayGroup->addChild(new FboColorTexCubeArrayCase(m_context, getFormatName(colorFormats[fmtNdx]), "",
3288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 colorFormats[fmtNdx], IVec3(128, 128, 12)));
3298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
3308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
3318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // Functional
3338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // gles31
3348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // deqp
335