1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.0 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 Vertex texture tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fVertexTextureTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsTextureTestUtil.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuMatrix.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
34*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "deString.h"
36*35238bceSAndroid Build Coastguard Worker
37*35238bceSAndroid Build Coastguard Worker #include <string>
38*35238bceSAndroid Build Coastguard Worker #include <vector>
39*35238bceSAndroid Build Coastguard Worker
40*35238bceSAndroid Build Coastguard Worker #include <limits>
41*35238bceSAndroid Build Coastguard Worker
42*35238bceSAndroid Build Coastguard Worker #include "glw.h"
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker using std::string;
45*35238bceSAndroid Build Coastguard Worker using std::vector;
46*35238bceSAndroid Build Coastguard Worker using tcu::IVec2;
47*35238bceSAndroid Build Coastguard Worker using tcu::IVec3;
48*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
49*35238bceSAndroid Build Coastguard Worker using tcu::Mat3;
50*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
51*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
52*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
53*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
54*35238bceSAndroid Build Coastguard Worker
55*35238bceSAndroid Build Coastguard Worker namespace deqp
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker using namespace gls::TextureTestUtil;
59*35238bceSAndroid Build Coastguard Worker using namespace glu::TextureTestUtil;
60*35238bceSAndroid Build Coastguard Worker
61*35238bceSAndroid Build Coastguard Worker using glu::TextureTestUtil::TEXTURETYPE_2D;
62*35238bceSAndroid Build Coastguard Worker using glu::TextureTestUtil::TEXTURETYPE_2D_ARRAY;
63*35238bceSAndroid Build Coastguard Worker using glu::TextureTestUtil::TEXTURETYPE_3D;
64*35238bceSAndroid Build Coastguard Worker using glu::TextureTestUtil::TEXTURETYPE_CUBE;
65*35238bceSAndroid Build Coastguard Worker
66*35238bceSAndroid Build Coastguard Worker namespace gles3
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker namespace Functional
69*35238bceSAndroid Build Coastguard Worker {
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard Worker static const int WIDTH_2D_ARRAY = 128;
72*35238bceSAndroid Build Coastguard Worker static const int HEIGHT_2D_ARRAY = 128;
73*35238bceSAndroid Build Coastguard Worker static const int LAYERS_2D_ARRAY = 8;
74*35238bceSAndroid Build Coastguard Worker
75*35238bceSAndroid Build Coastguard Worker static const int WIDTH_3D = 64;
76*35238bceSAndroid Build Coastguard Worker static const int HEIGHT_3D = 64;
77*35238bceSAndroid Build Coastguard Worker static const int DEPTH_3D = 64;
78*35238bceSAndroid Build Coastguard Worker
79*35238bceSAndroid Build Coastguard Worker // The 2D case draws four images.
80*35238bceSAndroid Build Coastguard Worker static const int MAX_2D_RENDER_WIDTH = 128 * 2;
81*35238bceSAndroid Build Coastguard Worker static const int MAX_2D_RENDER_HEIGHT = 128 * 2;
82*35238bceSAndroid Build Coastguard Worker
83*35238bceSAndroid Build Coastguard Worker // The cube map case draws four 3-by-2 image groups.
84*35238bceSAndroid Build Coastguard Worker static const int MAX_CUBE_RENDER_WIDTH = 28 * 2 * 3;
85*35238bceSAndroid Build Coastguard Worker static const int MAX_CUBE_RENDER_HEIGHT = 28 * 2 * 2;
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Worker static const int MAX_2D_ARRAY_RENDER_WIDTH = 128 * 2;
88*35238bceSAndroid Build Coastguard Worker static const int MAX_2D_ARRAY_RENDER_HEIGHT = 128 * 2;
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker static const int MAX_3D_RENDER_WIDTH = 128 * 2;
91*35238bceSAndroid Build Coastguard Worker static const int MAX_3D_RENDER_HEIGHT = 128 * 2;
92*35238bceSAndroid Build Coastguard Worker
93*35238bceSAndroid Build Coastguard Worker static const int GRID_SIZE_2D = 127;
94*35238bceSAndroid Build Coastguard Worker static const int GRID_SIZE_CUBE = 63;
95*35238bceSAndroid Build Coastguard Worker static const int GRID_SIZE_2D_ARRAY = 127;
96*35238bceSAndroid Build Coastguard Worker static const int GRID_SIZE_3D = 127;
97*35238bceSAndroid Build Coastguard Worker
98*35238bceSAndroid Build Coastguard Worker // Helpers for making texture coordinates "safe", i.e. move them further from coordinate bounary.
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker // Moves x towards the closest K+targetFraction, where K is an integer.
101*35238bceSAndroid Build Coastguard Worker // E.g. moveTowardsFraction(x, 0.5f) moves x away from integer boundaries.
moveTowardsFraction(float x,float targetFraction)102*35238bceSAndroid Build Coastguard Worker static inline float moveTowardsFraction(float x, float targetFraction)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker const float strictness = 0.5f;
105*35238bceSAndroid Build Coastguard Worker DE_ASSERT(0.0f < strictness && strictness <= 1.0f);
106*35238bceSAndroid Build Coastguard Worker DE_ASSERT(de::inBounds(targetFraction, 0.0f, 1.0f));
107*35238bceSAndroid Build Coastguard Worker const float y = x + 0.5f - targetFraction;
108*35238bceSAndroid Build Coastguard Worker return deFloatFloor(y) + deFloatFrac(y) * (1.0f - strictness) + strictness * 0.5f - 0.5f + targetFraction;
109*35238bceSAndroid Build Coastguard Worker }
110*35238bceSAndroid Build Coastguard Worker
safeCoord(float raw,int scale,float fraction)111*35238bceSAndroid Build Coastguard Worker static inline float safeCoord(float raw, int scale, float fraction)
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker const float scaleFloat = (float)scale;
114*35238bceSAndroid Build Coastguard Worker return moveTowardsFraction(raw * scaleFloat, fraction) / scaleFloat;
115*35238bceSAndroid Build Coastguard Worker }
116*35238bceSAndroid Build Coastguard Worker
117*35238bceSAndroid Build Coastguard Worker template <int Size>
safeCoords(const tcu::Vector<float,Size> & raw,const tcu::Vector<int,Size> & scale,const tcu::Vector<float,Size> & fraction)118*35238bceSAndroid Build Coastguard Worker static inline tcu::Vector<float, Size> safeCoords(const tcu::Vector<float, Size> &raw,
119*35238bceSAndroid Build Coastguard Worker const tcu::Vector<int, Size> &scale,
120*35238bceSAndroid Build Coastguard Worker const tcu::Vector<float, Size> &fraction)
121*35238bceSAndroid Build Coastguard Worker {
122*35238bceSAndroid Build Coastguard Worker tcu::Vector<float, Size> result;
123*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
124*35238bceSAndroid Build Coastguard Worker result[i] = safeCoord(raw[i], scale[i], fraction[i]);
125*35238bceSAndroid Build Coastguard Worker return result;
126*35238bceSAndroid Build Coastguard Worker }
127*35238bceSAndroid Build Coastguard Worker
safe2DTexCoords(const Vec2 & raw,const IVec2 & textureSize)128*35238bceSAndroid Build Coastguard Worker static inline Vec2 safe2DTexCoords(const Vec2 &raw, const IVec2 &textureSize)
129*35238bceSAndroid Build Coastguard Worker {
130*35238bceSAndroid Build Coastguard Worker return safeCoords(raw, textureSize, Vec2(0.5f));
131*35238bceSAndroid Build Coastguard Worker }
132*35238bceSAndroid Build Coastguard Worker
safe2DArrayTexCoords(const Vec3 & raw,const IVec3 & textureSize)133*35238bceSAndroid Build Coastguard Worker static inline Vec3 safe2DArrayTexCoords(const Vec3 &raw, const IVec3 &textureSize)
134*35238bceSAndroid Build Coastguard Worker {
135*35238bceSAndroid Build Coastguard Worker return safeCoords(raw, textureSize, Vec3(0.5f, 0.5f, 0.0f));
136*35238bceSAndroid Build Coastguard Worker }
137*35238bceSAndroid Build Coastguard Worker
safe3DTexCoords(const Vec3 & raw,const IVec3 & textureSize)138*35238bceSAndroid Build Coastguard Worker static inline Vec3 safe3DTexCoords(const Vec3 &raw, const IVec3 &textureSize)
139*35238bceSAndroid Build Coastguard Worker {
140*35238bceSAndroid Build Coastguard Worker return safeCoords(raw, textureSize, Vec3(0.5f));
141*35238bceSAndroid Build Coastguard Worker }
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker namespace
144*35238bceSAndroid Build Coastguard Worker {
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker struct Rect
147*35238bceSAndroid Build Coastguard Worker {
Rectdeqp::gles3::Functional::__anonf08c39fb0111::Rect148*35238bceSAndroid Build Coastguard Worker Rect(int x_, int y_, int w_, int h_) : x(x_), y(y_), w(w_), h(h_)
149*35238bceSAndroid Build Coastguard Worker {
150*35238bceSAndroid Build Coastguard Worker }
posdeqp::gles3::Functional::__anonf08c39fb0111::Rect151*35238bceSAndroid Build Coastguard Worker IVec2 pos(void) const
152*35238bceSAndroid Build Coastguard Worker {
153*35238bceSAndroid Build Coastguard Worker return IVec2(x, y);
154*35238bceSAndroid Build Coastguard Worker }
sizedeqp::gles3::Functional::__anonf08c39fb0111::Rect155*35238bceSAndroid Build Coastguard Worker IVec2 size(void) const
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker return IVec2(w, h);
158*35238bceSAndroid Build Coastguard Worker }
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker int x;
161*35238bceSAndroid Build Coastguard Worker int y;
162*35238bceSAndroid Build Coastguard Worker int w;
163*35238bceSAndroid Build Coastguard Worker int h;
164*35238bceSAndroid Build Coastguard Worker };
165*35238bceSAndroid Build Coastguard Worker
166*35238bceSAndroid Build Coastguard Worker template <TextureType>
167*35238bceSAndroid Build Coastguard Worker struct TexTypeTcuClass;
168*35238bceSAndroid Build Coastguard Worker template <>
169*35238bceSAndroid Build Coastguard Worker struct TexTypeTcuClass<TEXTURETYPE_2D>
170*35238bceSAndroid Build Coastguard Worker {
171*35238bceSAndroid Build Coastguard Worker typedef tcu::Texture2D t;
172*35238bceSAndroid Build Coastguard Worker };
173*35238bceSAndroid Build Coastguard Worker template <>
174*35238bceSAndroid Build Coastguard Worker struct TexTypeTcuClass<TEXTURETYPE_CUBE>
175*35238bceSAndroid Build Coastguard Worker {
176*35238bceSAndroid Build Coastguard Worker typedef tcu::TextureCube t;
177*35238bceSAndroid Build Coastguard Worker };
178*35238bceSAndroid Build Coastguard Worker template <>
179*35238bceSAndroid Build Coastguard Worker struct TexTypeTcuClass<TEXTURETYPE_2D_ARRAY>
180*35238bceSAndroid Build Coastguard Worker {
181*35238bceSAndroid Build Coastguard Worker typedef tcu::Texture2DArray t;
182*35238bceSAndroid Build Coastguard Worker };
183*35238bceSAndroid Build Coastguard Worker template <>
184*35238bceSAndroid Build Coastguard Worker struct TexTypeTcuClass<TEXTURETYPE_3D>
185*35238bceSAndroid Build Coastguard Worker {
186*35238bceSAndroid Build Coastguard Worker typedef tcu::Texture3D t;
187*35238bceSAndroid Build Coastguard Worker };
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard Worker template <TextureType>
190*35238bceSAndroid Build Coastguard Worker struct TexTypeSizeDims;
191*35238bceSAndroid Build Coastguard Worker template <>
192*35238bceSAndroid Build Coastguard Worker struct TexTypeSizeDims<TEXTURETYPE_2D>
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker enum
195*35238bceSAndroid Build Coastguard Worker {
196*35238bceSAndroid Build Coastguard Worker V = 2
197*35238bceSAndroid Build Coastguard Worker };
198*35238bceSAndroid Build Coastguard Worker };
199*35238bceSAndroid Build Coastguard Worker template <>
200*35238bceSAndroid Build Coastguard Worker struct TexTypeSizeDims<TEXTURETYPE_CUBE>
201*35238bceSAndroid Build Coastguard Worker {
202*35238bceSAndroid Build Coastguard Worker enum
203*35238bceSAndroid Build Coastguard Worker {
204*35238bceSAndroid Build Coastguard Worker V = 2
205*35238bceSAndroid Build Coastguard Worker };
206*35238bceSAndroid Build Coastguard Worker };
207*35238bceSAndroid Build Coastguard Worker template <>
208*35238bceSAndroid Build Coastguard Worker struct TexTypeSizeDims<TEXTURETYPE_2D_ARRAY>
209*35238bceSAndroid Build Coastguard Worker {
210*35238bceSAndroid Build Coastguard Worker enum
211*35238bceSAndroid Build Coastguard Worker {
212*35238bceSAndroid Build Coastguard Worker V = 3
213*35238bceSAndroid Build Coastguard Worker };
214*35238bceSAndroid Build Coastguard Worker };
215*35238bceSAndroid Build Coastguard Worker template <>
216*35238bceSAndroid Build Coastguard Worker struct TexTypeSizeDims<TEXTURETYPE_3D>
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker enum
219*35238bceSAndroid Build Coastguard Worker {
220*35238bceSAndroid Build Coastguard Worker V = 3
221*35238bceSAndroid Build Coastguard Worker };
222*35238bceSAndroid Build Coastguard Worker };
223*35238bceSAndroid Build Coastguard Worker
224*35238bceSAndroid Build Coastguard Worker template <TextureType>
225*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordDims;
226*35238bceSAndroid Build Coastguard Worker template <>
227*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordDims<TEXTURETYPE_2D>
228*35238bceSAndroid Build Coastguard Worker {
229*35238bceSAndroid Build Coastguard Worker enum
230*35238bceSAndroid Build Coastguard Worker {
231*35238bceSAndroid Build Coastguard Worker V = 2
232*35238bceSAndroid Build Coastguard Worker };
233*35238bceSAndroid Build Coastguard Worker };
234*35238bceSAndroid Build Coastguard Worker template <>
235*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordDims<TEXTURETYPE_CUBE>
236*35238bceSAndroid Build Coastguard Worker {
237*35238bceSAndroid Build Coastguard Worker enum
238*35238bceSAndroid Build Coastguard Worker {
239*35238bceSAndroid Build Coastguard Worker V = 3
240*35238bceSAndroid Build Coastguard Worker };
241*35238bceSAndroid Build Coastguard Worker };
242*35238bceSAndroid Build Coastguard Worker template <>
243*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordDims<TEXTURETYPE_2D_ARRAY>
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker enum
246*35238bceSAndroid Build Coastguard Worker {
247*35238bceSAndroid Build Coastguard Worker V = 3
248*35238bceSAndroid Build Coastguard Worker };
249*35238bceSAndroid Build Coastguard Worker };
250*35238bceSAndroid Build Coastguard Worker template <>
251*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordDims<TEXTURETYPE_3D>
252*35238bceSAndroid Build Coastguard Worker {
253*35238bceSAndroid Build Coastguard Worker enum
254*35238bceSAndroid Build Coastguard Worker {
255*35238bceSAndroid Build Coastguard Worker V = 3
256*35238bceSAndroid Build Coastguard Worker };
257*35238bceSAndroid Build Coastguard Worker };
258*35238bceSAndroid Build Coastguard Worker
259*35238bceSAndroid Build Coastguard Worker template <TextureType TexType>
260*35238bceSAndroid Build Coastguard Worker struct TexTypeSizeIVec
261*35238bceSAndroid Build Coastguard Worker {
262*35238bceSAndroid Build Coastguard Worker typedef tcu::Vector<int, TexTypeSizeDims<TexType>::V> t;
263*35238bceSAndroid Build Coastguard Worker };
264*35238bceSAndroid Build Coastguard Worker template <TextureType TexType>
265*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordVec
266*35238bceSAndroid Build Coastguard Worker {
267*35238bceSAndroid Build Coastguard Worker typedef tcu::Vector<float, TexTypeCoordDims<TexType>::V> t;
268*35238bceSAndroid Build Coastguard Worker };
269*35238bceSAndroid Build Coastguard Worker
270*35238bceSAndroid Build Coastguard Worker template <TextureType>
271*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordParams;
272*35238bceSAndroid Build Coastguard Worker
273*35238bceSAndroid Build Coastguard Worker template <>
274*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordParams<TEXTURETYPE_2D>
275*35238bceSAndroid Build Coastguard Worker {
276*35238bceSAndroid Build Coastguard Worker Vec2 scale;
277*35238bceSAndroid Build Coastguard Worker Vec2 bias;
278*35238bceSAndroid Build Coastguard Worker
TexTypeCoordParamsdeqp::gles3::Functional::__anonf08c39fb0111::TexTypeCoordParams279*35238bceSAndroid Build Coastguard Worker TexTypeCoordParams(const Vec2 &scale_, const Vec2 &bias_) : scale(scale_), bias(bias_)
280*35238bceSAndroid Build Coastguard Worker {
281*35238bceSAndroid Build Coastguard Worker }
282*35238bceSAndroid Build Coastguard Worker };
283*35238bceSAndroid Build Coastguard Worker
284*35238bceSAndroid Build Coastguard Worker template <>
285*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordParams<TEXTURETYPE_CUBE>
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker Vec2 scale;
288*35238bceSAndroid Build Coastguard Worker Vec2 bias;
289*35238bceSAndroid Build Coastguard Worker tcu::CubeFace face;
290*35238bceSAndroid Build Coastguard Worker
TexTypeCoordParamsdeqp::gles3::Functional::__anonf08c39fb0111::TexTypeCoordParams291*35238bceSAndroid Build Coastguard Worker TexTypeCoordParams(const Vec2 &scale_, const Vec2 &bias_, tcu::CubeFace face_)
292*35238bceSAndroid Build Coastguard Worker : scale(scale_)
293*35238bceSAndroid Build Coastguard Worker , bias(bias_)
294*35238bceSAndroid Build Coastguard Worker , face(face_)
295*35238bceSAndroid Build Coastguard Worker {
296*35238bceSAndroid Build Coastguard Worker }
297*35238bceSAndroid Build Coastguard Worker };
298*35238bceSAndroid Build Coastguard Worker
299*35238bceSAndroid Build Coastguard Worker template <>
300*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordParams<TEXTURETYPE_2D_ARRAY>
301*35238bceSAndroid Build Coastguard Worker {
302*35238bceSAndroid Build Coastguard Worker Mat3 transform;
303*35238bceSAndroid Build Coastguard Worker
TexTypeCoordParamsdeqp::gles3::Functional::__anonf08c39fb0111::TexTypeCoordParams304*35238bceSAndroid Build Coastguard Worker TexTypeCoordParams(const Mat3 &transform_) : transform(transform_)
305*35238bceSAndroid Build Coastguard Worker {
306*35238bceSAndroid Build Coastguard Worker }
307*35238bceSAndroid Build Coastguard Worker };
308*35238bceSAndroid Build Coastguard Worker
309*35238bceSAndroid Build Coastguard Worker template <>
310*35238bceSAndroid Build Coastguard Worker struct TexTypeCoordParams<TEXTURETYPE_3D>
311*35238bceSAndroid Build Coastguard Worker {
312*35238bceSAndroid Build Coastguard Worker Mat3 transform;
313*35238bceSAndroid Build Coastguard Worker
TexTypeCoordParamsdeqp::gles3::Functional::__anonf08c39fb0111::TexTypeCoordParams314*35238bceSAndroid Build Coastguard Worker TexTypeCoordParams(const Mat3 &transform_) : transform(transform_)
315*35238bceSAndroid Build Coastguard Worker {
316*35238bceSAndroid Build Coastguard Worker }
317*35238bceSAndroid Build Coastguard Worker };
318*35238bceSAndroid Build Coastguard Worker
319*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
320*35238bceSAndroid Build Coastguard Worker * \brief Quad grid class containing position and texture coordinate data.
321*35238bceSAndroid Build Coastguard Worker *
322*35238bceSAndroid Build Coastguard Worker * A quad grid of size S means a grid consisting of S*S quads (S rows and
323*35238bceSAndroid Build Coastguard Worker * S columns). The quads are rectangles with main axis aligned sides, and
324*35238bceSAndroid Build Coastguard Worker * each consists of two triangles. Note that although there are only
325*35238bceSAndroid Build Coastguard Worker * (S+1)*(S+1) distinct vertex positions, there are S*S*4 distinct vertices
326*35238bceSAndroid Build Coastguard Worker * because we want texture coordinates to be constant across the vertices
327*35238bceSAndroid Build Coastguard Worker * of a quad (to avoid interpolation issues), and thus each quad needs its
328*35238bceSAndroid Build Coastguard Worker * own 4 vertices.
329*35238bceSAndroid Build Coastguard Worker *
330*35238bceSAndroid Build Coastguard Worker * Pointers returned by get*Ptr() are suitable for gl calls such as
331*35238bceSAndroid Build Coastguard Worker * glVertexAttribPointer() (for position and tex coord) or glDrawElements()
332*35238bceSAndroid Build Coastguard Worker * (for indices).
333*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
334*35238bceSAndroid Build Coastguard Worker template <TextureType TexType>
335*35238bceSAndroid Build Coastguard Worker class PosTexCoordQuadGrid
336*35238bceSAndroid Build Coastguard Worker {
337*35238bceSAndroid Build Coastguard Worker private:
338*35238bceSAndroid Build Coastguard Worker enum
339*35238bceSAndroid Build Coastguard Worker {
340*35238bceSAndroid Build Coastguard Worker TEX_COORD_DIMS = TexTypeCoordDims<TexType>::V
341*35238bceSAndroid Build Coastguard Worker };
342*35238bceSAndroid Build Coastguard Worker typedef typename TexTypeCoordVec<TexType>::t TexCoordVec;
343*35238bceSAndroid Build Coastguard Worker typedef typename TexTypeSizeIVec<TexType>::t TexSizeIVec;
344*35238bceSAndroid Build Coastguard Worker typedef TexTypeCoordParams<TexType> TexCoordParams;
345*35238bceSAndroid Build Coastguard Worker
346*35238bceSAndroid Build Coastguard Worker public:
347*35238bceSAndroid Build Coastguard Worker PosTexCoordQuadGrid(int gridSize, const IVec2 &renderSize, const TexSizeIVec &textureSize,
348*35238bceSAndroid Build Coastguard Worker const TexCoordParams &texCoordParams, bool useSafeTexCoords);
349*35238bceSAndroid Build Coastguard Worker
getSize(void) const350*35238bceSAndroid Build Coastguard Worker int getSize(void) const
351*35238bceSAndroid Build Coastguard Worker {
352*35238bceSAndroid Build Coastguard Worker return m_gridSize;
353*35238bceSAndroid Build Coastguard Worker }
354*35238bceSAndroid Build Coastguard Worker Vec4 getQuadLDRU(int col, int row) const; //!< Vec4(leftX, downY, rightX, upY)
355*35238bceSAndroid Build Coastguard Worker const TexCoordVec &getQuadTexCoord(int col, int row) const;
356*35238bceSAndroid Build Coastguard Worker
getNumIndices(void) const357*35238bceSAndroid Build Coastguard Worker int getNumIndices(void) const
358*35238bceSAndroid Build Coastguard Worker {
359*35238bceSAndroid Build Coastguard Worker return m_gridSize * m_gridSize * 3 * 2;
360*35238bceSAndroid Build Coastguard Worker }
getPositionPtr(void) const361*35238bceSAndroid Build Coastguard Worker const float *getPositionPtr(void) const
362*35238bceSAndroid Build Coastguard Worker {
363*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(Vec2) == 2 * sizeof(float));
364*35238bceSAndroid Build Coastguard Worker return (float *)&m_positions[0];
365*35238bceSAndroid Build Coastguard Worker }
getTexCoordPtr(void) const366*35238bceSAndroid Build Coastguard Worker const float *getTexCoordPtr(void) const
367*35238bceSAndroid Build Coastguard Worker {
368*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(TexCoordVec) == TEX_COORD_DIMS * (int)sizeof(float));
369*35238bceSAndroid Build Coastguard Worker return (float *)&m_texCoords[0];
370*35238bceSAndroid Build Coastguard Worker }
getIndexPtr(void) const371*35238bceSAndroid Build Coastguard Worker const uint16_t *getIndexPtr(void) const
372*35238bceSAndroid Build Coastguard Worker {
373*35238bceSAndroid Build Coastguard Worker return &m_indices[0];
374*35238bceSAndroid Build Coastguard Worker }
375*35238bceSAndroid Build Coastguard Worker
376*35238bceSAndroid Build Coastguard Worker private:
377*35238bceSAndroid Build Coastguard Worker void initializeTexCoords(const TexSizeIVec &textureSize, const TexCoordParams &texCoordParams,
378*35238bceSAndroid Build Coastguard Worker bool useSafeTexCoords);
379*35238bceSAndroid Build Coastguard Worker
380*35238bceSAndroid Build Coastguard Worker const int m_gridSize;
381*35238bceSAndroid Build Coastguard Worker vector<Vec2> m_positions;
382*35238bceSAndroid Build Coastguard Worker vector<TexCoordVec> m_texCoords;
383*35238bceSAndroid Build Coastguard Worker vector<uint16_t> m_indices;
384*35238bceSAndroid Build Coastguard Worker };
385*35238bceSAndroid Build Coastguard Worker
386*35238bceSAndroid Build Coastguard Worker template <TextureType TexType>
getQuadLDRU(int col,int row) const387*35238bceSAndroid Build Coastguard Worker Vec4 PosTexCoordQuadGrid<TexType>::getQuadLDRU(int col, int row) const
388*35238bceSAndroid Build Coastguard Worker {
389*35238bceSAndroid Build Coastguard Worker int ndx00 = (row * m_gridSize + col) * 4;
390*35238bceSAndroid Build Coastguard Worker int ndx11 = ndx00 + 3;
391*35238bceSAndroid Build Coastguard Worker
392*35238bceSAndroid Build Coastguard Worker return Vec4(m_positions[ndx00].x(), m_positions[ndx00].y(), m_positions[ndx11].x(), m_positions[ndx11].y());
393*35238bceSAndroid Build Coastguard Worker }
394*35238bceSAndroid Build Coastguard Worker
395*35238bceSAndroid Build Coastguard Worker template <TextureType TexType>
getQuadTexCoord(int col,int row) const396*35238bceSAndroid Build Coastguard Worker const typename TexTypeCoordVec<TexType>::t &PosTexCoordQuadGrid<TexType>::getQuadTexCoord(int col, int row) const
397*35238bceSAndroid Build Coastguard Worker {
398*35238bceSAndroid Build Coastguard Worker return m_texCoords[(row * m_gridSize + col) * 4];
399*35238bceSAndroid Build Coastguard Worker }
400*35238bceSAndroid Build Coastguard Worker
401*35238bceSAndroid Build Coastguard Worker template <TextureType TexType>
PosTexCoordQuadGrid(int gridSize,const IVec2 & renderSize,const TexSizeIVec & textureSize,const TexCoordParams & texCoordParams,bool useSafeTexCoords)402*35238bceSAndroid Build Coastguard Worker PosTexCoordQuadGrid<TexType>::PosTexCoordQuadGrid(int gridSize, const IVec2 &renderSize, const TexSizeIVec &textureSize,
403*35238bceSAndroid Build Coastguard Worker const TexCoordParams &texCoordParams, bool useSafeTexCoords)
404*35238bceSAndroid Build Coastguard Worker : m_gridSize(gridSize)
405*35238bceSAndroid Build Coastguard Worker {
406*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_gridSize > 0 && m_gridSize * m_gridSize <= (int)std::numeric_limits<uint16_t>::max() + 1);
407*35238bceSAndroid Build Coastguard Worker
408*35238bceSAndroid Build Coastguard Worker const float gridSizeFloat = (float)m_gridSize;
409*35238bceSAndroid Build Coastguard Worker
410*35238bceSAndroid Build Coastguard Worker m_positions.reserve(m_gridSize * m_gridSize * 4);
411*35238bceSAndroid Build Coastguard Worker m_indices.reserve(m_gridSize * m_gridSize * 3 * 2);
412*35238bceSAndroid Build Coastguard Worker
413*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < m_gridSize; y++)
414*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < m_gridSize; x++)
415*35238bceSAndroid Build Coastguard Worker {
416*35238bceSAndroid Build Coastguard Worker float fx0 = (float)(x + 0) / gridSizeFloat;
417*35238bceSAndroid Build Coastguard Worker float fx1 = (float)(x + 1) / gridSizeFloat;
418*35238bceSAndroid Build Coastguard Worker float fy0 = (float)(y + 0) / gridSizeFloat;
419*35238bceSAndroid Build Coastguard Worker float fy1 = (float)(y + 1) / gridSizeFloat;
420*35238bceSAndroid Build Coastguard Worker
421*35238bceSAndroid Build Coastguard Worker Vec2 quadVertices[4] = {Vec2(fx0, fy0), Vec2(fx1, fy0), Vec2(fx0, fy1), Vec2(fx1, fy1)};
422*35238bceSAndroid Build Coastguard Worker
423*35238bceSAndroid Build Coastguard Worker int firstNdx = (int)m_positions.size();
424*35238bceSAndroid Build Coastguard Worker
425*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < DE_LENGTH_OF_ARRAY(quadVertices); i++)
426*35238bceSAndroid Build Coastguard Worker m_positions.push_back(safeCoords(quadVertices[i], renderSize, Vec2(0.0f)) * 2.0f - 1.0f);
427*35238bceSAndroid Build Coastguard Worker
428*35238bceSAndroid Build Coastguard Worker m_indices.push_back(uint16_t(firstNdx + 0));
429*35238bceSAndroid Build Coastguard Worker m_indices.push_back(uint16_t(firstNdx + 1));
430*35238bceSAndroid Build Coastguard Worker m_indices.push_back(uint16_t(firstNdx + 2));
431*35238bceSAndroid Build Coastguard Worker
432*35238bceSAndroid Build Coastguard Worker m_indices.push_back(uint16_t(firstNdx + 1));
433*35238bceSAndroid Build Coastguard Worker m_indices.push_back(uint16_t(firstNdx + 3));
434*35238bceSAndroid Build Coastguard Worker m_indices.push_back(uint16_t(firstNdx + 2));
435*35238bceSAndroid Build Coastguard Worker }
436*35238bceSAndroid Build Coastguard Worker
437*35238bceSAndroid Build Coastguard Worker m_texCoords.reserve(m_gridSize * m_gridSize * 4);
438*35238bceSAndroid Build Coastguard Worker initializeTexCoords(textureSize, texCoordParams, useSafeTexCoords);
439*35238bceSAndroid Build Coastguard Worker
440*35238bceSAndroid Build Coastguard Worker DE_ASSERT((int)m_positions.size() == m_gridSize * m_gridSize * 4);
441*35238bceSAndroid Build Coastguard Worker DE_ASSERT((int)m_indices.size() == m_gridSize * m_gridSize * 3 * 2);
442*35238bceSAndroid Build Coastguard Worker DE_ASSERT((int)m_texCoords.size() == m_gridSize * m_gridSize * 4);
443*35238bceSAndroid Build Coastguard Worker }
444*35238bceSAndroid Build Coastguard Worker
445*35238bceSAndroid Build Coastguard Worker template <>
initializeTexCoords(const IVec2 & textureSize,const TexCoordParams & texCoordParams,bool useSafeTexCoords)446*35238bceSAndroid Build Coastguard Worker void PosTexCoordQuadGrid<TEXTURETYPE_2D>::initializeTexCoords(const IVec2 &textureSize,
447*35238bceSAndroid Build Coastguard Worker const TexCoordParams &texCoordParams,
448*35238bceSAndroid Build Coastguard Worker bool useSafeTexCoords)
449*35238bceSAndroid Build Coastguard Worker {
450*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_texCoords.empty());
451*35238bceSAndroid Build Coastguard Worker
452*35238bceSAndroid Build Coastguard Worker const float gridSizeFloat = (float)m_gridSize;
453*35238bceSAndroid Build Coastguard Worker
454*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < m_gridSize; y++)
455*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < m_gridSize; x++)
456*35238bceSAndroid Build Coastguard Worker {
457*35238bceSAndroid Build Coastguard Worker Vec2 rawCoord =
458*35238bceSAndroid Build Coastguard Worker Vec2((float)x / gridSizeFloat, (float)y / gridSizeFloat) * texCoordParams.scale + texCoordParams.bias;
459*35238bceSAndroid Build Coastguard Worker
460*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
461*35238bceSAndroid Build Coastguard Worker m_texCoords.push_back(useSafeTexCoords ? safe2DTexCoords(rawCoord, textureSize) : rawCoord);
462*35238bceSAndroid Build Coastguard Worker }
463*35238bceSAndroid Build Coastguard Worker }
464*35238bceSAndroid Build Coastguard Worker
465*35238bceSAndroid Build Coastguard Worker template <>
initializeTexCoords(const IVec2 & textureSize,const TexCoordParams & texCoordParams,bool useSafeTexCoords)466*35238bceSAndroid Build Coastguard Worker void PosTexCoordQuadGrid<TEXTURETYPE_CUBE>::initializeTexCoords(const IVec2 &textureSize,
467*35238bceSAndroid Build Coastguard Worker const TexCoordParams &texCoordParams,
468*35238bceSAndroid Build Coastguard Worker bool useSafeTexCoords)
469*35238bceSAndroid Build Coastguard Worker {
470*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_texCoords.empty());
471*35238bceSAndroid Build Coastguard Worker
472*35238bceSAndroid Build Coastguard Worker const float gridSizeFloat = (float)m_gridSize;
473*35238bceSAndroid Build Coastguard Worker vector<float> texBoundaries;
474*35238bceSAndroid Build Coastguard Worker computeQuadTexCoordCube(texBoundaries, texCoordParams.face);
475*35238bceSAndroid Build Coastguard Worker const Vec3 coordA = Vec3(texBoundaries[0], texBoundaries[1], texBoundaries[2]);
476*35238bceSAndroid Build Coastguard Worker const Vec3 coordB = Vec3(texBoundaries[3], texBoundaries[4], texBoundaries[5]);
477*35238bceSAndroid Build Coastguard Worker const Vec3 coordC = Vec3(texBoundaries[6], texBoundaries[7], texBoundaries[8]);
478*35238bceSAndroid Build Coastguard Worker const Vec3 coordAB = coordB - coordA;
479*35238bceSAndroid Build Coastguard Worker const Vec3 coordAC = coordC - coordA;
480*35238bceSAndroid Build Coastguard Worker
481*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < m_gridSize; y++)
482*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < m_gridSize; x++)
483*35238bceSAndroid Build Coastguard Worker {
484*35238bceSAndroid Build Coastguard Worker const Vec2 rawFaceCoord =
485*35238bceSAndroid Build Coastguard Worker texCoordParams.scale * Vec2((float)x / gridSizeFloat, (float)y / gridSizeFloat) + texCoordParams.bias;
486*35238bceSAndroid Build Coastguard Worker const Vec2 safeFaceCoord = useSafeTexCoords ? safe2DTexCoords(rawFaceCoord, textureSize) : rawFaceCoord;
487*35238bceSAndroid Build Coastguard Worker const Vec3 texCoord = coordA + coordAC * safeFaceCoord.x() + coordAB * safeFaceCoord.y();
488*35238bceSAndroid Build Coastguard Worker
489*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
490*35238bceSAndroid Build Coastguard Worker m_texCoords.push_back(texCoord);
491*35238bceSAndroid Build Coastguard Worker }
492*35238bceSAndroid Build Coastguard Worker }
493*35238bceSAndroid Build Coastguard Worker
494*35238bceSAndroid Build Coastguard Worker template <>
initializeTexCoords(const IVec3 & textureSize,const TexCoordParams & texCoordParams,bool useSafeTexCoords)495*35238bceSAndroid Build Coastguard Worker void PosTexCoordQuadGrid<TEXTURETYPE_2D_ARRAY>::initializeTexCoords(const IVec3 &textureSize,
496*35238bceSAndroid Build Coastguard Worker const TexCoordParams &texCoordParams,
497*35238bceSAndroid Build Coastguard Worker bool useSafeTexCoords)
498*35238bceSAndroid Build Coastguard Worker {
499*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_texCoords.empty());
500*35238bceSAndroid Build Coastguard Worker
501*35238bceSAndroid Build Coastguard Worker const float gridSizeFloat = (float)m_gridSize;
502*35238bceSAndroid Build Coastguard Worker
503*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < m_gridSize; y++)
504*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < m_gridSize; x++)
505*35238bceSAndroid Build Coastguard Worker {
506*35238bceSAndroid Build Coastguard Worker const Vec3 rawCoord =
507*35238bceSAndroid Build Coastguard Worker texCoordParams.transform * Vec3((float)x / gridSizeFloat, (float)y / gridSizeFloat, 1.0f);
508*35238bceSAndroid Build Coastguard Worker
509*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
510*35238bceSAndroid Build Coastguard Worker m_texCoords.push_back(useSafeTexCoords ? safe2DArrayTexCoords(rawCoord, textureSize) : rawCoord);
511*35238bceSAndroid Build Coastguard Worker }
512*35238bceSAndroid Build Coastguard Worker }
513*35238bceSAndroid Build Coastguard Worker
514*35238bceSAndroid Build Coastguard Worker template <>
initializeTexCoords(const IVec3 & textureSize,const TexCoordParams & texCoordParams,bool useSafeTexCoords)515*35238bceSAndroid Build Coastguard Worker void PosTexCoordQuadGrid<TEXTURETYPE_3D>::initializeTexCoords(const IVec3 &textureSize,
516*35238bceSAndroid Build Coastguard Worker const TexCoordParams &texCoordParams,
517*35238bceSAndroid Build Coastguard Worker bool useSafeTexCoords)
518*35238bceSAndroid Build Coastguard Worker {
519*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_texCoords.empty());
520*35238bceSAndroid Build Coastguard Worker
521*35238bceSAndroid Build Coastguard Worker const float gridSizeFloat = (float)m_gridSize;
522*35238bceSAndroid Build Coastguard Worker
523*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < m_gridSize; y++)
524*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < m_gridSize; x++)
525*35238bceSAndroid Build Coastguard Worker {
526*35238bceSAndroid Build Coastguard Worker Vec3 rawCoord = texCoordParams.transform * Vec3((float)x / gridSizeFloat, (float)y / gridSizeFloat, 1.0f);
527*35238bceSAndroid Build Coastguard Worker
528*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
529*35238bceSAndroid Build Coastguard Worker m_texCoords.push_back(useSafeTexCoords ? safe3DTexCoords(rawCoord, textureSize) : rawCoord);
530*35238bceSAndroid Build Coastguard Worker }
531*35238bceSAndroid Build Coastguard Worker }
532*35238bceSAndroid Build Coastguard Worker
533*35238bceSAndroid Build Coastguard Worker } // namespace
534*35238bceSAndroid Build Coastguard Worker
isLevelNearest(uint32_t filter)535*35238bceSAndroid Build Coastguard Worker static inline bool isLevelNearest(uint32_t filter)
536*35238bceSAndroid Build Coastguard Worker {
537*35238bceSAndroid Build Coastguard Worker return filter == GL_NEAREST || filter == GL_NEAREST_MIPMAP_NEAREST || filter == GL_NEAREST_MIPMAP_LINEAR;
538*35238bceSAndroid Build Coastguard Worker }
539*35238bceSAndroid Build Coastguard Worker
getTextureSize(const glu::Texture2D & tex)540*35238bceSAndroid Build Coastguard Worker static inline IVec2 getTextureSize(const glu::Texture2D &tex)
541*35238bceSAndroid Build Coastguard Worker {
542*35238bceSAndroid Build Coastguard Worker const tcu::Texture2D &ref = tex.getRefTexture();
543*35238bceSAndroid Build Coastguard Worker return IVec2(ref.getWidth(), ref.getHeight());
544*35238bceSAndroid Build Coastguard Worker }
545*35238bceSAndroid Build Coastguard Worker
getTextureSize(const glu::TextureCube & tex)546*35238bceSAndroid Build Coastguard Worker static inline IVec2 getTextureSize(const glu::TextureCube &tex)
547*35238bceSAndroid Build Coastguard Worker {
548*35238bceSAndroid Build Coastguard Worker const tcu::TextureCube &ref = tex.getRefTexture();
549*35238bceSAndroid Build Coastguard Worker return IVec2(ref.getSize(), ref.getSize());
550*35238bceSAndroid Build Coastguard Worker }
551*35238bceSAndroid Build Coastguard Worker
getTextureSize(const glu::Texture2DArray & tex)552*35238bceSAndroid Build Coastguard Worker static inline IVec3 getTextureSize(const glu::Texture2DArray &tex)
553*35238bceSAndroid Build Coastguard Worker {
554*35238bceSAndroid Build Coastguard Worker const tcu::Texture2DArray &ref = tex.getRefTexture();
555*35238bceSAndroid Build Coastguard Worker return IVec3(ref.getWidth(), ref.getHeight(), ref.getNumLayers());
556*35238bceSAndroid Build Coastguard Worker }
557*35238bceSAndroid Build Coastguard Worker
getTextureSize(const glu::Texture3D & tex)558*35238bceSAndroid Build Coastguard Worker static inline IVec3 getTextureSize(const glu::Texture3D &tex)
559*35238bceSAndroid Build Coastguard Worker {
560*35238bceSAndroid Build Coastguard Worker const tcu::Texture3D &ref = tex.getRefTexture();
561*35238bceSAndroid Build Coastguard Worker return IVec3(ref.getWidth(), ref.getHeight(), ref.getDepth());
562*35238bceSAndroid Build Coastguard Worker }
563*35238bceSAndroid Build Coastguard Worker
564*35238bceSAndroid Build Coastguard Worker template <TextureType TexType>
setPixelColors(const vector<Vec4> & quadColors,const Rect & region,const PosTexCoordQuadGrid<TexType> & grid,tcu::Surface & dst)565*35238bceSAndroid Build Coastguard Worker static void setPixelColors(const vector<Vec4> &quadColors, const Rect ®ion, const PosTexCoordQuadGrid<TexType> &grid,
566*35238bceSAndroid Build Coastguard Worker tcu::Surface &dst)
567*35238bceSAndroid Build Coastguard Worker {
568*35238bceSAndroid Build Coastguard Worker const int gridSize = grid.getSize();
569*35238bceSAndroid Build Coastguard Worker
570*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < gridSize; y++)
571*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < gridSize; x++)
572*35238bceSAndroid Build Coastguard Worker {
573*35238bceSAndroid Build Coastguard Worker const Vec4 color = quadColors[y * gridSize + x];
574*35238bceSAndroid Build Coastguard Worker const Vec4 ldru = grid.getQuadLDRU(x, y) * 0.5f + 0.5f; // [-1, 1] -> [0, 1]
575*35238bceSAndroid Build Coastguard Worker const int ix0 = deCeilFloatToInt32(ldru.x() * (float)region.w - 0.5f);
576*35238bceSAndroid Build Coastguard Worker const int ix1 = deCeilFloatToInt32(ldru.z() * (float)region.w - 0.5f);
577*35238bceSAndroid Build Coastguard Worker const int iy0 = deCeilFloatToInt32(ldru.y() * (float)region.h - 0.5f);
578*35238bceSAndroid Build Coastguard Worker const int iy1 = deCeilFloatToInt32(ldru.w() * (float)region.h - 0.5f);
579*35238bceSAndroid Build Coastguard Worker
580*35238bceSAndroid Build Coastguard Worker for (int iy = iy0; iy < iy1; iy++)
581*35238bceSAndroid Build Coastguard Worker for (int ix = ix0; ix < ix1; ix++)
582*35238bceSAndroid Build Coastguard Worker {
583*35238bceSAndroid Build Coastguard Worker DE_ASSERT(deInBounds32(ix + region.x, 0, dst.getWidth()));
584*35238bceSAndroid Build Coastguard Worker DE_ASSERT(deInBounds32(iy + region.y, 0, dst.getHeight()));
585*35238bceSAndroid Build Coastguard Worker
586*35238bceSAndroid Build Coastguard Worker dst.setPixel(ix + region.x, iy + region.y, tcu::RGBA(color));
587*35238bceSAndroid Build Coastguard Worker }
588*35238bceSAndroid Build Coastguard Worker }
589*35238bceSAndroid Build Coastguard Worker }
590*35238bceSAndroid Build Coastguard Worker
sample(const tcu::Texture2D & tex,const Vec2 & coord,float lod,const tcu::Sampler & sam)591*35238bceSAndroid Build Coastguard Worker static inline Vec4 sample(const tcu::Texture2D &tex, const Vec2 &coord, float lod, const tcu::Sampler &sam)
592*35238bceSAndroid Build Coastguard Worker {
593*35238bceSAndroid Build Coastguard Worker return tex.sample(sam, coord.x(), coord.y(), lod);
594*35238bceSAndroid Build Coastguard Worker }
sample(const tcu::TextureCube & tex,const Vec3 & coord,float lod,const tcu::Sampler & sam)595*35238bceSAndroid Build Coastguard Worker static inline Vec4 sample(const tcu::TextureCube &tex, const Vec3 &coord, float lod, const tcu::Sampler &sam)
596*35238bceSAndroid Build Coastguard Worker {
597*35238bceSAndroid Build Coastguard Worker return tex.sample(sam, coord.x(), coord.y(), coord.z(), lod);
598*35238bceSAndroid Build Coastguard Worker }
sample(const tcu::Texture2DArray & tex,const Vec3 & coord,float lod,const tcu::Sampler & sam)599*35238bceSAndroid Build Coastguard Worker static inline Vec4 sample(const tcu::Texture2DArray &tex, const Vec3 &coord, float lod, const tcu::Sampler &sam)
600*35238bceSAndroid Build Coastguard Worker {
601*35238bceSAndroid Build Coastguard Worker return tex.sample(sam, coord.x(), coord.y(), coord.z(), lod);
602*35238bceSAndroid Build Coastguard Worker }
sample(const tcu::Texture3D & tex,const Vec3 & coord,float lod,const tcu::Sampler & sam)603*35238bceSAndroid Build Coastguard Worker static inline Vec4 sample(const tcu::Texture3D &tex, const Vec3 &coord, float lod, const tcu::Sampler &sam)
604*35238bceSAndroid Build Coastguard Worker {
605*35238bceSAndroid Build Coastguard Worker return tex.sample(sam, coord.x(), coord.y(), coord.z(), lod);
606*35238bceSAndroid Build Coastguard Worker }
607*35238bceSAndroid Build Coastguard Worker
608*35238bceSAndroid Build Coastguard Worker template <TextureType TexType>
computeReference(const typename TexTypeTcuClass<TexType>::t & texture,float lod,const tcu::Sampler & sampler,const PosTexCoordQuadGrid<TexType> & grid,tcu::Surface & dst,const Rect & dstRegion)609*35238bceSAndroid Build Coastguard Worker void computeReference(const typename TexTypeTcuClass<TexType>::t &texture, float lod, const tcu::Sampler &sampler,
610*35238bceSAndroid Build Coastguard Worker const PosTexCoordQuadGrid<TexType> &grid, tcu::Surface &dst, const Rect &dstRegion)
611*35238bceSAndroid Build Coastguard Worker {
612*35238bceSAndroid Build Coastguard Worker const int gridSize = grid.getSize();
613*35238bceSAndroid Build Coastguard Worker vector<Vec4> quadColors(gridSize * gridSize);
614*35238bceSAndroid Build Coastguard Worker
615*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < gridSize; y++)
616*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < gridSize; x++)
617*35238bceSAndroid Build Coastguard Worker {
618*35238bceSAndroid Build Coastguard Worker const int ndx = y * gridSize + x;
619*35238bceSAndroid Build Coastguard Worker const typename TexTypeCoordVec<TexType>::t &coord = grid.getQuadTexCoord(x, y);
620*35238bceSAndroid Build Coastguard Worker
621*35238bceSAndroid Build Coastguard Worker quadColors[ndx] = sample(texture, coord, lod, sampler);
622*35238bceSAndroid Build Coastguard Worker }
623*35238bceSAndroid Build Coastguard Worker
624*35238bceSAndroid Build Coastguard Worker setPixelColors(quadColors, dstRegion, grid, dst);
625*35238bceSAndroid Build Coastguard Worker }
626*35238bceSAndroid Build Coastguard Worker
compareImages(const glu::RenderContext & renderCtx,tcu::TestLog & log,const tcu::Surface & ref,const tcu::Surface & res)627*35238bceSAndroid Build Coastguard Worker static bool compareImages(const glu::RenderContext &renderCtx, tcu::TestLog &log, const tcu::Surface &ref,
628*35238bceSAndroid Build Coastguard Worker const tcu::Surface &res)
629*35238bceSAndroid Build Coastguard Worker {
630*35238bceSAndroid Build Coastguard Worker DE_ASSERT(renderCtx.getRenderTarget().getNumSamples() == 0);
631*35238bceSAndroid Build Coastguard Worker
632*35238bceSAndroid Build Coastguard Worker const tcu::RGBA threshold =
633*35238bceSAndroid Build Coastguard Worker renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(15, 15, 15, 15);
634*35238bceSAndroid Build Coastguard Worker return tcu::pixelThresholdCompare(log, "Result", "Image compare result", ref, res, threshold,
635*35238bceSAndroid Build Coastguard Worker tcu::COMPARE_LOG_RESULT);
636*35238bceSAndroid Build Coastguard Worker }
637*35238bceSAndroid Build Coastguard Worker
638*35238bceSAndroid Build Coastguard Worker class Vertex2DTextureCase : public TestCase
639*35238bceSAndroid Build Coastguard Worker {
640*35238bceSAndroid Build Coastguard Worker public:
641*35238bceSAndroid Build Coastguard Worker Vertex2DTextureCase(Context &testCtx, const char *name, const char *desc, uint32_t minFilter, uint32_t magFilter,
642*35238bceSAndroid Build Coastguard Worker uint32_t wrapS, uint32_t wrapT);
643*35238bceSAndroid Build Coastguard Worker ~Vertex2DTextureCase(void);
644*35238bceSAndroid Build Coastguard Worker
645*35238bceSAndroid Build Coastguard Worker void init(void);
646*35238bceSAndroid Build Coastguard Worker void deinit(void);
647*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
648*35238bceSAndroid Build Coastguard Worker
649*35238bceSAndroid Build Coastguard Worker private:
650*35238bceSAndroid Build Coastguard Worker typedef PosTexCoordQuadGrid<TEXTURETYPE_2D> Grid;
651*35238bceSAndroid Build Coastguard Worker
652*35238bceSAndroid Build Coastguard Worker Vertex2DTextureCase(const Vertex2DTextureCase &other);
653*35238bceSAndroid Build Coastguard Worker Vertex2DTextureCase &operator=(const Vertex2DTextureCase &other);
654*35238bceSAndroid Build Coastguard Worker
655*35238bceSAndroid Build Coastguard Worker float calculateLod(const Vec2 &texScale, const Vec2 &dstSize, int textureNdx) const;
656*35238bceSAndroid Build Coastguard Worker void setupShaderInputs(int textureNdx, float lod, const Grid &grid) const;
657*35238bceSAndroid Build Coastguard Worker void renderCell(int textureNdx, float lod, const Grid &grid) const;
658*35238bceSAndroid Build Coastguard Worker void computeReferenceCell(int textureNdx, float lod, const Grid &grid, tcu::Surface &dst,
659*35238bceSAndroid Build Coastguard Worker const Rect &dstRegion) const;
660*35238bceSAndroid Build Coastguard Worker
661*35238bceSAndroid Build Coastguard Worker const uint32_t m_minFilter;
662*35238bceSAndroid Build Coastguard Worker const uint32_t m_magFilter;
663*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapS;
664*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapT;
665*35238bceSAndroid Build Coastguard Worker
666*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram *m_program;
667*35238bceSAndroid Build Coastguard Worker glu::Texture2D *m_textures[2]; // 2 textures, a gradient texture and a grid texture.
668*35238bceSAndroid Build Coastguard Worker };
669*35238bceSAndroid Build Coastguard Worker
Vertex2DTextureCase(Context & testCtx,const char * name,const char * desc,uint32_t minFilter,uint32_t magFilter,uint32_t wrapS,uint32_t wrapT)670*35238bceSAndroid Build Coastguard Worker Vertex2DTextureCase::Vertex2DTextureCase(Context &testCtx, const char *name, const char *desc, uint32_t minFilter,
671*35238bceSAndroid Build Coastguard Worker uint32_t magFilter, uint32_t wrapS, uint32_t wrapT)
672*35238bceSAndroid Build Coastguard Worker : TestCase(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, desc)
673*35238bceSAndroid Build Coastguard Worker , m_minFilter(minFilter)
674*35238bceSAndroid Build Coastguard Worker , m_magFilter(magFilter)
675*35238bceSAndroid Build Coastguard Worker , m_wrapS(wrapS)
676*35238bceSAndroid Build Coastguard Worker , m_wrapT(wrapT)
677*35238bceSAndroid Build Coastguard Worker , m_program(DE_NULL)
678*35238bceSAndroid Build Coastguard Worker {
679*35238bceSAndroid Build Coastguard Worker m_textures[0] = DE_NULL;
680*35238bceSAndroid Build Coastguard Worker m_textures[1] = DE_NULL;
681*35238bceSAndroid Build Coastguard Worker }
682*35238bceSAndroid Build Coastguard Worker
~Vertex2DTextureCase(void)683*35238bceSAndroid Build Coastguard Worker Vertex2DTextureCase::~Vertex2DTextureCase(void)
684*35238bceSAndroid Build Coastguard Worker {
685*35238bceSAndroid Build Coastguard Worker Vertex2DTextureCase::deinit();
686*35238bceSAndroid Build Coastguard Worker }
687*35238bceSAndroid Build Coastguard Worker
init(void)688*35238bceSAndroid Build Coastguard Worker void Vertex2DTextureCase::init(void)
689*35238bceSAndroid Build Coastguard Worker {
690*35238bceSAndroid Build Coastguard Worker const char *const vertexShader = "#version 300 es\n"
691*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_position;\n"
692*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_texCoord;\n"
693*35238bceSAndroid Build Coastguard Worker "uniform highp sampler2D u_texture;\n"
694*35238bceSAndroid Build Coastguard Worker "uniform highp float u_lod;\n"
695*35238bceSAndroid Build Coastguard Worker "out mediump vec4 v_color;\n"
696*35238bceSAndroid Build Coastguard Worker "\n"
697*35238bceSAndroid Build Coastguard Worker "void main()\n"
698*35238bceSAndroid Build Coastguard Worker "{\n"
699*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(a_position, 0.0, 1.0);\n"
700*35238bceSAndroid Build Coastguard Worker " v_color = textureLod(u_texture, a_texCoord, u_lod);\n"
701*35238bceSAndroid Build Coastguard Worker "}\n";
702*35238bceSAndroid Build Coastguard Worker
703*35238bceSAndroid Build Coastguard Worker const char *const fragmentShader = "#version 300 es\n"
704*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
705*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_color;\n"
706*35238bceSAndroid Build Coastguard Worker "\n"
707*35238bceSAndroid Build Coastguard Worker "void main()\n"
708*35238bceSAndroid Build Coastguard Worker "{\n"
709*35238bceSAndroid Build Coastguard Worker " dEQP_FragColor = v_color;\n"
710*35238bceSAndroid Build Coastguard Worker "}\n";
711*35238bceSAndroid Build Coastguard Worker
712*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getNumSamples() != 0)
713*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("MSAA config not supported by this test");
714*35238bceSAndroid Build Coastguard Worker
715*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_program);
716*35238bceSAndroid Build Coastguard Worker m_program =
717*35238bceSAndroid Build Coastguard Worker new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShader, fragmentShader));
718*35238bceSAndroid Build Coastguard Worker
719*35238bceSAndroid Build Coastguard Worker if (!m_program->isOk())
720*35238bceSAndroid Build Coastguard Worker {
721*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << *m_program;
722*35238bceSAndroid Build Coastguard Worker
723*35238bceSAndroid Build Coastguard Worker GLint maxVertexTextures;
724*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextures);
725*35238bceSAndroid Build Coastguard Worker
726*35238bceSAndroid Build Coastguard Worker if (maxVertexTextures < 1)
727*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Vertex texture image units not supported", "", __FILE__, __LINE__);
728*35238bceSAndroid Build Coastguard Worker else
729*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Failed to compile shader");
730*35238bceSAndroid Build Coastguard Worker }
731*35238bceSAndroid Build Coastguard Worker
732*35238bceSAndroid Build Coastguard Worker // Make the textures.
733*35238bceSAndroid Build Coastguard Worker try
734*35238bceSAndroid Build Coastguard Worker {
735*35238bceSAndroid Build Coastguard Worker // Compute suitable power-of-two sizes (for mipmaps).
736*35238bceSAndroid Build Coastguard Worker const int texWidth = 1 << deLog2Ceil32(MAX_2D_RENDER_WIDTH / 2);
737*35238bceSAndroid Build Coastguard Worker const int texHeight = 1 << deLog2Ceil32(MAX_2D_RENDER_HEIGHT / 2);
738*35238bceSAndroid Build Coastguard Worker
739*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
740*35238bceSAndroid Build Coastguard Worker {
741*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_textures[i]);
742*35238bceSAndroid Build Coastguard Worker m_textures[i] =
743*35238bceSAndroid Build Coastguard Worker new glu::Texture2D(m_context.getRenderContext(), GL_RGB, GL_UNSIGNED_BYTE, texWidth, texHeight);
744*35238bceSAndroid Build Coastguard Worker }
745*35238bceSAndroid Build Coastguard Worker
746*35238bceSAndroid Build Coastguard Worker const bool mipmaps = (deIsPowerOfTwo32(texWidth) && deIsPowerOfTwo32(texHeight));
747*35238bceSAndroid Build Coastguard Worker const int numLevels = mipmaps ? deLog2Floor32(de::max(texWidth, texHeight)) + 1 : 1;
748*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(m_textures[0]->getRefTexture().getFormat());
749*35238bceSAndroid Build Coastguard Worker const Vec4 cBias = fmtInfo.valueMin;
750*35238bceSAndroid Build Coastguard Worker const Vec4 cScale = fmtInfo.valueMax - fmtInfo.valueMin;
751*35238bceSAndroid Build Coastguard Worker
752*35238bceSAndroid Build Coastguard Worker // Fill first with gradient texture.
753*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
754*35238bceSAndroid Build Coastguard Worker {
755*35238bceSAndroid Build Coastguard Worker const Vec4 gMin = Vec4(-0.5f, -0.5f, -0.5f, 2.0f) * cScale + cBias;
756*35238bceSAndroid Build Coastguard Worker const Vec4 gMax = Vec4(1.0f, 1.0f, 1.0f, 0.0f) * cScale + cBias;
757*35238bceSAndroid Build Coastguard Worker
758*35238bceSAndroid Build Coastguard Worker m_textures[0]->getRefTexture().allocLevel(levelNdx);
759*35238bceSAndroid Build Coastguard Worker tcu::fillWithComponentGradients(m_textures[0]->getRefTexture().getLevel(levelNdx), gMin, gMax);
760*35238bceSAndroid Build Coastguard Worker }
761*35238bceSAndroid Build Coastguard Worker
762*35238bceSAndroid Build Coastguard Worker // Fill second with grid texture.
763*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
764*35238bceSAndroid Build Coastguard Worker {
765*35238bceSAndroid Build Coastguard Worker const uint32_t step = 0x00ffffff / numLevels;
766*35238bceSAndroid Build Coastguard Worker const uint32_t rgb = step * levelNdx;
767*35238bceSAndroid Build Coastguard Worker const uint32_t colorA = 0xff000000 | rgb;
768*35238bceSAndroid Build Coastguard Worker const uint32_t colorB = 0xff000000 | ~rgb;
769*35238bceSAndroid Build Coastguard Worker
770*35238bceSAndroid Build Coastguard Worker m_textures[1]->getRefTexture().allocLevel(levelNdx);
771*35238bceSAndroid Build Coastguard Worker tcu::fillWithGrid(m_textures[1]->getRefTexture().getLevel(levelNdx), 4,
772*35238bceSAndroid Build Coastguard Worker tcu::RGBA(colorA).toVec() * cScale + cBias, tcu::RGBA(colorB).toVec() * cScale + cBias);
773*35238bceSAndroid Build Coastguard Worker }
774*35238bceSAndroid Build Coastguard Worker
775*35238bceSAndroid Build Coastguard Worker // Upload.
776*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
777*35238bceSAndroid Build Coastguard Worker m_textures[i]->upload();
778*35238bceSAndroid Build Coastguard Worker }
779*35238bceSAndroid Build Coastguard Worker catch (const std::exception &)
780*35238bceSAndroid Build Coastguard Worker {
781*35238bceSAndroid Build Coastguard Worker // Clean up to save memory.
782*35238bceSAndroid Build Coastguard Worker Vertex2DTextureCase::deinit();
783*35238bceSAndroid Build Coastguard Worker throw;
784*35238bceSAndroid Build Coastguard Worker }
785*35238bceSAndroid Build Coastguard Worker }
786*35238bceSAndroid Build Coastguard Worker
deinit(void)787*35238bceSAndroid Build Coastguard Worker void Vertex2DTextureCase::deinit(void)
788*35238bceSAndroid Build Coastguard Worker {
789*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
790*35238bceSAndroid Build Coastguard Worker {
791*35238bceSAndroid Build Coastguard Worker delete m_textures[i];
792*35238bceSAndroid Build Coastguard Worker m_textures[i] = DE_NULL;
793*35238bceSAndroid Build Coastguard Worker }
794*35238bceSAndroid Build Coastguard Worker
795*35238bceSAndroid Build Coastguard Worker delete m_program;
796*35238bceSAndroid Build Coastguard Worker m_program = DE_NULL;
797*35238bceSAndroid Build Coastguard Worker }
798*35238bceSAndroid Build Coastguard Worker
calculateLod(const Vec2 & texScale,const Vec2 & dstSize,int textureNdx) const799*35238bceSAndroid Build Coastguard Worker float Vertex2DTextureCase::calculateLod(const Vec2 &texScale, const Vec2 &dstSize, int textureNdx) const
800*35238bceSAndroid Build Coastguard Worker {
801*35238bceSAndroid Build Coastguard Worker const tcu::Texture2D &refTexture = m_textures[textureNdx]->getRefTexture();
802*35238bceSAndroid Build Coastguard Worker const Vec2 srcSize = Vec2((float)refTexture.getWidth(), (float)refTexture.getHeight());
803*35238bceSAndroid Build Coastguard Worker const Vec2 sizeRatio = texScale * srcSize / dstSize;
804*35238bceSAndroid Build Coastguard Worker
805*35238bceSAndroid Build Coastguard Worker // \note In this particular case dv/dx and du/dy are zero, simplifying the expression.
806*35238bceSAndroid Build Coastguard Worker return deFloatLog2(de::max(sizeRatio.x(), sizeRatio.y()));
807*35238bceSAndroid Build Coastguard Worker }
808*35238bceSAndroid Build Coastguard Worker
iterate(void)809*35238bceSAndroid Build Coastguard Worker Vertex2DTextureCase::IterateResult Vertex2DTextureCase::iterate(void)
810*35238bceSAndroid Build Coastguard Worker {
811*35238bceSAndroid Build Coastguard Worker const int viewportWidth = deMin32(m_context.getRenderTarget().getWidth(), MAX_2D_RENDER_WIDTH);
812*35238bceSAndroid Build Coastguard Worker const int viewportHeight = deMin32(m_context.getRenderTarget().getHeight(), MAX_2D_RENDER_HEIGHT);
813*35238bceSAndroid Build Coastguard Worker
814*35238bceSAndroid Build Coastguard Worker const int viewportXOffsetMax = m_context.getRenderTarget().getWidth() - viewportWidth;
815*35238bceSAndroid Build Coastguard Worker const int viewportYOffsetMax = m_context.getRenderTarget().getHeight() - viewportHeight;
816*35238bceSAndroid Build Coastguard Worker
817*35238bceSAndroid Build Coastguard Worker de::Random rnd(deStringHash(getName()));
818*35238bceSAndroid Build Coastguard Worker
819*35238bceSAndroid Build Coastguard Worker const int viewportXOffset = rnd.getInt(0, viewportXOffsetMax);
820*35238bceSAndroid Build Coastguard Worker const int viewportYOffset = rnd.getInt(0, viewportYOffsetMax);
821*35238bceSAndroid Build Coastguard Worker
822*35238bceSAndroid Build Coastguard Worker glUseProgram(m_program->getProgram());
823*35238bceSAndroid Build Coastguard Worker
824*35238bceSAndroid Build Coastguard Worker // Divide viewport into 4 cells.
825*35238bceSAndroid Build Coastguard Worker const int leftWidth = viewportWidth / 2;
826*35238bceSAndroid Build Coastguard Worker const int rightWidth = viewportWidth - leftWidth;
827*35238bceSAndroid Build Coastguard Worker const int bottomHeight = viewportHeight / 2;
828*35238bceSAndroid Build Coastguard Worker const int topHeight = viewportHeight - bottomHeight;
829*35238bceSAndroid Build Coastguard Worker
830*35238bceSAndroid Build Coastguard Worker // Clear.
831*35238bceSAndroid Build Coastguard Worker glClearColor(0.125f, 0.25f, 0.5f, 1.0f);
832*35238bceSAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
833*35238bceSAndroid Build Coastguard Worker
834*35238bceSAndroid Build Coastguard Worker // Texture scaling and offsetting vectors.
835*35238bceSAndroid Build Coastguard Worker const Vec2 texMinScale(+1.8f, +1.8f);
836*35238bceSAndroid Build Coastguard Worker const Vec2 texMinOffset(-0.3f, -0.2f);
837*35238bceSAndroid Build Coastguard Worker const Vec2 texMagScale(+0.3f, +0.3f);
838*35238bceSAndroid Build Coastguard Worker const Vec2 texMagOffset(+0.9f, +0.8f);
839*35238bceSAndroid Build Coastguard Worker
840*35238bceSAndroid Build Coastguard Worker // Surface for the reference image.
841*35238bceSAndroid Build Coastguard Worker tcu::Surface refImage(viewportWidth, viewportHeight);
842*35238bceSAndroid Build Coastguard Worker
843*35238bceSAndroid Build Coastguard Worker {
844*35238bceSAndroid Build Coastguard Worker const struct Render
845*35238bceSAndroid Build Coastguard Worker {
846*35238bceSAndroid Build Coastguard Worker const Rect region;
847*35238bceSAndroid Build Coastguard Worker int textureNdx;
848*35238bceSAndroid Build Coastguard Worker const Vec2 texCoordScale;
849*35238bceSAndroid Build Coastguard Worker const Vec2 texCoordOffset;
850*35238bceSAndroid Build Coastguard Worker Render(const Rect &r, int tN, const Vec2 &tS, const Vec2 &tO)
851*35238bceSAndroid Build Coastguard Worker : region(r)
852*35238bceSAndroid Build Coastguard Worker , textureNdx(tN)
853*35238bceSAndroid Build Coastguard Worker , texCoordScale(tS)
854*35238bceSAndroid Build Coastguard Worker , texCoordOffset(tO)
855*35238bceSAndroid Build Coastguard Worker {
856*35238bceSAndroid Build Coastguard Worker }
857*35238bceSAndroid Build Coastguard Worker } renders[] = {Render(Rect(0, 0, leftWidth, bottomHeight), 0, texMinScale, texMinOffset),
858*35238bceSAndroid Build Coastguard Worker Render(Rect(leftWidth, 0, rightWidth, bottomHeight), 0, texMagScale, texMagOffset),
859*35238bceSAndroid Build Coastguard Worker Render(Rect(0, bottomHeight, leftWidth, topHeight), 1, texMinScale, texMinOffset),
860*35238bceSAndroid Build Coastguard Worker Render(Rect(leftWidth, bottomHeight, rightWidth, topHeight), 1, texMagScale, texMagOffset)};
861*35238bceSAndroid Build Coastguard Worker
862*35238bceSAndroid Build Coastguard Worker for (int renderNdx = 0; renderNdx < DE_LENGTH_OF_ARRAY(renders); renderNdx++)
863*35238bceSAndroid Build Coastguard Worker {
864*35238bceSAndroid Build Coastguard Worker const Render &rend = renders[renderNdx];
865*35238bceSAndroid Build Coastguard Worker const float lod = calculateLod(rend.texCoordScale, rend.region.size().asFloat(), rend.textureNdx);
866*35238bceSAndroid Build Coastguard Worker const bool useSafeTexCoords = isLevelNearest(lod > 0.0f ? m_minFilter : m_magFilter);
867*35238bceSAndroid Build Coastguard Worker const Grid grid(GRID_SIZE_2D, rend.region.size(), getTextureSize(*m_textures[rend.textureNdx]),
868*35238bceSAndroid Build Coastguard Worker TexTypeCoordParams<TEXTURETYPE_2D>(rend.texCoordScale, rend.texCoordOffset),
869*35238bceSAndroid Build Coastguard Worker useSafeTexCoords);
870*35238bceSAndroid Build Coastguard Worker
871*35238bceSAndroid Build Coastguard Worker glViewport(viewportXOffset + rend.region.x, viewportYOffset + rend.region.y, rend.region.w, rend.region.h);
872*35238bceSAndroid Build Coastguard Worker renderCell(rend.textureNdx, lod, grid);
873*35238bceSAndroid Build Coastguard Worker computeReferenceCell(rend.textureNdx, lod, grid, refImage, rend.region);
874*35238bceSAndroid Build Coastguard Worker }
875*35238bceSAndroid Build Coastguard Worker }
876*35238bceSAndroid Build Coastguard Worker
877*35238bceSAndroid Build Coastguard Worker // Read back rendered results.
878*35238bceSAndroid Build Coastguard Worker tcu::Surface resImage(viewportWidth, viewportHeight);
879*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportXOffset, viewportYOffset, resImage.getAccess());
880*35238bceSAndroid Build Coastguard Worker
881*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
882*35238bceSAndroid Build Coastguard Worker
883*35238bceSAndroid Build Coastguard Worker // Compare and log.
884*35238bceSAndroid Build Coastguard Worker {
885*35238bceSAndroid Build Coastguard Worker const bool isOk = compareImages(m_context.getRenderContext(), m_testCtx.getLog(), refImage, resImage);
886*35238bceSAndroid Build Coastguard Worker
887*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
888*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Image comparison failed");
889*35238bceSAndroid Build Coastguard Worker }
890*35238bceSAndroid Build Coastguard Worker
891*35238bceSAndroid Build Coastguard Worker return STOP;
892*35238bceSAndroid Build Coastguard Worker }
893*35238bceSAndroid Build Coastguard Worker
setupShaderInputs(int textureNdx,float lod,const Grid & grid) const894*35238bceSAndroid Build Coastguard Worker void Vertex2DTextureCase::setupShaderInputs(int textureNdx, float lod, const Grid &grid) const
895*35238bceSAndroid Build Coastguard Worker {
896*35238bceSAndroid Build Coastguard Worker const uint32_t programID = m_program->getProgram();
897*35238bceSAndroid Build Coastguard Worker
898*35238bceSAndroid Build Coastguard Worker // SETUP ATTRIBUTES.
899*35238bceSAndroid Build Coastguard Worker
900*35238bceSAndroid Build Coastguard Worker {
901*35238bceSAndroid Build Coastguard Worker const int positionLoc = glGetAttribLocation(programID, "a_position");
902*35238bceSAndroid Build Coastguard Worker if (positionLoc != -1)
903*35238bceSAndroid Build Coastguard Worker {
904*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
905*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, grid.getPositionPtr());
906*35238bceSAndroid Build Coastguard Worker }
907*35238bceSAndroid Build Coastguard Worker }
908*35238bceSAndroid Build Coastguard Worker
909*35238bceSAndroid Build Coastguard Worker {
910*35238bceSAndroid Build Coastguard Worker const int texCoordLoc = glGetAttribLocation(programID, "a_texCoord");
911*35238bceSAndroid Build Coastguard Worker if (texCoordLoc != -1)
912*35238bceSAndroid Build Coastguard Worker {
913*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(texCoordLoc);
914*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(texCoordLoc, 2, GL_FLOAT, GL_FALSE, 0, grid.getTexCoordPtr());
915*35238bceSAndroid Build Coastguard Worker }
916*35238bceSAndroid Build Coastguard Worker }
917*35238bceSAndroid Build Coastguard Worker
918*35238bceSAndroid Build Coastguard Worker // SETUP UNIFORMS.
919*35238bceSAndroid Build Coastguard Worker
920*35238bceSAndroid Build Coastguard Worker {
921*35238bceSAndroid Build Coastguard Worker const int lodLoc = glGetUniformLocation(programID, "u_lod");
922*35238bceSAndroid Build Coastguard Worker if (lodLoc != -1)
923*35238bceSAndroid Build Coastguard Worker glUniform1f(lodLoc, lod);
924*35238bceSAndroid Build Coastguard Worker }
925*35238bceSAndroid Build Coastguard Worker
926*35238bceSAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
927*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, m_textures[textureNdx]->getGLTexture());
928*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, m_wrapS);
929*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, m_wrapT);
930*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_minFilter);
931*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, m_magFilter);
932*35238bceSAndroid Build Coastguard Worker
933*35238bceSAndroid Build Coastguard Worker {
934*35238bceSAndroid Build Coastguard Worker const int texLoc = glGetUniformLocation(programID, "u_texture");
935*35238bceSAndroid Build Coastguard Worker if (texLoc != -1)
936*35238bceSAndroid Build Coastguard Worker glUniform1i(texLoc, 0);
937*35238bceSAndroid Build Coastguard Worker }
938*35238bceSAndroid Build Coastguard Worker }
939*35238bceSAndroid Build Coastguard Worker
940*35238bceSAndroid Build Coastguard Worker // Renders one sub-image with given parameters.
renderCell(int textureNdx,float lod,const Grid & grid) const941*35238bceSAndroid Build Coastguard Worker void Vertex2DTextureCase::renderCell(int textureNdx, float lod, const Grid &grid) const
942*35238bceSAndroid Build Coastguard Worker {
943*35238bceSAndroid Build Coastguard Worker setupShaderInputs(textureNdx, lod, grid);
944*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, grid.getNumIndices(), GL_UNSIGNED_SHORT, grid.getIndexPtr());
945*35238bceSAndroid Build Coastguard Worker }
946*35238bceSAndroid Build Coastguard Worker
computeReferenceCell(int textureNdx,float lod,const Grid & grid,tcu::Surface & dst,const Rect & dstRegion) const947*35238bceSAndroid Build Coastguard Worker void Vertex2DTextureCase::computeReferenceCell(int textureNdx, float lod, const Grid &grid, tcu::Surface &dst,
948*35238bceSAndroid Build Coastguard Worker const Rect &dstRegion) const
949*35238bceSAndroid Build Coastguard Worker {
950*35238bceSAndroid Build Coastguard Worker computeReference(m_textures[textureNdx]->getRefTexture(), lod,
951*35238bceSAndroid Build Coastguard Worker glu::mapGLSampler(m_wrapS, m_wrapT, m_minFilter, m_magFilter), grid, dst, dstRegion);
952*35238bceSAndroid Build Coastguard Worker }
953*35238bceSAndroid Build Coastguard Worker
954*35238bceSAndroid Build Coastguard Worker class VertexCubeTextureCase : public TestCase
955*35238bceSAndroid Build Coastguard Worker {
956*35238bceSAndroid Build Coastguard Worker public:
957*35238bceSAndroid Build Coastguard Worker VertexCubeTextureCase(Context &testCtx, const char *name, const char *desc, uint32_t minFilter, uint32_t magFilter,
958*35238bceSAndroid Build Coastguard Worker uint32_t wrapS, uint32_t wrapT);
959*35238bceSAndroid Build Coastguard Worker ~VertexCubeTextureCase(void);
960*35238bceSAndroid Build Coastguard Worker
961*35238bceSAndroid Build Coastguard Worker void init(void);
962*35238bceSAndroid Build Coastguard Worker void deinit(void);
963*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
964*35238bceSAndroid Build Coastguard Worker
965*35238bceSAndroid Build Coastguard Worker private:
966*35238bceSAndroid Build Coastguard Worker typedef PosTexCoordQuadGrid<TEXTURETYPE_CUBE> Grid;
967*35238bceSAndroid Build Coastguard Worker
968*35238bceSAndroid Build Coastguard Worker VertexCubeTextureCase(const VertexCubeTextureCase &other);
969*35238bceSAndroid Build Coastguard Worker VertexCubeTextureCase &operator=(const VertexCubeTextureCase &other);
970*35238bceSAndroid Build Coastguard Worker
971*35238bceSAndroid Build Coastguard Worker float calculateLod(const Vec2 &texScale, const Vec2 &dstSize, int textureNdx) const;
972*35238bceSAndroid Build Coastguard Worker void setupShaderInputs(int textureNdx, float lod, const Grid &grid) const;
973*35238bceSAndroid Build Coastguard Worker void renderCell(int textureNdx, float lod, const Grid &grid) const;
974*35238bceSAndroid Build Coastguard Worker void computeReferenceCell(int textureNdx, float lod, const Grid &grid, tcu::Surface &dst,
975*35238bceSAndroid Build Coastguard Worker const Rect &dstRegion) const;
976*35238bceSAndroid Build Coastguard Worker
977*35238bceSAndroid Build Coastguard Worker const uint32_t m_minFilter;
978*35238bceSAndroid Build Coastguard Worker const uint32_t m_magFilter;
979*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapS;
980*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapT;
981*35238bceSAndroid Build Coastguard Worker
982*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram *m_program;
983*35238bceSAndroid Build Coastguard Worker glu::TextureCube *m_textures[2]; // 2 textures, a gradient texture and a grid texture.
984*35238bceSAndroid Build Coastguard Worker };
985*35238bceSAndroid Build Coastguard Worker
VertexCubeTextureCase(Context & testCtx,const char * name,const char * desc,uint32_t minFilter,uint32_t magFilter,uint32_t wrapS,uint32_t wrapT)986*35238bceSAndroid Build Coastguard Worker VertexCubeTextureCase::VertexCubeTextureCase(Context &testCtx, const char *name, const char *desc, uint32_t minFilter,
987*35238bceSAndroid Build Coastguard Worker uint32_t magFilter, uint32_t wrapS, uint32_t wrapT)
988*35238bceSAndroid Build Coastguard Worker : TestCase(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, desc)
989*35238bceSAndroid Build Coastguard Worker , m_minFilter(minFilter)
990*35238bceSAndroid Build Coastguard Worker , m_magFilter(magFilter)
991*35238bceSAndroid Build Coastguard Worker , m_wrapS(wrapS)
992*35238bceSAndroid Build Coastguard Worker , m_wrapT(wrapT)
993*35238bceSAndroid Build Coastguard Worker , m_program(DE_NULL)
994*35238bceSAndroid Build Coastguard Worker {
995*35238bceSAndroid Build Coastguard Worker m_textures[0] = DE_NULL;
996*35238bceSAndroid Build Coastguard Worker m_textures[1] = DE_NULL;
997*35238bceSAndroid Build Coastguard Worker }
998*35238bceSAndroid Build Coastguard Worker
~VertexCubeTextureCase(void)999*35238bceSAndroid Build Coastguard Worker VertexCubeTextureCase::~VertexCubeTextureCase(void)
1000*35238bceSAndroid Build Coastguard Worker {
1001*35238bceSAndroid Build Coastguard Worker VertexCubeTextureCase::deinit();
1002*35238bceSAndroid Build Coastguard Worker }
1003*35238bceSAndroid Build Coastguard Worker
init(void)1004*35238bceSAndroid Build Coastguard Worker void VertexCubeTextureCase::init(void)
1005*35238bceSAndroid Build Coastguard Worker {
1006*35238bceSAndroid Build Coastguard Worker const char *const vertexShader = "#version 300 es\n"
1007*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_position;\n"
1008*35238bceSAndroid Build Coastguard Worker "in highp vec3 a_texCoord;\n"
1009*35238bceSAndroid Build Coastguard Worker "uniform highp samplerCube u_texture;\n"
1010*35238bceSAndroid Build Coastguard Worker "uniform highp float u_lod;\n"
1011*35238bceSAndroid Build Coastguard Worker "out mediump vec4 v_color;\n"
1012*35238bceSAndroid Build Coastguard Worker "\n"
1013*35238bceSAndroid Build Coastguard Worker "void main()\n"
1014*35238bceSAndroid Build Coastguard Worker "{\n"
1015*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(a_position, 0.0, 1.0);\n"
1016*35238bceSAndroid Build Coastguard Worker " v_color = textureLod(u_texture, a_texCoord, u_lod);\n"
1017*35238bceSAndroid Build Coastguard Worker "}\n";
1018*35238bceSAndroid Build Coastguard Worker
1019*35238bceSAndroid Build Coastguard Worker const char *const fragmentShader = "#version 300 es\n"
1020*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
1021*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_color;\n"
1022*35238bceSAndroid Build Coastguard Worker "\n"
1023*35238bceSAndroid Build Coastguard Worker "void main()\n"
1024*35238bceSAndroid Build Coastguard Worker "{\n"
1025*35238bceSAndroid Build Coastguard Worker " dEQP_FragColor = v_color;\n"
1026*35238bceSAndroid Build Coastguard Worker "}\n";
1027*35238bceSAndroid Build Coastguard Worker
1028*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getNumSamples() != 0)
1029*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("MSAA config not supported by this test");
1030*35238bceSAndroid Build Coastguard Worker
1031*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_program);
1032*35238bceSAndroid Build Coastguard Worker m_program =
1033*35238bceSAndroid Build Coastguard Worker new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShader, fragmentShader));
1034*35238bceSAndroid Build Coastguard Worker
1035*35238bceSAndroid Build Coastguard Worker if (!m_program->isOk())
1036*35238bceSAndroid Build Coastguard Worker {
1037*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << *m_program;
1038*35238bceSAndroid Build Coastguard Worker
1039*35238bceSAndroid Build Coastguard Worker GLint maxVertexTextures;
1040*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextures);
1041*35238bceSAndroid Build Coastguard Worker
1042*35238bceSAndroid Build Coastguard Worker if (maxVertexTextures < 1)
1043*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Vertex texture image units not supported", "", __FILE__, __LINE__);
1044*35238bceSAndroid Build Coastguard Worker else
1045*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Failed to compile shader");
1046*35238bceSAndroid Build Coastguard Worker }
1047*35238bceSAndroid Build Coastguard Worker
1048*35238bceSAndroid Build Coastguard Worker // Make the textures.
1049*35238bceSAndroid Build Coastguard Worker try
1050*35238bceSAndroid Build Coastguard Worker {
1051*35238bceSAndroid Build Coastguard Worker // Compute suitable power-of-two sizes (for mipmaps).
1052*35238bceSAndroid Build Coastguard Worker const int texWidth = 1 << deLog2Ceil32(MAX_CUBE_RENDER_WIDTH / 3 / 2);
1053*35238bceSAndroid Build Coastguard Worker const int texHeight = 1 << deLog2Ceil32(MAX_CUBE_RENDER_HEIGHT / 2 / 2);
1054*35238bceSAndroid Build Coastguard Worker
1055*35238bceSAndroid Build Coastguard Worker DE_ASSERT(texWidth == texHeight);
1056*35238bceSAndroid Build Coastguard Worker DE_UNREF(texHeight);
1057*35238bceSAndroid Build Coastguard Worker
1058*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1059*35238bceSAndroid Build Coastguard Worker {
1060*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_textures[i]);
1061*35238bceSAndroid Build Coastguard Worker m_textures[i] = new glu::TextureCube(m_context.getRenderContext(), GL_RGB, GL_UNSIGNED_BYTE, texWidth);
1062*35238bceSAndroid Build Coastguard Worker }
1063*35238bceSAndroid Build Coastguard Worker
1064*35238bceSAndroid Build Coastguard Worker const bool mipmaps = deIsPowerOfTwo32(texWidth) != false;
1065*35238bceSAndroid Build Coastguard Worker const int numLevels = mipmaps ? deLog2Floor32(texWidth) + 1 : 1;
1066*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(m_textures[0]->getRefTexture().getFormat());
1067*35238bceSAndroid Build Coastguard Worker const Vec4 cBias = fmtInfo.valueMin;
1068*35238bceSAndroid Build Coastguard Worker const Vec4 cScale = fmtInfo.valueMax - fmtInfo.valueMin;
1069*35238bceSAndroid Build Coastguard Worker
1070*35238bceSAndroid Build Coastguard Worker // Fill first with gradient texture.
1071*35238bceSAndroid Build Coastguard Worker static const Vec4 gradients[tcu::CUBEFACE_LAST][2] = {
1072*35238bceSAndroid Build Coastguard Worker {Vec4(-1.0f, -1.0f, -1.0f, 2.0f), Vec4(1.0f, 1.0f, 1.0f, 0.0f)}, // negative x
1073*35238bceSAndroid Build Coastguard Worker {Vec4(0.0f, -1.0f, -1.0f, 2.0f), Vec4(1.0f, 1.0f, 1.0f, 0.0f)}, // positive x
1074*35238bceSAndroid Build Coastguard Worker {Vec4(-1.0f, 0.0f, -1.0f, 2.0f), Vec4(1.0f, 1.0f, 1.0f, 0.0f)}, // negative y
1075*35238bceSAndroid Build Coastguard Worker {Vec4(-1.0f, -1.0f, 0.0f, 2.0f), Vec4(1.0f, 1.0f, 1.0f, 0.0f)}, // positive y
1076*35238bceSAndroid Build Coastguard Worker {Vec4(-1.0f, -1.0f, -1.0f, 0.0f), Vec4(1.0f, 1.0f, 1.0f, 1.0f)}, // negative z
1077*35238bceSAndroid Build Coastguard Worker {Vec4(0.0f, 0.0f, 0.0f, 2.0f), Vec4(1.0f, 1.0f, 1.0f, 0.0f)} // positive z
1078*35238bceSAndroid Build Coastguard Worker };
1079*35238bceSAndroid Build Coastguard Worker for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
1080*35238bceSAndroid Build Coastguard Worker {
1081*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
1082*35238bceSAndroid Build Coastguard Worker {
1083*35238bceSAndroid Build Coastguard Worker m_textures[0]->getRefTexture().allocLevel((tcu::CubeFace)face, levelNdx);
1084*35238bceSAndroid Build Coastguard Worker tcu::fillWithComponentGradients(
1085*35238bceSAndroid Build Coastguard Worker m_textures[0]->getRefTexture().getLevelFace(levelNdx, (tcu::CubeFace)face),
1086*35238bceSAndroid Build Coastguard Worker gradients[face][0] * cScale + cBias, gradients[face][1] * cScale + cBias);
1087*35238bceSAndroid Build Coastguard Worker }
1088*35238bceSAndroid Build Coastguard Worker }
1089*35238bceSAndroid Build Coastguard Worker
1090*35238bceSAndroid Build Coastguard Worker // Fill second with grid texture.
1091*35238bceSAndroid Build Coastguard Worker for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
1092*35238bceSAndroid Build Coastguard Worker {
1093*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
1094*35238bceSAndroid Build Coastguard Worker {
1095*35238bceSAndroid Build Coastguard Worker const uint32_t step = 0x00ffffff / (numLevels * tcu::CUBEFACE_LAST);
1096*35238bceSAndroid Build Coastguard Worker const uint32_t rgb = step * levelNdx * face;
1097*35238bceSAndroid Build Coastguard Worker const uint32_t colorA = 0xff000000 | rgb;
1098*35238bceSAndroid Build Coastguard Worker const uint32_t colorB = 0xff000000 | ~rgb;
1099*35238bceSAndroid Build Coastguard Worker
1100*35238bceSAndroid Build Coastguard Worker m_textures[1]->getRefTexture().allocLevel((tcu::CubeFace)face, levelNdx);
1101*35238bceSAndroid Build Coastguard Worker tcu::fillWithGrid(m_textures[1]->getRefTexture().getLevelFace(levelNdx, (tcu::CubeFace)face), 4,
1102*35238bceSAndroid Build Coastguard Worker tcu::RGBA(colorA).toVec() * cScale + cBias,
1103*35238bceSAndroid Build Coastguard Worker tcu::RGBA(colorB).toVec() * cScale + cBias);
1104*35238bceSAndroid Build Coastguard Worker }
1105*35238bceSAndroid Build Coastguard Worker }
1106*35238bceSAndroid Build Coastguard Worker
1107*35238bceSAndroid Build Coastguard Worker // Upload.
1108*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1109*35238bceSAndroid Build Coastguard Worker m_textures[i]->upload();
1110*35238bceSAndroid Build Coastguard Worker }
1111*35238bceSAndroid Build Coastguard Worker catch (const std::exception &)
1112*35238bceSAndroid Build Coastguard Worker {
1113*35238bceSAndroid Build Coastguard Worker // Clean up to save memory.
1114*35238bceSAndroid Build Coastguard Worker VertexCubeTextureCase::deinit();
1115*35238bceSAndroid Build Coastguard Worker throw;
1116*35238bceSAndroid Build Coastguard Worker }
1117*35238bceSAndroid Build Coastguard Worker }
1118*35238bceSAndroid Build Coastguard Worker
deinit(void)1119*35238bceSAndroid Build Coastguard Worker void VertexCubeTextureCase::deinit(void)
1120*35238bceSAndroid Build Coastguard Worker {
1121*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1122*35238bceSAndroid Build Coastguard Worker {
1123*35238bceSAndroid Build Coastguard Worker delete m_textures[i];
1124*35238bceSAndroid Build Coastguard Worker m_textures[i] = DE_NULL;
1125*35238bceSAndroid Build Coastguard Worker }
1126*35238bceSAndroid Build Coastguard Worker
1127*35238bceSAndroid Build Coastguard Worker delete m_program;
1128*35238bceSAndroid Build Coastguard Worker m_program = DE_NULL;
1129*35238bceSAndroid Build Coastguard Worker }
1130*35238bceSAndroid Build Coastguard Worker
calculateLod(const Vec2 & texScale,const Vec2 & dstSize,int textureNdx) const1131*35238bceSAndroid Build Coastguard Worker float VertexCubeTextureCase::calculateLod(const Vec2 &texScale, const Vec2 &dstSize, int textureNdx) const
1132*35238bceSAndroid Build Coastguard Worker {
1133*35238bceSAndroid Build Coastguard Worker const tcu::TextureCube &refTexture = m_textures[textureNdx]->getRefTexture();
1134*35238bceSAndroid Build Coastguard Worker const Vec2 srcSize = Vec2((float)refTexture.getSize(), (float)refTexture.getSize());
1135*35238bceSAndroid Build Coastguard Worker const Vec2 sizeRatio = texScale * srcSize / dstSize;
1136*35238bceSAndroid Build Coastguard Worker
1137*35238bceSAndroid Build Coastguard Worker // \note In this particular case, dv/dx and du/dy are zero, simplifying the expression.
1138*35238bceSAndroid Build Coastguard Worker return deFloatLog2(de::max(sizeRatio.x(), sizeRatio.y()));
1139*35238bceSAndroid Build Coastguard Worker }
1140*35238bceSAndroid Build Coastguard Worker
iterate(void)1141*35238bceSAndroid Build Coastguard Worker VertexCubeTextureCase::IterateResult VertexCubeTextureCase::iterate(void)
1142*35238bceSAndroid Build Coastguard Worker {
1143*35238bceSAndroid Build Coastguard Worker const int viewportWidth = deMin32(m_context.getRenderTarget().getWidth(), MAX_CUBE_RENDER_WIDTH);
1144*35238bceSAndroid Build Coastguard Worker const int viewportHeight = deMin32(m_context.getRenderTarget().getHeight(), MAX_CUBE_RENDER_HEIGHT);
1145*35238bceSAndroid Build Coastguard Worker
1146*35238bceSAndroid Build Coastguard Worker const int viewportXOffsetMax = m_context.getRenderTarget().getWidth() - viewportWidth;
1147*35238bceSAndroid Build Coastguard Worker const int viewportYOffsetMax = m_context.getRenderTarget().getHeight() - viewportHeight;
1148*35238bceSAndroid Build Coastguard Worker
1149*35238bceSAndroid Build Coastguard Worker de::Random rnd(deStringHash(getName()));
1150*35238bceSAndroid Build Coastguard Worker
1151*35238bceSAndroid Build Coastguard Worker const int viewportXOffset = rnd.getInt(0, viewportXOffsetMax);
1152*35238bceSAndroid Build Coastguard Worker const int viewportYOffset = rnd.getInt(0, viewportYOffsetMax);
1153*35238bceSAndroid Build Coastguard Worker
1154*35238bceSAndroid Build Coastguard Worker glUseProgram(m_program->getProgram());
1155*35238bceSAndroid Build Coastguard Worker
1156*35238bceSAndroid Build Coastguard Worker // Divide viewport into 4 areas.
1157*35238bceSAndroid Build Coastguard Worker const int leftWidth = viewportWidth / 2;
1158*35238bceSAndroid Build Coastguard Worker const int rightWidth = viewportWidth - leftWidth;
1159*35238bceSAndroid Build Coastguard Worker const int bottomHeight = viewportHeight / 2;
1160*35238bceSAndroid Build Coastguard Worker const int topHeight = viewportHeight - bottomHeight;
1161*35238bceSAndroid Build Coastguard Worker
1162*35238bceSAndroid Build Coastguard Worker // Clear.
1163*35238bceSAndroid Build Coastguard Worker glClearColor(0.125f, 0.25f, 0.5f, 1.0f);
1164*35238bceSAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1165*35238bceSAndroid Build Coastguard Worker
1166*35238bceSAndroid Build Coastguard Worker // Texture scaling and offsetting vectors.
1167*35238bceSAndroid Build Coastguard Worker const Vec2 texMinScale(1.0f, 1.0f);
1168*35238bceSAndroid Build Coastguard Worker const Vec2 texMinOffset(0.0f, 0.0f);
1169*35238bceSAndroid Build Coastguard Worker const Vec2 texMagScale(0.3f, 0.3f);
1170*35238bceSAndroid Build Coastguard Worker const Vec2 texMagOffset(0.5f, 0.3f);
1171*35238bceSAndroid Build Coastguard Worker
1172*35238bceSAndroid Build Coastguard Worker // Surface for the reference image.
1173*35238bceSAndroid Build Coastguard Worker tcu::Surface refImage(viewportWidth, viewportHeight);
1174*35238bceSAndroid Build Coastguard Worker
1175*35238bceSAndroid Build Coastguard Worker // Each of the four areas is divided into 6 cells.
1176*35238bceSAndroid Build Coastguard Worker const int defCellWidth = viewportWidth / 2 / 3;
1177*35238bceSAndroid Build Coastguard Worker const int defCellHeight = viewportHeight / 2 / 2;
1178*35238bceSAndroid Build Coastguard Worker
1179*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < tcu::CUBEFACE_LAST; i++)
1180*35238bceSAndroid Build Coastguard Worker {
1181*35238bceSAndroid Build Coastguard Worker const int cellOffsetX = defCellWidth * (i % 3);
1182*35238bceSAndroid Build Coastguard Worker const int cellOffsetY = defCellHeight * (i / 3);
1183*35238bceSAndroid Build Coastguard Worker const bool isRightmostCell = i == 2 || i == 5;
1184*35238bceSAndroid Build Coastguard Worker const bool isTopCell = i >= 3;
1185*35238bceSAndroid Build Coastguard Worker const int leftCellWidth = isRightmostCell ? leftWidth - cellOffsetX : defCellWidth;
1186*35238bceSAndroid Build Coastguard Worker const int rightCellWidth = isRightmostCell ? rightWidth - cellOffsetX : defCellWidth;
1187*35238bceSAndroid Build Coastguard Worker const int bottomCellHeight = isTopCell ? bottomHeight - cellOffsetY : defCellHeight;
1188*35238bceSAndroid Build Coastguard Worker const int topCellHeight = isTopCell ? topHeight - cellOffsetY : defCellHeight;
1189*35238bceSAndroid Build Coastguard Worker
1190*35238bceSAndroid Build Coastguard Worker const struct Render
1191*35238bceSAndroid Build Coastguard Worker {
1192*35238bceSAndroid Build Coastguard Worker const Rect region;
1193*35238bceSAndroid Build Coastguard Worker int textureNdx;
1194*35238bceSAndroid Build Coastguard Worker const Vec2 texCoordScale;
1195*35238bceSAndroid Build Coastguard Worker const Vec2 texCoordOffset;
1196*35238bceSAndroid Build Coastguard Worker Render(const Rect &r, int tN, const Vec2 &tS, const Vec2 &tO)
1197*35238bceSAndroid Build Coastguard Worker : region(r)
1198*35238bceSAndroid Build Coastguard Worker , textureNdx(tN)
1199*35238bceSAndroid Build Coastguard Worker , texCoordScale(tS)
1200*35238bceSAndroid Build Coastguard Worker , texCoordOffset(tO)
1201*35238bceSAndroid Build Coastguard Worker {
1202*35238bceSAndroid Build Coastguard Worker }
1203*35238bceSAndroid Build Coastguard Worker } renders[] = {Render(Rect(cellOffsetX + 0, cellOffsetY + 0, leftCellWidth, bottomCellHeight), 0, texMinScale,
1204*35238bceSAndroid Build Coastguard Worker texMinOffset),
1205*35238bceSAndroid Build Coastguard Worker Render(Rect(cellOffsetX + leftWidth, cellOffsetY + 0, rightCellWidth, bottomCellHeight), 0,
1206*35238bceSAndroid Build Coastguard Worker texMagScale, texMagOffset),
1207*35238bceSAndroid Build Coastguard Worker Render(Rect(cellOffsetX + 0, cellOffsetY + bottomHeight, leftCellWidth, topCellHeight), 1,
1208*35238bceSAndroid Build Coastguard Worker texMinScale, texMinOffset),
1209*35238bceSAndroid Build Coastguard Worker Render(Rect(cellOffsetX + leftWidth, cellOffsetY + bottomHeight, rightCellWidth, topCellHeight),
1210*35238bceSAndroid Build Coastguard Worker 1, texMagScale, texMagOffset)};
1211*35238bceSAndroid Build Coastguard Worker
1212*35238bceSAndroid Build Coastguard Worker for (int renderNdx = 0; renderNdx < DE_LENGTH_OF_ARRAY(renders); renderNdx++)
1213*35238bceSAndroid Build Coastguard Worker {
1214*35238bceSAndroid Build Coastguard Worker const Render &rend = renders[renderNdx];
1215*35238bceSAndroid Build Coastguard Worker const float lod = calculateLod(rend.texCoordScale, rend.region.size().asFloat(), rend.textureNdx);
1216*35238bceSAndroid Build Coastguard Worker const bool useSafeTexCoords = isLevelNearest(lod > 0.0f ? m_minFilter : m_magFilter);
1217*35238bceSAndroid Build Coastguard Worker const Grid grid(
1218*35238bceSAndroid Build Coastguard Worker GRID_SIZE_CUBE, rend.region.size(), getTextureSize(*m_textures[rend.textureNdx]),
1219*35238bceSAndroid Build Coastguard Worker TexTypeCoordParams<TEXTURETYPE_CUBE>(rend.texCoordScale, rend.texCoordOffset, (tcu::CubeFace)i),
1220*35238bceSAndroid Build Coastguard Worker useSafeTexCoords);
1221*35238bceSAndroid Build Coastguard Worker
1222*35238bceSAndroid Build Coastguard Worker glViewport(viewportXOffset + rend.region.x, viewportYOffset + rend.region.y, rend.region.w, rend.region.h);
1223*35238bceSAndroid Build Coastguard Worker renderCell(rend.textureNdx, lod, grid);
1224*35238bceSAndroid Build Coastguard Worker computeReferenceCell(rend.textureNdx, lod, grid, refImage, rend.region);
1225*35238bceSAndroid Build Coastguard Worker }
1226*35238bceSAndroid Build Coastguard Worker }
1227*35238bceSAndroid Build Coastguard Worker
1228*35238bceSAndroid Build Coastguard Worker // Read back rendered results.
1229*35238bceSAndroid Build Coastguard Worker tcu::Surface resImage(viewportWidth, viewportHeight);
1230*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportXOffset, viewportYOffset, resImage.getAccess());
1231*35238bceSAndroid Build Coastguard Worker
1232*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
1233*35238bceSAndroid Build Coastguard Worker
1234*35238bceSAndroid Build Coastguard Worker // Compare and log.
1235*35238bceSAndroid Build Coastguard Worker {
1236*35238bceSAndroid Build Coastguard Worker const bool isOk = compareImages(m_context.getRenderContext(), m_testCtx.getLog(), refImage, resImage);
1237*35238bceSAndroid Build Coastguard Worker
1238*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
1239*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Image comparison failed");
1240*35238bceSAndroid Build Coastguard Worker }
1241*35238bceSAndroid Build Coastguard Worker
1242*35238bceSAndroid Build Coastguard Worker return STOP;
1243*35238bceSAndroid Build Coastguard Worker }
1244*35238bceSAndroid Build Coastguard Worker
setupShaderInputs(int textureNdx,float lod,const Grid & grid) const1245*35238bceSAndroid Build Coastguard Worker void VertexCubeTextureCase::setupShaderInputs(int textureNdx, float lod, const Grid &grid) const
1246*35238bceSAndroid Build Coastguard Worker {
1247*35238bceSAndroid Build Coastguard Worker const uint32_t programID = m_program->getProgram();
1248*35238bceSAndroid Build Coastguard Worker
1249*35238bceSAndroid Build Coastguard Worker // SETUP ATTRIBUTES.
1250*35238bceSAndroid Build Coastguard Worker
1251*35238bceSAndroid Build Coastguard Worker {
1252*35238bceSAndroid Build Coastguard Worker const int positionLoc = glGetAttribLocation(programID, "a_position");
1253*35238bceSAndroid Build Coastguard Worker if (positionLoc != -1)
1254*35238bceSAndroid Build Coastguard Worker {
1255*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
1256*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, grid.getPositionPtr());
1257*35238bceSAndroid Build Coastguard Worker }
1258*35238bceSAndroid Build Coastguard Worker }
1259*35238bceSAndroid Build Coastguard Worker
1260*35238bceSAndroid Build Coastguard Worker {
1261*35238bceSAndroid Build Coastguard Worker const int texCoordLoc = glGetAttribLocation(programID, "a_texCoord");
1262*35238bceSAndroid Build Coastguard Worker if (texCoordLoc != -1)
1263*35238bceSAndroid Build Coastguard Worker {
1264*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(texCoordLoc);
1265*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(texCoordLoc, 3, GL_FLOAT, GL_FALSE, 0, grid.getTexCoordPtr());
1266*35238bceSAndroid Build Coastguard Worker }
1267*35238bceSAndroid Build Coastguard Worker }
1268*35238bceSAndroid Build Coastguard Worker
1269*35238bceSAndroid Build Coastguard Worker // SETUP UNIFORMS.
1270*35238bceSAndroid Build Coastguard Worker
1271*35238bceSAndroid Build Coastguard Worker {
1272*35238bceSAndroid Build Coastguard Worker const int lodLoc = glGetUniformLocation(programID, "u_lod");
1273*35238bceSAndroid Build Coastguard Worker if (lodLoc != -1)
1274*35238bceSAndroid Build Coastguard Worker glUniform1f(lodLoc, lod);
1275*35238bceSAndroid Build Coastguard Worker }
1276*35238bceSAndroid Build Coastguard Worker
1277*35238bceSAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
1278*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, m_textures[textureNdx]->getGLTexture());
1279*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, m_wrapS);
1280*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, m_wrapT);
1281*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, m_minFilter);
1282*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, m_magFilter);
1283*35238bceSAndroid Build Coastguard Worker
1284*35238bceSAndroid Build Coastguard Worker {
1285*35238bceSAndroid Build Coastguard Worker const int texLoc = glGetUniformLocation(programID, "u_texture");
1286*35238bceSAndroid Build Coastguard Worker if (texLoc != -1)
1287*35238bceSAndroid Build Coastguard Worker glUniform1i(texLoc, 0);
1288*35238bceSAndroid Build Coastguard Worker }
1289*35238bceSAndroid Build Coastguard Worker }
1290*35238bceSAndroid Build Coastguard Worker
1291*35238bceSAndroid Build Coastguard Worker // Renders one cube face with given parameters.
renderCell(int textureNdx,float lod,const Grid & grid) const1292*35238bceSAndroid Build Coastguard Worker void VertexCubeTextureCase::renderCell(int textureNdx, float lod, const Grid &grid) const
1293*35238bceSAndroid Build Coastguard Worker {
1294*35238bceSAndroid Build Coastguard Worker setupShaderInputs(textureNdx, lod, grid);
1295*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, grid.getNumIndices(), GL_UNSIGNED_SHORT, grid.getIndexPtr());
1296*35238bceSAndroid Build Coastguard Worker }
1297*35238bceSAndroid Build Coastguard Worker
1298*35238bceSAndroid Build Coastguard Worker // Computes reference for one cube face with given parameters.
computeReferenceCell(int textureNdx,float lod,const Grid & grid,tcu::Surface & dst,const Rect & dstRegion) const1299*35238bceSAndroid Build Coastguard Worker void VertexCubeTextureCase::computeReferenceCell(int textureNdx, float lod, const Grid &grid, tcu::Surface &dst,
1300*35238bceSAndroid Build Coastguard Worker const Rect &dstRegion) const
1301*35238bceSAndroid Build Coastguard Worker {
1302*35238bceSAndroid Build Coastguard Worker tcu::Sampler sampler = glu::mapGLSampler(m_wrapS, m_wrapT, m_minFilter, m_magFilter);
1303*35238bceSAndroid Build Coastguard Worker sampler.seamlessCubeMap = true;
1304*35238bceSAndroid Build Coastguard Worker computeReference(m_textures[textureNdx]->getRefTexture(), lod, sampler, grid, dst, dstRegion);
1305*35238bceSAndroid Build Coastguard Worker }
1306*35238bceSAndroid Build Coastguard Worker
1307*35238bceSAndroid Build Coastguard Worker class Vertex2DArrayTextureCase : public TestCase
1308*35238bceSAndroid Build Coastguard Worker {
1309*35238bceSAndroid Build Coastguard Worker public:
1310*35238bceSAndroid Build Coastguard Worker Vertex2DArrayTextureCase(Context &testCtx, const char *name, const char *desc, uint32_t minFilter,
1311*35238bceSAndroid Build Coastguard Worker uint32_t magFilter, uint32_t wrapS, uint32_t wrapT);
1312*35238bceSAndroid Build Coastguard Worker ~Vertex2DArrayTextureCase(void);
1313*35238bceSAndroid Build Coastguard Worker
1314*35238bceSAndroid Build Coastguard Worker void init(void);
1315*35238bceSAndroid Build Coastguard Worker void deinit(void);
1316*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
1317*35238bceSAndroid Build Coastguard Worker
1318*35238bceSAndroid Build Coastguard Worker private:
1319*35238bceSAndroid Build Coastguard Worker typedef PosTexCoordQuadGrid<TEXTURETYPE_2D_ARRAY> Grid;
1320*35238bceSAndroid Build Coastguard Worker
1321*35238bceSAndroid Build Coastguard Worker Vertex2DArrayTextureCase(const Vertex2DArrayTextureCase &other);
1322*35238bceSAndroid Build Coastguard Worker Vertex2DArrayTextureCase &operator=(const Vertex2DArrayTextureCase &other);
1323*35238bceSAndroid Build Coastguard Worker
1324*35238bceSAndroid Build Coastguard Worker float calculateLod(const Mat3 &transf, const Vec2 &dstSize, int textureNdx) const;
1325*35238bceSAndroid Build Coastguard Worker void setupShaderInputs(int textureNdx, float lod, const Grid &grid) const;
1326*35238bceSAndroid Build Coastguard Worker void renderCell(int textureNdx, float lod, const Grid &grid) const;
1327*35238bceSAndroid Build Coastguard Worker void computeReferenceCell(int textureNdx, float lod, const Grid &grid, tcu::Surface &dst,
1328*35238bceSAndroid Build Coastguard Worker const Rect &dstRegion) const;
1329*35238bceSAndroid Build Coastguard Worker
1330*35238bceSAndroid Build Coastguard Worker const uint32_t m_minFilter;
1331*35238bceSAndroid Build Coastguard Worker const uint32_t m_magFilter;
1332*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapS;
1333*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapT;
1334*35238bceSAndroid Build Coastguard Worker
1335*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram *m_program;
1336*35238bceSAndroid Build Coastguard Worker glu::Texture2DArray *m_textures[2]; // 2 textures, a gradient texture and a grid texture.
1337*35238bceSAndroid Build Coastguard Worker };
1338*35238bceSAndroid Build Coastguard Worker
Vertex2DArrayTextureCase(Context & testCtx,const char * name,const char * desc,uint32_t minFilter,uint32_t magFilter,uint32_t wrapS,uint32_t wrapT)1339*35238bceSAndroid Build Coastguard Worker Vertex2DArrayTextureCase::Vertex2DArrayTextureCase(Context &testCtx, const char *name, const char *desc,
1340*35238bceSAndroid Build Coastguard Worker uint32_t minFilter, uint32_t magFilter, uint32_t wrapS,
1341*35238bceSAndroid Build Coastguard Worker uint32_t wrapT)
1342*35238bceSAndroid Build Coastguard Worker : TestCase(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, desc)
1343*35238bceSAndroid Build Coastguard Worker , m_minFilter(minFilter)
1344*35238bceSAndroid Build Coastguard Worker , m_magFilter(magFilter)
1345*35238bceSAndroid Build Coastguard Worker , m_wrapS(wrapS)
1346*35238bceSAndroid Build Coastguard Worker , m_wrapT(wrapT)
1347*35238bceSAndroid Build Coastguard Worker , m_program(DE_NULL)
1348*35238bceSAndroid Build Coastguard Worker {
1349*35238bceSAndroid Build Coastguard Worker m_textures[0] = DE_NULL;
1350*35238bceSAndroid Build Coastguard Worker m_textures[1] = DE_NULL;
1351*35238bceSAndroid Build Coastguard Worker }
1352*35238bceSAndroid Build Coastguard Worker
~Vertex2DArrayTextureCase(void)1353*35238bceSAndroid Build Coastguard Worker Vertex2DArrayTextureCase::~Vertex2DArrayTextureCase(void)
1354*35238bceSAndroid Build Coastguard Worker {
1355*35238bceSAndroid Build Coastguard Worker Vertex2DArrayTextureCase::deinit();
1356*35238bceSAndroid Build Coastguard Worker }
1357*35238bceSAndroid Build Coastguard Worker
init(void)1358*35238bceSAndroid Build Coastguard Worker void Vertex2DArrayTextureCase::init(void)
1359*35238bceSAndroid Build Coastguard Worker {
1360*35238bceSAndroid Build Coastguard Worker const char *const vertexShaderSource = "#version 300 es\n"
1361*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_position;\n"
1362*35238bceSAndroid Build Coastguard Worker "in highp vec3 a_texCoord;\n"
1363*35238bceSAndroid Build Coastguard Worker "uniform highp sampler2DArray u_texture;\n"
1364*35238bceSAndroid Build Coastguard Worker "uniform highp float u_lod;\n"
1365*35238bceSAndroid Build Coastguard Worker "out mediump vec4 v_color;\n"
1366*35238bceSAndroid Build Coastguard Worker "\n"
1367*35238bceSAndroid Build Coastguard Worker "void main()\n"
1368*35238bceSAndroid Build Coastguard Worker "{\n"
1369*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(a_position, 0.0, 1.0);\n"
1370*35238bceSAndroid Build Coastguard Worker " v_color = textureLod(u_texture, a_texCoord, u_lod);\n"
1371*35238bceSAndroid Build Coastguard Worker "}\n";
1372*35238bceSAndroid Build Coastguard Worker
1373*35238bceSAndroid Build Coastguard Worker const char *const fragmentShaderSource = "#version 300 es\n"
1374*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
1375*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_color;\n"
1376*35238bceSAndroid Build Coastguard Worker "\n"
1377*35238bceSAndroid Build Coastguard Worker "void main()\n"
1378*35238bceSAndroid Build Coastguard Worker "{\n"
1379*35238bceSAndroid Build Coastguard Worker " dEQP_FragColor = v_color;\n"
1380*35238bceSAndroid Build Coastguard Worker "}\n";
1381*35238bceSAndroid Build Coastguard Worker
1382*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getNumSamples() != 0)
1383*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("MSAA config not supported by this test");
1384*35238bceSAndroid Build Coastguard Worker
1385*35238bceSAndroid Build Coastguard Worker // Create shader.
1386*35238bceSAndroid Build Coastguard Worker
1387*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_program);
1388*35238bceSAndroid Build Coastguard Worker m_program = new glu::ShaderProgram(m_context.getRenderContext(),
1389*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1390*35238bceSAndroid Build Coastguard Worker
1391*35238bceSAndroid Build Coastguard Worker if (!m_program->isOk())
1392*35238bceSAndroid Build Coastguard Worker {
1393*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << *m_program;
1394*35238bceSAndroid Build Coastguard Worker
1395*35238bceSAndroid Build Coastguard Worker GLint maxVertexTextures;
1396*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextures);
1397*35238bceSAndroid Build Coastguard Worker
1398*35238bceSAndroid Build Coastguard Worker if (maxVertexTextures < 1)
1399*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Vertex texture image units not supported", "", __FILE__, __LINE__);
1400*35238bceSAndroid Build Coastguard Worker else
1401*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Failed to compile shader");
1402*35238bceSAndroid Build Coastguard Worker }
1403*35238bceSAndroid Build Coastguard Worker
1404*35238bceSAndroid Build Coastguard Worker // Make the textures.
1405*35238bceSAndroid Build Coastguard Worker
1406*35238bceSAndroid Build Coastguard Worker try
1407*35238bceSAndroid Build Coastguard Worker {
1408*35238bceSAndroid Build Coastguard Worker const int texWidth = WIDTH_2D_ARRAY;
1409*35238bceSAndroid Build Coastguard Worker const int texHeight = HEIGHT_2D_ARRAY;
1410*35238bceSAndroid Build Coastguard Worker const int texLayers = LAYERS_2D_ARRAY;
1411*35238bceSAndroid Build Coastguard Worker
1412*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1413*35238bceSAndroid Build Coastguard Worker {
1414*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_textures[i]);
1415*35238bceSAndroid Build Coastguard Worker m_textures[i] = new glu::Texture2DArray(m_context.getRenderContext(), GL_RGB, GL_UNSIGNED_BYTE, texWidth,
1416*35238bceSAndroid Build Coastguard Worker texHeight, texLayers);
1417*35238bceSAndroid Build Coastguard Worker }
1418*35238bceSAndroid Build Coastguard Worker
1419*35238bceSAndroid Build Coastguard Worker const int numLevels = deLog2Floor32(de::max(texWidth, texHeight)) + 1;
1420*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(m_textures[0]->getRefTexture().getFormat());
1421*35238bceSAndroid Build Coastguard Worker const Vec4 cBias = fmtInfo.valueMin;
1422*35238bceSAndroid Build Coastguard Worker const Vec4 cScale = fmtInfo.valueMax - fmtInfo.valueMin;
1423*35238bceSAndroid Build Coastguard Worker
1424*35238bceSAndroid Build Coastguard Worker // Fill first with gradient texture.
1425*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
1426*35238bceSAndroid Build Coastguard Worker {
1427*35238bceSAndroid Build Coastguard Worker const Vec4 gMin = Vec4(-0.5f, -0.5f, -0.5f, 2.0f) * cScale + cBias;
1428*35238bceSAndroid Build Coastguard Worker const Vec4 gMax = Vec4(1.0f, 1.0f, 1.0f, 0.0f) * cScale + cBias;
1429*35238bceSAndroid Build Coastguard Worker
1430*35238bceSAndroid Build Coastguard Worker m_textures[0]->getRefTexture().allocLevel(levelNdx);
1431*35238bceSAndroid Build Coastguard Worker tcu::fillWithComponentGradients(m_textures[0]->getRefTexture().getLevel(levelNdx), gMin, gMax);
1432*35238bceSAndroid Build Coastguard Worker }
1433*35238bceSAndroid Build Coastguard Worker
1434*35238bceSAndroid Build Coastguard Worker // Fill second with grid texture.
1435*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
1436*35238bceSAndroid Build Coastguard Worker {
1437*35238bceSAndroid Build Coastguard Worker const uint32_t step = 0x00ffffff / numLevels;
1438*35238bceSAndroid Build Coastguard Worker const uint32_t rgb = step * levelNdx;
1439*35238bceSAndroid Build Coastguard Worker const uint32_t colorA = 0xff000000 | rgb;
1440*35238bceSAndroid Build Coastguard Worker const uint32_t colorB = 0xff000000 | ~rgb;
1441*35238bceSAndroid Build Coastguard Worker
1442*35238bceSAndroid Build Coastguard Worker m_textures[1]->getRefTexture().allocLevel(levelNdx);
1443*35238bceSAndroid Build Coastguard Worker tcu::fillWithGrid(m_textures[1]->getRefTexture().getLevel(levelNdx), 4,
1444*35238bceSAndroid Build Coastguard Worker tcu::RGBA(colorA).toVec() * cScale + cBias, tcu::RGBA(colorB).toVec() * cScale + cBias);
1445*35238bceSAndroid Build Coastguard Worker }
1446*35238bceSAndroid Build Coastguard Worker
1447*35238bceSAndroid Build Coastguard Worker // Upload.
1448*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1449*35238bceSAndroid Build Coastguard Worker m_textures[i]->upload();
1450*35238bceSAndroid Build Coastguard Worker }
1451*35238bceSAndroid Build Coastguard Worker catch (const std::exception &)
1452*35238bceSAndroid Build Coastguard Worker {
1453*35238bceSAndroid Build Coastguard Worker // Clean up to save memory.
1454*35238bceSAndroid Build Coastguard Worker Vertex2DArrayTextureCase::deinit();
1455*35238bceSAndroid Build Coastguard Worker throw;
1456*35238bceSAndroid Build Coastguard Worker }
1457*35238bceSAndroid Build Coastguard Worker }
1458*35238bceSAndroid Build Coastguard Worker
deinit(void)1459*35238bceSAndroid Build Coastguard Worker void Vertex2DArrayTextureCase::deinit(void)
1460*35238bceSAndroid Build Coastguard Worker {
1461*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1462*35238bceSAndroid Build Coastguard Worker {
1463*35238bceSAndroid Build Coastguard Worker delete m_textures[i];
1464*35238bceSAndroid Build Coastguard Worker m_textures[i] = DE_NULL;
1465*35238bceSAndroid Build Coastguard Worker }
1466*35238bceSAndroid Build Coastguard Worker
1467*35238bceSAndroid Build Coastguard Worker delete m_program;
1468*35238bceSAndroid Build Coastguard Worker m_program = DE_NULL;
1469*35238bceSAndroid Build Coastguard Worker }
1470*35238bceSAndroid Build Coastguard Worker
calculateLod(const Mat3 & transf,const Vec2 & dstSize,int textureNdx) const1471*35238bceSAndroid Build Coastguard Worker float Vertex2DArrayTextureCase::calculateLod(const Mat3 &transf, const Vec2 &dstSize, int textureNdx) const
1472*35238bceSAndroid Build Coastguard Worker {
1473*35238bceSAndroid Build Coastguard Worker const tcu::Texture2DArray &refTexture = m_textures[textureNdx]->getRefTexture();
1474*35238bceSAndroid Build Coastguard Worker const int texWidth = refTexture.getWidth();
1475*35238bceSAndroid Build Coastguard Worker const int texHeight = refTexture.getHeight();
1476*35238bceSAndroid Build Coastguard Worker
1477*35238bceSAndroid Build Coastguard Worker // Calculate transformed coordinates of three screen corners.
1478*35238bceSAndroid Build Coastguard Worker const Vec2 trans00 = (transf * Vec3(0.0f, 0.0f, 1.0f)).xy();
1479*35238bceSAndroid Build Coastguard Worker const Vec2 trans01 = (transf * Vec3(0.0f, 1.0f, 1.0f)).xy();
1480*35238bceSAndroid Build Coastguard Worker const Vec2 trans10 = (transf * Vec3(1.0f, 0.0f, 1.0f)).xy();
1481*35238bceSAndroid Build Coastguard Worker
1482*35238bceSAndroid Build Coastguard Worker // Derivates.
1483*35238bceSAndroid Build Coastguard Worker const float dudx = (trans10.x() - trans00.x()) * (float)texWidth / dstSize.x();
1484*35238bceSAndroid Build Coastguard Worker const float dudy = (trans01.x() - trans00.x()) * (float)texWidth / dstSize.y();
1485*35238bceSAndroid Build Coastguard Worker const float dvdx = (trans10.y() - trans00.y()) * (float)texHeight / dstSize.x();
1486*35238bceSAndroid Build Coastguard Worker const float dvdy = (trans01.y() - trans00.y()) * (float)texHeight / dstSize.y();
1487*35238bceSAndroid Build Coastguard Worker
1488*35238bceSAndroid Build Coastguard Worker return deFloatLog2(deFloatSqrt(de::max(dudx * dudx + dvdx * dvdx, dudy * dudy + dvdy * dvdy)));
1489*35238bceSAndroid Build Coastguard Worker }
1490*35238bceSAndroid Build Coastguard Worker
iterate(void)1491*35238bceSAndroid Build Coastguard Worker Vertex2DArrayTextureCase::IterateResult Vertex2DArrayTextureCase::iterate(void)
1492*35238bceSAndroid Build Coastguard Worker {
1493*35238bceSAndroid Build Coastguard Worker const int viewportWidth = deMin32(m_context.getRenderTarget().getWidth(), MAX_2D_ARRAY_RENDER_WIDTH);
1494*35238bceSAndroid Build Coastguard Worker const int viewportHeight = deMin32(m_context.getRenderTarget().getHeight(), MAX_2D_ARRAY_RENDER_HEIGHT);
1495*35238bceSAndroid Build Coastguard Worker
1496*35238bceSAndroid Build Coastguard Worker const int viewportXOffsetMax = m_context.getRenderTarget().getWidth() - viewportWidth;
1497*35238bceSAndroid Build Coastguard Worker const int viewportYOffsetMax = m_context.getRenderTarget().getHeight() - viewportHeight;
1498*35238bceSAndroid Build Coastguard Worker
1499*35238bceSAndroid Build Coastguard Worker de::Random rnd(deStringHash(getName()));
1500*35238bceSAndroid Build Coastguard Worker
1501*35238bceSAndroid Build Coastguard Worker const int viewportXOffset = rnd.getInt(0, viewportXOffsetMax);
1502*35238bceSAndroid Build Coastguard Worker const int viewportYOffset = rnd.getInt(0, viewportYOffsetMax);
1503*35238bceSAndroid Build Coastguard Worker
1504*35238bceSAndroid Build Coastguard Worker glUseProgram(m_program->getProgram());
1505*35238bceSAndroid Build Coastguard Worker
1506*35238bceSAndroid Build Coastguard Worker // Divide viewport into 4 cells.
1507*35238bceSAndroid Build Coastguard Worker const int leftWidth = viewportWidth / 2;
1508*35238bceSAndroid Build Coastguard Worker const int rightWidth = viewportWidth - leftWidth;
1509*35238bceSAndroid Build Coastguard Worker const int bottomHeight = viewportHeight / 2;
1510*35238bceSAndroid Build Coastguard Worker const int topHeight = viewportHeight - bottomHeight;
1511*35238bceSAndroid Build Coastguard Worker
1512*35238bceSAndroid Build Coastguard Worker // Clear.
1513*35238bceSAndroid Build Coastguard Worker glClearColor(0.125f, 0.25f, 0.5f, 1.0f);
1514*35238bceSAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1515*35238bceSAndroid Build Coastguard Worker
1516*35238bceSAndroid Build Coastguard Worker // Shear by layer count to get all layers visible.
1517*35238bceSAndroid Build Coastguard Worker static const float layerShearTransfData[] = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, (float)LAYERS_2D_ARRAY,
1518*35238bceSAndroid Build Coastguard Worker 0.0f, 0.0f};
1519*35238bceSAndroid Build Coastguard Worker
1520*35238bceSAndroid Build Coastguard Worker // Minification and magnification transformations.
1521*35238bceSAndroid Build Coastguard Worker static const float texMinTransfData[] = {2.1f, 0.0f, -0.3f, 0.0f, 2.1f, -0.3f, 0.0f, 0.0f, 1.0f};
1522*35238bceSAndroid Build Coastguard Worker static const float texMagTransfData[] = {0.4f, 0.0f, 0.8f, 0.0f, 0.4f, 0.8f, 0.0f, 0.0f, 1.0f};
1523*35238bceSAndroid Build Coastguard Worker
1524*35238bceSAndroid Build Coastguard Worker // Transformation matrices for minification and magnification.
1525*35238bceSAndroid Build Coastguard Worker const Mat3 texMinTransf = Mat3(layerShearTransfData) * Mat3(texMinTransfData);
1526*35238bceSAndroid Build Coastguard Worker const Mat3 texMagTransf = Mat3(layerShearTransfData) * Mat3(texMagTransfData);
1527*35238bceSAndroid Build Coastguard Worker
1528*35238bceSAndroid Build Coastguard Worker // Surface for the reference image.
1529*35238bceSAndroid Build Coastguard Worker tcu::Surface refImage(viewportWidth, viewportHeight);
1530*35238bceSAndroid Build Coastguard Worker
1531*35238bceSAndroid Build Coastguard Worker {
1532*35238bceSAndroid Build Coastguard Worker const struct Render
1533*35238bceSAndroid Build Coastguard Worker {
1534*35238bceSAndroid Build Coastguard Worker const Rect region;
1535*35238bceSAndroid Build Coastguard Worker int textureNdx;
1536*35238bceSAndroid Build Coastguard Worker const Mat3 texTransform;
1537*35238bceSAndroid Build Coastguard Worker Render(const Rect &r, int tN, const Mat3 &tT) : region(r), textureNdx(tN), texTransform(tT)
1538*35238bceSAndroid Build Coastguard Worker {
1539*35238bceSAndroid Build Coastguard Worker }
1540*35238bceSAndroid Build Coastguard Worker } renders[] = {Render(Rect(0, 0, leftWidth, bottomHeight), 0, texMinTransf),
1541*35238bceSAndroid Build Coastguard Worker Render(Rect(leftWidth, 0, rightWidth, bottomHeight), 0, texMagTransf),
1542*35238bceSAndroid Build Coastguard Worker Render(Rect(0, bottomHeight, leftWidth, topHeight), 1, texMinTransf),
1543*35238bceSAndroid Build Coastguard Worker Render(Rect(leftWidth, bottomHeight, rightWidth, topHeight), 1, texMagTransf)};
1544*35238bceSAndroid Build Coastguard Worker
1545*35238bceSAndroid Build Coastguard Worker for (int renderNdx = 0; renderNdx < DE_LENGTH_OF_ARRAY(renders); renderNdx++)
1546*35238bceSAndroid Build Coastguard Worker {
1547*35238bceSAndroid Build Coastguard Worker const Render &rend = renders[renderNdx];
1548*35238bceSAndroid Build Coastguard Worker const float lod = calculateLod(rend.texTransform, rend.region.size().asFloat(), rend.textureNdx);
1549*35238bceSAndroid Build Coastguard Worker const bool useSafeTexCoords = isLevelNearest(lod > 0.0f ? m_minFilter : m_magFilter);
1550*35238bceSAndroid Build Coastguard Worker const Grid grid(GRID_SIZE_2D_ARRAY, rend.region.size(), getTextureSize(*m_textures[rend.textureNdx]),
1551*35238bceSAndroid Build Coastguard Worker TexTypeCoordParams<TEXTURETYPE_2D_ARRAY>(rend.texTransform), useSafeTexCoords);
1552*35238bceSAndroid Build Coastguard Worker
1553*35238bceSAndroid Build Coastguard Worker glViewport(viewportXOffset + rend.region.x, viewportYOffset + rend.region.y, rend.region.w, rend.region.h);
1554*35238bceSAndroid Build Coastguard Worker renderCell(rend.textureNdx, lod, grid);
1555*35238bceSAndroid Build Coastguard Worker computeReferenceCell(rend.textureNdx, lod, grid, refImage, rend.region);
1556*35238bceSAndroid Build Coastguard Worker }
1557*35238bceSAndroid Build Coastguard Worker }
1558*35238bceSAndroid Build Coastguard Worker
1559*35238bceSAndroid Build Coastguard Worker // Read back rendered results.
1560*35238bceSAndroid Build Coastguard Worker tcu::Surface resImage(viewportWidth, viewportHeight);
1561*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportXOffset, viewportYOffset, resImage.getAccess());
1562*35238bceSAndroid Build Coastguard Worker
1563*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
1564*35238bceSAndroid Build Coastguard Worker
1565*35238bceSAndroid Build Coastguard Worker // Compare and log.
1566*35238bceSAndroid Build Coastguard Worker {
1567*35238bceSAndroid Build Coastguard Worker const bool isOk = compareImages(m_context.getRenderContext(), m_testCtx.getLog(), refImage, resImage);
1568*35238bceSAndroid Build Coastguard Worker
1569*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
1570*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Image comparison failed");
1571*35238bceSAndroid Build Coastguard Worker }
1572*35238bceSAndroid Build Coastguard Worker
1573*35238bceSAndroid Build Coastguard Worker return STOP;
1574*35238bceSAndroid Build Coastguard Worker }
1575*35238bceSAndroid Build Coastguard Worker
setupShaderInputs(int textureNdx,float lod,const Grid & grid) const1576*35238bceSAndroid Build Coastguard Worker void Vertex2DArrayTextureCase::setupShaderInputs(int textureNdx, float lod, const Grid &grid) const
1577*35238bceSAndroid Build Coastguard Worker {
1578*35238bceSAndroid Build Coastguard Worker const uint32_t programID = m_program->getProgram();
1579*35238bceSAndroid Build Coastguard Worker
1580*35238bceSAndroid Build Coastguard Worker // SETUP ATTRIBUTES.
1581*35238bceSAndroid Build Coastguard Worker
1582*35238bceSAndroid Build Coastguard Worker {
1583*35238bceSAndroid Build Coastguard Worker const int positionLoc = glGetAttribLocation(programID, "a_position");
1584*35238bceSAndroid Build Coastguard Worker if (positionLoc != -1)
1585*35238bceSAndroid Build Coastguard Worker {
1586*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
1587*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, grid.getPositionPtr());
1588*35238bceSAndroid Build Coastguard Worker }
1589*35238bceSAndroid Build Coastguard Worker }
1590*35238bceSAndroid Build Coastguard Worker
1591*35238bceSAndroid Build Coastguard Worker {
1592*35238bceSAndroid Build Coastguard Worker const int texCoordLoc = glGetAttribLocation(programID, "a_texCoord");
1593*35238bceSAndroid Build Coastguard Worker if (texCoordLoc != -1)
1594*35238bceSAndroid Build Coastguard Worker {
1595*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(texCoordLoc);
1596*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(texCoordLoc, 3, GL_FLOAT, GL_FALSE, 0, grid.getTexCoordPtr());
1597*35238bceSAndroid Build Coastguard Worker }
1598*35238bceSAndroid Build Coastguard Worker }
1599*35238bceSAndroid Build Coastguard Worker
1600*35238bceSAndroid Build Coastguard Worker // SETUP UNIFORMS.
1601*35238bceSAndroid Build Coastguard Worker
1602*35238bceSAndroid Build Coastguard Worker {
1603*35238bceSAndroid Build Coastguard Worker const int lodLoc = glGetUniformLocation(programID, "u_lod");
1604*35238bceSAndroid Build Coastguard Worker if (lodLoc != -1)
1605*35238bceSAndroid Build Coastguard Worker glUniform1f(lodLoc, lod);
1606*35238bceSAndroid Build Coastguard Worker }
1607*35238bceSAndroid Build Coastguard Worker
1608*35238bceSAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
1609*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, m_textures[textureNdx]->getGLTexture());
1610*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, m_wrapS);
1611*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, m_wrapT);
1612*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, m_minFilter);
1613*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, m_magFilter);
1614*35238bceSAndroid Build Coastguard Worker
1615*35238bceSAndroid Build Coastguard Worker {
1616*35238bceSAndroid Build Coastguard Worker const int texLoc = glGetUniformLocation(programID, "u_texture");
1617*35238bceSAndroid Build Coastguard Worker if (texLoc != -1)
1618*35238bceSAndroid Build Coastguard Worker glUniform1i(texLoc, 0);
1619*35238bceSAndroid Build Coastguard Worker }
1620*35238bceSAndroid Build Coastguard Worker }
1621*35238bceSAndroid Build Coastguard Worker
1622*35238bceSAndroid Build Coastguard Worker // Renders one sub-image with given parameters.
renderCell(int textureNdx,float lod,const Grid & grid) const1623*35238bceSAndroid Build Coastguard Worker void Vertex2DArrayTextureCase::renderCell(int textureNdx, float lod, const Grid &grid) const
1624*35238bceSAndroid Build Coastguard Worker {
1625*35238bceSAndroid Build Coastguard Worker setupShaderInputs(textureNdx, lod, grid);
1626*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, grid.getNumIndices(), GL_UNSIGNED_SHORT, grid.getIndexPtr());
1627*35238bceSAndroid Build Coastguard Worker }
1628*35238bceSAndroid Build Coastguard Worker
1629*35238bceSAndroid Build Coastguard Worker // Computes reference for one sub-image with given parameters.
computeReferenceCell(int textureNdx,float lod,const Grid & grid,tcu::Surface & dst,const Rect & dstRegion) const1630*35238bceSAndroid Build Coastguard Worker void Vertex2DArrayTextureCase::computeReferenceCell(int textureNdx, float lod, const Grid &grid, tcu::Surface &dst,
1631*35238bceSAndroid Build Coastguard Worker const Rect &dstRegion) const
1632*35238bceSAndroid Build Coastguard Worker {
1633*35238bceSAndroid Build Coastguard Worker computeReference(m_textures[textureNdx]->getRefTexture(), lod,
1634*35238bceSAndroid Build Coastguard Worker glu::mapGLSampler(m_wrapS, m_wrapT, m_minFilter, m_magFilter), grid, dst, dstRegion);
1635*35238bceSAndroid Build Coastguard Worker }
1636*35238bceSAndroid Build Coastguard Worker
1637*35238bceSAndroid Build Coastguard Worker class Vertex3DTextureCase : public TestCase
1638*35238bceSAndroid Build Coastguard Worker {
1639*35238bceSAndroid Build Coastguard Worker public:
1640*35238bceSAndroid Build Coastguard Worker Vertex3DTextureCase(Context &testCtx, const char *name, const char *desc, uint32_t minFilter, uint32_t magFilter,
1641*35238bceSAndroid Build Coastguard Worker uint32_t wrapS, uint32_t wrapT, uint32_t wrapR);
1642*35238bceSAndroid Build Coastguard Worker ~Vertex3DTextureCase(void);
1643*35238bceSAndroid Build Coastguard Worker
1644*35238bceSAndroid Build Coastguard Worker void init(void);
1645*35238bceSAndroid Build Coastguard Worker void deinit(void);
1646*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
1647*35238bceSAndroid Build Coastguard Worker
1648*35238bceSAndroid Build Coastguard Worker private:
1649*35238bceSAndroid Build Coastguard Worker typedef PosTexCoordQuadGrid<TEXTURETYPE_3D> Grid;
1650*35238bceSAndroid Build Coastguard Worker
1651*35238bceSAndroid Build Coastguard Worker Vertex3DTextureCase(const Vertex3DTextureCase &other);
1652*35238bceSAndroid Build Coastguard Worker Vertex3DTextureCase &operator=(const Vertex3DTextureCase &other);
1653*35238bceSAndroid Build Coastguard Worker
1654*35238bceSAndroid Build Coastguard Worker float calculateLod(const Mat3 &transf, const Vec2 &dstSize, int textureNdx) const;
1655*35238bceSAndroid Build Coastguard Worker void setupShaderInputs(int textureNdx, float lod, const Grid &grid) const;
1656*35238bceSAndroid Build Coastguard Worker void renderCell(int textureNdx, float lod, const Grid &grid) const;
1657*35238bceSAndroid Build Coastguard Worker void computeReferenceCell(int textureNdx, float lod, const Grid &grid, tcu::Surface &dst,
1658*35238bceSAndroid Build Coastguard Worker const Rect &dstRegion) const;
1659*35238bceSAndroid Build Coastguard Worker
1660*35238bceSAndroid Build Coastguard Worker const uint32_t m_minFilter;
1661*35238bceSAndroid Build Coastguard Worker const uint32_t m_magFilter;
1662*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapS;
1663*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapT;
1664*35238bceSAndroid Build Coastguard Worker const uint32_t m_wrapR;
1665*35238bceSAndroid Build Coastguard Worker
1666*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram *m_program;
1667*35238bceSAndroid Build Coastguard Worker glu::Texture3D *m_textures[2]; // 2 textures, a gradient texture and a grid texture.
1668*35238bceSAndroid Build Coastguard Worker };
1669*35238bceSAndroid Build Coastguard Worker
Vertex3DTextureCase(Context & testCtx,const char * name,const char * desc,uint32_t minFilter,uint32_t magFilter,uint32_t wrapS,uint32_t wrapT,uint32_t wrapR)1670*35238bceSAndroid Build Coastguard Worker Vertex3DTextureCase::Vertex3DTextureCase(Context &testCtx, const char *name, const char *desc, uint32_t minFilter,
1671*35238bceSAndroid Build Coastguard Worker uint32_t magFilter, uint32_t wrapS, uint32_t wrapT, uint32_t wrapR)
1672*35238bceSAndroid Build Coastguard Worker : TestCase(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, desc)
1673*35238bceSAndroid Build Coastguard Worker , m_minFilter(minFilter)
1674*35238bceSAndroid Build Coastguard Worker , m_magFilter(magFilter)
1675*35238bceSAndroid Build Coastguard Worker , m_wrapS(wrapS)
1676*35238bceSAndroid Build Coastguard Worker , m_wrapT(wrapT)
1677*35238bceSAndroid Build Coastguard Worker , m_wrapR(wrapR)
1678*35238bceSAndroid Build Coastguard Worker , m_program(DE_NULL)
1679*35238bceSAndroid Build Coastguard Worker {
1680*35238bceSAndroid Build Coastguard Worker m_textures[0] = DE_NULL;
1681*35238bceSAndroid Build Coastguard Worker m_textures[1] = DE_NULL;
1682*35238bceSAndroid Build Coastguard Worker }
1683*35238bceSAndroid Build Coastguard Worker
~Vertex3DTextureCase(void)1684*35238bceSAndroid Build Coastguard Worker Vertex3DTextureCase::~Vertex3DTextureCase(void)
1685*35238bceSAndroid Build Coastguard Worker {
1686*35238bceSAndroid Build Coastguard Worker Vertex3DTextureCase::deinit();
1687*35238bceSAndroid Build Coastguard Worker }
1688*35238bceSAndroid Build Coastguard Worker
init(void)1689*35238bceSAndroid Build Coastguard Worker void Vertex3DTextureCase::init(void)
1690*35238bceSAndroid Build Coastguard Worker {
1691*35238bceSAndroid Build Coastguard Worker const char *const vertexShaderSource = "#version 300 es\n"
1692*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_position;\n"
1693*35238bceSAndroid Build Coastguard Worker "in highp vec3 a_texCoord;\n"
1694*35238bceSAndroid Build Coastguard Worker "uniform highp sampler3D u_texture;\n"
1695*35238bceSAndroid Build Coastguard Worker "uniform highp float u_lod;\n"
1696*35238bceSAndroid Build Coastguard Worker "out mediump vec4 v_color;\n"
1697*35238bceSAndroid Build Coastguard Worker "\n"
1698*35238bceSAndroid Build Coastguard Worker "void main()\n"
1699*35238bceSAndroid Build Coastguard Worker "{\n"
1700*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(a_position, 0.0, 1.0);\n"
1701*35238bceSAndroid Build Coastguard Worker " v_color = textureLod(u_texture, a_texCoord, u_lod);\n"
1702*35238bceSAndroid Build Coastguard Worker "}\n";
1703*35238bceSAndroid Build Coastguard Worker
1704*35238bceSAndroid Build Coastguard Worker const char *const fragmentShaderSource = "#version 300 es\n"
1705*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
1706*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_color;\n"
1707*35238bceSAndroid Build Coastguard Worker "\n"
1708*35238bceSAndroid Build Coastguard Worker "void main()\n"
1709*35238bceSAndroid Build Coastguard Worker "{\n"
1710*35238bceSAndroid Build Coastguard Worker " dEQP_FragColor = v_color;\n"
1711*35238bceSAndroid Build Coastguard Worker "}\n";
1712*35238bceSAndroid Build Coastguard Worker
1713*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getNumSamples() != 0)
1714*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("MSAA config not supported by this test");
1715*35238bceSAndroid Build Coastguard Worker
1716*35238bceSAndroid Build Coastguard Worker // Create shader.
1717*35238bceSAndroid Build Coastguard Worker
1718*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_program);
1719*35238bceSAndroid Build Coastguard Worker m_program = new glu::ShaderProgram(m_context.getRenderContext(),
1720*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1721*35238bceSAndroid Build Coastguard Worker
1722*35238bceSAndroid Build Coastguard Worker if (!m_program->isOk())
1723*35238bceSAndroid Build Coastguard Worker {
1724*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << *m_program;
1725*35238bceSAndroid Build Coastguard Worker
1726*35238bceSAndroid Build Coastguard Worker GLint maxVertexTextures;
1727*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextures);
1728*35238bceSAndroid Build Coastguard Worker
1729*35238bceSAndroid Build Coastguard Worker if (maxVertexTextures < 1)
1730*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Vertex texture image units not supported", "", __FILE__, __LINE__);
1731*35238bceSAndroid Build Coastguard Worker else
1732*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Failed to compile shader");
1733*35238bceSAndroid Build Coastguard Worker }
1734*35238bceSAndroid Build Coastguard Worker
1735*35238bceSAndroid Build Coastguard Worker // Make the textures.
1736*35238bceSAndroid Build Coastguard Worker
1737*35238bceSAndroid Build Coastguard Worker try
1738*35238bceSAndroid Build Coastguard Worker {
1739*35238bceSAndroid Build Coastguard Worker const int texWidth = WIDTH_3D;
1740*35238bceSAndroid Build Coastguard Worker const int texHeight = HEIGHT_3D;
1741*35238bceSAndroid Build Coastguard Worker const int texDepth = DEPTH_3D;
1742*35238bceSAndroid Build Coastguard Worker
1743*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1744*35238bceSAndroid Build Coastguard Worker {
1745*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_textures[i]);
1746*35238bceSAndroid Build Coastguard Worker m_textures[i] = new glu::Texture3D(m_context.getRenderContext(), GL_RGB, GL_UNSIGNED_BYTE, texWidth,
1747*35238bceSAndroid Build Coastguard Worker texHeight, texDepth);
1748*35238bceSAndroid Build Coastguard Worker }
1749*35238bceSAndroid Build Coastguard Worker
1750*35238bceSAndroid Build Coastguard Worker const int numLevels = deLog2Floor32(de::max(de::max(texWidth, texHeight), texDepth)) + 1;
1751*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(m_textures[0]->getRefTexture().getFormat());
1752*35238bceSAndroid Build Coastguard Worker const Vec4 cBias = fmtInfo.valueMin;
1753*35238bceSAndroid Build Coastguard Worker const Vec4 cScale = fmtInfo.valueMax - fmtInfo.valueMin;
1754*35238bceSAndroid Build Coastguard Worker
1755*35238bceSAndroid Build Coastguard Worker // Fill first with gradient texture.
1756*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
1757*35238bceSAndroid Build Coastguard Worker {
1758*35238bceSAndroid Build Coastguard Worker const Vec4 gMin = Vec4(-0.5f, -0.5f, -0.5f, 2.0f) * cScale + cBias;
1759*35238bceSAndroid Build Coastguard Worker const Vec4 gMax = Vec4(1.0f, 1.0f, 1.0f, 0.0f) * cScale + cBias;
1760*35238bceSAndroid Build Coastguard Worker
1761*35238bceSAndroid Build Coastguard Worker m_textures[0]->getRefTexture().allocLevel(levelNdx);
1762*35238bceSAndroid Build Coastguard Worker tcu::fillWithComponentGradients(m_textures[0]->getRefTexture().getLevel(levelNdx), gMin, gMax);
1763*35238bceSAndroid Build Coastguard Worker }
1764*35238bceSAndroid Build Coastguard Worker
1765*35238bceSAndroid Build Coastguard Worker // Fill second with grid texture.
1766*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
1767*35238bceSAndroid Build Coastguard Worker {
1768*35238bceSAndroid Build Coastguard Worker const uint32_t step = 0x00ffffff / numLevels;
1769*35238bceSAndroid Build Coastguard Worker const uint32_t rgb = step * levelNdx;
1770*35238bceSAndroid Build Coastguard Worker const uint32_t colorA = 0xff000000 | rgb;
1771*35238bceSAndroid Build Coastguard Worker const uint32_t colorB = 0xff000000 | ~rgb;
1772*35238bceSAndroid Build Coastguard Worker
1773*35238bceSAndroid Build Coastguard Worker m_textures[1]->getRefTexture().allocLevel(levelNdx);
1774*35238bceSAndroid Build Coastguard Worker tcu::fillWithGrid(m_textures[1]->getRefTexture().getLevel(levelNdx), 4,
1775*35238bceSAndroid Build Coastguard Worker tcu::RGBA(colorA).toVec() * cScale + cBias, tcu::RGBA(colorB).toVec() * cScale + cBias);
1776*35238bceSAndroid Build Coastguard Worker }
1777*35238bceSAndroid Build Coastguard Worker
1778*35238bceSAndroid Build Coastguard Worker // Upload.
1779*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1780*35238bceSAndroid Build Coastguard Worker m_textures[i]->upload();
1781*35238bceSAndroid Build Coastguard Worker }
1782*35238bceSAndroid Build Coastguard Worker catch (const std::exception &)
1783*35238bceSAndroid Build Coastguard Worker {
1784*35238bceSAndroid Build Coastguard Worker // Clean up to save memory.
1785*35238bceSAndroid Build Coastguard Worker Vertex3DTextureCase::deinit();
1786*35238bceSAndroid Build Coastguard Worker throw;
1787*35238bceSAndroid Build Coastguard Worker }
1788*35238bceSAndroid Build Coastguard Worker }
1789*35238bceSAndroid Build Coastguard Worker
deinit(void)1790*35238bceSAndroid Build Coastguard Worker void Vertex3DTextureCase::deinit(void)
1791*35238bceSAndroid Build Coastguard Worker {
1792*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
1793*35238bceSAndroid Build Coastguard Worker {
1794*35238bceSAndroid Build Coastguard Worker delete m_textures[i];
1795*35238bceSAndroid Build Coastguard Worker m_textures[i] = DE_NULL;
1796*35238bceSAndroid Build Coastguard Worker }
1797*35238bceSAndroid Build Coastguard Worker
1798*35238bceSAndroid Build Coastguard Worker delete m_program;
1799*35238bceSAndroid Build Coastguard Worker m_program = DE_NULL;
1800*35238bceSAndroid Build Coastguard Worker }
1801*35238bceSAndroid Build Coastguard Worker
calculateLod(const Mat3 & transf,const Vec2 & dstSize,int textureNdx) const1802*35238bceSAndroid Build Coastguard Worker float Vertex3DTextureCase::calculateLod(const Mat3 &transf, const Vec2 &dstSize, int textureNdx) const
1803*35238bceSAndroid Build Coastguard Worker {
1804*35238bceSAndroid Build Coastguard Worker const tcu::Texture3D &refTexture = m_textures[textureNdx]->getRefTexture();
1805*35238bceSAndroid Build Coastguard Worker const int srcWidth = refTexture.getWidth();
1806*35238bceSAndroid Build Coastguard Worker const int srcHeight = refTexture.getHeight();
1807*35238bceSAndroid Build Coastguard Worker const int srcDepth = refTexture.getDepth();
1808*35238bceSAndroid Build Coastguard Worker
1809*35238bceSAndroid Build Coastguard Worker // Calculate transformed coordinates of three screen corners.
1810*35238bceSAndroid Build Coastguard Worker const Vec3 trans00 = transf * Vec3(0.0f, 0.0f, 1.0f);
1811*35238bceSAndroid Build Coastguard Worker const Vec3 trans01 = transf * Vec3(0.0f, 1.0f, 1.0f);
1812*35238bceSAndroid Build Coastguard Worker const Vec3 trans10 = transf * Vec3(1.0f, 0.0f, 1.0f);
1813*35238bceSAndroid Build Coastguard Worker
1814*35238bceSAndroid Build Coastguard Worker // Derivates.
1815*35238bceSAndroid Build Coastguard Worker const float dudx = (trans10.x() - trans00.x()) * (float)srcWidth / dstSize.x();
1816*35238bceSAndroid Build Coastguard Worker const float dudy = (trans01.x() - trans00.x()) * (float)srcWidth / dstSize.y();
1817*35238bceSAndroid Build Coastguard Worker const float dvdx = (trans10.y() - trans00.y()) * (float)srcHeight / dstSize.x();
1818*35238bceSAndroid Build Coastguard Worker const float dvdy = (trans01.y() - trans00.y()) * (float)srcHeight / dstSize.y();
1819*35238bceSAndroid Build Coastguard Worker const float dwdx = (trans10.z() - trans00.z()) * (float)srcDepth / dstSize.x();
1820*35238bceSAndroid Build Coastguard Worker const float dwdy = (trans01.z() - trans00.z()) * (float)srcDepth / dstSize.y();
1821*35238bceSAndroid Build Coastguard Worker
1822*35238bceSAndroid Build Coastguard Worker return deFloatLog2(
1823*35238bceSAndroid Build Coastguard Worker deFloatSqrt(de::max(dudx * dudx + dvdx * dvdx + dwdx * dwdx, dudy * dudy + dvdy * dvdy + dwdy * dwdy)));
1824*35238bceSAndroid Build Coastguard Worker }
1825*35238bceSAndroid Build Coastguard Worker
iterate(void)1826*35238bceSAndroid Build Coastguard Worker Vertex3DTextureCase::IterateResult Vertex3DTextureCase::iterate(void)
1827*35238bceSAndroid Build Coastguard Worker {
1828*35238bceSAndroid Build Coastguard Worker const int viewportWidth = deMin32(m_context.getRenderTarget().getWidth(), MAX_3D_RENDER_WIDTH);
1829*35238bceSAndroid Build Coastguard Worker const int viewportHeight = deMin32(m_context.getRenderTarget().getHeight(), MAX_3D_RENDER_HEIGHT);
1830*35238bceSAndroid Build Coastguard Worker
1831*35238bceSAndroid Build Coastguard Worker const int viewportXOffsetMax = m_context.getRenderTarget().getWidth() - viewportWidth;
1832*35238bceSAndroid Build Coastguard Worker const int viewportYOffsetMax = m_context.getRenderTarget().getHeight() - viewportHeight;
1833*35238bceSAndroid Build Coastguard Worker
1834*35238bceSAndroid Build Coastguard Worker de::Random rnd(deStringHash(getName()));
1835*35238bceSAndroid Build Coastguard Worker
1836*35238bceSAndroid Build Coastguard Worker const int viewportXOffset = rnd.getInt(0, viewportXOffsetMax);
1837*35238bceSAndroid Build Coastguard Worker const int viewportYOffset = rnd.getInt(0, viewportYOffsetMax);
1838*35238bceSAndroid Build Coastguard Worker
1839*35238bceSAndroid Build Coastguard Worker glUseProgram(m_program->getProgram());
1840*35238bceSAndroid Build Coastguard Worker
1841*35238bceSAndroid Build Coastguard Worker // Divide viewport into 4 cells.
1842*35238bceSAndroid Build Coastguard Worker const int leftWidth = viewportWidth / 2;
1843*35238bceSAndroid Build Coastguard Worker const int rightWidth = viewportWidth - leftWidth;
1844*35238bceSAndroid Build Coastguard Worker const int bottomHeight = viewportHeight / 2;
1845*35238bceSAndroid Build Coastguard Worker const int topHeight = viewportHeight - bottomHeight;
1846*35238bceSAndroid Build Coastguard Worker
1847*35238bceSAndroid Build Coastguard Worker // Clear.
1848*35238bceSAndroid Build Coastguard Worker glClearColor(0.125f, 0.25f, 0.5f, 1.0f);
1849*35238bceSAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1850*35238bceSAndroid Build Coastguard Worker
1851*35238bceSAndroid Build Coastguard Worker // Shear to get all slices visible.
1852*35238bceSAndroid Build Coastguard Worker static const float depthShearTransfData[] = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f};
1853*35238bceSAndroid Build Coastguard Worker
1854*35238bceSAndroid Build Coastguard Worker // Minification and magnification transformations.
1855*35238bceSAndroid Build Coastguard Worker static const float texMinTransfData[] = {2.2f, 0.0f, -0.3f, 0.0f, 2.2f, -0.3f, 0.0f, 0.0f, 1.0f};
1856*35238bceSAndroid Build Coastguard Worker static const float texMagTransfData[] = {0.4f, 0.0f, 0.8f, 0.0f, 0.4f, 0.8f, 0.0f, 0.0f, 1.0f};
1857*35238bceSAndroid Build Coastguard Worker
1858*35238bceSAndroid Build Coastguard Worker // Transformation matrices for minification and magnification.
1859*35238bceSAndroid Build Coastguard Worker const Mat3 texMinTransf = Mat3(depthShearTransfData) * Mat3(texMinTransfData);
1860*35238bceSAndroid Build Coastguard Worker const Mat3 texMagTransf = Mat3(depthShearTransfData) * Mat3(texMagTransfData);
1861*35238bceSAndroid Build Coastguard Worker
1862*35238bceSAndroid Build Coastguard Worker // Surface for the reference image.
1863*35238bceSAndroid Build Coastguard Worker tcu::Surface refImage(viewportWidth, viewportHeight);
1864*35238bceSAndroid Build Coastguard Worker
1865*35238bceSAndroid Build Coastguard Worker {
1866*35238bceSAndroid Build Coastguard Worker const struct Render
1867*35238bceSAndroid Build Coastguard Worker {
1868*35238bceSAndroid Build Coastguard Worker const Rect region;
1869*35238bceSAndroid Build Coastguard Worker int textureNdx;
1870*35238bceSAndroid Build Coastguard Worker const Mat3 texTransform;
1871*35238bceSAndroid Build Coastguard Worker Render(const Rect &r, int tN, const Mat3 &tT) : region(r), textureNdx(tN), texTransform(tT)
1872*35238bceSAndroid Build Coastguard Worker {
1873*35238bceSAndroid Build Coastguard Worker }
1874*35238bceSAndroid Build Coastguard Worker } renders[] = {Render(Rect(0, 0, leftWidth, bottomHeight), 0, texMinTransf),
1875*35238bceSAndroid Build Coastguard Worker Render(Rect(leftWidth, 0, rightWidth, bottomHeight), 0, texMagTransf),
1876*35238bceSAndroid Build Coastguard Worker Render(Rect(0, bottomHeight, leftWidth, topHeight), 1, texMinTransf),
1877*35238bceSAndroid Build Coastguard Worker Render(Rect(leftWidth, bottomHeight, rightWidth, topHeight), 1, texMagTransf)};
1878*35238bceSAndroid Build Coastguard Worker
1879*35238bceSAndroid Build Coastguard Worker for (int renderNdx = 0; renderNdx < DE_LENGTH_OF_ARRAY(renders); renderNdx++)
1880*35238bceSAndroid Build Coastguard Worker {
1881*35238bceSAndroid Build Coastguard Worker const Render &rend = renders[renderNdx];
1882*35238bceSAndroid Build Coastguard Worker const float lod = calculateLod(rend.texTransform, rend.region.size().asFloat(), rend.textureNdx);
1883*35238bceSAndroid Build Coastguard Worker const bool useSafeTexCoords = isLevelNearest(lod > 0.0f ? m_minFilter : m_magFilter);
1884*35238bceSAndroid Build Coastguard Worker const Grid grid(GRID_SIZE_3D, rend.region.size(), getTextureSize(*m_textures[rend.textureNdx]),
1885*35238bceSAndroid Build Coastguard Worker TexTypeCoordParams<TEXTURETYPE_3D>(rend.texTransform), useSafeTexCoords);
1886*35238bceSAndroid Build Coastguard Worker
1887*35238bceSAndroid Build Coastguard Worker glViewport(viewportXOffset + rend.region.x, viewportYOffset + rend.region.y, rend.region.w, rend.region.h);
1888*35238bceSAndroid Build Coastguard Worker renderCell(rend.textureNdx, lod, grid);
1889*35238bceSAndroid Build Coastguard Worker computeReferenceCell(rend.textureNdx, lod, grid, refImage, rend.region);
1890*35238bceSAndroid Build Coastguard Worker }
1891*35238bceSAndroid Build Coastguard Worker }
1892*35238bceSAndroid Build Coastguard Worker
1893*35238bceSAndroid Build Coastguard Worker // Read back rendered results.
1894*35238bceSAndroid Build Coastguard Worker tcu::Surface resImage(viewportWidth, viewportHeight);
1895*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportXOffset, viewportYOffset, resImage.getAccess());
1896*35238bceSAndroid Build Coastguard Worker
1897*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
1898*35238bceSAndroid Build Coastguard Worker
1899*35238bceSAndroid Build Coastguard Worker // Compare and log.
1900*35238bceSAndroid Build Coastguard Worker {
1901*35238bceSAndroid Build Coastguard Worker const bool isOk = compareImages(m_context.getRenderContext(), m_testCtx.getLog(), refImage, resImage);
1902*35238bceSAndroid Build Coastguard Worker
1903*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
1904*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Image comparison failed");
1905*35238bceSAndroid Build Coastguard Worker }
1906*35238bceSAndroid Build Coastguard Worker
1907*35238bceSAndroid Build Coastguard Worker return STOP;
1908*35238bceSAndroid Build Coastguard Worker }
1909*35238bceSAndroid Build Coastguard Worker
setupShaderInputs(int textureNdx,float lod,const Grid & grid) const1910*35238bceSAndroid Build Coastguard Worker void Vertex3DTextureCase::setupShaderInputs(int textureNdx, float lod, const Grid &grid) const
1911*35238bceSAndroid Build Coastguard Worker {
1912*35238bceSAndroid Build Coastguard Worker const uint32_t programID = m_program->getProgram();
1913*35238bceSAndroid Build Coastguard Worker
1914*35238bceSAndroid Build Coastguard Worker // SETUP ATTRIBUTES.
1915*35238bceSAndroid Build Coastguard Worker
1916*35238bceSAndroid Build Coastguard Worker {
1917*35238bceSAndroid Build Coastguard Worker const int positionLoc = glGetAttribLocation(programID, "a_position");
1918*35238bceSAndroid Build Coastguard Worker if (positionLoc != -1)
1919*35238bceSAndroid Build Coastguard Worker {
1920*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
1921*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, grid.getPositionPtr());
1922*35238bceSAndroid Build Coastguard Worker }
1923*35238bceSAndroid Build Coastguard Worker }
1924*35238bceSAndroid Build Coastguard Worker
1925*35238bceSAndroid Build Coastguard Worker {
1926*35238bceSAndroid Build Coastguard Worker const int texCoordLoc = glGetAttribLocation(programID, "a_texCoord");
1927*35238bceSAndroid Build Coastguard Worker if (texCoordLoc != -1)
1928*35238bceSAndroid Build Coastguard Worker {
1929*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(texCoordLoc);
1930*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(texCoordLoc, 3, GL_FLOAT, GL_FALSE, 0, grid.getTexCoordPtr());
1931*35238bceSAndroid Build Coastguard Worker }
1932*35238bceSAndroid Build Coastguard Worker }
1933*35238bceSAndroid Build Coastguard Worker
1934*35238bceSAndroid Build Coastguard Worker // SETUP UNIFORMS.
1935*35238bceSAndroid Build Coastguard Worker
1936*35238bceSAndroid Build Coastguard Worker {
1937*35238bceSAndroid Build Coastguard Worker const int lodLoc = glGetUniformLocation(programID, "u_lod");
1938*35238bceSAndroid Build Coastguard Worker if (lodLoc != -1)
1939*35238bceSAndroid Build Coastguard Worker glUniform1f(lodLoc, lod);
1940*35238bceSAndroid Build Coastguard Worker }
1941*35238bceSAndroid Build Coastguard Worker
1942*35238bceSAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
1943*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_3D, m_textures[textureNdx]->getGLTexture());
1944*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, m_wrapS);
1945*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, m_wrapT);
1946*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, m_wrapR);
1947*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, m_minFilter);
1948*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, m_magFilter);
1949*35238bceSAndroid Build Coastguard Worker
1950*35238bceSAndroid Build Coastguard Worker {
1951*35238bceSAndroid Build Coastguard Worker const int texLoc = glGetUniformLocation(programID, "u_texture");
1952*35238bceSAndroid Build Coastguard Worker if (texLoc != -1)
1953*35238bceSAndroid Build Coastguard Worker glUniform1i(texLoc, 0);
1954*35238bceSAndroid Build Coastguard Worker }
1955*35238bceSAndroid Build Coastguard Worker }
1956*35238bceSAndroid Build Coastguard Worker
1957*35238bceSAndroid Build Coastguard Worker // Renders one sub-image with given parameters.
renderCell(int textureNdx,float lod,const Grid & grid) const1958*35238bceSAndroid Build Coastguard Worker void Vertex3DTextureCase::renderCell(int textureNdx, float lod, const Grid &grid) const
1959*35238bceSAndroid Build Coastguard Worker {
1960*35238bceSAndroid Build Coastguard Worker setupShaderInputs(textureNdx, lod, grid);
1961*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, grid.getNumIndices(), GL_UNSIGNED_SHORT, grid.getIndexPtr());
1962*35238bceSAndroid Build Coastguard Worker }
1963*35238bceSAndroid Build Coastguard Worker
1964*35238bceSAndroid Build Coastguard Worker // Computes reference for one sub-image with given parameters.
computeReferenceCell(int textureNdx,float lod,const Grid & grid,tcu::Surface & dst,const Rect & dstRegion) const1965*35238bceSAndroid Build Coastguard Worker void Vertex3DTextureCase::computeReferenceCell(int textureNdx, float lod, const Grid &grid, tcu::Surface &dst,
1966*35238bceSAndroid Build Coastguard Worker const Rect &dstRegion) const
1967*35238bceSAndroid Build Coastguard Worker {
1968*35238bceSAndroid Build Coastguard Worker computeReference(m_textures[textureNdx]->getRefTexture(), lod,
1969*35238bceSAndroid Build Coastguard Worker glu::mapGLSampler(m_wrapS, m_wrapT, m_wrapR, m_minFilter, m_magFilter), grid, dst, dstRegion);
1970*35238bceSAndroid Build Coastguard Worker }
1971*35238bceSAndroid Build Coastguard Worker
VertexTextureTests(Context & context)1972*35238bceSAndroid Build Coastguard Worker VertexTextureTests::VertexTextureTests(Context &context) : TestCaseGroup(context, "vertex", "Vertex Texture Tests")
1973*35238bceSAndroid Build Coastguard Worker {
1974*35238bceSAndroid Build Coastguard Worker }
1975*35238bceSAndroid Build Coastguard Worker
~VertexTextureTests(void)1976*35238bceSAndroid Build Coastguard Worker VertexTextureTests::~VertexTextureTests(void)
1977*35238bceSAndroid Build Coastguard Worker {
1978*35238bceSAndroid Build Coastguard Worker }
1979*35238bceSAndroid Build Coastguard Worker
init(void)1980*35238bceSAndroid Build Coastguard Worker void VertexTextureTests::init(void)
1981*35238bceSAndroid Build Coastguard Worker {
1982*35238bceSAndroid Build Coastguard Worker // 2D and cube map groups, and their filtering and wrap sub-groups.
1983*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const group2D = new TestCaseGroup(m_context, "2d", "2D Vertex Texture Tests");
1984*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const groupCube = new TestCaseGroup(m_context, "cube", "Cube Map Vertex Texture Tests");
1985*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const group2DArray = new TestCaseGroup(m_context, "2d_array", "2D Array Vertex Texture Tests");
1986*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const group3D = new TestCaseGroup(m_context, "3d", "3D Vertex Texture Tests");
1987*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const filteringGroup2D =
1988*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "filtering", "2D Vertex Texture Filtering Tests");
1989*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const wrapGroup2D = new TestCaseGroup(m_context, "wrap", "2D Vertex Texture Wrap Tests");
1990*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const filteringGroupCube =
1991*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "filtering", "Cube Map Vertex Texture Filtering Tests");
1992*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const wrapGroupCube = new TestCaseGroup(m_context, "wrap", "Cube Map Vertex Texture Wrap Tests");
1993*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const filteringGroup2DArray =
1994*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "filtering", "2D Array Vertex Texture Filtering Tests");
1995*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const wrapGroup2DArray = new TestCaseGroup(m_context, "wrap", "2D Array Vertex Texture Wrap Tests");
1996*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const filteringGroup3D =
1997*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "filtering", "3D Vertex Texture Filtering Tests");
1998*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const wrapGroup3D = new TestCaseGroup(m_context, "wrap", "3D Vertex Texture Wrap Tests");
1999*35238bceSAndroid Build Coastguard Worker
2000*35238bceSAndroid Build Coastguard Worker group2D->addChild(filteringGroup2D);
2001*35238bceSAndroid Build Coastguard Worker group2D->addChild(wrapGroup2D);
2002*35238bceSAndroid Build Coastguard Worker groupCube->addChild(filteringGroupCube);
2003*35238bceSAndroid Build Coastguard Worker groupCube->addChild(wrapGroupCube);
2004*35238bceSAndroid Build Coastguard Worker group2DArray->addChild(filteringGroup2DArray);
2005*35238bceSAndroid Build Coastguard Worker group2DArray->addChild(wrapGroup2DArray);
2006*35238bceSAndroid Build Coastguard Worker group3D->addChild(filteringGroup3D);
2007*35238bceSAndroid Build Coastguard Worker group3D->addChild(wrapGroup3D);
2008*35238bceSAndroid Build Coastguard Worker
2009*35238bceSAndroid Build Coastguard Worker addChild(group2D);
2010*35238bceSAndroid Build Coastguard Worker addChild(groupCube);
2011*35238bceSAndroid Build Coastguard Worker addChild(group2DArray);
2012*35238bceSAndroid Build Coastguard Worker addChild(group3D);
2013*35238bceSAndroid Build Coastguard Worker
2014*35238bceSAndroid Build Coastguard Worker static const struct
2015*35238bceSAndroid Build Coastguard Worker {
2016*35238bceSAndroid Build Coastguard Worker const char *name;
2017*35238bceSAndroid Build Coastguard Worker GLenum mode;
2018*35238bceSAndroid Build Coastguard Worker } wrapModes[] = {{"clamp", GL_CLAMP_TO_EDGE}, {"repeat", GL_REPEAT}, {"mirror", GL_MIRRORED_REPEAT}};
2019*35238bceSAndroid Build Coastguard Worker
2020*35238bceSAndroid Build Coastguard Worker static const struct
2021*35238bceSAndroid Build Coastguard Worker {
2022*35238bceSAndroid Build Coastguard Worker const char *name;
2023*35238bceSAndroid Build Coastguard Worker GLenum mode;
2024*35238bceSAndroid Build Coastguard Worker } minFilterModes[] = {{"nearest", GL_NEAREST},
2025*35238bceSAndroid Build Coastguard Worker {"linear", GL_LINEAR},
2026*35238bceSAndroid Build Coastguard Worker {"nearest_mipmap_nearest", GL_NEAREST_MIPMAP_NEAREST},
2027*35238bceSAndroid Build Coastguard Worker {"linear_mipmap_nearest", GL_LINEAR_MIPMAP_NEAREST},
2028*35238bceSAndroid Build Coastguard Worker {"nearest_mipmap_linear", GL_NEAREST_MIPMAP_LINEAR},
2029*35238bceSAndroid Build Coastguard Worker {"linear_mipmap_linear", GL_LINEAR_MIPMAP_LINEAR}};
2030*35238bceSAndroid Build Coastguard Worker
2031*35238bceSAndroid Build Coastguard Worker static const struct
2032*35238bceSAndroid Build Coastguard Worker {
2033*35238bceSAndroid Build Coastguard Worker const char *name;
2034*35238bceSAndroid Build Coastguard Worker GLenum mode;
2035*35238bceSAndroid Build Coastguard Worker } magFilterModes[] = {{"nearest", GL_NEAREST}, {"linear", GL_LINEAR}};
2036*35238bceSAndroid Build Coastguard Worker
2037*35238bceSAndroid Build Coastguard Worker #define FOR_EACH(ITERATOR, ARRAY, BODY) \
2038*35238bceSAndroid Build Coastguard Worker for (int ITERATOR = 0; ITERATOR < DE_LENGTH_OF_ARRAY(ARRAY); ITERATOR++) \
2039*35238bceSAndroid Build Coastguard Worker BODY
2040*35238bceSAndroid Build Coastguard Worker
2041*35238bceSAndroid Build Coastguard Worker // 2D cases.
2042*35238bceSAndroid Build Coastguard Worker
2043*35238bceSAndroid Build Coastguard Worker FOR_EACH(minFilter, minFilterModes,
2044*35238bceSAndroid Build Coastguard Worker FOR_EACH(magFilter, magFilterModes, FOR_EACH(wrapMode, wrapModes, {
2045*35238bceSAndroid Build Coastguard Worker const string name = string("") + minFilterModes[minFilter].name + "_" +
2046*35238bceSAndroid Build Coastguard Worker magFilterModes[magFilter].name + "_" + wrapModes[wrapMode].name;
2047*35238bceSAndroid Build Coastguard Worker
2048*35238bceSAndroid Build Coastguard Worker filteringGroup2D->addChild(new Vertex2DTextureCase(
2049*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), "", minFilterModes[minFilter].mode,
2050*35238bceSAndroid Build Coastguard Worker magFilterModes[magFilter].mode, wrapModes[wrapMode].mode, wrapModes[wrapMode].mode));
2051*35238bceSAndroid Build Coastguard Worker })))
2052*35238bceSAndroid Build Coastguard Worker
2053*35238bceSAndroid Build Coastguard Worker FOR_EACH(wrapSMode, wrapModes, FOR_EACH(wrapTMode, wrapModes, {
2054*35238bceSAndroid Build Coastguard Worker const string name = string("") + wrapModes[wrapSMode].name + "_" + wrapModes[wrapTMode].name;
2055*35238bceSAndroid Build Coastguard Worker
2056*35238bceSAndroid Build Coastguard Worker wrapGroup2D->addChild(new Vertex2DTextureCase(m_context, name.c_str(), "", GL_LINEAR_MIPMAP_LINEAR,
2057*35238bceSAndroid Build Coastguard Worker GL_LINEAR, wrapModes[wrapSMode].mode,
2058*35238bceSAndroid Build Coastguard Worker wrapModes[wrapTMode].mode));
2059*35238bceSAndroid Build Coastguard Worker }))
2060*35238bceSAndroid Build Coastguard Worker
2061*35238bceSAndroid Build Coastguard Worker // Cube map cases.
2062*35238bceSAndroid Build Coastguard Worker
2063*35238bceSAndroid Build Coastguard Worker FOR_EACH(minFilter, minFilterModes,
2064*35238bceSAndroid Build Coastguard Worker FOR_EACH(magFilter, magFilterModes, FOR_EACH(wrapMode, wrapModes, {
2065*35238bceSAndroid Build Coastguard Worker const string name = string("") + minFilterModes[minFilter].name + "_" +
2066*35238bceSAndroid Build Coastguard Worker magFilterModes[magFilter].name + "_" + wrapModes[wrapMode].name;
2067*35238bceSAndroid Build Coastguard Worker
2068*35238bceSAndroid Build Coastguard Worker filteringGroupCube->addChild(new VertexCubeTextureCase(
2069*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), "", minFilterModes[minFilter].mode,
2070*35238bceSAndroid Build Coastguard Worker magFilterModes[magFilter].mode, wrapModes[wrapMode].mode, wrapModes[wrapMode].mode));
2071*35238bceSAndroid Build Coastguard Worker })))
2072*35238bceSAndroid Build Coastguard Worker
2073*35238bceSAndroid Build Coastguard Worker FOR_EACH(wrapSMode, wrapModes, FOR_EACH(wrapTMode, wrapModes, {
2074*35238bceSAndroid Build Coastguard Worker const string name = string("") + wrapModes[wrapSMode].name + "_" + wrapModes[wrapTMode].name;
2075*35238bceSAndroid Build Coastguard Worker
2076*35238bceSAndroid Build Coastguard Worker wrapGroupCube->addChild(new VertexCubeTextureCase(m_context, name.c_str(), "", GL_LINEAR_MIPMAP_LINEAR,
2077*35238bceSAndroid Build Coastguard Worker GL_LINEAR, wrapModes[wrapSMode].mode,
2078*35238bceSAndroid Build Coastguard Worker wrapModes[wrapTMode].mode));
2079*35238bceSAndroid Build Coastguard Worker }))
2080*35238bceSAndroid Build Coastguard Worker
2081*35238bceSAndroid Build Coastguard Worker // 2D array cases.
2082*35238bceSAndroid Build Coastguard Worker
2083*35238bceSAndroid Build Coastguard Worker FOR_EACH(minFilter, minFilterModes,
2084*35238bceSAndroid Build Coastguard Worker FOR_EACH(magFilter, magFilterModes, FOR_EACH(wrapMode, wrapModes, {
2085*35238bceSAndroid Build Coastguard Worker const string name = string("") + minFilterModes[minFilter].name + "_" +
2086*35238bceSAndroid Build Coastguard Worker magFilterModes[magFilter].name + "_" + wrapModes[wrapMode].name;
2087*35238bceSAndroid Build Coastguard Worker
2088*35238bceSAndroid Build Coastguard Worker filteringGroup2DArray->addChild(new Vertex2DArrayTextureCase(
2089*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), "", minFilterModes[minFilter].mode,
2090*35238bceSAndroid Build Coastguard Worker magFilterModes[magFilter].mode, wrapModes[wrapMode].mode, wrapModes[wrapMode].mode));
2091*35238bceSAndroid Build Coastguard Worker })))
2092*35238bceSAndroid Build Coastguard Worker
2093*35238bceSAndroid Build Coastguard Worker FOR_EACH(wrapSMode, wrapModes, FOR_EACH(wrapTMode, wrapModes, {
2094*35238bceSAndroid Build Coastguard Worker const string name = string("") + wrapModes[wrapSMode].name + "_" + wrapModes[wrapTMode].name;
2095*35238bceSAndroid Build Coastguard Worker
2096*35238bceSAndroid Build Coastguard Worker wrapGroup2DArray->addChild(
2097*35238bceSAndroid Build Coastguard Worker new Vertex2DArrayTextureCase(m_context, name.c_str(), "", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR,
2098*35238bceSAndroid Build Coastguard Worker wrapModes[wrapSMode].mode, wrapModes[wrapTMode].mode));
2099*35238bceSAndroid Build Coastguard Worker }))
2100*35238bceSAndroid Build Coastguard Worker
2101*35238bceSAndroid Build Coastguard Worker // 3D cases.
2102*35238bceSAndroid Build Coastguard Worker
2103*35238bceSAndroid Build Coastguard Worker FOR_EACH(minFilter, minFilterModes, FOR_EACH(magFilter, magFilterModes, FOR_EACH(wrapMode, wrapModes, {
2104*35238bceSAndroid Build Coastguard Worker const string name = string("") + minFilterModes[minFilter].name +
2105*35238bceSAndroid Build Coastguard Worker "_" + magFilterModes[magFilter].name + "_" +
2106*35238bceSAndroid Build Coastguard Worker wrapModes[wrapMode].name;
2107*35238bceSAndroid Build Coastguard Worker
2108*35238bceSAndroid Build Coastguard Worker filteringGroup3D->addChild(new Vertex3DTextureCase(
2109*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), "", minFilterModes[minFilter].mode,
2110*35238bceSAndroid Build Coastguard Worker magFilterModes[magFilter].mode, wrapModes[wrapMode].mode,
2111*35238bceSAndroid Build Coastguard Worker wrapModes[wrapMode].mode, wrapModes[wrapMode].mode));
2112*35238bceSAndroid Build Coastguard Worker })))
2113*35238bceSAndroid Build Coastguard Worker
2114*35238bceSAndroid Build Coastguard Worker FOR_EACH(wrapSMode, wrapModes,
2115*35238bceSAndroid Build Coastguard Worker FOR_EACH(wrapTMode, wrapModes, FOR_EACH(wrapRMode, wrapModes, {
2116*35238bceSAndroid Build Coastguard Worker const string name = string("") + wrapModes[wrapSMode].name + "_" + wrapModes[wrapTMode].name +
2117*35238bceSAndroid Build Coastguard Worker "_" + wrapModes[wrapRMode].name;
2118*35238bceSAndroid Build Coastguard Worker
2119*35238bceSAndroid Build Coastguard Worker wrapGroup3D->addChild(new Vertex3DTextureCase(
2120*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), "", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR,
2121*35238bceSAndroid Build Coastguard Worker wrapModes[wrapSMode].mode, wrapModes[wrapTMode].mode, wrapModes[wrapRMode].mode));
2122*35238bceSAndroid Build Coastguard Worker })))
2123*35238bceSAndroid Build Coastguard Worker }
2124*35238bceSAndroid Build Coastguard Worker
2125*35238bceSAndroid Build Coastguard Worker } // namespace Functional
2126*35238bceSAndroid Build Coastguard Worker } // namespace gles3
2127*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2128