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 Texture filtering tests.
228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *//*--------------------------------------------------------------------*/
238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "es31fTextureFilteringTests.hpp"
258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glsTextureTestUtil.hpp"
278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluPixelTransfer.hpp"
298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluTexture.hpp"
308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluTextureUtil.hpp"
318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuCommandLine.hpp"
338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuTextureUtil.hpp"
348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuImageCompare.hpp"
358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuTexLookupVerifier.hpp"
368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuVectorUtil.hpp"
378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deStringUtil.hpp"
398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deString.h"
408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glwFunctions.hpp"
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::vector;
528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::string;
538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::TestLog;
548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing namespace gls::TextureTestUtil;
558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic const char* getFaceDesc (const tcu::CubeFace face)
578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch (face)
598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case tcu::CUBEFACE_NEGATIVE_X:	return "-X";
618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case tcu::CUBEFACE_POSITIVE_X:	return "+X";
628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case tcu::CUBEFACE_NEGATIVE_Y:	return "-Y";
638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case tcu::CUBEFACE_POSITIVE_Y:	return "+Y";
648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case tcu::CUBEFACE_NEGATIVE_Z:	return "-Z";
658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case tcu::CUBEFACE_POSITIVE_Z:	return "+Z";
668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			DE_ASSERT(false);
688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			return DE_NULL;
698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic void logCubeArrayTexCoords(TestLog& log, vector<float>& texCoord)
738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const size_t numVerts = texCoord.size() / 4;
758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	DE_ASSERT(texCoord.size() % 4 == 0);
778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	for (size_t vertNdx = 0; vertNdx < numVerts; vertNdx++)
798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const size_t	coordNdx	= vertNdx * 4;
818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const float		u			= texCoord[coordNdx + 0];
838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const float		v			= texCoord[coordNdx + 1];
848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const float		w			= texCoord[coordNdx + 2];
858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const float		q			= texCoord[coordNdx + 3];
868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << TestLog::Message
888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			<< vertNdx << ": ("
898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			<< u << ", "
908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			<< v << ", "
918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			<< w << ", "
928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			<< q << ")"
938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			<< TestLog::EndMessage;
948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry// Cube map array filtering
988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass TextureCubeArrayFilteringCase : public TestCase
1008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
1018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic:
1028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									TextureCubeArrayFilteringCase	(Context& context,
1038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 const char* name,
1048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 const char* desc,
1058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 deUint32 minFilter,
1068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 deUint32 magFilter,
1078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 deUint32 wrapS,
1088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 deUint32 wrapT,
1098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 deUint32 internalFormat,
1108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 int size,
1118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 int depth,
1128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																	 bool onlySampleFaceInterior = false);
1138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									~TextureCubeArrayFilteringCase	(void);
1158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	void							init							(void);
1178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	void							deinit							(void);
1188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	IterateResult					iterate							(void);
1198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprivate:
1218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									TextureCubeArrayFilteringCase	(const TextureCubeArrayFilteringCase&);
1228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	TextureCubeArrayFilteringCase&	operator=						(const TextureCubeArrayFilteringCase&);
1238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32					m_minFilter;
1258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32					m_magFilter;
1268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32					m_wrapS;
1278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32					m_wrapT;
1288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32					m_internalFormat;
1308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int						m_size;
1318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int						m_depth;
1328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const bool						m_onlySampleFaceInterior; //!< If true, we avoid sampling anywhere near a face's edges.
1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	struct FilterCase
1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const glu::TextureCubeArray*	texture;
1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		tcu::Vec2						bottomLeft;
1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		tcu::Vec2						topRight;
1408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		tcu::Vec2						layerRange;
1418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		FilterCase (void)
1438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			: texture(DE_NULL)
1448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
1458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
1468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		FilterCase (const glu::TextureCubeArray* tex_, const tcu::Vec2& bottomLeft_, const tcu::Vec2& topRight_, const tcu::Vec2& layerRange_)
1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			: texture		(tex_)
1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			, bottomLeft	(bottomLeft_)
1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			, topRight		(topRight_)
1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			, layerRange	(layerRange_)
1528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
1538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
1548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
1558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	glu::TextureCubeArray*	m_gradientTex;
1578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	glu::TextureCubeArray*	m_gridTex;
1588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	TextureRenderer			m_renderer;
1608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	std::vector<FilterCase>	m_cases;
1628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int						m_caseNdx;
1638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
1648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureCubeArrayFilteringCase::TextureCubeArrayFilteringCase (Context& context,
1668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  const char* name,
1678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  const char* desc,
1688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  deUint32 minFilter,
1698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  deUint32 magFilter,
1708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  deUint32 wrapS,
1718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  deUint32 wrapT,
1728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  deUint32 internalFormat,
1738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  int size,
1748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  int depth,
1758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															  bool onlySampleFaceInterior)
1768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	: TestCase					(context, name, desc)
1778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_minFilter				(minFilter)
1788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_magFilter				(magFilter)
1798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_wrapS					(wrapS)
1808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_wrapT					(wrapT)
1818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_internalFormat			(internalFormat)
1828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_size					(size)
1838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_depth					(depth)
1848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_onlySampleFaceInterior	(onlySampleFaceInterior)
1858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_gradientTex				(DE_NULL)
1868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_gridTex					(DE_NULL)
1878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_renderer				(m_context.getRenderContext(), context.getTestContext(), glu::GLSL_VERSION_310_ES, glu::PRECISION_HIGHP)
1888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_caseNdx					(0)
1898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
1908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
1918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureCubeArrayFilteringCase::~TextureCubeArrayFilteringCase (void)
1938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
1948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	TextureCubeArrayFilteringCase::deinit();
1958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
1968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid TextureCubeArrayFilteringCase::init (void)
1988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
1998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array"))
2008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		throw tcu::NotSupportedError("GL_EXT_texture_cube_map_array not supported");
2018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	try
2038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
2048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const tcu::TextureFormat		texFmt		= glu::mapGLInternalFormat(m_internalFormat);
2058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const tcu::TextureFormatInfo	fmtInfo		= tcu::getTextureFormatInfo(texFmt);
2068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const tcu::Vec4					cScale		= fmtInfo.valueMax-fmtInfo.valueMin;
2078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const tcu::Vec4					cBias		= fmtInfo.valueMin;
2088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const int						numLevels	= deLog2Floor32(m_size) + 1;
2098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const int						numLayers	= m_depth / 6;
2108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Create textures.
2128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_gradientTex	= new glu::TextureCubeArray(m_context.getRenderContext(), m_internalFormat, m_size, m_depth);
2138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_gridTex		= new glu::TextureCubeArray(m_context.getRenderContext(), m_internalFormat, m_size, m_depth);
2148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const tcu::IVec4 levelSwz[] =
2168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
2178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::IVec4(0,1,2,3),
2188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::IVec4(2,1,3,0),
2198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::IVec4(3,0,1,2),
2208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::IVec4(1,3,2,0),
2218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		};
2228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Fill first gradient texture (gradient direction varies between layers).
2248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
2258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
2268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			m_gradientTex->getRefTexture().allocLevel(levelNdx);
2278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const tcu::PixelBufferAccess levelBuf = m_gradientTex->getRefTexture().getLevel(levelNdx);
2298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (int layerFaceNdx = 0; layerFaceNdx < m_depth; layerFaceNdx++)
2318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
2328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const tcu::IVec4	swz		= levelSwz[layerFaceNdx % DE_LENGTH_OF_ARRAY(levelSwz)];
2338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const tcu::Vec4		gMin	= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f).swizzle(swz[0],swz[1],swz[2],swz[3])*cScale + cBias;
2348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const tcu::Vec4		gMax	= tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f).swizzle(swz[0],swz[1],swz[2],swz[3])*cScale + cBias;
2358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				tcu::fillWithComponentGradients(tcu::getSubregion(levelBuf, 0, 0, layerFaceNdx, levelBuf.getWidth(), levelBuf.getHeight(), 1), gMin, gMax);
2378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
2388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
2398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Fill second with grid texture (each layer has unique colors).
2418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
2428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
2438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			m_gridTex->getRefTexture().allocLevel(levelNdx);
2448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const tcu::PixelBufferAccess levelBuf = m_gridTex->getRefTexture().getLevel(levelNdx);
2468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (int layerFaceNdx = 0; layerFaceNdx < m_depth; layerFaceNdx++)
2488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
2498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const deUint32	step	= 0x00ffffff / (numLevels*m_depth - 1);
2508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const deUint32	rgb		= step * (levelNdx + layerFaceNdx*numLevels);
2518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const deUint32	colorA	= 0xff000000 | rgb;
2528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const deUint32	colorB	= 0xff000000 | ~rgb;
2538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				tcu::fillWithGrid(tcu::getSubregion(levelBuf, 0, 0, layerFaceNdx, levelBuf.getWidth(), levelBuf.getHeight(), 1),
2558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry								  4, tcu::RGBA(colorA).toVec()*cScale + cBias, tcu::RGBA(colorB).toVec()*cScale + cBias);
2568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
2578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
2588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Upload.
2608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_gradientTex->upload();
2618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_gridTex->upload();
2628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Test cases
2648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
2658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const glu::TextureCubeArray* const	tex0	= m_gradientTex;
2668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const glu::TextureCubeArray* const	tex1	= m_gridTex;
2678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			if (m_onlySampleFaceInterior)
2698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
2708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				m_cases.push_back(FilterCase(tex0, tcu::Vec2(-0.8f, -0.8f),	tcu::Vec2(0.8f,  0.8f),	tcu::Vec2(-0.5f, float(numLayers)+0.5f)));	// minification
2718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				m_cases.push_back(FilterCase(tex0, tcu::Vec2(0.5f, 0.65f),	tcu::Vec2(0.8f,  0.8f),	tcu::Vec2(-0.5f, float(numLayers)+0.5f)));	// magnification
2728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				m_cases.push_back(FilterCase(tex1, tcu::Vec2(-0.8f, -0.8f),	tcu::Vec2(0.8f,  0.8f),	tcu::Vec2(float(numLayers)+0.5f, -0.5f)));	// minification
2738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				m_cases.push_back(FilterCase(tex1, tcu::Vec2(0.2f, 0.2f),	tcu::Vec2(0.6f,  0.5f),	tcu::Vec2(float(numLayers)+0.5f, -0.5f)));	// magnification
2748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
2758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			else
2768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
2778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const bool isSingleSample = (m_context.getRenderTarget().getNumSamples() == 0);
2788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				// minification - w/ tweak to avoid hitting triangle edges with a face switchpoint in multisample configs
2808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				if (isSingleSample)
2818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					m_cases.push_back(FilterCase(tex0, tcu::Vec2(-1.25f, -1.2f), tcu::Vec2(1.2f, 1.25f), tcu::Vec2(-0.5f, float(numLayers)+0.5f)));
2828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				else
2838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					m_cases.push_back(FilterCase(tex0, tcu::Vec2(-1.19f, -1.3f), tcu::Vec2(1.1f, 1.35f), tcu::Vec2(-0.5f, float(numLayers)+0.5f)));
2848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				m_cases.push_back(FilterCase(tex0, tcu::Vec2(0.8f, 0.8f),		tcu::Vec2(1.25f, 1.20f),	tcu::Vec2(-0.5f, float(numLayers)+0.5f)));	// magnification
2868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				m_cases.push_back(FilterCase(tex1, tcu::Vec2(-1.19f, -1.3f),	tcu::Vec2(1.1f, 1.35f),		tcu::Vec2(float(numLayers)+0.5f, -0.5f)));	// minification
2878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				m_cases.push_back(FilterCase(tex1, tcu::Vec2(-1.2f, -1.1f),		tcu::Vec2(-0.8f, -0.8f),	tcu::Vec2(float(numLayers)+0.5f, -0.5f)));	// magnification
2888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				// Layer rounding - only in single-sample configs as multisample configs may produce smooth transition at the middle.
2908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				if (isSingleSample && (numLayers > 1))
2918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					m_cases.push_back(FilterCase(tex0,	tcu::Vec2(-2.0f, -1.5f  ),	tcu::Vec2(-0.1f,  0.9f), tcu::Vec2(1.50001f, 1.49999f)));
2928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
2938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
2948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_caseNdx = 0;
2968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
2978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
2988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	catch (...)
2998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
3008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Clean up to save memory.
3018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		TextureCubeArrayFilteringCase::deinit();
3028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		throw;
3038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
3048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
3058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid TextureCubeArrayFilteringCase::deinit (void)
3078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
3088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	delete m_gradientTex;
3098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	delete m_gridTex;
3108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	m_gradientTex	= DE_NULL;
3128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	m_gridTex		= DE_NULL;
3138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	m_renderer.clear();
3158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	m_cases.clear();
3168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
3178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureCubeArrayFilteringCase::IterateResult TextureCubeArrayFilteringCase::iterate (void)
3198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
3208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	TestLog&						log				= m_testCtx.getLog();
3218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glu::RenderContext&		renderCtx		= m_context.getRenderContext();
3228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glw::Functions&			gl				= renderCtx.getFunctions();
3238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int						viewportSize	= 28;
3248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32					randomSeed		= deStringHash(getName()) ^ deInt32Hash(m_caseNdx) ^ m_testCtx.getCommandLine().getBaseSeed();
3258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const RandomViewport			viewport		(m_context.getRenderTarget(), viewportSize, viewportSize, randomSeed);
3268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const FilterCase&				curCase			= m_cases[m_caseNdx];
3278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const tcu::TextureFormat		texFmt			= curCase.texture->getRefTexture().getFormat();
3288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const tcu::TextureFormatInfo	fmtInfo			= tcu::getTextureFormatInfo(texFmt);
3298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const tcu::ScopedLogSection		section			(m_testCtx.getLog(), string("Test") + de::toString(m_caseNdx), string("Test ") + de::toString(m_caseNdx));
3308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	ReferenceParams					refParams		(TEXTURETYPE_CUBE_ARRAY);
3318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	if (viewport.width < viewportSize || viewport.height < viewportSize)
3338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		throw tcu::NotSupportedError("Render target too small", "", __FILE__, __LINE__);
3348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Params for reference computation.
3368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	refParams.sampler					= glu::mapGLSampler(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, m_minFilter, m_magFilter);
3378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	refParams.sampler.seamlessCubeMap	= true;
3388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	refParams.samplerType				= getSamplerType(texFmt);
3398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	refParams.colorBias					= fmtInfo.lookupBias;
3408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	refParams.colorScale				= fmtInfo.lookupScale;
3418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	refParams.lodMode					= LODMODE_EXACT;
3428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindTexture	(GL_TEXTURE_CUBE_MAP_ARRAY, curCase.texture->getGLTexture());
3448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER,	m_minFilter);
3458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER,	m_magFilter);
3468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S,		m_wrapS);
3478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T,		m_wrapT);
3488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
3508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	m_testCtx.getLog() << TestLog::Message << "Coordinates: " << curCase.bottomLeft << " -> " << curCase.topRight << TestLog::EndMessage;
3528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; faceNdx++)
3548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
3558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const tcu::CubeFace		face		= tcu::CubeFace(faceNdx);
3568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		tcu::Surface			result		(viewport.width, viewport.height);
3578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		vector<float>			texCoord;
3588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		computeQuadTexCoordCubeArray(texCoord, face, curCase.bottomLeft, curCase.topRight, curCase.layerRange);
3608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << TestLog::Message << "Face " << getFaceDesc(face) << TestLog::EndMessage;
3628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << TestLog::Message << "Texture coordinates:" << TestLog::EndMessage;
3648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		logCubeArrayTexCoords(log, texCoord);
3668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_renderer.renderQuad(0, &texCoord[0], refParams);
3688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GLU_EXPECT_NO_ERROR(gl.getError(), "Draw");
3698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		glu::readPixels(renderCtx, viewport.x, viewport.y, result.getAccess());
3718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GLU_EXPECT_NO_ERROR(gl.getError(), "Read pixels");
3728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
3748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const bool				isNearestOnly	= m_minFilter == GL_NEAREST && m_magFilter == GL_NEAREST;
3758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const tcu::PixelFormat	pixelFormat		= renderCtx.getRenderTarget().getPixelFormat();
3768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const tcu::IVec4		coordBits		= tcu::IVec4(10);
3778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const tcu::IVec4		colorBits		= max(getBitsVec(pixelFormat) - (isNearestOnly ? 1 : 2), tcu::IVec4(0)); // 1 inaccurate bit if nearest only, 2 otherwise
3788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::LodPrecision		lodPrecision;
3798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::LookupPrecision	lookupPrecision;
3808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			lodPrecision.derivateBits		= 10;
3828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			lodPrecision.lodBits			= 5;
3838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			lookupPrecision.colorThreshold	= tcu::computeFixedPointThreshold(colorBits) / refParams.colorScale;
3848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			lookupPrecision.coordBits		= coordBits.toWidth<3>();
3858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			lookupPrecision.uvwBits			= tcu::IVec3(6);
3868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			lookupPrecision.colorMask		= getCompareMask(pixelFormat);
3878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			const bool isHighQuality = verifyTextureResult(m_testCtx, result.getAccess(), curCase.texture->getRefTexture(),
3898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry														   &texCoord[0], refParams, lookupPrecision, coordBits, lodPrecision, pixelFormat);
3908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			if (!isHighQuality)
3928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
3938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				// Evaluate against lower precision requirements.
3948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				lodPrecision.lodBits	= 4;
3958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				lookupPrecision.uvwBits	= tcu::IVec3(4);
3968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				m_testCtx.getLog() << TestLog::Message << "Warning: Verification against high precision requirements failed, trying with lower requirements." << TestLog::EndMessage;
3988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
3998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const bool isOk = verifyTextureResult(m_testCtx, result.getAccess(), curCase.texture->getRefTexture(),
4008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry													  &texCoord[0], refParams, lookupPrecision, coordBits, lodPrecision, pixelFormat);
4018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				if (!isOk)
4038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				{
4048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					m_testCtx.getLog() << TestLog::Message << "ERROR: Verification against low precision requirements failed, failing test case." << TestLog::EndMessage;
4058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image verification failed");
4068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				}
4078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				else if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					m_testCtx.setTestResult(QP_TEST_RESULT_QUALITY_WARNING, "Low-quality filtering result");
4098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
4108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
4118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
4128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	m_caseNdx += 1;
4148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return m_caseNdx < (int)m_cases.size() ? CONTINUE : STOP;
4158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
4168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureFilteringTests::TextureFilteringTests (Context& context)
4188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	: TestCaseGroup(context, "filtering", "Texture Filtering Tests")
4198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
4208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
4218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureFilteringTests::~TextureFilteringTests (void)
4238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
4248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
4258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid TextureFilteringTests::init (void)
4278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
4288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static const struct
4298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const char*		name;
4318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deUint32		mode;
4328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	} wrapModes[] =
4338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "clamp",		GL_CLAMP_TO_EDGE },
4358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "repeat",		GL_REPEAT },
4368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "mirror",		GL_MIRRORED_REPEAT }
4378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
4388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static const struct
4408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const char*		name;
4428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deUint32		mode;
4438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	} minFilterModes[] =
4448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "nearest",				GL_NEAREST					},
4468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "linear",					GL_LINEAR					},
4478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "nearest_mipmap_nearest",	GL_NEAREST_MIPMAP_NEAREST	},
4488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "linear_mipmap_nearest",	GL_LINEAR_MIPMAP_NEAREST	},
4498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "nearest_mipmap_linear",	GL_NEAREST_MIPMAP_LINEAR	},
4508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "linear_mipmap_linear",	GL_LINEAR_MIPMAP_LINEAR		}
4518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
4528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static const struct
4548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const char*		name;
4568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deUint32		mode;
4578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	} magFilterModes[] =
4588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "nearest",	GL_NEAREST },
4608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "linear",		GL_LINEAR }
4618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
4628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static const struct
4648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		int size;
4668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		int depth;
4678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	} sizesCubeArray[] =
4688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{   8,	 6 },
4708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{  64,	12 },
4718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ 128,	12 },
4728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{   7,	12 },
4738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{  63,	18 }
4748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
4758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static const struct
4778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		const char*		name;
4798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deUint32		format;
4808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	} filterableFormatsByType[] =
4818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "rgba16f",		GL_RGBA16F			},
4838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "r11f_g11f_b10f",	GL_R11F_G11F_B10F	},
4848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "rgb9_e5",		GL_RGB9_E5			},
4858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "rgba8",			GL_RGBA8			},
4868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "rgba8_snorm",	GL_RGBA8_SNORM		},
4878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "rgb565",			GL_RGB565			},
4888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "rgba4",			GL_RGBA4			},
4898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "rgb5_a1",		GL_RGB5_A1			},
4908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "srgb8_alpha8",	GL_SRGB8_ALPHA8		},
4918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{ "rgb10_a2",		GL_RGB10_A2			}
4928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
4938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Cube map array texture filtering.
4958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
4968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		tcu::TestCaseGroup* const groupCubeArray = new tcu::TestCaseGroup(m_testCtx, "cube_array", "Cube Map Array Texture Filtering");
4978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		addChild(groupCubeArray);
4988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Formats.
5008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
5018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::TestCaseGroup* const formatsGroup = new tcu::TestCaseGroup(m_testCtx, "formats", "Cube Map Array Texture Formats");
5028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			groupCubeArray->addChild(formatsGroup);
5038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(filterableFormatsByType); fmtNdx++)
5058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
5068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
5078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				{
5088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	minFilter	= minFilterModes[filterNdx].mode;
5098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const char*		filterName	= minFilterModes[filterNdx].name;
5108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	format		= filterableFormatsByType[fmtNdx].format;
5118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const char*		formatName	= filterableFormatsByType[fmtNdx].name;
5128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const bool		isMipmap	= minFilter != GL_NEAREST && minFilter != GL_LINEAR;
5138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	magFilter	= isMipmap ? GL_LINEAR : minFilter;
5148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const string	name		= string(formatName) + "_" + filterName;
5158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	wrapS		= GL_REPEAT;
5168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	wrapT		= GL_REPEAT;
5178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const int		size		= 64;
5188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const int		depth		= 12;
5198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					formatsGroup->addChild(new TextureCubeArrayFilteringCase(m_context,
5218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																			 name.c_str(), "",
5228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																			 minFilter, magFilter,
5238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																			 wrapS, wrapT,
5248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																			 format,
5258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																			 size, depth));
5268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				}
5278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
5288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
5298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Sizes.
5318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
5328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::TestCaseGroup* const sizesGroup = new tcu::TestCaseGroup(m_testCtx, "sizes", "Texture Sizes");
5338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			groupCubeArray->addChild(sizesGroup);
5348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizesCubeArray); sizeNdx++)
5368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
5378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
5388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				{
5398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	minFilter	= minFilterModes[filterNdx].mode;
5408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const char*		filterName	= minFilterModes[filterNdx].name;
5418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	format		= GL_RGBA8;
5428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const bool		isMipmap	= minFilter != GL_NEAREST && minFilter != GL_LINEAR;
5438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	magFilter	= isMipmap ? GL_LINEAR : minFilter;
5448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	wrapS		= GL_REPEAT;
5458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const deUint32	wrapT		= GL_REPEAT;
5468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const int		size		= sizesCubeArray[sizeNdx].size;
5478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const int		depth		= sizesCubeArray[sizeNdx].depth;
5488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					const string	name		= de::toString(size) + "x" + de::toString(size) + "x" + de::toString(depth) + "_" + filterName;
5498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					sizesGroup->addChild(new TextureCubeArrayFilteringCase(m_context,
5518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																		   name.c_str(), "",
5528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																		   minFilter, magFilter,
5538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																		   wrapS, wrapT,
5548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																		   format,
5558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																		   size, depth));
5568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				}
5578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
5588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
5598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Wrap modes.
5618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
5628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::TestCaseGroup* const combinationsGroup = new tcu::TestCaseGroup(m_testCtx, "combinations", "Filter and wrap mode combinations");
5638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			groupCubeArray->addChild(combinationsGroup);
5648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (int minFilterNdx = 0; minFilterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); minFilterNdx++)
5668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
5678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				for (int magFilterNdx = 0; magFilterNdx < DE_LENGTH_OF_ARRAY(magFilterModes); magFilterNdx++)
5688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				{
5698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					for (int wrapSNdx = 0; wrapSNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapSNdx++)
5708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					{
5718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry						for (int wrapTNdx = 0; wrapTNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapTNdx++)
5728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry						{
5738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							const deUint32	minFilter	= minFilterModes[minFilterNdx].mode;
5748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							const deUint32	magFilter	= magFilterModes[magFilterNdx].mode;
5758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							const deUint32	format		= GL_RGBA8;
5768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							const deUint32	wrapS		= wrapModes[wrapSNdx].mode;
5778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							const deUint32	wrapT		= wrapModes[wrapTNdx].mode;
5788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							const int		size		= 63;
5798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							const int		depth		= 12;
5808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							const string	name		= string(minFilterModes[minFilterNdx].name) + "_" + magFilterModes[magFilterNdx].name + "_" + wrapModes[wrapSNdx].name + "_" + wrapModes[wrapTNdx].name;
5818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							combinationsGroup->addChild(new TextureCubeArrayFilteringCase(m_context,
5838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																						  name.c_str(), "",
5848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																						  minFilter, magFilter,
5858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																						  wrapS, wrapT,
5868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																						  format,
5878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																						  size, depth));
5888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry						}
5898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					}
5908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				}
5918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
5928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
5938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		// Cases with no visible cube edges.
5958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
5968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			tcu::TestCaseGroup* const onlyFaceInteriorGroup = new tcu::TestCaseGroup(m_testCtx, "no_edges_visible", "Don't sample anywhere near a face's edges");
5978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			groupCubeArray->addChild(onlyFaceInteriorGroup);
5988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			for (int isLinearI = 0; isLinearI <= 1; isLinearI++)
6008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			{
6018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const bool		isLinear	= isLinearI != 0;
6028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				const deUint32	filter		= isLinear ? GL_LINEAR : GL_NEAREST;
6038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				onlyFaceInteriorGroup->addChild(new TextureCubeArrayFilteringCase(m_context,
6058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																				  isLinear ? "linear" : "nearest", "",
6068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																				  filter, filter,
6078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																				  GL_REPEAT, GL_REPEAT,
6088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																				  GL_RGBA8,
6098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																				  63, 12,
6108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry																				  true));
6118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			}
6128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
6138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
6148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
6158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // Functional
6178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // gles31
6188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // deqp
619