xref: /aosp_15_r20/external/deqp/framework/opengl/gluTextureTestUtil.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 &params);
175 
176 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture2DView &src, const float *texCoord,
177                    const ReferenceParams &params);
178 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::TextureCubeView &src, const float *texCoord,
179                    const ReferenceParams &params);
180 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture2DArrayView &src, const float *texCoord,
181                    const ReferenceParams &params);
182 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture3DView &src, const float *texCoord,
183                    const ReferenceParams &params);
184 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::TextureCubeArrayView &src, const float *texCoord,
185                    const ReferenceParams &params);
186 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture1DView &src, const float *texCoord,
187                    const ReferenceParams &params);
188 void sampleTexture(const tcu::SurfaceAccess &dst, const tcu::Texture1DArrayView &src, const float *texCoord,
189                    const ReferenceParams &params);
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