Home | History | Annotate | Download | only in glshared
      1 #ifndef _GLSTEXTURETESTUTIL_HPP
      2 #define _GLSTEXTURETESTUTIL_HPP
      3 /*-------------------------------------------------------------------------
      4  * drawElements Quality Program OpenGL (ES) Module
      5  * -----------------------------------------------
      6  *
      7  * Copyright 2014 The Android Open Source Project
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Texture test utilities.
     24  *
     25  * About coordinates:
     26  *  + Quads consist of 2 triangles, rendered using explicit indices.
     27  *  + All TextureTestUtil functions and classes expect texture coordinates
     28  *    for quads to be specified in order (-1, -1), (-1, 1), (1, -1), (1, 1).
     29  *//*--------------------------------------------------------------------*/
     30 
     31 #include "tcuDefs.hpp"
     32 #include "tcuTexture.hpp"
     33 #include "tcuSurface.hpp"
     34 #include "tcuPixelFormat.hpp"
     35 #include "tcuRenderTarget.hpp"
     36 #include "tcuTestContext.hpp"
     37 #include "deMath.h"
     38 #include "deInt32.h"
     39 #include "gluShaderProgram.hpp"
     40 #include "tcuTestLog.hpp"
     41 #include "tcuCompressedTexture.hpp"
     42 #include "gluShaderUtil.hpp"
     43 
     44 #include <map>
     45 
     46 namespace tcu
     47 {
     48 struct LookupPrecision;
     49 struct LodPrecision;
     50 struct TexComparePrecision;
     51 }
     52 
     53 namespace deqp
     54 {
     55 namespace gls
     56 {
     57 namespace TextureTestUtil
     58 {
     59 
     60 enum TextureType
     61 {
     62 	TEXTURETYPE_2D = 0,
     63 	TEXTURETYPE_CUBE,
     64 	TEXTURETYPE_2D_ARRAY,
     65 	TEXTURETYPE_3D,
     66 	TEXTURETYPE_CUBE_ARRAY,
     67 	TEXTURETYPE_1D,
     68 	TEXTURETYPE_1D_ARRAY,
     69 	TEXTURETYPE_BUFFER,
     70 
     71 	TEXTURETYPE_LAST
     72 };
     73 
     74 enum SamplerType
     75 {
     76 	SAMPLERTYPE_FLOAT,
     77 	SAMPLERTYPE_INT,
     78 	SAMPLERTYPE_UINT,
     79 	SAMPLERTYPE_SHADOW,
     80 
     81 	SAMPLERTYPE_FETCH_FLOAT,
     82 	SAMPLERTYPE_FETCH_INT,
     83 	SAMPLERTYPE_FETCH_UINT,
     84 
     85 	SAMPLERTYPE_LAST
     86 };
     87 
     88 SamplerType		getSamplerType		(tcu::TextureFormat format);
     89 SamplerType		getFetchSamplerType	(tcu::TextureFormat format);
     90 
     91 struct RenderParams
     92 {
     93 	enum Flags
     94 	{
     95 		PROJECTED		= (1<<0),
     96 		USE_BIAS		= (1<<1),
     97 		LOG_PROGRAMS	= (1<<2),
     98 		LOG_UNIFORMS	= (1<<3),
     99 
    100 		LOG_ALL			= LOG_PROGRAMS|LOG_UNIFORMS
    101 	};
    102 
    103 	RenderParams (TextureType texType_)
    104 		: texType		(texType_)
    105 		, samplerType	(SAMPLERTYPE_FLOAT)
    106 		, flags			(0)
    107 		, w				(1.0f)
    108 		, bias			(0.0f)
    109 		, ref			(0.0f)
    110 		, colorScale	(1.0f)
    111 		, colorBias		(0.0f)
    112 	{
    113 	}
    114 
    115 	TextureType		texType;		//!< Texture type.
    116 	SamplerType		samplerType;	//!< Sampler type.
    117 	deUint32		flags;			//!< Feature flags.
    118 	tcu::Vec4		w;				//!< w coordinates for quad vertices.
    119 	float			bias;			//!< User-supplied bias.
    120 	float			ref;			//!< Reference value for shadow lookups.
    121 
    122 	// color = lookup() * scale + bias
    123 	tcu::Vec4		colorScale;		//!< Scale for texture color values.
    124 	tcu::Vec4		colorBias;		//!< Bias for texture color values.
    125 };
    126 
    127 enum Program
    128 {
    129 	PROGRAM_2D_FLOAT = 0,
    130 	PROGRAM_2D_INT,
    131 	PROGRAM_2D_UINT,
    132 	PROGRAM_2D_SHADOW,
    133 
    134 	PROGRAM_2D_FLOAT_BIAS,
    135 	PROGRAM_2D_INT_BIAS,
    136 	PROGRAM_2D_UINT_BIAS,
    137 	PROGRAM_2D_SHADOW_BIAS,
    138 
    139 	PROGRAM_1D_FLOAT,
    140 	PROGRAM_1D_INT,
    141 	PROGRAM_1D_UINT,
    142 	PROGRAM_1D_SHADOW,
    143 
    144 	PROGRAM_1D_FLOAT_BIAS,
    145 	PROGRAM_1D_INT_BIAS,
    146 	PROGRAM_1D_UINT_BIAS,
    147 	PROGRAM_1D_SHADOW_BIAS,
    148 
    149 	PROGRAM_CUBE_FLOAT,
    150 	PROGRAM_CUBE_INT,
    151 	PROGRAM_CUBE_UINT,
    152 	PROGRAM_CUBE_SHADOW,
    153 
    154 	PROGRAM_CUBE_FLOAT_BIAS,
    155 	PROGRAM_CUBE_INT_BIAS,
    156 	PROGRAM_CUBE_UINT_BIAS,
    157 	PROGRAM_CUBE_SHADOW_BIAS,
    158 
    159 	PROGRAM_1D_ARRAY_FLOAT,
    160 	PROGRAM_1D_ARRAY_INT,
    161 	PROGRAM_1D_ARRAY_UINT,
    162 	PROGRAM_1D_ARRAY_SHADOW,
    163 
    164 	PROGRAM_2D_ARRAY_FLOAT,
    165 	PROGRAM_2D_ARRAY_INT,
    166 	PROGRAM_2D_ARRAY_UINT,
    167 	PROGRAM_2D_ARRAY_SHADOW,
    168 
    169 	PROGRAM_3D_FLOAT,
    170 	PROGRAM_3D_INT,
    171 	PROGRAM_3D_UINT,
    172 
    173 	PROGRAM_3D_FLOAT_BIAS,
    174 	PROGRAM_3D_INT_BIAS,
    175 	PROGRAM_3D_UINT_BIAS,
    176 
    177 	PROGRAM_CUBE_ARRAY_FLOAT,
    178 	PROGRAM_CUBE_ARRAY_INT,
    179 	PROGRAM_CUBE_ARRAY_UINT,
    180 	PROGRAM_CUBE_ARRAY_SHADOW,
    181 
    182 	PROGRAM_BUFFER_FLOAT,
    183 	PROGRAM_BUFFER_INT,
    184 	PROGRAM_BUFFER_UINT,
    185 
    186 	PROGRAM_LAST
    187 };
    188 
    189 class ProgramLibrary
    190 {
    191 public:
    192 											ProgramLibrary			(const glu::RenderContext& context, tcu::TestContext& testCtx, glu::GLSLVersion glslVersion, glu::Precision texCoordPrecision);
    193 											~ProgramLibrary			(void);
    194 
    195 	glu::ShaderProgram*						getProgram				(Program program);
    196 	void									clear					(void);
    197 
    198 private:
    199 											ProgramLibrary			(const ProgramLibrary& other);
    200 	ProgramLibrary&							operator=				(const ProgramLibrary& other);
    201 
    202 	const glu::RenderContext&				m_context;
    203 	tcu::TestContext&						m_testCtx;
    204 	glu::GLSLVersion						m_glslVersion;
    205 	glu::Precision							m_texCoordPrecision;
    206 	std::map<Program, glu::ShaderProgram*>	m_programs;
    207 };
    208 
    209 class TextureRenderer
    210 {
    211 public:
    212 								TextureRenderer			(const glu::RenderContext& context, tcu::TestContext& testCtx, glu::GLSLVersion glslVersion, glu::Precision texCoordPrecision);
    213 								~TextureRenderer		(void);
    214 
    215 	void						clear					(void); //!< Frees allocated resources. Destructor will call clear() as well.
    216 
    217 	void						renderQuad				(int texUnit, const float* texCoord, TextureType texType);
    218 	void						renderQuad				(int texUnit, const float* texCoord, const RenderParams& params);
    219 
    220 private:
    221 								TextureRenderer			(const TextureRenderer& other);
    222 	TextureRenderer&			operator=				(const TextureRenderer& other);
    223 
    224 	const glu::RenderContext&	m_renderCtx;
    225 	tcu::TestContext&			m_testCtx;
    226 	ProgramLibrary				m_programLibrary;
    227 };
    228 
    229 class RandomViewport
    230 {
    231 public:
    232 	int		x;
    233 	int		y;
    234 	int		width;
    235 	int		height;
    236 
    237 	RandomViewport (const tcu::RenderTarget& renderTarget, int preferredWidth, int preferredHeight, deUint32 seed);
    238 };
    239 
    240 inline tcu::RGBA toRGBA (const tcu::Vec4& v)
    241 {
    242 	// \todo [2011-10-24 pyry] Rounding mode?
    243 	return tcu::RGBA(deClamp32(deRoundFloatToInt32(v.x()*255.0f), 0, 255),
    244 					 deClamp32(deRoundFloatToInt32(v.y()*255.0f), 0, 255),
    245 					 deClamp32(deRoundFloatToInt32(v.z()*255.0f), 0, 255),
    246 					 deClamp32(deRoundFloatToInt32(v.w()*255.0f), 0, 255));
    247 }
    248 
    249 inline tcu::RGBA toRGBAMasked (const tcu::Vec4& v, deUint8 mask)
    250 {
    251 	// \todo [2011-10-24 pyry] Rounding mode?
    252 	return tcu::RGBA((mask&tcu::RGBA::RED_MASK)		? deClamp32(deRoundFloatToInt32(v.x()*255.0f), 0, 255) : 0,
    253 					 (mask&tcu::RGBA::GREEN_MASK)	? deClamp32(deRoundFloatToInt32(v.y()*255.0f), 0, 255) : 0,
    254 					 (mask&tcu::RGBA::BLUE_MASK)	? deClamp32(deRoundFloatToInt32(v.z()*255.0f), 0, 255) : 0,
    255 					 (mask&tcu::RGBA::ALPHA_MASK)	? deClamp32(deRoundFloatToInt32(v.w()*255.0f), 0, 255) : 0xff);
    256 }
    257 
    258 inline tcu::Vec4 toVec4 (const tcu::RGBA& c)
    259 {
    260 	return tcu::Vec4(c.getRed()		/ 255.0f,
    261 					 c.getGreen()	/ 255.0f,
    262 					 c.getBlue()	/ 255.0f,
    263 					 c.getAlpha()	/ 255.0f);
    264 }
    265 
    266 inline deUint8 getColorMask (const tcu::PixelFormat& format)
    267 {
    268 	return (format.redBits		? tcu::RGBA::RED_MASK	: 0) |
    269 		   (format.greenBits	? tcu::RGBA::GREEN_MASK	: 0) |
    270 		   (format.blueBits		? tcu::RGBA::BLUE_MASK	: 0) |
    271 		   (format.alphaBits	? tcu::RGBA::ALPHA_MASK	: 0);
    272 }
    273 
    274 inline tcu::IVec4 getBitsVec (const tcu::PixelFormat& format)
    275 {
    276 	return tcu::IVec4(format.redBits, format.greenBits, format.blueBits, format.alphaBits);
    277 }
    278 
    279 inline tcu::BVec4 getCompareMask (const tcu::PixelFormat& format)
    280 {
    281 	return tcu::BVec4(format.redBits	> 0,
    282 					  format.greenBits	> 0,
    283 					  format.blueBits	> 0,
    284 					  format.alphaBits	> 0);
    285 }
    286 
    287 // \todo [2012-02-09 pyry] Move to tcuSurfaceAccess?
    288 class SurfaceAccess
    289 {
    290 public:
    291 							SurfaceAccess		(tcu::Surface& surface, const tcu::PixelFormat& colorFmt);
    292 							SurfaceAccess		(tcu::Surface& surface, const tcu::PixelFormat& colorFmt, int x, int y, int width, int height);
    293 							SurfaceAccess		(const SurfaceAccess& parent, int x, int y, int width, int height);
    294 
    295 	int						getWidth			(void) const	{ return m_width;	}
    296 	int						getHeight			(void) const	{ return m_height;	}
    297 
    298 	void					setPixel			(const tcu::Vec4& color, int x, int y) const;
    299 
    300 private:
    301 	mutable tcu::Surface*	m_surface;
    302 	deUint8					m_colorMask;
    303 	int						m_x;
    304 	int						m_y;
    305 	int						m_width;
    306 	int						m_height;
    307 };
    308 
    309 inline void SurfaceAccess::setPixel (const tcu::Vec4& color, int x, int y) const
    310 {
    311 	DE_ASSERT(de::inBounds(x, 0, m_width) && de::inBounds(y, 0, m_height));
    312 	m_surface->setPixel(m_x+x, m_y+y, toRGBAMasked(color, m_colorMask));
    313 }
    314 
    315 enum LodMode
    316 {
    317 	LODMODE_EXACT = 0,		//!< Ideal lod computation.
    318 	LODMODE_MIN_BOUND,		//!< Use estimation range minimum bound.
    319 	LODMODE_MAX_BOUND,		//!< Use estimation range maximum bound.
    320 
    321 	LODMODE_LAST
    322 };
    323 
    324 struct ReferenceParams : public RenderParams
    325 {
    326 	ReferenceParams (TextureType texType_)
    327 		: RenderParams	(texType_)
    328 		, sampler		()
    329 		, lodMode		(LODMODE_EXACT)
    330 		, minLod		(-1000.0f)
    331 		, maxLod		(1000.0f)
    332 		, baseLevel		(0)
    333 		, maxLevel		(1000)
    334 	{
    335 	}
    336 
    337 	ReferenceParams (TextureType texType_, const tcu::Sampler& sampler_, LodMode lodMode_ = LODMODE_EXACT)
    338 		: RenderParams	(texType_)
    339 		, sampler		(sampler_)
    340 		, lodMode		(lodMode_)
    341 		, minLod		(-1000.0f)
    342 		, maxLod		(1000.0f)
    343 		, baseLevel		(0)
    344 		, maxLevel		(1000)
    345 	{
    346 	}
    347 
    348 	tcu::Sampler		sampler;
    349 	LodMode				lodMode;
    350 	float				minLod;
    351 	float				maxLod;
    352 	int					baseLevel;
    353 	int					maxLevel;
    354 };
    355 
    356 void			clear						(const SurfaceAccess& dst, const tcu::Vec4& color);
    357 
    358 // Similar to sampleTexture() except uses texelFetch.
    359 void			fetchTexture				(const SurfaceAccess& dst, const tcu::ConstPixelBufferAccess& src, const float* texCoord, const tcu::Vec4& colorScale, const tcu::Vec4& colorBias);
    360 
    361 void			sampleTexture				(const SurfaceAccess& dst, const tcu::Texture2DView&		src, const float* texCoord, const ReferenceParams& params);
    362 void			sampleTexture				(const SurfaceAccess& dst, const tcu::TextureCubeView&		src, const float* texCoord, const ReferenceParams& params);
    363 void			sampleTextureMultiFace		(const SurfaceAccess& dst, const tcu::TextureCubeView&		src, const float* texCoord, const ReferenceParams& params);
    364 void			sampleTexture				(const SurfaceAccess& dst, const tcu::Texture2DArrayView&	src, const float* texCoord, const ReferenceParams& params);
    365 void			sampleTexture				(const SurfaceAccess& dst, const tcu::Texture3DView&		src, const float* texCoord, const ReferenceParams& params);
    366 void			sampleTexture				(const SurfaceAccess& dst, const tcu::TextureCubeArrayView&	src, const float* texCoord, const ReferenceParams& params);
    367 void			sampleTexture				(const SurfaceAccess& dst, const tcu::Texture1DView&		src, const float* texCoord, const ReferenceParams& params);
    368 void			sampleTexture				(const SurfaceAccess& dst, const tcu::Texture1DArrayView&	src, const float* texCoord, const ReferenceParams& params);
    369 
    370 void			computeQuadTexCoord1D			(std::vector<float>& dst, float left, float right);
    371 void			computeQuadTexCoord1DArray		(std::vector<float>& dst, int layerNdx, float left, float right);
    372 void			computeQuadTexCoord2D			(std::vector<float>& dst, const tcu::Vec2& bottomLeft, const tcu::Vec2& topRight);
    373 void			computeQuadTexCoord2DArray		(std::vector<float>& dst, int layerNdx, const tcu::Vec2& bottomLeft, const tcu::Vec2& topRight);
    374 void			computeQuadTexCoord3D			(std::vector<float>& dst, const tcu::Vec3& p0, const tcu::Vec3& p1, const tcu::IVec3& dirSwz);
    375 void			computeQuadTexCoordCube			(std::vector<float>& dst, tcu::CubeFace face);
    376 void			computeQuadTexCoordCube			(std::vector<float>& dst, tcu::CubeFace face, const tcu::Vec2& bottomLeft, const tcu::Vec2& topRight);
    377 void			computeQuadTexCoordCubeArray	(std::vector<float>& dst, tcu::CubeFace face, const tcu::Vec2& bottomLeft, const tcu::Vec2& topRight, const tcu::Vec2& layerRange);
    378 
    379 bool			compareImages				(tcu::TestLog& log, const char* name, const char* desc, const tcu::Surface& reference, const tcu::Surface& rendered, tcu::RGBA threshold);
    380 bool			compareImages				(tcu::TestLog& log, const tcu::Surface& reference, const tcu::Surface& rendered, tcu::RGBA threshold);
    381 int				measureAccuracy				(tcu::TestLog& log, const tcu::Surface& reference, const tcu::Surface& rendered, int bestScoreDiff, int worstScoreDiff);
    382 
    383 int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
    384 											 const tcu::ConstPixelBufferAccess&	reference,
    385 											 const tcu::PixelBufferAccess&		errorMask,
    386 											 const tcu::Texture1DView&			src,
    387 											 const float*						texCoord,
    388 											 const ReferenceParams&				sampleParams,
    389 											 const tcu::LookupPrecision&		lookupPrec,
    390 											 const tcu::LodPrecision&			lodPrec,
    391 											 qpWatchDog*						watchDog);
    392 
    393 int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
    394 											 const tcu::ConstPixelBufferAccess&	reference,
    395 											 const tcu::PixelBufferAccess&		errorMask,
    396 											 const tcu::Texture2DView&			src,
    397 											 const float*						texCoord,
    398 											 const ReferenceParams&				sampleParams,
    399 											 const tcu::LookupPrecision&		lookupPrec,
    400 											 const tcu::LodPrecision&			lodPrec,
    401 											 qpWatchDog*						watchDog);
    402 
    403 int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
    404 											 const tcu::ConstPixelBufferAccess&	reference,
    405 											 const tcu::PixelBufferAccess&		errorMask,
    406 											 const tcu::TextureCubeView&		src,
    407 											 const float*						texCoord,
    408 											 const ReferenceParams&				sampleParams,
    409 											 const tcu::LookupPrecision&		lookupPrec,
    410 											 const tcu::LodPrecision&			lodPrec,
    411 											 qpWatchDog*						watchDog);
    412 
    413 int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
    414 											 const tcu::ConstPixelBufferAccess&	reference,
    415 											 const tcu::PixelBufferAccess&		errorMask,
    416 											 const tcu::Texture1DArrayView&		src,
    417 											 const float*						texCoord,
    418 											 const ReferenceParams&				sampleParams,
    419 											 const tcu::LookupPrecision&		lookupPrec,
    420 											 const tcu::LodPrecision&			lodPrec,
    421 											 qpWatchDog*						watchDog);
    422 
    423 int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
    424 											 const tcu::ConstPixelBufferAccess&	reference,
    425 											 const tcu::PixelBufferAccess&		errorMask,
    426 											 const tcu::Texture2DArrayView&		src,
    427 											 const float*						texCoord,
    428 											 const ReferenceParams&				sampleParams,
    429 											 const tcu::LookupPrecision&		lookupPrec,
    430 											 const tcu::LodPrecision&			lodPrec,
    431 											 qpWatchDog*						watchDog);
    432 
    433 int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
    434 											 const tcu::ConstPixelBufferAccess&	reference,
    435 											 const tcu::PixelBufferAccess&		errorMask,
    436 											 const tcu::Texture3DView&			src,
    437 											 const float*						texCoord,
    438 											 const ReferenceParams&				sampleParams,
    439 											 const tcu::LookupPrecision&		lookupPrec,
    440 											 const tcu::LodPrecision&			lodPrec,
    441 											 qpWatchDog*						watchDog);
    442 
    443 int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
    444 											 const tcu::ConstPixelBufferAccess&	reference,
    445 											 const tcu::PixelBufferAccess&		errorMask,
    446 											 const tcu::TextureCubeArrayView&	src,
    447 											 const float*						texCoord,
    448 											 const ReferenceParams&				sampleParams,
    449 											 const tcu::LookupPrecision&		lookupPrec,
    450 											 const tcu::IVec4&					coordBits,
    451 											 const tcu::LodPrecision&			lodPrec,
    452 											 qpWatchDog*						watchDog);
    453 
    454 bool			verifyTextureResult			(tcu::TestContext&					testCtx,
    455 											 const tcu::ConstPixelBufferAccess&	result,
    456 											 const tcu::Texture1DView&			src,
    457 											 const float*						texCoord,
    458 											 const ReferenceParams&				sampleParams,
    459 											 const tcu::LookupPrecision&		lookupPrec,
    460 											 const tcu::LodPrecision&			lodPrec,
    461 											 const tcu::PixelFormat&			pixelFormat);
    462 
    463 bool			verifyTextureResult			(tcu::TestContext&					testCtx,
    464 											 const tcu::ConstPixelBufferAccess&	result,
    465 											 const tcu::Texture2DView&			src,
    466 											 const float*						texCoord,
    467 											 const ReferenceParams&				sampleParams,
    468 											 const tcu::LookupPrecision&		lookupPrec,
    469 											 const tcu::LodPrecision&			lodPrec,
    470 											 const tcu::PixelFormat&			pixelFormat);
    471 
    472 bool			verifyTextureResult			(tcu::TestContext&					testCtx,
    473 											 const tcu::ConstPixelBufferAccess&	result,
    474 											 const tcu::TextureCubeView&		src,
    475 											 const float*						texCoord,
    476 											 const ReferenceParams&				sampleParams,
    477 											 const tcu::LookupPrecision&		lookupPrec,
    478 											 const tcu::LodPrecision&			lodPrec,
    479 											 const tcu::PixelFormat&			pixelFormat);
    480 
    481 bool			verifyTextureResult			(tcu::TestContext&					testCtx,
    482 											 const tcu::ConstPixelBufferAccess&	result,
    483 											 const tcu::Texture1DArrayView&		src,
    484 											 const float*						texCoord,
    485 											 const ReferenceParams&				sampleParams,
    486 											 const tcu::LookupPrecision&		lookupPrec,
    487 											 const tcu::LodPrecision&			lodPrec,
    488 											 const tcu::PixelFormat&			pixelFormat);
    489 
    490 bool			verifyTextureResult			(tcu::TestContext&					testCtx,
    491 											 const tcu::ConstPixelBufferAccess&	result,
    492 											 const tcu::Texture2DArrayView&		src,
    493 											 const float*						texCoord,
    494 											 const ReferenceParams&				sampleParams,
    495 											 const tcu::LookupPrecision&		lookupPrec,
    496 											 const tcu::LodPrecision&			lodPrec,
    497 											 const tcu::PixelFormat&			pixelFormat);
    498 
    499 bool			verifyTextureResult			(tcu::TestContext&					testCtx,
    500 											 const tcu::ConstPixelBufferAccess&	result,
    501 											 const tcu::Texture3DView&			src,
    502 											 const float*						texCoord,
    503 											 const ReferenceParams&				sampleParams,
    504 											 const tcu::LookupPrecision&		lookupPrec,
    505 											 const tcu::LodPrecision&			lodPrec,
    506 											 const tcu::PixelFormat&			pixelFormat);
    507 
    508 bool			verifyTextureResult			(tcu::TestContext&					testCtx,
    509 											 const tcu::ConstPixelBufferAccess&	result,
    510 											 const tcu::TextureCubeArrayView&	src,
    511 											 const float*						texCoord,
    512 											 const ReferenceParams&				sampleParams,
    513 											 const tcu::LookupPrecision&		lookupPrec,
    514 											 const tcu::IVec4&					coordBits,
    515 											 const tcu::LodPrecision&			lodPrec,
    516 											 const tcu::PixelFormat&			pixelFormat);
    517 
    518 int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
    519 											 const tcu::ConstPixelBufferAccess&	reference,
    520 											 const tcu::PixelBufferAccess&		errorMask,
    521 											 const tcu::Texture2DView&			src,
    522 											 const float*						texCoord,
    523 											 const ReferenceParams&				sampleParams,
    524 											 const tcu::TexComparePrecision&	comparePrec,
    525 											 const tcu::LodPrecision&			lodPrec,
    526 											 const tcu::Vec3&					nonShadowThreshold);
    527 
    528 int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
    529 											 const tcu::ConstPixelBufferAccess&	reference,
    530 											 const tcu::PixelBufferAccess&		errorMask,
    531 											 const tcu::TextureCubeView&		src,
    532 											 const float*						texCoord,
    533 											 const ReferenceParams&				sampleParams,
    534 											 const tcu::TexComparePrecision&	comparePrec,
    535 											 const tcu::LodPrecision&			lodPrec,
    536 											 const tcu::Vec3&					nonShadowThreshold);
    537 
    538 int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
    539 											 const tcu::ConstPixelBufferAccess&	reference,
    540 											 const tcu::PixelBufferAccess&		errorMask,
    541 											 const tcu::Texture2DArrayView&		src,
    542 											 const float*						texCoord,
    543 											 const ReferenceParams&				sampleParams,
    544 											 const tcu::TexComparePrecision&	comparePrec,
    545 											 const tcu::LodPrecision&			lodPrec,
    546 											 const tcu::Vec3&					nonShadowThreshold);
    547 
    548 // Mipmap generation comparison.
    549 
    550 struct GenMipmapPrecision
    551 {
    552 	tcu::IVec3			filterBits;			//!< Bits in filtering parameters (fixed-point).
    553 	tcu::Vec4			colorThreshold;		//!< Threshold for color value comparison.
    554 	tcu::BVec4			colorMask;			//!< Color channel comparison mask.
    555 };
    556 
    557 qpTestResult	compareGenMipmapResult		(tcu::TestLog& log, const tcu::Texture2D& resultTexture, const tcu::Texture2D& level0Reference, const GenMipmapPrecision& precision);
    558 qpTestResult	compareGenMipmapResult		(tcu::TestLog& log, const tcu::TextureCube& resultTexture, const tcu::TextureCube& level0Reference, const GenMipmapPrecision& precision);
    559 
    560 // Utility for logging texture gradient ranges.
    561 struct LogGradientFmt
    562 {
    563 	LogGradientFmt (const tcu::Vec4* min_, const tcu::Vec4* max_) : valueMin(min_), valueMax(max_) {}
    564 	const tcu::Vec4* valueMin;
    565 	const tcu::Vec4* valueMax;
    566 };
    567 
    568 std::ostream&			operator<<		(std::ostream& str, const LogGradientFmt& fmt);
    569 inline LogGradientFmt	formatGradient	(const tcu::Vec4* minVal, const tcu::Vec4* maxVal) { return LogGradientFmt(minVal, maxVal); }
    570 
    571 } // TextureTestUtil
    572 } // gls
    573 } // deqp
    574 
    575 #endif // _GLSTEXTURETESTUTIL_HPP
    576