xref: /aosp_15_r20/external/deqp/modules/glshared/glsTextureTestUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL (ES) 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 test utilities.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "glsTextureTestUtil.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "gluDefs.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluDrawUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuTexLookupVerifier.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "tcuTexVerifierUtil.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "qpWatchDog.h"
39*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker using std::map;
42*35238bceSAndroid Build Coastguard Worker using std::string;
43*35238bceSAndroid Build Coastguard Worker using std::vector;
44*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker using namespace glu::TextureTestUtil;
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker namespace deqp
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker namespace gls
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker namespace TextureTestUtil
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker 
RandomViewport(const tcu::RenderTarget & renderTarget,int preferredWidth,int preferredHeight,uint32_t seed)55*35238bceSAndroid Build Coastguard Worker RandomViewport::RandomViewport(const tcu::RenderTarget &renderTarget, int preferredWidth, int preferredHeight,
56*35238bceSAndroid Build Coastguard Worker                                uint32_t seed)
57*35238bceSAndroid Build Coastguard Worker     : x(0)
58*35238bceSAndroid Build Coastguard Worker     , y(0)
59*35238bceSAndroid Build Coastguard Worker     , width(deMin32(preferredWidth, renderTarget.getWidth()))
60*35238bceSAndroid Build Coastguard Worker     , height(deMin32(preferredHeight, renderTarget.getHeight()))
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker     de::Random rnd(seed);
63*35238bceSAndroid Build Coastguard Worker     x = rnd.getInt(0, renderTarget.getWidth() - width);
64*35238bceSAndroid Build Coastguard Worker     y = rnd.getInt(0, renderTarget.getHeight() - height);
65*35238bceSAndroid Build Coastguard Worker }
66*35238bceSAndroid Build Coastguard Worker 
ProgramLibrary(const glu::RenderContext & context,tcu::TestLog & log,glu::GLSLVersion glslVersion,glu::Precision texCoordPrecision)67*35238bceSAndroid Build Coastguard Worker ProgramLibrary::ProgramLibrary(const glu::RenderContext &context, tcu::TestLog &log, glu::GLSLVersion glslVersion,
68*35238bceSAndroid Build Coastguard Worker                                glu::Precision texCoordPrecision)
69*35238bceSAndroid Build Coastguard Worker     : m_context(context)
70*35238bceSAndroid Build Coastguard Worker     , m_log(log)
71*35238bceSAndroid Build Coastguard Worker     , m_glslVersion(glslVersion)
72*35238bceSAndroid Build Coastguard Worker     , m_texCoordPrecision(texCoordPrecision)
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker }
75*35238bceSAndroid Build Coastguard Worker 
~ProgramLibrary(void)76*35238bceSAndroid Build Coastguard Worker ProgramLibrary::~ProgramLibrary(void)
77*35238bceSAndroid Build Coastguard Worker {
78*35238bceSAndroid Build Coastguard Worker     clear();
79*35238bceSAndroid Build Coastguard Worker }
80*35238bceSAndroid Build Coastguard Worker 
clear(void)81*35238bceSAndroid Build Coastguard Worker void ProgramLibrary::clear(void)
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker     for (map<Program, glu::ShaderProgram *>::iterator i = m_programs.begin(); i != m_programs.end(); i++)
84*35238bceSAndroid Build Coastguard Worker     {
85*35238bceSAndroid Build Coastguard Worker         delete i->second;
86*35238bceSAndroid Build Coastguard Worker         i->second = DE_NULL;
87*35238bceSAndroid Build Coastguard Worker     }
88*35238bceSAndroid Build Coastguard Worker     m_programs.clear();
89*35238bceSAndroid Build Coastguard Worker }
90*35238bceSAndroid Build Coastguard Worker 
getProgram(Program program)91*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *ProgramLibrary::getProgram(Program program)
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker     if (m_programs.find(program) != m_programs.end())
94*35238bceSAndroid Build Coastguard Worker         return m_programs[program]; // Return from cache.
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker     static const char *vertShaderTemplate = "${VTX_HEADER}"
97*35238bceSAndroid Build Coastguard Worker                                             "${VTX_IN} highp vec4 a_position;\n"
98*35238bceSAndroid Build Coastguard Worker                                             "${VTX_IN} ${PRECISION} ${TEXCOORD_TYPE} a_texCoord;\n"
99*35238bceSAndroid Build Coastguard Worker                                             "${VTX_OUT} ${PRECISION} ${TEXCOORD_TYPE} v_texCoord;\n"
100*35238bceSAndroid Build Coastguard Worker                                             "\n"
101*35238bceSAndroid Build Coastguard Worker                                             "void main (void)\n"
102*35238bceSAndroid Build Coastguard Worker                                             "{\n"
103*35238bceSAndroid Build Coastguard Worker                                             "    gl_Position = a_position;\n"
104*35238bceSAndroid Build Coastguard Worker                                             "    v_texCoord = a_texCoord;\n"
105*35238bceSAndroid Build Coastguard Worker                                             "}\n";
106*35238bceSAndroid Build Coastguard Worker     static const char *fragShaderTemplate = "${FRAG_HEADER}"
107*35238bceSAndroid Build Coastguard Worker                                             "${FRAG_IN} ${PRECISION} ${TEXCOORD_TYPE} v_texCoord;\n"
108*35238bceSAndroid Build Coastguard Worker                                             "uniform ${PRECISION} float u_bias;\n"
109*35238bceSAndroid Build Coastguard Worker                                             "uniform ${PRECISION} float u_ref;\n"
110*35238bceSAndroid Build Coastguard Worker                                             "uniform ${PRECISION} vec4 u_colorScale;\n"
111*35238bceSAndroid Build Coastguard Worker                                             "uniform ${PRECISION} vec4 u_colorBias;\n"
112*35238bceSAndroid Build Coastguard Worker                                             "uniform ${PRECISION} ${SAMPLER_TYPE} u_sampler;\n"
113*35238bceSAndroid Build Coastguard Worker                                             "\n"
114*35238bceSAndroid Build Coastguard Worker                                             "void main (void)\n"
115*35238bceSAndroid Build Coastguard Worker                                             "{\n"
116*35238bceSAndroid Build Coastguard Worker                                             "    ${FRAG_COLOR} = ${LOOKUP} * u_colorScale + u_colorBias;\n"
117*35238bceSAndroid Build Coastguard Worker                                             "}\n";
118*35238bceSAndroid Build Coastguard Worker 
119*35238bceSAndroid Build Coastguard Worker     map<string, string> params;
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker     bool isCube  = de::inRange<int>(program, PROGRAM_CUBE_FLOAT, PROGRAM_CUBE_SHADOW_BIAS);
122*35238bceSAndroid Build Coastguard Worker     bool isArray = de::inRange<int>(program, PROGRAM_2D_ARRAY_FLOAT, PROGRAM_2D_ARRAY_SHADOW) ||
123*35238bceSAndroid Build Coastguard Worker                    de::inRange<int>(program, PROGRAM_1D_ARRAY_FLOAT, PROGRAM_1D_ARRAY_SHADOW);
124*35238bceSAndroid Build Coastguard Worker 
125*35238bceSAndroid Build Coastguard Worker     bool is1D = de::inRange<int>(program, PROGRAM_1D_FLOAT, PROGRAM_1D_UINT_BIAS) ||
126*35238bceSAndroid Build Coastguard Worker                 de::inRange<int>(program, PROGRAM_1D_ARRAY_FLOAT, PROGRAM_1D_ARRAY_SHADOW) ||
127*35238bceSAndroid Build Coastguard Worker                 de::inRange<int>(program, PROGRAM_BUFFER_FLOAT, PROGRAM_BUFFER_UINT);
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker     bool is2D = de::inRange<int>(program, PROGRAM_2D_FLOAT, PROGRAM_2D_UINT_BIAS) ||
130*35238bceSAndroid Build Coastguard Worker                 de::inRange<int>(program, PROGRAM_2D_ARRAY_FLOAT, PROGRAM_2D_ARRAY_SHADOW);
131*35238bceSAndroid Build Coastguard Worker 
132*35238bceSAndroid Build Coastguard Worker     bool is3D        = de::inRange<int>(program, PROGRAM_3D_FLOAT, PROGRAM_3D_UINT_BIAS);
133*35238bceSAndroid Build Coastguard Worker     bool isCubeArray = de::inRange<int>(program, PROGRAM_CUBE_ARRAY_FLOAT, PROGRAM_CUBE_ARRAY_SHADOW);
134*35238bceSAndroid Build Coastguard Worker     bool isBuffer    = de::inRange<int>(program, PROGRAM_BUFFER_FLOAT, PROGRAM_BUFFER_UINT);
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker     if (m_glslVersion == glu::GLSL_VERSION_100_ES)
137*35238bceSAndroid Build Coastguard Worker     {
138*35238bceSAndroid Build Coastguard Worker         params["FRAG_HEADER"] = "";
139*35238bceSAndroid Build Coastguard Worker         params["VTX_HEADER"]  = "";
140*35238bceSAndroid Build Coastguard Worker         params["VTX_IN"]      = "attribute";
141*35238bceSAndroid Build Coastguard Worker         params["VTX_OUT"]     = "varying";
142*35238bceSAndroid Build Coastguard Worker         params["FRAG_IN"]     = "varying";
143*35238bceSAndroid Build Coastguard Worker         params["FRAG_COLOR"]  = "gl_FragColor";
144*35238bceSAndroid Build Coastguard Worker     }
145*35238bceSAndroid Build Coastguard Worker     else if (m_glslVersion == glu::GLSL_VERSION_300_ES || m_glslVersion == glu::GLSL_VERSION_310_ES ||
146*35238bceSAndroid Build Coastguard Worker              m_glslVersion == glu::GLSL_VERSION_320_ES || m_glslVersion > glu::GLSL_VERSION_330)
147*35238bceSAndroid Build Coastguard Worker     {
148*35238bceSAndroid Build Coastguard Worker         const string version = glu::getGLSLVersionDeclaration(m_glslVersion);
149*35238bceSAndroid Build Coastguard Worker         const char *ext      = DE_NULL;
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker         if (glu::glslVersionIsES(m_glslVersion) && m_glslVersion != glu::GLSL_VERSION_320_ES)
152*35238bceSAndroid Build Coastguard Worker         {
153*35238bceSAndroid Build Coastguard Worker             if (isCubeArray)
154*35238bceSAndroid Build Coastguard Worker                 ext = "GL_EXT_texture_cube_map_array";
155*35238bceSAndroid Build Coastguard Worker             else if (isBuffer)
156*35238bceSAndroid Build Coastguard Worker                 ext = "GL_EXT_texture_buffer";
157*35238bceSAndroid Build Coastguard Worker         }
158*35238bceSAndroid Build Coastguard Worker 
159*35238bceSAndroid Build Coastguard Worker         params["FRAG_HEADER"] = version + (ext ? string("\n#extension ") + ext + " : require" : string()) +
160*35238bceSAndroid Build Coastguard Worker                                 "\nlayout(location = 0) out mediump vec4 dEQP_FragColor;\n";
161*35238bceSAndroid Build Coastguard Worker         params["VTX_HEADER"] = version + "\n";
162*35238bceSAndroid Build Coastguard Worker         params["VTX_IN"]     = "in";
163*35238bceSAndroid Build Coastguard Worker         params["VTX_OUT"]    = "out";
164*35238bceSAndroid Build Coastguard Worker         params["FRAG_IN"]    = "in";
165*35238bceSAndroid Build Coastguard Worker         params["FRAG_COLOR"] = "dEQP_FragColor";
166*35238bceSAndroid Build Coastguard Worker     }
167*35238bceSAndroid Build Coastguard Worker     else
168*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unsupported version");
169*35238bceSAndroid Build Coastguard Worker 
170*35238bceSAndroid Build Coastguard Worker     params["PRECISION"] = glu::getPrecisionName(m_texCoordPrecision);
171*35238bceSAndroid Build Coastguard Worker 
172*35238bceSAndroid Build Coastguard Worker     if (isCubeArray)
173*35238bceSAndroid Build Coastguard Worker         params["TEXCOORD_TYPE"] = "vec4";
174*35238bceSAndroid Build Coastguard Worker     else if (isCube || (is2D && isArray) || is3D)
175*35238bceSAndroid Build Coastguard Worker         params["TEXCOORD_TYPE"] = "vec3";
176*35238bceSAndroid Build Coastguard Worker     else if ((is1D && isArray) || is2D)
177*35238bceSAndroid Build Coastguard Worker         params["TEXCOORD_TYPE"] = "vec2";
178*35238bceSAndroid Build Coastguard Worker     else if (is1D)
179*35238bceSAndroid Build Coastguard Worker         params["TEXCOORD_TYPE"] = "float";
180*35238bceSAndroid Build Coastguard Worker     else
181*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
182*35238bceSAndroid Build Coastguard Worker 
183*35238bceSAndroid Build Coastguard Worker     const char *sampler = DE_NULL;
184*35238bceSAndroid Build Coastguard Worker     const char *lookup  = DE_NULL;
185*35238bceSAndroid Build Coastguard Worker 
186*35238bceSAndroid Build Coastguard Worker     if (m_glslVersion == glu::GLSL_VERSION_300_ES || m_glslVersion == glu::GLSL_VERSION_310_ES ||
187*35238bceSAndroid Build Coastguard Worker         m_glslVersion == glu::GLSL_VERSION_320_ES || m_glslVersion > glu::GLSL_VERSION_330)
188*35238bceSAndroid Build Coastguard Worker     {
189*35238bceSAndroid Build Coastguard Worker         switch (program)
190*35238bceSAndroid Build Coastguard Worker         {
191*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_FLOAT:
192*35238bceSAndroid Build Coastguard Worker             sampler = "sampler2D";
193*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord)";
194*35238bceSAndroid Build Coastguard Worker             break;
195*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_INT:
196*35238bceSAndroid Build Coastguard Worker             sampler = "isampler2D";
197*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
198*35238bceSAndroid Build Coastguard Worker             break;
199*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_UINT:
200*35238bceSAndroid Build Coastguard Worker             sampler = "usampler2D";
201*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
202*35238bceSAndroid Build Coastguard Worker             break;
203*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_SHADOW:
204*35238bceSAndroid Build Coastguard Worker             sampler = "sampler2DShadow";
205*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";
206*35238bceSAndroid Build Coastguard Worker             break;
207*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_FLOAT_BIAS:
208*35238bceSAndroid Build Coastguard Worker             sampler = "sampler2D";
209*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord, u_bias)";
210*35238bceSAndroid Build Coastguard Worker             break;
211*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_INT_BIAS:
212*35238bceSAndroid Build Coastguard Worker             sampler = "isampler2D";
213*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord, u_bias))";
214*35238bceSAndroid Build Coastguard Worker             break;
215*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_UINT_BIAS:
216*35238bceSAndroid Build Coastguard Worker             sampler = "usampler2D";
217*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord, u_bias))";
218*35238bceSAndroid Build Coastguard Worker             break;
219*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_SHADOW_BIAS:
220*35238bceSAndroid Build Coastguard Worker             sampler = "sampler2DShadow";
221*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref), u_bias), 0.0, 0.0, 1.0)";
222*35238bceSAndroid Build Coastguard Worker             break;
223*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_FLOAT:
224*35238bceSAndroid Build Coastguard Worker             sampler = "sampler1D";
225*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord)";
226*35238bceSAndroid Build Coastguard Worker             break;
227*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_INT:
228*35238bceSAndroid Build Coastguard Worker             sampler = "isampler1D";
229*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
230*35238bceSAndroid Build Coastguard Worker             break;
231*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_UINT:
232*35238bceSAndroid Build Coastguard Worker             sampler = "usampler1D";
233*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
234*35238bceSAndroid Build Coastguard Worker             break;
235*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_SHADOW:
236*35238bceSAndroid Build Coastguard Worker             sampler = "sampler1DShadow";
237*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";
238*35238bceSAndroid Build Coastguard Worker             break;
239*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_FLOAT_BIAS:
240*35238bceSAndroid Build Coastguard Worker             sampler = "sampler1D";
241*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord, u_bias)";
242*35238bceSAndroid Build Coastguard Worker             break;
243*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_INT_BIAS:
244*35238bceSAndroid Build Coastguard Worker             sampler = "isampler1D";
245*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord, u_bias))";
246*35238bceSAndroid Build Coastguard Worker             break;
247*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_UINT_BIAS:
248*35238bceSAndroid Build Coastguard Worker             sampler = "usampler1D";
249*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord, u_bias))";
250*35238bceSAndroid Build Coastguard Worker             break;
251*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_SHADOW_BIAS:
252*35238bceSAndroid Build Coastguard Worker             sampler = "sampler1DShadow";
253*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref), u_bias), 0.0, 0.0, 1.0)";
254*35238bceSAndroid Build Coastguard Worker             break;
255*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_FLOAT:
256*35238bceSAndroid Build Coastguard Worker             sampler = "samplerCube";
257*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord)";
258*35238bceSAndroid Build Coastguard Worker             break;
259*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_INT:
260*35238bceSAndroid Build Coastguard Worker             sampler = "isamplerCube";
261*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
262*35238bceSAndroid Build Coastguard Worker             break;
263*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_UINT:
264*35238bceSAndroid Build Coastguard Worker             sampler = "usamplerCube";
265*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
266*35238bceSAndroid Build Coastguard Worker             break;
267*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_SHADOW:
268*35238bceSAndroid Build Coastguard Worker             sampler = "samplerCubeShadow";
269*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";
270*35238bceSAndroid Build Coastguard Worker             break;
271*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_FLOAT_BIAS:
272*35238bceSAndroid Build Coastguard Worker             sampler = "samplerCube";
273*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord, u_bias)";
274*35238bceSAndroid Build Coastguard Worker             break;
275*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_INT_BIAS:
276*35238bceSAndroid Build Coastguard Worker             sampler = "isamplerCube";
277*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord, u_bias))";
278*35238bceSAndroid Build Coastguard Worker             break;
279*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_UINT_BIAS:
280*35238bceSAndroid Build Coastguard Worker             sampler = "usamplerCube";
281*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord, u_bias))";
282*35238bceSAndroid Build Coastguard Worker             break;
283*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_SHADOW_BIAS:
284*35238bceSAndroid Build Coastguard Worker             sampler = "samplerCubeShadow";
285*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref), u_bias), 0.0, 0.0, 1.0)";
286*35238bceSAndroid Build Coastguard Worker             break;
287*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_ARRAY_FLOAT:
288*35238bceSAndroid Build Coastguard Worker             sampler = "sampler2DArray";
289*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord)";
290*35238bceSAndroid Build Coastguard Worker             break;
291*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_ARRAY_INT:
292*35238bceSAndroid Build Coastguard Worker             sampler = "isampler2DArray";
293*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
294*35238bceSAndroid Build Coastguard Worker             break;
295*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_ARRAY_UINT:
296*35238bceSAndroid Build Coastguard Worker             sampler = "usampler2DArray";
297*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
298*35238bceSAndroid Build Coastguard Worker             break;
299*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_ARRAY_SHADOW:
300*35238bceSAndroid Build Coastguard Worker             sampler = "sampler2DArrayShadow";
301*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";
302*35238bceSAndroid Build Coastguard Worker             break;
303*35238bceSAndroid Build Coastguard Worker         case PROGRAM_3D_FLOAT:
304*35238bceSAndroid Build Coastguard Worker             sampler = "sampler3D";
305*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord)";
306*35238bceSAndroid Build Coastguard Worker             break;
307*35238bceSAndroid Build Coastguard Worker         case PROGRAM_3D_INT:
308*35238bceSAndroid Build Coastguard Worker             sampler = "isampler3D";
309*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
310*35238bceSAndroid Build Coastguard Worker             break;
311*35238bceSAndroid Build Coastguard Worker         case PROGRAM_3D_UINT:
312*35238bceSAndroid Build Coastguard Worker             sampler = "usampler3D";
313*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
314*35238bceSAndroid Build Coastguard Worker             break;
315*35238bceSAndroid Build Coastguard Worker         case PROGRAM_3D_FLOAT_BIAS:
316*35238bceSAndroid Build Coastguard Worker             sampler = "sampler3D";
317*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord, u_bias)";
318*35238bceSAndroid Build Coastguard Worker             break;
319*35238bceSAndroid Build Coastguard Worker         case PROGRAM_3D_INT_BIAS:
320*35238bceSAndroid Build Coastguard Worker             sampler = "isampler3D";
321*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord, u_bias))";
322*35238bceSAndroid Build Coastguard Worker             break;
323*35238bceSAndroid Build Coastguard Worker         case PROGRAM_3D_UINT_BIAS:
324*35238bceSAndroid Build Coastguard Worker             sampler = "usampler3D";
325*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord, u_bias))";
326*35238bceSAndroid Build Coastguard Worker             break;
327*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_ARRAY_FLOAT:
328*35238bceSAndroid Build Coastguard Worker             sampler = "samplerCubeArray";
329*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord)";
330*35238bceSAndroid Build Coastguard Worker             break;
331*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_ARRAY_INT:
332*35238bceSAndroid Build Coastguard Worker             sampler = "isamplerCubeArray";
333*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
334*35238bceSAndroid Build Coastguard Worker             break;
335*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_ARRAY_UINT:
336*35238bceSAndroid Build Coastguard Worker             sampler = "usamplerCubeArray";
337*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
338*35238bceSAndroid Build Coastguard Worker             break;
339*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_ARRAY_SHADOW:
340*35238bceSAndroid Build Coastguard Worker             sampler = "samplerCubeArrayShadow";
341*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";
342*35238bceSAndroid Build Coastguard Worker             break;
343*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_ARRAY_FLOAT:
344*35238bceSAndroid Build Coastguard Worker             sampler = "sampler1DArray";
345*35238bceSAndroid Build Coastguard Worker             lookup  = "texture(u_sampler, v_texCoord)";
346*35238bceSAndroid Build Coastguard Worker             break;
347*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_ARRAY_INT:
348*35238bceSAndroid Build Coastguard Worker             sampler = "isampler1DArray";
349*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
350*35238bceSAndroid Build Coastguard Worker             break;
351*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_ARRAY_UINT:
352*35238bceSAndroid Build Coastguard Worker             sampler = "usampler1DArray";
353*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, v_texCoord))";
354*35238bceSAndroid Build Coastguard Worker             break;
355*35238bceSAndroid Build Coastguard Worker         case PROGRAM_1D_ARRAY_SHADOW:
356*35238bceSAndroid Build Coastguard Worker             sampler = "sampler1DArrayShadow";
357*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";
358*35238bceSAndroid Build Coastguard Worker             break;
359*35238bceSAndroid Build Coastguard Worker         case PROGRAM_BUFFER_FLOAT:
360*35238bceSAndroid Build Coastguard Worker             sampler = "samplerBuffer";
361*35238bceSAndroid Build Coastguard Worker             lookup  = "texelFetch(u_sampler, int(v_texCoord))";
362*35238bceSAndroid Build Coastguard Worker             break;
363*35238bceSAndroid Build Coastguard Worker         case PROGRAM_BUFFER_INT:
364*35238bceSAndroid Build Coastguard Worker             sampler = "isamplerBuffer";
365*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texelFetch(u_sampler, int(v_texCoord)))";
366*35238bceSAndroid Build Coastguard Worker             break;
367*35238bceSAndroid Build Coastguard Worker         case PROGRAM_BUFFER_UINT:
368*35238bceSAndroid Build Coastguard Worker             sampler = "usamplerBuffer";
369*35238bceSAndroid Build Coastguard Worker             lookup  = "vec4(texelFetch(u_sampler, int(v_texCoord)))";
370*35238bceSAndroid Build Coastguard Worker             break;
371*35238bceSAndroid Build Coastguard Worker         default:
372*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
373*35238bceSAndroid Build Coastguard Worker         }
374*35238bceSAndroid Build Coastguard Worker     }
375*35238bceSAndroid Build Coastguard Worker     else if (m_glslVersion == glu::GLSL_VERSION_100_ES)
376*35238bceSAndroid Build Coastguard Worker     {
377*35238bceSAndroid Build Coastguard Worker         sampler = isCube ? "samplerCube" : "sampler2D";
378*35238bceSAndroid Build Coastguard Worker 
379*35238bceSAndroid Build Coastguard Worker         switch (program)
380*35238bceSAndroid Build Coastguard Worker         {
381*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_FLOAT:
382*35238bceSAndroid Build Coastguard Worker             lookup = "texture2D(u_sampler, v_texCoord)";
383*35238bceSAndroid Build Coastguard Worker             break;
384*35238bceSAndroid Build Coastguard Worker         case PROGRAM_2D_FLOAT_BIAS:
385*35238bceSAndroid Build Coastguard Worker             lookup = "texture2D(u_sampler, v_texCoord, u_bias)";
386*35238bceSAndroid Build Coastguard Worker             break;
387*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_FLOAT:
388*35238bceSAndroid Build Coastguard Worker             lookup = "textureCube(u_sampler, v_texCoord)";
389*35238bceSAndroid Build Coastguard Worker             break;
390*35238bceSAndroid Build Coastguard Worker         case PROGRAM_CUBE_FLOAT_BIAS:
391*35238bceSAndroid Build Coastguard Worker             lookup = "textureCube(u_sampler, v_texCoord, u_bias)";
392*35238bceSAndroid Build Coastguard Worker             break;
393*35238bceSAndroid Build Coastguard Worker         default:
394*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
395*35238bceSAndroid Build Coastguard Worker         }
396*35238bceSAndroid Build Coastguard Worker     }
397*35238bceSAndroid Build Coastguard Worker     else
398*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unsupported version");
399*35238bceSAndroid Build Coastguard Worker 
400*35238bceSAndroid Build Coastguard Worker     params["SAMPLER_TYPE"] = sampler;
401*35238bceSAndroid Build Coastguard Worker     params["LOOKUP"]       = lookup;
402*35238bceSAndroid Build Coastguard Worker 
403*35238bceSAndroid Build Coastguard Worker     std::string vertSrc = tcu::StringTemplate(vertShaderTemplate).specialize(params);
404*35238bceSAndroid Build Coastguard Worker     std::string fragSrc = tcu::StringTemplate(fragShaderTemplate).specialize(params);
405*35238bceSAndroid Build Coastguard Worker 
406*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *progObj = new glu::ShaderProgram(m_context, glu::makeVtxFragSources(vertSrc, fragSrc));
407*35238bceSAndroid Build Coastguard Worker     if (!progObj->isOk())
408*35238bceSAndroid Build Coastguard Worker     {
409*35238bceSAndroid Build Coastguard Worker         m_log << *progObj;
410*35238bceSAndroid Build Coastguard Worker         delete progObj;
411*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("Failed to compile shader program");
412*35238bceSAndroid Build Coastguard Worker     }
413*35238bceSAndroid Build Coastguard Worker 
414*35238bceSAndroid Build Coastguard Worker     try
415*35238bceSAndroid Build Coastguard Worker     {
416*35238bceSAndroid Build Coastguard Worker         m_programs[program] = progObj;
417*35238bceSAndroid Build Coastguard Worker     }
418*35238bceSAndroid Build Coastguard Worker     catch (...)
419*35238bceSAndroid Build Coastguard Worker     {
420*35238bceSAndroid Build Coastguard Worker         delete progObj;
421*35238bceSAndroid Build Coastguard Worker         throw;
422*35238bceSAndroid Build Coastguard Worker     }
423*35238bceSAndroid Build Coastguard Worker 
424*35238bceSAndroid Build Coastguard Worker     return progObj;
425*35238bceSAndroid Build Coastguard Worker }
426*35238bceSAndroid Build Coastguard Worker 
getTexCoordPrecision()427*35238bceSAndroid Build Coastguard Worker glu::Precision ProgramLibrary::getTexCoordPrecision()
428*35238bceSAndroid Build Coastguard Worker {
429*35238bceSAndroid Build Coastguard Worker     return m_texCoordPrecision;
430*35238bceSAndroid Build Coastguard Worker }
431*35238bceSAndroid Build Coastguard Worker 
TextureRenderer(const glu::RenderContext & context,tcu::TestLog & log,glu::GLSLVersion glslVersion,glu::Precision texCoordPrecision)432*35238bceSAndroid Build Coastguard Worker TextureRenderer::TextureRenderer(const glu::RenderContext &context, tcu::TestLog &log, glu::GLSLVersion glslVersion,
433*35238bceSAndroid Build Coastguard Worker                                  glu::Precision texCoordPrecision)
434*35238bceSAndroid Build Coastguard Worker     : m_renderCtx(context)
435*35238bceSAndroid Build Coastguard Worker     , m_log(log)
436*35238bceSAndroid Build Coastguard Worker     , m_programLibrary(context, log, glslVersion, texCoordPrecision)
437*35238bceSAndroid Build Coastguard Worker {
438*35238bceSAndroid Build Coastguard Worker }
439*35238bceSAndroid Build Coastguard Worker 
~TextureRenderer(void)440*35238bceSAndroid Build Coastguard Worker TextureRenderer::~TextureRenderer(void)
441*35238bceSAndroid Build Coastguard Worker {
442*35238bceSAndroid Build Coastguard Worker     clear();
443*35238bceSAndroid Build Coastguard Worker }
444*35238bceSAndroid Build Coastguard Worker 
clear(void)445*35238bceSAndroid Build Coastguard Worker void TextureRenderer::clear(void)
446*35238bceSAndroid Build Coastguard Worker {
447*35238bceSAndroid Build Coastguard Worker     m_programLibrary.clear();
448*35238bceSAndroid Build Coastguard Worker }
449*35238bceSAndroid Build Coastguard Worker 
renderQuad(int texUnit,const float * texCoord,TextureType texType)450*35238bceSAndroid Build Coastguard Worker void TextureRenderer::renderQuad(int texUnit, const float *texCoord, TextureType texType)
451*35238bceSAndroid Build Coastguard Worker {
452*35238bceSAndroid Build Coastguard Worker     renderQuad(texUnit, texCoord, RenderParams(texType));
453*35238bceSAndroid Build Coastguard Worker }
454*35238bceSAndroid Build Coastguard Worker 
renderQuad(int texUnit,const float * texCoord,const RenderParams & params)455*35238bceSAndroid Build Coastguard Worker void TextureRenderer::renderQuad(int texUnit, const float *texCoord, const RenderParams &params)
456*35238bceSAndroid Build Coastguard Worker {
457*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
458*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 wCoord         = params.flags & RenderParams::PROJECTED ? params.w : tcu::Vec4(1.0f);
459*35238bceSAndroid Build Coastguard Worker     bool useBias             = !!(params.flags & RenderParams::USE_BIAS);
460*35238bceSAndroid Build Coastguard Worker     bool logUniforms         = !!(params.flags & RenderParams::LOG_UNIFORMS);
461*35238bceSAndroid Build Coastguard Worker 
462*35238bceSAndroid Build Coastguard Worker     // Render quad with texture.
463*35238bceSAndroid Build Coastguard Worker     float position[]                = {-1.0f * wCoord.x(), -1.0f * wCoord.x(), 0.0f, wCoord.x(),
464*35238bceSAndroid Build Coastguard Worker                                        -1.0f * wCoord.y(), +1.0f * wCoord.y(), 0.0f, wCoord.y(),
465*35238bceSAndroid Build Coastguard Worker                                        +1.0f * wCoord.z(), -1.0f * wCoord.z(), 0.0f, wCoord.z(),
466*35238bceSAndroid Build Coastguard Worker                                        +1.0f * wCoord.w(), +1.0f * wCoord.w(), 0.0f, wCoord.w()};
467*35238bceSAndroid Build Coastguard Worker     static const uint16_t indices[] = {0, 1, 2, 2, 1, 3};
468*35238bceSAndroid Build Coastguard Worker 
469*35238bceSAndroid Build Coastguard Worker     Program progSpec = PROGRAM_LAST;
470*35238bceSAndroid Build Coastguard Worker     int numComps     = 0;
471*35238bceSAndroid Build Coastguard Worker     if (params.texType == TEXTURETYPE_2D)
472*35238bceSAndroid Build Coastguard Worker     {
473*35238bceSAndroid Build Coastguard Worker         numComps = 2;
474*35238bceSAndroid Build Coastguard Worker 
475*35238bceSAndroid Build Coastguard Worker         switch (params.samplerType)
476*35238bceSAndroid Build Coastguard Worker         {
477*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FLOAT:
478*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_2D_FLOAT_BIAS : PROGRAM_2D_FLOAT;
479*35238bceSAndroid Build Coastguard Worker             break;
480*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_INT:
481*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_2D_INT_BIAS : PROGRAM_2D_INT;
482*35238bceSAndroid Build Coastguard Worker             break;
483*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_UINT:
484*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_2D_UINT_BIAS : PROGRAM_2D_UINT;
485*35238bceSAndroid Build Coastguard Worker             break;
486*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_SHADOW:
487*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_2D_SHADOW_BIAS : PROGRAM_2D_SHADOW;
488*35238bceSAndroid Build Coastguard Worker             break;
489*35238bceSAndroid Build Coastguard Worker         default:
490*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
491*35238bceSAndroid Build Coastguard Worker         }
492*35238bceSAndroid Build Coastguard Worker     }
493*35238bceSAndroid Build Coastguard Worker     else if (params.texType == TEXTURETYPE_1D)
494*35238bceSAndroid Build Coastguard Worker     {
495*35238bceSAndroid Build Coastguard Worker         numComps = 1;
496*35238bceSAndroid Build Coastguard Worker 
497*35238bceSAndroid Build Coastguard Worker         switch (params.samplerType)
498*35238bceSAndroid Build Coastguard Worker         {
499*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FLOAT:
500*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_1D_FLOAT_BIAS : PROGRAM_1D_FLOAT;
501*35238bceSAndroid Build Coastguard Worker             break;
502*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_INT:
503*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_1D_INT_BIAS : PROGRAM_1D_INT;
504*35238bceSAndroid Build Coastguard Worker             break;
505*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_UINT:
506*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_1D_UINT_BIAS : PROGRAM_1D_UINT;
507*35238bceSAndroid Build Coastguard Worker             break;
508*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_SHADOW:
509*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_1D_SHADOW_BIAS : PROGRAM_1D_SHADOW;
510*35238bceSAndroid Build Coastguard Worker             break;
511*35238bceSAndroid Build Coastguard Worker         default:
512*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
513*35238bceSAndroid Build Coastguard Worker         }
514*35238bceSAndroid Build Coastguard Worker     }
515*35238bceSAndroid Build Coastguard Worker     else if (params.texType == TEXTURETYPE_CUBE)
516*35238bceSAndroid Build Coastguard Worker     {
517*35238bceSAndroid Build Coastguard Worker         numComps = 3;
518*35238bceSAndroid Build Coastguard Worker 
519*35238bceSAndroid Build Coastguard Worker         switch (params.samplerType)
520*35238bceSAndroid Build Coastguard Worker         {
521*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FLOAT:
522*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_CUBE_FLOAT_BIAS : PROGRAM_CUBE_FLOAT;
523*35238bceSAndroid Build Coastguard Worker             break;
524*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_INT:
525*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_CUBE_INT_BIAS : PROGRAM_CUBE_INT;
526*35238bceSAndroid Build Coastguard Worker             break;
527*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_UINT:
528*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_CUBE_UINT_BIAS : PROGRAM_CUBE_UINT;
529*35238bceSAndroid Build Coastguard Worker             break;
530*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_SHADOW:
531*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_CUBE_SHADOW_BIAS : PROGRAM_CUBE_SHADOW;
532*35238bceSAndroid Build Coastguard Worker             break;
533*35238bceSAndroid Build Coastguard Worker         default:
534*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
535*35238bceSAndroid Build Coastguard Worker         }
536*35238bceSAndroid Build Coastguard Worker     }
537*35238bceSAndroid Build Coastguard Worker     else if (params.texType == TEXTURETYPE_3D)
538*35238bceSAndroid Build Coastguard Worker     {
539*35238bceSAndroid Build Coastguard Worker         numComps = 3;
540*35238bceSAndroid Build Coastguard Worker 
541*35238bceSAndroid Build Coastguard Worker         switch (params.samplerType)
542*35238bceSAndroid Build Coastguard Worker         {
543*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FLOAT:
544*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_3D_FLOAT_BIAS : PROGRAM_3D_FLOAT;
545*35238bceSAndroid Build Coastguard Worker             break;
546*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_INT:
547*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_3D_INT_BIAS : PROGRAM_3D_INT;
548*35238bceSAndroid Build Coastguard Worker             break;
549*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_UINT:
550*35238bceSAndroid Build Coastguard Worker             progSpec = useBias ? PROGRAM_3D_UINT_BIAS : PROGRAM_3D_UINT;
551*35238bceSAndroid Build Coastguard Worker             break;
552*35238bceSAndroid Build Coastguard Worker         default:
553*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
554*35238bceSAndroid Build Coastguard Worker         }
555*35238bceSAndroid Build Coastguard Worker     }
556*35238bceSAndroid Build Coastguard Worker     else if (params.texType == TEXTURETYPE_2D_ARRAY)
557*35238bceSAndroid Build Coastguard Worker     {
558*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!useBias); // \todo [2012-02-17 pyry] Support bias.
559*35238bceSAndroid Build Coastguard Worker 
560*35238bceSAndroid Build Coastguard Worker         numComps = 3;
561*35238bceSAndroid Build Coastguard Worker 
562*35238bceSAndroid Build Coastguard Worker         switch (params.samplerType)
563*35238bceSAndroid Build Coastguard Worker         {
564*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FLOAT:
565*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_2D_ARRAY_FLOAT;
566*35238bceSAndroid Build Coastguard Worker             break;
567*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_INT:
568*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_2D_ARRAY_INT;
569*35238bceSAndroid Build Coastguard Worker             break;
570*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_UINT:
571*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_2D_ARRAY_UINT;
572*35238bceSAndroid Build Coastguard Worker             break;
573*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_SHADOW:
574*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_2D_ARRAY_SHADOW;
575*35238bceSAndroid Build Coastguard Worker             break;
576*35238bceSAndroid Build Coastguard Worker         default:
577*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
578*35238bceSAndroid Build Coastguard Worker         }
579*35238bceSAndroid Build Coastguard Worker     }
580*35238bceSAndroid Build Coastguard Worker     else if (params.texType == TEXTURETYPE_CUBE_ARRAY)
581*35238bceSAndroid Build Coastguard Worker     {
582*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!useBias);
583*35238bceSAndroid Build Coastguard Worker 
584*35238bceSAndroid Build Coastguard Worker         numComps = 4;
585*35238bceSAndroid Build Coastguard Worker 
586*35238bceSAndroid Build Coastguard Worker         switch (params.samplerType)
587*35238bceSAndroid Build Coastguard Worker         {
588*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FLOAT:
589*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_CUBE_ARRAY_FLOAT;
590*35238bceSAndroid Build Coastguard Worker             break;
591*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_INT:
592*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_CUBE_ARRAY_INT;
593*35238bceSAndroid Build Coastguard Worker             break;
594*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_UINT:
595*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_CUBE_ARRAY_UINT;
596*35238bceSAndroid Build Coastguard Worker             break;
597*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_SHADOW:
598*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_CUBE_ARRAY_SHADOW;
599*35238bceSAndroid Build Coastguard Worker             break;
600*35238bceSAndroid Build Coastguard Worker         default:
601*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
602*35238bceSAndroid Build Coastguard Worker         }
603*35238bceSAndroid Build Coastguard Worker     }
604*35238bceSAndroid Build Coastguard Worker     else if (params.texType == TEXTURETYPE_1D_ARRAY)
605*35238bceSAndroid Build Coastguard Worker     {
606*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!useBias); // \todo [2012-02-17 pyry] Support bias.
607*35238bceSAndroid Build Coastguard Worker 
608*35238bceSAndroid Build Coastguard Worker         numComps = 2;
609*35238bceSAndroid Build Coastguard Worker 
610*35238bceSAndroid Build Coastguard Worker         switch (params.samplerType)
611*35238bceSAndroid Build Coastguard Worker         {
612*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FLOAT:
613*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_1D_ARRAY_FLOAT;
614*35238bceSAndroid Build Coastguard Worker             break;
615*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_INT:
616*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_1D_ARRAY_INT;
617*35238bceSAndroid Build Coastguard Worker             break;
618*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_UINT:
619*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_1D_ARRAY_UINT;
620*35238bceSAndroid Build Coastguard Worker             break;
621*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_SHADOW:
622*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_1D_ARRAY_SHADOW;
623*35238bceSAndroid Build Coastguard Worker             break;
624*35238bceSAndroid Build Coastguard Worker         default:
625*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
626*35238bceSAndroid Build Coastguard Worker         }
627*35238bceSAndroid Build Coastguard Worker     }
628*35238bceSAndroid Build Coastguard Worker     else if (params.texType == TEXTURETYPE_BUFFER)
629*35238bceSAndroid Build Coastguard Worker     {
630*35238bceSAndroid Build Coastguard Worker         numComps = 1;
631*35238bceSAndroid Build Coastguard Worker 
632*35238bceSAndroid Build Coastguard Worker         switch (params.samplerType)
633*35238bceSAndroid Build Coastguard Worker         {
634*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FETCH_FLOAT:
635*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_BUFFER_FLOAT;
636*35238bceSAndroid Build Coastguard Worker             break;
637*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FETCH_INT:
638*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_BUFFER_INT;
639*35238bceSAndroid Build Coastguard Worker             break;
640*35238bceSAndroid Build Coastguard Worker         case SAMPLERTYPE_FETCH_UINT:
641*35238bceSAndroid Build Coastguard Worker             progSpec = PROGRAM_BUFFER_UINT;
642*35238bceSAndroid Build Coastguard Worker             break;
643*35238bceSAndroid Build Coastguard Worker         default:
644*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
645*35238bceSAndroid Build Coastguard Worker         }
646*35238bceSAndroid Build Coastguard Worker     }
647*35238bceSAndroid Build Coastguard Worker     else
648*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
649*35238bceSAndroid Build Coastguard Worker 
650*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *program = m_programLibrary.getProgram(progSpec);
651*35238bceSAndroid Build Coastguard Worker 
652*35238bceSAndroid Build Coastguard Worker     // \todo [2012-09-26 pyry] Move to ProgramLibrary and log unique programs only(?)
653*35238bceSAndroid Build Coastguard Worker     if (params.flags & RenderParams::LOG_PROGRAMS)
654*35238bceSAndroid Build Coastguard Worker         m_log << *program;
655*35238bceSAndroid Build Coastguard Worker 
656*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Set vertex attributes");
657*35238bceSAndroid Build Coastguard Worker 
658*35238bceSAndroid Build Coastguard Worker     // Program and uniforms.
659*35238bceSAndroid Build Coastguard Worker     uint32_t prog = program->getProgram();
660*35238bceSAndroid Build Coastguard Worker     gl.useProgram(prog);
661*35238bceSAndroid Build Coastguard Worker 
662*35238bceSAndroid Build Coastguard Worker     gl.uniform1i(gl.getUniformLocation(prog, "u_sampler"), texUnit);
663*35238bceSAndroid Build Coastguard Worker     if (logUniforms)
664*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "u_sampler = " << texUnit << TestLog::EndMessage;
665*35238bceSAndroid Build Coastguard Worker 
666*35238bceSAndroid Build Coastguard Worker     if (useBias)
667*35238bceSAndroid Build Coastguard Worker     {
668*35238bceSAndroid Build Coastguard Worker         gl.uniform1f(gl.getUniformLocation(prog, "u_bias"), params.bias);
669*35238bceSAndroid Build Coastguard Worker         if (logUniforms)
670*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "u_bias = " << params.bias << TestLog::EndMessage;
671*35238bceSAndroid Build Coastguard Worker     }
672*35238bceSAndroid Build Coastguard Worker 
673*35238bceSAndroid Build Coastguard Worker     if (params.samplerType == SAMPLERTYPE_SHADOW)
674*35238bceSAndroid Build Coastguard Worker     {
675*35238bceSAndroid Build Coastguard Worker         gl.uniform1f(gl.getUniformLocation(prog, "u_ref"), params.ref);
676*35238bceSAndroid Build Coastguard Worker         if (logUniforms)
677*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "u_ref = " << params.ref << TestLog::EndMessage;
678*35238bceSAndroid Build Coastguard Worker     }
679*35238bceSAndroid Build Coastguard Worker 
680*35238bceSAndroid Build Coastguard Worker     gl.uniform4fv(gl.getUniformLocation(prog, "u_colorScale"), 1, params.colorScale.getPtr());
681*35238bceSAndroid Build Coastguard Worker     gl.uniform4fv(gl.getUniformLocation(prog, "u_colorBias"), 1, params.colorBias.getPtr());
682*35238bceSAndroid Build Coastguard Worker 
683*35238bceSAndroid Build Coastguard Worker     if (logUniforms)
684*35238bceSAndroid Build Coastguard Worker     {
685*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "u_colorScale = " << params.colorScale << TestLog::EndMessage;
686*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "u_colorBias = " << params.colorBias << TestLog::EndMessage;
687*35238bceSAndroid Build Coastguard Worker     }
688*35238bceSAndroid Build Coastguard Worker 
689*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Set program state");
690*35238bceSAndroid Build Coastguard Worker 
691*35238bceSAndroid Build Coastguard Worker     {
692*35238bceSAndroid Build Coastguard Worker         const glu::VertexArrayBinding vertexArrays[] = {glu::va::Float("a_position", 4, 4, 0, &position[0]),
693*35238bceSAndroid Build Coastguard Worker                                                         glu::va::Float("a_texCoord", numComps, 4, 0, texCoord)};
694*35238bceSAndroid Build Coastguard Worker         glu::draw(m_renderCtx, prog, DE_LENGTH_OF_ARRAY(vertexArrays), &vertexArrays[0],
695*35238bceSAndroid Build Coastguard Worker                   glu::pr::Triangles(DE_LENGTH_OF_ARRAY(indices), &indices[0]));
696*35238bceSAndroid Build Coastguard Worker     }
697*35238bceSAndroid Build Coastguard Worker }
698*35238bceSAndroid Build Coastguard Worker 
getTexCoordPrecision()699*35238bceSAndroid Build Coastguard Worker glu::Precision TextureRenderer::getTexCoordPrecision()
700*35238bceSAndroid Build Coastguard Worker {
701*35238bceSAndroid Build Coastguard Worker     return m_programLibrary.getTexCoordPrecision();
702*35238bceSAndroid Build Coastguard Worker }
703*35238bceSAndroid Build Coastguard Worker 
704*35238bceSAndroid Build Coastguard Worker } // namespace TextureTestUtil
705*35238bceSAndroid Build Coastguard Worker } // namespace gls
706*35238bceSAndroid Build Coastguard Worker } // namespace deqp
707