1#ifndef _GLUTEXTURETESTUTIL_HPP
2#define _GLUTEXTURETESTUTIL_HPP
3/*-------------------------------------------------------------------------
4 * drawElements Quality Program OpenGL ES Utilities
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 Utility functions and structures for texture tests.
24 *
25 * This code is originated from the modules/glshared/glsTextureTestUtil.hpp
26 * and it is tightly coupled with the GLES and Vulkan texture tests!
27 *
28 * About coordinates:
29 *  + Quads consist of 2 triangles, rendered using explicit indices.
30 *  + All TextureTestUtil functions and classes expect texture coordinates
31 *    for quads to be specified in order (-1, -1), (-1, 1), (1, -1), (1, 1).
32 *//*--------------------------------------------------------------------*/
33
34#include "tcuDefs.hpp"
35#include "tcuSurfaceAccess.hpp"
36#include "tcuTestContext.hpp"
37#include "tcuTestLog.hpp"
38#include "tcuTexture.hpp"
39#include "tcuTexCompareVerifier.hpp"
40#include "qpWatchDog.h"
41
42namespace glu
43{
44namespace TextureTestUtil
45{
46enum TextureType
47{
48	TEXTURETYPE_2D = 0,
49	TEXTURETYPE_CUBE,
50	TEXTURETYPE_2D_ARRAY,
51	TEXTURETYPE_3D,
52	TEXTURETYPE_CUBE_ARRAY,
53	TEXTURETYPE_1D,
54	TEXTURETYPE_1D_ARRAY,
55	TEXTURETYPE_BUFFER,
56
57	TEXTURETYPE_LAST
58};
59
60enum SamplerType
61{
62	SAMPLERTYPE_FLOAT,
63	SAMPLERTYPE_INT,
64	SAMPLERTYPE_UINT,
65	SAMPLERTYPE_SHADOW,
66
67	SAMPLERTYPE_FETCH_FLOAT,
68	SAMPLERTYPE_FETCH_INT,
69	SAMPLERTYPE_FETCH_UINT,
70
71	SAMPLERTYPE_LAST
72};
73
74struct RenderParams
75{
76	enum Flags
77	{
78		PROJECTED		= (1<<0),
79		USE_BIAS		= (1<<1),
80		LOG_PROGRAMS	= (1<<2),
81		LOG_UNIFORMS	= (1<<3),
82
83		LOG_ALL			= LOG_PROGRAMS|LOG_UNIFORMS
84	};
85
86	RenderParams (TextureType texType_)
87		: texType		(texType_)
88		, samplerType	(SAMPLERTYPE_FLOAT)
89		, flags			(0)
90		, w				(1.0f)
91		, bias			(0.0f)
92		, ref			(0.0f)
93		, colorScale	(1.0f)
94		, colorBias		(0.0f)
95	{
96	}
97
98	TextureType		texType;		//!< Texture type.
99	SamplerType		samplerType;	//!< Sampler type.
100	deUint32		flags;			//!< Feature flags.
101	tcu::Vec4		w;				//!< w coordinates for quad vertices.
102	float			bias;			//!< User-supplied bias.
103	float			ref;			//!< Reference value for shadow lookups.
104
105	// color = lookup() * scale + bias
106	tcu::Vec4		colorScale;		//!< Scale for texture color values.
107	tcu::Vec4		colorBias;		//!< Bias for texture color values.
108};
109
110enum LodMode
111{
112	LODMODE_EXACT = 0,		//!< Ideal lod computation.
113	LODMODE_MIN_BOUND,		//!< Use estimation range minimum bound.
114	LODMODE_MAX_BOUND,		//!< Use estimation range maximum bound.
115
116	LODMODE_LAST
117};
118
119struct ReferenceParams : public RenderParams
120{
121	ReferenceParams (TextureType texType_)
122		: RenderParams			(texType_)
123		, sampler				()
124		, lodMode				(LODMODE_EXACT)
125		, minLod				(-1000.0f)
126		, maxLod				(1000.0f)
127		, baseLevel				(0)
128		, maxLevel				(1000)
129		, unnormal				(false)
130		, float16TexCoord		(false)
131		, imageViewMinLod		(0.0f)
132		, imageViewMinLodMode	(tcu::IMAGEVIEWMINLODMODE_PREFERRED)
133		, lodTexelFetch			(0)
134	{
135	}
136
137	ReferenceParams (TextureType texType_, const tcu::Sampler& sampler_, LodMode lodMode_ = LODMODE_EXACT)
138		: RenderParams			(texType_)
139		, sampler				(sampler_)
140		, lodMode				(lodMode_)
141		, minLod				(-1000.0f)
142		, maxLod				(1000.0f)
143		, baseLevel				(0)
144		, maxLevel				(1000)
145		, unnormal				(false)
146		, float16TexCoord		(false)
147		, imageViewMinLod		(0.0f)
148		, imageViewMinLodMode	(tcu::IMAGEVIEWMINLODMODE_PREFERRED)
149		, lodTexelFetch			(0)
150	{
151	}
152
153	tcu::Sampler				sampler;
154	LodMode						lodMode;
155	float						minLod;
156	float						maxLod;
157	int							baseLevel;
158	int							maxLevel;
159	bool						unnormal;
160	bool						float16TexCoord;
161	float						imageViewMinLod;
162	tcu::ImageViewMinLodMode	imageViewMinLodMode;
163	int							lodTexelFetch;
164};
165
166
167SamplerType		getSamplerType		(tcu::TextureFormat format);
168SamplerType		getFetchSamplerType	(tcu::TextureFormat format);
169
170// Similar to sampleTexture() except uses texelFetch.
171void			fetchTexture				(const tcu::SurfaceAccess& dst, const tcu::ConstPixelBufferAccess& src, const float* texCoord, const tcu::Vec4& colorScale, const tcu::Vec4& colorBias);
172
173void			sampleTexture				(const tcu::PixelBufferAccess& dst, const tcu::Texture2DView&	src, const float* texCoord, const ReferenceParams& params);
174
175void			sampleTexture				(const tcu::SurfaceAccess& dst, const tcu::Texture2DView&		src, const float* texCoord, const ReferenceParams& params);
176void			sampleTexture				(const tcu::SurfaceAccess& dst, const tcu::TextureCubeView&		src, const float* texCoord, const ReferenceParams& params);
177void			sampleTexture				(const tcu::SurfaceAccess& dst, const tcu::Texture2DArrayView&	src, const float* texCoord, const ReferenceParams& params);
178void			sampleTexture				(const tcu::SurfaceAccess& dst, const tcu::Texture3DView&		src, const float* texCoord, const ReferenceParams& params);
179void			sampleTexture				(const tcu::SurfaceAccess& dst, const tcu::TextureCubeArrayView&	src, const float* texCoord, const ReferenceParams& params);
180void			sampleTexture				(const tcu::SurfaceAccess& dst, const tcu::Texture1DView&		src, const float* texCoord, const ReferenceParams& params);
181void			sampleTexture				(const tcu::SurfaceAccess& dst, const tcu::Texture1DArrayView&	src, const float* texCoord, const ReferenceParams& params);
182
183float			triangleInterpolate			(float v0, float v1, float v2, float x, float y);
184float			triangleInterpolate			(const tcu::Vec3& v, float x, float y);
185
186float			computeLodFromDerivates		(LodMode mode, float dudx, float dudy);
187float			computeLodFromDerivates		(LodMode mode, float dudx, float dvdx, float dudy, float dvdy);
188float			computeLodFromDerivates		(LodMode mode, float dudx, float dvdx, float dwdx, float dudy, float dvdy, float dwdy);
189
190float			computeNonProjectedTriLod	(LodMode mode, const tcu::IVec2& dstSize, deInt32 srcSize, const tcu::Vec3& sq);
191float			computeNonProjectedTriLod	(LodMode mode, const tcu::IVec2& dstSize, const tcu::IVec2& srcSize, const tcu::Vec3& sq, const tcu::Vec3& tq);
192float			computeNonProjectedTriLod	(LodMode mode, const tcu::IVec2& dstSize, const tcu::IVec3& srcSize, const tcu::Vec3& sq, const tcu::Vec3& tq, const tcu::Vec3& rq);
193
194void			computeQuadTexCoord1D			(std::vector<float>& dst, float left, float right);
195void			computeQuadTexCoord1DArray		(std::vector<float>& dst, int layerNdx, float left, float right);
196void			computeQuadTexCoord2D			(std::vector<float>& dst, const tcu::Vec2& bottomLeft, const tcu::Vec2& topRight);
197void			computeQuadTexCoord2D			(std::vector<float>& dst, const tcu::IVec2& bottomLeft, const tcu::IVec2& topRight);
198void			computeQuadTexCoord2DArray		(std::vector<float>& dst, int layerNdx, const tcu::Vec2& bottomLeft, const tcu::Vec2& topRight);
199void			computeQuadTexCoord3D			(std::vector<float>& dst, const tcu::Vec3& p0, const tcu::Vec3& p1, const tcu::IVec3& dirSwz);
200void			computeQuadTexCoordCube			(std::vector<float>& dst, tcu::CubeFace face);
201void			computeQuadTexCoordCube			(std::vector<float>& dst, tcu::CubeFace face, const tcu::Vec2& bottomLeft, const tcu::Vec2& topRight);
202void			computeQuadTexCoordCubeArray	(std::vector<float>& dst, tcu::CubeFace face, const tcu::Vec2& bottomLeft, const tcu::Vec2& topRight, const tcu::Vec2& layerRange);
203
204bool			compareImages				(tcu::TestLog& log, const char* name, const char* desc, const tcu::Surface& reference, const tcu::Surface& rendered, tcu::RGBA threshold);
205bool			compareImages				(tcu::TestLog& log, const tcu::Surface& reference, const tcu::Surface& rendered, tcu::RGBA threshold);
206int				measureAccuracy				(tcu::TestLog& log, const tcu::Surface& reference, const tcu::Surface& rendered, int bestScoreDiff, int worstScoreDiff);
207
208int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
209											 const tcu::ConstPixelBufferAccess&	reference,
210											 const tcu::PixelBufferAccess&		errorMask,
211											 const tcu::Texture1DView&			src,
212											 const float*						texCoord,
213											 const ReferenceParams&				sampleParams,
214											 const tcu::LookupPrecision&		lookupPrec,
215											 const tcu::LodPrecision&			lodPrec,
216											 qpWatchDog*						watchDog);
217
218int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
219											 const tcu::ConstPixelBufferAccess&	reference,
220											 const tcu::PixelBufferAccess&		errorMask,
221											 const tcu::Texture2DView&			src,
222											 const float*						texCoord,
223											 const ReferenceParams&				sampleParams,
224											 const tcu::LookupPrecision&		lookupPrec,
225											 const tcu::LodPrecision&			lodPrec,
226											 qpWatchDog*						watchDog);
227
228int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
229											 const tcu::ConstPixelBufferAccess&	reference,
230											 const tcu::PixelBufferAccess&		errorMask,
231											 const tcu::TextureCubeView&		src,
232											 const float*						texCoord,
233											 const ReferenceParams&				sampleParams,
234											 const tcu::LookupPrecision&		lookupPrec,
235											 const tcu::LodPrecision&			lodPrec,
236											 qpWatchDog*						watchDog);
237
238int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
239											 const tcu::ConstPixelBufferAccess&	reference,
240											 const tcu::PixelBufferAccess&		errorMask,
241											 const tcu::Texture1DArrayView&		src,
242											 const float*						texCoord,
243											 const ReferenceParams&				sampleParams,
244											 const tcu::LookupPrecision&		lookupPrec,
245											 const tcu::LodPrecision&			lodPrec,
246											 qpWatchDog*						watchDog);
247
248int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
249											 const tcu::ConstPixelBufferAccess&	reference,
250											 const tcu::PixelBufferAccess&		errorMask,
251											 const tcu::Texture2DArrayView&		src,
252											 const float*						texCoord,
253											 const ReferenceParams&				sampleParams,
254											 const tcu::LookupPrecision&		lookupPrec,
255											 const tcu::LodPrecision&			lodPrec,
256											 qpWatchDog*						watchDog);
257
258int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
259											 const tcu::ConstPixelBufferAccess&	reference,
260											 const tcu::PixelBufferAccess&		errorMask,
261											 const tcu::Texture3DView&			src,
262											 const float*						texCoord,
263											 const ReferenceParams&				sampleParams,
264											 const tcu::LookupPrecision&		lookupPrec,
265											 const tcu::LodPrecision&			lodPrec,
266											 qpWatchDog*						watchDog);
267
268int				computeTextureLookupDiff	(const tcu::ConstPixelBufferAccess&	result,
269											 const tcu::ConstPixelBufferAccess&	reference,
270											 const tcu::PixelBufferAccess&		errorMask,
271											 const tcu::TextureCubeArrayView&	src,
272											 const float*						texCoord,
273											 const ReferenceParams&				sampleParams,
274											 const tcu::LookupPrecision&		lookupPrec,
275											 const tcu::IVec4&					coordBits,
276											 const tcu::LodPrecision&			lodPrec,
277											 qpWatchDog*						watchDog);
278
279bool			verifyTextureResult			(tcu::TestContext&					testCtx,
280											 const tcu::ConstPixelBufferAccess&	result,
281											 const tcu::Texture1DView&			src,
282											 const float*						texCoord,
283											 const ReferenceParams&				sampleParams,
284											 const tcu::LookupPrecision&		lookupPrec,
285											 const tcu::LodPrecision&			lodPrec,
286											 const tcu::PixelFormat&			pixelFormat);
287
288bool			verifyTextureResult			(tcu::TestContext&					testCtx,
289											 const tcu::ConstPixelBufferAccess&	result,
290											 const tcu::Texture2DView&			src,
291											 const float*						texCoord,
292											 const ReferenceParams&				sampleParams,
293											 const tcu::LookupPrecision&		lookupPrec,
294											 const tcu::LodPrecision&			lodPrec,
295											 const tcu::PixelFormat&			pixelFormat);
296
297bool			verifyTextureResult			(tcu::TestContext&					testCtx,
298											 const tcu::ConstPixelBufferAccess&	result,
299											 const tcu::TextureCubeView&		src,
300											 const float*						texCoord,
301											 const ReferenceParams&				sampleParams,
302											 const tcu::LookupPrecision&		lookupPrec,
303											 const tcu::LodPrecision&			lodPrec,
304											 const tcu::PixelFormat&			pixelFormat);
305
306bool			verifyTextureResult			(tcu::TestContext&					testCtx,
307											 const tcu::ConstPixelBufferAccess&	result,
308											 const tcu::Texture1DArrayView&		src,
309											 const float*						texCoord,
310											 const ReferenceParams&				sampleParams,
311											 const tcu::LookupPrecision&		lookupPrec,
312											 const tcu::LodPrecision&			lodPrec,
313											 const tcu::PixelFormat&			pixelFormat);
314
315bool			verifyTextureResult			(tcu::TestContext&					testCtx,
316											 const tcu::ConstPixelBufferAccess&	result,
317											 const tcu::Texture2DArrayView&		src,
318											 const float*						texCoord,
319											 const ReferenceParams&				sampleParams,
320											 const tcu::LookupPrecision&		lookupPrec,
321											 const tcu::LodPrecision&			lodPrec,
322											 const tcu::PixelFormat&			pixelFormat);
323
324bool			verifyTextureResult			(tcu::TestContext&					testCtx,
325											 const tcu::ConstPixelBufferAccess&	result,
326											 const tcu::Texture3DView&			src,
327											 const float*						texCoord,
328											 const ReferenceParams&				sampleParams,
329											 const tcu::LookupPrecision&		lookupPrec,
330											 const tcu::LodPrecision&			lodPrec,
331											 const tcu::PixelFormat&			pixelFormat);
332
333bool			verifyTextureResult			(tcu::TestContext&					testCtx,
334											 const tcu::ConstPixelBufferAccess&	result,
335											 const tcu::TextureCubeArrayView&	src,
336											 const float*						texCoord,
337											 const ReferenceParams&				sampleParams,
338											 const tcu::LookupPrecision&		lookupPrec,
339											 const tcu::IVec4&					coordBits,
340											 const tcu::LodPrecision&			lodPrec,
341											 const tcu::PixelFormat&			pixelFormat);
342
343int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
344											 const tcu::ConstPixelBufferAccess&	reference,
345											 const tcu::PixelBufferAccess&		errorMask,
346											 const tcu::Texture2DView&			src,
347											 const float*						texCoord,
348											 const ReferenceParams&				sampleParams,
349											 const tcu::TexComparePrecision&	comparePrec,
350											 const tcu::LodPrecision&			lodPrec,
351											 const tcu::Vec3&					nonShadowThreshold);
352
353int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
354											 const tcu::ConstPixelBufferAccess&	reference,
355											 const tcu::PixelBufferAccess&		errorMask,
356											 const tcu::TextureCubeView&		src,
357											 const float*						texCoord,
358											 const ReferenceParams&				sampleParams,
359											 const tcu::TexComparePrecision&	comparePrec,
360											 const tcu::LodPrecision&			lodPrec,
361											 const tcu::Vec3&					nonShadowThreshold);
362
363int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
364											 const tcu::ConstPixelBufferAccess&	reference,
365											 const tcu::PixelBufferAccess&		errorMask,
366											 const tcu::Texture2DArrayView&		src,
367											 const float*						texCoord,
368											 const ReferenceParams&				sampleParams,
369											 const tcu::TexComparePrecision&	comparePrec,
370											 const tcu::LodPrecision&			lodPrec,
371											 const tcu::Vec3&					nonShadowThreshold);
372
373int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
374											 const tcu::ConstPixelBufferAccess&	reference,
375											 const tcu::PixelBufferAccess&		errorMask,
376											 const tcu::Texture1DView&			src,
377											 const float*						texCoord,
378											 const ReferenceParams&				sampleParams,
379											 const tcu::TexComparePrecision&	comparePrec,
380											 const tcu::LodPrecision&			lodPrec,
381											 const tcu::Vec3&					nonShadowThreshold);
382
383int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
384											 const tcu::ConstPixelBufferAccess&	reference,
385											 const tcu::PixelBufferAccess&		errorMask,
386											 const tcu::Texture1DArrayView&		src,
387											 const float*						texCoord,
388											 const ReferenceParams&				sampleParams,
389											 const tcu::TexComparePrecision&	comparePrec,
390											 const tcu::LodPrecision&			lodPrec,
391											 const tcu::Vec3&					nonShadowThreshold);
392
393int				computeTextureCompareDiff	(const tcu::ConstPixelBufferAccess&	result,
394											 const tcu::ConstPixelBufferAccess&	reference,
395											 const tcu::PixelBufferAccess&		errorMask,
396											 const tcu::TextureCubeArrayView&	src,
397											 const float*						texCoord,
398											 const ReferenceParams&				sampleParams,
399											 const tcu::TexComparePrecision&	comparePrec,
400											 const tcu::LodPrecision&			lodPrec,
401											 const tcu::Vec3&					nonShadowThreshold);
402
403inline tcu::IVec4 getBitsVec (const tcu::PixelFormat& format)
404{
405	return tcu::IVec4(format.redBits, format.greenBits, format.blueBits, format.alphaBits);
406}
407
408inline tcu::BVec4 getCompareMask (const tcu::PixelFormat& format)
409{
410	return tcu::BVec4(format.redBits	> 0,
411					  format.greenBits	> 0,
412					  format.blueBits	> 0,
413					  format.alphaBits	> 0);
414}
415
416
417// Mipmap generation comparison.
418
419struct GenMipmapPrecision
420{
421	tcu::IVec3			filterBits;			//!< Bits in filtering parameters (fixed-point).
422	tcu::Vec4			colorThreshold;		//!< Threshold for color value comparison.
423	tcu::BVec4			colorMask;			//!< Color channel comparison mask.
424};
425
426qpTestResult	compareGenMipmapResult		(tcu::TestLog& log, const tcu::Texture2D& resultTexture, const tcu::Texture2D& level0Reference, const GenMipmapPrecision& precision);
427qpTestResult	compareGenMipmapResult		(tcu::TestLog& log, const tcu::TextureCube& resultTexture, const tcu::TextureCube& level0Reference, const GenMipmapPrecision& precision);
428
429// Utility for logging texture gradient ranges.
430struct LogGradientFmt
431{
432	LogGradientFmt (const tcu::Vec4* min_, const tcu::Vec4* max_) : valueMin(min_), valueMax(max_) {}
433	const tcu::Vec4* valueMin;
434	const tcu::Vec4* valueMax;
435};
436
437std::ostream&			operator<<		(std::ostream& str, const LogGradientFmt& fmt);
438inline LogGradientFmt	formatGradient	(const tcu::Vec4* minVal, const tcu::Vec4* maxVal) { return LogGradientFmt(minVal, maxVal); }
439
440} // TextureTestUtil
441} // glu
442
443#endif // _GLUTEXTURETESTUTIL_HPP
444