xref: /aosp_15_r20/external/deqp/framework/common/tcuTextureUtil.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _TCUTEXTUREUTIL_HPP
2*35238bceSAndroid Build Coastguard Worker #define _TCUTEXTUREUTIL_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program Tester Core
5*35238bceSAndroid Build Coastguard Worker  * ----------------------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief Texture utilities.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuTexture.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker namespace tcu
30*35238bceSAndroid Build Coastguard Worker {
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker // PixelBufferAccess utilities.
33*35238bceSAndroid Build Coastguard Worker PixelBufferAccess getSubregion(const PixelBufferAccess &access, int x, int y, int z, int width, int height, int depth);
34*35238bceSAndroid Build Coastguard Worker ConstPixelBufferAccess getSubregion(const ConstPixelBufferAccess &access, int x, int y, int z, int width, int height,
35*35238bceSAndroid Build Coastguard Worker                                     int depth);
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker PixelBufferAccess getSubregion(const PixelBufferAccess &access, int x, int y, int width, int height);
38*35238bceSAndroid Build Coastguard Worker ConstPixelBufferAccess getSubregion(const ConstPixelBufferAccess &access, int x, int y, int width, int height);
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker PixelBufferAccess flipYAccess(const PixelBufferAccess &access);
41*35238bceSAndroid Build Coastguard Worker ConstPixelBufferAccess flipYAccess(const ConstPixelBufferAccess &access);
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker bool isCombinedDepthStencilType(TextureFormat::ChannelType type);
44*35238bceSAndroid Build Coastguard Worker bool hasStencilComponent(TextureFormat::ChannelOrder order);
45*35238bceSAndroid Build Coastguard Worker bool hasDepthComponent(TextureFormat::ChannelOrder order);
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker // sRGB - linear conversion.
48*35238bceSAndroid Build Coastguard Worker float linearChannelToSRGB(float cl);
49*35238bceSAndroid Build Coastguard Worker float sRGBChannelToLinear(float cl);
50*35238bceSAndroid Build Coastguard Worker Vec4 sRGBToLinear(const Vec4 &cs);
51*35238bceSAndroid Build Coastguard Worker Vec4 sRGB8ToLinear(const UVec4 &cs);
52*35238bceSAndroid Build Coastguard Worker Vec4 sRGBA8ToLinear(const UVec4 &cs);
53*35238bceSAndroid Build Coastguard Worker Vec4 linearToSRGB(const Vec4 &cl);
54*35238bceSAndroid Build Coastguard Worker bool isSRGB(TextureFormat format);
55*35238bceSAndroid Build Coastguard Worker 
56*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
57*35238bceSAndroid Build Coastguard Worker  * \brief Color channel storage type
58*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
59*35238bceSAndroid Build Coastguard Worker enum TextureChannelClass
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker     TEXTURECHANNELCLASS_SIGNED_FIXED_POINT = 0,
62*35238bceSAndroid Build Coastguard Worker     TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT,
63*35238bceSAndroid Build Coastguard Worker     TEXTURECHANNELCLASS_SIGNED_INTEGER,
64*35238bceSAndroid Build Coastguard Worker     TEXTURECHANNELCLASS_UNSIGNED_INTEGER,
65*35238bceSAndroid Build Coastguard Worker     TEXTURECHANNELCLASS_FLOATING_POINT,
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker     TEXTURECHANNELCLASS_LAST
68*35238bceSAndroid Build Coastguard Worker };
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker TextureChannelClass getTextureChannelClass(TextureFormat::ChannelType channelType);
71*35238bceSAndroid Build Coastguard Worker 
72*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
73*35238bceSAndroid Build Coastguard Worker  * \brief Texture access type
74*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
75*35238bceSAndroid Build Coastguard Worker enum TextureAccessType
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker     TEXTUREACCESSTYPE_FLOAT = 0,    //!< Read (getPixel) or write as floating-point data
78*35238bceSAndroid Build Coastguard Worker     TEXTUREACCESSTYPE_SIGNED_INT,   //!< Read (getPixelInt) or write as signed integer data
79*35238bceSAndroid Build Coastguard Worker     TEXTUREACCESSTYPE_UNSIGNED_INT, //!< Read (getPixelUint) or write as unsigned integer data
80*35238bceSAndroid Build Coastguard Worker 
81*35238bceSAndroid Build Coastguard Worker     TEXTUREACCESSTYPE_LAST
82*35238bceSAndroid Build Coastguard Worker };
83*35238bceSAndroid Build Coastguard Worker 
84*35238bceSAndroid Build Coastguard Worker bool isAccessValid(TextureFormat format, TextureAccessType type);
85*35238bceSAndroid Build Coastguard Worker 
86*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
87*35238bceSAndroid Build Coastguard Worker  * \brief Standard parameters for texture format testing
88*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
89*35238bceSAndroid Build Coastguard Worker struct TextureFormatInfo
90*35238bceSAndroid Build Coastguard Worker {
91*35238bceSAndroid Build Coastguard Worker     Vec4 valueMin;
92*35238bceSAndroid Build Coastguard Worker     Vec4 valueMax;
93*35238bceSAndroid Build Coastguard Worker     Vec4 lookupScale;
94*35238bceSAndroid Build Coastguard Worker     Vec4 lookupBias;
95*35238bceSAndroid Build Coastguard Worker 
TextureFormatInfotcu::TextureFormatInfo96*35238bceSAndroid Build Coastguard Worker     TextureFormatInfo(const Vec4 &valueMin_, const Vec4 &valueMax_, const Vec4 &lookupScale_, const Vec4 &lookupBias_)
97*35238bceSAndroid Build Coastguard Worker         : valueMin(valueMin_)
98*35238bceSAndroid Build Coastguard Worker         , valueMax(valueMax_)
99*35238bceSAndroid Build Coastguard Worker         , lookupScale(lookupScale_)
100*35238bceSAndroid Build Coastguard Worker         , lookupBias(lookupBias_)
101*35238bceSAndroid Build Coastguard Worker     {
102*35238bceSAndroid Build Coastguard Worker     }
103*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker TextureFormatInfo getTextureFormatInfo(const TextureFormat &format);
106*35238bceSAndroid Build Coastguard Worker IVec4 getTextureFormatBitDepth(const TextureFormat &format);
107*35238bceSAndroid Build Coastguard Worker IVec4 getTextureFormatMantissaBitDepth(const TextureFormat &format);
108*35238bceSAndroid Build Coastguard Worker BVec4 getTextureFormatChannelMask(const TextureFormat &format);
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker IVec4 getFormatMinIntValue(const TextureFormat &format);
111*35238bceSAndroid Build Coastguard Worker IVec4 getFormatMaxIntValue(const TextureFormat &format);
112*35238bceSAndroid Build Coastguard Worker 
113*35238bceSAndroid Build Coastguard Worker UVec4 getFormatMaxUintValue(const TextureFormat &format);
114*35238bceSAndroid Build Coastguard Worker 
115*35238bceSAndroid Build Coastguard Worker // Texture fill.
116*35238bceSAndroid Build Coastguard Worker void clear(const PixelBufferAccess &access, const Vec4 &color);
117*35238bceSAndroid Build Coastguard Worker void clear(const PixelBufferAccess &access, const IVec4 &color);
118*35238bceSAndroid Build Coastguard Worker void clear(const PixelBufferAccess &access, const UVec4 &color);
119*35238bceSAndroid Build Coastguard Worker void clearDepth(const PixelBufferAccess &access, float depth);
120*35238bceSAndroid Build Coastguard Worker void clearStencil(const PixelBufferAccess &access, int stencil);
121*35238bceSAndroid Build Coastguard Worker void fillWithComponentGradients(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal);
122*35238bceSAndroid Build Coastguard Worker void fillWithComponentGradients2(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal);
123*35238bceSAndroid Build Coastguard Worker void fillWithComponentGradients3(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal);
124*35238bceSAndroid Build Coastguard Worker void fillWithGrid(const PixelBufferAccess &access, int cellSize, const Vec4 &colorA, const Vec4 &colorB);
125*35238bceSAndroid Build Coastguard Worker void fillWithRepeatableGradient(const PixelBufferAccess &access, const Vec4 &colorA, const Vec4 &colorB);
126*35238bceSAndroid Build Coastguard Worker void fillWithMetaballs(const PixelBufferAccess &access, int numMetaballs, uint32_t seed);
127*35238bceSAndroid Build Coastguard Worker void fillWithRGBAQuads(const PixelBufferAccess &access);
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker //! Copies contents of src to dst. If formats of dst and src are equal, a bit-exact copy is made.
130*35238bceSAndroid Build Coastguard Worker void copy(const PixelBufferAccess &dst, const ConstPixelBufferAccess &src, const bool clearUnused = true);
131*35238bceSAndroid Build Coastguard Worker 
132*35238bceSAndroid Build Coastguard Worker void scale(const PixelBufferAccess &dst, const ConstPixelBufferAccess &src, Sampler::FilterMode filter);
133*35238bceSAndroid Build Coastguard Worker 
134*35238bceSAndroid Build Coastguard Worker void estimatePixelValueRange(const ConstPixelBufferAccess &access, Vec4 &minVal, Vec4 &maxVal);
135*35238bceSAndroid Build Coastguard Worker void computePixelScaleBias(const ConstPixelBufferAccess &access, Vec4 &scale, Vec4 &bias);
136*35238bceSAndroid Build Coastguard Worker 
137*35238bceSAndroid Build Coastguard Worker int getCubeArrayFaceIndex(CubeFace face);
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker //! FP32->U8 with RTE rounding (extremely fast, always accurate).
floatToU8(float fv)140*35238bceSAndroid Build Coastguard Worker inline uint8_t floatToU8(float fv)
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker     union
143*35238bceSAndroid Build Coastguard Worker     {
144*35238bceSAndroid Build Coastguard Worker         float fv;
145*35238bceSAndroid Build Coastguard Worker         uint32_t uv;
146*35238bceSAndroid Build Coastguard Worker         int32_t iv;
147*35238bceSAndroid Build Coastguard Worker     } v;
148*35238bceSAndroid Build Coastguard Worker     v.fv = fv;
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker     const uint32_t e = (uint32_t)(126 - (v.iv >> 23));
151*35238bceSAndroid Build Coastguard Worker     uint32_t m       = v.uv;
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker     m &= 0x00ffffffu;
154*35238bceSAndroid Build Coastguard Worker     m |= 0x00800000u;
155*35238bceSAndroid Build Coastguard Worker     m = (m << 8) - m;
156*35238bceSAndroid Build Coastguard Worker     m = (e > 8) ? e : (0x00800000u + (m >> e));
157*35238bceSAndroid Build Coastguard Worker 
158*35238bceSAndroid Build Coastguard Worker     return (uint8_t)(m >> 24);
159*35238bceSAndroid Build Coastguard Worker }
160*35238bceSAndroid Build Coastguard Worker 
161*35238bceSAndroid Build Coastguard Worker uint32_t packRGB999E5(const tcu::Vec4 &color);
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
164*35238bceSAndroid Build Coastguard Worker  * \brief Depth-stencil utilities
165*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
166*35238bceSAndroid Build Coastguard Worker 
167*35238bceSAndroid Build Coastguard Worker TextureFormat getEffectiveDepthStencilTextureFormat(const TextureFormat &baseFormat, Sampler::DepthStencilMode mode);
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker //! returns the currently effective access to an access with a given sampler mode, e.g.
170*35238bceSAndroid Build Coastguard Worker //! for combined depth stencil accesses and for sampler set to sample stencil returns
171*35238bceSAndroid Build Coastguard Worker //! stencil access. Identity for non-combined formats.
172*35238bceSAndroid Build Coastguard Worker PixelBufferAccess getEffectiveDepthStencilAccess(const PixelBufferAccess &baseAccess, Sampler::DepthStencilMode mode);
173*35238bceSAndroid Build Coastguard Worker ConstPixelBufferAccess getEffectiveDepthStencilAccess(const ConstPixelBufferAccess &baseAccess,
174*35238bceSAndroid Build Coastguard Worker                                                       Sampler::DepthStencilMode mode);
175*35238bceSAndroid Build Coastguard Worker 
176*35238bceSAndroid Build Coastguard Worker //! returns the currently effective view to an texture with a given sampler mode. Uses
177*35238bceSAndroid Build Coastguard Worker //! storage for access storage storage
178*35238bceSAndroid Build Coastguard Worker 
179*35238bceSAndroid Build Coastguard Worker tcu::Texture1DView getEffectiveTextureView(const tcu::Texture1DView &src,
180*35238bceSAndroid Build Coastguard Worker                                            std::vector<tcu::ConstPixelBufferAccess> &storage,
181*35238bceSAndroid Build Coastguard Worker                                            const tcu::Sampler &sampler);
182*35238bceSAndroid Build Coastguard Worker tcu::Texture2DView getEffectiveTextureView(const tcu::Texture2DView &src,
183*35238bceSAndroid Build Coastguard Worker                                            std::vector<tcu::ConstPixelBufferAccess> &storage,
184*35238bceSAndroid Build Coastguard Worker                                            const tcu::Sampler &sampler);
185*35238bceSAndroid Build Coastguard Worker tcu::Texture3DView getEffectiveTextureView(const tcu::Texture3DView &src,
186*35238bceSAndroid Build Coastguard Worker                                            std::vector<tcu::ConstPixelBufferAccess> &storage,
187*35238bceSAndroid Build Coastguard Worker                                            const tcu::Sampler &sampler);
188*35238bceSAndroid Build Coastguard Worker tcu::Texture1DArrayView getEffectiveTextureView(const tcu::Texture1DArrayView &src,
189*35238bceSAndroid Build Coastguard Worker                                                 std::vector<tcu::ConstPixelBufferAccess> &storage,
190*35238bceSAndroid Build Coastguard Worker                                                 const tcu::Sampler &sampler);
191*35238bceSAndroid Build Coastguard Worker tcu::Texture2DArrayView getEffectiveTextureView(const tcu::Texture2DArrayView &src,
192*35238bceSAndroid Build Coastguard Worker                                                 std::vector<tcu::ConstPixelBufferAccess> &storage,
193*35238bceSAndroid Build Coastguard Worker                                                 const tcu::Sampler &sampler);
194*35238bceSAndroid Build Coastguard Worker tcu::TextureCubeView getEffectiveTextureView(const tcu::TextureCubeView &src,
195*35238bceSAndroid Build Coastguard Worker                                              std::vector<tcu::ConstPixelBufferAccess> &storage,
196*35238bceSAndroid Build Coastguard Worker                                              const tcu::Sampler &sampler);
197*35238bceSAndroid Build Coastguard Worker tcu::TextureCubeArrayView getEffectiveTextureView(const tcu::TextureCubeArrayView &src,
198*35238bceSAndroid Build Coastguard Worker                                                   std::vector<tcu::ConstPixelBufferAccess> &storage,
199*35238bceSAndroid Build Coastguard Worker                                                   const tcu::Sampler &sampler);
200*35238bceSAndroid Build Coastguard Worker 
201*35238bceSAndroid Build Coastguard Worker template <typename ScalarType>
202*35238bceSAndroid Build Coastguard Worker tcu::Vector<ScalarType, 4> sampleTextureBorder(const TextureFormat &format, const Sampler &sampler);
203*35238bceSAndroid Build Coastguard Worker 
204*35238bceSAndroid Build Coastguard Worker } // namespace tcu
205*35238bceSAndroid Build Coastguard Worker 
206*35238bceSAndroid Build Coastguard Worker #endif // _TCUTEXTUREUTIL_HPP
207