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 ©Size)
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 ©Size)
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 ¶ms, 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 © = 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