xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fShaderTextureFunctionTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 Texture access function tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3fShaderTextureFunctionTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "glsShaderLibrary.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "glsTextureTestUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuMatrix.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuMatrixUtil.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker #include <sstream>
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
42*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
43*35238bceSAndroid Build Coastguard Worker 
44*35238bceSAndroid Build Coastguard Worker namespace deqp
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker namespace gles3
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker namespace Functional
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker namespace
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker 
54*35238bceSAndroid Build Coastguard Worker using glu::TextureTestUtil::computeLodFromDerivates;
55*35238bceSAndroid Build Coastguard Worker 
56*35238bceSAndroid Build Coastguard Worker enum Function
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTURE = 0,  //!< texture(), textureOffset()
59*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJ,  //!< textureProj(), textureProjOffset()
60*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJ3, //!< textureProj(sampler2D, vec3)
61*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTURELOD,   // ...
62*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJLOD,
63*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJLOD3, //!< textureProjLod(sampler2D, vec3)
64*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREGRAD,
65*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJGRAD,
66*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJGRAD3, //!< textureProjGrad(sampler2D, vec3)
67*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXELFETCH,
68*35238bceSAndroid Build Coastguard Worker 
69*35238bceSAndroid Build Coastguard Worker     FUNCTION_LAST
70*35238bceSAndroid Build Coastguard Worker };
71*35238bceSAndroid Build Coastguard Worker 
functionHasAutoLod(glu::ShaderType shaderType,Function function)72*35238bceSAndroid Build Coastguard Worker inline bool functionHasAutoLod(glu::ShaderType shaderType, Function function)
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker     return shaderType == glu::SHADERTYPE_FRAGMENT &&
75*35238bceSAndroid Build Coastguard Worker            (function == FUNCTION_TEXTURE || function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJ3);
76*35238bceSAndroid Build Coastguard Worker }
77*35238bceSAndroid Build Coastguard Worker 
functionHasProj(Function function)78*35238bceSAndroid Build Coastguard Worker inline bool functionHasProj(Function function)
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker     return function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJ3 ||
81*35238bceSAndroid Build Coastguard Worker            function == FUNCTION_TEXTUREPROJLOD || function == FUNCTION_TEXTUREPROJGRAD ||
82*35238bceSAndroid Build Coastguard Worker            function == FUNCTION_TEXTUREPROJLOD3 || function == FUNCTION_TEXTUREPROJGRAD3;
83*35238bceSAndroid Build Coastguard Worker }
84*35238bceSAndroid Build Coastguard Worker 
functionHasGrad(Function function)85*35238bceSAndroid Build Coastguard Worker inline bool functionHasGrad(Function function)
86*35238bceSAndroid Build Coastguard Worker {
87*35238bceSAndroid Build Coastguard Worker     return function == FUNCTION_TEXTUREGRAD || function == FUNCTION_TEXTUREPROJGRAD ||
88*35238bceSAndroid Build Coastguard Worker            function == FUNCTION_TEXTUREPROJGRAD3;
89*35238bceSAndroid Build Coastguard Worker }
90*35238bceSAndroid Build Coastguard Worker 
functionHasLod(Function function)91*35238bceSAndroid Build Coastguard Worker inline bool functionHasLod(Function function)
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker     return function == FUNCTION_TEXTURELOD || function == FUNCTION_TEXTUREPROJLOD ||
94*35238bceSAndroid Build Coastguard Worker            function == FUNCTION_TEXTUREPROJLOD3 || function == FUNCTION_TEXELFETCH;
95*35238bceSAndroid Build Coastguard Worker }
96*35238bceSAndroid Build Coastguard Worker 
97*35238bceSAndroid Build Coastguard Worker struct TextureLookupSpec
98*35238bceSAndroid Build Coastguard Worker {
99*35238bceSAndroid Build Coastguard Worker     Function function;
100*35238bceSAndroid Build Coastguard Worker 
101*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 minCoord;
102*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 maxCoord;
103*35238bceSAndroid Build Coastguard Worker 
104*35238bceSAndroid Build Coastguard Worker     // Bias
105*35238bceSAndroid Build Coastguard Worker     bool useBias;
106*35238bceSAndroid Build Coastguard Worker 
107*35238bceSAndroid Build Coastguard Worker     // Bias or Lod for *Lod* functions
108*35238bceSAndroid Build Coastguard Worker     float minLodBias;
109*35238bceSAndroid Build Coastguard Worker     float maxLodBias;
110*35238bceSAndroid Build Coastguard Worker 
111*35238bceSAndroid Build Coastguard Worker     // For *Grad* functions
112*35238bceSAndroid Build Coastguard Worker     tcu::Vec3 minDX;
113*35238bceSAndroid Build Coastguard Worker     tcu::Vec3 maxDX;
114*35238bceSAndroid Build Coastguard Worker     tcu::Vec3 minDY;
115*35238bceSAndroid Build Coastguard Worker     tcu::Vec3 maxDY;
116*35238bceSAndroid Build Coastguard Worker 
117*35238bceSAndroid Build Coastguard Worker     bool useOffset;
118*35238bceSAndroid Build Coastguard Worker     tcu::IVec3 offset;
119*35238bceSAndroid Build Coastguard Worker 
TextureLookupSpecdeqp::gles3::Functional::__anonffd091fa0111::TextureLookupSpec120*35238bceSAndroid Build Coastguard Worker     TextureLookupSpec(void)
121*35238bceSAndroid Build Coastguard Worker         : function(FUNCTION_LAST)
122*35238bceSAndroid Build Coastguard Worker         , minCoord(0.0f)
123*35238bceSAndroid Build Coastguard Worker         , maxCoord(1.0f)
124*35238bceSAndroid Build Coastguard Worker         , useBias(false)
125*35238bceSAndroid Build Coastguard Worker         , minLodBias(0.0f)
126*35238bceSAndroid Build Coastguard Worker         , maxLodBias(0.0f)
127*35238bceSAndroid Build Coastguard Worker         , minDX(0.0f)
128*35238bceSAndroid Build Coastguard Worker         , maxDX(0.0f)
129*35238bceSAndroid Build Coastguard Worker         , minDY(0.0f)
130*35238bceSAndroid Build Coastguard Worker         , maxDY(0.0f)
131*35238bceSAndroid Build Coastguard Worker         , useOffset(false)
132*35238bceSAndroid Build Coastguard Worker         , offset(0)
133*35238bceSAndroid Build Coastguard Worker     {
134*35238bceSAndroid Build Coastguard Worker     }
135*35238bceSAndroid Build Coastguard Worker 
TextureLookupSpecdeqp::gles3::Functional::__anonffd091fa0111::TextureLookupSpec136*35238bceSAndroid Build Coastguard Worker     TextureLookupSpec(Function function_, const tcu::Vec4 &minCoord_, const tcu::Vec4 &maxCoord_, bool useBias_,
137*35238bceSAndroid Build Coastguard Worker                       float minLodBias_, float maxLodBias_, const tcu::Vec3 &minDX_, const tcu::Vec3 &maxDX_,
138*35238bceSAndroid Build Coastguard Worker                       const tcu::Vec3 &minDY_, const tcu::Vec3 &maxDY_, bool useOffset_, const tcu::IVec3 &offset_)
139*35238bceSAndroid Build Coastguard Worker         : function(function_)
140*35238bceSAndroid Build Coastguard Worker         , minCoord(minCoord_)
141*35238bceSAndroid Build Coastguard Worker         , maxCoord(maxCoord_)
142*35238bceSAndroid Build Coastguard Worker         , useBias(useBias_)
143*35238bceSAndroid Build Coastguard Worker         , minLodBias(minLodBias_)
144*35238bceSAndroid Build Coastguard Worker         , maxLodBias(maxLodBias_)
145*35238bceSAndroid Build Coastguard Worker         , minDX(minDX_)
146*35238bceSAndroid Build Coastguard Worker         , maxDX(maxDX_)
147*35238bceSAndroid Build Coastguard Worker         , minDY(minDY_)
148*35238bceSAndroid Build Coastguard Worker         , maxDY(maxDY_)
149*35238bceSAndroid Build Coastguard Worker         , useOffset(useOffset_)
150*35238bceSAndroid Build Coastguard Worker         , offset(offset_)
151*35238bceSAndroid Build Coastguard Worker     {
152*35238bceSAndroid Build Coastguard Worker     }
153*35238bceSAndroid Build Coastguard Worker };
154*35238bceSAndroid Build Coastguard Worker 
155*35238bceSAndroid Build Coastguard Worker enum TextureType
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker     TEXTURETYPE_2D,
158*35238bceSAndroid Build Coastguard Worker     TEXTURETYPE_CUBE_MAP,
159*35238bceSAndroid Build Coastguard Worker     TEXTURETYPE_2D_ARRAY,
160*35238bceSAndroid Build Coastguard Worker     TEXTURETYPE_3D,
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker     TEXTURETYPE_LAST
163*35238bceSAndroid Build Coastguard Worker };
164*35238bceSAndroid Build Coastguard Worker 
165*35238bceSAndroid Build Coastguard Worker struct TextureSpec
166*35238bceSAndroid Build Coastguard Worker {
167*35238bceSAndroid Build Coastguard Worker     TextureType type; //!< Texture type (2D, cubemap, ...)
168*35238bceSAndroid Build Coastguard Worker     uint32_t format;  //!< Internal format.
169*35238bceSAndroid Build Coastguard Worker     int width;
170*35238bceSAndroid Build Coastguard Worker     int height;
171*35238bceSAndroid Build Coastguard Worker     int depth;
172*35238bceSAndroid Build Coastguard Worker     int numLevels;
173*35238bceSAndroid Build Coastguard Worker     tcu::Sampler sampler;
174*35238bceSAndroid Build Coastguard Worker 
TextureSpecdeqp::gles3::Functional::__anonffd091fa0111::TextureSpec175*35238bceSAndroid Build Coastguard Worker     TextureSpec(void) : type(TEXTURETYPE_LAST), format(GL_NONE), width(0), height(0), depth(0), numLevels(0)
176*35238bceSAndroid Build Coastguard Worker     {
177*35238bceSAndroid Build Coastguard Worker     }
178*35238bceSAndroid Build Coastguard Worker 
TextureSpecdeqp::gles3::Functional::__anonffd091fa0111::TextureSpec179*35238bceSAndroid Build Coastguard Worker     TextureSpec(TextureType type_, uint32_t format_, int width_, int height_, int depth_, int numLevels_,
180*35238bceSAndroid Build Coastguard Worker                 const tcu::Sampler &sampler_)
181*35238bceSAndroid Build Coastguard Worker         : type(type_)
182*35238bceSAndroid Build Coastguard Worker         , format(format_)
183*35238bceSAndroid Build Coastguard Worker         , width(width_)
184*35238bceSAndroid Build Coastguard Worker         , height(height_)
185*35238bceSAndroid Build Coastguard Worker         , depth(depth_)
186*35238bceSAndroid Build Coastguard Worker         , numLevels(numLevels_)
187*35238bceSAndroid Build Coastguard Worker         , sampler(sampler_)
188*35238bceSAndroid Build Coastguard Worker     {
189*35238bceSAndroid Build Coastguard Worker     }
190*35238bceSAndroid Build Coastguard Worker };
191*35238bceSAndroid Build Coastguard Worker 
192*35238bceSAndroid Build Coastguard Worker struct TexLookupParams
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker     float lod;
195*35238bceSAndroid Build Coastguard Worker     tcu::IVec3 offset;
196*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 scale;
197*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 bias;
198*35238bceSAndroid Build Coastguard Worker 
TexLookupParamsdeqp::gles3::Functional::__anonffd091fa0111::TexLookupParams199*35238bceSAndroid Build Coastguard Worker     TexLookupParams(void) : lod(0.0f), offset(0), scale(1.0f), bias(0.0f)
200*35238bceSAndroid Build Coastguard Worker     {
201*35238bceSAndroid Build Coastguard Worker     }
202*35238bceSAndroid Build Coastguard Worker };
203*35238bceSAndroid Build Coastguard Worker 
204*35238bceSAndroid Build Coastguard Worker } // namespace
205*35238bceSAndroid Build Coastguard Worker 
206*35238bceSAndroid Build Coastguard Worker using tcu::IVec2;
207*35238bceSAndroid Build Coastguard Worker using tcu::IVec3;
208*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
209*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
210*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
211*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker static const glu::TextureTestUtil::LodMode DEFAULT_LOD_MODE = glu::TextureTestUtil::LODMODE_EXACT;
214*35238bceSAndroid Build Coastguard Worker 
computeLodFromGrad2D(const gls::ShaderEvalContext & c)215*35238bceSAndroid Build Coastguard Worker inline float computeLodFromGrad2D(const gls::ShaderEvalContext &c)
216*35238bceSAndroid Build Coastguard Worker {
217*35238bceSAndroid Build Coastguard Worker     float w = (float)c.textures[0].tex2D->getWidth();
218*35238bceSAndroid Build Coastguard Worker     float h = (float)c.textures[0].tex2D->getHeight();
219*35238bceSAndroid Build Coastguard Worker     return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x() * w, c.in[1].y() * h, c.in[2].x() * w,
220*35238bceSAndroid Build Coastguard Worker                                    c.in[2].y() * h);
221*35238bceSAndroid Build Coastguard Worker }
222*35238bceSAndroid Build Coastguard Worker 
computeLodFromGrad2DArray(const gls::ShaderEvalContext & c)223*35238bceSAndroid Build Coastguard Worker inline float computeLodFromGrad2DArray(const gls::ShaderEvalContext &c)
224*35238bceSAndroid Build Coastguard Worker {
225*35238bceSAndroid Build Coastguard Worker     float w = (float)c.textures[0].tex2DArray->getWidth();
226*35238bceSAndroid Build Coastguard Worker     float h = (float)c.textures[0].tex2DArray->getHeight();
227*35238bceSAndroid Build Coastguard Worker     return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x() * w, c.in[1].y() * h, c.in[2].x() * w,
228*35238bceSAndroid Build Coastguard Worker                                    c.in[2].y() * h);
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker 
computeLodFromGrad3D(const gls::ShaderEvalContext & c)231*35238bceSAndroid Build Coastguard Worker inline float computeLodFromGrad3D(const gls::ShaderEvalContext &c)
232*35238bceSAndroid Build Coastguard Worker {
233*35238bceSAndroid Build Coastguard Worker     float w = (float)c.textures[0].tex3D->getWidth();
234*35238bceSAndroid Build Coastguard Worker     float h = (float)c.textures[0].tex3D->getHeight();
235*35238bceSAndroid Build Coastguard Worker     float d = (float)c.textures[0].tex3D->getDepth();
236*35238bceSAndroid Build Coastguard Worker     return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x() * w, c.in[1].y() * h, c.in[1].z() * d, c.in[2].x() * w,
237*35238bceSAndroid Build Coastguard Worker                                    c.in[2].y() * h, c.in[2].z() * d);
238*35238bceSAndroid Build Coastguard Worker }
239*35238bceSAndroid Build Coastguard Worker 
computeLodFromGradCube(const gls::ShaderEvalContext & c)240*35238bceSAndroid Build Coastguard Worker inline float computeLodFromGradCube(const gls::ShaderEvalContext &c)
241*35238bceSAndroid Build Coastguard Worker {
242*35238bceSAndroid Build Coastguard Worker     // \note Major axis is always -Z or +Z
243*35238bceSAndroid Build Coastguard Worker     float m = de::abs(c.in[0].z());
244*35238bceSAndroid Build Coastguard Worker     float d = (float)c.textures[0].texCube->getSize();
245*35238bceSAndroid Build Coastguard Worker     float s = d / (2.0f * m);
246*35238bceSAndroid Build Coastguard Worker     float t = d / (2.0f * m);
247*35238bceSAndroid Build Coastguard Worker     return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x() * s, c.in[1].y() * t, c.in[2].x() * s,
248*35238bceSAndroid Build Coastguard Worker                                    c.in[2].y() * t);
249*35238bceSAndroid Build Coastguard Worker }
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker typedef void (*TexEvalFunc)(gls::ShaderEvalContext &c, const TexLookupParams &lookupParams);
252*35238bceSAndroid Build Coastguard Worker 
texture2D(const gls::ShaderEvalContext & c,float s,float t,float lod)253*35238bceSAndroid Build Coastguard Worker inline Vec4 texture2D(const gls::ShaderEvalContext &c, float s, float t, float lod)
254*35238bceSAndroid Build Coastguard Worker {
255*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2D->sample(c.textures[0].sampler, s, t, lod);
256*35238bceSAndroid Build Coastguard Worker }
textureCube(const gls::ShaderEvalContext & c,float s,float t,float r,float lod)257*35238bceSAndroid Build Coastguard Worker inline Vec4 textureCube(const gls::ShaderEvalContext &c, float s, float t, float r, float lod)
258*35238bceSAndroid Build Coastguard Worker {
259*35238bceSAndroid Build Coastguard Worker     return c.textures[0].texCube->sample(c.textures[0].sampler, s, t, r, lod);
260*35238bceSAndroid Build Coastguard Worker }
texture2DArray(const gls::ShaderEvalContext & c,float s,float t,float r,float lod)261*35238bceSAndroid Build Coastguard Worker inline Vec4 texture2DArray(const gls::ShaderEvalContext &c, float s, float t, float r, float lod)
262*35238bceSAndroid Build Coastguard Worker {
263*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2DArray->sample(c.textures[0].sampler, s, t, r, lod);
264*35238bceSAndroid Build Coastguard Worker }
texture3D(const gls::ShaderEvalContext & c,float s,float t,float r,float lod)265*35238bceSAndroid Build Coastguard Worker inline Vec4 texture3D(const gls::ShaderEvalContext &c, float s, float t, float r, float lod)
266*35238bceSAndroid Build Coastguard Worker {
267*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex3D->sample(c.textures[0].sampler, s, t, r, lod);
268*35238bceSAndroid Build Coastguard Worker }
269*35238bceSAndroid Build Coastguard Worker 
texture2DShadow(const gls::ShaderEvalContext & c,float ref,float s,float t,float lod)270*35238bceSAndroid Build Coastguard Worker inline float texture2DShadow(const gls::ShaderEvalContext &c, float ref, float s, float t, float lod)
271*35238bceSAndroid Build Coastguard Worker {
272*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2D->sampleCompare(c.textures[0].sampler, ref, s, t, lod);
273*35238bceSAndroid Build Coastguard Worker }
textureCubeShadow(const gls::ShaderEvalContext & c,float ref,float s,float t,float r,float lod)274*35238bceSAndroid Build Coastguard Worker inline float textureCubeShadow(const gls::ShaderEvalContext &c, float ref, float s, float t, float r, float lod)
275*35238bceSAndroid Build Coastguard Worker {
276*35238bceSAndroid Build Coastguard Worker     return c.textures[0].texCube->sampleCompare(c.textures[0].sampler, ref, s, t, r, lod);
277*35238bceSAndroid Build Coastguard Worker }
texture2DArrayShadow(const gls::ShaderEvalContext & c,float ref,float s,float t,float r,float lod)278*35238bceSAndroid Build Coastguard Worker inline float texture2DArrayShadow(const gls::ShaderEvalContext &c, float ref, float s, float t, float r, float lod)
279*35238bceSAndroid Build Coastguard Worker {
280*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2DArray->sampleCompare(c.textures[0].sampler, ref, s, t, r, lod);
281*35238bceSAndroid Build Coastguard Worker }
282*35238bceSAndroid Build Coastguard Worker 
texture2DOffset(const gls::ShaderEvalContext & c,float s,float t,float lod,IVec2 offset)283*35238bceSAndroid Build Coastguard Worker inline Vec4 texture2DOffset(const gls::ShaderEvalContext &c, float s, float t, float lod, IVec2 offset)
284*35238bceSAndroid Build Coastguard Worker {
285*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2D->sampleOffset(c.textures[0].sampler, s, t, lod, offset);
286*35238bceSAndroid Build Coastguard Worker }
texture2DArrayOffset(const gls::ShaderEvalContext & c,float s,float t,float r,float lod,IVec2 offset)287*35238bceSAndroid Build Coastguard Worker inline Vec4 texture2DArrayOffset(const gls::ShaderEvalContext &c, float s, float t, float r, float lod, IVec2 offset)
288*35238bceSAndroid Build Coastguard Worker {
289*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2DArray->sampleOffset(c.textures[0].sampler, s, t, r, lod, offset);
290*35238bceSAndroid Build Coastguard Worker }
texture3DOffset(const gls::ShaderEvalContext & c,float s,float t,float r,float lod,IVec3 offset)291*35238bceSAndroid Build Coastguard Worker inline Vec4 texture3DOffset(const gls::ShaderEvalContext &c, float s, float t, float r, float lod, IVec3 offset)
292*35238bceSAndroid Build Coastguard Worker {
293*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex3D->sampleOffset(c.textures[0].sampler, s, t, r, lod, offset);
294*35238bceSAndroid Build Coastguard Worker }
295*35238bceSAndroid Build Coastguard Worker 
texture2DShadowOffset(const gls::ShaderEvalContext & c,float ref,float s,float t,float lod,IVec2 offset)296*35238bceSAndroid Build Coastguard Worker inline float texture2DShadowOffset(const gls::ShaderEvalContext &c, float ref, float s, float t, float lod,
297*35238bceSAndroid Build Coastguard Worker                                    IVec2 offset)
298*35238bceSAndroid Build Coastguard Worker {
299*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2D->sampleCompareOffset(c.textures[0].sampler, ref, s, t, lod, offset);
300*35238bceSAndroid Build Coastguard Worker }
texture2DArrayShadowOffset(const gls::ShaderEvalContext & c,float ref,float s,float t,float r,float lod,IVec2 offset)301*35238bceSAndroid Build Coastguard Worker inline float texture2DArrayShadowOffset(const gls::ShaderEvalContext &c, float ref, float s, float t, float r,
302*35238bceSAndroid Build Coastguard Worker                                         float lod, IVec2 offset)
303*35238bceSAndroid Build Coastguard Worker {
304*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2DArray->sampleCompareOffset(c.textures[0].sampler, ref, s, t, r, lod, offset);
305*35238bceSAndroid Build Coastguard Worker }
306*35238bceSAndroid Build Coastguard Worker 
307*35238bceSAndroid Build Coastguard Worker // Eval functions.
evalTexture2D(gls::ShaderEvalContext & c,const TexLookupParams & p)308*35238bceSAndroid Build Coastguard Worker static void evalTexture2D(gls::ShaderEvalContext &c, const TexLookupParams &p)
309*35238bceSAndroid Build Coastguard Worker {
310*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x(), c.in[0].y(), p.lod) * p.scale + p.bias;
311*35238bceSAndroid Build Coastguard Worker }
evalTextureCube(gls::ShaderEvalContext & c,const TexLookupParams & p)312*35238bceSAndroid Build Coastguard Worker static void evalTextureCube(gls::ShaderEvalContext &c, const TexLookupParams &p)
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker     c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod) * p.scale + p.bias;
315*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArray(gls::ShaderEvalContext & c,const TexLookupParams & p)316*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArray(gls::ShaderEvalContext &c, const TexLookupParams &p)
317*35238bceSAndroid Build Coastguard Worker {
318*35238bceSAndroid Build Coastguard Worker     c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod) * p.scale + p.bias;
319*35238bceSAndroid Build Coastguard Worker }
evalTexture3D(gls::ShaderEvalContext & c,const TexLookupParams & p)320*35238bceSAndroid Build Coastguard Worker static void evalTexture3D(gls::ShaderEvalContext &c, const TexLookupParams &p)
321*35238bceSAndroid Build Coastguard Worker {
322*35238bceSAndroid Build Coastguard Worker     c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod) * p.scale + p.bias;
323*35238bceSAndroid Build Coastguard Worker }
324*35238bceSAndroid Build Coastguard Worker 
evalTexture2DBias(gls::ShaderEvalContext & c,const TexLookupParams & p)325*35238bceSAndroid Build Coastguard Worker static void evalTexture2DBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
326*35238bceSAndroid Build Coastguard Worker {
327*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x(), c.in[0].y(), p.lod + c.in[1].x()) * p.scale + p.bias;
328*35238bceSAndroid Build Coastguard Worker }
evalTextureCubeBias(gls::ShaderEvalContext & c,const TexLookupParams & p)329*35238bceSAndroid Build Coastguard Worker static void evalTextureCubeBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
330*35238bceSAndroid Build Coastguard Worker {
331*35238bceSAndroid Build Coastguard Worker     c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod + c.in[1].x()) * p.scale + p.bias;
332*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayBias(gls::ShaderEvalContext & c,const TexLookupParams & p)333*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
334*35238bceSAndroid Build Coastguard Worker {
335*35238bceSAndroid Build Coastguard Worker     c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod + c.in[1].x()) * p.scale + p.bias;
336*35238bceSAndroid Build Coastguard Worker }
evalTexture3DBias(gls::ShaderEvalContext & c,const TexLookupParams & p)337*35238bceSAndroid Build Coastguard Worker static void evalTexture3DBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
338*35238bceSAndroid Build Coastguard Worker {
339*35238bceSAndroid Build Coastguard Worker     c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod + c.in[1].x()) * p.scale + p.bias;
340*35238bceSAndroid Build Coastguard Worker }
341*35238bceSAndroid Build Coastguard Worker 
evalTexture2DProj3(gls::ShaderEvalContext & c,const TexLookupParams & p)342*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProj3(gls::ShaderEvalContext &c, const TexLookupParams &p)
343*35238bceSAndroid Build Coastguard Worker {
344*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x() / c.in[0].z(), c.in[0].y() / c.in[0].z(), p.lod) * p.scale + p.bias;
345*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProj3Bias(gls::ShaderEvalContext & c,const TexLookupParams & p)346*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProj3Bias(gls::ShaderEvalContext &c, const TexLookupParams &p)
347*35238bceSAndroid Build Coastguard Worker {
348*35238bceSAndroid Build Coastguard Worker     c.color =
349*35238bceSAndroid Build Coastguard Worker         texture2D(c, c.in[0].x() / c.in[0].z(), c.in[0].y() / c.in[0].z(), p.lod + c.in[1].x()) * p.scale + p.bias;
350*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProj(gls::ShaderEvalContext & c,const TexLookupParams & p)351*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProj(gls::ShaderEvalContext &c, const TexLookupParams &p)
352*35238bceSAndroid Build Coastguard Worker {
353*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), p.lod) * p.scale + p.bias;
354*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjBias(gls::ShaderEvalContext & c,const TexLookupParams & p)355*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
356*35238bceSAndroid Build Coastguard Worker {
357*35238bceSAndroid Build Coastguard Worker     c.color =
358*35238bceSAndroid Build Coastguard Worker         texture2D(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), p.lod + c.in[1].x()) * p.scale + p.bias;
359*35238bceSAndroid Build Coastguard Worker }
evalTexture3DProj(gls::ShaderEvalContext & c,const TexLookupParams & p)360*35238bceSAndroid Build Coastguard Worker static void evalTexture3DProj(gls::ShaderEvalContext &c, const TexLookupParams &p)
361*35238bceSAndroid Build Coastguard Worker {
362*35238bceSAndroid Build Coastguard Worker     c.color =
363*35238bceSAndroid Build Coastguard Worker         texture3D(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[0].z() / c.in[0].w(), p.lod) * p.scale +
364*35238bceSAndroid Build Coastguard Worker         p.bias;
365*35238bceSAndroid Build Coastguard Worker }
evalTexture3DProjBias(gls::ShaderEvalContext & c,const TexLookupParams & p)366*35238bceSAndroid Build Coastguard Worker static void evalTexture3DProjBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
367*35238bceSAndroid Build Coastguard Worker {
368*35238bceSAndroid Build Coastguard Worker     c.color = texture3D(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[0].z() / c.in[0].w(),
369*35238bceSAndroid Build Coastguard Worker                         p.lod + c.in[1].x()) *
370*35238bceSAndroid Build Coastguard Worker                   p.scale +
371*35238bceSAndroid Build Coastguard Worker               p.bias;
372*35238bceSAndroid Build Coastguard Worker }
373*35238bceSAndroid Build Coastguard Worker 
evalTexture2DLod(gls::ShaderEvalContext & c,const TexLookupParams & p)374*35238bceSAndroid Build Coastguard Worker static void evalTexture2DLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
375*35238bceSAndroid Build Coastguard Worker {
376*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x(), c.in[0].y(), c.in[1].x()) * p.scale + p.bias;
377*35238bceSAndroid Build Coastguard Worker }
evalTextureCubeLod(gls::ShaderEvalContext & c,const TexLookupParams & p)378*35238bceSAndroid Build Coastguard Worker static void evalTextureCubeLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
379*35238bceSAndroid Build Coastguard Worker {
380*35238bceSAndroid Build Coastguard Worker     c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x()) * p.scale + p.bias;
381*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayLod(gls::ShaderEvalContext & c,const TexLookupParams & p)382*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
383*35238bceSAndroid Build Coastguard Worker {
384*35238bceSAndroid Build Coastguard Worker     c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x()) * p.scale + p.bias;
385*35238bceSAndroid Build Coastguard Worker }
evalTexture3DLod(gls::ShaderEvalContext & c,const TexLookupParams & p)386*35238bceSAndroid Build Coastguard Worker static void evalTexture3DLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
387*35238bceSAndroid Build Coastguard Worker {
388*35238bceSAndroid Build Coastguard Worker     c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x()) * p.scale + p.bias;
389*35238bceSAndroid Build Coastguard Worker }
390*35238bceSAndroid Build Coastguard Worker 
evalTexture2DProjLod3(gls::ShaderEvalContext & c,const TexLookupParams & p)391*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjLod3(gls::ShaderEvalContext &c, const TexLookupParams &p)
392*35238bceSAndroid Build Coastguard Worker {
393*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x() / c.in[0].z(), c.in[0].y() / c.in[0].z(), c.in[1].x()) * p.scale + p.bias;
394*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjLod(gls::ShaderEvalContext & c,const TexLookupParams & p)395*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
396*35238bceSAndroid Build Coastguard Worker {
397*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[1].x()) * p.scale + p.bias;
398*35238bceSAndroid Build Coastguard Worker }
evalTexture3DProjLod(gls::ShaderEvalContext & c,const TexLookupParams & p)399*35238bceSAndroid Build Coastguard Worker static void evalTexture3DProjLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
400*35238bceSAndroid Build Coastguard Worker {
401*35238bceSAndroid Build Coastguard Worker     c.color =
402*35238bceSAndroid Build Coastguard Worker         texture3D(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[0].z() / c.in[0].w(), c.in[1].x()) *
403*35238bceSAndroid Build Coastguard Worker             p.scale +
404*35238bceSAndroid Build Coastguard Worker         p.bias;
405*35238bceSAndroid Build Coastguard Worker }
406*35238bceSAndroid Build Coastguard Worker 
407*35238bceSAndroid Build Coastguard Worker // Offset variants
408*35238bceSAndroid Build Coastguard Worker 
evalTexture2DOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)409*35238bceSAndroid Build Coastguard Worker static void evalTexture2DOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
410*35238bceSAndroid Build Coastguard Worker {
411*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), p.lod, p.offset.swizzle(0, 1)) * p.scale + p.bias;
412*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)413*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
414*35238bceSAndroid Build Coastguard Worker {
415*35238bceSAndroid Build Coastguard Worker     c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod, p.offset.swizzle(0, 1)) * p.scale +
416*35238bceSAndroid Build Coastguard Worker               p.bias;
417*35238bceSAndroid Build Coastguard Worker }
evalTexture3DOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)418*35238bceSAndroid Build Coastguard Worker static void evalTexture3DOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
419*35238bceSAndroid Build Coastguard Worker {
420*35238bceSAndroid Build Coastguard Worker     c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod, p.offset) * p.scale + p.bias;
421*35238bceSAndroid Build Coastguard Worker }
422*35238bceSAndroid Build Coastguard Worker 
evalTexture2DOffsetBias(gls::ShaderEvalContext & c,const TexLookupParams & p)423*35238bceSAndroid Build Coastguard Worker static void evalTexture2DOffsetBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
424*35238bceSAndroid Build Coastguard Worker {
425*35238bceSAndroid Build Coastguard Worker     c.color =
426*35238bceSAndroid Build Coastguard Worker         texture2DOffset(c, c.in[0].x(), c.in[0].y(), p.lod + c.in[1].x(), p.offset.swizzle(0, 1)) * p.scale + p.bias;
427*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayOffsetBias(gls::ShaderEvalContext & c,const TexLookupParams & p)428*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayOffsetBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
429*35238bceSAndroid Build Coastguard Worker {
430*35238bceSAndroid Build Coastguard Worker     c.color =
431*35238bceSAndroid Build Coastguard Worker         texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod + c.in[1].x(), p.offset.swizzle(0, 1)) *
432*35238bceSAndroid Build Coastguard Worker             p.scale +
433*35238bceSAndroid Build Coastguard Worker         p.bias;
434*35238bceSAndroid Build Coastguard Worker }
evalTexture3DOffsetBias(gls::ShaderEvalContext & c,const TexLookupParams & p)435*35238bceSAndroid Build Coastguard Worker static void evalTexture3DOffsetBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
436*35238bceSAndroid Build Coastguard Worker {
437*35238bceSAndroid Build Coastguard Worker     c.color =
438*35238bceSAndroid Build Coastguard Worker         texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod + c.in[1].x(), p.offset) * p.scale + p.bias;
439*35238bceSAndroid Build Coastguard Worker }
440*35238bceSAndroid Build Coastguard Worker 
evalTexture2DLodOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)441*35238bceSAndroid Build Coastguard Worker static void evalTexture2DLodOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
442*35238bceSAndroid Build Coastguard Worker {
443*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.swizzle(0, 1)) * p.scale + p.bias;
444*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayLodOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)445*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayLodOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
446*35238bceSAndroid Build Coastguard Worker {
447*35238bceSAndroid Build Coastguard Worker     c.color =
448*35238bceSAndroid Build Coastguard Worker         texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x(), p.offset.swizzle(0, 1)) * p.scale +
449*35238bceSAndroid Build Coastguard Worker         p.bias;
450*35238bceSAndroid Build Coastguard Worker }
evalTexture3DLodOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)451*35238bceSAndroid Build Coastguard Worker static void evalTexture3DLodOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
452*35238bceSAndroid Build Coastguard Worker {
453*35238bceSAndroid Build Coastguard Worker     c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x(), p.offset) * p.scale + p.bias;
454*35238bceSAndroid Build Coastguard Worker }
455*35238bceSAndroid Build Coastguard Worker 
evalTexture2DProj3Offset(gls::ShaderEvalContext & c,const TexLookupParams & p)456*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProj3Offset(gls::ShaderEvalContext &c, const TexLookupParams &p)
457*35238bceSAndroid Build Coastguard Worker {
458*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x() / c.in[0].z(), c.in[0].y() / c.in[0].z(), p.lod, p.offset.swizzle(0, 1)) *
459*35238bceSAndroid Build Coastguard Worker                   p.scale +
460*35238bceSAndroid Build Coastguard Worker               p.bias;
461*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProj3OffsetBias(gls::ShaderEvalContext & c,const TexLookupParams & p)462*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProj3OffsetBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
463*35238bceSAndroid Build Coastguard Worker {
464*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x() / c.in[0].z(), c.in[0].y() / c.in[0].z(), p.lod + c.in[1].x(),
465*35238bceSAndroid Build Coastguard Worker                               p.offset.swizzle(0, 1)) *
466*35238bceSAndroid Build Coastguard Worker                   p.scale +
467*35238bceSAndroid Build Coastguard Worker               p.bias;
468*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)469*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
470*35238bceSAndroid Build Coastguard Worker {
471*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), p.lod, p.offset.swizzle(0, 1)) *
472*35238bceSAndroid Build Coastguard Worker                   p.scale +
473*35238bceSAndroid Build Coastguard Worker               p.bias;
474*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjOffsetBias(gls::ShaderEvalContext & c,const TexLookupParams & p)475*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjOffsetBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
476*35238bceSAndroid Build Coastguard Worker {
477*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), p.lod + c.in[1].x(),
478*35238bceSAndroid Build Coastguard Worker                               p.offset.swizzle(0, 1)) *
479*35238bceSAndroid Build Coastguard Worker                   p.scale +
480*35238bceSAndroid Build Coastguard Worker               p.bias;
481*35238bceSAndroid Build Coastguard Worker }
evalTexture3DProjOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)482*35238bceSAndroid Build Coastguard Worker static void evalTexture3DProjOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
483*35238bceSAndroid Build Coastguard Worker {
484*35238bceSAndroid Build Coastguard Worker     c.color = texture3DOffset(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[0].z() / c.in[0].w(), p.lod,
485*35238bceSAndroid Build Coastguard Worker                               p.offset) *
486*35238bceSAndroid Build Coastguard Worker                   p.scale +
487*35238bceSAndroid Build Coastguard Worker               p.bias;
488*35238bceSAndroid Build Coastguard Worker }
evalTexture3DProjOffsetBias(gls::ShaderEvalContext & c,const TexLookupParams & p)489*35238bceSAndroid Build Coastguard Worker static void evalTexture3DProjOffsetBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
490*35238bceSAndroid Build Coastguard Worker {
491*35238bceSAndroid Build Coastguard Worker     c.color = texture3DOffset(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[0].z() / c.in[0].w(),
492*35238bceSAndroid Build Coastguard Worker                               p.lod + c.in[1].x(), p.offset) *
493*35238bceSAndroid Build Coastguard Worker                   p.scale +
494*35238bceSAndroid Build Coastguard Worker               p.bias;
495*35238bceSAndroid Build Coastguard Worker }
496*35238bceSAndroid Build Coastguard Worker 
evalTexture2DProjLod3Offset(gls::ShaderEvalContext & c,const TexLookupParams & p)497*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjLod3Offset(gls::ShaderEvalContext &c, const TexLookupParams &p)
498*35238bceSAndroid Build Coastguard Worker {
499*35238bceSAndroid Build Coastguard Worker     c.color =
500*35238bceSAndroid Build Coastguard Worker         texture2DOffset(c, c.in[0].x() / c.in[0].z(), c.in[0].y() / c.in[0].z(), c.in[1].x(), p.offset.swizzle(0, 1)) *
501*35238bceSAndroid Build Coastguard Worker             p.scale +
502*35238bceSAndroid Build Coastguard Worker         p.bias;
503*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjLodOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)504*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjLodOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
505*35238bceSAndroid Build Coastguard Worker {
506*35238bceSAndroid Build Coastguard Worker     c.color =
507*35238bceSAndroid Build Coastguard Worker         texture2DOffset(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[1].x(), p.offset.swizzle(0, 1)) *
508*35238bceSAndroid Build Coastguard Worker             p.scale +
509*35238bceSAndroid Build Coastguard Worker         p.bias;
510*35238bceSAndroid Build Coastguard Worker }
evalTexture3DProjLodOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)511*35238bceSAndroid Build Coastguard Worker static void evalTexture3DProjLodOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
512*35238bceSAndroid Build Coastguard Worker {
513*35238bceSAndroid Build Coastguard Worker     c.color = texture3DOffset(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[0].z() / c.in[0].w(),
514*35238bceSAndroid Build Coastguard Worker                               c.in[1].x(), p.offset) *
515*35238bceSAndroid Build Coastguard Worker                   p.scale +
516*35238bceSAndroid Build Coastguard Worker               p.bias;
517*35238bceSAndroid Build Coastguard Worker }
518*35238bceSAndroid Build Coastguard Worker 
519*35238bceSAndroid Build Coastguard Worker // Shadow variants
520*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadow(gls::ShaderEvalContext & c,const TexLookupParams & p)521*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadow(gls::ShaderEvalContext &c, const TexLookupParams &p)
522*35238bceSAndroid Build Coastguard Worker {
523*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod);
524*35238bceSAndroid Build Coastguard Worker }
evalTexture2DShadowBias(gls::ShaderEvalContext & c,const TexLookupParams & p)525*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
526*35238bceSAndroid Build Coastguard Worker {
527*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod + c.in[1].x());
528*35238bceSAndroid Build Coastguard Worker }
529*35238bceSAndroid Build Coastguard Worker 
evalTextureCubeShadow(gls::ShaderEvalContext & c,const TexLookupParams & p)530*35238bceSAndroid Build Coastguard Worker static void evalTextureCubeShadow(gls::ShaderEvalContext &c, const TexLookupParams &p)
531*35238bceSAndroid Build Coastguard Worker {
532*35238bceSAndroid Build Coastguard Worker     c.color.x() = textureCubeShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod);
533*35238bceSAndroid Build Coastguard Worker }
evalTextureCubeShadowBias(gls::ShaderEvalContext & c,const TexLookupParams & p)534*35238bceSAndroid Build Coastguard Worker static void evalTextureCubeShadowBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
535*35238bceSAndroid Build Coastguard Worker {
536*35238bceSAndroid Build Coastguard Worker     c.color.x() = textureCubeShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod + c.in[1].x());
537*35238bceSAndroid Build Coastguard Worker }
538*35238bceSAndroid Build Coastguard Worker 
evalTexture2DArrayShadow(gls::ShaderEvalContext & c,const TexLookupParams & p)539*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayShadow(gls::ShaderEvalContext &c, const TexLookupParams &p)
540*35238bceSAndroid Build Coastguard Worker {
541*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DArrayShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod);
542*35238bceSAndroid Build Coastguard Worker }
543*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadowLod(gls::ShaderEvalContext & c,const TexLookupParams &)544*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowLod(gls::ShaderEvalContext &c, const TexLookupParams &)
545*35238bceSAndroid Build Coastguard Worker {
546*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x());
547*35238bceSAndroid Build Coastguard Worker }
evalTexture2DShadowLodOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)548*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowLodOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
549*35238bceSAndroid Build Coastguard Worker {
550*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.swizzle(0, 1));
551*35238bceSAndroid Build Coastguard Worker }
552*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadowProj(gls::ShaderEvalContext & c,const TexLookupParams & p)553*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowProj(gls::ShaderEvalContext &c, const TexLookupParams &p)
554*35238bceSAndroid Build Coastguard Worker {
555*35238bceSAndroid Build Coastguard Worker     c.color.x() =
556*35238bceSAndroid Build Coastguard Worker         texture2DShadow(c, c.in[0].z() / c.in[0].w(), c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), p.lod);
557*35238bceSAndroid Build Coastguard Worker }
evalTexture2DShadowProjBias(gls::ShaderEvalContext & c,const TexLookupParams & p)558*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowProjBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
559*35238bceSAndroid Build Coastguard Worker {
560*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadow(c, c.in[0].z() / c.in[0].w(), c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(),
561*35238bceSAndroid Build Coastguard Worker                                   p.lod + c.in[1].x());
562*35238bceSAndroid Build Coastguard Worker }
563*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadowProjLod(gls::ShaderEvalContext & c,const TexLookupParams &)564*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowProjLod(gls::ShaderEvalContext &c, const TexLookupParams &)
565*35238bceSAndroid Build Coastguard Worker {
566*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadow(c, c.in[0].z() / c.in[0].w(), c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(),
567*35238bceSAndroid Build Coastguard Worker                                   c.in[1].x());
568*35238bceSAndroid Build Coastguard Worker }
evalTexture2DShadowProjLodOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)569*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowProjLodOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
570*35238bceSAndroid Build Coastguard Worker {
571*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadowOffset(c, c.in[0].z() / c.in[0].w(), c.in[0].x() / c.in[0].w(),
572*35238bceSAndroid Build Coastguard Worker                                         c.in[0].y() / c.in[0].w(), c.in[1].x(), p.offset.swizzle(0, 1));
573*35238bceSAndroid Build Coastguard Worker }
574*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadowOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)575*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
576*35238bceSAndroid Build Coastguard Worker {
577*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod, p.offset.swizzle(0, 1));
578*35238bceSAndroid Build Coastguard Worker }
evalTexture2DShadowOffsetBias(gls::ShaderEvalContext & c,const TexLookupParams & p)579*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowOffsetBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
580*35238bceSAndroid Build Coastguard Worker {
581*35238bceSAndroid Build Coastguard Worker     c.color.x() =
582*35238bceSAndroid Build Coastguard Worker         texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod + c.in[1].x(), p.offset.swizzle(0, 1));
583*35238bceSAndroid Build Coastguard Worker }
584*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadowProjOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)585*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowProjOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
586*35238bceSAndroid Build Coastguard Worker {
587*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadowOffset(c, c.in[0].z() / c.in[0].w(), c.in[0].x() / c.in[0].w(),
588*35238bceSAndroid Build Coastguard Worker                                         c.in[0].y() / c.in[0].w(), p.lod, p.offset.swizzle(0, 1));
589*35238bceSAndroid Build Coastguard Worker }
evalTexture2DShadowProjOffsetBias(gls::ShaderEvalContext & c,const TexLookupParams & p)590*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowProjOffsetBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
591*35238bceSAndroid Build Coastguard Worker {
592*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadowOffset(c, c.in[0].z() / c.in[0].w(), c.in[0].x() / c.in[0].w(),
593*35238bceSAndroid Build Coastguard Worker                                         c.in[0].y() / c.in[0].w(), p.lod + c.in[1].x(), p.offset.swizzle(0, 1));
594*35238bceSAndroid Build Coastguard Worker }
595*35238bceSAndroid Build Coastguard Worker 
596*35238bceSAndroid Build Coastguard Worker // Gradient variarts
597*35238bceSAndroid Build Coastguard Worker 
evalTexture2DGrad(gls::ShaderEvalContext & c,const TexLookupParams & p)598*35238bceSAndroid Build Coastguard Worker static void evalTexture2DGrad(gls::ShaderEvalContext &c, const TexLookupParams &p)
599*35238bceSAndroid Build Coastguard Worker {
600*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c)) * p.scale + p.bias;
601*35238bceSAndroid Build Coastguard Worker }
evalTextureCubeGrad(gls::ShaderEvalContext & c,const TexLookupParams & p)602*35238bceSAndroid Build Coastguard Worker static void evalTextureCubeGrad(gls::ShaderEvalContext &c, const TexLookupParams &p)
603*35238bceSAndroid Build Coastguard Worker {
604*35238bceSAndroid Build Coastguard Worker     c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGradCube(c)) * p.scale + p.bias;
605*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayGrad(gls::ShaderEvalContext & c,const TexLookupParams & p)606*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayGrad(gls::ShaderEvalContext &c, const TexLookupParams &p)
607*35238bceSAndroid Build Coastguard Worker {
608*35238bceSAndroid Build Coastguard Worker     c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c)) * p.scale + p.bias;
609*35238bceSAndroid Build Coastguard Worker }
evalTexture3DGrad(gls::ShaderEvalContext & c,const TexLookupParams & p)610*35238bceSAndroid Build Coastguard Worker static void evalTexture3DGrad(gls::ShaderEvalContext &c, const TexLookupParams &p)
611*35238bceSAndroid Build Coastguard Worker {
612*35238bceSAndroid Build Coastguard Worker     c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad3D(c)) * p.scale + p.bias;
613*35238bceSAndroid Build Coastguard Worker }
614*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadowGrad(gls::ShaderEvalContext & c,const TexLookupParams &)615*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowGrad(gls::ShaderEvalContext &c, const TexLookupParams &)
616*35238bceSAndroid Build Coastguard Worker {
617*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c));
618*35238bceSAndroid Build Coastguard Worker }
evalTextureCubeShadowGrad(gls::ShaderEvalContext & c,const TexLookupParams &)619*35238bceSAndroid Build Coastguard Worker static void evalTextureCubeShadowGrad(gls::ShaderEvalContext &c, const TexLookupParams &)
620*35238bceSAndroid Build Coastguard Worker {
621*35238bceSAndroid Build Coastguard Worker     c.color.x() = textureCubeShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGradCube(c));
622*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayShadowGrad(gls::ShaderEvalContext & c,const TexLookupParams &)623*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayShadowGrad(gls::ShaderEvalContext &c, const TexLookupParams &)
624*35238bceSAndroid Build Coastguard Worker {
625*35238bceSAndroid Build Coastguard Worker     c.color.x() =
626*35238bceSAndroid Build Coastguard Worker         texture2DArrayShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c));
627*35238bceSAndroid Build Coastguard Worker }
628*35238bceSAndroid Build Coastguard Worker 
evalTexture2DGradOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)629*35238bceSAndroid Build Coastguard Worker static void evalTexture2DGradOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
630*35238bceSAndroid Build Coastguard Worker {
631*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c), p.offset.swizzle(0, 1)) * p.scale +
632*35238bceSAndroid Build Coastguard Worker               p.bias;
633*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayGradOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)634*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayGradOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
635*35238bceSAndroid Build Coastguard Worker {
636*35238bceSAndroid Build Coastguard Worker     c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c),
637*35238bceSAndroid Build Coastguard Worker                                    p.offset.swizzle(0, 1)) *
638*35238bceSAndroid Build Coastguard Worker                   p.scale +
639*35238bceSAndroid Build Coastguard Worker               p.bias;
640*35238bceSAndroid Build Coastguard Worker }
evalTexture3DGradOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)641*35238bceSAndroid Build Coastguard Worker static void evalTexture3DGradOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
642*35238bceSAndroid Build Coastguard Worker {
643*35238bceSAndroid Build Coastguard Worker     c.color =
644*35238bceSAndroid Build Coastguard Worker         texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad3D(c), p.offset) * p.scale + p.bias;
645*35238bceSAndroid Build Coastguard Worker }
646*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadowGradOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)647*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowGradOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
648*35238bceSAndroid Build Coastguard Worker {
649*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c),
650*35238bceSAndroid Build Coastguard Worker                                         p.offset.swizzle(0, 1));
651*35238bceSAndroid Build Coastguard Worker }
evalTexture2DArrayShadowGradOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)652*35238bceSAndroid Build Coastguard Worker static void evalTexture2DArrayShadowGradOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
653*35238bceSAndroid Build Coastguard Worker {
654*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DArrayShadowOffset(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(),
655*35238bceSAndroid Build Coastguard Worker                                              computeLodFromGrad2DArray(c), p.offset.swizzle(0, 1));
656*35238bceSAndroid Build Coastguard Worker }
657*35238bceSAndroid Build Coastguard Worker 
evalTexture2DShadowProjGrad(gls::ShaderEvalContext & c,const TexLookupParams &)658*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowProjGrad(gls::ShaderEvalContext &c, const TexLookupParams &)
659*35238bceSAndroid Build Coastguard Worker {
660*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadow(c, c.in[0].z() / c.in[0].w(), c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(),
661*35238bceSAndroid Build Coastguard Worker                                   computeLodFromGrad2D(c));
662*35238bceSAndroid Build Coastguard Worker }
evalTexture2DShadowProjGradOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)663*35238bceSAndroid Build Coastguard Worker static void evalTexture2DShadowProjGradOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
664*35238bceSAndroid Build Coastguard Worker {
665*35238bceSAndroid Build Coastguard Worker     c.color.x() = texture2DShadowOffset(c, c.in[0].z() / c.in[0].w(), c.in[0].x() / c.in[0].w(),
666*35238bceSAndroid Build Coastguard Worker                                         c.in[0].y() / c.in[0].w(), computeLodFromGrad2D(c), p.offset.swizzle(0, 1));
667*35238bceSAndroid Build Coastguard Worker }
668*35238bceSAndroid Build Coastguard Worker 
evalTexture2DProjGrad3(gls::ShaderEvalContext & c,const TexLookupParams & p)669*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjGrad3(gls::ShaderEvalContext &c, const TexLookupParams &p)
670*35238bceSAndroid Build Coastguard Worker {
671*35238bceSAndroid Build Coastguard Worker     c.color =
672*35238bceSAndroid Build Coastguard Worker         texture2D(c, c.in[0].x() / c.in[0].z(), c.in[0].y() / c.in[0].z(), computeLodFromGrad2D(c)) * p.scale + p.bias;
673*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjGrad(gls::ShaderEvalContext & c,const TexLookupParams & p)674*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjGrad(gls::ShaderEvalContext &c, const TexLookupParams &p)
675*35238bceSAndroid Build Coastguard Worker {
676*35238bceSAndroid Build Coastguard Worker     c.color =
677*35238bceSAndroid Build Coastguard Worker         texture2D(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), computeLodFromGrad2D(c)) * p.scale + p.bias;
678*35238bceSAndroid Build Coastguard Worker }
evalTexture3DProjGrad(gls::ShaderEvalContext & c,const TexLookupParams & p)679*35238bceSAndroid Build Coastguard Worker static void evalTexture3DProjGrad(gls::ShaderEvalContext &c, const TexLookupParams &p)
680*35238bceSAndroid Build Coastguard Worker {
681*35238bceSAndroid Build Coastguard Worker     c.color = texture3D(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[0].z() / c.in[0].w(),
682*35238bceSAndroid Build Coastguard Worker                         computeLodFromGrad3D(c)) *
683*35238bceSAndroid Build Coastguard Worker                   p.scale +
684*35238bceSAndroid Build Coastguard Worker               p.bias;
685*35238bceSAndroid Build Coastguard Worker }
686*35238bceSAndroid Build Coastguard Worker 
evalTexture2DProjGrad3Offset(gls::ShaderEvalContext & c,const TexLookupParams & p)687*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjGrad3Offset(gls::ShaderEvalContext &c, const TexLookupParams &p)
688*35238bceSAndroid Build Coastguard Worker {
689*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x() / c.in[0].z(), c.in[0].y() / c.in[0].z(), computeLodFromGrad2D(c),
690*35238bceSAndroid Build Coastguard Worker                               p.offset.swizzle(0, 1)) *
691*35238bceSAndroid Build Coastguard Worker                   p.scale +
692*35238bceSAndroid Build Coastguard Worker               p.bias;
693*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjGradOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)694*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjGradOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
695*35238bceSAndroid Build Coastguard Worker {
696*35238bceSAndroid Build Coastguard Worker     c.color = texture2DOffset(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), computeLodFromGrad2D(c),
697*35238bceSAndroid Build Coastguard Worker                               p.offset.swizzle(0, 1)) *
698*35238bceSAndroid Build Coastguard Worker                   p.scale +
699*35238bceSAndroid Build Coastguard Worker               p.bias;
700*35238bceSAndroid Build Coastguard Worker }
evalTexture3DProjGradOffset(gls::ShaderEvalContext & c,const TexLookupParams & p)701*35238bceSAndroid Build Coastguard Worker static void evalTexture3DProjGradOffset(gls::ShaderEvalContext &c, const TexLookupParams &p)
702*35238bceSAndroid Build Coastguard Worker {
703*35238bceSAndroid Build Coastguard Worker     c.color = texture3DOffset(c, c.in[0].x() / c.in[0].w(), c.in[0].y() / c.in[0].w(), c.in[0].z() / c.in[0].w(),
704*35238bceSAndroid Build Coastguard Worker                               computeLodFromGrad3D(c), p.offset) *
705*35238bceSAndroid Build Coastguard Worker                   p.scale +
706*35238bceSAndroid Build Coastguard Worker               p.bias;
707*35238bceSAndroid Build Coastguard Worker }
708*35238bceSAndroid Build Coastguard Worker 
709*35238bceSAndroid Build Coastguard Worker // Texel fetch variants
710*35238bceSAndroid Build Coastguard Worker 
evalTexelFetch2D(gls::ShaderEvalContext & c,const TexLookupParams & p)711*35238bceSAndroid Build Coastguard Worker static void evalTexelFetch2D(gls::ShaderEvalContext &c, const TexLookupParams &p)
712*35238bceSAndroid Build Coastguard Worker {
713*35238bceSAndroid Build Coastguard Worker     int x   = deChopFloatToInt32(c.in[0].x()) + p.offset.x();
714*35238bceSAndroid Build Coastguard Worker     int y   = deChopFloatToInt32(c.in[0].y()) + p.offset.y();
715*35238bceSAndroid Build Coastguard Worker     int lod = deChopFloatToInt32(c.in[1].x());
716*35238bceSAndroid Build Coastguard Worker     c.color = c.textures[0].tex2D->getLevel(lod).getPixel(x, y) * p.scale + p.bias;
717*35238bceSAndroid Build Coastguard Worker }
718*35238bceSAndroid Build Coastguard Worker 
evalTexelFetch2DArray(gls::ShaderEvalContext & c,const TexLookupParams & p)719*35238bceSAndroid Build Coastguard Worker static void evalTexelFetch2DArray(gls::ShaderEvalContext &c, const TexLookupParams &p)
720*35238bceSAndroid Build Coastguard Worker {
721*35238bceSAndroid Build Coastguard Worker     int x   = deChopFloatToInt32(c.in[0].x()) + p.offset.x();
722*35238bceSAndroid Build Coastguard Worker     int y   = deChopFloatToInt32(c.in[0].y()) + p.offset.y();
723*35238bceSAndroid Build Coastguard Worker     int l   = deChopFloatToInt32(c.in[0].z());
724*35238bceSAndroid Build Coastguard Worker     int lod = deChopFloatToInt32(c.in[1].x());
725*35238bceSAndroid Build Coastguard Worker     c.color = c.textures[0].tex2DArray->getLevel(lod).getPixel(x, y, l) * p.scale + p.bias;
726*35238bceSAndroid Build Coastguard Worker }
727*35238bceSAndroid Build Coastguard Worker 
evalTexelFetch3D(gls::ShaderEvalContext & c,const TexLookupParams & p)728*35238bceSAndroid Build Coastguard Worker static void evalTexelFetch3D(gls::ShaderEvalContext &c, const TexLookupParams &p)
729*35238bceSAndroid Build Coastguard Worker {
730*35238bceSAndroid Build Coastguard Worker     int x   = deChopFloatToInt32(c.in[0].x()) + p.offset.x();
731*35238bceSAndroid Build Coastguard Worker     int y   = deChopFloatToInt32(c.in[0].y()) + p.offset.y();
732*35238bceSAndroid Build Coastguard Worker     int z   = deChopFloatToInt32(c.in[0].z()) + p.offset.z();
733*35238bceSAndroid Build Coastguard Worker     int lod = deChopFloatToInt32(c.in[1].x());
734*35238bceSAndroid Build Coastguard Worker     c.color = c.textures[0].tex3D->getLevel(lod).getPixel(x, y, z) * p.scale + p.bias;
735*35238bceSAndroid Build Coastguard Worker }
736*35238bceSAndroid Build Coastguard Worker 
737*35238bceSAndroid Build Coastguard Worker class TexLookupEvaluator : public gls::ShaderEvaluator
738*35238bceSAndroid Build Coastguard Worker {
739*35238bceSAndroid Build Coastguard Worker public:
TexLookupEvaluator(TexEvalFunc evalFunc,const TexLookupParams & lookupParams)740*35238bceSAndroid Build Coastguard Worker     TexLookupEvaluator(TexEvalFunc evalFunc, const TexLookupParams &lookupParams)
741*35238bceSAndroid Build Coastguard Worker         : m_evalFunc(evalFunc)
742*35238bceSAndroid Build Coastguard Worker         , m_lookupParams(lookupParams)
743*35238bceSAndroid Build Coastguard Worker     {
744*35238bceSAndroid Build Coastguard Worker     }
745*35238bceSAndroid Build Coastguard Worker 
evaluate(gls::ShaderEvalContext & ctx)746*35238bceSAndroid Build Coastguard Worker     virtual void evaluate(gls::ShaderEvalContext &ctx)
747*35238bceSAndroid Build Coastguard Worker     {
748*35238bceSAndroid Build Coastguard Worker         m_evalFunc(ctx, m_lookupParams);
749*35238bceSAndroid Build Coastguard Worker     }
750*35238bceSAndroid Build Coastguard Worker 
751*35238bceSAndroid Build Coastguard Worker private:
752*35238bceSAndroid Build Coastguard Worker     TexEvalFunc m_evalFunc;
753*35238bceSAndroid Build Coastguard Worker     const TexLookupParams &m_lookupParams;
754*35238bceSAndroid Build Coastguard Worker };
755*35238bceSAndroid Build Coastguard Worker 
756*35238bceSAndroid Build Coastguard Worker class ShaderTextureFunctionCase : public gls::ShaderRenderCase
757*35238bceSAndroid Build Coastguard Worker {
758*35238bceSAndroid Build Coastguard Worker public:
759*35238bceSAndroid Build Coastguard Worker     ShaderTextureFunctionCase(Context &context, const char *name, const char *desc, const TextureLookupSpec &lookup,
760*35238bceSAndroid Build Coastguard Worker                               const TextureSpec &texture, TexEvalFunc evalFunc, bool isVertexCase);
761*35238bceSAndroid Build Coastguard Worker     ~ShaderTextureFunctionCase(void);
762*35238bceSAndroid Build Coastguard Worker 
763*35238bceSAndroid Build Coastguard Worker     void init(void);
764*35238bceSAndroid Build Coastguard Worker     void deinit(void);
765*35238bceSAndroid Build Coastguard Worker 
766*35238bceSAndroid Build Coastguard Worker protected:
767*35238bceSAndroid Build Coastguard Worker     void setupUniforms(int programID, const tcu::Vec4 &constCoords);
768*35238bceSAndroid Build Coastguard Worker 
769*35238bceSAndroid Build Coastguard Worker private:
770*35238bceSAndroid Build Coastguard Worker     void initTexture(void);
771*35238bceSAndroid Build Coastguard Worker     void initShaderSources(void);
772*35238bceSAndroid Build Coastguard Worker 
773*35238bceSAndroid Build Coastguard Worker     TextureLookupSpec m_lookupSpec;
774*35238bceSAndroid Build Coastguard Worker     TextureSpec m_textureSpec;
775*35238bceSAndroid Build Coastguard Worker 
776*35238bceSAndroid Build Coastguard Worker     TexLookupParams m_lookupParams;
777*35238bceSAndroid Build Coastguard Worker     TexLookupEvaluator m_evaluator;
778*35238bceSAndroid Build Coastguard Worker 
779*35238bceSAndroid Build Coastguard Worker     glu::Texture2D *m_texture2D;
780*35238bceSAndroid Build Coastguard Worker     glu::TextureCube *m_textureCube;
781*35238bceSAndroid Build Coastguard Worker     glu::Texture2DArray *m_texture2DArray;
782*35238bceSAndroid Build Coastguard Worker     glu::Texture3D *m_texture3D;
783*35238bceSAndroid Build Coastguard Worker };
784*35238bceSAndroid Build Coastguard Worker 
ShaderTextureFunctionCase(Context & context,const char * name,const char * desc,const TextureLookupSpec & lookup,const TextureSpec & texture,TexEvalFunc evalFunc,bool isVertexCase)785*35238bceSAndroid Build Coastguard Worker ShaderTextureFunctionCase::ShaderTextureFunctionCase(Context &context, const char *name, const char *desc,
786*35238bceSAndroid Build Coastguard Worker                                                      const TextureLookupSpec &lookup, const TextureSpec &texture,
787*35238bceSAndroid Build Coastguard Worker                                                      TexEvalFunc evalFunc, bool isVertexCase)
788*35238bceSAndroid Build Coastguard Worker     : gls::ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc,
789*35238bceSAndroid Build Coastguard Worker                             isVertexCase, m_evaluator)
790*35238bceSAndroid Build Coastguard Worker     , m_lookupSpec(lookup)
791*35238bceSAndroid Build Coastguard Worker     , m_textureSpec(texture)
792*35238bceSAndroid Build Coastguard Worker     , m_evaluator(evalFunc, m_lookupParams)
793*35238bceSAndroid Build Coastguard Worker     , m_texture2D(DE_NULL)
794*35238bceSAndroid Build Coastguard Worker     , m_textureCube(DE_NULL)
795*35238bceSAndroid Build Coastguard Worker     , m_texture2DArray(DE_NULL)
796*35238bceSAndroid Build Coastguard Worker     , m_texture3D(DE_NULL)
797*35238bceSAndroid Build Coastguard Worker {
798*35238bceSAndroid Build Coastguard Worker }
799*35238bceSAndroid Build Coastguard Worker 
~ShaderTextureFunctionCase(void)800*35238bceSAndroid Build Coastguard Worker ShaderTextureFunctionCase::~ShaderTextureFunctionCase(void)
801*35238bceSAndroid Build Coastguard Worker {
802*35238bceSAndroid Build Coastguard Worker     delete m_texture2D;
803*35238bceSAndroid Build Coastguard Worker     delete m_textureCube;
804*35238bceSAndroid Build Coastguard Worker     delete m_texture2DArray;
805*35238bceSAndroid Build Coastguard Worker     delete m_texture3D;
806*35238bceSAndroid Build Coastguard Worker }
807*35238bceSAndroid Build Coastguard Worker 
init(void)808*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::init(void)
809*35238bceSAndroid Build Coastguard Worker {
810*35238bceSAndroid Build Coastguard Worker     {
811*35238bceSAndroid Build Coastguard Worker         // Base coord scale & bias
812*35238bceSAndroid Build Coastguard Worker         Vec4 s = m_lookupSpec.maxCoord - m_lookupSpec.minCoord;
813*35238bceSAndroid Build Coastguard Worker         Vec4 b = m_lookupSpec.minCoord;
814*35238bceSAndroid Build Coastguard Worker 
815*35238bceSAndroid Build Coastguard Worker         float baseCoordTrans[] = {s.x(),        0.0f,         0.f, b.x(),
816*35238bceSAndroid Build Coastguard Worker                                   0.f,          s.y(),        0.f, b.y(),
817*35238bceSAndroid Build Coastguard Worker                                   s.z() / 2.f,  -s.z() / 2.f, 0.f, s.z() / 2.f + b.z(),
818*35238bceSAndroid Build Coastguard Worker                                   -s.w() / 2.f, s.w() / 2.f,  0.f, s.w() / 2.f + b.w()};
819*35238bceSAndroid Build Coastguard Worker 
820*35238bceSAndroid Build Coastguard Worker         m_userAttribTransforms.push_back(tcu::Mat4(baseCoordTrans));
821*35238bceSAndroid Build Coastguard Worker     }
822*35238bceSAndroid Build Coastguard Worker 
823*35238bceSAndroid Build Coastguard Worker     bool hasLodBias = functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias;
824*35238bceSAndroid Build Coastguard Worker     bool isGrad     = functionHasGrad(m_lookupSpec.function);
825*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!isGrad || !hasLodBias);
826*35238bceSAndroid Build Coastguard Worker 
827*35238bceSAndroid Build Coastguard Worker     if (hasLodBias)
828*35238bceSAndroid Build Coastguard Worker     {
829*35238bceSAndroid Build Coastguard Worker         float s               = m_lookupSpec.maxLodBias - m_lookupSpec.minLodBias;
830*35238bceSAndroid Build Coastguard Worker         float b               = m_lookupSpec.minLodBias;
831*35238bceSAndroid Build Coastguard Worker         float lodCoordTrans[] = {s / 2.0f, s / 2.0f, 0.f,  b,    0.0f, 0.0f, 0.0f, 0.0f,
832*35238bceSAndroid Build Coastguard Worker                                  0.0f,     0.0f,     0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
833*35238bceSAndroid Build Coastguard Worker 
834*35238bceSAndroid Build Coastguard Worker         m_userAttribTransforms.push_back(tcu::Mat4(lodCoordTrans));
835*35238bceSAndroid Build Coastguard Worker     }
836*35238bceSAndroid Build Coastguard Worker     else if (isGrad)
837*35238bceSAndroid Build Coastguard Worker     {
838*35238bceSAndroid Build Coastguard Worker         Vec3 sx             = m_lookupSpec.maxDX - m_lookupSpec.minDX;
839*35238bceSAndroid Build Coastguard Worker         Vec3 sy             = m_lookupSpec.maxDY - m_lookupSpec.minDY;
840*35238bceSAndroid Build Coastguard Worker         float gradDxTrans[] = {sx.x() / 2.0f, sx.x() / 2.0f, 0.f,  m_lookupSpec.minDX.x(),
841*35238bceSAndroid Build Coastguard Worker                                sx.y() / 2.0f, sx.y() / 2.0f, 0.0f, m_lookupSpec.minDX.y(),
842*35238bceSAndroid Build Coastguard Worker                                sx.z() / 2.0f, sx.z() / 2.0f, 0.0f, m_lookupSpec.minDX.z(),
843*35238bceSAndroid Build Coastguard Worker                                0.0f,          0.0f,          0.0f, 0.0f};
844*35238bceSAndroid Build Coastguard Worker         float gradDyTrans[] = {-sy.x() / 2.0f, -sy.x() / 2.0f, 0.f,  m_lookupSpec.maxDY.x(),
845*35238bceSAndroid Build Coastguard Worker                                -sy.y() / 2.0f, -sy.y() / 2.0f, 0.0f, m_lookupSpec.maxDY.y(),
846*35238bceSAndroid Build Coastguard Worker                                -sy.z() / 2.0f, -sy.z() / 2.0f, 0.0f, m_lookupSpec.maxDY.z(),
847*35238bceSAndroid Build Coastguard Worker                                0.0f,           0.0f,           0.0f, 0.0f};
848*35238bceSAndroid Build Coastguard Worker 
849*35238bceSAndroid Build Coastguard Worker         m_userAttribTransforms.push_back(tcu::Mat4(gradDxTrans));
850*35238bceSAndroid Build Coastguard Worker         m_userAttribTransforms.push_back(tcu::Mat4(gradDyTrans));
851*35238bceSAndroid Build Coastguard Worker     }
852*35238bceSAndroid Build Coastguard Worker 
853*35238bceSAndroid Build Coastguard Worker     initShaderSources();
854*35238bceSAndroid Build Coastguard Worker     initTexture();
855*35238bceSAndroid Build Coastguard Worker 
856*35238bceSAndroid Build Coastguard Worker     gls::ShaderRenderCase::init();
857*35238bceSAndroid Build Coastguard Worker }
858*35238bceSAndroid Build Coastguard Worker 
initTexture(void)859*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::initTexture(void)
860*35238bceSAndroid Build Coastguard Worker {
861*35238bceSAndroid Build Coastguard Worker     static const IVec4 texCubeSwz[] = {IVec4(0, 0, 1, 1), IVec4(1, 1, 0, 0), IVec4(0, 1, 0, 1),
862*35238bceSAndroid Build Coastguard Worker                                        IVec4(1, 0, 1, 0), IVec4(0, 1, 1, 0), IVec4(1, 0, 0, 1)};
863*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(texCubeSwz) == tcu::CUBEFACE_LAST);
864*35238bceSAndroid Build Coastguard Worker 
865*35238bceSAndroid Build Coastguard Worker     tcu::TextureFormat texFmt      = glu::mapGLInternalFormat(m_textureSpec.format);
866*35238bceSAndroid Build Coastguard Worker     tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFmt);
867*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 viewportSize        = getViewportSize();
868*35238bceSAndroid Build Coastguard Worker     bool useProj = functionHasProj(m_lookupSpec.function) && !functionHasGrad(m_lookupSpec.function) &&
869*35238bceSAndroid Build Coastguard Worker                    !functionHasLod(m_lookupSpec.function);
870*35238bceSAndroid Build Coastguard Worker     bool isAutoLod = functionHasAutoLod(m_isVertexCase ? glu::SHADERTYPE_VERTEX : glu::SHADERTYPE_FRAGMENT,
871*35238bceSAndroid Build Coastguard Worker                                         m_lookupSpec.function); // LOD can vary significantly
872*35238bceSAndroid Build Coastguard Worker     float proj = useProj ? 1.0f / m_lookupSpec.minCoord[m_lookupSpec.function == FUNCTION_TEXTUREPROJ3 ? 2 : 3] : 1.0f;
873*35238bceSAndroid Build Coastguard Worker 
874*35238bceSAndroid Build Coastguard Worker     switch (m_textureSpec.type)
875*35238bceSAndroid Build Coastguard Worker     {
876*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_2D:
877*35238bceSAndroid Build Coastguard Worker     {
878*35238bceSAndroid Build Coastguard Worker         float levelStep  = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels - 1);
879*35238bceSAndroid Build Coastguard Worker         Vec4 cScale      = fmtInfo.valueMax - fmtInfo.valueMin;
880*35238bceSAndroid Build Coastguard Worker         Vec4 cBias       = fmtInfo.valueMin;
881*35238bceSAndroid Build Coastguard Worker         int baseCellSize = de::min(m_textureSpec.width / 4, m_textureSpec.height / 4);
882*35238bceSAndroid Build Coastguard Worker 
883*35238bceSAndroid Build Coastguard Worker         m_texture2D = new glu::Texture2D(m_renderCtx, m_textureSpec.format, m_textureSpec.width, m_textureSpec.height);
884*35238bceSAndroid Build Coastguard Worker         for (int level = 0; level < m_textureSpec.numLevels; level++)
885*35238bceSAndroid Build Coastguard Worker         {
886*35238bceSAndroid Build Coastguard Worker             float fA    = float(level) * levelStep;
887*35238bceSAndroid Build Coastguard Worker             float fB    = 1.0f - fA;
888*35238bceSAndroid Build Coastguard Worker             Vec4 colorA = cBias + cScale * Vec4(fA, fB, fA, fB);
889*35238bceSAndroid Build Coastguard Worker             Vec4 colorB = cBias + cScale * Vec4(fB, fA, fB, fA);
890*35238bceSAndroid Build Coastguard Worker 
891*35238bceSAndroid Build Coastguard Worker             m_texture2D->getRefTexture().allocLevel(level);
892*35238bceSAndroid Build Coastguard Worker             tcu::fillWithGrid(m_texture2D->getRefTexture().getLevel(level), de::max(1, baseCellSize >> level), colorA,
893*35238bceSAndroid Build Coastguard Worker                               colorB);
894*35238bceSAndroid Build Coastguard Worker         }
895*35238bceSAndroid Build Coastguard Worker         m_texture2D->upload();
896*35238bceSAndroid Build Coastguard Worker 
897*35238bceSAndroid Build Coastguard Worker         // Compute LOD.
898*35238bceSAndroid Build Coastguard Worker         float dudx = (m_lookupSpec.maxCoord[0] - m_lookupSpec.minCoord[0]) * proj * (float)m_textureSpec.width /
899*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[0];
900*35238bceSAndroid Build Coastguard Worker         float dvdy = (m_lookupSpec.maxCoord[1] - m_lookupSpec.minCoord[1]) * proj * (float)m_textureSpec.height /
901*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[1];
902*35238bceSAndroid Build Coastguard Worker         m_lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, 0.0f, dvdy);
903*35238bceSAndroid Build Coastguard Worker 
904*35238bceSAndroid Build Coastguard Worker         // Append to texture list.
905*35238bceSAndroid Build Coastguard Worker         m_textures.push_back(gls::TextureBinding(m_texture2D, m_textureSpec.sampler));
906*35238bceSAndroid Build Coastguard Worker         break;
907*35238bceSAndroid Build Coastguard Worker     }
908*35238bceSAndroid Build Coastguard Worker 
909*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_CUBE_MAP:
910*35238bceSAndroid Build Coastguard Worker     {
911*35238bceSAndroid Build Coastguard Worker         float levelStep  = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels - 1);
912*35238bceSAndroid Build Coastguard Worker         Vec4 cScale      = fmtInfo.valueMax - fmtInfo.valueMin;
913*35238bceSAndroid Build Coastguard Worker         Vec4 cBias       = fmtInfo.valueMin;
914*35238bceSAndroid Build Coastguard Worker         Vec4 cCorner     = cBias + cScale * 0.5f;
915*35238bceSAndroid Build Coastguard Worker         int baseCellSize = de::min(m_textureSpec.width / 4, m_textureSpec.height / 4);
916*35238bceSAndroid Build Coastguard Worker 
917*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(m_textureSpec.width == m_textureSpec.height);
918*35238bceSAndroid Build Coastguard Worker         m_textureCube = new glu::TextureCube(m_renderCtx, m_textureSpec.format, m_textureSpec.width);
919*35238bceSAndroid Build Coastguard Worker         for (int level = 0; level < m_textureSpec.numLevels; level++)
920*35238bceSAndroid Build Coastguard Worker         {
921*35238bceSAndroid Build Coastguard Worker             float fA = float(level) * levelStep;
922*35238bceSAndroid Build Coastguard Worker             float fB = 1.0f - fA;
923*35238bceSAndroid Build Coastguard Worker             Vec2 f(fA, fB);
924*35238bceSAndroid Build Coastguard Worker 
925*35238bceSAndroid Build Coastguard Worker             for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
926*35238bceSAndroid Build Coastguard Worker             {
927*35238bceSAndroid Build Coastguard Worker                 const IVec4 &swzA = texCubeSwz[face];
928*35238bceSAndroid Build Coastguard Worker                 IVec4 swzB        = 1 - swzA;
929*35238bceSAndroid Build Coastguard Worker                 Vec4 colorA       = cBias + cScale * f.swizzle(swzA[0], swzA[1], swzA[2], swzA[3]);
930*35238bceSAndroid Build Coastguard Worker                 Vec4 colorB       = cBias + cScale * f.swizzle(swzB[0], swzB[1], swzB[2], swzB[3]);
931*35238bceSAndroid Build Coastguard Worker 
932*35238bceSAndroid Build Coastguard Worker                 m_textureCube->getRefTexture().allocLevel((tcu::CubeFace)face, level);
933*35238bceSAndroid Build Coastguard Worker 
934*35238bceSAndroid Build Coastguard Worker                 {
935*35238bceSAndroid Build Coastguard Worker                     const tcu::PixelBufferAccess access =
936*35238bceSAndroid Build Coastguard Worker                         m_textureCube->getRefTexture().getLevelFace(level, (tcu::CubeFace)face);
937*35238bceSAndroid Build Coastguard Worker                     const int lastPix = access.getWidth() - 1;
938*35238bceSAndroid Build Coastguard Worker 
939*35238bceSAndroid Build Coastguard Worker                     tcu::fillWithGrid(access, de::max(1, baseCellSize >> level), colorA, colorB);
940*35238bceSAndroid Build Coastguard Worker 
941*35238bceSAndroid Build Coastguard Worker                     // Ensure all corners have identical colors in order to avoid dealing with ambiguous corner texel filtering
942*35238bceSAndroid Build Coastguard Worker                     access.setPixel(cCorner, 0, 0);
943*35238bceSAndroid Build Coastguard Worker                     access.setPixel(cCorner, 0, lastPix);
944*35238bceSAndroid Build Coastguard Worker                     access.setPixel(cCorner, lastPix, 0);
945*35238bceSAndroid Build Coastguard Worker                     access.setPixel(cCorner, lastPix, lastPix);
946*35238bceSAndroid Build Coastguard Worker                 }
947*35238bceSAndroid Build Coastguard Worker             }
948*35238bceSAndroid Build Coastguard Worker         }
949*35238bceSAndroid Build Coastguard Worker         m_textureCube->upload();
950*35238bceSAndroid Build Coastguard Worker 
951*35238bceSAndroid Build Coastguard Worker         // Compute LOD \note Assumes that only single side is accessed and R is constant major axis.
952*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::abs(m_lookupSpec.minCoord[2] - m_lookupSpec.maxCoord[2]) < 0.005);
953*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::abs(m_lookupSpec.minCoord[0]) < de::abs(m_lookupSpec.minCoord[2]) &&
954*35238bceSAndroid Build Coastguard Worker                   de::abs(m_lookupSpec.maxCoord[0]) < de::abs(m_lookupSpec.minCoord[2]));
955*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::abs(m_lookupSpec.minCoord[1]) < de::abs(m_lookupSpec.minCoord[2]) &&
956*35238bceSAndroid Build Coastguard Worker                   de::abs(m_lookupSpec.maxCoord[1]) < de::abs(m_lookupSpec.minCoord[2]));
957*35238bceSAndroid Build Coastguard Worker 
958*35238bceSAndroid Build Coastguard Worker         tcu::CubeFaceFloatCoords c00 = tcu::getCubeFaceCoords(
959*35238bceSAndroid Build Coastguard Worker             Vec3(m_lookupSpec.minCoord[0] * proj, m_lookupSpec.minCoord[1] * proj, m_lookupSpec.minCoord[2] * proj));
960*35238bceSAndroid Build Coastguard Worker         tcu::CubeFaceFloatCoords c10 = tcu::getCubeFaceCoords(
961*35238bceSAndroid Build Coastguard Worker             Vec3(m_lookupSpec.maxCoord[0] * proj, m_lookupSpec.minCoord[1] * proj, m_lookupSpec.minCoord[2] * proj));
962*35238bceSAndroid Build Coastguard Worker         tcu::CubeFaceFloatCoords c01 = tcu::getCubeFaceCoords(
963*35238bceSAndroid Build Coastguard Worker             Vec3(m_lookupSpec.minCoord[0] * proj, m_lookupSpec.maxCoord[1] * proj, m_lookupSpec.minCoord[2] * proj));
964*35238bceSAndroid Build Coastguard Worker         float dudx = (c10.s - c00.s) * (float)m_textureSpec.width / (float)viewportSize[0];
965*35238bceSAndroid Build Coastguard Worker         float dvdy = (c01.t - c00.t) * (float)m_textureSpec.height / (float)viewportSize[1];
966*35238bceSAndroid Build Coastguard Worker 
967*35238bceSAndroid Build Coastguard Worker         m_lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, 0.0f, dvdy);
968*35238bceSAndroid Build Coastguard Worker 
969*35238bceSAndroid Build Coastguard Worker         m_textures.push_back(gls::TextureBinding(m_textureCube, m_textureSpec.sampler));
970*35238bceSAndroid Build Coastguard Worker         break;
971*35238bceSAndroid Build Coastguard Worker     }
972*35238bceSAndroid Build Coastguard Worker 
973*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_2D_ARRAY:
974*35238bceSAndroid Build Coastguard Worker     {
975*35238bceSAndroid Build Coastguard Worker         float layerStep = 1.0f / (float)m_textureSpec.depth;
976*35238bceSAndroid Build Coastguard Worker         float levelStep =
977*35238bceSAndroid Build Coastguard Worker             isAutoLod ? 0.0f : 1.0f / (float)(de::max(1, m_textureSpec.numLevels - 1) * m_textureSpec.depth);
978*35238bceSAndroid Build Coastguard Worker         Vec4 cScale      = fmtInfo.valueMax - fmtInfo.valueMin;
979*35238bceSAndroid Build Coastguard Worker         Vec4 cBias       = fmtInfo.valueMin;
980*35238bceSAndroid Build Coastguard Worker         int baseCellSize = de::min(m_textureSpec.width / 4, m_textureSpec.height / 4);
981*35238bceSAndroid Build Coastguard Worker 
982*35238bceSAndroid Build Coastguard Worker         m_texture2DArray = new glu::Texture2DArray(m_renderCtx, m_textureSpec.format, m_textureSpec.width,
983*35238bceSAndroid Build Coastguard Worker                                                    m_textureSpec.height, m_textureSpec.depth);
984*35238bceSAndroid Build Coastguard Worker         for (int level = 0; level < m_textureSpec.numLevels; level++)
985*35238bceSAndroid Build Coastguard Worker         {
986*35238bceSAndroid Build Coastguard Worker             m_texture2DArray->getRefTexture().allocLevel(level);
987*35238bceSAndroid Build Coastguard Worker             tcu::PixelBufferAccess levelAccess = m_texture2DArray->getRefTexture().getLevel(level);
988*35238bceSAndroid Build Coastguard Worker 
989*35238bceSAndroid Build Coastguard Worker             for (int layer = 0; layer < levelAccess.getDepth(); layer++)
990*35238bceSAndroid Build Coastguard Worker             {
991*35238bceSAndroid Build Coastguard Worker                 float fA    = (float)layer * layerStep + (float)level * levelStep;
992*35238bceSAndroid Build Coastguard Worker                 float fB    = 1.0f - fA;
993*35238bceSAndroid Build Coastguard Worker                 Vec4 colorA = cBias + cScale * Vec4(fA, fB, fA, fB);
994*35238bceSAndroid Build Coastguard Worker                 Vec4 colorB = cBias + cScale * Vec4(fB, fA, fB, fA);
995*35238bceSAndroid Build Coastguard Worker 
996*35238bceSAndroid Build Coastguard Worker                 tcu::fillWithGrid(
997*35238bceSAndroid Build Coastguard Worker                     tcu::getSubregion(levelAccess, 0, 0, layer, levelAccess.getWidth(), levelAccess.getHeight(), 1),
998*35238bceSAndroid Build Coastguard Worker                     de::max(1, baseCellSize >> level), colorA, colorB);
999*35238bceSAndroid Build Coastguard Worker             }
1000*35238bceSAndroid Build Coastguard Worker         }
1001*35238bceSAndroid Build Coastguard Worker         m_texture2DArray->upload();
1002*35238bceSAndroid Build Coastguard Worker 
1003*35238bceSAndroid Build Coastguard Worker         // Compute LOD.
1004*35238bceSAndroid Build Coastguard Worker         float dudx = (m_lookupSpec.maxCoord[0] - m_lookupSpec.minCoord[0]) * proj * (float)m_textureSpec.width /
1005*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[0];
1006*35238bceSAndroid Build Coastguard Worker         float dvdy = (m_lookupSpec.maxCoord[1] - m_lookupSpec.minCoord[1]) * proj * (float)m_textureSpec.height /
1007*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[1];
1008*35238bceSAndroid Build Coastguard Worker         m_lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, 0.0f, dvdy);
1009*35238bceSAndroid Build Coastguard Worker 
1010*35238bceSAndroid Build Coastguard Worker         // Append to texture list.
1011*35238bceSAndroid Build Coastguard Worker         m_textures.push_back(gls::TextureBinding(m_texture2DArray, m_textureSpec.sampler));
1012*35238bceSAndroid Build Coastguard Worker         break;
1013*35238bceSAndroid Build Coastguard Worker     }
1014*35238bceSAndroid Build Coastguard Worker 
1015*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_3D:
1016*35238bceSAndroid Build Coastguard Worker     {
1017*35238bceSAndroid Build Coastguard Worker         float levelStep  = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels - 1);
1018*35238bceSAndroid Build Coastguard Worker         Vec4 cScale      = fmtInfo.valueMax - fmtInfo.valueMin;
1019*35238bceSAndroid Build Coastguard Worker         Vec4 cBias       = fmtInfo.valueMin;
1020*35238bceSAndroid Build Coastguard Worker         int baseCellSize = de::min(de::min(m_textureSpec.width / 2, m_textureSpec.height / 2), m_textureSpec.depth / 2);
1021*35238bceSAndroid Build Coastguard Worker 
1022*35238bceSAndroid Build Coastguard Worker         m_texture3D = new glu::Texture3D(m_renderCtx, m_textureSpec.format, m_textureSpec.width, m_textureSpec.height,
1023*35238bceSAndroid Build Coastguard Worker                                          m_textureSpec.depth);
1024*35238bceSAndroid Build Coastguard Worker         for (int level = 0; level < m_textureSpec.numLevels; level++)
1025*35238bceSAndroid Build Coastguard Worker         {
1026*35238bceSAndroid Build Coastguard Worker             float fA    = (float)level * levelStep;
1027*35238bceSAndroid Build Coastguard Worker             float fB    = 1.0f - fA;
1028*35238bceSAndroid Build Coastguard Worker             Vec4 colorA = cBias + cScale * Vec4(fA, fB, fA, fB);
1029*35238bceSAndroid Build Coastguard Worker             Vec4 colorB = cBias + cScale * Vec4(fB, fA, fB, fA);
1030*35238bceSAndroid Build Coastguard Worker 
1031*35238bceSAndroid Build Coastguard Worker             m_texture3D->getRefTexture().allocLevel(level);
1032*35238bceSAndroid Build Coastguard Worker             tcu::fillWithGrid(m_texture3D->getRefTexture().getLevel(level), de::max(1, baseCellSize >> level), colorA,
1033*35238bceSAndroid Build Coastguard Worker                               colorB);
1034*35238bceSAndroid Build Coastguard Worker         }
1035*35238bceSAndroid Build Coastguard Worker         m_texture3D->upload();
1036*35238bceSAndroid Build Coastguard Worker 
1037*35238bceSAndroid Build Coastguard Worker         // Compute LOD.
1038*35238bceSAndroid Build Coastguard Worker         float dudx = (m_lookupSpec.maxCoord[0] - m_lookupSpec.minCoord[0]) * proj * (float)m_textureSpec.width /
1039*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[0];
1040*35238bceSAndroid Build Coastguard Worker         float dvdy = (m_lookupSpec.maxCoord[1] - m_lookupSpec.minCoord[1]) * proj * (float)m_textureSpec.height /
1041*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[1];
1042*35238bceSAndroid Build Coastguard Worker         float dwdx = (m_lookupSpec.maxCoord[2] - m_lookupSpec.minCoord[2]) * 0.5f * proj * (float)m_textureSpec.depth /
1043*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[0];
1044*35238bceSAndroid Build Coastguard Worker         float dwdy = (m_lookupSpec.maxCoord[2] - m_lookupSpec.minCoord[2]) * 0.5f * proj * (float)m_textureSpec.depth /
1045*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[1];
1046*35238bceSAndroid Build Coastguard Worker         m_lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, dwdx, 0.0f, dvdy, dwdy);
1047*35238bceSAndroid Build Coastguard Worker 
1048*35238bceSAndroid Build Coastguard Worker         // Append to texture list.
1049*35238bceSAndroid Build Coastguard Worker         m_textures.push_back(gls::TextureBinding(m_texture3D, m_textureSpec.sampler));
1050*35238bceSAndroid Build Coastguard Worker         break;
1051*35238bceSAndroid Build Coastguard Worker     }
1052*35238bceSAndroid Build Coastguard Worker 
1053*35238bceSAndroid Build Coastguard Worker     default:
1054*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1055*35238bceSAndroid Build Coastguard Worker     }
1056*35238bceSAndroid Build Coastguard Worker 
1057*35238bceSAndroid Build Coastguard Worker     // Set lookup scale & bias
1058*35238bceSAndroid Build Coastguard Worker     m_lookupParams.scale  = fmtInfo.lookupScale;
1059*35238bceSAndroid Build Coastguard Worker     m_lookupParams.bias   = fmtInfo.lookupBias;
1060*35238bceSAndroid Build Coastguard Worker     m_lookupParams.offset = m_lookupSpec.offset;
1061*35238bceSAndroid Build Coastguard Worker }
1062*35238bceSAndroid Build Coastguard Worker 
initShaderSources(void)1063*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::initShaderSources(void)
1064*35238bceSAndroid Build Coastguard Worker {
1065*35238bceSAndroid Build Coastguard Worker     Function function = m_lookupSpec.function;
1066*35238bceSAndroid Build Coastguard Worker     bool isVtxCase    = m_isVertexCase;
1067*35238bceSAndroid Build Coastguard Worker     bool isProj       = functionHasProj(function);
1068*35238bceSAndroid Build Coastguard Worker     bool isGrad       = functionHasGrad(function);
1069*35238bceSAndroid Build Coastguard Worker     bool isShadow     = m_textureSpec.sampler.compare != tcu::Sampler::COMPAREMODE_NONE;
1070*35238bceSAndroid Build Coastguard Worker     bool is2DProj4    = !isShadow && m_textureSpec.type == TEXTURETYPE_2D &&
1071*35238bceSAndroid Build Coastguard Worker                      (function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJLOD ||
1072*35238bceSAndroid Build Coastguard Worker                       function == FUNCTION_TEXTUREPROJGRAD);
1073*35238bceSAndroid Build Coastguard Worker     bool isIntCoord           = function == FUNCTION_TEXELFETCH;
1074*35238bceSAndroid Build Coastguard Worker     bool hasLodBias           = functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias;
1075*35238bceSAndroid Build Coastguard Worker     int texCoordComps         = m_textureSpec.type == TEXTURETYPE_2D ? 2 : 3;
1076*35238bceSAndroid Build Coastguard Worker     int extraCoordComps       = (isProj ? (is2DProj4 ? 2 : 1) : 0) + (isShadow ? 1 : 0);
1077*35238bceSAndroid Build Coastguard Worker     glu::DataType coordType   = glu::getDataTypeFloatVec(texCoordComps + extraCoordComps);
1078*35238bceSAndroid Build Coastguard Worker     glu::Precision coordPrec  = glu::PRECISION_HIGHP;
1079*35238bceSAndroid Build Coastguard Worker     const char *coordTypeName = glu::getDataTypeName(coordType);
1080*35238bceSAndroid Build Coastguard Worker     const char *coordPrecName = glu::getPrecisionName(coordPrec);
1081*35238bceSAndroid Build Coastguard Worker     tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_textureSpec.format);
1082*35238bceSAndroid Build Coastguard Worker     glu::DataType samplerType = glu::TYPE_LAST;
1083*35238bceSAndroid Build Coastguard Worker     glu::DataType gradType    = (m_textureSpec.type == TEXTURETYPE_CUBE_MAP || m_textureSpec.type == TEXTURETYPE_3D) ?
1084*35238bceSAndroid Build Coastguard Worker                                     glu::TYPE_FLOAT_VEC3 :
1085*35238bceSAndroid Build Coastguard Worker                                     glu::TYPE_FLOAT_VEC2;
1086*35238bceSAndroid Build Coastguard Worker     const char *gradTypeName  = glu::getDataTypeName(gradType);
1087*35238bceSAndroid Build Coastguard Worker     const char *baseFuncName  = DE_NULL;
1088*35238bceSAndroid Build Coastguard Worker 
1089*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!isGrad || !hasLodBias);
1090*35238bceSAndroid Build Coastguard Worker 
1091*35238bceSAndroid Build Coastguard Worker     switch (m_textureSpec.type)
1092*35238bceSAndroid Build Coastguard Worker     {
1093*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_2D:
1094*35238bceSAndroid Build Coastguard Worker         samplerType = isShadow ? glu::TYPE_SAMPLER_2D_SHADOW : glu::getSampler2DType(texFmt);
1095*35238bceSAndroid Build Coastguard Worker         break;
1096*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_CUBE_MAP:
1097*35238bceSAndroid Build Coastguard Worker         samplerType = isShadow ? glu::TYPE_SAMPLER_CUBE_SHADOW : glu::getSamplerCubeType(texFmt);
1098*35238bceSAndroid Build Coastguard Worker         break;
1099*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_2D_ARRAY:
1100*35238bceSAndroid Build Coastguard Worker         samplerType = isShadow ? glu::TYPE_SAMPLER_2D_ARRAY_SHADOW : glu::getSampler2DArrayType(texFmt);
1101*35238bceSAndroid Build Coastguard Worker         break;
1102*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_3D:
1103*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!isShadow);
1104*35238bceSAndroid Build Coastguard Worker         samplerType = glu::getSampler3DType(texFmt);
1105*35238bceSAndroid Build Coastguard Worker         break;
1106*35238bceSAndroid Build Coastguard Worker     default:
1107*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1108*35238bceSAndroid Build Coastguard Worker     }
1109*35238bceSAndroid Build Coastguard Worker 
1110*35238bceSAndroid Build Coastguard Worker     switch (m_lookupSpec.function)
1111*35238bceSAndroid Build Coastguard Worker     {
1112*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTURE:
1113*35238bceSAndroid Build Coastguard Worker         baseFuncName = "texture";
1114*35238bceSAndroid Build Coastguard Worker         break;
1115*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJ:
1116*35238bceSAndroid Build Coastguard Worker         baseFuncName = "textureProj";
1117*35238bceSAndroid Build Coastguard Worker         break;
1118*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJ3:
1119*35238bceSAndroid Build Coastguard Worker         baseFuncName = "textureProj";
1120*35238bceSAndroid Build Coastguard Worker         break;
1121*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTURELOD:
1122*35238bceSAndroid Build Coastguard Worker         baseFuncName = "textureLod";
1123*35238bceSAndroid Build Coastguard Worker         break;
1124*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJLOD:
1125*35238bceSAndroid Build Coastguard Worker         baseFuncName = "textureProjLod";
1126*35238bceSAndroid Build Coastguard Worker         break;
1127*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJLOD3:
1128*35238bceSAndroid Build Coastguard Worker         baseFuncName = "textureProjLod";
1129*35238bceSAndroid Build Coastguard Worker         break;
1130*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREGRAD:
1131*35238bceSAndroid Build Coastguard Worker         baseFuncName = "textureGrad";
1132*35238bceSAndroid Build Coastguard Worker         break;
1133*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJGRAD:
1134*35238bceSAndroid Build Coastguard Worker         baseFuncName = "textureProjGrad";
1135*35238bceSAndroid Build Coastguard Worker         break;
1136*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJGRAD3:
1137*35238bceSAndroid Build Coastguard Worker         baseFuncName = "textureProjGrad";
1138*35238bceSAndroid Build Coastguard Worker         break;
1139*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXELFETCH:
1140*35238bceSAndroid Build Coastguard Worker         baseFuncName = "texelFetch";
1141*35238bceSAndroid Build Coastguard Worker         break;
1142*35238bceSAndroid Build Coastguard Worker     default:
1143*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1144*35238bceSAndroid Build Coastguard Worker     }
1145*35238bceSAndroid Build Coastguard Worker 
1146*35238bceSAndroid Build Coastguard Worker     std::ostringstream vert;
1147*35238bceSAndroid Build Coastguard Worker     std::ostringstream frag;
1148*35238bceSAndroid Build Coastguard Worker     std::ostringstream &op = isVtxCase ? vert : frag;
1149*35238bceSAndroid Build Coastguard Worker 
1150*35238bceSAndroid Build Coastguard Worker     vert << "#version 300 es\n"
1151*35238bceSAndroid Build Coastguard Worker          << "in highp vec4 a_position;\n"
1152*35238bceSAndroid Build Coastguard Worker          << "in " << coordPrecName << " " << coordTypeName << " a_in0;\n";
1153*35238bceSAndroid Build Coastguard Worker 
1154*35238bceSAndroid Build Coastguard Worker     if (isGrad)
1155*35238bceSAndroid Build Coastguard Worker     {
1156*35238bceSAndroid Build Coastguard Worker         vert << "in " << coordPrecName << " " << gradTypeName << " a_in1;\n";
1157*35238bceSAndroid Build Coastguard Worker         vert << "in " << coordPrecName << " " << gradTypeName << " a_in2;\n";
1158*35238bceSAndroid Build Coastguard Worker     }
1159*35238bceSAndroid Build Coastguard Worker     else if (hasLodBias)
1160*35238bceSAndroid Build Coastguard Worker         vert << "in " << coordPrecName << " float a_in1;\n";
1161*35238bceSAndroid Build Coastguard Worker 
1162*35238bceSAndroid Build Coastguard Worker     frag << "#version 300 es\n"
1163*35238bceSAndroid Build Coastguard Worker          << "layout(location = 0) out mediump vec4 o_color;\n";
1164*35238bceSAndroid Build Coastguard Worker 
1165*35238bceSAndroid Build Coastguard Worker     if (isVtxCase)
1166*35238bceSAndroid Build Coastguard Worker     {
1167*35238bceSAndroid Build Coastguard Worker         vert << "out mediump vec4 v_color;\n";
1168*35238bceSAndroid Build Coastguard Worker         frag << "in mediump vec4 v_color;\n";
1169*35238bceSAndroid Build Coastguard Worker     }
1170*35238bceSAndroid Build Coastguard Worker     else
1171*35238bceSAndroid Build Coastguard Worker     {
1172*35238bceSAndroid Build Coastguard Worker         vert << "out " << coordPrecName << " " << coordTypeName << " v_texCoord;\n";
1173*35238bceSAndroid Build Coastguard Worker         frag << "in " << coordPrecName << " " << coordTypeName << " v_texCoord;\n";
1174*35238bceSAndroid Build Coastguard Worker 
1175*35238bceSAndroid Build Coastguard Worker         if (isGrad)
1176*35238bceSAndroid Build Coastguard Worker         {
1177*35238bceSAndroid Build Coastguard Worker             vert << "out " << coordPrecName << " " << gradTypeName << " v_gradX;\n";
1178*35238bceSAndroid Build Coastguard Worker             vert << "out " << coordPrecName << " " << gradTypeName << " v_gradY;\n";
1179*35238bceSAndroid Build Coastguard Worker             frag << "in " << coordPrecName << " " << gradTypeName << " v_gradX;\n";
1180*35238bceSAndroid Build Coastguard Worker             frag << "in " << coordPrecName << " " << gradTypeName << " v_gradY;\n";
1181*35238bceSAndroid Build Coastguard Worker         }
1182*35238bceSAndroid Build Coastguard Worker 
1183*35238bceSAndroid Build Coastguard Worker         if (hasLodBias)
1184*35238bceSAndroid Build Coastguard Worker         {
1185*35238bceSAndroid Build Coastguard Worker             vert << "out " << coordPrecName << " float v_lodBias;\n";
1186*35238bceSAndroid Build Coastguard Worker             frag << "in " << coordPrecName << " float v_lodBias;\n";
1187*35238bceSAndroid Build Coastguard Worker         }
1188*35238bceSAndroid Build Coastguard Worker     }
1189*35238bceSAndroid Build Coastguard Worker 
1190*35238bceSAndroid Build Coastguard Worker     // Uniforms
1191*35238bceSAndroid Build Coastguard Worker     op << "uniform highp " << glu::getDataTypeName(samplerType) << " u_sampler;\n"
1192*35238bceSAndroid Build Coastguard Worker        << "uniform highp vec4 u_scale;\n"
1193*35238bceSAndroid Build Coastguard Worker        << "uniform highp vec4 u_bias;\n";
1194*35238bceSAndroid Build Coastguard Worker 
1195*35238bceSAndroid Build Coastguard Worker     vert << "\nvoid main()\n{\n"
1196*35238bceSAndroid Build Coastguard Worker          << "\tgl_Position = a_position;\n";
1197*35238bceSAndroid Build Coastguard Worker     frag << "\nvoid main()\n{\n";
1198*35238bceSAndroid Build Coastguard Worker 
1199*35238bceSAndroid Build Coastguard Worker     if (isVtxCase)
1200*35238bceSAndroid Build Coastguard Worker         vert << "\tv_color = ";
1201*35238bceSAndroid Build Coastguard Worker     else
1202*35238bceSAndroid Build Coastguard Worker         frag << "\to_color = ";
1203*35238bceSAndroid Build Coastguard Worker 
1204*35238bceSAndroid Build Coastguard Worker     // Op.
1205*35238bceSAndroid Build Coastguard Worker     {
1206*35238bceSAndroid Build Coastguard Worker         const char *texCoord = isVtxCase ? "a_in0" : "v_texCoord";
1207*35238bceSAndroid Build Coastguard Worker         const char *gradX    = isVtxCase ? "a_in1" : "v_gradX";
1208*35238bceSAndroid Build Coastguard Worker         const char *gradY    = isVtxCase ? "a_in2" : "v_gradY";
1209*35238bceSAndroid Build Coastguard Worker         const char *lodBias  = isVtxCase ? "a_in1" : "v_lodBias";
1210*35238bceSAndroid Build Coastguard Worker 
1211*35238bceSAndroid Build Coastguard Worker         op << "vec4(" << baseFuncName;
1212*35238bceSAndroid Build Coastguard Worker         if (m_lookupSpec.useOffset)
1213*35238bceSAndroid Build Coastguard Worker             op << "Offset";
1214*35238bceSAndroid Build Coastguard Worker         op << "(u_sampler, ";
1215*35238bceSAndroid Build Coastguard Worker 
1216*35238bceSAndroid Build Coastguard Worker         if (isIntCoord)
1217*35238bceSAndroid Build Coastguard Worker             op << "ivec" << (texCoordComps + extraCoordComps) << "(";
1218*35238bceSAndroid Build Coastguard Worker 
1219*35238bceSAndroid Build Coastguard Worker         op << texCoord;
1220*35238bceSAndroid Build Coastguard Worker 
1221*35238bceSAndroid Build Coastguard Worker         if (isIntCoord)
1222*35238bceSAndroid Build Coastguard Worker             op << ")";
1223*35238bceSAndroid Build Coastguard Worker 
1224*35238bceSAndroid Build Coastguard Worker         if (isGrad)
1225*35238bceSAndroid Build Coastguard Worker             op << ", " << gradX << ", " << gradY;
1226*35238bceSAndroid Build Coastguard Worker 
1227*35238bceSAndroid Build Coastguard Worker         if (functionHasLod(function))
1228*35238bceSAndroid Build Coastguard Worker         {
1229*35238bceSAndroid Build Coastguard Worker             if (isIntCoord)
1230*35238bceSAndroid Build Coastguard Worker                 op << ", int(" << lodBias << ")";
1231*35238bceSAndroid Build Coastguard Worker             else
1232*35238bceSAndroid Build Coastguard Worker                 op << ", " << lodBias;
1233*35238bceSAndroid Build Coastguard Worker         }
1234*35238bceSAndroid Build Coastguard Worker 
1235*35238bceSAndroid Build Coastguard Worker         if (m_lookupSpec.useOffset)
1236*35238bceSAndroid Build Coastguard Worker         {
1237*35238bceSAndroid Build Coastguard Worker             int offsetComps = m_textureSpec.type == TEXTURETYPE_3D ? 3 : 2;
1238*35238bceSAndroid Build Coastguard Worker 
1239*35238bceSAndroid Build Coastguard Worker             op << ", ivec" << offsetComps << "(";
1240*35238bceSAndroid Build Coastguard Worker             for (int ndx = 0; ndx < offsetComps; ndx++)
1241*35238bceSAndroid Build Coastguard Worker             {
1242*35238bceSAndroid Build Coastguard Worker                 if (ndx != 0)
1243*35238bceSAndroid Build Coastguard Worker                     op << ", ";
1244*35238bceSAndroid Build Coastguard Worker                 op << m_lookupSpec.offset[ndx];
1245*35238bceSAndroid Build Coastguard Worker             }
1246*35238bceSAndroid Build Coastguard Worker             op << ")";
1247*35238bceSAndroid Build Coastguard Worker         }
1248*35238bceSAndroid Build Coastguard Worker 
1249*35238bceSAndroid Build Coastguard Worker         if (m_lookupSpec.useBias)
1250*35238bceSAndroid Build Coastguard Worker             op << ", " << lodBias;
1251*35238bceSAndroid Build Coastguard Worker 
1252*35238bceSAndroid Build Coastguard Worker         op << ")";
1253*35238bceSAndroid Build Coastguard Worker 
1254*35238bceSAndroid Build Coastguard Worker         if (isShadow)
1255*35238bceSAndroid Build Coastguard Worker             op << ", 0.0, 0.0, 1.0)";
1256*35238bceSAndroid Build Coastguard Worker         else
1257*35238bceSAndroid Build Coastguard Worker             op << ")*u_scale + u_bias";
1258*35238bceSAndroid Build Coastguard Worker 
1259*35238bceSAndroid Build Coastguard Worker         op << ";\n";
1260*35238bceSAndroid Build Coastguard Worker     }
1261*35238bceSAndroid Build Coastguard Worker 
1262*35238bceSAndroid Build Coastguard Worker     if (isVtxCase)
1263*35238bceSAndroid Build Coastguard Worker         frag << "\to_color = v_color;\n";
1264*35238bceSAndroid Build Coastguard Worker     else
1265*35238bceSAndroid Build Coastguard Worker     {
1266*35238bceSAndroid Build Coastguard Worker         vert << "\tv_texCoord = a_in0;\n";
1267*35238bceSAndroid Build Coastguard Worker 
1268*35238bceSAndroid Build Coastguard Worker         if (isGrad)
1269*35238bceSAndroid Build Coastguard Worker         {
1270*35238bceSAndroid Build Coastguard Worker             vert << "\tv_gradX = a_in1;\n";
1271*35238bceSAndroid Build Coastguard Worker             vert << "\tv_gradY = a_in2;\n";
1272*35238bceSAndroid Build Coastguard Worker         }
1273*35238bceSAndroid Build Coastguard Worker         else if (hasLodBias)
1274*35238bceSAndroid Build Coastguard Worker             vert << "\tv_lodBias = a_in1;\n";
1275*35238bceSAndroid Build Coastguard Worker     }
1276*35238bceSAndroid Build Coastguard Worker 
1277*35238bceSAndroid Build Coastguard Worker     vert << "}\n";
1278*35238bceSAndroid Build Coastguard Worker     frag << "}\n";
1279*35238bceSAndroid Build Coastguard Worker 
1280*35238bceSAndroid Build Coastguard Worker     m_vertShaderSource = vert.str();
1281*35238bceSAndroid Build Coastguard Worker     m_fragShaderSource = frag.str();
1282*35238bceSAndroid Build Coastguard Worker }
1283*35238bceSAndroid Build Coastguard Worker 
deinit(void)1284*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::deinit(void)
1285*35238bceSAndroid Build Coastguard Worker {
1286*35238bceSAndroid Build Coastguard Worker     gls::ShaderRenderCase::deinit();
1287*35238bceSAndroid Build Coastguard Worker 
1288*35238bceSAndroid Build Coastguard Worker     delete m_texture2D;
1289*35238bceSAndroid Build Coastguard Worker     delete m_textureCube;
1290*35238bceSAndroid Build Coastguard Worker     delete m_texture2DArray;
1291*35238bceSAndroid Build Coastguard Worker     delete m_texture3D;
1292*35238bceSAndroid Build Coastguard Worker 
1293*35238bceSAndroid Build Coastguard Worker     m_texture2D      = DE_NULL;
1294*35238bceSAndroid Build Coastguard Worker     m_textureCube    = DE_NULL;
1295*35238bceSAndroid Build Coastguard Worker     m_texture2DArray = DE_NULL;
1296*35238bceSAndroid Build Coastguard Worker     m_texture3D      = DE_NULL;
1297*35238bceSAndroid Build Coastguard Worker }
1298*35238bceSAndroid Build Coastguard Worker 
setupUniforms(int programID,const tcu::Vec4 &)1299*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::setupUniforms(int programID, const tcu::Vec4 &)
1300*35238bceSAndroid Build Coastguard Worker {
1301*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
1302*35238bceSAndroid Build Coastguard Worker     gl.uniform1i(gl.getUniformLocation(programID, "u_sampler"), 0);
1303*35238bceSAndroid Build Coastguard Worker     gl.uniform4fv(gl.getUniformLocation(programID, "u_scale"), 1, m_lookupParams.scale.getPtr());
1304*35238bceSAndroid Build Coastguard Worker     gl.uniform4fv(gl.getUniformLocation(programID, "u_bias"), 1, m_lookupParams.bias.getPtr());
1305*35238bceSAndroid Build Coastguard Worker }
1306*35238bceSAndroid Build Coastguard Worker 
1307*35238bceSAndroid Build Coastguard Worker class TextureSizeCase : public TestCase
1308*35238bceSAndroid Build Coastguard Worker {
1309*35238bceSAndroid Build Coastguard Worker public:
1310*35238bceSAndroid Build Coastguard Worker     TextureSizeCase(Context &context, const char *name, const char *desc, const char *samplerType,
1311*35238bceSAndroid Build Coastguard Worker                     const TextureSpec &texture, bool isVertexCase);
1312*35238bceSAndroid Build Coastguard Worker     ~TextureSizeCase(void);
1313*35238bceSAndroid Build Coastguard Worker 
1314*35238bceSAndroid Build Coastguard Worker     void deinit(void);
1315*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
1316*35238bceSAndroid Build Coastguard Worker 
1317*35238bceSAndroid Build Coastguard Worker private:
1318*35238bceSAndroid Build Coastguard Worker     struct TestSize
1319*35238bceSAndroid Build Coastguard Worker     {
1320*35238bceSAndroid Build Coastguard Worker         tcu::IVec3 textureSize;
1321*35238bceSAndroid Build Coastguard Worker         int lod;
1322*35238bceSAndroid Build Coastguard Worker         int lodBase;
1323*35238bceSAndroid Build Coastguard Worker         tcu::IVec3 expectedSize;
1324*35238bceSAndroid Build Coastguard Worker     };
1325*35238bceSAndroid Build Coastguard Worker 
1326*35238bceSAndroid Build Coastguard Worker     bool initShader(void);
1327*35238bceSAndroid Build Coastguard Worker     void freeShader(void);
1328*35238bceSAndroid Build Coastguard Worker     bool testTextureSize(const TestSize &);
1329*35238bceSAndroid Build Coastguard Worker     std::string genVertexShader(void) const;
1330*35238bceSAndroid Build Coastguard Worker     std::string genFragmentShader(void) const;
1331*35238bceSAndroid Build Coastguard Worker     glw::GLenum getGLTextureTarget(void) const;
1332*35238bceSAndroid Build Coastguard Worker 
1333*35238bceSAndroid Build Coastguard Worker     const char *m_samplerTypeStr;
1334*35238bceSAndroid Build Coastguard Worker     const TextureSpec m_textureSpec;
1335*35238bceSAndroid Build Coastguard Worker     const bool m_isVertexCase;
1336*35238bceSAndroid Build Coastguard Worker     const bool m_has3DSize;
1337*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_program;
1338*35238bceSAndroid Build Coastguard Worker     int m_iterationCounter;
1339*35238bceSAndroid Build Coastguard Worker };
1340*35238bceSAndroid Build Coastguard Worker 
TextureSizeCase(Context & context,const char * name,const char * desc,const char * samplerType,const TextureSpec & texture,bool isVertexCase)1341*35238bceSAndroid Build Coastguard Worker TextureSizeCase::TextureSizeCase(Context &context, const char *name, const char *desc, const char *samplerType,
1342*35238bceSAndroid Build Coastguard Worker                                  const TextureSpec &texture, bool isVertexCase)
1343*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, desc)
1344*35238bceSAndroid Build Coastguard Worker     , m_samplerTypeStr(samplerType)
1345*35238bceSAndroid Build Coastguard Worker     , m_textureSpec(texture)
1346*35238bceSAndroid Build Coastguard Worker     , m_isVertexCase(isVertexCase)
1347*35238bceSAndroid Build Coastguard Worker     , m_has3DSize(texture.type == TEXTURETYPE_3D || texture.type == TEXTURETYPE_2D_ARRAY)
1348*35238bceSAndroid Build Coastguard Worker     , m_program(DE_NULL)
1349*35238bceSAndroid Build Coastguard Worker     , m_iterationCounter(0)
1350*35238bceSAndroid Build Coastguard Worker {
1351*35238bceSAndroid Build Coastguard Worker }
1352*35238bceSAndroid Build Coastguard Worker 
~TextureSizeCase(void)1353*35238bceSAndroid Build Coastguard Worker TextureSizeCase::~TextureSizeCase(void)
1354*35238bceSAndroid Build Coastguard Worker {
1355*35238bceSAndroid Build Coastguard Worker     deinit();
1356*35238bceSAndroid Build Coastguard Worker }
1357*35238bceSAndroid Build Coastguard Worker 
deinit(void)1358*35238bceSAndroid Build Coastguard Worker void TextureSizeCase::deinit(void)
1359*35238bceSAndroid Build Coastguard Worker {
1360*35238bceSAndroid Build Coastguard Worker     freeShader();
1361*35238bceSAndroid Build Coastguard Worker }
1362*35238bceSAndroid Build Coastguard Worker 
iterate(void)1363*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult TextureSizeCase::iterate(void)
1364*35238bceSAndroid Build Coastguard Worker {
1365*35238bceSAndroid Build Coastguard Worker     const int currentIteration = m_iterationCounter++;
1366*35238bceSAndroid Build Coastguard Worker     const TestSize testSizes[] = {
1367*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(1, 2, 1), 1, 0, tcu::IVec3(1, 1, 1)},
1368*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(1, 2, 1), 0, 0, tcu::IVec3(1, 2, 1)},
1369*35238bceSAndroid Build Coastguard Worker 
1370*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(1, 3, 2), 0, 0, tcu::IVec3(1, 3, 2)},
1371*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(1, 3, 2), 1, 0, tcu::IVec3(1, 1, 1)},
1372*35238bceSAndroid Build Coastguard Worker 
1373*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 31, 18), 0, 0, tcu::IVec3(100, 31, 18)},
1374*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 31, 18), 1, 0, tcu::IVec3(50, 15, 9)},
1375*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 31, 18), 2, 0, tcu::IVec3(25, 7, 4)},
1376*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 31, 18), 3, 0, tcu::IVec3(12, 3, 2)},
1377*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 31, 18), 4, 0, tcu::IVec3(6, 1, 1)},
1378*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 31, 18), 5, 0, tcu::IVec3(3, 1, 1)},
1379*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 31, 18), 6, 0, tcu::IVec3(1, 1, 1)},
1380*35238bceSAndroid Build Coastguard Worker 
1381*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 128, 32), 0, 0, tcu::IVec3(100, 128, 32)},
1382*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 128, 32), 1, 0, tcu::IVec3(50, 64, 16)},
1383*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 128, 32), 2, 0, tcu::IVec3(25, 32, 8)},
1384*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 128, 32), 3, 0, tcu::IVec3(12, 16, 4)},
1385*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 128, 32), 4, 0, tcu::IVec3(6, 8, 2)},
1386*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 128, 32), 5, 0, tcu::IVec3(3, 4, 1)},
1387*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 128, 32), 6, 0, tcu::IVec3(1, 2, 1)},
1388*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 128, 32), 7, 0, tcu::IVec3(1, 1, 1)},
1389*35238bceSAndroid Build Coastguard Worker 
1390*35238bceSAndroid Build Coastguard Worker         // pow 2
1391*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 0, 0, tcu::IVec3(128, 64, 32)},
1392*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 1, 0, tcu::IVec3(64, 32, 16)},
1393*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 2, 0, tcu::IVec3(32, 16, 8)},
1394*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 3, 0, tcu::IVec3(16, 8, 4)},
1395*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 4, 0, tcu::IVec3(8, 4, 2)},
1396*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 5, 0, tcu::IVec3(4, 2, 1)},
1397*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 6, 0, tcu::IVec3(2, 1, 1)},
1398*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 7, 0, tcu::IVec3(1, 1, 1)},
1399*35238bceSAndroid Build Coastguard Worker 
1400*35238bceSAndroid Build Coastguard Worker         // w == h
1401*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(1, 1, 1), 0, 0, tcu::IVec3(1, 1, 1)},
1402*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(64, 64, 64), 0, 0, tcu::IVec3(64, 64, 64)},
1403*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(64, 64, 64), 1, 0, tcu::IVec3(32, 32, 32)},
1404*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(64, 64, 64), 2, 0, tcu::IVec3(16, 16, 16)},
1405*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(64, 64, 64), 3, 0, tcu::IVec3(8, 8, 8)},
1406*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(64, 64, 64), 4, 0, tcu::IVec3(4, 4, 4)},
1407*35238bceSAndroid Build Coastguard Worker 
1408*35238bceSAndroid Build Coastguard Worker         // with lod base
1409*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(100, 31, 18), 3, 1, tcu::IVec3(6, 1, 1)},
1410*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(128, 64, 32), 3, 1, tcu::IVec3(8, 4, 2)},
1411*35238bceSAndroid Build Coastguard Worker         {tcu::IVec3(64, 64, 64), 1, 1, tcu::IVec3(16, 16, 16)},
1412*35238bceSAndroid Build Coastguard Worker 
1413*35238bceSAndroid Build Coastguard Worker     };
1414*35238bceSAndroid Build Coastguard Worker     const int lastIterationIndex = DE_LENGTH_OF_ARRAY(testSizes) + 1;
1415*35238bceSAndroid Build Coastguard Worker 
1416*35238bceSAndroid Build Coastguard Worker     if (currentIteration == 0)
1417*35238bceSAndroid Build Coastguard Worker     {
1418*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1419*35238bceSAndroid Build Coastguard Worker         return initShader() ? CONTINUE : STOP;
1420*35238bceSAndroid Build Coastguard Worker     }
1421*35238bceSAndroid Build Coastguard Worker     else if (currentIteration == lastIterationIndex)
1422*35238bceSAndroid Build Coastguard Worker     {
1423*35238bceSAndroid Build Coastguard Worker         freeShader();
1424*35238bceSAndroid Build Coastguard Worker         return STOP;
1425*35238bceSAndroid Build Coastguard Worker     }
1426*35238bceSAndroid Build Coastguard Worker     else
1427*35238bceSAndroid Build Coastguard Worker     {
1428*35238bceSAndroid Build Coastguard Worker         if (!testTextureSize(testSizes[currentIteration - 1]))
1429*35238bceSAndroid Build Coastguard Worker             if (m_testCtx.getTestResult() != QP_TEST_RESULT_FAIL)
1430*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got unexpected texture size");
1431*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
1432*35238bceSAndroid Build Coastguard Worker     }
1433*35238bceSAndroid Build Coastguard Worker }
1434*35238bceSAndroid Build Coastguard Worker 
initShader(void)1435*35238bceSAndroid Build Coastguard Worker bool TextureSizeCase::initShader(void)
1436*35238bceSAndroid Build Coastguard Worker {
1437*35238bceSAndroid Build Coastguard Worker     const std::string vertSrc = genVertexShader();
1438*35238bceSAndroid Build Coastguard Worker     const std::string fragSrc = genFragmentShader();
1439*35238bceSAndroid Build Coastguard Worker 
1440*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_program == DE_NULL);
1441*35238bceSAndroid Build Coastguard Worker     m_program = new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertSrc, fragSrc));
1442*35238bceSAndroid Build Coastguard Worker     m_context.getTestContext().getLog() << *m_program;
1443*35238bceSAndroid Build Coastguard Worker 
1444*35238bceSAndroid Build Coastguard Worker     if (!m_program->isOk())
1445*35238bceSAndroid Build Coastguard Worker     {
1446*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Shader failed");
1447*35238bceSAndroid Build Coastguard Worker         return false;
1448*35238bceSAndroid Build Coastguard Worker     }
1449*35238bceSAndroid Build Coastguard Worker 
1450*35238bceSAndroid Build Coastguard Worker     return true;
1451*35238bceSAndroid Build Coastguard Worker }
1452*35238bceSAndroid Build Coastguard Worker 
freeShader(void)1453*35238bceSAndroid Build Coastguard Worker void TextureSizeCase::freeShader(void)
1454*35238bceSAndroid Build Coastguard Worker {
1455*35238bceSAndroid Build Coastguard Worker     delete m_program;
1456*35238bceSAndroid Build Coastguard Worker     m_program = DE_NULL;
1457*35238bceSAndroid Build Coastguard Worker }
1458*35238bceSAndroid Build Coastguard Worker 
testTextureSize(const TestSize & testSize)1459*35238bceSAndroid Build Coastguard Worker bool TextureSizeCase::testTextureSize(const TestSize &testSize)
1460*35238bceSAndroid Build Coastguard Worker {
1461*35238bceSAndroid Build Coastguard Worker     using tcu::TestLog;
1462*35238bceSAndroid Build Coastguard Worker 
1463*35238bceSAndroid Build Coastguard Worker     const tcu::Vec4 triangle[3] = // covers entire viewport
1464*35238bceSAndroid Build Coastguard Worker         {
1465*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(-1, -1, 0, 1),
1466*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(4, -1, 0, 1),
1467*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(-1, 4, 0, 1),
1468*35238bceSAndroid Build Coastguard Worker         };
1469*35238bceSAndroid Build Coastguard Worker 
1470*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1471*35238bceSAndroid Build Coastguard Worker 
1472*35238bceSAndroid Build Coastguard Worker     const glw::GLint positionLoc    = gl.getAttribLocation(m_program->getProgram(), "a_position");
1473*35238bceSAndroid Build Coastguard Worker     const glw::GLint samplerLoc     = gl.getUniformLocation(m_program->getProgram(), "u_sampler");
1474*35238bceSAndroid Build Coastguard Worker     const glw::GLint sizeLoc        = gl.getUniformLocation(m_program->getProgram(), "u_texSize");
1475*35238bceSAndroid Build Coastguard Worker     const glw::GLint lodLoc         = gl.getUniformLocation(m_program->getProgram(), "u_lod");
1476*35238bceSAndroid Build Coastguard Worker     const glw::GLenum textureTarget = getGLTextureTarget();
1477*35238bceSAndroid Build Coastguard Worker     const bool isSquare             = testSize.textureSize.x() == testSize.textureSize.y();
1478*35238bceSAndroid Build Coastguard Worker     const bool is2DLodValid         = (testSize.textureSize.x() >> (testSize.lod + testSize.lodBase)) != 0 ||
1479*35238bceSAndroid Build Coastguard Worker                               (testSize.textureSize.y() >> (testSize.lod + testSize.lodBase)) != 0;
1480*35238bceSAndroid Build Coastguard Worker     bool success = true;
1481*35238bceSAndroid Build Coastguard Worker     glw::GLenum errorValue;
1482*35238bceSAndroid Build Coastguard Worker 
1483*35238bceSAndroid Build Coastguard Worker     // Skip incompatible cases
1484*35238bceSAndroid Build Coastguard Worker     if (m_textureSpec.type == TEXTURETYPE_CUBE_MAP && !isSquare)
1485*35238bceSAndroid Build Coastguard Worker         return true;
1486*35238bceSAndroid Build Coastguard Worker     if (m_textureSpec.type == TEXTURETYPE_2D && !is2DLodValid)
1487*35238bceSAndroid Build Coastguard Worker         return true;
1488*35238bceSAndroid Build Coastguard Worker     if (m_textureSpec.type == TEXTURETYPE_2D_ARRAY && !is2DLodValid)
1489*35238bceSAndroid Build Coastguard Worker         return true;
1490*35238bceSAndroid Build Coastguard Worker 
1491*35238bceSAndroid Build Coastguard Worker     // setup rendering
1492*35238bceSAndroid Build Coastguard Worker 
1493*35238bceSAndroid Build Coastguard Worker     gl.useProgram(m_program->getProgram());
1494*35238bceSAndroid Build Coastguard Worker     gl.uniform1i(samplerLoc, 0);
1495*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.5f, 0.5f, 0.5f, 1.0f);
1496*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, 1, 1);
1497*35238bceSAndroid Build Coastguard Worker     gl.vertexAttribPointer(positionLoc, 4, GL_FLOAT, GL_FALSE, 0, triangle);
1498*35238bceSAndroid Build Coastguard Worker     gl.enableVertexAttribArray(positionLoc);
1499*35238bceSAndroid Build Coastguard Worker 
1500*35238bceSAndroid Build Coastguard Worker     // setup texture
1501*35238bceSAndroid Build Coastguard Worker     {
1502*35238bceSAndroid Build Coastguard Worker         const int maxLevel = testSize.lod + testSize.lodBase;
1503*35238bceSAndroid Build Coastguard Worker         const int levels   = maxLevel + 1;
1504*35238bceSAndroid Build Coastguard Worker         glw::GLuint texId  = 0;
1505*35238bceSAndroid Build Coastguard Worker 
1506*35238bceSAndroid Build Coastguard Worker         // gen texture
1507*35238bceSAndroid Build Coastguard Worker         gl.genTextures(1, &texId);
1508*35238bceSAndroid Build Coastguard Worker         gl.bindTexture(textureTarget, texId);
1509*35238bceSAndroid Build Coastguard Worker         gl.texParameteri(textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1510*35238bceSAndroid Build Coastguard Worker         gl.texParameteri(textureTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1511*35238bceSAndroid Build Coastguard Worker         gl.texParameteri(textureTarget, GL_TEXTURE_BASE_LEVEL, testSize.lodBase);
1512*35238bceSAndroid Build Coastguard Worker 
1513*35238bceSAndroid Build Coastguard Worker         // set up texture
1514*35238bceSAndroid Build Coastguard Worker 
1515*35238bceSAndroid Build Coastguard Worker         switch (m_textureSpec.type)
1516*35238bceSAndroid Build Coastguard Worker         {
1517*35238bceSAndroid Build Coastguard Worker         case TEXTURETYPE_3D:
1518*35238bceSAndroid Build Coastguard Worker         {
1519*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog()
1520*35238bceSAndroid Build Coastguard Worker                 << TestLog::Message << "Testing image size " << testSize.textureSize.x() << "x"
1521*35238bceSAndroid Build Coastguard Worker                 << testSize.textureSize.y() << "x" << testSize.textureSize.z() << TestLog::EndMessage;
1522*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog() << TestLog::Message << "Lod: " << testSize.lod
1523*35238bceSAndroid Build Coastguard Worker                                                 << ", base level: " << testSize.lodBase << TestLog::EndMessage;
1524*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog()
1525*35238bceSAndroid Build Coastguard Worker                 << TestLog::Message << "Expecting: " << testSize.expectedSize.x() << "x" << testSize.expectedSize.y()
1526*35238bceSAndroid Build Coastguard Worker                 << "x" << testSize.expectedSize.z() << TestLog::EndMessage;
1527*35238bceSAndroid Build Coastguard Worker 
1528*35238bceSAndroid Build Coastguard Worker             gl.uniform3iv(sizeLoc, 1, testSize.expectedSize.m_data);
1529*35238bceSAndroid Build Coastguard Worker             gl.uniform1iv(lodLoc, 1, &testSize.lod);
1530*35238bceSAndroid Build Coastguard Worker 
1531*35238bceSAndroid Build Coastguard Worker             gl.texStorage3D(textureTarget, levels, m_textureSpec.format, testSize.textureSize.x(),
1532*35238bceSAndroid Build Coastguard Worker                             testSize.textureSize.y(), testSize.textureSize.z());
1533*35238bceSAndroid Build Coastguard Worker             break;
1534*35238bceSAndroid Build Coastguard Worker         }
1535*35238bceSAndroid Build Coastguard Worker 
1536*35238bceSAndroid Build Coastguard Worker         case TEXTURETYPE_2D:
1537*35238bceSAndroid Build Coastguard Worker         case TEXTURETYPE_CUBE_MAP:
1538*35238bceSAndroid Build Coastguard Worker         {
1539*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog() << TestLog::Message << "Testing image size " << testSize.textureSize.x()
1540*35238bceSAndroid Build Coastguard Worker                                                 << "x" << testSize.textureSize.y() << TestLog::EndMessage;
1541*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog() << TestLog::Message << "Lod: " << testSize.lod
1542*35238bceSAndroid Build Coastguard Worker                                                 << ", base level: " << testSize.lodBase << TestLog::EndMessage;
1543*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog() << TestLog::Message << "Expecting: " << testSize.expectedSize.x() << "x"
1544*35238bceSAndroid Build Coastguard Worker                                                 << testSize.expectedSize.y() << TestLog::EndMessage;
1545*35238bceSAndroid Build Coastguard Worker 
1546*35238bceSAndroid Build Coastguard Worker             gl.uniform2iv(sizeLoc, 1, testSize.expectedSize.m_data);
1547*35238bceSAndroid Build Coastguard Worker             gl.uniform1iv(lodLoc, 1, &testSize.lod);
1548*35238bceSAndroid Build Coastguard Worker 
1549*35238bceSAndroid Build Coastguard Worker             gl.texStorage2D(textureTarget, levels, m_textureSpec.format, testSize.textureSize.x(),
1550*35238bceSAndroid Build Coastguard Worker                             testSize.textureSize.y());
1551*35238bceSAndroid Build Coastguard Worker             break;
1552*35238bceSAndroid Build Coastguard Worker         }
1553*35238bceSAndroid Build Coastguard Worker 
1554*35238bceSAndroid Build Coastguard Worker         case TEXTURETYPE_2D_ARRAY:
1555*35238bceSAndroid Build Coastguard Worker         {
1556*35238bceSAndroid Build Coastguard Worker             tcu::IVec3 expectedSize(testSize.expectedSize.x(), testSize.expectedSize.y(), testSize.textureSize.z());
1557*35238bceSAndroid Build Coastguard Worker 
1558*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog() << TestLog::Message << "Testing image size " << testSize.textureSize.x()
1559*35238bceSAndroid Build Coastguard Worker                                                 << "x" << testSize.textureSize.y() << " with "
1560*35238bceSAndroid Build Coastguard Worker                                                 << testSize.textureSize.z() << " layer(s)" << TestLog::EndMessage;
1561*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog() << TestLog::Message << "Lod: " << testSize.lod
1562*35238bceSAndroid Build Coastguard Worker                                                 << ", base level: " << testSize.lodBase << TestLog::EndMessage;
1563*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog()
1564*35238bceSAndroid Build Coastguard Worker                 << TestLog::Message << "Expecting: " << testSize.expectedSize.x() << "x" << testSize.expectedSize.y()
1565*35238bceSAndroid Build Coastguard Worker                 << " and " << testSize.textureSize.z() << " layer(s)" << TestLog::EndMessage;
1566*35238bceSAndroid Build Coastguard Worker 
1567*35238bceSAndroid Build Coastguard Worker             gl.uniform3iv(sizeLoc, 1, expectedSize.m_data);
1568*35238bceSAndroid Build Coastguard Worker             gl.uniform1iv(lodLoc, 1, &testSize.lod);
1569*35238bceSAndroid Build Coastguard Worker 
1570*35238bceSAndroid Build Coastguard Worker             gl.texStorage3D(textureTarget, levels, m_textureSpec.format, testSize.textureSize.x(),
1571*35238bceSAndroid Build Coastguard Worker                             testSize.textureSize.y(), testSize.textureSize.z());
1572*35238bceSAndroid Build Coastguard Worker             break;
1573*35238bceSAndroid Build Coastguard Worker         }
1574*35238bceSAndroid Build Coastguard Worker 
1575*35238bceSAndroid Build Coastguard Worker         default:
1576*35238bceSAndroid Build Coastguard Worker         {
1577*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
1578*35238bceSAndroid Build Coastguard Worker             break;
1579*35238bceSAndroid Build Coastguard Worker         }
1580*35238bceSAndroid Build Coastguard Worker         }
1581*35238bceSAndroid Build Coastguard Worker 
1582*35238bceSAndroid Build Coastguard Worker         errorValue = gl.getError();
1583*35238bceSAndroid Build Coastguard Worker         if (errorValue == GL_OUT_OF_MEMORY)
1584*35238bceSAndroid Build Coastguard Worker         {
1585*35238bceSAndroid Build Coastguard Worker             throw glu::OutOfMemoryError("Failed to allocate texture, got GL_OUT_OF_MEMORY.", "TexStorageXD", __FILE__,
1586*35238bceSAndroid Build Coastguard Worker                                         __LINE__);
1587*35238bceSAndroid Build Coastguard Worker         }
1588*35238bceSAndroid Build Coastguard Worker         else if (errorValue != GL_NO_ERROR)
1589*35238bceSAndroid Build Coastguard Worker         {
1590*35238bceSAndroid Build Coastguard Worker             // error is a failure too
1591*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog() << tcu::TestLog::Message << "Failed, got "
1592*35238bceSAndroid Build Coastguard Worker                                                 << glu::getErrorStr(errorValue) << "." << tcu::TestLog::EndMessage;
1593*35238bceSAndroid Build Coastguard Worker             success = false;
1594*35238bceSAndroid Build Coastguard Worker         }
1595*35238bceSAndroid Build Coastguard Worker         else
1596*35238bceSAndroid Build Coastguard Worker         {
1597*35238bceSAndroid Build Coastguard Worker             // test
1598*35238bceSAndroid Build Coastguard Worker             const float colorTolerance = 0.1f;
1599*35238bceSAndroid Build Coastguard Worker             tcu::TextureLevel sample(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 1,
1600*35238bceSAndroid Build Coastguard Worker                                      1);
1601*35238bceSAndroid Build Coastguard Worker             tcu::Vec4 outputColor;
1602*35238bceSAndroid Build Coastguard Worker 
1603*35238bceSAndroid Build Coastguard Worker             gl.clear(GL_COLOR_BUFFER_BIT);
1604*35238bceSAndroid Build Coastguard Worker             gl.drawArrays(GL_TRIANGLES, 0, 3);
1605*35238bceSAndroid Build Coastguard Worker             gl.finish();
1606*35238bceSAndroid Build Coastguard Worker 
1607*35238bceSAndroid Build Coastguard Worker             glu::readPixels(m_context.getRenderContext(), 0, 0, sample.getAccess());
1608*35238bceSAndroid Build Coastguard Worker 
1609*35238bceSAndroid Build Coastguard Worker             outputColor = sample.getAccess().getPixel(0, 0);
1610*35238bceSAndroid Build Coastguard Worker 
1611*35238bceSAndroid Build Coastguard Worker             if (outputColor.x() >= 1.0f - colorTolerance && outputColor.y() >= 1.0f - colorTolerance &&
1612*35238bceSAndroid Build Coastguard Worker                 outputColor.z() >= 1.0f - colorTolerance)
1613*35238bceSAndroid Build Coastguard Worker             {
1614*35238bceSAndroid Build Coastguard Worker                 // success
1615*35238bceSAndroid Build Coastguard Worker                 m_context.getTestContext().getLog() << TestLog::Message << "Passed" << TestLog::EndMessage;
1616*35238bceSAndroid Build Coastguard Worker             }
1617*35238bceSAndroid Build Coastguard Worker             else
1618*35238bceSAndroid Build Coastguard Worker             {
1619*35238bceSAndroid Build Coastguard Worker                 // failure
1620*35238bceSAndroid Build Coastguard Worker                 m_context.getTestContext().getLog() << TestLog::Message << "Failed" << TestLog::EndMessage;
1621*35238bceSAndroid Build Coastguard Worker                 success = false;
1622*35238bceSAndroid Build Coastguard Worker             }
1623*35238bceSAndroid Build Coastguard Worker         }
1624*35238bceSAndroid Build Coastguard Worker 
1625*35238bceSAndroid Build Coastguard Worker         // empty line to format log nicely
1626*35238bceSAndroid Build Coastguard Worker         m_context.getTestContext().getLog() << TestLog::Message << TestLog::EndMessage;
1627*35238bceSAndroid Build Coastguard Worker 
1628*35238bceSAndroid Build Coastguard Worker         // free
1629*35238bceSAndroid Build Coastguard Worker         gl.bindTexture(textureTarget, 0);
1630*35238bceSAndroid Build Coastguard Worker         gl.deleteTextures(1, &texId);
1631*35238bceSAndroid Build Coastguard Worker     }
1632*35238bceSAndroid Build Coastguard Worker 
1633*35238bceSAndroid Build Coastguard Worker     gl.useProgram(0);
1634*35238bceSAndroid Build Coastguard Worker 
1635*35238bceSAndroid Build Coastguard Worker     return success;
1636*35238bceSAndroid Build Coastguard Worker }
1637*35238bceSAndroid Build Coastguard Worker 
genVertexShader() const1638*35238bceSAndroid Build Coastguard Worker std::string TextureSizeCase::genVertexShader() const
1639*35238bceSAndroid Build Coastguard Worker {
1640*35238bceSAndroid Build Coastguard Worker     std::ostringstream vert;
1641*35238bceSAndroid Build Coastguard Worker 
1642*35238bceSAndroid Build Coastguard Worker     vert << "#version 300 es\n"
1643*35238bceSAndroid Build Coastguard Worker          << "in highp vec4 a_position;\n";
1644*35238bceSAndroid Build Coastguard Worker 
1645*35238bceSAndroid Build Coastguard Worker     if (m_isVertexCase)
1646*35238bceSAndroid Build Coastguard Worker     {
1647*35238bceSAndroid Build Coastguard Worker         vert << "out mediump vec4 v_color;\n";
1648*35238bceSAndroid Build Coastguard Worker         vert << "uniform highp " << m_samplerTypeStr << " u_sampler;\n";
1649*35238bceSAndroid Build Coastguard Worker         vert << "uniform highp ivec" << (m_has3DSize ? 3 : 2) << " u_texSize;\n";
1650*35238bceSAndroid Build Coastguard Worker         vert << "uniform highp int u_lod;\n";
1651*35238bceSAndroid Build Coastguard Worker     }
1652*35238bceSAndroid Build Coastguard Worker 
1653*35238bceSAndroid Build Coastguard Worker     vert << "void main()\n{\n";
1654*35238bceSAndroid Build Coastguard Worker 
1655*35238bceSAndroid Build Coastguard Worker     if (m_isVertexCase)
1656*35238bceSAndroid Build Coastguard Worker         vert << "    v_color = (textureSize(u_sampler, u_lod) == u_texSize ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, "
1657*35238bceSAndroid Build Coastguard Worker                 "0.0, 1.0));\n";
1658*35238bceSAndroid Build Coastguard Worker 
1659*35238bceSAndroid Build Coastguard Worker     vert << "    gl_Position = a_position;\n"
1660*35238bceSAndroid Build Coastguard Worker          << "}\n";
1661*35238bceSAndroid Build Coastguard Worker 
1662*35238bceSAndroid Build Coastguard Worker     return vert.str();
1663*35238bceSAndroid Build Coastguard Worker }
1664*35238bceSAndroid Build Coastguard Worker 
genFragmentShader() const1665*35238bceSAndroid Build Coastguard Worker std::string TextureSizeCase::genFragmentShader() const
1666*35238bceSAndroid Build Coastguard Worker {
1667*35238bceSAndroid Build Coastguard Worker     std::ostringstream frag;
1668*35238bceSAndroid Build Coastguard Worker 
1669*35238bceSAndroid Build Coastguard Worker     frag << "#version 300 es\n"
1670*35238bceSAndroid Build Coastguard Worker          << "layout(location = 0) out mediump vec4 o_color;\n";
1671*35238bceSAndroid Build Coastguard Worker 
1672*35238bceSAndroid Build Coastguard Worker     if (m_isVertexCase)
1673*35238bceSAndroid Build Coastguard Worker         frag << "in mediump vec4 v_color;\n";
1674*35238bceSAndroid Build Coastguard Worker 
1675*35238bceSAndroid Build Coastguard Worker     if (!m_isVertexCase)
1676*35238bceSAndroid Build Coastguard Worker     {
1677*35238bceSAndroid Build Coastguard Worker         frag << "uniform highp " << m_samplerTypeStr << " u_sampler;\n";
1678*35238bceSAndroid Build Coastguard Worker         frag << "uniform highp ivec" << (m_has3DSize ? 3 : 2) << " u_texSize;\n";
1679*35238bceSAndroid Build Coastguard Worker         frag << "uniform highp int u_lod;\n";
1680*35238bceSAndroid Build Coastguard Worker     }
1681*35238bceSAndroid Build Coastguard Worker 
1682*35238bceSAndroid Build Coastguard Worker     frag << "void main()\n{\n";
1683*35238bceSAndroid Build Coastguard Worker 
1684*35238bceSAndroid Build Coastguard Worker     if (!m_isVertexCase)
1685*35238bceSAndroid Build Coastguard Worker         frag << "    o_color = (textureSize(u_sampler, u_lod) == u_texSize ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, "
1686*35238bceSAndroid Build Coastguard Worker                 "0.0, 1.0));\n";
1687*35238bceSAndroid Build Coastguard Worker     else
1688*35238bceSAndroid Build Coastguard Worker         frag << "    o_color = v_color;\n";
1689*35238bceSAndroid Build Coastguard Worker 
1690*35238bceSAndroid Build Coastguard Worker     frag << "}\n";
1691*35238bceSAndroid Build Coastguard Worker 
1692*35238bceSAndroid Build Coastguard Worker     return frag.str();
1693*35238bceSAndroid Build Coastguard Worker }
1694*35238bceSAndroid Build Coastguard Worker 
getGLTextureTarget() const1695*35238bceSAndroid Build Coastguard Worker glw::GLenum TextureSizeCase::getGLTextureTarget() const
1696*35238bceSAndroid Build Coastguard Worker {
1697*35238bceSAndroid Build Coastguard Worker     switch (m_textureSpec.type)
1698*35238bceSAndroid Build Coastguard Worker     {
1699*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_2D:
1700*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_2D;
1701*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_CUBE_MAP:
1702*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_CUBE_MAP;
1703*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_2D_ARRAY:
1704*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_2D_ARRAY;
1705*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_3D:
1706*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_3D;
1707*35238bceSAndroid Build Coastguard Worker     default:
1708*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1709*35238bceSAndroid Build Coastguard Worker     }
1710*35238bceSAndroid Build Coastguard Worker     return 0;
1711*35238bceSAndroid Build Coastguard Worker }
1712*35238bceSAndroid Build Coastguard Worker 
ShaderTextureFunctionTests(Context & context)1713*35238bceSAndroid Build Coastguard Worker ShaderTextureFunctionTests::ShaderTextureFunctionTests(Context &context)
1714*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "texture_functions", "Texture Access Function Tests")
1715*35238bceSAndroid Build Coastguard Worker {
1716*35238bceSAndroid Build Coastguard Worker }
1717*35238bceSAndroid Build Coastguard Worker 
~ShaderTextureFunctionTests(void)1718*35238bceSAndroid Build Coastguard Worker ShaderTextureFunctionTests::~ShaderTextureFunctionTests(void)
1719*35238bceSAndroid Build Coastguard Worker {
1720*35238bceSAndroid Build Coastguard Worker }
1721*35238bceSAndroid Build Coastguard Worker 
1722*35238bceSAndroid Build Coastguard Worker enum CaseFlags
1723*35238bceSAndroid Build Coastguard Worker {
1724*35238bceSAndroid Build Coastguard Worker     VERTEX   = (1 << 0),
1725*35238bceSAndroid Build Coastguard Worker     FRAGMENT = (1 << 1),
1726*35238bceSAndroid Build Coastguard Worker     BOTH     = VERTEX | FRAGMENT
1727*35238bceSAndroid Build Coastguard Worker };
1728*35238bceSAndroid Build Coastguard Worker 
1729*35238bceSAndroid Build Coastguard Worker struct TexFuncCaseSpec
1730*35238bceSAndroid Build Coastguard Worker {
1731*35238bceSAndroid Build Coastguard Worker     const char *name;
1732*35238bceSAndroid Build Coastguard Worker     TextureLookupSpec lookupSpec;
1733*35238bceSAndroid Build Coastguard Worker     TextureSpec texSpec;
1734*35238bceSAndroid Build Coastguard Worker     TexEvalFunc evalFunc;
1735*35238bceSAndroid Build Coastguard Worker     uint32_t flags;
1736*35238bceSAndroid Build Coastguard Worker };
1737*35238bceSAndroid Build Coastguard Worker 
1738*35238bceSAndroid Build Coastguard Worker #define CASE_SPEC(NAME, FUNC, MINCOORD, MAXCOORD, USEBIAS, MINLOD, MAXLOD, USEOFFSET, OFFSET, TEXSPEC, EVALFUNC,   \
1739*35238bceSAndroid Build Coastguard Worker                   FLAGS)                                                                                           \
1740*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1741*35238bceSAndroid Build Coastguard Worker         #NAME,                                                                                                     \
1742*35238bceSAndroid Build Coastguard Worker             TextureLookupSpec(FUNC, MINCOORD, MAXCOORD, USEBIAS, MINLOD, MAXLOD, tcu::Vec3(0.0f), tcu::Vec3(0.0f), \
1743*35238bceSAndroid Build Coastguard Worker                               tcu::Vec3(0.0f), tcu::Vec3(0.0f), USEOFFSET, OFFSET),                                \
1744*35238bceSAndroid Build Coastguard Worker             TEXSPEC, EVALFUNC, FLAGS                                                                               \
1745*35238bceSAndroid Build Coastguard Worker     }
1746*35238bceSAndroid Build Coastguard Worker #define GRAD_CASE_SPEC(NAME, FUNC, MINCOORD, MAXCOORD, MINDX, MAXDX, MINDY, MAXDY, USEOFFSET, OFFSET, TEXSPEC,    \
1747*35238bceSAndroid Build Coastguard Worker                        EVALFUNC, FLAGS)                                                                           \
1748*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
1749*35238bceSAndroid Build Coastguard Worker         #NAME,                                                                                                    \
1750*35238bceSAndroid Build Coastguard Worker             TextureLookupSpec(FUNC, MINCOORD, MAXCOORD, false, 0.0f, 0.0f, MINDX, MAXDX, MINDY, MAXDY, USEOFFSET, \
1751*35238bceSAndroid Build Coastguard Worker                               OFFSET),                                                                            \
1752*35238bceSAndroid Build Coastguard Worker             TEXSPEC, EVALFUNC, FLAGS                                                                              \
1753*35238bceSAndroid Build Coastguard Worker     }
1754*35238bceSAndroid Build Coastguard Worker 
createCaseGroup(TestCaseGroup * parent,const char * groupName,const char * groupDesc,const TexFuncCaseSpec * cases,int numCases)1755*35238bceSAndroid Build Coastguard Worker static void createCaseGroup(TestCaseGroup *parent, const char *groupName, const char *groupDesc,
1756*35238bceSAndroid Build Coastguard Worker                             const TexFuncCaseSpec *cases, int numCases)
1757*35238bceSAndroid Build Coastguard Worker {
1758*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *group = new tcu::TestCaseGroup(parent->getTestContext(), groupName, groupDesc);
1759*35238bceSAndroid Build Coastguard Worker     parent->addChild(group);
1760*35238bceSAndroid Build Coastguard Worker 
1761*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < numCases; ndx++)
1762*35238bceSAndroid Build Coastguard Worker     {
1763*35238bceSAndroid Build Coastguard Worker         std::string name = cases[ndx].name;
1764*35238bceSAndroid Build Coastguard Worker         if (cases[ndx].flags & VERTEX)
1765*35238bceSAndroid Build Coastguard Worker             group->addChild(new ShaderTextureFunctionCase(parent->getContext(), (name + "_vertex").c_str(), "",
1766*35238bceSAndroid Build Coastguard Worker                                                           cases[ndx].lookupSpec, cases[ndx].texSpec,
1767*35238bceSAndroid Build Coastguard Worker                                                           cases[ndx].evalFunc, true));
1768*35238bceSAndroid Build Coastguard Worker         if (cases[ndx].flags & FRAGMENT)
1769*35238bceSAndroid Build Coastguard Worker             group->addChild(new ShaderTextureFunctionCase(parent->getContext(), (name + "_fragment").c_str(), "",
1770*35238bceSAndroid Build Coastguard Worker                                                           cases[ndx].lookupSpec, cases[ndx].texSpec,
1771*35238bceSAndroid Build Coastguard Worker                                                           cases[ndx].evalFunc, false));
1772*35238bceSAndroid Build Coastguard Worker     }
1773*35238bceSAndroid Build Coastguard Worker }
1774*35238bceSAndroid Build Coastguard Worker 
init(void)1775*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionTests::init(void)
1776*35238bceSAndroid Build Coastguard Worker {
1777*35238bceSAndroid Build Coastguard Worker     // Samplers
1778*35238bceSAndroid Build Coastguard Worker     static const tcu::Sampler samplerNearestNoMipmap(
1779*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::NEAREST,
1780*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::NEAREST, 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE,
1781*35238bceSAndroid Build Coastguard Worker         0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */);
1782*35238bceSAndroid Build Coastguard Worker     static const tcu::Sampler samplerLinearNoMipmap(
1783*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::LINEAR,
1784*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::LINEAR, 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE,
1785*35238bceSAndroid Build Coastguard Worker         0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */);
1786*35238bceSAndroid Build Coastguard Worker     static const tcu::Sampler samplerNearestMipmap(
1787*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::NEAREST_MIPMAP_NEAREST,
1788*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::NEAREST, 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE,
1789*35238bceSAndroid Build Coastguard Worker         0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */);
1790*35238bceSAndroid Build Coastguard Worker     static const tcu::Sampler samplerLinearMipmap(
1791*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::LINEAR_MIPMAP_NEAREST,
1792*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::LINEAR, 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE,
1793*35238bceSAndroid Build Coastguard Worker         0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */);
1794*35238bceSAndroid Build Coastguard Worker 
1795*35238bceSAndroid Build Coastguard Worker     static const tcu::Sampler samplerShadowNoMipmap(
1796*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::NEAREST,
1797*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::NEAREST, 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_LESS,
1798*35238bceSAndroid Build Coastguard Worker         0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */);
1799*35238bceSAndroid Build Coastguard Worker     static const tcu::Sampler samplerShadowMipmap(
1800*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::NEAREST_MIPMAP_NEAREST,
1801*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::NEAREST, 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_LESS,
1802*35238bceSAndroid Build Coastguard Worker         0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */);
1803*35238bceSAndroid Build Coastguard Worker 
1804*35238bceSAndroid Build Coastguard Worker     static const tcu::Sampler samplerTexelFetch(
1805*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::NEAREST_MIPMAP_NEAREST,
1806*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::NEAREST, 0.0f /* LOD threshold */, false /* non-normalized coords */,
1807*35238bceSAndroid Build Coastguard Worker         tcu::Sampler::COMPAREMODE_NONE, 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */,
1808*35238bceSAndroid Build Coastguard Worker         true /* seamless cube map */);
1809*35238bceSAndroid Build Coastguard Worker 
1810*35238bceSAndroid Build Coastguard Worker     // Default textures.
1811*35238bceSAndroid Build Coastguard Worker     //                                                Type                    Format                    W        H        D    L    Sampler
1812*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DFixed(TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 1, samplerLinearNoMipmap);
1813*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DFloat(TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 1, samplerLinearNoMipmap);
1814*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DInt(TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 1, samplerNearestNoMipmap);
1815*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DUint(TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 1, samplerNearestNoMipmap);
1816*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DMipmapFixed(TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 9, samplerLinearMipmap);
1817*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DMipmapFloat(TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 9, samplerLinearMipmap);
1818*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DMipmapInt(TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 9, samplerNearestMipmap);
1819*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DMipmapUint(TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 9, samplerNearestMipmap);
1820*35238bceSAndroid Build Coastguard Worker 
1821*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DShadow(TEXTURETYPE_2D, GL_DEPTH_COMPONENT16, 256, 256, 1, 9, samplerShadowNoMipmap);
1822*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DMipmapShadow(TEXTURETYPE_2D, GL_DEPTH_COMPONENT16, 256, 256, 1, 9,
1823*35238bceSAndroid Build Coastguard Worker                                                samplerShadowMipmap);
1824*35238bceSAndroid Build Coastguard Worker 
1825*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DTexelFetchFixed(TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 9, samplerTexelFetch);
1826*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DTexelFetchFloat(TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 9, samplerTexelFetch);
1827*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DTexelFetchInt(TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 9, samplerTexelFetch);
1828*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DTexelFetchUint(TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 9, samplerTexelFetch);
1829*35238bceSAndroid Build Coastguard Worker 
1830*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeFixed(TEXTURETYPE_CUBE_MAP, GL_RGBA8, 256, 256, 1, 1, samplerLinearNoMipmap);
1831*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeFloat(TEXTURETYPE_CUBE_MAP, GL_RGBA16F, 256, 256, 1, 1, samplerLinearNoMipmap);
1832*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeInt(TEXTURETYPE_CUBE_MAP, GL_RGBA8I, 256, 256, 1, 1, samplerNearestNoMipmap);
1833*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeUint(TEXTURETYPE_CUBE_MAP, GL_RGBA8UI, 256, 256, 1, 1, samplerNearestNoMipmap);
1834*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeMipmapFixed(TEXTURETYPE_CUBE_MAP, GL_RGBA8, 256, 256, 1, 9, samplerLinearMipmap);
1835*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeMipmapFloat(TEXTURETYPE_CUBE_MAP, GL_RGBA16F, 128, 128, 1, 8, samplerLinearMipmap);
1836*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeMipmapInt(TEXTURETYPE_CUBE_MAP, GL_RGBA8I, 256, 256, 1, 9, samplerNearestMipmap);
1837*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeMipmapUint(TEXTURETYPE_CUBE_MAP, GL_RGBA8UI, 256, 256, 1, 9, samplerNearestMipmap);
1838*35238bceSAndroid Build Coastguard Worker 
1839*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeShadow(TEXTURETYPE_CUBE_MAP, GL_DEPTH_COMPONENT16, 256, 256, 1, 1,
1840*35238bceSAndroid Build Coastguard Worker                                            samplerShadowNoMipmap);
1841*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeMipmapShadow(TEXTURETYPE_CUBE_MAP, GL_DEPTH_COMPONENT16, 256, 256, 1, 9,
1842*35238bceSAndroid Build Coastguard Worker                                                  samplerShadowMipmap);
1843*35238bceSAndroid Build Coastguard Worker 
1844*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayFixed(TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 1, samplerLinearNoMipmap);
1845*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayFloat(TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 1, samplerLinearNoMipmap);
1846*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayInt(TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 1, samplerNearestNoMipmap);
1847*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayUint(TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 1, samplerNearestNoMipmap);
1848*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayMipmapFixed(TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 8, samplerLinearMipmap);
1849*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayMipmapFloat(TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 8,
1850*35238bceSAndroid Build Coastguard Worker                                                    samplerLinearMipmap);
1851*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayMipmapInt(TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 8, samplerNearestMipmap);
1852*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayMipmapUint(TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 8,
1853*35238bceSAndroid Build Coastguard Worker                                                   samplerNearestMipmap);
1854*35238bceSAndroid Build Coastguard Worker 
1855*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayShadow(TEXTURETYPE_2D_ARRAY, GL_DEPTH_COMPONENT16, 128, 128, 4, 1,
1856*35238bceSAndroid Build Coastguard Worker                                               samplerShadowNoMipmap);
1857*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayMipmapShadow(TEXTURETYPE_2D_ARRAY, GL_DEPTH_COMPONENT16, 128, 128, 4, 8,
1858*35238bceSAndroid Build Coastguard Worker                                                     samplerShadowMipmap);
1859*35238bceSAndroid Build Coastguard Worker 
1860*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayTexelFetchFixed(TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 8,
1861*35238bceSAndroid Build Coastguard Worker                                                        samplerTexelFetch);
1862*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayTexelFetchFloat(TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 8,
1863*35238bceSAndroid Build Coastguard Worker                                                        samplerTexelFetch);
1864*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayTexelFetchInt(TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 8,
1865*35238bceSAndroid Build Coastguard Worker                                                      samplerTexelFetch);
1866*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DArrayTexelFetchUint(TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 8,
1867*35238bceSAndroid Build Coastguard Worker                                                       samplerTexelFetch);
1868*35238bceSAndroid Build Coastguard Worker 
1869*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DFixed(TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 1, samplerLinearNoMipmap);
1870*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DFloat(TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 1, samplerLinearNoMipmap);
1871*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DInt(TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 1, samplerNearestNoMipmap);
1872*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DUint(TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 1, samplerNearestNoMipmap);
1873*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DMipmapFixed(TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 7, samplerLinearMipmap);
1874*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DMipmapFloat(TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 7, samplerLinearMipmap);
1875*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DMipmapInt(TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 7, samplerNearestMipmap);
1876*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DMipmapUint(TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 7, samplerNearestMipmap);
1877*35238bceSAndroid Build Coastguard Worker 
1878*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DTexelFetchFixed(TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 7, samplerTexelFetch);
1879*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DTexelFetchFloat(TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 7, samplerTexelFetch);
1880*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DTexelFetchInt(TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 7, samplerTexelFetch);
1881*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex3DTexelFetchUint(TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 7, samplerTexelFetch);
1882*35238bceSAndroid Build Coastguard Worker 
1883*35238bceSAndroid Build Coastguard Worker     // texture() cases
1884*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureCases[] = {
1885*35238bceSAndroid Build Coastguard Worker         //          Name                            Function            MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Offset?    Offset        Format                    EvalFunc                Flags
1886*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
1887*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DFixed, evalTexture2D, VERTEX),
1888*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
1889*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2D, FRAGMENT),
1890*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
1891*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DFloat, evalTexture2D, VERTEX),
1892*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
1893*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2D, FRAGMENT),
1894*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
1895*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex2DInt, evalTexture2D, VERTEX),
1896*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
1897*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2D, FRAGMENT),
1898*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
1899*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex2DUint, evalTexture2D, VERTEX),
1900*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
1901*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2D, FRAGMENT),
1902*35238bceSAndroid Build Coastguard Worker 
1903*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_bias_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
1904*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DBias, FRAGMENT),
1905*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_bias_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
1906*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DBias, FRAGMENT),
1907*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), true,
1908*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DBias, FRAGMENT),
1909*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), true,
1910*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DBias, FRAGMENT),
1911*35238bceSAndroid Build Coastguard Worker 
1912*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercube_fixed, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f),
1913*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), texCubeFixed, evalTextureCube, VERTEX),
1914*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercube_fixed, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f),
1915*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapFixed, evalTextureCube, FRAGMENT),
1916*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercube_float, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4(1.0f, 1.0f, -1.01f, 0.0f),
1917*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), texCubeFloat, evalTextureCube, VERTEX),
1918*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercube_float, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4(1.0f, 1.0f, -1.01f, 0.0f),
1919*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapFloat, evalTextureCube, FRAGMENT),
1920*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isamplercube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f), false,
1921*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), texCubeInt, evalTextureCube, VERTEX),
1922*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isamplercube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f), false,
1923*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), texCubeMipmapInt, evalTextureCube, FRAGMENT),
1924*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usamplercube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4(1.0f, 1.0f, -1.01f, 0.0f),
1925*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), texCubeUint, evalTextureCube, VERTEX),
1926*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usamplercube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4(1.0f, 1.0f, -1.01f, 0.0f),
1927*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapUint, evalTextureCube, FRAGMENT),
1928*35238bceSAndroid Build Coastguard Worker 
1929*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercube_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f),
1930*35238bceSAndroid Build Coastguard Worker                   Vec4(1.0f, 1.0f, 1.01f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapFixed,
1931*35238bceSAndroid Build Coastguard Worker                   evalTextureCubeBias, FRAGMENT),
1932*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercube_bias_float, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f),
1933*35238bceSAndroid Build Coastguard Worker                   Vec4(1.0f, 1.0f, -1.01f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapFloat,
1934*35238bceSAndroid Build Coastguard Worker                   evalTextureCubeBias, FRAGMENT),
1935*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isamplercube_bias, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f),
1936*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapInt, evalTextureCubeBias, FRAGMENT),
1937*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usamplercube_bias, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4(1.0f, 1.0f, -1.01f, 0.0f),
1938*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapUint, evalTextureCubeBias, FRAGMENT),
1939*35238bceSAndroid Build Coastguard Worker 
1940*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1941*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayFixed, evalTexture2DArray, VERTEX),
1942*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1943*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapFixed, evalTexture2DArray, FRAGMENT),
1944*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1945*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayFloat, evalTexture2DArray, VERTEX),
1946*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1947*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapFloat, evalTexture2DArray, FRAGMENT),
1948*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1949*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayInt, evalTexture2DArray, VERTEX),
1950*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1951*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapInt, evalTexture2DArray, FRAGMENT),
1952*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1953*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayUint, evalTexture2DArray, VERTEX),
1954*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1955*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapUint, evalTexture2DArray, FRAGMENT),
1956*35238bceSAndroid Build Coastguard Worker 
1957*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
1958*35238bceSAndroid Build Coastguard Worker                   Vec4(1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DArrayMipmapFixed,
1959*35238bceSAndroid Build Coastguard Worker                   evalTexture2DArrayBias, FRAGMENT),
1960*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_bias_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
1961*35238bceSAndroid Build Coastguard Worker                   Vec4(1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DArrayMipmapFloat,
1962*35238bceSAndroid Build Coastguard Worker                   evalTexture2DArrayBias, FRAGMENT),
1963*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1964*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, false, IVec3(0), tex2DArrayMipmapInt, evalTexture2DArrayBias, FRAGMENT),
1965*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
1966*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, false, IVec3(0), tex2DArrayMipmapUint, evalTexture2DArrayBias, FRAGMENT),
1967*35238bceSAndroid Build Coastguard Worker 
1968*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
1969*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex3DFixed, evalTexture3D, VERTEX),
1970*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
1971*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3D, FRAGMENT),
1972*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
1973*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex3DFloat, evalTexture3D, VERTEX),
1974*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
1975*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3D, FRAGMENT),
1976*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
1977*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex3DInt, evalTexture3D, VERTEX),
1978*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
1979*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3D, FRAGMENT),
1980*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
1981*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex3DUint, evalTexture3D, VERTEX),
1982*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
1983*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3D, FRAGMENT),
1984*35238bceSAndroid Build Coastguard Worker 
1985*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
1986*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 1.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3DBias, FRAGMENT),
1987*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_bias_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
1988*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 1.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3DBias, FRAGMENT),
1989*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), true,
1990*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3DBias, FRAGMENT),
1991*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), true,
1992*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3DBias, FRAGMENT),
1993*35238bceSAndroid Build Coastguard Worker 
1994*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 1.0f, 0.0f),
1995*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DShadow, evalTexture2DShadow, VERTEX),
1996*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 1.0f, 0.0f),
1997*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadow, FRAGMENT),
1998*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 1.0f, 0.0f),
1999*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowBias, FRAGMENT),
2000*35238bceSAndroid Build Coastguard Worker 
2001*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercubeshadow, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 1.0f),
2002*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), texCubeShadow, evalTextureCubeShadow, VERTEX),
2003*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercubeshadow, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 1.0f),
2004*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapShadow, evalTextureCubeShadow, FRAGMENT),
2005*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercubeshadow_bias, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f),
2006*35238bceSAndroid Build Coastguard Worker                   Vec4(1.0f, 1.0f, 1.01f, 1.0f), true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapShadow,
2007*35238bceSAndroid Build Coastguard Worker                   evalTextureCubeShadowBias, FRAGMENT),
2008*35238bceSAndroid Build Coastguard Worker 
2009*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 1.0f),
2010*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayShadow, evalTexture2DArrayShadow, VERTEX),
2011*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 1.0f),
2012*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapShadow, evalTexture2DArrayShadow, FRAGMENT)
2013*35238bceSAndroid Build Coastguard Worker 
2014*35238bceSAndroid Build Coastguard Worker         // Not in spec.
2015*35238bceSAndroid Build Coastguard Worker         //        CASE_SPEC(sampler2darrayshadow_bias, (FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f,  -0.5f,  0.0f), Vec4( 1.5f,  2.3f,  3.5f,  1.0f), true, -2.0f, 2.0f, Vec2(0.0f), Vec2(0.0f), false, IVec3(0)), tex2DArrayMipmapShadow, evalTexture2DArrayShadowBias, FRAGMENT)
2016*35238bceSAndroid Build Coastguard Worker     };
2017*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "texture", "texture() Tests", textureCases, DE_LENGTH_OF_ARRAY(textureCases));
2018*35238bceSAndroid Build Coastguard Worker 
2019*35238bceSAndroid Build Coastguard Worker     // textureOffset() cases
2020*35238bceSAndroid Build Coastguard Worker     // \note _bias variants are not using mipmap thanks to wide allowed range for LOD computation
2021*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureOffsetCases[] = {
2022*35238bceSAndroid Build Coastguard Worker         //          Name                            Function            MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Offset?    Offset                Format                    EvalFunc                        Flags
2023*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2024*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFixed, evalTexture2DOffset, VERTEX),
2025*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2026*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFixed, evalTexture2DOffset, FRAGMENT),
2027*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2028*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFloat, evalTexture2DOffset, VERTEX),
2029*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2030*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DOffset, FRAGMENT),
2031*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
2032*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DOffset, VERTEX),
2033*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
2034*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapInt, evalTexture2DOffset, FRAGMENT),
2035*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
2036*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DUint, evalTexture2DOffset, VERTEX),
2037*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
2038*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DOffset, FRAGMENT),
2039*35238bceSAndroid Build Coastguard Worker 
2040*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_bias_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2041*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DFixed, evalTexture2DOffsetBias, FRAGMENT),
2042*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_bias_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2043*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DFloat, evalTexture2DOffsetBias, FRAGMENT),
2044*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), true,
2045*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DOffsetBias, FRAGMENT),
2046*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), true,
2047*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DUint, evalTexture2DOffsetBias, FRAGMENT),
2048*35238bceSAndroid Build Coastguard Worker 
2049*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2050*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayFixed, evalTexture2DArrayOffset, VERTEX),
2051*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2052*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapFixed, evalTexture2DArrayOffset, FRAGMENT),
2053*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2054*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayFloat, evalTexture2DArrayOffset, VERTEX),
2055*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2056*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapFloat, evalTexture2DArrayOffset, FRAGMENT),
2057*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2058*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayInt, evalTexture2DArrayOffset, VERTEX),
2059*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2060*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapInt, evalTexture2DArrayOffset, FRAGMENT),
2061*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2062*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayUint, evalTexture2DArrayOffset, VERTEX),
2063*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2064*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapUint, evalTexture2DArrayOffset, FRAGMENT),
2065*35238bceSAndroid Build Coastguard Worker 
2066*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2067*35238bceSAndroid Build Coastguard Worker                   Vec4(1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DArrayFixed,
2068*35238bceSAndroid Build Coastguard Worker                   evalTexture2DArrayOffsetBias, FRAGMENT),
2069*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_bias_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2070*35238bceSAndroid Build Coastguard Worker                   Vec4(1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DArrayFloat,
2071*35238bceSAndroid Build Coastguard Worker                   evalTexture2DArrayOffsetBias, FRAGMENT),
2072*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2073*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DArrayInt, evalTexture2DArrayOffsetBias, FRAGMENT),
2074*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2075*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DArrayUint, evalTexture2DArrayOffsetBias, FRAGMENT),
2076*35238bceSAndroid Build Coastguard Worker 
2077*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2078*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DFixed, evalTexture3DOffset, VERTEX),
2079*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2080*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapFixed, evalTexture3DOffset, FRAGMENT),
2081*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2082*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DFloat, evalTexture3DOffset, VERTEX),
2083*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2084*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DMipmapFloat, evalTexture3DOffset, FRAGMENT),
2085*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
2086*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DInt, evalTexture3DOffset, VERTEX),
2087*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
2088*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DMipmapInt, evalTexture3DOffset, FRAGMENT),
2089*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
2090*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DUint, evalTexture3DOffset, VERTEX),
2091*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
2092*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapUint, evalTexture3DOffset, FRAGMENT),
2093*35238bceSAndroid Build Coastguard Worker 
2094*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2095*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 1.0f, true, IVec3(-8, 7, 3), tex3DFixed, evalTexture3DOffsetBias, FRAGMENT),
2096*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_bias_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2097*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 1.0f, true, IVec3(7, 3, -8), tex3DFloat, evalTexture3DOffsetBias, FRAGMENT),
2098*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), true,
2099*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, true, IVec3(3, -8, 7), tex3DInt, evalTexture3DOffsetBias, FRAGMENT),
2100*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), true,
2101*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, true, IVec3(-8, 7, 3), tex3DUint, evalTexture3DOffsetBias, FRAGMENT),
2102*35238bceSAndroid Build Coastguard Worker 
2103*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 1.0f, 0.0f),
2104*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DShadow, evalTexture2DShadowOffset, VERTEX),
2105*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 1.0f, 0.0f),
2106*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapShadow, evalTexture2DShadowOffset, FRAGMENT),
2107*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 1.0f, 0.0f),
2108*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DShadow, evalTexture2DShadowOffsetBias, FRAGMENT)};
2109*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "textureoffset", "textureOffset() Tests", textureOffsetCases,
2110*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(textureOffsetCases));
2111*35238bceSAndroid Build Coastguard Worker 
2112*35238bceSAndroid Build Coastguard Worker     // textureProj() cases
2113*35238bceSAndroid Build Coastguard Worker     // \note Currently uses constant divider!
2114*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureProjCases[] = {
2115*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Offset?    Offset        Format                    EvalFunc                Flags
2116*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2117*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFixed, evalTexture2DProj3,
2118*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2119*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2120*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFixed,
2121*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3, FRAGMENT),
2122*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2123*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFloat, evalTexture2DProj3,
2124*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2125*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2126*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFloat,
2127*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3, FRAGMENT),
2128*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2129*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DInt, evalTexture2DProj3,
2130*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2131*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2132*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapInt,
2133*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3, FRAGMENT),
2134*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2135*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DUint, evalTexture2DProj3,
2136*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2137*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2138*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapUint,
2139*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3, FRAGMENT),
2140*35238bceSAndroid Build Coastguard Worker 
2141*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_bias_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2142*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFixed,
2143*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Bias, FRAGMENT),
2144*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_bias_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2145*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFloat,
2146*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Bias, FRAGMENT),
2147*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2148*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapInt,
2149*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Bias, FRAGMENT),
2150*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2151*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapUint,
2152*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Bias, FRAGMENT),
2153*35238bceSAndroid Build Coastguard Worker 
2154*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2155*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFixed, evalTexture2DProj,
2156*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2157*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2158*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFixed,
2159*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj, FRAGMENT),
2160*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2161*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFloat, evalTexture2DProj,
2162*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2163*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2164*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFloat,
2165*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj, FRAGMENT),
2166*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f),
2167*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DInt, evalTexture2DProj, VERTEX),
2168*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f),
2169*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DProj, FRAGMENT),
2170*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f),
2171*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DUint, evalTexture2DProj, VERTEX),
2172*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f),
2173*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DProj, FRAGMENT),
2174*35238bceSAndroid Build Coastguard Worker 
2175*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_bias_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2176*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFixed,
2177*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjBias, FRAGMENT),
2178*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_bias_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2179*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFloat,
2180*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjBias, FRAGMENT),
2181*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2182*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapInt,
2183*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjBias, FRAGMENT),
2184*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2185*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapUint,
2186*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjBias, FRAGMENT),
2187*35238bceSAndroid Build Coastguard Worker 
2188*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2189*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DFixed, evalTexture3DProj,
2190*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2191*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2192*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapFixed,
2193*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProj, FRAGMENT),
2194*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2195*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DFloat, evalTexture3DProj,
2196*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2197*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2198*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapFloat,
2199*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProj, FRAGMENT),
2200*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2201*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DInt, evalTexture3DProj,
2202*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2203*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2204*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapInt,
2205*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProj, FRAGMENT),
2206*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2207*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DUint, evalTexture3DProj,
2208*35238bceSAndroid Build Coastguard Worker                   VERTEX),
2209*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2210*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapUint,
2211*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProj, FRAGMENT),
2212*35238bceSAndroid Build Coastguard Worker 
2213*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_bias_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2214*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 1.0f, false, IVec3(0), tex3DMipmapFixed,
2215*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjBias, FRAGMENT),
2216*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_bias_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2217*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 1.0f, false, IVec3(0), tex3DMipmapFloat,
2218*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjBias, FRAGMENT),
2219*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d_bias, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2220*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, false, IVec3(0), tex3DMipmapInt,
2221*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjBias, FRAGMENT),
2222*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d_bias, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2223*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, false, IVec3(0), tex3DMipmapUint,
2224*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjBias, FRAGMENT),
2225*35238bceSAndroid Build Coastguard Worker 
2226*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJ, Vec4(0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f),
2227*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DShadow, evalTexture2DShadowProj, VERTEX),
2228*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJ, Vec4(0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f),
2229*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowProj, FRAGMENT),
2230*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow_bias, FUNCTION_TEXTUREPROJ, Vec4(0.2f, 0.6f, 0.0f, 1.5f),
2231*35238bceSAndroid Build Coastguard Worker                   Vec4(-2.25f, -3.45f, 1.5f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapShadow,
2232*35238bceSAndroid Build Coastguard Worker                   evalTexture2DShadowProjBias, FRAGMENT)};
2233*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "textureproj", "textureProj() Tests", textureProjCases, DE_LENGTH_OF_ARRAY(textureProjCases));
2234*35238bceSAndroid Build Coastguard Worker 
2235*35238bceSAndroid Build Coastguard Worker     // textureProjOffset() cases
2236*35238bceSAndroid Build Coastguard Worker     // \note Currently uses constant divider!
2237*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureProjOffsetCases[] = {
2238*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Offset?    Offset                Format                    EvalFunc                        Flags
2239*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2240*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFixed,
2241*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Offset, VERTEX),
2242*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2243*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFixed,
2244*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Offset, FRAGMENT),
2245*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2246*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFloat,
2247*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Offset, VERTEX),
2248*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2249*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat,
2250*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Offset, FRAGMENT),
2251*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2252*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DInt,
2253*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Offset, VERTEX),
2254*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2255*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapInt,
2256*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Offset, FRAGMENT),
2257*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2258*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DUint,
2259*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Offset, VERTEX),
2260*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2261*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapUint,
2262*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3Offset, FRAGMENT),
2263*35238bceSAndroid Build Coastguard Worker 
2264*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_bias_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2265*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DFixed,
2266*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3OffsetBias, FRAGMENT),
2267*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_bias_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2268*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DFloat,
2269*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3OffsetBias, FRAGMENT),
2270*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2271*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DInt,
2272*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3OffsetBias, FRAGMENT),
2273*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2274*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DUint,
2275*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProj3OffsetBias, FRAGMENT),
2276*35238bceSAndroid Build Coastguard Worker 
2277*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2278*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFixed,
2279*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjOffset, VERTEX),
2280*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2281*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFixed,
2282*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjOffset, FRAGMENT),
2283*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2284*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFloat,
2285*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjOffset, VERTEX),
2286*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2287*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat,
2288*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjOffset, FRAGMENT),
2289*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f),
2290*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DProjOffset, VERTEX),
2291*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f),
2292*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapInt, evalTexture2DProjOffset, FRAGMENT),
2293*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f),
2294*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DUint, evalTexture2DProjOffset, VERTEX),
2295*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f),
2296*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DProjOffset, FRAGMENT),
2297*35238bceSAndroid Build Coastguard Worker 
2298*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_bias_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2299*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DFixed,
2300*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjOffsetBias, FRAGMENT),
2301*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_bias_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2302*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DFloat,
2303*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjOffsetBias, FRAGMENT),
2304*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2305*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DInt,
2306*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjOffsetBias, FRAGMENT),
2307*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2308*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DUint,
2309*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjOffsetBias, FRAGMENT),
2310*35238bceSAndroid Build Coastguard Worker 
2311*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2312*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DFixed,
2313*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffset, VERTEX),
2314*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2315*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapFixed,
2316*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffset, FRAGMENT),
2317*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2318*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DFloat,
2319*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffset, VERTEX),
2320*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2321*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DMipmapFloat,
2322*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffset, FRAGMENT),
2323*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2324*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DInt,
2325*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffset, VERTEX),
2326*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2327*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DMipmapInt,
2328*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffset, FRAGMENT),
2329*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2330*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DUint,
2331*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffset, VERTEX),
2332*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2333*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapUint,
2334*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffset, FRAGMENT),
2335*35238bceSAndroid Build Coastguard Worker 
2336*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_bias_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2337*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 3), tex3DFixed,
2338*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffsetBias, FRAGMENT),
2339*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_bias_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2340*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, true, IVec3(7, 3, -8), tex3DFloat,
2341*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffsetBias, FRAGMENT),
2342*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d_bias, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2343*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, true, IVec3(3, -8, 7), tex3DInt,
2344*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffsetBias, FRAGMENT),
2345*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d_bias, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2346*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 3), tex3DUint,
2347*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjOffsetBias, FRAGMENT),
2348*35238bceSAndroid Build Coastguard Worker 
2349*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJ, Vec4(0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f),
2350*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DShadow, evalTexture2DShadowProjOffset, VERTEX),
2351*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJ, Vec4(0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f),
2352*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapShadow, evalTexture2DShadowProjOffset, FRAGMENT),
2353*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow_bias, FUNCTION_TEXTUREPROJ, Vec4(0.2f, 0.6f, 0.0f, 1.5f),
2354*35238bceSAndroid Build Coastguard Worker                   Vec4(-2.25f, -3.45f, 1.5f, 1.5f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DShadow,
2355*35238bceSAndroid Build Coastguard Worker                   evalTexture2DShadowProjOffsetBias, FRAGMENT)};
2356*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "textureprojoffset", "textureOffsetProj() Tests", textureProjOffsetCases,
2357*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(textureProjOffsetCases));
2358*35238bceSAndroid Build Coastguard Worker 
2359*35238bceSAndroid Build Coastguard Worker     // textureLod() cases
2360*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureLodCases[] = {
2361*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Offset?    Offset        Format                    EvalFunc                Flags
2362*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2363*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DLod, BOTH),
2364*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_float, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2365*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DLod, BOTH),
2366*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
2367*35238bceSAndroid Build Coastguard Worker                   -1.0f, 9.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DLod, BOTH),
2368*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
2369*35238bceSAndroid Build Coastguard Worker                   -1.0f, 9.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DLod, BOTH),
2370*35238bceSAndroid Build Coastguard Worker 
2371*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercube_fixed, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f),
2372*35238bceSAndroid Build Coastguard Worker                   Vec4(1.0f, 1.0f, 1.01f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), texCubeMipmapFixed,
2373*35238bceSAndroid Build Coastguard Worker                   evalTextureCubeLod, BOTH),
2374*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(samplercube_float, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, -1.01f, 0.0f),
2375*35238bceSAndroid Build Coastguard Worker                   Vec4(1.0f, 1.0f, -1.01f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), texCubeMipmapFloat,
2376*35238bceSAndroid Build Coastguard Worker                   evalTextureCubeLod, BOTH),
2377*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isamplercube, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f),
2378*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, false, IVec3(0), texCubeMipmapInt, evalTextureCubeLod, BOTH),
2379*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usamplercube, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4(1.0f, 1.0f, -1.01f, 0.0f),
2380*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, false, IVec3(0), texCubeMipmapUint, evalTextureCubeLod, BOTH),
2381*35238bceSAndroid Build Coastguard Worker 
2382*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2383*35238bceSAndroid Build Coastguard Worker                   Vec4(1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, false, IVec3(0), tex2DArrayMipmapFixed,
2384*35238bceSAndroid Build Coastguard Worker                   evalTexture2DArrayLod, BOTH),
2385*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2386*35238bceSAndroid Build Coastguard Worker                   Vec4(1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, false, IVec3(0), tex2DArrayMipmapFloat,
2387*35238bceSAndroid Build Coastguard Worker                   evalTexture2DArrayLod, BOTH),
2388*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2389*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 8.0f, false, IVec3(0), tex2DArrayMipmapInt, evalTexture2DArrayLod, BOTH),
2390*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2391*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 8.0f, false, IVec3(0), tex2DArrayMipmapUint, evalTexture2DArrayLod, BOTH),
2392*35238bceSAndroid Build Coastguard Worker 
2393*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2394*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3DLod, BOTH),
2395*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2396*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3DLod, BOTH),
2397*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
2398*35238bceSAndroid Build Coastguard Worker                   -1.0f, 7.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3DLod, BOTH),
2399*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
2400*35238bceSAndroid Build Coastguard Worker                   -1.0f, 7.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3DLod, BOTH),
2401*35238bceSAndroid Build Coastguard Worker 
2402*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 1.0f, 0.0f),
2403*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowLod, BOTH)};
2404*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "texturelod", "textureLod() Tests", textureLodCases, DE_LENGTH_OF_ARRAY(textureLodCases));
2405*35238bceSAndroid Build Coastguard Worker 
2406*35238bceSAndroid Build Coastguard Worker     // textureLodOffset() cases
2407*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureLodOffsetCases[] = {
2408*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Offset?    Offset                Format                    EvalFunc                        Flags
2409*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2410*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapFixed, evalTexture2DLodOffset, BOTH),
2411*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_float, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2412*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DLodOffset, BOTH),
2413*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
2414*35238bceSAndroid Build Coastguard Worker                   -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapInt, evalTexture2DLodOffset, BOTH),
2415*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
2416*35238bceSAndroid Build Coastguard Worker                   -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DLodOffset, BOTH),
2417*35238bceSAndroid Build Coastguard Worker 
2418*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2419*35238bceSAndroid Build Coastguard Worker                   Vec4(1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, true, IVec3(-8, 7, 0), tex2DArrayMipmapFixed,
2420*35238bceSAndroid Build Coastguard Worker                   evalTexture2DArrayLodOffset, BOTH),
2421*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2422*35238bceSAndroid Build Coastguard Worker                   Vec4(1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapFloat,
2423*35238bceSAndroid Build Coastguard Worker                   evalTexture2DArrayLodOffset, BOTH),
2424*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2425*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 8.0f, true, IVec3(-8, 7, 0), tex2DArrayMipmapInt, evalTexture2DArrayLodOffset, BOTH),
2426*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4(1.5f, 2.3f, 3.5f, 0.0f),
2427*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 8.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapUint, evalTexture2DArrayLodOffset, BOTH),
2428*35238bceSAndroid Build Coastguard Worker 
2429*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2430*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 7.0f, true, IVec3(-8, 7, 3), tex3DMipmapFixed, evalTexture3DLodOffset, BOTH),
2431*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2432*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 7.0f, true, IVec3(7, 3, -8), tex3DMipmapFloat, evalTexture3DLodOffset, BOTH),
2433*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
2434*35238bceSAndroid Build Coastguard Worker                   -1.0f, 7.0f, true, IVec3(3, -8, 7), tex3DMipmapInt, evalTexture3DLodOffset, BOTH),
2435*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f), false,
2436*35238bceSAndroid Build Coastguard Worker                   -1.0f, 7.0f, true, IVec3(-8, 7, 3), tex3DMipmapUint, evalTexture3DLodOffset, BOTH),
2437*35238bceSAndroid Build Coastguard Worker 
2438*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 1.0f, 0.0f),
2439*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapShadow, evalTexture2DShadowLodOffset, BOTH)};
2440*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "texturelodoffset", "textureLodOffset() Tests", textureLodOffsetCases,
2441*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(textureLodOffsetCases));
2442*35238bceSAndroid Build Coastguard Worker 
2443*35238bceSAndroid Build Coastguard Worker     // textureProjLod() cases
2444*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureProjLodCases[] = {
2445*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                    MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Offset?    Offset        Format                    EvalFunc                    Flags
2446*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2447*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFixed,
2448*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod3, BOTH),
2449*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2450*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFloat,
2451*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod3, BOTH),
2452*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2453*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapInt,
2454*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod3, BOTH),
2455*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2456*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapUint,
2457*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod3, BOTH),
2458*35238bceSAndroid Build Coastguard Worker 
2459*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2460*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFixed,
2461*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod, BOTH),
2462*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2463*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFloat,
2464*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod, BOTH),
2465*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2466*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapInt,
2467*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod, BOTH),
2468*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2469*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapUint,
2470*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod, BOTH),
2471*35238bceSAndroid Build Coastguard Worker 
2472*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2473*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapFixed,
2474*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjLod, BOTH),
2475*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2476*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapFloat,
2477*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjLod, BOTH),
2478*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2479*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapInt,
2480*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjLod, BOTH),
2481*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2482*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapUint,
2483*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjLod, BOTH),
2484*35238bceSAndroid Build Coastguard Worker 
2485*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJLOD, Vec4(0.2f, 0.6f, 0.0f, 1.5f),
2486*35238bceSAndroid Build Coastguard Worker                   Vec4(-2.25f, -3.45f, 1.5f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapShadow,
2487*35238bceSAndroid Build Coastguard Worker                   evalTexture2DShadowProjLod, BOTH)};
2488*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "textureprojlod", "textureProjLod() Tests", textureProjLodCases,
2489*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(textureProjLodCases));
2490*35238bceSAndroid Build Coastguard Worker 
2491*35238bceSAndroid Build Coastguard Worker     // textureProjLodOffset() cases
2492*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureProjLodOffsetCases[] = {
2493*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                    MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Offset?    Offset                Format                    EvalFunc                                Flags
2494*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2495*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapFixed,
2496*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod3Offset, BOTH),
2497*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2498*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat,
2499*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod3Offset, BOTH),
2500*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2501*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapInt,
2502*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod3Offset, BOTH),
2503*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2504*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapUint,
2505*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLod3Offset, BOTH),
2506*35238bceSAndroid Build Coastguard Worker 
2507*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2508*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapFixed,
2509*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLodOffset, BOTH),
2510*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2511*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat,
2512*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLodOffset, BOTH),
2513*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2514*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapInt,
2515*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLodOffset, BOTH),
2516*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2517*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapUint,
2518*35238bceSAndroid Build Coastguard Worker                   evalTexture2DProjLodOffset, BOTH),
2519*35238bceSAndroid Build Coastguard Worker 
2520*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2521*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, true, IVec3(-8, 7, 3), tex3DMipmapFixed,
2522*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjLodOffset, BOTH),
2523*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2524*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, true, IVec3(7, 3, -8), tex3DMipmapFloat,
2525*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjLodOffset, BOTH),
2526*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2527*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, true, IVec3(3, -8, 7), tex3DMipmapInt,
2528*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjLodOffset, BOTH),
2529*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2530*35238bceSAndroid Build Coastguard Worker                   Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, true, IVec3(-8, 7, 3), tex3DMipmapUint,
2531*35238bceSAndroid Build Coastguard Worker                   evalTexture3DProjLodOffset, BOTH),
2532*35238bceSAndroid Build Coastguard Worker 
2533*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJLOD, Vec4(0.2f, 0.6f, 0.0f, 1.5f),
2534*35238bceSAndroid Build Coastguard Worker                   Vec4(-2.25f, -3.45f, 1.5f, 1.5f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapShadow,
2535*35238bceSAndroid Build Coastguard Worker                   evalTexture2DShadowProjLodOffset, BOTH)};
2536*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "textureprojlodoffset", "textureProjLodOffset() Tests", textureProjLodOffsetCases,
2537*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(textureProjLodOffsetCases));
2538*35238bceSAndroid Build Coastguard Worker 
2539*35238bceSAndroid Build Coastguard Worker     // textureGrad() cases
2540*35238bceSAndroid Build Coastguard Worker     // \note Only one of dudx, dudy, dvdx, dvdy is non-zero since spec allows approximating p from derivates by various methods.
2541*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureGradCases[] = {
2542*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                MinCoord                            MaxCoord                            MinDx                        MaxDx                        MinDy                        MaxDy                        Offset?    Offset        Format                    EvalFunc                Flags
2543*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f),
2544*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2545*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFixed,
2546*35238bceSAndroid Build Coastguard Worker                        evalTexture2DGrad, BOTH),
2547*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_float, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f),
2548*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2549*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFloat,
2550*35238bceSAndroid Build Coastguard Worker                        evalTexture2DGrad, BOTH),
2551*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler2d, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2552*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f),
2553*35238bceSAndroid Build Coastguard Worker                        false, IVec3(0), tex2DMipmapInt, evalTexture2DGrad, BOTH),
2554*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler2d, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2555*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f),
2556*35238bceSAndroid Build Coastguard Worker                        false, IVec3(0), tex2DMipmapUint, evalTexture2DGrad, BOTH),
2557*35238bceSAndroid Build Coastguard Worker 
2558*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(samplercube_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f),
2559*35238bceSAndroid Build Coastguard Worker                        Vec4(1.0f, 1.0f, 1.01f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2560*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), texCubeMipmapFixed,
2561*35238bceSAndroid Build Coastguard Worker                        evalTextureCubeGrad, BOTH),
2562*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(samplercube_float, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, -1.01f, 0.0f),
2563*35238bceSAndroid Build Coastguard Worker                        Vec4(1.0f, 1.0f, -1.01f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2564*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), texCubeMipmapFloat,
2565*35238bceSAndroid Build Coastguard Worker                        evalTextureCubeGrad, BOTH),
2566*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isamplercube, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f),
2567*35238bceSAndroid Build Coastguard Worker                        Vec4(1.0f, 1.0f, 1.01f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2568*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), texCubeMipmapInt,
2569*35238bceSAndroid Build Coastguard Worker                        evalTextureCubeGrad, BOTH),
2570*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usamplercube, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, -1.01f, 0.0f),
2571*35238bceSAndroid Build Coastguard Worker                        Vec4(1.0f, 1.0f, -1.01f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2572*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), false, IVec3(0), texCubeMipmapUint,
2573*35238bceSAndroid Build Coastguard Worker                        evalTextureCubeGrad, BOTH),
2574*35238bceSAndroid Build Coastguard Worker 
2575*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2576*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2577*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DArrayMipmapFixed,
2578*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayGrad, BOTH),
2579*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2darray_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2580*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2581*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DArrayMipmapFloat,
2582*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayGrad, BOTH),
2583*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler2darray, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2584*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2585*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DArrayMipmapInt,
2586*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayGrad, BOTH),
2587*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler2darray, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2588*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2589*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), false, IVec3(0), tex2DArrayMipmapUint,
2590*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayGrad, BOTH),
2591*35238bceSAndroid Build Coastguard Worker 
2592*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f),
2593*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 2.3f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2594*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFixed,
2595*35238bceSAndroid Build Coastguard Worker                        evalTexture3DGrad, BOTH),
2596*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f),
2597*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 2.3f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2598*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFloat,
2599*35238bceSAndroid Build Coastguard Worker                        evalTexture3DGrad, VERTEX),
2600*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f),
2601*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 2.3f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.2f),
2602*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFloat,
2603*35238bceSAndroid Build Coastguard Worker                        evalTexture3DGrad, FRAGMENT),
2604*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2605*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f),
2606*35238bceSAndroid Build Coastguard Worker                        false, IVec3(0), tex3DMipmapInt, evalTexture3DGrad, BOTH),
2607*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2608*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f),
2609*35238bceSAndroid Build Coastguard Worker                        false, IVec3(0), tex3DMipmapUint, evalTexture3DGrad, VERTEX),
2610*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2611*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, -0.2f),
2612*35238bceSAndroid Build Coastguard Worker                        false, IVec3(0), tex3DMipmapUint, evalTexture3DGrad, FRAGMENT),
2613*35238bceSAndroid Build Coastguard Worker 
2614*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f),
2615*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 1.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2616*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapShadow,
2617*35238bceSAndroid Build Coastguard Worker                        evalTexture2DShadowGrad, BOTH),
2618*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(samplercubeshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f),
2619*35238bceSAndroid Build Coastguard Worker                        Vec4(1.0f, 1.0f, 1.01f, 1.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f),
2620*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), texCubeMipmapShadow,
2621*35238bceSAndroid Build Coastguard Worker                        evalTextureCubeShadowGrad, BOTH),
2622*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2623*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 1.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2624*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DArrayMipmapShadow,
2625*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayShadowGrad, VERTEX),
2626*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2627*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 1.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2628*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f), false, IVec3(0), tex2DArrayMipmapShadow,
2629*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayShadowGrad, FRAGMENT)};
2630*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "texturegrad", "textureGrad() Tests", textureGradCases, DE_LENGTH_OF_ARRAY(textureGradCases));
2631*35238bceSAndroid Build Coastguard Worker 
2632*35238bceSAndroid Build Coastguard Worker     // textureGradOffset() cases
2633*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureGradOffsetCases[] = {
2634*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                MinCoord                            MaxCoord                            MinDx                        MaxDx                        MinDy                        MaxDy                        Offset?    Offset                Format                    EvalFunc                            Flags
2635*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f),
2636*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2637*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapFixed,
2638*35238bceSAndroid Build Coastguard Worker                        evalTexture2DGradOffset, BOTH),
2639*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_float, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f),
2640*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2641*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapFloat,
2642*35238bceSAndroid Build Coastguard Worker                        evalTexture2DGradOffset, BOTH),
2643*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler2d, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2644*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f),
2645*35238bceSAndroid Build Coastguard Worker                        true, IVec3(-8, 7, 0), tex2DMipmapInt, evalTexture2DGradOffset, BOTH),
2646*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler2d, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
2647*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f),
2648*35238bceSAndroid Build Coastguard Worker                        true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DGradOffset, BOTH),
2649*35238bceSAndroid Build Coastguard Worker 
2650*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2651*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2652*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DArrayMipmapFixed,
2653*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayGradOffset, BOTH),
2654*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2darray_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2655*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2656*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DArrayMipmapFloat,
2657*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayGradOffset, BOTH),
2658*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler2darray, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2659*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2660*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DArrayMipmapInt,
2661*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayGradOffset, BOTH),
2662*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler2darray, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2663*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2664*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DArrayMipmapUint,
2665*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayGradOffset, BOTH),
2666*35238bceSAndroid Build Coastguard Worker 
2667*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f),
2668*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 2.3f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2669*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 3), tex3DMipmapFixed,
2670*35238bceSAndroid Build Coastguard Worker                        evalTexture3DGradOffset, BOTH),
2671*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f),
2672*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 2.3f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2673*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(7, 3, -8), tex3DMipmapFloat,
2674*35238bceSAndroid Build Coastguard Worker                        evalTexture3DGradOffset, VERTEX),
2675*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f),
2676*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 2.3f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.2f),
2677*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(3, -8, 7), tex3DMipmapFloat,
2678*35238bceSAndroid Build Coastguard Worker                        evalTexture3DGradOffset, FRAGMENT),
2679*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2680*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f),
2681*35238bceSAndroid Build Coastguard Worker                        true, IVec3(-8, 7, 3), tex3DMipmapInt, evalTexture3DGradOffset, BOTH),
2682*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2683*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f),
2684*35238bceSAndroid Build Coastguard Worker                        true, IVec3(7, 3, -8), tex3DMipmapUint, evalTexture3DGradOffset, VERTEX),
2685*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4(1.5f, 2.3f, 2.3f, 0.0f),
2686*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, -0.2f),
2687*35238bceSAndroid Build Coastguard Worker                        true, IVec3(3, -8, 7), tex3DMipmapUint, evalTexture3DGradOffset, FRAGMENT),
2688*35238bceSAndroid Build Coastguard Worker 
2689*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f),
2690*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 1.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2691*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapShadow,
2692*35238bceSAndroid Build Coastguard Worker                        evalTexture2DShadowGradOffset, VERTEX),
2693*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f),
2694*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 1.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f),
2695*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapShadow,
2696*35238bceSAndroid Build Coastguard Worker                        evalTexture2DShadowGradOffset, FRAGMENT),
2697*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2698*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 1.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2699*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DArrayMipmapShadow,
2700*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayShadowGradOffset, VERTEX),
2701*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f),
2702*35238bceSAndroid Build Coastguard Worker                        Vec4(1.5f, 2.3f, 3.5f, 1.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2703*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DArrayMipmapShadow,
2704*35238bceSAndroid Build Coastguard Worker                        evalTexture2DArrayShadowGradOffset, FRAGMENT)};
2705*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "texturegradoffset", "textureGradOffset() Tests", textureGradOffsetCases,
2706*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(textureGradOffsetCases));
2707*35238bceSAndroid Build Coastguard Worker 
2708*35238bceSAndroid Build Coastguard Worker     // textureProjGrad() cases
2709*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureProjGradCases[] = {
2710*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                    MinCoord                            MaxCoord                            MinDx                        MaxDx                        MinDy                        MaxDy                        Offset?    Offset        Format                    EvalFunc                    Flags
2711*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2712*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2713*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFixed,
2714*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad3, BOTH),
2715*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2716*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2717*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFloat,
2718*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad3, BOTH),
2719*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2720*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2721*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapInt,
2722*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad3, BOTH),
2723*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2724*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2725*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), false, IVec3(0), tex2DMipmapUint,
2726*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad3, BOTH),
2727*35238bceSAndroid Build Coastguard Worker 
2728*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2729*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2730*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFixed,
2731*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad, BOTH),
2732*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2733*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2734*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFloat,
2735*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad, BOTH),
2736*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2737*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2738*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapInt,
2739*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad, BOTH),
2740*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2741*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2742*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), false, IVec3(0), tex2DMipmapUint,
2743*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad, BOTH),
2744*35238bceSAndroid Build Coastguard Worker 
2745*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2746*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2747*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFixed,
2748*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGrad, BOTH),
2749*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2750*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2751*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFloat,
2752*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGrad, VERTEX),
2753*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2754*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.2f),
2755*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFloat,
2756*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGrad, FRAGMENT),
2757*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2758*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2759*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapInt,
2760*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGrad, BOTH),
2761*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2762*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2763*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), false, IVec3(0), tex3DMipmapUint,
2764*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGrad, VERTEX),
2765*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2766*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2767*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, -0.2f), false, IVec3(0), tex3DMipmapUint,
2768*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGrad, FRAGMENT),
2769*35238bceSAndroid Build Coastguard Worker 
2770*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJGRAD, Vec4(0.2f, 0.6f, 0.0f, -1.5f),
2771*35238bceSAndroid Build Coastguard Worker                        Vec4(-2.25f, -3.45f, -1.5f, -1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2772*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapShadow,
2773*35238bceSAndroid Build Coastguard Worker                        evalTexture2DShadowProjGrad, VERTEX),
2774*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJGRAD, Vec4(0.2f, 0.6f, 0.0f, -1.5f),
2775*35238bceSAndroid Build Coastguard Worker                        Vec4(-2.25f, -3.45f, -1.5f, -1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2776*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f), false, IVec3(0), tex2DMipmapShadow,
2777*35238bceSAndroid Build Coastguard Worker                        evalTexture2DShadowProjGrad, FRAGMENT)};
2778*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "textureprojgrad", "textureProjGrad() Tests", textureProjGradCases,
2779*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(textureProjGradCases));
2780*35238bceSAndroid Build Coastguard Worker 
2781*35238bceSAndroid Build Coastguard Worker     // textureProjGradOffset() cases
2782*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec textureProjGradOffsetCases[] = {
2783*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                    MinCoord                            MaxCoord                            MinDx                        MaxDx                        MinDy                        MaxDy                        Offset?    Offset                Format                    EvalFunc                            Flags
2784*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2785*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2786*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapFixed,
2787*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad3Offset, BOTH),
2788*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2789*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2790*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapFloat,
2791*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad3Offset, BOTH),
2792*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2793*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2794*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapInt,
2795*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad3Offset, BOTH),
2796*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
2797*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2798*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapUint,
2799*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGrad3Offset, BOTH),
2800*35238bceSAndroid Build Coastguard Worker 
2801*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2802*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2803*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapFixed,
2804*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGradOffset, BOTH),
2805*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2806*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2807*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapFloat,
2808*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGradOffset, BOTH),
2809*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2810*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2811*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapInt,
2812*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGradOffset, BOTH),
2813*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
2814*35238bceSAndroid Build Coastguard Worker                        Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2815*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapUint,
2816*35238bceSAndroid Build Coastguard Worker                        evalTexture2DProjGradOffset, BOTH),
2817*35238bceSAndroid Build Coastguard Worker 
2818*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2819*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2820*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 3), tex3DMipmapFixed,
2821*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGradOffset, BOTH),
2822*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2823*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f),
2824*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(7, 3, -8), tex3DMipmapFloat,
2825*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGradOffset, VERTEX),
2826*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2827*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.2f),
2828*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(3, -8, 7), tex3DMipmapFloat,
2829*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGradOffset, FRAGMENT),
2830*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2831*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2832*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 3), tex3DMipmapInt,
2833*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGradOffset, BOTH),
2834*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2835*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2836*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.2f, 0.0f), true, IVec3(7, 3, -8), tex3DMipmapUint,
2837*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGradOffset, VERTEX),
2838*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f),
2839*35238bceSAndroid Build Coastguard Worker                        Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2840*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, -0.2f), true, IVec3(3, -8, 7), tex3DMipmapUint,
2841*35238bceSAndroid Build Coastguard Worker                        evalTexture3DProjGradOffset, FRAGMENT),
2842*35238bceSAndroid Build Coastguard Worker 
2843*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJGRAD, Vec4(0.2f, 0.6f, 0.0f, -1.5f),
2844*35238bceSAndroid Build Coastguard Worker                        Vec4(-2.25f, -3.45f, -1.5f, -1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.2f, 0.0f, 0.0f),
2845*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapShadow,
2846*35238bceSAndroid Build Coastguard Worker                        evalTexture2DShadowProjGradOffset, VERTEX),
2847*35238bceSAndroid Build Coastguard Worker         GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJGRAD, Vec4(0.2f, 0.6f, 0.0f, -1.5f),
2848*35238bceSAndroid Build Coastguard Worker                        Vec4(-2.25f, -3.45f, -1.5f, -1.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
2849*35238bceSAndroid Build Coastguard Worker                        Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapShadow,
2850*35238bceSAndroid Build Coastguard Worker                        evalTexture2DShadowProjGradOffset, FRAGMENT)};
2851*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "textureprojgradoffset", "textureProjGradOffset() Tests", textureProjGradOffsetCases,
2852*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(textureProjGradOffsetCases));
2853*35238bceSAndroid Build Coastguard Worker 
2854*35238bceSAndroid Build Coastguard Worker     // texelFetch() cases
2855*35238bceSAndroid Build Coastguard Worker     // \note Level is constant across quad
2856*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec texelFetchCases[] = {
2857*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                MinCoord                            MaxCoord                        Bias?    MinLod    MaxLod    Offset?    Offset        Format                        EvalFunc                Flags
2858*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_fixed, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(255.9f, 255.9f, 0.0f, 0.0f),
2859*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex2DTexelFetchFixed, evalTexelFetch2D, BOTH),
2860*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_float, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(127.9f, 127.9f, 0.0f, 0.0f),
2861*35238bceSAndroid Build Coastguard Worker                   false, 1.0f, 1.0f, false, IVec3(0), tex2DTexelFetchFloat, evalTexelFetch2D, BOTH),
2862*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(63.9f, 63.9f, 0.0f, 0.0f), false,
2863*35238bceSAndroid Build Coastguard Worker                   2.0f, 2.0f, false, IVec3(0), tex2DTexelFetchInt, evalTexelFetch2D, BOTH),
2864*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(15.9f, 15.9f, 0.0f, 0.0f), false,
2865*35238bceSAndroid Build Coastguard Worker                   4.0f, 4.0f, false, IVec3(0), tex2DTexelFetchUint, evalTexelFetch2D, BOTH),
2866*35238bceSAndroid Build Coastguard Worker 
2867*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f),
2868*35238bceSAndroid Build Coastguard Worker                   Vec4(127.9f, 127.9f, 3.9f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayTexelFetchFixed,
2869*35238bceSAndroid Build Coastguard Worker                   evalTexelFetch2DArray, BOTH),
2870*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_float, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f),
2871*35238bceSAndroid Build Coastguard Worker                   Vec4(63.9f, 63.9f, 3.9f, 0.0f), false, 1.0f, 1.0f, false, IVec3(0), tex2DArrayTexelFetchFloat,
2872*35238bceSAndroid Build Coastguard Worker                   evalTexelFetch2DArray, BOTH),
2873*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(31.9f, 31.9f, 3.9f, 0.0f),
2874*35238bceSAndroid Build Coastguard Worker                   false, 2.0f, 2.0f, false, IVec3(0), tex2DArrayTexelFetchInt, evalTexelFetch2DArray, BOTH),
2875*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(15.9f, 15.9f, 3.9f, 0.0f),
2876*35238bceSAndroid Build Coastguard Worker                   false, 3.0f, 3.0f, false, IVec3(0), tex2DArrayTexelFetchUint, evalTexelFetch2DArray, BOTH),
2877*35238bceSAndroid Build Coastguard Worker 
2878*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(63.9f, 31.9f, 31.9f, 0.0f),
2879*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, false, IVec3(0), tex3DTexelFetchFixed, evalTexelFetch3D, BOTH),
2880*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(31.9f, 15.9f, 15.9f, 0.0f),
2881*35238bceSAndroid Build Coastguard Worker                   false, 1.0f, 1.0f, false, IVec3(0), tex3DTexelFetchFloat, evalTexelFetch3D, BOTH),
2882*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(15.9f, 7.9f, 7.9f, 0.0f), false,
2883*35238bceSAndroid Build Coastguard Worker                   2.0f, 2.0f, false, IVec3(0), tex3DTexelFetchInt, evalTexelFetch3D, BOTH),
2884*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(63.9f, 31.9f, 31.9f, 0.0f), false,
2885*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, false, IVec3(0), tex3DTexelFetchUint, evalTexelFetch3D, BOTH)};
2886*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "texelfetch", "texelFetch() Tests", texelFetchCases, DE_LENGTH_OF_ARRAY(texelFetchCases));
2887*35238bceSAndroid Build Coastguard Worker 
2888*35238bceSAndroid Build Coastguard Worker     // texelFetchOffset() cases
2889*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec texelFetchOffsetCases[] = {
2890*35238bceSAndroid Build Coastguard Worker         //          Name                            Function                MinCoord                            MaxCoord                        Bias?    MinLod    MaxLod    Offset?    Offset        Format                        EvalFunc                Flags
2891*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_fixed, FUNCTION_TEXELFETCH, Vec4(8.0f, -7.0f, 0.0f, 0.0f), Vec4(263.9f, 248.9f, 0.0f, 0.0f),
2892*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DTexelFetchFixed, evalTexelFetch2D, BOTH),
2893*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2d_float, FUNCTION_TEXELFETCH, Vec4(-7.0f, 8.0f, 0.0f, 0.0f), Vec4(120.9f, 135.9f, 0.0f, 0.0f),
2894*35238bceSAndroid Build Coastguard Worker                   false, 1.0f, 1.0f, true, IVec3(7, -8, 0), tex2DTexelFetchFloat, evalTexelFetch2D, BOTH),
2895*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2d, FUNCTION_TEXELFETCH, Vec4(8.0f, -7.0f, 0.0f, 0.0f), Vec4(71.9f, 56.9f, 0.0f, 0.0f), false,
2896*35238bceSAndroid Build Coastguard Worker                   2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DTexelFetchInt, evalTexelFetch2D, BOTH),
2897*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2d, FUNCTION_TEXELFETCH, Vec4(-7.0f, 8.0f, 0.0f, 0.0f), Vec4(8.9f, 23.9f, 0.0f, 0.0f), false,
2898*35238bceSAndroid Build Coastguard Worker                   4.0f, 4.0f, true, IVec3(7, -8, 0), tex2DTexelFetchUint, evalTexelFetch2D, BOTH),
2899*35238bceSAndroid Build Coastguard Worker 
2900*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXELFETCH, Vec4(8.0f, -7.0f, 0.0f, 0.0f),
2901*35238bceSAndroid Build Coastguard Worker                   Vec4(135.9f, 120.9f, 3.9f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayTexelFetchFixed,
2902*35238bceSAndroid Build Coastguard Worker                   evalTexelFetch2DArray, BOTH),
2903*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler2darray_float, FUNCTION_TEXELFETCH, Vec4(-7.0f, 8.0f, 0.0f, 0.0f),
2904*35238bceSAndroid Build Coastguard Worker                   Vec4(56.9f, 71.9f, 3.9f, 0.0f), false, 1.0f, 1.0f, true, IVec3(7, -8, 0), tex2DArrayTexelFetchFloat,
2905*35238bceSAndroid Build Coastguard Worker                   evalTexelFetch2DArray, BOTH),
2906*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler2darray, FUNCTION_TEXELFETCH, Vec4(8.0f, -7.0f, 0.0f, 0.0f), Vec4(39.9f, 24.9f, 3.9f, 0.0f),
2907*35238bceSAndroid Build Coastguard Worker                   false, 2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DArrayTexelFetchInt, evalTexelFetch2DArray, BOTH),
2908*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler2darray, FUNCTION_TEXELFETCH, Vec4(-7.0f, 8.0f, 0.0f, 0.0f), Vec4(8.9f, 23.9f, 3.9f, 0.0f),
2909*35238bceSAndroid Build Coastguard Worker                   false, 3.0f, 3.0f, true, IVec3(7, -8, 0), tex2DArrayTexelFetchUint, evalTexelFetch2DArray, BOTH),
2910*35238bceSAndroid Build Coastguard Worker 
2911*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_fixed, FUNCTION_TEXELFETCH, Vec4(8.0f, -7.0f, -3.0f, 0.0f), Vec4(71.9f, 24.9f, 28.9f, 0.0f),
2912*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DTexelFetchFixed, evalTexelFetch3D, BOTH),
2913*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(sampler3d_float, FUNCTION_TEXELFETCH, Vec4(-7.0f, -3.0f, 8.0f, 0.0f), Vec4(24.9f, 12.9f, 23.9f, 0.0f),
2914*35238bceSAndroid Build Coastguard Worker                   false, 1.0f, 1.0f, true, IVec3(7, 3, -8), tex3DTexelFetchFloat, evalTexelFetch3D, BOTH),
2915*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(isampler3d, FUNCTION_TEXELFETCH, Vec4(-3.0f, 8.0f, -7.0f, 0.0f), Vec4(12.9f, 15.9f, 0.9f, 0.0f),
2916*35238bceSAndroid Build Coastguard Worker                   false, 2.0f, 2.0f, true, IVec3(3, -8, 7), tex3DTexelFetchInt, evalTexelFetch3D, BOTH),
2917*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(usampler3d, FUNCTION_TEXELFETCH, Vec4(8.0f, -7.0f, -3.0f, 0.0f), Vec4(71.9f, 24.9f, 28.9f, 0.0f),
2918*35238bceSAndroid Build Coastguard Worker                   false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DTexelFetchUint, evalTexelFetch3D, BOTH)};
2919*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "texelfetchoffset", "texelFetchOffset() Tests", texelFetchOffsetCases,
2920*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(texelFetchOffsetCases));
2921*35238bceSAndroid Build Coastguard Worker 
2922*35238bceSAndroid Build Coastguard Worker     // textureSize() cases
2923*35238bceSAndroid Build Coastguard Worker     {
2924*35238bceSAndroid Build Coastguard Worker         struct TextureSizeCaseSpec
2925*35238bceSAndroid Build Coastguard Worker         {
2926*35238bceSAndroid Build Coastguard Worker             const char *name;
2927*35238bceSAndroid Build Coastguard Worker             const char *samplerName;
2928*35238bceSAndroid Build Coastguard Worker             TextureSpec textureSpec;
2929*35238bceSAndroid Build Coastguard Worker         } textureSizeCases[] = {
2930*35238bceSAndroid Build Coastguard Worker             {"sampler2d_fixed", "sampler2D", tex2DFixed},
2931*35238bceSAndroid Build Coastguard Worker             {"sampler2d_float", "sampler2D", tex2DFloat},
2932*35238bceSAndroid Build Coastguard Worker             {"isampler2d", "isampler2D", tex2DInt},
2933*35238bceSAndroid Build Coastguard Worker             {"usampler2d", "usampler2D", tex2DUint},
2934*35238bceSAndroid Build Coastguard Worker             {"sampler2dshadow", "sampler2DShadow", tex2DShadow},
2935*35238bceSAndroid Build Coastguard Worker             {"sampler3d_fixed", "sampler3D", tex3DFixed},
2936*35238bceSAndroid Build Coastguard Worker             {"sampler3d_float", "sampler3D", tex3DFloat},
2937*35238bceSAndroid Build Coastguard Worker             {"isampler3d", "isampler3D", tex3DInt},
2938*35238bceSAndroid Build Coastguard Worker             {"usampler3d", "usampler3D", tex3DUint},
2939*35238bceSAndroid Build Coastguard Worker             {"samplercube_fixed", "samplerCube", texCubeFixed},
2940*35238bceSAndroid Build Coastguard Worker             {"samplercube_float", "samplerCube", texCubeFloat},
2941*35238bceSAndroid Build Coastguard Worker             {"isamplercube", "isamplerCube", texCubeInt},
2942*35238bceSAndroid Build Coastguard Worker             {"usamplercube", "usamplerCube", texCubeUint},
2943*35238bceSAndroid Build Coastguard Worker             {"samplercubeshadow", "samplerCubeShadow", texCubeShadow},
2944*35238bceSAndroid Build Coastguard Worker             {"sampler2darray_fixed", "sampler2DArray", tex2DArrayFixed},
2945*35238bceSAndroid Build Coastguard Worker             {"sampler2darray_float", "sampler2DArray", tex2DArrayFloat},
2946*35238bceSAndroid Build Coastguard Worker             {"isampler2darray", "isampler2DArray", tex2DArrayInt},
2947*35238bceSAndroid Build Coastguard Worker             {"usampler2darray", "usampler2DArray", tex2DArrayUint},
2948*35238bceSAndroid Build Coastguard Worker             {"sampler2darrayshadow", "sampler2DArrayShadow", tex2DArrayShadow},
2949*35238bceSAndroid Build Coastguard Worker         };
2950*35238bceSAndroid Build Coastguard Worker 
2951*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *group = new tcu::TestCaseGroup(m_testCtx, "texturesize", "textureSize() Tests");
2952*35238bceSAndroid Build Coastguard Worker         addChild(group);
2953*35238bceSAndroid Build Coastguard Worker 
2954*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(textureSizeCases); ++ndx)
2955*35238bceSAndroid Build Coastguard Worker         {
2956*35238bceSAndroid Build Coastguard Worker             group->addChild(
2957*35238bceSAndroid Build Coastguard Worker                 new TextureSizeCase(m_context, (std::string(textureSizeCases[ndx].name) + "_vertex").c_str(), "",
2958*35238bceSAndroid Build Coastguard Worker                                     textureSizeCases[ndx].samplerName, textureSizeCases[ndx].textureSpec, true));
2959*35238bceSAndroid Build Coastguard Worker             group->addChild(
2960*35238bceSAndroid Build Coastguard Worker                 new TextureSizeCase(m_context, (std::string(textureSizeCases[ndx].name) + "_fragment").c_str(), "",
2961*35238bceSAndroid Build Coastguard Worker                                     textureSizeCases[ndx].samplerName, textureSizeCases[ndx].textureSpec, false));
2962*35238bceSAndroid Build Coastguard Worker         }
2963*35238bceSAndroid Build Coastguard Worker     }
2964*35238bceSAndroid Build Coastguard Worker 
2965*35238bceSAndroid Build Coastguard Worker     // Negative cases.
2966*35238bceSAndroid Build Coastguard Worker     {
2967*35238bceSAndroid Build Coastguard Worker         gls::ShaderLibrary library(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo());
2968*35238bceSAndroid Build Coastguard Worker         std::vector<tcu::TestNode *> negativeCases = library.loadShaderFile("shaders/invalid_texture_functions.test");
2969*35238bceSAndroid Build Coastguard Worker 
2970*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *group =
2971*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "invalid", "Invalid texture function usage", negativeCases);
2972*35238bceSAndroid Build Coastguard Worker         addChild(group);
2973*35238bceSAndroid Build Coastguard Worker     }
2974*35238bceSAndroid Build Coastguard Worker }
2975*35238bceSAndroid Build Coastguard Worker 
2976*35238bceSAndroid Build Coastguard Worker } // namespace Functional
2977*35238bceSAndroid Build Coastguard Worker } // namespace gles3
2978*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2979