xref: /aosp_15_r20/external/deqp/modules/gles2/functional/es2fShaderTextureFunctionTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 2.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 "es2fShaderTextureFunctionTests.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 "tcuTextureUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuMatrix.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuMatrixUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker #include <sstream>
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker namespace deqp
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace gles2
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace Functional
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker namespace
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker enum Function
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTURE = 0,  //!< texture(), textureOffset()
52*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJ,  //!< textureProj(), textureProjOffset()
53*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJ3, //!< textureProj(sampler2D, vec3)
54*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTURELOD,   // ...
55*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJLOD,
56*35238bceSAndroid Build Coastguard Worker     FUNCTION_TEXTUREPROJLOD3, //!< textureProjLod(sampler2D, vec3)
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker     FUNCTION_LAST
59*35238bceSAndroid Build Coastguard Worker };
60*35238bceSAndroid Build Coastguard Worker 
functionHasProj(Function function)61*35238bceSAndroid Build Coastguard Worker inline bool functionHasProj(Function function)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker     return function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJ3 ||
64*35238bceSAndroid Build Coastguard Worker            function == FUNCTION_TEXTUREPROJLOD || function == FUNCTION_TEXTUREPROJLOD3;
65*35238bceSAndroid Build Coastguard Worker }
66*35238bceSAndroid Build Coastguard Worker 
functionHasLod(Function function)67*35238bceSAndroid Build Coastguard Worker inline bool functionHasLod(Function function)
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker     return function == FUNCTION_TEXTURELOD || function == FUNCTION_TEXTUREPROJLOD ||
70*35238bceSAndroid Build Coastguard Worker            function == FUNCTION_TEXTUREPROJLOD3;
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker 
73*35238bceSAndroid Build Coastguard Worker struct TextureLookupSpec
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker     Function function;
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 minCoord;
78*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 maxCoord;
79*35238bceSAndroid Build Coastguard Worker 
80*35238bceSAndroid Build Coastguard Worker     // Bias
81*35238bceSAndroid Build Coastguard Worker     bool useBias;
82*35238bceSAndroid Build Coastguard Worker 
83*35238bceSAndroid Build Coastguard Worker     // Bias or Lod for *Lod* functions
84*35238bceSAndroid Build Coastguard Worker     float minLodBias;
85*35238bceSAndroid Build Coastguard Worker     float maxLodBias;
86*35238bceSAndroid Build Coastguard Worker 
TextureLookupSpecdeqp::gles2::Functional::__anone1ab98580111::TextureLookupSpec87*35238bceSAndroid Build Coastguard Worker     TextureLookupSpec(void)
88*35238bceSAndroid Build Coastguard Worker         : function(FUNCTION_LAST)
89*35238bceSAndroid Build Coastguard Worker         , minCoord(0.0f)
90*35238bceSAndroid Build Coastguard Worker         , maxCoord(1.0f)
91*35238bceSAndroid Build Coastguard Worker         , useBias(false)
92*35238bceSAndroid Build Coastguard Worker         , minLodBias(0.0f)
93*35238bceSAndroid Build Coastguard Worker         , maxLodBias(0.0f)
94*35238bceSAndroid Build Coastguard Worker     {
95*35238bceSAndroid Build Coastguard Worker     }
96*35238bceSAndroid Build Coastguard Worker 
TextureLookupSpecdeqp::gles2::Functional::__anone1ab98580111::TextureLookupSpec97*35238bceSAndroid Build Coastguard Worker     TextureLookupSpec(Function function_, const tcu::Vec4 &minCoord_, const tcu::Vec4 &maxCoord_, bool useBias_,
98*35238bceSAndroid Build Coastguard Worker                       float minLodBias_, float maxLodBias_)
99*35238bceSAndroid Build Coastguard Worker         : function(function_)
100*35238bceSAndroid Build Coastguard Worker         , minCoord(minCoord_)
101*35238bceSAndroid Build Coastguard Worker         , maxCoord(maxCoord_)
102*35238bceSAndroid Build Coastguard Worker         , useBias(useBias_)
103*35238bceSAndroid Build Coastguard Worker         , minLodBias(minLodBias_)
104*35238bceSAndroid Build Coastguard Worker         , maxLodBias(maxLodBias_)
105*35238bceSAndroid Build Coastguard Worker     {
106*35238bceSAndroid Build Coastguard Worker     }
107*35238bceSAndroid Build Coastguard Worker };
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker enum TextureType
110*35238bceSAndroid Build Coastguard Worker {
111*35238bceSAndroid Build Coastguard Worker     TEXTURETYPE_2D,
112*35238bceSAndroid Build Coastguard Worker     TEXTURETYPE_CUBE_MAP,
113*35238bceSAndroid Build Coastguard Worker 
114*35238bceSAndroid Build Coastguard Worker     TEXTURETYPE_LAST
115*35238bceSAndroid Build Coastguard Worker };
116*35238bceSAndroid Build Coastguard Worker 
117*35238bceSAndroid Build Coastguard Worker struct TextureSpec
118*35238bceSAndroid Build Coastguard Worker {
119*35238bceSAndroid Build Coastguard Worker     TextureType type; //!< Texture type (2D, cubemap, ...)
120*35238bceSAndroid Build Coastguard Worker     uint32_t format;
121*35238bceSAndroid Build Coastguard Worker     uint32_t dataType;
122*35238bceSAndroid Build Coastguard Worker     int width;
123*35238bceSAndroid Build Coastguard Worker     int height;
124*35238bceSAndroid Build Coastguard Worker     int numLevels;
125*35238bceSAndroid Build Coastguard Worker     tcu::Sampler sampler;
126*35238bceSAndroid Build Coastguard Worker 
TextureSpecdeqp::gles2::Functional::__anone1ab98580111::TextureSpec127*35238bceSAndroid Build Coastguard Worker     TextureSpec(void) : type(TEXTURETYPE_LAST), format(GL_NONE), dataType(GL_NONE), width(0), height(0), numLevels(0)
128*35238bceSAndroid Build Coastguard Worker     {
129*35238bceSAndroid Build Coastguard Worker     }
130*35238bceSAndroid Build Coastguard Worker 
TextureSpecdeqp::gles2::Functional::__anone1ab98580111::TextureSpec131*35238bceSAndroid Build Coastguard Worker     TextureSpec(TextureType type_, uint32_t format_, uint32_t dataType_, int width_, int height_, int numLevels_,
132*35238bceSAndroid Build Coastguard Worker                 const tcu::Sampler &sampler_)
133*35238bceSAndroid Build Coastguard Worker         : type(type_)
134*35238bceSAndroid Build Coastguard Worker         , format(format_)
135*35238bceSAndroid Build Coastguard Worker         , dataType(dataType_)
136*35238bceSAndroid Build Coastguard Worker         , width(width_)
137*35238bceSAndroid Build Coastguard Worker         , height(height_)
138*35238bceSAndroid Build Coastguard Worker         , numLevels(numLevels_)
139*35238bceSAndroid Build Coastguard Worker         , sampler(sampler_)
140*35238bceSAndroid Build Coastguard Worker     {
141*35238bceSAndroid Build Coastguard Worker     }
142*35238bceSAndroid Build Coastguard Worker };
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker struct TexLookupParams
145*35238bceSAndroid Build Coastguard Worker {
146*35238bceSAndroid Build Coastguard Worker     float lod;
147*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 scale;
148*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 bias;
149*35238bceSAndroid Build Coastguard Worker 
TexLookupParamsdeqp::gles2::Functional::__anone1ab98580111::TexLookupParams150*35238bceSAndroid Build Coastguard Worker     TexLookupParams(void) : lod(0.0f), scale(1.0f), bias(0.0f)
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 } // namespace
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker using tcu::IVec2;
158*35238bceSAndroid Build Coastguard Worker using tcu::IVec3;
159*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
160*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
161*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
162*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
163*35238bceSAndroid Build Coastguard Worker 
164*35238bceSAndroid Build Coastguard Worker typedef void (*TexEvalFunc)(gls::ShaderEvalContext &c, const TexLookupParams &lookupParams);
165*35238bceSAndroid Build Coastguard Worker 
texture2D(const gls::ShaderEvalContext & c,float s,float t,float lod)166*35238bceSAndroid Build Coastguard Worker inline Vec4 texture2D(const gls::ShaderEvalContext &c, float s, float t, float lod)
167*35238bceSAndroid Build Coastguard Worker {
168*35238bceSAndroid Build Coastguard Worker     return c.textures[0].tex2D->sample(c.textures[0].sampler, s, t, lod);
169*35238bceSAndroid Build Coastguard Worker }
textureCube(const gls::ShaderEvalContext & c,float s,float t,float r,float lod)170*35238bceSAndroid Build Coastguard Worker inline Vec4 textureCube(const gls::ShaderEvalContext &c, float s, float t, float r, float lod)
171*35238bceSAndroid Build Coastguard Worker {
172*35238bceSAndroid Build Coastguard Worker     return c.textures[0].texCube->sample(c.textures[0].sampler, s, t, r, lod);
173*35238bceSAndroid Build Coastguard Worker }
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker // Eval functions.
evalTexture2D(gls::ShaderEvalContext & c,const TexLookupParams & p)176*35238bceSAndroid Build Coastguard Worker static void evalTexture2D(gls::ShaderEvalContext &c, const TexLookupParams &p)
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x(), c.in[0].y(), p.lod) * p.scale + p.bias;
179*35238bceSAndroid Build Coastguard Worker }
evalTextureCube(gls::ShaderEvalContext & c,const TexLookupParams & p)180*35238bceSAndroid Build Coastguard Worker static void evalTextureCube(gls::ShaderEvalContext &c, const TexLookupParams &p)
181*35238bceSAndroid Build Coastguard Worker {
182*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;
183*35238bceSAndroid Build Coastguard Worker }
184*35238bceSAndroid Build Coastguard Worker 
evalTexture2DBias(gls::ShaderEvalContext & c,const TexLookupParams & p)185*35238bceSAndroid Build Coastguard Worker static void evalTexture2DBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
186*35238bceSAndroid Build Coastguard Worker {
187*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;
188*35238bceSAndroid Build Coastguard Worker }
evalTextureCubeBias(gls::ShaderEvalContext & c,const TexLookupParams & p)189*35238bceSAndroid Build Coastguard Worker static void evalTextureCubeBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
190*35238bceSAndroid Build Coastguard Worker {
191*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;
192*35238bceSAndroid Build Coastguard Worker }
193*35238bceSAndroid Build Coastguard Worker 
evalTexture2DProj3(gls::ShaderEvalContext & c,const TexLookupParams & p)194*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProj3(gls::ShaderEvalContext &c, const TexLookupParams &p)
195*35238bceSAndroid Build Coastguard Worker {
196*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;
197*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProj3Bias(gls::ShaderEvalContext & c,const TexLookupParams & p)198*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProj3Bias(gls::ShaderEvalContext &c, const TexLookupParams &p)
199*35238bceSAndroid Build Coastguard Worker {
200*35238bceSAndroid Build Coastguard Worker     c.color =
201*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;
202*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProj(gls::ShaderEvalContext & c,const TexLookupParams & p)203*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProj(gls::ShaderEvalContext &c, const TexLookupParams &p)
204*35238bceSAndroid Build Coastguard Worker {
205*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;
206*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjBias(gls::ShaderEvalContext & c,const TexLookupParams & p)207*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjBias(gls::ShaderEvalContext &c, const TexLookupParams &p)
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker     c.color =
210*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;
211*35238bceSAndroid Build Coastguard Worker }
212*35238bceSAndroid Build Coastguard Worker 
evalTexture2DLod(gls::ShaderEvalContext & c,const TexLookupParams & p)213*35238bceSAndroid Build Coastguard Worker static void evalTexture2DLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
214*35238bceSAndroid Build Coastguard Worker {
215*35238bceSAndroid Build Coastguard Worker     c.color = texture2D(c, c.in[0].x(), c.in[0].y(), c.in[1].x()) * p.scale + p.bias;
216*35238bceSAndroid Build Coastguard Worker }
evalTextureCubeLod(gls::ShaderEvalContext & c,const TexLookupParams & p)217*35238bceSAndroid Build Coastguard Worker static void evalTextureCubeLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
218*35238bceSAndroid Build Coastguard Worker {
219*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;
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker 
evalTexture2DProjLod3(gls::ShaderEvalContext & c,const TexLookupParams & p)222*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjLod3(gls::ShaderEvalContext &c, const TexLookupParams &p)
223*35238bceSAndroid Build Coastguard Worker {
224*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;
225*35238bceSAndroid Build Coastguard Worker }
evalTexture2DProjLod(gls::ShaderEvalContext & c,const TexLookupParams & p)226*35238bceSAndroid Build Coastguard Worker static void evalTexture2DProjLod(gls::ShaderEvalContext &c, const TexLookupParams &p)
227*35238bceSAndroid Build Coastguard Worker {
228*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;
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker 
231*35238bceSAndroid Build Coastguard Worker class TexLookupEvaluator : public gls::ShaderEvaluator
232*35238bceSAndroid Build Coastguard Worker {
233*35238bceSAndroid Build Coastguard Worker public:
TexLookupEvaluator(TexEvalFunc evalFunc,const TexLookupParams & lookupParams)234*35238bceSAndroid Build Coastguard Worker     TexLookupEvaluator(TexEvalFunc evalFunc, const TexLookupParams &lookupParams)
235*35238bceSAndroid Build Coastguard Worker         : m_evalFunc(evalFunc)
236*35238bceSAndroid Build Coastguard Worker         , m_lookupParams(lookupParams)
237*35238bceSAndroid Build Coastguard Worker     {
238*35238bceSAndroid Build Coastguard Worker     }
239*35238bceSAndroid Build Coastguard Worker 
evaluate(gls::ShaderEvalContext & ctx)240*35238bceSAndroid Build Coastguard Worker     virtual void evaluate(gls::ShaderEvalContext &ctx)
241*35238bceSAndroid Build Coastguard Worker     {
242*35238bceSAndroid Build Coastguard Worker         m_evalFunc(ctx, m_lookupParams);
243*35238bceSAndroid Build Coastguard Worker     }
244*35238bceSAndroid Build Coastguard Worker 
245*35238bceSAndroid Build Coastguard Worker private:
246*35238bceSAndroid Build Coastguard Worker     TexEvalFunc m_evalFunc;
247*35238bceSAndroid Build Coastguard Worker     const TexLookupParams &m_lookupParams;
248*35238bceSAndroid Build Coastguard Worker };
249*35238bceSAndroid Build Coastguard Worker 
250*35238bceSAndroid Build Coastguard Worker class ShaderTextureFunctionCase : public gls::ShaderRenderCase
251*35238bceSAndroid Build Coastguard Worker {
252*35238bceSAndroid Build Coastguard Worker public:
253*35238bceSAndroid Build Coastguard Worker     ShaderTextureFunctionCase(Context &context, const char *name, const char *desc, const TextureLookupSpec &lookup,
254*35238bceSAndroid Build Coastguard Worker                               const TextureSpec &texture, TexEvalFunc evalFunc, bool isVertexCase);
255*35238bceSAndroid Build Coastguard Worker     ~ShaderTextureFunctionCase(void);
256*35238bceSAndroid Build Coastguard Worker 
257*35238bceSAndroid Build Coastguard Worker     void init(void);
258*35238bceSAndroid Build Coastguard Worker     void deinit(void);
259*35238bceSAndroid Build Coastguard Worker 
260*35238bceSAndroid Build Coastguard Worker protected:
261*35238bceSAndroid Build Coastguard Worker     void setupUniforms(int programID, const tcu::Vec4 &constCoords);
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker private:
264*35238bceSAndroid Build Coastguard Worker     void initTexture(void);
265*35238bceSAndroid Build Coastguard Worker     void initShaderSources(void);
266*35238bceSAndroid Build Coastguard Worker 
267*35238bceSAndroid Build Coastguard Worker     TextureLookupSpec m_lookupSpec;
268*35238bceSAndroid Build Coastguard Worker     TextureSpec m_textureSpec;
269*35238bceSAndroid Build Coastguard Worker 
270*35238bceSAndroid Build Coastguard Worker     TexLookupParams m_lookupParams;
271*35238bceSAndroid Build Coastguard Worker     TexLookupEvaluator m_evaluator;
272*35238bceSAndroid Build Coastguard Worker 
273*35238bceSAndroid Build Coastguard Worker     glu::Texture2D *m_texture2D;
274*35238bceSAndroid Build Coastguard Worker     glu::TextureCube *m_textureCube;
275*35238bceSAndroid Build Coastguard Worker };
276*35238bceSAndroid Build Coastguard Worker 
ShaderTextureFunctionCase(Context & context,const char * name,const char * desc,const TextureLookupSpec & lookup,const TextureSpec & texture,TexEvalFunc evalFunc,bool isVertexCase)277*35238bceSAndroid Build Coastguard Worker ShaderTextureFunctionCase::ShaderTextureFunctionCase(Context &context, const char *name, const char *desc,
278*35238bceSAndroid Build Coastguard Worker                                                      const TextureLookupSpec &lookup, const TextureSpec &texture,
279*35238bceSAndroid Build Coastguard Worker                                                      TexEvalFunc evalFunc, bool isVertexCase)
280*35238bceSAndroid Build Coastguard Worker     : gls::ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc,
281*35238bceSAndroid Build Coastguard Worker                             isVertexCase, m_evaluator)
282*35238bceSAndroid Build Coastguard Worker     , m_lookupSpec(lookup)
283*35238bceSAndroid Build Coastguard Worker     , m_textureSpec(texture)
284*35238bceSAndroid Build Coastguard Worker     , m_evaluator(evalFunc, m_lookupParams)
285*35238bceSAndroid Build Coastguard Worker     , m_texture2D(DE_NULL)
286*35238bceSAndroid Build Coastguard Worker     , m_textureCube(DE_NULL)
287*35238bceSAndroid Build Coastguard Worker {
288*35238bceSAndroid Build Coastguard Worker }
289*35238bceSAndroid Build Coastguard Worker 
~ShaderTextureFunctionCase(void)290*35238bceSAndroid Build Coastguard Worker ShaderTextureFunctionCase::~ShaderTextureFunctionCase(void)
291*35238bceSAndroid Build Coastguard Worker {
292*35238bceSAndroid Build Coastguard Worker     delete m_texture2D;
293*35238bceSAndroid Build Coastguard Worker     delete m_textureCube;
294*35238bceSAndroid Build Coastguard Worker }
295*35238bceSAndroid Build Coastguard Worker 
init(void)296*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::init(void)
297*35238bceSAndroid Build Coastguard Worker {
298*35238bceSAndroid Build Coastguard Worker     if (m_isVertexCase)
299*35238bceSAndroid Build Coastguard Worker     {
300*35238bceSAndroid Build Coastguard Worker         const glw::Functions &gl = m_renderCtx.getFunctions();
301*35238bceSAndroid Build Coastguard Worker         int numVertexUnits       = 0;
302*35238bceSAndroid Build Coastguard Worker         gl.getIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &numVertexUnits);
303*35238bceSAndroid Build Coastguard Worker         if (numVertexUnits < 1)
304*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError("Vertex shader texture access is not supported");
305*35238bceSAndroid Build Coastguard Worker     }
306*35238bceSAndroid Build Coastguard Worker 
307*35238bceSAndroid Build Coastguard Worker     {
308*35238bceSAndroid Build Coastguard Worker         // Base coord scale & bias
309*35238bceSAndroid Build Coastguard Worker         Vec4 s = m_lookupSpec.maxCoord - m_lookupSpec.minCoord;
310*35238bceSAndroid Build Coastguard Worker         Vec4 b = m_lookupSpec.minCoord;
311*35238bceSAndroid Build Coastguard Worker 
312*35238bceSAndroid Build Coastguard Worker         float baseCoordTrans[] = {s.x(),        0.0f,         0.f, b.x(),
313*35238bceSAndroid Build Coastguard Worker                                   0.f,          s.y(),        0.f, b.y(),
314*35238bceSAndroid Build Coastguard Worker                                   s.z() / 2.f,  -s.z() / 2.f, 0.f, s.z() / 2.f + b.z(),
315*35238bceSAndroid Build Coastguard Worker                                   -s.w() / 2.f, s.w() / 2.f,  0.f, s.w() / 2.f + b.w()};
316*35238bceSAndroid Build Coastguard Worker 
317*35238bceSAndroid Build Coastguard Worker         m_userAttribTransforms.push_back(tcu::Mat4(baseCoordTrans));
318*35238bceSAndroid Build Coastguard Worker     }
319*35238bceSAndroid Build Coastguard Worker 
320*35238bceSAndroid Build Coastguard Worker     if (functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias)
321*35238bceSAndroid Build Coastguard Worker     {
322*35238bceSAndroid Build Coastguard Worker         float s               = m_lookupSpec.maxLodBias - m_lookupSpec.minLodBias;
323*35238bceSAndroid Build Coastguard Worker         float b               = m_lookupSpec.minLodBias;
324*35238bceSAndroid Build Coastguard Worker         float lodCoordTrans[] = {s / 2.0f, s / 2.0f, 0.f,  b,    0.0f, 0.0f, 0.0f, 0.0f,
325*35238bceSAndroid Build Coastguard Worker                                  0.0f,     0.0f,     0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
326*35238bceSAndroid Build Coastguard Worker 
327*35238bceSAndroid Build Coastguard Worker         m_userAttribTransforms.push_back(tcu::Mat4(lodCoordTrans));
328*35238bceSAndroid Build Coastguard Worker     }
329*35238bceSAndroid Build Coastguard Worker 
330*35238bceSAndroid Build Coastguard Worker     initShaderSources();
331*35238bceSAndroid Build Coastguard Worker     initTexture();
332*35238bceSAndroid Build Coastguard Worker 
333*35238bceSAndroid Build Coastguard Worker     gls::ShaderRenderCase::init();
334*35238bceSAndroid Build Coastguard Worker }
335*35238bceSAndroid Build Coastguard Worker 
initTexture(void)336*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::initTexture(void)
337*35238bceSAndroid Build Coastguard Worker {
338*35238bceSAndroid Build Coastguard Worker     static const IVec4 texCubeSwz[] = {IVec4(0, 0, 1, 1), IVec4(1, 1, 0, 0), IVec4(0, 1, 0, 1),
339*35238bceSAndroid Build Coastguard Worker                                        IVec4(1, 0, 1, 0), IVec4(0, 1, 1, 0), IVec4(1, 0, 0, 1)};
340*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(texCubeSwz) == tcu::CUBEFACE_LAST);
341*35238bceSAndroid Build Coastguard Worker 
342*35238bceSAndroid Build Coastguard Worker     tcu::TextureFormat texFmt      = glu::mapGLTransferFormat(m_textureSpec.format, m_textureSpec.dataType);
343*35238bceSAndroid Build Coastguard Worker     tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFmt);
344*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 viewportSize        = getViewportSize();
345*35238bceSAndroid Build Coastguard Worker     bool useProj                   = functionHasProj(m_lookupSpec.function) && !functionHasLod(m_lookupSpec.function);
346*35238bceSAndroid Build Coastguard Worker     float proj = useProj ? 1.0f / m_lookupSpec.minCoord[m_lookupSpec.function == FUNCTION_TEXTUREPROJ3 ? 2 : 3] : 1.0f;
347*35238bceSAndroid Build Coastguard Worker 
348*35238bceSAndroid Build Coastguard Worker     switch (m_textureSpec.type)
349*35238bceSAndroid Build Coastguard Worker     {
350*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_2D:
351*35238bceSAndroid Build Coastguard Worker     {
352*35238bceSAndroid Build Coastguard Worker         float cStep      = 1.0f / (float)de::max(1, m_textureSpec.numLevels - 1);
353*35238bceSAndroid Build Coastguard Worker         Vec4 cScale      = fmtInfo.valueMax - fmtInfo.valueMin;
354*35238bceSAndroid Build Coastguard Worker         Vec4 cBias       = fmtInfo.valueMin;
355*35238bceSAndroid Build Coastguard Worker         int baseCellSize = de::min(m_textureSpec.width / 4, m_textureSpec.height / 4);
356*35238bceSAndroid Build Coastguard Worker 
357*35238bceSAndroid Build Coastguard Worker         m_texture2D = new glu::Texture2D(m_renderCtx, m_textureSpec.format, m_textureSpec.dataType, m_textureSpec.width,
358*35238bceSAndroid Build Coastguard Worker                                          m_textureSpec.height);
359*35238bceSAndroid Build Coastguard Worker         for (int level = 0; level < m_textureSpec.numLevels; level++)
360*35238bceSAndroid Build Coastguard Worker         {
361*35238bceSAndroid Build Coastguard Worker             float fA    = float(level) * cStep;
362*35238bceSAndroid Build Coastguard Worker             float fB    = 1.0f - fA;
363*35238bceSAndroid Build Coastguard Worker             Vec4 colorA = cBias + cScale * Vec4(fA, fB, fA, fB);
364*35238bceSAndroid Build Coastguard Worker             Vec4 colorB = cBias + cScale * Vec4(fB, fA, fB, fA);
365*35238bceSAndroid Build Coastguard Worker 
366*35238bceSAndroid Build Coastguard Worker             m_texture2D->getRefTexture().allocLevel(level);
367*35238bceSAndroid Build Coastguard Worker             tcu::fillWithGrid(m_texture2D->getRefTexture().getLevel(level), de::max(1, baseCellSize >> level), colorA,
368*35238bceSAndroid Build Coastguard Worker                               colorB);
369*35238bceSAndroid Build Coastguard Worker         }
370*35238bceSAndroid Build Coastguard Worker         m_texture2D->upload();
371*35238bceSAndroid Build Coastguard Worker 
372*35238bceSAndroid Build Coastguard Worker         // Compute LOD.
373*35238bceSAndroid Build Coastguard Worker         float dudx = (m_lookupSpec.maxCoord[0] - m_lookupSpec.minCoord[0]) * proj * (float)m_textureSpec.width /
374*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[0];
375*35238bceSAndroid Build Coastguard Worker         float dvdy = (m_lookupSpec.maxCoord[1] - m_lookupSpec.minCoord[1]) * proj * (float)m_textureSpec.height /
376*35238bceSAndroid Build Coastguard Worker                      (float)viewportSize[1];
377*35238bceSAndroid Build Coastguard Worker         m_lookupParams.lod =
378*35238bceSAndroid Build Coastguard Worker             glu::TextureTestUtil::computeLodFromDerivates(glu::TextureTestUtil::LODMODE_EXACT, dudx, 0.0f, 0.0f, dvdy);
379*35238bceSAndroid Build Coastguard Worker 
380*35238bceSAndroid Build Coastguard Worker         // Append to texture list.
381*35238bceSAndroid Build Coastguard Worker         m_textures.push_back(gls::TextureBinding(m_texture2D, m_textureSpec.sampler));
382*35238bceSAndroid Build Coastguard Worker         break;
383*35238bceSAndroid Build Coastguard Worker     }
384*35238bceSAndroid Build Coastguard Worker 
385*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_CUBE_MAP:
386*35238bceSAndroid Build Coastguard Worker     {
387*35238bceSAndroid Build Coastguard Worker         float cStep      = 1.0f / (float)de::max(1, m_textureSpec.numLevels - 1);
388*35238bceSAndroid Build Coastguard Worker         Vec4 cScale      = fmtInfo.valueMax - fmtInfo.valueMin;
389*35238bceSAndroid Build Coastguard Worker         Vec4 cBias       = fmtInfo.valueMin;
390*35238bceSAndroid Build Coastguard Worker         int baseCellSize = de::min(m_textureSpec.width / 4, m_textureSpec.height / 4);
391*35238bceSAndroid Build Coastguard Worker 
392*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(m_textureSpec.width == m_textureSpec.height);
393*35238bceSAndroid Build Coastguard Worker         m_textureCube =
394*35238bceSAndroid Build Coastguard Worker             new glu::TextureCube(m_renderCtx, m_textureSpec.format, m_textureSpec.dataType, m_textureSpec.width);
395*35238bceSAndroid Build Coastguard Worker         for (int level = 0; level < m_textureSpec.numLevels; level++)
396*35238bceSAndroid Build Coastguard Worker         {
397*35238bceSAndroid Build Coastguard Worker             float fA = float(level) * cStep;
398*35238bceSAndroid Build Coastguard Worker             float fB = 1.0f - fA;
399*35238bceSAndroid Build Coastguard Worker             Vec2 f(fA, fB);
400*35238bceSAndroid Build Coastguard Worker 
401*35238bceSAndroid Build Coastguard Worker             for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
402*35238bceSAndroid Build Coastguard Worker             {
403*35238bceSAndroid Build Coastguard Worker                 const IVec4 &swzA = texCubeSwz[face];
404*35238bceSAndroid Build Coastguard Worker                 IVec4 swzB        = 1 - swzA;
405*35238bceSAndroid Build Coastguard Worker                 Vec4 colorA       = cBias + cScale * f.swizzle(swzA[0], swzA[1], swzA[2], swzA[3]);
406*35238bceSAndroid Build Coastguard Worker                 Vec4 colorB       = cBias + cScale * f.swizzle(swzB[0], swzB[1], swzB[2], swzB[3]);
407*35238bceSAndroid Build Coastguard Worker 
408*35238bceSAndroid Build Coastguard Worker                 m_textureCube->getRefTexture().allocLevel((tcu::CubeFace)face, level);
409*35238bceSAndroid Build Coastguard Worker                 tcu::fillWithGrid(m_textureCube->getRefTexture().getLevelFace(level, (tcu::CubeFace)face),
410*35238bceSAndroid Build Coastguard Worker                                   de::max(1, baseCellSize >> level), colorA, colorB);
411*35238bceSAndroid Build Coastguard Worker             }
412*35238bceSAndroid Build Coastguard Worker         }
413*35238bceSAndroid Build Coastguard Worker         m_textureCube->upload();
414*35238bceSAndroid Build Coastguard Worker 
415*35238bceSAndroid Build Coastguard Worker         // Compute LOD \note Assumes that only single side is accessed and R is constant major axis.
416*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::abs(m_lookupSpec.minCoord[2] - m_lookupSpec.maxCoord[2]) < 0.005);
417*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::abs(m_lookupSpec.minCoord[0]) < de::abs(m_lookupSpec.minCoord[2]) &&
418*35238bceSAndroid Build Coastguard Worker                   de::abs(m_lookupSpec.maxCoord[0]) < de::abs(m_lookupSpec.minCoord[2]));
419*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::abs(m_lookupSpec.minCoord[1]) < de::abs(m_lookupSpec.minCoord[2]) &&
420*35238bceSAndroid Build Coastguard Worker                   de::abs(m_lookupSpec.maxCoord[1]) < de::abs(m_lookupSpec.minCoord[2]));
421*35238bceSAndroid Build Coastguard Worker 
422*35238bceSAndroid Build Coastguard Worker         tcu::CubeFaceFloatCoords c00 = tcu::getCubeFaceCoords(
423*35238bceSAndroid Build Coastguard Worker             Vec3(m_lookupSpec.minCoord[0] * proj, m_lookupSpec.minCoord[1] * proj, m_lookupSpec.minCoord[2] * proj));
424*35238bceSAndroid Build Coastguard Worker         tcu::CubeFaceFloatCoords c10 = tcu::getCubeFaceCoords(
425*35238bceSAndroid Build Coastguard Worker             Vec3(m_lookupSpec.maxCoord[0] * proj, m_lookupSpec.minCoord[1] * proj, m_lookupSpec.minCoord[2] * proj));
426*35238bceSAndroid Build Coastguard Worker         tcu::CubeFaceFloatCoords c01 = tcu::getCubeFaceCoords(
427*35238bceSAndroid Build Coastguard Worker             Vec3(m_lookupSpec.minCoord[0] * proj, m_lookupSpec.maxCoord[1] * proj, m_lookupSpec.minCoord[2] * proj));
428*35238bceSAndroid Build Coastguard Worker         float dudx = (c10.s - c00.s) * (float)m_textureSpec.width / (float)viewportSize[0];
429*35238bceSAndroid Build Coastguard Worker         float dvdy = (c01.t - c00.t) * (float)m_textureSpec.height / (float)viewportSize[1];
430*35238bceSAndroid Build Coastguard Worker 
431*35238bceSAndroid Build Coastguard Worker         m_lookupParams.lod =
432*35238bceSAndroid Build Coastguard Worker             glu::TextureTestUtil::computeLodFromDerivates(glu::TextureTestUtil::LODMODE_EXACT, dudx, 0.0f, 0.0f, dvdy);
433*35238bceSAndroid Build Coastguard Worker 
434*35238bceSAndroid Build Coastguard Worker         m_textures.push_back(gls::TextureBinding(m_textureCube, m_textureSpec.sampler));
435*35238bceSAndroid Build Coastguard Worker         break;
436*35238bceSAndroid Build Coastguard Worker     }
437*35238bceSAndroid Build Coastguard Worker 
438*35238bceSAndroid Build Coastguard Worker     default:
439*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
440*35238bceSAndroid Build Coastguard Worker     }
441*35238bceSAndroid Build Coastguard Worker 
442*35238bceSAndroid Build Coastguard Worker     // Set lookup scale & bias
443*35238bceSAndroid Build Coastguard Worker     m_lookupParams.scale = fmtInfo.lookupScale;
444*35238bceSAndroid Build Coastguard Worker     m_lookupParams.bias  = fmtInfo.lookupBias;
445*35238bceSAndroid Build Coastguard Worker }
446*35238bceSAndroid Build Coastguard Worker 
initShaderSources(void)447*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::initShaderSources(void)
448*35238bceSAndroid Build Coastguard Worker {
449*35238bceSAndroid Build Coastguard Worker     Function function = m_lookupSpec.function;
450*35238bceSAndroid Build Coastguard Worker     bool isVtxCase    = m_isVertexCase;
451*35238bceSAndroid Build Coastguard Worker     bool isProj       = functionHasProj(function);
452*35238bceSAndroid Build Coastguard Worker     bool is2DProj4    = m_textureSpec.type == TEXTURETYPE_2D &&
453*35238bceSAndroid Build Coastguard Worker                      (function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJLOD);
454*35238bceSAndroid Build Coastguard Worker     bool hasLodBias           = functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias;
455*35238bceSAndroid Build Coastguard Worker     int texCoordComps         = m_textureSpec.type == TEXTURETYPE_2D ? 2 : 3;
456*35238bceSAndroid Build Coastguard Worker     int extraCoordComps       = isProj ? (is2DProj4 ? 2 : 1) : 0;
457*35238bceSAndroid Build Coastguard Worker     glu::DataType coordType   = glu::getDataTypeFloatVec(texCoordComps + extraCoordComps);
458*35238bceSAndroid Build Coastguard Worker     glu::Precision coordPrec  = glu::PRECISION_MEDIUMP;
459*35238bceSAndroid Build Coastguard Worker     const char *coordTypeName = glu::getDataTypeName(coordType);
460*35238bceSAndroid Build Coastguard Worker     const char *coordPrecName = glu::getPrecisionName(coordPrec);
461*35238bceSAndroid Build Coastguard Worker     tcu::TextureFormat texFmt = glu::mapGLTransferFormat(m_textureSpec.format, m_textureSpec.dataType);
462*35238bceSAndroid Build Coastguard Worker     glu::DataType samplerType = glu::TYPE_LAST;
463*35238bceSAndroid Build Coastguard Worker     const char *baseFuncName  = m_textureSpec.type == TEXTURETYPE_2D ? "texture2D" : "textureCube";
464*35238bceSAndroid Build Coastguard Worker     const char *funcExt       = DE_NULL;
465*35238bceSAndroid Build Coastguard Worker 
466*35238bceSAndroid Build Coastguard Worker     switch (m_textureSpec.type)
467*35238bceSAndroid Build Coastguard Worker     {
468*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_2D:
469*35238bceSAndroid Build Coastguard Worker         samplerType = glu::getSampler2DType(texFmt);
470*35238bceSAndroid Build Coastguard Worker         break;
471*35238bceSAndroid Build Coastguard Worker     case TEXTURETYPE_CUBE_MAP:
472*35238bceSAndroid Build Coastguard Worker         samplerType = glu::getSamplerCubeType(texFmt);
473*35238bceSAndroid Build Coastguard Worker         break;
474*35238bceSAndroid Build Coastguard Worker     default:
475*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
476*35238bceSAndroid Build Coastguard Worker     }
477*35238bceSAndroid Build Coastguard Worker 
478*35238bceSAndroid Build Coastguard Worker     switch (m_lookupSpec.function)
479*35238bceSAndroid Build Coastguard Worker     {
480*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTURE:
481*35238bceSAndroid Build Coastguard Worker         funcExt = "";
482*35238bceSAndroid Build Coastguard Worker         break;
483*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJ:
484*35238bceSAndroid Build Coastguard Worker         funcExt = "Proj";
485*35238bceSAndroid Build Coastguard Worker         break;
486*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJ3:
487*35238bceSAndroid Build Coastguard Worker         funcExt = "Proj";
488*35238bceSAndroid Build Coastguard Worker         break;
489*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTURELOD:
490*35238bceSAndroid Build Coastguard Worker         funcExt = "Lod";
491*35238bceSAndroid Build Coastguard Worker         break;
492*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJLOD:
493*35238bceSAndroid Build Coastguard Worker         funcExt = "ProjLod";
494*35238bceSAndroid Build Coastguard Worker         break;
495*35238bceSAndroid Build Coastguard Worker     case FUNCTION_TEXTUREPROJLOD3:
496*35238bceSAndroid Build Coastguard Worker         funcExt = "ProjLod";
497*35238bceSAndroid Build Coastguard Worker         break;
498*35238bceSAndroid Build Coastguard Worker     default:
499*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
500*35238bceSAndroid Build Coastguard Worker     }
501*35238bceSAndroid Build Coastguard Worker 
502*35238bceSAndroid Build Coastguard Worker     std::ostringstream vert;
503*35238bceSAndroid Build Coastguard Worker     std::ostringstream frag;
504*35238bceSAndroid Build Coastguard Worker     std::ostringstream &op = isVtxCase ? vert : frag;
505*35238bceSAndroid Build Coastguard Worker 
506*35238bceSAndroid Build Coastguard Worker     vert << "attribute highp vec4 a_position;\n"
507*35238bceSAndroid Build Coastguard Worker          << "attribute " << coordPrecName << " " << coordTypeName << " a_in0;\n";
508*35238bceSAndroid Build Coastguard Worker 
509*35238bceSAndroid Build Coastguard Worker     if (hasLodBias)
510*35238bceSAndroid Build Coastguard Worker         vert << "attribute " << coordPrecName << " float a_in1;\n";
511*35238bceSAndroid Build Coastguard Worker 
512*35238bceSAndroid Build Coastguard Worker     if (isVtxCase)
513*35238bceSAndroid Build Coastguard Worker     {
514*35238bceSAndroid Build Coastguard Worker         vert << "varying mediump vec4 v_color;\n";
515*35238bceSAndroid Build Coastguard Worker         frag << "varying mediump vec4 v_color;\n";
516*35238bceSAndroid Build Coastguard Worker     }
517*35238bceSAndroid Build Coastguard Worker     else
518*35238bceSAndroid Build Coastguard Worker     {
519*35238bceSAndroid Build Coastguard Worker         vert << "varying " << coordPrecName << " " << coordTypeName << " v_texCoord;\n";
520*35238bceSAndroid Build Coastguard Worker         frag << "varying " << coordPrecName << " " << coordTypeName << " v_texCoord;\n";
521*35238bceSAndroid Build Coastguard Worker 
522*35238bceSAndroid Build Coastguard Worker         if (hasLodBias)
523*35238bceSAndroid Build Coastguard Worker         {
524*35238bceSAndroid Build Coastguard Worker             vert << "varying " << coordPrecName << " float v_lodBias;\n";
525*35238bceSAndroid Build Coastguard Worker             frag << "varying " << coordPrecName << " float v_lodBias;\n";
526*35238bceSAndroid Build Coastguard Worker         }
527*35238bceSAndroid Build Coastguard Worker     }
528*35238bceSAndroid Build Coastguard Worker 
529*35238bceSAndroid Build Coastguard Worker     // Uniforms
530*35238bceSAndroid Build Coastguard Worker     op << "uniform lowp " << glu::getDataTypeName(samplerType) << " u_sampler;\n";
531*35238bceSAndroid Build Coastguard Worker 
532*35238bceSAndroid Build Coastguard Worker     vert << "\nvoid main()\n{\n"
533*35238bceSAndroid Build Coastguard Worker          << "\tgl_Position = a_position;\n";
534*35238bceSAndroid Build Coastguard Worker     frag << "\nvoid main()\n{\n";
535*35238bceSAndroid Build Coastguard Worker 
536*35238bceSAndroid Build Coastguard Worker     if (isVtxCase)
537*35238bceSAndroid Build Coastguard Worker         vert << "\tv_color = ";
538*35238bceSAndroid Build Coastguard Worker     else
539*35238bceSAndroid Build Coastguard Worker         frag << "\tgl_FragColor = ";
540*35238bceSAndroid Build Coastguard Worker 
541*35238bceSAndroid Build Coastguard Worker     // Op.
542*35238bceSAndroid Build Coastguard Worker     {
543*35238bceSAndroid Build Coastguard Worker         const char *texCoord = isVtxCase ? "a_in0" : "v_texCoord";
544*35238bceSAndroid Build Coastguard Worker         const char *lodBias  = isVtxCase ? "a_in1" : "v_lodBias";
545*35238bceSAndroid Build Coastguard Worker 
546*35238bceSAndroid Build Coastguard Worker         op << baseFuncName << funcExt;
547*35238bceSAndroid Build Coastguard Worker         op << "(u_sampler, " << texCoord;
548*35238bceSAndroid Build Coastguard Worker 
549*35238bceSAndroid Build Coastguard Worker         if (functionHasLod(function) || m_lookupSpec.useBias)
550*35238bceSAndroid Build Coastguard Worker             op << ", " << lodBias;
551*35238bceSAndroid Build Coastguard Worker 
552*35238bceSAndroid Build Coastguard Worker         op << ");\n";
553*35238bceSAndroid Build Coastguard Worker     }
554*35238bceSAndroid Build Coastguard Worker 
555*35238bceSAndroid Build Coastguard Worker     if (isVtxCase)
556*35238bceSAndroid Build Coastguard Worker         frag << "\tgl_FragColor = v_color;\n";
557*35238bceSAndroid Build Coastguard Worker     else
558*35238bceSAndroid Build Coastguard Worker     {
559*35238bceSAndroid Build Coastguard Worker         vert << "\tv_texCoord = a_in0;\n";
560*35238bceSAndroid Build Coastguard Worker 
561*35238bceSAndroid Build Coastguard Worker         if (hasLodBias)
562*35238bceSAndroid Build Coastguard Worker             vert << "\tv_lodBias = a_in1;\n";
563*35238bceSAndroid Build Coastguard Worker     }
564*35238bceSAndroid Build Coastguard Worker 
565*35238bceSAndroid Build Coastguard Worker     vert << "}\n";
566*35238bceSAndroid Build Coastguard Worker     frag << "}\n";
567*35238bceSAndroid Build Coastguard Worker 
568*35238bceSAndroid Build Coastguard Worker     m_vertShaderSource = vert.str();
569*35238bceSAndroid Build Coastguard Worker     m_fragShaderSource = frag.str();
570*35238bceSAndroid Build Coastguard Worker }
571*35238bceSAndroid Build Coastguard Worker 
deinit(void)572*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::deinit(void)
573*35238bceSAndroid Build Coastguard Worker {
574*35238bceSAndroid Build Coastguard Worker     gls::ShaderRenderCase::deinit();
575*35238bceSAndroid Build Coastguard Worker 
576*35238bceSAndroid Build Coastguard Worker     delete m_texture2D;
577*35238bceSAndroid Build Coastguard Worker     delete m_textureCube;
578*35238bceSAndroid Build Coastguard Worker 
579*35238bceSAndroid Build Coastguard Worker     m_texture2D   = DE_NULL;
580*35238bceSAndroid Build Coastguard Worker     m_textureCube = DE_NULL;
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker 
setupUniforms(int programID,const tcu::Vec4 &)583*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionCase::setupUniforms(int programID, const tcu::Vec4 &)
584*35238bceSAndroid Build Coastguard Worker {
585*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
586*35238bceSAndroid Build Coastguard Worker     gl.uniform1i(gl.getUniformLocation(programID, "u_sampler"), 0);
587*35238bceSAndroid Build Coastguard Worker }
588*35238bceSAndroid Build Coastguard Worker 
ShaderTextureFunctionTests(Context & context)589*35238bceSAndroid Build Coastguard Worker ShaderTextureFunctionTests::ShaderTextureFunctionTests(Context &context)
590*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "texture_functions", "Texture Access Function Tests")
591*35238bceSAndroid Build Coastguard Worker {
592*35238bceSAndroid Build Coastguard Worker }
593*35238bceSAndroid Build Coastguard Worker 
~ShaderTextureFunctionTests(void)594*35238bceSAndroid Build Coastguard Worker ShaderTextureFunctionTests::~ShaderTextureFunctionTests(void)
595*35238bceSAndroid Build Coastguard Worker {
596*35238bceSAndroid Build Coastguard Worker }
597*35238bceSAndroid Build Coastguard Worker 
598*35238bceSAndroid Build Coastguard Worker struct TexFuncCaseSpec
599*35238bceSAndroid Build Coastguard Worker {
600*35238bceSAndroid Build Coastguard Worker     const char *name;
601*35238bceSAndroid Build Coastguard Worker     TextureLookupSpec lookupSpec;
602*35238bceSAndroid Build Coastguard Worker     TextureSpec texSpec;
603*35238bceSAndroid Build Coastguard Worker     TexEvalFunc evalFunc;
604*35238bceSAndroid Build Coastguard Worker };
605*35238bceSAndroid Build Coastguard Worker 
606*35238bceSAndroid Build Coastguard Worker #define CASE_SPEC(NAME, FUNC, MINCOORD, MAXCOORD, USEBIAS, MINLOD, MAXLOD, TEXSPEC, EVALFUNC)          \
607*35238bceSAndroid Build Coastguard Worker     {                                                                                                  \
608*35238bceSAndroid Build Coastguard Worker         #NAME, TextureLookupSpec(FUNC, MINCOORD, MAXCOORD, USEBIAS, MINLOD, MAXLOD), TEXSPEC, EVALFUNC \
609*35238bceSAndroid Build Coastguard Worker     }
610*35238bceSAndroid Build Coastguard Worker 
createCaseGroup(TestCaseGroup * parent,const char * groupName,const char * groupDesc,const TexFuncCaseSpec * cases,int numCases,bool isVertex)611*35238bceSAndroid Build Coastguard Worker static void createCaseGroup(TestCaseGroup *parent, const char *groupName, const char *groupDesc,
612*35238bceSAndroid Build Coastguard Worker                             const TexFuncCaseSpec *cases, int numCases, bool isVertex)
613*35238bceSAndroid Build Coastguard Worker {
614*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *group = new tcu::TestCaseGroup(parent->getTestContext(), groupName, groupDesc);
615*35238bceSAndroid Build Coastguard Worker     parent->addChild(group);
616*35238bceSAndroid Build Coastguard Worker 
617*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < numCases; ndx++)
618*35238bceSAndroid Build Coastguard Worker         group->addChild(new ShaderTextureFunctionCase(parent->getContext(), cases[ndx].name, "", cases[ndx].lookupSpec,
619*35238bceSAndroid Build Coastguard Worker                                                       cases[ndx].texSpec, cases[ndx].evalFunc, isVertex));
620*35238bceSAndroid Build Coastguard Worker }
621*35238bceSAndroid Build Coastguard Worker 
init(void)622*35238bceSAndroid Build Coastguard Worker void ShaderTextureFunctionTests::init(void)
623*35238bceSAndroid Build Coastguard Worker {
624*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
625*35238bceSAndroid Build Coastguard Worker 
626*35238bceSAndroid Build Coastguard Worker     // Samplers
627*35238bceSAndroid Build Coastguard Worker     static const tcu::Sampler samplerLinearNoMipmap(tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL,
628*35238bceSAndroid Build Coastguard Worker                                                     tcu::Sampler::REPEAT_GL, tcu::Sampler::LINEAR,
629*35238bceSAndroid Build Coastguard Worker                                                     tcu::Sampler::LINEAR);
630*35238bceSAndroid Build Coastguard Worker     static tcu::Sampler samplerLinearMipmap(tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL,
631*35238bceSAndroid Build Coastguard Worker                                             tcu::Sampler::LINEAR_MIPMAP_NEAREST, tcu::Sampler::LINEAR);
632*35238bceSAndroid Build Coastguard Worker 
633*35238bceSAndroid Build Coastguard Worker     samplerLinearMipmap.seamlessCubeMap = glu::IsES3Compatible(gl);
634*35238bceSAndroid Build Coastguard Worker 
635*35238bceSAndroid Build Coastguard Worker     // Default textures.
636*35238bceSAndroid Build Coastguard Worker     //                                                Type            Format        DataType            W        H        L    Sampler
637*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2D(TEXTURETYPE_2D, GL_RGBA, GL_UNSIGNED_BYTE, 256, 256, 1, samplerLinearNoMipmap);
638*35238bceSAndroid Build Coastguard Worker     static const TextureSpec tex2DMipmap(TEXTURETYPE_2D, GL_RGBA, GL_UNSIGNED_BYTE, 256, 256, 9, samplerLinearMipmap);
639*35238bceSAndroid Build Coastguard Worker 
640*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCube(TEXTURETYPE_CUBE_MAP, GL_RGBA, GL_UNSIGNED_BYTE, 256, 256, 1,
641*35238bceSAndroid Build Coastguard Worker                                      samplerLinearNoMipmap);
642*35238bceSAndroid Build Coastguard Worker     static const TextureSpec texCubeMipmap(TEXTURETYPE_CUBE_MAP, GL_RGBA, GL_UNSIGNED_BYTE, 256, 256, 9,
643*35238bceSAndroid Build Coastguard Worker                                            samplerLinearMipmap);
644*35238bceSAndroid Build Coastguard Worker 
645*35238bceSAndroid Build Coastguard Worker     // Vertex cases
646*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec vertexCases[] = {
647*35238bceSAndroid Build Coastguard Worker         //          Name                        Function                    MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Texture            EvalFunc
648*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
649*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, tex2D, evalTexture2D),
650*35238bceSAndroid Build Coastguard Worker         //        CASE_SPEC(texture2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f,  0.0f,  0.0f), Vec4( 1.5f,  2.3f,  0.0f,  0.0f), true, -2.0f, 2.0f, tex2D, evalTexture2DBias),
651*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dproj_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
652*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, tex2D, evalTexture2DProj3),
653*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dproj_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
654*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, tex2D, evalTexture2DProj),
655*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dlod, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f),
656*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, tex2DMipmap, evalTexture2DLod),
657*35238bceSAndroid Build Coastguard Worker         //        CASE_SPEC(texture2dproj_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f,  1.5f,  0.0f), Vec4(2.25f, 3.45f,  1.5f,  0.0f), true, -2.0f, 2.0f, tex2D, evalTexture2DProj3Bias),
658*35238bceSAndroid Build Coastguard Worker         //        CASE_SPEC(texture2dproj_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f,  0.0f,  1.5f), Vec4(2.25f, 3.45f,  0.0f,  1.5f), true, -2.0f, 2.0f, tex2D, evalTexture2DProjBias),
659*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dprojlod_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
660*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, tex2D, evalTexture2DProjLod3),
661*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dprojlod_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
662*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, tex2D, evalTexture2DProjLod),
663*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texturecube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f), false,
664*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, texCube, evalTextureCube),
665*35238bceSAndroid Build Coastguard Worker         //        CASE_SPEC(texturecube_bias, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f,  0.0f), Vec4( 1.0f,  1.0f, -1.01f,  0.0f), true, -2.0f, 2.0f, texCube, evalTextureCubeBias),
666*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texturecubelod, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f),
667*35238bceSAndroid Build Coastguard Worker                   false, -1.0f, 9.0f, texCubeMipmap, evalTextureCubeLod),
668*35238bceSAndroid Build Coastguard Worker     };
669*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "vertex", "Vertex Shader Texture Lookups", &vertexCases[0], DE_LENGTH_OF_ARRAY(vertexCases),
670*35238bceSAndroid Build Coastguard Worker                     true);
671*35238bceSAndroid Build Coastguard Worker 
672*35238bceSAndroid Build Coastguard Worker     // Fragment cases
673*35238bceSAndroid Build Coastguard Worker     static const TexFuncCaseSpec fragmentCases[] = {
674*35238bceSAndroid Build Coastguard Worker         //          Name                        Function                MinCoord                            MaxCoord                            Bias?    MinLod    MaxLod    Texture            EvalFunc
675*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), false,
676*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, tex2DMipmap, evalTexture2D),
677*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4(1.5f, 2.3f, 0.0f, 0.0f), true,
678*35238bceSAndroid Build Coastguard Worker                   -2.0f, 2.0f, tex2DMipmap, evalTexture2DBias),
679*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dproj_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
680*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, tex2DMipmap, evalTexture2DProj3),
681*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dproj_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
682*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, tex2DMipmap, evalTexture2DProj),
683*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dproj_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f),
684*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, tex2DMipmap, evalTexture2DProj3Bias),
685*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texture2dproj_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f),
686*35238bceSAndroid Build Coastguard Worker                   Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, tex2DMipmap, evalTexture2DProjBias),
687*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texturecube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4(1.0f, 1.0f, 1.01f, 0.0f), false,
688*35238bceSAndroid Build Coastguard Worker                   0.0f, 0.0f, texCubeMipmap, evalTextureCube),
689*35238bceSAndroid Build Coastguard Worker         CASE_SPEC(texturecube_bias, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4(1.0f, 1.0f, -1.01f, 0.0f),
690*35238bceSAndroid Build Coastguard Worker                   true, -2.0f, 2.0f, texCubeMipmap, evalTextureCubeBias)};
691*35238bceSAndroid Build Coastguard Worker     createCaseGroup(this, "fragment", "Fragment Shader Texture Lookups", &fragmentCases[0],
692*35238bceSAndroid Build Coastguard Worker                     DE_LENGTH_OF_ARRAY(fragmentCases), false);
693*35238bceSAndroid Build Coastguard Worker 
694*35238bceSAndroid Build Coastguard Worker     // Negative cases.
695*35238bceSAndroid Build Coastguard Worker     {
696*35238bceSAndroid Build Coastguard Worker         gls::ShaderLibrary library(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo());
697*35238bceSAndroid Build Coastguard Worker         std::vector<tcu::TestNode *> negativeCases = library.loadShaderFile("shaders/invalid_texture_functions.test");
698*35238bceSAndroid Build Coastguard Worker 
699*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *group =
700*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "invalid", "Invalid texture function usage", negativeCases);
701*35238bceSAndroid Build Coastguard Worker         addChild(group);
702*35238bceSAndroid Build Coastguard Worker     }
703*35238bceSAndroid Build Coastguard Worker }
704*35238bceSAndroid Build Coastguard Worker 
705*35238bceSAndroid Build Coastguard Worker } // namespace Functional
706*35238bceSAndroid Build Coastguard Worker } // namespace gles2
707*35238bceSAndroid Build Coastguard Worker } // namespace deqp
708