106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry/*-------------------------------------------------------------------------
206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * drawElements Quality Program OpenGL ES 3.1 Module
306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * -------------------------------------------------
406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry *
506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * Copyright 2015 The Android Open Source Project
606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry *
706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * Licensed under the Apache License, Version 2.0 (the "License");
806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * you may not use this file except in compliance with the License.
906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * You may obtain a copy of the License at
1006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry *
1106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry *      http://www.apache.org/licenses/LICENSE-2.0
1206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry *
1306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * Unless required by applicable law or agreed to in writing, software
1406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * distributed under the License is distributed on an "AS IS" BASIS,
1506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * See the License for the specific language governing permissions and
1706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * limitations under the License.
1806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry *
1906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry *//*!
2006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * \file
2106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry * \brief Texture border clamp tests.
2206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry *//*--------------------------------------------------------------------*/
2306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "es31fTextureBorderClampTests.hpp"
2506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "glsTextureTestUtil.hpp"
2706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "tcuTextureUtil.hpp"
2906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "tcuTexLookupVerifier.hpp"
3006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "tcuTexCompareVerifier.hpp"
3106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "tcuCompressedTexture.hpp"
3206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "tcuResultCollector.hpp"
3306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "tcuSurface.hpp"
3406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "tcuSeedBuilder.hpp"
3506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "tcuVectorUtil.hpp"
3606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
3706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "rrGenericVector.hpp"
3806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
3906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "gluContextInfo.hpp"
4006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "gluTexture.hpp"
4106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "gluTextureUtil.hpp"
4206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "gluPixelTransfer.hpp"
4306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "gluStrUtil.hpp"
4406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "gluObjectWrapper.hpp"
4506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "gluShaderProgram.hpp"
4606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "gluDrawUtil.hpp"
4706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
4806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "glwEnums.hpp"
4906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "glwFunctions.hpp"
5006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
5106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "deStringUtil.hpp"
5206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "deUniquePtr.hpp"
5306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include "deRandom.hpp"
5406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
5506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry#include <limits>
5606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
5706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
5806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrynamespace deqp
5906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
6006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrynamespace gles31
6106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
6206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrynamespace Functional
6306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
6406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrynamespace
6506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
6606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
6706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryenum SizeType
6806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
6906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	SIZE_POT = 0,
7006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	SIZE_NPOT
7106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
7206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
7306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrybool filterRequiresFilterability (deUint32 filter)
7406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
7506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	switch (filter)
7606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
7706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case GL_NEAREST:
7806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case GL_NEAREST_MIPMAP_NEAREST:
7906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return false;
8006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
8106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case GL_LINEAR:
8206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case GL_LINEAR_MIPMAP_NEAREST:
8306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case GL_NEAREST_MIPMAP_LINEAR:
8406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case GL_LINEAR_MIPMAP_LINEAR:
8506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return true;
8606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
8706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		default:
8806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(false);
8906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return false;
9006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
9106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
9206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
9306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrybool isDepthFormat (deUint32 format, tcu::Sampler::DepthStencilMode mode)
9406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
9506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA || format == GL_ALPHA || format == GL_BGRA)
9606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
9706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// Unsized formats are a special case
9806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return false;
9906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
10006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (glu::isCompressedFormat(format))
10106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
10206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// no known compressed depth formats
10306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return false;
10406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
10506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
10606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
10706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::TextureFormat fmt = glu::mapGLInternalFormat(format);
10806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
10906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (fmt.order == tcu::TextureFormat::D)
11006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
11106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(mode == tcu::Sampler::MODE_DEPTH);
11206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return true;
11306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
11406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else if (fmt.order == tcu::TextureFormat::DS && mode == tcu::Sampler::MODE_DEPTH)
11506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return true;
11606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else
11706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return false;
11806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
11906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
12006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
12106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrybool isStencilFormat (deUint32 format, tcu::Sampler::DepthStencilMode mode)
12206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
12306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA || format == GL_ALPHA || format == GL_BGRA)
12406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
12506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// Unsized formats are a special case
12606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return false;
12706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
12806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (glu::isCompressedFormat(format))
12906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
13006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// no known compressed stencil formats
13106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return false;
13206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
13306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
13406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
13506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::TextureFormat fmt = glu::mapGLInternalFormat(format);
13606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
13706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (fmt.order == tcu::TextureFormat::S)
13806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
13906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(mode == tcu::Sampler::MODE_STENCIL);
14006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return true;
14106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
14206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else if (fmt.order == tcu::TextureFormat::DS && mode == tcu::Sampler::MODE_STENCIL)
14306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return true;
14406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else
14506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return false;
14606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
14706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
14806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
14906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrytcu::TextureChannelClass getFormatChannelClass (deUint32 format, tcu::Sampler::DepthStencilMode mode)
15006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
15106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA || format == GL_ALPHA || format == GL_BGRA)
15206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
15306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// Unsized formats are a special c, use UNORM8
15406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
15506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
15606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (glu::isCompressedFormat(format))
15706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
15806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::CompressedTexFormat	compressedFmt	= glu::mapGLCompressedTexFormat(format);
15906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::TextureFormat		uncompressedFmt	= tcu::getUncompressedFormat(compressedFmt);
16006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return tcu::getTextureChannelClass(uncompressedFmt.type);
16106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
16206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
16306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
16406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::TextureFormat fmt			= glu::mapGLInternalFormat(format);
16506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::TextureFormat effectiveFmt	= tcu::getEffectiveDepthStencilTextureFormat(fmt, mode);
16606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
16706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return tcu::getTextureChannelClass(effectiveFmt.type);
16806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
16906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
17006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
17106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryint getDimensionNumBlocks (int dimensionSize, int blockSize)
17206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
17306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// ceil( a / b )
17406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (dimensionSize + blockSize - 1) / blockSize;
17506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
17606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
17706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid generateDummyCompressedData (tcu::CompressedTexture& dst, const tcu::CompressedTexFormat& format)
17806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
17906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const int			blockByteSize	= tcu::getBlockSize(format);
18006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::IVec3	blockPixelSize	= tcu::getBlockPixelSize(format);
18106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::IVec3	numBlocks		(getDimensionNumBlocks(dst.getWidth(),    blockPixelSize.x()),
18206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										 getDimensionNumBlocks(dst.getHeight(),   blockPixelSize.y()),
18306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										 getDimensionNumBlocks(dst.getDepth(),    blockPixelSize.z()));
18406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const int			numTotalBlocks	= numBlocks.x() * numBlocks.y() * numBlocks.z();
18506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const int			dataSize		= numTotalBlocks * blockByteSize;
18606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
18706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	DE_ASSERT(dst.getDataSize() == dataSize);
18806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
18906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (tcu::isAstcFormat(format))
19006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
19106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// generate data that is valid in LDR mode
19206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const int		BLOCK_SIZE			= 16;
19306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const deUint8	block[BLOCK_SIZE]	= { 252, 253, 255, 255, 255, 255, 255, 255, 223, 251, 28, 206, 54, 251, 160, 174 };
19406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
19506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		DE_ASSERT(blockByteSize == BLOCK_SIZE);
19606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int ndx = 0; ndx < numTotalBlocks; ++ndx)
19706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deMemcpy((deUint8*)dst.getData() + ndx * BLOCK_SIZE, block, BLOCK_SIZE);
19806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
19906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
20006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
20106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// any data is ok
20206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		de::Random rnd(0xabc);
20306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
20406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int ndx = 0; ndx < dataSize; ++ndx)
20506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			((deUint8*)dst.getData())[ndx] = rnd.getUint8();
20606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
20706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
20806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
20906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrytemplate <typename T>
21006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrystruct TextureTraits
21106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
21206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
21306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
21406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrytemplate <>
21506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrystruct TextureTraits<glu::Texture2D>
21606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
21706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	typedef tcu::IVec2 SizeType;
21806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
21906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static de::MovePtr<glu::Texture2D> createTextureFromInternalFormat (glu::RenderContext& renderCtx, deUint32 texFormat, const tcu::IVec2& size)
22006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
22106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return de::MovePtr<glu::Texture2D>(new glu::Texture2D(renderCtx, texFormat, size.x(), size.y()));
22206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
22306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
22406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static de::MovePtr<glu::Texture2D> createTextureFromFormatAndType (glu::RenderContext& renderCtx, deUint32 texFormat, deUint32 type, const tcu::IVec2& size)
22506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
22606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return de::MovePtr<glu::Texture2D>(new glu::Texture2D(renderCtx, texFormat, type, size.x(), size.y()));
22706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
22806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
22906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static de::MovePtr<glu::Texture2D> createTextureFromCompressedData (glu::RenderContext&					renderCtx,
23006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		const glu::ContextInfo&				ctxInfo,
23106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		const tcu::CompressedTexture&		compressedLevel,
23206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		const tcu::TexDecompressionParams&	decompressionParams)
23306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
23406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return de::MovePtr<glu::Texture2D>(new glu::Texture2D(renderCtx,
23506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															  ctxInfo,
23606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															  1,
23706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															  &compressedLevel,
23806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															  decompressionParams));
23906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
24006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
24106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static int getTextureNumLayers (const tcu::IVec2& size)
24206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
24306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// 2D textures have one layer
24406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		DE_UNREF(size);
24506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return 1;
24606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
24706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
24806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
24906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrytemplate <>
25006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrystruct TextureTraits<glu::Texture3D>
25106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
25206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	typedef tcu::IVec3 SizeType;
25306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
25406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static de::MovePtr<glu::Texture3D> createTextureFromInternalFormat (glu::RenderContext& renderCtx, deUint32 texFormat, const tcu::IVec3& size)
25506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
25606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return de::MovePtr<glu::Texture3D>(new glu::Texture3D(renderCtx, texFormat, size.x(), size.y(), size.z()));
25706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
25806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
25906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static de::MovePtr<glu::Texture3D> createTextureFromFormatAndType (glu::RenderContext& renderCtx, deUint32 texFormat, deUint32 type, const tcu::IVec3& size)
26006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
26106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return de::MovePtr<glu::Texture3D>(new glu::Texture3D(renderCtx, texFormat, type, size.x(), size.y(), size.z()));
26206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
26306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
26406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static de::MovePtr<glu::Texture3D> createTextureFromCompressedData (glu::RenderContext&					renderCtx,
26506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		const glu::ContextInfo&				ctxInfo,
26606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		const tcu::CompressedTexture&		compressedLevel,
26706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		const tcu::TexDecompressionParams&	decompressionParams)
26806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
26906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return de::MovePtr<glu::Texture3D>(new glu::Texture3D(renderCtx,
27006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															  ctxInfo,
27106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															  1,
27206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															  &compressedLevel,
27306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															  decompressionParams));
27406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
27506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
27606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static int getTextureNumLayers (const tcu::IVec3& size)
27706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
27806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// 3D textures have Z layers
27906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return size.z();
28006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
28106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
28206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
28306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrytemplate <typename T>
28406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryde::MovePtr<T> genDummyTexture (glu::RenderContext& renderCtx, const glu::ContextInfo& ctxInfo, deUint32 texFormat, const typename TextureTraits<T>::SizeType& size)
28506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
28606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	de::MovePtr<T> texture;
28706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
28806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (isDepthFormat(texFormat, tcu::Sampler::MODE_DEPTH) || isStencilFormat(texFormat, tcu::Sampler::MODE_STENCIL))
28906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
29006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// fill different channels with different gradients
29106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texture = TextureTraits<T>::createTextureFromInternalFormat(renderCtx, texFormat, size);
29206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texture->getRefTexture().allocLevel(0);
29306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
29406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (isDepthFormat(texFormat, tcu::Sampler::MODE_DEPTH))
29506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
29606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// fill depth with 0 -> 1
29706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::PixelBufferAccess depthAccess = tcu::getEffectiveDepthStencilAccess(texture->getRefTexture().getLevel(0), tcu::Sampler::MODE_DEPTH);
29806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::fillWithComponentGradients(depthAccess, tcu::Vec4(0.0f), tcu::Vec4(1.0f));
29906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
30006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
30106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (isStencilFormat(texFormat, tcu::Sampler::MODE_STENCIL))
30206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
30306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// fill stencil with 0 -> max
30406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::PixelBufferAccess	stencilAccess	= tcu::getEffectiveDepthStencilAccess(texture->getRefTexture().getLevel(0), tcu::Sampler::MODE_STENCIL);
30506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::TextureFormatInfo	texFormatInfo	= tcu::getTextureFormatInfo(stencilAccess.getFormat());
30606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
30706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// Flip y to make stencil and depth cases not look identical
30806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::fillWithComponentGradients(tcu::flipYAccess(stencilAccess), texFormatInfo.valueMax, texFormatInfo.valueMin);
30906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
31006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
31106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texture->upload();
31206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
31306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (!glu::isCompressedFormat(texFormat))
31406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
31506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (texFormat == GL_LUMINANCE || texFormat == GL_LUMINANCE_ALPHA || texFormat == GL_ALPHA || texFormat == GL_BGRA)
31606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			texture = TextureTraits<T>::createTextureFromFormatAndType(renderCtx, texFormat, GL_UNSIGNED_BYTE, size);
31706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else
31806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			texture = TextureTraits<T>::createTextureFromInternalFormat(renderCtx, texFormat, size);
31906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
32006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// Fill level 0.
32106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texture->getRefTexture().allocLevel(0);
32206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
32306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// fill with gradient min -> max
32406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
32506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::TextureFormatInfo	texFormatInfo	= tcu::getTextureFormatInfo(texture->getRefTexture().getFormat());
32606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::Vec4					rampLow			= texFormatInfo.valueMin;
32706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::Vec4					rampHigh		= texFormatInfo.valueMax;
32806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::fillWithComponentGradients(texture->getRefTexture().getLevel(0), rampLow, rampHigh);
32906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
33006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
33106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texture->upload();
33206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
33306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
33406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
33506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::CompressedTexFormat	compressedFormat	= glu::mapGLCompressedTexFormat(texFormat);
33606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const int						numLayers			= TextureTraits<T>::getTextureNumLayers(size);
33706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::CompressedTexture			compressedLevel		(compressedFormat, size.x(), size.y(), numLayers);
33806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const bool						isAstcFormat		= tcu::isAstcFormat(compressedFormat);
33906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::TexDecompressionParams		decompressionParams	((isAstcFormat) ? (tcu::TexDecompressionParams::ASTCMODE_LDR) : (tcu::TexDecompressionParams::ASTCMODE_LAST));
34006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
34106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		generateDummyCompressedData(compressedLevel, compressedFormat);
34206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
34306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texture = TextureTraits<T>::createTextureFromCompressedData(renderCtx,
34406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	ctxInfo,
34506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	compressedLevel,
34606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	decompressionParams);
34706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
34806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
34906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return texture;
35006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
35106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
35206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryint getNBitIntegerMaxValue (bool isSigned, int numBits)
35306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
35406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	DE_ASSERT(numBits < 32);
35506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
35606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numBits == 0)
35706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return 0;
35806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (isSigned)
35906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return deIntMaxValue32(numBits);
36006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
36106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return deUintMaxValue32(numBits);
36206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
36306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
36406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryint getNBitIntegerMinValue (bool isSigned, int numBits)
36506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
36606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	DE_ASSERT(numBits < 32);
36706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
36806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numBits == 0)
36906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return 0;
37006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (isSigned)
37106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return deIntMinValue32(numBits);
37206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
37306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return 0;
37406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
37506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
37606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrytcu::IVec4 getNBitIntegerVec4MaxValue (bool isSigned, const tcu::IVec4& numBits)
37706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
37806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return tcu::IVec4(getNBitIntegerMaxValue(isSigned, numBits[0]),
37906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					  getNBitIntegerMaxValue(isSigned, numBits[1]),
38006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					  getNBitIntegerMaxValue(isSigned, numBits[2]),
38106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					  getNBitIntegerMaxValue(isSigned, numBits[3]));
38206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
38306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
38406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrytcu::IVec4 getNBitIntegerVec4MinValue (bool isSigned, const tcu::IVec4& numBits)
38506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
38606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return tcu::IVec4(getNBitIntegerMinValue(isSigned, numBits[0]),
38706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					  getNBitIntegerMinValue(isSigned, numBits[1]),
38806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					  getNBitIntegerMinValue(isSigned, numBits[2]),
38906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					  getNBitIntegerMinValue(isSigned, numBits[3]));
39006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
39106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
39206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryrr::GenericVec4 mapToFormatColorUnits (const tcu::TextureFormat& texFormat, const tcu::Vec4& normalizedRange)
39306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
39406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormatInfo texFormatInfo = tcu::getTextureFormatInfo(texFormat);
39506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
39606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	switch (tcu::getTextureChannelClass(texFormat.type))
39706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
39806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:		return rr::GenericVec4(normalizedRange);
39906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:		return rr::GenericVec4(normalizedRange * 2.0f - 1.0f);
40006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:			return rr::GenericVec4(texFormatInfo.valueMin + normalizedRange * texFormatInfo.valueMax);
40106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:			return rr::GenericVec4(tcu::mix(texFormatInfo.valueMin, texFormatInfo.valueMax, normalizedRange).cast<deInt32>());
40206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:			return rr::GenericVec4(tcu::mix(texFormatInfo.valueMin, texFormatInfo.valueMax, normalizedRange).cast<deUint32>());
40306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
40406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		default:
40506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(false);
40606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return rr::GenericVec4();
40706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
40806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
40906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
41006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryrr::GenericVec4 mapToFormatColorRepresentable (const tcu::TextureFormat& texFormat, const tcu::Vec4& normalizedRange)
41106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
41206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// make sure value is representable in the target format and clear channels
41306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// not present in the target format.
41406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
41506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const rr::GenericVec4		inFormatUnits	= mapToFormatColorUnits(texFormat, normalizedRange);
41606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::BVec4			channelMask		= tcu::getTextureFormatChannelMask(texFormat);
41706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	de::ArrayBuffer<deUint8, 4>	buffer			(texFormat.getPixelSize());
41806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::PixelBufferAccess		access			(texFormat, tcu::IVec3(1, 1, 1), buffer.getPtr());
41906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
420d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry	if (tcu::isSRGB(texFormat))
421d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry	{
422d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry		DE_ASSERT(texFormat.type == tcu::TextureFormat::UNORM_INT8);
423d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry
424d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry		// make sure border color (in linear space) can be converted to 8-bit sRGB space without
425d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry		// significant loss.
426d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry		const tcu::Vec4		sRGB		= tcu::linearToSRGB(normalizedRange);
427d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry		const tcu::IVec4	sRGB8		= tcu::IVec4(tcu::floatToU8(sRGB[0]),
428d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry													 tcu::floatToU8(sRGB[1]),
429d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry													 tcu::floatToU8(sRGB[2]),
430d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry													 tcu::floatToU8(sRGB[3]));
4317a161d243743d8d12e12669d7464c360de1b5e97Jarkko Pöyry		const tcu::Vec4		linearized	= tcu::sRGBToLinear(tcu::Vec4((float)sRGB8[0] / 255.0f,
4327a161d243743d8d12e12669d7464c360de1b5e97Jarkko Pöyry																	  (float)sRGB8[1] / 255.0f,
4337a161d243743d8d12e12669d7464c360de1b5e97Jarkko Pöyry																	  (float)sRGB8[2] / 255.0f,
4347a161d243743d8d12e12669d7464c360de1b5e97Jarkko Pöyry																	  (float)sRGB8[3] / 255.0f));
435d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry
436d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry		return rr::GenericVec4(tcu::select(linearized, tcu::Vec4(0.0f), channelMask));
437d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry	}
438d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry
43906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	switch (tcu::getTextureChannelClass(texFormat.type))
44006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
44106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
44206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
44306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
44406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
44506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			access.setPixel(inFormatUnits.get<float>(), 0, 0);
44606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return rr::GenericVec4(tcu::select(access.getPixel(0, 0), tcu::Vec4(0.0f), channelMask));
44706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
44806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
44906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
45006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			access.setPixel(inFormatUnits.get<deInt32>(), 0, 0);
45106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return rr::GenericVec4(tcu::select(access.getPixelInt(0, 0), tcu::IVec4(0), channelMask));
45206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
45306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
45406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
45506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			access.setPixel(inFormatUnits.get<deUint32>(), 0, 0);
45606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return rr::GenericVec4(tcu::select(access.getPixelUint(0, 0), tcu::UVec4(0u), channelMask));
45706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
45806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		default:
45906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
46006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(false);
46106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			return rr::GenericVec4();
46206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
46306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
46406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
46506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
46606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrybool isCoreFilterableFormat (deUint32 format, tcu::Sampler::DepthStencilMode mode)
46706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
46806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool	isLuminanceOrAlpha		= (format == GL_LUMINANCE || format == GL_ALPHA || format == GL_LUMINANCE_ALPHA); // special case for luminance/alpha
46906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool	isUnsizedColorFormat	= (format == GL_BGRA);
47006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool	isCompressed			= glu::isCompressedFormat(format);
47106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool	isDepth					= isDepthFormat(format, mode);
47206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool	isStencil				= isStencilFormat(format, mode);
47306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
47406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// special cases
47506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (isLuminanceOrAlpha || isUnsizedColorFormat || isCompressed)
47606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return true;
47706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (isStencil || isDepth)
47806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return false;
47906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
48006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// color case
48106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return glu::isGLInternalColorFormatFilterable(format);
48206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
48306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
48406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryclass TextureBorderClampTest : public TestCase
48506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
48606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrypublic:
48706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	enum StateType
48806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
48906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		STATE_SAMPLER_PARAM = 0,
49006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		STATE_TEXTURE_PARAM,
49106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
49206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		STATE_LAST
49306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
49406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
49506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	enum SamplingFunction
49606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
49706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		SAMPLE_FILTER = 0,
49806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		SAMPLE_GATHER,
49906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
50006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		SAMPLE_LAST
50106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
50206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
50306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	enum Flag
50406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
50506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		FLAG_USE_SHADOW_SAMPLER = (1u << 0),
50606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
50706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
50806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	struct IterationConfig
50906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
51006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2		p0;
51106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2		p1;
51206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		rr::GenericVec4	borderColor;
51306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec4		lookupScale;
51406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec4		lookupBias;
51506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		deUint32		minFilter;
51606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		deUint32		magFilter;
51706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		std::string		description;
51806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		deUint32		sWrapMode;
51906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		deUint32		tWrapMode;
52006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		deUint32		compareMode;
52106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		float			compareRef;
52206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
52306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
52406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														TextureBorderClampTest		(Context&						context,
52506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const char*					name,
52606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const char*					description,
52706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 deUint32						texFormat,
52806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 tcu::Sampler::DepthStencilMode	mode,
52906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 StateType						stateType,
53006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 int							texWidth,
53106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 int							texHeight,
53206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 SamplingFunction				samplingFunction,
53306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 deUint32						flags				= 0);
53406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														~TextureBorderClampTest		(void);
53506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
53606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprotected:
53706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												init						(void);
53806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												deinit						(void);
53906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
54006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprivate:
54106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterateResult										iterate						(void);
54206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
54306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												logParams					(const IterationConfig&							config,
544c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																					 const glu::TextureTestUtil::ReferenceParams&	samplerParams);
54506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
54606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												renderTo					(tcu::Surface&									surface,
54706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const IterationConfig&							config,
548c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																					 const glu::TextureTestUtil::ReferenceParams&	samplerParams);
54906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												renderQuad					(const float*									texCoord,
550c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																					 const glu::TextureTestUtil::ReferenceParams&	samplerParams);
55106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
55206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												verifyImage					(const tcu::Surface&							image,
55306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const IterationConfig&							config,
554c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																					 const glu::TextureTestUtil::ReferenceParams&	samplerParams);
55506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
55606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	bool												verifyTextureSampleResult	(const tcu::ConstPixelBufferAccess&				renderedFrame,
55706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const float*									texCoord,
558c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																					 const glu::TextureTestUtil::ReferenceParams&	samplerParams,
55906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::LodPrecision&						lodPrecision,
56006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::LookupPrecision&					lookupPrecision);
56106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
562653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	bool												verifyTextureCompareResult	(const tcu::ConstPixelBufferAccess&				renderedFrame,
56306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const float*									texCoord,
564c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																					 const glu::TextureTestUtil::ReferenceParams&	samplerParams,
56506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::TexComparePrecision&				texComparePrecision,
56606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::TexComparePrecision&				lowQualityTexComparePrecision,
56706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::LodPrecision&						lodPrecision,
56806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::LodPrecision&						lowQualityLodPrecision);
56906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
57006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	bool												verifyTextureGatherResult	(const tcu::ConstPixelBufferAccess&				renderedFrame,
57106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const float*									texCoord,
572c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																					 const glu::TextureTestUtil::ReferenceParams&	samplerParams,
57306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::LookupPrecision&					lookupPrecision);
57406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
57506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	bool												verifyTextureGatherCmpResult(const tcu::ConstPixelBufferAccess&				renderedFrame,
57606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const float*									texCoord,
577c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																					 const glu::TextureTestUtil::ReferenceParams&	samplerParams,
57806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::TexComparePrecision&				texComparePrecision,
57906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																					 const tcu::TexComparePrecision&				lowQualityTexComparePrecision);
58006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
58106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	deUint32											getIterationSeed			(const IterationConfig& config) const;
582c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::ReferenceParams				genSamplerParams			(const IterationConfig& config) const;
58306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	glu::ShaderProgram*									genGatherProgram			(void) const;
58406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
58506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	virtual int											getNumIterations			(void) const = 0;
58606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	virtual IterationConfig								getIteration				(int ndx) const = 0;
58706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
58806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprotected:
58906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const glu::Texture2D*								getTexture						(void) const;
59006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
59106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32										m_texFormat;
59206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::Sampler::DepthStencilMode				m_sampleMode;
59306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureChannelClass						m_channelClass;
59406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const StateType										m_stateType;
59506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
59606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const int											m_texHeight;
59706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const int											m_texWidth;
59806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
59906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const SamplingFunction								m_samplingFunction;
60006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool											m_useShadowSampler;
60106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprivate:
60206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	enum
60306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
60406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		VIEWPORT_WIDTH		= 128,
60506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		VIEWPORT_HEIGHT		= 128,
60606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
60706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
60806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	de::MovePtr<glu::Texture2D>							m_texture;
60906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	de::MovePtr<gls::TextureTestUtil::TextureRenderer>	m_renderer;
61006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	de::MovePtr<glu::ShaderProgram>						m_gatherProgram;
61106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
61206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int													m_iterationNdx;
61306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::ResultCollector								m_result;
61406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
61506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
61606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTest::TextureBorderClampTest (Context&						context,
61706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												const char*						name,
61806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												const char*						description,
61906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												deUint32						texFormat,
62006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												tcu::Sampler::DepthStencilMode	mode,
62106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												StateType						stateType,
62206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												int								texWidth,
62306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												int								texHeight,
62406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												SamplingFunction				samplingFunction,
62506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry												deUint32						flags)
62606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	: TestCase				(context, name, description)
62706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_texFormat			(texFormat)
62806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_sampleMode			(mode)
62906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_channelClass		(getFormatChannelClass(texFormat, mode))
63006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_stateType			(stateType)
63106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_texHeight			(texHeight)
63206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_texWidth			(texWidth)
63306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_samplingFunction	(samplingFunction)
63406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_useShadowSampler	((flags & FLAG_USE_SHADOW_SAMPLER) != 0)
63506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_iterationNdx		(0)
63606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_result				(context.getTestContext().getLog())
63706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
63806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	DE_ASSERT(stateType < STATE_LAST);
63906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	DE_ASSERT(samplingFunction < SAMPLE_LAST);
64006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// mode must be set for combined depth-stencil formats
64106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	DE_ASSERT(m_channelClass != tcu::TEXTURECHANNELCLASS_LAST || mode != tcu::Sampler::MODE_LAST);
64206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
64306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
64406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTest::~TextureBorderClampTest (void)
64506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
64606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	deinit();
64706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
64806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
64906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampTest::init (void)
65006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
65106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// requirements
652f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe	const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
65306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
654f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe	if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_border_clamp"))
65506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		throw tcu::NotSupportedError("Test requires GL_EXT_texture_border_clamp extension");
65606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
65706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (glu::isCompressedFormat(m_texFormat)													&&
658f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe		!supportsES32																			&&
65906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::isAstcFormat(glu::mapGLCompressedTexFormat(m_texFormat))							&&
66006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		!m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
66106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
66206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		throw tcu::NotSupportedError("Test requires GL_KHR_texture_compression_astc_ldr extension");
66306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
66406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
66506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_texFormat == GL_BGRA && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_format_BGRA8888"))
66606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		throw tcu::NotSupportedError("Test requires GL_EXT_texture_format_BGRA8888 extension");
66706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
66806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_context.getRenderTarget().getWidth() < VIEWPORT_WIDTH ||
66906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_context.getRenderTarget().getHeight() < VIEWPORT_HEIGHT)
67006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
67106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		throw tcu::NotSupportedError("Test requires " + de::toString<int>(VIEWPORT_WIDTH) + "x" + de::toString<int>(VIEWPORT_HEIGHT) + " viewport");
67206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
67306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
67406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// resources
67506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
67606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_texture = genDummyTexture<glu::Texture2D>(m_context.getRenderContext(), m_context.getContextInfo(), m_texFormat, tcu::IVec2(m_texWidth, m_texHeight));
67706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
67806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::Message
679b2e583dfcd8aa0d4ef254f841213fcf724b2b193Jarkko Pöyry						<< "Created texture with format " << glu::getTextureFormatName(m_texFormat)
68006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< ", size (" << m_texture->getRefTexture().getWidth() << ", " << m_texture->getRefTexture().getHeight() << ")\n"
68106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Setting sampling state using " << ((m_stateType == STATE_TEXTURE_PARAM) ? ("texture state") : ("sampler state"))
68206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::EndMessage;
68306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
68406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_samplingFunction == SAMPLE_FILTER)
68506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
686f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe		const glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType());
687f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe
688f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe		m_renderer = de::MovePtr<gls::TextureTestUtil::TextureRenderer>(new gls::TextureTestUtil::TextureRenderer(m_context.getRenderContext(), m_testCtx.getLog(), glslVersion, glu::PRECISION_HIGHP));
68906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
69006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
69106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
69206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_gatherProgram = de::MovePtr<glu::ShaderProgram>(genGatherProgram());
69306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
69406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Message
69506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< "Using texture gather to sample texture"
69606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::EndMessage
69706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< *m_gatherProgram;
69806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
69906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (!m_gatherProgram->isOk())
70006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			throw tcu::TestError("failed to build program");
70106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
70206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
70306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
70406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampTest::deinit (void)
70506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
70606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_texture.clear();
70706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_renderer.clear();
70806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_gatherProgram.clear();
70906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
71006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
71106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTest::IterateResult TextureBorderClampTest::iterate (void)
71206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
71306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const IterationConfig						iterationConfig		= getIteration(m_iterationNdx);
71406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const std::string							iterationDesc		= "Iteration " + de::toString(m_iterationNdx+1) + (iterationConfig.description.empty() ? ("") : (" - " + iterationConfig.description));
71506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::ScopedLogSection					section				(m_testCtx.getLog(), "Iteration", iterationDesc);
71606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface								renderedFrame		(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
717c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	const glu::TextureTestUtil::ReferenceParams	samplerParams		= genSamplerParams(iterationConfig);
71806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
71906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	logParams(iterationConfig, samplerParams);
72006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	renderTo(renderedFrame, iterationConfig, samplerParams);
72106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	verifyImage(renderedFrame, iterationConfig, samplerParams);
72206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
72306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (++m_iterationNdx == getNumIterations())
72406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
72506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_result.setTestContextResult(m_testCtx);
72606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return STOP;
72706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
72806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return CONTINUE;
72906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
73006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
731c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siketvoid TextureBorderClampTest::logParams (const IterationConfig& config, const glu::TextureTestUtil::ReferenceParams& samplerParams)
73206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
73306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const std::string				borderColorString	= (m_channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)   ? (de::toString(config.borderColor.get<deInt32>()))
73406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														: (m_channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) ? (de::toString(config.borderColor.get<deUint32>()))
73506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														:																  (de::toString(config.borderColor.get<float>()));
73606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
73706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::Message
73806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Rendering full screen quad, tex coords bottom-left: " << config.p0 << ", top-right " << config.p1 << "\n"
73906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Border color is " << borderColorString << "\n"
74006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Texture lookup bias: " << samplerParams.colorBias << "\n"
74106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Texture lookup scale: " << samplerParams.colorScale << "\n"
74206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Filters: min = " << glu::getTextureFilterName(glu::getGLFilterMode(samplerParams.sampler.minFilter))
74306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< ", mag = " << glu::getTextureFilterName(glu::getGLFilterMode(samplerParams.sampler.magFilter)) << "\n"
74406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Wrap mode: s = " << glu::getRepeatModeStr(config.sWrapMode)
74506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< ", t = " << glu::getRepeatModeStr(config.tWrapMode) << "\n"
74606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::EndMessage;
74706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
74806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_sampleMode == tcu::Sampler::MODE_DEPTH)
74906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "Depth stencil texture mode is DEPTH_COMPONENT" << tcu::TestLog::EndMessage;
75006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (m_sampleMode == tcu::Sampler::MODE_STENCIL)
75106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "Depth stencil texture mode is STENCIL_INDEX" << tcu::TestLog::EndMessage;
75206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
75306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (config.compareMode != GL_NONE)
75406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
75506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Message
75606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< "Texture mode is COMPARE_REF_TO_TEXTURE, mode = " << glu::getCompareFuncStr(config.compareMode) << "\n"
75706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< "Compare reference value = " << config.compareRef << "\n"
75806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::EndMessage;
75906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
76006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
76106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
76206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampTest::renderTo (tcu::Surface&								surface,
76306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									   const IterationConfig&						config,
764c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket									   const glu::TextureTestUtil::ReferenceParams&	samplerParams)
76506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
76606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const glw::Functions&						gl			= m_context.getRenderContext().getFunctions();
76706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const gls::TextureTestUtil::RandomViewport	viewport	(m_context.getRenderTarget(), VIEWPORT_WIDTH, VIEWPORT_HEIGHT, getIterationSeed(config));
76806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<float>							texCoord;
76906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	de::MovePtr<glu::Sampler>					sampler;
77006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
771c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::computeQuadTexCoord2D(texCoord, config.p0, config.p1);
77206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
77306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// Bind to unit 0.
77406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.activeTexture(GL_TEXTURE0);
77506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.bindTexture(GL_TEXTURE_2D, m_texture->getGLTexture());
77606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
77706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_sampleMode == tcu::Sampler::MODE_DEPTH)
77806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
77906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (m_sampleMode == tcu::Sampler::MODE_STENCIL)
78006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
78106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
78206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (config.compareMode == GL_NONE)
78306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
78406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
78506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_ALWAYS);
78606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
78706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
78806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
78906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
79006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, config.compareMode);
79106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
79206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
79306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_stateType == STATE_TEXTURE_PARAM)
79406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
79506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// Setup filtering and wrap modes.
79606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,		glu::getGLWrapMode(samplerParams.sampler.wrapS));
79706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,		glu::getGLWrapMode(samplerParams.sampler.wrapT));
79806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,	glu::getGLFilterMode(samplerParams.sampler.minFilter));
79906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,	glu::getGLFilterMode(samplerParams.sampler.magFilter));
80006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
80106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		switch (m_channelClass)
80206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
80306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
80406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
80506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
80606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				gl.texParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, config.borderColor.getAccess<float>());
80706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
80806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
80906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
81006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				gl.texParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, config.borderColor.getAccess<deInt32>());
81106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
81206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
81306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
81406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				gl.texParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, config.borderColor.getAccess<deUint32>());
81506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
81606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
81706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			default:
81806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				DE_ASSERT(false);
81906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
82006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
82106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (m_stateType == STATE_SAMPLER_PARAM)
82206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
82306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4 blue(0.0f, 0.0f, 1.0f, 1.0f);
82406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
82506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// Setup filtering and wrap modes to bad values
82606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,		GL_REPEAT);
82706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,		GL_REPEAT);
82806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,	GL_NEAREST);
82906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,	GL_NEAREST);
83006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.texParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, blue.getPtr()); // just set some unlikely color
83106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
83206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// setup sampler to correct values
83306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		sampler = de::MovePtr<glu::Sampler>(new glu::Sampler(m_context.getRenderContext()));
83406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
83506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.samplerParameteri(**sampler, GL_TEXTURE_WRAP_S,		glu::getGLWrapMode(samplerParams.sampler.wrapS));
83606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.samplerParameteri(**sampler, GL_TEXTURE_WRAP_T,		glu::getGLWrapMode(samplerParams.sampler.wrapT));
83706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.samplerParameteri(**sampler, GL_TEXTURE_MIN_FILTER,	glu::getGLFilterMode(samplerParams.sampler.minFilter));
83806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.samplerParameteri(**sampler, GL_TEXTURE_MAG_FILTER,	glu::getGLFilterMode(samplerParams.sampler.magFilter));
83906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
84006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		switch (m_channelClass)
84106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
84206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
84306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
84406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
84506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				gl.samplerParameterfv(**sampler, GL_TEXTURE_BORDER_COLOR, config.borderColor.getAccess<float>());
84606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
84706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
84806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
84906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				gl.samplerParameterIiv(**sampler, GL_TEXTURE_BORDER_COLOR, config.borderColor.getAccess<deInt32>());
85006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
85106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
85206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
85306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				gl.samplerParameterIuiv(**sampler, GL_TEXTURE_BORDER_COLOR, config.borderColor.getAccess<deUint32>());
85406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
85506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
85606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			default:
85706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				DE_ASSERT(false);
85806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
85906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
86006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.bindSampler(0, **sampler);
86106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
86206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
86306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
86406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
86506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
86606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	renderQuad(&texCoord[0], samplerParams);
86706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	glu::readPixels(m_context.getRenderContext(), viewport.x, viewport.y, surface.getAccess());
86806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
86906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
870c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siketvoid TextureBorderClampTest::renderQuad (const float* texCoord, const glu::TextureTestUtil::ReferenceParams& samplerParams)
87106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
87206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// use TextureRenderer for basic rendering, use custom for gather
87306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_samplingFunction == SAMPLE_FILTER)
87406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_renderer->renderQuad(0, texCoord, samplerParams);
87506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
87606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
87706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const float position[] =
87806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
87906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			-1.0f, -1.0f, 0.0f, 1.0f,
88006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			-1.0f, +1.0f, 0.0f, 1.0f,
88106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			+1.0f, -1.0f, 0.0f, 1.0f,
88206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			+1.0f, +1.0f, 0.0f, 1.0f
88306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
88406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const deUint16 indices[] =
88506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
88606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			0, 1, 2, 2, 1, 3
88706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
88806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const glu::VertexArrayBinding vertexArrays[] =
88906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
89006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			glu::va::Float("a_position",	4,	4, 0, &position[0]),
89106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			glu::va::Float("a_texcoord",	2,	4, 0, texCoord)
89206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
89306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
89406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const glw::Functions&	gl		= m_context.getRenderContext().getFunctions();
89506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const deUint32			progId	= m_gatherProgram->getProgram();
89606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
89706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.useProgram(progId);
89806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.uniform1i(gl.getUniformLocation(progId, "u_sampler"), 0);
89906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (m_useShadowSampler)
90006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			gl.uniform1f(gl.getUniformLocation(progId, "u_ref"), samplerParams.ref);
90106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.uniform4fv(gl.getUniformLocation(progId, "u_colorScale"), 1, samplerParams.colorScale.getPtr());
90206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		gl.uniform4fv(gl.getUniformLocation(progId, "u_colorBias"), 1, samplerParams.colorBias.getPtr());
90306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
90406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		glu::draw(m_context.getRenderContext(), progId, DE_LENGTH_OF_ARRAY(vertexArrays), &vertexArrays[0],
90506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					glu::pr::Triangles(DE_LENGTH_OF_ARRAY(indices), &indices[0]));
90606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
90706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
90806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
90906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampTest::verifyImage (const tcu::Surface&							renderedFrame,
91006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										  const IterationConfig&						config,
911c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket										  const glu::TextureTestUtil::ReferenceParams&	samplerParams)
91206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
91306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::PixelFormat	pixelFormat		= m_context.getRenderTarget().getPixelFormat();
91406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
915433645782506cbdf8fa8b113ea0b5aa8ae761f0cPyry Haulos	tcu::LodPrecision		lodPrecision;
91606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<float>		texCoord;
91706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	bool					verificationOk;
91806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
919c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::computeQuadTexCoord2D(texCoord, config.p0, config.p1);
92006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
92106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	lodPrecision.derivateBits		= 18;
92206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	lodPrecision.lodBits			= 5;
92306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
92406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (samplerParams.sampler.compare == tcu::Sampler::COMPAREMODE_NONE)
92506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
92606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::TextureFormat		texFormat			= tcu::getEffectiveDepthStencilTextureFormat(m_texture->getRefTexture().getFormat(), m_sampleMode);
92706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const bool						isNearestMinFilter	= samplerParams.sampler.minFilter == tcu::Sampler::NEAREST || samplerParams.sampler.minFilter == tcu::Sampler::NEAREST_MIPMAP_NEAREST;
92806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const bool						isNearestMagFilter	= samplerParams.sampler.magFilter == tcu::Sampler::NEAREST;
92906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const bool						isNearestOnly		= isNearestMinFilter && isNearestMagFilter;
93006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const bool						isSRGB				= texFormat.order == tcu::TextureFormat::sRGB || texFormat.order == tcu::TextureFormat::sRGBA;
93106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const int						colorErrorBits		= (isNearestOnly && !isSRGB) ? (1) : (2);
932c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket		const tcu::IVec4				colorBits			= tcu::max(glu::TextureTestUtil::getBitsVec(pixelFormat) - tcu::IVec4(colorErrorBits), tcu::IVec4(0));
93306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::LookupPrecision			lookupPrecision;
93406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
93506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lookupPrecision.colorThreshold	= tcu::computeFixedPointThreshold(colorBits) / samplerParams.colorScale;
93606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lookupPrecision.coordBits		= tcu::IVec3(20,20,0);
93706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lookupPrecision.uvwBits			= tcu::IVec3(5,5,0);
938c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket		lookupPrecision.colorMask		= glu::TextureTestUtil::getCompareMask(pixelFormat);
93906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
94006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (m_samplingFunction == SAMPLE_FILTER)
94106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
94206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			verificationOk = verifyTextureSampleResult(renderedFrame.getAccess(),
94306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													   &texCoord[0],
94406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													   samplerParams,
94506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													   lodPrecision,
94606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													   lookupPrecision);
94706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
94806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else if (m_samplingFunction == SAMPLE_GATHER)
94906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
95006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			verificationOk = verifyTextureGatherResult(renderedFrame.getAccess(),
95106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													   &texCoord[0],
95206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													   samplerParams,
95306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													   lookupPrecision);
95406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
95506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else
95606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
95706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(false);
95806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			verificationOk = false;
95906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
96006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
96106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
96206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
963653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		tcu::TexComparePrecision	texComparePrecision;
96406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::TexComparePrecision	lowQualityTexComparePrecision;
965653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		tcu::LodPrecision			lowQualityLodPrecision			= lodPrecision;
96606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
96706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texComparePrecision.coordBits					= tcu::IVec3(20,20,0);
96806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texComparePrecision.uvwBits						= tcu::IVec3(7,7,0);
96906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texComparePrecision.pcfBits						= 5;
97006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texComparePrecision.referenceBits				= 16;
97106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		texComparePrecision.resultBits					= de::max(0, pixelFormat.redBits - 1);
97206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
97306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lowQualityTexComparePrecision.coordBits			= tcu::IVec3(20,20,0);
97406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lowQualityTexComparePrecision.uvwBits			= tcu::IVec3(4,4,0);
97506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lowQualityTexComparePrecision.pcfBits			= 0;
97606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lowQualityTexComparePrecision.referenceBits		= 16;
97706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lowQualityTexComparePrecision.resultBits		= de::max(0, pixelFormat.redBits - 1);
97806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
97906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lowQualityLodPrecision.lodBits					= 4;
98006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
98106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (m_samplingFunction == SAMPLE_FILTER)
98206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
98306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			verificationOk = verifyTextureCompareResult(renderedFrame.getAccess(),
98406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														&texCoord[0],
98506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														samplerParams,
98606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														texComparePrecision,
98706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														lowQualityTexComparePrecision,
98806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														lodPrecision,
98906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														lowQualityLodPrecision);
99006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
99106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else if (m_samplingFunction == SAMPLE_GATHER)
99206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
99306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			verificationOk = verifyTextureGatherCmpResult(renderedFrame.getAccess(),
99406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														  &texCoord[0],
99506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														  samplerParams,
99606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														  texComparePrecision,
99706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														  lowQualityTexComparePrecision);
99806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
99906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else
100006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
100106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(false);
100206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			verificationOk = false;
100306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
100406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
100506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
100606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (!verificationOk)
100706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_result.fail("Image verification failed");
100806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
100906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
101006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrybool TextureBorderClampTest::verifyTextureSampleResult (const tcu::ConstPixelBufferAccess&				renderedFrame,
101106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														const float*									texCoord,
1012c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket														const glu::TextureTestUtil::ReferenceParams&	samplerParams,
101306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														const tcu::LodPrecision&						lodPrecision,
101406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													    const tcu::LookupPrecision&						lookupPrecision)
101506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
101606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::PixelFormat			pixelFormat			= m_context.getRenderTarget().getPixelFormat();
101706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface					reference			(renderedFrame.getWidth(), renderedFrame.getHeight());
101806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface					errorMask			(renderedFrame.getWidth(), renderedFrame.getHeight());
101906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int								numFailedPixels;
102006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1021c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::sampleTexture(tcu::SurfaceAccess(reference, pixelFormat), m_texture->getRefTexture(), texCoord, samplerParams);
102206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1023c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	numFailedPixels = glu::TextureTestUtil::computeTextureLookupDiff(renderedFrame, reference.getAccess(), errorMask.getAccess(), m_texture->getRefTexture(),
102406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 texCoord, samplerParams, lookupPrecision, lodPrecision, m_testCtx.getWatchDog());
102506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
102606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
102706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "ERROR: Result verification failed, got " << numFailedPixels << " invalid pixels!" << tcu::TestLog::EndMessage;
102806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::ImageSet("VerifyResult", "Verification result")
102906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::Image("Rendered", "Rendered image", renderedFrame);
103006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
103106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
103206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Image("Reference", "Ideal reference image", reference)
103306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::Image("ErrorMask", "Error mask", errorMask);
103406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
103506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog() << tcu::TestLog::EndImageSet;
103606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
103706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (numFailedPixels == 0);
103806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
103906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
104006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrybool TextureBorderClampTest::verifyTextureCompareResult (const tcu::ConstPixelBufferAccess&				renderedFrame,
104106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														 const float*									texCoord,
1042c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket														 const glu::TextureTestUtil::ReferenceParams&	samplerParams,
104306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													     const tcu::TexComparePrecision&				texComparePrecision,
104406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry													     const tcu::TexComparePrecision&				lowQualityTexComparePrecision,
104506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														 const tcu::LodPrecision&						lodPrecision,
104606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														 const tcu::LodPrecision&						lowQualityLodPrecision)
104706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
104806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::PixelFormat						pixelFormat				= m_context.getRenderTarget().getPixelFormat();
104906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const int									colorErrorBits			= 1;
1050c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	const tcu::IVec4							nonShadowBits			= tcu::max(glu::TextureTestUtil::getBitsVec(pixelFormat) - tcu::IVec4(colorErrorBits), tcu::IVec4(0));
105106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::Vec3								nonShadowThreshold		= tcu::computeFixedPointThreshold(nonShadowBits).swizzle(1,2,3);
105206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<tcu::ConstPixelBufferAccess>	srcLevelStorage;
105306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::Texture2DView					effectiveView			= tcu::getEffectiveTextureView(m_texture->getRefTexture(), srcLevelStorage, samplerParams.sampler);
105406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface								reference				(renderedFrame.getWidth(), renderedFrame.getHeight());
105506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface								errorMask				(renderedFrame.getWidth(), renderedFrame.getHeight());
105606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int											numFailedPixels;
105706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1058c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::sampleTexture(tcu::SurfaceAccess(reference, pixelFormat), effectiveView, texCoord, samplerParams);
105906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1060c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	numFailedPixels = glu::TextureTestUtil::computeTextureCompareDiff(renderedFrame, reference.getAccess(), errorMask.getAccess(), effectiveView,
106106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	  texCoord, samplerParams, texComparePrecision, lodPrecision, nonShadowThreshold);
106206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
106306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
106406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
106506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Message
106606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< "Warning: Verification assuming high-quality PCF filtering failed."
106706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::EndMessage;
106806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1069c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket		numFailedPixels = glu::TextureTestUtil::computeTextureCompareDiff(renderedFrame, reference.getAccess(), errorMask.getAccess(), effectiveView,
107006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  texCoord, samplerParams, lowQualityTexComparePrecision, lowQualityLodPrecision, nonShadowThreshold);
107106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
107206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (numFailedPixels > 0)
107306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_testCtx.getLog() << tcu::TestLog::Message << "ERROR: Verification against low precision requirements failed, failing test case." << tcu::TestLog::EndMessage;
107406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
107506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_result.addResult(QP_TEST_RESULT_QUALITY_WARNING, "Low-quality result");
107606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
107706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
107806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
107906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "ERROR: Result verification failed, got " << numFailedPixels << " invalid pixels!" << tcu::TestLog::EndMessage;
108006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::ImageSet("VerifyResult", "Verification result")
108106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::Image("Rendered", "Rendered image", renderedFrame);
108206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
108306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
108406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Image("Reference", "Ideal reference image", reference)
108506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::Image("ErrorMask", "Error mask", errorMask);
108606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
108706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog() << tcu::TestLog::EndImageSet;
108806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
108906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (numFailedPixels == 0);
109006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
109106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
109206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrytemplate <typename T>
109306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrystatic inline T triQuadInterpolate (const T (&values)[4], float xFactor, float yFactor)
109406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
109506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (xFactor + yFactor < 1.0f)
109606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return values[0] + (values[2]-values[0])*xFactor		+ (values[1]-values[0])*yFactor;
109706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
109806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		return values[3] + (values[1]-values[3])*(1.0f-xFactor)	+ (values[2]-values[3])*(1.0f-yFactor);
109906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
110006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
110106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrybool TextureBorderClampTest::verifyTextureGatherResult (const tcu::ConstPixelBufferAccess&				renderedFrame,
110206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														const float*									texCoordArray,
1103c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket														const glu::TextureTestUtil::ReferenceParams&	samplerParams,
110406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														const tcu::LookupPrecision&						lookupPrecision)
110506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
110606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::Vec2 texCoords[4] =
110706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
110806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2(texCoordArray[0], texCoordArray[1]),
110906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2(texCoordArray[2], texCoordArray[3]),
111006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2(texCoordArray[4], texCoordArray[5]),
111106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2(texCoordArray[6], texCoordArray[7]),
111206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
111306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
111406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::PixelFormat						pixelFormat			= m_context.getRenderTarget().getPixelFormat();
1115c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	const deUint8								fbColormask			= tcu::getColorMask(pixelFormat);
111606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
111706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<tcu::ConstPixelBufferAccess>	srcLevelStorage;
111806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::Texture2DView					effectiveView		= tcu::getEffectiveTextureView(m_texture->getRefTexture(), srcLevelStorage, samplerParams.sampler);
111906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
112006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface								reference			(renderedFrame.getWidth(), renderedFrame.getHeight());
112106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface								errorMask			(renderedFrame.getWidth(), renderedFrame.getHeight());
112206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int											numFailedPixels		= 0;
112306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1124c215aaa83047ebbaabafef7acd71275a256da6abDejan Mircevski	tcu::clear(errorMask.getAccess(), tcu::RGBA::green().toVec());
112506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
112606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	for (int py = 0; py < reference.getHeight(); ++py)
112706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	for (int px = 0; px < reference.getWidth(); ++px)
112806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
112906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec2			viewportCoord	= (tcu::Vec2((float)px, (float)py) + tcu::Vec2(0.5f)) / tcu::Vec2((float)reference.getWidth(), (float)reference.getHeight());
113006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec2			texCoord		= triQuadInterpolate(texCoords, viewportCoord.x(), viewportCoord.y());
113106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4			referenceValue	= effectiveView.gatherOffsets(samplerParams.sampler, texCoord.x(), texCoord.y(), 0, glu::getDefaultGatherOffsets());
113206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4			referencePixel	= referenceValue * samplerParams.colorScale + samplerParams.colorBias;
113306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4			resultPixel		= renderedFrame.getPixel(px, py);
113406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4			resultValue		= (resultPixel - samplerParams.colorBias) / samplerParams.colorScale;
113506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1136c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket		reference.setPixel(px, py, tcu::toRGBAMasked(referenceValue, fbColormask));
113706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
113806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (tcu::boolAny(tcu::logicalAnd(lookupPrecision.colorMask,
113906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										 tcu::greaterThan(tcu::absDiff(resultPixel, referencePixel),
114006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														  lookupPrecision.colorThreshold))))
114106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
114206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			if (!tcu::isGatherOffsetsResultValid(effectiveView, samplerParams.sampler, lookupPrecision, texCoord, 0, glu::getDefaultGatherOffsets(), resultValue))
114306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{
1144c215aaa83047ebbaabafef7acd71275a256da6abDejan Mircevski				errorMask.setPixel(px, py, tcu::RGBA::red());
114506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				++numFailedPixels;
114606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			}
114706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
114806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
114906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
115006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
115106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "ERROR: Result verification failed, got " << numFailedPixels << " invalid pixels!" << tcu::TestLog::EndMessage;
115206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::ImageSet("VerifyResult", "Verification result")
115306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::Image("Rendered", "Rendered image", renderedFrame);
115406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
115506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
115606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Image("Reference", "Ideal reference image", reference)
115706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::Image("ErrorMask", "Error mask", errorMask);
115806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
115906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog() << tcu::TestLog::EndImageSet;
116006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
116106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (numFailedPixels == 0);
116206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
116306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
116406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrybool TextureBorderClampTest::verifyTextureGatherCmpResult (const tcu::ConstPixelBufferAccess&			renderedFrame,
116506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														   const float*									texCoordArray,
1166c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket														   const glu::TextureTestUtil::ReferenceParams&	samplerParams,
116706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														   const tcu::TexComparePrecision&				texComparePrecision,
116806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														   const tcu::TexComparePrecision&				lowQualityTexComparePrecision)
116906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
117006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::Vec2 texCoords[4] =
117106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
117206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2(texCoordArray[0], texCoordArray[1]),
117306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2(texCoordArray[2], texCoordArray[3]),
117406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2(texCoordArray[4], texCoordArray[5]),
117506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::Vec2(texCoordArray[6], texCoordArray[7]),
117606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
117706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
117806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<tcu::ConstPixelBufferAccess>	srcLevelStorage;
117906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::Texture2DView					effectiveView		= tcu::getEffectiveTextureView(m_texture->getRefTexture(), srcLevelStorage, samplerParams.sampler);
118006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
118106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::PixelFormat						pixelFormat			= m_context.getRenderTarget().getPixelFormat();
1182c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	const tcu::BVec4							colorMask			= glu::TextureTestUtil::getCompareMask(pixelFormat);
1183c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	const deUint8								fbColormask			= tcu::getColorMask(pixelFormat);
118406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface								reference			(renderedFrame.getWidth(), renderedFrame.getHeight());
118506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface								errorMask			(renderedFrame.getWidth(), renderedFrame.getHeight());
118606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int											numFailedPixels		= 0;
118706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	bool										lowQuality			= false;
118806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1189c215aaa83047ebbaabafef7acd71275a256da6abDejan Mircevski	tcu::clear(errorMask.getAccess(), tcu::RGBA::green().toVec());
119006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
119106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	for (int py = 0; py < reference.getHeight(); ++py)
119206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	for (int px = 0; px < reference.getWidth(); ++px)
119306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
119406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec2			viewportCoord	= (tcu::Vec2((float)px, (float)py) + tcu::Vec2(0.5f)) / tcu::Vec2((float)reference.getWidth(), (float)reference.getHeight());
119506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec2			texCoord		= triQuadInterpolate(texCoords, viewportCoord.x(), viewportCoord.y());
119606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const float				refZ			= samplerParams.ref;
119706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4			referenceValue	= effectiveView.gatherOffsetsCompare(samplerParams.sampler, refZ, texCoord.x(), texCoord.y(), glu::getDefaultGatherOffsets());
119806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4			resultValue		= renderedFrame.getPixel(px, py);
119906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1200c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket		reference.setPixel(px, py, tcu::toRGBAMasked(referenceValue, fbColormask));
120106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
120206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (tcu::boolAny(tcu::logicalAnd(colorMask, tcu::notEqual(referenceValue, resultValue))))
120306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
120406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			if (!tcu::isGatherOffsetsCompareResultValid(effectiveView, samplerParams.sampler, texComparePrecision, texCoord, glu::getDefaultGatherOffsets(), refZ, resultValue))
120506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{
120606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				lowQuality = true;
120706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
120806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				// fall back to low quality verification
120906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				if (!tcu::isGatherOffsetsCompareResultValid(effectiveView, samplerParams.sampler, lowQualityTexComparePrecision, texCoord, glu::getDefaultGatherOffsets(), refZ, resultValue))
121006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				{
1211c215aaa83047ebbaabafef7acd71275a256da6abDejan Mircevski					errorMask.setPixel(px, py, tcu::RGBA::red());
121206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					++numFailedPixels;
121306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				}
121406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			}
121506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
121606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
121706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
121806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
121906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "ERROR: Result verification failed, got " << numFailedPixels << " invalid pixels!" << tcu::TestLog::EndMessage;
122006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (lowQuality)
122106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
122206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "Warning: Verification assuming high-quality PCF filtering failed." << tcu::TestLog::EndMessage;
122306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_result.addResult(QP_TEST_RESULT_QUALITY_WARNING, "Low-quality result");
122406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
122506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
122606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::ImageSet("VerifyResult", "Verification result")
122706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::Image("Rendered", "Rendered image", renderedFrame);
122806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
122906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
123006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Image("Reference", "Ideal reference image", reference)
123106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::Image("ErrorMask", "Error mask", errorMask);
123206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
123306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog() << tcu::TestLog::EndImageSet;
123406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
123506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (numFailedPixels == 0);
123606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
123706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
123806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryconst glu::Texture2D* TextureBorderClampTest::getTexture (void) const
123906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
124006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return m_texture.get();
124106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
124206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
124306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyrydeUint32 TextureBorderClampTest::getIterationSeed (const IterationConfig& config) const
124406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
124506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::SeedBuilder builder;
124606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	builder	<< std::string(getName())
124706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_iterationNdx
124806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_texFormat
124906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< config.minFilter << config.magFilter
125006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_texture->getRefTexture().getWidth() << m_texture->getRefTexture().getHeight();
125106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return builder.get();
125206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
125306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1254c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siketglu::TextureTestUtil::ReferenceParams TextureBorderClampTest::genSamplerParams (const IterationConfig& config) const
125506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
125606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormat				texFormat		= tcu::getEffectiveDepthStencilTextureFormat(m_texture->getRefTexture().getFormat(), m_sampleMode);
1257c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::ReferenceParams	refParams		(glu::TextureTestUtil::TEXTURETYPE_2D);
125806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
125906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.sampler					= glu::mapGLSampler(config.sWrapMode, config.tWrapMode, config.minFilter, config.magFilter);
126006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.sampler.borderColor		= config.borderColor;
126106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.sampler.compare			= (!m_useShadowSampler) ? (tcu::Sampler::COMPAREMODE_NONE) : (glu::mapGLCompareFunc(config.compareMode));
126206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.sampler.depthStencilMode	= m_sampleMode;
1263c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	refParams.lodMode					= glu::TextureTestUtil::LODMODE_EXACT;
1264c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	refParams.samplerType				= (!m_useShadowSampler) ? (glu::TextureTestUtil::getSamplerType(texFormat)) : (glu::TextureTestUtil::SAMPLERTYPE_SHADOW);
126506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.colorScale				= config.lookupScale;
126606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.colorBias					= config.lookupBias;
126706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.ref						= config.compareRef;
126806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
126906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// compare can only be used with depth textures
127006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (!isDepthFormat(m_texFormat, m_sampleMode))
127106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		DE_ASSERT(refParams.sampler.compare == tcu::Sampler::COMPAREMODE_NONE);
127206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
127306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// sampler type must match compare mode
127406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	DE_ASSERT(m_useShadowSampler == (config.compareMode != GL_NONE));
127506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
127606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// in gather, weird mapping is most likely an error
127706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_samplingFunction == SAMPLE_GATHER)
127806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
127906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		DE_ASSERT(refParams.colorScale == tcu::Vec4(refParams.colorScale.x()));
128006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		DE_ASSERT(refParams.colorBias == tcu::Vec4(refParams.colorBias.x()));
128106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
128206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
128306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return refParams;
128406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
128506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
128606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryglu::ShaderProgram* TextureBorderClampTest::genGatherProgram (void) const
128706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
1288f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe	const std::string	glslVersionDecl	= glu::getGLSLVersionDeclaration(glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType()));
1289653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	const std::string	vtxSource		= glslVersionDecl + "\n"
1290f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe										"in highp vec4 a_position;\n"
1291f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe										"in highp vec2 a_texcoord;\n"
1292f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe										"out highp vec2 v_texcoord;\n"
1293f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe										"void main()\n"
1294f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe										"{\n"
1295f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe										"	gl_Position = a_position;\n"
1296f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe										"	v_texcoord = a_texcoord;\n"
1297f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe										"}\n";
1298653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	const char*			samplerType;
1299653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	const char*			lookup;
130006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::ostringstream	fragSource;
130106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
130206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_useShadowSampler)
130306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
130406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		samplerType	= "sampler2DShadow";
130506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		lookup		= "textureGather(u_sampler, v_texcoord, u_ref)";
130606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
130706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
130806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
130906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		switch (m_channelClass)
131006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
131106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
131206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
131306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
131406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				samplerType	= "sampler2D";
131506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				lookup		= "textureGather(u_sampler, v_texcoord)";
131606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
131706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
131806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
131906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				samplerType	= "isampler2D";
132006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				lookup		= "vec4(textureGather(u_sampler, v_texcoord))";
132106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
132206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
132306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
132406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				samplerType	= "usampler2D";
132506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				lookup		= "vec4(textureGather(u_sampler, v_texcoord))";
132606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				break;
132706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
132806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			default:
1329ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry				samplerType	= "";
1330ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry				lookup		= "";
133106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				DE_ASSERT(false);
133206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
133306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
133406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
1335f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe	fragSource	<<	glslVersionDecl + "\n"
133606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					"uniform highp " << samplerType << " u_sampler;\n"
133706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					"uniform highp vec4 u_colorScale;\n"
133806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					"uniform highp vec4 u_colorBias;\n"
133906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				<<	((m_useShadowSampler) ? ("uniform highp float u_ref;\n") : (""))
134006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				<<	"in highp vec2 v_texcoord;\n"
134106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					"layout(location=0) out highp vec4 o_color;\n"
134206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					"void main()\n"
134306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					"{\n"
134406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					"	o_color = " << lookup << " * u_colorScale + u_colorBias;\n"
134506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					"}\n";
134606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
134706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return new glu::ShaderProgram(m_context.getRenderContext(), glu::ProgramSources() << glu::VertexSource(vtxSource) << glu::FragmentSource(fragSource.str()));
134806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
134906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
135006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryclass TextureBorderClampFormatCase : public TextureBorderClampTest
135106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
135206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrypublic:
135306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									TextureBorderClampFormatCase	(Context&						context,
135406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 const char*					name,
135506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 const char*					description,
135606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 deUint32						texFormat,
135706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 tcu::Sampler::DepthStencilMode	mode,
135806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 StateType						stateType,
135906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 SizeType						sizeType,
136006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 deUint32						filter,
136106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 SamplingFunction				samplingFunction);
136206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
136306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprivate:
136406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void							init							(void);
136506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
136606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int								getNumIterations				(void) const;
136706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterationConfig					getIteration					(int ndx) const;
136806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
136906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const SizeType					m_sizeType;
137006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32					m_filter;
137106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
137206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<IterationConfig>	m_iterations;
137306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
137406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
137506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
137606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampFormatCase::TextureBorderClampFormatCase	(Context&						context,
137706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															 const char*					name,
137806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															 const char*					description,
137906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															 deUint32						texFormat,
138006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															 tcu::Sampler::DepthStencilMode	mode,
138106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															 StateType						stateType,
138206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															 SizeType						sizeType,
138306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															 deUint32						filter,
138406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry															 SamplingFunction				samplingFunction)
138506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	: TextureBorderClampTest(context,
138606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 name,
138706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 description,
138806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 texFormat,
138906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 mode,
139006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 stateType,
139106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 (sizeType == SIZE_POT) ? (32) : (17),
139206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 (sizeType == SIZE_POT) ? (16) : (31),
139306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 samplingFunction)
139406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_sizeType			(sizeType)
139506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_filter				(filter)
139606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
139706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_sizeType == SIZE_POT)
139806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		DE_ASSERT(deIsPowerOfTwo32(m_texWidth) && deIsPowerOfTwo32(m_texHeight));
139906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
140006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		DE_ASSERT(!deIsPowerOfTwo32(m_texWidth) && !deIsPowerOfTwo32(m_texHeight));
140106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
140206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (glu::isCompressedFormat(texFormat))
140306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
140406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::CompressedTexFormat	compressedFormat	= glu::mapGLCompressedTexFormat(texFormat);
140506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::IVec3				blockPixelSize		= tcu::getBlockPixelSize(compressedFormat);
140606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
140706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// is (not) multiple of a block size
140806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (m_sizeType == SIZE_POT)
140906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT((m_texWidth % blockPixelSize.x()) == 0 && (m_texHeight % blockPixelSize.y()) == 0);
141006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else
141106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT((m_texWidth % blockPixelSize.x()) != 0 && (m_texHeight % blockPixelSize.y()) != 0);
1412b5c8f10b44f5306e816ca9f7d5efa0a4150f0f48Jarkko Pöyry
1413b5c8f10b44f5306e816ca9f7d5efa0a4150f0f48Jarkko Pöyry		DE_UNREF(blockPixelSize);
141406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
141506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
141606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
141706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampFormatCase::init (void)
141806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
141906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	TextureBorderClampTest::init();
142006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
142106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// \note TextureBorderClampTest::init() creates texture
142206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormat		texFormat		= tcu::getEffectiveDepthStencilTextureFormat(getTexture()->getRefTexture().getFormat(), m_sampleMode);
142306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormatInfo	texFormatInfo	= tcu::getTextureFormatInfo(texFormat);
142406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
142506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// iterations
142606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
142706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
142806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig iteration;
142906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p0			= tcu::Vec2(-1.5f, -3.0f);
143006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p1			= tcu::Vec2( 1.5f,  2.5f);
143106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.borderColor	= mapToFormatColorRepresentable(texFormat, tcu::Vec4(0.3f, 0.7f, 0.2f, 0.5f));
143206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_iterations.push_back(iteration);
143306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
143406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
143506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig iteration;
143606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p0			= tcu::Vec2(-0.5f, 0.75f);
143706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p1			= tcu::Vec2(0.25f, 1.25f);
143806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.borderColor	= mapToFormatColorRepresentable(texFormat, tcu::Vec4(0.9f, 0.2f, 0.4f, 0.6f));
143906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_iterations.push_back(iteration);
144006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
144106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
144206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// common parameters
144306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	for (int ndx = 0; ndx < (int)m_iterations.size(); ++ndx)
144406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
144506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig& iteration = m_iterations[ndx];
144606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
144706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (m_samplingFunction == SAMPLE_GATHER)
144806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
144906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= tcu::Vec4(texFormatInfo.lookupScale.x());
145006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= tcu::Vec4(texFormatInfo.lookupBias.x());
145106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
145206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		else
145306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
145406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= texFormatInfo.lookupScale;
145506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= texFormatInfo.lookupBias;
145606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
145706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
145806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.minFilter		= m_filter;
145906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.magFilter		= m_filter;
146006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.sWrapMode		= GL_CLAMP_TO_BORDER;
146106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.tWrapMode		= GL_CLAMP_TO_BORDER;
146206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareMode	= GL_NONE;
146306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareRef	= 0.0f;
146406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
146506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
146606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
146706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryint TextureBorderClampFormatCase::getNumIterations	(void) const
146806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
146906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (int)m_iterations.size();
147006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
147106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
147206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTest::IterationConfig TextureBorderClampFormatCase::getIteration (int ndx) const
147306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
147406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return m_iterations[ndx];
147506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
147606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
147706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryclass TextureBorderClampRangeClampCase : public TextureBorderClampTest
147806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
147906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrypublic:
148006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									TextureBorderClampRangeClampCase	(Context&						context,
148106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 const char*					name,
148206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 const char*					description,
148306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 deUint32						texFormat,
148406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 tcu::Sampler::DepthStencilMode	mode,
148506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 deUint32						filter);
148606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
148706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprivate:
148806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void							init								(void);
148906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
149006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int								getNumIterations					(void) const;
149106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterationConfig					getIteration						(int ndx) const;
149206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
149306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32					m_filter;
149406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<IterationConfig>	m_iterations;
149506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
149606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
149706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampRangeClampCase::TextureBorderClampRangeClampCase	(Context&						context,
149806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 const char*					name,
149906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 const char*					description,
150006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 deUint32						texFormat,
150106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 tcu::Sampler::DepthStencilMode	mode,
150206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 deUint32						filter)
150306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	: TextureBorderClampTest(context, name, description, texFormat, mode, TextureBorderClampTest::STATE_TEXTURE_PARAM, 8, 32, SAMPLE_FILTER)
150406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_filter				(filter)
150506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
150606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
150706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
150806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampRangeClampCase::init (void)
150906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
151006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	TextureBorderClampTest::init();
151106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
151206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormat	texFormat		= tcu::getEffectiveDepthStencilTextureFormat(getTexture()->getRefTexture().getFormat(), m_sampleMode);
151306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool					isDepth			= isDepthFormat(m_texFormat, m_sampleMode);
151406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool					isFloat			= m_channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
151506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool					isFixed			= m_channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT || m_channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
151606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const bool					isPureInteger	= m_channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER || m_channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
151706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
151806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (isDepth || isFloat)
151906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
152006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// infinities are commonly used values on depth/float borders
152106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
152206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			IterationConfig iteration;
152306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p0			= tcu::Vec2(-1.2f, -3.0f);
152406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p1			= tcu::Vec2( 1.2f,  2.5f);
152506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.borderColor	= rr::GenericVec4(tcu::Vec4(std::numeric_limits<float>::infinity()));
152606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= tcu::Vec4(0.5f); // scale & bias to [0.25, 0.5] range to make out-of-range values visible
152706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= tcu::Vec4(0.25f);
152806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.description	= "border value infinity";
152906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_iterations.push_back(iteration);
153006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
153106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
153206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			IterationConfig iteration;
153306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p0			= tcu::Vec2(-0.25f, -0.75f);
153406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p1			= tcu::Vec2( 2.25f,  1.25f);
153506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.borderColor	= rr::GenericVec4(tcu::Vec4(-std::numeric_limits<float>::infinity()));
153606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= tcu::Vec4(0.5f);
153706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= tcu::Vec4(0.25f);
153806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.description	= "border value negative infinity";
153906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_iterations.push_back(iteration);
154006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
154106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
154206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (isPureInteger)
154306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
154406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::IVec4			numBits		= tcu::getTextureFormatBitDepth(texFormat);
154506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const bool					isSigned	= m_channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER;
154606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
154706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// can't overflow 32bit integers with 32bit integers
154806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int ndx = 0; ndx < 4; ++ndx)
154906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(numBits[ndx] == 0 || numBits[ndx] == 8 || numBits[ndx] == 16);
155006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
155106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::IVec4	minValue		= getNBitIntegerVec4MinValue(isSigned, numBits);
155206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::IVec4	maxValue		= getNBitIntegerVec4MaxValue(isSigned, numBits);
155306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::IVec4	valueRange		= maxValue - minValue;
155406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::IVec4	divSafeRange	((valueRange[0]==0) ? (1) : (valueRange[0]),
155506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry											 (valueRange[1]==0) ? (1) : (valueRange[1]),
155606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry											 (valueRange[2]==0) ? (1) : (valueRange[2]),
155706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry											 (valueRange[3]==0) ? (1) : (valueRange[3]));
155806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
155906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// format max
156006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
156106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::IVec4 value = maxValue + tcu::IVec4(1);
156206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
156306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			IterationConfig iteration;
156406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p0			= tcu::Vec2(-1.2f, -3.0f);
156506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p1			= tcu::Vec2( 1.2f,  2.5f);
156606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.borderColor	= (isSigned) ? (rr::GenericVec4(value)) : (rr::GenericVec4(value.cast<deUint32>()));
156706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= tcu::Vec4(0.5f) / divSafeRange.cast<float>();
156806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= (isSigned) ? (tcu::Vec4(0.5f)) : (tcu::Vec4(0.25f));
156906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.description	= "border values one larger than maximum";
157006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_iterations.push_back(iteration);
157106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
157206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// format min
157306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (isSigned)
157406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
157506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::IVec4 value = minValue - tcu::IVec4(1);
157606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
157706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			IterationConfig iteration;
157806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p0			= tcu::Vec2(-0.25f, -0.75f);
157906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p1			= tcu::Vec2( 2.25f,  1.25f);
158006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.borderColor	= rr::GenericVec4(value);
158106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= tcu::Vec4(0.5f) / divSafeRange.cast<float>();
158206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= tcu::Vec4(0.5f);
158306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.description	= "border values one less than minimum";
158406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_iterations.push_back(iteration);
158506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
158606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// (u)int32 max
158706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
158806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::IVec4 value = (isSigned) ? (tcu::IVec4(std::numeric_limits<deInt32>::max())) : (tcu::IVec4(std::numeric_limits<deUint32>::max()));
158906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
159006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			IterationConfig iteration;
159106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p0			= tcu::Vec2(-1.6f, -2.1f);
159206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p1			= tcu::Vec2( 1.2f,  3.5f);
159306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.borderColor	= (isSigned) ? (rr::GenericVec4(value)) : (rr::GenericVec4(value.cast<deUint32>()));
159406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= tcu::Vec4(0.5f) / divSafeRange.cast<float>();
159506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= tcu::Vec4(0.25f);
159606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.description	= "border values 32-bit maximum";
159706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_iterations.push_back(iteration);
159806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
159906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// int32 min
160006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		if (isSigned)
160106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
160206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::IVec4 value = tcu::IVec4(std::numeric_limits<deInt32>::min());
160306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
160406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			IterationConfig iteration;
160506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p0			= tcu::Vec2(-2.6f, -4.0f);
160606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p1			= tcu::Vec2( 1.1f,  1.5f);
160706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.borderColor	= rr::GenericVec4(value);
160806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= tcu::Vec4(0.5f) / divSafeRange.cast<float>();
160906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= tcu::Vec4(0.25f);
161006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.description	= "border values 0";
161106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_iterations.push_back(iteration);
161206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
161306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
161406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else if (isFixed)
161506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
161606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const bool		isSigned	= m_channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;;
161706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4	lookupBias	= (isSigned) ? (tcu::Vec4(0.5f))    : (tcu::Vec4(0.25f)); // scale & bias to [0.25, 0.5] range to make out-of-range values visible
161806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::Vec4	lookupScale	= (isSigned) ? (tcu::Vec4(0.25f))   : (tcu::Vec4(0.5f));
161906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
162006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
162106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			IterationConfig iteration;
162206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p0			= tcu::Vec2(-1.2f, -3.0f);
162306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p1			= tcu::Vec2( 1.2f,  2.5f);
162406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.borderColor	= mapToFormatColorUnits(texFormat, tcu::Vec4(1.1f, 1.3f, 2.2f, 1.3f));
162506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= lookupScale;
162606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= lookupBias;
162706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.description	= "border values larger than maximum";
162806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_iterations.push_back(iteration);
162906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
163006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
163106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			IterationConfig iteration;
163206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p0			= tcu::Vec2(-0.25f, -0.75f);
163306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.p1			= tcu::Vec2( 2.25f,  1.25f);
163406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.borderColor	= mapToFormatColorUnits(texFormat, tcu::Vec4(-0.2f, -0.9f, -2.4f, -0.6f));
163506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupScale	= lookupScale;
163606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.lookupBias	= lookupBias;
163706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			iteration.description	= "border values less than minimum";
163806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			m_iterations.push_back(iteration);
163906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
164006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
164106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
164206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		DE_ASSERT(false);
164306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
164406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// common parameters
164506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	for (int ndx = 0; ndx < (int)m_iterations.size(); ++ndx)
164606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
164706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig& iteration = m_iterations[ndx];
164806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
164906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.minFilter		= m_filter;
165006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.magFilter		= m_filter;
165106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.sWrapMode		= GL_CLAMP_TO_BORDER;
165206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.tWrapMode		= GL_CLAMP_TO_BORDER;
165306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareMode	= GL_NONE;
165406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareRef	= 0.0f;
165506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
165606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
165706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
165806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryint TextureBorderClampRangeClampCase::getNumIterations	(void) const
165906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
166006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (int)m_iterations.size();
166106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
166206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
166306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTest::IterationConfig TextureBorderClampRangeClampCase::getIteration (int ndx) const
166406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
166506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return m_iterations[ndx];
166606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
166706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
166806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryclass TextureBorderClampPerAxisCase2D : public TextureBorderClampTest
166906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
167006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrypublic:
167106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									TextureBorderClampPerAxisCase2D	(Context&						context,
167206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 const char*					name,
167306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 const char*					description,
167406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 deUint32						texFormat,
167506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 tcu::Sampler::DepthStencilMode	mode,
167606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 SizeType						sizeType,
167706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 deUint32						filter,
167806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 deUint32						texSWrap,
167906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 deUint32						texTWrap,
168006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 SamplingFunction				samplingFunction);
168106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
168206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprivate:
168306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void							init							(void);
168406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
168506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int								getNumIterations				(void) const;
168606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterationConfig					getIteration					(int ndx) const;
168706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
168806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32					m_texSWrap;
168906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32					m_texTWrap;
169006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32					m_filter;
169106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
169206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<IterationConfig>	m_iterations;
169306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
169406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
169506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampPerAxisCase2D::TextureBorderClampPerAxisCase2D (Context&							context,
169606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  const char*						name,
169706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  const char*						description,
169806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  deUint32							texFormat,
169906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  tcu::Sampler::DepthStencilMode	mode,
170006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  SizeType							sizeType,
170106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  deUint32							filter,
170206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  deUint32							texSWrap,
170306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  deUint32							texTWrap,
170406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																  SamplingFunction					samplingFunction)
170506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	: TextureBorderClampTest(context,
170606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 name,
170706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 description,
170806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 texFormat,
170906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 mode,
171006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 TextureBorderClampTest::STATE_TEXTURE_PARAM,
171106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 (sizeType == SIZE_POT) ? (16) : (7),
171206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 (sizeType == SIZE_POT) ? (8) : (9),
171306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 samplingFunction)
171406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_texSWrap			(texSWrap)
171506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_texTWrap			(texTWrap)
171606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_filter				(filter)
171706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
171806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
171906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
172006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampPerAxisCase2D::init (void)
172106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
172206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	TextureBorderClampTest::init();
172306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
172406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// \note TextureBorderClampTest::init() creates texture
172506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormat		texFormat		= tcu::getEffectiveDepthStencilTextureFormat(getTexture()->getRefTexture().getFormat(), m_sampleMode);
172606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormatInfo	texFormatInfo	= tcu::getTextureFormatInfo(texFormat);
172706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
172806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterationConfig iteration;
172906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.p0			= tcu::Vec2(-0.25f, -0.75f);
173006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.p1			= tcu::Vec2( 2.25f,  1.25f);
173106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.borderColor	= mapToFormatColorRepresentable(texFormat, tcu::Vec4(0.4f, 0.9f, 0.1f, 0.2f));
173206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
173306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_samplingFunction == SAMPLE_GATHER)
173406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
173506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.lookupScale	= tcu::Vec4(texFormatInfo.lookupScale.x());
173606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.lookupBias	= tcu::Vec4(texFormatInfo.lookupBias.x());
173706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
173806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
173906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
174006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.lookupScale	= texFormatInfo.lookupScale;
174106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.lookupBias	= texFormatInfo.lookupBias;
174206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
174306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
174406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.minFilter		= m_filter;
174506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.magFilter		= m_filter;
174606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.sWrapMode		= m_texSWrap;
174706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.tWrapMode		= m_texTWrap;
174806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.compareMode	= GL_NONE;
174906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.compareRef	= 0.0f;
175006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
175106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_iterations.push_back(iteration);
175206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
175306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
175406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryint TextureBorderClampPerAxisCase2D::getNumIterations	(void) const
175506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
175606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (int)m_iterations.size();
175706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
175806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
175906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTest::IterationConfig TextureBorderClampPerAxisCase2D::getIteration (int ndx) const
176006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
176106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return m_iterations[ndx];
176206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
176306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
176406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryclass TextureBorderClampDepthCompareCase : public TextureBorderClampTest
176506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
176606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrypublic:
176706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									TextureBorderClampDepthCompareCase	(Context&			context,
176806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 const char*		name,
176906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 const char*		description,
177006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 deUint32			texFormat,
177106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 SizeType			sizeType,
177206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 deUint32			filter,
177306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 SamplingFunction	samplingFunction);
177406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
177506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprivate:
177606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void							init								(void);
177706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
177806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int								getNumIterations					(void) const;
177906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterationConfig					getIteration						(int ndx) const;
178006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
178106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32					m_filter;
178206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<IterationConfig>	m_iterations;
178306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
178406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
178506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampDepthCompareCase::TextureBorderClampDepthCompareCase (Context&			context,
178606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		const char*			name,
178706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		const char*			description,
178806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		deUint32			texFormat,
178906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		SizeType			sizeType,
179006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		deUint32			filter,
179106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		SamplingFunction	samplingFunction)
179206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	: TextureBorderClampTest(context,
179306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 name,
179406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 description,
179506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 texFormat,
179606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 tcu::Sampler::MODE_DEPTH,
179706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 TextureBorderClampTest::STATE_TEXTURE_PARAM,
179806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 (sizeType == SIZE_POT) ? (32) : (13),
179906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 (sizeType == SIZE_POT) ? (16) : (17),
180006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 samplingFunction,
180106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 FLAG_USE_SHADOW_SAMPLER)
180206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_filter				(filter)
180306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
180406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
180506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
180606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampDepthCompareCase::init (void)
180706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
180806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	TextureBorderClampTest::init();
180906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
181006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// 0.5 <= 0.7
181106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
181206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig iteration;
181306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p0			= tcu::Vec2(-0.15f, -0.35f);
181406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p1			= tcu::Vec2( 1.25f,  1.1f);
181506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.borderColor	= rr::GenericVec4(tcu::Vec4(0.7f, 0.0f, 0.0f, 0.0f));
181606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.description	= "Border color in [0, 1] range";
181706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareMode	= GL_LEQUAL;
181806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareRef	= 0.5f;
181906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_iterations.push_back(iteration);
182006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
182106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
182206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// 1.5 <= 1.0
182306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
182406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig iteration;
182506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p0			= tcu::Vec2(-0.15f, -0.35f);
182606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p1			= tcu::Vec2( 1.25f,  1.1f);
182706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.borderColor	= rr::GenericVec4(tcu::Vec4(1.5f, 0.0f, 0.0f, 0.0f));
182806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.description	= "Border color > 1, should be clamped";
182906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareMode	= GL_LEQUAL;
183006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareRef	= 1.0f;
183106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_iterations.push_back(iteration);
183206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
183306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
183406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// -0.5 >= 0.0
183506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
183606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig iteration;
183706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p0			= tcu::Vec2(-0.15f, -0.35f);
183806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p1			= tcu::Vec2( 1.25f,  1.1f);
183906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.borderColor	= rr::GenericVec4(tcu::Vec4(-0.5f, 0.0f, 0.0f, 0.0f));
184006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.description	= "Border color < 0, should be clamped";
184106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareMode	= GL_GEQUAL;
184206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareRef	= 0.0f;
184306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_iterations.push_back(iteration);
184406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
184506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
184606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// inf < 1.25
184706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
184806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig iteration;
184906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p0			= tcu::Vec2(-0.15f, -0.35f);
185006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p1			= tcu::Vec2( 1.25f,  1.1f);
185106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.borderColor	= rr::GenericVec4(tcu::Vec4(std::numeric_limits<float>::infinity(), 0.0f, 0.0f, 0.0f));
185206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.description	= "Border color == inf, should be clamped; ref > 1";
185306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareMode	= GL_LESS;
185406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareRef	= 1.25f;
185506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_iterations.push_back(iteration);
185606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
185706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
185806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// -inf > -0.5
185906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
186006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig iteration;
186106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p0			= tcu::Vec2(-0.15f, -0.35f);
186206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.p1			= tcu::Vec2( 1.25f,  1.1f);
186306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.borderColor	= rr::GenericVec4(tcu::Vec4(-std::numeric_limits<float>::infinity(), 0.0f, 0.0f, 0.0f));
186406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.description	= "Border color == inf, should be clamped; ref < 0";
186506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareMode	= GL_GREATER;
186606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.compareRef	= -0.5f;
186706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_iterations.push_back(iteration);
186806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
186906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
187006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// common parameters
187106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	for (int ndx = 0; ndx < (int)m_iterations.size(); ++ndx)
187206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
187306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		IterationConfig& iteration = m_iterations[ndx];
187406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
187506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.lookupScale	= tcu::Vec4(1.0);
187606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.lookupBias	= tcu::Vec4(0.0);
187706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.minFilter		= m_filter;
187806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.magFilter		= m_filter;
187906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.sWrapMode		= GL_CLAMP_TO_BORDER;
188006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		iteration.tWrapMode		= GL_CLAMP_TO_BORDER;
188106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
188206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
188306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
188406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryint TextureBorderClampDepthCompareCase::getNumIterations	(void) const
188506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
188606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (int)m_iterations.size();
188706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
188806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
188906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTest::IterationConfig TextureBorderClampDepthCompareCase::getIteration (int ndx) const
189006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
189106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return m_iterations[ndx];
189206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
189306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
189406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryclass TextureBorderClampUnusedChannelCase : public TextureBorderClampTest
189506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
189606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrypublic:
189706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									TextureBorderClampUnusedChannelCase	(Context&						context,
189806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 const char*					name,
189906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 const char*					description,
190006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 deUint32						texFormat,
190106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		 tcu::Sampler::DepthStencilMode	depthStencilMode);
190206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
190306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprivate:
190406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void							init								(void);
190506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
190606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int								getNumIterations					(void) const;
190706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterationConfig					getIteration						(int ndx) const;
190806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
190906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<IterationConfig>	m_iterations;
191006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
191106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
191206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampUnusedChannelCase::TextureBorderClampUnusedChannelCase (Context&							context,
191306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  const char*						name,
191406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  const char*						description,
191506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  deUint32							texFormat,
191606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  tcu::Sampler::DepthStencilMode	depthStencilMode)
191706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	: TextureBorderClampTest(context,
191806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 name,
191906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 description,
192006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 texFormat,
192106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 depthStencilMode,
192206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 TextureBorderClampTest::STATE_TEXTURE_PARAM,
192306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 8,
192406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 8,
192506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							 SAMPLE_FILTER)
192606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
192706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
192806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
192906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrystatic rr::GenericVec4 selectComponents (const rr::GenericVec4& trueComponents, const rr::GenericVec4& falseComponents, const tcu::BVec4& m)
193006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
193106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return rr::GenericVec4(tcu::select(trueComponents.get<deUint32>(), falseComponents.get<deUint32>(), m));
193206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
193306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
193406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampUnusedChannelCase::init (void)
193506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
193606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	TextureBorderClampTest::init();
193706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
193806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// \note TextureBorderClampTest::init() creates texture
193906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormat		texFormat			= tcu::getEffectiveDepthStencilTextureFormat(getTexture()->getRefTexture().getFormat(), m_sampleMode);
194006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormatInfo	texFormatInfo		= tcu::getTextureFormatInfo(texFormat);
194106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::BVec4				channelMask			= tcu::getTextureFormatChannelMask(texFormat);
194206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const float						maxChannelValue		= (channelMask[0]) ? (texFormatInfo.valueMax[0])
194306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														: (channelMask[1]) ? (texFormatInfo.valueMax[1])
194406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														: (channelMask[2]) ? (texFormatInfo.valueMax[2])
194506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry														:                    (texFormatInfo.valueMax[3]);
194606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
194706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const rr::GenericVec4			effectiveColors		= mapToFormatColorRepresentable(texFormat, tcu::Vec4(0.6f));
194806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	rr::GenericVec4					nonEffectiveColors;
194906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
195006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	switch (m_channelClass)
195106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
195206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
195306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
195406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
195506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			nonEffectiveColors = rr::GenericVec4(tcu::Vec4(maxChannelValue * 0.8f));
195606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			break;
195706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
195806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
195906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			nonEffectiveColors = rr::GenericVec4(tcu::Vec4(maxChannelValue * 0.8f).cast<deInt32>());
196006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			break;
196106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
196206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
196306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			nonEffectiveColors = rr::GenericVec4(tcu::Vec4(maxChannelValue * 0.8f).cast<deUint32>());
196406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			break;
196506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		default:
196606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(false);
196706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
196806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
196906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterationConfig iteration;
197006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.p0			= tcu::Vec2(-0.25f, -0.75f);
197106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.p1			= tcu::Vec2( 2.25f,  1.25f);
197206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.borderColor	= selectComponents(effectiveColors, nonEffectiveColors, channelMask);
197306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.lookupScale	= texFormatInfo.lookupScale;
197406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.lookupBias	= texFormatInfo.lookupBias;
197506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.minFilter		= GL_NEAREST;
197606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.magFilter		= GL_NEAREST;
197706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.sWrapMode		= GL_CLAMP_TO_BORDER;
197806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.tWrapMode		= GL_CLAMP_TO_BORDER;
197906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.compareMode	= GL_NONE;
198006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.compareRef	= 0.0f;
198106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	iteration.description	= "Setting values to unused border color components";
198206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
198306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_iterations.push_back(iteration);
198406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
198506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
198606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryint TextureBorderClampUnusedChannelCase::getNumIterations	(void) const
198706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
198806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return (int)m_iterations.size();
198906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
199006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
199106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTest::IterationConfig TextureBorderClampUnusedChannelCase::getIteration (int ndx) const
199206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
199306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return m_iterations[ndx];
199406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
199506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
199606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryclass TextureBorderClampPerAxisCase3D : public TestCase
199706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
199806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyrypublic:
1999ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry														TextureBorderClampPerAxisCase3D	(Context&		context,
2000ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																						 const char*	name,
2001ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																						 const char*	description,
2002ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																						 deUint32		texFormat,
2003ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																						 SizeType		size,
2004ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																						 deUint32		filter,
2005ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																						 deUint32		sWrap,
2006ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																						 deUint32		tWrap,
2007ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																						 deUint32		rWrap);
200806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
200906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryprivate:
201006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												init							(void);
201106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												deinit							(void);
201206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	IterateResult										iterate							(void);
201306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
201406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												renderTo						(tcu::Surface&									surface,
2015c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																						 const glu::TextureTestUtil::ReferenceParams&	samplerParams);
201606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2017c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	void												logParams						(const glu::TextureTestUtil::ReferenceParams&	samplerParams);
201806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
201906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	void												verifyImage						(const tcu::Surface&							image,
2020c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket																						 const glu::TextureTestUtil::ReferenceParams&	samplerParams);
202106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2022c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::ReferenceParams				getSamplerParams				(void) const;
202306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	deUint32											getCaseSeed						(void) const;
202406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
202506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	enum
202606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
202706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		VIEWPORT_WIDTH		= 128,
202806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		VIEWPORT_HEIGHT		= 128,
202906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
203006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
203106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32										m_texFormat;
203206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureChannelClass						m_channelClass;
203306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::IVec3									m_size;
203406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32										m_filter;
203506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32										m_sWrap;
203606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32										m_tWrap;
203706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const deUint32										m_rWrap;
203806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
203906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	de::MovePtr<glu::Texture3D>							m_texture;
204006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	de::MovePtr<gls::TextureTestUtil::TextureRenderer>	m_renderer;
204106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
204206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	rr::GenericVec4										m_borderColor;
204306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	std::vector<float>									m_texCoords;
204406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Vec4											m_lookupScale;
204506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Vec4											m_lookupBias;
204606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry};
204706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2048ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko PöyryTextureBorderClampPerAxisCase3D::TextureBorderClampPerAxisCase3D (Context&		context,
2049ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																  const char*	name,
2050ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																  const char*	description,
2051ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																  deUint32		texFormat,
2052ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																  SizeType		size,
2053ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																  deUint32		filter,
2054ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																  deUint32		sWrap,
2055ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																  deUint32		tWrap,
2056ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry																  deUint32		rWrap)
205706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	: TestCase			(context, name, description)
205806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_texFormat		(texFormat)
2059ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry	, m_channelClass	(getFormatChannelClass(texFormat, tcu::Sampler::MODE_LAST))
206006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_size			((size == SIZE_POT) ? (tcu::IVec3(8, 16, 4)) : (tcu::IVec3(13, 5, 7)))
206106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_filter			(filter)
206206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_sWrap			(sWrap)
206306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_tWrap			(tWrap)
206406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	, m_rWrap			(rWrap)
206506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
206606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
206706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
206806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampPerAxisCase3D::init (void)
206906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
2070f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe	const bool				supportsES32	= glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
2071f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe	const glu::GLSLVersion	glslVersion		= glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType());
2072f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe
2073f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe	if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_border_clamp"))
207406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		throw tcu::NotSupportedError("Test requires GL_EXT_texture_border_clamp extension");
207506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
207606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (glu::isCompressedFormat(m_texFormat)													&&
2077f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe		!supportsES32																			&&
207806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::isAstcFormat(glu::mapGLCompressedTexFormat(m_texFormat))							&&
207906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		!m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
208006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
208106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		throw tcu::NotSupportedError("Test requires GL_KHR_texture_compression_astc_ldr extension");
208206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
208306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_texFormat == GL_BGRA && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_format_BGRA8888"))
208406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		throw tcu::NotSupportedError("Test requires GL_EXT_texture_format_BGRA8888 extension");
208506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (m_context.getRenderTarget().getWidth() < VIEWPORT_WIDTH ||
208606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_context.getRenderTarget().getHeight() < VIEWPORT_HEIGHT)
208706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
208806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		throw tcu::NotSupportedError("Test requires " + de::toString<int>(VIEWPORT_WIDTH) + "x" + de::toString<int>(VIEWPORT_HEIGHT) + " viewport");
208906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
209006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
209106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// resources
209206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_texture = genDummyTexture<glu::Texture3D>(m_context.getRenderContext(), m_context.getContextInfo(), m_texFormat, m_size);
2093f24d503d1acdb3b4461f74154d14b80d89a4397cDaniel Andrade Groppe	m_renderer = de::MovePtr<gls::TextureTestUtil::TextureRenderer>(new gls::TextureTestUtil::TextureRenderer(m_context.getRenderContext(), m_testCtx.getLog(), glslVersion, glu::PRECISION_HIGHP));
209406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
209506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// texture info
209606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::Message
2097b2e583dfcd8aa0d4ef254f841213fcf724b2b193Jarkko Pöyry						<< "Created 3D texture with format " << glu::getTextureFormatName(m_texFormat)
209806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< ", size (" << m_texture->getRefTexture().getWidth() << ", " << m_texture->getRefTexture().getHeight() << ", " << m_texture->getRefTexture().getDepth() << ")\n"
209906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::EndMessage;
210006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
210106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// tex coord
210206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
210306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Message
210406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< "Setting tex coords bottom-left: (-1, -1, -1.5), top-right (2, 2, 2.5)\n"
210506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::EndMessage;
210606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
210706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_texCoords.resize(4*3);
210806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
210906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_texCoords[0] = -1.0f; m_texCoords[ 1] = -1.0f; m_texCoords[ 2] = -1.5f;
211006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_texCoords[3] = -1.0f; m_texCoords[ 4] =  2.0f; m_texCoords[ 5] = 0.5f;
211106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_texCoords[6] =  2.0f; m_texCoords[ 7] = -1.0f; m_texCoords[ 8] = 0.5f;
211206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_texCoords[9] =  2.0f; m_texCoords[10] =  2.0f; m_texCoords[11] =  2.5f;
211306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
211406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
211506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// set render params
211606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
211706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::TextureFormat		texFormat		= m_texture->getRefTexture().getFormat();
211806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const tcu::TextureFormatInfo	texFormatInfo	= tcu::getTextureFormatInfo(texFormat);
211906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
212006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_borderColor	= mapToFormatColorRepresentable(texFormat, tcu::Vec4(0.2f, 0.6f, 0.9f, 0.4f));
212106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
212206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_lookupScale	= texFormatInfo.lookupScale;
212306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_lookupBias	= texFormatInfo.lookupBias;
212406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
212506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
212606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
212706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampPerAxisCase3D::deinit (void)
212806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
212906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_texture.clear();
213006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_renderer.clear();
213106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
213206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
213306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampPerAxisCase3D::IterateResult TextureBorderClampPerAxisCase3D::iterate (void)
213406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
213506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface								renderedFrame		(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
2136c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	const glu::TextureTestUtil::ReferenceParams	samplerParams		= getSamplerParams();
213706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
213806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	logParams(samplerParams);
213906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	renderTo(renderedFrame, samplerParams);
214006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	verifyImage(renderedFrame, samplerParams);
214106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
214206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return STOP;
214306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
214406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2145c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siketvoid TextureBorderClampPerAxisCase3D::logParams (const glu::TextureTestUtil::ReferenceParams& samplerParams)
214606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
214706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const std::string	borderColorString	= (m_channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)   ? (de::toString(m_borderColor.get<deInt32>()))
214806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry											: (m_channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) ? (de::toString(m_borderColor.get<deUint32>()))
214906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry											:																  (de::toString(m_borderColor.get<float>()));
215006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
215106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::Message
215206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Border color is " << borderColorString << "\n"
215306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Texture lookup bias: " << samplerParams.colorBias << "\n"
215406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Texture lookup scale: " << samplerParams.colorScale << "\n"
215506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Filter: " << glu::getTextureFilterName(m_filter) << "\n"
215606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< "Wrap mode: s = " << glu::getRepeatModeStr(m_sWrap)
215706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< ", t = " << glu::getRepeatModeStr(m_tWrap)
215806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< ", r = " << glu::getRepeatModeStr(m_rWrap) << "\n"
215906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::EndMessage;
216006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
216106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
216206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampPerAxisCase3D::renderTo (tcu::Surface&									surface,
2163c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket												const glu::TextureTestUtil::ReferenceParams&	samplerParams)
216406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
216506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const glw::Functions&						gl			= m_context.getRenderContext().getFunctions();
216606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const gls::TextureTestUtil::RandomViewport	viewport	(m_context.getRenderTarget(), VIEWPORT_WIDTH, VIEWPORT_HEIGHT, getCaseSeed());
216706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
216806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// Bind to unit 0.
216906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.activeTexture(GL_TEXTURE0);
217006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.bindTexture(GL_TEXTURE_3D, m_texture->getGLTexture());
217106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
217206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// Setup filtering and wrap modes.
217306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S,		glu::getGLWrapMode(samplerParams.sampler.wrapS));
217406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T,		glu::getGLWrapMode(samplerParams.sampler.wrapT));
217506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R,		glu::getGLWrapMode(samplerParams.sampler.wrapR));
217606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER,	glu::getGLFilterMode(samplerParams.sampler.minFilter));
217706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER,	glu::getGLFilterMode(samplerParams.sampler.magFilter));
217806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
217906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	switch (m_channelClass)
218006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
218106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
218206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
218306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
218406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			gl.texParameterfv(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, m_borderColor.getAccess<float>());
218506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			break;
218606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
218706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
218806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			gl.texParameterIiv(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, m_borderColor.getAccess<deInt32>());
218906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			break;
219006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
219106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
219206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			gl.texParameterIuiv(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, m_borderColor.getAccess<deUint32>());
219306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			break;
219406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
219506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		default:
219606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			DE_ASSERT(false);
219706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
219806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
219906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
220006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
220106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
220206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_renderer->renderQuad(0, &m_texCoords[0], samplerParams);
220306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	glu::readPixels(m_context.getRenderContext(), viewport.x, viewport.y, surface.getAccess());
220406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
220506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
220606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampPerAxisCase3D::verifyImage (const tcu::Surface&							renderedFrame,
2207c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket												   const glu::TextureTestUtil::ReferenceParams&	samplerParams)
220806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
220906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::PixelFormat			pixelFormat			= m_context.getRenderTarget().getPixelFormat();
221006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const int						colorErrorBits		= 2;
2211c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	const tcu::IVec4				colorBits			= tcu::max(glu::TextureTestUtil::getBitsVec(pixelFormat) - tcu::IVec4(colorErrorBits), tcu::IVec4(0));
221206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface					reference			(renderedFrame.getWidth(), renderedFrame.getHeight());
221306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::Surface					errorMask			(renderedFrame.getWidth(), renderedFrame.getHeight());
2214433645782506cbdf8fa8b113ea0b5aa8ae761f0cPyry Haulos	tcu::LodPrecision				lodPrecision;
221506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::LookupPrecision			lookupPrecision;
221606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	int								numFailedPixels;
221706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
221806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	lodPrecision.derivateBits		= 18;
221906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	lodPrecision.lodBits			= 5;
222006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
222106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	lookupPrecision.colorThreshold	= tcu::computeFixedPointThreshold(colorBits) / samplerParams.colorScale;
222206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	lookupPrecision.coordBits		= tcu::IVec3(20,20,0);
222306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	lookupPrecision.uvwBits			= tcu::IVec3(5,5,0);
2224c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	lookupPrecision.colorMask		= glu::TextureTestUtil::getCompareMask(pixelFormat);
222506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2226c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::sampleTexture(tcu::SurfaceAccess(reference, pixelFormat), m_texture->getRefTexture(), &m_texCoords[0], samplerParams);
222706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2228c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	numFailedPixels = glu::TextureTestUtil::computeTextureLookupDiff(renderedFrame.getAccess(), reference.getAccess(), errorMask.getAccess(), m_texture->getRefTexture(),
222906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	 &m_texCoords[0], samplerParams, lookupPrecision, lodPrecision, m_testCtx.getWatchDog());
223006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
223106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
223206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "ERROR: Result verification failed, got " << numFailedPixels << " invalid pixels!" << tcu::TestLog::EndMessage;
223306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog()	<< tcu::TestLog::ImageSet("VerifyResult", "Verification result")
223406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						<< tcu::TestLog::Image("Rendered", "Rendered image", renderedFrame);
223506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels > 0)
223606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
223706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.getLog()	<< tcu::TestLog::Image("Reference", "Ideal reference image", reference)
223806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							<< tcu::TestLog::Image("ErrorMask", "Error mask", errorMask);
223906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
224006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	m_testCtx.getLog() << tcu::TestLog::EndImageSet;
224106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
224206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	if (numFailedPixels == 0)
224306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
224406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	else
224506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image verification failed");
224606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
224706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
2248c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siketglu::TextureTestUtil::ReferenceParams TextureBorderClampPerAxisCase3D::getSamplerParams (void) const
224906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
225006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	const tcu::TextureFormat				texFormat		= m_texture->getRefTexture().getFormat();
2251c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	glu::TextureTestUtil::ReferenceParams	refParams		(glu::TextureTestUtil::TEXTURETYPE_3D);
225206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
225306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.sampler					= glu::mapGLSampler(m_sWrap, m_tWrap, m_rWrap, m_filter, m_filter);
225406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.sampler.borderColor		= m_borderColor;
2255c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	refParams.lodMode					= glu::TextureTestUtil::LODMODE_EXACT;
2256c4eb6f3271a0bcd54835e666e836e3e72beebbd2Peter Siket	refParams.samplerType				= glu::TextureTestUtil::getSamplerType(texFormat);
225706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.colorScale				= m_lookupScale;
225806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	refParams.colorBias					= m_lookupBias;
225906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
226006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return refParams;
226106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
226206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
226306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyrydeUint32 TextureBorderClampPerAxisCase3D::getCaseSeed (void) const
226406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
226506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	tcu::SeedBuilder builder;
226606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	builder	<< std::string(getName())
226706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_texFormat
226806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_filter
226906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_sWrap
227006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_tWrap
227106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_rWrap
227206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_texture->getRefTexture().getWidth()
227306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_texture->getRefTexture().getHeight()
227406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			<< m_texture->getRefTexture().getDepth();
227506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	return builder.get();
227606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
227706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
227806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry} // anonymous
227906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
228006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTests::TextureBorderClampTests (Context& context)
228106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	: TestCaseGroup(context, "border_clamp", "EXT_texture_border_clamp tests")
228206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
228306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
228406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
228506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko PöyryTextureBorderClampTests::~TextureBorderClampTests (void)
228606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
228706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
228806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
228906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyryvoid TextureBorderClampTests::init (void)
229006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry{
229106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	static const struct
229206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
229306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		const char*									name;
229406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		deUint32									filter;
229506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		TextureBorderClampTest::SamplingFunction	sampling;
229606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	} s_filters[] =
229706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
229806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{ "nearest",	GL_NEAREST,	TextureBorderClampTest::SAMPLE_FILTER	},
229906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{ "linear",		GL_LINEAR,	TextureBorderClampTest::SAMPLE_FILTER	},
230006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{ "gather",		GL_NEAREST,	TextureBorderClampTest::SAMPLE_GATHER	},
230106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	};
230206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
230306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// .formats
230406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
230506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const struct
230606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
230706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*						name;
230806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32						format;
230906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::Sampler::DepthStencilMode	mode;
231006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		} formats[] =
231106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
231206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "luminance",									GL_LUMINANCE,									tcu::Sampler::MODE_LAST		},
231306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "alpha",										GL_ALPHA,										tcu::Sampler::MODE_LAST		},
231406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "luminance_alpha",							GL_LUMINANCE_ALPHA,								tcu::Sampler::MODE_LAST		},
231506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "bgra",										GL_BGRA,										tcu::Sampler::MODE_LAST		},
231606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r8",											GL_R8,											tcu::Sampler::MODE_LAST		},
231706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r8_snorm",									GL_R8_SNORM,									tcu::Sampler::MODE_LAST		},
231806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg8",										GL_RG8,											tcu::Sampler::MODE_LAST		},
231906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg8_snorm",									GL_RG8_SNORM,									tcu::Sampler::MODE_LAST		},
232006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb8",										GL_RGB8,										tcu::Sampler::MODE_LAST		},
232106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb8_snorm",									GL_RGB8_SNORM,									tcu::Sampler::MODE_LAST		},
232206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb565",										GL_RGB565,										tcu::Sampler::MODE_LAST		},
232306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba4",										GL_RGBA4,										tcu::Sampler::MODE_LAST		},
232406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb5_a1",									GL_RGB5_A1,										tcu::Sampler::MODE_LAST		},
232506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba8",										GL_RGBA8,										tcu::Sampler::MODE_LAST		},
232606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba8_snorm",								GL_RGBA8_SNORM,									tcu::Sampler::MODE_LAST		},
232706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb10_a2",									GL_RGB10_A2,									tcu::Sampler::MODE_LAST		},
232806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb10_a2ui",									GL_RGB10_A2UI,									tcu::Sampler::MODE_LAST		},
232906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "srgb8",										GL_SRGB8,										tcu::Sampler::MODE_LAST		},
233006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "srgb8_alpha8",								GL_SRGB8_ALPHA8,								tcu::Sampler::MODE_LAST		},
233106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r16f",										GL_R16F,										tcu::Sampler::MODE_LAST		},
233206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg16f",										GL_RG16F,										tcu::Sampler::MODE_LAST		},
233306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb16f",										GL_RGB16F,										tcu::Sampler::MODE_LAST		},
233406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba16f",									GL_RGBA16F,										tcu::Sampler::MODE_LAST		},
233506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r32f",										GL_R32F,										tcu::Sampler::MODE_LAST		},
233606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg32f",										GL_RG32F,										tcu::Sampler::MODE_LAST		},
233706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb32f",										GL_RGB32F,										tcu::Sampler::MODE_LAST		},
233806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba32f",									GL_RGBA32F,										tcu::Sampler::MODE_LAST		},
233906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r11f_g11f_b10f",								GL_R11F_G11F_B10F,								tcu::Sampler::MODE_LAST		},
234006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb9_e5",									GL_RGB9_E5,										tcu::Sampler::MODE_LAST		},
234106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r8i",										GL_R8I,											tcu::Sampler::MODE_LAST		},
234206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r8ui",										GL_R8UI,										tcu::Sampler::MODE_LAST		},
234306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r16i",										GL_R16I,										tcu::Sampler::MODE_LAST		},
234406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r16ui",										GL_R16UI,										tcu::Sampler::MODE_LAST		},
234506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r32i",										GL_R32I,										tcu::Sampler::MODE_LAST		},
234606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r32ui",										GL_R32UI,										tcu::Sampler::MODE_LAST		},
234706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg8i",										GL_RG8I,										tcu::Sampler::MODE_LAST		},
234806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg8ui",										GL_RG8UI,										tcu::Sampler::MODE_LAST		},
234906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg16i",										GL_RG16I,										tcu::Sampler::MODE_LAST		},
235006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg16ui",										GL_RG16UI,										tcu::Sampler::MODE_LAST		},
235106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg32i",										GL_RG32I,										tcu::Sampler::MODE_LAST		},
235206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg32ui",										GL_RG32UI,										tcu::Sampler::MODE_LAST		},
235306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb8i",										GL_RGB8I,										tcu::Sampler::MODE_LAST		},
235406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb8ui",										GL_RGB8UI,										tcu::Sampler::MODE_LAST		},
235506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb16i",										GL_RGB16I,										tcu::Sampler::MODE_LAST		},
235606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb16ui",									GL_RGB16UI,										tcu::Sampler::MODE_LAST		},
235706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb32i",										GL_RGB32I,										tcu::Sampler::MODE_LAST		},
235806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb32ui",									GL_RGB32UI,										tcu::Sampler::MODE_LAST		},
235906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba8i",										GL_RGBA8I,										tcu::Sampler::MODE_LAST		},
236006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba8ui",									GL_RGBA8UI,										tcu::Sampler::MODE_LAST		},
236106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba16i",									GL_RGBA16I,										tcu::Sampler::MODE_LAST		},
236206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba16ui",									GL_RGBA16UI,									tcu::Sampler::MODE_LAST		},
236306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba32i",									GL_RGBA32I,										tcu::Sampler::MODE_LAST		},
236406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgba32ui",									GL_RGBA32UI,									tcu::Sampler::MODE_LAST		},
236506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth_component16",							GL_DEPTH_COMPONENT16,							tcu::Sampler::MODE_DEPTH	},
236606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth_component24",							GL_DEPTH_COMPONENT24,							tcu::Sampler::MODE_DEPTH	},
236706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth_component32f",							GL_DEPTH_COMPONENT32F,							tcu::Sampler::MODE_DEPTH	},
236806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "stencil_index8",								GL_STENCIL_INDEX8,								tcu::Sampler::MODE_STENCIL	},
236906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth24_stencil8_sample_depth",				GL_DEPTH24_STENCIL8,							tcu::Sampler::MODE_DEPTH	},
237006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth32f_stencil8_sample_depth",				GL_DEPTH32F_STENCIL8,							tcu::Sampler::MODE_DEPTH	},
237106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth24_stencil8_sample_stencil",			GL_DEPTH24_STENCIL8,							tcu::Sampler::MODE_STENCIL	},
237206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth32f_stencil8_sample_stencil",			GL_DEPTH32F_STENCIL8,							tcu::Sampler::MODE_STENCIL	},
237306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_r11_eac",							GL_COMPRESSED_R11_EAC,							tcu::Sampler::MODE_LAST		},
237406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_signed_r11_eac",					GL_COMPRESSED_SIGNED_R11_EAC,					tcu::Sampler::MODE_LAST		},
237506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_rg11_eac",						GL_COMPRESSED_RG11_EAC,							tcu::Sampler::MODE_LAST		},
237606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_signed_rg11_eac",					GL_COMPRESSED_SIGNED_RG11_EAC,					tcu::Sampler::MODE_LAST		},
237706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_rgb8_etc2",						GL_COMPRESSED_RGB8_ETC2,						tcu::Sampler::MODE_LAST		},
237806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_srgb8_etc2",						GL_COMPRESSED_SRGB8_ETC2,						tcu::Sampler::MODE_LAST		},
237906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_rgb8_punchthrough_alpha1_etc2",	GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,	tcu::Sampler::MODE_LAST		},
238006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_srgb8_punchthrough_alpha1_etc2",	GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,	tcu::Sampler::MODE_LAST		},
238106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_rgba8_etc2_eac",					GL_COMPRESSED_RGBA8_ETC2_EAC,					tcu::Sampler::MODE_LAST		},
238206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_srgb8_alpha8_etc2_eac",			GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,			tcu::Sampler::MODE_LAST		},
238306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
238406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
238506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::TestCaseGroup* const formatsGroup = new tcu::TestCaseGroup(m_testCtx, "formats", "Format tests");
238606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		addChild(formatsGroup);
238706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
238806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// .format
238906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); ++formatNdx)
239006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
239106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const deUint32							format			= formats[formatNdx].format;
239206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::Sampler::DepthStencilMode	sampleMode		= formats[formatNdx].mode;
239306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const bool								isCompressed	= glu::isCompressedFormat(format);
239406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const bool								coreFilterable	= isCoreFilterableFormat(format, sampleMode);
239506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::TestCaseGroup* const				formatGroup		= new tcu::TestCaseGroup(m_testCtx, formats[formatNdx].name, "Format test");
239606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
239706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			formatsGroup->addChild(formatGroup);
239806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
239906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// .nearest
240006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// .linear
240106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(s_filters); ++filterNdx)
240206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{
240306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				// [not-compressed]
240406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				// .size_pot
240506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				// .size_npot
240606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				// [compressed]
240706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				// .size_tile_multiple (also pot)
240806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				// .size_not_tile_multiple (also npot)
240906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				for (int sizeNdx = 0; sizeNdx < 2; ++sizeNdx)
241006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				{
241106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const bool				isNpotCase		= (sizeNdx == 1);
241206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const char* const		sizePotName		= (!isCompressed) ? ("size_pot") : ("size_tile_multiple");
241306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const char* const		sizeNpotName	= (!isCompressed) ? ("size_npot") : ("size_not_tile_multiple");
241406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const char* const		sizeName		= (isNpotCase) ? (sizeNpotName) : (sizePotName);
241506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const SizeType			sizeType		= (isNpotCase) ? (SIZE_NPOT) : (SIZE_POT);
241606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const std::string		caseName		= std::string() + s_filters[filterNdx].name + "_" + sizeName;
241706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const deUint32			filter			= s_filters[filterNdx].filter;
241806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
241906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					if (coreFilterable || !filterRequiresFilterability(filter))
242006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						formatGroup->addChild(new TextureBorderClampFormatCase(m_context,
242106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																			   caseName.c_str(),
242206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																			   "",
242306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																			   format,
242406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																			   sampleMode,
242506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																			   TextureBorderClampFormatCase::STATE_TEXTURE_PARAM,
242606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																			   sizeType,
242706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																			   filter,
242806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																			   s_filters[filterNdx].sampling));
242906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				}
243006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			}
243106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
243206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
243306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
243406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// .range_clamp
243506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
243606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const struct
243706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
243806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*						name;
243906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32						format;
244006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::Sampler::DepthStencilMode	mode;
244106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		} formats[] =
244206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
244306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "unorm_color",								GL_R8,					tcu::Sampler::MODE_LAST		},
244406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "snorm_color",								GL_R8_SNORM,			tcu::Sampler::MODE_LAST		},
244506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "float_color",								GL_RG32F,				tcu::Sampler::MODE_LAST		},
244606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "int_color",									GL_R8I,					tcu::Sampler::MODE_LAST		},
244706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "uint_color",									GL_R16UI,				tcu::Sampler::MODE_LAST		},
244806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "srgb_color",									GL_SRGB8_ALPHA8,		tcu::Sampler::MODE_LAST		},
244906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "unorm_depth",								GL_DEPTH_COMPONENT24,	tcu::Sampler::MODE_DEPTH	},
245006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "float_depth",								GL_DEPTH_COMPONENT32F,	tcu::Sampler::MODE_DEPTH	},
245106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "uint_stencil",								GL_STENCIL_INDEX8,		tcu::Sampler::MODE_STENCIL	},
245206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "float_depth_uint_stencil_sample_depth",		GL_DEPTH32F_STENCIL8,	tcu::Sampler::MODE_DEPTH	},
245306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "float_depth_uint_stencil_sample_stencil",	GL_DEPTH32F_STENCIL8,	tcu::Sampler::MODE_STENCIL	},
245406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "unorm_depth_uint_stencil_sample_depth",		GL_DEPTH24_STENCIL8,	tcu::Sampler::MODE_DEPTH	},
245506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "unorm_depth_uint_stencil_sample_stencil",	GL_DEPTH24_STENCIL8,	tcu::Sampler::MODE_STENCIL	},
245606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_color",							GL_COMPRESSED_RG11_EAC,	tcu::Sampler::MODE_LAST		},
245706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
245806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
245906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::TestCaseGroup* const rangeClampGroup = new tcu::TestCaseGroup(m_testCtx, "range_clamp", "Range clamp tests");
246006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		addChild(rangeClampGroup);
246106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
246206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); ++formatNdx)
246306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(s_filters); ++filterNdx)
246406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
246506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const deUint32							format			= formats[formatNdx].format;
246606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::Sampler::DepthStencilMode	sampleMode		= formats[formatNdx].mode;
246706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const std::string						caseName		= std::string() + s_filters[filterNdx].name + "_" + formats[formatNdx].name;
246806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const deUint32							filter			= s_filters[filterNdx].filter;
246906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const bool								coreFilterable	= isCoreFilterableFormat(format, sampleMode);
247006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
247106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			if (s_filters[filterNdx].sampling == TextureBorderClampTest::SAMPLE_GATHER)
247206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				continue;
247306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
247406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			if (coreFilterable || !filterRequiresFilterability(filter))
247506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				rangeClampGroup->addChild(new TextureBorderClampRangeClampCase(m_context, caseName.c_str(), "", format, sampleMode, filter));
247606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
247706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
247806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
247906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// .sampler
248006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
248106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const struct
248206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
248306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*						name;
248406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32						format;
248506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::Sampler::DepthStencilMode	mode;
248606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		} formats[] =
248706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
248806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "unorm_color",		GL_R8,					tcu::Sampler::MODE_LAST		},
248906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "snorm_color",		GL_R8_SNORM,			tcu::Sampler::MODE_LAST		},
249006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "float_color",		GL_RG32F,				tcu::Sampler::MODE_LAST		},
249106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "int_color",			GL_R8I,					tcu::Sampler::MODE_LAST		},
249206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "uint_color",			GL_R16UI,				tcu::Sampler::MODE_LAST		},
249306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "unorm_depth",		GL_DEPTH_COMPONENT24,	tcu::Sampler::MODE_DEPTH	},
249406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "float_depth",		GL_DEPTH_COMPONENT32F,	tcu::Sampler::MODE_DEPTH	},
249506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "uint_stencil",		GL_STENCIL_INDEX8,		tcu::Sampler::MODE_STENCIL	},
249606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_color",	GL_COMPRESSED_RG11_EAC,	tcu::Sampler::MODE_LAST		},
249706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
249806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
249906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::TestCaseGroup* const samplerGroup = new tcu::TestCaseGroup(m_testCtx, "sampler", "Sampler param tests");
250006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		addChild(samplerGroup);
250106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
250206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); ++formatNdx)
250306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
250406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const deUint32							format		= formats[formatNdx].format;
250506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const tcu::Sampler::DepthStencilMode	sampleMode	= formats[formatNdx].mode;
250606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*								caseName	= formats[formatNdx].name;
250706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
250806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			samplerGroup->addChild(new TextureBorderClampFormatCase(m_context,
250906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	caseName,
251006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	"",
251106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	format,
251206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	sampleMode,
251306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	TextureBorderClampFormatCase::STATE_SAMPLER_PARAM,
251406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	SIZE_POT,
251506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	GL_NEAREST,
251606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																	TextureBorderClampFormatCase::SAMPLE_FILTER));
251706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
251806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
251906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
252006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// .per_axis_wrap_mode
252106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
252206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const struct
252306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
252406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*						name;
252506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			bool							is3D;
252606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		} targets[] =
252706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
252806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "texture_2d", false	},
252906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "texture_3d", true	},
253006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
253106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const struct
253206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
253306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*						name;
253406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32						format;
253506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::Sampler::DepthStencilMode	mode;
253606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			bool							supports3D;
253706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		} formats[] =
253806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
253906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "unorm_color",		GL_RG8,						tcu::Sampler::MODE_LAST,	true	},
254006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "snorm_color",		GL_RG8_SNORM,				tcu::Sampler::MODE_LAST,	true	},
254106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "float_color",		GL_R32F,					tcu::Sampler::MODE_LAST,	true	},
254206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "int_color",			GL_RG16I,					tcu::Sampler::MODE_LAST,	true	},
254306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "uint_color",			GL_R8UI,					tcu::Sampler::MODE_LAST,	true	},
254406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "unorm_depth",		GL_DEPTH_COMPONENT16,		tcu::Sampler::MODE_DEPTH,	false	},
254506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "float_depth",		GL_DEPTH32F_STENCIL8,		tcu::Sampler::MODE_DEPTH,	false	},
254606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "uint_stencil",		GL_DEPTH32F_STENCIL8,		tcu::Sampler::MODE_STENCIL,	false	},
254706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_color",	GL_COMPRESSED_RGB8_ETC2,	tcu::Sampler::MODE_LAST,	false	},
254806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
254906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const struct
255006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
255106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*	name;
255206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32	sWrap;
255306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32	tWrap;
255406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32	rWrap;
255506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			bool		is3D;
255606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		} wrapConfigs[] =
255706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
255806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// 2d configs
255906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "s_clamp_to_edge_t_clamp_to_border",						GL_CLAMP_TO_EDGE,	GL_CLAMP_TO_BORDER,	GL_NONE,			false	},
256006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "s_repeat_t_clamp_to_border",								GL_REPEAT,			GL_CLAMP_TO_BORDER,	GL_NONE,			false	},
256106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "s_mirrored_repeat_t_clamp_to_border",					GL_MIRRORED_REPEAT,	GL_CLAMP_TO_BORDER,	GL_NONE,			false	},
256206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
256306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// 3d configs
256406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "s_clamp_to_border_t_clamp_to_border_r_clamp_to_border",	GL_CLAMP_TO_BORDER,	GL_CLAMP_TO_BORDER,	GL_CLAMP_TO_BORDER,	true	},
256506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "s_clamp_to_border_t_clamp_to_border_r_repeat",			GL_CLAMP_TO_BORDER,	GL_CLAMP_TO_BORDER,	GL_REPEAT,			true	},
256606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "s_mirrored_repeat_t_clamp_to_border_r_repeat",			GL_MIRRORED_REPEAT,	GL_CLAMP_TO_BORDER,	GL_REPEAT,			true	},
256706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "s_repeat_t_mirrored_repeat_r_clamp_to_border",			GL_REPEAT,			GL_MIRRORED_REPEAT,	GL_CLAMP_TO_BORDER,	true	},
256806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
256906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
257006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::TestCaseGroup* const perAxisGroup = new tcu::TestCaseGroup(m_testCtx, "per_axis_wrap_mode", "Per-axis wrapping modes");
257106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		addChild(perAxisGroup);
257206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
257306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		// .texture_nd
257406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(targets); ++targetNdx)
257506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
257606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::TestCaseGroup* const targetGroup = new tcu::TestCaseGroup(m_testCtx, targets[targetNdx].name, "Texture target test");
257706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			perAxisGroup->addChild(targetGroup);
257806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
257906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// .format
258006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); ++formatNdx)
258106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{
258206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				if (targets[targetNdx].is3D && !formats[formatNdx].supports3D)
258306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					continue;
258406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				else
258506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				{
258606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const deUint32							format			= formats[formatNdx].format;
258706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const tcu::Sampler::DepthStencilMode	sampleMode		= formats[formatNdx].mode;
258806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const bool								coreFilterable	= isCoreFilterableFormat(format, sampleMode);
258906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					tcu::TestCaseGroup* const				formatGroup		= new tcu::TestCaseGroup(m_testCtx, formats[formatNdx].name, "Format test");
259006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					targetGroup->addChild(formatGroup);
259106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
259206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					// .linear
259306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					// .nearest
259406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					// .gather
259506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(s_filters); ++filterNdx)
259606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					{
259706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						const deUint32 filter = s_filters[filterNdx].filter;
259806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
259906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						if (!coreFilterable && filterRequiresFilterability(filter))
260006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						{
260106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							// skip linear on pure integers
260206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							continue;
260306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						}
260406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						else if (s_filters[filterNdx].sampling == TextureBorderClampTest::SAMPLE_GATHER && targets[targetNdx].is3D)
260506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						{
260606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							// skip gather on 3d
260706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							continue;
260806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						}
260906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						else
261006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						{
261106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							tcu::TestCaseGroup* const filteringGroup = new tcu::TestCaseGroup(m_testCtx, s_filters[filterNdx].name, "Tests with specific filter");
261206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							formatGroup->addChild(filteringGroup);
261306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
261406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							// .s_XXX_t_XXX(_r_XXX)
261506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							for (int wrapNdx = 0; wrapNdx < DE_LENGTH_OF_ARRAY(wrapConfigs); ++wrapNdx)
261606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							{
261706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry								if (wrapConfigs[wrapNdx].is3D != targets[targetNdx].is3D)
261806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									continue;
261906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry								else
262006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry								{
262106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									for (int sizeNdx = 0; sizeNdx < 2; ++sizeNdx)
262206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									{
262306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										const char* const		wrapName			= wrapConfigs[wrapNdx].name;
262406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										const bool				isNpotCase			= (sizeNdx == 1);
262506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										const char* const		sizeNameExtension	= (isNpotCase) ? ("_npot") : ("_pot");
262606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										const SizeType			size				= (isNpotCase) ? (SIZE_NPOT) : (SIZE_POT);
262706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
262806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										if (!targets[targetNdx].is3D)
262906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry											filteringGroup->addChild(new TextureBorderClampPerAxisCase2D(m_context,
263006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 (std::string() + wrapName + sizeNameExtension).c_str(),
263106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 "",
263206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 format,
263306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 sampleMode,
263406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 size,
263506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 filter,
263606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 wrapConfigs[wrapNdx].sWrap,
263706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 wrapConfigs[wrapNdx].tWrap,
263806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 s_filters[filterNdx].sampling));
263906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry										else
2640ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry										{
2641ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry											DE_ASSERT(sampleMode == tcu::Sampler::MODE_LAST);
264206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry											filteringGroup->addChild(new TextureBorderClampPerAxisCase3D(m_context,
264306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 (std::string() + wrapName + sizeNameExtension).c_str(),
264406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 "",
264506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 format,
264606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 size,
264706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 filter,
264806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 wrapConfigs[wrapNdx].sWrap,
264906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 wrapConfigs[wrapNdx].tWrap,
265006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																										 wrapConfigs[wrapNdx].rWrap));
2651ccab5bf5fd11219cd858aebe769052083b0ddf55Jarkko Pöyry										}
265206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry									}
265306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry								}
265406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry							}
265506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry						}
265606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					}
265706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry				}
265806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			}
265906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
266006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
266106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
266206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// .depth_compare_mode
266306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
266406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const struct
266506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
266606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*						name;
266706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32						format;
266806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		} formats[] =
266906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
267006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth_component16",		GL_DEPTH_COMPONENT16	},
267106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth_component24",		GL_DEPTH_COMPONENT24	},
267206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth24_stencil8",		GL_DEPTH24_STENCIL8		},
267306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth32f_stencil8",		GL_DEPTH32F_STENCIL8	},
267406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
267506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
267606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::TestCaseGroup* const compareGroup = new tcu::TestCaseGroup(m_testCtx, "depth_compare_mode", "Tests depth compare mode");
267706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		addChild(compareGroup);
267806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
267906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); ++formatNdx)
268006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
268106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const deUint32							format			= formats[formatNdx].format;
268206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::TestCaseGroup* const				formatGroup		= new tcu::TestCaseGroup(m_testCtx, formats[formatNdx].name, "Format test");
268306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
268406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			compareGroup->addChild(formatGroup);
268506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
268606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			// (format).(linear|nearest|gather)_(pot|npot)
268706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(s_filters); ++filterNdx)
268806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			for (int sizeNdx = 0; sizeNdx < 2; ++sizeNdx)
268906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{
269006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const bool				isNpotCase		= (sizeNdx == 1);
269106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const char* const		sizeName		= (isNpotCase) ? ("size_npot") : ("size_pot");
269206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const SizeType			sizeType		= (isNpotCase) ? (SIZE_NPOT) : (SIZE_POT);
269306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const std::string		caseName		= std::string() + s_filters[filterNdx].name + "_" + sizeName;
269406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					const deUint32			filter			= s_filters[filterNdx].filter;
269506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
269606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry					formatGroup->addChild(new TextureBorderClampDepthCompareCase(m_context,
269706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																				 caseName.c_str(),
269806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																				 "",
269906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																				 format,
270006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																				 sizeType,
270106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																				 filter,
270206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																				 s_filters[filterNdx].sampling));
270306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			}
270406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
270506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
270606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
270706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	// unused channels (A in rgb, G in stencil etc.)
270806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	{
270906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		static const struct
271006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
271106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			const char*						name;
271206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			deUint32						format;
271306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			tcu::Sampler::DepthStencilMode	mode;
271406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		} formats[] =
271506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
271606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r8",										GL_R8,						tcu::Sampler::MODE_LAST		},
271706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg8_snorm",								GL_RG8_SNORM,				tcu::Sampler::MODE_LAST		},
271806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rgb8",									GL_RGB8,					tcu::Sampler::MODE_LAST		},
271906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "rg32f",									GL_RG32F,					tcu::Sampler::MODE_LAST		},
272006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "r16i",									GL_RG16I,					tcu::Sampler::MODE_LAST		},
272106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "luminance",								GL_LUMINANCE,				tcu::Sampler::MODE_LAST		},
272206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "alpha",									GL_ALPHA,					tcu::Sampler::MODE_LAST		},
272306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "luminance_alpha",						GL_LUMINANCE_ALPHA,			tcu::Sampler::MODE_LAST		},
272406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth_component16",						GL_DEPTH_COMPONENT16,		tcu::Sampler::MODE_DEPTH	},
272506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth_component32f",						GL_DEPTH_COMPONENT32F,		tcu::Sampler::MODE_DEPTH	},
272606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "stencil_index8",							GL_STENCIL_INDEX8,			tcu::Sampler::MODE_STENCIL	},
272706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth32f_stencil8_sample_depth",			GL_DEPTH32F_STENCIL8,		tcu::Sampler::MODE_DEPTH	},
272806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth32f_stencil8_sample_stencil",		GL_DEPTH32F_STENCIL8,		tcu::Sampler::MODE_STENCIL	},
272906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth24_stencil8_sample_depth",			GL_DEPTH24_STENCIL8,		tcu::Sampler::MODE_DEPTH	},
273006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "depth24_stencil8_sample_stencil",		GL_DEPTH24_STENCIL8,		tcu::Sampler::MODE_STENCIL	},
273106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			{ "compressed_r11_eac",						GL_COMPRESSED_R11_EAC,		tcu::Sampler::MODE_LAST		},
273206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		};
273306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
273406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		tcu::TestCaseGroup* const unusedGroup = new tcu::TestCaseGroup(m_testCtx, "unused_channels", "Tests channels that are not present in the internal format");
273506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		addChild(unusedGroup);
273606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
273706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); ++formatNdx)
273806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		{
273906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry			unusedGroup->addChild(new TextureBorderClampUnusedChannelCase(m_context,
274006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  formats[formatNdx].name,
274106fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  "",
274206fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  formats[formatNdx].format,
274306fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry																		  formats[formatNdx].mode));
274406fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry		}
274506fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry	}
274606fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry}
274706fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry
274806fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry} // Functional
274906fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry} // gles31
275006fe4fe2a28c6c5a7cab7431d313648cf8054943Jarkko Pöyry} // deqp
2751