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
42 namespace glu
43 {
44 namespace TextureTestUtil
45 {
46 enum 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
60 enum 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
74 struct 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
RenderParamsglu::TextureTestUtil::RenderParams86 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 uint32_t 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
110 enum 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
119 struct ReferenceParams : public RenderParams
120 {
ReferenceParamsglu::TextureTestUtil::ReferenceParams121 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
ReferenceParamsglu::TextureTestUtil::ReferenceParams137 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 SamplerType getSamplerType(tcu::TextureFormat format);
167 SamplerType getFetchSamplerType(tcu::TextureFormat format);
168
169 // Similar to sampleTexture() except uses texelFetch.
170 void fetchTexture(const tcu::SurfaceAccess &dst, const tcu::ConstPixelBufferAccess &src, const float *texCoord,
171 const tcu::Vec4 &colorScale, const tcu::Vec4 &colorBias);
172
173 void sampleTexture(const tcu::PixelBufferAccess &dst, const tcu::Texture2DView &src, const float *texCoord,
174 const ReferenceParams ¶ms);
175
176 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture2DView &src, const float *texCoord,
177 const ReferenceParams ¶ms);
178 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::TextureCubeView &src, const float *texCoord,
179 const ReferenceParams ¶ms);
180 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture2DArrayView &src, const float *texCoord,
181 const ReferenceParams ¶ms);
182 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture3DView &src, const float *texCoord,
183 const ReferenceParams ¶ms);
184 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::TextureCubeArrayView &src, const float *texCoord,
185 const ReferenceParams ¶ms);
186 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture1DView &src, const float *texCoord,
187 const ReferenceParams ¶ms);
188 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture1DArrayView &src, const float *texCoord,
189 const ReferenceParams ¶ms);
190
191 float triangleInterpolate(float v0, float v1, float v2, float x, float y);
192 float triangleInterpolate(const tcu::Vec3 &v, float x, float y);
193
194 float computeLodFromDerivates(LodMode mode, float dudx, float dudy);
195 float computeLodFromDerivates(LodMode mode, float dudx, float dvdx, float dudy, float dvdy);
196 float computeLodFromDerivates(LodMode mode, float dudx, float dvdx, float dwdx, float dudy, float dvdy, float dwdy);
197
198 float computeNonProjectedTriLod(LodMode mode, const tcu::IVec2 &dstSize, int32_t srcSize, const tcu::Vec3 &sq);
199 float computeNonProjectedTriLod(LodMode mode, const tcu::IVec2 &dstSize, const tcu::IVec2 &srcSize, const tcu::Vec3 &sq,
200 const tcu::Vec3 &tq);
201 float computeNonProjectedTriLod(LodMode mode, const tcu::IVec2 &dstSize, const tcu::IVec3 &srcSize, const tcu::Vec3 &sq,
202 const tcu::Vec3 &tq, const tcu::Vec3 &rq);
203
204 void computeQuadTexCoord1D(std::vector<float> &dst, float left, float right);
205 void computeQuadTexCoord1DArray(std::vector<float> &dst, int layerNdx, float left, float right);
206 void computeQuadTexCoord2D(std::vector<float> &dst, const tcu::Vec2 &bottomLeft, const tcu::Vec2 &topRight);
207 void computeQuadTexCoord2D(std::vector<float> &dst, const tcu::IVec2 &bottomLeft, const tcu::IVec2 &topRight);
208 void computeQuadTexCoord2DArray(std::vector<float> &dst, int layerNdx, const tcu::Vec2 &bottomLeft,
209 const tcu::Vec2 &topRight);
210 void computeQuadTexCoord3D(std::vector<float> &dst, const tcu::Vec3 &p0, const tcu::Vec3 &p1, const tcu::IVec3 &dirSwz);
211 void computeQuadTexCoordCube(std::vector<float> &dst, tcu::CubeFace face);
212 void computeQuadTexCoordCube(std::vector<float> &dst, tcu::CubeFace face, const tcu::Vec2 &bottomLeft,
213 const tcu::Vec2 &topRight);
214 void computeQuadTexCoordCubeArray(std::vector<float> &dst, tcu::CubeFace face, const tcu::Vec2 &bottomLeft,
215 const tcu::Vec2 &topRight, const tcu::Vec2 &layerRange);
216
217 bool compareImages(tcu::TestLog &log, const char *name, const char *desc, const tcu::Surface &reference,
218 const tcu::Surface &rendered, tcu::RGBA threshold);
219 bool compareImages(tcu::TestLog &log, const tcu::Surface &reference, const tcu::Surface &rendered, tcu::RGBA threshold);
220 int measureAccuracy(tcu::TestLog &log, const tcu::Surface &reference, const tcu::Surface &rendered, int bestScoreDiff,
221 int worstScoreDiff);
222
223 int computeTextureLookupDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
224 const tcu::PixelBufferAccess &errorMask, const tcu::Texture1DView &src,
225 const float *texCoord, const ReferenceParams &sampleParams,
226 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
227 qpWatchDog *watchDog);
228
229 int computeTextureLookupDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
230 const tcu::PixelBufferAccess &errorMask, const tcu::Texture2DView &src,
231 const float *texCoord, const ReferenceParams &sampleParams,
232 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
233 qpWatchDog *watchDog);
234
235 int computeTextureLookupDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
236 const tcu::PixelBufferAccess &errorMask, const tcu::TextureCubeView &src,
237 const float *texCoord, const ReferenceParams &sampleParams,
238 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
239 qpWatchDog *watchDog);
240
241 int computeTextureLookupDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
242 const tcu::PixelBufferAccess &errorMask, const tcu::Texture1DArrayView &src,
243 const float *texCoord, const ReferenceParams &sampleParams,
244 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
245 qpWatchDog *watchDog);
246
247 int computeTextureLookupDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
248 const tcu::PixelBufferAccess &errorMask, const tcu::Texture2DArrayView &src,
249 const float *texCoord, const ReferenceParams &sampleParams,
250 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
251 qpWatchDog *watchDog);
252
253 int computeTextureLookupDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
254 const tcu::PixelBufferAccess &errorMask, const tcu::Texture3DView &src,
255 const float *texCoord, const ReferenceParams &sampleParams,
256 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
257 qpWatchDog *watchDog);
258
259 int computeTextureLookupDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
260 const tcu::PixelBufferAccess &errorMask, const tcu::TextureCubeArrayView &src,
261 const float *texCoord, const ReferenceParams &sampleParams,
262 const tcu::LookupPrecision &lookupPrec, const tcu::IVec4 &coordBits,
263 const tcu::LodPrecision &lodPrec, qpWatchDog *watchDog);
264
265 bool verifyTextureResult(tcu::TestContext &testCtx, const tcu::ConstPixelBufferAccess &result,
266 const tcu::Texture1DView &src, const float *texCoord, const ReferenceParams &sampleParams,
267 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
268 const tcu::PixelFormat &pixelFormat);
269
270 bool verifyTextureResult(tcu::TestContext &testCtx, const tcu::ConstPixelBufferAccess &result,
271 const tcu::Texture2DView &src, const float *texCoord, const ReferenceParams &sampleParams,
272 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
273 const tcu::PixelFormat &pixelFormat);
274
275 bool verifyTextureResult(tcu::TestContext &testCtx, const tcu::ConstPixelBufferAccess &result,
276 const tcu::TextureCubeView &src, const float *texCoord, const ReferenceParams &sampleParams,
277 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
278 const tcu::PixelFormat &pixelFormat);
279
280 bool verifyTextureResult(tcu::TestContext &testCtx, const tcu::ConstPixelBufferAccess &result,
281 const tcu::Texture1DArrayView &src, const float *texCoord, const ReferenceParams &sampleParams,
282 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
283 const tcu::PixelFormat &pixelFormat);
284
285 bool verifyTextureResult(tcu::TestContext &testCtx, const tcu::ConstPixelBufferAccess &result,
286 const tcu::Texture2DArrayView &src, const float *texCoord, const ReferenceParams &sampleParams,
287 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
288 const tcu::PixelFormat &pixelFormat);
289
290 bool verifyTextureResult(tcu::TestContext &testCtx, const tcu::ConstPixelBufferAccess &result,
291 const tcu::Texture3DView &src, const float *texCoord, const ReferenceParams &sampleParams,
292 const tcu::LookupPrecision &lookupPrec, const tcu::LodPrecision &lodPrec,
293 const tcu::PixelFormat &pixelFormat);
294
295 bool verifyTextureResult(tcu::TestContext &testCtx, const tcu::ConstPixelBufferAccess &result,
296 const tcu::TextureCubeArrayView &src, const float *texCoord,
297 const ReferenceParams &sampleParams, const tcu::LookupPrecision &lookupPrec,
298 const tcu::IVec4 &coordBits, const tcu::LodPrecision &lodPrec,
299 const tcu::PixelFormat &pixelFormat);
300
301 int computeTextureCompareDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
302 const tcu::PixelBufferAccess &errorMask, const tcu::Texture2DView &src,
303 const float *texCoord, const ReferenceParams &sampleParams,
304 const tcu::TexComparePrecision &comparePrec, const tcu::LodPrecision &lodPrec,
305 const tcu::Vec3 &nonShadowThreshold);
306
307 int computeTextureCompareDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
308 const tcu::PixelBufferAccess &errorMask, const tcu::TextureCubeView &src,
309 const float *texCoord, const ReferenceParams &sampleParams,
310 const tcu::TexComparePrecision &comparePrec, const tcu::LodPrecision &lodPrec,
311 const tcu::Vec3 &nonShadowThreshold);
312
313 int computeTextureCompareDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
314 const tcu::PixelBufferAccess &errorMask, const tcu::Texture2DArrayView &src,
315 const float *texCoord, const ReferenceParams &sampleParams,
316 const tcu::TexComparePrecision &comparePrec, const tcu::LodPrecision &lodPrec,
317 const tcu::Vec3 &nonShadowThreshold);
318
319 int computeTextureCompareDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
320 const tcu::PixelBufferAccess &errorMask, const tcu::Texture1DView &src,
321 const float *texCoord, const ReferenceParams &sampleParams,
322 const tcu::TexComparePrecision &comparePrec, const tcu::LodPrecision &lodPrec,
323 const tcu::Vec3 &nonShadowThreshold);
324
325 int computeTextureCompareDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
326 const tcu::PixelBufferAccess &errorMask, const tcu::Texture1DArrayView &src,
327 const float *texCoord, const ReferenceParams &sampleParams,
328 const tcu::TexComparePrecision &comparePrec, const tcu::LodPrecision &lodPrec,
329 const tcu::Vec3 &nonShadowThreshold);
330
331 int computeTextureCompareDiff(const tcu::ConstPixelBufferAccess &result, const tcu::ConstPixelBufferAccess &reference,
332 const tcu::PixelBufferAccess &errorMask, const tcu::TextureCubeArrayView &src,
333 const float *texCoord, const ReferenceParams &sampleParams,
334 const tcu::TexComparePrecision &comparePrec, const tcu::LodPrecision &lodPrec,
335 const tcu::Vec3 &nonShadowThreshold);
336
getBitsVec(const tcu::PixelFormat & format)337 inline tcu::IVec4 getBitsVec(const tcu::PixelFormat &format)
338 {
339 return tcu::IVec4(format.redBits, format.greenBits, format.blueBits, format.alphaBits);
340 }
341
getCompareMask(const tcu::PixelFormat & format)342 inline tcu::BVec4 getCompareMask(const tcu::PixelFormat &format)
343 {
344 return tcu::BVec4(format.redBits > 0, format.greenBits > 0, format.blueBits > 0, format.alphaBits > 0);
345 }
346
347 // Mipmap generation comparison.
348
349 struct GenMipmapPrecision
350 {
351 tcu::IVec3 filterBits; //!< Bits in filtering parameters (fixed-point).
352 tcu::Vec4 colorThreshold; //!< Threshold for color value comparison.
353 tcu::BVec4 colorMask; //!< Color channel comparison mask.
354 };
355
356 qpTestResult compareGenMipmapResult(tcu::TestLog &log, const tcu::Texture2D &resultTexture,
357 const tcu::Texture2D &level0Reference, const GenMipmapPrecision &precision);
358 qpTestResult compareGenMipmapResult(tcu::TestLog &log, const tcu::TextureCube &resultTexture,
359 const tcu::TextureCube &level0Reference, const GenMipmapPrecision &precision);
360
361 // Utility for logging texture gradient ranges.
362 struct LogGradientFmt
363 {
LogGradientFmtglu::TextureTestUtil::LogGradientFmt364 LogGradientFmt(const tcu::Vec4 *min_, const tcu::Vec4 *max_) : valueMin(min_), valueMax(max_)
365 {
366 }
367 const tcu::Vec4 *valueMin;
368 const tcu::Vec4 *valueMax;
369 };
370
371 std::ostream &operator<<(std::ostream &str, const LogGradientFmt &fmt);
formatGradient(const tcu::Vec4 * minVal,const tcu::Vec4 * maxVal)372 inline LogGradientFmt formatGradient(const tcu::Vec4 *minVal, const tcu::Vec4 *maxVal)
373 {
374 return LogGradientFmt(minVal, maxVal);
375 }
376
377 } // namespace TextureTestUtil
378 } // namespace glu
379
380 #endif // _GLUTEXTURETESTUTIL_HPP
381