xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fCopyImageTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.1 Module
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 Copy image tests for GL_EXT_copy_image.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es31fCopyImageTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "tes31TestCase.hpp"
27*35238bceSAndroid Build Coastguard Worker 
28*35238bceSAndroid Build Coastguard Worker #include "glsTextureTestUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker #include "tcuCompressedTexture.hpp"
41*35238bceSAndroid Build Coastguard Worker #include "tcuFloat.hpp"
42*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
43*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
44*35238bceSAndroid Build Coastguard Worker #include "tcuTexture.hpp"
45*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
46*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
47*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
48*35238bceSAndroid Build Coastguard Worker #include "tcuSeedBuilder.hpp"
49*35238bceSAndroid Build Coastguard Worker #include "tcuResultCollector.hpp"
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker #include "deArrayBuffer.hpp"
52*35238bceSAndroid Build Coastguard Worker #include "deFloat16.h"
53*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
54*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
55*35238bceSAndroid Build Coastguard Worker #include "deUniquePtr.hpp"
56*35238bceSAndroid Build Coastguard Worker #include "deArrayUtil.hpp"
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker #include <map>
59*35238bceSAndroid Build Coastguard Worker #include <string>
60*35238bceSAndroid Build Coastguard Worker #include <vector>
61*35238bceSAndroid Build Coastguard Worker 
62*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls::TextureTestUtil;
63*35238bceSAndroid Build Coastguard Worker using namespace glu::TextureTestUtil;
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker using tcu::Float;
66*35238bceSAndroid Build Coastguard Worker using tcu::IVec2;
67*35238bceSAndroid Build Coastguard Worker using tcu::IVec3;
68*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
69*35238bceSAndroid Build Coastguard Worker using tcu::Sampler;
70*35238bceSAndroid Build Coastguard Worker using tcu::ScopedLogSection;
71*35238bceSAndroid Build Coastguard Worker using tcu::SeedBuilder;
72*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
73*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker using de::ArrayBuffer;
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker using std::map;
78*35238bceSAndroid Build Coastguard Worker using std::pair;
79*35238bceSAndroid Build Coastguard Worker using std::string;
80*35238bceSAndroid Build Coastguard Worker using std::vector;
81*35238bceSAndroid Build Coastguard Worker 
82*35238bceSAndroid Build Coastguard Worker namespace deqp
83*35238bceSAndroid Build Coastguard Worker {
84*35238bceSAndroid Build Coastguard Worker namespace gles31
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker namespace Functional
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker namespace
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker 
91*35238bceSAndroid Build Coastguard Worker enum ViewClass
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_128_BITS = 0,
94*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_96_BITS,
95*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_64_BITS,
96*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_48_BITS,
97*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_32_BITS,
98*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_24_BITS,
99*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_16_BITS,
100*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_8_BITS,
101*35238bceSAndroid Build Coastguard Worker 
102*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_EAC_R11,
103*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_EAC_RG11,
104*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ETC2_RGB,
105*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ETC2_RGBA,
106*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ETC2_EAC_RGBA,
107*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_4x4_RGBA,
108*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_5x4_RGBA,
109*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_5x5_RGBA,
110*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_6x5_RGBA,
111*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_6x6_RGBA,
112*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_8x5_RGBA,
113*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_8x6_RGBA,
114*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_8x8_RGBA,
115*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_10x5_RGBA,
116*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_10x6_RGBA,
117*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_10x8_RGBA,
118*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_10x10_RGBA,
119*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_12x10_RGBA,
120*35238bceSAndroid Build Coastguard Worker     VIEWCLASS_ASTC_12x12_RGBA
121*35238bceSAndroid Build Coastguard Worker };
122*35238bceSAndroid Build Coastguard Worker 
123*35238bceSAndroid Build Coastguard Worker enum Verify
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker     VERIFY_NONE = 0,
126*35238bceSAndroid Build Coastguard Worker     VERIFY_COMPARE_REFERENCE
127*35238bceSAndroid Build Coastguard Worker };
128*35238bceSAndroid Build Coastguard Worker 
viewClassToName(ViewClass viewClass)129*35238bceSAndroid Build Coastguard Worker const char *viewClassToName(ViewClass viewClass)
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker     switch (viewClass)
132*35238bceSAndroid Build Coastguard Worker     {
133*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_128_BITS:
134*35238bceSAndroid Build Coastguard Worker         return "viewclass_128_bits";
135*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_96_BITS:
136*35238bceSAndroid Build Coastguard Worker         return "viewclass_96_bits";
137*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_64_BITS:
138*35238bceSAndroid Build Coastguard Worker         return "viewclass_64_bits";
139*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_48_BITS:
140*35238bceSAndroid Build Coastguard Worker         return "viewclass_48_bits";
141*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_32_BITS:
142*35238bceSAndroid Build Coastguard Worker         return "viewclass_32_bits";
143*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_24_BITS:
144*35238bceSAndroid Build Coastguard Worker         return "viewclass_24_bits";
145*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_16_BITS:
146*35238bceSAndroid Build Coastguard Worker         return "viewclass_16_bits";
147*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_8_BITS:
148*35238bceSAndroid Build Coastguard Worker         return "viewclass_8_bits";
149*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_EAC_R11:
150*35238bceSAndroid Build Coastguard Worker         return "viewclass_eac_r11";
151*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_EAC_RG11:
152*35238bceSAndroid Build Coastguard Worker         return "viewclass_eac_rg11";
153*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ETC2_RGB:
154*35238bceSAndroid Build Coastguard Worker         return "viewclass_etc2_rgb";
155*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ETC2_RGBA:
156*35238bceSAndroid Build Coastguard Worker         return "viewclass_etc2_rgba";
157*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ETC2_EAC_RGBA:
158*35238bceSAndroid Build Coastguard Worker         return "viewclass_etc2_eac_rgba";
159*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_4x4_RGBA:
160*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_4x4_rgba";
161*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_5x4_RGBA:
162*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_5x4_rgba";
163*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_5x5_RGBA:
164*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_5x5_rgba";
165*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_6x5_RGBA:
166*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_6x5_rgba";
167*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_6x6_RGBA:
168*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_6x6_rgba";
169*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_8x5_RGBA:
170*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_8x5_rgba";
171*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_8x6_RGBA:
172*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_8x6_rgba";
173*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_8x8_RGBA:
174*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_8x8_rgba";
175*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_10x5_RGBA:
176*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_10x5_rgba";
177*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_10x6_RGBA:
178*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_10x6_rgba";
179*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_10x8_RGBA:
180*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_10x8_rgba";
181*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_10x10_RGBA:
182*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_10x10_rgba";
183*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_12x10_RGBA:
184*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_12x10_rgba";
185*35238bceSAndroid Build Coastguard Worker     case VIEWCLASS_ASTC_12x12_RGBA:
186*35238bceSAndroid Build Coastguard Worker         return "viewclass_astc_12x12_rgba";
187*35238bceSAndroid Build Coastguard Worker 
188*35238bceSAndroid Build Coastguard Worker     default:
189*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
190*35238bceSAndroid Build Coastguard Worker         return NULL;
191*35238bceSAndroid Build Coastguard Worker     }
192*35238bceSAndroid Build Coastguard Worker }
193*35238bceSAndroid Build Coastguard Worker 
targetToName(uint32_t target)194*35238bceSAndroid Build Coastguard Worker const char *targetToName(uint32_t target)
195*35238bceSAndroid Build Coastguard Worker {
196*35238bceSAndroid Build Coastguard Worker     switch (target)
197*35238bceSAndroid Build Coastguard Worker     {
198*35238bceSAndroid Build Coastguard Worker     case GL_RENDERBUFFER:
199*35238bceSAndroid Build Coastguard Worker         return "renderbuffer";
200*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
201*35238bceSAndroid Build Coastguard Worker         return "texture2d";
202*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
203*35238bceSAndroid Build Coastguard Worker         return "texture3d";
204*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
205*35238bceSAndroid Build Coastguard Worker         return "texture2d_array";
206*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
207*35238bceSAndroid Build Coastguard Worker         return "cubemap";
208*35238bceSAndroid Build Coastguard Worker 
209*35238bceSAndroid Build Coastguard Worker     default:
210*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
211*35238bceSAndroid Build Coastguard Worker         return NULL;
212*35238bceSAndroid Build Coastguard Worker     }
213*35238bceSAndroid Build Coastguard Worker }
214*35238bceSAndroid Build Coastguard Worker 
formatToName(uint32_t format)215*35238bceSAndroid Build Coastguard Worker string formatToName(uint32_t format)
216*35238bceSAndroid Build Coastguard Worker {
217*35238bceSAndroid Build Coastguard Worker     string enumName;
218*35238bceSAndroid Build Coastguard Worker 
219*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
220*35238bceSAndroid Build Coastguard Worker         enumName = glu::getCompressedTextureFormatStr(format).toString().substr(14); // Strip GL_COMPRESSED_
221*35238bceSAndroid Build Coastguard Worker     else
222*35238bceSAndroid Build Coastguard Worker         enumName = glu::getUncompressedTextureFormatStr(format).toString().substr(3); // Strip GL_
223*35238bceSAndroid Build Coastguard Worker 
224*35238bceSAndroid Build Coastguard Worker     return de::toLower(enumName);
225*35238bceSAndroid Build Coastguard Worker }
226*35238bceSAndroid Build Coastguard Worker 
isFloatFormat(uint32_t format)227*35238bceSAndroid Build Coastguard Worker bool isFloatFormat(uint32_t format)
228*35238bceSAndroid Build Coastguard Worker {
229*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
230*35238bceSAndroid Build Coastguard Worker         return false;
231*35238bceSAndroid Build Coastguard Worker     else
232*35238bceSAndroid Build Coastguard Worker         return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) ==
233*35238bceSAndroid Build Coastguard Worker                tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
234*35238bceSAndroid Build Coastguard Worker }
235*35238bceSAndroid Build Coastguard Worker 
isUintFormat(uint32_t format)236*35238bceSAndroid Build Coastguard Worker bool isUintFormat(uint32_t format)
237*35238bceSAndroid Build Coastguard Worker {
238*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
239*35238bceSAndroid Build Coastguard Worker         return false;
240*35238bceSAndroid Build Coastguard Worker     else
241*35238bceSAndroid Build Coastguard Worker         return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) ==
242*35238bceSAndroid Build Coastguard Worker                tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
243*35238bceSAndroid Build Coastguard Worker }
244*35238bceSAndroid Build Coastguard Worker 
isIntFormat(uint32_t format)245*35238bceSAndroid Build Coastguard Worker bool isIntFormat(uint32_t format)
246*35238bceSAndroid Build Coastguard Worker {
247*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
248*35238bceSAndroid Build Coastguard Worker         return false;
249*35238bceSAndroid Build Coastguard Worker     else
250*35238bceSAndroid Build Coastguard Worker         return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) ==
251*35238bceSAndroid Build Coastguard Worker                tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER;
252*35238bceSAndroid Build Coastguard Worker }
253*35238bceSAndroid Build Coastguard Worker 
isFixedPointFormat(uint32_t format)254*35238bceSAndroid Build Coastguard Worker bool isFixedPointFormat(uint32_t format)
255*35238bceSAndroid Build Coastguard Worker {
256*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
257*35238bceSAndroid Build Coastguard Worker         return false;
258*35238bceSAndroid Build Coastguard Worker     else
259*35238bceSAndroid Build Coastguard Worker     {
260*35238bceSAndroid Build Coastguard Worker         const tcu::TextureChannelClass channelClass =
261*35238bceSAndroid Build Coastguard Worker             tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type);
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker         return channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT ||
264*35238bceSAndroid Build Coastguard Worker                channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
265*35238bceSAndroid Build Coastguard Worker     }
266*35238bceSAndroid Build Coastguard Worker }
267*35238bceSAndroid Build Coastguard Worker 
isTextureTarget(uint32_t target)268*35238bceSAndroid Build Coastguard Worker bool isTextureTarget(uint32_t target)
269*35238bceSAndroid Build Coastguard Worker {
270*35238bceSAndroid Build Coastguard Worker     return target != GL_RENDERBUFFER;
271*35238bceSAndroid Build Coastguard Worker }
272*35238bceSAndroid Build Coastguard Worker 
getTargetTexDims(uint32_t target)273*35238bceSAndroid Build Coastguard Worker int getTargetTexDims(uint32_t target)
274*35238bceSAndroid Build Coastguard Worker {
275*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(isTextureTarget(target));
276*35238bceSAndroid Build Coastguard Worker 
277*35238bceSAndroid Build Coastguard Worker     switch (target)
278*35238bceSAndroid Build Coastguard Worker     {
279*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_1D:
280*35238bceSAndroid Build Coastguard Worker         return 1;
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_1D_ARRAY:
283*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
284*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
285*35238bceSAndroid Build Coastguard Worker         return 2;
286*35238bceSAndroid Build Coastguard Worker 
287*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
288*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
289*35238bceSAndroid Build Coastguard Worker         return 3;
290*35238bceSAndroid Build Coastguard Worker 
291*35238bceSAndroid Build Coastguard Worker     default:
292*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
293*35238bceSAndroid Build Coastguard Worker         return -1;
294*35238bceSAndroid Build Coastguard Worker     }
295*35238bceSAndroid Build Coastguard Worker }
296*35238bceSAndroid Build Coastguard Worker 
297*35238bceSAndroid Build Coastguard Worker class RandomizedRenderGrid
298*35238bceSAndroid Build Coastguard Worker {
299*35238bceSAndroid Build Coastguard Worker public:
300*35238bceSAndroid Build Coastguard Worker     RandomizedRenderGrid(const IVec2 &targetSize, const IVec2 &cellSize, int maxCellCount, uint32_t seed);
301*35238bceSAndroid Build Coastguard Worker     bool nextCell(void);
302*35238bceSAndroid Build Coastguard Worker     IVec2 getOrigin(void) const;
303*35238bceSAndroid Build Coastguard Worker 
getCellSize(void) const304*35238bceSAndroid Build Coastguard Worker     const IVec2 &getCellSize(void) const
305*35238bceSAndroid Build Coastguard Worker     {
306*35238bceSAndroid Build Coastguard Worker         return m_cellSize;
307*35238bceSAndroid Build Coastguard Worker     }
308*35238bceSAndroid Build Coastguard Worker     IVec4 getUsedAreaBoundingBox(void) const;
getCellCount(void) const309*35238bceSAndroid Build Coastguard Worker     int getCellCount(void) const
310*35238bceSAndroid Build Coastguard Worker     {
311*35238bceSAndroid Build Coastguard Worker         return m_cellCount;
312*35238bceSAndroid Build Coastguard Worker     }
313*35238bceSAndroid Build Coastguard Worker 
314*35238bceSAndroid Build Coastguard Worker private:
315*35238bceSAndroid Build Coastguard Worker     static IVec2 getRandomOffset(uint32_t seed, IVec2 targetSize, IVec2 cellSize, IVec2 grid, int cellCount);
316*35238bceSAndroid Build Coastguard Worker 
317*35238bceSAndroid Build Coastguard Worker     const IVec2 m_targetSize;
318*35238bceSAndroid Build Coastguard Worker     const IVec2 m_cellSize;
319*35238bceSAndroid Build Coastguard Worker     const IVec2 m_grid;
320*35238bceSAndroid Build Coastguard Worker     int m_currentCell;
321*35238bceSAndroid Build Coastguard Worker     const int m_cellCount;
322*35238bceSAndroid Build Coastguard Worker     const IVec2 m_baseRandomOffset;
323*35238bceSAndroid Build Coastguard Worker };
324*35238bceSAndroid Build Coastguard Worker 
RandomizedRenderGrid(const IVec2 & targetSize,const IVec2 & cellSize,int maxCellCount,uint32_t seed)325*35238bceSAndroid Build Coastguard Worker RandomizedRenderGrid::RandomizedRenderGrid(const IVec2 &targetSize, const IVec2 &cellSize, int maxCellCount,
326*35238bceSAndroid Build Coastguard Worker                                            uint32_t seed)
327*35238bceSAndroid Build Coastguard Worker     : m_targetSize(targetSize)
328*35238bceSAndroid Build Coastguard Worker     , m_cellSize(cellSize)
329*35238bceSAndroid Build Coastguard Worker     , m_grid(targetSize / cellSize)
330*35238bceSAndroid Build Coastguard Worker     , m_currentCell(0)
331*35238bceSAndroid Build Coastguard Worker     // If the grid exactly fits height, take one row for randomization.
332*35238bceSAndroid Build Coastguard Worker     , m_cellCount(deMin32(maxCellCount, ((targetSize.y() % cellSize.y()) == 0) && m_grid.y() > 1 ?
333*35238bceSAndroid Build Coastguard Worker                                             m_grid.x() * (m_grid.y() - 1) :
334*35238bceSAndroid Build Coastguard Worker                                             m_grid.x() * m_grid.y()))
335*35238bceSAndroid Build Coastguard Worker     , m_baseRandomOffset(getRandomOffset(seed, targetSize, cellSize, m_grid, m_cellCount))
336*35238bceSAndroid Build Coastguard Worker {
337*35238bceSAndroid Build Coastguard Worker }
338*35238bceSAndroid Build Coastguard Worker 
getRandomOffset(uint32_t seed,IVec2 targetSize,IVec2 cellSize,IVec2 grid,int cellCount)339*35238bceSAndroid Build Coastguard Worker IVec2 RandomizedRenderGrid::getRandomOffset(uint32_t seed, IVec2 targetSize, IVec2 cellSize, IVec2 grid, int cellCount)
340*35238bceSAndroid Build Coastguard Worker {
341*35238bceSAndroid Build Coastguard Worker     de::Random rng(seed);
342*35238bceSAndroid Build Coastguard Worker     IVec2 result;
343*35238bceSAndroid Build Coastguard Worker     IVec2 extraSpace = targetSize - (cellSize * grid);
344*35238bceSAndroid Build Coastguard Worker 
345*35238bceSAndroid Build Coastguard Worker     // If there'll be unused rows, donate them into extra space.
346*35238bceSAndroid Build Coastguard Worker     // (Round the required rows to full cell row to find out how many rows are unused, multiply by size)
347*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(deDivRoundUp32(cellCount, grid.x()) <= grid.y());
348*35238bceSAndroid Build Coastguard Worker     extraSpace.y() += (grid.y() - deDivRoundUp32(cellCount, grid.x())) * cellSize.y();
349*35238bceSAndroid Build Coastguard Worker 
350*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(targetSize.x() > cellSize.x() && targetSize.y() > cellSize.y());
351*35238bceSAndroid Build Coastguard Worker     // If grid fits perfectly just one row of cells, just give up on randomizing.
352*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(extraSpace.x() > 0 || extraSpace.y() > 0 || grid.y() == 1);
353*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(extraSpace.x() + grid.x() * cellSize.x() == targetSize.x());
354*35238bceSAndroid Build Coastguard Worker 
355*35238bceSAndroid Build Coastguard Worker     // \note Putting these as ctor params would make evaluation order undefined, I think <sigh>. Hence,
356*35238bceSAndroid Build Coastguard Worker     // no direct return.
357*35238bceSAndroid Build Coastguard Worker     result.x() = rng.getInt(0, extraSpace.x());
358*35238bceSAndroid Build Coastguard Worker     result.y() = rng.getInt(0, extraSpace.y());
359*35238bceSAndroid Build Coastguard Worker     return result;
360*35238bceSAndroid Build Coastguard Worker }
361*35238bceSAndroid Build Coastguard Worker 
nextCell(void)362*35238bceSAndroid Build Coastguard Worker bool RandomizedRenderGrid::nextCell(void)
363*35238bceSAndroid Build Coastguard Worker {
364*35238bceSAndroid Build Coastguard Worker     if (m_currentCell >= getCellCount())
365*35238bceSAndroid Build Coastguard Worker         return false;
366*35238bceSAndroid Build Coastguard Worker 
367*35238bceSAndroid Build Coastguard Worker     m_currentCell++;
368*35238bceSAndroid Build Coastguard Worker     return true;
369*35238bceSAndroid Build Coastguard Worker }
370*35238bceSAndroid Build Coastguard Worker 
getOrigin(void) const371*35238bceSAndroid Build Coastguard Worker IVec2 RandomizedRenderGrid::getOrigin(void) const
372*35238bceSAndroid Build Coastguard Worker {
373*35238bceSAndroid Build Coastguard Worker     const int gridX           = (m_currentCell - 1) % m_grid.x();
374*35238bceSAndroid Build Coastguard Worker     const int gridY           = (m_currentCell - 1) / m_grid.x();
375*35238bceSAndroid Build Coastguard Worker     const IVec2 currentOrigin = (IVec2(gridX, gridY) * m_cellSize) + m_baseRandomOffset;
376*35238bceSAndroid Build Coastguard Worker 
377*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(currentOrigin.x() >= 0 && (currentOrigin.x() + m_cellSize.x()) <= m_targetSize.x());
378*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(currentOrigin.y() >= 0 && (currentOrigin.y() + m_cellSize.y()) <= m_targetSize.y());
379*35238bceSAndroid Build Coastguard Worker 
380*35238bceSAndroid Build Coastguard Worker     return currentOrigin;
381*35238bceSAndroid Build Coastguard Worker }
382*35238bceSAndroid Build Coastguard Worker 
getUsedAreaBoundingBox(void) const383*35238bceSAndroid Build Coastguard Worker IVec4 RandomizedRenderGrid::getUsedAreaBoundingBox(void) const
384*35238bceSAndroid Build Coastguard Worker {
385*35238bceSAndroid Build Coastguard Worker     const IVec2 lastCell(de::min(m_currentCell + 1, m_grid.x()), ((m_currentCell + m_grid.x() - 1) / m_grid.x()));
386*35238bceSAndroid Build Coastguard Worker     const IVec2 size = lastCell * m_cellSize;
387*35238bceSAndroid Build Coastguard Worker 
388*35238bceSAndroid Build Coastguard Worker     return IVec4(m_baseRandomOffset.x(), m_baseRandomOffset.y(), size.x(), size.y());
389*35238bceSAndroid Build Coastguard Worker }
390*35238bceSAndroid Build Coastguard Worker 
391*35238bceSAndroid Build Coastguard Worker class ImageInfo
392*35238bceSAndroid Build Coastguard Worker {
393*35238bceSAndroid Build Coastguard Worker public:
394*35238bceSAndroid Build Coastguard Worker     ImageInfo(uint32_t format, uint32_t target, const IVec3 &size);
395*35238bceSAndroid Build Coastguard Worker 
getFormat(void) const396*35238bceSAndroid Build Coastguard Worker     uint32_t getFormat(void) const
397*35238bceSAndroid Build Coastguard Worker     {
398*35238bceSAndroid Build Coastguard Worker         return m_format;
399*35238bceSAndroid Build Coastguard Worker     }
getTarget(void) const400*35238bceSAndroid Build Coastguard Worker     uint32_t getTarget(void) const
401*35238bceSAndroid Build Coastguard Worker     {
402*35238bceSAndroid Build Coastguard Worker         return m_target;
403*35238bceSAndroid Build Coastguard Worker     }
getSize(void) const404*35238bceSAndroid Build Coastguard Worker     const IVec3 &getSize(void) const
405*35238bceSAndroid Build Coastguard Worker     {
406*35238bceSAndroid Build Coastguard Worker         return m_size;
407*35238bceSAndroid Build Coastguard Worker     }
408*35238bceSAndroid Build Coastguard Worker 
409*35238bceSAndroid Build Coastguard Worker private:
410*35238bceSAndroid Build Coastguard Worker     uint32_t m_format;
411*35238bceSAndroid Build Coastguard Worker     uint32_t m_target;
412*35238bceSAndroid Build Coastguard Worker     IVec3 m_size;
413*35238bceSAndroid Build Coastguard Worker };
414*35238bceSAndroid Build Coastguard Worker 
ImageInfo(uint32_t format,uint32_t target,const IVec3 & size)415*35238bceSAndroid Build Coastguard Worker ImageInfo::ImageInfo(uint32_t format, uint32_t target, const IVec3 &size)
416*35238bceSAndroid Build Coastguard Worker     : m_format(format)
417*35238bceSAndroid Build Coastguard Worker     , m_target(target)
418*35238bceSAndroid Build Coastguard Worker     , m_size(size)
419*35238bceSAndroid Build Coastguard Worker {
420*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_target == GL_TEXTURE_2D_ARRAY || m_target == GL_TEXTURE_3D || m_size.z() == 1);
421*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(isTextureTarget(m_target) || !glu::isCompressedFormat(m_target));
422*35238bceSAndroid Build Coastguard Worker }
423*35238bceSAndroid Build Coastguard Worker 
operator <<(SeedBuilder & builder,const ImageInfo & info)424*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, const ImageInfo &info)
425*35238bceSAndroid Build Coastguard Worker {
426*35238bceSAndroid Build Coastguard Worker     builder << info.getFormat() << info.getTarget() << info.getSize();
427*35238bceSAndroid Build Coastguard Worker     return builder;
428*35238bceSAndroid Build Coastguard Worker }
429*35238bceSAndroid Build Coastguard Worker 
getObjectTraits(const ImageInfo & info)430*35238bceSAndroid Build Coastguard Worker const glu::ObjectTraits &getObjectTraits(const ImageInfo &info)
431*35238bceSAndroid Build Coastguard Worker {
432*35238bceSAndroid Build Coastguard Worker     if (isTextureTarget(info.getTarget()))
433*35238bceSAndroid Build Coastguard Worker         return glu::objectTraits(glu::OBJECTTYPE_TEXTURE);
434*35238bceSAndroid Build Coastguard Worker     else
435*35238bceSAndroid Build Coastguard Worker         return glu::objectTraits(glu::OBJECTTYPE_RENDERBUFFER);
436*35238bceSAndroid Build Coastguard Worker }
437*35238bceSAndroid Build Coastguard Worker 
getLevelCount(const ImageInfo & info)438*35238bceSAndroid Build Coastguard Worker int getLevelCount(const ImageInfo &info)
439*35238bceSAndroid Build Coastguard Worker {
440*35238bceSAndroid Build Coastguard Worker     const uint32_t target = info.getTarget();
441*35238bceSAndroid Build Coastguard Worker     const IVec3 size      = info.getSize();
442*35238bceSAndroid Build Coastguard Worker 
443*35238bceSAndroid Build Coastguard Worker     if (target == GL_RENDERBUFFER)
444*35238bceSAndroid Build Coastguard Worker         return 1;
445*35238bceSAndroid Build Coastguard Worker     else if (target == GL_TEXTURE_2D_ARRAY)
446*35238bceSAndroid Build Coastguard Worker     {
447*35238bceSAndroid Build Coastguard Worker         const int maxSize = de::max(size.x(), size.y());
448*35238bceSAndroid Build Coastguard Worker 
449*35238bceSAndroid Build Coastguard Worker         return deLog2Ceil32(maxSize);
450*35238bceSAndroid Build Coastguard Worker     }
451*35238bceSAndroid Build Coastguard Worker     else
452*35238bceSAndroid Build Coastguard Worker     {
453*35238bceSAndroid Build Coastguard Worker         const int maxSize = de::max(size.x(), de::max(size.y(), size.z()));
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker         return deLog2Ceil32(maxSize);
456*35238bceSAndroid Build Coastguard Worker     }
457*35238bceSAndroid Build Coastguard Worker }
458*35238bceSAndroid Build Coastguard Worker 
getLevelSize(uint32_t target,const IVec3 & baseSize,int level)459*35238bceSAndroid Build Coastguard Worker IVec3 getLevelSize(uint32_t target, const IVec3 &baseSize, int level)
460*35238bceSAndroid Build Coastguard Worker {
461*35238bceSAndroid Build Coastguard Worker     IVec3 size;
462*35238bceSAndroid Build Coastguard Worker 
463*35238bceSAndroid Build Coastguard Worker     if (target != GL_TEXTURE_2D_ARRAY)
464*35238bceSAndroid Build Coastguard Worker     {
465*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < 3; i++)
466*35238bceSAndroid Build Coastguard Worker             size[i] = de::max(baseSize[i] >> level, 1);
467*35238bceSAndroid Build Coastguard Worker     }
468*35238bceSAndroid Build Coastguard Worker     else
469*35238bceSAndroid Build Coastguard Worker     {
470*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < 2; i++)
471*35238bceSAndroid Build Coastguard Worker             size[i] = de::max(baseSize[i] >> level, 1);
472*35238bceSAndroid Build Coastguard Worker 
473*35238bceSAndroid Build Coastguard Worker         size[2] = baseSize[2];
474*35238bceSAndroid Build Coastguard Worker     }
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker     return size;
477*35238bceSAndroid Build Coastguard Worker }
478*35238bceSAndroid Build Coastguard Worker 
mapFaceNdxToFace(int ndx)479*35238bceSAndroid Build Coastguard Worker uint32_t mapFaceNdxToFace(int ndx)
480*35238bceSAndroid Build Coastguard Worker {
481*35238bceSAndroid Build Coastguard Worker     const uint32_t cubeFaces[] = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
482*35238bceSAndroid Build Coastguard Worker 
483*35238bceSAndroid Build Coastguard Worker                                   GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
484*35238bceSAndroid Build Coastguard Worker 
485*35238bceSAndroid Build Coastguard Worker                                   GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z};
486*35238bceSAndroid Build Coastguard Worker 
487*35238bceSAndroid Build Coastguard Worker     return de::getSizedArrayElement<6>(cubeFaces, ndx);
488*35238bceSAndroid Build Coastguard Worker }
489*35238bceSAndroid Build Coastguard Worker 
490*35238bceSAndroid Build Coastguard Worker // Class for iterating over mip levels and faces/slices/... of a texture.
491*35238bceSAndroid Build Coastguard Worker class TextureImageIterator
492*35238bceSAndroid Build Coastguard Worker {
493*35238bceSAndroid Build Coastguard Worker public:
494*35238bceSAndroid Build Coastguard Worker     TextureImageIterator(const ImageInfo info, int levelCount);
~TextureImageIterator(void)495*35238bceSAndroid Build Coastguard Worker     ~TextureImageIterator(void)
496*35238bceSAndroid Build Coastguard Worker     {
497*35238bceSAndroid Build Coastguard Worker     }
498*35238bceSAndroid Build Coastguard Worker 
499*35238bceSAndroid Build Coastguard Worker     // Need to call next image once, newly constructed not readable, except for getSize
500*35238bceSAndroid Build Coastguard Worker     bool nextImage(void);
hasNextImage(void) const501*35238bceSAndroid Build Coastguard Worker     bool hasNextImage(void) const
502*35238bceSAndroid Build Coastguard Worker     {
503*35238bceSAndroid Build Coastguard Worker         return (m_currentLevel < (m_levelCount - 1)) || m_currentImage < (m_levelImageCount - 1);
504*35238bceSAndroid Build Coastguard Worker     }
505*35238bceSAndroid Build Coastguard Worker 
getMipLevel(void) const506*35238bceSAndroid Build Coastguard Worker     int getMipLevel(void) const
507*35238bceSAndroid Build Coastguard Worker     {
508*35238bceSAndroid Build Coastguard Worker         return m_currentLevel;
509*35238bceSAndroid Build Coastguard Worker     }
getMipLevelCount(void) const510*35238bceSAndroid Build Coastguard Worker     int getMipLevelCount(void) const
511*35238bceSAndroid Build Coastguard Worker     {
512*35238bceSAndroid Build Coastguard Worker         return m_levelCount;
513*35238bceSAndroid Build Coastguard Worker     }
getCurrentImage(void) const514*35238bceSAndroid Build Coastguard Worker     int getCurrentImage(void) const
515*35238bceSAndroid Build Coastguard Worker     {
516*35238bceSAndroid Build Coastguard Worker         return m_currentImage;
517*35238bceSAndroid Build Coastguard Worker     }
getLevelImageCount(void) const518*35238bceSAndroid Build Coastguard Worker     int getLevelImageCount(void) const
519*35238bceSAndroid Build Coastguard Worker     {
520*35238bceSAndroid Build Coastguard Worker         return m_levelImageCount;
521*35238bceSAndroid Build Coastguard Worker     }
getSize(void) const522*35238bceSAndroid Build Coastguard Worker     IVec2 getSize(void) const
523*35238bceSAndroid Build Coastguard Worker     {
524*35238bceSAndroid Build Coastguard Worker         return m_levelSize.toWidth<2>();
525*35238bceSAndroid Build Coastguard Worker     } // Assume that image sizes never grow over iteration
getTarget(void) const526*35238bceSAndroid Build Coastguard Worker     uint32_t getTarget(void) const
527*35238bceSAndroid Build Coastguard Worker     {
528*35238bceSAndroid Build Coastguard Worker         return m_info.getTarget();
529*35238bceSAndroid Build Coastguard Worker     }
530*35238bceSAndroid Build Coastguard Worker 
531*35238bceSAndroid Build Coastguard Worker private:
532*35238bceSAndroid Build Coastguard Worker     int m_levelImageCount; // Need to be defined in CTOR for the hasNextImage to work!
533*35238bceSAndroid Build Coastguard Worker     const ImageInfo m_info;
534*35238bceSAndroid Build Coastguard Worker     int m_currentLevel;
535*35238bceSAndroid Build Coastguard Worker     IVec3 m_levelSize;
536*35238bceSAndroid Build Coastguard Worker     int m_currentImage;
537*35238bceSAndroid Build Coastguard Worker     const int m_levelCount;
538*35238bceSAndroid Build Coastguard Worker };
539*35238bceSAndroid Build Coastguard Worker 
TextureImageIterator(const ImageInfo info,int levelCount)540*35238bceSAndroid Build Coastguard Worker TextureImageIterator::TextureImageIterator(const ImageInfo info, int levelCount)
541*35238bceSAndroid Build Coastguard Worker     : m_levelImageCount(info.getTarget() == GL_TEXTURE_CUBE_MAP ? 6 :
542*35238bceSAndroid Build Coastguard Worker                                                                   getLevelSize(info.getTarget(), info.getSize(), 0).z())
543*35238bceSAndroid Build Coastguard Worker     , m_info(info)
544*35238bceSAndroid Build Coastguard Worker     , m_currentLevel(0)
545*35238bceSAndroid Build Coastguard Worker     , m_levelSize(getLevelSize(info.getTarget(), info.getSize(), 0))
546*35238bceSAndroid Build Coastguard Worker     , m_currentImage(-1)
547*35238bceSAndroid Build Coastguard Worker     , m_levelCount(levelCount)
548*35238bceSAndroid Build Coastguard Worker {
549*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_levelCount <= getLevelCount(info));
550*35238bceSAndroid Build Coastguard Worker }
551*35238bceSAndroid Build Coastguard Worker 
nextImage(void)552*35238bceSAndroid Build Coastguard Worker bool TextureImageIterator::nextImage(void)
553*35238bceSAndroid Build Coastguard Worker {
554*35238bceSAndroid Build Coastguard Worker     if (!hasNextImage())
555*35238bceSAndroid Build Coastguard Worker         return false;
556*35238bceSAndroid Build Coastguard Worker 
557*35238bceSAndroid Build Coastguard Worker     m_currentImage++;
558*35238bceSAndroid Build Coastguard Worker     if (m_currentImage == m_levelImageCount)
559*35238bceSAndroid Build Coastguard Worker     {
560*35238bceSAndroid Build Coastguard Worker         m_currentLevel++;
561*35238bceSAndroid Build Coastguard Worker         m_currentImage = 0;
562*35238bceSAndroid Build Coastguard Worker 
563*35238bceSAndroid Build Coastguard Worker         m_levelSize = getLevelSize(m_info.getTarget(), m_info.getSize(), m_currentLevel);
564*35238bceSAndroid Build Coastguard Worker 
565*35238bceSAndroid Build Coastguard Worker         if (getTarget() == GL_TEXTURE_CUBE_MAP)
566*35238bceSAndroid Build Coastguard Worker             m_levelImageCount = 6;
567*35238bceSAndroid Build Coastguard Worker         else
568*35238bceSAndroid Build Coastguard Worker             m_levelImageCount = m_levelSize.z();
569*35238bceSAndroid Build Coastguard Worker     }
570*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_currentLevel < m_levelCount);
571*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_currentImage < m_levelImageCount);
572*35238bceSAndroid Build Coastguard Worker     return true;
573*35238bceSAndroid Build Coastguard Worker }
574*35238bceSAndroid Build Coastguard Worker 
575*35238bceSAndroid Build Coastguard Worker // Get name
getTextureImageName(int textureTarget,int mipLevel,int imageIndex)576*35238bceSAndroid Build Coastguard Worker string getTextureImageName(int textureTarget, int mipLevel, int imageIndex)
577*35238bceSAndroid Build Coastguard Worker {
578*35238bceSAndroid Build Coastguard Worker     std::ostringstream result;
579*35238bceSAndroid Build Coastguard Worker     result << "Level";
580*35238bceSAndroid Build Coastguard Worker     result << mipLevel;
581*35238bceSAndroid Build Coastguard Worker     switch (textureTarget)
582*35238bceSAndroid Build Coastguard Worker     {
583*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
584*35238bceSAndroid Build Coastguard Worker         break;
585*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
586*35238bceSAndroid Build Coastguard Worker         result << "Slice" << imageIndex;
587*35238bceSAndroid Build Coastguard Worker         break;
588*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
589*35238bceSAndroid Build Coastguard Worker         result << "Face" << imageIndex;
590*35238bceSAndroid Build Coastguard Worker         break;
591*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
592*35238bceSAndroid Build Coastguard Worker         result << "Layer" << imageIndex;
593*35238bceSAndroid Build Coastguard Worker         break;
594*35238bceSAndroid Build Coastguard Worker     default:
595*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unsupported texture target");
596*35238bceSAndroid Build Coastguard Worker         break;
597*35238bceSAndroid Build Coastguard Worker     }
598*35238bceSAndroid Build Coastguard Worker     return result.str();
599*35238bceSAndroid Build Coastguard Worker }
600*35238bceSAndroid Build Coastguard Worker 
601*35238bceSAndroid Build Coastguard Worker // Get description
getTextureImageDescription(int textureTarget,int mipLevel,int imageIndex)602*35238bceSAndroid Build Coastguard Worker string getTextureImageDescription(int textureTarget, int mipLevel, int imageIndex)
603*35238bceSAndroid Build Coastguard Worker {
604*35238bceSAndroid Build Coastguard Worker     std::ostringstream result;
605*35238bceSAndroid Build Coastguard Worker     result << "level ";
606*35238bceSAndroid Build Coastguard Worker     result << mipLevel;
607*35238bceSAndroid Build Coastguard Worker 
608*35238bceSAndroid Build Coastguard Worker     switch (textureTarget)
609*35238bceSAndroid Build Coastguard Worker     {
610*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
611*35238bceSAndroid Build Coastguard Worker         break;
612*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
613*35238bceSAndroid Build Coastguard Worker         result << " and Slice " << imageIndex;
614*35238bceSAndroid Build Coastguard Worker         break;
615*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
616*35238bceSAndroid Build Coastguard Worker         result << " and Face " << imageIndex;
617*35238bceSAndroid Build Coastguard Worker         break;
618*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
619*35238bceSAndroid Build Coastguard Worker         result << " and Layer " << imageIndex;
620*35238bceSAndroid Build Coastguard Worker         break;
621*35238bceSAndroid Build Coastguard Worker     default:
622*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unsupported texture target");
623*35238bceSAndroid Build Coastguard Worker         break;
624*35238bceSAndroid Build Coastguard Worker     }
625*35238bceSAndroid Build Coastguard Worker     return result.str();
626*35238bceSAndroid Build Coastguard Worker }
627*35238bceSAndroid Build Coastguard Worker 
628*35238bceSAndroid Build Coastguard Worker // Compute texture coordinates
computeQuadTexCoords(vector<float> & texCoord,const TextureImageIterator & iteration)629*35238bceSAndroid Build Coastguard Worker void computeQuadTexCoords(vector<float> &texCoord, const TextureImageIterator &iteration)
630*35238bceSAndroid Build Coastguard Worker {
631*35238bceSAndroid Build Coastguard Worker     const int currentImage = iteration.getCurrentImage();
632*35238bceSAndroid Build Coastguard Worker     switch (iteration.getTarget())
633*35238bceSAndroid Build Coastguard Worker     {
634*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
635*35238bceSAndroid Build Coastguard Worker         computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
636*35238bceSAndroid Build Coastguard Worker         break;
637*35238bceSAndroid Build Coastguard Worker 
638*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
639*35238bceSAndroid Build Coastguard Worker     {
640*35238bceSAndroid Build Coastguard Worker         const float r = (float(currentImage) + 0.5f) / (float)iteration.getLevelImageCount();
641*35238bceSAndroid Build Coastguard Worker         computeQuadTexCoord3D(texCoord, tcu::Vec3(0.0f, 0.0f, r), tcu::Vec3(1.0f, 1.0f, r), tcu::IVec3(0, 1, 2));
642*35238bceSAndroid Build Coastguard Worker         break;
643*35238bceSAndroid Build Coastguard Worker     }
644*35238bceSAndroid Build Coastguard Worker 
645*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
646*35238bceSAndroid Build Coastguard Worker         computeQuadTexCoordCube(texCoord, glu::getCubeFaceFromGL(mapFaceNdxToFace(currentImage)));
647*35238bceSAndroid Build Coastguard Worker         break;
648*35238bceSAndroid Build Coastguard Worker 
649*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
650*35238bceSAndroid Build Coastguard Worker         computeQuadTexCoord2DArray(texCoord, currentImage, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
651*35238bceSAndroid Build Coastguard Worker         break;
652*35238bceSAndroid Build Coastguard Worker 
653*35238bceSAndroid Build Coastguard Worker     default:
654*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unsupported texture target");
655*35238bceSAndroid Build Coastguard Worker     }
656*35238bceSAndroid Build Coastguard Worker }
657*35238bceSAndroid Build Coastguard Worker 
658*35238bceSAndroid Build Coastguard Worker // Struct for storing each reference image with necessary metadata.
659*35238bceSAndroid Build Coastguard Worker struct CellContents
660*35238bceSAndroid Build Coastguard Worker {
661*35238bceSAndroid Build Coastguard Worker     IVec2 origin;
662*35238bceSAndroid Build Coastguard Worker     tcu::Surface reference;
663*35238bceSAndroid Build Coastguard Worker     std::string name;
664*35238bceSAndroid Build Coastguard Worker     std::string description;
665*35238bceSAndroid Build Coastguard Worker };
666*35238bceSAndroid Build Coastguard Worker 
667*35238bceSAndroid Build Coastguard Worker // Return format that has more restrictions on texel data.
getMoreRestrictiveFormat(uint32_t formatA,uint32_t formatB)668*35238bceSAndroid Build Coastguard Worker uint32_t getMoreRestrictiveFormat(uint32_t formatA, uint32_t formatB)
669*35238bceSAndroid Build Coastguard Worker {
670*35238bceSAndroid Build Coastguard Worker     if (formatA == formatB)
671*35238bceSAndroid Build Coastguard Worker         return formatA;
672*35238bceSAndroid Build Coastguard Worker     else if (glu::isCompressedFormat(formatA) && isAstcFormat(glu::mapGLCompressedTexFormat(formatA)))
673*35238bceSAndroid Build Coastguard Worker         return formatA;
674*35238bceSAndroid Build Coastguard Worker     else if (glu::isCompressedFormat(formatB) && isAstcFormat(glu::mapGLCompressedTexFormat(formatB)))
675*35238bceSAndroid Build Coastguard Worker         return formatB;
676*35238bceSAndroid Build Coastguard Worker     else if (isFloatFormat(formatA))
677*35238bceSAndroid Build Coastguard Worker     {
678*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!isFloatFormat(formatB));
679*35238bceSAndroid Build Coastguard Worker 
680*35238bceSAndroid Build Coastguard Worker         return formatA;
681*35238bceSAndroid Build Coastguard Worker     }
682*35238bceSAndroid Build Coastguard Worker     else if (isFloatFormat(formatB))
683*35238bceSAndroid Build Coastguard Worker     {
684*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!isFloatFormat(formatA));
685*35238bceSAndroid Build Coastguard Worker 
686*35238bceSAndroid Build Coastguard Worker         return formatB;
687*35238bceSAndroid Build Coastguard Worker     }
688*35238bceSAndroid Build Coastguard Worker     else if (glu::isCompressedFormat(formatA))
689*35238bceSAndroid Build Coastguard Worker     {
690*35238bceSAndroid Build Coastguard Worker         return formatA;
691*35238bceSAndroid Build Coastguard Worker     }
692*35238bceSAndroid Build Coastguard Worker     else if (glu::isCompressedFormat(formatB))
693*35238bceSAndroid Build Coastguard Worker     {
694*35238bceSAndroid Build Coastguard Worker         return formatB;
695*35238bceSAndroid Build Coastguard Worker     }
696*35238bceSAndroid Build Coastguard Worker     else
697*35238bceSAndroid Build Coastguard Worker         return formatA;
698*35238bceSAndroid Build Coastguard Worker }
699*35238bceSAndroid Build Coastguard Worker 
getTexelBlockSize(uint32_t format)700*35238bceSAndroid Build Coastguard Worker int getTexelBlockSize(uint32_t format)
701*35238bceSAndroid Build Coastguard Worker {
702*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
703*35238bceSAndroid Build Coastguard Worker         return tcu::getBlockSize(glu::mapGLCompressedTexFormat(format));
704*35238bceSAndroid Build Coastguard Worker     else
705*35238bceSAndroid Build Coastguard Worker         return glu::mapGLInternalFormat(format).getPixelSize();
706*35238bceSAndroid Build Coastguard Worker }
707*35238bceSAndroid Build Coastguard Worker 
getTexelBlockPixelSize(uint32_t format)708*35238bceSAndroid Build Coastguard Worker IVec3 getTexelBlockPixelSize(uint32_t format)
709*35238bceSAndroid Build Coastguard Worker {
710*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
711*35238bceSAndroid Build Coastguard Worker         return tcu::getBlockPixelSize(glu::mapGLCompressedTexFormat(format));
712*35238bceSAndroid Build Coastguard Worker     else
713*35238bceSAndroid Build Coastguard Worker         return IVec3(1, 1, 1);
714*35238bceSAndroid Build Coastguard Worker }
715*35238bceSAndroid Build Coastguard Worker 
isColorRenderable(uint32_t format)716*35238bceSAndroid Build Coastguard Worker bool isColorRenderable(uint32_t format)
717*35238bceSAndroid Build Coastguard Worker {
718*35238bceSAndroid Build Coastguard Worker     switch (format)
719*35238bceSAndroid Build Coastguard Worker     {
720*35238bceSAndroid Build Coastguard Worker     case GL_R8:
721*35238bceSAndroid Build Coastguard Worker     case GL_RG8:
722*35238bceSAndroid Build Coastguard Worker     case GL_RGB8:
723*35238bceSAndroid Build Coastguard Worker     case GL_RGB565:
724*35238bceSAndroid Build Coastguard Worker     case GL_RGB4:
725*35238bceSAndroid Build Coastguard Worker     case GL_RGB5_A1:
726*35238bceSAndroid Build Coastguard Worker     case GL_RGBA8:
727*35238bceSAndroid Build Coastguard Worker     case GL_RGB10_A2:
728*35238bceSAndroid Build Coastguard Worker     case GL_RGB10_A2UI:
729*35238bceSAndroid Build Coastguard Worker     case GL_SRGB8_ALPHA8:
730*35238bceSAndroid Build Coastguard Worker     case GL_R8I:
731*35238bceSAndroid Build Coastguard Worker     case GL_R8UI:
732*35238bceSAndroid Build Coastguard Worker     case GL_R16I:
733*35238bceSAndroid Build Coastguard Worker     case GL_R16UI:
734*35238bceSAndroid Build Coastguard Worker     case GL_R32I:
735*35238bceSAndroid Build Coastguard Worker     case GL_R32UI:
736*35238bceSAndroid Build Coastguard Worker     case GL_RG8I:
737*35238bceSAndroid Build Coastguard Worker     case GL_RG8UI:
738*35238bceSAndroid Build Coastguard Worker     case GL_RG16I:
739*35238bceSAndroid Build Coastguard Worker     case GL_RG16UI:
740*35238bceSAndroid Build Coastguard Worker     case GL_RG32I:
741*35238bceSAndroid Build Coastguard Worker     case GL_RG32UI:
742*35238bceSAndroid Build Coastguard Worker     case GL_RGBA8I:
743*35238bceSAndroid Build Coastguard Worker     case GL_RGBA8UI:
744*35238bceSAndroid Build Coastguard Worker     case GL_RGBA16I:
745*35238bceSAndroid Build Coastguard Worker     case GL_RGBA16UI:
746*35238bceSAndroid Build Coastguard Worker     case GL_RGBA32I:
747*35238bceSAndroid Build Coastguard Worker     case GL_RGBA32UI:
748*35238bceSAndroid Build Coastguard Worker         return true;
749*35238bceSAndroid Build Coastguard Worker 
750*35238bceSAndroid Build Coastguard Worker     default:
751*35238bceSAndroid Build Coastguard Worker         return false;
752*35238bceSAndroid Build Coastguard Worker     }
753*35238bceSAndroid Build Coastguard Worker }
754*35238bceSAndroid Build Coastguard Worker 
getTypeForInternalFormat(uint32_t format)755*35238bceSAndroid Build Coastguard Worker uint32_t getTypeForInternalFormat(uint32_t format)
756*35238bceSAndroid Build Coastguard Worker {
757*35238bceSAndroid Build Coastguard Worker     return glu::getTransferFormat(glu::mapGLInternalFormat(format)).dataType;
758*35238bceSAndroid Build Coastguard Worker }
759*35238bceSAndroid Build Coastguard Worker 
genTexel(de::Random & rng,uint32_t glFormat,int texelBlockSize,const int texelCount,uint8_t * buffer)760*35238bceSAndroid Build Coastguard Worker void genTexel(de::Random &rng, uint32_t glFormat, int texelBlockSize, const int texelCount, uint8_t *buffer)
761*35238bceSAndroid Build Coastguard Worker {
762*35238bceSAndroid Build Coastguard Worker     if (isFloatFormat(glFormat))
763*35238bceSAndroid Build Coastguard Worker     {
764*35238bceSAndroid Build Coastguard Worker         const tcu::TextureFormat format = glu::mapGLInternalFormat(glFormat);
765*35238bceSAndroid Build Coastguard Worker         const tcu::PixelBufferAccess access(format, texelCount, 1, 1, buffer);
766*35238bceSAndroid Build Coastguard Worker         const tcu::TextureFormatInfo info = tcu::getTextureFormatInfo(format);
767*35238bceSAndroid Build Coastguard Worker 
768*35238bceSAndroid Build Coastguard Worker         for (int texelNdx = 0; texelNdx < texelCount; texelNdx++)
769*35238bceSAndroid Build Coastguard Worker         {
770*35238bceSAndroid Build Coastguard Worker             const float red   = rng.getFloat(info.valueMin.x(), info.valueMax.x());
771*35238bceSAndroid Build Coastguard Worker             const float green = rng.getFloat(info.valueMin.y(), info.valueMax.y());
772*35238bceSAndroid Build Coastguard Worker             const float blue  = rng.getFloat(info.valueMin.z(), info.valueMax.z());
773*35238bceSAndroid Build Coastguard Worker             const float alpha = rng.getFloat(info.valueMin.w(), info.valueMax.w());
774*35238bceSAndroid Build Coastguard Worker 
775*35238bceSAndroid Build Coastguard Worker             const Vec4 color(red, green, blue, alpha);
776*35238bceSAndroid Build Coastguard Worker 
777*35238bceSAndroid Build Coastguard Worker             access.setPixel(color, texelNdx, 0, 0);
778*35238bceSAndroid Build Coastguard Worker         }
779*35238bceSAndroid Build Coastguard Worker     }
780*35238bceSAndroid Build Coastguard Worker     else if (glu::isCompressedFormat(glFormat))
781*35238bceSAndroid Build Coastguard Worker     {
782*35238bceSAndroid Build Coastguard Worker         const tcu::CompressedTexFormat compressedFormat = glu::mapGLCompressedTexFormat(glFormat);
783*35238bceSAndroid Build Coastguard Worker 
784*35238bceSAndroid Build Coastguard Worker         if (tcu::isAstcFormat(compressedFormat))
785*35238bceSAndroid Build Coastguard Worker         {
786*35238bceSAndroid Build Coastguard Worker             const int BLOCK_SIZE               = 16;
787*35238bceSAndroid Build Coastguard Worker             const uint8_t blocks[][BLOCK_SIZE] = {
788*35238bceSAndroid Build Coastguard Worker                 // \note All of the following blocks are valid in LDR mode.
789*35238bceSAndroid Build Coastguard Worker                 {
790*35238bceSAndroid Build Coastguard Worker                     252,
791*35238bceSAndroid Build Coastguard Worker                     253,
792*35238bceSAndroid Build Coastguard Worker                     255,
793*35238bceSAndroid Build Coastguard Worker                     255,
794*35238bceSAndroid Build Coastguard Worker                     255,
795*35238bceSAndroid Build Coastguard Worker                     255,
796*35238bceSAndroid Build Coastguard Worker                     255,
797*35238bceSAndroid Build Coastguard Worker                     255,
798*35238bceSAndroid Build Coastguard Worker                     8,
799*35238bceSAndroid Build Coastguard Worker                     71,
800*35238bceSAndroid Build Coastguard Worker                     90,
801*35238bceSAndroid Build Coastguard Worker                     78,
802*35238bceSAndroid Build Coastguard Worker                     22,
803*35238bceSAndroid Build Coastguard Worker                     17,
804*35238bceSAndroid Build Coastguard Worker                     26,
805*35238bceSAndroid Build Coastguard Worker                     66,
806*35238bceSAndroid Build Coastguard Worker                 },
807*35238bceSAndroid Build Coastguard Worker                 {252, 253, 255, 255, 255, 255, 255, 255, 220, 74, 139, 235, 249, 6, 145, 125},
808*35238bceSAndroid Build Coastguard Worker                 {252, 253, 255, 255, 255, 255, 255, 255, 223, 251, 28, 206, 54, 251, 160, 174},
809*35238bceSAndroid Build Coastguard Worker                 {252, 253, 255, 255, 255, 255, 255, 255, 39, 4, 153, 219, 180, 61, 51, 37},
810*35238bceSAndroid Build Coastguard Worker                 {67, 2, 0, 254, 1, 0, 64, 215, 83, 211, 159, 105, 41, 140, 50, 2},
811*35238bceSAndroid Build Coastguard Worker                 {67, 130, 0, 170, 84, 255, 65, 215, 83, 211, 159, 105, 41, 140, 50, 2},
812*35238bceSAndroid Build Coastguard Worker                 {67, 2, 129, 38, 51, 229, 95, 215, 83, 211, 159, 105, 41, 140, 50, 2},
813*35238bceSAndroid Build Coastguard Worker                 {67, 130, 193, 56, 213, 144, 95, 215, 83, 211, 159, 105, 41, 140, 50, 2}};
814*35238bceSAndroid Build Coastguard Worker 
815*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(texelBlockSize == BLOCK_SIZE);
816*35238bceSAndroid Build Coastguard Worker 
817*35238bceSAndroid Build Coastguard Worker             for (int i = 0; i < texelCount; i++)
818*35238bceSAndroid Build Coastguard Worker             {
819*35238bceSAndroid Build Coastguard Worker                 const int blockNdx = rng.getInt(0, DE_LENGTH_OF_ARRAY(blocks) - 1);
820*35238bceSAndroid Build Coastguard Worker 
821*35238bceSAndroid Build Coastguard Worker                 deMemcpy(buffer + i * BLOCK_SIZE, blocks[blockNdx], BLOCK_SIZE);
822*35238bceSAndroid Build Coastguard Worker             }
823*35238bceSAndroid Build Coastguard Worker         }
824*35238bceSAndroid Build Coastguard Worker         else
825*35238bceSAndroid Build Coastguard Worker         {
826*35238bceSAndroid Build Coastguard Worker             for (int i = 0; i < texelBlockSize * texelCount; i++)
827*35238bceSAndroid Build Coastguard Worker             {
828*35238bceSAndroid Build Coastguard Worker                 const uint8_t val = rng.getUint8();
829*35238bceSAndroid Build Coastguard Worker 
830*35238bceSAndroid Build Coastguard Worker                 buffer[i] = val;
831*35238bceSAndroid Build Coastguard Worker             }
832*35238bceSAndroid Build Coastguard Worker         }
833*35238bceSAndroid Build Coastguard Worker     }
834*35238bceSAndroid Build Coastguard Worker     else
835*35238bceSAndroid Build Coastguard Worker     {
836*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < texelBlockSize * texelCount; i++)
837*35238bceSAndroid Build Coastguard Worker         {
838*35238bceSAndroid Build Coastguard Worker             const uint8_t val = rng.getUint8();
839*35238bceSAndroid Build Coastguard Worker 
840*35238bceSAndroid Build Coastguard Worker             buffer[i] = val;
841*35238bceSAndroid Build Coastguard Worker         }
842*35238bceSAndroid Build Coastguard Worker     }
843*35238bceSAndroid Build Coastguard Worker }
844*35238bceSAndroid Build Coastguard Worker 
divRoundUp(const IVec3 & a,const IVec3 & b)845*35238bceSAndroid Build Coastguard Worker IVec3 divRoundUp(const IVec3 &a, const IVec3 &b)
846*35238bceSAndroid Build Coastguard Worker {
847*35238bceSAndroid Build Coastguard Worker     IVec3 res;
848*35238bceSAndroid Build Coastguard Worker 
849*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++)
850*35238bceSAndroid Build Coastguard Worker         res[i] = a[i] / b[i] + ((a[i] % b[i]) ? 1 : 0);
851*35238bceSAndroid Build Coastguard Worker 
852*35238bceSAndroid Build Coastguard Worker     return res;
853*35238bceSAndroid Build Coastguard Worker }
854*35238bceSAndroid Build Coastguard Worker 
getFormatForInternalFormat(uint32_t format)855*35238bceSAndroid Build Coastguard Worker uint32_t getFormatForInternalFormat(uint32_t format)
856*35238bceSAndroid Build Coastguard Worker {
857*35238bceSAndroid Build Coastguard Worker     return glu::getTransferFormat(glu::mapGLInternalFormat(format)).format;
858*35238bceSAndroid Build Coastguard Worker }
859*35238bceSAndroid Build Coastguard Worker 
genericTexImage(const glw::Functions & gl,uint32_t target,int faceNdx,int level,const IVec3 & size,uint32_t format,size_t dataSize,const void * data)860*35238bceSAndroid Build Coastguard Worker void genericTexImage(const glw::Functions &gl, uint32_t target, int faceNdx, int level, const IVec3 &size,
861*35238bceSAndroid Build Coastguard Worker                      uint32_t format, size_t dataSize, const void *data)
862*35238bceSAndroid Build Coastguard Worker {
863*35238bceSAndroid Build Coastguard Worker     const uint32_t glTarget = (target == GL_TEXTURE_CUBE_MAP ? mapFaceNdxToFace(faceNdx) : target);
864*35238bceSAndroid Build Coastguard Worker 
865*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(target == GL_TEXTURE_CUBE_MAP || faceNdx == 0);
866*35238bceSAndroid Build Coastguard Worker 
867*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
868*35238bceSAndroid Build Coastguard Worker     {
869*35238bceSAndroid Build Coastguard Worker         switch (getTargetTexDims(target))
870*35238bceSAndroid Build Coastguard Worker         {
871*35238bceSAndroid Build Coastguard Worker         case 2:
872*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(size.z() == 1);
873*35238bceSAndroid Build Coastguard Worker             gl.compressedTexImage2D(glTarget, level, format, (glw::GLsizei)size.x(), (glw::GLsizei)size.y(), 0,
874*35238bceSAndroid Build Coastguard Worker                                     (glw::GLsizei)dataSize, data);
875*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D failed.");
876*35238bceSAndroid Build Coastguard Worker             break;
877*35238bceSAndroid Build Coastguard Worker 
878*35238bceSAndroid Build Coastguard Worker         case 3:
879*35238bceSAndroid Build Coastguard Worker             gl.compressedTexImage3D(glTarget, level, format, (glw::GLsizei)size.x(), (glw::GLsizei)size.y(),
880*35238bceSAndroid Build Coastguard Worker                                     (glw::GLsizei)size.z(), 0, (glw::GLsizei)dataSize, data);
881*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D failed.");
882*35238bceSAndroid Build Coastguard Worker             break;
883*35238bceSAndroid Build Coastguard Worker 
884*35238bceSAndroid Build Coastguard Worker         default:
885*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
886*35238bceSAndroid Build Coastguard Worker         }
887*35238bceSAndroid Build Coastguard Worker     }
888*35238bceSAndroid Build Coastguard Worker     else
889*35238bceSAndroid Build Coastguard Worker     {
890*35238bceSAndroid Build Coastguard Worker         const uint32_t glFormat = getFormatForInternalFormat(format);
891*35238bceSAndroid Build Coastguard Worker         const uint32_t glType   = getTypeForInternalFormat(format);
892*35238bceSAndroid Build Coastguard Worker 
893*35238bceSAndroid Build Coastguard Worker         switch (getTargetTexDims(target))
894*35238bceSAndroid Build Coastguard Worker         {
895*35238bceSAndroid Build Coastguard Worker         case 2:
896*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(size.z() == 1);
897*35238bceSAndroid Build Coastguard Worker             gl.texImage2D(glTarget, level, format, (glw::GLsizei)size.x(), (glw::GLsizei)size.y(), 0, glFormat, glType,
898*35238bceSAndroid Build Coastguard Worker                           data);
899*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D failed.");
900*35238bceSAndroid Build Coastguard Worker             break;
901*35238bceSAndroid Build Coastguard Worker 
902*35238bceSAndroid Build Coastguard Worker         case 3:
903*35238bceSAndroid Build Coastguard Worker             gl.texImage3D(glTarget, level, format, (glw::GLsizei)size.x(), (glw::GLsizei)size.y(),
904*35238bceSAndroid Build Coastguard Worker                           (glw::GLsizei)size.z(), 0, glFormat, glType, data);
905*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D failed.");
906*35238bceSAndroid Build Coastguard Worker             break;
907*35238bceSAndroid Build Coastguard Worker 
908*35238bceSAndroid Build Coastguard Worker         default:
909*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
910*35238bceSAndroid Build Coastguard Worker         }
911*35238bceSAndroid Build Coastguard Worker     }
912*35238bceSAndroid Build Coastguard Worker }
913*35238bceSAndroid Build Coastguard Worker 
genTextureImage(const glw::Functions & gl,de::Random & rng,uint32_t name,vector<ArrayBuffer<uint8_t>> & levels,const ImageInfo & info,uint32_t moreRestrictiveFormat)914*35238bceSAndroid Build Coastguard Worker void genTextureImage(const glw::Functions &gl, de::Random &rng, uint32_t name, vector<ArrayBuffer<uint8_t>> &levels,
915*35238bceSAndroid Build Coastguard Worker                      const ImageInfo &info, uint32_t moreRestrictiveFormat)
916*35238bceSAndroid Build Coastguard Worker {
917*35238bceSAndroid Build Coastguard Worker     const int texelBlockSize        = getTexelBlockSize(info.getFormat());
918*35238bceSAndroid Build Coastguard Worker     const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat());
919*35238bceSAndroid Build Coastguard Worker 
920*35238bceSAndroid Build Coastguard Worker     levels.resize(getLevelCount(info));
921*35238bceSAndroid Build Coastguard Worker 
922*35238bceSAndroid Build Coastguard Worker     gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1);
923*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Setting pixel store aligment failed.");
924*35238bceSAndroid Build Coastguard Worker 
925*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(info.getTarget(), name);
926*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Binding texture failed.");
927*35238bceSAndroid Build Coastguard Worker 
928*35238bceSAndroid Build Coastguard Worker     for (int levelNdx = 0; levelNdx < getLevelCount(info); levelNdx++)
929*35238bceSAndroid Build Coastguard Worker     {
930*35238bceSAndroid Build Coastguard Worker         ArrayBuffer<uint8_t> &level = levels[levelNdx];
931*35238bceSAndroid Build Coastguard Worker 
932*35238bceSAndroid Build Coastguard Worker         const int faceCount = (info.getTarget() == GL_TEXTURE_CUBE_MAP ? 6 : 1);
933*35238bceSAndroid Build Coastguard Worker 
934*35238bceSAndroid Build Coastguard Worker         const IVec3 levelPixelSize      = getLevelSize(info.getTarget(), info.getSize(), levelNdx);
935*35238bceSAndroid Build Coastguard Worker         const IVec3 levelTexelBlockSize = divRoundUp(levelPixelSize, texelBlockPixelSize);
936*35238bceSAndroid Build Coastguard Worker         const int levelTexelBlockCount  = levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z();
937*35238bceSAndroid Build Coastguard Worker         const int levelSize             = levelTexelBlockCount * texelBlockSize;
938*35238bceSAndroid Build Coastguard Worker 
939*35238bceSAndroid Build Coastguard Worker         level.setStorage(levelSize * faceCount);
940*35238bceSAndroid Build Coastguard Worker 
941*35238bceSAndroid Build Coastguard Worker         for (int faceNdx = 0; faceNdx < faceCount; faceNdx++)
942*35238bceSAndroid Build Coastguard Worker         {
943*35238bceSAndroid Build Coastguard Worker             genTexel(rng, moreRestrictiveFormat, texelBlockSize, levelTexelBlockCount,
944*35238bceSAndroid Build Coastguard Worker                      level.getElementPtr(faceNdx * levelSize));
945*35238bceSAndroid Build Coastguard Worker 
946*35238bceSAndroid Build Coastguard Worker             genericTexImage(gl, info.getTarget(), faceNdx, levelNdx, levelPixelSize, info.getFormat(), levelSize,
947*35238bceSAndroid Build Coastguard Worker                             level.getElementPtr(faceNdx * levelSize));
948*35238bceSAndroid Build Coastguard Worker         }
949*35238bceSAndroid Build Coastguard Worker     }
950*35238bceSAndroid Build Coastguard Worker 
951*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(info.getTarget(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
952*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(info.getTarget(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
953*35238bceSAndroid Build Coastguard Worker 
954*35238bceSAndroid Build Coastguard Worker     if (info.getTarget() == GL_TEXTURE_3D)
955*35238bceSAndroid Build Coastguard Worker         gl.texParameteri(info.getTarget(), GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
956*35238bceSAndroid Build Coastguard Worker 
957*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(info.getTarget(), GL_TEXTURE_MIN_FILTER, GL_NEAREST);
958*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(info.getTarget(), GL_TEXTURE_MAG_FILTER, GL_NEAREST);
959*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Setting texture parameters failed");
960*35238bceSAndroid Build Coastguard Worker 
961*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(info.getTarget(), 0);
962*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Unbinding texture failed.");
963*35238bceSAndroid Build Coastguard Worker }
964*35238bceSAndroid Build Coastguard Worker 
genRenderbufferImage(const glw::Functions & gl,de::Random & rng,uint32_t name,vector<ArrayBuffer<uint8_t>> & levels,const ImageInfo & info,uint32_t moreRestrictiveFormat)965*35238bceSAndroid Build Coastguard Worker void genRenderbufferImage(const glw::Functions &gl, de::Random &rng, uint32_t name,
966*35238bceSAndroid Build Coastguard Worker                           vector<ArrayBuffer<uint8_t>> &levels, const ImageInfo &info, uint32_t moreRestrictiveFormat)
967*35238bceSAndroid Build Coastguard Worker {
968*35238bceSAndroid Build Coastguard Worker     const IVec3 size                = info.getSize();
969*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format = glu::mapGLInternalFormat(info.getFormat());
970*35238bceSAndroid Build Coastguard Worker 
971*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(info.getTarget() == GL_RENDERBUFFER);
972*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(info.getSize().z() == 1);
973*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(getLevelCount(info) == 1);
974*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!glu::isCompressedFormat(info.getFormat()));
975*35238bceSAndroid Build Coastguard Worker 
976*35238bceSAndroid Build Coastguard Worker     glu::Framebuffer framebuffer(gl);
977*35238bceSAndroid Build Coastguard Worker 
978*35238bceSAndroid Build Coastguard Worker     levels.resize(1);
979*35238bceSAndroid Build Coastguard Worker     levels[0].setStorage(format.getPixelSize() * size.x() * size.y());
980*35238bceSAndroid Build Coastguard Worker     tcu::PixelBufferAccess refAccess(format, size.x(), size.y(), 1, levels[0].getPtr());
981*35238bceSAndroid Build Coastguard Worker 
982*35238bceSAndroid Build Coastguard Worker     gl.bindRenderbuffer(GL_RENDERBUFFER, name);
983*35238bceSAndroid Build Coastguard Worker     gl.renderbufferStorage(GL_RENDERBUFFER, info.getFormat(), info.getSize().x(), info.getSize().y());
984*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Binding and setting storage for renderbuffer failed.");
985*35238bceSAndroid Build Coastguard Worker 
986*35238bceSAndroid Build Coastguard Worker     gl.bindFramebuffer(GL_FRAMEBUFFER, *framebuffer);
987*35238bceSAndroid Build Coastguard Worker     gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, name);
988*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Binding framebuffer and attaching renderbuffer failed.");
989*35238bceSAndroid Build Coastguard Worker 
990*35238bceSAndroid Build Coastguard Worker     {
991*35238bceSAndroid Build Coastguard Worker         vector<uint8_t> texelBlock(format.getPixelSize());
992*35238bceSAndroid Build Coastguard Worker 
993*35238bceSAndroid Build Coastguard Worker         if (isFixedPointFormat(info.getFormat()))
994*35238bceSAndroid Build Coastguard Worker         {
995*35238bceSAndroid Build Coastguard Worker             // All zeroes is only bit pattern that fixed point values can be
996*35238bceSAndroid Build Coastguard Worker             // cleared to and that is valid floating point value.
997*35238bceSAndroid Build Coastguard Worker             if (isFloatFormat(moreRestrictiveFormat))
998*35238bceSAndroid Build Coastguard Worker                 deMemset(&texelBlock[0], 0x0, texelBlock.size());
999*35238bceSAndroid Build Coastguard Worker             else
1000*35238bceSAndroid Build Coastguard Worker             {
1001*35238bceSAndroid Build Coastguard Worker                 // Fixed point values can be only cleared to all 0 or 1.
1002*35238bceSAndroid Build Coastguard Worker                 const int32_t fill = rng.getBool() ? 0xFF : 0x0;
1003*35238bceSAndroid Build Coastguard Worker                 deMemset(&texelBlock[0], fill, texelBlock.size());
1004*35238bceSAndroid Build Coastguard Worker             }
1005*35238bceSAndroid Build Coastguard Worker         }
1006*35238bceSAndroid Build Coastguard Worker         else
1007*35238bceSAndroid Build Coastguard Worker             genTexel(rng, moreRestrictiveFormat, format.getPixelSize(), 1, &(texelBlock[0]));
1008*35238bceSAndroid Build Coastguard Worker 
1009*35238bceSAndroid Build Coastguard Worker         {
1010*35238bceSAndroid Build Coastguard Worker             const tcu::ConstPixelBufferAccess texelAccess(format, 1, 1, 1, &(texelBlock[0]));
1011*35238bceSAndroid Build Coastguard Worker 
1012*35238bceSAndroid Build Coastguard Worker             if (isIntFormat(info.getFormat()))
1013*35238bceSAndroid Build Coastguard Worker             {
1014*35238bceSAndroid Build Coastguard Worker                 const tcu::IVec4 color = texelAccess.getPixelInt(0, 0, 0);
1015*35238bceSAndroid Build Coastguard Worker 
1016*35238bceSAndroid Build Coastguard Worker                 gl.clearBufferiv(GL_COLOR, 0, (const int32_t *)&color);
1017*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer.");
1018*35238bceSAndroid Build Coastguard Worker 
1019*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(!tcu::isSRGB(format));
1020*35238bceSAndroid Build Coastguard Worker                 tcu::clear(refAccess, color);
1021*35238bceSAndroid Build Coastguard Worker             }
1022*35238bceSAndroid Build Coastguard Worker             else if (isUintFormat(info.getFormat()))
1023*35238bceSAndroid Build Coastguard Worker             {
1024*35238bceSAndroid Build Coastguard Worker                 const tcu::IVec4 color = texelAccess.getPixelInt(0, 0, 0);
1025*35238bceSAndroid Build Coastguard Worker 
1026*35238bceSAndroid Build Coastguard Worker                 gl.clearBufferuiv(GL_COLOR, 0, (const uint32_t *)&color);
1027*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer.");
1028*35238bceSAndroid Build Coastguard Worker 
1029*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(!tcu::isSRGB(format));
1030*35238bceSAndroid Build Coastguard Worker                 tcu::clear(refAccess, color);
1031*35238bceSAndroid Build Coastguard Worker             }
1032*35238bceSAndroid Build Coastguard Worker             else
1033*35238bceSAndroid Build Coastguard Worker             {
1034*35238bceSAndroid Build Coastguard Worker                 const tcu::Vec4 rawColor    = texelAccess.getPixel(0, 0, 0);
1035*35238bceSAndroid Build Coastguard Worker                 const tcu::Vec4 linearColor = (tcu::isSRGB(format) ? tcu::sRGBToLinear(rawColor) : rawColor);
1036*35238bceSAndroid Build Coastguard Worker 
1037*35238bceSAndroid Build Coastguard Worker                 // rawColor bit pattern has been chosen to be "safe" in the destination format. For sRGB
1038*35238bceSAndroid Build Coastguard Worker                 // formats, the clear color is in linear space. Since we want the resulting bit pattern
1039*35238bceSAndroid Build Coastguard Worker                 // to be safe after implementation linear->sRGB transform, we must apply the inverting
1040*35238bceSAndroid Build Coastguard Worker                 // transform to the clear color.
1041*35238bceSAndroid Build Coastguard Worker 
1042*35238bceSAndroid Build Coastguard Worker                 if (isFloatFormat(info.getFormat()))
1043*35238bceSAndroid Build Coastguard Worker                 {
1044*35238bceSAndroid Build Coastguard Worker                     gl.clearBufferfv(GL_COLOR, 0, (const float *)&linearColor);
1045*35238bceSAndroid Build Coastguard Worker                 }
1046*35238bceSAndroid Build Coastguard Worker                 else
1047*35238bceSAndroid Build Coastguard Worker                 {
1048*35238bceSAndroid Build Coastguard Worker                     // fixed-point
1049*35238bceSAndroid Build Coastguard Worker                     gl.clearColor(linearColor.x(), linearColor.y(), linearColor.z(), linearColor.w());
1050*35238bceSAndroid Build Coastguard Worker                     gl.clear(GL_COLOR_BUFFER_BIT);
1051*35238bceSAndroid Build Coastguard Worker                 }
1052*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer.");
1053*35238bceSAndroid Build Coastguard Worker 
1054*35238bceSAndroid Build Coastguard Worker                 tcu::clear(refAccess, rawColor);
1055*35238bceSAndroid Build Coastguard Worker             }
1056*35238bceSAndroid Build Coastguard Worker         }
1057*35238bceSAndroid Build Coastguard Worker     }
1058*35238bceSAndroid Build Coastguard Worker 
1059*35238bceSAndroid Build Coastguard Worker     gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
1060*35238bceSAndroid Build Coastguard Worker     gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
1061*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind renderbufer and framebuffer.");
1062*35238bceSAndroid Build Coastguard Worker }
1063*35238bceSAndroid Build Coastguard Worker 
genImage(const glw::Functions & gl,de::Random & rng,uint32_t name,vector<ArrayBuffer<uint8_t>> & levels,const ImageInfo & info,uint32_t moreRestrictiveFormat)1064*35238bceSAndroid Build Coastguard Worker void genImage(const glw::Functions &gl, de::Random &rng, uint32_t name, vector<ArrayBuffer<uint8_t>> &levels,
1065*35238bceSAndroid Build Coastguard Worker               const ImageInfo &info, uint32_t moreRestrictiveFormat)
1066*35238bceSAndroid Build Coastguard Worker {
1067*35238bceSAndroid Build Coastguard Worker     if (isTextureTarget(info.getTarget()))
1068*35238bceSAndroid Build Coastguard Worker         genTextureImage(gl, rng, name, levels, info, moreRestrictiveFormat);
1069*35238bceSAndroid Build Coastguard Worker     else
1070*35238bceSAndroid Build Coastguard Worker         genRenderbufferImage(gl, rng, name, levels, info, moreRestrictiveFormat);
1071*35238bceSAndroid Build Coastguard Worker }
1072*35238bceSAndroid Build Coastguard Worker 
getTexelBlockStride(const ImageInfo & info,int level)1073*35238bceSAndroid Build Coastguard Worker IVec3 getTexelBlockStride(const ImageInfo &info, int level)
1074*35238bceSAndroid Build Coastguard Worker {
1075*35238bceSAndroid Build Coastguard Worker     const IVec3 size                  = getLevelSize(info.getTarget(), info.getSize(), level);
1076*35238bceSAndroid Build Coastguard Worker     const int texelBlockSize          = getTexelBlockSize(info.getFormat());
1077*35238bceSAndroid Build Coastguard Worker     const IVec3 texelBlockPixelSize   = getTexelBlockPixelSize(info.getFormat());
1078*35238bceSAndroid Build Coastguard Worker     const IVec3 textureTexelBlockSize = divRoundUp(size, texelBlockPixelSize);
1079*35238bceSAndroid Build Coastguard Worker 
1080*35238bceSAndroid Build Coastguard Worker     return IVec3(texelBlockSize, textureTexelBlockSize.x() * texelBlockSize,
1081*35238bceSAndroid Build Coastguard Worker                  textureTexelBlockSize.x() * textureTexelBlockSize.y() * texelBlockSize);
1082*35238bceSAndroid Build Coastguard Worker }
1083*35238bceSAndroid Build Coastguard Worker 
sumComponents(const IVec3 & v)1084*35238bceSAndroid Build Coastguard Worker int sumComponents(const IVec3 &v)
1085*35238bceSAndroid Build Coastguard Worker {
1086*35238bceSAndroid Build Coastguard Worker     int s = 0;
1087*35238bceSAndroid Build Coastguard Worker 
1088*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++)
1089*35238bceSAndroid Build Coastguard Worker         s += v[i];
1090*35238bceSAndroid Build Coastguard Worker 
1091*35238bceSAndroid Build Coastguard Worker     return s;
1092*35238bceSAndroid Build Coastguard Worker }
1093*35238bceSAndroid Build Coastguard Worker 
copyImageData(vector<ArrayBuffer<uint8_t>> & dstImageData,const ImageInfo & dstImageInfo,int dstLevel,const IVec3 & dstPos,const vector<ArrayBuffer<uint8_t>> & srcImageData,const ImageInfo & srcImageInfo,int srcLevel,const IVec3 & srcPos,const IVec3 & copySize)1094*35238bceSAndroid Build Coastguard Worker void copyImageData(vector<ArrayBuffer<uint8_t>> &dstImageData, const ImageInfo &dstImageInfo, int dstLevel,
1095*35238bceSAndroid Build Coastguard Worker                    const IVec3 &dstPos,
1096*35238bceSAndroid Build Coastguard Worker 
1097*35238bceSAndroid Build Coastguard Worker                    const vector<ArrayBuffer<uint8_t>> &srcImageData, const ImageInfo &srcImageInfo, int srcLevel,
1098*35238bceSAndroid Build Coastguard Worker                    const IVec3 &srcPos,
1099*35238bceSAndroid Build Coastguard Worker 
1100*35238bceSAndroid Build Coastguard Worker                    const IVec3 &copySize)
1101*35238bceSAndroid Build Coastguard Worker {
1102*35238bceSAndroid Build Coastguard Worker     const ArrayBuffer<uint8_t> &srcLevelData = srcImageData[srcLevel];
1103*35238bceSAndroid Build Coastguard Worker     ArrayBuffer<uint8_t> &dstLevelData       = dstImageData[dstLevel];
1104*35238bceSAndroid Build Coastguard Worker 
1105*35238bceSAndroid Build Coastguard Worker     const IVec3 srcTexelBlockPixelSize = getTexelBlockPixelSize(srcImageInfo.getFormat());
1106*35238bceSAndroid Build Coastguard Worker     const int srcTexelBlockSize        = getTexelBlockSize(srcImageInfo.getFormat());
1107*35238bceSAndroid Build Coastguard Worker     const IVec3 srcTexelPos            = srcPos / srcTexelBlockPixelSize;
1108*35238bceSAndroid Build Coastguard Worker     const IVec3 srcTexelBlockStride    = getTexelBlockStride(srcImageInfo, srcLevel);
1109*35238bceSAndroid Build Coastguard Worker 
1110*35238bceSAndroid Build Coastguard Worker     const IVec3 dstTexelBlockPixelSize = getTexelBlockPixelSize(dstImageInfo.getFormat());
1111*35238bceSAndroid Build Coastguard Worker     const int dstTexelBlockSize        = getTexelBlockSize(dstImageInfo.getFormat());
1112*35238bceSAndroid Build Coastguard Worker     const IVec3 dstTexelPos            = dstPos / dstTexelBlockPixelSize;
1113*35238bceSAndroid Build Coastguard Worker     const IVec3 dstTexelBlockStride    = getTexelBlockStride(dstImageInfo, dstLevel);
1114*35238bceSAndroid Build Coastguard Worker 
1115*35238bceSAndroid Build Coastguard Worker     const IVec3 copyTexelBlockCount = copySize / srcTexelBlockPixelSize;
1116*35238bceSAndroid Build Coastguard Worker     const int texelBlockSize        = srcTexelBlockSize;
1117*35238bceSAndroid Build Coastguard Worker 
1118*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(srcTexelBlockSize == dstTexelBlockSize);
1119*35238bceSAndroid Build Coastguard Worker     DE_UNREF(dstTexelBlockSize);
1120*35238bceSAndroid Build Coastguard Worker 
1121*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((copySize.x() % srcTexelBlockPixelSize.x()) == 0);
1122*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((copySize.y() % srcTexelBlockPixelSize.y()) == 0);
1123*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((copySize.z() % srcTexelBlockPixelSize.z()) == 0);
1124*35238bceSAndroid Build Coastguard Worker 
1125*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((srcPos.x() % srcTexelBlockPixelSize.x()) == 0);
1126*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((srcPos.y() % srcTexelBlockPixelSize.y()) == 0);
1127*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((srcPos.z() % srcTexelBlockPixelSize.z()) == 0);
1128*35238bceSAndroid Build Coastguard Worker 
1129*35238bceSAndroid Build Coastguard Worker     for (int z = 0; z < copyTexelBlockCount.z(); z++)
1130*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < copyTexelBlockCount.y(); y++)
1131*35238bceSAndroid Build Coastguard Worker         {
1132*35238bceSAndroid Build Coastguard Worker             const IVec3 blockPos(0, y, z);
1133*35238bceSAndroid Build Coastguard Worker             const uint8_t *const srcPtr =
1134*35238bceSAndroid Build Coastguard Worker                 srcLevelData.getElementPtr(sumComponents((srcTexelPos + blockPos) * srcTexelBlockStride));
1135*35238bceSAndroid Build Coastguard Worker             uint8_t *const dstPtr =
1136*35238bceSAndroid Build Coastguard Worker                 dstLevelData.getElementPtr(sumComponents((dstTexelPos + blockPos) * dstTexelBlockStride));
1137*35238bceSAndroid Build Coastguard Worker             const int copyLineSize = copyTexelBlockCount.x() * texelBlockSize;
1138*35238bceSAndroid Build Coastguard Worker 
1139*35238bceSAndroid Build Coastguard Worker             deMemcpy(dstPtr, srcPtr, copyLineSize);
1140*35238bceSAndroid Build Coastguard Worker         }
1141*35238bceSAndroid Build Coastguard Worker }
1142*35238bceSAndroid Build Coastguard Worker 
getLevelAccesses(const vector<ArrayBuffer<uint8_t>> & data,const ImageInfo & info)1143*35238bceSAndroid Build Coastguard Worker vector<tcu::ConstPixelBufferAccess> getLevelAccesses(const vector<ArrayBuffer<uint8_t>> &data, const ImageInfo &info)
1144*35238bceSAndroid Build Coastguard Worker {
1145*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format = glu::mapGLInternalFormat(info.getFormat());
1146*35238bceSAndroid Build Coastguard Worker     const IVec3 size                = info.getSize();
1147*35238bceSAndroid Build Coastguard Worker 
1148*35238bceSAndroid Build Coastguard Worker     vector<tcu::ConstPixelBufferAccess> result;
1149*35238bceSAndroid Build Coastguard Worker 
1150*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((int)data.size() == getLevelCount(info));
1151*35238bceSAndroid Build Coastguard Worker 
1152*35238bceSAndroid Build Coastguard Worker     for (int level = 0; level < (int)data.size(); level++)
1153*35238bceSAndroid Build Coastguard Worker     {
1154*35238bceSAndroid Build Coastguard Worker         const IVec3 levelSize = getLevelSize(info.getTarget(), size, level);
1155*35238bceSAndroid Build Coastguard Worker 
1156*35238bceSAndroid Build Coastguard Worker         result.push_back(
1157*35238bceSAndroid Build Coastguard Worker             tcu::ConstPixelBufferAccess(format, levelSize.x(), levelSize.y(), levelSize.z(), data[level].getPtr()));
1158*35238bceSAndroid Build Coastguard Worker     }
1159*35238bceSAndroid Build Coastguard Worker 
1160*35238bceSAndroid Build Coastguard Worker     return result;
1161*35238bceSAndroid Build Coastguard Worker }
1162*35238bceSAndroid Build Coastguard Worker 
getCubeLevelAccesses(const vector<ArrayBuffer<uint8_t>> & data,const ImageInfo & info,int faceNdx)1163*35238bceSAndroid Build Coastguard Worker vector<tcu::ConstPixelBufferAccess> getCubeLevelAccesses(const vector<ArrayBuffer<uint8_t>> &data,
1164*35238bceSAndroid Build Coastguard Worker                                                          const ImageInfo &info, int faceNdx)
1165*35238bceSAndroid Build Coastguard Worker {
1166*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format = glu::mapGLInternalFormat(info.getFormat());
1167*35238bceSAndroid Build Coastguard Worker     const IVec3 size                = info.getSize();
1168*35238bceSAndroid Build Coastguard Worker     const int texelBlockSize        = getTexelBlockSize(info.getFormat());
1169*35238bceSAndroid Build Coastguard Worker     const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat());
1170*35238bceSAndroid Build Coastguard Worker     vector<tcu::ConstPixelBufferAccess> result;
1171*35238bceSAndroid Build Coastguard Worker 
1172*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(info.getTarget() == GL_TEXTURE_CUBE_MAP);
1173*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((int)data.size() == getLevelCount(info));
1174*35238bceSAndroid Build Coastguard Worker 
1175*35238bceSAndroid Build Coastguard Worker     for (int level = 0; level < (int)data.size(); level++)
1176*35238bceSAndroid Build Coastguard Worker     {
1177*35238bceSAndroid Build Coastguard Worker         const IVec3 levelPixelSize      = getLevelSize(info.getTarget(), size, level);
1178*35238bceSAndroid Build Coastguard Worker         const IVec3 levelTexelBlockSize = divRoundUp(levelPixelSize, texelBlockPixelSize);
1179*35238bceSAndroid Build Coastguard Worker         const int levelTexelBlockCount  = levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z();
1180*35238bceSAndroid Build Coastguard Worker         const int levelSize             = levelTexelBlockCount * texelBlockSize;
1181*35238bceSAndroid Build Coastguard Worker 
1182*35238bceSAndroid Build Coastguard Worker         result.push_back(tcu::ConstPixelBufferAccess(format, levelPixelSize.x(), levelPixelSize.y(), levelPixelSize.z(),
1183*35238bceSAndroid Build Coastguard Worker                                                      data[level].getElementPtr(levelSize * faceNdx)));
1184*35238bceSAndroid Build Coastguard Worker     }
1185*35238bceSAndroid Build Coastguard Worker 
1186*35238bceSAndroid Build Coastguard Worker     return result;
1187*35238bceSAndroid Build Coastguard Worker }
1188*35238bceSAndroid Build Coastguard Worker 
copyImage(const glw::Functions & gl,uint32_t dstName,vector<ArrayBuffer<uint8_t>> & dstImageData,const ImageInfo & dstImageInfo,int dstLevel,const IVec3 & dstPos,uint32_t srcName,const vector<ArrayBuffer<uint8_t>> & srcImageData,const ImageInfo & srcImageInfo,int srcLevel,const IVec3 & srcPos,const IVec3 & copySize)1189*35238bceSAndroid Build Coastguard Worker void copyImage(const glw::Functions &gl,
1190*35238bceSAndroid Build Coastguard Worker 
1191*35238bceSAndroid Build Coastguard Worker                uint32_t dstName, vector<ArrayBuffer<uint8_t>> &dstImageData, const ImageInfo &dstImageInfo,
1192*35238bceSAndroid Build Coastguard Worker                int dstLevel, const IVec3 &dstPos,
1193*35238bceSAndroid Build Coastguard Worker 
1194*35238bceSAndroid Build Coastguard Worker                uint32_t srcName, const vector<ArrayBuffer<uint8_t>> &srcImageData, const ImageInfo &srcImageInfo,
1195*35238bceSAndroid Build Coastguard Worker                int srcLevel, const IVec3 &srcPos,
1196*35238bceSAndroid Build Coastguard Worker 
1197*35238bceSAndroid Build Coastguard Worker                const IVec3 &copySize)
1198*35238bceSAndroid Build Coastguard Worker {
1199*35238bceSAndroid Build Coastguard Worker     gl.copyImageSubData(srcName, srcImageInfo.getTarget(), srcLevel, srcPos.x(), srcPos.y(), srcPos.z(), dstName,
1200*35238bceSAndroid Build Coastguard Worker                         dstImageInfo.getTarget(), dstLevel, dstPos.x(), dstPos.y(), dstPos.z(), copySize.x(),
1201*35238bceSAndroid Build Coastguard Worker                         copySize.y(), copySize.z());
1202*35238bceSAndroid Build Coastguard Worker 
1203*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glCopyImageSubData failed.");
1204*35238bceSAndroid Build Coastguard Worker 
1205*35238bceSAndroid Build Coastguard Worker     copyImageData(dstImageData, dstImageInfo, dstLevel, dstPos, srcImageData, srcImageInfo, srcLevel, srcPos, copySize);
1206*35238bceSAndroid Build Coastguard Worker }
1207*35238bceSAndroid Build Coastguard Worker 
1208*35238bceSAndroid Build Coastguard Worker template <class TextureView>
renderTexture(glu::RenderContext & renderContext,TextureRenderer & renderer,ReferenceParams & renderParams,tcu::ResultCollector & results,de::Random & rng,const TextureView & refTexture,const Verify verify,TextureImageIterator & imageIterator,tcu::TestLog & log)1209*35238bceSAndroid Build Coastguard Worker void renderTexture(glu::RenderContext &renderContext, TextureRenderer &renderer, ReferenceParams &renderParams,
1210*35238bceSAndroid Build Coastguard Worker                    tcu::ResultCollector &results, de::Random &rng, const TextureView &refTexture, const Verify verify,
1211*35238bceSAndroid Build Coastguard Worker                    TextureImageIterator &imageIterator, tcu::TestLog &log)
1212*35238bceSAndroid Build Coastguard Worker {
1213*35238bceSAndroid Build Coastguard Worker     const tcu::RenderTarget &renderTarget = renderContext.getRenderTarget();
1214*35238bceSAndroid Build Coastguard Worker     const tcu::RGBA threshold             = renderTarget.getPixelFormat().getColorThreshold() + tcu::RGBA(1, 1, 1, 1);
1215*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl              = renderContext.getFunctions();
1216*35238bceSAndroid Build Coastguard Worker     const IVec2 renderTargetSize          = IVec2(renderTarget.getWidth(), renderTarget.getHeight());
1217*35238bceSAndroid Build Coastguard Worker 
1218*35238bceSAndroid Build Coastguard Worker     while (imageIterator.hasNextImage())
1219*35238bceSAndroid Build Coastguard Worker     {
1220*35238bceSAndroid Build Coastguard Worker         // \note: Reserve space upfront to avoid assigning tcu::Surface, which incurs buffer mem copy. Using a
1221*35238bceSAndroid Build Coastguard Worker         // conservative estimate for simplicity
1222*35238bceSAndroid Build Coastguard Worker         const int imagesOnLevel = imageIterator.getLevelImageCount();
1223*35238bceSAndroid Build Coastguard Worker         const int imageEstimate = (imageIterator.getMipLevelCount() - imageIterator.getMipLevel()) * imagesOnLevel;
1224*35238bceSAndroid Build Coastguard Worker         RandomizedRenderGrid renderGrid(renderTargetSize, imageIterator.getSize(), imageEstimate, rng.getUint32());
1225*35238bceSAndroid Build Coastguard Worker         vector<CellContents> cellContents(renderGrid.getCellCount());
1226*35238bceSAndroid Build Coastguard Worker         int cellsUsed = 0;
1227*35238bceSAndroid Build Coastguard Worker 
1228*35238bceSAndroid Build Coastguard Worker         // \note: Ordering of conditions is significant. If put the other way around, the code would skip one of the
1229*35238bceSAndroid Build Coastguard Worker         // images if the grid runs out of cells before the texture runs out of images. Advancing one grid cell over the
1230*35238bceSAndroid Build Coastguard Worker         // needed number has no negative impact.
1231*35238bceSAndroid Build Coastguard Worker         while (renderGrid.nextCell() && imageIterator.nextImage())
1232*35238bceSAndroid Build Coastguard Worker         {
1233*35238bceSAndroid Build Coastguard Worker             const int level       = imageIterator.getMipLevel();
1234*35238bceSAndroid Build Coastguard Worker             const IVec2 levelSize = imageIterator.getSize();
1235*35238bceSAndroid Build Coastguard Worker             const IVec2 origin    = renderGrid.getOrigin();
1236*35238bceSAndroid Build Coastguard Worker             vector<float> texCoord;
1237*35238bceSAndroid Build Coastguard Worker 
1238*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(imageIterator.getTarget() != GL_TEXTURE_CUBE_MAP || levelSize.x() >= 4 || levelSize.y() >= 4);
1239*35238bceSAndroid Build Coastguard Worker 
1240*35238bceSAndroid Build Coastguard Worker             renderParams.baseLevel = level;
1241*35238bceSAndroid Build Coastguard Worker             renderParams.maxLevel  = level;
1242*35238bceSAndroid Build Coastguard Worker 
1243*35238bceSAndroid Build Coastguard Worker             gl.texParameteri(imageIterator.getTarget(), GL_TEXTURE_BASE_LEVEL, level);
1244*35238bceSAndroid Build Coastguard Worker             gl.texParameteri(imageIterator.getTarget(), GL_TEXTURE_MAX_LEVEL, level);
1245*35238bceSAndroid Build Coastguard Worker 
1246*35238bceSAndroid Build Coastguard Worker             computeQuadTexCoords(texCoord, imageIterator);
1247*35238bceSAndroid Build Coastguard Worker 
1248*35238bceSAndroid Build Coastguard Worker             // Setup base viewport.
1249*35238bceSAndroid Build Coastguard Worker             gl.viewport(origin.x(), origin.y(), levelSize.x(), levelSize.y());
1250*35238bceSAndroid Build Coastguard Worker 
1251*35238bceSAndroid Build Coastguard Worker             // Draw.
1252*35238bceSAndroid Build Coastguard Worker             renderer.renderQuad(0, &texCoord[0], renderParams);
1253*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render.");
1254*35238bceSAndroid Build Coastguard Worker 
1255*35238bceSAndroid Build Coastguard Worker             if (verify == VERIFY_COMPARE_REFERENCE)
1256*35238bceSAndroid Build Coastguard Worker             {
1257*35238bceSAndroid Build Coastguard Worker                 const int target     = imageIterator.getTarget();
1258*35238bceSAndroid Build Coastguard Worker                 const int imageIndex = imageIterator.getCurrentImage();
1259*35238bceSAndroid Build Coastguard Worker 
1260*35238bceSAndroid Build Coastguard Worker                 cellContents[cellsUsed].origin      = origin;
1261*35238bceSAndroid Build Coastguard Worker                 cellContents[cellsUsed].name        = getTextureImageName(target, level, imageIndex);
1262*35238bceSAndroid Build Coastguard Worker                 cellContents[cellsUsed].description = getTextureImageDescription(target, level, imageIndex);
1263*35238bceSAndroid Build Coastguard Worker 
1264*35238bceSAndroid Build Coastguard Worker                 cellContents[cellsUsed].reference.setSize(levelSize.x(), levelSize.y());
1265*35238bceSAndroid Build Coastguard Worker 
1266*35238bceSAndroid Build Coastguard Worker                 // Compute reference.
1267*35238bceSAndroid Build Coastguard Worker                 sampleTexture(tcu::SurfaceAccess(cellContents[cellsUsed].reference,
1268*35238bceSAndroid Build Coastguard Worker                                                  renderContext.getRenderTarget().getPixelFormat()),
1269*35238bceSAndroid Build Coastguard Worker                               refTexture, &texCoord[0], renderParams);
1270*35238bceSAndroid Build Coastguard Worker                 cellsUsed++;
1271*35238bceSAndroid Build Coastguard Worker             }
1272*35238bceSAndroid Build Coastguard Worker         }
1273*35238bceSAndroid Build Coastguard Worker 
1274*35238bceSAndroid Build Coastguard Worker         if (cellsUsed > 0)
1275*35238bceSAndroid Build Coastguard Worker         {
1276*35238bceSAndroid Build Coastguard Worker             const IVec4 boundingBox = renderGrid.getUsedAreaBoundingBox();
1277*35238bceSAndroid Build Coastguard Worker             tcu::Surface renderedFrame(boundingBox[2], boundingBox[3]);
1278*35238bceSAndroid Build Coastguard Worker 
1279*35238bceSAndroid Build Coastguard Worker             glu::readPixels(renderContext, boundingBox.x(), boundingBox.y(), renderedFrame.getAccess());
1280*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to read pixels.");
1281*35238bceSAndroid Build Coastguard Worker 
1282*35238bceSAndroid Build Coastguard Worker             for (int idx = 0; idx < cellsUsed; idx++)
1283*35238bceSAndroid Build Coastguard Worker             {
1284*35238bceSAndroid Build Coastguard Worker                 const CellContents &cell(cellContents[idx]);
1285*35238bceSAndroid Build Coastguard Worker                 const IVec2 cellOrigin = cell.origin - boundingBox.toWidth<2>();
1286*35238bceSAndroid Build Coastguard Worker                 const tcu::ConstPixelBufferAccess resultAccess =
1287*35238bceSAndroid Build Coastguard Worker                     getSubregion(renderedFrame.getAccess(), cellOrigin.x(), cellOrigin.y(), cell.reference.getWidth(),
1288*35238bceSAndroid Build Coastguard Worker                                  cell.reference.getHeight());
1289*35238bceSAndroid Build Coastguard Worker 
1290*35238bceSAndroid Build Coastguard Worker                 if (!intThresholdCompare(log, cell.name.c_str(), cell.description.c_str(), cell.reference.getAccess(),
1291*35238bceSAndroid Build Coastguard Worker                                          resultAccess, threshold.toIVec().cast<uint32_t>(), tcu::COMPARE_LOG_ON_ERROR))
1292*35238bceSAndroid Build Coastguard Worker                     results.fail("Image comparison of " + cell.description + " failed.");
1293*35238bceSAndroid Build Coastguard Worker                 else
1294*35238bceSAndroid Build Coastguard Worker                     log << TestLog::Message << "Image comparison of " << cell.description << " passed."
1295*35238bceSAndroid Build Coastguard Worker                         << TestLog::EndMessage;
1296*35238bceSAndroid Build Coastguard Worker             }
1297*35238bceSAndroid Build Coastguard Worker         }
1298*35238bceSAndroid Build Coastguard Worker     }
1299*35238bceSAndroid Build Coastguard Worker 
1300*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(imageIterator.getTarget(), GL_TEXTURE_BASE_LEVEL, 0);
1301*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(imageIterator.getTarget(), GL_TEXTURE_MAX_LEVEL, 1000);
1302*35238bceSAndroid Build Coastguard Worker }
1303*35238bceSAndroid Build Coastguard Worker 
renderTexture2DView(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & renderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const ImageInfo & info,const tcu::Texture2DView & refTexture,Verify verify)1304*35238bceSAndroid Build Coastguard Worker void renderTexture2DView(tcu::TestContext &testContext, glu::RenderContext &renderContext, TextureRenderer &renderer,
1305*35238bceSAndroid Build Coastguard Worker                          tcu::ResultCollector &results, de::Random &rng, uint32_t name, const ImageInfo &info,
1306*35238bceSAndroid Build Coastguard Worker                          const tcu::Texture2DView &refTexture, Verify verify)
1307*35238bceSAndroid Build Coastguard Worker {
1308*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log                 = testContext.getLog();
1309*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl          = renderContext.getFunctions();
1310*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format   = refTexture.getLevel(0).getFormat();
1311*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(format);
1312*35238bceSAndroid Build Coastguard Worker 
1313*35238bceSAndroid Build Coastguard Worker     ReferenceParams renderParams(TEXTURETYPE_2D);
1314*35238bceSAndroid Build Coastguard Worker     TextureImageIterator imageIterator(info, getLevelCount(info));
1315*35238bceSAndroid Build Coastguard Worker 
1316*35238bceSAndroid Build Coastguard Worker     renderParams.samplerType = getSamplerType(format);
1317*35238bceSAndroid Build Coastguard Worker     renderParams.sampler     = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE,
1318*35238bceSAndroid Build Coastguard Worker                                        Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST);
1319*35238bceSAndroid Build Coastguard Worker     renderParams.colorScale  = spec.lookupScale;
1320*35238bceSAndroid Build Coastguard Worker     renderParams.colorBias   = spec.lookupBias;
1321*35238bceSAndroid Build Coastguard Worker 
1322*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE0);
1323*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_2D, name);
1324*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture.");
1325*35238bceSAndroid Build Coastguard Worker 
1326*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1327*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1328*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1329*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1330*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state.");
1331*35238bceSAndroid Build Coastguard Worker 
1332*35238bceSAndroid Build Coastguard Worker     renderTexture<tcu::Texture2DView>(renderContext, renderer, renderParams, results, rng, refTexture, verify,
1333*35238bceSAndroid Build Coastguard Worker                                       imageIterator, log);
1334*35238bceSAndroid Build Coastguard Worker 
1335*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_2D, 0);
1336*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
1337*35238bceSAndroid Build Coastguard Worker }
1338*35238bceSAndroid Build Coastguard Worker 
decompressTextureLevel(const tcu::TexDecompressionParams & params,ArrayBuffer<uint8_t> & levelData,tcu::PixelBufferAccess & levelAccess,const tcu::CompressedTexFormat & compressedFormat,const tcu::TextureFormat & decompressedFormat,const IVec3 & levelPixelSize,const void * data)1339*35238bceSAndroid Build Coastguard Worker void decompressTextureLevel(const tcu::TexDecompressionParams &params, ArrayBuffer<uint8_t> &levelData,
1340*35238bceSAndroid Build Coastguard Worker                             tcu::PixelBufferAccess &levelAccess, const tcu::CompressedTexFormat &compressedFormat,
1341*35238bceSAndroid Build Coastguard Worker                             const tcu::TextureFormat &decompressedFormat, const IVec3 &levelPixelSize, const void *data)
1342*35238bceSAndroid Build Coastguard Worker {
1343*35238bceSAndroid Build Coastguard Worker     levelData.setStorage(levelPixelSize.x() * levelPixelSize.y() * levelPixelSize.z() *
1344*35238bceSAndroid Build Coastguard Worker                          decompressedFormat.getPixelSize());
1345*35238bceSAndroid Build Coastguard Worker     levelAccess = tcu::PixelBufferAccess(decompressedFormat, levelPixelSize.x(), levelPixelSize.y(), levelPixelSize.z(),
1346*35238bceSAndroid Build Coastguard Worker                                          levelData.getPtr());
1347*35238bceSAndroid Build Coastguard Worker 
1348*35238bceSAndroid Build Coastguard Worker     tcu::decompress(levelAccess, compressedFormat, (const uint8_t *)data, params);
1349*35238bceSAndroid Build Coastguard Worker }
1350*35238bceSAndroid Build Coastguard Worker 
decompressTexture(vector<ArrayBuffer<uint8_t>> & levelDatas,vector<tcu::PixelBufferAccess> & levelAccesses,glu::RenderContext & renderContext,const ImageInfo & info,const vector<ArrayBuffer<uint8_t>> & data)1351*35238bceSAndroid Build Coastguard Worker void decompressTexture(vector<ArrayBuffer<uint8_t>> &levelDatas, vector<tcu::PixelBufferAccess> &levelAccesses,
1352*35238bceSAndroid Build Coastguard Worker                        glu::RenderContext &renderContext, const ImageInfo &info,
1353*35238bceSAndroid Build Coastguard Worker                        const vector<ArrayBuffer<uint8_t>> &data)
1354*35238bceSAndroid Build Coastguard Worker {
1355*35238bceSAndroid Build Coastguard Worker     const tcu::CompressedTexFormat compressedFormat = glu::mapGLCompressedTexFormat(info.getFormat());
1356*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat decompressedFormat     = tcu::getUncompressedFormat(compressedFormat);
1357*35238bceSAndroid Build Coastguard Worker     const IVec3 size                                = info.getSize();
1358*35238bceSAndroid Build Coastguard Worker     const bool isES32 = glu::contextSupports(renderContext.getType(), glu::ApiType::es(3, 2));
1359*35238bceSAndroid Build Coastguard Worker 
1360*35238bceSAndroid Build Coastguard Worker     de::UniquePtr<glu::ContextInfo> ctxInfo(glu::ContextInfo::create(renderContext));
1361*35238bceSAndroid Build Coastguard Worker     tcu::TexDecompressionParams decompressParams;
1362*35238bceSAndroid Build Coastguard Worker 
1363*35238bceSAndroid Build Coastguard Worker     if (tcu::isAstcFormat(compressedFormat))
1364*35238bceSAndroid Build Coastguard Worker     {
1365*35238bceSAndroid Build Coastguard Worker         if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_hdr") &&
1366*35238bceSAndroid Build Coastguard Worker             !tcu::isAstcSRGBFormat(compressedFormat))
1367*35238bceSAndroid Build Coastguard Worker             decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_HDR);
1368*35238bceSAndroid Build Coastguard Worker         else if (isES32 || ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
1369*35238bceSAndroid Build Coastguard Worker             decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR);
1370*35238bceSAndroid Build Coastguard Worker         else
1371*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
1372*35238bceSAndroid Build Coastguard Worker     }
1373*35238bceSAndroid Build Coastguard Worker 
1374*35238bceSAndroid Build Coastguard Worker     levelDatas.resize(getLevelCount(info));
1375*35238bceSAndroid Build Coastguard Worker     levelAccesses.resize(getLevelCount(info));
1376*35238bceSAndroid Build Coastguard Worker 
1377*35238bceSAndroid Build Coastguard Worker     for (int level = 0; level < getLevelCount(info); level++)
1378*35238bceSAndroid Build Coastguard Worker     {
1379*35238bceSAndroid Build Coastguard Worker         const IVec3 levelPixelSize          = getLevelSize(info.getTarget(), size, level);
1380*35238bceSAndroid Build Coastguard Worker         de::ArrayBuffer<uint8_t> &levelData = levelDatas[level];
1381*35238bceSAndroid Build Coastguard Worker         tcu::PixelBufferAccess &levelAccess = levelAccesses[level];
1382*35238bceSAndroid Build Coastguard Worker 
1383*35238bceSAndroid Build Coastguard Worker         decompressTextureLevel(decompressParams, levelData, levelAccess, compressedFormat, decompressedFormat,
1384*35238bceSAndroid Build Coastguard Worker                                levelPixelSize, data[level].getPtr());
1385*35238bceSAndroid Build Coastguard Worker     }
1386*35238bceSAndroid Build Coastguard Worker }
1387*35238bceSAndroid Build Coastguard Worker 
renderTexture2D(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & textureRenderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const vector<ArrayBuffer<uint8_t>> & data,const ImageInfo & info,Verify verify)1388*35238bceSAndroid Build Coastguard Worker void renderTexture2D(tcu::TestContext &testContext, glu::RenderContext &renderContext, TextureRenderer &textureRenderer,
1389*35238bceSAndroid Build Coastguard Worker                      tcu::ResultCollector &results, de::Random &rng, uint32_t name,
1390*35238bceSAndroid Build Coastguard Worker                      const vector<ArrayBuffer<uint8_t>> &data, const ImageInfo &info, Verify verify)
1391*35238bceSAndroid Build Coastguard Worker {
1392*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(info.getFormat()))
1393*35238bceSAndroid Build Coastguard Worker     {
1394*35238bceSAndroid Build Coastguard Worker         vector<de::ArrayBuffer<uint8_t>> levelDatas;
1395*35238bceSAndroid Build Coastguard Worker         vector<tcu::PixelBufferAccess> levelAccesses;
1396*35238bceSAndroid Build Coastguard Worker 
1397*35238bceSAndroid Build Coastguard Worker         decompressTexture(levelDatas, levelAccesses, renderContext, info, data);
1398*35238bceSAndroid Build Coastguard Worker 
1399*35238bceSAndroid Build Coastguard Worker         {
1400*35238bceSAndroid Build Coastguard Worker             const tcu::Texture2DView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1401*35238bceSAndroid Build Coastguard Worker 
1402*35238bceSAndroid Build Coastguard Worker             renderTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture,
1403*35238bceSAndroid Build Coastguard Worker                                 verify);
1404*35238bceSAndroid Build Coastguard Worker         }
1405*35238bceSAndroid Build Coastguard Worker     }
1406*35238bceSAndroid Build Coastguard Worker     else
1407*35238bceSAndroid Build Coastguard Worker     {
1408*35238bceSAndroid Build Coastguard Worker         const vector<tcu::ConstPixelBufferAccess> levelAccesses = getLevelAccesses(data, info);
1409*35238bceSAndroid Build Coastguard Worker         const tcu::Texture2DView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1410*35238bceSAndroid Build Coastguard Worker 
1411*35238bceSAndroid Build Coastguard Worker         renderTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
1412*35238bceSAndroid Build Coastguard Worker     }
1413*35238bceSAndroid Build Coastguard Worker }
1414*35238bceSAndroid Build Coastguard Worker 
renderTexture3DView(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & renderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const ImageInfo & info,const tcu::Texture3DView & refTexture,Verify verify)1415*35238bceSAndroid Build Coastguard Worker void renderTexture3DView(tcu::TestContext &testContext, glu::RenderContext &renderContext, TextureRenderer &renderer,
1416*35238bceSAndroid Build Coastguard Worker                          tcu::ResultCollector &results, de::Random &rng, uint32_t name, const ImageInfo &info,
1417*35238bceSAndroid Build Coastguard Worker                          const tcu::Texture3DView &refTexture, Verify verify)
1418*35238bceSAndroid Build Coastguard Worker {
1419*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log                 = testContext.getLog();
1420*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl          = renderContext.getFunctions();
1421*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format   = refTexture.getLevel(0).getFormat();
1422*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(format);
1423*35238bceSAndroid Build Coastguard Worker 
1424*35238bceSAndroid Build Coastguard Worker     ReferenceParams renderParams(TEXTURETYPE_3D);
1425*35238bceSAndroid Build Coastguard Worker     TextureImageIterator imageIterator(info, getLevelCount(info));
1426*35238bceSAndroid Build Coastguard Worker 
1427*35238bceSAndroid Build Coastguard Worker     renderParams.samplerType = getSamplerType(format);
1428*35238bceSAndroid Build Coastguard Worker     renderParams.sampler     = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE,
1429*35238bceSAndroid Build Coastguard Worker                                        Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST);
1430*35238bceSAndroid Build Coastguard Worker     renderParams.colorScale  = spec.lookupScale;
1431*35238bceSAndroid Build Coastguard Worker     renderParams.colorBias   = spec.lookupBias;
1432*35238bceSAndroid Build Coastguard Worker 
1433*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE0);
1434*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_3D, name);
1435*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture.");
1436*35238bceSAndroid Build Coastguard Worker 
1437*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1438*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1439*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1440*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1441*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1442*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state.");
1443*35238bceSAndroid Build Coastguard Worker 
1444*35238bceSAndroid Build Coastguard Worker     renderTexture<tcu::Texture3DView>(renderContext, renderer, renderParams, results, rng, refTexture, verify,
1445*35238bceSAndroid Build Coastguard Worker                                       imageIterator, log);
1446*35238bceSAndroid Build Coastguard Worker 
1447*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_3D, 0);
1448*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
1449*35238bceSAndroid Build Coastguard Worker }
1450*35238bceSAndroid Build Coastguard Worker 
renderTexture3D(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & textureRenderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const vector<ArrayBuffer<uint8_t>> & data,const ImageInfo & info,Verify verify)1451*35238bceSAndroid Build Coastguard Worker void renderTexture3D(tcu::TestContext &testContext, glu::RenderContext &renderContext, TextureRenderer &textureRenderer,
1452*35238bceSAndroid Build Coastguard Worker                      tcu::ResultCollector &results, de::Random &rng, uint32_t name,
1453*35238bceSAndroid Build Coastguard Worker                      const vector<ArrayBuffer<uint8_t>> &data, const ImageInfo &info, Verify verify)
1454*35238bceSAndroid Build Coastguard Worker {
1455*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(info.getFormat()))
1456*35238bceSAndroid Build Coastguard Worker     {
1457*35238bceSAndroid Build Coastguard Worker         vector<de::ArrayBuffer<uint8_t>> levelDatas;
1458*35238bceSAndroid Build Coastguard Worker         vector<tcu::PixelBufferAccess> levelAccesses;
1459*35238bceSAndroid Build Coastguard Worker 
1460*35238bceSAndroid Build Coastguard Worker         decompressTexture(levelDatas, levelAccesses, renderContext, info, data);
1461*35238bceSAndroid Build Coastguard Worker 
1462*35238bceSAndroid Build Coastguard Worker         {
1463*35238bceSAndroid Build Coastguard Worker             const tcu::Texture3DView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1464*35238bceSAndroid Build Coastguard Worker 
1465*35238bceSAndroid Build Coastguard Worker             renderTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture,
1466*35238bceSAndroid Build Coastguard Worker                                 verify);
1467*35238bceSAndroid Build Coastguard Worker         }
1468*35238bceSAndroid Build Coastguard Worker     }
1469*35238bceSAndroid Build Coastguard Worker     else
1470*35238bceSAndroid Build Coastguard Worker     {
1471*35238bceSAndroid Build Coastguard Worker         const vector<tcu::ConstPixelBufferAccess> levelAccesses = getLevelAccesses(data, info);
1472*35238bceSAndroid Build Coastguard Worker         const tcu::Texture3DView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1473*35238bceSAndroid Build Coastguard Worker 
1474*35238bceSAndroid Build Coastguard Worker         renderTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
1475*35238bceSAndroid Build Coastguard Worker     }
1476*35238bceSAndroid Build Coastguard Worker }
1477*35238bceSAndroid Build Coastguard Worker 
renderTextureCubemapView(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & renderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const ImageInfo & info,const tcu::TextureCubeView & refTexture,Verify verify)1478*35238bceSAndroid Build Coastguard Worker void renderTextureCubemapView(tcu::TestContext &testContext, glu::RenderContext &renderContext,
1479*35238bceSAndroid Build Coastguard Worker                               TextureRenderer &renderer, tcu::ResultCollector &results, de::Random &rng, uint32_t name,
1480*35238bceSAndroid Build Coastguard Worker                               const ImageInfo &info, const tcu::TextureCubeView &refTexture, Verify verify)
1481*35238bceSAndroid Build Coastguard Worker {
1482*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log                 = testContext.getLog();
1483*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl          = renderContext.getFunctions();
1484*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format   = refTexture.getLevelFace(0, tcu::CUBEFACE_POSITIVE_X).getFormat();
1485*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(format);
1486*35238bceSAndroid Build Coastguard Worker 
1487*35238bceSAndroid Build Coastguard Worker     ReferenceParams renderParams(TEXTURETYPE_CUBE);
1488*35238bceSAndroid Build Coastguard Worker     // \note It seems we can't reliably sample two smallest texture levels with cubemaps
1489*35238bceSAndroid Build Coastguard Worker     TextureImageIterator imageIterator(info, getLevelCount(info) - 2);
1490*35238bceSAndroid Build Coastguard Worker 
1491*35238bceSAndroid Build Coastguard Worker     renderParams.samplerType = getSamplerType(format);
1492*35238bceSAndroid Build Coastguard Worker     renderParams.sampler     = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE,
1493*35238bceSAndroid Build Coastguard Worker                                        Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST);
1494*35238bceSAndroid Build Coastguard Worker     renderParams.colorScale  = spec.lookupScale;
1495*35238bceSAndroid Build Coastguard Worker     renderParams.colorBias   = spec.lookupBias;
1496*35238bceSAndroid Build Coastguard Worker 
1497*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE0);
1498*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_CUBE_MAP, name);
1499*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture.");
1500*35238bceSAndroid Build Coastguard Worker 
1501*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1502*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1503*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1504*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1505*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state.");
1506*35238bceSAndroid Build Coastguard Worker 
1507*35238bceSAndroid Build Coastguard Worker     renderTexture<tcu::TextureCubeView>(renderContext, renderer, renderParams, results, rng, refTexture, verify,
1508*35238bceSAndroid Build Coastguard Worker                                         imageIterator, log);
1509*35238bceSAndroid Build Coastguard Worker 
1510*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_CUBE_MAP, 0);
1511*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
1512*35238bceSAndroid Build Coastguard Worker }
1513*35238bceSAndroid Build Coastguard Worker 
renderTextureCubemap(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & textureRenderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const vector<ArrayBuffer<uint8_t>> & data,const ImageInfo & info,Verify verify)1514*35238bceSAndroid Build Coastguard Worker void renderTextureCubemap(tcu::TestContext &testContext, glu::RenderContext &renderContext,
1515*35238bceSAndroid Build Coastguard Worker                           TextureRenderer &textureRenderer, tcu::ResultCollector &results, de::Random &rng,
1516*35238bceSAndroid Build Coastguard Worker                           uint32_t name, const vector<ArrayBuffer<uint8_t>> &data, const ImageInfo &info, Verify verify)
1517*35238bceSAndroid Build Coastguard Worker {
1518*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(info.getFormat()))
1519*35238bceSAndroid Build Coastguard Worker     {
1520*35238bceSAndroid Build Coastguard Worker         const tcu::CompressedTexFormat &compressedFormat = glu::mapGLCompressedTexFormat(info.getFormat());
1521*35238bceSAndroid Build Coastguard Worker         const tcu::TextureFormat &decompressedFormat     = tcu::getUncompressedFormat(compressedFormat);
1522*35238bceSAndroid Build Coastguard Worker 
1523*35238bceSAndroid Build Coastguard Worker         const int texelBlockSize        = getTexelBlockSize(info.getFormat());
1524*35238bceSAndroid Build Coastguard Worker         const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat());
1525*35238bceSAndroid Build Coastguard Worker 
1526*35238bceSAndroid Build Coastguard Worker         const bool isES32 = glu::contextSupports(renderContext.getType(), glu::ApiType::es(3, 2));
1527*35238bceSAndroid Build Coastguard Worker 
1528*35238bceSAndroid Build Coastguard Worker         vector<tcu::PixelBufferAccess> levelAccesses[6];
1529*35238bceSAndroid Build Coastguard Worker         vector<ArrayBuffer<uint8_t>> levelDatas[6];
1530*35238bceSAndroid Build Coastguard Worker         de::UniquePtr<glu::ContextInfo> ctxInfo(glu::ContextInfo::create(renderContext));
1531*35238bceSAndroid Build Coastguard Worker         tcu::TexDecompressionParams decompressParams;
1532*35238bceSAndroid Build Coastguard Worker 
1533*35238bceSAndroid Build Coastguard Worker         if (tcu::isAstcFormat(compressedFormat))
1534*35238bceSAndroid Build Coastguard Worker         {
1535*35238bceSAndroid Build Coastguard Worker             if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_hdr") &&
1536*35238bceSAndroid Build Coastguard Worker                 !tcu::isAstcSRGBFormat(compressedFormat))
1537*35238bceSAndroid Build Coastguard Worker                 decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_HDR);
1538*35238bceSAndroid Build Coastguard Worker             else if (isES32 || ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
1539*35238bceSAndroid Build Coastguard Worker                 decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR);
1540*35238bceSAndroid Build Coastguard Worker             else
1541*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1542*35238bceSAndroid Build Coastguard Worker         }
1543*35238bceSAndroid Build Coastguard Worker 
1544*35238bceSAndroid Build Coastguard Worker         for (int faceNdx = 0; faceNdx < 6; faceNdx++)
1545*35238bceSAndroid Build Coastguard Worker         {
1546*35238bceSAndroid Build Coastguard Worker             levelAccesses[faceNdx].resize(getLevelCount(info));
1547*35238bceSAndroid Build Coastguard Worker             levelDatas[faceNdx].resize(getLevelCount(info));
1548*35238bceSAndroid Build Coastguard Worker         }
1549*35238bceSAndroid Build Coastguard Worker 
1550*35238bceSAndroid Build Coastguard Worker         for (int level = 0; level < getLevelCount(info); level++)
1551*35238bceSAndroid Build Coastguard Worker         {
1552*35238bceSAndroid Build Coastguard Worker             for (int faceNdx = 0; faceNdx < 6; faceNdx++)
1553*35238bceSAndroid Build Coastguard Worker             {
1554*35238bceSAndroid Build Coastguard Worker                 const IVec3 levelPixelSize      = getLevelSize(info.getTarget(), info.getSize(), level);
1555*35238bceSAndroid Build Coastguard Worker                 const IVec3 levelTexelBlockSize = divRoundUp(levelPixelSize, texelBlockPixelSize);
1556*35238bceSAndroid Build Coastguard Worker                 const int levelTexelBlockCount =
1557*35238bceSAndroid Build Coastguard Worker                     levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z();
1558*35238bceSAndroid Build Coastguard Worker                 const int levelSize = levelTexelBlockCount * texelBlockSize;
1559*35238bceSAndroid Build Coastguard Worker 
1560*35238bceSAndroid Build Coastguard Worker                 const uint8_t *dataPtr              = data[level].getElementPtr(faceNdx * levelSize);
1561*35238bceSAndroid Build Coastguard Worker                 tcu::PixelBufferAccess &levelAccess = levelAccesses[faceNdx][level];
1562*35238bceSAndroid Build Coastguard Worker                 ArrayBuffer<uint8_t> &levelData     = levelDatas[faceNdx][level];
1563*35238bceSAndroid Build Coastguard Worker 
1564*35238bceSAndroid Build Coastguard Worker                 decompressTextureLevel(decompressParams, levelData, levelAccess, compressedFormat, decompressedFormat,
1565*35238bceSAndroid Build Coastguard Worker                                        levelPixelSize, dataPtr);
1566*35238bceSAndroid Build Coastguard Worker             }
1567*35238bceSAndroid Build Coastguard Worker         }
1568*35238bceSAndroid Build Coastguard Worker 
1569*35238bceSAndroid Build Coastguard Worker         const tcu::ConstPixelBufferAccess *levels[6];
1570*35238bceSAndroid Build Coastguard Worker 
1571*35238bceSAndroid Build Coastguard Worker         for (int faceNdx = 0; faceNdx < 6; faceNdx++)
1572*35238bceSAndroid Build Coastguard Worker             levels[glu::getCubeFaceFromGL(mapFaceNdxToFace(faceNdx))] = &(levelAccesses[faceNdx][0]);
1573*35238bceSAndroid Build Coastguard Worker 
1574*35238bceSAndroid Build Coastguard Worker         {
1575*35238bceSAndroid Build Coastguard Worker             const tcu::TextureCubeView refTexture(getLevelCount(info), levels);
1576*35238bceSAndroid Build Coastguard Worker 
1577*35238bceSAndroid Build Coastguard Worker             renderTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture,
1578*35238bceSAndroid Build Coastguard Worker                                      verify);
1579*35238bceSAndroid Build Coastguard Worker         }
1580*35238bceSAndroid Build Coastguard Worker     }
1581*35238bceSAndroid Build Coastguard Worker     else
1582*35238bceSAndroid Build Coastguard Worker     {
1583*35238bceSAndroid Build Coastguard Worker         const vector<tcu::ConstPixelBufferAccess> levelAccesses[6] = {
1584*35238bceSAndroid Build Coastguard Worker             getCubeLevelAccesses(data, info, 0), getCubeLevelAccesses(data, info, 1),
1585*35238bceSAndroid Build Coastguard Worker             getCubeLevelAccesses(data, info, 2), getCubeLevelAccesses(data, info, 3),
1586*35238bceSAndroid Build Coastguard Worker             getCubeLevelAccesses(data, info, 4), getCubeLevelAccesses(data, info, 5),
1587*35238bceSAndroid Build Coastguard Worker         };
1588*35238bceSAndroid Build Coastguard Worker 
1589*35238bceSAndroid Build Coastguard Worker         const tcu::ConstPixelBufferAccess *levels[6];
1590*35238bceSAndroid Build Coastguard Worker 
1591*35238bceSAndroid Build Coastguard Worker         for (int faceNdx = 0; faceNdx < 6; faceNdx++)
1592*35238bceSAndroid Build Coastguard Worker             levels[glu::getCubeFaceFromGL(mapFaceNdxToFace(faceNdx))] = &(levelAccesses[faceNdx][0]);
1593*35238bceSAndroid Build Coastguard Worker 
1594*35238bceSAndroid Build Coastguard Worker         {
1595*35238bceSAndroid Build Coastguard Worker             const tcu::TextureCubeView refTexture(getLevelCount(info), levels);
1596*35238bceSAndroid Build Coastguard Worker 
1597*35238bceSAndroid Build Coastguard Worker             renderTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture,
1598*35238bceSAndroid Build Coastguard Worker                                      verify);
1599*35238bceSAndroid Build Coastguard Worker         }
1600*35238bceSAndroid Build Coastguard Worker     }
1601*35238bceSAndroid Build Coastguard Worker }
1602*35238bceSAndroid Build Coastguard Worker 
renderTexture2DArrayView(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & renderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const ImageInfo & info,const tcu::Texture2DArrayView & refTexture,Verify verify)1603*35238bceSAndroid Build Coastguard Worker void renderTexture2DArrayView(tcu::TestContext &testContext, glu::RenderContext &renderContext,
1604*35238bceSAndroid Build Coastguard Worker                               TextureRenderer &renderer, tcu::ResultCollector &results, de::Random &rng, uint32_t name,
1605*35238bceSAndroid Build Coastguard Worker                               const ImageInfo &info, const tcu::Texture2DArrayView &refTexture, Verify verify)
1606*35238bceSAndroid Build Coastguard Worker {
1607*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log                 = testContext.getLog();
1608*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl          = renderContext.getFunctions();
1609*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format   = refTexture.getLevel(0).getFormat();
1610*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(format);
1611*35238bceSAndroid Build Coastguard Worker 
1612*35238bceSAndroid Build Coastguard Worker     ReferenceParams renderParams(TEXTURETYPE_2D_ARRAY);
1613*35238bceSAndroid Build Coastguard Worker     TextureImageIterator imageIterator(info, getLevelCount(info));
1614*35238bceSAndroid Build Coastguard Worker 
1615*35238bceSAndroid Build Coastguard Worker     renderParams.samplerType = getSamplerType(format);
1616*35238bceSAndroid Build Coastguard Worker     renderParams.sampler     = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE,
1617*35238bceSAndroid Build Coastguard Worker                                        Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST);
1618*35238bceSAndroid Build Coastguard Worker     renderParams.colorScale  = spec.lookupScale;
1619*35238bceSAndroid Build Coastguard Worker     renderParams.colorBias   = spec.lookupBias;
1620*35238bceSAndroid Build Coastguard Worker 
1621*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE0);
1622*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_2D_ARRAY, name);
1623*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture.");
1624*35238bceSAndroid Build Coastguard Worker 
1625*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1626*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1627*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1628*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1629*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state.");
1630*35238bceSAndroid Build Coastguard Worker 
1631*35238bceSAndroid Build Coastguard Worker     renderTexture<tcu::Texture2DArrayView>(renderContext, renderer, renderParams, results, rng, refTexture, verify,
1632*35238bceSAndroid Build Coastguard Worker                                            imageIterator, log);
1633*35238bceSAndroid Build Coastguard Worker 
1634*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_2D_ARRAY, 0);
1635*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
1636*35238bceSAndroid Build Coastguard Worker }
1637*35238bceSAndroid Build Coastguard Worker 
renderTexture2DArray(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & textureRenderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const vector<ArrayBuffer<uint8_t>> & data,const ImageInfo & info,Verify verify)1638*35238bceSAndroid Build Coastguard Worker void renderTexture2DArray(tcu::TestContext &testContext, glu::RenderContext &renderContext,
1639*35238bceSAndroid Build Coastguard Worker                           TextureRenderer &textureRenderer, tcu::ResultCollector &results, de::Random &rng,
1640*35238bceSAndroid Build Coastguard Worker                           uint32_t name, const vector<ArrayBuffer<uint8_t>> &data, const ImageInfo &info, Verify verify)
1641*35238bceSAndroid Build Coastguard Worker {
1642*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(info.getFormat()))
1643*35238bceSAndroid Build Coastguard Worker     {
1644*35238bceSAndroid Build Coastguard Worker         vector<de::ArrayBuffer<uint8_t>> levelDatas;
1645*35238bceSAndroid Build Coastguard Worker         vector<tcu::PixelBufferAccess> levelAccesses;
1646*35238bceSAndroid Build Coastguard Worker 
1647*35238bceSAndroid Build Coastguard Worker         decompressTexture(levelDatas, levelAccesses, renderContext, info, data);
1648*35238bceSAndroid Build Coastguard Worker 
1649*35238bceSAndroid Build Coastguard Worker         {
1650*35238bceSAndroid Build Coastguard Worker             const tcu::Texture2DArrayView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1651*35238bceSAndroid Build Coastguard Worker 
1652*35238bceSAndroid Build Coastguard Worker             renderTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture,
1653*35238bceSAndroid Build Coastguard Worker                                      verify);
1654*35238bceSAndroid Build Coastguard Worker         }
1655*35238bceSAndroid Build Coastguard Worker     }
1656*35238bceSAndroid Build Coastguard Worker     else
1657*35238bceSAndroid Build Coastguard Worker     {
1658*35238bceSAndroid Build Coastguard Worker         const vector<tcu::ConstPixelBufferAccess> levelAccesses = getLevelAccesses(data, info);
1659*35238bceSAndroid Build Coastguard Worker         const tcu::Texture2DArrayView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1660*35238bceSAndroid Build Coastguard Worker 
1661*35238bceSAndroid Build Coastguard Worker         renderTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture,
1662*35238bceSAndroid Build Coastguard Worker                                  verify);
1663*35238bceSAndroid Build Coastguard Worker     }
1664*35238bceSAndroid Build Coastguard Worker }
1665*35238bceSAndroid Build Coastguard Worker 
getReadPixelFormat(const tcu::TextureFormat & format)1666*35238bceSAndroid Build Coastguard Worker tcu::TextureFormat getReadPixelFormat(const tcu::TextureFormat &format)
1667*35238bceSAndroid Build Coastguard Worker {
1668*35238bceSAndroid Build Coastguard Worker     switch (tcu::getTextureChannelClass(format.type))
1669*35238bceSAndroid Build Coastguard Worker     {
1670*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1671*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1672*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1673*35238bceSAndroid Build Coastguard Worker         return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
1674*35238bceSAndroid Build Coastguard Worker 
1675*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1676*35238bceSAndroid Build Coastguard Worker         return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32);
1677*35238bceSAndroid Build Coastguard Worker 
1678*35238bceSAndroid Build Coastguard Worker     case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1679*35238bceSAndroid Build Coastguard Worker         return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32);
1680*35238bceSAndroid Build Coastguard Worker 
1681*35238bceSAndroid Build Coastguard Worker     default:
1682*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1683*35238bceSAndroid Build Coastguard Worker         return tcu::TextureFormat();
1684*35238bceSAndroid Build Coastguard Worker     }
1685*35238bceSAndroid Build Coastguard Worker }
1686*35238bceSAndroid Build Coastguard Worker 
calculateThreshold(const tcu::TextureFormat & sourceFormat,const tcu::TextureFormat & readPixelsFormat)1687*35238bceSAndroid Build Coastguard Worker Vec4 calculateThreshold(const tcu::TextureFormat &sourceFormat, const tcu::TextureFormat &readPixelsFormat)
1688*35238bceSAndroid Build Coastguard Worker {
1689*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_FLOATING_POINT);
1690*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_FLOATING_POINT);
1691*35238bceSAndroid Build Coastguard Worker 
1692*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER);
1693*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER);
1694*35238bceSAndroid Build Coastguard Worker 
1695*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER);
1696*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER);
1697*35238bceSAndroid Build Coastguard Worker 
1698*35238bceSAndroid Build Coastguard Worker     {
1699*35238bceSAndroid Build Coastguard Worker         const tcu::IVec4 srcBits  = tcu::getTextureFormatBitDepth(sourceFormat);
1700*35238bceSAndroid Build Coastguard Worker         const tcu::IVec4 readBits = tcu::getTextureFormatBitDepth(readPixelsFormat);
1701*35238bceSAndroid Build Coastguard Worker         const tcu::IVec4 minBits  = tcu::min(srcBits, readBits);
1702*35238bceSAndroid Build Coastguard Worker 
1703*35238bceSAndroid Build Coastguard Worker         return Vec4(minBits[0] ? 1.0f / (float)((1 << minBits[0]) - 1) : 0,
1704*35238bceSAndroid Build Coastguard Worker                     minBits[1] ? 1.0f / (float)((1 << minBits[1]) - 1) : 0,
1705*35238bceSAndroid Build Coastguard Worker                     minBits[2] ? 1.0f / (float)((1 << minBits[2]) - 1) : 0,
1706*35238bceSAndroid Build Coastguard Worker                     minBits[3] ? 1.0f / (float)((1 << minBits[3]) - 1) : 0);
1707*35238bceSAndroid Build Coastguard Worker     }
1708*35238bceSAndroid Build Coastguard Worker }
1709*35238bceSAndroid Build Coastguard Worker 
renderRenderbuffer(tcu::TestContext & testContext,glu::RenderContext & renderContext,tcu::ResultCollector & results,uint32_t name,const vector<ArrayBuffer<uint8_t>> & data,const ImageInfo & info,Verify verify)1710*35238bceSAndroid Build Coastguard Worker void renderRenderbuffer(tcu::TestContext &testContext, glu::RenderContext &renderContext, tcu::ResultCollector &results,
1711*35238bceSAndroid Build Coastguard Worker                         uint32_t name, const vector<ArrayBuffer<uint8_t>> &data, const ImageInfo &info, Verify verify)
1712*35238bceSAndroid Build Coastguard Worker {
1713*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = renderContext.getFunctions();
1714*35238bceSAndroid Build Coastguard Worker     TestLog &log             = testContext.getLog();
1715*35238bceSAndroid Build Coastguard Worker 
1716*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format = glu::mapGLInternalFormat(info.getFormat());
1717*35238bceSAndroid Build Coastguard Worker     const IVec3 size                = info.getSize();
1718*35238bceSAndroid Build Coastguard Worker     const tcu::ConstPixelBufferAccess refRenderbuffer(format, size.x(), size.y(), 1, data[0].getPtr());
1719*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat readPixelsFormat = getReadPixelFormat(format);
1720*35238bceSAndroid Build Coastguard Worker     tcu::TextureLevel renderbuffer(readPixelsFormat, size.x(), size.y());
1721*35238bceSAndroid Build Coastguard Worker 
1722*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(size.z() == 1);
1723*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(data.size() == 1);
1724*35238bceSAndroid Build Coastguard Worker 
1725*35238bceSAndroid Build Coastguard Worker     {
1726*35238bceSAndroid Build Coastguard Worker         glu::Framebuffer framebuffer(gl);
1727*35238bceSAndroid Build Coastguard Worker 
1728*35238bceSAndroid Build Coastguard Worker         gl.bindFramebuffer(GL_FRAMEBUFFER, *framebuffer);
1729*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create and bind framebuffer.");
1730*35238bceSAndroid Build Coastguard Worker 
1731*35238bceSAndroid Build Coastguard Worker         gl.bindRenderbuffer(GL_RENDERBUFFER, name);
1732*35238bceSAndroid Build Coastguard Worker         gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, name);
1733*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind and attach renderbuffer to framebuffer.");
1734*35238bceSAndroid Build Coastguard Worker 
1735*35238bceSAndroid Build Coastguard Worker         if (verify)
1736*35238bceSAndroid Build Coastguard Worker             glu::readPixels(renderContext, 0, 0, renderbuffer.getAccess());
1737*35238bceSAndroid Build Coastguard Worker 
1738*35238bceSAndroid Build Coastguard Worker         gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
1739*35238bceSAndroid Build Coastguard Worker         gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
1740*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind renderbuffer and framebuffer.");
1741*35238bceSAndroid Build Coastguard Worker     }
1742*35238bceSAndroid Build Coastguard Worker 
1743*35238bceSAndroid Build Coastguard Worker     if (verify == VERIFY_COMPARE_REFERENCE)
1744*35238bceSAndroid Build Coastguard Worker     {
1745*35238bceSAndroid Build Coastguard Worker         if (isFloatFormat(info.getFormat()))
1746*35238bceSAndroid Build Coastguard Worker         {
1747*35238bceSAndroid Build Coastguard Worker             const tcu::UVec4 threshold(2, 2, 2, 2);
1748*35238bceSAndroid Build Coastguard Worker 
1749*35238bceSAndroid Build Coastguard Worker             if (!(tcu::floatUlpThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer,
1750*35238bceSAndroid Build Coastguard Worker                                                 renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
1751*35238bceSAndroid Build Coastguard Worker                 results.fail("Image comparison failed.");
1752*35238bceSAndroid Build Coastguard Worker             else
1753*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
1754*35238bceSAndroid Build Coastguard Worker         }
1755*35238bceSAndroid Build Coastguard Worker         else if (isIntFormat(info.getFormat()) || isUintFormat(info.getFormat()))
1756*35238bceSAndroid Build Coastguard Worker         {
1757*35238bceSAndroid Build Coastguard Worker             const tcu::UVec4 threshold(1, 1, 1, 1);
1758*35238bceSAndroid Build Coastguard Worker 
1759*35238bceSAndroid Build Coastguard Worker             if (!(tcu::intThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer,
1760*35238bceSAndroid Build Coastguard Worker                                            renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
1761*35238bceSAndroid Build Coastguard Worker                 results.fail("Image comparison failed.");
1762*35238bceSAndroid Build Coastguard Worker             else
1763*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
1764*35238bceSAndroid Build Coastguard Worker         }
1765*35238bceSAndroid Build Coastguard Worker         else
1766*35238bceSAndroid Build Coastguard Worker         {
1767*35238bceSAndroid Build Coastguard Worker             const Vec4 threshold = calculateThreshold(format, readPixelsFormat);
1768*35238bceSAndroid Build Coastguard Worker 
1769*35238bceSAndroid Build Coastguard Worker             if (!(tcu::floatThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer,
1770*35238bceSAndroid Build Coastguard Worker                                              renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
1771*35238bceSAndroid Build Coastguard Worker                 results.fail("Image comparison failed.");
1772*35238bceSAndroid Build Coastguard Worker             else
1773*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
1774*35238bceSAndroid Build Coastguard Worker         }
1775*35238bceSAndroid Build Coastguard Worker     }
1776*35238bceSAndroid Build Coastguard Worker }
1777*35238bceSAndroid Build Coastguard Worker 
render(tcu::TestContext & testContext,glu::RenderContext & renderContext,TextureRenderer & textureRenderer,tcu::ResultCollector & results,de::Random & rng,uint32_t name,const vector<ArrayBuffer<uint8_t>> & data,const ImageInfo & info,Verify verify)1778*35238bceSAndroid Build Coastguard Worker void render(tcu::TestContext &testContext, glu::RenderContext &renderContext, TextureRenderer &textureRenderer,
1779*35238bceSAndroid Build Coastguard Worker             tcu::ResultCollector &results, de::Random &rng, uint32_t name, const vector<ArrayBuffer<uint8_t>> &data,
1780*35238bceSAndroid Build Coastguard Worker             const ImageInfo &info, Verify verify)
1781*35238bceSAndroid Build Coastguard Worker {
1782*35238bceSAndroid Build Coastguard Worker     switch (info.getTarget())
1783*35238bceSAndroid Build Coastguard Worker     {
1784*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
1785*35238bceSAndroid Build Coastguard Worker         renderTexture2D(testContext, renderContext, textureRenderer, results, rng, name, data, info, verify);
1786*35238bceSAndroid Build Coastguard Worker         break;
1787*35238bceSAndroid Build Coastguard Worker 
1788*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
1789*35238bceSAndroid Build Coastguard Worker         renderTexture3D(testContext, renderContext, textureRenderer, results, rng, name, data, info, verify);
1790*35238bceSAndroid Build Coastguard Worker         break;
1791*35238bceSAndroid Build Coastguard Worker 
1792*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
1793*35238bceSAndroid Build Coastguard Worker         renderTextureCubemap(testContext, renderContext, textureRenderer, results, rng, name, data, info, verify);
1794*35238bceSAndroid Build Coastguard Worker         break;
1795*35238bceSAndroid Build Coastguard Worker 
1796*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
1797*35238bceSAndroid Build Coastguard Worker         renderTexture2DArray(testContext, renderContext, textureRenderer, results, rng, name, data, info, verify);
1798*35238bceSAndroid Build Coastguard Worker         break;
1799*35238bceSAndroid Build Coastguard Worker 
1800*35238bceSAndroid Build Coastguard Worker     case GL_RENDERBUFFER:
1801*35238bceSAndroid Build Coastguard Worker         renderRenderbuffer(testContext, renderContext, results, name, data, info, verify);
1802*35238bceSAndroid Build Coastguard Worker         break;
1803*35238bceSAndroid Build Coastguard Worker 
1804*35238bceSAndroid Build Coastguard Worker     default:
1805*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1806*35238bceSAndroid Build Coastguard Worker     }
1807*35238bceSAndroid Build Coastguard Worker }
1808*35238bceSAndroid Build Coastguard Worker 
logTestImageInfo(TestLog & log,const ImageInfo & imageInfo)1809*35238bceSAndroid Build Coastguard Worker void logTestImageInfo(TestLog &log, const ImageInfo &imageInfo)
1810*35238bceSAndroid Build Coastguard Worker {
1811*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Target: " << targetToName(imageInfo.getTarget()) << TestLog::EndMessage;
1812*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Size: " << imageInfo.getSize() << TestLog::EndMessage;
1813*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Levels: " << getLevelCount(imageInfo) << TestLog::EndMessage;
1814*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Format: " << formatToName(imageInfo.getFormat()) << TestLog::EndMessage;
1815*35238bceSAndroid Build Coastguard Worker }
1816*35238bceSAndroid Build Coastguard Worker 
logTestInfo(TestLog & log,const ImageInfo & srcImageInfo,const ImageInfo & dstImageInfo)1817*35238bceSAndroid Build Coastguard Worker void logTestInfo(TestLog &log, const ImageInfo &srcImageInfo, const ImageInfo &dstImageInfo)
1818*35238bceSAndroid Build Coastguard Worker {
1819*35238bceSAndroid Build Coastguard Worker     tcu::ScopedLogSection section(log, "TestCaseInfo", "Test case info");
1820*35238bceSAndroid Build Coastguard Worker 
1821*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Testing copying from " << targetToName(srcImageInfo.getTarget()) << " to "
1822*35238bceSAndroid Build Coastguard Worker         << targetToName(dstImageInfo.getTarget()) << "." << TestLog::EndMessage;
1823*35238bceSAndroid Build Coastguard Worker 
1824*35238bceSAndroid Build Coastguard Worker     {
1825*35238bceSAndroid Build Coastguard Worker         tcu::ScopedLogSection srcSection(log, "Source image info.", "Source image info.");
1826*35238bceSAndroid Build Coastguard Worker         logTestImageInfo(log, srcImageInfo);
1827*35238bceSAndroid Build Coastguard Worker     }
1828*35238bceSAndroid Build Coastguard Worker 
1829*35238bceSAndroid Build Coastguard Worker     {
1830*35238bceSAndroid Build Coastguard Worker         tcu::ScopedLogSection dstSection(log, "Destination image info.", "Destination image info.");
1831*35238bceSAndroid Build Coastguard Worker         logTestImageInfo(log, dstImageInfo);
1832*35238bceSAndroid Build Coastguard Worker     }
1833*35238bceSAndroid Build Coastguard Worker }
1834*35238bceSAndroid Build Coastguard Worker 
1835*35238bceSAndroid Build Coastguard Worker class CopyImageTest : public TestCase
1836*35238bceSAndroid Build Coastguard Worker {
1837*35238bceSAndroid Build Coastguard Worker public:
1838*35238bceSAndroid Build Coastguard Worker     CopyImageTest(Context &context, const ImageInfo &srcImage, const ImageInfo &dstImage, const char *name,
1839*35238bceSAndroid Build Coastguard Worker                   const char *description);
1840*35238bceSAndroid Build Coastguard Worker 
1841*35238bceSAndroid Build Coastguard Worker     ~CopyImageTest(void);
1842*35238bceSAndroid Build Coastguard Worker 
1843*35238bceSAndroid Build Coastguard Worker     void init(void);
1844*35238bceSAndroid Build Coastguard Worker     void deinit(void);
1845*35238bceSAndroid Build Coastguard Worker 
1846*35238bceSAndroid Build Coastguard Worker     TestCase::IterateResult iterate(void);
1847*35238bceSAndroid Build Coastguard Worker 
1848*35238bceSAndroid Build Coastguard Worker private:
1849*35238bceSAndroid Build Coastguard Worker     void logTestInfoIter(void);
1850*35238bceSAndroid Build Coastguard Worker     void createImagesIter(void);
1851*35238bceSAndroid Build Coastguard Worker     void destroyImagesIter(void);
1852*35238bceSAndroid Build Coastguard Worker     void verifySourceIter(void);
1853*35238bceSAndroid Build Coastguard Worker     void verifyDestinationIter(void);
1854*35238bceSAndroid Build Coastguard Worker     void renderSourceIter(void);
1855*35238bceSAndroid Build Coastguard Worker     void renderDestinationIter(void);
1856*35238bceSAndroid Build Coastguard Worker     void copyImageIter(void);
1857*35238bceSAndroid Build Coastguard Worker 
1858*35238bceSAndroid Build Coastguard Worker     typedef void (CopyImageTest::*IterationFunc)(void);
1859*35238bceSAndroid Build Coastguard Worker 
1860*35238bceSAndroid Build Coastguard Worker     struct Iteration
1861*35238bceSAndroid Build Coastguard Worker     {
Iterationdeqp::gles31::Functional::__anon2d2b334c0111::CopyImageTest::Iteration1862*35238bceSAndroid Build Coastguard Worker         Iteration(int methodCount_, const IterationFunc *methods_) : methodCount(methodCount_), methods(methods_)
1863*35238bceSAndroid Build Coastguard Worker         {
1864*35238bceSAndroid Build Coastguard Worker         }
1865*35238bceSAndroid Build Coastguard Worker 
1866*35238bceSAndroid Build Coastguard Worker         int methodCount;
1867*35238bceSAndroid Build Coastguard Worker         const IterationFunc *methods;
1868*35238bceSAndroid Build Coastguard Worker     };
1869*35238bceSAndroid Build Coastguard Worker 
1870*35238bceSAndroid Build Coastguard Worker     struct State
1871*35238bceSAndroid Build Coastguard Worker     {
Statedeqp::gles31::Functional::__anon2d2b334c0111::CopyImageTest::State1872*35238bceSAndroid Build Coastguard Worker         State(int seed, tcu::TestLog &log, glu::RenderContext &renderContext)
1873*35238bceSAndroid Build Coastguard Worker             : rng(seed)
1874*35238bceSAndroid Build Coastguard Worker             , results(log)
1875*35238bceSAndroid Build Coastguard Worker             , srcImage(NULL)
1876*35238bceSAndroid Build Coastguard Worker             , dstImage(NULL)
1877*35238bceSAndroid Build Coastguard Worker             , textureRenderer(renderContext, log, glu::getContextTypeGLSLVersion(renderContext.getType()),
1878*35238bceSAndroid Build Coastguard Worker                               glu::PRECISION_HIGHP)
1879*35238bceSAndroid Build Coastguard Worker         {
1880*35238bceSAndroid Build Coastguard Worker         }
1881*35238bceSAndroid Build Coastguard Worker 
~Statedeqp::gles31::Functional::__anon2d2b334c0111::CopyImageTest::State1882*35238bceSAndroid Build Coastguard Worker         ~State(void)
1883*35238bceSAndroid Build Coastguard Worker         {
1884*35238bceSAndroid Build Coastguard Worker             delete srcImage;
1885*35238bceSAndroid Build Coastguard Worker             delete dstImage;
1886*35238bceSAndroid Build Coastguard Worker         }
1887*35238bceSAndroid Build Coastguard Worker 
1888*35238bceSAndroid Build Coastguard Worker         de::Random rng;
1889*35238bceSAndroid Build Coastguard Worker         tcu::ResultCollector results;
1890*35238bceSAndroid Build Coastguard Worker         glu::ObjectWrapper *srcImage;
1891*35238bceSAndroid Build Coastguard Worker         glu::ObjectWrapper *dstImage;
1892*35238bceSAndroid Build Coastguard Worker         TextureRenderer textureRenderer;
1893*35238bceSAndroid Build Coastguard Worker 
1894*35238bceSAndroid Build Coastguard Worker         vector<ArrayBuffer<uint8_t>> srcImageLevels;
1895*35238bceSAndroid Build Coastguard Worker         vector<ArrayBuffer<uint8_t>> dstImageLevels;
1896*35238bceSAndroid Build Coastguard Worker     };
1897*35238bceSAndroid Build Coastguard Worker 
1898*35238bceSAndroid Build Coastguard Worker     const ImageInfo m_srcImageInfo;
1899*35238bceSAndroid Build Coastguard Worker     const ImageInfo m_dstImageInfo;
1900*35238bceSAndroid Build Coastguard Worker 
1901*35238bceSAndroid Build Coastguard Worker     int m_iteration;
1902*35238bceSAndroid Build Coastguard Worker     State *m_state;
1903*35238bceSAndroid Build Coastguard Worker };
1904*35238bceSAndroid Build Coastguard Worker 
CopyImageTest(Context & context,const ImageInfo & srcImage,const ImageInfo & dstImage,const char * name,const char * description)1905*35238bceSAndroid Build Coastguard Worker CopyImageTest::CopyImageTest(Context &context, const ImageInfo &srcImage, const ImageInfo &dstImage, const char *name,
1906*35238bceSAndroid Build Coastguard Worker                              const char *description)
1907*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, description)
1908*35238bceSAndroid Build Coastguard Worker     , m_srcImageInfo(srcImage)
1909*35238bceSAndroid Build Coastguard Worker     , m_dstImageInfo(dstImage)
1910*35238bceSAndroid Build Coastguard Worker 
1911*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
1912*35238bceSAndroid Build Coastguard Worker     , m_state(NULL)
1913*35238bceSAndroid Build Coastguard Worker {
1914*35238bceSAndroid Build Coastguard Worker }
1915*35238bceSAndroid Build Coastguard Worker 
~CopyImageTest(void)1916*35238bceSAndroid Build Coastguard Worker CopyImageTest::~CopyImageTest(void)
1917*35238bceSAndroid Build Coastguard Worker {
1918*35238bceSAndroid Build Coastguard Worker     deinit();
1919*35238bceSAndroid Build Coastguard Worker }
1920*35238bceSAndroid Build Coastguard Worker 
checkFormatSupport(glu::ContextInfo & info,uint32_t format,uint32_t target,glu::RenderContext & ctx)1921*35238bceSAndroid Build Coastguard Worker void checkFormatSupport(glu::ContextInfo &info, uint32_t format, uint32_t target, glu::RenderContext &ctx)
1922*35238bceSAndroid Build Coastguard Worker {
1923*35238bceSAndroid Build Coastguard Worker     const bool isES32 = glu::contextSupports(ctx.getType(), glu::ApiType::es(3, 2));
1924*35238bceSAndroid Build Coastguard Worker 
1925*35238bceSAndroid Build Coastguard Worker     if (glu::isCompressedFormat(format))
1926*35238bceSAndroid Build Coastguard Worker     {
1927*35238bceSAndroid Build Coastguard Worker         if (isAstcFormat(glu::mapGLCompressedTexFormat(format)))
1928*35238bceSAndroid Build Coastguard Worker         {
1929*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(target != GL_RENDERBUFFER);
1930*35238bceSAndroid Build Coastguard Worker             if (!info.isExtensionSupported("GL_KHR_texture_compression_astc_sliced_3d") &&
1931*35238bceSAndroid Build Coastguard Worker                 !info.isExtensionSupported("GL_KHR_texture_compression_astc_hdr") &&
1932*35238bceSAndroid Build Coastguard Worker                 !info.isExtensionSupported("GL_OES_texture_compression_astc"))
1933*35238bceSAndroid Build Coastguard Worker             {
1934*35238bceSAndroid Build Coastguard Worker                 if (target == GL_TEXTURE_3D)
1935*35238bceSAndroid Build Coastguard Worker                     TCU_THROW(NotSupportedError, "TEXTURE_3D target not supported.");
1936*35238bceSAndroid Build Coastguard Worker                 if (!isES32 && !info.isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
1937*35238bceSAndroid Build Coastguard Worker                     TCU_THROW(NotSupportedError, "Compressed astc texture not supported.");
1938*35238bceSAndroid Build Coastguard Worker             }
1939*35238bceSAndroid Build Coastguard Worker         }
1940*35238bceSAndroid Build Coastguard Worker         else
1941*35238bceSAndroid Build Coastguard Worker         {
1942*35238bceSAndroid Build Coastguard Worker             if (!info.isCompressedTextureFormatSupported(format))
1943*35238bceSAndroid Build Coastguard Worker                 TCU_THROW(NotSupportedError, "Compressed texture not supported.");
1944*35238bceSAndroid Build Coastguard Worker         }
1945*35238bceSAndroid Build Coastguard Worker     }
1946*35238bceSAndroid Build Coastguard Worker }
1947*35238bceSAndroid Build Coastguard Worker 
init(void)1948*35238bceSAndroid Build Coastguard Worker void CopyImageTest::init(void)
1949*35238bceSAndroid Build Coastguard Worker {
1950*35238bceSAndroid Build Coastguard Worker     auto &rc = m_context.getRenderContext();
1951*35238bceSAndroid Build Coastguard Worker     de::UniquePtr<glu::ContextInfo> ctxInfo(glu::ContextInfo::create(rc));
1952*35238bceSAndroid Build Coastguard Worker     const bool isES32orGL45 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2)) ||
1953*35238bceSAndroid Build Coastguard Worker                               glu::contextSupports(rc.getType(), glu::ApiType::core(4, 5));
1954*35238bceSAndroid Build Coastguard Worker 
1955*35238bceSAndroid Build Coastguard Worker     if (!isES32orGL45 && !ctxInfo->isExtensionSupported("GL_EXT_copy_image"))
1956*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("Extension GL_EXT_copy_image not supported.", "", __FILE__, __LINE__);
1957*35238bceSAndroid Build Coastguard Worker 
1958*35238bceSAndroid Build Coastguard Worker     checkFormatSupport(*ctxInfo, m_srcImageInfo.getFormat(), m_srcImageInfo.getTarget(), rc);
1959*35238bceSAndroid Build Coastguard Worker     checkFormatSupport(*ctxInfo, m_dstImageInfo.getFormat(), m_dstImageInfo.getTarget(), rc);
1960*35238bceSAndroid Build Coastguard Worker 
1961*35238bceSAndroid Build Coastguard Worker     {
1962*35238bceSAndroid Build Coastguard Worker         SeedBuilder builder;
1963*35238bceSAndroid Build Coastguard Worker 
1964*35238bceSAndroid Build Coastguard Worker         builder << 903980 << m_srcImageInfo << m_dstImageInfo;
1965*35238bceSAndroid Build Coastguard Worker 
1966*35238bceSAndroid Build Coastguard Worker         m_state = new State(builder.get(), m_testCtx.getLog(), rc);
1967*35238bceSAndroid Build Coastguard Worker     }
1968*35238bceSAndroid Build Coastguard Worker }
1969*35238bceSAndroid Build Coastguard Worker 
deinit(void)1970*35238bceSAndroid Build Coastguard Worker void CopyImageTest::deinit(void)
1971*35238bceSAndroid Build Coastguard Worker {
1972*35238bceSAndroid Build Coastguard Worker     delete m_state;
1973*35238bceSAndroid Build Coastguard Worker     m_state = NULL;
1974*35238bceSAndroid Build Coastguard Worker }
1975*35238bceSAndroid Build Coastguard Worker 
logTestInfoIter(void)1976*35238bceSAndroid Build Coastguard Worker void CopyImageTest::logTestInfoIter(void)
1977*35238bceSAndroid Build Coastguard Worker {
1978*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
1979*35238bceSAndroid Build Coastguard Worker 
1980*35238bceSAndroid Build Coastguard Worker     logTestInfo(log, m_srcImageInfo, m_dstImageInfo);
1981*35238bceSAndroid Build Coastguard Worker }
1982*35238bceSAndroid Build Coastguard Worker 
createImagesIter(void)1983*35238bceSAndroid Build Coastguard Worker void CopyImageTest::createImagesIter(void)
1984*35238bceSAndroid Build Coastguard Worker {
1985*35238bceSAndroid Build Coastguard Worker     TestLog &log                      = m_testCtx.getLog();
1986*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &renderContext = m_context.getRenderContext();
1987*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl          = renderContext.getFunctions();
1988*35238bceSAndroid Build Coastguard Worker     const uint32_t moreRestrictiveFormat =
1989*35238bceSAndroid Build Coastguard Worker         getMoreRestrictiveFormat(m_srcImageInfo.getFormat(), m_dstImageInfo.getFormat());
1990*35238bceSAndroid Build Coastguard Worker     de::Random &rng = m_state->rng;
1991*35238bceSAndroid Build Coastguard Worker 
1992*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!m_state->srcImage);
1993*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!m_state->dstImage);
1994*35238bceSAndroid Build Coastguard Worker 
1995*35238bceSAndroid Build Coastguard Worker     m_state->srcImage = new glu::ObjectWrapper(gl, getObjectTraits(m_srcImageInfo));
1996*35238bceSAndroid Build Coastguard Worker     m_state->dstImage = new glu::ObjectWrapper(gl, getObjectTraits(m_dstImageInfo));
1997*35238bceSAndroid Build Coastguard Worker 
1998*35238bceSAndroid Build Coastguard Worker     {
1999*35238bceSAndroid Build Coastguard Worker         glu::ObjectWrapper &srcImage = *m_state->srcImage;
2000*35238bceSAndroid Build Coastguard Worker         glu::ObjectWrapper &dstImage = *m_state->dstImage;
2001*35238bceSAndroid Build Coastguard Worker 
2002*35238bceSAndroid Build Coastguard Worker         vector<ArrayBuffer<uint8_t>> &srcImageLevels = m_state->srcImageLevels;
2003*35238bceSAndroid Build Coastguard Worker         vector<ArrayBuffer<uint8_t>> &dstImageLevels = m_state->dstImageLevels;
2004*35238bceSAndroid Build Coastguard Worker 
2005*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Creating source image." << TestLog::EndMessage;
2006*35238bceSAndroid Build Coastguard Worker         genImage(gl, rng, *srcImage, srcImageLevels, m_srcImageInfo, moreRestrictiveFormat);
2007*35238bceSAndroid Build Coastguard Worker 
2008*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Creating destination image." << TestLog::EndMessage;
2009*35238bceSAndroid Build Coastguard Worker         genImage(gl, rng, *dstImage, dstImageLevels, m_dstImageInfo, moreRestrictiveFormat);
2010*35238bceSAndroid Build Coastguard Worker     }
2011*35238bceSAndroid Build Coastguard Worker }
2012*35238bceSAndroid Build Coastguard Worker 
destroyImagesIter(void)2013*35238bceSAndroid Build Coastguard Worker void CopyImageTest::destroyImagesIter(void)
2014*35238bceSAndroid Build Coastguard Worker {
2015*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
2016*35238bceSAndroid Build Coastguard Worker 
2017*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Deleting source image. " << TestLog::EndMessage;
2018*35238bceSAndroid Build Coastguard Worker 
2019*35238bceSAndroid Build Coastguard Worker     delete m_state->srcImage;
2020*35238bceSAndroid Build Coastguard Worker     m_state->srcImage = NULL;
2021*35238bceSAndroid Build Coastguard Worker     m_state->srcImageLevels.clear();
2022*35238bceSAndroid Build Coastguard Worker 
2023*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Deleting destination image. " << TestLog::EndMessage;
2024*35238bceSAndroid Build Coastguard Worker 
2025*35238bceSAndroid Build Coastguard Worker     delete m_state->dstImage;
2026*35238bceSAndroid Build Coastguard Worker     m_state->dstImage = NULL;
2027*35238bceSAndroid Build Coastguard Worker     m_state->dstImageLevels.clear();
2028*35238bceSAndroid Build Coastguard Worker }
2029*35238bceSAndroid Build Coastguard Worker 
verifySourceIter(void)2030*35238bceSAndroid Build Coastguard Worker void CopyImageTest::verifySourceIter(void)
2031*35238bceSAndroid Build Coastguard Worker {
2032*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
2033*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection sourceSection(log, "Source image verify.", "Source image verify.");
2034*35238bceSAndroid Build Coastguard Worker 
2035*35238bceSAndroid Build Coastguard Worker     de::Random &rng                              = m_state->rng;
2036*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector &results                = m_state->results;
2037*35238bceSAndroid Build Coastguard Worker     glu::ObjectWrapper &srcImage                 = *m_state->srcImage;
2038*35238bceSAndroid Build Coastguard Worker     vector<ArrayBuffer<uint8_t>> &srcImageLevels = m_state->srcImageLevels;
2039*35238bceSAndroid Build Coastguard Worker 
2040*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Verifying source image." << TestLog::EndMessage;
2041*35238bceSAndroid Build Coastguard Worker 
2042*35238bceSAndroid Build Coastguard Worker     render(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *srcImage, srcImageLevels,
2043*35238bceSAndroid Build Coastguard Worker            m_srcImageInfo, VERIFY_COMPARE_REFERENCE);
2044*35238bceSAndroid Build Coastguard Worker }
2045*35238bceSAndroid Build Coastguard Worker 
verifyDestinationIter(void)2046*35238bceSAndroid Build Coastguard Worker void CopyImageTest::verifyDestinationIter(void)
2047*35238bceSAndroid Build Coastguard Worker {
2048*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
2049*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection destinationSection(log, "Destination image verify.", "Destination image verify.");
2050*35238bceSAndroid Build Coastguard Worker 
2051*35238bceSAndroid Build Coastguard Worker     de::Random &rng                              = m_state->rng;
2052*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector &results                = m_state->results;
2053*35238bceSAndroid Build Coastguard Worker     glu::ObjectWrapper &dstImage                 = *m_state->dstImage;
2054*35238bceSAndroid Build Coastguard Worker     vector<ArrayBuffer<uint8_t>> &dstImageLevels = m_state->dstImageLevels;
2055*35238bceSAndroid Build Coastguard Worker 
2056*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Verifying destination image." << TestLog::EndMessage;
2057*35238bceSAndroid Build Coastguard Worker 
2058*35238bceSAndroid Build Coastguard Worker     render(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *dstImage, dstImageLevels,
2059*35238bceSAndroid Build Coastguard Worker            m_dstImageInfo, VERIFY_COMPARE_REFERENCE);
2060*35238bceSAndroid Build Coastguard Worker }
2061*35238bceSAndroid Build Coastguard Worker 
renderSourceIter(void)2062*35238bceSAndroid Build Coastguard Worker void CopyImageTest::renderSourceIter(void)
2063*35238bceSAndroid Build Coastguard Worker {
2064*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
2065*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection sourceSection(log, "Source image verify.", "Source image verify.");
2066*35238bceSAndroid Build Coastguard Worker 
2067*35238bceSAndroid Build Coastguard Worker     de::Random &rng                              = m_state->rng;
2068*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector &results                = m_state->results;
2069*35238bceSAndroid Build Coastguard Worker     glu::ObjectWrapper &srcImage                 = *m_state->srcImage;
2070*35238bceSAndroid Build Coastguard Worker     vector<ArrayBuffer<uint8_t>> &srcImageLevels = m_state->srcImageLevels;
2071*35238bceSAndroid Build Coastguard Worker 
2072*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Verifying source image." << TestLog::EndMessage;
2073*35238bceSAndroid Build Coastguard Worker 
2074*35238bceSAndroid Build Coastguard Worker     render(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *srcImage, srcImageLevels,
2075*35238bceSAndroid Build Coastguard Worker            m_srcImageInfo, VERIFY_NONE);
2076*35238bceSAndroid Build Coastguard Worker }
2077*35238bceSAndroid Build Coastguard Worker 
renderDestinationIter(void)2078*35238bceSAndroid Build Coastguard Worker void CopyImageTest::renderDestinationIter(void)
2079*35238bceSAndroid Build Coastguard Worker {
2080*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
2081*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection destinationSection(log, "Destination image verify.", "Destination image verify.");
2082*35238bceSAndroid Build Coastguard Worker 
2083*35238bceSAndroid Build Coastguard Worker     de::Random &rng                              = m_state->rng;
2084*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector &results                = m_state->results;
2085*35238bceSAndroid Build Coastguard Worker     glu::ObjectWrapper &dstImage                 = *m_state->dstImage;
2086*35238bceSAndroid Build Coastguard Worker     vector<ArrayBuffer<uint8_t>> &dstImageLevels = m_state->dstImageLevels;
2087*35238bceSAndroid Build Coastguard Worker 
2088*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Verifying destination image." << TestLog::EndMessage;
2089*35238bceSAndroid Build Coastguard Worker 
2090*35238bceSAndroid Build Coastguard Worker     render(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *dstImage, dstImageLevels,
2091*35238bceSAndroid Build Coastguard Worker            m_dstImageInfo, VERIFY_NONE);
2092*35238bceSAndroid Build Coastguard Worker }
2093*35238bceSAndroid Build Coastguard Worker 
2094*35238bceSAndroid Build Coastguard Worker struct Copy
2095*35238bceSAndroid Build Coastguard Worker {
Copydeqp::gles31::Functional::__anon2d2b334c0111::Copy2096*35238bceSAndroid Build Coastguard Worker     Copy(const IVec3 &srcPos_, int srcLevel_,
2097*35238bceSAndroid Build Coastguard Worker 
2098*35238bceSAndroid Build Coastguard Worker          const IVec3 &dstPos_, int dstLevel_,
2099*35238bceSAndroid Build Coastguard Worker 
2100*35238bceSAndroid Build Coastguard Worker          const IVec3 &size_, const IVec3 &dstSize_)
2101*35238bceSAndroid Build Coastguard Worker         : srcPos(srcPos_)
2102*35238bceSAndroid Build Coastguard Worker         , srcLevel(srcLevel_)
2103*35238bceSAndroid Build Coastguard Worker 
2104*35238bceSAndroid Build Coastguard Worker         , dstPos(dstPos_)
2105*35238bceSAndroid Build Coastguard Worker         , dstLevel(dstLevel_)
2106*35238bceSAndroid Build Coastguard Worker 
2107*35238bceSAndroid Build Coastguard Worker         , size(size_)
2108*35238bceSAndroid Build Coastguard Worker         , dstSize(dstSize_)
2109*35238bceSAndroid Build Coastguard Worker     {
2110*35238bceSAndroid Build Coastguard Worker     }
2111*35238bceSAndroid Build Coastguard Worker 
2112*35238bceSAndroid Build Coastguard Worker     IVec3 srcPos;
2113*35238bceSAndroid Build Coastguard Worker     int srcLevel;
2114*35238bceSAndroid Build Coastguard Worker     IVec3 dstPos;
2115*35238bceSAndroid Build Coastguard Worker     int dstLevel;
2116*35238bceSAndroid Build Coastguard Worker     IVec3 size;
2117*35238bceSAndroid Build Coastguard Worker     IVec3 dstSize; //!< used only for logging
2118*35238bceSAndroid Build Coastguard Worker };
2119*35238bceSAndroid Build Coastguard Worker 
getLastFullLevel(const ImageInfo & info)2120*35238bceSAndroid Build Coastguard Worker int getLastFullLevel(const ImageInfo &info)
2121*35238bceSAndroid Build Coastguard Worker {
2122*35238bceSAndroid Build Coastguard Worker     const int levelCount       = getLevelCount(info);
2123*35238bceSAndroid Build Coastguard Worker     const IVec3 blockPixelSize = getTexelBlockPixelSize(info.getFormat());
2124*35238bceSAndroid Build Coastguard Worker 
2125*35238bceSAndroid Build Coastguard Worker     for (int level = 0; level < levelCount; level++)
2126*35238bceSAndroid Build Coastguard Worker     {
2127*35238bceSAndroid Build Coastguard Worker         const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level);
2128*35238bceSAndroid Build Coastguard Worker 
2129*35238bceSAndroid Build Coastguard Worker         if (levelSize.x() < blockPixelSize.x() || levelSize.y() < blockPixelSize.y() ||
2130*35238bceSAndroid Build Coastguard Worker             levelSize.z() < blockPixelSize.z())
2131*35238bceSAndroid Build Coastguard Worker             return level - 1;
2132*35238bceSAndroid Build Coastguard Worker     }
2133*35238bceSAndroid Build Coastguard Worker 
2134*35238bceSAndroid Build Coastguard Worker     return levelCount - 1;
2135*35238bceSAndroid Build Coastguard Worker }
2136*35238bceSAndroid Build Coastguard Worker 
generateCopies(vector<Copy> & copies,const ImageInfo & srcInfo,const ImageInfo & dstInfo)2137*35238bceSAndroid Build Coastguard Worker void generateCopies(vector<Copy> &copies, const ImageInfo &srcInfo, const ImageInfo &dstInfo)
2138*35238bceSAndroid Build Coastguard Worker {
2139*35238bceSAndroid Build Coastguard Worker     const uint32_t srcTarget = srcInfo.getTarget();
2140*35238bceSAndroid Build Coastguard Worker     const uint32_t dstTarget = dstInfo.getTarget();
2141*35238bceSAndroid Build Coastguard Worker 
2142*35238bceSAndroid Build Coastguard Worker     const bool srcIsTexture = isTextureTarget(srcInfo.getTarget());
2143*35238bceSAndroid Build Coastguard Worker     const bool dstIsTexture = isTextureTarget(dstInfo.getTarget());
2144*35238bceSAndroid Build Coastguard Worker 
2145*35238bceSAndroid Build Coastguard Worker     const bool srcIsCube = srcTarget == GL_TEXTURE_CUBE_MAP;
2146*35238bceSAndroid Build Coastguard Worker     const bool dstIsCube = dstTarget == GL_TEXTURE_CUBE_MAP;
2147*35238bceSAndroid Build Coastguard Worker 
2148*35238bceSAndroid Build Coastguard Worker     const IVec3 srcBlockPixelSize = getTexelBlockPixelSize(srcInfo.getFormat());
2149*35238bceSAndroid Build Coastguard Worker     const IVec3 dstBlockPixelSize = getTexelBlockPixelSize(dstInfo.getFormat());
2150*35238bceSAndroid Build Coastguard Worker 
2151*35238bceSAndroid Build Coastguard Worker     const int levels[] = {0, 1, -1};
2152*35238bceSAndroid Build Coastguard Worker 
2153*35238bceSAndroid Build Coastguard Worker     for (int levelNdx = 0; levelNdx < (srcIsTexture || dstIsTexture ? DE_LENGTH_OF_ARRAY(levels) : 1); levelNdx++)
2154*35238bceSAndroid Build Coastguard Worker     {
2155*35238bceSAndroid Build Coastguard Worker         const int srcLevel =
2156*35238bceSAndroid Build Coastguard Worker             (srcIsTexture ? (levels[levelNdx] >= 0 ? levels[levelNdx] : getLastFullLevel(srcInfo)) : 0);
2157*35238bceSAndroid Build Coastguard Worker         const int dstLevel =
2158*35238bceSAndroid Build Coastguard Worker             (dstIsTexture ? (levels[levelNdx] >= 0 ? levels[levelNdx] : getLastFullLevel(dstInfo)) : 0);
2159*35238bceSAndroid Build Coastguard Worker 
2160*35238bceSAndroid Build Coastguard Worker         const IVec3 srcSize = getLevelSize(srcInfo.getTarget(), srcInfo.getSize(), srcLevel);
2161*35238bceSAndroid Build Coastguard Worker         const IVec3 dstSize = getLevelSize(dstInfo.getTarget(), dstInfo.getSize(), dstLevel);
2162*35238bceSAndroid Build Coastguard Worker 
2163*35238bceSAndroid Build Coastguard Worker         // \note These are rounded down
2164*35238bceSAndroid Build Coastguard Worker         const IVec3 srcCompleteBlockSize =
2165*35238bceSAndroid Build Coastguard Worker             IVec3(srcSize.x() / srcBlockPixelSize.x(), srcSize.y() / srcBlockPixelSize.y(),
2166*35238bceSAndroid Build Coastguard Worker                   (srcIsCube ? 6 : srcSize.z() / srcBlockPixelSize.z()));
2167*35238bceSAndroid Build Coastguard Worker         const IVec3 dstCompleteBlockSize =
2168*35238bceSAndroid Build Coastguard Worker             IVec3(dstSize.x() / dstBlockPixelSize.x(), dstSize.y() / dstBlockPixelSize.y(),
2169*35238bceSAndroid Build Coastguard Worker                   (dstIsCube ? 6 : dstSize.z() / dstBlockPixelSize.z()));
2170*35238bceSAndroid Build Coastguard Worker 
2171*35238bceSAndroid Build Coastguard Worker         const IVec3 maxCopyBlockSize = tcu::min(srcCompleteBlockSize, dstCompleteBlockSize);
2172*35238bceSAndroid Build Coastguard Worker 
2173*35238bceSAndroid Build Coastguard Worker         // \note These are rounded down
2174*35238bceSAndroid Build Coastguard Worker         const int copyBlockWidth  = de::max((2 * (maxCopyBlockSize.x() / 4)) - 1, 1);
2175*35238bceSAndroid Build Coastguard Worker         const int copyBlockHeight = de::max((2 * (maxCopyBlockSize.y() / 4)) - 1, 1);
2176*35238bceSAndroid Build Coastguard Worker         const int copyBlockDepth  = de::max((2 * (maxCopyBlockSize.z() / 4)) - 1, 1);
2177*35238bceSAndroid Build Coastguard Worker 
2178*35238bceSAndroid Build Coastguard Worker         // Copy NPOT block to (0,0,0) from other corner on src
2179*35238bceSAndroid Build Coastguard Worker         {
2180*35238bceSAndroid Build Coastguard Worker             const IVec3 copyBlockSize(copyBlockWidth, copyBlockHeight, copyBlockDepth);
2181*35238bceSAndroid Build Coastguard Worker             const IVec3 srcBlockPos(srcCompleteBlockSize - copyBlockSize);
2182*35238bceSAndroid Build Coastguard Worker             const IVec3 dstBlockPos(0, 0, 0);
2183*35238bceSAndroid Build Coastguard Worker 
2184*35238bceSAndroid Build Coastguard Worker             const IVec3 srcPos(srcBlockPos * srcBlockPixelSize);
2185*35238bceSAndroid Build Coastguard Worker             const IVec3 dstPos(dstBlockPos * dstBlockPixelSize);
2186*35238bceSAndroid Build Coastguard Worker             const IVec3 srcCopySize(copyBlockSize * srcBlockPixelSize);
2187*35238bceSAndroid Build Coastguard Worker             const IVec3 dstCopySize(copyBlockSize * dstBlockPixelSize);
2188*35238bceSAndroid Build Coastguard Worker 
2189*35238bceSAndroid Build Coastguard Worker             copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, srcCopySize, dstCopySize));
2190*35238bceSAndroid Build Coastguard Worker         }
2191*35238bceSAndroid Build Coastguard Worker 
2192*35238bceSAndroid Build Coastguard Worker         // Copy NPOT block from (0,0,0) to other corner on dst
2193*35238bceSAndroid Build Coastguard Worker         {
2194*35238bceSAndroid Build Coastguard Worker             const IVec3 copyBlockSize(copyBlockWidth, copyBlockHeight, copyBlockDepth);
2195*35238bceSAndroid Build Coastguard Worker             const IVec3 srcBlockPos(0, 0, 0);
2196*35238bceSAndroid Build Coastguard Worker             const IVec3 dstBlockPos(dstCompleteBlockSize - copyBlockSize);
2197*35238bceSAndroid Build Coastguard Worker 
2198*35238bceSAndroid Build Coastguard Worker             const IVec3 srcPos(srcBlockPos * srcBlockPixelSize);
2199*35238bceSAndroid Build Coastguard Worker             const IVec3 dstPos(dstBlockPos * dstBlockPixelSize);
2200*35238bceSAndroid Build Coastguard Worker             const IVec3 srcCopySize(copyBlockSize * srcBlockPixelSize);
2201*35238bceSAndroid Build Coastguard Worker             const IVec3 dstCopySize(copyBlockSize * dstBlockPixelSize);
2202*35238bceSAndroid Build Coastguard Worker 
2203*35238bceSAndroid Build Coastguard Worker             copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, srcCopySize, dstCopySize));
2204*35238bceSAndroid Build Coastguard Worker         }
2205*35238bceSAndroid Build Coastguard Worker 
2206*35238bceSAndroid Build Coastguard Worker         // Copy NPOT block near the corner with high coordinates
2207*35238bceSAndroid Build Coastguard Worker         {
2208*35238bceSAndroid Build Coastguard Worker             const IVec3 copyBlockSize(copyBlockWidth, copyBlockHeight, copyBlockDepth);
2209*35238bceSAndroid Build Coastguard Worker             const IVec3 srcBlockPos(tcu::max((srcCompleteBlockSize / 4) * 4 - copyBlockSize, IVec3(0)));
2210*35238bceSAndroid Build Coastguard Worker             const IVec3 dstBlockPos(tcu::max((dstCompleteBlockSize / 4) * 4 - copyBlockSize, IVec3(0)));
2211*35238bceSAndroid Build Coastguard Worker 
2212*35238bceSAndroid Build Coastguard Worker             const IVec3 srcPos(srcBlockPos * srcBlockPixelSize);
2213*35238bceSAndroid Build Coastguard Worker             const IVec3 dstPos(dstBlockPos * dstBlockPixelSize);
2214*35238bceSAndroid Build Coastguard Worker             const IVec3 srcCopySize(copyBlockSize * srcBlockPixelSize);
2215*35238bceSAndroid Build Coastguard Worker             const IVec3 dstCopySize(copyBlockSize * dstBlockPixelSize);
2216*35238bceSAndroid Build Coastguard Worker 
2217*35238bceSAndroid Build Coastguard Worker             copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, srcCopySize, dstCopySize));
2218*35238bceSAndroid Build Coastguard Worker         }
2219*35238bceSAndroid Build Coastguard Worker     }
2220*35238bceSAndroid Build Coastguard Worker }
2221*35238bceSAndroid Build Coastguard Worker 
copyImageIter(void)2222*35238bceSAndroid Build Coastguard Worker void CopyImageTest::copyImageIter(void)
2223*35238bceSAndroid Build Coastguard Worker {
2224*35238bceSAndroid Build Coastguard Worker     TestLog &log                 = m_testCtx.getLog();
2225*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl     = m_context.getRenderContext().getFunctions();
2226*35238bceSAndroid Build Coastguard Worker     glu::ObjectWrapper &srcImage = *m_state->srcImage;
2227*35238bceSAndroid Build Coastguard Worker     glu::ObjectWrapper &dstImage = *m_state->dstImage;
2228*35238bceSAndroid Build Coastguard Worker 
2229*35238bceSAndroid Build Coastguard Worker     vector<ArrayBuffer<uint8_t>> &srcImageLevels = m_state->srcImageLevels;
2230*35238bceSAndroid Build Coastguard Worker     vector<ArrayBuffer<uint8_t>> &dstImageLevels = m_state->dstImageLevels;
2231*35238bceSAndroid Build Coastguard Worker     vector<Copy> copies;
2232*35238bceSAndroid Build Coastguard Worker 
2233*35238bceSAndroid Build Coastguard Worker     generateCopies(copies, m_srcImageInfo, m_dstImageInfo);
2234*35238bceSAndroid Build Coastguard Worker 
2235*35238bceSAndroid Build Coastguard Worker     for (int copyNdx = 0; copyNdx < (int)copies.size(); copyNdx++)
2236*35238bceSAndroid Build Coastguard Worker     {
2237*35238bceSAndroid Build Coastguard Worker         const Copy &copy = copies[copyNdx];
2238*35238bceSAndroid Build Coastguard Worker 
2239*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Copying area with size " << copy.size << " from source image position "
2240*35238bceSAndroid Build Coastguard Worker             << copy.srcPos << " and mipmap level " << copy.srcLevel << " to destination image position " << copy.dstPos
2241*35238bceSAndroid Build Coastguard Worker             << " and mipmap level " << copy.dstLevel << ". "
2242*35238bceSAndroid Build Coastguard Worker             << "Size in destination format is " << copy.dstSize << TestLog::EndMessage;
2243*35238bceSAndroid Build Coastguard Worker 
2244*35238bceSAndroid Build Coastguard Worker         copyImage(gl, *dstImage, dstImageLevels, m_dstImageInfo, copy.dstLevel, copy.dstPos, *srcImage, srcImageLevels,
2245*35238bceSAndroid Build Coastguard Worker                   m_srcImageInfo, copy.srcLevel, copy.srcPos, copy.size);
2246*35238bceSAndroid Build Coastguard Worker     }
2247*35238bceSAndroid Build Coastguard Worker }
2248*35238bceSAndroid Build Coastguard Worker 
iterate(void)2249*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult CopyImageTest::iterate(void)
2250*35238bceSAndroid Build Coastguard Worker {
2251*35238bceSAndroid Build Coastguard Worker     // Note: Returning from iterate() has two side-effects: it touches
2252*35238bceSAndroid Build Coastguard Worker     // watchdog and calls eglSwapBuffers. For the first it's important
2253*35238bceSAndroid Build Coastguard Worker     // to keep work per iteration reasonable to avoid
2254*35238bceSAndroid Build Coastguard Worker     // timeouts. Because of the latter, it's prudent to do more than
2255*35238bceSAndroid Build Coastguard Worker     // trivial amount of work. Otherwise we'll end up waiting for a
2256*35238bceSAndroid Build Coastguard Worker     // new buffer in swap, it seems.
2257*35238bceSAndroid Build Coastguard Worker 
2258*35238bceSAndroid Build Coastguard Worker     // The split below tries to combine trivial work with actually
2259*35238bceSAndroid Build Coastguard Worker     // expensive rendering iterations without having too much
2260*35238bceSAndroid Build Coastguard Worker     // rendering in one iteration to avoid timeouts.
2261*35238bceSAndroid Build Coastguard Worker     const IterationFunc iteration1[] = {&CopyImageTest::logTestInfoIter, &CopyImageTest::createImagesIter,
2262*35238bceSAndroid Build Coastguard Worker                                         &CopyImageTest::renderSourceIter};
2263*35238bceSAndroid Build Coastguard Worker     const IterationFunc iteration2[] = {&CopyImageTest::renderDestinationIter};
2264*35238bceSAndroid Build Coastguard Worker     const IterationFunc iteration3[] = {&CopyImageTest::copyImageIter, &CopyImageTest::verifySourceIter};
2265*35238bceSAndroid Build Coastguard Worker     const IterationFunc iteration4[] = {&CopyImageTest::verifyDestinationIter, &CopyImageTest::destroyImagesIter};
2266*35238bceSAndroid Build Coastguard Worker     const IterationFunc iteration5[] = {&CopyImageTest::createImagesIter, &CopyImageTest::copyImageIter,
2267*35238bceSAndroid Build Coastguard Worker                                         &CopyImageTest::verifySourceIter};
2268*35238bceSAndroid Build Coastguard Worker     const IterationFunc iteration6[] = {&CopyImageTest::verifyDestinationIter, &CopyImageTest::destroyImagesIter};
2269*35238bceSAndroid Build Coastguard Worker     const Iteration iterations[]     = {
2270*35238bceSAndroid Build Coastguard Worker         Iteration(DE_LENGTH_OF_ARRAY(iteration1), iteration1), Iteration(DE_LENGTH_OF_ARRAY(iteration2), iteration2),
2271*35238bceSAndroid Build Coastguard Worker         Iteration(DE_LENGTH_OF_ARRAY(iteration3), iteration3), Iteration(DE_LENGTH_OF_ARRAY(iteration4), iteration4),
2272*35238bceSAndroid Build Coastguard Worker         Iteration(DE_LENGTH_OF_ARRAY(iteration5), iteration5), Iteration(DE_LENGTH_OF_ARRAY(iteration6), iteration6)};
2273*35238bceSAndroid Build Coastguard Worker 
2274*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_iteration < DE_LENGTH_OF_ARRAY(iterations));
2275*35238bceSAndroid Build Coastguard Worker     for (int method = 0; method < iterations[m_iteration].methodCount; method++)
2276*35238bceSAndroid Build Coastguard Worker         (this->*iterations[m_iteration].methods[method])();
2277*35238bceSAndroid Build Coastguard Worker 
2278*35238bceSAndroid Build Coastguard Worker     m_iteration++;
2279*35238bceSAndroid Build Coastguard Worker 
2280*35238bceSAndroid Build Coastguard Worker     if (m_iteration < DE_LENGTH_OF_ARRAY(iterations))
2281*35238bceSAndroid Build Coastguard Worker     {
2282*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
2283*35238bceSAndroid Build Coastguard Worker     }
2284*35238bceSAndroid Build Coastguard Worker     else
2285*35238bceSAndroid Build Coastguard Worker     {
2286*35238bceSAndroid Build Coastguard Worker         m_state->results.setTestContextResult(m_testCtx);
2287*35238bceSAndroid Build Coastguard Worker         return STOP;
2288*35238bceSAndroid Build Coastguard Worker     }
2289*35238bceSAndroid Build Coastguard Worker }
2290*35238bceSAndroid Build Coastguard Worker 
2291*35238bceSAndroid Build Coastguard Worker class CopyImageTests : public TestCaseGroup
2292*35238bceSAndroid Build Coastguard Worker {
2293*35238bceSAndroid Build Coastguard Worker public:
2294*35238bceSAndroid Build Coastguard Worker     CopyImageTests(Context &context, bool is_GL45);
2295*35238bceSAndroid Build Coastguard Worker     ~CopyImageTests(void);
2296*35238bceSAndroid Build Coastguard Worker 
2297*35238bceSAndroid Build Coastguard Worker     void init(void);
2298*35238bceSAndroid Build Coastguard Worker 
2299*35238bceSAndroid Build Coastguard Worker private:
2300*35238bceSAndroid Build Coastguard Worker     CopyImageTests(const CopyImageTests &other);
2301*35238bceSAndroid Build Coastguard Worker     CopyImageTests &operator=(const CopyImageTests &other);
2302*35238bceSAndroid Build Coastguard Worker     bool m_isGL45;
2303*35238bceSAndroid Build Coastguard Worker };
2304*35238bceSAndroid Build Coastguard Worker 
CopyImageTests(Context & context,bool is_GL45)2305*35238bceSAndroid Build Coastguard Worker CopyImageTests::CopyImageTests(Context &context, bool is_GL45)
2306*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "copy_image", "Copy image tests for GL_EXT_copy_image.")
2307*35238bceSAndroid Build Coastguard Worker     , m_isGL45(is_GL45)
2308*35238bceSAndroid Build Coastguard Worker {
2309*35238bceSAndroid Build Coastguard Worker }
2310*35238bceSAndroid Build Coastguard Worker 
~CopyImageTests(void)2311*35238bceSAndroid Build Coastguard Worker CopyImageTests::~CopyImageTests(void)
2312*35238bceSAndroid Build Coastguard Worker {
2313*35238bceSAndroid Build Coastguard Worker }
2314*35238bceSAndroid Build Coastguard Worker 
smallestCommonMultiple(int a_,int b_)2315*35238bceSAndroid Build Coastguard Worker int smallestCommonMultiple(int a_, int b_)
2316*35238bceSAndroid Build Coastguard Worker {
2317*35238bceSAndroid Build Coastguard Worker     int a      = (a_ > b_ ? a_ : b_);
2318*35238bceSAndroid Build Coastguard Worker     int b      = (a_ > b_ ? b_ : a_);
2319*35238bceSAndroid Build Coastguard Worker     int result = 1;
2320*35238bceSAndroid Build Coastguard Worker 
2321*35238bceSAndroid Build Coastguard Worker     for (int i = b / 2; i > 1; i--)
2322*35238bceSAndroid Build Coastguard Worker     {
2323*35238bceSAndroid Build Coastguard Worker         while ((a % i) == 0 && (b % i) == 0)
2324*35238bceSAndroid Build Coastguard Worker         {
2325*35238bceSAndroid Build Coastguard Worker             result *= i;
2326*35238bceSAndroid Build Coastguard Worker             a /= i;
2327*35238bceSAndroid Build Coastguard Worker             b /= i;
2328*35238bceSAndroid Build Coastguard Worker         }
2329*35238bceSAndroid Build Coastguard Worker     }
2330*35238bceSAndroid Build Coastguard Worker 
2331*35238bceSAndroid Build Coastguard Worker     return result * a * b;
2332*35238bceSAndroid Build Coastguard Worker }
2333*35238bceSAndroid Build Coastguard Worker 
getTestedSize(uint32_t target,uint32_t format,const IVec3 & targetSize)2334*35238bceSAndroid Build Coastguard Worker IVec3 getTestedSize(uint32_t target, uint32_t format, const IVec3 &targetSize)
2335*35238bceSAndroid Build Coastguard Worker {
2336*35238bceSAndroid Build Coastguard Worker     const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(format);
2337*35238bceSAndroid Build Coastguard Worker     const bool isCube               = target == GL_TEXTURE_CUBE_MAP;
2338*35238bceSAndroid Build Coastguard Worker     const bool is3D                 = target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY;
2339*35238bceSAndroid Build Coastguard Worker 
2340*35238bceSAndroid Build Coastguard Worker     if (isCube)
2341*35238bceSAndroid Build Coastguard Worker     {
2342*35238bceSAndroid Build Coastguard Worker         const int multiplier = smallestCommonMultiple(texelBlockPixelSize.x(), texelBlockPixelSize.y());
2343*35238bceSAndroid Build Coastguard Worker         const int size       = (1 + (targetSize.x() / multiplier)) * multiplier;
2344*35238bceSAndroid Build Coastguard Worker 
2345*35238bceSAndroid Build Coastguard Worker         return IVec3(size, size, 1);
2346*35238bceSAndroid Build Coastguard Worker     }
2347*35238bceSAndroid Build Coastguard Worker     else if (is3D)
2348*35238bceSAndroid Build Coastguard Worker     {
2349*35238bceSAndroid Build Coastguard Worker         return (1 + (targetSize / texelBlockPixelSize)) * texelBlockPixelSize;
2350*35238bceSAndroid Build Coastguard Worker     }
2351*35238bceSAndroid Build Coastguard Worker     else
2352*35238bceSAndroid Build Coastguard Worker     {
2353*35238bceSAndroid Build Coastguard Worker         const int width  = (1 + targetSize.x() / texelBlockPixelSize.x()) * texelBlockPixelSize.x();
2354*35238bceSAndroid Build Coastguard Worker         const int height = ((targetSize.y() / texelBlockPixelSize.y()) - 1) * texelBlockPixelSize.y();
2355*35238bceSAndroid Build Coastguard Worker 
2356*35238bceSAndroid Build Coastguard Worker         return IVec3(width, height, 1);
2357*35238bceSAndroid Build Coastguard Worker     }
2358*35238bceSAndroid Build Coastguard Worker }
2359*35238bceSAndroid Build Coastguard Worker 
addCopyTests(TestCaseGroup * root,uint32_t srcFormat,uint32_t dstFormat)2360*35238bceSAndroid Build Coastguard Worker void addCopyTests(TestCaseGroup *root, uint32_t srcFormat, uint32_t dstFormat)
2361*35238bceSAndroid Build Coastguard Worker {
2362*35238bceSAndroid Build Coastguard Worker     const string groupName     = string(formatToName(srcFormat)) + "_" + formatToName(dstFormat);
2363*35238bceSAndroid Build Coastguard Worker     TestCaseGroup *const group = new TestCaseGroup(root->getContext(), groupName.c_str(), groupName.c_str());
2364*35238bceSAndroid Build Coastguard Worker 
2365*35238bceSAndroid Build Coastguard Worker     const uint32_t targets[] = {GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_2D_ARRAY,
2366*35238bceSAndroid Build Coastguard Worker                                 GL_RENDERBUFFER};
2367*35238bceSAndroid Build Coastguard Worker 
2368*35238bceSAndroid Build Coastguard Worker     root->addChild(group);
2369*35238bceSAndroid Build Coastguard Worker 
2370*35238bceSAndroid Build Coastguard Worker     for (int srcTargetNdx = 0; srcTargetNdx < DE_LENGTH_OF_ARRAY(targets); srcTargetNdx++)
2371*35238bceSAndroid Build Coastguard Worker     {
2372*35238bceSAndroid Build Coastguard Worker         const uint32_t srcTarget = targets[srcTargetNdx];
2373*35238bceSAndroid Build Coastguard Worker         const bool srcIs3D       = srcTarget == GL_TEXTURE_2D_ARRAY || srcTarget == GL_TEXTURE_3D;
2374*35238bceSAndroid Build Coastguard Worker 
2375*35238bceSAndroid Build Coastguard Worker         if (glu::isCompressedFormat(srcFormat) && srcTarget == GL_RENDERBUFFER)
2376*35238bceSAndroid Build Coastguard Worker             continue;
2377*35238bceSAndroid Build Coastguard Worker 
2378*35238bceSAndroid Build Coastguard Worker         if (srcTarget == GL_RENDERBUFFER && !isColorRenderable(srcFormat))
2379*35238bceSAndroid Build Coastguard Worker             continue;
2380*35238bceSAndroid Build Coastguard Worker 
2381*35238bceSAndroid Build Coastguard Worker         if (glu::isCompressedFormat(srcFormat) && !tcu::isAstcFormat(glu::mapGLCompressedTexFormat(srcFormat)) &&
2382*35238bceSAndroid Build Coastguard Worker             srcIs3D)
2383*35238bceSAndroid Build Coastguard Worker             continue;
2384*35238bceSAndroid Build Coastguard Worker 
2385*35238bceSAndroid Build Coastguard Worker         for (int dstTargetNdx = 0; dstTargetNdx < DE_LENGTH_OF_ARRAY(targets); dstTargetNdx++)
2386*35238bceSAndroid Build Coastguard Worker         {
2387*35238bceSAndroid Build Coastguard Worker             const uint32_t dstTarget = targets[dstTargetNdx];
2388*35238bceSAndroid Build Coastguard Worker             const bool dstIs3D       = dstTarget == GL_TEXTURE_2D_ARRAY || dstTarget == GL_TEXTURE_3D;
2389*35238bceSAndroid Build Coastguard Worker 
2390*35238bceSAndroid Build Coastguard Worker             if (glu::isCompressedFormat(dstFormat) && dstTarget == GL_RENDERBUFFER)
2391*35238bceSAndroid Build Coastguard Worker                 continue;
2392*35238bceSAndroid Build Coastguard Worker 
2393*35238bceSAndroid Build Coastguard Worker             if (dstTarget == GL_RENDERBUFFER && !isColorRenderable(dstFormat))
2394*35238bceSAndroid Build Coastguard Worker                 continue;
2395*35238bceSAndroid Build Coastguard Worker 
2396*35238bceSAndroid Build Coastguard Worker             if (glu::isCompressedFormat(dstFormat) && !tcu::isAstcFormat(glu::mapGLCompressedTexFormat(dstFormat)) &&
2397*35238bceSAndroid Build Coastguard Worker                 dstIs3D)
2398*35238bceSAndroid Build Coastguard Worker                 continue;
2399*35238bceSAndroid Build Coastguard Worker 
2400*35238bceSAndroid Build Coastguard Worker             const string targetTestName = string(targetToName(srcTarget)) + "_to_" + targetToName(dstTarget);
2401*35238bceSAndroid Build Coastguard Worker 
2402*35238bceSAndroid Build Coastguard Worker             // Compressed formats require more space to fit all block size combinations.
2403*35238bceSAndroid Build Coastguard Worker             const bool isCompressedCase = glu::isCompressedFormat(srcFormat) || glu::isCompressedFormat(dstFormat);
2404*35238bceSAndroid Build Coastguard Worker             const IVec3 targetSize      = isCompressedCase ? IVec3(128, 128, 16) : IVec3(64, 64, 8);
2405*35238bceSAndroid Build Coastguard Worker             const IVec3 srcSize         = getTestedSize(srcTarget, srcFormat, targetSize);
2406*35238bceSAndroid Build Coastguard Worker             const IVec3 dstSize         = getTestedSize(dstTarget, dstFormat, targetSize);
2407*35238bceSAndroid Build Coastguard Worker 
2408*35238bceSAndroid Build Coastguard Worker             group->addChild(new CopyImageTest(root->getContext(), ImageInfo(srcFormat, srcTarget, srcSize),
2409*35238bceSAndroid Build Coastguard Worker                                               ImageInfo(dstFormat, dstTarget, dstSize), targetTestName.c_str(),
2410*35238bceSAndroid Build Coastguard Worker                                               targetTestName.c_str()));
2411*35238bceSAndroid Build Coastguard Worker         }
2412*35238bceSAndroid Build Coastguard Worker     }
2413*35238bceSAndroid Build Coastguard Worker }
2414*35238bceSAndroid Build Coastguard Worker 
init(void)2415*35238bceSAndroid Build Coastguard Worker void CopyImageTests::init(void)
2416*35238bceSAndroid Build Coastguard Worker {
2417*35238bceSAndroid Build Coastguard Worker     map<ViewClass, vector<uint32_t>> textureFormatViewClasses;
2418*35238bceSAndroid Build Coastguard Worker     map<ViewClass, vector<uint32_t>> compressedTextureFormatViewClasses;
2419*35238bceSAndroid Build Coastguard Worker     map<ViewClass, pair<vector<uint32_t>, vector<uint32_t>>> mixedViewClasses;
2420*35238bceSAndroid Build Coastguard Worker 
2421*35238bceSAndroid Build Coastguard Worker     // Texture view classes
2422*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_128_BITS] = vector<uint32_t>();
2423*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_96_BITS]  = vector<uint32_t>();
2424*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_64_BITS]  = vector<uint32_t>();
2425*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_48_BITS]  = vector<uint32_t>();
2426*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS]  = vector<uint32_t>();
2427*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_24_BITS]  = vector<uint32_t>();
2428*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_16_BITS]  = vector<uint32_t>();
2429*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_8_BITS]   = vector<uint32_t>();
2430*35238bceSAndroid Build Coastguard Worker 
2431*35238bceSAndroid Build Coastguard Worker     // 128bit / VIEWCLASS_128_BITS
2432*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32F);
2433*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32I);
2434*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32UI);
2435*35238bceSAndroid Build Coastguard Worker 
2436*35238bceSAndroid Build Coastguard Worker     // 96bit / VIEWCLASS_96_BITS
2437*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32F);
2438*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32I);
2439*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32UI);
2440*35238bceSAndroid Build Coastguard Worker 
2441*35238bceSAndroid Build Coastguard Worker     // 64bit / VIEWCLASS_64_BITS
2442*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32F);
2443*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32I);
2444*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32UI);
2445*35238bceSAndroid Build Coastguard Worker 
2446*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16F);
2447*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16I);
2448*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16UI);
2449*35238bceSAndroid Build Coastguard Worker 
2450*35238bceSAndroid Build Coastguard Worker     // 48bit / VIEWCLASS_48_BITS
2451*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16F);
2452*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16I);
2453*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16UI);
2454*35238bceSAndroid Build Coastguard Worker 
2455*35238bceSAndroid Build Coastguard Worker     // 32bit / VIEWCLASS_32_BITS
2456*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32F);
2457*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32I);
2458*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32UI);
2459*35238bceSAndroid Build Coastguard Worker 
2460*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16F);
2461*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16I);
2462*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16UI);
2463*35238bceSAndroid Build Coastguard Worker 
2464*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8);
2465*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8I);
2466*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8UI);
2467*35238bceSAndroid Build Coastguard Worker 
2468*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R11F_G11F_B10F);
2469*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB10_A2UI);
2470*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB10_A2);
2471*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8_SNORM);
2472*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_SRGB8_ALPHA8);
2473*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB9_E5);
2474*35238bceSAndroid Build Coastguard Worker 
2475*35238bceSAndroid Build Coastguard Worker     // 24bit / VIEWCLASS_24_BITS
2476*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8);
2477*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8I);
2478*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8UI);
2479*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8_SNORM);
2480*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_SRGB8);
2481*35238bceSAndroid Build Coastguard Worker 
2482*35238bceSAndroid Build Coastguard Worker     // 16bit / VIEWCLASS_16_BITS
2483*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16F);
2484*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16I);
2485*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16UI);
2486*35238bceSAndroid Build Coastguard Worker 
2487*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8);
2488*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8I);
2489*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8UI);
2490*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8_SNORM);
2491*35238bceSAndroid Build Coastguard Worker 
2492*35238bceSAndroid Build Coastguard Worker     // 8bit / VIEWCLASS_8_BITS
2493*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8);
2494*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8I);
2495*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8UI);
2496*35238bceSAndroid Build Coastguard Worker     textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8_SNORM);
2497*35238bceSAndroid Build Coastguard Worker 
2498*35238bceSAndroid Build Coastguard Worker     // Compressed texture view classes
2499*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11]         = vector<uint32_t>();
2500*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11]        = vector<uint32_t>();
2501*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB]        = vector<uint32_t>();
2502*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA]       = vector<uint32_t>();
2503*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA]   = vector<uint32_t>();
2504*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA]   = vector<uint32_t>();
2505*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA]   = vector<uint32_t>();
2506*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA]   = vector<uint32_t>();
2507*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA]   = vector<uint32_t>();
2508*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA]   = vector<uint32_t>();
2509*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA]   = vector<uint32_t>();
2510*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA]   = vector<uint32_t>();
2511*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA]   = vector<uint32_t>();
2512*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA]  = vector<uint32_t>();
2513*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA]  = vector<uint32_t>();
2514*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA]  = vector<uint32_t>();
2515*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA] = vector<uint32_t>();
2516*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA] = vector<uint32_t>();
2517*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA] = vector<uint32_t>();
2518*35238bceSAndroid Build Coastguard Worker 
2519*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_EAC_R11
2520*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11].push_back(GL_COMPRESSED_R11_EAC);
2521*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11].push_back(GL_COMPRESSED_SIGNED_R11_EAC);
2522*35238bceSAndroid Build Coastguard Worker 
2523*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_EAC_RG11
2524*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11].push_back(GL_COMPRESSED_RG11_EAC);
2525*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11].push_back(GL_COMPRESSED_SIGNED_RG11_EAC);
2526*35238bceSAndroid Build Coastguard Worker 
2527*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ETC2_RGB
2528*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB].push_back(GL_COMPRESSED_RGB8_ETC2);
2529*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB].push_back(GL_COMPRESSED_SRGB8_ETC2);
2530*35238bceSAndroid Build Coastguard Worker 
2531*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ETC2_RGBA
2532*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA].push_back(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2);
2533*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA].push_back(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2);
2534*35238bceSAndroid Build Coastguard Worker 
2535*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ETC2_EAC_RGBA
2536*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA].push_back(GL_COMPRESSED_RGBA8_ETC2_EAC);
2537*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC);
2538*35238bceSAndroid Build Coastguard Worker 
2539*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_4x4_RGBA
2540*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_4x4);
2541*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4);
2542*35238bceSAndroid Build Coastguard Worker 
2543*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_5x4_RGBA
2544*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_5x4);
2545*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4);
2546*35238bceSAndroid Build Coastguard Worker 
2547*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_5x5_RGBA
2548*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_5x5);
2549*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5);
2550*35238bceSAndroid Build Coastguard Worker 
2551*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_6x5_RGBA
2552*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_6x5);
2553*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5);
2554*35238bceSAndroid Build Coastguard Worker 
2555*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_6x6_RGBA
2556*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_6x6);
2557*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6);
2558*35238bceSAndroid Build Coastguard Worker 
2559*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_8x5_RGBA
2560*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x5);
2561*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5);
2562*35238bceSAndroid Build Coastguard Worker 
2563*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_8x6_RGBA
2564*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x6);
2565*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6);
2566*35238bceSAndroid Build Coastguard Worker 
2567*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_8x8_RGBA
2568*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x8);
2569*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8);
2570*35238bceSAndroid Build Coastguard Worker 
2571*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_10x5_RGBA
2572*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x5);
2573*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5);
2574*35238bceSAndroid Build Coastguard Worker 
2575*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_10x6_RGBA
2576*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x6);
2577*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6);
2578*35238bceSAndroid Build Coastguard Worker 
2579*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_10x8_RGBA
2580*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x8);
2581*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8);
2582*35238bceSAndroid Build Coastguard Worker 
2583*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_10x10_RGBA
2584*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x10);
2585*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10);
2586*35238bceSAndroid Build Coastguard Worker 
2587*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_12x10_RGBA
2588*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_12x10);
2589*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10);
2590*35238bceSAndroid Build Coastguard Worker 
2591*35238bceSAndroid Build Coastguard Worker     // VIEWCLASS_ASTC_12x12_RGBA
2592*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_12x12);
2593*35238bceSAndroid Build Coastguard Worker     compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12);
2594*35238bceSAndroid Build Coastguard Worker 
2595*35238bceSAndroid Build Coastguard Worker     // Mixed view classes
2596*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS] = pair<vector<uint32_t>, vector<uint32_t>>();
2597*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS]  = pair<vector<uint32_t>, vector<uint32_t>>();
2598*35238bceSAndroid Build Coastguard Worker 
2599*35238bceSAndroid Build Coastguard Worker     // 128 bits
2600*35238bceSAndroid Build Coastguard Worker 
2601*35238bceSAndroid Build Coastguard Worker     // Non compressed
2602*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32F);
2603*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32UI);
2604*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32I);
2605*35238bceSAndroid Build Coastguard Worker 
2606*35238bceSAndroid Build Coastguard Worker     // Compressed
2607*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA8_ETC2_EAC);
2608*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC);
2609*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RG11_EAC);
2610*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SIGNED_RG11_EAC);
2611*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_4x4);
2612*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_5x4);
2613*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_5x5);
2614*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_6x5);
2615*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_6x6);
2616*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x5);
2617*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x6);
2618*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x8);
2619*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x5);
2620*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x6);
2621*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x8);
2622*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x10);
2623*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_12x10);
2624*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_12x12);
2625*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4);
2626*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4);
2627*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5);
2628*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5);
2629*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6);
2630*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5);
2631*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6);
2632*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8);
2633*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5);
2634*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6);
2635*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8);
2636*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10);
2637*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10);
2638*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12);
2639*35238bceSAndroid Build Coastguard Worker 
2640*35238bceSAndroid Build Coastguard Worker     // 64 bits
2641*35238bceSAndroid Build Coastguard Worker 
2642*35238bceSAndroid Build Coastguard Worker     // Non compressed
2643*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16F);
2644*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16UI);
2645*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16I);
2646*35238bceSAndroid Build Coastguard Worker 
2647*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32F);
2648*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32UI);
2649*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32I);
2650*35238bceSAndroid Build Coastguard Worker 
2651*35238bceSAndroid Build Coastguard Worker     // Compressed
2652*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS].second.push_back(GL_COMPRESSED_R11_EAC);
2653*35238bceSAndroid Build Coastguard Worker     mixedViewClasses[VIEWCLASS_64_BITS].second.push_back(GL_COMPRESSED_SIGNED_R11_EAC);
2654*35238bceSAndroid Build Coastguard Worker 
2655*35238bceSAndroid Build Coastguard Worker     {
2656*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *const nonCompressedGroup =
2657*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(m_context, "non_compressed", "Test copying between textures.");
2658*35238bceSAndroid Build Coastguard Worker         addChild(nonCompressedGroup);
2659*35238bceSAndroid Build Coastguard Worker         for (map<ViewClass, vector<uint32_t>>::const_iterator viewClassIter = textureFormatViewClasses.begin();
2660*35238bceSAndroid Build Coastguard Worker              viewClassIter != textureFormatViewClasses.end(); ++viewClassIter)
2661*35238bceSAndroid Build Coastguard Worker         {
2662*35238bceSAndroid Build Coastguard Worker             const vector<uint32_t> &formats = viewClassIter->second;
2663*35238bceSAndroid Build Coastguard Worker             const ViewClass viewClass       = viewClassIter->first;
2664*35238bceSAndroid Build Coastguard Worker             TestCaseGroup *const viewGroup =
2665*35238bceSAndroid Build Coastguard Worker                 new TestCaseGroup(m_context, viewClassToName(viewClass), viewClassToName(viewClass));
2666*35238bceSAndroid Build Coastguard Worker 
2667*35238bceSAndroid Build Coastguard Worker             nonCompressedGroup->addChild(viewGroup);
2668*35238bceSAndroid Build Coastguard Worker 
2669*35238bceSAndroid Build Coastguard Worker             for (int srcFormatNdx = 0; srcFormatNdx < (int)formats.size(); srcFormatNdx++)
2670*35238bceSAndroid Build Coastguard Worker                 for (int dstFormatNdx = 0; dstFormatNdx < (int)formats.size(); dstFormatNdx++)
2671*35238bceSAndroid Build Coastguard Worker                 {
2672*35238bceSAndroid Build Coastguard Worker                     const uint32_t srcFormat = formats[srcFormatNdx];
2673*35238bceSAndroid Build Coastguard Worker                     const uint32_t dstFormat = formats[dstFormatNdx];
2674*35238bceSAndroid Build Coastguard Worker 
2675*35238bceSAndroid Build Coastguard Worker                     if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat))
2676*35238bceSAndroid Build Coastguard Worker                         continue;
2677*35238bceSAndroid Build Coastguard Worker 
2678*35238bceSAndroid Build Coastguard Worker                     addCopyTests(viewGroup, srcFormat, dstFormat);
2679*35238bceSAndroid Build Coastguard Worker                 }
2680*35238bceSAndroid Build Coastguard Worker         }
2681*35238bceSAndroid Build Coastguard Worker     }
2682*35238bceSAndroid Build Coastguard Worker 
2683*35238bceSAndroid Build Coastguard Worker     // ES only
2684*35238bceSAndroid Build Coastguard Worker     if (!m_isGL45)
2685*35238bceSAndroid Build Coastguard Worker     {
2686*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *const compressedGroup =
2687*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(m_context, "compressed", "Test copying between compressed textures.");
2688*35238bceSAndroid Build Coastguard Worker         addChild(compressedGroup);
2689*35238bceSAndroid Build Coastguard Worker 
2690*35238bceSAndroid Build Coastguard Worker         for (map<ViewClass, vector<uint32_t>>::const_iterator viewClassIter =
2691*35238bceSAndroid Build Coastguard Worker                  compressedTextureFormatViewClasses.begin();
2692*35238bceSAndroid Build Coastguard Worker              viewClassIter != compressedTextureFormatViewClasses.end(); ++viewClassIter)
2693*35238bceSAndroid Build Coastguard Worker         {
2694*35238bceSAndroid Build Coastguard Worker             const vector<uint32_t> &formats = viewClassIter->second;
2695*35238bceSAndroid Build Coastguard Worker             const ViewClass viewClass       = viewClassIter->first;
2696*35238bceSAndroid Build Coastguard Worker             TestCaseGroup *const viewGroup =
2697*35238bceSAndroid Build Coastguard Worker                 new TestCaseGroup(m_context, viewClassToName(viewClass), viewClassToName(viewClass));
2698*35238bceSAndroid Build Coastguard Worker 
2699*35238bceSAndroid Build Coastguard Worker             compressedGroup->addChild(viewGroup);
2700*35238bceSAndroid Build Coastguard Worker 
2701*35238bceSAndroid Build Coastguard Worker             for (int srcFormatNdx = 0; srcFormatNdx < (int)formats.size(); srcFormatNdx++)
2702*35238bceSAndroid Build Coastguard Worker                 for (int dstFormatNdx = 0; dstFormatNdx < (int)formats.size(); dstFormatNdx++)
2703*35238bceSAndroid Build Coastguard Worker                 {
2704*35238bceSAndroid Build Coastguard Worker                     const uint32_t srcFormat = formats[srcFormatNdx];
2705*35238bceSAndroid Build Coastguard Worker                     const uint32_t dstFormat = formats[dstFormatNdx];
2706*35238bceSAndroid Build Coastguard Worker 
2707*35238bceSAndroid Build Coastguard Worker                     if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat))
2708*35238bceSAndroid Build Coastguard Worker                         continue;
2709*35238bceSAndroid Build Coastguard Worker 
2710*35238bceSAndroid Build Coastguard Worker                     addCopyTests(viewGroup, srcFormat, dstFormat);
2711*35238bceSAndroid Build Coastguard Worker                 }
2712*35238bceSAndroid Build Coastguard Worker         }
2713*35238bceSAndroid Build Coastguard Worker     }
2714*35238bceSAndroid Build Coastguard Worker 
2715*35238bceSAndroid Build Coastguard Worker     // ES only
2716*35238bceSAndroid Build Coastguard Worker     if (!m_isGL45)
2717*35238bceSAndroid Build Coastguard Worker     {
2718*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *const mixedGroup =
2719*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(m_context, "mixed", "Test copying between compressed and non-compressed textures.");
2720*35238bceSAndroid Build Coastguard Worker         addChild(mixedGroup);
2721*35238bceSAndroid Build Coastguard Worker 
2722*35238bceSAndroid Build Coastguard Worker         for (map<ViewClass, pair<vector<uint32_t>, vector<uint32_t>>>::const_iterator iter = mixedViewClasses.begin();
2723*35238bceSAndroid Build Coastguard Worker              iter != mixedViewClasses.end(); ++iter)
2724*35238bceSAndroid Build Coastguard Worker         {
2725*35238bceSAndroid Build Coastguard Worker             const ViewClass viewClass      = iter->first;
2726*35238bceSAndroid Build Coastguard Worker             const string viewClassName     = string(viewClassToName(viewClass)) + "_mixed";
2727*35238bceSAndroid Build Coastguard Worker             TestCaseGroup *const viewGroup = new TestCaseGroup(m_context, viewClassName.c_str(), viewClassName.c_str());
2728*35238bceSAndroid Build Coastguard Worker 
2729*35238bceSAndroid Build Coastguard Worker             const vector<uint32_t> nonCompressedFormats = iter->second.first;
2730*35238bceSAndroid Build Coastguard Worker             const vector<uint32_t> compressedFormats    = iter->second.second;
2731*35238bceSAndroid Build Coastguard Worker 
2732*35238bceSAndroid Build Coastguard Worker             mixedGroup->addChild(viewGroup);
2733*35238bceSAndroid Build Coastguard Worker 
2734*35238bceSAndroid Build Coastguard Worker             for (int srcFormatNdx = 0; srcFormatNdx < (int)nonCompressedFormats.size(); srcFormatNdx++)
2735*35238bceSAndroid Build Coastguard Worker                 for (int dstFormatNdx = 0; dstFormatNdx < (int)compressedFormats.size(); dstFormatNdx++)
2736*35238bceSAndroid Build Coastguard Worker                 {
2737*35238bceSAndroid Build Coastguard Worker                     const uint32_t srcFormat = nonCompressedFormats[srcFormatNdx];
2738*35238bceSAndroid Build Coastguard Worker                     const uint32_t dstFormat = compressedFormats[dstFormatNdx];
2739*35238bceSAndroid Build Coastguard Worker 
2740*35238bceSAndroid Build Coastguard Worker                     if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat))
2741*35238bceSAndroid Build Coastguard Worker                         continue;
2742*35238bceSAndroid Build Coastguard Worker 
2743*35238bceSAndroid Build Coastguard Worker                     addCopyTests(viewGroup, srcFormat, dstFormat);
2744*35238bceSAndroid Build Coastguard Worker                     addCopyTests(viewGroup, dstFormat, srcFormat);
2745*35238bceSAndroid Build Coastguard Worker                 }
2746*35238bceSAndroid Build Coastguard Worker         }
2747*35238bceSAndroid Build Coastguard Worker     }
2748*35238bceSAndroid Build Coastguard Worker }
2749*35238bceSAndroid Build Coastguard Worker 
2750*35238bceSAndroid Build Coastguard Worker } // namespace
2751*35238bceSAndroid Build Coastguard Worker 
createCopyImageTests(Context & context,bool is_GL45)2752*35238bceSAndroid Build Coastguard Worker TestCaseGroup *createCopyImageTests(Context &context, bool is_GL45)
2753*35238bceSAndroid Build Coastguard Worker {
2754*35238bceSAndroid Build Coastguard Worker     return new CopyImageTests(context, is_GL45);
2755*35238bceSAndroid Build Coastguard Worker }
2756*35238bceSAndroid Build Coastguard Worker 
2757*35238bceSAndroid Build Coastguard Worker } // namespace Functional
2758*35238bceSAndroid Build Coastguard Worker } // namespace gles31
2759*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2760