xref: /aosp_15_r20/external/deqp/framework/common/tcuTextureUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program Tester Core
3*35238bceSAndroid Build Coastguard Worker  * ----------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Texture utilities.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
28*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker #include <limits>
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker namespace tcu
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker 
sRGBChannelToLinear(float cs)35*35238bceSAndroid Build Coastguard Worker float sRGBChannelToLinear(float cs)
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker     if (cs <= 0.04045)
38*35238bceSAndroid Build Coastguard Worker         return cs / 12.92f;
39*35238bceSAndroid Build Coastguard Worker     else
40*35238bceSAndroid Build Coastguard Worker         return deFloatPow((cs + 0.055f) / 1.055f, 2.4f);
41*35238bceSAndroid Build Coastguard Worker }
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker static const uint32_t s_srgb8Lut[256] = {
44*35238bceSAndroid Build Coastguard Worker #include "tcuSRGB8Lut.inl"
45*35238bceSAndroid Build Coastguard Worker };
46*35238bceSAndroid Build Coastguard Worker 
sRGB8ChannelToLinear(uint32_t cs)47*35238bceSAndroid Build Coastguard Worker static inline float sRGB8ChannelToLinear(uint32_t cs)
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(cs < 256);
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker     // \note This triggers UB, but in practice it doesn't cause any problems
52*35238bceSAndroid Build Coastguard Worker     return ((const float *)s_srgb8Lut)[cs];
53*35238bceSAndroid Build Coastguard Worker }
54*35238bceSAndroid Build Coastguard Worker 
linearChannelToSRGB(float cl)55*35238bceSAndroid Build Coastguard Worker float linearChannelToSRGB(float cl)
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker     if (cl <= 0.0f)
58*35238bceSAndroid Build Coastguard Worker         return 0.0f;
59*35238bceSAndroid Build Coastguard Worker     else if (cl < 0.0031308f)
60*35238bceSAndroid Build Coastguard Worker         return 12.92f * cl;
61*35238bceSAndroid Build Coastguard Worker     else if (cl < 1.0f)
62*35238bceSAndroid Build Coastguard Worker         return 1.055f * deFloatPow(cl, 0.41666f) - 0.055f;
63*35238bceSAndroid Build Coastguard Worker     else
64*35238bceSAndroid Build Coastguard Worker         return 1.0f;
65*35238bceSAndroid Build Coastguard Worker }
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker //! Convert sRGB to linear colorspace
sRGBToLinear(const Vec4 & cs)68*35238bceSAndroid Build Coastguard Worker Vec4 sRGBToLinear(const Vec4 &cs)
69*35238bceSAndroid Build Coastguard Worker {
70*35238bceSAndroid Build Coastguard Worker     return Vec4(sRGBChannelToLinear(cs[0]), sRGBChannelToLinear(cs[1]), sRGBChannelToLinear(cs[2]), cs[3]);
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker 
sRGB8ToLinear(const UVec4 & cs)73*35238bceSAndroid Build Coastguard Worker Vec4 sRGB8ToLinear(const UVec4 &cs)
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker     return Vec4(sRGB8ChannelToLinear(cs[0]), sRGB8ChannelToLinear(cs[1]), sRGB8ChannelToLinear(cs[2]), 1.0f);
76*35238bceSAndroid Build Coastguard Worker }
77*35238bceSAndroid Build Coastguard Worker 
sRGBA8ToLinear(const UVec4 & cs)78*35238bceSAndroid Build Coastguard Worker Vec4 sRGBA8ToLinear(const UVec4 &cs)
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker     return Vec4(sRGB8ChannelToLinear(cs[0]), sRGB8ChannelToLinear(cs[1]), sRGB8ChannelToLinear(cs[2]),
81*35238bceSAndroid Build Coastguard Worker                 (float)cs[3] / 255.0f);
82*35238bceSAndroid Build Coastguard Worker }
83*35238bceSAndroid Build Coastguard Worker 
84*35238bceSAndroid Build Coastguard Worker //! Convert from linear to sRGB colorspace
linearToSRGB(const Vec4 & cl)85*35238bceSAndroid Build Coastguard Worker Vec4 linearToSRGB(const Vec4 &cl)
86*35238bceSAndroid Build Coastguard Worker {
87*35238bceSAndroid Build Coastguard Worker     return Vec4(linearChannelToSRGB(cl[0]), linearChannelToSRGB(cl[1]), linearChannelToSRGB(cl[2]), cl[3]);
88*35238bceSAndroid Build Coastguard Worker }
89*35238bceSAndroid Build Coastguard Worker 
isSRGB(TextureFormat format)90*35238bceSAndroid Build Coastguard Worker bool isSRGB(TextureFormat format)
91*35238bceSAndroid Build Coastguard Worker {
92*35238bceSAndroid Build Coastguard Worker     // make sure to update this if type table is updated
93*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 22);
94*35238bceSAndroid Build Coastguard Worker 
95*35238bceSAndroid Build Coastguard Worker     return format.order == TextureFormat::sR || format.order == TextureFormat::sRG ||
96*35238bceSAndroid Build Coastguard Worker            format.order == TextureFormat::sRGB || format.order == TextureFormat::sRGBA ||
97*35238bceSAndroid Build Coastguard Worker            format.order == TextureFormat::sBGR || format.order == TextureFormat::sBGRA;
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker 
linearToSRGBIfNeeded(const TextureFormat & format,const tcu::Vec4 & color)100*35238bceSAndroid Build Coastguard Worker tcu::Vec4 linearToSRGBIfNeeded(const TextureFormat &format, const tcu::Vec4 &color)
101*35238bceSAndroid Build Coastguard Worker {
102*35238bceSAndroid Build Coastguard Worker     return isSRGB(format) ? linearToSRGB(color) : color;
103*35238bceSAndroid Build Coastguard Worker }
104*35238bceSAndroid Build Coastguard Worker 
isCombinedDepthStencilType(TextureFormat::ChannelType type)105*35238bceSAndroid Build Coastguard Worker bool isCombinedDepthStencilType(TextureFormat::ChannelType type)
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker     // make sure to update this if type table is updated
108*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 48);
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker     return type == TextureFormat::UNSIGNED_INT_16_8_8 || type == TextureFormat::UNSIGNED_INT_24_8 ||
111*35238bceSAndroid Build Coastguard Worker            type == TextureFormat::UNSIGNED_INT_24_8_REV || type == TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV;
112*35238bceSAndroid Build Coastguard Worker }
113*35238bceSAndroid Build Coastguard Worker 
hasStencilComponent(TextureFormat::ChannelOrder order)114*35238bceSAndroid Build Coastguard Worker bool hasStencilComponent(TextureFormat::ChannelOrder order)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 22);
117*35238bceSAndroid Build Coastguard Worker 
118*35238bceSAndroid Build Coastguard Worker     switch (order)
119*35238bceSAndroid Build Coastguard Worker     {
120*35238bceSAndroid Build Coastguard Worker     case TextureFormat::S:
121*35238bceSAndroid Build Coastguard Worker     case TextureFormat::DS:
122*35238bceSAndroid Build Coastguard Worker         return true;
123*35238bceSAndroid Build Coastguard Worker 
124*35238bceSAndroid Build Coastguard Worker     default:
125*35238bceSAndroid Build Coastguard Worker         return false;
126*35238bceSAndroid Build Coastguard Worker     }
127*35238bceSAndroid Build Coastguard Worker }
128*35238bceSAndroid Build Coastguard Worker 
hasDepthComponent(TextureFormat::ChannelOrder order)129*35238bceSAndroid Build Coastguard Worker bool hasDepthComponent(TextureFormat::ChannelOrder order)
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 22);
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     switch (order)
134*35238bceSAndroid Build Coastguard Worker     {
135*35238bceSAndroid Build Coastguard Worker     case TextureFormat::D:
136*35238bceSAndroid Build Coastguard Worker     case TextureFormat::DS:
137*35238bceSAndroid Build Coastguard Worker         return true;
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker     default:
140*35238bceSAndroid Build Coastguard Worker         return false;
141*35238bceSAndroid Build Coastguard Worker     }
142*35238bceSAndroid Build Coastguard Worker }
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker //! Get texture channel class for format - how the values are stored (not how they are sampled)
getTextureChannelClass(TextureFormat::ChannelType channelType)145*35238bceSAndroid Build Coastguard Worker TextureChannelClass getTextureChannelClass(TextureFormat::ChannelType channelType)
146*35238bceSAndroid Build Coastguard Worker {
147*35238bceSAndroid Build Coastguard Worker     // make sure this table is updated if format table is updated
148*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 48);
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker     switch (channelType)
151*35238bceSAndroid Build Coastguard Worker     {
152*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT8:
153*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
154*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT16:
155*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
156*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT32:
157*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
158*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT8:
159*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
160*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT16:
161*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
162*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT24:
163*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
164*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT32:
165*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
166*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_BYTE_44:
167*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
168*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_565:
169*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
170*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_555:
171*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
172*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_4444:
173*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
174*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_5551:
175*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
176*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_1555:
177*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
178*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_BYTE_44:
179*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
180*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_565:
181*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
182*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_4444:
183*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
184*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_5551:
185*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
186*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT_101010:
187*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
188*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT_1010102_REV:
189*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
190*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT_1010102_REV:
191*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
192*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT_1010102_REV:
193*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_INTEGER;
194*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_1010102_REV:
195*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
196*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:
197*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_FLOATING_POINT;
198*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_999_E5_REV:
199*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_FLOATING_POINT;
200*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_16_8_8:
201*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_LAST; //!< packed unorm16-x8-uint8
202*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_24_8:
203*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_LAST; //!< packed unorm24-uint8
204*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_24_8_REV:
205*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_LAST; //!< packed unorm24-uint8
206*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT8:
207*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_INTEGER;
208*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT16:
209*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_INTEGER;
210*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT32:
211*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_INTEGER;
212*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT64:
213*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_INTEGER;
214*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT8:
215*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
216*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT16:
217*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
218*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT24:
219*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
220*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT32:
221*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
222*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT64:
223*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
224*35238bceSAndroid Build Coastguard Worker     case TextureFormat::HALF_FLOAT:
225*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_FLOATING_POINT;
226*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT:
227*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_FLOATING_POINT;
228*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT64:
229*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_FLOATING_POINT;
230*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:
231*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_LAST; //!< packed float32-pad24-uint8
232*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_10:
233*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
234*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_12:
235*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
236*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT8:
237*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
238*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT16:
239*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
240*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT8:
241*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_INTEGER;
242*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT16:
243*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_INTEGER;
244*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT_1010102_REV:
245*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
246*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT_1010102_REV:
247*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_SIGNED_INTEGER;
248*35238bceSAndroid Build Coastguard Worker     default:
249*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unknown channel type");
250*35238bceSAndroid Build Coastguard Worker         return TEXTURECHANNELCLASS_LAST;
251*35238bceSAndroid Build Coastguard Worker     }
252*35238bceSAndroid Build Coastguard Worker }
253*35238bceSAndroid Build Coastguard Worker 
isAccessValid(TextureFormat format,TextureAccessType type)254*35238bceSAndroid Build Coastguard Worker bool isAccessValid(TextureFormat format, TextureAccessType type)
255*35238bceSAndroid Build Coastguard Worker {
256*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(isValid(format));
257*35238bceSAndroid Build Coastguard Worker 
258*35238bceSAndroid Build Coastguard Worker     if (format.order == TextureFormat::DS)
259*35238bceSAndroid Build Coastguard Worker     {
260*35238bceSAndroid Build Coastguard Worker         // It is never allowed to access combined depth-stencil format with getPixel().
261*35238bceSAndroid Build Coastguard Worker         // Instead either getPixDepth() or getPixStencil(), or effective depth- or stencil-
262*35238bceSAndroid Build Coastguard Worker         // access must be used.
263*35238bceSAndroid Build Coastguard Worker         return false;
264*35238bceSAndroid Build Coastguard Worker     }
265*35238bceSAndroid Build Coastguard Worker     else if (format.order == TextureFormat::D)
266*35238bceSAndroid Build Coastguard Worker         return type == TEXTUREACCESSTYPE_FLOAT;
267*35238bceSAndroid Build Coastguard Worker     else if (format.order == TextureFormat::S)
268*35238bceSAndroid Build Coastguard Worker         return type == TEXTUREACCESSTYPE_UNSIGNED_INT;
269*35238bceSAndroid Build Coastguard Worker     else
270*35238bceSAndroid Build Coastguard Worker     {
271*35238bceSAndroid Build Coastguard Worker         // A few packed color formats have access type restrictions
272*35238bceSAndroid Build Coastguard Worker         if (format.type == TextureFormat::UNSIGNED_INT_11F_11F_10F_REV ||
273*35238bceSAndroid Build Coastguard Worker             format.type == TextureFormat::UNSIGNED_INT_999_E5_REV)
274*35238bceSAndroid Build Coastguard Worker             return type == TEXTUREACCESSTYPE_FLOAT;
275*35238bceSAndroid Build Coastguard Worker         else
276*35238bceSAndroid Build Coastguard Worker             return true;
277*35238bceSAndroid Build Coastguard Worker     }
278*35238bceSAndroid Build Coastguard Worker }
279*35238bceSAndroid Build Coastguard Worker 
280*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
281*35238bceSAndroid Build Coastguard Worker  * \brief Get access to subregion of pixel buffer
282*35238bceSAndroid Build Coastguard Worker  * \param access    Parent access object
283*35238bceSAndroid Build Coastguard Worker  * \param x            X offset
284*35238bceSAndroid Build Coastguard Worker  * \param y            Y offset
285*35238bceSAndroid Build Coastguard Worker  * \param z            Z offset
286*35238bceSAndroid Build Coastguard Worker  * \param width        Width
287*35238bceSAndroid Build Coastguard Worker  * \param height    Height
288*35238bceSAndroid Build Coastguard Worker  * \param depth        Depth
289*35238bceSAndroid Build Coastguard Worker  * \return Access object that targets given subregion of parent access object
290*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
getSubregion(const ConstPixelBufferAccess & access,int x,int y,int z,int width,int height,int depth)291*35238bceSAndroid Build Coastguard Worker ConstPixelBufferAccess getSubregion(const ConstPixelBufferAccess &access, int x, int y, int z, int width, int height,
292*35238bceSAndroid Build Coastguard Worker                                     int depth)
293*35238bceSAndroid Build Coastguard Worker {
294*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inBounds(x, 0, access.getWidth()));
295*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inRange(x + width, x + 1, access.getWidth()));
296*35238bceSAndroid Build Coastguard Worker 
297*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inBounds(y, 0, access.getHeight()));
298*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inRange(y + height, y + 1, access.getHeight()));
299*35238bceSAndroid Build Coastguard Worker 
300*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inBounds(z, 0, access.getDepth()));
301*35238bceSAndroid Build Coastguard Worker     if (depth != -1) // Handles case of VK_REMAINING_ARRAY_LAYERS
302*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::inRange(z + depth, z + 1, access.getDepth()));
303*35238bceSAndroid Build Coastguard Worker 
304*35238bceSAndroid Build Coastguard Worker     return ConstPixelBufferAccess(access.getFormat(), tcu::IVec3(width, height, depth), access.getPitch(),
305*35238bceSAndroid Build Coastguard Worker                                   (const uint8_t *)access.getDataPtr() + access.getPixelPitch() * x +
306*35238bceSAndroid Build Coastguard Worker                                       access.getRowPitch() * y + access.getSlicePitch() * z);
307*35238bceSAndroid Build Coastguard Worker }
308*35238bceSAndroid Build Coastguard Worker 
309*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
310*35238bceSAndroid Build Coastguard Worker  * \brief Get access to subregion of pixel buffer
311*35238bceSAndroid Build Coastguard Worker  * \param access    Parent access object
312*35238bceSAndroid Build Coastguard Worker  * \param x            X offset
313*35238bceSAndroid Build Coastguard Worker  * \param y            Y offset
314*35238bceSAndroid Build Coastguard Worker  * \param z            Z offset
315*35238bceSAndroid Build Coastguard Worker  * \param width        Width
316*35238bceSAndroid Build Coastguard Worker  * \param height    Height
317*35238bceSAndroid Build Coastguard Worker  * \param depth        Depth
318*35238bceSAndroid Build Coastguard Worker  * \return Access object that targets given subregion of parent access object
319*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
getSubregion(const PixelBufferAccess & access,int x,int y,int z,int width,int height,int depth)320*35238bceSAndroid Build Coastguard Worker PixelBufferAccess getSubregion(const PixelBufferAccess &access, int x, int y, int z, int width, int height, int depth)
321*35238bceSAndroid Build Coastguard Worker {
322*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inBounds(x, 0, access.getWidth()));
323*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inRange(x + width, x + 1, access.getWidth()));
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inBounds(y, 0, access.getHeight()));
326*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inRange(y + height, y + 1, access.getHeight()));
327*35238bceSAndroid Build Coastguard Worker 
328*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inBounds(z, 0, access.getDepth()));
329*35238bceSAndroid Build Coastguard Worker     if (depth != -1) // Handles case of VK_REMAINING_ARRAY_LAYERS
330*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::inRange(z + depth, z + 1, access.getDepth()));
331*35238bceSAndroid Build Coastguard Worker 
332*35238bceSAndroid Build Coastguard Worker     return PixelBufferAccess(access.getFormat(), tcu::IVec3(width, height, depth), access.getPitch(),
333*35238bceSAndroid Build Coastguard Worker                              (uint8_t *)access.getDataPtr() + access.getPixelPitch() * x + access.getRowPitch() * y +
334*35238bceSAndroid Build Coastguard Worker                                  access.getSlicePitch() * z);
335*35238bceSAndroid Build Coastguard Worker }
336*35238bceSAndroid Build Coastguard Worker 
337*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
338*35238bceSAndroid Build Coastguard Worker  * \brief Get access to subregion of pixel buffer
339*35238bceSAndroid Build Coastguard Worker  * \param access    Parent access object
340*35238bceSAndroid Build Coastguard Worker  * \param x            X offset
341*35238bceSAndroid Build Coastguard Worker  * \param y            Y offset
342*35238bceSAndroid Build Coastguard Worker  * \param width        Width
343*35238bceSAndroid Build Coastguard Worker  * \param height    Height
344*35238bceSAndroid Build Coastguard Worker  * \return Access object that targets given subregion of parent access object
345*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
getSubregion(const PixelBufferAccess & access,int x,int y,int width,int height)346*35238bceSAndroid Build Coastguard Worker PixelBufferAccess getSubregion(const PixelBufferAccess &access, int x, int y, int width, int height)
347*35238bceSAndroid Build Coastguard Worker {
348*35238bceSAndroid Build Coastguard Worker     return getSubregion(access, x, y, 0, width, height, 1);
349*35238bceSAndroid Build Coastguard Worker }
350*35238bceSAndroid Build Coastguard Worker 
351*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
352*35238bceSAndroid Build Coastguard Worker  * \brief Get access to subregion of pixel buffer
353*35238bceSAndroid Build Coastguard Worker  * \param access    Parent access object
354*35238bceSAndroid Build Coastguard Worker  * \param x            X offset
355*35238bceSAndroid Build Coastguard Worker  * \param y            Y offset
356*35238bceSAndroid Build Coastguard Worker  * \param width        Width
357*35238bceSAndroid Build Coastguard Worker  * \param height    Height
358*35238bceSAndroid Build Coastguard Worker  * \return Access object that targets given subregion of parent access object
359*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
getSubregion(const ConstPixelBufferAccess & access,int x,int y,int width,int height)360*35238bceSAndroid Build Coastguard Worker ConstPixelBufferAccess getSubregion(const ConstPixelBufferAccess &access, int x, int y, int width, int height)
361*35238bceSAndroid Build Coastguard Worker {
362*35238bceSAndroid Build Coastguard Worker     return getSubregion(access, x, y, 0, width, height, 1);
363*35238bceSAndroid Build Coastguard Worker }
364*35238bceSAndroid Build Coastguard Worker 
365*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
366*35238bceSAndroid Build Coastguard Worker  * \brief Flip rows in Y direction
367*35238bceSAndroid Build Coastguard Worker  * \param access Access object
368*35238bceSAndroid Build Coastguard Worker  * \return Modified access object where Y coordinates are reversed
369*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
flipYAccess(const PixelBufferAccess & access)370*35238bceSAndroid Build Coastguard Worker PixelBufferAccess flipYAccess(const PixelBufferAccess &access)
371*35238bceSAndroid Build Coastguard Worker {
372*35238bceSAndroid Build Coastguard Worker     const int rowPitch     = access.getRowPitch();
373*35238bceSAndroid Build Coastguard Worker     const int offsetToLast = rowPitch * (access.getHeight() - 1);
374*35238bceSAndroid Build Coastguard Worker     const tcu::IVec3 pitch(access.getPixelPitch(), -rowPitch, access.getSlicePitch());
375*35238bceSAndroid Build Coastguard Worker 
376*35238bceSAndroid Build Coastguard Worker     return PixelBufferAccess(access.getFormat(), access.getSize(), pitch,
377*35238bceSAndroid Build Coastguard Worker                              (uint8_t *)access.getDataPtr() + offsetToLast);
378*35238bceSAndroid Build Coastguard Worker }
379*35238bceSAndroid Build Coastguard Worker 
380*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
381*35238bceSAndroid Build Coastguard Worker  * \brief Flip rows in Y direction
382*35238bceSAndroid Build Coastguard Worker  * \param access Access object
383*35238bceSAndroid Build Coastguard Worker  * \return Modified access object where Y coordinates are reversed
384*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
flipYAccess(const ConstPixelBufferAccess & access)385*35238bceSAndroid Build Coastguard Worker ConstPixelBufferAccess flipYAccess(const ConstPixelBufferAccess &access)
386*35238bceSAndroid Build Coastguard Worker {
387*35238bceSAndroid Build Coastguard Worker     const int rowPitch     = access.getRowPitch();
388*35238bceSAndroid Build Coastguard Worker     const int offsetToLast = rowPitch * (access.getHeight() - 1);
389*35238bceSAndroid Build Coastguard Worker     const tcu::IVec3 pitch(access.getPixelPitch(), -rowPitch, access.getSlicePitch());
390*35238bceSAndroid Build Coastguard Worker 
391*35238bceSAndroid Build Coastguard Worker     return ConstPixelBufferAccess(access.getFormat(), access.getSize(), pitch,
392*35238bceSAndroid Build Coastguard Worker                                   (uint8_t *)access.getDataPtr() + offsetToLast);
393*35238bceSAndroid Build Coastguard Worker }
394*35238bceSAndroid Build Coastguard Worker 
getFloatChannelValueRange(TextureFormat::ChannelType channelType)395*35238bceSAndroid Build Coastguard Worker static Vec2 getFloatChannelValueRange(TextureFormat::ChannelType channelType)
396*35238bceSAndroid Build Coastguard Worker {
397*35238bceSAndroid Build Coastguard Worker     // make sure this table is updated if format table is updated
398*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 48);
399*35238bceSAndroid Build Coastguard Worker 
400*35238bceSAndroid Build Coastguard Worker     float cMin = 0.0f;
401*35238bceSAndroid Build Coastguard Worker     float cMax = 0.0f;
402*35238bceSAndroid Build Coastguard Worker 
403*35238bceSAndroid Build Coastguard Worker     switch (channelType)
404*35238bceSAndroid Build Coastguard Worker     {
405*35238bceSAndroid Build Coastguard Worker     // Signed normalized formats.
406*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT8:
407*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT16:
408*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT32:
409*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT_1010102_REV:
410*35238bceSAndroid Build Coastguard Worker         cMin = -1.0f;
411*35238bceSAndroid Build Coastguard Worker         cMax = 1.0f;
412*35238bceSAndroid Build Coastguard Worker         break;
413*35238bceSAndroid Build Coastguard Worker 
414*35238bceSAndroid Build Coastguard Worker     // Unsigned normalized formats.
415*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT8:
416*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT16:
417*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT24:
418*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT32:
419*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_BYTE_44:
420*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_565:
421*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_555:
422*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_4444:
423*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_5551:
424*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_1555:
425*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT_101010:
426*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT_1010102_REV:
427*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_10:
428*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_12:
429*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
430*35238bceSAndroid Build Coastguard Worker         cMax = 1.0f;
431*35238bceSAndroid Build Coastguard Worker         break;
432*35238bceSAndroid Build Coastguard Worker 
433*35238bceSAndroid Build Coastguard Worker     // Misc formats.
434*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT8:
435*35238bceSAndroid Build Coastguard Worker         cMin = -128.0f;
436*35238bceSAndroid Build Coastguard Worker         cMax = 127.0f;
437*35238bceSAndroid Build Coastguard Worker         break;
438*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT16:
439*35238bceSAndroid Build Coastguard Worker         cMin = -32768.0f;
440*35238bceSAndroid Build Coastguard Worker         cMax = 32767.0f;
441*35238bceSAndroid Build Coastguard Worker         break;
442*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT32:
443*35238bceSAndroid Build Coastguard Worker         cMin = -2147483520.0f;
444*35238bceSAndroid Build Coastguard Worker         cMax = 2147483520.0f;
445*35238bceSAndroid Build Coastguard Worker         break; // Maximum exactly representable 31-bit integer: (2^24 - 1) * 2^7
446*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT8:
447*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
448*35238bceSAndroid Build Coastguard Worker         cMax = 255.0f;
449*35238bceSAndroid Build Coastguard Worker         break;
450*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT16:
451*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
452*35238bceSAndroid Build Coastguard Worker         cMax = 65535.0f;
453*35238bceSAndroid Build Coastguard Worker         break;
454*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT24:
455*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
456*35238bceSAndroid Build Coastguard Worker         cMax = 16777215.0f;
457*35238bceSAndroid Build Coastguard Worker         break;
458*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT32:
459*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
460*35238bceSAndroid Build Coastguard Worker         cMax = 4294967040.f;
461*35238bceSAndroid Build Coastguard Worker         break; // Maximum exactly representable 32-bit integer: (2^24 - 1) * 2^8
462*35238bceSAndroid Build Coastguard Worker     case TextureFormat::HALF_FLOAT:
463*35238bceSAndroid Build Coastguard Worker         cMin = -1e3f;
464*35238bceSAndroid Build Coastguard Worker         cMax = 1e3f;
465*35238bceSAndroid Build Coastguard Worker         break;
466*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT:
467*35238bceSAndroid Build Coastguard Worker         cMin = -1e5f;
468*35238bceSAndroid Build Coastguard Worker         cMax = 1e5f;
469*35238bceSAndroid Build Coastguard Worker         break;
470*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT64:
471*35238bceSAndroid Build Coastguard Worker         cMin = -1e5f;
472*35238bceSAndroid Build Coastguard Worker         cMax = 1e5f;
473*35238bceSAndroid Build Coastguard Worker         break;
474*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:
475*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
476*35238bceSAndroid Build Coastguard Worker         cMax = 1e4f;
477*35238bceSAndroid Build Coastguard Worker         break;
478*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_999_E5_REV:
479*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
480*35238bceSAndroid Build Coastguard Worker         cMax = 0.5e5f;
481*35238bceSAndroid Build Coastguard Worker         break;
482*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_BYTE_44:
483*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
484*35238bceSAndroid Build Coastguard Worker         cMax = 15.f;
485*35238bceSAndroid Build Coastguard Worker         break;
486*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_4444:
487*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
488*35238bceSAndroid Build Coastguard Worker         cMax = 15.f;
489*35238bceSAndroid Build Coastguard Worker         break;
490*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT8:
491*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
492*35238bceSAndroid Build Coastguard Worker         cMax = 255.0f;
493*35238bceSAndroid Build Coastguard Worker         break;
494*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT16:
495*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
496*35238bceSAndroid Build Coastguard Worker         cMax = 65535.0f;
497*35238bceSAndroid Build Coastguard Worker         break;
498*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT8:
499*35238bceSAndroid Build Coastguard Worker         cMin = -128.0f;
500*35238bceSAndroid Build Coastguard Worker         cMax = 127.0f;
501*35238bceSAndroid Build Coastguard Worker         break;
502*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT16:
503*35238bceSAndroid Build Coastguard Worker         cMin = -32768.0f;
504*35238bceSAndroid Build Coastguard Worker         cMax = 32767.0f;
505*35238bceSAndroid Build Coastguard Worker         break;
506*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT_1010102_REV:
507*35238bceSAndroid Build Coastguard Worker         cMin = 0.0f;
508*35238bceSAndroid Build Coastguard Worker         cMax = 1023.0f;
509*35238bceSAndroid Build Coastguard Worker         break;
510*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT_1010102_REV:
511*35238bceSAndroid Build Coastguard Worker         cMin = -512.0f;
512*35238bceSAndroid Build Coastguard Worker         cMax = 511.0f;
513*35238bceSAndroid Build Coastguard Worker         break;
514*35238bceSAndroid Build Coastguard Worker 
515*35238bceSAndroid Build Coastguard Worker     default:
516*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
517*35238bceSAndroid Build Coastguard Worker     }
518*35238bceSAndroid Build Coastguard Worker 
519*35238bceSAndroid Build Coastguard Worker     return Vec2(cMin, cMax);
520*35238bceSAndroid Build Coastguard Worker }
521*35238bceSAndroid Build Coastguard Worker 
522*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
523*35238bceSAndroid Build Coastguard Worker  * \brief Get standard parameters for testing texture format
524*35238bceSAndroid Build Coastguard Worker  *
525*35238bceSAndroid Build Coastguard Worker  * Returns TextureFormatInfo that describes good parameters for exercising
526*35238bceSAndroid Build Coastguard Worker  * given TextureFormat. Parameters include value ranges per channel and
527*35238bceSAndroid Build Coastguard Worker  * suitable lookup scaling and bias in order to reduce result back to
528*35238bceSAndroid Build Coastguard Worker  * 0..1 range.
529*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
getTextureFormatInfo(const TextureFormat & format)530*35238bceSAndroid Build Coastguard Worker TextureFormatInfo getTextureFormatInfo(const TextureFormat &format)
531*35238bceSAndroid Build Coastguard Worker {
532*35238bceSAndroid Build Coastguard Worker     // Special cases.
533*35238bceSAndroid Build Coastguard Worker     if (format.type == TextureFormat::UNSIGNED_INT_1010102_REV)
534*35238bceSAndroid Build Coastguard Worker         return TextureFormatInfo(Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(1023.0f, 1023.0f, 1023.0f, 3.0f),
535*35238bceSAndroid Build Coastguard Worker                                  Vec4(1.0f / 1023.f, 1.0f / 1023.0f, 1.0f / 1023.0f, 1.0f / 3.0f),
536*35238bceSAndroid Build Coastguard Worker                                  Vec4(0.0f, 0.0f, 0.0f, 0.0f));
537*35238bceSAndroid Build Coastguard Worker     if (format.type == TextureFormat::SIGNED_INT_1010102_REV)
538*35238bceSAndroid Build Coastguard Worker         return TextureFormatInfo(Vec4(-512.0f, -512.0f, -512.0f, -2.0f), Vec4(511.0f, 511.0f, 511.0f, 1.0f),
539*35238bceSAndroid Build Coastguard Worker                                  Vec4(1.0f / 1023.f, 1.0f / 1023.0f, 1.0f / 1023.0f, 1.0f / 3.0f),
540*35238bceSAndroid Build Coastguard Worker                                  Vec4(0.5f, 0.5f, 0.5f, 0.5f));
541*35238bceSAndroid Build Coastguard Worker     else if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
542*35238bceSAndroid Build Coastguard Worker         return TextureFormatInfo(Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(1.0f, 1.0f, 1.0f, 255.0f),
543*35238bceSAndroid Build Coastguard Worker                                  Vec4(1.0f, 1.0f, 1.0f, 1.0f),
544*35238bceSAndroid Build Coastguard Worker                                  Vec4(0.0f, 0.0f, 0.0f, 0.0f)); // Depth / stencil formats.
545*35238bceSAndroid Build Coastguard Worker     else if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_5551))
546*35238bceSAndroid Build Coastguard Worker         return TextureFormatInfo(Vec4(0.0f, 0.0f, 0.0f, 0.5f), Vec4(1.0f, 1.0f, 1.0f, 1.5f),
547*35238bceSAndroid Build Coastguard Worker                                  Vec4(1.0f, 1.0f, 1.0f, 1.0f), Vec4(0.0f, 0.0f, 0.0f, 0.0f));
548*35238bceSAndroid Build Coastguard Worker     else if (format.type == TextureFormat::UNSIGNED_SHORT_5551)
549*35238bceSAndroid Build Coastguard Worker         return TextureFormatInfo(Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(31.0f, 31.0f, 31.0f, 1.0f),
550*35238bceSAndroid Build Coastguard Worker                                  Vec4(1.0f / 31.f, 1.0f / 31.0f, 1.0f / 31.0f, 1.0f), Vec4(0.0f, 0.0f, 0.0f, 0.0f));
551*35238bceSAndroid Build Coastguard Worker     else if (format.type == TextureFormat::UNSIGNED_SHORT_565)
552*35238bceSAndroid Build Coastguard Worker         return TextureFormatInfo(Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(31.0f, 63.0f, 31.0f, 0.0f),
553*35238bceSAndroid Build Coastguard Worker                                  Vec4(1.0f / 31.f, 1.0f / 63.0f, 1.0f / 31.0f, 1.0f), Vec4(0.0f, 0.0f, 0.0f, 0.0f));
554*35238bceSAndroid Build Coastguard Worker 
555*35238bceSAndroid Build Coastguard Worker     const Vec2 cRange                  = getFloatChannelValueRange(format.type);
556*35238bceSAndroid Build Coastguard Worker     const TextureSwizzle::Channel *map = getChannelReadSwizzle(format.order).components;
557*35238bceSAndroid Build Coastguard Worker     const BVec4 chnMask = BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
558*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
559*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
560*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true);
561*35238bceSAndroid Build Coastguard Worker     const float scale   = 1.0f / (cRange[1] - cRange[0]);
562*35238bceSAndroid Build Coastguard Worker     const float bias    = -cRange[0] * scale;
563*35238bceSAndroid Build Coastguard Worker 
564*35238bceSAndroid Build Coastguard Worker     return TextureFormatInfo(select(cRange[0], 0.0f, chnMask), select(cRange[1], 0.0f, chnMask),
565*35238bceSAndroid Build Coastguard Worker                              select(scale, 1.0f, chnMask), select(bias, 0.0f, chnMask));
566*35238bceSAndroid Build Coastguard Worker }
567*35238bceSAndroid Build Coastguard Worker 
getFormatMinIntValue(const TextureFormat & format)568*35238bceSAndroid Build Coastguard Worker IVec4 getFormatMinIntValue(const TextureFormat &format)
569*35238bceSAndroid Build Coastguard Worker {
570*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_SIGNED_INTEGER);
571*35238bceSAndroid Build Coastguard Worker 
572*35238bceSAndroid Build Coastguard Worker     switch (format.type)
573*35238bceSAndroid Build Coastguard Worker     {
574*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT8:
575*35238bceSAndroid Build Coastguard Worker         return IVec4(std::numeric_limits<int8_t>::min());
576*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT16:
577*35238bceSAndroid Build Coastguard Worker         return IVec4(std::numeric_limits<int16_t>::min());
578*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT32:
579*35238bceSAndroid Build Coastguard Worker         return IVec4(std::numeric_limits<int32_t>::min());
580*35238bceSAndroid Build Coastguard Worker 
581*35238bceSAndroid Build Coastguard Worker     default:
582*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Invalid channel type");
583*35238bceSAndroid Build Coastguard Worker         return IVec4(0);
584*35238bceSAndroid Build Coastguard Worker     }
585*35238bceSAndroid Build Coastguard Worker }
586*35238bceSAndroid Build Coastguard Worker 
getFormatMaxIntValue(const TextureFormat & format)587*35238bceSAndroid Build Coastguard Worker IVec4 getFormatMaxIntValue(const TextureFormat &format)
588*35238bceSAndroid Build Coastguard Worker {
589*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_SIGNED_INTEGER);
590*35238bceSAndroid Build Coastguard Worker 
591*35238bceSAndroid Build Coastguard Worker     if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT_1010102_REV) ||
592*35238bceSAndroid Build Coastguard Worker         format == TextureFormat(TextureFormat::BGRA, TextureFormat::SSCALED_INT_1010102_REV) ||
593*35238bceSAndroid Build Coastguard Worker         format == TextureFormat(TextureFormat::RGBA, TextureFormat::SSCALED_INT_1010102_REV) ||
594*35238bceSAndroid Build Coastguard Worker         format == TextureFormat(TextureFormat::BGRA, TextureFormat::SIGNED_INT_1010102_REV))
595*35238bceSAndroid Build Coastguard Worker         return IVec4(511, 511, 511, 1);
596*35238bceSAndroid Build Coastguard Worker 
597*35238bceSAndroid Build Coastguard Worker     switch (format.type)
598*35238bceSAndroid Build Coastguard Worker     {
599*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT8:
600*35238bceSAndroid Build Coastguard Worker         return IVec4(std::numeric_limits<int8_t>::max());
601*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT16:
602*35238bceSAndroid Build Coastguard Worker         return IVec4(std::numeric_limits<int16_t>::max());
603*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT32:
604*35238bceSAndroid Build Coastguard Worker         return IVec4(std::numeric_limits<int32_t>::max());
605*35238bceSAndroid Build Coastguard Worker 
606*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT8:
607*35238bceSAndroid Build Coastguard Worker         return IVec4(std::numeric_limits<int8_t>::max());
608*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT16:
609*35238bceSAndroid Build Coastguard Worker         return IVec4(std::numeric_limits<int16_t>::max());
610*35238bceSAndroid Build Coastguard Worker 
611*35238bceSAndroid Build Coastguard Worker     default:
612*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Invalid channel type");
613*35238bceSAndroid Build Coastguard Worker         return IVec4(0);
614*35238bceSAndroid Build Coastguard Worker     }
615*35238bceSAndroid Build Coastguard Worker }
616*35238bceSAndroid Build Coastguard Worker 
getFormatMaxUintValue(const TextureFormat & format)617*35238bceSAndroid Build Coastguard Worker UVec4 getFormatMaxUintValue(const TextureFormat &format)
618*35238bceSAndroid Build Coastguard Worker {
619*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_UNSIGNED_INTEGER);
620*35238bceSAndroid Build Coastguard Worker 
621*35238bceSAndroid Build Coastguard Worker     if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT_1010102_REV) ||
622*35238bceSAndroid Build Coastguard Worker         format == TextureFormat(TextureFormat::RGBA, TextureFormat::USCALED_INT_1010102_REV) ||
623*35238bceSAndroid Build Coastguard Worker         format == TextureFormat(TextureFormat::BGRA, TextureFormat::USCALED_INT_1010102_REV) ||
624*35238bceSAndroid Build Coastguard Worker         format == TextureFormat(TextureFormat::BGRA, TextureFormat::UNSIGNED_INT_1010102_REV))
625*35238bceSAndroid Build Coastguard Worker         return UVec4(1023u, 1023u, 1023u, 3u);
626*35238bceSAndroid Build Coastguard Worker 
627*35238bceSAndroid Build Coastguard Worker     switch (format.type)
628*35238bceSAndroid Build Coastguard Worker     {
629*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT8:
630*35238bceSAndroid Build Coastguard Worker         return UVec4(std::numeric_limits<uint8_t>::max());
631*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT16:
632*35238bceSAndroid Build Coastguard Worker         return UVec4(std::numeric_limits<uint16_t>::max());
633*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT24:
634*35238bceSAndroid Build Coastguard Worker         return UVec4(0xffffffu);
635*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT32:
636*35238bceSAndroid Build Coastguard Worker         return UVec4(std::numeric_limits<uint32_t>::max());
637*35238bceSAndroid Build Coastguard Worker 
638*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT8:
639*35238bceSAndroid Build Coastguard Worker         return UVec4(std::numeric_limits<uint8_t>::max());
640*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT16:
641*35238bceSAndroid Build Coastguard Worker         return UVec4(std::numeric_limits<uint16_t>::max());
642*35238bceSAndroid Build Coastguard Worker 
643*35238bceSAndroid Build Coastguard Worker     default:
644*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Invalid channel type");
645*35238bceSAndroid Build Coastguard Worker         return UVec4(0);
646*35238bceSAndroid Build Coastguard Worker     }
647*35238bceSAndroid Build Coastguard Worker }
648*35238bceSAndroid Build Coastguard Worker 
getChannelBitDepth(TextureFormat::ChannelType channelType)649*35238bceSAndroid Build Coastguard Worker static IVec4 getChannelBitDepth(TextureFormat::ChannelType channelType)
650*35238bceSAndroid Build Coastguard Worker {
651*35238bceSAndroid Build Coastguard Worker     // make sure this table is updated if format table is updated
652*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 48);
653*35238bceSAndroid Build Coastguard Worker 
654*35238bceSAndroid Build Coastguard Worker     switch (channelType)
655*35238bceSAndroid Build Coastguard Worker     {
656*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT8:
657*35238bceSAndroid Build Coastguard Worker         return IVec4(8);
658*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT16:
659*35238bceSAndroid Build Coastguard Worker         return IVec4(16);
660*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT32:
661*35238bceSAndroid Build Coastguard Worker         return IVec4(32);
662*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT8:
663*35238bceSAndroid Build Coastguard Worker         return IVec4(8);
664*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT16:
665*35238bceSAndroid Build Coastguard Worker         return IVec4(16);
666*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT24:
667*35238bceSAndroid Build Coastguard Worker         return IVec4(24);
668*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT32:
669*35238bceSAndroid Build Coastguard Worker         return IVec4(32);
670*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_BYTE_44:
671*35238bceSAndroid Build Coastguard Worker         return IVec4(4, 4, 0, 0);
672*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_565:
673*35238bceSAndroid Build Coastguard Worker         return IVec4(5, 6, 5, 0);
674*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_4444:
675*35238bceSAndroid Build Coastguard Worker         return IVec4(4);
676*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_555:
677*35238bceSAndroid Build Coastguard Worker         return IVec4(5, 5, 5, 0);
678*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_5551:
679*35238bceSAndroid Build Coastguard Worker         return IVec4(5, 5, 5, 1);
680*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_1555:
681*35238bceSAndroid Build Coastguard Worker         return IVec4(1, 5, 5, 5);
682*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_BYTE_44:
683*35238bceSAndroid Build Coastguard Worker         return IVec4(4, 4, 0, 0);
684*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_565:
685*35238bceSAndroid Build Coastguard Worker         return IVec4(5, 6, 5, 0);
686*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_4444:
687*35238bceSAndroid Build Coastguard Worker         return IVec4(4);
688*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_5551:
689*35238bceSAndroid Build Coastguard Worker         return IVec4(5, 5, 5, 1);
690*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT_101010:
691*35238bceSAndroid Build Coastguard Worker         return IVec4(10, 10, 10, 0);
692*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT_1010102_REV:
693*35238bceSAndroid Build Coastguard Worker         return IVec4(10, 10, 10, 2);
694*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT_1010102_REV:
695*35238bceSAndroid Build Coastguard Worker         return IVec4(10, 10, 10, 2);
696*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT8:
697*35238bceSAndroid Build Coastguard Worker         return IVec4(8);
698*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT16:
699*35238bceSAndroid Build Coastguard Worker         return IVec4(16);
700*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT32:
701*35238bceSAndroid Build Coastguard Worker         return IVec4(32);
702*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT64:
703*35238bceSAndroid Build Coastguard Worker         return IVec4(64);
704*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT8:
705*35238bceSAndroid Build Coastguard Worker         return IVec4(8);
706*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT16:
707*35238bceSAndroid Build Coastguard Worker         return IVec4(16);
708*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT24:
709*35238bceSAndroid Build Coastguard Worker         return IVec4(24);
710*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT32:
711*35238bceSAndroid Build Coastguard Worker         return IVec4(32);
712*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT64:
713*35238bceSAndroid Build Coastguard Worker         return IVec4(64);
714*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT_1010102_REV:
715*35238bceSAndroid Build Coastguard Worker         return IVec4(10, 10, 10, 2);
716*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_1010102_REV:
717*35238bceSAndroid Build Coastguard Worker         return IVec4(10, 10, 10, 2);
718*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_16_8_8:
719*35238bceSAndroid Build Coastguard Worker         return IVec4(16, 8, 0, 0);
720*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_24_8:
721*35238bceSAndroid Build Coastguard Worker         return IVec4(24, 8, 0, 0);
722*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_24_8_REV:
723*35238bceSAndroid Build Coastguard Worker         return IVec4(24, 8, 0, 0);
724*35238bceSAndroid Build Coastguard Worker     case TextureFormat::HALF_FLOAT:
725*35238bceSAndroid Build Coastguard Worker         return IVec4(16);
726*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT:
727*35238bceSAndroid Build Coastguard Worker         return IVec4(32);
728*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT64:
729*35238bceSAndroid Build Coastguard Worker         return IVec4(64);
730*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:
731*35238bceSAndroid Build Coastguard Worker         return IVec4(11, 11, 10, 0);
732*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_999_E5_REV:
733*35238bceSAndroid Build Coastguard Worker         return IVec4(9, 9, 9, 0);
734*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:
735*35238bceSAndroid Build Coastguard Worker         return IVec4(32, 8, 0, 0);
736*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_10:
737*35238bceSAndroid Build Coastguard Worker         return IVec4(10);
738*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_12:
739*35238bceSAndroid Build Coastguard Worker         return IVec4(12);
740*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT8:
741*35238bceSAndroid Build Coastguard Worker         return IVec4(8);
742*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT16:
743*35238bceSAndroid Build Coastguard Worker         return IVec4(16);
744*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT8:
745*35238bceSAndroid Build Coastguard Worker         return IVec4(8);
746*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT16:
747*35238bceSAndroid Build Coastguard Worker         return IVec4(16);
748*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT_1010102_REV:
749*35238bceSAndroid Build Coastguard Worker         return IVec4(10, 10, 10, 2);
750*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT_1010102_REV:
751*35238bceSAndroid Build Coastguard Worker         return IVec4(10, 10, 10, 2);
752*35238bceSAndroid Build Coastguard Worker     default:
753*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
754*35238bceSAndroid Build Coastguard Worker         return IVec4(0);
755*35238bceSAndroid Build Coastguard Worker     }
756*35238bceSAndroid Build Coastguard Worker }
757*35238bceSAndroid Build Coastguard Worker 
getTextureFormatBitDepth(const TextureFormat & format)758*35238bceSAndroid Build Coastguard Worker IVec4 getTextureFormatBitDepth(const TextureFormat &format)
759*35238bceSAndroid Build Coastguard Worker {
760*35238bceSAndroid Build Coastguard Worker     const IVec4 chnBits                = getChannelBitDepth(format.type);
761*35238bceSAndroid Build Coastguard Worker     const TextureSwizzle::Channel *map = getChannelReadSwizzle(format.order).components;
762*35238bceSAndroid Build Coastguard Worker     const BVec4 chnMask = BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
763*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
764*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
765*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true);
766*35238bceSAndroid Build Coastguard Worker     const IVec4 chnSwz  = IVec4((chnMask[0]) ? ((int)map[0]) : (0), (chnMask[1]) ? ((int)map[1]) : (0),
767*35238bceSAndroid Build Coastguard Worker                                (chnMask[2]) ? ((int)map[2]) : (0), (chnMask[3]) ? ((int)map[3]) : (0));
768*35238bceSAndroid Build Coastguard Worker 
769*35238bceSAndroid Build Coastguard Worker     return select(chnBits.swizzle(chnSwz.x(), chnSwz.y(), chnSwz.z(), chnSwz.w()), IVec4(0), chnMask);
770*35238bceSAndroid Build Coastguard Worker }
771*35238bceSAndroid Build Coastguard Worker 
getChannelMantissaBitDepth(TextureFormat::ChannelType channelType)772*35238bceSAndroid Build Coastguard Worker static IVec4 getChannelMantissaBitDepth(TextureFormat::ChannelType channelType)
773*35238bceSAndroid Build Coastguard Worker {
774*35238bceSAndroid Build Coastguard Worker     // make sure this table is updated if format table is updated
775*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 48);
776*35238bceSAndroid Build Coastguard Worker 
777*35238bceSAndroid Build Coastguard Worker     switch (channelType)
778*35238bceSAndroid Build Coastguard Worker     {
779*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT8:
780*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT16:
781*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT32:
782*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT8:
783*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT16:
784*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT24:
785*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT32:
786*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_BYTE_44:
787*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_565:
788*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_4444:
789*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_555:
790*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_5551:
791*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_1555:
792*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_BYTE_44:
793*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_565:
794*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_4444:
795*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_SHORT_5551:
796*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT_101010:
797*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SNORM_INT_1010102_REV:
798*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_INT_1010102_REV:
799*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT8:
800*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT16:
801*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT32:
802*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT8:
803*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT16:
804*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT24:
805*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT32:
806*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SIGNED_INT_1010102_REV:
807*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_1010102_REV:
808*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_16_8_8:
809*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_24_8:
810*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_24_8_REV:
811*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_999_E5_REV:
812*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_10:
813*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNORM_SHORT_12:
814*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT8:
815*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT16:
816*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT8:
817*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT16:
818*35238bceSAndroid Build Coastguard Worker     case TextureFormat::USCALED_INT_1010102_REV:
819*35238bceSAndroid Build Coastguard Worker     case TextureFormat::SSCALED_INT_1010102_REV:
820*35238bceSAndroid Build Coastguard Worker         return getChannelBitDepth(channelType);
821*35238bceSAndroid Build Coastguard Worker 
822*35238bceSAndroid Build Coastguard Worker     case TextureFormat::HALF_FLOAT:
823*35238bceSAndroid Build Coastguard Worker         return IVec4(10);
824*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT:
825*35238bceSAndroid Build Coastguard Worker         return IVec4(23);
826*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT64:
827*35238bceSAndroid Build Coastguard Worker         return IVec4(52);
828*35238bceSAndroid Build Coastguard Worker     case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:
829*35238bceSAndroid Build Coastguard Worker         return IVec4(6, 6, 5, 0);
830*35238bceSAndroid Build Coastguard Worker     case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:
831*35238bceSAndroid Build Coastguard Worker         return IVec4(23, 8, 0, 0);
832*35238bceSAndroid Build Coastguard Worker     default:
833*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
834*35238bceSAndroid Build Coastguard Worker         return IVec4(0);
835*35238bceSAndroid Build Coastguard Worker     }
836*35238bceSAndroid Build Coastguard Worker }
837*35238bceSAndroid Build Coastguard Worker 
getTextureFormatMantissaBitDepth(const TextureFormat & format)838*35238bceSAndroid Build Coastguard Worker IVec4 getTextureFormatMantissaBitDepth(const TextureFormat &format)
839*35238bceSAndroid Build Coastguard Worker {
840*35238bceSAndroid Build Coastguard Worker     const IVec4 chnBits                = getChannelMantissaBitDepth(format.type);
841*35238bceSAndroid Build Coastguard Worker     const TextureSwizzle::Channel *map = getChannelReadSwizzle(format.order).components;
842*35238bceSAndroid Build Coastguard Worker     const BVec4 chnMask = BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
843*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
844*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
845*35238bceSAndroid Build Coastguard Worker                                 deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true);
846*35238bceSAndroid Build Coastguard Worker     const IVec4 chnSwz  = IVec4((chnMask[0]) ? ((int)map[0]) : (0), (chnMask[1]) ? ((int)map[1]) : (0),
847*35238bceSAndroid Build Coastguard Worker                                (chnMask[2]) ? ((int)map[2]) : (0), (chnMask[3]) ? ((int)map[3]) : (0));
848*35238bceSAndroid Build Coastguard Worker 
849*35238bceSAndroid Build Coastguard Worker     return select(chnBits.swizzle(chnSwz.x(), chnSwz.y(), chnSwz.z(), chnSwz.w()), IVec4(0), chnMask);
850*35238bceSAndroid Build Coastguard Worker }
851*35238bceSAndroid Build Coastguard Worker 
getTextureFormatChannelMask(const TextureFormat & format)852*35238bceSAndroid Build Coastguard Worker BVec4 getTextureFormatChannelMask(const TextureFormat &format)
853*35238bceSAndroid Build Coastguard Worker {
854*35238bceSAndroid Build Coastguard Worker     const TextureSwizzle::Channel *const map = getChannelReadSwizzle(format.order).components;
855*35238bceSAndroid Build Coastguard Worker     return BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
856*35238bceSAndroid Build Coastguard Worker                  deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
857*35238bceSAndroid Build Coastguard Worker                  deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true,
858*35238bceSAndroid Build Coastguard Worker                  deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true);
859*35238bceSAndroid Build Coastguard Worker }
860*35238bceSAndroid Build Coastguard Worker 
linearInterpolate(float t,float minVal,float maxVal)861*35238bceSAndroid Build Coastguard Worker static inline float linearInterpolate(float t, float minVal, float maxVal)
862*35238bceSAndroid Build Coastguard Worker {
863*35238bceSAndroid Build Coastguard Worker     return minVal + (maxVal - minVal) * t;
864*35238bceSAndroid Build Coastguard Worker }
865*35238bceSAndroid Build Coastguard Worker 
linearInterpolate(float t,const Vec4 & a,const Vec4 & b)866*35238bceSAndroid Build Coastguard Worker static inline Vec4 linearInterpolate(float t, const Vec4 &a, const Vec4 &b)
867*35238bceSAndroid Build Coastguard Worker {
868*35238bceSAndroid Build Coastguard Worker     return a + (b - a) * t;
869*35238bceSAndroid Build Coastguard Worker }
870*35238bceSAndroid Build Coastguard Worker 
871*35238bceSAndroid Build Coastguard Worker enum
872*35238bceSAndroid Build Coastguard Worker {
873*35238bceSAndroid Build Coastguard Worker     CLEAR_OPTIMIZE_THRESHOLD      = 128,
874*35238bceSAndroid Build Coastguard Worker     CLEAR_OPTIMIZE_MAX_PIXEL_SIZE = 8
875*35238bceSAndroid Build Coastguard Worker };
876*35238bceSAndroid Build Coastguard Worker 
fillRow(const PixelBufferAccess & dst,int y,int z,int pixelSize,const uint8_t * pixel)877*35238bceSAndroid Build Coastguard Worker inline void fillRow(const PixelBufferAccess &dst, int y, int z, int pixelSize, const uint8_t *pixel)
878*35238bceSAndroid Build Coastguard Worker {
879*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(dst.getPixelPitch() == pixelSize); // only tightly packed
880*35238bceSAndroid Build Coastguard Worker 
881*35238bceSAndroid Build Coastguard Worker     uint8_t *dstPtr = (uint8_t *)dst.getPixelPtr(0, y, z);
882*35238bceSAndroid Build Coastguard Worker     int width       = dst.getWidth();
883*35238bceSAndroid Build Coastguard Worker 
884*35238bceSAndroid Build Coastguard Worker     if (pixelSize == 8 && deIsAlignedPtr(dstPtr, pixelSize))
885*35238bceSAndroid Build Coastguard Worker     {
886*35238bceSAndroid Build Coastguard Worker         uint64_t val;
887*35238bceSAndroid Build Coastguard Worker         memcpy(&val, pixel, sizeof(val));
888*35238bceSAndroid Build Coastguard Worker 
889*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < width; i++)
890*35238bceSAndroid Build Coastguard Worker             ((uint64_t *)dstPtr)[i] = val;
891*35238bceSAndroid Build Coastguard Worker     }
892*35238bceSAndroid Build Coastguard Worker     else if (pixelSize == 4 && deIsAlignedPtr(dstPtr, pixelSize))
893*35238bceSAndroid Build Coastguard Worker     {
894*35238bceSAndroid Build Coastguard Worker         uint32_t val;
895*35238bceSAndroid Build Coastguard Worker         memcpy(&val, pixel, sizeof(val));
896*35238bceSAndroid Build Coastguard Worker 
897*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < width; i++)
898*35238bceSAndroid Build Coastguard Worker             ((uint32_t *)dstPtr)[i] = val;
899*35238bceSAndroid Build Coastguard Worker     }
900*35238bceSAndroid Build Coastguard Worker     else
901*35238bceSAndroid Build Coastguard Worker     {
902*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < width; i++)
903*35238bceSAndroid Build Coastguard Worker             for (int j = 0; j < pixelSize; j++)
904*35238bceSAndroid Build Coastguard Worker                 dstPtr[i * pixelSize + j] = pixel[j];
905*35238bceSAndroid Build Coastguard Worker     }
906*35238bceSAndroid Build Coastguard Worker }
907*35238bceSAndroid Build Coastguard Worker 
clear(const PixelBufferAccess & access,const Vec4 & color)908*35238bceSAndroid Build Coastguard Worker void clear(const PixelBufferAccess &access, const Vec4 &color)
909*35238bceSAndroid Build Coastguard Worker {
910*35238bceSAndroid Build Coastguard Worker     const int pixelSize               = access.getFormat().getPixelSize();
911*35238bceSAndroid Build Coastguard Worker     const int pixelPitch              = access.getPixelPitch();
912*35238bceSAndroid Build Coastguard Worker     const bool rowPixelsTightlyPacked = (pixelSize == pixelPitch);
913*35238bceSAndroid Build Coastguard Worker 
914*35238bceSAndroid Build Coastguard Worker     if (access.getWidth() * access.getHeight() * access.getDepth() >= CLEAR_OPTIMIZE_THRESHOLD &&
915*35238bceSAndroid Build Coastguard Worker         pixelSize < CLEAR_OPTIMIZE_MAX_PIXEL_SIZE && rowPixelsTightlyPacked)
916*35238bceSAndroid Build Coastguard Worker     {
917*35238bceSAndroid Build Coastguard Worker         // Convert to destination format.
918*35238bceSAndroid Build Coastguard Worker         union
919*35238bceSAndroid Build Coastguard Worker         {
920*35238bceSAndroid Build Coastguard Worker             uint8_t u8[CLEAR_OPTIMIZE_MAX_PIXEL_SIZE];
921*35238bceSAndroid Build Coastguard Worker             uint64_t u64; // Forces 64-bit alignment.
922*35238bceSAndroid Build Coastguard Worker         } pixel;
923*35238bceSAndroid Build Coastguard Worker         DE_STATIC_ASSERT(sizeof(pixel) == CLEAR_OPTIMIZE_MAX_PIXEL_SIZE);
924*35238bceSAndroid Build Coastguard Worker         PixelBufferAccess(access.getFormat(), 1, 1, 1, 0, 0, &pixel.u8[0]).setPixel(color, 0, 0);
925*35238bceSAndroid Build Coastguard Worker 
926*35238bceSAndroid Build Coastguard Worker         for (int z = 0; z < access.getDepth(); z++)
927*35238bceSAndroid Build Coastguard Worker             for (int y = 0; y < access.getHeight(); y++)
928*35238bceSAndroid Build Coastguard Worker                 fillRow(access, y, z, pixelSize, &pixel.u8[0]);
929*35238bceSAndroid Build Coastguard Worker     }
930*35238bceSAndroid Build Coastguard Worker     else
931*35238bceSAndroid Build Coastguard Worker     {
932*35238bceSAndroid Build Coastguard Worker         for (int z = 0; z < access.getDepth(); z++)
933*35238bceSAndroid Build Coastguard Worker             for (int y = 0; y < access.getHeight(); y++)
934*35238bceSAndroid Build Coastguard Worker                 for (int x = 0; x < access.getWidth(); x++)
935*35238bceSAndroid Build Coastguard Worker                     access.setPixel(color, x, y, z);
936*35238bceSAndroid Build Coastguard Worker     }
937*35238bceSAndroid Build Coastguard Worker }
938*35238bceSAndroid Build Coastguard Worker 
clear(const PixelBufferAccess & access,const IVec4 & color)939*35238bceSAndroid Build Coastguard Worker void clear(const PixelBufferAccess &access, const IVec4 &color)
940*35238bceSAndroid Build Coastguard Worker {
941*35238bceSAndroid Build Coastguard Worker     const int pixelSize               = access.getFormat().getPixelSize();
942*35238bceSAndroid Build Coastguard Worker     const int pixelPitch              = access.getPixelPitch();
943*35238bceSAndroid Build Coastguard Worker     const bool rowPixelsTightlyPacked = (pixelSize == pixelPitch);
944*35238bceSAndroid Build Coastguard Worker 
945*35238bceSAndroid Build Coastguard Worker     if (access.getWidth() * access.getHeight() * access.getDepth() >= CLEAR_OPTIMIZE_THRESHOLD &&
946*35238bceSAndroid Build Coastguard Worker         pixelSize < CLEAR_OPTIMIZE_MAX_PIXEL_SIZE && rowPixelsTightlyPacked)
947*35238bceSAndroid Build Coastguard Worker     {
948*35238bceSAndroid Build Coastguard Worker         // Convert to destination format.
949*35238bceSAndroid Build Coastguard Worker         union
950*35238bceSAndroid Build Coastguard Worker         {
951*35238bceSAndroid Build Coastguard Worker             uint8_t u8[CLEAR_OPTIMIZE_MAX_PIXEL_SIZE];
952*35238bceSAndroid Build Coastguard Worker             uint64_t u64; // Forces 64-bit alignment.
953*35238bceSAndroid Build Coastguard Worker         } pixel;
954*35238bceSAndroid Build Coastguard Worker         DE_STATIC_ASSERT(sizeof(pixel) == CLEAR_OPTIMIZE_MAX_PIXEL_SIZE);
955*35238bceSAndroid Build Coastguard Worker         PixelBufferAccess(access.getFormat(), 1, 1, 1, 0, 0, &pixel.u8[0]).setPixel(color, 0, 0);
956*35238bceSAndroid Build Coastguard Worker 
957*35238bceSAndroid Build Coastguard Worker         for (int z = 0; z < access.getDepth(); z++)
958*35238bceSAndroid Build Coastguard Worker             for (int y = 0; y < access.getHeight(); y++)
959*35238bceSAndroid Build Coastguard Worker                 fillRow(access, y, z, pixelSize, &pixel.u8[0]);
960*35238bceSAndroid Build Coastguard Worker     }
961*35238bceSAndroid Build Coastguard Worker     else
962*35238bceSAndroid Build Coastguard Worker     {
963*35238bceSAndroid Build Coastguard Worker         for (int z = 0; z < access.getDepth(); z++)
964*35238bceSAndroid Build Coastguard Worker             for (int y = 0; y < access.getHeight(); y++)
965*35238bceSAndroid Build Coastguard Worker                 for (int x = 0; x < access.getWidth(); x++)
966*35238bceSAndroid Build Coastguard Worker                     access.setPixel(color, x, y, z);
967*35238bceSAndroid Build Coastguard Worker     }
968*35238bceSAndroid Build Coastguard Worker }
969*35238bceSAndroid Build Coastguard Worker 
clear(const PixelBufferAccess & access,const UVec4 & color)970*35238bceSAndroid Build Coastguard Worker void clear(const PixelBufferAccess &access, const UVec4 &color)
971*35238bceSAndroid Build Coastguard Worker {
972*35238bceSAndroid Build Coastguard Worker     clear(access, color.cast<int32_t>());
973*35238bceSAndroid Build Coastguard Worker }
974*35238bceSAndroid Build Coastguard Worker 
clearDepth(const PixelBufferAccess & access,float depth)975*35238bceSAndroid Build Coastguard Worker void clearDepth(const PixelBufferAccess &access, float depth)
976*35238bceSAndroid Build Coastguard Worker {
977*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(access.getFormat().order == TextureFormat::DS || access.getFormat().order == TextureFormat::D);
978*35238bceSAndroid Build Coastguard Worker 
979*35238bceSAndroid Build Coastguard Worker     clear(getEffectiveDepthStencilAccess(access, Sampler::MODE_DEPTH), tcu::Vec4(depth, 0.0f, 0.0f, 0.0f));
980*35238bceSAndroid Build Coastguard Worker }
981*35238bceSAndroid Build Coastguard Worker 
clearStencil(const PixelBufferAccess & access,int stencil)982*35238bceSAndroid Build Coastguard Worker void clearStencil(const PixelBufferAccess &access, int stencil)
983*35238bceSAndroid Build Coastguard Worker {
984*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(access.getFormat().order == TextureFormat::DS || access.getFormat().order == TextureFormat::S);
985*35238bceSAndroid Build Coastguard Worker 
986*35238bceSAndroid Build Coastguard Worker     clear(getEffectiveDepthStencilAccess(access, Sampler::MODE_STENCIL), tcu::UVec4(stencil, 0u, 0u, 0u));
987*35238bceSAndroid Build Coastguard Worker }
988*35238bceSAndroid Build Coastguard Worker 
989*35238bceSAndroid Build Coastguard Worker enum GradientStyle
990*35238bceSAndroid Build Coastguard Worker {
991*35238bceSAndroid Build Coastguard Worker     GRADIENT_STYLE_OLD     = 0,
992*35238bceSAndroid Build Coastguard Worker     GRADIENT_STYLE_NEW     = 1,
993*35238bceSAndroid Build Coastguard Worker     GRADIENT_STYLE_PYRAMID = 2
994*35238bceSAndroid Build Coastguard Worker };
995*35238bceSAndroid Build Coastguard Worker 
fillWithComponentGradients1D(const PixelBufferAccess & access,const Vec4 & minVal,const Vec4 & maxVal,GradientStyle)996*35238bceSAndroid Build Coastguard Worker static void fillWithComponentGradients1D(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal,
997*35238bceSAndroid Build Coastguard Worker                                          GradientStyle)
998*35238bceSAndroid Build Coastguard Worker {
999*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(access.getHeight() == 1);
1000*35238bceSAndroid Build Coastguard Worker     for (int x = 0; x < access.getWidth(); x++)
1001*35238bceSAndroid Build Coastguard Worker     {
1002*35238bceSAndroid Build Coastguard Worker         float s = ((float)x + 0.5f) / (float)access.getWidth();
1003*35238bceSAndroid Build Coastguard Worker 
1004*35238bceSAndroid Build Coastguard Worker         float r = linearInterpolate(s, minVal.x(), maxVal.x());
1005*35238bceSAndroid Build Coastguard Worker         float g = linearInterpolate(s, minVal.y(), maxVal.y());
1006*35238bceSAndroid Build Coastguard Worker         float b = linearInterpolate(s, minVal.z(), maxVal.z());
1007*35238bceSAndroid Build Coastguard Worker         float a = linearInterpolate(s, minVal.w(), maxVal.w());
1008*35238bceSAndroid Build Coastguard Worker 
1009*35238bceSAndroid Build Coastguard Worker         access.setPixel(tcu::Vec4(r, g, b, a), x, 0);
1010*35238bceSAndroid Build Coastguard Worker     }
1011*35238bceSAndroid Build Coastguard Worker }
1012*35238bceSAndroid Build Coastguard Worker 
fillWithComponentGradients2D(const PixelBufferAccess & access,const Vec4 & minVal,const Vec4 & maxVal,GradientStyle style)1013*35238bceSAndroid Build Coastguard Worker static void fillWithComponentGradients2D(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal,
1014*35238bceSAndroid Build Coastguard Worker                                          GradientStyle style)
1015*35238bceSAndroid Build Coastguard Worker {
1016*35238bceSAndroid Build Coastguard Worker     if (style == GRADIENT_STYLE_PYRAMID)
1017*35238bceSAndroid Build Coastguard Worker     {
1018*35238bceSAndroid Build Coastguard Worker         int xedge = deFloorFloatToInt32(float(access.getWidth()) * 0.6f);
1019*35238bceSAndroid Build Coastguard Worker         int yedge = deFloorFloatToInt32(float(access.getHeight()) * 0.6f);
1020*35238bceSAndroid Build Coastguard Worker 
1021*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < access.getHeight(); y++)
1022*35238bceSAndroid Build Coastguard Worker         {
1023*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < access.getWidth(); x++)
1024*35238bceSAndroid Build Coastguard Worker             {
1025*35238bceSAndroid Build Coastguard Worker                 float s     = ((float)x + 0.5f) / (float)access.getWidth();
1026*35238bceSAndroid Build Coastguard Worker                 float t     = ((float)y + 0.5f) / (float)access.getHeight();
1027*35238bceSAndroid Build Coastguard Worker                 float coefR = 0.0f;
1028*35238bceSAndroid Build Coastguard Worker                 float coefG = 0.0f;
1029*35238bceSAndroid Build Coastguard Worker                 float coefB = 0.0f;
1030*35238bceSAndroid Build Coastguard Worker                 float coefA = 0.0f;
1031*35238bceSAndroid Build Coastguard Worker 
1032*35238bceSAndroid Build Coastguard Worker                 coefR = (x < xedge) ? s * 0.4f : (1 - s) * 0.6f;
1033*35238bceSAndroid Build Coastguard Worker                 coefG = (x < xedge) ? s * 0.4f : (1 - s) * 0.6f;
1034*35238bceSAndroid Build Coastguard Worker                 coefB = (x < xedge) ? (1.0f - s) * 0.4f : s * 0.6f - 0.2f;
1035*35238bceSAndroid Build Coastguard Worker                 coefA = (x < xedge) ? (1.0f - s) * 0.4f : s * 0.6f - 0.2f;
1036*35238bceSAndroid Build Coastguard Worker 
1037*35238bceSAndroid Build Coastguard Worker                 coefR += (y < yedge) ? t * 0.4f : (1 - t) * 0.6f;
1038*35238bceSAndroid Build Coastguard Worker                 coefG += (y < yedge) ? (1.0f - t) * 0.4f : t * 0.6f - 0.2f;
1039*35238bceSAndroid Build Coastguard Worker                 coefB += (y < yedge) ? t * 0.4f : (1 - t) * 0.6f;
1040*35238bceSAndroid Build Coastguard Worker                 coefA += (y < yedge) ? (1.0f - t) * 0.4f : t * 0.6f - 0.2f;
1041*35238bceSAndroid Build Coastguard Worker 
1042*35238bceSAndroid Build Coastguard Worker                 float r = linearInterpolate(coefR, minVal.x(), maxVal.x());
1043*35238bceSAndroid Build Coastguard Worker                 float g = linearInterpolate(coefG, minVal.y(), maxVal.y());
1044*35238bceSAndroid Build Coastguard Worker                 float b = linearInterpolate(coefB, minVal.z(), maxVal.z());
1045*35238bceSAndroid Build Coastguard Worker                 float a = linearInterpolate(coefA, minVal.w(), maxVal.w());
1046*35238bceSAndroid Build Coastguard Worker 
1047*35238bceSAndroid Build Coastguard Worker                 access.setPixel(tcu::Vec4(r, g, b, a), x, y);
1048*35238bceSAndroid Build Coastguard Worker             }
1049*35238bceSAndroid Build Coastguard Worker         }
1050*35238bceSAndroid Build Coastguard Worker     }
1051*35238bceSAndroid Build Coastguard Worker     else
1052*35238bceSAndroid Build Coastguard Worker     {
1053*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < access.getHeight(); y++)
1054*35238bceSAndroid Build Coastguard Worker         {
1055*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < access.getWidth(); x++)
1056*35238bceSAndroid Build Coastguard Worker             {
1057*35238bceSAndroid Build Coastguard Worker                 float s = ((float)x + 0.5f) / (float)access.getWidth();
1058*35238bceSAndroid Build Coastguard Worker                 float t = ((float)y + 0.5f) / (float)access.getHeight();
1059*35238bceSAndroid Build Coastguard Worker 
1060*35238bceSAndroid Build Coastguard Worker                 float r = linearInterpolate((s + t) * 0.5f, minVal.x(), maxVal.x());
1061*35238bceSAndroid Build Coastguard Worker                 float g = linearInterpolate((s + (1.0f - t)) * 0.5f, minVal.y(), maxVal.y());
1062*35238bceSAndroid Build Coastguard Worker                 float b = linearInterpolate(((1.0f - s) + t) * 0.5f, minVal.z(), maxVal.z());
1063*35238bceSAndroid Build Coastguard Worker                 float a = linearInterpolate(((1.0f - s) + (1.0f - t)) * 0.5f, minVal.w(), maxVal.w());
1064*35238bceSAndroid Build Coastguard Worker 
1065*35238bceSAndroid Build Coastguard Worker                 access.setPixel(tcu::Vec4(r, g, b, a), x, y);
1066*35238bceSAndroid Build Coastguard Worker             }
1067*35238bceSAndroid Build Coastguard Worker         }
1068*35238bceSAndroid Build Coastguard Worker     }
1069*35238bceSAndroid Build Coastguard Worker }
1070*35238bceSAndroid Build Coastguard Worker 
fillWithComponentGradients3D(const PixelBufferAccess & dst,const Vec4 & minVal,const Vec4 & maxVal,GradientStyle style)1071*35238bceSAndroid Build Coastguard Worker static void fillWithComponentGradients3D(const PixelBufferAccess &dst, const Vec4 &minVal, const Vec4 &maxVal,
1072*35238bceSAndroid Build Coastguard Worker                                          GradientStyle style)
1073*35238bceSAndroid Build Coastguard Worker {
1074*35238bceSAndroid Build Coastguard Worker     for (int z = 0; z < dst.getDepth(); z++)
1075*35238bceSAndroid Build Coastguard Worker     {
1076*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < dst.getHeight(); y++)
1077*35238bceSAndroid Build Coastguard Worker         {
1078*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < dst.getWidth(); x++)
1079*35238bceSAndroid Build Coastguard Worker             {
1080*35238bceSAndroid Build Coastguard Worker                 float s = ((float)x + 0.5f) / (float)dst.getWidth();
1081*35238bceSAndroid Build Coastguard Worker                 float t = ((float)y + 0.5f) / (float)dst.getHeight();
1082*35238bceSAndroid Build Coastguard Worker                 float p = ((float)z + 0.5f) / (float)dst.getDepth();
1083*35238bceSAndroid Build Coastguard Worker 
1084*35238bceSAndroid Build Coastguard Worker                 float r, g, b, a;
1085*35238bceSAndroid Build Coastguard Worker 
1086*35238bceSAndroid Build Coastguard Worker                 if (style == GRADIENT_STYLE_NEW)
1087*35238bceSAndroid Build Coastguard Worker                 {
1088*35238bceSAndroid Build Coastguard Worker                     // R, G, B and A all depend on every coordinate.
1089*35238bceSAndroid Build Coastguard Worker                     r = linearInterpolate((s + t + p) / 3.0f, minVal.x(), maxVal.x());
1090*35238bceSAndroid Build Coastguard Worker                     g = linearInterpolate((s + (1.0f - (t + p) * 0.5f) * 2.0f) / 3.0f, minVal.y(), maxVal.y());
1091*35238bceSAndroid Build Coastguard Worker                     b = linearInterpolate(((1.0f - (s + t) * 0.5f) * 2.0f + p) / 3.0f, minVal.z(), maxVal.z());
1092*35238bceSAndroid Build Coastguard Worker                     a = linearInterpolate(1.0f - (s + t + p) / 3.0f, minVal.w(), maxVal.w());
1093*35238bceSAndroid Build Coastguard Worker                 }
1094*35238bceSAndroid Build Coastguard Worker                 else // GRADIENT_STYLE_OLD
1095*35238bceSAndroid Build Coastguard Worker                 {
1096*35238bceSAndroid Build Coastguard Worker                     // Each of R, G and B only depend on X, Y and Z, respectively.
1097*35238bceSAndroid Build Coastguard Worker                     r = linearInterpolate(s, minVal.x(), maxVal.x());
1098*35238bceSAndroid Build Coastguard Worker                     g = linearInterpolate(t, minVal.y(), maxVal.y());
1099*35238bceSAndroid Build Coastguard Worker                     b = linearInterpolate(p, minVal.z(), maxVal.z());
1100*35238bceSAndroid Build Coastguard Worker                     a = linearInterpolate(1.0f - (s + t + p) / 3.0f, minVal.w(), maxVal.w());
1101*35238bceSAndroid Build Coastguard Worker                 }
1102*35238bceSAndroid Build Coastguard Worker 
1103*35238bceSAndroid Build Coastguard Worker                 dst.setPixel(tcu::Vec4(r, g, b, a), x, y, z);
1104*35238bceSAndroid Build Coastguard Worker             }
1105*35238bceSAndroid Build Coastguard Worker         }
1106*35238bceSAndroid Build Coastguard Worker     }
1107*35238bceSAndroid Build Coastguard Worker }
1108*35238bceSAndroid Build Coastguard Worker 
fillWithComponentGradientsStyled(const PixelBufferAccess & access,const Vec4 & minVal,const Vec4 & maxVal,GradientStyle style)1109*35238bceSAndroid Build Coastguard Worker void fillWithComponentGradientsStyled(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal,
1110*35238bceSAndroid Build Coastguard Worker                                       GradientStyle style)
1111*35238bceSAndroid Build Coastguard Worker {
1112*35238bceSAndroid Build Coastguard Worker     if (isCombinedDepthStencilType(access.getFormat().type))
1113*35238bceSAndroid Build Coastguard Worker     {
1114*35238bceSAndroid Build Coastguard Worker         const bool hasDepth =
1115*35238bceSAndroid Build Coastguard Worker             access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::D;
1116*35238bceSAndroid Build Coastguard Worker         const bool hasStencil =
1117*35238bceSAndroid Build Coastguard Worker             access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::S;
1118*35238bceSAndroid Build Coastguard Worker 
1119*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(hasDepth || hasStencil);
1120*35238bceSAndroid Build Coastguard Worker 
1121*35238bceSAndroid Build Coastguard Worker         // For combined formats, treat D and S as separate channels
1122*35238bceSAndroid Build Coastguard Worker         if (hasDepth)
1123*35238bceSAndroid Build Coastguard Worker             fillWithComponentGradientsStyled(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_DEPTH), minVal,
1124*35238bceSAndroid Build Coastguard Worker                                              maxVal, style);
1125*35238bceSAndroid Build Coastguard Worker         if (hasStencil)
1126*35238bceSAndroid Build Coastguard Worker             fillWithComponentGradientsStyled(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_STENCIL),
1127*35238bceSAndroid Build Coastguard Worker                                              minVal.swizzle(3, 2, 1, 0), maxVal.swizzle(3, 2, 1, 0), style);
1128*35238bceSAndroid Build Coastguard Worker     }
1129*35238bceSAndroid Build Coastguard Worker     else
1130*35238bceSAndroid Build Coastguard Worker     {
1131*35238bceSAndroid Build Coastguard Worker         if (access.getHeight() == 1 && access.getDepth() == 1)
1132*35238bceSAndroid Build Coastguard Worker             fillWithComponentGradients1D(access, minVal, maxVal, style);
1133*35238bceSAndroid Build Coastguard Worker         else if (access.getDepth() == 1)
1134*35238bceSAndroid Build Coastguard Worker             fillWithComponentGradients2D(access, minVal, maxVal, style);
1135*35238bceSAndroid Build Coastguard Worker         else
1136*35238bceSAndroid Build Coastguard Worker             fillWithComponentGradients3D(access, minVal, maxVal, style);
1137*35238bceSAndroid Build Coastguard Worker     }
1138*35238bceSAndroid Build Coastguard Worker }
1139*35238bceSAndroid Build Coastguard Worker 
fillWithComponentGradients(const PixelBufferAccess & access,const Vec4 & minVal,const Vec4 & maxVal)1140*35238bceSAndroid Build Coastguard Worker void fillWithComponentGradients(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal)
1141*35238bceSAndroid Build Coastguard Worker {
1142*35238bceSAndroid Build Coastguard Worker     fillWithComponentGradientsStyled(access, minVal, maxVal, GRADIENT_STYLE_OLD);
1143*35238bceSAndroid Build Coastguard Worker }
1144*35238bceSAndroid Build Coastguard Worker 
fillWithComponentGradients2(const PixelBufferAccess & access,const Vec4 & minVal,const Vec4 & maxVal)1145*35238bceSAndroid Build Coastguard Worker void fillWithComponentGradients2(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal)
1146*35238bceSAndroid Build Coastguard Worker {
1147*35238bceSAndroid Build Coastguard Worker     fillWithComponentGradientsStyled(access, minVal, maxVal, GRADIENT_STYLE_NEW);
1148*35238bceSAndroid Build Coastguard Worker }
1149*35238bceSAndroid Build Coastguard Worker 
fillWithComponentGradients3(const PixelBufferAccess & access,const Vec4 & minVal,const Vec4 & maxVal)1150*35238bceSAndroid Build Coastguard Worker void fillWithComponentGradients3(const PixelBufferAccess &access, const Vec4 &minVal, const Vec4 &maxVal)
1151*35238bceSAndroid Build Coastguard Worker {
1152*35238bceSAndroid Build Coastguard Worker     fillWithComponentGradientsStyled(access, minVal, maxVal, GRADIENT_STYLE_PYRAMID);
1153*35238bceSAndroid Build Coastguard Worker }
1154*35238bceSAndroid Build Coastguard Worker 
fillWithGrid1D(const PixelBufferAccess & access,int cellSize,const Vec4 & colorA,const Vec4 & colorB)1155*35238bceSAndroid Build Coastguard Worker static void fillWithGrid1D(const PixelBufferAccess &access, int cellSize, const Vec4 &colorA, const Vec4 &colorB)
1156*35238bceSAndroid Build Coastguard Worker {
1157*35238bceSAndroid Build Coastguard Worker     for (int x = 0; x < access.getWidth(); x++)
1158*35238bceSAndroid Build Coastguard Worker     {
1159*35238bceSAndroid Build Coastguard Worker         int mx = (x / cellSize) % 2;
1160*35238bceSAndroid Build Coastguard Worker 
1161*35238bceSAndroid Build Coastguard Worker         if (mx)
1162*35238bceSAndroid Build Coastguard Worker             access.setPixel(colorB, x, 0);
1163*35238bceSAndroid Build Coastguard Worker         else
1164*35238bceSAndroid Build Coastguard Worker             access.setPixel(colorA, x, 0);
1165*35238bceSAndroid Build Coastguard Worker     }
1166*35238bceSAndroid Build Coastguard Worker }
1167*35238bceSAndroid Build Coastguard Worker 
fillWithGrid2D(const PixelBufferAccess & access,int cellSize,const Vec4 & colorA,const Vec4 & colorB)1168*35238bceSAndroid Build Coastguard Worker static void fillWithGrid2D(const PixelBufferAccess &access, int cellSize, const Vec4 &colorA, const Vec4 &colorB)
1169*35238bceSAndroid Build Coastguard Worker {
1170*35238bceSAndroid Build Coastguard Worker     for (int y = 0; y < access.getHeight(); y++)
1171*35238bceSAndroid Build Coastguard Worker     {
1172*35238bceSAndroid Build Coastguard Worker         for (int x = 0; x < access.getWidth(); x++)
1173*35238bceSAndroid Build Coastguard Worker         {
1174*35238bceSAndroid Build Coastguard Worker             int mx = (x / cellSize) % 2;
1175*35238bceSAndroid Build Coastguard Worker             int my = (y / cellSize) % 2;
1176*35238bceSAndroid Build Coastguard Worker 
1177*35238bceSAndroid Build Coastguard Worker             if (mx ^ my)
1178*35238bceSAndroid Build Coastguard Worker                 access.setPixel(colorB, x, y);
1179*35238bceSAndroid Build Coastguard Worker             else
1180*35238bceSAndroid Build Coastguard Worker                 access.setPixel(colorA, x, y);
1181*35238bceSAndroid Build Coastguard Worker         }
1182*35238bceSAndroid Build Coastguard Worker     }
1183*35238bceSAndroid Build Coastguard Worker }
1184*35238bceSAndroid Build Coastguard Worker 
fillWithGrid3D(const PixelBufferAccess & access,int cellSize,const Vec4 & colorA,const Vec4 & colorB)1185*35238bceSAndroid Build Coastguard Worker static void fillWithGrid3D(const PixelBufferAccess &access, int cellSize, const Vec4 &colorA, const Vec4 &colorB)
1186*35238bceSAndroid Build Coastguard Worker {
1187*35238bceSAndroid Build Coastguard Worker     for (int z = 0; z < access.getDepth(); z++)
1188*35238bceSAndroid Build Coastguard Worker     {
1189*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < access.getHeight(); y++)
1190*35238bceSAndroid Build Coastguard Worker         {
1191*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < access.getWidth(); x++)
1192*35238bceSAndroid Build Coastguard Worker             {
1193*35238bceSAndroid Build Coastguard Worker                 int mx = (x / cellSize) % 2;
1194*35238bceSAndroid Build Coastguard Worker                 int my = (y / cellSize) % 2;
1195*35238bceSAndroid Build Coastguard Worker                 int mz = (z / cellSize) % 2;
1196*35238bceSAndroid Build Coastguard Worker 
1197*35238bceSAndroid Build Coastguard Worker                 if (mx ^ my ^ mz)
1198*35238bceSAndroid Build Coastguard Worker                     access.setPixel(colorB, x, y, z);
1199*35238bceSAndroid Build Coastguard Worker                 else
1200*35238bceSAndroid Build Coastguard Worker                     access.setPixel(colorA, x, y, z);
1201*35238bceSAndroid Build Coastguard Worker             }
1202*35238bceSAndroid Build Coastguard Worker         }
1203*35238bceSAndroid Build Coastguard Worker     }
1204*35238bceSAndroid Build Coastguard Worker }
1205*35238bceSAndroid Build Coastguard Worker 
fillWithGrid(const PixelBufferAccess & access,int cellSize,const Vec4 & colorA,const Vec4 & colorB)1206*35238bceSAndroid Build Coastguard Worker void fillWithGrid(const PixelBufferAccess &access, int cellSize, const Vec4 &colorA, const Vec4 &colorB)
1207*35238bceSAndroid Build Coastguard Worker {
1208*35238bceSAndroid Build Coastguard Worker     if (isCombinedDepthStencilType(access.getFormat().type))
1209*35238bceSAndroid Build Coastguard Worker     {
1210*35238bceSAndroid Build Coastguard Worker         const bool hasDepth =
1211*35238bceSAndroid Build Coastguard Worker             access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::D;
1212*35238bceSAndroid Build Coastguard Worker         const bool hasStencil =
1213*35238bceSAndroid Build Coastguard Worker             access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::S;
1214*35238bceSAndroid Build Coastguard Worker 
1215*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(hasDepth || hasStencil);
1216*35238bceSAndroid Build Coastguard Worker 
1217*35238bceSAndroid Build Coastguard Worker         // For combined formats, treat D and S as separate channels
1218*35238bceSAndroid Build Coastguard Worker         if (hasDepth)
1219*35238bceSAndroid Build Coastguard Worker             fillWithGrid(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_DEPTH), cellSize, colorA, colorB);
1220*35238bceSAndroid Build Coastguard Worker         if (hasStencil)
1221*35238bceSAndroid Build Coastguard Worker             fillWithGrid(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_STENCIL), cellSize,
1222*35238bceSAndroid Build Coastguard Worker                          colorA.swizzle(3, 2, 1, 0), colorB.swizzle(3, 2, 1, 0));
1223*35238bceSAndroid Build Coastguard Worker     }
1224*35238bceSAndroid Build Coastguard Worker     else
1225*35238bceSAndroid Build Coastguard Worker     {
1226*35238bceSAndroid Build Coastguard Worker         if (access.getHeight() == 1 && access.getDepth() == 1)
1227*35238bceSAndroid Build Coastguard Worker             fillWithGrid1D(access, cellSize, colorA, colorB);
1228*35238bceSAndroid Build Coastguard Worker         else if (access.getDepth() == 1)
1229*35238bceSAndroid Build Coastguard Worker             fillWithGrid2D(access, cellSize, colorA, colorB);
1230*35238bceSAndroid Build Coastguard Worker         else
1231*35238bceSAndroid Build Coastguard Worker             fillWithGrid3D(access, cellSize, colorA, colorB);
1232*35238bceSAndroid Build Coastguard Worker     }
1233*35238bceSAndroid Build Coastguard Worker }
1234*35238bceSAndroid Build Coastguard Worker 
fillWithRepeatableGradient(const PixelBufferAccess & access,const Vec4 & colorA,const Vec4 & colorB)1235*35238bceSAndroid Build Coastguard Worker void fillWithRepeatableGradient(const PixelBufferAccess &access, const Vec4 &colorA, const Vec4 &colorB)
1236*35238bceSAndroid Build Coastguard Worker {
1237*35238bceSAndroid Build Coastguard Worker     for (int y = 0; y < access.getHeight(); y++)
1238*35238bceSAndroid Build Coastguard Worker     {
1239*35238bceSAndroid Build Coastguard Worker         for (int x = 0; x < access.getWidth(); x++)
1240*35238bceSAndroid Build Coastguard Worker         {
1241*35238bceSAndroid Build Coastguard Worker             float s = ((float)x + 0.5f) / (float)access.getWidth();
1242*35238bceSAndroid Build Coastguard Worker             float t = ((float)y + 0.5f) / (float)access.getHeight();
1243*35238bceSAndroid Build Coastguard Worker 
1244*35238bceSAndroid Build Coastguard Worker             float a = s > 0.5f ? (2.0f - 2.0f * s) : 2.0f * s;
1245*35238bceSAndroid Build Coastguard Worker             float b = t > 0.5f ? (2.0f - 2.0f * t) : 2.0f * t;
1246*35238bceSAndroid Build Coastguard Worker 
1247*35238bceSAndroid Build Coastguard Worker             float p = deFloatClamp(deFloatSqrt(a * a + b * b), 0.0f, 1.0f);
1248*35238bceSAndroid Build Coastguard Worker             access.setPixel(linearInterpolate(p, colorA, colorB), x, y);
1249*35238bceSAndroid Build Coastguard Worker         }
1250*35238bceSAndroid Build Coastguard Worker     }
1251*35238bceSAndroid Build Coastguard Worker }
1252*35238bceSAndroid Build Coastguard Worker 
fillWithRGBAQuads(const PixelBufferAccess & dst)1253*35238bceSAndroid Build Coastguard Worker void fillWithRGBAQuads(const PixelBufferAccess &dst)
1254*35238bceSAndroid Build Coastguard Worker {
1255*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_INTERNAL(dst.getDepth() == 1);
1256*35238bceSAndroid Build Coastguard Worker     int width  = dst.getWidth();
1257*35238bceSAndroid Build Coastguard Worker     int height = dst.getHeight();
1258*35238bceSAndroid Build Coastguard Worker     int left   = width / 2;
1259*35238bceSAndroid Build Coastguard Worker     int top    = height / 2;
1260*35238bceSAndroid Build Coastguard Worker 
1261*35238bceSAndroid Build Coastguard Worker     clear(getSubregion(dst, 0, 0, 0, left, top, 1), Vec4(1.0f, 0.0f, 0.0f, 1.0f));
1262*35238bceSAndroid Build Coastguard Worker     clear(getSubregion(dst, left, 0, 0, width - left, top, 1), Vec4(0.0f, 1.0f, 0.0f, 1.0f));
1263*35238bceSAndroid Build Coastguard Worker     clear(getSubregion(dst, 0, top, 0, left, height - top, 1), Vec4(0.0f, 0.0f, 1.0f, 0.0f));
1264*35238bceSAndroid Build Coastguard Worker     clear(getSubregion(dst, left, top, 0, width - left, height - top, 1), Vec4(0.5f, 0.5f, 0.5f, 1.0f));
1265*35238bceSAndroid Build Coastguard Worker }
1266*35238bceSAndroid Build Coastguard Worker 
1267*35238bceSAndroid Build Coastguard Worker // \todo [2012-11-13 pyry] There is much better metaballs code in CL SIR value generators.
fillWithMetaballs(const PixelBufferAccess & dst,int numBalls,uint32_t seed)1268*35238bceSAndroid Build Coastguard Worker void fillWithMetaballs(const PixelBufferAccess &dst, int numBalls, uint32_t seed)
1269*35238bceSAndroid Build Coastguard Worker {
1270*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_INTERNAL(dst.getDepth() == 1);
1271*35238bceSAndroid Build Coastguard Worker     std::vector<Vec2> points(numBalls);
1272*35238bceSAndroid Build Coastguard Worker     de::Random rnd(seed);
1273*35238bceSAndroid Build Coastguard Worker 
1274*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < numBalls; i++)
1275*35238bceSAndroid Build Coastguard Worker     {
1276*35238bceSAndroid Build Coastguard Worker         float x   = rnd.getFloat();
1277*35238bceSAndroid Build Coastguard Worker         float y   = rnd.getFloat();
1278*35238bceSAndroid Build Coastguard Worker         points[i] = (Vec2(x, y));
1279*35238bceSAndroid Build Coastguard Worker     }
1280*35238bceSAndroid Build Coastguard Worker 
1281*35238bceSAndroid Build Coastguard Worker     for (int y = 0; y < dst.getHeight(); y++)
1282*35238bceSAndroid Build Coastguard Worker         for (int x = 0; x < dst.getWidth(); x++)
1283*35238bceSAndroid Build Coastguard Worker         {
1284*35238bceSAndroid Build Coastguard Worker             Vec2 p((float)x / (float)dst.getWidth(), (float)y / (float)dst.getHeight());
1285*35238bceSAndroid Build Coastguard Worker 
1286*35238bceSAndroid Build Coastguard Worker             float sum = 0.0f;
1287*35238bceSAndroid Build Coastguard Worker             for (std::vector<Vec2>::const_iterator i = points.begin(); i != points.end(); i++)
1288*35238bceSAndroid Build Coastguard Worker             {
1289*35238bceSAndroid Build Coastguard Worker                 Vec2 d  = p - *i;
1290*35238bceSAndroid Build Coastguard Worker                 float f = 0.01f / (d.x() * d.x() + d.y() * d.y());
1291*35238bceSAndroid Build Coastguard Worker 
1292*35238bceSAndroid Build Coastguard Worker                 sum += f;
1293*35238bceSAndroid Build Coastguard Worker             }
1294*35238bceSAndroid Build Coastguard Worker 
1295*35238bceSAndroid Build Coastguard Worker             dst.setPixel(Vec4(sum), x, y);
1296*35238bceSAndroid Build Coastguard Worker         }
1297*35238bceSAndroid Build Coastguard Worker }
1298*35238bceSAndroid Build Coastguard Worker 
copy(const PixelBufferAccess & dst,const ConstPixelBufferAccess & src,const bool clearUnused)1299*35238bceSAndroid Build Coastguard Worker void copy(const PixelBufferAccess &dst, const ConstPixelBufferAccess &src, const bool clearUnused)
1300*35238bceSAndroid Build Coastguard Worker {
1301*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(src.getSize() == dst.getSize());
1302*35238bceSAndroid Build Coastguard Worker 
1303*35238bceSAndroid Build Coastguard Worker     const int width  = dst.getWidth();
1304*35238bceSAndroid Build Coastguard Worker     const int height = dst.getHeight();
1305*35238bceSAndroid Build Coastguard Worker     const int depth  = dst.getDepth();
1306*35238bceSAndroid Build Coastguard Worker 
1307*35238bceSAndroid Build Coastguard Worker     const int srcPixelSize      = src.getFormat().getPixelSize();
1308*35238bceSAndroid Build Coastguard Worker     const int dstPixelSize      = dst.getFormat().getPixelSize();
1309*35238bceSAndroid Build Coastguard Worker     const int srcPixelPitch     = src.getPixelPitch();
1310*35238bceSAndroid Build Coastguard Worker     const int dstPixelPitch     = dst.getPixelPitch();
1311*35238bceSAndroid Build Coastguard Worker     const bool srcTightlyPacked = (srcPixelSize == srcPixelPitch);
1312*35238bceSAndroid Build Coastguard Worker     const bool dstTightlyPacked = (dstPixelSize == dstPixelPitch);
1313*35238bceSAndroid Build Coastguard Worker 
1314*35238bceSAndroid Build Coastguard Worker     const bool srcHasDepth =
1315*35238bceSAndroid Build Coastguard Worker         (src.getFormat().order == tcu::TextureFormat::DS || src.getFormat().order == tcu::TextureFormat::D);
1316*35238bceSAndroid Build Coastguard Worker     const bool srcHasStencil =
1317*35238bceSAndroid Build Coastguard Worker         (src.getFormat().order == tcu::TextureFormat::DS || src.getFormat().order == tcu::TextureFormat::S);
1318*35238bceSAndroid Build Coastguard Worker     const bool dstHasDepth =
1319*35238bceSAndroid Build Coastguard Worker         (dst.getFormat().order == tcu::TextureFormat::DS || dst.getFormat().order == tcu::TextureFormat::D);
1320*35238bceSAndroid Build Coastguard Worker     const bool dstHasStencil =
1321*35238bceSAndroid Build Coastguard Worker         (dst.getFormat().order == tcu::TextureFormat::DS || dst.getFormat().order == tcu::TextureFormat::S);
1322*35238bceSAndroid Build Coastguard Worker 
1323*35238bceSAndroid Build Coastguard Worker     if (src.getFormat() == dst.getFormat() && srcTightlyPacked && dstTightlyPacked)
1324*35238bceSAndroid Build Coastguard Worker     {
1325*35238bceSAndroid Build Coastguard Worker         // Fast-path for matching formats.
1326*35238bceSAndroid Build Coastguard Worker         for (int z = 0; z < depth; z++)
1327*35238bceSAndroid Build Coastguard Worker             for (int y = 0; y < height; y++)
1328*35238bceSAndroid Build Coastguard Worker                 deMemcpy(dst.getPixelPtr(0, y, z), src.getPixelPtr(0, y, z), srcPixelSize * width);
1329*35238bceSAndroid Build Coastguard Worker     }
1330*35238bceSAndroid Build Coastguard Worker     else if (src.getFormat() == dst.getFormat())
1331*35238bceSAndroid Build Coastguard Worker     {
1332*35238bceSAndroid Build Coastguard Worker         // Bit-exact copy for matching formats.
1333*35238bceSAndroid Build Coastguard Worker         for (int z = 0; z < depth; z++)
1334*35238bceSAndroid Build Coastguard Worker             for (int y = 0; y < height; y++)
1335*35238bceSAndroid Build Coastguard Worker                 for (int x = 0; x < width; x++)
1336*35238bceSAndroid Build Coastguard Worker                     deMemcpy(dst.getPixelPtr(x, y, z), src.getPixelPtr(x, y, z), srcPixelSize);
1337*35238bceSAndroid Build Coastguard Worker     }
1338*35238bceSAndroid Build Coastguard Worker     else if (srcHasDepth || srcHasStencil || dstHasDepth || dstHasStencil)
1339*35238bceSAndroid Build Coastguard Worker     {
1340*35238bceSAndroid Build Coastguard Worker         DE_ASSERT((srcHasDepth && dstHasDepth) ||
1341*35238bceSAndroid Build Coastguard Worker                   (srcHasStencil && dstHasStencil)); // must have at least one common channel
1342*35238bceSAndroid Build Coastguard Worker 
1343*35238bceSAndroid Build Coastguard Worker         if (dstHasDepth && srcHasDepth)
1344*35238bceSAndroid Build Coastguard Worker         {
1345*35238bceSAndroid Build Coastguard Worker             for (int z = 0; z < depth; z++)
1346*35238bceSAndroid Build Coastguard Worker                 for (int y = 0; y < height; y++)
1347*35238bceSAndroid Build Coastguard Worker                     for (int x = 0; x < width; x++)
1348*35238bceSAndroid Build Coastguard Worker                         dst.setPixDepth(src.getPixDepth(x, y, z), x, y, z);
1349*35238bceSAndroid Build Coastguard Worker         }
1350*35238bceSAndroid Build Coastguard Worker         else if (dstHasDepth && !srcHasDepth && clearUnused)
1351*35238bceSAndroid Build Coastguard Worker         {
1352*35238bceSAndroid Build Coastguard Worker             // consistency with color copies
1353*35238bceSAndroid Build Coastguard Worker             tcu::clearDepth(dst, 0.0f);
1354*35238bceSAndroid Build Coastguard Worker         }
1355*35238bceSAndroid Build Coastguard Worker 
1356*35238bceSAndroid Build Coastguard Worker         if (dstHasStencil && srcHasStencil)
1357*35238bceSAndroid Build Coastguard Worker         {
1358*35238bceSAndroid Build Coastguard Worker             for (int z = 0; z < depth; z++)
1359*35238bceSAndroid Build Coastguard Worker                 for (int y = 0; y < height; y++)
1360*35238bceSAndroid Build Coastguard Worker                     for (int x = 0; x < width; x++)
1361*35238bceSAndroid Build Coastguard Worker                         dst.setPixStencil(src.getPixStencil(x, y, z), x, y, z);
1362*35238bceSAndroid Build Coastguard Worker         }
1363*35238bceSAndroid Build Coastguard Worker         else if (dstHasStencil && !srcHasStencil && clearUnused)
1364*35238bceSAndroid Build Coastguard Worker         {
1365*35238bceSAndroid Build Coastguard Worker             // consistency with color copies
1366*35238bceSAndroid Build Coastguard Worker             tcu::clearStencil(dst, 0u);
1367*35238bceSAndroid Build Coastguard Worker         }
1368*35238bceSAndroid Build Coastguard Worker     }
1369*35238bceSAndroid Build Coastguard Worker     else
1370*35238bceSAndroid Build Coastguard Worker     {
1371*35238bceSAndroid Build Coastguard Worker         TextureChannelClass srcClass = getTextureChannelClass(src.getFormat().type);
1372*35238bceSAndroid Build Coastguard Worker         TextureChannelClass dstClass = getTextureChannelClass(dst.getFormat().type);
1373*35238bceSAndroid Build Coastguard Worker         bool srcIsInt =
1374*35238bceSAndroid Build Coastguard Worker             srcClass == TEXTURECHANNELCLASS_SIGNED_INTEGER || srcClass == TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
1375*35238bceSAndroid Build Coastguard Worker         bool dstIsInt =
1376*35238bceSAndroid Build Coastguard Worker             dstClass == TEXTURECHANNELCLASS_SIGNED_INTEGER || dstClass == TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
1377*35238bceSAndroid Build Coastguard Worker 
1378*35238bceSAndroid Build Coastguard Worker         if (srcIsInt && dstIsInt)
1379*35238bceSAndroid Build Coastguard Worker         {
1380*35238bceSAndroid Build Coastguard Worker             for (int z = 0; z < depth; z++)
1381*35238bceSAndroid Build Coastguard Worker                 for (int y = 0; y < height; y++)
1382*35238bceSAndroid Build Coastguard Worker                     for (int x = 0; x < width; x++)
1383*35238bceSAndroid Build Coastguard Worker                         dst.setPixel(src.getPixelInt(x, y, z), x, y, z);
1384*35238bceSAndroid Build Coastguard Worker         }
1385*35238bceSAndroid Build Coastguard Worker         else
1386*35238bceSAndroid Build Coastguard Worker         {
1387*35238bceSAndroid Build Coastguard Worker             for (int z = 0; z < depth; z++)
1388*35238bceSAndroid Build Coastguard Worker                 for (int y = 0; y < height; y++)
1389*35238bceSAndroid Build Coastguard Worker                     for (int x = 0; x < width; x++)
1390*35238bceSAndroid Build Coastguard Worker                         dst.setPixel(src.getPixel(x, y, z), x, y, z);
1391*35238bceSAndroid Build Coastguard Worker         }
1392*35238bceSAndroid Build Coastguard Worker     }
1393*35238bceSAndroid Build Coastguard Worker }
1394*35238bceSAndroid Build Coastguard Worker 
scale(const PixelBufferAccess & dst,const ConstPixelBufferAccess & src,Sampler::FilterMode filter)1395*35238bceSAndroid Build Coastguard Worker void scale(const PixelBufferAccess &dst, const ConstPixelBufferAccess &src, Sampler::FilterMode filter)
1396*35238bceSAndroid Build Coastguard Worker {
1397*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(filter == Sampler::NEAREST || filter == Sampler::LINEAR);
1398*35238bceSAndroid Build Coastguard Worker 
1399*35238bceSAndroid Build Coastguard Worker     Sampler sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, filter, filter, 0.0f,
1400*35238bceSAndroid Build Coastguard Worker                     false);
1401*35238bceSAndroid Build Coastguard Worker 
1402*35238bceSAndroid Build Coastguard Worker     float sX = (float)src.getWidth() / (float)dst.getWidth();
1403*35238bceSAndroid Build Coastguard Worker     float sY = (float)src.getHeight() / (float)dst.getHeight();
1404*35238bceSAndroid Build Coastguard Worker     float sZ = (float)src.getDepth() / (float)dst.getDepth();
1405*35238bceSAndroid Build Coastguard Worker 
1406*35238bceSAndroid Build Coastguard Worker     if (dst.getDepth() == 1 && src.getDepth() == 1)
1407*35238bceSAndroid Build Coastguard Worker     {
1408*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < dst.getHeight(); y++)
1409*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < dst.getWidth(); x++)
1410*35238bceSAndroid Build Coastguard Worker                 dst.setPixel(linearToSRGBIfNeeded(dst.getFormat(), src.sample2D(sampler, filter, ((float)x + 0.5f) * sX,
1411*35238bceSAndroid Build Coastguard Worker                                                                                 ((float)y + 0.5f) * sY, 0)),
1412*35238bceSAndroid Build Coastguard Worker                              x, y);
1413*35238bceSAndroid Build Coastguard Worker     }
1414*35238bceSAndroid Build Coastguard Worker     else
1415*35238bceSAndroid Build Coastguard Worker     {
1416*35238bceSAndroid Build Coastguard Worker         for (int z = 0; z < dst.getDepth(); z++)
1417*35238bceSAndroid Build Coastguard Worker             for (int y = 0; y < dst.getHeight(); y++)
1418*35238bceSAndroid Build Coastguard Worker                 for (int x = 0; x < dst.getWidth(); x++)
1419*35238bceSAndroid Build Coastguard Worker                     dst.setPixel(linearToSRGBIfNeeded(dst.getFormat(),
1420*35238bceSAndroid Build Coastguard Worker                                                       src.sample3D(sampler, filter, ((float)x + 0.5f) * sX,
1421*35238bceSAndroid Build Coastguard Worker                                                                    ((float)y + 0.5f) * sY, ((float)z + 0.5f) * sZ)),
1422*35238bceSAndroid Build Coastguard Worker                                  x, y, z);
1423*35238bceSAndroid Build Coastguard Worker     }
1424*35238bceSAndroid Build Coastguard Worker }
1425*35238bceSAndroid Build Coastguard Worker 
estimatePixelValueRange(const ConstPixelBufferAccess & access,Vec4 & minVal,Vec4 & maxVal)1426*35238bceSAndroid Build Coastguard Worker void estimatePixelValueRange(const ConstPixelBufferAccess &access, Vec4 &minVal, Vec4 &maxVal)
1427*35238bceSAndroid Build Coastguard Worker {
1428*35238bceSAndroid Build Coastguard Worker     const TextureFormat &format = access.getFormat();
1429*35238bceSAndroid Build Coastguard Worker 
1430*35238bceSAndroid Build Coastguard Worker     switch (getTextureChannelClass(format.type))
1431*35238bceSAndroid Build Coastguard Worker     {
1432*35238bceSAndroid Build Coastguard Worker     case TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1433*35238bceSAndroid Build Coastguard Worker         // Normalized unsigned formats.
1434*35238bceSAndroid Build Coastguard Worker         minVal = Vec4(0.0f);
1435*35238bceSAndroid Build Coastguard Worker         maxVal = Vec4(1.0f);
1436*35238bceSAndroid Build Coastguard Worker         break;
1437*35238bceSAndroid Build Coastguard Worker 
1438*35238bceSAndroid Build Coastguard Worker     case TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1439*35238bceSAndroid Build Coastguard Worker         // Normalized signed formats.
1440*35238bceSAndroid Build Coastguard Worker         minVal = Vec4(-1.0f);
1441*35238bceSAndroid Build Coastguard Worker         maxVal = Vec4(+1.0f);
1442*35238bceSAndroid Build Coastguard Worker         break;
1443*35238bceSAndroid Build Coastguard Worker 
1444*35238bceSAndroid Build Coastguard Worker     default:
1445*35238bceSAndroid Build Coastguard Worker         // \note Samples every 4/8th pixel.
1446*35238bceSAndroid Build Coastguard Worker         minVal = Vec4(std::numeric_limits<float>::max());
1447*35238bceSAndroid Build Coastguard Worker         maxVal = Vec4(std::numeric_limits<float>::min());
1448*35238bceSAndroid Build Coastguard Worker 
1449*35238bceSAndroid Build Coastguard Worker         for (int z = 0; z < access.getDepth(); z += 2)
1450*35238bceSAndroid Build Coastguard Worker         {
1451*35238bceSAndroid Build Coastguard Worker             for (int y = 0; y < access.getHeight(); y += 2)
1452*35238bceSAndroid Build Coastguard Worker             {
1453*35238bceSAndroid Build Coastguard Worker                 for (int x = 0; x < access.getWidth(); x += 2)
1454*35238bceSAndroid Build Coastguard Worker                 {
1455*35238bceSAndroid Build Coastguard Worker                     Vec4 p = access.getPixel(x, y, z);
1456*35238bceSAndroid Build Coastguard Worker 
1457*35238bceSAndroid Build Coastguard Worker                     minVal[0] = (deFloatIsNaN(p[0]) ? minVal[0] : de::min(minVal[0], p[0]));
1458*35238bceSAndroid Build Coastguard Worker                     minVal[1] = (deFloatIsNaN(p[1]) ? minVal[1] : de::min(minVal[1], p[1]));
1459*35238bceSAndroid Build Coastguard Worker                     minVal[2] = (deFloatIsNaN(p[2]) ? minVal[2] : de::min(minVal[2], p[2]));
1460*35238bceSAndroid Build Coastguard Worker                     minVal[3] = (deFloatIsNaN(p[3]) ? minVal[3] : de::min(minVal[3], p[3]));
1461*35238bceSAndroid Build Coastguard Worker 
1462*35238bceSAndroid Build Coastguard Worker                     maxVal[0] = (deFloatIsNaN(p[0]) ? maxVal[0] : de::max(maxVal[0], p[0]));
1463*35238bceSAndroid Build Coastguard Worker                     maxVal[1] = (deFloatIsNaN(p[1]) ? maxVal[1] : de::max(maxVal[1], p[1]));
1464*35238bceSAndroid Build Coastguard Worker                     maxVal[2] = (deFloatIsNaN(p[2]) ? maxVal[2] : de::max(maxVal[2], p[2]));
1465*35238bceSAndroid Build Coastguard Worker                     maxVal[3] = (deFloatIsNaN(p[3]) ? maxVal[3] : de::max(maxVal[3], p[3]));
1466*35238bceSAndroid Build Coastguard Worker                 }
1467*35238bceSAndroid Build Coastguard Worker             }
1468*35238bceSAndroid Build Coastguard Worker         }
1469*35238bceSAndroid Build Coastguard Worker         break;
1470*35238bceSAndroid Build Coastguard Worker     }
1471*35238bceSAndroid Build Coastguard Worker }
1472*35238bceSAndroid Build Coastguard Worker 
computePixelScaleBias(const ConstPixelBufferAccess & access,Vec4 & scale,Vec4 & bias)1473*35238bceSAndroid Build Coastguard Worker void computePixelScaleBias(const ConstPixelBufferAccess &access, Vec4 &scale, Vec4 &bias)
1474*35238bceSAndroid Build Coastguard Worker {
1475*35238bceSAndroid Build Coastguard Worker     Vec4 minVal, maxVal;
1476*35238bceSAndroid Build Coastguard Worker     estimatePixelValueRange(access, minVal, maxVal);
1477*35238bceSAndroid Build Coastguard Worker 
1478*35238bceSAndroid Build Coastguard Worker     const float eps = 0.0001f;
1479*35238bceSAndroid Build Coastguard Worker 
1480*35238bceSAndroid Build Coastguard Worker     for (int c = 0; c < 4; c++)
1481*35238bceSAndroid Build Coastguard Worker     {
1482*35238bceSAndroid Build Coastguard Worker         if (maxVal[c] - minVal[c] < eps)
1483*35238bceSAndroid Build Coastguard Worker         {
1484*35238bceSAndroid Build Coastguard Worker             scale[c] = (maxVal[c] < eps) ? 1.0f : (1.0f / maxVal[c]);
1485*35238bceSAndroid Build Coastguard Worker             bias[c]  = (c == 3) ? (1.0f - maxVal[c] * scale[c]) : (0.0f - minVal[c] * scale[c]);
1486*35238bceSAndroid Build Coastguard Worker         }
1487*35238bceSAndroid Build Coastguard Worker         else
1488*35238bceSAndroid Build Coastguard Worker         {
1489*35238bceSAndroid Build Coastguard Worker             scale[c] = 1.0f / (maxVal[c] - minVal[c]);
1490*35238bceSAndroid Build Coastguard Worker             bias[c]  = 0.0f - minVal[c] * scale[c];
1491*35238bceSAndroid Build Coastguard Worker         }
1492*35238bceSAndroid Build Coastguard Worker     }
1493*35238bceSAndroid Build Coastguard Worker }
1494*35238bceSAndroid Build Coastguard Worker 
getCubeArrayFaceIndex(CubeFace face)1495*35238bceSAndroid Build Coastguard Worker int getCubeArrayFaceIndex(CubeFace face)
1496*35238bceSAndroid Build Coastguard Worker {
1497*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((int)face >= 0 && face < CUBEFACE_LAST);
1498*35238bceSAndroid Build Coastguard Worker 
1499*35238bceSAndroid Build Coastguard Worker     switch (face)
1500*35238bceSAndroid Build Coastguard Worker     {
1501*35238bceSAndroid Build Coastguard Worker     case CUBEFACE_POSITIVE_X:
1502*35238bceSAndroid Build Coastguard Worker         return 0;
1503*35238bceSAndroid Build Coastguard Worker     case CUBEFACE_NEGATIVE_X:
1504*35238bceSAndroid Build Coastguard Worker         return 1;
1505*35238bceSAndroid Build Coastguard Worker     case CUBEFACE_POSITIVE_Y:
1506*35238bceSAndroid Build Coastguard Worker         return 2;
1507*35238bceSAndroid Build Coastguard Worker     case CUBEFACE_NEGATIVE_Y:
1508*35238bceSAndroid Build Coastguard Worker         return 3;
1509*35238bceSAndroid Build Coastguard Worker     case CUBEFACE_POSITIVE_Z:
1510*35238bceSAndroid Build Coastguard Worker         return 4;
1511*35238bceSAndroid Build Coastguard Worker     case CUBEFACE_NEGATIVE_Z:
1512*35238bceSAndroid Build Coastguard Worker         return 5;
1513*35238bceSAndroid Build Coastguard Worker 
1514*35238bceSAndroid Build Coastguard Worker     default:
1515*35238bceSAndroid Build Coastguard Worker         return -1;
1516*35238bceSAndroid Build Coastguard Worker     }
1517*35238bceSAndroid Build Coastguard Worker }
1518*35238bceSAndroid Build Coastguard Worker 
packRGB999E5(const tcu::Vec4 & color)1519*35238bceSAndroid Build Coastguard Worker uint32_t packRGB999E5(const tcu::Vec4 &color)
1520*35238bceSAndroid Build Coastguard Worker {
1521*35238bceSAndroid Build Coastguard Worker     const int mBits    = 9;
1522*35238bceSAndroid Build Coastguard Worker     const int eBits    = 5;
1523*35238bceSAndroid Build Coastguard Worker     const int eBias    = 15;
1524*35238bceSAndroid Build Coastguard Worker     const int eMax     = (1 << eBits) - 1;
1525*35238bceSAndroid Build Coastguard Worker     const float maxVal = (float)(((1 << mBits) - 1) * (1 << (eMax - eBias))) / (float)(1 << mBits);
1526*35238bceSAndroid Build Coastguard Worker 
1527*35238bceSAndroid Build Coastguard Worker     float rc       = deFloatClamp(color[0], 0.0f, maxVal);
1528*35238bceSAndroid Build Coastguard Worker     float gc       = deFloatClamp(color[1], 0.0f, maxVal);
1529*35238bceSAndroid Build Coastguard Worker     float bc       = deFloatClamp(color[2], 0.0f, maxVal);
1530*35238bceSAndroid Build Coastguard Worker     float maxc     = de::max(rc, de::max(gc, bc));
1531*35238bceSAndroid Build Coastguard Worker     float log2c    = deFloatLog2(maxc);
1532*35238bceSAndroid Build Coastguard Worker     int32_t floorc = deIsInf(log2c) ? std::numeric_limits<int32_t>::min() : deFloorFloatToInt32(log2c);
1533*35238bceSAndroid Build Coastguard Worker     int exps       = de::max(-eBias - 1, floorc) + 1 + eBias;
1534*35238bceSAndroid Build Coastguard Worker     float e        = deFloatPow(2.0f, (float)(exps - eBias - mBits));
1535*35238bceSAndroid Build Coastguard Worker     int maxs       = deFloorFloatToInt32(maxc / e + 0.5f);
1536*35238bceSAndroid Build Coastguard Worker 
1537*35238bceSAndroid Build Coastguard Worker     if (maxs == (1 << mBits))
1538*35238bceSAndroid Build Coastguard Worker     {
1539*35238bceSAndroid Build Coastguard Worker         exps++;
1540*35238bceSAndroid Build Coastguard Worker         e *= 2.0f;
1541*35238bceSAndroid Build Coastguard Worker     }
1542*35238bceSAndroid Build Coastguard Worker 
1543*35238bceSAndroid Build Coastguard Worker     uint32_t rs = (uint32_t)deFloorFloatToInt32(rc / e + 0.5f);
1544*35238bceSAndroid Build Coastguard Worker     uint32_t gs = (uint32_t)deFloorFloatToInt32(gc / e + 0.5f);
1545*35238bceSAndroid Build Coastguard Worker     uint32_t bs = (uint32_t)deFloorFloatToInt32(bc / e + 0.5f);
1546*35238bceSAndroid Build Coastguard Worker 
1547*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((exps & ~((1 << 5) - 1)) == 0);
1548*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((rs & ~((1 << 9) - 1)) == 0);
1549*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((gs & ~((1 << 9) - 1)) == 0);
1550*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((bs & ~((1 << 9) - 1)) == 0);
1551*35238bceSAndroid Build Coastguard Worker 
1552*35238bceSAndroid Build Coastguard Worker     return rs | (gs << 9) | (bs << 18) | (exps << 27);
1553*35238bceSAndroid Build Coastguard Worker }
1554*35238bceSAndroid Build Coastguard Worker 
1555*35238bceSAndroid Build Coastguard Worker // Sampler utils
1556*35238bceSAndroid Build Coastguard Worker 
addOffset(const void * ptr,int numBytes)1557*35238bceSAndroid Build Coastguard Worker static const void *addOffset(const void *ptr, int numBytes)
1558*35238bceSAndroid Build Coastguard Worker {
1559*35238bceSAndroid Build Coastguard Worker     return (const uint8_t *)ptr + numBytes;
1560*35238bceSAndroid Build Coastguard Worker }
1561*35238bceSAndroid Build Coastguard Worker 
addOffset(void * ptr,int numBytes)1562*35238bceSAndroid Build Coastguard Worker static void *addOffset(void *ptr, int numBytes)
1563*35238bceSAndroid Build Coastguard Worker {
1564*35238bceSAndroid Build Coastguard Worker     return (uint8_t *)ptr + numBytes;
1565*35238bceSAndroid Build Coastguard Worker }
1566*35238bceSAndroid Build Coastguard Worker 
1567*35238bceSAndroid Build Coastguard Worker template <typename AccessType>
toSamplerAccess(const AccessType & baseAccess,Sampler::DepthStencilMode mode)1568*35238bceSAndroid Build Coastguard Worker static AccessType toSamplerAccess(const AccessType &baseAccess, Sampler::DepthStencilMode mode)
1569*35238bceSAndroid Build Coastguard Worker {
1570*35238bceSAndroid Build Coastguard Worker     // make sure to update this if type table is updated
1571*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 48);
1572*35238bceSAndroid Build Coastguard Worker 
1573*35238bceSAndroid Build Coastguard Worker     if (!isCombinedDepthStencilType(baseAccess.getFormat().type))
1574*35238bceSAndroid Build Coastguard Worker         return baseAccess;
1575*35238bceSAndroid Build Coastguard Worker     else
1576*35238bceSAndroid Build Coastguard Worker     {
1577*35238bceSAndroid Build Coastguard Worker #if (DE_ENDIANNESS == DE_LITTLE_ENDIAN)
1578*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits0To8   = 0; //!< least significant byte in the lowest address
1579*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits0To24  = 0;
1580*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits8To32  = 1;
1581*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits16To32 = 2;
1582*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits24To32 = 3;
1583*35238bceSAndroid Build Coastguard Worker #else
1584*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits0To8   = 3; //!< least significant byte in the highest address
1585*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits0To24  = 1;
1586*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits8To32  = 0;
1587*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits16To32 = 0;
1588*35238bceSAndroid Build Coastguard Worker         const uint32_t uint32ByteOffsetBits24To32 = 0;
1589*35238bceSAndroid Build Coastguard Worker #endif
1590*35238bceSAndroid Build Coastguard Worker 
1591*35238bceSAndroid Build Coastguard Worker         // Sampled channel must exist
1592*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(baseAccess.getFormat().order == TextureFormat::DS ||
1593*35238bceSAndroid Build Coastguard Worker                   (mode == Sampler::MODE_DEPTH && baseAccess.getFormat().order == TextureFormat::D) ||
1594*35238bceSAndroid Build Coastguard Worker                   (mode == Sampler::MODE_STENCIL && baseAccess.getFormat().order == TextureFormat::S));
1595*35238bceSAndroid Build Coastguard Worker 
1596*35238bceSAndroid Build Coastguard Worker         // combined formats have multiple channel classes, detect on sampler settings
1597*35238bceSAndroid Build Coastguard Worker         switch (baseAccess.getFormat().type)
1598*35238bceSAndroid Build Coastguard Worker         {
1599*35238bceSAndroid Build Coastguard Worker         case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:
1600*35238bceSAndroid Build Coastguard Worker         {
1601*35238bceSAndroid Build Coastguard Worker             if (mode == Sampler::MODE_DEPTH)
1602*35238bceSAndroid Build Coastguard Worker             {
1603*35238bceSAndroid Build Coastguard Worker                 // select the float component
1604*35238bceSAndroid Build Coastguard Worker                 return AccessType(TextureFormat(TextureFormat::D, TextureFormat::FLOAT), baseAccess.getSize(),
1605*35238bceSAndroid Build Coastguard Worker                                   baseAccess.getPitch(), baseAccess.getDataPtr());
1606*35238bceSAndroid Build Coastguard Worker             }
1607*35238bceSAndroid Build Coastguard Worker             else if (mode == Sampler::MODE_STENCIL)
1608*35238bceSAndroid Build Coastguard Worker             {
1609*35238bceSAndroid Build Coastguard Worker                 // select the uint 8 component
1610*35238bceSAndroid Build Coastguard Worker                 return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8), baseAccess.getSize(),
1611*35238bceSAndroid Build Coastguard Worker                                   baseAccess.getPitch(),
1612*35238bceSAndroid Build Coastguard Worker                                   addOffset(baseAccess.getDataPtr(), 4 + uint32ByteOffsetBits0To8));
1613*35238bceSAndroid Build Coastguard Worker             }
1614*35238bceSAndroid Build Coastguard Worker             else
1615*35238bceSAndroid Build Coastguard Worker             {
1616*35238bceSAndroid Build Coastguard Worker                 // unknown sampler mode
1617*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1618*35238bceSAndroid Build Coastguard Worker                 return AccessType();
1619*35238bceSAndroid Build Coastguard Worker             }
1620*35238bceSAndroid Build Coastguard Worker         }
1621*35238bceSAndroid Build Coastguard Worker 
1622*35238bceSAndroid Build Coastguard Worker         case TextureFormat::UNSIGNED_INT_16_8_8:
1623*35238bceSAndroid Build Coastguard Worker         {
1624*35238bceSAndroid Build Coastguard Worker             if (mode == Sampler::MODE_DEPTH)
1625*35238bceSAndroid Build Coastguard Worker             {
1626*35238bceSAndroid Build Coastguard Worker                 // select the unorm16 component
1627*35238bceSAndroid Build Coastguard Worker                 return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT16), baseAccess.getSize(),
1628*35238bceSAndroid Build Coastguard Worker                                   baseAccess.getPitch(),
1629*35238bceSAndroid Build Coastguard Worker                                   addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits16To32));
1630*35238bceSAndroid Build Coastguard Worker             }
1631*35238bceSAndroid Build Coastguard Worker             else if (mode == Sampler::MODE_STENCIL)
1632*35238bceSAndroid Build Coastguard Worker             {
1633*35238bceSAndroid Build Coastguard Worker                 // select the uint 8 component
1634*35238bceSAndroid Build Coastguard Worker                 return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8), baseAccess.getSize(),
1635*35238bceSAndroid Build Coastguard Worker                                   baseAccess.getPitch(), addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To8));
1636*35238bceSAndroid Build Coastguard Worker             }
1637*35238bceSAndroid Build Coastguard Worker             else
1638*35238bceSAndroid Build Coastguard Worker             {
1639*35238bceSAndroid Build Coastguard Worker                 // unknown sampler mode
1640*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1641*35238bceSAndroid Build Coastguard Worker                 return AccessType();
1642*35238bceSAndroid Build Coastguard Worker             }
1643*35238bceSAndroid Build Coastguard Worker         }
1644*35238bceSAndroid Build Coastguard Worker 
1645*35238bceSAndroid Build Coastguard Worker         case TextureFormat::UNSIGNED_INT_24_8:
1646*35238bceSAndroid Build Coastguard Worker         {
1647*35238bceSAndroid Build Coastguard Worker             if (mode == Sampler::MODE_DEPTH)
1648*35238bceSAndroid Build Coastguard Worker             {
1649*35238bceSAndroid Build Coastguard Worker                 // select the unorm24 component
1650*35238bceSAndroid Build Coastguard Worker                 return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT24), baseAccess.getSize(),
1651*35238bceSAndroid Build Coastguard Worker                                   baseAccess.getPitch(), addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits8To32));
1652*35238bceSAndroid Build Coastguard Worker             }
1653*35238bceSAndroid Build Coastguard Worker             else if (mode == Sampler::MODE_STENCIL)
1654*35238bceSAndroid Build Coastguard Worker             {
1655*35238bceSAndroid Build Coastguard Worker                 // select the uint 8 component
1656*35238bceSAndroid Build Coastguard Worker                 return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8), baseAccess.getSize(),
1657*35238bceSAndroid Build Coastguard Worker                                   baseAccess.getPitch(), addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To8));
1658*35238bceSAndroid Build Coastguard Worker             }
1659*35238bceSAndroid Build Coastguard Worker             else
1660*35238bceSAndroid Build Coastguard Worker             {
1661*35238bceSAndroid Build Coastguard Worker                 // unknown sampler mode
1662*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1663*35238bceSAndroid Build Coastguard Worker                 return AccessType();
1664*35238bceSAndroid Build Coastguard Worker             }
1665*35238bceSAndroid Build Coastguard Worker         }
1666*35238bceSAndroid Build Coastguard Worker 
1667*35238bceSAndroid Build Coastguard Worker         case TextureFormat::UNSIGNED_INT_24_8_REV:
1668*35238bceSAndroid Build Coastguard Worker         {
1669*35238bceSAndroid Build Coastguard Worker             if (mode == Sampler::MODE_DEPTH)
1670*35238bceSAndroid Build Coastguard Worker             {
1671*35238bceSAndroid Build Coastguard Worker                 // select the unorm24 component
1672*35238bceSAndroid Build Coastguard Worker                 return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT24), baseAccess.getSize(),
1673*35238bceSAndroid Build Coastguard Worker                                   baseAccess.getPitch(), addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To24));
1674*35238bceSAndroid Build Coastguard Worker             }
1675*35238bceSAndroid Build Coastguard Worker             else if (mode == Sampler::MODE_STENCIL)
1676*35238bceSAndroid Build Coastguard Worker             {
1677*35238bceSAndroid Build Coastguard Worker                 // select the uint 8 component
1678*35238bceSAndroid Build Coastguard Worker                 return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8), baseAccess.getSize(),
1679*35238bceSAndroid Build Coastguard Worker                                   baseAccess.getPitch(),
1680*35238bceSAndroid Build Coastguard Worker                                   addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits24To32));
1681*35238bceSAndroid Build Coastguard Worker             }
1682*35238bceSAndroid Build Coastguard Worker             else
1683*35238bceSAndroid Build Coastguard Worker             {
1684*35238bceSAndroid Build Coastguard Worker                 // unknown sampler mode
1685*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1686*35238bceSAndroid Build Coastguard Worker                 return AccessType();
1687*35238bceSAndroid Build Coastguard Worker             }
1688*35238bceSAndroid Build Coastguard Worker         }
1689*35238bceSAndroid Build Coastguard Worker 
1690*35238bceSAndroid Build Coastguard Worker         default:
1691*35238bceSAndroid Build Coastguard Worker         {
1692*35238bceSAndroid Build Coastguard Worker             // unknown combined format
1693*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
1694*35238bceSAndroid Build Coastguard Worker             return AccessType();
1695*35238bceSAndroid Build Coastguard Worker         }
1696*35238bceSAndroid Build Coastguard Worker         }
1697*35238bceSAndroid Build Coastguard Worker     }
1698*35238bceSAndroid Build Coastguard Worker }
1699*35238bceSAndroid Build Coastguard Worker 
getEffectiveDepthStencilAccess(const PixelBufferAccess & baseAccess,Sampler::DepthStencilMode mode)1700*35238bceSAndroid Build Coastguard Worker PixelBufferAccess getEffectiveDepthStencilAccess(const PixelBufferAccess &baseAccess, Sampler::DepthStencilMode mode)
1701*35238bceSAndroid Build Coastguard Worker {
1702*35238bceSAndroid Build Coastguard Worker     return toSamplerAccess<PixelBufferAccess>(baseAccess, mode);
1703*35238bceSAndroid Build Coastguard Worker }
1704*35238bceSAndroid Build Coastguard Worker 
getEffectiveDepthStencilAccess(const ConstPixelBufferAccess & baseAccess,Sampler::DepthStencilMode mode)1705*35238bceSAndroid Build Coastguard Worker ConstPixelBufferAccess getEffectiveDepthStencilAccess(const ConstPixelBufferAccess &baseAccess,
1706*35238bceSAndroid Build Coastguard Worker                                                       Sampler::DepthStencilMode mode)
1707*35238bceSAndroid Build Coastguard Worker {
1708*35238bceSAndroid Build Coastguard Worker     return toSamplerAccess<ConstPixelBufferAccess>(baseAccess, mode);
1709*35238bceSAndroid Build Coastguard Worker }
1710*35238bceSAndroid Build Coastguard Worker 
getEffectiveDepthStencilTextureFormat(const TextureFormat & baseFormat,Sampler::DepthStencilMode mode)1711*35238bceSAndroid Build Coastguard Worker TextureFormat getEffectiveDepthStencilTextureFormat(const TextureFormat &baseFormat, Sampler::DepthStencilMode mode)
1712*35238bceSAndroid Build Coastguard Worker {
1713*35238bceSAndroid Build Coastguard Worker     return toSamplerAccess(ConstPixelBufferAccess(baseFormat, IVec3(0, 0, 0), DE_NULL), mode).getFormat();
1714*35238bceSAndroid Build Coastguard Worker }
1715*35238bceSAndroid Build Coastguard Worker 
1716*35238bceSAndroid Build Coastguard Worker template <typename ViewType>
getEffectiveTView(const ViewType & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1717*35238bceSAndroid Build Coastguard Worker ViewType getEffectiveTView(const ViewType &src, std::vector<tcu::ConstPixelBufferAccess> &storage,
1718*35238bceSAndroid Build Coastguard Worker                            const tcu::Sampler &sampler)
1719*35238bceSAndroid Build Coastguard Worker {
1720*35238bceSAndroid Build Coastguard Worker     storage.resize(src.getNumLevels());
1721*35238bceSAndroid Build Coastguard Worker 
1722*35238bceSAndroid Build Coastguard Worker     ViewType view = ViewType(src.getNumLevels(), &storage[0], src.isES2(), src.getImageViewMinLodParams());
1723*35238bceSAndroid Build Coastguard Worker 
1724*35238bceSAndroid Build Coastguard Worker     for (int levelNdx = 0; levelNdx < src.getNumLevels(); ++levelNdx)
1725*35238bceSAndroid Build Coastguard Worker         storage[levelNdx] = tcu::getEffectiveDepthStencilAccess(src.getLevel(levelNdx), sampler.depthStencilMode);
1726*35238bceSAndroid Build Coastguard Worker 
1727*35238bceSAndroid Build Coastguard Worker     return view;
1728*35238bceSAndroid Build Coastguard Worker }
1729*35238bceSAndroid Build Coastguard Worker 
getEffectiveTView(const tcu::TextureCubeView & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1730*35238bceSAndroid Build Coastguard Worker tcu::TextureCubeView getEffectiveTView(const tcu::TextureCubeView &src,
1731*35238bceSAndroid Build Coastguard Worker                                        std::vector<tcu::ConstPixelBufferAccess> &storage, const tcu::Sampler &sampler)
1732*35238bceSAndroid Build Coastguard Worker {
1733*35238bceSAndroid Build Coastguard Worker     storage.resize(tcu::CUBEFACE_LAST * src.getNumLevels());
1734*35238bceSAndroid Build Coastguard Worker 
1735*35238bceSAndroid Build Coastguard Worker     const tcu::ConstPixelBufferAccess *storagePtrs[tcu::CUBEFACE_LAST] = {
1736*35238bceSAndroid Build Coastguard Worker         &storage[0 * src.getNumLevels()], &storage[1 * src.getNumLevels()], &storage[2 * src.getNumLevels()],
1737*35238bceSAndroid Build Coastguard Worker         &storage[3 * src.getNumLevels()], &storage[4 * src.getNumLevels()], &storage[5 * src.getNumLevels()],
1738*35238bceSAndroid Build Coastguard Worker     };
1739*35238bceSAndroid Build Coastguard Worker 
1740*35238bceSAndroid Build Coastguard Worker     tcu::TextureCubeView view =
1741*35238bceSAndroid Build Coastguard Worker         tcu::TextureCubeView(src.getNumLevels(), storagePtrs, false, src.getImageViewMinLodParams());
1742*35238bceSAndroid Build Coastguard Worker 
1743*35238bceSAndroid Build Coastguard Worker     for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx)
1744*35238bceSAndroid Build Coastguard Worker         for (int levelNdx = 0; levelNdx < src.getNumLevels(); ++levelNdx)
1745*35238bceSAndroid Build Coastguard Worker             storage[faceNdx * src.getNumLevels() + levelNdx] = tcu::getEffectiveDepthStencilAccess(
1746*35238bceSAndroid Build Coastguard Worker                 src.getLevelFace(levelNdx, (tcu::CubeFace)faceNdx), sampler.depthStencilMode);
1747*35238bceSAndroid Build Coastguard Worker 
1748*35238bceSAndroid Build Coastguard Worker     return view;
1749*35238bceSAndroid Build Coastguard Worker }
1750*35238bceSAndroid Build Coastguard Worker 
getEffectiveTextureView(const tcu::Texture1DView & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1751*35238bceSAndroid Build Coastguard Worker tcu::Texture1DView getEffectiveTextureView(const tcu::Texture1DView &src,
1752*35238bceSAndroid Build Coastguard Worker                                            std::vector<tcu::ConstPixelBufferAccess> &storage,
1753*35238bceSAndroid Build Coastguard Worker                                            const tcu::Sampler &sampler)
1754*35238bceSAndroid Build Coastguard Worker {
1755*35238bceSAndroid Build Coastguard Worker     return getEffectiveTView(src, storage, sampler);
1756*35238bceSAndroid Build Coastguard Worker }
1757*35238bceSAndroid Build Coastguard Worker 
getEffectiveTextureView(const tcu::Texture2DView & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1758*35238bceSAndroid Build Coastguard Worker tcu::Texture2DView getEffectiveTextureView(const tcu::Texture2DView &src,
1759*35238bceSAndroid Build Coastguard Worker                                            std::vector<tcu::ConstPixelBufferAccess> &storage,
1760*35238bceSAndroid Build Coastguard Worker                                            const tcu::Sampler &sampler)
1761*35238bceSAndroid Build Coastguard Worker {
1762*35238bceSAndroid Build Coastguard Worker     return getEffectiveTView(src, storage, sampler);
1763*35238bceSAndroid Build Coastguard Worker }
1764*35238bceSAndroid Build Coastguard Worker 
getEffectiveTextureView(const tcu::Texture3DView & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1765*35238bceSAndroid Build Coastguard Worker tcu::Texture3DView getEffectiveTextureView(const tcu::Texture3DView &src,
1766*35238bceSAndroid Build Coastguard Worker                                            std::vector<tcu::ConstPixelBufferAccess> &storage,
1767*35238bceSAndroid Build Coastguard Worker                                            const tcu::Sampler &sampler)
1768*35238bceSAndroid Build Coastguard Worker {
1769*35238bceSAndroid Build Coastguard Worker     return getEffectiveTView(src, storage, sampler);
1770*35238bceSAndroid Build Coastguard Worker }
1771*35238bceSAndroid Build Coastguard Worker 
getEffectiveTextureView(const tcu::Texture1DArrayView & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1772*35238bceSAndroid Build Coastguard Worker tcu::Texture1DArrayView getEffectiveTextureView(const tcu::Texture1DArrayView &src,
1773*35238bceSAndroid Build Coastguard Worker                                                 std::vector<tcu::ConstPixelBufferAccess> &storage,
1774*35238bceSAndroid Build Coastguard Worker                                                 const tcu::Sampler &sampler)
1775*35238bceSAndroid Build Coastguard Worker {
1776*35238bceSAndroid Build Coastguard Worker     return getEffectiveTView(src, storage, sampler);
1777*35238bceSAndroid Build Coastguard Worker }
1778*35238bceSAndroid Build Coastguard Worker 
getEffectiveTextureView(const tcu::Texture2DArrayView & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1779*35238bceSAndroid Build Coastguard Worker tcu::Texture2DArrayView getEffectiveTextureView(const tcu::Texture2DArrayView &src,
1780*35238bceSAndroid Build Coastguard Worker                                                 std::vector<tcu::ConstPixelBufferAccess> &storage,
1781*35238bceSAndroid Build Coastguard Worker                                                 const tcu::Sampler &sampler)
1782*35238bceSAndroid Build Coastguard Worker {
1783*35238bceSAndroid Build Coastguard Worker     return getEffectiveTView(src, storage, sampler);
1784*35238bceSAndroid Build Coastguard Worker }
1785*35238bceSAndroid Build Coastguard Worker 
getEffectiveTextureView(const tcu::TextureCubeView & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1786*35238bceSAndroid Build Coastguard Worker tcu::TextureCubeView getEffectiveTextureView(const tcu::TextureCubeView &src,
1787*35238bceSAndroid Build Coastguard Worker                                              std::vector<tcu::ConstPixelBufferAccess> &storage,
1788*35238bceSAndroid Build Coastguard Worker                                              const tcu::Sampler &sampler)
1789*35238bceSAndroid Build Coastguard Worker {
1790*35238bceSAndroid Build Coastguard Worker     return getEffectiveTView(src, storage, sampler);
1791*35238bceSAndroid Build Coastguard Worker }
1792*35238bceSAndroid Build Coastguard Worker 
getEffectiveTextureView(const tcu::TextureCubeArrayView & src,std::vector<tcu::ConstPixelBufferAccess> & storage,const tcu::Sampler & sampler)1793*35238bceSAndroid Build Coastguard Worker tcu::TextureCubeArrayView getEffectiveTextureView(const tcu::TextureCubeArrayView &src,
1794*35238bceSAndroid Build Coastguard Worker                                                   std::vector<tcu::ConstPixelBufferAccess> &storage,
1795*35238bceSAndroid Build Coastguard Worker                                                   const tcu::Sampler &sampler)
1796*35238bceSAndroid Build Coastguard Worker {
1797*35238bceSAndroid Build Coastguard Worker     return getEffectiveTView(src, storage, sampler);
1798*35238bceSAndroid Build Coastguard Worker }
1799*35238bceSAndroid Build Coastguard Worker 
1800*35238bceSAndroid Build Coastguard Worker //! Returns the effective swizzle of a border color. The effective swizzle is the
1801*35238bceSAndroid Build Coastguard Worker //! equal to first writing an RGBA color with a write swizzle and then reading
1802*35238bceSAndroid Build Coastguard Worker //! it back using a read swizzle, i.e. BorderSwizzle(c) == readSwizzle(writeSwizzle(C))
getBorderColorReadSwizzle(TextureFormat::ChannelOrder order)1803*35238bceSAndroid Build Coastguard Worker static const TextureSwizzle &getBorderColorReadSwizzle(TextureFormat::ChannelOrder order)
1804*35238bceSAndroid Build Coastguard Worker {
1805*35238bceSAndroid Build Coastguard Worker     // make sure to update these tables when channel orders are updated
1806*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 22);
1807*35238bceSAndroid Build Coastguard Worker 
1808*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle INV = {{TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO,
1809*35238bceSAndroid Build Coastguard Worker                                         TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE}};
1810*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle R   = {{TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ZERO,
1811*35238bceSAndroid Build Coastguard Worker                                         TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE}};
1812*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle A   = {{TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO,
1813*35238bceSAndroid Build Coastguard Worker                                         TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_3}};
1814*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle I   = {
1815*35238bceSAndroid Build Coastguard Worker         {TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0}};
1816*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle L = {
1817*35238bceSAndroid Build Coastguard Worker         {TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ONE}};
1818*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle LA = {
1819*35238bceSAndroid Build Coastguard Worker         {TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3}};
1820*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle RG  = {{TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_1,
1821*35238bceSAndroid Build Coastguard Worker                                         TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE}};
1822*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle RA  = {{TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ZERO,
1823*35238bceSAndroid Build Coastguard Worker                                         TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_3}};
1824*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle RGB = {
1825*35238bceSAndroid Build Coastguard Worker         {TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_1, TextureSwizzle::CHANNEL_2, TextureSwizzle::CHANNEL_ONE}};
1826*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle RGBA = {
1827*35238bceSAndroid Build Coastguard Worker         {TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_1, TextureSwizzle::CHANNEL_2, TextureSwizzle::CHANNEL_3}};
1828*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle D = {{TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ZERO,
1829*35238bceSAndroid Build Coastguard Worker                                       TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE}};
1830*35238bceSAndroid Build Coastguard Worker     static const TextureSwizzle S = {{TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ZERO,
1831*35238bceSAndroid Build Coastguard Worker                                       TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE}};
1832*35238bceSAndroid Build Coastguard Worker 
1833*35238bceSAndroid Build Coastguard Worker     const TextureSwizzle *swizzle;
1834*35238bceSAndroid Build Coastguard Worker 
1835*35238bceSAndroid Build Coastguard Worker     switch (order)
1836*35238bceSAndroid Build Coastguard Worker     {
1837*35238bceSAndroid Build Coastguard Worker     case TextureFormat::R:
1838*35238bceSAndroid Build Coastguard Worker         swizzle = &R;
1839*35238bceSAndroid Build Coastguard Worker         break;
1840*35238bceSAndroid Build Coastguard Worker     case TextureFormat::A:
1841*35238bceSAndroid Build Coastguard Worker         swizzle = &A;
1842*35238bceSAndroid Build Coastguard Worker         break;
1843*35238bceSAndroid Build Coastguard Worker     case TextureFormat::I:
1844*35238bceSAndroid Build Coastguard Worker         swizzle = &I;
1845*35238bceSAndroid Build Coastguard Worker         break;
1846*35238bceSAndroid Build Coastguard Worker     case TextureFormat::L:
1847*35238bceSAndroid Build Coastguard Worker         swizzle = &L;
1848*35238bceSAndroid Build Coastguard Worker         break;
1849*35238bceSAndroid Build Coastguard Worker     case TextureFormat::LA:
1850*35238bceSAndroid Build Coastguard Worker         swizzle = &LA;
1851*35238bceSAndroid Build Coastguard Worker         break;
1852*35238bceSAndroid Build Coastguard Worker     case TextureFormat::RG:
1853*35238bceSAndroid Build Coastguard Worker         swizzle = &RG;
1854*35238bceSAndroid Build Coastguard Worker         break;
1855*35238bceSAndroid Build Coastguard Worker     case TextureFormat::RA:
1856*35238bceSAndroid Build Coastguard Worker         swizzle = &RA;
1857*35238bceSAndroid Build Coastguard Worker         break;
1858*35238bceSAndroid Build Coastguard Worker     case TextureFormat::RGB:
1859*35238bceSAndroid Build Coastguard Worker         swizzle = &RGB;
1860*35238bceSAndroid Build Coastguard Worker         break;
1861*35238bceSAndroid Build Coastguard Worker     case TextureFormat::RGBA:
1862*35238bceSAndroid Build Coastguard Worker         swizzle = &RGBA;
1863*35238bceSAndroid Build Coastguard Worker         break;
1864*35238bceSAndroid Build Coastguard Worker     case TextureFormat::ARGB:
1865*35238bceSAndroid Build Coastguard Worker         swizzle = &RGBA;
1866*35238bceSAndroid Build Coastguard Worker         break;
1867*35238bceSAndroid Build Coastguard Worker     case TextureFormat::ABGR:
1868*35238bceSAndroid Build Coastguard Worker         swizzle = &RGBA;
1869*35238bceSAndroid Build Coastguard Worker         break;
1870*35238bceSAndroid Build Coastguard Worker     case TextureFormat::BGR:
1871*35238bceSAndroid Build Coastguard Worker         swizzle = &RGB;
1872*35238bceSAndroid Build Coastguard Worker         break;
1873*35238bceSAndroid Build Coastguard Worker     case TextureFormat::BGRA:
1874*35238bceSAndroid Build Coastguard Worker         swizzle = &RGBA;
1875*35238bceSAndroid Build Coastguard Worker         break;
1876*35238bceSAndroid Build Coastguard Worker     case TextureFormat::sR:
1877*35238bceSAndroid Build Coastguard Worker         swizzle = &R;
1878*35238bceSAndroid Build Coastguard Worker         break;
1879*35238bceSAndroid Build Coastguard Worker     case TextureFormat::sRG:
1880*35238bceSAndroid Build Coastguard Worker         swizzle = &RG;
1881*35238bceSAndroid Build Coastguard Worker         break;
1882*35238bceSAndroid Build Coastguard Worker     case TextureFormat::sRGB:
1883*35238bceSAndroid Build Coastguard Worker         swizzle = &RGB;
1884*35238bceSAndroid Build Coastguard Worker         break;
1885*35238bceSAndroid Build Coastguard Worker     case TextureFormat::sRGBA:
1886*35238bceSAndroid Build Coastguard Worker         swizzle = &RGBA;
1887*35238bceSAndroid Build Coastguard Worker         break;
1888*35238bceSAndroid Build Coastguard Worker     case TextureFormat::sBGR:
1889*35238bceSAndroid Build Coastguard Worker         swizzle = &RGB;
1890*35238bceSAndroid Build Coastguard Worker         break;
1891*35238bceSAndroid Build Coastguard Worker     case TextureFormat::sBGRA:
1892*35238bceSAndroid Build Coastguard Worker         swizzle = &RGBA;
1893*35238bceSAndroid Build Coastguard Worker         break;
1894*35238bceSAndroid Build Coastguard Worker     case TextureFormat::D:
1895*35238bceSAndroid Build Coastguard Worker         swizzle = &D;
1896*35238bceSAndroid Build Coastguard Worker         break;
1897*35238bceSAndroid Build Coastguard Worker     case TextureFormat::S:
1898*35238bceSAndroid Build Coastguard Worker         swizzle = &S;
1899*35238bceSAndroid Build Coastguard Worker         break;
1900*35238bceSAndroid Build Coastguard Worker 
1901*35238bceSAndroid Build Coastguard Worker     case TextureFormat::DS:
1902*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false); // combined depth-stencil border color?
1903*35238bceSAndroid Build Coastguard Worker         swizzle = &INV;
1904*35238bceSAndroid Build Coastguard Worker         break;
1905*35238bceSAndroid Build Coastguard Worker 
1906*35238bceSAndroid Build Coastguard Worker     default:
1907*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1908*35238bceSAndroid Build Coastguard Worker         swizzle = &INV;
1909*35238bceSAndroid Build Coastguard Worker         break;
1910*35238bceSAndroid Build Coastguard Worker     }
1911*35238bceSAndroid Build Coastguard Worker 
1912*35238bceSAndroid Build Coastguard Worker #ifdef DE_DEBUG
1913*35238bceSAndroid Build Coastguard Worker 
1914*35238bceSAndroid Build Coastguard Worker     {
1915*35238bceSAndroid Build Coastguard Worker         // check that BorderSwizzle(c) == readSwizzle(writeSwizzle(C))
1916*35238bceSAndroid Build Coastguard Worker         const TextureSwizzle &readSwizzle  = getChannelReadSwizzle(order);
1917*35238bceSAndroid Build Coastguard Worker         const TextureSwizzle &writeSwizzle = getChannelWriteSwizzle(order);
1918*35238bceSAndroid Build Coastguard Worker 
1919*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < 4; ++ndx)
1920*35238bceSAndroid Build Coastguard Worker         {
1921*35238bceSAndroid Build Coastguard Worker             TextureSwizzle::Channel writeRead = readSwizzle.components[ndx];
1922*35238bceSAndroid Build Coastguard Worker             if (deInRange32(writeRead, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == true)
1923*35238bceSAndroid Build Coastguard Worker                 writeRead = writeSwizzle.components[(int)writeRead];
1924*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(writeRead == swizzle->components[ndx]);
1925*35238bceSAndroid Build Coastguard Worker         }
1926*35238bceSAndroid Build Coastguard Worker     }
1927*35238bceSAndroid Build Coastguard Worker 
1928*35238bceSAndroid Build Coastguard Worker #endif
1929*35238bceSAndroid Build Coastguard Worker 
1930*35238bceSAndroid Build Coastguard Worker     return *swizzle;
1931*35238bceSAndroid Build Coastguard Worker }
1932*35238bceSAndroid Build Coastguard Worker 
getNBitUnsignedIntegerVec4MaxValue(const tcu::IVec4 & numBits)1933*35238bceSAndroid Build Coastguard Worker static tcu::UVec4 getNBitUnsignedIntegerVec4MaxValue(const tcu::IVec4 &numBits)
1934*35238bceSAndroid Build Coastguard Worker {
1935*35238bceSAndroid Build Coastguard Worker     return tcu::UVec4((numBits[0] > 0) ? (deUintMaxValue32(numBits[0])) : (0),
1936*35238bceSAndroid Build Coastguard Worker                       (numBits[1] > 0) ? (deUintMaxValue32(numBits[1])) : (0),
1937*35238bceSAndroid Build Coastguard Worker                       (numBits[2] > 0) ? (deUintMaxValue32(numBits[2])) : (0),
1938*35238bceSAndroid Build Coastguard Worker                       (numBits[3] > 0) ? (deUintMaxValue32(numBits[3])) : (0));
1939*35238bceSAndroid Build Coastguard Worker }
1940*35238bceSAndroid Build Coastguard Worker 
getNBitSignedIntegerVec4MaxValue(const tcu::IVec4 & numBits)1941*35238bceSAndroid Build Coastguard Worker static tcu::IVec4 getNBitSignedIntegerVec4MaxValue(const tcu::IVec4 &numBits)
1942*35238bceSAndroid Build Coastguard Worker {
1943*35238bceSAndroid Build Coastguard Worker     return tcu::IVec4(
1944*35238bceSAndroid Build Coastguard Worker         (numBits[0] > 0) ? (deIntMaxValue32(numBits[0])) : (0), (numBits[1] > 0) ? (deIntMaxValue32(numBits[1])) : (0),
1945*35238bceSAndroid Build Coastguard Worker         (numBits[2] > 0) ? (deIntMaxValue32(numBits[2])) : (0), (numBits[3] > 0) ? (deIntMaxValue32(numBits[3])) : (0));
1946*35238bceSAndroid Build Coastguard Worker }
1947*35238bceSAndroid Build Coastguard Worker 
getNBitSignedIntegerVec4MinValue(const tcu::IVec4 & numBits)1948*35238bceSAndroid Build Coastguard Worker static tcu::IVec4 getNBitSignedIntegerVec4MinValue(const tcu::IVec4 &numBits)
1949*35238bceSAndroid Build Coastguard Worker {
1950*35238bceSAndroid Build Coastguard Worker     return tcu::IVec4(
1951*35238bceSAndroid Build Coastguard Worker         (numBits[0] > 0) ? (deIntMinValue32(numBits[0])) : (0), (numBits[1] > 0) ? (deIntMinValue32(numBits[1])) : (0),
1952*35238bceSAndroid Build Coastguard Worker         (numBits[2] > 0) ? (deIntMinValue32(numBits[2])) : (0), (numBits[3] > 0) ? (deIntMinValue32(numBits[3])) : (0));
1953*35238bceSAndroid Build Coastguard Worker }
1954*35238bceSAndroid Build Coastguard Worker 
getTextureBorderColorFloat(const TextureFormat & format,const Sampler & sampler)1955*35238bceSAndroid Build Coastguard Worker static tcu::Vec4 getTextureBorderColorFloat(const TextureFormat &format, const Sampler &sampler)
1956*35238bceSAndroid Build Coastguard Worker {
1957*35238bceSAndroid Build Coastguard Worker     const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type);
1958*35238bceSAndroid Build Coastguard Worker     const TextureSwizzle::Channel *channelMap   = getBorderColorReadSwizzle(format.order).components;
1959*35238bceSAndroid Build Coastguard Worker     const bool isFloat                          = channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
1960*35238bceSAndroid Build Coastguard Worker     const bool isSigned                         = channelClass != tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
1961*35238bceSAndroid Build Coastguard Worker     const float valueMin                        = (isSigned) ? (-1.0f) : (0.0f);
1962*35238bceSAndroid Build Coastguard Worker     const float valueMax                        = 1.0f;
1963*35238bceSAndroid Build Coastguard Worker     Vec4 result;
1964*35238bceSAndroid Build Coastguard Worker 
1965*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT ||
1966*35238bceSAndroid Build Coastguard Worker               channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT ||
1967*35238bceSAndroid Build Coastguard Worker               channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT);
1968*35238bceSAndroid Build Coastguard Worker 
1969*35238bceSAndroid Build Coastguard Worker     for (int c = 0; c < 4; c++)
1970*35238bceSAndroid Build Coastguard Worker     {
1971*35238bceSAndroid Build Coastguard Worker         const TextureSwizzle::Channel map = channelMap[c];
1972*35238bceSAndroid Build Coastguard Worker         if (map == TextureSwizzle::CHANNEL_ZERO)
1973*35238bceSAndroid Build Coastguard Worker             result[c] = 0.0f;
1974*35238bceSAndroid Build Coastguard Worker         else if (map == TextureSwizzle::CHANNEL_ONE)
1975*35238bceSAndroid Build Coastguard Worker             result[c] = 1.0f;
1976*35238bceSAndroid Build Coastguard Worker         else if (isFloat)
1977*35238bceSAndroid Build Coastguard Worker         {
1978*35238bceSAndroid Build Coastguard Worker             // floating point values are not clamped
1979*35238bceSAndroid Build Coastguard Worker             result[c] = sampler.borderColor.getAccess<float>()[(int)map];
1980*35238bceSAndroid Build Coastguard Worker         }
1981*35238bceSAndroid Build Coastguard Worker         else
1982*35238bceSAndroid Build Coastguard Worker         {
1983*35238bceSAndroid Build Coastguard Worker             // fixed point values are clamped to a representable range
1984*35238bceSAndroid Build Coastguard Worker             result[c] = de::clamp(sampler.borderColor.getAccess<float>()[(int)map], valueMin, valueMax);
1985*35238bceSAndroid Build Coastguard Worker         }
1986*35238bceSAndroid Build Coastguard Worker     }
1987*35238bceSAndroid Build Coastguard Worker 
1988*35238bceSAndroid Build Coastguard Worker     return result;
1989*35238bceSAndroid Build Coastguard Worker }
1990*35238bceSAndroid Build Coastguard Worker 
getTextureBorderColorInt(const TextureFormat & format,const Sampler & sampler)1991*35238bceSAndroid Build Coastguard Worker static tcu::IVec4 getTextureBorderColorInt(const TextureFormat &format, const Sampler &sampler)
1992*35238bceSAndroid Build Coastguard Worker {
1993*35238bceSAndroid Build Coastguard Worker     const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type);
1994*35238bceSAndroid Build Coastguard Worker     const TextureSwizzle::Channel *channelMap   = getBorderColorReadSwizzle(format.order).components;
1995*35238bceSAndroid Build Coastguard Worker     const IVec4 channelBits                     = getChannelBitDepth(format.type);
1996*35238bceSAndroid Build Coastguard Worker     const IVec4 valueMin                        = getNBitSignedIntegerVec4MinValue(channelBits);
1997*35238bceSAndroid Build Coastguard Worker     const IVec4 valueMax                        = getNBitSignedIntegerVec4MaxValue(channelBits);
1998*35238bceSAndroid Build Coastguard Worker     IVec4 result;
1999*35238bceSAndroid Build Coastguard Worker 
2000*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER);
2001*35238bceSAndroid Build Coastguard Worker     DE_UNREF(channelClass);
2002*35238bceSAndroid Build Coastguard Worker 
2003*35238bceSAndroid Build Coastguard Worker     for (int c = 0; c < 4; c++)
2004*35238bceSAndroid Build Coastguard Worker     {
2005*35238bceSAndroid Build Coastguard Worker         const TextureSwizzle::Channel map = channelMap[c];
2006*35238bceSAndroid Build Coastguard Worker         if (map == TextureSwizzle::CHANNEL_ZERO)
2007*35238bceSAndroid Build Coastguard Worker             result[c] = 0;
2008*35238bceSAndroid Build Coastguard Worker         else if (map == TextureSwizzle::CHANNEL_ONE)
2009*35238bceSAndroid Build Coastguard Worker             result[c] = 1;
2010*35238bceSAndroid Build Coastguard Worker         else
2011*35238bceSAndroid Build Coastguard Worker         {
2012*35238bceSAndroid Build Coastguard Worker             // integer values are clamped to a representable range
2013*35238bceSAndroid Build Coastguard Worker             result[c] =
2014*35238bceSAndroid Build Coastguard Worker                 de::clamp(sampler.borderColor.getAccess<int32_t>()[(int)map], valueMin[(int)map], valueMax[(int)map]);
2015*35238bceSAndroid Build Coastguard Worker         }
2016*35238bceSAndroid Build Coastguard Worker     }
2017*35238bceSAndroid Build Coastguard Worker 
2018*35238bceSAndroid Build Coastguard Worker     return result;
2019*35238bceSAndroid Build Coastguard Worker }
2020*35238bceSAndroid Build Coastguard Worker 
getTextureBorderColorUint(const TextureFormat & format,const Sampler & sampler)2021*35238bceSAndroid Build Coastguard Worker static tcu::UVec4 getTextureBorderColorUint(const TextureFormat &format, const Sampler &sampler)
2022*35238bceSAndroid Build Coastguard Worker {
2023*35238bceSAndroid Build Coastguard Worker     const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type);
2024*35238bceSAndroid Build Coastguard Worker     const TextureSwizzle::Channel *channelMap   = getBorderColorReadSwizzle(format.order).components;
2025*35238bceSAndroid Build Coastguard Worker     const IVec4 channelBits                     = getChannelBitDepth(format.type);
2026*35238bceSAndroid Build Coastguard Worker     const UVec4 valueMax                        = getNBitUnsignedIntegerVec4MaxValue(channelBits);
2027*35238bceSAndroid Build Coastguard Worker     UVec4 result;
2028*35238bceSAndroid Build Coastguard Worker 
2029*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER);
2030*35238bceSAndroid Build Coastguard Worker     DE_UNREF(channelClass);
2031*35238bceSAndroid Build Coastguard Worker 
2032*35238bceSAndroid Build Coastguard Worker     for (int c = 0; c < 4; c++)
2033*35238bceSAndroid Build Coastguard Worker     {
2034*35238bceSAndroid Build Coastguard Worker         const TextureSwizzle::Channel map = channelMap[c];
2035*35238bceSAndroid Build Coastguard Worker         if (map == TextureSwizzle::CHANNEL_ZERO)
2036*35238bceSAndroid Build Coastguard Worker             result[c] = 0;
2037*35238bceSAndroid Build Coastguard Worker         else if (map == TextureSwizzle::CHANNEL_ONE)
2038*35238bceSAndroid Build Coastguard Worker             result[c] = 1;
2039*35238bceSAndroid Build Coastguard Worker         else
2040*35238bceSAndroid Build Coastguard Worker         {
2041*35238bceSAndroid Build Coastguard Worker             // integer values are clamped to a representable range
2042*35238bceSAndroid Build Coastguard Worker             result[c] = de::min(sampler.borderColor.getAccess<uint32_t>()[(int)map], valueMax[(int)map]);
2043*35238bceSAndroid Build Coastguard Worker         }
2044*35238bceSAndroid Build Coastguard Worker     }
2045*35238bceSAndroid Build Coastguard Worker 
2046*35238bceSAndroid Build Coastguard Worker     return result;
2047*35238bceSAndroid Build Coastguard Worker }
2048*35238bceSAndroid Build Coastguard Worker 
2049*35238bceSAndroid Build Coastguard Worker template <typename ScalarType>
sampleTextureBorder(const TextureFormat & format,const Sampler & sampler)2050*35238bceSAndroid Build Coastguard Worker tcu::Vector<ScalarType, 4> sampleTextureBorder(const TextureFormat &format, const Sampler &sampler)
2051*35238bceSAndroid Build Coastguard Worker {
2052*35238bceSAndroid Build Coastguard Worker     const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type);
2053*35238bceSAndroid Build Coastguard Worker 
2054*35238bceSAndroid Build Coastguard Worker     switch (channelClass)
2055*35238bceSAndroid Build Coastguard Worker     {
2056*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
2057*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
2058*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
2059*35238bceSAndroid Build Coastguard Worker         return getTextureBorderColorFloat(format, sampler).cast<ScalarType>();
2060*35238bceSAndroid Build Coastguard Worker 
2061*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
2062*35238bceSAndroid Build Coastguard Worker         return getTextureBorderColorInt(format, sampler).cast<ScalarType>();
2063*35238bceSAndroid Build Coastguard Worker 
2064*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
2065*35238bceSAndroid Build Coastguard Worker         return getTextureBorderColorUint(format, sampler).cast<ScalarType>();
2066*35238bceSAndroid Build Coastguard Worker 
2067*35238bceSAndroid Build Coastguard Worker     default:
2068*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
2069*35238bceSAndroid Build Coastguard Worker         return tcu::Vector<ScalarType, 4>();
2070*35238bceSAndroid Build Coastguard Worker     }
2071*35238bceSAndroid Build Coastguard Worker }
2072*35238bceSAndroid Build Coastguard Worker 
2073*35238bceSAndroid Build Coastguard Worker // instantiation
2074*35238bceSAndroid Build Coastguard Worker template tcu::Vector<float, 4> sampleTextureBorder(const TextureFormat &format, const Sampler &sampler);
2075*35238bceSAndroid Build Coastguard Worker template tcu::Vector<int32_t, 4> sampleTextureBorder(const TextureFormat &format, const Sampler &sampler);
2076*35238bceSAndroid Build Coastguard Worker template tcu::Vector<uint32_t, 4> sampleTextureBorder(const TextureFormat &format, const Sampler &sampler);
2077*35238bceSAndroid Build Coastguard Worker 
2078*35238bceSAndroid Build Coastguard Worker } // namespace tcu
2079