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 ¶ms)
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