1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.1 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 glProgramUniform*() tests.
22*35238bceSAndroid Build Coastguard Worker *
23*35238bceSAndroid Build Coastguard Worker * \todo [2013-02-26 nuutti] Much duplication between ES2&3 uniform api
24*35238bceSAndroid Build Coastguard Worker * tests and this. Utilities to glshared?
25*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
26*35238bceSAndroid Build Coastguard Worker
27*35238bceSAndroid Build Coastguard Worker #include "es31fProgramUniformTests.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluVarType.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "gluDrawUtil.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "tcuCommandLine.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
40*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
41*35238bceSAndroid Build Coastguard Worker #include "deString.h"
42*35238bceSAndroid Build Coastguard Worker #include "deSharedPtr.hpp"
43*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
44*35238bceSAndroid Build Coastguard Worker
45*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
46*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker #include <set>
49*35238bceSAndroid Build Coastguard Worker #include <cstring>
50*35238bceSAndroid Build Coastguard Worker
51*35238bceSAndroid Build Coastguard Worker using namespace glw;
52*35238bceSAndroid Build Coastguard Worker
53*35238bceSAndroid Build Coastguard Worker namespace deqp
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker namespace gles31
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker namespace Functional
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker
60*35238bceSAndroid Build Coastguard Worker using de::Random;
61*35238bceSAndroid Build Coastguard Worker using de::SharedPtr;
62*35238bceSAndroid Build Coastguard Worker using glu::ShaderProgram;
63*35238bceSAndroid Build Coastguard Worker using glu::StructType;
64*35238bceSAndroid Build Coastguard Worker using std::string;
65*35238bceSAndroid Build Coastguard Worker using std::vector;
66*35238bceSAndroid Build Coastguard Worker using tcu::ScopedLogSection;
67*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
68*35238bceSAndroid Build Coastguard Worker
69*35238bceSAndroid Build Coastguard Worker typedef bool (*dataTypePredicate)(glu::DataType);
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard Worker enum
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker MAX_RENDER_WIDTH = 32,
74*35238bceSAndroid Build Coastguard Worker MAX_RENDER_HEIGHT = 32,
75*35238bceSAndroid Build Coastguard Worker MAX_NUM_SAMPLER_UNIFORMS = 16
76*35238bceSAndroid Build Coastguard Worker };
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker static const glu::DataType s_testDataTypes[] = {
79*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT, glu::TYPE_FLOAT_VEC2, glu::TYPE_FLOAT_VEC3, glu::TYPE_FLOAT_VEC4,
80*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT_MAT2, glu::TYPE_FLOAT_MAT2X3, glu::TYPE_FLOAT_MAT2X4, glu::TYPE_FLOAT_MAT3X2,
81*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT_MAT3, glu::TYPE_FLOAT_MAT3X4, glu::TYPE_FLOAT_MAT4X2, glu::TYPE_FLOAT_MAT4X3,
82*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT_MAT4,
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker glu::TYPE_INT, glu::TYPE_INT_VEC2, glu::TYPE_INT_VEC3, glu::TYPE_INT_VEC4,
85*35238bceSAndroid Build Coastguard Worker
86*35238bceSAndroid Build Coastguard Worker glu::TYPE_UINT, glu::TYPE_UINT_VEC2, glu::TYPE_UINT_VEC3, glu::TYPE_UINT_VEC4,
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker glu::TYPE_BOOL, glu::TYPE_BOOL_VEC2, glu::TYPE_BOOL_VEC3, glu::TYPE_BOOL_VEC4,
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker glu::TYPE_SAMPLER_2D, glu::TYPE_SAMPLER_CUBE
91*35238bceSAndroid Build Coastguard Worker // \note We don't test all sampler types here.
92*35238bceSAndroid Build Coastguard Worker };
93*35238bceSAndroid Build Coastguard Worker
getGLInt(const glw::Functions & funcs,const uint32_t name)94*35238bceSAndroid Build Coastguard Worker static inline int getGLInt(const glw::Functions &funcs, const uint32_t name)
95*35238bceSAndroid Build Coastguard Worker {
96*35238bceSAndroid Build Coastguard Worker int val = -1;
97*35238bceSAndroid Build Coastguard Worker funcs.getIntegerv(name, &val);
98*35238bceSAndroid Build Coastguard Worker return val;
99*35238bceSAndroid Build Coastguard Worker }
100*35238bceSAndroid Build Coastguard Worker
vec4FromPtr(const float * const ptr)101*35238bceSAndroid Build Coastguard Worker static inline tcu::Vec4 vec4FromPtr(const float *const ptr)
102*35238bceSAndroid Build Coastguard Worker {
103*35238bceSAndroid Build Coastguard Worker tcu::Vec4 result;
104*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
105*35238bceSAndroid Build Coastguard Worker result[i] = ptr[i];
106*35238bceSAndroid Build Coastguard Worker return result;
107*35238bceSAndroid Build Coastguard Worker }
108*35238bceSAndroid Build Coastguard Worker
beforeLast(const string & str,const char c)109*35238bceSAndroid Build Coastguard Worker static inline string beforeLast(const string &str, const char c)
110*35238bceSAndroid Build Coastguard Worker {
111*35238bceSAndroid Build Coastguard Worker return str.substr(0, str.find_last_of(c));
112*35238bceSAndroid Build Coastguard Worker }
113*35238bceSAndroid Build Coastguard Worker
fillWithColor(const tcu::PixelBufferAccess & access,const tcu::Vec4 & color)114*35238bceSAndroid Build Coastguard Worker static inline void fillWithColor(const tcu::PixelBufferAccess &access, const tcu::Vec4 &color)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker for (int z = 0; z < access.getDepth(); z++)
117*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < access.getHeight(); y++)
118*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < access.getWidth(); x++)
119*35238bceSAndroid Build Coastguard Worker access.setPixel(color, x, y, z);
120*35238bceSAndroid Build Coastguard Worker }
121*35238bceSAndroid Build Coastguard Worker
getSamplerNumLookupDimensions(const glu::DataType type)122*35238bceSAndroid Build Coastguard Worker static inline int getSamplerNumLookupDimensions(const glu::DataType type)
123*35238bceSAndroid Build Coastguard Worker {
124*35238bceSAndroid Build Coastguard Worker switch (type)
125*35238bceSAndroid Build Coastguard Worker {
126*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_2D:
127*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_SAMPLER_2D:
128*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_SAMPLER_2D:
129*35238bceSAndroid Build Coastguard Worker return 2;
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_3D:
132*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_SAMPLER_3D:
133*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_SAMPLER_3D:
134*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_2D_SHADOW:
135*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_2D_ARRAY:
136*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_SAMPLER_2D_ARRAY:
137*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_SAMPLER_2D_ARRAY:
138*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_CUBE:
139*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_SAMPLER_CUBE:
140*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_SAMPLER_CUBE:
141*35238bceSAndroid Build Coastguard Worker return 3;
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_CUBE_SHADOW:
144*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_2D_ARRAY_SHADOW:
145*35238bceSAndroid Build Coastguard Worker return 4;
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker default:
148*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
149*35238bceSAndroid Build Coastguard Worker return 0;
150*35238bceSAndroid Build Coastguard Worker }
151*35238bceSAndroid Build Coastguard Worker }
152*35238bceSAndroid Build Coastguard Worker
getSamplerLookupReturnType(const glu::DataType type)153*35238bceSAndroid Build Coastguard Worker static inline glu::DataType getSamplerLookupReturnType(const glu::DataType type)
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker switch (type)
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_2D:
158*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_CUBE:
159*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_2D_ARRAY:
160*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_3D:
161*35238bceSAndroid Build Coastguard Worker return glu::TYPE_FLOAT_VEC4;
162*35238bceSAndroid Build Coastguard Worker
163*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_SAMPLER_2D:
164*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_SAMPLER_CUBE:
165*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_SAMPLER_2D_ARRAY:
166*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_SAMPLER_3D:
167*35238bceSAndroid Build Coastguard Worker return glu::TYPE_UINT_VEC4;
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_SAMPLER_2D:
170*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_SAMPLER_CUBE:
171*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_SAMPLER_2D_ARRAY:
172*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_SAMPLER_3D:
173*35238bceSAndroid Build Coastguard Worker return glu::TYPE_INT_VEC4;
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_2D_SHADOW:
176*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_CUBE_SHADOW:
177*35238bceSAndroid Build Coastguard Worker case glu::TYPE_SAMPLER_2D_ARRAY_SHADOW:
178*35238bceSAndroid Build Coastguard Worker return glu::TYPE_FLOAT;
179*35238bceSAndroid Build Coastguard Worker
180*35238bceSAndroid Build Coastguard Worker default:
181*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
182*35238bceSAndroid Build Coastguard Worker return glu::TYPE_LAST;
183*35238bceSAndroid Build Coastguard Worker }
184*35238bceSAndroid Build Coastguard Worker }
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker template <glu::DataType T>
dataTypeEquals(const glu::DataType t)187*35238bceSAndroid Build Coastguard Worker static bool dataTypeEquals(const glu::DataType t)
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker return t == T;
190*35238bceSAndroid Build Coastguard Worker }
191*35238bceSAndroid Build Coastguard Worker
192*35238bceSAndroid Build Coastguard Worker template <int N>
dataTypeIsMatrixWithNRows(const glu::DataType t)193*35238bceSAndroid Build Coastguard Worker static bool dataTypeIsMatrixWithNRows(const glu::DataType t)
194*35238bceSAndroid Build Coastguard Worker {
195*35238bceSAndroid Build Coastguard Worker return glu::isDataTypeMatrix(t) && glu::getDataTypeMatrixNumRows(t) == N;
196*35238bceSAndroid Build Coastguard Worker }
197*35238bceSAndroid Build Coastguard Worker
typeContainsMatchingBasicType(const glu::VarType & type,const dataTypePredicate predicate)198*35238bceSAndroid Build Coastguard Worker static bool typeContainsMatchingBasicType(const glu::VarType &type, const dataTypePredicate predicate)
199*35238bceSAndroid Build Coastguard Worker {
200*35238bceSAndroid Build Coastguard Worker if (type.isBasicType())
201*35238bceSAndroid Build Coastguard Worker return predicate(type.getBasicType());
202*35238bceSAndroid Build Coastguard Worker else if (type.isArrayType())
203*35238bceSAndroid Build Coastguard Worker return typeContainsMatchingBasicType(type.getElementType(), predicate);
204*35238bceSAndroid Build Coastguard Worker else
205*35238bceSAndroid Build Coastguard Worker {
206*35238bceSAndroid Build Coastguard Worker DE_ASSERT(type.isStructType());
207*35238bceSAndroid Build Coastguard Worker const StructType &structType = *type.getStructPtr();
208*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < structType.getNumMembers(); i++)
209*35238bceSAndroid Build Coastguard Worker if (typeContainsMatchingBasicType(structType.getMember(i).getType(), predicate))
210*35238bceSAndroid Build Coastguard Worker return true;
211*35238bceSAndroid Build Coastguard Worker return false;
212*35238bceSAndroid Build Coastguard Worker }
213*35238bceSAndroid Build Coastguard Worker }
214*35238bceSAndroid Build Coastguard Worker
getDistinctSamplerTypes(vector<glu::DataType> & dst,const glu::VarType & type)215*35238bceSAndroid Build Coastguard Worker static void getDistinctSamplerTypes(vector<glu::DataType> &dst, const glu::VarType &type)
216*35238bceSAndroid Build Coastguard Worker {
217*35238bceSAndroid Build Coastguard Worker if (type.isBasicType())
218*35238bceSAndroid Build Coastguard Worker {
219*35238bceSAndroid Build Coastguard Worker const glu::DataType basicType = type.getBasicType();
220*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeSampler(basicType) && std::find(dst.begin(), dst.end(), basicType) == dst.end())
221*35238bceSAndroid Build Coastguard Worker dst.push_back(basicType);
222*35238bceSAndroid Build Coastguard Worker }
223*35238bceSAndroid Build Coastguard Worker else if (type.isArrayType())
224*35238bceSAndroid Build Coastguard Worker getDistinctSamplerTypes(dst, type.getElementType());
225*35238bceSAndroid Build Coastguard Worker else
226*35238bceSAndroid Build Coastguard Worker {
227*35238bceSAndroid Build Coastguard Worker DE_ASSERT(type.isStructType());
228*35238bceSAndroid Build Coastguard Worker const StructType &structType = *type.getStructPtr();
229*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < structType.getNumMembers(); i++)
230*35238bceSAndroid Build Coastguard Worker getDistinctSamplerTypes(dst, structType.getMember(i).getType());
231*35238bceSAndroid Build Coastguard Worker }
232*35238bceSAndroid Build Coastguard Worker }
233*35238bceSAndroid Build Coastguard Worker
getNumSamplersInType(const glu::VarType & type)234*35238bceSAndroid Build Coastguard Worker static int getNumSamplersInType(const glu::VarType &type)
235*35238bceSAndroid Build Coastguard Worker {
236*35238bceSAndroid Build Coastguard Worker if (type.isBasicType())
237*35238bceSAndroid Build Coastguard Worker return glu::isDataTypeSampler(type.getBasicType()) ? 1 : 0;
238*35238bceSAndroid Build Coastguard Worker else if (type.isArrayType())
239*35238bceSAndroid Build Coastguard Worker return getNumSamplersInType(type.getElementType()) * type.getArraySize();
240*35238bceSAndroid Build Coastguard Worker else
241*35238bceSAndroid Build Coastguard Worker {
242*35238bceSAndroid Build Coastguard Worker DE_ASSERT(type.isStructType());
243*35238bceSAndroid Build Coastguard Worker const StructType &structType = *type.getStructPtr();
244*35238bceSAndroid Build Coastguard Worker int sum = 0;
245*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < structType.getNumMembers(); i++)
246*35238bceSAndroid Build Coastguard Worker sum += getNumSamplersInType(structType.getMember(i).getType());
247*35238bceSAndroid Build Coastguard Worker return sum;
248*35238bceSAndroid Build Coastguard Worker }
249*35238bceSAndroid Build Coastguard Worker }
250*35238bceSAndroid Build Coastguard Worker
251*35238bceSAndroid Build Coastguard Worker namespace
252*35238bceSAndroid Build Coastguard Worker {
253*35238bceSAndroid Build Coastguard Worker
254*35238bceSAndroid Build Coastguard Worker struct VarValue
255*35238bceSAndroid Build Coastguard Worker {
256*35238bceSAndroid Build Coastguard Worker glu::DataType type;
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard Worker union
259*35238bceSAndroid Build Coastguard Worker {
260*35238bceSAndroid Build Coastguard Worker float floatV[4 * 4]; // At most mat4. \note Matrices here are column-major.
261*35238bceSAndroid Build Coastguard Worker int32_t intV[4];
262*35238bceSAndroid Build Coastguard Worker uint32_t uintV[4];
263*35238bceSAndroid Build Coastguard Worker bool boolV[4];
264*35238bceSAndroid Build Coastguard Worker struct
265*35238bceSAndroid Build Coastguard Worker {
266*35238bceSAndroid Build Coastguard Worker int unit;
267*35238bceSAndroid Build Coastguard Worker union
268*35238bceSAndroid Build Coastguard Worker {
269*35238bceSAndroid Build Coastguard Worker float floatV[4];
270*35238bceSAndroid Build Coastguard Worker int32_t intV[4];
271*35238bceSAndroid Build Coastguard Worker uint32_t uintV[4];
272*35238bceSAndroid Build Coastguard Worker } fillColor;
273*35238bceSAndroid Build Coastguard Worker } samplerV;
274*35238bceSAndroid Build Coastguard Worker } val;
275*35238bceSAndroid Build Coastguard Worker };
276*35238bceSAndroid Build Coastguard Worker
277*35238bceSAndroid Build Coastguard Worker enum CaseShaderType
278*35238bceSAndroid Build Coastguard Worker {
279*35238bceSAndroid Build Coastguard Worker CASESHADERTYPE_VERTEX = 0,
280*35238bceSAndroid Build Coastguard Worker CASESHADERTYPE_FRAGMENT,
281*35238bceSAndroid Build Coastguard Worker CASESHADERTYPE_BOTH,
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker CASESHADERTYPE_LAST
284*35238bceSAndroid Build Coastguard Worker };
285*35238bceSAndroid Build Coastguard Worker
286*35238bceSAndroid Build Coastguard Worker struct Uniform
287*35238bceSAndroid Build Coastguard Worker {
288*35238bceSAndroid Build Coastguard Worker string name;
289*35238bceSAndroid Build Coastguard Worker glu::VarType type;
290*35238bceSAndroid Build Coastguard Worker
Uniformdeqp::gles31::Functional::__anoneda19b060211::Uniform291*35238bceSAndroid Build Coastguard Worker Uniform(const char *const name_, const glu::VarType &type_) : name(name_), type(type_)
292*35238bceSAndroid Build Coastguard Worker {
293*35238bceSAndroid Build Coastguard Worker }
294*35238bceSAndroid Build Coastguard Worker };
295*35238bceSAndroid Build Coastguard Worker
296*35238bceSAndroid Build Coastguard Worker // A set of uniforms, along with related struct types.
297*35238bceSAndroid Build Coastguard Worker class UniformCollection
298*35238bceSAndroid Build Coastguard Worker {
299*35238bceSAndroid Build Coastguard Worker public:
getNumUniforms(void) const300*35238bceSAndroid Build Coastguard Worker int getNumUniforms(void) const
301*35238bceSAndroid Build Coastguard Worker {
302*35238bceSAndroid Build Coastguard Worker return (int)m_uniforms.size();
303*35238bceSAndroid Build Coastguard Worker }
getNumStructTypes(void) const304*35238bceSAndroid Build Coastguard Worker int getNumStructTypes(void) const
305*35238bceSAndroid Build Coastguard Worker {
306*35238bceSAndroid Build Coastguard Worker return (int)m_structTypes.size();
307*35238bceSAndroid Build Coastguard Worker }
getUniform(const int ndx)308*35238bceSAndroid Build Coastguard Worker Uniform &getUniform(const int ndx)
309*35238bceSAndroid Build Coastguard Worker {
310*35238bceSAndroid Build Coastguard Worker return m_uniforms[ndx];
311*35238bceSAndroid Build Coastguard Worker }
getUniform(const int ndx) const312*35238bceSAndroid Build Coastguard Worker const Uniform &getUniform(const int ndx) const
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker return m_uniforms[ndx];
315*35238bceSAndroid Build Coastguard Worker }
getStructType(const int ndx) const316*35238bceSAndroid Build Coastguard Worker const StructType *getStructType(const int ndx) const
317*35238bceSAndroid Build Coastguard Worker {
318*35238bceSAndroid Build Coastguard Worker return m_structTypes[ndx];
319*35238bceSAndroid Build Coastguard Worker }
addUniform(const Uniform & uniform)320*35238bceSAndroid Build Coastguard Worker void addUniform(const Uniform &uniform)
321*35238bceSAndroid Build Coastguard Worker {
322*35238bceSAndroid Build Coastguard Worker m_uniforms.push_back(uniform);
323*35238bceSAndroid Build Coastguard Worker }
addStructType(const StructType * const type)324*35238bceSAndroid Build Coastguard Worker void addStructType(const StructType *const type)
325*35238bceSAndroid Build Coastguard Worker {
326*35238bceSAndroid Build Coastguard Worker m_structTypes.push_back(type);
327*35238bceSAndroid Build Coastguard Worker }
328*35238bceSAndroid Build Coastguard Worker
UniformCollection(void)329*35238bceSAndroid Build Coastguard Worker UniformCollection(void)
330*35238bceSAndroid Build Coastguard Worker {
331*35238bceSAndroid Build Coastguard Worker }
~UniformCollection(void)332*35238bceSAndroid Build Coastguard Worker ~UniformCollection(void)
333*35238bceSAndroid Build Coastguard Worker {
334*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_structTypes.size(); i++)
335*35238bceSAndroid Build Coastguard Worker delete m_structTypes[i];
336*35238bceSAndroid Build Coastguard Worker }
337*35238bceSAndroid Build Coastguard Worker
338*35238bceSAndroid Build Coastguard Worker // Add the contents of m_uniforms and m_structTypes to receiver, and remove them from this one.
339*35238bceSAndroid Build Coastguard Worker // \note receiver takes ownership of the struct types.
moveContents(UniformCollection & receiver)340*35238bceSAndroid Build Coastguard Worker void moveContents(UniformCollection &receiver)
341*35238bceSAndroid Build Coastguard Worker {
342*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_uniforms.size(); i++)
343*35238bceSAndroid Build Coastguard Worker receiver.addUniform(m_uniforms[i]);
344*35238bceSAndroid Build Coastguard Worker m_uniforms.clear();
345*35238bceSAndroid Build Coastguard Worker
346*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_structTypes.size(); i++)
347*35238bceSAndroid Build Coastguard Worker receiver.addStructType(m_structTypes[i]);
348*35238bceSAndroid Build Coastguard Worker m_structTypes.clear();
349*35238bceSAndroid Build Coastguard Worker }
350*35238bceSAndroid Build Coastguard Worker
containsMatchingBasicType(const dataTypePredicate predicate) const351*35238bceSAndroid Build Coastguard Worker bool containsMatchingBasicType(const dataTypePredicate predicate) const
352*35238bceSAndroid Build Coastguard Worker {
353*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_uniforms.size(); i++)
354*35238bceSAndroid Build Coastguard Worker if (typeContainsMatchingBasicType(m_uniforms[i].type, predicate))
355*35238bceSAndroid Build Coastguard Worker return true;
356*35238bceSAndroid Build Coastguard Worker return false;
357*35238bceSAndroid Build Coastguard Worker }
358*35238bceSAndroid Build Coastguard Worker
getSamplerTypes(void) const359*35238bceSAndroid Build Coastguard Worker vector<glu::DataType> getSamplerTypes(void) const
360*35238bceSAndroid Build Coastguard Worker {
361*35238bceSAndroid Build Coastguard Worker vector<glu::DataType> samplerTypes;
362*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_uniforms.size(); i++)
363*35238bceSAndroid Build Coastguard Worker getDistinctSamplerTypes(samplerTypes, m_uniforms[i].type);
364*35238bceSAndroid Build Coastguard Worker return samplerTypes;
365*35238bceSAndroid Build Coastguard Worker }
366*35238bceSAndroid Build Coastguard Worker
containsSeveralSamplerTypes(void) const367*35238bceSAndroid Build Coastguard Worker bool containsSeveralSamplerTypes(void) const
368*35238bceSAndroid Build Coastguard Worker {
369*35238bceSAndroid Build Coastguard Worker return getSamplerTypes().size() > 1;
370*35238bceSAndroid Build Coastguard Worker }
371*35238bceSAndroid Build Coastguard Worker
getNumSamplers(void) const372*35238bceSAndroid Build Coastguard Worker int getNumSamplers(void) const
373*35238bceSAndroid Build Coastguard Worker {
374*35238bceSAndroid Build Coastguard Worker int sum = 0;
375*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_uniforms.size(); i++)
376*35238bceSAndroid Build Coastguard Worker sum += getNumSamplersInType(m_uniforms[i].type);
377*35238bceSAndroid Build Coastguard Worker return sum;
378*35238bceSAndroid Build Coastguard Worker }
379*35238bceSAndroid Build Coastguard Worker
basic(const glu::DataType type,const char * const nameSuffix="")380*35238bceSAndroid Build Coastguard Worker static UniformCollection *basic(const glu::DataType type, const char *const nameSuffix = "")
381*35238bceSAndroid Build Coastguard Worker {
382*35238bceSAndroid Build Coastguard Worker UniformCollection *const res = new UniformCollection;
383*35238bceSAndroid Build Coastguard Worker const glu::Precision prec = glu::isDataTypeBoolOrBVec(type) ? glu::PRECISION_LAST : glu::PRECISION_MEDIUMP;
384*35238bceSAndroid Build Coastguard Worker res->m_uniforms.push_back(Uniform((string("u_var") + nameSuffix).c_str(), glu::VarType(type, prec)));
385*35238bceSAndroid Build Coastguard Worker return res;
386*35238bceSAndroid Build Coastguard Worker }
387*35238bceSAndroid Build Coastguard Worker
basicArray(const glu::DataType type,const char * const nameSuffix="")388*35238bceSAndroid Build Coastguard Worker static UniformCollection *basicArray(const glu::DataType type, const char *const nameSuffix = "")
389*35238bceSAndroid Build Coastguard Worker {
390*35238bceSAndroid Build Coastguard Worker UniformCollection *const res = new UniformCollection;
391*35238bceSAndroid Build Coastguard Worker const glu::Precision prec = glu::isDataTypeBoolOrBVec(type) ? glu::PRECISION_LAST : glu::PRECISION_MEDIUMP;
392*35238bceSAndroid Build Coastguard Worker res->m_uniforms.push_back(
393*35238bceSAndroid Build Coastguard Worker Uniform((string("u_var") + nameSuffix).c_str(), glu::VarType(glu::VarType(type, prec), 3)));
394*35238bceSAndroid Build Coastguard Worker return res;
395*35238bceSAndroid Build Coastguard Worker }
396*35238bceSAndroid Build Coastguard Worker
basicStruct(const glu::DataType type0,const glu::DataType type1,const bool containsArrays,const char * const nameSuffix="")397*35238bceSAndroid Build Coastguard Worker static UniformCollection *basicStruct(const glu::DataType type0, const glu::DataType type1,
398*35238bceSAndroid Build Coastguard Worker const bool containsArrays, const char *const nameSuffix = "")
399*35238bceSAndroid Build Coastguard Worker {
400*35238bceSAndroid Build Coastguard Worker UniformCollection *const res = new UniformCollection;
401*35238bceSAndroid Build Coastguard Worker const glu::Precision prec0 = glu::isDataTypeBoolOrBVec(type0) ? glu::PRECISION_LAST : glu::PRECISION_MEDIUMP;
402*35238bceSAndroid Build Coastguard Worker const glu::Precision prec1 = glu::isDataTypeBoolOrBVec(type1) ? glu::PRECISION_LAST : glu::PRECISION_MEDIUMP;
403*35238bceSAndroid Build Coastguard Worker
404*35238bceSAndroid Build Coastguard Worker StructType *const structType = new StructType((string("structType") + nameSuffix).c_str());
405*35238bceSAndroid Build Coastguard Worker structType->addMember("m0", glu::VarType(type0, prec0));
406*35238bceSAndroid Build Coastguard Worker structType->addMember("m1", glu::VarType(type1, prec1));
407*35238bceSAndroid Build Coastguard Worker if (containsArrays)
408*35238bceSAndroid Build Coastguard Worker {
409*35238bceSAndroid Build Coastguard Worker structType->addMember("m2", glu::VarType(glu::VarType(type0, prec0), 3));
410*35238bceSAndroid Build Coastguard Worker structType->addMember("m3", glu::VarType(glu::VarType(type1, prec1), 3));
411*35238bceSAndroid Build Coastguard Worker }
412*35238bceSAndroid Build Coastguard Worker
413*35238bceSAndroid Build Coastguard Worker res->addStructType(structType);
414*35238bceSAndroid Build Coastguard Worker res->addUniform(Uniform((string("u_var") + nameSuffix).c_str(), glu::VarType(structType)));
415*35238bceSAndroid Build Coastguard Worker
416*35238bceSAndroid Build Coastguard Worker return res;
417*35238bceSAndroid Build Coastguard Worker }
418*35238bceSAndroid Build Coastguard Worker
structInArray(const glu::DataType type0,const glu::DataType type1,const bool containsArrays,const char * const nameSuffix="")419*35238bceSAndroid Build Coastguard Worker static UniformCollection *structInArray(const glu::DataType type0, const glu::DataType type1,
420*35238bceSAndroid Build Coastguard Worker const bool containsArrays, const char *const nameSuffix = "")
421*35238bceSAndroid Build Coastguard Worker {
422*35238bceSAndroid Build Coastguard Worker UniformCollection *const res = basicStruct(type0, type1, containsArrays, nameSuffix);
423*35238bceSAndroid Build Coastguard Worker res->getUniform(0).type = glu::VarType(res->getUniform(0).type, 3);
424*35238bceSAndroid Build Coastguard Worker return res;
425*35238bceSAndroid Build Coastguard Worker }
426*35238bceSAndroid Build Coastguard Worker
nestedArraysStructs(const glu::DataType type0,const glu::DataType type1,const char * const nameSuffix="")427*35238bceSAndroid Build Coastguard Worker static UniformCollection *nestedArraysStructs(const glu::DataType type0, const glu::DataType type1,
428*35238bceSAndroid Build Coastguard Worker const char *const nameSuffix = "")
429*35238bceSAndroid Build Coastguard Worker {
430*35238bceSAndroid Build Coastguard Worker UniformCollection *const res = new UniformCollection;
431*35238bceSAndroid Build Coastguard Worker const glu::Precision prec0 = glu::isDataTypeBoolOrBVec(type0) ? glu::PRECISION_LAST : glu::PRECISION_MEDIUMP;
432*35238bceSAndroid Build Coastguard Worker const glu::Precision prec1 = glu::isDataTypeBoolOrBVec(type1) ? glu::PRECISION_LAST : glu::PRECISION_MEDIUMP;
433*35238bceSAndroid Build Coastguard Worker StructType *const structType = new StructType((string("structType") + nameSuffix).c_str());
434*35238bceSAndroid Build Coastguard Worker StructType *const subStructType = new StructType((string("subStructType") + nameSuffix).c_str());
435*35238bceSAndroid Build Coastguard Worker StructType *const subSubStructType = new StructType((string("subSubStructType") + nameSuffix).c_str());
436*35238bceSAndroid Build Coastguard Worker
437*35238bceSAndroid Build Coastguard Worker subSubStructType->addMember("mss0", glu::VarType(type0, prec0));
438*35238bceSAndroid Build Coastguard Worker subSubStructType->addMember("mss1", glu::VarType(type1, prec1));
439*35238bceSAndroid Build Coastguard Worker
440*35238bceSAndroid Build Coastguard Worker subStructType->addMember("ms0", glu::VarType(type1, prec1));
441*35238bceSAndroid Build Coastguard Worker subStructType->addMember("ms1", glu::VarType(glu::VarType(type0, prec0), 2));
442*35238bceSAndroid Build Coastguard Worker subStructType->addMember("ms2", glu::VarType(glu::VarType(subSubStructType), 2));
443*35238bceSAndroid Build Coastguard Worker
444*35238bceSAndroid Build Coastguard Worker structType->addMember("m0", glu::VarType(type0, prec0));
445*35238bceSAndroid Build Coastguard Worker structType->addMember("m1", glu::VarType(subStructType));
446*35238bceSAndroid Build Coastguard Worker structType->addMember("m2", glu::VarType(type1, prec1));
447*35238bceSAndroid Build Coastguard Worker
448*35238bceSAndroid Build Coastguard Worker res->addStructType(subSubStructType);
449*35238bceSAndroid Build Coastguard Worker res->addStructType(subStructType);
450*35238bceSAndroid Build Coastguard Worker res->addStructType(structType);
451*35238bceSAndroid Build Coastguard Worker
452*35238bceSAndroid Build Coastguard Worker res->addUniform(Uniform((string("u_var") + nameSuffix).c_str(), glu::VarType(structType)));
453*35238bceSAndroid Build Coastguard Worker
454*35238bceSAndroid Build Coastguard Worker return res;
455*35238bceSAndroid Build Coastguard Worker }
456*35238bceSAndroid Build Coastguard Worker
multipleBasic(const char * const nameSuffix="")457*35238bceSAndroid Build Coastguard Worker static UniformCollection *multipleBasic(const char *const nameSuffix = "")
458*35238bceSAndroid Build Coastguard Worker {
459*35238bceSAndroid Build Coastguard Worker static const glu::DataType types[] = {glu::TYPE_FLOAT, glu::TYPE_INT_VEC3, glu::TYPE_UINT_VEC4,
460*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT_MAT3, glu::TYPE_BOOL_VEC2};
461*35238bceSAndroid Build Coastguard Worker UniformCollection *const res = new UniformCollection;
462*35238bceSAndroid Build Coastguard Worker
463*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < DE_LENGTH_OF_ARRAY(types); i++)
464*35238bceSAndroid Build Coastguard Worker {
465*35238bceSAndroid Build Coastguard Worker UniformCollection *const sub = basic(types[i], ("_" + de::toString(i) + nameSuffix).c_str());
466*35238bceSAndroid Build Coastguard Worker sub->moveContents(*res);
467*35238bceSAndroid Build Coastguard Worker delete sub;
468*35238bceSAndroid Build Coastguard Worker }
469*35238bceSAndroid Build Coastguard Worker
470*35238bceSAndroid Build Coastguard Worker return res;
471*35238bceSAndroid Build Coastguard Worker }
472*35238bceSAndroid Build Coastguard Worker
multipleBasicArray(const char * const nameSuffix="")473*35238bceSAndroid Build Coastguard Worker static UniformCollection *multipleBasicArray(const char *const nameSuffix = "")
474*35238bceSAndroid Build Coastguard Worker {
475*35238bceSAndroid Build Coastguard Worker static const glu::DataType types[] = {glu::TYPE_FLOAT, glu::TYPE_INT_VEC3, glu::TYPE_BOOL_VEC2};
476*35238bceSAndroid Build Coastguard Worker UniformCollection *const res = new UniformCollection;
477*35238bceSAndroid Build Coastguard Worker
478*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < DE_LENGTH_OF_ARRAY(types); i++)
479*35238bceSAndroid Build Coastguard Worker {
480*35238bceSAndroid Build Coastguard Worker UniformCollection *const sub = basicArray(types[i], ("_" + de::toString(i) + nameSuffix).c_str());
481*35238bceSAndroid Build Coastguard Worker sub->moveContents(*res);
482*35238bceSAndroid Build Coastguard Worker delete sub;
483*35238bceSAndroid Build Coastguard Worker }
484*35238bceSAndroid Build Coastguard Worker
485*35238bceSAndroid Build Coastguard Worker return res;
486*35238bceSAndroid Build Coastguard Worker }
487*35238bceSAndroid Build Coastguard Worker
multipleNestedArraysStructs(const char * const nameSuffix="")488*35238bceSAndroid Build Coastguard Worker static UniformCollection *multipleNestedArraysStructs(const char *const nameSuffix = "")
489*35238bceSAndroid Build Coastguard Worker {
490*35238bceSAndroid Build Coastguard Worker static const glu::DataType types0[] = {glu::TYPE_FLOAT, glu::TYPE_INT, glu::TYPE_BOOL_VEC4};
491*35238bceSAndroid Build Coastguard Worker static const glu::DataType types1[] = {glu::TYPE_FLOAT_VEC4, glu::TYPE_INT_VEC4, glu::TYPE_BOOL};
492*35238bceSAndroid Build Coastguard Worker UniformCollection *const res = new UniformCollection;
493*35238bceSAndroid Build Coastguard Worker
494*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(types0) == DE_LENGTH_OF_ARRAY(types1));
495*35238bceSAndroid Build Coastguard Worker
496*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < DE_LENGTH_OF_ARRAY(types0); i++)
497*35238bceSAndroid Build Coastguard Worker {
498*35238bceSAndroid Build Coastguard Worker UniformCollection *const sub =
499*35238bceSAndroid Build Coastguard Worker nestedArraysStructs(types0[i], types1[i], ("_" + de::toString(i) + nameSuffix).c_str());
500*35238bceSAndroid Build Coastguard Worker sub->moveContents(*res);
501*35238bceSAndroid Build Coastguard Worker delete sub;
502*35238bceSAndroid Build Coastguard Worker }
503*35238bceSAndroid Build Coastguard Worker
504*35238bceSAndroid Build Coastguard Worker return res;
505*35238bceSAndroid Build Coastguard Worker }
506*35238bceSAndroid Build Coastguard Worker
507*35238bceSAndroid Build Coastguard Worker private:
508*35238bceSAndroid Build Coastguard Worker // \note Copying these would be cumbersome, since deep-copying both m_uniforms and m_structTypes
509*35238bceSAndroid Build Coastguard Worker // would mean that we'd need to update pointers from uniforms to point to the new structTypes.
510*35238bceSAndroid Build Coastguard Worker // When the same UniformCollection is needed in several places, a SharedPtr is used instead.
511*35238bceSAndroid Build Coastguard Worker UniformCollection(const UniformCollection &); // Not allowed.
512*35238bceSAndroid Build Coastguard Worker UniformCollection &operator=(const UniformCollection &); // Not allowed.
513*35238bceSAndroid Build Coastguard Worker
514*35238bceSAndroid Build Coastguard Worker vector<Uniform> m_uniforms;
515*35238bceSAndroid Build Coastguard Worker vector<const StructType *> m_structTypes;
516*35238bceSAndroid Build Coastguard Worker };
517*35238bceSAndroid Build Coastguard Worker
518*35238bceSAndroid Build Coastguard Worker } // namespace
519*35238bceSAndroid Build Coastguard Worker
getSamplerFillValue(const VarValue & sampler)520*35238bceSAndroid Build Coastguard Worker static VarValue getSamplerFillValue(const VarValue &sampler)
521*35238bceSAndroid Build Coastguard Worker {
522*35238bceSAndroid Build Coastguard Worker DE_ASSERT(glu::isDataTypeSampler(sampler.type));
523*35238bceSAndroid Build Coastguard Worker
524*35238bceSAndroid Build Coastguard Worker VarValue result;
525*35238bceSAndroid Build Coastguard Worker result.type = getSamplerLookupReturnType(sampler.type);
526*35238bceSAndroid Build Coastguard Worker
527*35238bceSAndroid Build Coastguard Worker switch (result.type)
528*35238bceSAndroid Build Coastguard Worker {
529*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_VEC4:
530*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
531*35238bceSAndroid Build Coastguard Worker result.val.floatV[i] = sampler.val.samplerV.fillColor.floatV[i];
532*35238bceSAndroid Build Coastguard Worker break;
533*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_VEC4:
534*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
535*35238bceSAndroid Build Coastguard Worker result.val.uintV[i] = sampler.val.samplerV.fillColor.uintV[i];
536*35238bceSAndroid Build Coastguard Worker break;
537*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_VEC4:
538*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
539*35238bceSAndroid Build Coastguard Worker result.val.intV[i] = sampler.val.samplerV.fillColor.intV[i];
540*35238bceSAndroid Build Coastguard Worker break;
541*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT:
542*35238bceSAndroid Build Coastguard Worker result.val.floatV[0] = sampler.val.samplerV.fillColor.floatV[0];
543*35238bceSAndroid Build Coastguard Worker break;
544*35238bceSAndroid Build Coastguard Worker default:
545*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
546*35238bceSAndroid Build Coastguard Worker }
547*35238bceSAndroid Build Coastguard Worker
548*35238bceSAndroid Build Coastguard Worker return result;
549*35238bceSAndroid Build Coastguard Worker }
550*35238bceSAndroid Build Coastguard Worker
getSamplerUnitValue(const VarValue & sampler)551*35238bceSAndroid Build Coastguard Worker static VarValue getSamplerUnitValue(const VarValue &sampler)
552*35238bceSAndroid Build Coastguard Worker {
553*35238bceSAndroid Build Coastguard Worker DE_ASSERT(glu::isDataTypeSampler(sampler.type));
554*35238bceSAndroid Build Coastguard Worker
555*35238bceSAndroid Build Coastguard Worker VarValue result;
556*35238bceSAndroid Build Coastguard Worker result.type = glu::TYPE_INT;
557*35238bceSAndroid Build Coastguard Worker result.val.intV[0] = sampler.val.samplerV.unit;
558*35238bceSAndroid Build Coastguard Worker
559*35238bceSAndroid Build Coastguard Worker return result;
560*35238bceSAndroid Build Coastguard Worker }
561*35238bceSAndroid Build Coastguard Worker
getDataTypeTransposedMatrix(const glu::DataType original)562*35238bceSAndroid Build Coastguard Worker static glu::DataType getDataTypeTransposedMatrix(const glu::DataType original)
563*35238bceSAndroid Build Coastguard Worker {
564*35238bceSAndroid Build Coastguard Worker return glu::getDataTypeMatrix(glu::getDataTypeMatrixNumRows(original), glu::getDataTypeMatrixNumColumns(original));
565*35238bceSAndroid Build Coastguard Worker }
566*35238bceSAndroid Build Coastguard Worker
getTransposeMatrix(const VarValue & original)567*35238bceSAndroid Build Coastguard Worker static VarValue getTransposeMatrix(const VarValue &original)
568*35238bceSAndroid Build Coastguard Worker {
569*35238bceSAndroid Build Coastguard Worker DE_ASSERT(glu::isDataTypeMatrix(original.type));
570*35238bceSAndroid Build Coastguard Worker
571*35238bceSAndroid Build Coastguard Worker const int rows = glu::getDataTypeMatrixNumRows(original.type);
572*35238bceSAndroid Build Coastguard Worker const int cols = glu::getDataTypeMatrixNumColumns(original.type);
573*35238bceSAndroid Build Coastguard Worker VarValue result;
574*35238bceSAndroid Build Coastguard Worker result.type = getDataTypeTransposedMatrix(original.type);
575*35238bceSAndroid Build Coastguard Worker
576*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < rows; i++)
577*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < cols; j++)
578*35238bceSAndroid Build Coastguard Worker result.val.floatV[i * cols + j] = original.val.floatV[j * rows + i];
579*35238bceSAndroid Build Coastguard Worker
580*35238bceSAndroid Build Coastguard Worker return result;
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker
shaderVarValueStr(const VarValue & value)583*35238bceSAndroid Build Coastguard Worker static string shaderVarValueStr(const VarValue &value)
584*35238bceSAndroid Build Coastguard Worker {
585*35238bceSAndroid Build Coastguard Worker const int numElems = glu::getDataTypeScalarSize(value.type);
586*35238bceSAndroid Build Coastguard Worker std::ostringstream result;
587*35238bceSAndroid Build Coastguard Worker
588*35238bceSAndroid Build Coastguard Worker if (numElems > 1)
589*35238bceSAndroid Build Coastguard Worker result << glu::getDataTypeName(value.type) << "(";
590*35238bceSAndroid Build Coastguard Worker
591*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numElems; i++)
592*35238bceSAndroid Build Coastguard Worker {
593*35238bceSAndroid Build Coastguard Worker if (i > 0)
594*35238bceSAndroid Build Coastguard Worker result << ", ";
595*35238bceSAndroid Build Coastguard Worker
596*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeFloatOrVec(value.type) || glu::isDataTypeMatrix(value.type))
597*35238bceSAndroid Build Coastguard Worker result << de::floatToString(value.val.floatV[i], 2);
598*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeIntOrIVec((value.type)))
599*35238bceSAndroid Build Coastguard Worker result << de::toString(value.val.intV[i]);
600*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeUintOrUVec((value.type)))
601*35238bceSAndroid Build Coastguard Worker result << de::toString(value.val.uintV[i]) << "u";
602*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeBoolOrBVec((value.type)))
603*35238bceSAndroid Build Coastguard Worker result << (value.val.boolV[i] ? "true" : "false");
604*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeSampler((value.type)))
605*35238bceSAndroid Build Coastguard Worker result << shaderVarValueStr(getSamplerFillValue(value));
606*35238bceSAndroid Build Coastguard Worker else
607*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
608*35238bceSAndroid Build Coastguard Worker }
609*35238bceSAndroid Build Coastguard Worker
610*35238bceSAndroid Build Coastguard Worker if (numElems > 1)
611*35238bceSAndroid Build Coastguard Worker result << ")";
612*35238bceSAndroid Build Coastguard Worker
613*35238bceSAndroid Build Coastguard Worker return result.str();
614*35238bceSAndroid Build Coastguard Worker }
615*35238bceSAndroid Build Coastguard Worker
apiVarValueStr(const VarValue & value)616*35238bceSAndroid Build Coastguard Worker static string apiVarValueStr(const VarValue &value)
617*35238bceSAndroid Build Coastguard Worker {
618*35238bceSAndroid Build Coastguard Worker const int numElems = glu::getDataTypeScalarSize(value.type);
619*35238bceSAndroid Build Coastguard Worker std::ostringstream result;
620*35238bceSAndroid Build Coastguard Worker
621*35238bceSAndroid Build Coastguard Worker if (numElems > 1)
622*35238bceSAndroid Build Coastguard Worker result << "(";
623*35238bceSAndroid Build Coastguard Worker
624*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numElems; i++)
625*35238bceSAndroid Build Coastguard Worker {
626*35238bceSAndroid Build Coastguard Worker if (i > 0)
627*35238bceSAndroid Build Coastguard Worker result << ", ";
628*35238bceSAndroid Build Coastguard Worker
629*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeFloatOrVec(value.type) || glu::isDataTypeMatrix(value.type))
630*35238bceSAndroid Build Coastguard Worker result << de::floatToString(value.val.floatV[i], 2);
631*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeIntOrIVec((value.type)))
632*35238bceSAndroid Build Coastguard Worker result << de::toString(value.val.intV[i]);
633*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeUintOrUVec((value.type)))
634*35238bceSAndroid Build Coastguard Worker result << de::toString(value.val.uintV[i]);
635*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeBoolOrBVec((value.type)))
636*35238bceSAndroid Build Coastguard Worker result << (value.val.boolV[i] ? "true" : "false");
637*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeSampler((value.type)))
638*35238bceSAndroid Build Coastguard Worker result << value.val.samplerV.unit;
639*35238bceSAndroid Build Coastguard Worker else
640*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
641*35238bceSAndroid Build Coastguard Worker }
642*35238bceSAndroid Build Coastguard Worker
643*35238bceSAndroid Build Coastguard Worker if (numElems > 1)
644*35238bceSAndroid Build Coastguard Worker result << ")";
645*35238bceSAndroid Build Coastguard Worker
646*35238bceSAndroid Build Coastguard Worker return result.str();
647*35238bceSAndroid Build Coastguard Worker }
648*35238bceSAndroid Build Coastguard Worker
generateRandomVarValue(const glu::DataType type,Random & rnd,int samplerUnit=-1)649*35238bceSAndroid Build Coastguard Worker static VarValue generateRandomVarValue(
650*35238bceSAndroid Build Coastguard Worker const glu::DataType type, Random &rnd,
651*35238bceSAndroid Build Coastguard Worker int samplerUnit = -1 /* Used if type is a sampler type. \note Samplers' unit numbers are not randomized. */)
652*35238bceSAndroid Build Coastguard Worker {
653*35238bceSAndroid Build Coastguard Worker const int numElems = glu::getDataTypeScalarSize(type);
654*35238bceSAndroid Build Coastguard Worker VarValue result;
655*35238bceSAndroid Build Coastguard Worker result.type = type;
656*35238bceSAndroid Build Coastguard Worker
657*35238bceSAndroid Build Coastguard Worker DE_ASSERT((samplerUnit >= 0) == (glu::isDataTypeSampler(type)));
658*35238bceSAndroid Build Coastguard Worker
659*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeFloatOrVec(type) || glu::isDataTypeMatrix(type))
660*35238bceSAndroid Build Coastguard Worker {
661*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numElems; i++)
662*35238bceSAndroid Build Coastguard Worker result.val.floatV[i] = rnd.getFloat(-10.0f, 10.0f);
663*35238bceSAndroid Build Coastguard Worker }
664*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeIntOrIVec(type))
665*35238bceSAndroid Build Coastguard Worker {
666*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numElems; i++)
667*35238bceSAndroid Build Coastguard Worker result.val.intV[i] = rnd.getInt(-10, 10);
668*35238bceSAndroid Build Coastguard Worker }
669*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeUintOrUVec(type))
670*35238bceSAndroid Build Coastguard Worker {
671*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numElems; i++)
672*35238bceSAndroid Build Coastguard Worker result.val.uintV[i] = (uint32_t)rnd.getInt(0, 10);
673*35238bceSAndroid Build Coastguard Worker }
674*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeBoolOrBVec(type))
675*35238bceSAndroid Build Coastguard Worker {
676*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numElems; i++)
677*35238bceSAndroid Build Coastguard Worker result.val.boolV[i] = rnd.getBool();
678*35238bceSAndroid Build Coastguard Worker }
679*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeSampler(type))
680*35238bceSAndroid Build Coastguard Worker {
681*35238bceSAndroid Build Coastguard Worker const glu::DataType texResultType = getSamplerLookupReturnType(type);
682*35238bceSAndroid Build Coastguard Worker const glu::DataType texResultScalarType = glu::getDataTypeScalarType(texResultType);
683*35238bceSAndroid Build Coastguard Worker const int texResultNumDims = glu::getDataTypeScalarSize(texResultType);
684*35238bceSAndroid Build Coastguard Worker
685*35238bceSAndroid Build Coastguard Worker result.val.samplerV.unit = samplerUnit;
686*35238bceSAndroid Build Coastguard Worker
687*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < texResultNumDims; i++)
688*35238bceSAndroid Build Coastguard Worker {
689*35238bceSAndroid Build Coastguard Worker switch (texResultScalarType)
690*35238bceSAndroid Build Coastguard Worker {
691*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT:
692*35238bceSAndroid Build Coastguard Worker result.val.samplerV.fillColor.floatV[i] = rnd.getFloat(0.0f, 1.0f);
693*35238bceSAndroid Build Coastguard Worker break;
694*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT:
695*35238bceSAndroid Build Coastguard Worker result.val.samplerV.fillColor.intV[i] = rnd.getInt(-10, 10);
696*35238bceSAndroid Build Coastguard Worker break;
697*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT:
698*35238bceSAndroid Build Coastguard Worker result.val.samplerV.fillColor.uintV[i] = (uint32_t)rnd.getInt(0, 10);
699*35238bceSAndroid Build Coastguard Worker break;
700*35238bceSAndroid Build Coastguard Worker default:
701*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
702*35238bceSAndroid Build Coastguard Worker }
703*35238bceSAndroid Build Coastguard Worker }
704*35238bceSAndroid Build Coastguard Worker }
705*35238bceSAndroid Build Coastguard Worker else
706*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
707*35238bceSAndroid Build Coastguard Worker
708*35238bceSAndroid Build Coastguard Worker return result;
709*35238bceSAndroid Build Coastguard Worker }
710*35238bceSAndroid Build Coastguard Worker
apiVarValueEquals(const VarValue & a,const VarValue & b)711*35238bceSAndroid Build Coastguard Worker static bool apiVarValueEquals(const VarValue &a, const VarValue &b)
712*35238bceSAndroid Build Coastguard Worker {
713*35238bceSAndroid Build Coastguard Worker const int size = glu::getDataTypeScalarSize(a.type);
714*35238bceSAndroid Build Coastguard Worker const float floatThreshold = 0.05f;
715*35238bceSAndroid Build Coastguard Worker
716*35238bceSAndroid Build Coastguard Worker DE_ASSERT(a.type == b.type);
717*35238bceSAndroid Build Coastguard Worker
718*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeFloatOrVec(a.type) || glu::isDataTypeMatrix(a.type))
719*35238bceSAndroid Build Coastguard Worker {
720*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
721*35238bceSAndroid Build Coastguard Worker if (de::abs(a.val.floatV[i] - b.val.floatV[i]) >= floatThreshold)
722*35238bceSAndroid Build Coastguard Worker return false;
723*35238bceSAndroid Build Coastguard Worker }
724*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeIntOrIVec(a.type))
725*35238bceSAndroid Build Coastguard Worker {
726*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
727*35238bceSAndroid Build Coastguard Worker if (a.val.intV[i] != b.val.intV[i])
728*35238bceSAndroid Build Coastguard Worker return false;
729*35238bceSAndroid Build Coastguard Worker }
730*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeUintOrUVec(a.type))
731*35238bceSAndroid Build Coastguard Worker {
732*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
733*35238bceSAndroid Build Coastguard Worker if (a.val.uintV[i] != b.val.uintV[i])
734*35238bceSAndroid Build Coastguard Worker return false;
735*35238bceSAndroid Build Coastguard Worker }
736*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeBoolOrBVec(a.type))
737*35238bceSAndroid Build Coastguard Worker {
738*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
739*35238bceSAndroid Build Coastguard Worker if (a.val.boolV[i] != b.val.boolV[i])
740*35238bceSAndroid Build Coastguard Worker return false;
741*35238bceSAndroid Build Coastguard Worker }
742*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeSampler(a.type))
743*35238bceSAndroid Build Coastguard Worker {
744*35238bceSAndroid Build Coastguard Worker if (a.val.samplerV.unit != b.val.samplerV.unit)
745*35238bceSAndroid Build Coastguard Worker return false;
746*35238bceSAndroid Build Coastguard Worker }
747*35238bceSAndroid Build Coastguard Worker else
748*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
749*35238bceSAndroid Build Coastguard Worker
750*35238bceSAndroid Build Coastguard Worker return true;
751*35238bceSAndroid Build Coastguard Worker }
752*35238bceSAndroid Build Coastguard Worker
getRandomBoolRepresentation(const VarValue & boolValue,const glu::DataType targetScalarType,Random & rnd)753*35238bceSAndroid Build Coastguard Worker static VarValue getRandomBoolRepresentation(const VarValue &boolValue, const glu::DataType targetScalarType,
754*35238bceSAndroid Build Coastguard Worker Random &rnd)
755*35238bceSAndroid Build Coastguard Worker {
756*35238bceSAndroid Build Coastguard Worker DE_ASSERT(glu::isDataTypeBoolOrBVec(boolValue.type));
757*35238bceSAndroid Build Coastguard Worker
758*35238bceSAndroid Build Coastguard Worker const int size = glu::getDataTypeScalarSize(boolValue.type);
759*35238bceSAndroid Build Coastguard Worker const glu::DataType targetType = size == 1 ? targetScalarType : glu::getDataTypeVector(targetScalarType, size);
760*35238bceSAndroid Build Coastguard Worker VarValue result;
761*35238bceSAndroid Build Coastguard Worker result.type = targetType;
762*35238bceSAndroid Build Coastguard Worker
763*35238bceSAndroid Build Coastguard Worker switch (targetScalarType)
764*35238bceSAndroid Build Coastguard Worker {
765*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT:
766*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
767*35238bceSAndroid Build Coastguard Worker {
768*35238bceSAndroid Build Coastguard Worker if (boolValue.val.boolV[i])
769*35238bceSAndroid Build Coastguard Worker {
770*35238bceSAndroid Build Coastguard Worker result.val.intV[i] = rnd.getInt(-10, 10);
771*35238bceSAndroid Build Coastguard Worker if (result.val.intV[i] == 0)
772*35238bceSAndroid Build Coastguard Worker result.val.intV[i] = 1;
773*35238bceSAndroid Build Coastguard Worker }
774*35238bceSAndroid Build Coastguard Worker else
775*35238bceSAndroid Build Coastguard Worker result.val.intV[i] = 0;
776*35238bceSAndroid Build Coastguard Worker }
777*35238bceSAndroid Build Coastguard Worker break;
778*35238bceSAndroid Build Coastguard Worker
779*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT:
780*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
781*35238bceSAndroid Build Coastguard Worker {
782*35238bceSAndroid Build Coastguard Worker if (boolValue.val.boolV[i])
783*35238bceSAndroid Build Coastguard Worker result.val.uintV[i] = rnd.getInt(1, 10);
784*35238bceSAndroid Build Coastguard Worker else
785*35238bceSAndroid Build Coastguard Worker result.val.uintV[i] = 0;
786*35238bceSAndroid Build Coastguard Worker }
787*35238bceSAndroid Build Coastguard Worker break;
788*35238bceSAndroid Build Coastguard Worker
789*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT:
790*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
791*35238bceSAndroid Build Coastguard Worker {
792*35238bceSAndroid Build Coastguard Worker if (boolValue.val.boolV[i])
793*35238bceSAndroid Build Coastguard Worker {
794*35238bceSAndroid Build Coastguard Worker result.val.floatV[i] = rnd.getFloat(-10.0f, 10.0f);
795*35238bceSAndroid Build Coastguard Worker if (result.val.floatV[i] == 0.0f)
796*35238bceSAndroid Build Coastguard Worker result.val.floatV[i] = 1.0f;
797*35238bceSAndroid Build Coastguard Worker }
798*35238bceSAndroid Build Coastguard Worker else
799*35238bceSAndroid Build Coastguard Worker result.val.floatV[i] = 0;
800*35238bceSAndroid Build Coastguard Worker }
801*35238bceSAndroid Build Coastguard Worker break;
802*35238bceSAndroid Build Coastguard Worker
803*35238bceSAndroid Build Coastguard Worker default:
804*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
805*35238bceSAndroid Build Coastguard Worker }
806*35238bceSAndroid Build Coastguard Worker
807*35238bceSAndroid Build Coastguard Worker return result;
808*35238bceSAndroid Build Coastguard Worker }
809*35238bceSAndroid Build Coastguard Worker
getCaseShaderTypeName(const CaseShaderType type)810*35238bceSAndroid Build Coastguard Worker static const char *getCaseShaderTypeName(const CaseShaderType type)
811*35238bceSAndroid Build Coastguard Worker {
812*35238bceSAndroid Build Coastguard Worker switch (type)
813*35238bceSAndroid Build Coastguard Worker {
814*35238bceSAndroid Build Coastguard Worker case CASESHADERTYPE_VERTEX:
815*35238bceSAndroid Build Coastguard Worker return "vertex";
816*35238bceSAndroid Build Coastguard Worker case CASESHADERTYPE_FRAGMENT:
817*35238bceSAndroid Build Coastguard Worker return "fragment";
818*35238bceSAndroid Build Coastguard Worker case CASESHADERTYPE_BOTH:
819*35238bceSAndroid Build Coastguard Worker return "both";
820*35238bceSAndroid Build Coastguard Worker default:
821*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
822*35238bceSAndroid Build Coastguard Worker return DE_NULL;
823*35238bceSAndroid Build Coastguard Worker }
824*35238bceSAndroid Build Coastguard Worker }
825*35238bceSAndroid Build Coastguard Worker
826*35238bceSAndroid Build Coastguard Worker class UniformCase : public TestCase, protected glu::CallLogWrapper
827*35238bceSAndroid Build Coastguard Worker {
828*35238bceSAndroid Build Coastguard Worker public:
829*35238bceSAndroid Build Coastguard Worker enum Feature
830*35238bceSAndroid Build Coastguard Worker {
831*35238bceSAndroid Build Coastguard Worker // ARRAYUSAGE_ONLY_MIDDLE_INDEX: only middle index of each array is used in shader. If not given, use all indices.
832*35238bceSAndroid Build Coastguard Worker FEATURE_ARRAYUSAGE_ONLY_MIDDLE_INDEX = 1 << 0,
833*35238bceSAndroid Build Coastguard Worker
834*35238bceSAndroid Build Coastguard Worker // UNIFORMFUNC_VALUE: use pass-by-value versions of uniform assignment funcs, e.g. glProgramUniform1f(), where possible. If not given, use pass-by-pointer versions.
835*35238bceSAndroid Build Coastguard Worker FEATURE_UNIFORMFUNC_VALUE = 1 << 1,
836*35238bceSAndroid Build Coastguard Worker
837*35238bceSAndroid Build Coastguard Worker // MATRIXMODE_ROWMAJOR: pass matrices to GL in row major form. If not given, use column major.
838*35238bceSAndroid Build Coastguard Worker FEATURE_MATRIXMODE_ROWMAJOR = 1 << 2,
839*35238bceSAndroid Build Coastguard Worker
840*35238bceSAndroid Build Coastguard Worker // ARRAYASSIGN: how basic-type arrays are assigned with glProgramUniform*(). If none given, assign each element of an array separately.
841*35238bceSAndroid Build Coastguard Worker FEATURE_ARRAYASSIGN_FULL = 1 << 3, //!< Assign all elements of an array with one glProgramUniform*().
842*35238bceSAndroid Build Coastguard Worker FEATURE_ARRAYASSIGN_BLOCKS_OF_TWO = 1 << 4, //!< Assign two elements per one glProgramUniform*().
843*35238bceSAndroid Build Coastguard Worker
844*35238bceSAndroid Build Coastguard Worker // UNIFORMUSAGE_EVERY_OTHER: use about half of the uniforms. If not given, use all uniforms (except that some array indices may be omitted according to ARRAYUSAGE).
845*35238bceSAndroid Build Coastguard Worker FEATURE_UNIFORMUSAGE_EVERY_OTHER = 1 << 5,
846*35238bceSAndroid Build Coastguard Worker
847*35238bceSAndroid Build Coastguard Worker // BOOLEANAPITYPE: type used to pass booleans to and from GL api. If none given, use float.
848*35238bceSAndroid Build Coastguard Worker FEATURE_BOOLEANAPITYPE_INT = 1 << 6,
849*35238bceSAndroid Build Coastguard Worker FEATURE_BOOLEANAPITYPE_UINT = 1 << 7,
850*35238bceSAndroid Build Coastguard Worker
851*35238bceSAndroid Build Coastguard Worker // ARRAY_FIRST_ELEM_NAME_NO_INDEX: in certain API functions, when referring to the first element of an array, use just the array name without [0] at the end.
852*35238bceSAndroid Build Coastguard Worker FEATURE_ARRAY_FIRST_ELEM_NAME_NO_INDEX = 1 << 8
853*35238bceSAndroid Build Coastguard Worker };
854*35238bceSAndroid Build Coastguard Worker
855*35238bceSAndroid Build Coastguard Worker UniformCase(Context &context, const char *name, const char *description, CaseShaderType caseType,
856*35238bceSAndroid Build Coastguard Worker const SharedPtr<const UniformCollection> &uniformCollection, uint32_t features);
857*35238bceSAndroid Build Coastguard Worker virtual ~UniformCase(void);
858*35238bceSAndroid Build Coastguard Worker
859*35238bceSAndroid Build Coastguard Worker virtual void init(void);
860*35238bceSAndroid Build Coastguard Worker virtual void deinit(void);
861*35238bceSAndroid Build Coastguard Worker
862*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
863*35238bceSAndroid Build Coastguard Worker
864*35238bceSAndroid Build Coastguard Worker protected:
865*35238bceSAndroid Build Coastguard Worker // A basic uniform is a uniform (possibly struct or array member) whose type is a basic type (e.g. float, ivec4, sampler2d).
866*35238bceSAndroid Build Coastguard Worker struct BasicUniform
867*35238bceSAndroid Build Coastguard Worker {
868*35238bceSAndroid Build Coastguard Worker string name;
869*35238bceSAndroid Build Coastguard Worker glu::DataType type;
870*35238bceSAndroid Build Coastguard Worker bool isUsedInShader;
871*35238bceSAndroid Build Coastguard Worker VarValue finalValue; //!< The value we ultimately want to set for this uniform.
872*35238bceSAndroid Build Coastguard Worker
873*35238bceSAndroid Build Coastguard Worker string
874*35238bceSAndroid Build Coastguard Worker rootName; //!< If this is a member of a basic-typed array, rootName is the name of that array with "[0]" appended. Otherwise it equals name.
875*35238bceSAndroid Build Coastguard Worker int elemNdx; //!< If this is a member of a basic-typed array, elemNdx is the index in that array. Otherwise -1.
876*35238bceSAndroid Build Coastguard Worker int rootSize; //!< If this is a member of a basic-typed array, rootSize is the size of that array. Otherwise 1.
877*35238bceSAndroid Build Coastguard Worker
BasicUniformdeqp::gles31::Functional::UniformCase::BasicUniform878*35238bceSAndroid Build Coastguard Worker BasicUniform(const char *const name_, const glu::DataType type_, const bool isUsedInShader_,
879*35238bceSAndroid Build Coastguard Worker const VarValue &finalValue_, const char *const rootName_ = DE_NULL, const int elemNdx_ = -1,
880*35238bceSAndroid Build Coastguard Worker const int rootSize_ = 1)
881*35238bceSAndroid Build Coastguard Worker : name(name_)
882*35238bceSAndroid Build Coastguard Worker , type(type_)
883*35238bceSAndroid Build Coastguard Worker , isUsedInShader(isUsedInShader_)
884*35238bceSAndroid Build Coastguard Worker , finalValue(finalValue_)
885*35238bceSAndroid Build Coastguard Worker , rootName(rootName_ == DE_NULL ? name_ : rootName_)
886*35238bceSAndroid Build Coastguard Worker , elemNdx(elemNdx_)
887*35238bceSAndroid Build Coastguard Worker , rootSize(rootSize_)
888*35238bceSAndroid Build Coastguard Worker {
889*35238bceSAndroid Build Coastguard Worker }
890*35238bceSAndroid Build Coastguard Worker
findWithNamedeqp::gles31::Functional::UniformCase::BasicUniform891*35238bceSAndroid Build Coastguard Worker static vector<BasicUniform>::const_iterator findWithName(const vector<BasicUniform> &vec,
892*35238bceSAndroid Build Coastguard Worker const char *const name)
893*35238bceSAndroid Build Coastguard Worker {
894*35238bceSAndroid Build Coastguard Worker for (vector<BasicUniform>::const_iterator it = vec.begin(); it != vec.end(); it++)
895*35238bceSAndroid Build Coastguard Worker {
896*35238bceSAndroid Build Coastguard Worker if (it->name == name)
897*35238bceSAndroid Build Coastguard Worker return it;
898*35238bceSAndroid Build Coastguard Worker }
899*35238bceSAndroid Build Coastguard Worker return vec.end();
900*35238bceSAndroid Build Coastguard Worker }
901*35238bceSAndroid Build Coastguard Worker };
902*35238bceSAndroid Build Coastguard Worker
903*35238bceSAndroid Build Coastguard Worker // Reference values for info that is expected to be reported by glGetActiveUniform() or glGetActiveUniformsiv().
904*35238bceSAndroid Build Coastguard Worker struct BasicUniformReportRef
905*35238bceSAndroid Build Coastguard Worker {
906*35238bceSAndroid Build Coastguard Worker string name;
907*35238bceSAndroid Build Coastguard Worker // \note minSize and maxSize are for arrays and can be distinct since implementations are allowed, but not required, to trim the inactive end indices of arrays.
908*35238bceSAndroid Build Coastguard Worker int minSize;
909*35238bceSAndroid Build Coastguard Worker int maxSize;
910*35238bceSAndroid Build Coastguard Worker glu::DataType type;
911*35238bceSAndroid Build Coastguard Worker bool isUsedInShader;
912*35238bceSAndroid Build Coastguard Worker
BasicUniformReportRefdeqp::gles31::Functional::UniformCase::BasicUniformReportRef913*35238bceSAndroid Build Coastguard Worker BasicUniformReportRef(const char *const name_, const int minS, const int maxS, const glu::DataType type_,
914*35238bceSAndroid Build Coastguard Worker const bool used)
915*35238bceSAndroid Build Coastguard Worker : name(name_)
916*35238bceSAndroid Build Coastguard Worker , minSize(minS)
917*35238bceSAndroid Build Coastguard Worker , maxSize(maxS)
918*35238bceSAndroid Build Coastguard Worker , type(type_)
919*35238bceSAndroid Build Coastguard Worker , isUsedInShader(used)
920*35238bceSAndroid Build Coastguard Worker {
921*35238bceSAndroid Build Coastguard Worker DE_ASSERT(minSize <= maxSize);
922*35238bceSAndroid Build Coastguard Worker }
BasicUniformReportRefdeqp::gles31::Functional::UniformCase::BasicUniformReportRef923*35238bceSAndroid Build Coastguard Worker BasicUniformReportRef(const char *const name_, const glu::DataType type_, const bool used)
924*35238bceSAndroid Build Coastguard Worker : name(name_)
925*35238bceSAndroid Build Coastguard Worker , minSize(1)
926*35238bceSAndroid Build Coastguard Worker , maxSize(1)
927*35238bceSAndroid Build Coastguard Worker , type(type_)
928*35238bceSAndroid Build Coastguard Worker , isUsedInShader(used)
929*35238bceSAndroid Build Coastguard Worker {
930*35238bceSAndroid Build Coastguard Worker }
931*35238bceSAndroid Build Coastguard Worker };
932*35238bceSAndroid Build Coastguard Worker
933*35238bceSAndroid Build Coastguard Worker // Get uniform values with glGetUniform*() and put to valuesDst. Uniforms that get -1 from glGetUniformLocation() get glu::TYPE_INVALID.
934*35238bceSAndroid Build Coastguard Worker bool getUniforms(vector<VarValue> &valuesDst, const vector<BasicUniform> &basicUniforms, uint32_t programGL);
935*35238bceSAndroid Build Coastguard Worker // Assign the basicUniforms[].finalValue values for uniforms. \note rnd parameter is for booleans (true can be any nonzero value).
936*35238bceSAndroid Build Coastguard Worker void assignUniforms(const vector<BasicUniform> &basicUniforms, uint32_t programGL, Random &rnd);
937*35238bceSAndroid Build Coastguard Worker // Compare the uniform values given in values (obtained with glGetUniform*()) with the basicUniform.finalValue values.
938*35238bceSAndroid Build Coastguard Worker bool compareUniformValues(const vector<VarValue> &values, const vector<BasicUniform> &basicUniforms);
939*35238bceSAndroid Build Coastguard Worker // Render and check that all pixels are green (i.e. all uniform comparisons passed).
940*35238bceSAndroid Build Coastguard Worker bool renderTest(const vector<BasicUniform> &basicUniforms, const ShaderProgram &program, Random &rnd);
941*35238bceSAndroid Build Coastguard Worker
942*35238bceSAndroid Build Coastguard Worker virtual bool test(const vector<BasicUniform> &basicUniforms,
943*35238bceSAndroid Build Coastguard Worker const vector<BasicUniformReportRef> &basicUniformReportsRef, const ShaderProgram &program,
944*35238bceSAndroid Build Coastguard Worker Random &rnd) = 0;
945*35238bceSAndroid Build Coastguard Worker
946*35238bceSAndroid Build Coastguard Worker const uint32_t m_features;
947*35238bceSAndroid Build Coastguard Worker const SharedPtr<const UniformCollection> m_uniformCollection;
948*35238bceSAndroid Build Coastguard Worker
949*35238bceSAndroid Build Coastguard Worker private:
950*35238bceSAndroid Build Coastguard Worker // Generates the basic uniforms, based on the uniform with name varName and type varType, in the same manner as are expected
951*35238bceSAndroid Build Coastguard Worker // to be returned by glGetActiveUniform(), e.g. generates a name like var[0] for arrays, and recursively generates struct member names.
952*35238bceSAndroid Build Coastguard Worker void generateBasicUniforms(vector<BasicUniform> &basicUniformsDst,
953*35238bceSAndroid Build Coastguard Worker vector<BasicUniformReportRef> &basicUniformReportsDst, const glu::VarType &varType,
954*35238bceSAndroid Build Coastguard Worker const char *varName, bool isParentActive, int &samplerUnitCounter, Random &rnd) const;
955*35238bceSAndroid Build Coastguard Worker
956*35238bceSAndroid Build Coastguard Worker void writeUniformDefinitions(std::ostringstream &dst) const;
957*35238bceSAndroid Build Coastguard Worker void writeUniformCompareExpr(std::ostringstream &dst, const BasicUniform &uniform) const;
958*35238bceSAndroid Build Coastguard Worker void writeUniformComparisons(std::ostringstream &dst, const vector<BasicUniform> &basicUniforms,
959*35238bceSAndroid Build Coastguard Worker const char *variableName) const;
960*35238bceSAndroid Build Coastguard Worker
961*35238bceSAndroid Build Coastguard Worker string generateVertexSource(const vector<BasicUniform> &basicUniforms) const;
962*35238bceSAndroid Build Coastguard Worker string generateFragmentSource(const vector<BasicUniform> &basicUniforms) const;
963*35238bceSAndroid Build Coastguard Worker
964*35238bceSAndroid Build Coastguard Worker void setupTexture(const VarValue &value);
965*35238bceSAndroid Build Coastguard Worker
966*35238bceSAndroid Build Coastguard Worker const CaseShaderType m_caseShaderType;
967*35238bceSAndroid Build Coastguard Worker
968*35238bceSAndroid Build Coastguard Worker vector<glu::Texture2D *> m_textures2d;
969*35238bceSAndroid Build Coastguard Worker vector<glu::TextureCube *> m_texturesCube;
970*35238bceSAndroid Build Coastguard Worker vector<uint32_t> m_filledTextureUnits;
971*35238bceSAndroid Build Coastguard Worker };
972*35238bceSAndroid Build Coastguard Worker
UniformCase(Context & context,const char * const name,const char * const description,const CaseShaderType caseShaderType,const SharedPtr<const UniformCollection> & uniformCollection,const uint32_t features)973*35238bceSAndroid Build Coastguard Worker UniformCase::UniformCase(Context &context, const char *const name, const char *const description,
974*35238bceSAndroid Build Coastguard Worker const CaseShaderType caseShaderType,
975*35238bceSAndroid Build Coastguard Worker const SharedPtr<const UniformCollection> &uniformCollection, const uint32_t features)
976*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, description)
977*35238bceSAndroid Build Coastguard Worker , CallLogWrapper(context.getRenderContext().getFunctions(), m_testCtx.getLog())
978*35238bceSAndroid Build Coastguard Worker , m_features(features)
979*35238bceSAndroid Build Coastguard Worker , m_uniformCollection(uniformCollection)
980*35238bceSAndroid Build Coastguard Worker , m_caseShaderType(caseShaderType)
981*35238bceSAndroid Build Coastguard Worker {
982*35238bceSAndroid Build Coastguard Worker }
983*35238bceSAndroid Build Coastguard Worker
init(void)984*35238bceSAndroid Build Coastguard Worker void UniformCase::init(void)
985*35238bceSAndroid Build Coastguard Worker {
986*35238bceSAndroid Build Coastguard Worker {
987*35238bceSAndroid Build Coastguard Worker const glw::Functions &funcs = m_context.getRenderContext().getFunctions();
988*35238bceSAndroid Build Coastguard Worker const int numSamplerUniforms = m_uniformCollection->getNumSamplers();
989*35238bceSAndroid Build Coastguard Worker const int vertexTexUnitsRequired = m_caseShaderType != CASESHADERTYPE_FRAGMENT ? numSamplerUniforms : 0;
990*35238bceSAndroid Build Coastguard Worker const int fragmentTexUnitsRequired = m_caseShaderType != CASESHADERTYPE_VERTEX ? numSamplerUniforms : 0;
991*35238bceSAndroid Build Coastguard Worker const int combinedTexUnitsRequired = vertexTexUnitsRequired + fragmentTexUnitsRequired;
992*35238bceSAndroid Build Coastguard Worker const int vertexTexUnitsSupported = getGLInt(funcs, GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS);
993*35238bceSAndroid Build Coastguard Worker const int fragmentTexUnitsSupported = getGLInt(funcs, GL_MAX_TEXTURE_IMAGE_UNITS);
994*35238bceSAndroid Build Coastguard Worker const int combinedTexUnitsSupported = getGLInt(funcs, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
995*35238bceSAndroid Build Coastguard Worker
996*35238bceSAndroid Build Coastguard Worker DE_ASSERT(numSamplerUniforms <= MAX_NUM_SAMPLER_UNIFORMS);
997*35238bceSAndroid Build Coastguard Worker
998*35238bceSAndroid Build Coastguard Worker if (vertexTexUnitsRequired > vertexTexUnitsSupported)
999*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError(de::toString(vertexTexUnitsRequired) + " vertex texture units required, " +
1000*35238bceSAndroid Build Coastguard Worker de::toString(vertexTexUnitsSupported) + " supported");
1001*35238bceSAndroid Build Coastguard Worker if (fragmentTexUnitsRequired > fragmentTexUnitsSupported)
1002*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError(de::toString(fragmentTexUnitsRequired) + " fragment texture units required, " +
1003*35238bceSAndroid Build Coastguard Worker de::toString(fragmentTexUnitsSupported) + " supported");
1004*35238bceSAndroid Build Coastguard Worker if (combinedTexUnitsRequired > combinedTexUnitsSupported)
1005*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError(de::toString(combinedTexUnitsRequired) + " combined texture units required, " +
1006*35238bceSAndroid Build Coastguard Worker de::toString(combinedTexUnitsSupported) + " supported");
1007*35238bceSAndroid Build Coastguard Worker }
1008*35238bceSAndroid Build Coastguard Worker
1009*35238bceSAndroid Build Coastguard Worker enableLogging(true);
1010*35238bceSAndroid Build Coastguard Worker }
1011*35238bceSAndroid Build Coastguard Worker
deinit(void)1012*35238bceSAndroid Build Coastguard Worker void UniformCase::deinit(void)
1013*35238bceSAndroid Build Coastguard Worker {
1014*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_textures2d.size(); i++)
1015*35238bceSAndroid Build Coastguard Worker delete m_textures2d[i];
1016*35238bceSAndroid Build Coastguard Worker m_textures2d.clear();
1017*35238bceSAndroid Build Coastguard Worker
1018*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_texturesCube.size(); i++)
1019*35238bceSAndroid Build Coastguard Worker delete m_texturesCube[i];
1020*35238bceSAndroid Build Coastguard Worker m_texturesCube.clear();
1021*35238bceSAndroid Build Coastguard Worker
1022*35238bceSAndroid Build Coastguard Worker m_filledTextureUnits.clear();
1023*35238bceSAndroid Build Coastguard Worker }
1024*35238bceSAndroid Build Coastguard Worker
~UniformCase(void)1025*35238bceSAndroid Build Coastguard Worker UniformCase::~UniformCase(void)
1026*35238bceSAndroid Build Coastguard Worker {
1027*35238bceSAndroid Build Coastguard Worker UniformCase::deinit();
1028*35238bceSAndroid Build Coastguard Worker }
1029*35238bceSAndroid Build Coastguard Worker
generateBasicUniforms(vector<BasicUniform> & basicUniformsDst,vector<BasicUniformReportRef> & basicUniformReportsDst,const glu::VarType & varType,const char * const varName,const bool isParentActive,int & samplerUnitCounter,Random & rnd) const1030*35238bceSAndroid Build Coastguard Worker void UniformCase::generateBasicUniforms(vector<BasicUniform> &basicUniformsDst,
1031*35238bceSAndroid Build Coastguard Worker vector<BasicUniformReportRef> &basicUniformReportsDst,
1032*35238bceSAndroid Build Coastguard Worker const glu::VarType &varType, const char *const varName,
1033*35238bceSAndroid Build Coastguard Worker const bool isParentActive, int &samplerUnitCounter, Random &rnd) const
1034*35238bceSAndroid Build Coastguard Worker {
1035*35238bceSAndroid Build Coastguard Worker if (varType.isBasicType())
1036*35238bceSAndroid Build Coastguard Worker {
1037*35238bceSAndroid Build Coastguard Worker const bool isActive =
1038*35238bceSAndroid Build Coastguard Worker isParentActive && (m_features & FEATURE_UNIFORMUSAGE_EVERY_OTHER ? basicUniformsDst.size() % 2 == 0 : true);
1039*35238bceSAndroid Build Coastguard Worker const glu::DataType type = varType.getBasicType();
1040*35238bceSAndroid Build Coastguard Worker const VarValue value = glu::isDataTypeSampler(type) ? generateRandomVarValue(type, rnd, samplerUnitCounter++) :
1041*35238bceSAndroid Build Coastguard Worker generateRandomVarValue(varType.getBasicType(), rnd);
1042*35238bceSAndroid Build Coastguard Worker
1043*35238bceSAndroid Build Coastguard Worker basicUniformsDst.push_back(BasicUniform(varName, varType.getBasicType(), isActive, value));
1044*35238bceSAndroid Build Coastguard Worker basicUniformReportsDst.push_back(BasicUniformReportRef(varName, varType.getBasicType(), isActive));
1045*35238bceSAndroid Build Coastguard Worker }
1046*35238bceSAndroid Build Coastguard Worker else if (varType.isArrayType())
1047*35238bceSAndroid Build Coastguard Worker {
1048*35238bceSAndroid Build Coastguard Worker const int size = varType.getArraySize();
1049*35238bceSAndroid Build Coastguard Worker const string arrayRootName = string("") + varName + "[0]";
1050*35238bceSAndroid Build Coastguard Worker vector<bool> isElemActive;
1051*35238bceSAndroid Build Coastguard Worker
1052*35238bceSAndroid Build Coastguard Worker for (int elemNdx = 0; elemNdx < varType.getArraySize(); elemNdx++)
1053*35238bceSAndroid Build Coastguard Worker {
1054*35238bceSAndroid Build Coastguard Worker const string indexedName = string("") + varName + "[" + de::toString(elemNdx) + "]";
1055*35238bceSAndroid Build Coastguard Worker const bool isCurElemActive =
1056*35238bceSAndroid Build Coastguard Worker isParentActive &&
1057*35238bceSAndroid Build Coastguard Worker (m_features & FEATURE_UNIFORMUSAGE_EVERY_OTHER ? basicUniformsDst.size() % 2 == 0 : true) &&
1058*35238bceSAndroid Build Coastguard Worker (m_features & FEATURE_ARRAYUSAGE_ONLY_MIDDLE_INDEX ? elemNdx == size / 2 : true);
1059*35238bceSAndroid Build Coastguard Worker
1060*35238bceSAndroid Build Coastguard Worker isElemActive.push_back(isCurElemActive);
1061*35238bceSAndroid Build Coastguard Worker
1062*35238bceSAndroid Build Coastguard Worker if (varType.getElementType().isBasicType())
1063*35238bceSAndroid Build Coastguard Worker {
1064*35238bceSAndroid Build Coastguard Worker // \note We don't want separate entries in basicUniformReportsDst for elements of basic-type arrays.
1065*35238bceSAndroid Build Coastguard Worker const glu::DataType elemBasicType = varType.getElementType().getBasicType();
1066*35238bceSAndroid Build Coastguard Worker const VarValue value = glu::isDataTypeSampler(elemBasicType) ?
1067*35238bceSAndroid Build Coastguard Worker generateRandomVarValue(elemBasicType, rnd, samplerUnitCounter++) :
1068*35238bceSAndroid Build Coastguard Worker generateRandomVarValue(elemBasicType, rnd);
1069*35238bceSAndroid Build Coastguard Worker
1070*35238bceSAndroid Build Coastguard Worker basicUniformsDst.push_back(BasicUniform(indexedName.c_str(), elemBasicType, isCurElemActive, value,
1071*35238bceSAndroid Build Coastguard Worker arrayRootName.c_str(), elemNdx, size));
1072*35238bceSAndroid Build Coastguard Worker }
1073*35238bceSAndroid Build Coastguard Worker else
1074*35238bceSAndroid Build Coastguard Worker generateBasicUniforms(basicUniformsDst, basicUniformReportsDst, varType.getElementType(),
1075*35238bceSAndroid Build Coastguard Worker indexedName.c_str(), isCurElemActive, samplerUnitCounter, rnd);
1076*35238bceSAndroid Build Coastguard Worker }
1077*35238bceSAndroid Build Coastguard Worker
1078*35238bceSAndroid Build Coastguard Worker if (varType.getElementType().isBasicType())
1079*35238bceSAndroid Build Coastguard Worker {
1080*35238bceSAndroid Build Coastguard Worker int minSize;
1081*35238bceSAndroid Build Coastguard Worker for (minSize = varType.getArraySize(); minSize > 0 && !isElemActive[minSize - 1]; minSize--)
1082*35238bceSAndroid Build Coastguard Worker ;
1083*35238bceSAndroid Build Coastguard Worker
1084*35238bceSAndroid Build Coastguard Worker basicUniformReportsDst.push_back(BasicUniformReportRef(arrayRootName.c_str(), minSize, size,
1085*35238bceSAndroid Build Coastguard Worker varType.getElementType().getBasicType(),
1086*35238bceSAndroid Build Coastguard Worker isParentActive && minSize > 0));
1087*35238bceSAndroid Build Coastguard Worker }
1088*35238bceSAndroid Build Coastguard Worker }
1089*35238bceSAndroid Build Coastguard Worker else
1090*35238bceSAndroid Build Coastguard Worker {
1091*35238bceSAndroid Build Coastguard Worker DE_ASSERT(varType.isStructType());
1092*35238bceSAndroid Build Coastguard Worker
1093*35238bceSAndroid Build Coastguard Worker const StructType &structType = *varType.getStructPtr();
1094*35238bceSAndroid Build Coastguard Worker
1095*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < structType.getNumMembers(); i++)
1096*35238bceSAndroid Build Coastguard Worker {
1097*35238bceSAndroid Build Coastguard Worker const glu::StructMember &member = structType.getMember(i);
1098*35238bceSAndroid Build Coastguard Worker const string memberFullName = string("") + varName + "." + member.getName();
1099*35238bceSAndroid Build Coastguard Worker
1100*35238bceSAndroid Build Coastguard Worker generateBasicUniforms(basicUniformsDst, basicUniformReportsDst, member.getType(), memberFullName.c_str(),
1101*35238bceSAndroid Build Coastguard Worker isParentActive, samplerUnitCounter, rnd);
1102*35238bceSAndroid Build Coastguard Worker }
1103*35238bceSAndroid Build Coastguard Worker }
1104*35238bceSAndroid Build Coastguard Worker }
1105*35238bceSAndroid Build Coastguard Worker
writeUniformDefinitions(std::ostringstream & dst) const1106*35238bceSAndroid Build Coastguard Worker void UniformCase::writeUniformDefinitions(std::ostringstream &dst) const
1107*35238bceSAndroid Build Coastguard Worker {
1108*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_uniformCollection->getNumStructTypes(); i++)
1109*35238bceSAndroid Build Coastguard Worker dst << glu::declare(m_uniformCollection->getStructType(i)) << ";\n";
1110*35238bceSAndroid Build Coastguard Worker
1111*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_uniformCollection->getNumUniforms(); i++)
1112*35238bceSAndroid Build Coastguard Worker dst << "uniform "
1113*35238bceSAndroid Build Coastguard Worker << glu::declare(m_uniformCollection->getUniform(i).type, m_uniformCollection->getUniform(i).name.c_str())
1114*35238bceSAndroid Build Coastguard Worker << ";\n";
1115*35238bceSAndroid Build Coastguard Worker
1116*35238bceSAndroid Build Coastguard Worker dst << "\n";
1117*35238bceSAndroid Build Coastguard Worker
1118*35238bceSAndroid Build Coastguard Worker {
1119*35238bceSAndroid Build Coastguard Worker static const struct
1120*35238bceSAndroid Build Coastguard Worker {
1121*35238bceSAndroid Build Coastguard Worker dataTypePredicate requiringTypes[2];
1122*35238bceSAndroid Build Coastguard Worker const char *definition;
1123*35238bceSAndroid Build Coastguard Worker } compareFuncs[] = {
1124*35238bceSAndroid Build Coastguard Worker {{glu::isDataTypeFloatOrVec, glu::isDataTypeMatrix},
1125*35238bceSAndroid Build Coastguard Worker "mediump float compare_float (mediump float a, mediump float b) { return abs(a - b) < 0.05 ? 1.0 : "
1126*35238bceSAndroid Build Coastguard Worker "0.0; }"},
1127*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_VEC2>, dataTypeIsMatrixWithNRows<2>},
1128*35238bceSAndroid Build Coastguard Worker "mediump float compare_vec2 (mediump vec2 a, mediump vec2 b) { return compare_float(a.x, "
1129*35238bceSAndroid Build Coastguard Worker "b.x)*compare_float(a.y, b.y); }"},
1130*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_VEC3>, dataTypeIsMatrixWithNRows<3>},
1131*35238bceSAndroid Build Coastguard Worker "mediump float compare_vec3 (mediump vec3 a, mediump vec3 b) { return compare_float(a.x, "
1132*35238bceSAndroid Build Coastguard Worker "b.x)*compare_float(a.y, b.y)*compare_float(a.z, b.z); }"},
1133*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_VEC4>, dataTypeIsMatrixWithNRows<4>},
1134*35238bceSAndroid Build Coastguard Worker "mediump float compare_vec4 (mediump vec4 a, mediump vec4 b) { return compare_float(a.x, "
1135*35238bceSAndroid Build Coastguard Worker "b.x)*compare_float(a.y, b.y)*compare_float(a.z, b.z)*compare_float(a.w, b.w); }"},
1136*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT2>, dataTypeEquals<glu::TYPE_INVALID>},
1137*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat2 (mediump mat2 a, mediump mat2 b) { return compare_vec2(a[0], "
1138*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec2(a[1], b[1]); }"},
1139*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT2X3>, dataTypeEquals<glu::TYPE_INVALID>},
1140*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat2x3 (mediump mat2x3 a, mediump mat2x3 b){ return compare_vec3(a[0], "
1141*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec3(a[1], b[1]); }"},
1142*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT2X4>, dataTypeEquals<glu::TYPE_INVALID>},
1143*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat2x4 (mediump mat2x4 a, mediump mat2x4 b){ return compare_vec4(a[0], "
1144*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec4(a[1], b[1]); }"},
1145*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT3X2>, dataTypeEquals<glu::TYPE_INVALID>},
1146*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat3x2 (mediump mat3x2 a, mediump mat3x2 b){ return compare_vec2(a[0], "
1147*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec2(a[1], b[1])*compare_vec2(a[2], b[2]); }"},
1148*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT3>, dataTypeEquals<glu::TYPE_INVALID>},
1149*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat3 (mediump mat3 a, mediump mat3 b) { return compare_vec3(a[0], "
1150*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec3(a[1], b[1])*compare_vec3(a[2], b[2]); }"},
1151*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT3X4>, dataTypeEquals<glu::TYPE_INVALID>},
1152*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat3x4 (mediump mat3x4 a, mediump mat3x4 b){ return compare_vec4(a[0], "
1153*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec4(a[1], b[1])*compare_vec4(a[2], b[2]); }"},
1154*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT4X2>, dataTypeEquals<glu::TYPE_INVALID>},
1155*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat4x2 (mediump mat4x2 a, mediump mat4x2 b){ return compare_vec2(a[0], "
1156*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec2(a[1], b[1])*compare_vec2(a[2], b[2])*compare_vec2(a[3], b[3]); }"},
1157*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT4X3>, dataTypeEquals<glu::TYPE_INVALID>},
1158*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat4x3 (mediump mat4x3 a, mediump mat4x3 b){ return compare_vec3(a[0], "
1159*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec3(a[1], b[1])*compare_vec3(a[2], b[2])*compare_vec3(a[3], b[3]); }"},
1160*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_FLOAT_MAT4>, dataTypeEquals<glu::TYPE_INVALID>},
1161*35238bceSAndroid Build Coastguard Worker "mediump float compare_mat4 (mediump mat4 a, mediump mat4 b) { return compare_vec4(a[0], "
1162*35238bceSAndroid Build Coastguard Worker "b[0])*compare_vec4(a[1], b[1])*compare_vec4(a[2], b[2])*compare_vec4(a[3], b[3]); }"},
1163*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_INT>, dataTypeEquals<glu::TYPE_INVALID>},
1164*35238bceSAndroid Build Coastguard Worker "mediump float compare_int (mediump int a, mediump int b) { return a == b ? 1.0 : 0.0; }"},
1165*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_INT_VEC2>, dataTypeEquals<glu::TYPE_INVALID>},
1166*35238bceSAndroid Build Coastguard Worker "mediump float compare_ivec2 (mediump ivec2 a, mediump ivec2 b) { return a == b ? 1.0 : 0.0; }"},
1167*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_INT_VEC3>, dataTypeEquals<glu::TYPE_INVALID>},
1168*35238bceSAndroid Build Coastguard Worker "mediump float compare_ivec3 (mediump ivec3 a, mediump ivec3 b) { return a == b ? 1.0 : 0.0; }"},
1169*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_INT_VEC4>, dataTypeEquals<glu::TYPE_INVALID>},
1170*35238bceSAndroid Build Coastguard Worker "mediump float compare_ivec4 (mediump ivec4 a, mediump ivec4 b) { return a == b ? 1.0 : 0.0; }"},
1171*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_UINT>, dataTypeEquals<glu::TYPE_INVALID>},
1172*35238bceSAndroid Build Coastguard Worker "mediump float compare_uint (mediump uint a, mediump uint b) { return a == b ? 1.0 : 0.0; }"},
1173*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_UINT_VEC2>, dataTypeEquals<glu::TYPE_INVALID>},
1174*35238bceSAndroid Build Coastguard Worker "mediump float compare_uvec2 (mediump uvec2 a, mediump uvec2 b) { return a == b ? 1.0 : 0.0; }"},
1175*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_UINT_VEC3>, dataTypeEquals<glu::TYPE_INVALID>},
1176*35238bceSAndroid Build Coastguard Worker "mediump float compare_uvec3 (mediump uvec3 a, mediump uvec3 b) { return a == b ? 1.0 : 0.0; }"},
1177*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_UINT_VEC4>, dataTypeEquals<glu::TYPE_INVALID>},
1178*35238bceSAndroid Build Coastguard Worker "mediump float compare_uvec4 (mediump uvec4 a, mediump uvec4 b) { return a == b ? 1.0 : 0.0; }"},
1179*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_BOOL>, dataTypeEquals<glu::TYPE_INVALID>},
1180*35238bceSAndroid Build Coastguard Worker "mediump float compare_bool (bool a, bool b) { return a == b ? 1.0 : 0.0; }"},
1181*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_BOOL_VEC2>, dataTypeEquals<glu::TYPE_INVALID>},
1182*35238bceSAndroid Build Coastguard Worker "mediump float compare_bvec2 (bvec2 a, bvec2 b) { return a == b ? 1.0 : 0.0; }"},
1183*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_BOOL_VEC3>, dataTypeEquals<glu::TYPE_INVALID>},
1184*35238bceSAndroid Build Coastguard Worker "mediump float compare_bvec3 (bvec3 a, bvec3 b) { return a == b ? 1.0 : 0.0; }"},
1185*35238bceSAndroid Build Coastguard Worker {{dataTypeEquals<glu::TYPE_BOOL_VEC4>, dataTypeEquals<glu::TYPE_INVALID>},
1186*35238bceSAndroid Build Coastguard Worker "mediump float compare_bvec4 (bvec4 a, bvec4 b) { return a == b ? 1.0 : 0.0; }"}};
1187*35238bceSAndroid Build Coastguard Worker
1188*35238bceSAndroid Build Coastguard Worker const vector<glu::DataType> samplerTypes = m_uniformCollection->getSamplerTypes();
1189*35238bceSAndroid Build Coastguard Worker
1190*35238bceSAndroid Build Coastguard Worker for (int compFuncNdx = 0; compFuncNdx < DE_LENGTH_OF_ARRAY(compareFuncs); compFuncNdx++)
1191*35238bceSAndroid Build Coastguard Worker {
1192*35238bceSAndroid Build Coastguard Worker const dataTypePredicate(&typeReq)[2] = compareFuncs[compFuncNdx].requiringTypes;
1193*35238bceSAndroid Build Coastguard Worker bool containsTypeSampler = false;
1194*35238bceSAndroid Build Coastguard Worker
1195*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)samplerTypes.size(); i++)
1196*35238bceSAndroid Build Coastguard Worker {
1197*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeSampler(samplerTypes[i]))
1198*35238bceSAndroid Build Coastguard Worker {
1199*35238bceSAndroid Build Coastguard Worker const glu::DataType retType = getSamplerLookupReturnType(samplerTypes[i]);
1200*35238bceSAndroid Build Coastguard Worker if (typeReq[0](retType) || typeReq[1](retType))
1201*35238bceSAndroid Build Coastguard Worker {
1202*35238bceSAndroid Build Coastguard Worker containsTypeSampler = true;
1203*35238bceSAndroid Build Coastguard Worker break;
1204*35238bceSAndroid Build Coastguard Worker }
1205*35238bceSAndroid Build Coastguard Worker }
1206*35238bceSAndroid Build Coastguard Worker }
1207*35238bceSAndroid Build Coastguard Worker
1208*35238bceSAndroid Build Coastguard Worker if (containsTypeSampler || m_uniformCollection->containsMatchingBasicType(typeReq[0]) ||
1209*35238bceSAndroid Build Coastguard Worker m_uniformCollection->containsMatchingBasicType(typeReq[1]))
1210*35238bceSAndroid Build Coastguard Worker dst << compareFuncs[compFuncNdx].definition << "\n";
1211*35238bceSAndroid Build Coastguard Worker }
1212*35238bceSAndroid Build Coastguard Worker }
1213*35238bceSAndroid Build Coastguard Worker }
1214*35238bceSAndroid Build Coastguard Worker
writeUniformCompareExpr(std::ostringstream & dst,const BasicUniform & uniform) const1215*35238bceSAndroid Build Coastguard Worker void UniformCase::writeUniformCompareExpr(std::ostringstream &dst, const BasicUniform &uniform) const
1216*35238bceSAndroid Build Coastguard Worker {
1217*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeSampler(uniform.type))
1218*35238bceSAndroid Build Coastguard Worker dst << "compare_" << glu::getDataTypeName(getSamplerLookupReturnType(uniform.type)) << "(texture("
1219*35238bceSAndroid Build Coastguard Worker << uniform.name << ", vec" << getSamplerNumLookupDimensions(uniform.type) << "(0.0))";
1220*35238bceSAndroid Build Coastguard Worker else
1221*35238bceSAndroid Build Coastguard Worker dst << "compare_" << glu::getDataTypeName(uniform.type) << "(" << uniform.name;
1222*35238bceSAndroid Build Coastguard Worker
1223*35238bceSAndroid Build Coastguard Worker dst << ", " << shaderVarValueStr(uniform.finalValue) << ")";
1224*35238bceSAndroid Build Coastguard Worker }
1225*35238bceSAndroid Build Coastguard Worker
writeUniformComparisons(std::ostringstream & dst,const vector<BasicUniform> & basicUniforms,const char * const variableName) const1226*35238bceSAndroid Build Coastguard Worker void UniformCase::writeUniformComparisons(std::ostringstream &dst, const vector<BasicUniform> &basicUniforms,
1227*35238bceSAndroid Build Coastguard Worker const char *const variableName) const
1228*35238bceSAndroid Build Coastguard Worker {
1229*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)basicUniforms.size(); i++)
1230*35238bceSAndroid Build Coastguard Worker {
1231*35238bceSAndroid Build Coastguard Worker const BasicUniform &unif = basicUniforms[i];
1232*35238bceSAndroid Build Coastguard Worker
1233*35238bceSAndroid Build Coastguard Worker if (unif.isUsedInShader)
1234*35238bceSAndroid Build Coastguard Worker {
1235*35238bceSAndroid Build Coastguard Worker dst << "\t" << variableName << " *= ";
1236*35238bceSAndroid Build Coastguard Worker writeUniformCompareExpr(dst, basicUniforms[i]);
1237*35238bceSAndroid Build Coastguard Worker dst << ";\n";
1238*35238bceSAndroid Build Coastguard Worker }
1239*35238bceSAndroid Build Coastguard Worker else
1240*35238bceSAndroid Build Coastguard Worker dst << "\t// UNUSED: " << basicUniforms[i].name << "\n";
1241*35238bceSAndroid Build Coastguard Worker }
1242*35238bceSAndroid Build Coastguard Worker }
1243*35238bceSAndroid Build Coastguard Worker
generateVertexSource(const vector<BasicUniform> & basicUniforms) const1244*35238bceSAndroid Build Coastguard Worker string UniformCase::generateVertexSource(const vector<BasicUniform> &basicUniforms) const
1245*35238bceSAndroid Build Coastguard Worker {
1246*35238bceSAndroid Build Coastguard Worker const bool isVertexCase = m_caseShaderType == CASESHADERTYPE_VERTEX || m_caseShaderType == CASESHADERTYPE_BOTH;
1247*35238bceSAndroid Build Coastguard Worker std::ostringstream result;
1248*35238bceSAndroid Build Coastguard Worker
1249*35238bceSAndroid Build Coastguard Worker result << "#version 310 es\n"
1250*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
1251*35238bceSAndroid Build Coastguard Worker "out mediump float v_vtxOut;\n"
1252*35238bceSAndroid Build Coastguard Worker "\n";
1253*35238bceSAndroid Build Coastguard Worker
1254*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
1255*35238bceSAndroid Build Coastguard Worker writeUniformDefinitions(result);
1256*35238bceSAndroid Build Coastguard Worker
1257*35238bceSAndroid Build Coastguard Worker result << "\n"
1258*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
1259*35238bceSAndroid Build Coastguard Worker "{\n"
1260*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
1261*35238bceSAndroid Build Coastguard Worker " v_vtxOut = 1.0;\n";
1262*35238bceSAndroid Build Coastguard Worker
1263*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
1264*35238bceSAndroid Build Coastguard Worker writeUniformComparisons(result, basicUniforms, "v_vtxOut");
1265*35238bceSAndroid Build Coastguard Worker
1266*35238bceSAndroid Build Coastguard Worker result << "}\n";
1267*35238bceSAndroid Build Coastguard Worker
1268*35238bceSAndroid Build Coastguard Worker return result.str();
1269*35238bceSAndroid Build Coastguard Worker }
1270*35238bceSAndroid Build Coastguard Worker
generateFragmentSource(const vector<BasicUniform> & basicUniforms) const1271*35238bceSAndroid Build Coastguard Worker string UniformCase::generateFragmentSource(const vector<BasicUniform> &basicUniforms) const
1272*35238bceSAndroid Build Coastguard Worker {
1273*35238bceSAndroid Build Coastguard Worker const bool isFragmentCase = m_caseShaderType == CASESHADERTYPE_FRAGMENT || m_caseShaderType == CASESHADERTYPE_BOTH;
1274*35238bceSAndroid Build Coastguard Worker std::ostringstream result;
1275*35238bceSAndroid Build Coastguard Worker
1276*35238bceSAndroid Build Coastguard Worker result << "#version 310 es\n"
1277*35238bceSAndroid Build Coastguard Worker "in mediump float v_vtxOut;\n"
1278*35238bceSAndroid Build Coastguard Worker "\n";
1279*35238bceSAndroid Build Coastguard Worker
1280*35238bceSAndroid Build Coastguard Worker if (isFragmentCase)
1281*35238bceSAndroid Build Coastguard Worker writeUniformDefinitions(result);
1282*35238bceSAndroid Build Coastguard Worker
1283*35238bceSAndroid Build Coastguard Worker result << "\n"
1284*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
1285*35238bceSAndroid Build Coastguard Worker "\n"
1286*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
1287*35238bceSAndroid Build Coastguard Worker "{\n"
1288*35238bceSAndroid Build Coastguard Worker " mediump float result = v_vtxOut;\n";
1289*35238bceSAndroid Build Coastguard Worker
1290*35238bceSAndroid Build Coastguard Worker if (isFragmentCase)
1291*35238bceSAndroid Build Coastguard Worker writeUniformComparisons(result, basicUniforms, "result");
1292*35238bceSAndroid Build Coastguard Worker
1293*35238bceSAndroid Build Coastguard Worker result << " dEQP_FragColor = vec4(1.0-result, result, 0.0, 1.0);\n"
1294*35238bceSAndroid Build Coastguard Worker "}\n";
1295*35238bceSAndroid Build Coastguard Worker
1296*35238bceSAndroid Build Coastguard Worker return result.str();
1297*35238bceSAndroid Build Coastguard Worker }
1298*35238bceSAndroid Build Coastguard Worker
setupTexture(const VarValue & value)1299*35238bceSAndroid Build Coastguard Worker void UniformCase::setupTexture(const VarValue &value)
1300*35238bceSAndroid Build Coastguard Worker {
1301*35238bceSAndroid Build Coastguard Worker // \note No handling for samplers other than 2D or cube.
1302*35238bceSAndroid Build Coastguard Worker
1303*35238bceSAndroid Build Coastguard Worker enableLogging(false);
1304*35238bceSAndroid Build Coastguard Worker
1305*35238bceSAndroid Build Coastguard Worker DE_ASSERT(getSamplerLookupReturnType(value.type) == glu::TYPE_FLOAT_VEC4);
1306*35238bceSAndroid Build Coastguard Worker
1307*35238bceSAndroid Build Coastguard Worker const int width = 32;
1308*35238bceSAndroid Build Coastguard Worker const int height = 32;
1309*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = vec4FromPtr(&value.val.samplerV.fillColor.floatV[0]);
1310*35238bceSAndroid Build Coastguard Worker
1311*35238bceSAndroid Build Coastguard Worker if (value.type == glu::TYPE_SAMPLER_2D)
1312*35238bceSAndroid Build Coastguard Worker {
1313*35238bceSAndroid Build Coastguard Worker glu::Texture2D *texture =
1314*35238bceSAndroid Build Coastguard Worker new glu::Texture2D(m_context.getRenderContext(), GL_RGBA, GL_UNSIGNED_BYTE, width, height);
1315*35238bceSAndroid Build Coastguard Worker tcu::Texture2D &refTexture = texture->getRefTexture();
1316*35238bceSAndroid Build Coastguard Worker m_textures2d.push_back(texture);
1317*35238bceSAndroid Build Coastguard Worker
1318*35238bceSAndroid Build Coastguard Worker refTexture.allocLevel(0);
1319*35238bceSAndroid Build Coastguard Worker fillWithColor(refTexture.getLevel(0), color);
1320*35238bceSAndroid Build Coastguard Worker
1321*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glActiveTexture(GL_TEXTURE0 + value.val.samplerV.unit));
1322*35238bceSAndroid Build Coastguard Worker m_filledTextureUnits.push_back(value.val.samplerV.unit);
1323*35238bceSAndroid Build Coastguard Worker texture->upload();
1324*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
1325*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1326*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
1327*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
1328*35238bceSAndroid Build Coastguard Worker }
1329*35238bceSAndroid Build Coastguard Worker else if (value.type == glu::TYPE_SAMPLER_CUBE)
1330*35238bceSAndroid Build Coastguard Worker {
1331*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(width == height);
1332*35238bceSAndroid Build Coastguard Worker glu::TextureCube *texture =
1333*35238bceSAndroid Build Coastguard Worker new glu::TextureCube(m_context.getRenderContext(), GL_RGBA, GL_UNSIGNED_BYTE, width);
1334*35238bceSAndroid Build Coastguard Worker tcu::TextureCube &refTexture = texture->getRefTexture();
1335*35238bceSAndroid Build Coastguard Worker m_texturesCube.push_back(texture);
1336*35238bceSAndroid Build Coastguard Worker
1337*35238bceSAndroid Build Coastguard Worker for (int face = 0; face < (int)tcu::CUBEFACE_LAST; face++)
1338*35238bceSAndroid Build Coastguard Worker {
1339*35238bceSAndroid Build Coastguard Worker refTexture.allocLevel((tcu::CubeFace)face, 0);
1340*35238bceSAndroid Build Coastguard Worker fillWithColor(refTexture.getLevelFace(0, (tcu::CubeFace)face), color);
1341*35238bceSAndroid Build Coastguard Worker }
1342*35238bceSAndroid Build Coastguard Worker
1343*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glActiveTexture(GL_TEXTURE0 + value.val.samplerV.unit));
1344*35238bceSAndroid Build Coastguard Worker m_filledTextureUnits.push_back(value.val.samplerV.unit);
1345*35238bceSAndroid Build Coastguard Worker texture->upload();
1346*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
1347*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1348*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
1349*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
1350*35238bceSAndroid Build Coastguard Worker }
1351*35238bceSAndroid Build Coastguard Worker else
1352*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1353*35238bceSAndroid Build Coastguard Worker
1354*35238bceSAndroid Build Coastguard Worker enableLogging(true);
1355*35238bceSAndroid Build Coastguard Worker }
1356*35238bceSAndroid Build Coastguard Worker
getUniforms(vector<VarValue> & valuesDst,const vector<BasicUniform> & basicUniforms,const uint32_t programGL)1357*35238bceSAndroid Build Coastguard Worker bool UniformCase::getUniforms(vector<VarValue> &valuesDst, const vector<BasicUniform> &basicUniforms,
1358*35238bceSAndroid Build Coastguard Worker const uint32_t programGL)
1359*35238bceSAndroid Build Coastguard Worker {
1360*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1361*35238bceSAndroid Build Coastguard Worker bool success = true;
1362*35238bceSAndroid Build Coastguard Worker
1363*35238bceSAndroid Build Coastguard Worker for (int unifNdx = 0; unifNdx < (int)basicUniforms.size(); unifNdx++)
1364*35238bceSAndroid Build Coastguard Worker {
1365*35238bceSAndroid Build Coastguard Worker const BasicUniform &uniform = basicUniforms[unifNdx];
1366*35238bceSAndroid Build Coastguard Worker const string queryName = m_features & FEATURE_ARRAY_FIRST_ELEM_NAME_NO_INDEX && uniform.elemNdx == 0 ?
1367*35238bceSAndroid Build Coastguard Worker beforeLast(uniform.name, '[') :
1368*35238bceSAndroid Build Coastguard Worker uniform.name;
1369*35238bceSAndroid Build Coastguard Worker const int location = glGetUniformLocation(programGL, queryName.c_str());
1370*35238bceSAndroid Build Coastguard Worker const int size = glu::getDataTypeScalarSize(uniform.type);
1371*35238bceSAndroid Build Coastguard Worker VarValue value;
1372*35238bceSAndroid Build Coastguard Worker
1373*35238bceSAndroid Build Coastguard Worker deMemset(&value, 0xcd, sizeof(value)); // Initialize to known garbage.
1374*35238bceSAndroid Build Coastguard Worker
1375*35238bceSAndroid Build Coastguard Worker if (location == -1)
1376*35238bceSAndroid Build Coastguard Worker {
1377*35238bceSAndroid Build Coastguard Worker value.type = glu::TYPE_INVALID;
1378*35238bceSAndroid Build Coastguard Worker valuesDst.push_back(value);
1379*35238bceSAndroid Build Coastguard Worker if (uniform.isUsedInShader)
1380*35238bceSAndroid Build Coastguard Worker {
1381*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "// FAILURE: " << uniform.name << " was used in shader, but has location -1"
1382*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1383*35238bceSAndroid Build Coastguard Worker success = false;
1384*35238bceSAndroid Build Coastguard Worker }
1385*35238bceSAndroid Build Coastguard Worker continue;
1386*35238bceSAndroid Build Coastguard Worker }
1387*35238bceSAndroid Build Coastguard Worker
1388*35238bceSAndroid Build Coastguard Worker value.type = uniform.type;
1389*35238bceSAndroid Build Coastguard Worker
1390*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(GLint) == sizeof(value.val.intV[0]));
1391*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(GLuint) == sizeof(value.val.uintV[0]));
1392*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(GLfloat) == sizeof(value.val.floatV[0]));
1393*35238bceSAndroid Build Coastguard Worker
1394*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeFloatOrVec(uniform.type) || glu::isDataTypeMatrix(uniform.type))
1395*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGetUniformfv(programGL, location, &value.val.floatV[0]));
1396*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeIntOrIVec(uniform.type))
1397*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGetUniformiv(programGL, location, &value.val.intV[0]));
1398*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeUintOrUVec(uniform.type))
1399*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGetUniformuiv(programGL, location, &value.val.uintV[0]));
1400*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeBoolOrBVec(uniform.type))
1401*35238bceSAndroid Build Coastguard Worker {
1402*35238bceSAndroid Build Coastguard Worker if (m_features & FEATURE_BOOLEANAPITYPE_INT)
1403*35238bceSAndroid Build Coastguard Worker {
1404*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGetUniformiv(programGL, location, &value.val.intV[0]));
1405*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
1406*35238bceSAndroid Build Coastguard Worker value.val.boolV[i] = value.val.intV[i] != 0;
1407*35238bceSAndroid Build Coastguard Worker }
1408*35238bceSAndroid Build Coastguard Worker else if (m_features & FEATURE_BOOLEANAPITYPE_UINT)
1409*35238bceSAndroid Build Coastguard Worker {
1410*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGetUniformuiv(programGL, location, &value.val.uintV[0]));
1411*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
1412*35238bceSAndroid Build Coastguard Worker value.val.boolV[i] = value.val.uintV[i] != 0;
1413*35238bceSAndroid Build Coastguard Worker }
1414*35238bceSAndroid Build Coastguard Worker else // Default: use float.
1415*35238bceSAndroid Build Coastguard Worker {
1416*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGetUniformfv(programGL, location, &value.val.floatV[0]));
1417*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
1418*35238bceSAndroid Build Coastguard Worker value.val.boolV[i] = value.val.floatV[i] != 0.0f;
1419*35238bceSAndroid Build Coastguard Worker }
1420*35238bceSAndroid Build Coastguard Worker }
1421*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeSampler(uniform.type))
1422*35238bceSAndroid Build Coastguard Worker {
1423*35238bceSAndroid Build Coastguard Worker GLint unit = -1;
1424*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGetUniformiv(programGL, location, &unit));
1425*35238bceSAndroid Build Coastguard Worker value.val.samplerV.unit = unit;
1426*35238bceSAndroid Build Coastguard Worker }
1427*35238bceSAndroid Build Coastguard Worker else
1428*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1429*35238bceSAndroid Build Coastguard Worker
1430*35238bceSAndroid Build Coastguard Worker valuesDst.push_back(value);
1431*35238bceSAndroid Build Coastguard Worker
1432*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "// Got " << uniform.name << " value " << apiVarValueStr(value)
1433*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1434*35238bceSAndroid Build Coastguard Worker }
1435*35238bceSAndroid Build Coastguard Worker
1436*35238bceSAndroid Build Coastguard Worker return success;
1437*35238bceSAndroid Build Coastguard Worker }
1438*35238bceSAndroid Build Coastguard Worker
assignUniforms(const vector<BasicUniform> & basicUniforms,uint32_t programGL,Random & rnd)1439*35238bceSAndroid Build Coastguard Worker void UniformCase::assignUniforms(const vector<BasicUniform> &basicUniforms, uint32_t programGL, Random &rnd)
1440*35238bceSAndroid Build Coastguard Worker {
1441*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1442*35238bceSAndroid Build Coastguard Worker const bool transpose = (m_features & FEATURE_MATRIXMODE_ROWMAJOR) != 0;
1443*35238bceSAndroid Build Coastguard Worker const GLboolean transposeGL = transpose ? GL_TRUE : GL_FALSE;
1444*35238bceSAndroid Build Coastguard Worker const glu::DataType boolApiType = m_features & FEATURE_BOOLEANAPITYPE_INT ? glu::TYPE_INT :
1445*35238bceSAndroid Build Coastguard Worker m_features & FEATURE_BOOLEANAPITYPE_UINT ? glu::TYPE_UINT :
1446*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT;
1447*35238bceSAndroid Build Coastguard Worker
1448*35238bceSAndroid Build Coastguard Worker for (int unifNdx = 0; unifNdx < (int)basicUniforms.size(); unifNdx++)
1449*35238bceSAndroid Build Coastguard Worker {
1450*35238bceSAndroid Build Coastguard Worker const BasicUniform &uniform = basicUniforms[unifNdx];
1451*35238bceSAndroid Build Coastguard Worker const bool isArrayMember = uniform.elemNdx >= 0;
1452*35238bceSAndroid Build Coastguard Worker const string queryName = m_features & FEATURE_ARRAY_FIRST_ELEM_NAME_NO_INDEX && uniform.elemNdx == 0 ?
1453*35238bceSAndroid Build Coastguard Worker beforeLast(uniform.name, '[') :
1454*35238bceSAndroid Build Coastguard Worker uniform.name;
1455*35238bceSAndroid Build Coastguard Worker const int numValuesToAssign =
1456*35238bceSAndroid Build Coastguard Worker !isArrayMember ? 1 :
1457*35238bceSAndroid Build Coastguard Worker m_features & FEATURE_ARRAYASSIGN_FULL ? (uniform.elemNdx == 0 ? uniform.rootSize : 0) :
1458*35238bceSAndroid Build Coastguard Worker m_features & FEATURE_ARRAYASSIGN_BLOCKS_OF_TWO ? (uniform.elemNdx % 2 == 0 ? 2 : 0) :
1459*35238bceSAndroid Build Coastguard Worker /* Default: assign array elements separately */ 1;
1460*35238bceSAndroid Build Coastguard Worker
1461*35238bceSAndroid Build Coastguard Worker DE_ASSERT(numValuesToAssign >= 0);
1462*35238bceSAndroid Build Coastguard Worker DE_ASSERT(numValuesToAssign == 1 || isArrayMember);
1463*35238bceSAndroid Build Coastguard Worker
1464*35238bceSAndroid Build Coastguard Worker if (numValuesToAssign == 0)
1465*35238bceSAndroid Build Coastguard Worker {
1466*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "// Uniform " << uniform.name
1467*35238bceSAndroid Build Coastguard Worker << " is covered by another glProgramUniform*v() call to the same array" << TestLog::EndMessage;
1468*35238bceSAndroid Build Coastguard Worker continue;
1469*35238bceSAndroid Build Coastguard Worker }
1470*35238bceSAndroid Build Coastguard Worker
1471*35238bceSAndroid Build Coastguard Worker const int location = glGetUniformLocation(programGL, queryName.c_str());
1472*35238bceSAndroid Build Coastguard Worker const int typeSize = glu::getDataTypeScalarSize(uniform.type);
1473*35238bceSAndroid Build Coastguard Worker const bool assignByValue =
1474*35238bceSAndroid Build Coastguard Worker m_features & FEATURE_UNIFORMFUNC_VALUE && !glu::isDataTypeMatrix(uniform.type) && numValuesToAssign == 1;
1475*35238bceSAndroid Build Coastguard Worker vector<VarValue> valuesToAssign;
1476*35238bceSAndroid Build Coastguard Worker
1477*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numValuesToAssign; i++)
1478*35238bceSAndroid Build Coastguard Worker {
1479*35238bceSAndroid Build Coastguard Worker const string curName =
1480*35238bceSAndroid Build Coastguard Worker isArrayMember ? beforeLast(uniform.rootName, '[') + "[" + de::toString(uniform.elemNdx + i) + "]" :
1481*35238bceSAndroid Build Coastguard Worker uniform.name;
1482*35238bceSAndroid Build Coastguard Worker VarValue unifValue;
1483*35238bceSAndroid Build Coastguard Worker
1484*35238bceSAndroid Build Coastguard Worker if (isArrayMember)
1485*35238bceSAndroid Build Coastguard Worker {
1486*35238bceSAndroid Build Coastguard Worker const vector<BasicUniform>::const_iterator elemUnif =
1487*35238bceSAndroid Build Coastguard Worker BasicUniform::findWithName(basicUniforms, curName.c_str());
1488*35238bceSAndroid Build Coastguard Worker if (elemUnif == basicUniforms.end())
1489*35238bceSAndroid Build Coastguard Worker continue;
1490*35238bceSAndroid Build Coastguard Worker unifValue = elemUnif->finalValue;
1491*35238bceSAndroid Build Coastguard Worker }
1492*35238bceSAndroid Build Coastguard Worker else
1493*35238bceSAndroid Build Coastguard Worker unifValue = uniform.finalValue;
1494*35238bceSAndroid Build Coastguard Worker
1495*35238bceSAndroid Build Coastguard Worker const VarValue apiValue = glu::isDataTypeBoolOrBVec(unifValue.type) ?
1496*35238bceSAndroid Build Coastguard Worker getRandomBoolRepresentation(unifValue, boolApiType, rnd) :
1497*35238bceSAndroid Build Coastguard Worker glu::isDataTypeSampler(unifValue.type) ? getSamplerUnitValue(unifValue) :
1498*35238bceSAndroid Build Coastguard Worker unifValue;
1499*35238bceSAndroid Build Coastguard Worker
1500*35238bceSAndroid Build Coastguard Worker valuesToAssign.push_back(glu::isDataTypeMatrix(apiValue.type) && transpose ? getTransposeMatrix(apiValue) :
1501*35238bceSAndroid Build Coastguard Worker apiValue);
1502*35238bceSAndroid Build Coastguard Worker
1503*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeBoolOrBVec(uniform.type))
1504*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "// Using type " << glu::getDataTypeName(boolApiType)
1505*35238bceSAndroid Build Coastguard Worker << " to set boolean value " << apiVarValueStr(unifValue) << " for " << curName
1506*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1507*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeSampler(uniform.type))
1508*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "// Texture for the sampler uniform " << curName
1509*35238bceSAndroid Build Coastguard Worker << " will be filled with color " << apiVarValueStr(getSamplerFillValue(uniform.finalValue))
1510*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1511*35238bceSAndroid Build Coastguard Worker }
1512*35238bceSAndroid Build Coastguard Worker
1513*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!valuesToAssign.empty());
1514*35238bceSAndroid Build Coastguard Worker
1515*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeFloatOrVec(valuesToAssign[0].type))
1516*35238bceSAndroid Build Coastguard Worker {
1517*35238bceSAndroid Build Coastguard Worker if (assignByValue)
1518*35238bceSAndroid Build Coastguard Worker {
1519*35238bceSAndroid Build Coastguard Worker const float *const ptr = &valuesToAssign[0].val.floatV[0];
1520*35238bceSAndroid Build Coastguard Worker
1521*35238bceSAndroid Build Coastguard Worker switch (typeSize)
1522*35238bceSAndroid Build Coastguard Worker {
1523*35238bceSAndroid Build Coastguard Worker case 1:
1524*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform1f(programGL, location, ptr[0]));
1525*35238bceSAndroid Build Coastguard Worker break;
1526*35238bceSAndroid Build Coastguard Worker case 2:
1527*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform2f(programGL, location, ptr[0], ptr[1]));
1528*35238bceSAndroid Build Coastguard Worker break;
1529*35238bceSAndroid Build Coastguard Worker case 3:
1530*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform3f(programGL, location, ptr[0], ptr[1], ptr[2]));
1531*35238bceSAndroid Build Coastguard Worker break;
1532*35238bceSAndroid Build Coastguard Worker case 4:
1533*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform4f(programGL, location, ptr[0], ptr[1], ptr[2], ptr[3]));
1534*35238bceSAndroid Build Coastguard Worker break;
1535*35238bceSAndroid Build Coastguard Worker default:
1536*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1537*35238bceSAndroid Build Coastguard Worker }
1538*35238bceSAndroid Build Coastguard Worker }
1539*35238bceSAndroid Build Coastguard Worker else
1540*35238bceSAndroid Build Coastguard Worker {
1541*35238bceSAndroid Build Coastguard Worker vector<float> buffer(valuesToAssign.size() * typeSize);
1542*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)buffer.size(); i++)
1543*35238bceSAndroid Build Coastguard Worker buffer[i] = valuesToAssign[i / typeSize].val.floatV[i % typeSize];
1544*35238bceSAndroid Build Coastguard Worker
1545*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(GLfloat) == sizeof(buffer[0]));
1546*35238bceSAndroid Build Coastguard Worker switch (typeSize)
1547*35238bceSAndroid Build Coastguard Worker {
1548*35238bceSAndroid Build Coastguard Worker case 1:
1549*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1550*35238bceSAndroid Build Coastguard Worker glProgramUniform1fv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1551*35238bceSAndroid Build Coastguard Worker break;
1552*35238bceSAndroid Build Coastguard Worker case 2:
1553*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1554*35238bceSAndroid Build Coastguard Worker glProgramUniform2fv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1555*35238bceSAndroid Build Coastguard Worker break;
1556*35238bceSAndroid Build Coastguard Worker case 3:
1557*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1558*35238bceSAndroid Build Coastguard Worker glProgramUniform3fv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1559*35238bceSAndroid Build Coastguard Worker break;
1560*35238bceSAndroid Build Coastguard Worker case 4:
1561*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1562*35238bceSAndroid Build Coastguard Worker glProgramUniform4fv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1563*35238bceSAndroid Build Coastguard Worker break;
1564*35238bceSAndroid Build Coastguard Worker default:
1565*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1566*35238bceSAndroid Build Coastguard Worker }
1567*35238bceSAndroid Build Coastguard Worker }
1568*35238bceSAndroid Build Coastguard Worker }
1569*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeMatrix(valuesToAssign[0].type))
1570*35238bceSAndroid Build Coastguard Worker {
1571*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!assignByValue);
1572*35238bceSAndroid Build Coastguard Worker
1573*35238bceSAndroid Build Coastguard Worker vector<float> buffer(valuesToAssign.size() * typeSize);
1574*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)buffer.size(); i++)
1575*35238bceSAndroid Build Coastguard Worker buffer[i] = valuesToAssign[i / typeSize].val.floatV[i % typeSize];
1576*35238bceSAndroid Build Coastguard Worker
1577*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(GLfloat) == sizeof(buffer[0]));
1578*35238bceSAndroid Build Coastguard Worker switch (uniform.type)
1579*35238bceSAndroid Build Coastguard Worker {
1580*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT2:
1581*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix2fv(programGL, location, (GLsizei)valuesToAssign.size(),
1582*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1583*35238bceSAndroid Build Coastguard Worker break;
1584*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT3:
1585*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix3fv(programGL, location, (GLsizei)valuesToAssign.size(),
1586*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1587*35238bceSAndroid Build Coastguard Worker break;
1588*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT4:
1589*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix4fv(programGL, location, (GLsizei)valuesToAssign.size(),
1590*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1591*35238bceSAndroid Build Coastguard Worker break;
1592*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT2X3:
1593*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix2x3fv(programGL, location, (GLsizei)valuesToAssign.size(),
1594*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1595*35238bceSAndroid Build Coastguard Worker break;
1596*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT2X4:
1597*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix2x4fv(programGL, location, (GLsizei)valuesToAssign.size(),
1598*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1599*35238bceSAndroid Build Coastguard Worker break;
1600*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT3X2:
1601*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix3x2fv(programGL, location, (GLsizei)valuesToAssign.size(),
1602*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1603*35238bceSAndroid Build Coastguard Worker break;
1604*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT3X4:
1605*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix3x4fv(programGL, location, (GLsizei)valuesToAssign.size(),
1606*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1607*35238bceSAndroid Build Coastguard Worker break;
1608*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT4X2:
1609*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix4x2fv(programGL, location, (GLsizei)valuesToAssign.size(),
1610*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1611*35238bceSAndroid Build Coastguard Worker break;
1612*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_MAT4X3:
1613*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniformMatrix4x3fv(programGL, location, (GLsizei)valuesToAssign.size(),
1614*35238bceSAndroid Build Coastguard Worker transposeGL, &buffer[0]));
1615*35238bceSAndroid Build Coastguard Worker break;
1616*35238bceSAndroid Build Coastguard Worker default:
1617*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1618*35238bceSAndroid Build Coastguard Worker }
1619*35238bceSAndroid Build Coastguard Worker }
1620*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeIntOrIVec(valuesToAssign[0].type))
1621*35238bceSAndroid Build Coastguard Worker {
1622*35238bceSAndroid Build Coastguard Worker if (assignByValue)
1623*35238bceSAndroid Build Coastguard Worker {
1624*35238bceSAndroid Build Coastguard Worker const int32_t *const ptr = &valuesToAssign[0].val.intV[0];
1625*35238bceSAndroid Build Coastguard Worker
1626*35238bceSAndroid Build Coastguard Worker switch (typeSize)
1627*35238bceSAndroid Build Coastguard Worker {
1628*35238bceSAndroid Build Coastguard Worker case 1:
1629*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform1i(programGL, location, ptr[0]));
1630*35238bceSAndroid Build Coastguard Worker break;
1631*35238bceSAndroid Build Coastguard Worker case 2:
1632*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform2i(programGL, location, ptr[0], ptr[1]));
1633*35238bceSAndroid Build Coastguard Worker break;
1634*35238bceSAndroid Build Coastguard Worker case 3:
1635*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform3i(programGL, location, ptr[0], ptr[1], ptr[2]));
1636*35238bceSAndroid Build Coastguard Worker break;
1637*35238bceSAndroid Build Coastguard Worker case 4:
1638*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform4i(programGL, location, ptr[0], ptr[1], ptr[2], ptr[3]));
1639*35238bceSAndroid Build Coastguard Worker break;
1640*35238bceSAndroid Build Coastguard Worker default:
1641*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1642*35238bceSAndroid Build Coastguard Worker }
1643*35238bceSAndroid Build Coastguard Worker }
1644*35238bceSAndroid Build Coastguard Worker else
1645*35238bceSAndroid Build Coastguard Worker {
1646*35238bceSAndroid Build Coastguard Worker vector<int32_t> buffer(valuesToAssign.size() * typeSize);
1647*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)buffer.size(); i++)
1648*35238bceSAndroid Build Coastguard Worker buffer[i] = valuesToAssign[i / typeSize].val.intV[i % typeSize];
1649*35238bceSAndroid Build Coastguard Worker
1650*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(GLint) == sizeof(buffer[0]));
1651*35238bceSAndroid Build Coastguard Worker switch (typeSize)
1652*35238bceSAndroid Build Coastguard Worker {
1653*35238bceSAndroid Build Coastguard Worker case 1:
1654*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1655*35238bceSAndroid Build Coastguard Worker glProgramUniform1iv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1656*35238bceSAndroid Build Coastguard Worker break;
1657*35238bceSAndroid Build Coastguard Worker case 2:
1658*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1659*35238bceSAndroid Build Coastguard Worker glProgramUniform2iv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1660*35238bceSAndroid Build Coastguard Worker break;
1661*35238bceSAndroid Build Coastguard Worker case 3:
1662*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1663*35238bceSAndroid Build Coastguard Worker glProgramUniform3iv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1664*35238bceSAndroid Build Coastguard Worker break;
1665*35238bceSAndroid Build Coastguard Worker case 4:
1666*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1667*35238bceSAndroid Build Coastguard Worker glProgramUniform4iv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1668*35238bceSAndroid Build Coastguard Worker break;
1669*35238bceSAndroid Build Coastguard Worker default:
1670*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1671*35238bceSAndroid Build Coastguard Worker }
1672*35238bceSAndroid Build Coastguard Worker }
1673*35238bceSAndroid Build Coastguard Worker }
1674*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeUintOrUVec(valuesToAssign[0].type))
1675*35238bceSAndroid Build Coastguard Worker {
1676*35238bceSAndroid Build Coastguard Worker if (assignByValue)
1677*35238bceSAndroid Build Coastguard Worker {
1678*35238bceSAndroid Build Coastguard Worker const uint32_t *const ptr = &valuesToAssign[0].val.uintV[0];
1679*35238bceSAndroid Build Coastguard Worker
1680*35238bceSAndroid Build Coastguard Worker switch (typeSize)
1681*35238bceSAndroid Build Coastguard Worker {
1682*35238bceSAndroid Build Coastguard Worker case 1:
1683*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform1ui(programGL, location, ptr[0]));
1684*35238bceSAndroid Build Coastguard Worker break;
1685*35238bceSAndroid Build Coastguard Worker case 2:
1686*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform2ui(programGL, location, ptr[0], ptr[1]));
1687*35238bceSAndroid Build Coastguard Worker break;
1688*35238bceSAndroid Build Coastguard Worker case 3:
1689*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform3ui(programGL, location, ptr[0], ptr[1], ptr[2]));
1690*35238bceSAndroid Build Coastguard Worker break;
1691*35238bceSAndroid Build Coastguard Worker case 4:
1692*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform4ui(programGL, location, ptr[0], ptr[1], ptr[2], ptr[3]));
1693*35238bceSAndroid Build Coastguard Worker break;
1694*35238bceSAndroid Build Coastguard Worker default:
1695*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1696*35238bceSAndroid Build Coastguard Worker }
1697*35238bceSAndroid Build Coastguard Worker }
1698*35238bceSAndroid Build Coastguard Worker else
1699*35238bceSAndroid Build Coastguard Worker {
1700*35238bceSAndroid Build Coastguard Worker vector<uint32_t> buffer(valuesToAssign.size() * typeSize);
1701*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)buffer.size(); i++)
1702*35238bceSAndroid Build Coastguard Worker buffer[i] = valuesToAssign[i / typeSize].val.intV[i % typeSize];
1703*35238bceSAndroid Build Coastguard Worker
1704*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(GLuint) == sizeof(buffer[0]));
1705*35238bceSAndroid Build Coastguard Worker switch (typeSize)
1706*35238bceSAndroid Build Coastguard Worker {
1707*35238bceSAndroid Build Coastguard Worker case 1:
1708*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1709*35238bceSAndroid Build Coastguard Worker glProgramUniform1uiv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1710*35238bceSAndroid Build Coastguard Worker break;
1711*35238bceSAndroid Build Coastguard Worker case 2:
1712*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1713*35238bceSAndroid Build Coastguard Worker glProgramUniform2uiv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1714*35238bceSAndroid Build Coastguard Worker break;
1715*35238bceSAndroid Build Coastguard Worker case 3:
1716*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1717*35238bceSAndroid Build Coastguard Worker glProgramUniform3uiv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1718*35238bceSAndroid Build Coastguard Worker break;
1719*35238bceSAndroid Build Coastguard Worker case 4:
1720*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
1721*35238bceSAndroid Build Coastguard Worker glProgramUniform4uiv(programGL, location, (GLsizei)valuesToAssign.size(), &buffer[0]));
1722*35238bceSAndroid Build Coastguard Worker break;
1723*35238bceSAndroid Build Coastguard Worker default:
1724*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1725*35238bceSAndroid Build Coastguard Worker }
1726*35238bceSAndroid Build Coastguard Worker }
1727*35238bceSAndroid Build Coastguard Worker }
1728*35238bceSAndroid Build Coastguard Worker else if (glu::isDataTypeSampler(valuesToAssign[0].type))
1729*35238bceSAndroid Build Coastguard Worker {
1730*35238bceSAndroid Build Coastguard Worker if (assignByValue)
1731*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform1i(programGL, location, uniform.finalValue.val.samplerV.unit));
1732*35238bceSAndroid Build Coastguard Worker else
1733*35238bceSAndroid Build Coastguard Worker {
1734*35238bceSAndroid Build Coastguard Worker const GLint unit = uniform.finalValue.val.samplerV.unit;
1735*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glProgramUniform1iv(programGL, location, (GLsizei)valuesToAssign.size(), &unit));
1736*35238bceSAndroid Build Coastguard Worker }
1737*35238bceSAndroid Build Coastguard Worker }
1738*35238bceSAndroid Build Coastguard Worker else
1739*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1740*35238bceSAndroid Build Coastguard Worker }
1741*35238bceSAndroid Build Coastguard Worker }
1742*35238bceSAndroid Build Coastguard Worker
compareUniformValues(const vector<VarValue> & values,const vector<BasicUniform> & basicUniforms)1743*35238bceSAndroid Build Coastguard Worker bool UniformCase::compareUniformValues(const vector<VarValue> &values, const vector<BasicUniform> &basicUniforms)
1744*35238bceSAndroid Build Coastguard Worker {
1745*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1746*35238bceSAndroid Build Coastguard Worker bool success = true;
1747*35238bceSAndroid Build Coastguard Worker
1748*35238bceSAndroid Build Coastguard Worker for (int unifNdx = 0; unifNdx < (int)basicUniforms.size(); unifNdx++)
1749*35238bceSAndroid Build Coastguard Worker {
1750*35238bceSAndroid Build Coastguard Worker const BasicUniform &uniform = basicUniforms[unifNdx];
1751*35238bceSAndroid Build Coastguard Worker const VarValue &unifValue = values[unifNdx];
1752*35238bceSAndroid Build Coastguard Worker
1753*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "// Checking uniform " << uniform.name << TestLog::EndMessage;
1754*35238bceSAndroid Build Coastguard Worker
1755*35238bceSAndroid Build Coastguard Worker if (unifValue.type == glu::TYPE_INVALID) // This happens when glGetUniformLocation() returned -1.
1756*35238bceSAndroid Build Coastguard Worker continue;
1757*35238bceSAndroid Build Coastguard Worker
1758*35238bceSAndroid Build Coastguard Worker if (!apiVarValueEquals(unifValue, uniform.finalValue))
1759*35238bceSAndroid Build Coastguard Worker {
1760*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "// FAILURE: value obtained with glGetUniform*() for uniform " << uniform.name
1761*35238bceSAndroid Build Coastguard Worker << " differs from value set with glProgramUniform*()" << TestLog::EndMessage;
1762*35238bceSAndroid Build Coastguard Worker success = false;
1763*35238bceSAndroid Build Coastguard Worker }
1764*35238bceSAndroid Build Coastguard Worker }
1765*35238bceSAndroid Build Coastguard Worker
1766*35238bceSAndroid Build Coastguard Worker return success;
1767*35238bceSAndroid Build Coastguard Worker }
1768*35238bceSAndroid Build Coastguard Worker
renderTest(const vector<BasicUniform> & basicUniforms,const ShaderProgram & program,Random & rnd)1769*35238bceSAndroid Build Coastguard Worker bool UniformCase::renderTest(const vector<BasicUniform> &basicUniforms, const ShaderProgram &program, Random &rnd)
1770*35238bceSAndroid Build Coastguard Worker {
1771*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1772*35238bceSAndroid Build Coastguard Worker const tcu::RenderTarget &renderTarget = m_context.getRenderTarget();
1773*35238bceSAndroid Build Coastguard Worker const int viewportW = de::min<int>(renderTarget.getWidth(), MAX_RENDER_WIDTH);
1774*35238bceSAndroid Build Coastguard Worker const int viewportH = de::min<int>(renderTarget.getHeight(), MAX_RENDER_HEIGHT);
1775*35238bceSAndroid Build Coastguard Worker const int viewportX = rnd.getInt(0, renderTarget.getWidth() - viewportW);
1776*35238bceSAndroid Build Coastguard Worker const int viewportY = rnd.getInt(0, renderTarget.getHeight() - viewportH);
1777*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedImg(viewportW, viewportH);
1778*35238bceSAndroid Build Coastguard Worker
1779*35238bceSAndroid Build Coastguard Worker // Assert that no two samplers of different types have the same texture unit - this is an error in GL.
1780*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)basicUniforms.size(); i++)
1781*35238bceSAndroid Build Coastguard Worker {
1782*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeSampler(basicUniforms[i].type))
1783*35238bceSAndroid Build Coastguard Worker {
1784*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < i; j++)
1785*35238bceSAndroid Build Coastguard Worker {
1786*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeSampler(basicUniforms[j].type) && basicUniforms[i].type != basicUniforms[j].type)
1787*35238bceSAndroid Build Coastguard Worker DE_ASSERT(basicUniforms[i].finalValue.val.samplerV.unit !=
1788*35238bceSAndroid Build Coastguard Worker basicUniforms[j].finalValue.val.samplerV.unit);
1789*35238bceSAndroid Build Coastguard Worker }
1790*35238bceSAndroid Build Coastguard Worker }
1791*35238bceSAndroid Build Coastguard Worker }
1792*35238bceSAndroid Build Coastguard Worker
1793*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)basicUniforms.size(); i++)
1794*35238bceSAndroid Build Coastguard Worker {
1795*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeSampler(basicUniforms[i].type) &&
1796*35238bceSAndroid Build Coastguard Worker std::find(m_filledTextureUnits.begin(), m_filledTextureUnits.end(),
1797*35238bceSAndroid Build Coastguard Worker basicUniforms[i].finalValue.val.samplerV.unit) == m_filledTextureUnits.end())
1798*35238bceSAndroid Build Coastguard Worker {
1799*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "// Filling texture at unit " << apiVarValueStr(basicUniforms[i].finalValue)
1800*35238bceSAndroid Build Coastguard Worker << " with color " << shaderVarValueStr(basicUniforms[i].finalValue) << TestLog::EndMessage;
1801*35238bceSAndroid Build Coastguard Worker setupTexture(basicUniforms[i].finalValue);
1802*35238bceSAndroid Build Coastguard Worker }
1803*35238bceSAndroid Build Coastguard Worker }
1804*35238bceSAndroid Build Coastguard Worker
1805*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glViewport(viewportX, viewportY, viewportW, viewportH));
1806*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClearColor(0.0f, 0.0f, 0.0f, 1.0f));
1807*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT));
1808*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glUseProgram(program.getProgram()));
1809*35238bceSAndroid Build Coastguard Worker
1810*35238bceSAndroid Build Coastguard Worker {
1811*35238bceSAndroid Build Coastguard Worker static const float position[] = {-1.0f, -1.0f, 0.0f, 1.0f, -1.0f, +1.0f, 0.0f, 1.0f,
1812*35238bceSAndroid Build Coastguard Worker +1.0f, -1.0f, 0.0f, 1.0f, +1.0f, +1.0f, 0.0f, 1.0f};
1813*35238bceSAndroid Build Coastguard Worker static const uint16_t indices[] = {0, 1, 2, 2, 1, 3};
1814*35238bceSAndroid Build Coastguard Worker const glu::VertexArrayBinding binding = glu::va::Float("a_position", 4, 4, 0, &position[0]);
1815*35238bceSAndroid Build Coastguard Worker
1816*35238bceSAndroid Build Coastguard Worker glu::draw(m_context.getRenderContext(), program.getProgram(), 1, &binding,
1817*35238bceSAndroid Build Coastguard Worker glu::pr::Triangles(DE_LENGTH_OF_ARRAY(indices), &indices[0]));
1818*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, renderedImg.getAccess());
1819*35238bceSAndroid Build Coastguard Worker }
1820*35238bceSAndroid Build Coastguard Worker
1821*35238bceSAndroid Build Coastguard Worker int numFailedPixels = 0;
1822*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < renderedImg.getHeight(); y++)
1823*35238bceSAndroid Build Coastguard Worker {
1824*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < renderedImg.getWidth(); x++)
1825*35238bceSAndroid Build Coastguard Worker {
1826*35238bceSAndroid Build Coastguard Worker if (renderedImg.getPixel(x, y) != tcu::RGBA::green())
1827*35238bceSAndroid Build Coastguard Worker numFailedPixels += 1;
1828*35238bceSAndroid Build Coastguard Worker }
1829*35238bceSAndroid Build Coastguard Worker }
1830*35238bceSAndroid Build Coastguard Worker
1831*35238bceSAndroid Build Coastguard Worker if (numFailedPixels > 0)
1832*35238bceSAndroid Build Coastguard Worker {
1833*35238bceSAndroid Build Coastguard Worker log << TestLog::Image("RenderedImage", "Rendered image", renderedImg);
1834*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "FAILURE: image comparison failed, got " << numFailedPixels << " non-green pixels"
1835*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1836*35238bceSAndroid Build Coastguard Worker return false;
1837*35238bceSAndroid Build Coastguard Worker }
1838*35238bceSAndroid Build Coastguard Worker else
1839*35238bceSAndroid Build Coastguard Worker {
1840*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Success: got all-green pixels (all uniforms have correct values)"
1841*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1842*35238bceSAndroid Build Coastguard Worker return true;
1843*35238bceSAndroid Build Coastguard Worker }
1844*35238bceSAndroid Build Coastguard Worker }
1845*35238bceSAndroid Build Coastguard Worker
iterate(void)1846*35238bceSAndroid Build Coastguard Worker UniformCase::IterateResult UniformCase::iterate(void)
1847*35238bceSAndroid Build Coastguard Worker {
1848*35238bceSAndroid Build Coastguard Worker Random rnd(deStringHash(getName()) ^ (uint32_t)m_context.getTestContext().getCommandLine().getBaseSeed());
1849*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1850*35238bceSAndroid Build Coastguard Worker vector<BasicUniform> basicUniforms;
1851*35238bceSAndroid Build Coastguard Worker vector<BasicUniformReportRef> basicUniformReportsRef;
1852*35238bceSAndroid Build Coastguard Worker
1853*35238bceSAndroid Build Coastguard Worker {
1854*35238bceSAndroid Build Coastguard Worker int samplerUnitCounter = 0;
1855*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)m_uniformCollection->getNumUniforms(); i++)
1856*35238bceSAndroid Build Coastguard Worker generateBasicUniforms(basicUniforms, basicUniformReportsRef, m_uniformCollection->getUniform(i).type,
1857*35238bceSAndroid Build Coastguard Worker m_uniformCollection->getUniform(i).name.c_str(), true, samplerUnitCounter, rnd);
1858*35238bceSAndroid Build Coastguard Worker }
1859*35238bceSAndroid Build Coastguard Worker
1860*35238bceSAndroid Build Coastguard Worker const string vertexSource = generateVertexSource(basicUniforms);
1861*35238bceSAndroid Build Coastguard Worker const string fragmentSource = generateFragmentSource(basicUniforms);
1862*35238bceSAndroid Build Coastguard Worker const ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexSource, fragmentSource));
1863*35238bceSAndroid Build Coastguard Worker
1864*35238bceSAndroid Build Coastguard Worker // An unused program that we'll give to glUseProgram before we actually need
1865*35238bceSAndroid Build Coastguard Worker // the real program above, to see if an implementation tries to use the
1866*35238bceSAndroid Build Coastguard Worker // currently active program for something inappropriate (instead of the
1867*35238bceSAndroid Build Coastguard Worker // program given as argument to, say, glProgramUniform*).
1868*35238bceSAndroid Build Coastguard Worker const ShaderProgram unusedProgram(
1869*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext(),
1870*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources("#version 310 es\n"
1871*35238bceSAndroid Build Coastguard Worker "void main (void) { gl_Position = vec4(1.0); }\n",
1872*35238bceSAndroid Build Coastguard Worker
1873*35238bceSAndroid Build Coastguard Worker "#version 310 es\n"
1874*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
1875*35238bceSAndroid Build Coastguard Worker "void main (void) { dEQP_FragColor = vec4(0.0, 0.0, 1.0, 1.0); }\n"));
1876*35238bceSAndroid Build Coastguard Worker
1877*35238bceSAndroid Build Coastguard Worker log << program;
1878*35238bceSAndroid Build Coastguard Worker
1879*35238bceSAndroid Build Coastguard Worker if (!program.isOk())
1880*35238bceSAndroid Build Coastguard Worker {
1881*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Compile failed");
1882*35238bceSAndroid Build Coastguard Worker return STOP;
1883*35238bceSAndroid Build Coastguard Worker }
1884*35238bceSAndroid Build Coastguard Worker
1885*35238bceSAndroid Build Coastguard Worker if (!unusedProgram.isOk())
1886*35238bceSAndroid Build Coastguard Worker {
1887*35238bceSAndroid Build Coastguard Worker log << unusedProgram;
1888*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Compilation of unused program failed");
1889*35238bceSAndroid Build Coastguard Worker return STOP;
1890*35238bceSAndroid Build Coastguard Worker }
1891*35238bceSAndroid Build Coastguard Worker
1892*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
1893*35238bceSAndroid Build Coastguard Worker << "// Note: calling glUseProgram with a unused program (will only use the real program once it's needed for "
1894*35238bceSAndroid Build Coastguard Worker "rendering)"
1895*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1896*35238bceSAndroid Build Coastguard Worker glUseProgram(unusedProgram.getProgram());
1897*35238bceSAndroid Build Coastguard Worker
1898*35238bceSAndroid Build Coastguard Worker const bool success = test(basicUniforms, basicUniformReportsRef, program, rnd);
1899*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(success ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, success ? "Passed" : "Failed");
1900*35238bceSAndroid Build Coastguard Worker
1901*35238bceSAndroid Build Coastguard Worker return STOP;
1902*35238bceSAndroid Build Coastguard Worker }
1903*35238bceSAndroid Build Coastguard Worker
1904*35238bceSAndroid Build Coastguard Worker class UniformAssignCase : public UniformCase
1905*35238bceSAndroid Build Coastguard Worker {
1906*35238bceSAndroid Build Coastguard Worker public:
1907*35238bceSAndroid Build Coastguard Worker enum CheckMethod
1908*35238bceSAndroid Build Coastguard Worker {
1909*35238bceSAndroid Build Coastguard Worker CHECKMETHOD_GET_UNIFORM = 0, //!< Check values with glGetUniform*().
1910*35238bceSAndroid Build Coastguard Worker CHECKMETHOD_RENDER, //!< Check values by rendering with the value-checking shader.
1911*35238bceSAndroid Build Coastguard Worker
1912*35238bceSAndroid Build Coastguard Worker CHECKMETHOD_LAST
1913*35238bceSAndroid Build Coastguard Worker };
1914*35238bceSAndroid Build Coastguard Worker enum AssignMethod
1915*35238bceSAndroid Build Coastguard Worker {
1916*35238bceSAndroid Build Coastguard Worker ASSIGNMETHOD_POINTER = 0,
1917*35238bceSAndroid Build Coastguard Worker ASSIGNMETHOD_VALUE,
1918*35238bceSAndroid Build Coastguard Worker
1919*35238bceSAndroid Build Coastguard Worker ASSIGNMETHOD_LAST
1920*35238bceSAndroid Build Coastguard Worker };
1921*35238bceSAndroid Build Coastguard Worker
1922*35238bceSAndroid Build Coastguard Worker UniformAssignCase(Context &context, const char *name, const char *description, CaseShaderType shaderType,
1923*35238bceSAndroid Build Coastguard Worker const SharedPtr<const UniformCollection> &uniformCollection, CheckMethod checkMethod,
1924*35238bceSAndroid Build Coastguard Worker AssignMethod assignMethod, uint32_t additionalFeatures = 0);
1925*35238bceSAndroid Build Coastguard Worker
1926*35238bceSAndroid Build Coastguard Worker bool test(const vector<BasicUniform> &basicUniforms, const vector<BasicUniformReportRef> &basicUniformReportsRef,
1927*35238bceSAndroid Build Coastguard Worker const ShaderProgram &program, Random &rnd);
1928*35238bceSAndroid Build Coastguard Worker
1929*35238bceSAndroid Build Coastguard Worker static const char *getCheckMethodName(CheckMethod checkMethod);
1930*35238bceSAndroid Build Coastguard Worker static const char *getCheckMethodDescription(CheckMethod checkMethod);
1931*35238bceSAndroid Build Coastguard Worker static const char *getAssignMethodName(AssignMethod checkMethod);
1932*35238bceSAndroid Build Coastguard Worker static const char *getAssignMethodDescription(AssignMethod checkMethod);
1933*35238bceSAndroid Build Coastguard Worker
1934*35238bceSAndroid Build Coastguard Worker private:
1935*35238bceSAndroid Build Coastguard Worker const CheckMethod m_checkMethod;
1936*35238bceSAndroid Build Coastguard Worker };
1937*35238bceSAndroid Build Coastguard Worker
getCheckMethodName(const CheckMethod checkMethod)1938*35238bceSAndroid Build Coastguard Worker const char *UniformAssignCase::getCheckMethodName(const CheckMethod checkMethod)
1939*35238bceSAndroid Build Coastguard Worker {
1940*35238bceSAndroid Build Coastguard Worker switch (checkMethod)
1941*35238bceSAndroid Build Coastguard Worker {
1942*35238bceSAndroid Build Coastguard Worker case CHECKMETHOD_GET_UNIFORM:
1943*35238bceSAndroid Build Coastguard Worker return "get_uniform";
1944*35238bceSAndroid Build Coastguard Worker case CHECKMETHOD_RENDER:
1945*35238bceSAndroid Build Coastguard Worker return "render";
1946*35238bceSAndroid Build Coastguard Worker default:
1947*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1948*35238bceSAndroid Build Coastguard Worker return DE_NULL;
1949*35238bceSAndroid Build Coastguard Worker }
1950*35238bceSAndroid Build Coastguard Worker }
1951*35238bceSAndroid Build Coastguard Worker
getCheckMethodDescription(const CheckMethod checkMethod)1952*35238bceSAndroid Build Coastguard Worker const char *UniformAssignCase::getCheckMethodDescription(const CheckMethod checkMethod)
1953*35238bceSAndroid Build Coastguard Worker {
1954*35238bceSAndroid Build Coastguard Worker switch (checkMethod)
1955*35238bceSAndroid Build Coastguard Worker {
1956*35238bceSAndroid Build Coastguard Worker case CHECKMETHOD_GET_UNIFORM:
1957*35238bceSAndroid Build Coastguard Worker return "Verify values with glGetUniform*()";
1958*35238bceSAndroid Build Coastguard Worker case CHECKMETHOD_RENDER:
1959*35238bceSAndroid Build Coastguard Worker return "Verify values by rendering";
1960*35238bceSAndroid Build Coastguard Worker default:
1961*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1962*35238bceSAndroid Build Coastguard Worker return DE_NULL;
1963*35238bceSAndroid Build Coastguard Worker }
1964*35238bceSAndroid Build Coastguard Worker }
1965*35238bceSAndroid Build Coastguard Worker
getAssignMethodName(const AssignMethod assignMethod)1966*35238bceSAndroid Build Coastguard Worker const char *UniformAssignCase::getAssignMethodName(const AssignMethod assignMethod)
1967*35238bceSAndroid Build Coastguard Worker {
1968*35238bceSAndroid Build Coastguard Worker switch (assignMethod)
1969*35238bceSAndroid Build Coastguard Worker {
1970*35238bceSAndroid Build Coastguard Worker case ASSIGNMETHOD_POINTER:
1971*35238bceSAndroid Build Coastguard Worker return "by_pointer";
1972*35238bceSAndroid Build Coastguard Worker case ASSIGNMETHOD_VALUE:
1973*35238bceSAndroid Build Coastguard Worker return "by_value";
1974*35238bceSAndroid Build Coastguard Worker default:
1975*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1976*35238bceSAndroid Build Coastguard Worker return DE_NULL;
1977*35238bceSAndroid Build Coastguard Worker }
1978*35238bceSAndroid Build Coastguard Worker }
1979*35238bceSAndroid Build Coastguard Worker
getAssignMethodDescription(const AssignMethod assignMethod)1980*35238bceSAndroid Build Coastguard Worker const char *UniformAssignCase::getAssignMethodDescription(const AssignMethod assignMethod)
1981*35238bceSAndroid Build Coastguard Worker {
1982*35238bceSAndroid Build Coastguard Worker switch (assignMethod)
1983*35238bceSAndroid Build Coastguard Worker {
1984*35238bceSAndroid Build Coastguard Worker case ASSIGNMETHOD_POINTER:
1985*35238bceSAndroid Build Coastguard Worker return "Assign values by-pointer";
1986*35238bceSAndroid Build Coastguard Worker case ASSIGNMETHOD_VALUE:
1987*35238bceSAndroid Build Coastguard Worker return "Assign values by-value";
1988*35238bceSAndroid Build Coastguard Worker default:
1989*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1990*35238bceSAndroid Build Coastguard Worker return DE_NULL;
1991*35238bceSAndroid Build Coastguard Worker }
1992*35238bceSAndroid Build Coastguard Worker }
1993*35238bceSAndroid Build Coastguard Worker
UniformAssignCase(Context & context,const char * const name,const char * const description,const CaseShaderType shaderType,const SharedPtr<const UniformCollection> & uniformCollection,const CheckMethod checkMethod,const AssignMethod assignMethod,const uint32_t additionalFeatures)1994*35238bceSAndroid Build Coastguard Worker UniformAssignCase::UniformAssignCase(Context &context, const char *const name, const char *const description,
1995*35238bceSAndroid Build Coastguard Worker const CaseShaderType shaderType,
1996*35238bceSAndroid Build Coastguard Worker const SharedPtr<const UniformCollection> &uniformCollection,
1997*35238bceSAndroid Build Coastguard Worker const CheckMethod checkMethod, const AssignMethod assignMethod,
1998*35238bceSAndroid Build Coastguard Worker const uint32_t additionalFeatures)
1999*35238bceSAndroid Build Coastguard Worker : UniformCase(context, name, description, shaderType, uniformCollection,
2000*35238bceSAndroid Build Coastguard Worker (assignMethod == ASSIGNMETHOD_VALUE ? FEATURE_UNIFORMFUNC_VALUE : 0) | additionalFeatures)
2001*35238bceSAndroid Build Coastguard Worker , m_checkMethod(checkMethod)
2002*35238bceSAndroid Build Coastguard Worker {
2003*35238bceSAndroid Build Coastguard Worker DE_ASSERT(assignMethod != ASSIGNMETHOD_LAST);
2004*35238bceSAndroid Build Coastguard Worker }
2005*35238bceSAndroid Build Coastguard Worker
test(const vector<BasicUniform> & basicUniforms,const vector<BasicUniformReportRef> & basicUniformReportsRef,const ShaderProgram & program,Random & rnd)2006*35238bceSAndroid Build Coastguard Worker bool UniformAssignCase::test(const vector<BasicUniform> &basicUniforms,
2007*35238bceSAndroid Build Coastguard Worker const vector<BasicUniformReportRef> &basicUniformReportsRef, const ShaderProgram &program,
2008*35238bceSAndroid Build Coastguard Worker Random &rnd)
2009*35238bceSAndroid Build Coastguard Worker {
2010*35238bceSAndroid Build Coastguard Worker DE_UNREF(basicUniformReportsRef);
2011*35238bceSAndroid Build Coastguard Worker
2012*35238bceSAndroid Build Coastguard Worker const uint32_t programGL = program.getProgram();
2013*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
2014*35238bceSAndroid Build Coastguard Worker
2015*35238bceSAndroid Build Coastguard Worker {
2016*35238bceSAndroid Build Coastguard Worker const ScopedLogSection section(log, "UniformAssign", "Uniform value assignments");
2017*35238bceSAndroid Build Coastguard Worker assignUniforms(basicUniforms, programGL, rnd);
2018*35238bceSAndroid Build Coastguard Worker }
2019*35238bceSAndroid Build Coastguard Worker
2020*35238bceSAndroid Build Coastguard Worker if (m_checkMethod == CHECKMETHOD_GET_UNIFORM)
2021*35238bceSAndroid Build Coastguard Worker {
2022*35238bceSAndroid Build Coastguard Worker vector<VarValue> values;
2023*35238bceSAndroid Build Coastguard Worker
2024*35238bceSAndroid Build Coastguard Worker {
2025*35238bceSAndroid Build Coastguard Worker const ScopedLogSection section(log, "GetUniforms", "Uniform value query");
2026*35238bceSAndroid Build Coastguard Worker const bool success = getUniforms(values, basicUniforms, program.getProgram());
2027*35238bceSAndroid Build Coastguard Worker
2028*35238bceSAndroid Build Coastguard Worker if (!success)
2029*35238bceSAndroid Build Coastguard Worker return false;
2030*35238bceSAndroid Build Coastguard Worker }
2031*35238bceSAndroid Build Coastguard Worker
2032*35238bceSAndroid Build Coastguard Worker {
2033*35238bceSAndroid Build Coastguard Worker const ScopedLogSection section(log, "ValueCheck",
2034*35238bceSAndroid Build Coastguard Worker "Verify that the reported values match the assigned values");
2035*35238bceSAndroid Build Coastguard Worker const bool success = compareUniformValues(values, basicUniforms);
2036*35238bceSAndroid Build Coastguard Worker
2037*35238bceSAndroid Build Coastguard Worker if (!success)
2038*35238bceSAndroid Build Coastguard Worker return false;
2039*35238bceSAndroid Build Coastguard Worker }
2040*35238bceSAndroid Build Coastguard Worker }
2041*35238bceSAndroid Build Coastguard Worker else
2042*35238bceSAndroid Build Coastguard Worker {
2043*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_checkMethod == CHECKMETHOD_RENDER);
2044*35238bceSAndroid Build Coastguard Worker
2045*35238bceSAndroid Build Coastguard Worker const ScopedLogSection section(log, "RenderTest", "Render test");
2046*35238bceSAndroid Build Coastguard Worker const bool success = renderTest(basicUniforms, program, rnd);
2047*35238bceSAndroid Build Coastguard Worker
2048*35238bceSAndroid Build Coastguard Worker if (!success)
2049*35238bceSAndroid Build Coastguard Worker return false;
2050*35238bceSAndroid Build Coastguard Worker }
2051*35238bceSAndroid Build Coastguard Worker
2052*35238bceSAndroid Build Coastguard Worker return true;
2053*35238bceSAndroid Build Coastguard Worker }
2054*35238bceSAndroid Build Coastguard Worker
ProgramUniformTests(Context & context)2055*35238bceSAndroid Build Coastguard Worker ProgramUniformTests::ProgramUniformTests(Context &context)
2056*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "program_uniform", "glProgramUniform*() tests")
2057*35238bceSAndroid Build Coastguard Worker {
2058*35238bceSAndroid Build Coastguard Worker }
2059*35238bceSAndroid Build Coastguard Worker
~ProgramUniformTests(void)2060*35238bceSAndroid Build Coastguard Worker ProgramUniformTests::~ProgramUniformTests(void)
2061*35238bceSAndroid Build Coastguard Worker {
2062*35238bceSAndroid Build Coastguard Worker }
2063*35238bceSAndroid Build Coastguard Worker
2064*35238bceSAndroid Build Coastguard Worker namespace
2065*35238bceSAndroid Build Coastguard Worker {
2066*35238bceSAndroid Build Coastguard Worker
2067*35238bceSAndroid Build Coastguard Worker // \note Although this is only used in ProgramUniformTests::init, it needs to be defined here as it's used as a template argument.
2068*35238bceSAndroid Build Coastguard Worker struct UniformCollectionCase
2069*35238bceSAndroid Build Coastguard Worker {
2070*35238bceSAndroid Build Coastguard Worker string namePrefix;
2071*35238bceSAndroid Build Coastguard Worker SharedPtr<const UniformCollection> uniformCollection;
2072*35238bceSAndroid Build Coastguard Worker
UniformCollectionCasedeqp::gles31::Functional::__anoneda19b060711::UniformCollectionCase2073*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(const char *const name, const UniformCollection *uniformCollection_)
2074*35238bceSAndroid Build Coastguard Worker : namePrefix(name ? name + string("_") : "")
2075*35238bceSAndroid Build Coastguard Worker , uniformCollection(uniformCollection_)
2076*35238bceSAndroid Build Coastguard Worker {
2077*35238bceSAndroid Build Coastguard Worker }
2078*35238bceSAndroid Build Coastguard Worker };
2079*35238bceSAndroid Build Coastguard Worker
2080*35238bceSAndroid Build Coastguard Worker } // namespace
2081*35238bceSAndroid Build Coastguard Worker
init(void)2082*35238bceSAndroid Build Coastguard Worker void ProgramUniformTests::init(void)
2083*35238bceSAndroid Build Coastguard Worker {
2084*35238bceSAndroid Build Coastguard Worker // Generate sets of UniformCollections that are used by several cases.
2085*35238bceSAndroid Build Coastguard Worker
2086*35238bceSAndroid Build Coastguard Worker enum
2087*35238bceSAndroid Build Coastguard Worker {
2088*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_BASIC = 0,
2089*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_BASIC_ARRAY,
2090*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_BASIC_STRUCT,
2091*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_STRUCT_IN_ARRAY,
2092*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_ARRAY_IN_STRUCT,
2093*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_NESTED_STRUCTS_ARRAYS,
2094*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_MULTIPLE_BASIC,
2095*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_MULTIPLE_BASIC_ARRAY,
2096*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_MULTIPLE_NESTED_STRUCTS_ARRAYS,
2097*35238bceSAndroid Build Coastguard Worker
2098*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_LAST
2099*35238bceSAndroid Build Coastguard Worker };
2100*35238bceSAndroid Build Coastguard Worker
2101*35238bceSAndroid Build Coastguard Worker struct UniformCollectionGroup
2102*35238bceSAndroid Build Coastguard Worker {
2103*35238bceSAndroid Build Coastguard Worker string name;
2104*35238bceSAndroid Build Coastguard Worker vector<UniformCollectionCase> cases;
2105*35238bceSAndroid Build Coastguard Worker } defaultUniformCollections[UNIFORMCOLLECTIONS_LAST];
2106*35238bceSAndroid Build Coastguard Worker
2107*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_BASIC].name = "basic";
2108*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_BASIC_ARRAY].name = "basic_array";
2109*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_BASIC_STRUCT].name = "basic_struct";
2110*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_STRUCT_IN_ARRAY].name = "struct_in_array";
2111*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_ARRAY_IN_STRUCT].name = "array_in_struct";
2112*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_NESTED_STRUCTS_ARRAYS].name = "nested_structs_arrays";
2113*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_MULTIPLE_BASIC].name = "multiple_basic";
2114*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_MULTIPLE_BASIC_ARRAY].name = "multiple_basic_array";
2115*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_MULTIPLE_NESTED_STRUCTS_ARRAYS].name =
2116*35238bceSAndroid Build Coastguard Worker "multiple_nested_structs_arrays";
2117*35238bceSAndroid Build Coastguard Worker
2118*35238bceSAndroid Build Coastguard Worker for (int dataTypeNdx = 0; dataTypeNdx < DE_LENGTH_OF_ARRAY(s_testDataTypes); dataTypeNdx++)
2119*35238bceSAndroid Build Coastguard Worker {
2120*35238bceSAndroid Build Coastguard Worker const glu::DataType dataType = s_testDataTypes[dataTypeNdx];
2121*35238bceSAndroid Build Coastguard Worker const char *const typeName = glu::getDataTypeName(dataType);
2122*35238bceSAndroid Build Coastguard Worker
2123*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_BASIC].cases.push_back(
2124*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(typeName, UniformCollection::basic(dataType)));
2125*35238bceSAndroid Build Coastguard Worker
2126*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeScalar(dataType) ||
2127*35238bceSAndroid Build Coastguard Worker (glu::isDataTypeVector(dataType) && glu::getDataTypeScalarSize(dataType) == 4) ||
2128*35238bceSAndroid Build Coastguard Worker dataType == glu::TYPE_FLOAT_MAT4 || dataType == glu::TYPE_SAMPLER_2D)
2129*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_BASIC_ARRAY].cases.push_back(
2130*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(typeName, UniformCollection::basicArray(dataType)));
2131*35238bceSAndroid Build Coastguard Worker
2132*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeScalar(dataType) || dataType == glu::TYPE_FLOAT_MAT4 || dataType == glu::TYPE_SAMPLER_2D)
2133*35238bceSAndroid Build Coastguard Worker {
2134*35238bceSAndroid Build Coastguard Worker const glu::DataType secondDataType = glu::isDataTypeScalar(dataType) ? glu::getDataTypeVector(dataType, 4) :
2135*35238bceSAndroid Build Coastguard Worker dataType == glu::TYPE_FLOAT_MAT4 ? glu::TYPE_FLOAT_MAT2 :
2136*35238bceSAndroid Build Coastguard Worker dataType == glu::TYPE_SAMPLER_2D ? glu::TYPE_SAMPLER_CUBE :
2137*35238bceSAndroid Build Coastguard Worker glu::TYPE_LAST;
2138*35238bceSAndroid Build Coastguard Worker DE_ASSERT(secondDataType != glu::TYPE_LAST);
2139*35238bceSAndroid Build Coastguard Worker const char *const secondTypeName = glu::getDataTypeName(secondDataType);
2140*35238bceSAndroid Build Coastguard Worker const string name = string("") + typeName + "_" + secondTypeName;
2141*35238bceSAndroid Build Coastguard Worker
2142*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_BASIC_STRUCT].cases.push_back(
2143*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(name.c_str(), UniformCollection::basicStruct(dataType, secondDataType, false)));
2144*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_ARRAY_IN_STRUCT].cases.push_back(
2145*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(name.c_str(), UniformCollection::basicStruct(dataType, secondDataType, true)));
2146*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_STRUCT_IN_ARRAY].cases.push_back(
2147*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(name.c_str(), UniformCollection::structInArray(dataType, secondDataType, false)));
2148*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_NESTED_STRUCTS_ARRAYS].cases.push_back(
2149*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(name.c_str(), UniformCollection::nestedArraysStructs(dataType, secondDataType)));
2150*35238bceSAndroid Build Coastguard Worker }
2151*35238bceSAndroid Build Coastguard Worker }
2152*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_MULTIPLE_BASIC].cases.push_back(
2153*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(DE_NULL, UniformCollection::multipleBasic()));
2154*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_MULTIPLE_BASIC_ARRAY].cases.push_back(
2155*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(DE_NULL, UniformCollection::multipleBasicArray()));
2156*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[UNIFORMCOLLECTIONS_MULTIPLE_NESTED_STRUCTS_ARRAYS].cases.push_back(
2157*35238bceSAndroid Build Coastguard Worker UniformCollectionCase(DE_NULL, UniformCollection::multipleNestedArraysStructs()));
2158*35238bceSAndroid Build Coastguard Worker
2159*35238bceSAndroid Build Coastguard Worker // Basic by-pointer or by-value uniform assignment cases.
2160*35238bceSAndroid Build Coastguard Worker
2161*35238bceSAndroid Build Coastguard Worker for (int assignMethodI = 0; assignMethodI < (int)UniformAssignCase::ASSIGNMETHOD_LAST; assignMethodI++)
2162*35238bceSAndroid Build Coastguard Worker {
2163*35238bceSAndroid Build Coastguard Worker const UniformAssignCase::AssignMethod assignMethod = (UniformAssignCase::AssignMethod)assignMethodI;
2164*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const assignMethodGroup =
2165*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, UniformAssignCase::getAssignMethodName(assignMethod),
2166*35238bceSAndroid Build Coastguard Worker UniformAssignCase::getAssignMethodDescription(assignMethod));
2167*35238bceSAndroid Build Coastguard Worker addChild(assignMethodGroup);
2168*35238bceSAndroid Build Coastguard Worker
2169*35238bceSAndroid Build Coastguard Worker for (int checkMethodI = 0; checkMethodI < (int)UniformAssignCase::CHECKMETHOD_LAST; checkMethodI++)
2170*35238bceSAndroid Build Coastguard Worker {
2171*35238bceSAndroid Build Coastguard Worker const UniformAssignCase::CheckMethod checkMethod = (UniformAssignCase::CheckMethod)checkMethodI;
2172*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const checkMethodGroup =
2173*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, UniformAssignCase::getCheckMethodName(checkMethod),
2174*35238bceSAndroid Build Coastguard Worker UniformAssignCase::getCheckMethodDescription(checkMethod));
2175*35238bceSAndroid Build Coastguard Worker assignMethodGroup->addChild(checkMethodGroup);
2176*35238bceSAndroid Build Coastguard Worker
2177*35238bceSAndroid Build Coastguard Worker for (int collectionGroupNdx = 0; collectionGroupNdx < (int)UNIFORMCOLLECTIONS_LAST; collectionGroupNdx++)
2178*35238bceSAndroid Build Coastguard Worker {
2179*35238bceSAndroid Build Coastguard Worker const int numArrayFirstElemNameCases = checkMethod == UniformAssignCase::CHECKMETHOD_GET_UNIFORM &&
2180*35238bceSAndroid Build Coastguard Worker collectionGroupNdx == UNIFORMCOLLECTIONS_BASIC_ARRAY ?
2181*35238bceSAndroid Build Coastguard Worker 2 :
2182*35238bceSAndroid Build Coastguard Worker 1;
2183*35238bceSAndroid Build Coastguard Worker
2184*35238bceSAndroid Build Coastguard Worker for (int referToFirstArrayElemWithoutIndexI = 0;
2185*35238bceSAndroid Build Coastguard Worker referToFirstArrayElemWithoutIndexI < numArrayFirstElemNameCases;
2186*35238bceSAndroid Build Coastguard Worker referToFirstArrayElemWithoutIndexI++)
2187*35238bceSAndroid Build Coastguard Worker {
2188*35238bceSAndroid Build Coastguard Worker const UniformCollectionGroup &collectionGroup = defaultUniformCollections[collectionGroupNdx];
2189*35238bceSAndroid Build Coastguard Worker const string collectionGroupName =
2190*35238bceSAndroid Build Coastguard Worker collectionGroup.name +
2191*35238bceSAndroid Build Coastguard Worker (referToFirstArrayElemWithoutIndexI == 0 ? "" : "_first_elem_without_brackets");
2192*35238bceSAndroid Build Coastguard Worker TestCaseGroup *collectionTestGroup = DE_NULL;
2193*35238bceSAndroid Build Coastguard Worker
2194*35238bceSAndroid Build Coastguard Worker for (int collectionNdx = 0; collectionNdx < (int)collectionGroup.cases.size(); collectionNdx++)
2195*35238bceSAndroid Build Coastguard Worker {
2196*35238bceSAndroid Build Coastguard Worker const UniformCollectionCase &collectionCase = collectionGroup.cases[collectionNdx];
2197*35238bceSAndroid Build Coastguard Worker const string collName = collectionCase.namePrefix;
2198*35238bceSAndroid Build Coastguard Worker const SharedPtr<const UniformCollection> &uniformCollection = collectionCase.uniformCollection;
2199*35238bceSAndroid Build Coastguard Worker const bool containsBooleans =
2200*35238bceSAndroid Build Coastguard Worker uniformCollection->containsMatchingBasicType(glu::isDataTypeBoolOrBVec);
2201*35238bceSAndroid Build Coastguard Worker const bool varyBoolApiType = checkMethod == UniformAssignCase::CHECKMETHOD_GET_UNIFORM &&
2202*35238bceSAndroid Build Coastguard Worker containsBooleans &&
2203*35238bceSAndroid Build Coastguard Worker (collectionGroupNdx == UNIFORMCOLLECTIONS_BASIC ||
2204*35238bceSAndroid Build Coastguard Worker collectionGroupNdx == UNIFORMCOLLECTIONS_BASIC_ARRAY);
2205*35238bceSAndroid Build Coastguard Worker const int numBoolVariations = varyBoolApiType ? 3 : 1;
2206*35238bceSAndroid Build Coastguard Worker const bool containsMatrices =
2207*35238bceSAndroid Build Coastguard Worker uniformCollection->containsMatchingBasicType(glu::isDataTypeMatrix);
2208*35238bceSAndroid Build Coastguard Worker const bool varyMatrixMode =
2209*35238bceSAndroid Build Coastguard Worker containsMatrices && (collectionGroupNdx == UNIFORMCOLLECTIONS_BASIC ||
2210*35238bceSAndroid Build Coastguard Worker collectionGroupNdx == UNIFORMCOLLECTIONS_BASIC_ARRAY);
2211*35238bceSAndroid Build Coastguard Worker const int numMatVariations = varyMatrixMode ? 2 : 1;
2212*35238bceSAndroid Build Coastguard Worker
2213*35238bceSAndroid Build Coastguard Worker if (containsMatrices && assignMethod != UniformAssignCase::ASSIGNMETHOD_POINTER)
2214*35238bceSAndroid Build Coastguard Worker continue;
2215*35238bceSAndroid Build Coastguard Worker
2216*35238bceSAndroid Build Coastguard Worker for (int booleanTypeI = 0; booleanTypeI < numBoolVariations; booleanTypeI++)
2217*35238bceSAndroid Build Coastguard Worker {
2218*35238bceSAndroid Build Coastguard Worker const uint32_t booleanTypeFeat =
2219*35238bceSAndroid Build Coastguard Worker booleanTypeI == 1 ? UniformCase::FEATURE_BOOLEANAPITYPE_INT :
2220*35238bceSAndroid Build Coastguard Worker booleanTypeI == 2 ? UniformCase::FEATURE_BOOLEANAPITYPE_UINT :
2221*35238bceSAndroid Build Coastguard Worker 0;
2222*35238bceSAndroid Build Coastguard Worker const char *const booleanTypeName = booleanTypeI == 1 ? "int" :
2223*35238bceSAndroid Build Coastguard Worker booleanTypeI == 2 ? "uint" :
2224*35238bceSAndroid Build Coastguard Worker "float";
2225*35238bceSAndroid Build Coastguard Worker const string nameWithBoolType =
2226*35238bceSAndroid Build Coastguard Worker varyBoolApiType ? collName + "api_" + booleanTypeName + "_" : collName;
2227*35238bceSAndroid Build Coastguard Worker
2228*35238bceSAndroid Build Coastguard Worker for (int matrixTypeI = 0; matrixTypeI < numMatVariations; matrixTypeI++)
2229*35238bceSAndroid Build Coastguard Worker {
2230*35238bceSAndroid Build Coastguard Worker const string nameWithMatrixType =
2231*35238bceSAndroid Build Coastguard Worker nameWithBoolType + (matrixTypeI == 1 ? "row_major_" : "");
2232*35238bceSAndroid Build Coastguard Worker
2233*35238bceSAndroid Build Coastguard Worker for (int shaderType = 0; shaderType < (int)CASESHADERTYPE_LAST; shaderType++)
2234*35238bceSAndroid Build Coastguard Worker {
2235*35238bceSAndroid Build Coastguard Worker const string name =
2236*35238bceSAndroid Build Coastguard Worker nameWithMatrixType + getCaseShaderTypeName((CaseShaderType)shaderType);
2237*35238bceSAndroid Build Coastguard Worker const uint32_t arrayFirstElemNameNoIndexFeat =
2238*35238bceSAndroid Build Coastguard Worker referToFirstArrayElemWithoutIndexI == 0 ?
2239*35238bceSAndroid Build Coastguard Worker 0 :
2240*35238bceSAndroid Build Coastguard Worker UniformCase::FEATURE_ARRAY_FIRST_ELEM_NAME_NO_INDEX;
2241*35238bceSAndroid Build Coastguard Worker
2242*35238bceSAndroid Build Coastguard Worker // skip empty groups by creating groups on demand
2243*35238bceSAndroid Build Coastguard Worker if (!collectionTestGroup)
2244*35238bceSAndroid Build Coastguard Worker {
2245*35238bceSAndroid Build Coastguard Worker collectionTestGroup =
2246*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, collectionGroupName.c_str(), "");
2247*35238bceSAndroid Build Coastguard Worker checkMethodGroup->addChild(collectionTestGroup);
2248*35238bceSAndroid Build Coastguard Worker }
2249*35238bceSAndroid Build Coastguard Worker
2250*35238bceSAndroid Build Coastguard Worker collectionTestGroup->addChild(new UniformAssignCase(
2251*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), "", (CaseShaderType)shaderType, uniformCollection,
2252*35238bceSAndroid Build Coastguard Worker checkMethod, assignMethod,
2253*35238bceSAndroid Build Coastguard Worker booleanTypeFeat | arrayFirstElemNameNoIndexFeat |
2254*35238bceSAndroid Build Coastguard Worker (matrixTypeI == 1 ? UniformCase::FEATURE_MATRIXMODE_ROWMAJOR : 0)));
2255*35238bceSAndroid Build Coastguard Worker }
2256*35238bceSAndroid Build Coastguard Worker }
2257*35238bceSAndroid Build Coastguard Worker }
2258*35238bceSAndroid Build Coastguard Worker }
2259*35238bceSAndroid Build Coastguard Worker }
2260*35238bceSAndroid Build Coastguard Worker }
2261*35238bceSAndroid Build Coastguard Worker }
2262*35238bceSAndroid Build Coastguard Worker }
2263*35238bceSAndroid Build Coastguard Worker
2264*35238bceSAndroid Build Coastguard Worker // Cases that assign multiple basic-array elements with one glProgramUniform*v() (i.e. the count parameter is bigger than 1).
2265*35238bceSAndroid Build Coastguard Worker
2266*35238bceSAndroid Build Coastguard Worker {
2267*35238bceSAndroid Build Coastguard Worker static const struct
2268*35238bceSAndroid Build Coastguard Worker {
2269*35238bceSAndroid Build Coastguard Worker UniformCase::Feature arrayAssignMode;
2270*35238bceSAndroid Build Coastguard Worker const char *name;
2271*35238bceSAndroid Build Coastguard Worker const char *description;
2272*35238bceSAndroid Build Coastguard Worker } arrayAssignGroups[] = {{UniformCase::FEATURE_ARRAYASSIGN_FULL, "basic_array_assign_full",
2273*35238bceSAndroid Build Coastguard Worker "Assign entire basic-type arrays per glProgramUniform*v() call"},
2274*35238bceSAndroid Build Coastguard Worker {UniformCase::FEATURE_ARRAYASSIGN_BLOCKS_OF_TWO, "basic_array_assign_partial",
2275*35238bceSAndroid Build Coastguard Worker "Assign two elements of a basic-type array per glProgramUniform*v() call"}};
2276*35238bceSAndroid Build Coastguard Worker
2277*35238bceSAndroid Build Coastguard Worker for (int arrayAssignGroupNdx = 0; arrayAssignGroupNdx < DE_LENGTH_OF_ARRAY(arrayAssignGroups);
2278*35238bceSAndroid Build Coastguard Worker arrayAssignGroupNdx++)
2279*35238bceSAndroid Build Coastguard Worker {
2280*35238bceSAndroid Build Coastguard Worker UniformCase::Feature arrayAssignMode = arrayAssignGroups[arrayAssignGroupNdx].arrayAssignMode;
2281*35238bceSAndroid Build Coastguard Worker const char *const groupName = arrayAssignGroups[arrayAssignGroupNdx].name;
2282*35238bceSAndroid Build Coastguard Worker const char *const groupDesc = arrayAssignGroups[arrayAssignGroupNdx].description;
2283*35238bceSAndroid Build Coastguard Worker
2284*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const curArrayAssignGroup = new TestCaseGroup(m_context, groupName, groupDesc);
2285*35238bceSAndroid Build Coastguard Worker addChild(curArrayAssignGroup);
2286*35238bceSAndroid Build Coastguard Worker
2287*35238bceSAndroid Build Coastguard Worker static const int basicArrayCollectionGroups[] = {UNIFORMCOLLECTIONS_BASIC_ARRAY,
2288*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_ARRAY_IN_STRUCT,
2289*35238bceSAndroid Build Coastguard Worker UNIFORMCOLLECTIONS_MULTIPLE_BASIC_ARRAY};
2290*35238bceSAndroid Build Coastguard Worker
2291*35238bceSAndroid Build Coastguard Worker for (int collectionGroupNdx = 0; collectionGroupNdx < DE_LENGTH_OF_ARRAY(basicArrayCollectionGroups);
2292*35238bceSAndroid Build Coastguard Worker collectionGroupNdx++)
2293*35238bceSAndroid Build Coastguard Worker {
2294*35238bceSAndroid Build Coastguard Worker const UniformCollectionGroup &collectionGroup =
2295*35238bceSAndroid Build Coastguard Worker defaultUniformCollections[basicArrayCollectionGroups[collectionGroupNdx]];
2296*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const collectionTestGroup =
2297*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, collectionGroup.name.c_str(), "");
2298*35238bceSAndroid Build Coastguard Worker curArrayAssignGroup->addChild(collectionTestGroup);
2299*35238bceSAndroid Build Coastguard Worker
2300*35238bceSAndroid Build Coastguard Worker for (int collectionNdx = 0; collectionNdx < (int)collectionGroup.cases.size(); collectionNdx++)
2301*35238bceSAndroid Build Coastguard Worker {
2302*35238bceSAndroid Build Coastguard Worker const UniformCollectionCase &collectionCase = collectionGroup.cases[collectionNdx];
2303*35238bceSAndroid Build Coastguard Worker const string collName = collectionCase.namePrefix;
2304*35238bceSAndroid Build Coastguard Worker const SharedPtr<const UniformCollection> &uniformCollection = collectionCase.uniformCollection;
2305*35238bceSAndroid Build Coastguard Worker
2306*35238bceSAndroid Build Coastguard Worker for (int shaderType = 0; shaderType < (int)CASESHADERTYPE_LAST; shaderType++)
2307*35238bceSAndroid Build Coastguard Worker {
2308*35238bceSAndroid Build Coastguard Worker const string name = collName + getCaseShaderTypeName((CaseShaderType)shaderType);
2309*35238bceSAndroid Build Coastguard Worker collectionTestGroup->addChild(
2310*35238bceSAndroid Build Coastguard Worker new UniformAssignCase(m_context, name.c_str(), "", (CaseShaderType)shaderType,
2311*35238bceSAndroid Build Coastguard Worker uniformCollection, UniformAssignCase::CHECKMETHOD_GET_UNIFORM,
2312*35238bceSAndroid Build Coastguard Worker UniformAssignCase::ASSIGNMETHOD_POINTER, arrayAssignMode));
2313*35238bceSAndroid Build Coastguard Worker }
2314*35238bceSAndroid Build Coastguard Worker }
2315*35238bceSAndroid Build Coastguard Worker }
2316*35238bceSAndroid Build Coastguard Worker }
2317*35238bceSAndroid Build Coastguard Worker }
2318*35238bceSAndroid Build Coastguard Worker
2319*35238bceSAndroid Build Coastguard Worker // Cases with unused uniforms.
2320*35238bceSAndroid Build Coastguard Worker
2321*35238bceSAndroid Build Coastguard Worker {
2322*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const unusedUniformsGroup =
2323*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "unused_uniforms", "Test with unused uniforms");
2324*35238bceSAndroid Build Coastguard Worker addChild(unusedUniformsGroup);
2325*35238bceSAndroid Build Coastguard Worker
2326*35238bceSAndroid Build Coastguard Worker const UniformCollectionGroup &collectionGroup = defaultUniformCollections[UNIFORMCOLLECTIONS_ARRAY_IN_STRUCT];
2327*35238bceSAndroid Build Coastguard Worker
2328*35238bceSAndroid Build Coastguard Worker for (int collectionNdx = 0; collectionNdx < (int)collectionGroup.cases.size(); collectionNdx++)
2329*35238bceSAndroid Build Coastguard Worker {
2330*35238bceSAndroid Build Coastguard Worker const UniformCollectionCase &collectionCase = collectionGroup.cases[collectionNdx];
2331*35238bceSAndroid Build Coastguard Worker const string collName = collectionCase.namePrefix;
2332*35238bceSAndroid Build Coastguard Worker const SharedPtr<const UniformCollection> &uniformCollection = collectionCase.uniformCollection;
2333*35238bceSAndroid Build Coastguard Worker
2334*35238bceSAndroid Build Coastguard Worker for (int shaderType = 0; shaderType < (int)CASESHADERTYPE_LAST; shaderType++)
2335*35238bceSAndroid Build Coastguard Worker {
2336*35238bceSAndroid Build Coastguard Worker const string name = collName + getCaseShaderTypeName((CaseShaderType)shaderType);
2337*35238bceSAndroid Build Coastguard Worker unusedUniformsGroup->addChild(new UniformAssignCase(
2338*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), "", (CaseShaderType)shaderType, uniformCollection,
2339*35238bceSAndroid Build Coastguard Worker UniformAssignCase::CHECKMETHOD_GET_UNIFORM, UniformAssignCase::ASSIGNMETHOD_POINTER,
2340*35238bceSAndroid Build Coastguard Worker UniformCase::FEATURE_ARRAYUSAGE_ONLY_MIDDLE_INDEX | UniformCase::FEATURE_UNIFORMUSAGE_EVERY_OTHER));
2341*35238bceSAndroid Build Coastguard Worker }
2342*35238bceSAndroid Build Coastguard Worker }
2343*35238bceSAndroid Build Coastguard Worker }
2344*35238bceSAndroid Build Coastguard Worker }
2345*35238bceSAndroid Build Coastguard Worker
2346*35238bceSAndroid Build Coastguard Worker } // namespace Functional
2347*35238bceSAndroid Build Coastguard Worker } // namespace gles31
2348*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2349