1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 2.0 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Shader operators tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es2fShaderOperatorTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
31*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
32*35238bceSAndroid Build Coastguard Worker
33*35238bceSAndroid Build Coastguard Worker #include <map>
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker using namespace tcu;
36*35238bceSAndroid Build Coastguard Worker using namespace glu;
37*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls;
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker using std::map;
40*35238bceSAndroid Build Coastguard Worker using std::ostringstream;
41*35238bceSAndroid Build Coastguard Worker using std::pair;
42*35238bceSAndroid Build Coastguard Worker using std::string;
43*35238bceSAndroid Build Coastguard Worker using std::vector;
44*35238bceSAndroid Build Coastguard Worker
45*35238bceSAndroid Build Coastguard Worker namespace deqp
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker namespace gles2
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker namespace Functional
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker
52*35238bceSAndroid Build Coastguard Worker #if defined(abs)
53*35238bceSAndroid Build Coastguard Worker #undef abs
54*35238bceSAndroid Build Coastguard Worker #endif
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Worker using de::clamp;
57*35238bceSAndroid Build Coastguard Worker using de::max;
58*35238bceSAndroid Build Coastguard Worker using de::min;
59*35238bceSAndroid Build Coastguard Worker
60*35238bceSAndroid Build Coastguard Worker // \note VS2013 gets confused without these
61*35238bceSAndroid Build Coastguard Worker using tcu::exp2;
62*35238bceSAndroid Build Coastguard Worker using tcu::log2;
63*35238bceSAndroid Build Coastguard Worker
abs(float v)64*35238bceSAndroid Build Coastguard Worker inline float abs(float v)
65*35238bceSAndroid Build Coastguard Worker {
66*35238bceSAndroid Build Coastguard Worker return deFloatAbs(v);
67*35238bceSAndroid Build Coastguard Worker }
68*35238bceSAndroid Build Coastguard Worker
logicalAnd(bool a,bool b)69*35238bceSAndroid Build Coastguard Worker inline bool logicalAnd(bool a, bool b)
70*35238bceSAndroid Build Coastguard Worker {
71*35238bceSAndroid Build Coastguard Worker return (a && b);
72*35238bceSAndroid Build Coastguard Worker }
logicalOr(bool a,bool b)73*35238bceSAndroid Build Coastguard Worker inline bool logicalOr(bool a, bool b)
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker return (a || b);
76*35238bceSAndroid Build Coastguard Worker }
logicalXor(bool a,bool b)77*35238bceSAndroid Build Coastguard Worker inline bool logicalXor(bool a, bool b)
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker return (a != b);
80*35238bceSAndroid Build Coastguard Worker }
81*35238bceSAndroid Build Coastguard Worker
82*35238bceSAndroid Build Coastguard Worker #define DEFINE_VEC_FLOAT_FUNCTION(FUNC_NAME, SCALAR_OP_NAME) \
83*35238bceSAndroid Build Coastguard Worker template <int Size> \
84*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> FUNC_NAME(const Vector<float, Size> &v, float s) \
85*35238bceSAndroid Build Coastguard Worker { \
86*35238bceSAndroid Build Coastguard Worker Vector<float, Size> res; \
87*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++) \
88*35238bceSAndroid Build Coastguard Worker res[i] = SCALAR_OP_NAME(v[i], s); \
89*35238bceSAndroid Build Coastguard Worker return res; \
90*35238bceSAndroid Build Coastguard Worker }
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker #define DEFINE_FLOAT_VEC_FUNCTION(FUNC_NAME, SCALAR_OP_NAME) \
93*35238bceSAndroid Build Coastguard Worker template <int Size> \
94*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> FUNC_NAME(float s, const Vector<float, Size> &v) \
95*35238bceSAndroid Build Coastguard Worker { \
96*35238bceSAndroid Build Coastguard Worker Vector<float, Size> res; \
97*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++) \
98*35238bceSAndroid Build Coastguard Worker res[i] = SCALAR_OP_NAME(s, v[i]); \
99*35238bceSAndroid Build Coastguard Worker return res; \
100*35238bceSAndroid Build Coastguard Worker }
101*35238bceSAndroid Build Coastguard Worker
102*35238bceSAndroid Build Coastguard Worker #define DEFINE_VEC_VEC_FLOAT_FUNCTION(FUNC_NAME, SCALAR_OP_NAME) \
103*35238bceSAndroid Build Coastguard Worker template <int Size> \
104*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> FUNC_NAME(const Vector<float, Size> &v0, const Vector<float, Size> &v1, float s) \
105*35238bceSAndroid Build Coastguard Worker { \
106*35238bceSAndroid Build Coastguard Worker Vector<float, Size> res; \
107*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++) \
108*35238bceSAndroid Build Coastguard Worker res[i] = SCALAR_OP_NAME(v0[i], v1[i], s); \
109*35238bceSAndroid Build Coastguard Worker return res; \
110*35238bceSAndroid Build Coastguard Worker }
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker #define DEFINE_VEC_FLOAT_FLOAT_FUNCTION(FUNC_NAME, SCALAR_OP_NAME) \
113*35238bceSAndroid Build Coastguard Worker template <int Size> \
114*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> FUNC_NAME(const Vector<float, Size> &v, float s0, float s1) \
115*35238bceSAndroid Build Coastguard Worker { \
116*35238bceSAndroid Build Coastguard Worker Vector<float, Size> res; \
117*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++) \
118*35238bceSAndroid Build Coastguard Worker res[i] = SCALAR_OP_NAME(v[i], s0, s1); \
119*35238bceSAndroid Build Coastguard Worker return res; \
120*35238bceSAndroid Build Coastguard Worker }
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker #define DEFINE_FLOAT_FLOAT_VEC_FUNCTION(FUNC_NAME, SCALAR_OP_NAME) \
123*35238bceSAndroid Build Coastguard Worker template <int Size> \
124*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> FUNC_NAME(float s0, float s1, const Vector<float, Size> &v) \
125*35238bceSAndroid Build Coastguard Worker { \
126*35238bceSAndroid Build Coastguard Worker Vector<float, Size> res; \
127*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++) \
128*35238bceSAndroid Build Coastguard Worker res[i] = SCALAR_OP_NAME(s0, s1, v[i]); \
129*35238bceSAndroid Build Coastguard Worker return res; \
130*35238bceSAndroid Build Coastguard Worker }
131*35238bceSAndroid Build Coastguard Worker
DEFINE_VEC_FLOAT_FUNCTION(modVecFloat,mod)132*35238bceSAndroid Build Coastguard Worker DEFINE_VEC_FLOAT_FUNCTION(modVecFloat, mod)
133*35238bceSAndroid Build Coastguard Worker DEFINE_VEC_FLOAT_FUNCTION(minVecFloat, min)
134*35238bceSAndroid Build Coastguard Worker DEFINE_VEC_FLOAT_FUNCTION(maxVecFloat, max)
135*35238bceSAndroid Build Coastguard Worker DEFINE_VEC_FLOAT_FLOAT_FUNCTION(clampVecFloatFloat, clamp)
136*35238bceSAndroid Build Coastguard Worker DEFINE_VEC_VEC_FLOAT_FUNCTION(mixVecVecFloat, mix)
137*35238bceSAndroid Build Coastguard Worker DEFINE_FLOAT_VEC_FUNCTION(stepFloatVec, step)
138*35238bceSAndroid Build Coastguard Worker DEFINE_FLOAT_FLOAT_VEC_FUNCTION(smoothStepFloatFloatVec, smoothStep)
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker #undef DEFINE_VEC_FLOAT_FUNCTION
141*35238bceSAndroid Build Coastguard Worker #undef DEFINE_VEC_VEC_FLOAT_FUNCTION
142*35238bceSAndroid Build Coastguard Worker #undef DEFINE_VEC_FLOAT_FLOAT_FUNCTION
143*35238bceSAndroid Build Coastguard Worker #undef DEFINE_FLOAT_FLOAT_VEC_FUNCTION
144*35238bceSAndroid Build Coastguard Worker
145*35238bceSAndroid Build Coastguard Worker inline float addOne(float v)
146*35238bceSAndroid Build Coastguard Worker {
147*35238bceSAndroid Build Coastguard Worker return v + 1.0f;
148*35238bceSAndroid Build Coastguard Worker }
subOne(float v)149*35238bceSAndroid Build Coastguard Worker inline float subOne(float v)
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker return v - 1.0f;
152*35238bceSAndroid Build Coastguard Worker }
addOne(int v)153*35238bceSAndroid Build Coastguard Worker inline int addOne(int v)
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker return v + 1;
156*35238bceSAndroid Build Coastguard Worker }
subOne(int v)157*35238bceSAndroid Build Coastguard Worker inline int subOne(int v)
158*35238bceSAndroid Build Coastguard Worker {
159*35238bceSAndroid Build Coastguard Worker return v - 1;
160*35238bceSAndroid Build Coastguard Worker }
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker template <int Size>
addOne(const Vector<float,Size> & v)163*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> addOne(const Vector<float, Size> &v)
164*35238bceSAndroid Build Coastguard Worker {
165*35238bceSAndroid Build Coastguard Worker return v + 1.0f;
166*35238bceSAndroid Build Coastguard Worker }
167*35238bceSAndroid Build Coastguard Worker template <int Size>
subOne(const Vector<float,Size> & v)168*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> subOne(const Vector<float, Size> &v)
169*35238bceSAndroid Build Coastguard Worker {
170*35238bceSAndroid Build Coastguard Worker return v - 1.0f;
171*35238bceSAndroid Build Coastguard Worker }
172*35238bceSAndroid Build Coastguard Worker template <int Size>
addOne(const Vector<int,Size> & v)173*35238bceSAndroid Build Coastguard Worker inline Vector<int, Size> addOne(const Vector<int, Size> &v)
174*35238bceSAndroid Build Coastguard Worker {
175*35238bceSAndroid Build Coastguard Worker return v + 1;
176*35238bceSAndroid Build Coastguard Worker }
177*35238bceSAndroid Build Coastguard Worker template <int Size>
subOne(const Vector<int,Size> & v)178*35238bceSAndroid Build Coastguard Worker inline Vector<int, Size> subOne(const Vector<int, Size> &v)
179*35238bceSAndroid Build Coastguard Worker {
180*35238bceSAndroid Build Coastguard Worker return v - 1;
181*35238bceSAndroid Build Coastguard Worker }
182*35238bceSAndroid Build Coastguard Worker
183*35238bceSAndroid Build Coastguard Worker template <typename T>
selection(bool cond,T a,T b)184*35238bceSAndroid Build Coastguard Worker inline T selection(bool cond, T a, T b)
185*35238bceSAndroid Build Coastguard Worker {
186*35238bceSAndroid Build Coastguard Worker return cond ? a : b;
187*35238bceSAndroid Build Coastguard Worker }
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
addVecScalar(const Vector<T,Size> & v,T s)190*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> addVecScalar(const Vector<T, Size> &v, T s)
191*35238bceSAndroid Build Coastguard Worker {
192*35238bceSAndroid Build Coastguard Worker return v + s;
193*35238bceSAndroid Build Coastguard Worker }
194*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
subVecScalar(const Vector<T,Size> & v,T s)195*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> subVecScalar(const Vector<T, Size> &v, T s)
196*35238bceSAndroid Build Coastguard Worker {
197*35238bceSAndroid Build Coastguard Worker return v - s;
198*35238bceSAndroid Build Coastguard Worker }
199*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
mulVecScalar(const Vector<T,Size> & v,T s)200*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> mulVecScalar(const Vector<T, Size> &v, T s)
201*35238bceSAndroid Build Coastguard Worker {
202*35238bceSAndroid Build Coastguard Worker return v * s;
203*35238bceSAndroid Build Coastguard Worker }
204*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
divVecScalar(const Vector<T,Size> & v,T s)205*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> divVecScalar(const Vector<T, Size> &v, T s)
206*35238bceSAndroid Build Coastguard Worker {
207*35238bceSAndroid Build Coastguard Worker return v / s;
208*35238bceSAndroid Build Coastguard Worker }
209*35238bceSAndroid Build Coastguard Worker
210*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
addScalarVec(T s,const Vector<T,Size> & v)211*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> addScalarVec(T s, const Vector<T, Size> &v)
212*35238bceSAndroid Build Coastguard Worker {
213*35238bceSAndroid Build Coastguard Worker return s + v;
214*35238bceSAndroid Build Coastguard Worker }
215*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
subScalarVec(T s,const Vector<T,Size> & v)216*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> subScalarVec(T s, const Vector<T, Size> &v)
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker return s - v;
219*35238bceSAndroid Build Coastguard Worker }
220*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
mulScalarVec(T s,const Vector<T,Size> & v)221*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> mulScalarVec(T s, const Vector<T, Size> &v)
222*35238bceSAndroid Build Coastguard Worker {
223*35238bceSAndroid Build Coastguard Worker return s * v;
224*35238bceSAndroid Build Coastguard Worker }
225*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
divScalarVec(T s,const Vector<T,Size> & v)226*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> divScalarVec(T s, const Vector<T, Size> &v)
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker return s / v;
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker
231*35238bceSAndroid Build Coastguard Worker // Reference functions for specific sequence operations for the sequence operator tests.
232*35238bceSAndroid Build Coastguard Worker
233*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0, in2 + in1, in1 + in0"
sequenceNoSideEffCase0(const Vec4 & in0,const Vec4 & in1,const Vec4 & in2)234*35238bceSAndroid Build Coastguard Worker inline Vec4 sequenceNoSideEffCase0(const Vec4 &in0, const Vec4 &in1, const Vec4 &in2)
235*35238bceSAndroid Build Coastguard Worker {
236*35238bceSAndroid Build Coastguard Worker DE_UNREF(in2);
237*35238bceSAndroid Build Coastguard Worker return in1 + in0;
238*35238bceSAndroid Build Coastguard Worker }
239*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0, in2 + in1, in1 + in0"
sequenceNoSideEffCase1(float in0,int in1,float in2)240*35238bceSAndroid Build Coastguard Worker inline int sequenceNoSideEffCase1(float in0, int in1, float in2)
241*35238bceSAndroid Build Coastguard Worker {
242*35238bceSAndroid Build Coastguard Worker DE_UNREF(in0);
243*35238bceSAndroid Build Coastguard Worker DE_UNREF(in2);
244*35238bceSAndroid Build Coastguard Worker return in1 + in1;
245*35238bceSAndroid Build Coastguard Worker }
246*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0 && in1, in0, ivec2(vec2(in0) + in2)"
sequenceNoSideEffCase2(bool in0,bool in1,const Vec2 & in2)247*35238bceSAndroid Build Coastguard Worker inline IVec2 sequenceNoSideEffCase2(bool in0, bool in1, const Vec2 &in2)
248*35238bceSAndroid Build Coastguard Worker {
249*35238bceSAndroid Build Coastguard Worker DE_UNREF(in1);
250*35238bceSAndroid Build Coastguard Worker return IVec2((int)((float)in0 + in2.x()), (int)((float)in0 + in2.y()));
251*35238bceSAndroid Build Coastguard Worker }
252*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0 + vec4(in1), in2, in1"
sequenceNoSideEffCase3(const Vec4 & in0,const IVec4 & in1,const BVec4 & in2)253*35238bceSAndroid Build Coastguard Worker inline IVec4 sequenceNoSideEffCase3(const Vec4 &in0, const IVec4 &in1, const BVec4 &in2)
254*35238bceSAndroid Build Coastguard Worker {
255*35238bceSAndroid Build Coastguard Worker DE_UNREF(in0);
256*35238bceSAndroid Build Coastguard Worker DE_UNREF(in2);
257*35238bceSAndroid Build Coastguard Worker return in1;
258*35238bceSAndroid Build Coastguard Worker }
259*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0++, in1 = in0 + in2, in2 = in1"
sequenceSideEffCase0(const Vec4 & in0,const Vec4 & in1,const Vec4 & in2)260*35238bceSAndroid Build Coastguard Worker inline Vec4 sequenceSideEffCase0(const Vec4 &in0, const Vec4 &in1, const Vec4 &in2)
261*35238bceSAndroid Build Coastguard Worker {
262*35238bceSAndroid Build Coastguard Worker DE_UNREF(in1);
263*35238bceSAndroid Build Coastguard Worker return in0 + 1.0f + in2;
264*35238bceSAndroid Build Coastguard Worker }
265*35238bceSAndroid Build Coastguard Worker // Reference for expression "in1++, in0 = float(in1), in1 = int(in0 + in2)"
sequenceSideEffCase1(float in0,int in1,float in2)266*35238bceSAndroid Build Coastguard Worker inline int sequenceSideEffCase1(float in0, int in1, float in2)
267*35238bceSAndroid Build Coastguard Worker {
268*35238bceSAndroid Build Coastguard Worker DE_UNREF(in0);
269*35238bceSAndroid Build Coastguard Worker return (int)(float(in1) + 1.0f + in2);
270*35238bceSAndroid Build Coastguard Worker }
271*35238bceSAndroid Build Coastguard Worker // Reference for expression "in1 = in0, in2++, in2 = in2 + vec2(in1), ivec2(in2)"
sequenceSideEffCase2(bool in0,bool in1,const Vec2 & in2)272*35238bceSAndroid Build Coastguard Worker inline IVec2 sequenceSideEffCase2(bool in0, bool in1, const Vec2 &in2)
273*35238bceSAndroid Build Coastguard Worker {
274*35238bceSAndroid Build Coastguard Worker DE_UNREF(in1);
275*35238bceSAndroid Build Coastguard Worker return (in2 + Vec2(1.0f) + Vec2((float)in0)).asInt();
276*35238bceSAndroid Build Coastguard Worker }
277*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0 = in0 + vec4(in2), in1 = in1 + ivec4(in0), in1++"
sequenceSideEffCase3(const Vec4 & in0,const IVec4 & in1,const BVec4 & in2)278*35238bceSAndroid Build Coastguard Worker inline IVec4 sequenceSideEffCase3(const Vec4 &in0, const IVec4 &in1, const BVec4 &in2)
279*35238bceSAndroid Build Coastguard Worker {
280*35238bceSAndroid Build Coastguard Worker return in1 + (in0 + Vec4((float)in2.x(), (float)in2.y(), (float)in2.z(), (float)in2.w())).asInt();
281*35238bceSAndroid Build Coastguard Worker }
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker // ShaderEvalFunc-type wrappers for the above functions.
evalSequenceNoSideEffCase0(ShaderEvalContext & ctx)284*35238bceSAndroid Build Coastguard Worker void evalSequenceNoSideEffCase0(ShaderEvalContext &ctx)
285*35238bceSAndroid Build Coastguard Worker {
286*35238bceSAndroid Build Coastguard Worker ctx.color = sequenceNoSideEffCase0(ctx.in[0].swizzle(1, 2, 3, 0), ctx.in[1].swizzle(3, 2, 1, 0),
287*35238bceSAndroid Build Coastguard Worker ctx.in[2].swizzle(0, 3, 2, 1));
288*35238bceSAndroid Build Coastguard Worker }
evalSequenceNoSideEffCase1(ShaderEvalContext & ctx)289*35238bceSAndroid Build Coastguard Worker void evalSequenceNoSideEffCase1(ShaderEvalContext &ctx)
290*35238bceSAndroid Build Coastguard Worker {
291*35238bceSAndroid Build Coastguard Worker ctx.color.x() = (float)sequenceNoSideEffCase1(ctx.in[0].z(), (int)ctx.in[1].x(), ctx.in[2].y());
292*35238bceSAndroid Build Coastguard Worker }
evalSequenceNoSideEffCase2(ShaderEvalContext & ctx)293*35238bceSAndroid Build Coastguard Worker void evalSequenceNoSideEffCase2(ShaderEvalContext &ctx)
294*35238bceSAndroid Build Coastguard Worker {
295*35238bceSAndroid Build Coastguard Worker ctx.color.yz() =
296*35238bceSAndroid Build Coastguard Worker sequenceNoSideEffCase2(ctx.in[0].z() > 0.0f, ctx.in[1].x() > 0.0f, ctx.in[2].swizzle(2, 1)).asFloat();
297*35238bceSAndroid Build Coastguard Worker }
evalSequenceNoSideEffCase3(ShaderEvalContext & ctx)298*35238bceSAndroid Build Coastguard Worker void evalSequenceNoSideEffCase3(ShaderEvalContext &ctx)
299*35238bceSAndroid Build Coastguard Worker {
300*35238bceSAndroid Build Coastguard Worker ctx.color = sequenceNoSideEffCase3(ctx.in[0].swizzle(1, 2, 3, 0), ctx.in[1].swizzle(3, 2, 1, 0).asInt(),
301*35238bceSAndroid Build Coastguard Worker greaterThan(ctx.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f)))
302*35238bceSAndroid Build Coastguard Worker .asFloat();
303*35238bceSAndroid Build Coastguard Worker }
evalSequenceSideEffCase0(ShaderEvalContext & ctx)304*35238bceSAndroid Build Coastguard Worker void evalSequenceSideEffCase0(ShaderEvalContext &ctx)
305*35238bceSAndroid Build Coastguard Worker {
306*35238bceSAndroid Build Coastguard Worker ctx.color = sequenceSideEffCase0(ctx.in[0].swizzle(1, 2, 3, 0), ctx.in[1].swizzle(3, 2, 1, 0),
307*35238bceSAndroid Build Coastguard Worker ctx.in[2].swizzle(0, 3, 2, 1));
308*35238bceSAndroid Build Coastguard Worker }
evalSequenceSideEffCase1(ShaderEvalContext & ctx)309*35238bceSAndroid Build Coastguard Worker void evalSequenceSideEffCase1(ShaderEvalContext &ctx)
310*35238bceSAndroid Build Coastguard Worker {
311*35238bceSAndroid Build Coastguard Worker ctx.color.x() = (float)sequenceSideEffCase1(ctx.in[0].z(), (int)ctx.in[1].x(), ctx.in[2].y());
312*35238bceSAndroid Build Coastguard Worker }
evalSequenceSideEffCase2(ShaderEvalContext & ctx)313*35238bceSAndroid Build Coastguard Worker void evalSequenceSideEffCase2(ShaderEvalContext &ctx)
314*35238bceSAndroid Build Coastguard Worker {
315*35238bceSAndroid Build Coastguard Worker ctx.color.yz() =
316*35238bceSAndroid Build Coastguard Worker sequenceSideEffCase2(ctx.in[0].z() > 0.0f, ctx.in[1].x() > 0.0f, ctx.in[2].swizzle(2, 1)).asFloat();
317*35238bceSAndroid Build Coastguard Worker }
evalSequenceSideEffCase3(ShaderEvalContext & ctx)318*35238bceSAndroid Build Coastguard Worker void evalSequenceSideEffCase3(ShaderEvalContext &ctx)
319*35238bceSAndroid Build Coastguard Worker {
320*35238bceSAndroid Build Coastguard Worker ctx.color = sequenceSideEffCase3(ctx.in[0].swizzle(1, 2, 3, 0), ctx.in[1].swizzle(3, 2, 1, 0).asInt(),
321*35238bceSAndroid Build Coastguard Worker greaterThan(ctx.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f)))
322*35238bceSAndroid Build Coastguard Worker .asFloat();
323*35238bceSAndroid Build Coastguard Worker }
324*35238bceSAndroid Build Coastguard Worker
325*35238bceSAndroid Build Coastguard Worker enum
326*35238bceSAndroid Build Coastguard Worker {
327*35238bceSAndroid Build Coastguard Worker MAX_INPUTS = 3
328*35238bceSAndroid Build Coastguard Worker };
329*35238bceSAndroid Build Coastguard Worker
330*35238bceSAndroid Build Coastguard Worker enum PrecisionMask
331*35238bceSAndroid Build Coastguard Worker {
332*35238bceSAndroid Build Coastguard Worker PRECMASK_NA = 0, //!< Precision not applicable (booleans)
333*35238bceSAndroid Build Coastguard Worker PRECMASK_LOWP = (1 << PRECISION_LOWP),
334*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP = (1 << PRECISION_MEDIUMP),
335*35238bceSAndroid Build Coastguard Worker PRECMASK_HIGHP = (1 << PRECISION_HIGHP),
336*35238bceSAndroid Build Coastguard Worker
337*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP = (1 << PRECISION_MEDIUMP) | (1 << PRECISION_HIGHP),
338*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL = (1 << PRECISION_LOWP) | (1 << PRECISION_MEDIUMP) | (1 << PRECISION_HIGHP)
339*35238bceSAndroid Build Coastguard Worker };
340*35238bceSAndroid Build Coastguard Worker
341*35238bceSAndroid Build Coastguard Worker enum ValueType
342*35238bceSAndroid Build Coastguard Worker {
343*35238bceSAndroid Build Coastguard Worker VALUE_NONE = 0,
344*35238bceSAndroid Build Coastguard Worker VALUE_FLOAT = (1 << 0), // float scalar
345*35238bceSAndroid Build Coastguard Worker VALUE_FLOAT_VEC = (1 << 1), // float vector
346*35238bceSAndroid Build Coastguard Worker VALUE_FLOAT_GENTYPE = (1 << 2), // float scalar/vector
347*35238bceSAndroid Build Coastguard Worker VALUE_VEC3 = (1 << 3), // vec3 only
348*35238bceSAndroid Build Coastguard Worker VALUE_MATRIX = (1 << 4), // matrix
349*35238bceSAndroid Build Coastguard Worker VALUE_BOOL = (1 << 5), // boolean scalar
350*35238bceSAndroid Build Coastguard Worker VALUE_BOOL_VEC = (1 << 6), // boolean vector
351*35238bceSAndroid Build Coastguard Worker VALUE_BOOL_GENTYPE = (1 << 7), // boolean scalar/vector
352*35238bceSAndroid Build Coastguard Worker VALUE_INT = (1 << 8), // int scalar
353*35238bceSAndroid Build Coastguard Worker VALUE_INT_VEC = (1 << 9), // int vector
354*35238bceSAndroid Build Coastguard Worker VALUE_INT_GENTYPE = (1 << 10), // int scalar/vector
355*35238bceSAndroid Build Coastguard Worker
356*35238bceSAndroid Build Coastguard Worker // Shorthands.
357*35238bceSAndroid Build Coastguard Worker F = VALUE_FLOAT,
358*35238bceSAndroid Build Coastguard Worker FV = VALUE_FLOAT_VEC,
359*35238bceSAndroid Build Coastguard Worker GT = VALUE_FLOAT_GENTYPE,
360*35238bceSAndroid Build Coastguard Worker V3 = VALUE_VEC3,
361*35238bceSAndroid Build Coastguard Worker M = VALUE_MATRIX,
362*35238bceSAndroid Build Coastguard Worker B = VALUE_BOOL,
363*35238bceSAndroid Build Coastguard Worker BV = VALUE_BOOL_VEC,
364*35238bceSAndroid Build Coastguard Worker BGT = VALUE_BOOL_GENTYPE,
365*35238bceSAndroid Build Coastguard Worker I = VALUE_INT,
366*35238bceSAndroid Build Coastguard Worker IV = VALUE_INT_VEC,
367*35238bceSAndroid Build Coastguard Worker IGT = VALUE_INT_GENTYPE
368*35238bceSAndroid Build Coastguard Worker };
369*35238bceSAndroid Build Coastguard Worker
isScalarType(ValueType type)370*35238bceSAndroid Build Coastguard Worker static inline bool isScalarType(ValueType type)
371*35238bceSAndroid Build Coastguard Worker {
372*35238bceSAndroid Build Coastguard Worker return type == VALUE_FLOAT || type == VALUE_BOOL || type == VALUE_INT;
373*35238bceSAndroid Build Coastguard Worker }
374*35238bceSAndroid Build Coastguard Worker
375*35238bceSAndroid Build Coastguard Worker struct Value
376*35238bceSAndroid Build Coastguard Worker {
Valuedeqp::gles2::Functional::Value377*35238bceSAndroid Build Coastguard Worker Value(ValueType valueType_, float rangeMin_, float rangeMax_)
378*35238bceSAndroid Build Coastguard Worker : valueType(valueType_)
379*35238bceSAndroid Build Coastguard Worker , rangeMin(rangeMin_)
380*35238bceSAndroid Build Coastguard Worker , rangeMax(rangeMax_)
381*35238bceSAndroid Build Coastguard Worker {
382*35238bceSAndroid Build Coastguard Worker }
383*35238bceSAndroid Build Coastguard Worker
384*35238bceSAndroid Build Coastguard Worker ValueType valueType;
385*35238bceSAndroid Build Coastguard Worker float rangeMin;
386*35238bceSAndroid Build Coastguard Worker float rangeMax;
387*35238bceSAndroid Build Coastguard Worker };
388*35238bceSAndroid Build Coastguard Worker
389*35238bceSAndroid Build Coastguard Worker enum OperationType
390*35238bceSAndroid Build Coastguard Worker {
391*35238bceSAndroid Build Coastguard Worker FUNCTION = 0,
392*35238bceSAndroid Build Coastguard Worker OPERATOR,
393*35238bceSAndroid Build Coastguard Worker SIDE_EFFECT_OPERATOR // Test the side-effect (as opposed to the result) of a side-effect operator.
394*35238bceSAndroid Build Coastguard Worker };
395*35238bceSAndroid Build Coastguard Worker
396*35238bceSAndroid Build Coastguard Worker struct BuiltinFuncInfo
397*35238bceSAndroid Build Coastguard Worker {
BuiltinFuncInfodeqp::gles2::Functional::BuiltinFuncInfo398*35238bceSAndroid Build Coastguard Worker BuiltinFuncInfo(const char *caseName_, const char *shaderFuncName_, ValueType outValue_, Value input0_,
399*35238bceSAndroid Build Coastguard Worker Value input1_, Value input2_, float resultScale_, float resultBias_, uint32_t precisionMask_,
400*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_,
401*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec4_, OperationType type_ = FUNCTION, bool isUnaryPrefix_ = true)
402*35238bceSAndroid Build Coastguard Worker : caseName(caseName_)
403*35238bceSAndroid Build Coastguard Worker , shaderFuncName(shaderFuncName_)
404*35238bceSAndroid Build Coastguard Worker , outValue(outValue_)
405*35238bceSAndroid Build Coastguard Worker , input0(input0_)
406*35238bceSAndroid Build Coastguard Worker , input1(input1_)
407*35238bceSAndroid Build Coastguard Worker , input2(input2_)
408*35238bceSAndroid Build Coastguard Worker , resultScale(resultScale_)
409*35238bceSAndroid Build Coastguard Worker , resultBias(resultBias_)
410*35238bceSAndroid Build Coastguard Worker , precisionMask(precisionMask_)
411*35238bceSAndroid Build Coastguard Worker , evalFuncScalar(evalFuncScalar_)
412*35238bceSAndroid Build Coastguard Worker , evalFuncVec2(evalFuncVec2_)
413*35238bceSAndroid Build Coastguard Worker , evalFuncVec3(evalFuncVec3_)
414*35238bceSAndroid Build Coastguard Worker , evalFuncVec4(evalFuncVec4_)
415*35238bceSAndroid Build Coastguard Worker , type(type_)
416*35238bceSAndroid Build Coastguard Worker , isUnaryPrefix(isUnaryPrefix_)
417*35238bceSAndroid Build Coastguard Worker {
418*35238bceSAndroid Build Coastguard Worker }
419*35238bceSAndroid Build Coastguard Worker
420*35238bceSAndroid Build Coastguard Worker const char *caseName; //!< Name of case.
421*35238bceSAndroid Build Coastguard Worker const char *shaderFuncName; //!< Name in shading language.
422*35238bceSAndroid Build Coastguard Worker ValueType outValue;
423*35238bceSAndroid Build Coastguard Worker Value input0;
424*35238bceSAndroid Build Coastguard Worker Value input1;
425*35238bceSAndroid Build Coastguard Worker Value input2;
426*35238bceSAndroid Build Coastguard Worker float resultScale;
427*35238bceSAndroid Build Coastguard Worker float resultBias;
428*35238bceSAndroid Build Coastguard Worker uint32_t precisionMask;
429*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncScalar;
430*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec2;
431*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec3;
432*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec4;
433*35238bceSAndroid Build Coastguard Worker OperationType type;
434*35238bceSAndroid Build Coastguard Worker bool isUnaryPrefix; //!< Whether a unary operator is a prefix operator; redundant unless unary.
435*35238bceSAndroid Build Coastguard Worker };
436*35238bceSAndroid Build Coastguard Worker
BuiltinOperInfo(const char * caseName_,const char * shaderFuncName_,ValueType outValue_,Value input0_,Value input1_,Value input2_,float resultScale_,float resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_)437*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinOperInfo(const char *caseName_, const char *shaderFuncName_, ValueType outValue_,
438*35238bceSAndroid Build Coastguard Worker Value input0_, Value input1_, Value input2_, float resultScale_,
439*35238bceSAndroid Build Coastguard Worker float resultBias_, uint32_t precisionMask_,
440*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_,
441*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_)
442*35238bceSAndroid Build Coastguard Worker {
443*35238bceSAndroid Build Coastguard Worker return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
444*35238bceSAndroid Build Coastguard Worker precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_, OPERATOR);
445*35238bceSAndroid Build Coastguard Worker }
446*35238bceSAndroid Build Coastguard Worker
447*35238bceSAndroid Build Coastguard Worker // For postfix (unary) operators.
BuiltinPostOperInfo(const char * caseName_,const char * shaderFuncName_,ValueType outValue_,Value input0_,Value input1_,Value input2_,float resultScale_,float resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_)448*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinPostOperInfo(const char *caseName_, const char *shaderFuncName_,
449*35238bceSAndroid Build Coastguard Worker ValueType outValue_, Value input0_, Value input1_, Value input2_,
450*35238bceSAndroid Build Coastguard Worker float resultScale_, float resultBias_, uint32_t precisionMask_,
451*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_,
452*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_)
453*35238bceSAndroid Build Coastguard Worker {
454*35238bceSAndroid Build Coastguard Worker return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
455*35238bceSAndroid Build Coastguard Worker precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_, OPERATOR,
456*35238bceSAndroid Build Coastguard Worker false);
457*35238bceSAndroid Build Coastguard Worker }
458*35238bceSAndroid Build Coastguard Worker
BuiltinSideEffOperInfo(const char * caseName_,const char * shaderFuncName_,ValueType outValue_,Value input0_,Value input1_,Value input2_,float resultScale_,float resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_)459*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinSideEffOperInfo(const char *caseName_, const char *shaderFuncName_,
460*35238bceSAndroid Build Coastguard Worker ValueType outValue_, Value input0_, Value input1_, Value input2_,
461*35238bceSAndroid Build Coastguard Worker float resultScale_, float resultBias_, uint32_t precisionMask_,
462*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_,
463*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_)
464*35238bceSAndroid Build Coastguard Worker {
465*35238bceSAndroid Build Coastguard Worker return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
466*35238bceSAndroid Build Coastguard Worker precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_,
467*35238bceSAndroid Build Coastguard Worker SIDE_EFFECT_OPERATOR);
468*35238bceSAndroid Build Coastguard Worker }
469*35238bceSAndroid Build Coastguard Worker
470*35238bceSAndroid Build Coastguard Worker // For postfix (unary) operators, testing side-effect.
BuiltinPostSideEffOperInfo(const char * caseName_,const char * shaderFuncName_,ValueType outValue_,Value input0_,Value input1_,Value input2_,float resultScale_,float resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_)471*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinPostSideEffOperInfo(const char *caseName_, const char *shaderFuncName_,
472*35238bceSAndroid Build Coastguard Worker ValueType outValue_, Value input0_, Value input1_,
473*35238bceSAndroid Build Coastguard Worker Value input2_, float resultScale_, float resultBias_,
474*35238bceSAndroid Build Coastguard Worker uint32_t precisionMask_, ShaderEvalFunc evalFuncScalar_,
475*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_,
476*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFuncVec4_)
477*35238bceSAndroid Build Coastguard Worker {
478*35238bceSAndroid Build Coastguard Worker return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
479*35238bceSAndroid Build Coastguard Worker precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_,
480*35238bceSAndroid Build Coastguard Worker SIDE_EFFECT_OPERATOR, false);
481*35238bceSAndroid Build Coastguard Worker }
482*35238bceSAndroid Build Coastguard Worker
483*35238bceSAndroid Build Coastguard Worker // BuiltinFuncGroup
484*35238bceSAndroid Build Coastguard Worker
485*35238bceSAndroid Build Coastguard Worker struct BuiltinFuncGroup
486*35238bceSAndroid Build Coastguard Worker {
BuiltinFuncGroupdeqp::gles2::Functional::BuiltinFuncGroup487*35238bceSAndroid Build Coastguard Worker BuiltinFuncGroup(const char *name_, const char *description_) : name(name_), description(description_)
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker }
operator <<deqp::gles2::Functional::BuiltinFuncGroup490*35238bceSAndroid Build Coastguard Worker BuiltinFuncGroup &operator<<(const BuiltinFuncInfo &info)
491*35238bceSAndroid Build Coastguard Worker {
492*35238bceSAndroid Build Coastguard Worker funcInfos.push_back(info);
493*35238bceSAndroid Build Coastguard Worker return *this;
494*35238bceSAndroid Build Coastguard Worker }
495*35238bceSAndroid Build Coastguard Worker
496*35238bceSAndroid Build Coastguard Worker const char *name;
497*35238bceSAndroid Build Coastguard Worker const char *description;
498*35238bceSAndroid Build Coastguard Worker std::vector<BuiltinFuncInfo> funcInfos;
499*35238bceSAndroid Build Coastguard Worker };
500*35238bceSAndroid Build Coastguard Worker
501*35238bceSAndroid Build Coastguard Worker static const char *s_inSwizzles[MAX_INPUTS][4] = {{"z", "wy", "zxy", "yzwx"},
502*35238bceSAndroid Build Coastguard Worker {"x", "yx", "yzx", "wzyx"},
503*35238bceSAndroid Build Coastguard Worker {"y", "zy", "wyz", "xwzy"}};
504*35238bceSAndroid Build Coastguard Worker
505*35238bceSAndroid Build Coastguard Worker static const char *s_outSwizzles[] = {"x", "yz", "xyz", "xyzw"};
506*35238bceSAndroid Build Coastguard Worker
507*35238bceSAndroid Build Coastguard Worker // OperatorShaderEvaluator
508*35238bceSAndroid Build Coastguard Worker
509*35238bceSAndroid Build Coastguard Worker class OperatorShaderEvaluator : public ShaderEvaluator
510*35238bceSAndroid Build Coastguard Worker {
511*35238bceSAndroid Build Coastguard Worker public:
OperatorShaderEvaluator(ShaderEvalFunc evalFunc,float scale,float bias)512*35238bceSAndroid Build Coastguard Worker OperatorShaderEvaluator(ShaderEvalFunc evalFunc, float scale, float bias)
513*35238bceSAndroid Build Coastguard Worker {
514*35238bceSAndroid Build Coastguard Worker m_evalFunc = evalFunc;
515*35238bceSAndroid Build Coastguard Worker m_scale = scale;
516*35238bceSAndroid Build Coastguard Worker m_bias = bias;
517*35238bceSAndroid Build Coastguard Worker }
518*35238bceSAndroid Build Coastguard Worker
~OperatorShaderEvaluator(void)519*35238bceSAndroid Build Coastguard Worker virtual ~OperatorShaderEvaluator(void)
520*35238bceSAndroid Build Coastguard Worker {
521*35238bceSAndroid Build Coastguard Worker }
522*35238bceSAndroid Build Coastguard Worker
evaluate(ShaderEvalContext & ctx)523*35238bceSAndroid Build Coastguard Worker virtual void evaluate(ShaderEvalContext &ctx)
524*35238bceSAndroid Build Coastguard Worker {
525*35238bceSAndroid Build Coastguard Worker m_evalFunc(ctx);
526*35238bceSAndroid Build Coastguard Worker ctx.color = ctx.color * m_scale + m_bias;
527*35238bceSAndroid Build Coastguard Worker }
528*35238bceSAndroid Build Coastguard Worker
529*35238bceSAndroid Build Coastguard Worker private:
530*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc m_evalFunc;
531*35238bceSAndroid Build Coastguard Worker float m_scale;
532*35238bceSAndroid Build Coastguard Worker float m_bias;
533*35238bceSAndroid Build Coastguard Worker };
534*35238bceSAndroid Build Coastguard Worker
535*35238bceSAndroid Build Coastguard Worker // Concrete value.
536*35238bceSAndroid Build Coastguard Worker
537*35238bceSAndroid Build Coastguard Worker struct ShaderValue
538*35238bceSAndroid Build Coastguard Worker {
ShaderValuedeqp::gles2::Functional::ShaderValue539*35238bceSAndroid Build Coastguard Worker ShaderValue(DataType type_, float rangeMin_, float rangeMax_)
540*35238bceSAndroid Build Coastguard Worker : type(type_)
541*35238bceSAndroid Build Coastguard Worker , rangeMin(rangeMin_)
542*35238bceSAndroid Build Coastguard Worker , rangeMax(rangeMax_)
543*35238bceSAndroid Build Coastguard Worker {
544*35238bceSAndroid Build Coastguard Worker }
545*35238bceSAndroid Build Coastguard Worker
ShaderValuedeqp::gles2::Functional::ShaderValue546*35238bceSAndroid Build Coastguard Worker ShaderValue(void) : type(TYPE_LAST), rangeMin(0.0f), rangeMax(0.0f)
547*35238bceSAndroid Build Coastguard Worker {
548*35238bceSAndroid Build Coastguard Worker }
549*35238bceSAndroid Build Coastguard Worker
550*35238bceSAndroid Build Coastguard Worker DataType type;
551*35238bceSAndroid Build Coastguard Worker float rangeMin;
552*35238bceSAndroid Build Coastguard Worker float rangeMax;
553*35238bceSAndroid Build Coastguard Worker };
554*35238bceSAndroid Build Coastguard Worker
555*35238bceSAndroid Build Coastguard Worker struct ShaderDataSpec
556*35238bceSAndroid Build Coastguard Worker {
ShaderDataSpecdeqp::gles2::Functional::ShaderDataSpec557*35238bceSAndroid Build Coastguard Worker ShaderDataSpec(void)
558*35238bceSAndroid Build Coastguard Worker : resultScale(1.0f)
559*35238bceSAndroid Build Coastguard Worker , resultBias(0.0f)
560*35238bceSAndroid Build Coastguard Worker , precision(PRECISION_LAST)
561*35238bceSAndroid Build Coastguard Worker , output(TYPE_LAST)
562*35238bceSAndroid Build Coastguard Worker , numInputs(0)
563*35238bceSAndroid Build Coastguard Worker {
564*35238bceSAndroid Build Coastguard Worker }
565*35238bceSAndroid Build Coastguard Worker
566*35238bceSAndroid Build Coastguard Worker float resultScale;
567*35238bceSAndroid Build Coastguard Worker float resultBias;
568*35238bceSAndroid Build Coastguard Worker Precision precision;
569*35238bceSAndroid Build Coastguard Worker DataType output;
570*35238bceSAndroid Build Coastguard Worker int numInputs;
571*35238bceSAndroid Build Coastguard Worker ShaderValue inputs[MAX_INPUTS];
572*35238bceSAndroid Build Coastguard Worker };
573*35238bceSAndroid Build Coastguard Worker
574*35238bceSAndroid Build Coastguard Worker // ShaderOperatorCase
575*35238bceSAndroid Build Coastguard Worker
576*35238bceSAndroid Build Coastguard Worker class ShaderOperatorCase : public ShaderRenderCase
577*35238bceSAndroid Build Coastguard Worker {
578*35238bceSAndroid Build Coastguard Worker public:
579*35238bceSAndroid Build Coastguard Worker ShaderOperatorCase(Context &context, const char *caseName, const char *description, bool isVertexCase,
580*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc, const char *shaderOp, const ShaderDataSpec &spec);
581*35238bceSAndroid Build Coastguard Worker virtual ~ShaderOperatorCase(void);
582*35238bceSAndroid Build Coastguard Worker
583*35238bceSAndroid Build Coastguard Worker private:
584*35238bceSAndroid Build Coastguard Worker ShaderOperatorCase(const ShaderOperatorCase &); // not allowed!
585*35238bceSAndroid Build Coastguard Worker ShaderOperatorCase &operator=(const ShaderOperatorCase &); // not allowed!
586*35238bceSAndroid Build Coastguard Worker
587*35238bceSAndroid Build Coastguard Worker OperatorShaderEvaluator m_evaluator;
588*35238bceSAndroid Build Coastguard Worker };
589*35238bceSAndroid Build Coastguard Worker
ShaderOperatorCase(Context & context,const char * caseName,const char * description,bool isVertexCase,ShaderEvalFunc evalFunc,const char * shaderOp,const ShaderDataSpec & spec)590*35238bceSAndroid Build Coastguard Worker ShaderOperatorCase::ShaderOperatorCase(Context &context, const char *caseName, const char *description,
591*35238bceSAndroid Build Coastguard Worker bool isVertexCase, ShaderEvalFunc evalFunc, const char *shaderOp,
592*35238bceSAndroid Build Coastguard Worker const ShaderDataSpec &spec)
593*35238bceSAndroid Build Coastguard Worker : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), caseName,
594*35238bceSAndroid Build Coastguard Worker description, isVertexCase, m_evaluator)
595*35238bceSAndroid Build Coastguard Worker , m_evaluator(evalFunc, spec.resultScale, spec.resultBias)
596*35238bceSAndroid Build Coastguard Worker {
597*35238bceSAndroid Build Coastguard Worker const char *precision = spec.precision != PRECISION_LAST ? getPrecisionName(spec.precision) : DE_NULL;
598*35238bceSAndroid Build Coastguard Worker const char *inputPrecision[MAX_INPUTS];
599*35238bceSAndroid Build Coastguard Worker
600*35238bceSAndroid Build Coastguard Worker ostringstream vtx;
601*35238bceSAndroid Build Coastguard Worker ostringstream frag;
602*35238bceSAndroid Build Coastguard Worker ostringstream &op = isVertexCase ? vtx : frag;
603*35238bceSAndroid Build Coastguard Worker
604*35238bceSAndroid Build Coastguard Worker // Compute precision for inputs.
605*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < spec.numInputs; i++)
606*35238bceSAndroid Build Coastguard Worker {
607*35238bceSAndroid Build Coastguard Worker bool isBoolVal = de::inRange<int>(spec.inputs[i].type, TYPE_BOOL, TYPE_BOOL_VEC4);
608*35238bceSAndroid Build Coastguard Worker bool isIntVal = de::inRange<int>(spec.inputs[i].type, TYPE_INT, TYPE_INT_VEC4);
609*35238bceSAndroid Build Coastguard Worker // \note Mediump interpolators are used for booleans and lowp ints.
610*35238bceSAndroid Build Coastguard Worker Precision prec =
611*35238bceSAndroid Build Coastguard Worker isBoolVal || (isIntVal && spec.precision == PRECISION_LOWP) ? PRECISION_MEDIUMP : spec.precision;
612*35238bceSAndroid Build Coastguard Worker inputPrecision[i] = getPrecisionName(prec);
613*35238bceSAndroid Build Coastguard Worker }
614*35238bceSAndroid Build Coastguard Worker
615*35238bceSAndroid Build Coastguard Worker // Attributes.
616*35238bceSAndroid Build Coastguard Worker vtx << "attribute highp vec4 a_position;\n";
617*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < spec.numInputs; i++)
618*35238bceSAndroid Build Coastguard Worker vtx << "attribute " << inputPrecision[i] << " vec4 a_in" << i << ";\n";
619*35238bceSAndroid Build Coastguard Worker
620*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
621*35238bceSAndroid Build Coastguard Worker {
622*35238bceSAndroid Build Coastguard Worker vtx << "varying mediump vec4 v_color;\n";
623*35238bceSAndroid Build Coastguard Worker frag << "varying mediump vec4 v_color;\n";
624*35238bceSAndroid Build Coastguard Worker }
625*35238bceSAndroid Build Coastguard Worker else
626*35238bceSAndroid Build Coastguard Worker {
627*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < spec.numInputs; i++)
628*35238bceSAndroid Build Coastguard Worker {
629*35238bceSAndroid Build Coastguard Worker vtx << "varying " << inputPrecision[i] << " vec4 v_in" << i << ";\n";
630*35238bceSAndroid Build Coastguard Worker frag << "varying " << inputPrecision[i] << " vec4 v_in" << i << ";\n";
631*35238bceSAndroid Build Coastguard Worker }
632*35238bceSAndroid Build Coastguard Worker }
633*35238bceSAndroid Build Coastguard Worker
634*35238bceSAndroid Build Coastguard Worker vtx << "\n";
635*35238bceSAndroid Build Coastguard Worker vtx << "void main()\n";
636*35238bceSAndroid Build Coastguard Worker vtx << "{\n";
637*35238bceSAndroid Build Coastguard Worker vtx << " gl_Position = a_position;\n";
638*35238bceSAndroid Build Coastguard Worker
639*35238bceSAndroid Build Coastguard Worker frag << "\n";
640*35238bceSAndroid Build Coastguard Worker frag << "void main()\n";
641*35238bceSAndroid Build Coastguard Worker frag << "{\n";
642*35238bceSAndroid Build Coastguard Worker
643*35238bceSAndroid Build Coastguard Worker // Expression inputs.
644*35238bceSAndroid Build Coastguard Worker string prefix = isVertexCase ? "a_" : "v_";
645*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < spec.numInputs; i++)
646*35238bceSAndroid Build Coastguard Worker {
647*35238bceSAndroid Build Coastguard Worker DataType inType = spec.inputs[i].type;
648*35238bceSAndroid Build Coastguard Worker int inSize = getDataTypeScalarSize(inType);
649*35238bceSAndroid Build Coastguard Worker bool isInt = de::inRange<int>(inType, TYPE_INT, TYPE_INT_VEC4);
650*35238bceSAndroid Build Coastguard Worker bool isBool = de::inRange<int>(inType, TYPE_BOOL, TYPE_BOOL_VEC4);
651*35238bceSAndroid Build Coastguard Worker const char *typeName = getDataTypeName(inType);
652*35238bceSAndroid Build Coastguard Worker const char *swizzle = s_inSwizzles[i][inSize - 1];
653*35238bceSAndroid Build Coastguard Worker
654*35238bceSAndroid Build Coastguard Worker op << "\t";
655*35238bceSAndroid Build Coastguard Worker if (precision && !isBool)
656*35238bceSAndroid Build Coastguard Worker op << precision << " ";
657*35238bceSAndroid Build Coastguard Worker
658*35238bceSAndroid Build Coastguard Worker op << typeName << " in" << i << " = ";
659*35238bceSAndroid Build Coastguard Worker
660*35238bceSAndroid Build Coastguard Worker if (isBool)
661*35238bceSAndroid Build Coastguard Worker {
662*35238bceSAndroid Build Coastguard Worker if (inSize == 1)
663*35238bceSAndroid Build Coastguard Worker op << "(";
664*35238bceSAndroid Build Coastguard Worker else
665*35238bceSAndroid Build Coastguard Worker op << "greaterThan(";
666*35238bceSAndroid Build Coastguard Worker }
667*35238bceSAndroid Build Coastguard Worker else if (isInt)
668*35238bceSAndroid Build Coastguard Worker op << typeName << "(";
669*35238bceSAndroid Build Coastguard Worker
670*35238bceSAndroid Build Coastguard Worker op << prefix << "in" << i << "." << swizzle;
671*35238bceSAndroid Build Coastguard Worker
672*35238bceSAndroid Build Coastguard Worker if (isBool)
673*35238bceSAndroid Build Coastguard Worker {
674*35238bceSAndroid Build Coastguard Worker if (inSize == 1)
675*35238bceSAndroid Build Coastguard Worker op << " > 0.0)";
676*35238bceSAndroid Build Coastguard Worker else
677*35238bceSAndroid Build Coastguard Worker op << ", vec" << inSize << "(0.0))";
678*35238bceSAndroid Build Coastguard Worker }
679*35238bceSAndroid Build Coastguard Worker else if (isInt)
680*35238bceSAndroid Build Coastguard Worker op << ")";
681*35238bceSAndroid Build Coastguard Worker
682*35238bceSAndroid Build Coastguard Worker op << ";\n";
683*35238bceSAndroid Build Coastguard Worker }
684*35238bceSAndroid Build Coastguard Worker
685*35238bceSAndroid Build Coastguard Worker // Result variable.
686*35238bceSAndroid Build Coastguard Worker {
687*35238bceSAndroid Build Coastguard Worker const char *outTypeName = getDataTypeName(spec.output);
688*35238bceSAndroid Build Coastguard Worker bool isBoolOut = de::inRange<int>(spec.output, TYPE_BOOL, TYPE_BOOL_VEC4);
689*35238bceSAndroid Build Coastguard Worker
690*35238bceSAndroid Build Coastguard Worker op << "\t";
691*35238bceSAndroid Build Coastguard Worker if (precision && !isBoolOut)
692*35238bceSAndroid Build Coastguard Worker op << precision << " ";
693*35238bceSAndroid Build Coastguard Worker op << outTypeName << " res = " << outTypeName << "(0.0);\n\n";
694*35238bceSAndroid Build Coastguard Worker }
695*35238bceSAndroid Build Coastguard Worker
696*35238bceSAndroid Build Coastguard Worker // Expression.
697*35238bceSAndroid Build Coastguard Worker op << "\t" << shaderOp << "\n\n";
698*35238bceSAndroid Build Coastguard Worker
699*35238bceSAndroid Build Coastguard Worker // Convert to color.
700*35238bceSAndroid Build Coastguard Worker bool isResFloatVec = de::inRange<int>(spec.output, TYPE_FLOAT, TYPE_FLOAT_VEC4);
701*35238bceSAndroid Build Coastguard Worker int outScalarSize = getDataTypeScalarSize(spec.output);
702*35238bceSAndroid Build Coastguard Worker
703*35238bceSAndroid Build Coastguard Worker op << "\tmediump vec4 color = vec4(0.0, 0.0, 0.0, 1.0);\n";
704*35238bceSAndroid Build Coastguard Worker op << "\tcolor." << s_outSwizzles[outScalarSize - 1] << " = ";
705*35238bceSAndroid Build Coastguard Worker
706*35238bceSAndroid Build Coastguard Worker if (!isResFloatVec && outScalarSize == 1)
707*35238bceSAndroid Build Coastguard Worker op << "float(res)";
708*35238bceSAndroid Build Coastguard Worker else if (!isResFloatVec)
709*35238bceSAndroid Build Coastguard Worker op << "vec" << outScalarSize << "(res)";
710*35238bceSAndroid Build Coastguard Worker else
711*35238bceSAndroid Build Coastguard Worker op << "res";
712*35238bceSAndroid Build Coastguard Worker
713*35238bceSAndroid Build Coastguard Worker op << ";\n";
714*35238bceSAndroid Build Coastguard Worker
715*35238bceSAndroid Build Coastguard Worker // Scale & bias.
716*35238bceSAndroid Build Coastguard Worker float resultScale = spec.resultScale;
717*35238bceSAndroid Build Coastguard Worker float resultBias = spec.resultBias;
718*35238bceSAndroid Build Coastguard Worker if ((resultScale != 1.0f) || (resultBias != 0.0f))
719*35238bceSAndroid Build Coastguard Worker {
720*35238bceSAndroid Build Coastguard Worker op << "\tcolor = color";
721*35238bceSAndroid Build Coastguard Worker if (resultScale != 1.0f)
722*35238bceSAndroid Build Coastguard Worker op << " * " << de::floatToString(resultScale, 2);
723*35238bceSAndroid Build Coastguard Worker if (resultBias != 0.0f)
724*35238bceSAndroid Build Coastguard Worker op << " + " << de::floatToString(resultBias, 2);
725*35238bceSAndroid Build Coastguard Worker op << ";\n";
726*35238bceSAndroid Build Coastguard Worker }
727*35238bceSAndroid Build Coastguard Worker
728*35238bceSAndroid Build Coastguard Worker // ..
729*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
730*35238bceSAndroid Build Coastguard Worker {
731*35238bceSAndroid Build Coastguard Worker vtx << " v_color = color;\n";
732*35238bceSAndroid Build Coastguard Worker frag << " gl_FragColor = v_color;\n";
733*35238bceSAndroid Build Coastguard Worker }
734*35238bceSAndroid Build Coastguard Worker else
735*35238bceSAndroid Build Coastguard Worker {
736*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < spec.numInputs; i++)
737*35238bceSAndroid Build Coastguard Worker vtx << " v_in" << i << " = a_in" << i << ";\n";
738*35238bceSAndroid Build Coastguard Worker frag << " gl_FragColor = color;\n";
739*35238bceSAndroid Build Coastguard Worker }
740*35238bceSAndroid Build Coastguard Worker
741*35238bceSAndroid Build Coastguard Worker vtx << "}\n";
742*35238bceSAndroid Build Coastguard Worker frag << "}\n";
743*35238bceSAndroid Build Coastguard Worker
744*35238bceSAndroid Build Coastguard Worker m_vertShaderSource = vtx.str();
745*35238bceSAndroid Build Coastguard Worker m_fragShaderSource = frag.str();
746*35238bceSAndroid Build Coastguard Worker
747*35238bceSAndroid Build Coastguard Worker // Setup the user attributes.
748*35238bceSAndroid Build Coastguard Worker m_userAttribTransforms.resize(spec.numInputs);
749*35238bceSAndroid Build Coastguard Worker for (int inputNdx = 0; inputNdx < spec.numInputs; inputNdx++)
750*35238bceSAndroid Build Coastguard Worker {
751*35238bceSAndroid Build Coastguard Worker const ShaderValue &v = spec.inputs[inputNdx];
752*35238bceSAndroid Build Coastguard Worker DE_ASSERT(v.type != TYPE_LAST);
753*35238bceSAndroid Build Coastguard Worker
754*35238bceSAndroid Build Coastguard Worker float scale = (v.rangeMax - v.rangeMin);
755*35238bceSAndroid Build Coastguard Worker float minBias = v.rangeMin;
756*35238bceSAndroid Build Coastguard Worker float maxBias = v.rangeMax;
757*35238bceSAndroid Build Coastguard Worker Mat4 attribMatrix;
758*35238bceSAndroid Build Coastguard Worker
759*35238bceSAndroid Build Coastguard Worker for (int rowNdx = 0; rowNdx < 4; rowNdx++)
760*35238bceSAndroid Build Coastguard Worker {
761*35238bceSAndroid Build Coastguard Worker Vec4 row;
762*35238bceSAndroid Build Coastguard Worker
763*35238bceSAndroid Build Coastguard Worker switch ((rowNdx + inputNdx) % 4)
764*35238bceSAndroid Build Coastguard Worker {
765*35238bceSAndroid Build Coastguard Worker case 0:
766*35238bceSAndroid Build Coastguard Worker row = Vec4(scale, 0.0f, 0.0f, minBias);
767*35238bceSAndroid Build Coastguard Worker break;
768*35238bceSAndroid Build Coastguard Worker case 1:
769*35238bceSAndroid Build Coastguard Worker row = Vec4(0.0f, scale, 0.0f, minBias);
770*35238bceSAndroid Build Coastguard Worker break;
771*35238bceSAndroid Build Coastguard Worker case 2:
772*35238bceSAndroid Build Coastguard Worker row = Vec4(-scale, 0.0f, 0.0f, maxBias);
773*35238bceSAndroid Build Coastguard Worker break;
774*35238bceSAndroid Build Coastguard Worker case 3:
775*35238bceSAndroid Build Coastguard Worker row = Vec4(0.0f, -scale, 0.0f, maxBias);
776*35238bceSAndroid Build Coastguard Worker break;
777*35238bceSAndroid Build Coastguard Worker default:
778*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
779*35238bceSAndroid Build Coastguard Worker }
780*35238bceSAndroid Build Coastguard Worker
781*35238bceSAndroid Build Coastguard Worker attribMatrix.setRow(rowNdx, row);
782*35238bceSAndroid Build Coastguard Worker }
783*35238bceSAndroid Build Coastguard Worker
784*35238bceSAndroid Build Coastguard Worker m_userAttribTransforms[inputNdx] = attribMatrix;
785*35238bceSAndroid Build Coastguard Worker }
786*35238bceSAndroid Build Coastguard Worker }
787*35238bceSAndroid Build Coastguard Worker
~ShaderOperatorCase(void)788*35238bceSAndroid Build Coastguard Worker ShaderOperatorCase::~ShaderOperatorCase(void)
789*35238bceSAndroid Build Coastguard Worker {
790*35238bceSAndroid Build Coastguard Worker }
791*35238bceSAndroid Build Coastguard Worker
792*35238bceSAndroid Build Coastguard Worker // ShaderOperatorTests.
793*35238bceSAndroid Build Coastguard Worker
ShaderOperatorTests(Context & context)794*35238bceSAndroid Build Coastguard Worker ShaderOperatorTests::ShaderOperatorTests(Context &context) : TestCaseGroup(context, "operator", "Operator tests.")
795*35238bceSAndroid Build Coastguard Worker {
796*35238bceSAndroid Build Coastguard Worker }
797*35238bceSAndroid Build Coastguard Worker
~ShaderOperatorTests(void)798*35238bceSAndroid Build Coastguard Worker ShaderOperatorTests::~ShaderOperatorTests(void)
799*35238bceSAndroid Build Coastguard Worker {
800*35238bceSAndroid Build Coastguard Worker }
801*35238bceSAndroid Build Coastguard Worker
802*35238bceSAndroid Build Coastguard Worker // Vector math functions.
803*35238bceSAndroid Build Coastguard Worker template <typename T>
nop(T f)804*35238bceSAndroid Build Coastguard Worker inline T nop(T f)
805*35238bceSAndroid Build Coastguard Worker {
806*35238bceSAndroid Build Coastguard Worker return f;
807*35238bceSAndroid Build Coastguard Worker }
808*35238bceSAndroid Build Coastguard Worker
809*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
nop(const Vector<T,Size> & v)810*35238bceSAndroid Build Coastguard Worker Vector<T, Size> nop(const Vector<T, Size> &v)
811*35238bceSAndroid Build Coastguard Worker {
812*35238bceSAndroid Build Coastguard Worker return v;
813*35238bceSAndroid Build Coastguard Worker }
814*35238bceSAndroid Build Coastguard Worker
815*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_GENTYPE_FUNCS(FUNC_NAME) \
816*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_float(ShaderEvalContext &c) \
817*35238bceSAndroid Build Coastguard Worker { \
818*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(2)).x(); \
819*35238bceSAndroid Build Coastguard Worker } \
820*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
821*35238bceSAndroid Build Coastguard Worker { \
822*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1)); \
823*35238bceSAndroid Build Coastguard Worker } \
824*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
825*35238bceSAndroid Build Coastguard Worker { \
826*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1)); \
827*35238bceSAndroid Build Coastguard Worker } \
828*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
829*35238bceSAndroid Build Coastguard Worker { \
830*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0)); \
831*35238bceSAndroid Build Coastguard Worker }
832*35238bceSAndroid Build Coastguard Worker
833*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_GENTYPE_FUNCS(FUNC_NAME) \
834*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_float(ShaderEvalContext &c) \
835*35238bceSAndroid Build Coastguard Worker { \
836*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(2), c.in[1].swizzle(0)).x(); \
837*35238bceSAndroid Build Coastguard Worker } \
838*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
839*35238bceSAndroid Build Coastguard Worker { \
840*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0)); \
841*35238bceSAndroid Build Coastguard Worker } \
842*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
843*35238bceSAndroid Build Coastguard Worker { \
844*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0)); \
845*35238bceSAndroid Build Coastguard Worker } \
846*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
847*35238bceSAndroid Build Coastguard Worker { \
848*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)); \
849*35238bceSAndroid Build Coastguard Worker }
850*35238bceSAndroid Build Coastguard Worker
851*35238bceSAndroid Build Coastguard Worker #define DECLARE_TERNARY_GENTYPE_FUNCS(FUNC_NAME) \
852*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_float(ShaderEvalContext &c) \
853*35238bceSAndroid Build Coastguard Worker { \
854*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(2), c.in[1].swizzle(0), c.in[2].swizzle(1)).x(); \
855*35238bceSAndroid Build Coastguard Worker } \
856*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
857*35238bceSAndroid Build Coastguard Worker { \
858*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0), c.in[2].swizzle(2, 1)); \
859*35238bceSAndroid Build Coastguard Worker } \
860*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
861*35238bceSAndroid Build Coastguard Worker { \
862*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0), c.in[2].swizzle(3, 1, 2)); \
863*35238bceSAndroid Build Coastguard Worker } \
864*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
865*35238bceSAndroid Build Coastguard Worker { \
866*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0), c.in[2].swizzle(0, 3, 2, 1)); \
867*35238bceSAndroid Build Coastguard Worker }
868*35238bceSAndroid Build Coastguard Worker
869*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_SCALAR_GENTYPE_FUNCS(FUNC_NAME) \
870*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_float(ShaderEvalContext &c) \
871*35238bceSAndroid Build Coastguard Worker { \
872*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(2)); \
873*35238bceSAndroid Build Coastguard Worker } \
874*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
875*35238bceSAndroid Build Coastguard Worker { \
876*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(3, 1)); \
877*35238bceSAndroid Build Coastguard Worker } \
878*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
879*35238bceSAndroid Build Coastguard Worker { \
880*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(2, 0, 1)); \
881*35238bceSAndroid Build Coastguard Worker } \
882*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
883*35238bceSAndroid Build Coastguard Worker { \
884*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0)); \
885*35238bceSAndroid Build Coastguard Worker }
886*35238bceSAndroid Build Coastguard Worker
887*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_SCALAR_GENTYPE_FUNCS(FUNC_NAME) \
888*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_float(ShaderEvalContext &c) \
889*35238bceSAndroid Build Coastguard Worker { \
890*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(2), c.in[1].swizzle(0)); \
891*35238bceSAndroid Build Coastguard Worker } \
892*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
893*35238bceSAndroid Build Coastguard Worker { \
894*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0)); \
895*35238bceSAndroid Build Coastguard Worker } \
896*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
897*35238bceSAndroid Build Coastguard Worker { \
898*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0)); \
899*35238bceSAndroid Build Coastguard Worker } \
900*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
901*35238bceSAndroid Build Coastguard Worker { \
902*35238bceSAndroid Build Coastguard Worker c.color.x() = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)); \
903*35238bceSAndroid Build Coastguard Worker }
904*35238bceSAndroid Build Coastguard Worker
905*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_BOOL_FUNCS(FUNC_NAME) \
906*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bool(ShaderEvalContext &c) \
907*35238bceSAndroid Build Coastguard Worker { \
908*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f); \
909*35238bceSAndroid Build Coastguard Worker }
910*35238bceSAndroid Build Coastguard Worker
911*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_BOOL_GENTYPE_FUNCS(FUNC_NAME) \
912*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bool(ShaderEvalContext &c) \
913*35238bceSAndroid Build Coastguard Worker { \
914*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f); \
915*35238bceSAndroid Build Coastguard Worker } \
916*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec2(ShaderEvalContext &c) \
917*35238bceSAndroid Build Coastguard Worker { \
918*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f))).asFloat(); \
919*35238bceSAndroid Build Coastguard Worker } \
920*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec3(ShaderEvalContext &c) \
921*35238bceSAndroid Build Coastguard Worker { \
922*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f))).asFloat(); \
923*35238bceSAndroid Build Coastguard Worker } \
924*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec4(ShaderEvalContext &c) \
925*35238bceSAndroid Build Coastguard Worker { \
926*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f))).asFloat(); \
927*35238bceSAndroid Build Coastguard Worker }
928*35238bceSAndroid Build Coastguard Worker
929*35238bceSAndroid Build Coastguard Worker #define DECLARE_TERNARY_BOOL_GENTYPE_FUNCS(FUNC_NAME) \
930*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bool(ShaderEvalContext &c) \
931*35238bceSAndroid Build Coastguard Worker { \
932*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f, c.in[2].y() > 0.0f); \
933*35238bceSAndroid Build Coastguard Worker } \
934*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec2(ShaderEvalContext &c) \
935*35238bceSAndroid Build Coastguard Worker { \
936*35238bceSAndroid Build Coastguard Worker c.color.yz() = \
937*35238bceSAndroid Build Coastguard Worker FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)), greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f)), \
938*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[2].swizzle(2, 1), Vec2(0.0f))) \
939*35238bceSAndroid Build Coastguard Worker .asFloat(); \
940*35238bceSAndroid Build Coastguard Worker } \
941*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec3(ShaderEvalContext &c) \
942*35238bceSAndroid Build Coastguard Worker { \
943*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)), \
944*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f)), \
945*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[2].swizzle(3, 1, 2), Vec3(0.0f))) \
946*35238bceSAndroid Build Coastguard Worker .asFloat(); \
947*35238bceSAndroid Build Coastguard Worker } \
948*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec4(ShaderEvalContext &c) \
949*35238bceSAndroid Build Coastguard Worker { \
950*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)), \
951*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f)), \
952*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f))) \
953*35238bceSAndroid Build Coastguard Worker .asFloat(); \
954*35238bceSAndroid Build Coastguard Worker }
955*35238bceSAndroid Build Coastguard Worker
956*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_INT_GENTYPE_FUNCS(FUNC_NAME) \
957*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_int(ShaderEvalContext &c) \
958*35238bceSAndroid Build Coastguard Worker { \
959*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME((int)c.in[0].z()); \
960*35238bceSAndroid Build Coastguard Worker } \
961*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c) \
962*35238bceSAndroid Build Coastguard Worker { \
963*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asInt()).asFloat(); \
964*35238bceSAndroid Build Coastguard Worker } \
965*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c) \
966*35238bceSAndroid Build Coastguard Worker { \
967*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt()).asFloat(); \
968*35238bceSAndroid Build Coastguard Worker } \
969*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c) \
970*35238bceSAndroid Build Coastguard Worker { \
971*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt()).asFloat(); \
972*35238bceSAndroid Build Coastguard Worker }
973*35238bceSAndroid Build Coastguard Worker
974*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_INT_GENTYPE_FUNCS(FUNC_NAME) \
975*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_int(ShaderEvalContext &c) \
976*35238bceSAndroid Build Coastguard Worker { \
977*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)tcu::FUNC_NAME((int)c.in[0].z(), (int)c.in[1].x()); \
978*35238bceSAndroid Build Coastguard Worker } \
979*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c) \
980*35238bceSAndroid Build Coastguard Worker { \
981*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asInt(), c.in[1].swizzle(1, 0).asInt()).asFloat(); \
982*35238bceSAndroid Build Coastguard Worker } \
983*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c) \
984*35238bceSAndroid Build Coastguard Worker { \
985*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(), c.in[1].swizzle(1, 2, 0).asInt()).asFloat(); \
986*35238bceSAndroid Build Coastguard Worker } \
987*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c) \
988*35238bceSAndroid Build Coastguard Worker { \
989*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(), c.in[1].swizzle(3, 2, 1, 0).asInt()).asFloat(); \
990*35238bceSAndroid Build Coastguard Worker }
991*35238bceSAndroid Build Coastguard Worker
992*35238bceSAndroid Build Coastguard Worker #define DECLARE_TERNARY_INT_GENTYPE_FUNCS(FUNC_NAME) \
993*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_int(ShaderEvalContext &c) \
994*35238bceSAndroid Build Coastguard Worker { \
995*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME((int)c.in[0].z(), (int)c.in[1].x(), (int)c.in[2].y()); \
996*35238bceSAndroid Build Coastguard Worker } \
997*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c) \
998*35238bceSAndroid Build Coastguard Worker { \
999*35238bceSAndroid Build Coastguard Worker c.color.yz() = \
1000*35238bceSAndroid Build Coastguard Worker FUNC_NAME(c.in[0].swizzle(3, 1).asInt(), c.in[1].swizzle(1, 0).asInt(), c.in[2].swizzle(2, 1).asInt()) \
1001*35238bceSAndroid Build Coastguard Worker .asFloat(); \
1002*35238bceSAndroid Build Coastguard Worker } \
1003*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c) \
1004*35238bceSAndroid Build Coastguard Worker { \
1005*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(), c.in[1].swizzle(1, 2, 0).asInt(), \
1006*35238bceSAndroid Build Coastguard Worker c.in[2].swizzle(3, 1, 2).asInt()) \
1007*35238bceSAndroid Build Coastguard Worker .asFloat(); \
1008*35238bceSAndroid Build Coastguard Worker } \
1009*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c) \
1010*35238bceSAndroid Build Coastguard Worker { \
1011*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(), c.in[1].swizzle(3, 2, 1, 0).asInt(), \
1012*35238bceSAndroid Build Coastguard Worker c.in[2].swizzle(0, 3, 2, 1).asInt()) \
1013*35238bceSAndroid Build Coastguard Worker .asFloat(); \
1014*35238bceSAndroid Build Coastguard Worker }
1015*35238bceSAndroid Build Coastguard Worker
1016*35238bceSAndroid Build Coastguard Worker #define DECLARE_VEC_FLOAT_FUNCS(FUNC_NAME) \
1017*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
1018*35238bceSAndroid Build Coastguard Worker { \
1019*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].x()); \
1020*35238bceSAndroid Build Coastguard Worker } \
1021*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
1022*35238bceSAndroid Build Coastguard Worker { \
1023*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].x()); \
1024*35238bceSAndroid Build Coastguard Worker } \
1025*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
1026*35238bceSAndroid Build Coastguard Worker { \
1027*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].x()); \
1028*35238bceSAndroid Build Coastguard Worker }
1029*35238bceSAndroid Build Coastguard Worker
1030*35238bceSAndroid Build Coastguard Worker #define DECLARE_VEC_FLOAT_FLOAT_FUNCS(FUNC_NAME) \
1031*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
1032*35238bceSAndroid Build Coastguard Worker { \
1033*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].x(), c.in[2].y()); \
1034*35238bceSAndroid Build Coastguard Worker } \
1035*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
1036*35238bceSAndroid Build Coastguard Worker { \
1037*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].x(), c.in[2].y()); \
1038*35238bceSAndroid Build Coastguard Worker } \
1039*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
1040*35238bceSAndroid Build Coastguard Worker { \
1041*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].x(), c.in[2].y()); \
1042*35238bceSAndroid Build Coastguard Worker }
1043*35238bceSAndroid Build Coastguard Worker
1044*35238bceSAndroid Build Coastguard Worker #define DECLARE_VEC_VEC_FLOAT_FUNCS(FUNC_NAME) \
1045*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
1046*35238bceSAndroid Build Coastguard Worker { \
1047*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0), c.in[2].y()); \
1048*35238bceSAndroid Build Coastguard Worker } \
1049*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
1050*35238bceSAndroid Build Coastguard Worker { \
1051*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0), c.in[2].y()); \
1052*35238bceSAndroid Build Coastguard Worker } \
1053*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
1054*35238bceSAndroid Build Coastguard Worker { \
1055*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0), c.in[2].y()); \
1056*35238bceSAndroid Build Coastguard Worker }
1057*35238bceSAndroid Build Coastguard Worker
1058*35238bceSAndroid Build Coastguard Worker #define DECLARE_FLOAT_FLOAT_VEC_FUNCS(FUNC_NAME) \
1059*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
1060*35238bceSAndroid Build Coastguard Worker { \
1061*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(2, 1)); \
1062*35238bceSAndroid Build Coastguard Worker } \
1063*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
1064*35238bceSAndroid Build Coastguard Worker { \
1065*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(3, 1, 2)); \
1066*35238bceSAndroid Build Coastguard Worker } \
1067*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
1068*35238bceSAndroid Build Coastguard Worker { \
1069*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(0, 3, 2, 1)); \
1070*35238bceSAndroid Build Coastguard Worker }
1071*35238bceSAndroid Build Coastguard Worker
1072*35238bceSAndroid Build Coastguard Worker #define DECLARE_FLOAT_VEC_FUNCS(FUNC_NAME) \
1073*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
1074*35238bceSAndroid Build Coastguard Worker { \
1075*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].z(), c.in[1].swizzle(1, 0)); \
1076*35238bceSAndroid Build Coastguard Worker } \
1077*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
1078*35238bceSAndroid Build Coastguard Worker { \
1079*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].z(), c.in[1].swizzle(1, 2, 0)); \
1080*35238bceSAndroid Build Coastguard Worker } \
1081*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
1082*35238bceSAndroid Build Coastguard Worker { \
1083*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].z(), c.in[1].swizzle(3, 2, 1, 0)); \
1084*35238bceSAndroid Build Coastguard Worker }
1085*35238bceSAndroid Build Coastguard Worker
1086*35238bceSAndroid Build Coastguard Worker #define DECLARE_IVEC_INT_FUNCS(FUNC_NAME) \
1087*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c) \
1088*35238bceSAndroid Build Coastguard Worker { \
1089*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asInt(), (int)c.in[1].x()).asFloat(); \
1090*35238bceSAndroid Build Coastguard Worker } \
1091*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c) \
1092*35238bceSAndroid Build Coastguard Worker { \
1093*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(), (int)c.in[1].x()).asFloat(); \
1094*35238bceSAndroid Build Coastguard Worker } \
1095*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c) \
1096*35238bceSAndroid Build Coastguard Worker { \
1097*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(), (int)c.in[1].x()).asFloat(); \
1098*35238bceSAndroid Build Coastguard Worker }
1099*35238bceSAndroid Build Coastguard Worker
1100*35238bceSAndroid Build Coastguard Worker #define DECLARE_INT_IVEC_FUNCS(FUNC_NAME) \
1101*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c) \
1102*35238bceSAndroid Build Coastguard Worker { \
1103*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME((int)c.in[0].z(), c.in[1].swizzle(1, 0).asInt()).asFloat(); \
1104*35238bceSAndroid Build Coastguard Worker } \
1105*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c) \
1106*35238bceSAndroid Build Coastguard Worker { \
1107*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME((int)c.in[0].z(), c.in[1].swizzle(1, 2, 0).asInt()).asFloat(); \
1108*35238bceSAndroid Build Coastguard Worker } \
1109*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c) \
1110*35238bceSAndroid Build Coastguard Worker { \
1111*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME((int)c.in[0].z(), c.in[1].swizzle(3, 2, 1, 0).asInt()).asFloat(); \
1112*35238bceSAndroid Build Coastguard Worker }
1113*35238bceSAndroid Build Coastguard Worker
1114*35238bceSAndroid Build Coastguard Worker // Operators.
1115*35238bceSAndroid Build Coastguard Worker
1116*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(nop)
DECLARE_UNARY_GENTYPE_FUNCS(negate)1117*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(negate)
1118*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(addOne)
1119*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(subOne)
1120*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(add)
1121*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(sub)
1122*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(mul)
1123*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(div)
1124*35238bceSAndroid Build Coastguard Worker
1125*35238bceSAndroid Build Coastguard Worker void eval_selection_float(ShaderEvalContext &c)
1126*35238bceSAndroid Build Coastguard Worker {
1127*35238bceSAndroid Build Coastguard Worker c.color.x() = selection(c.in[0].z() > 0.0f, c.in[1].x(), c.in[2].y());
1128*35238bceSAndroid Build Coastguard Worker }
eval_selection_vec2(ShaderEvalContext & c)1129*35238bceSAndroid Build Coastguard Worker void eval_selection_vec2(ShaderEvalContext &c)
1130*35238bceSAndroid Build Coastguard Worker {
1131*35238bceSAndroid Build Coastguard Worker c.color.yz() = selection(c.in[0].z() > 0.0f, c.in[1].swizzle(1, 0), c.in[2].swizzle(2, 1));
1132*35238bceSAndroid Build Coastguard Worker }
eval_selection_vec3(ShaderEvalContext & c)1133*35238bceSAndroid Build Coastguard Worker void eval_selection_vec3(ShaderEvalContext &c)
1134*35238bceSAndroid Build Coastguard Worker {
1135*35238bceSAndroid Build Coastguard Worker c.color.xyz() = selection(c.in[0].z() > 0.0f, c.in[1].swizzle(1, 2, 0), c.in[2].swizzle(3, 1, 2));
1136*35238bceSAndroid Build Coastguard Worker }
eval_selection_vec4(ShaderEvalContext & c)1137*35238bceSAndroid Build Coastguard Worker void eval_selection_vec4(ShaderEvalContext &c)
1138*35238bceSAndroid Build Coastguard Worker {
1139*35238bceSAndroid Build Coastguard Worker c.color = selection(c.in[0].z() > 0.0f, c.in[1].swizzle(3, 2, 1, 0), c.in[2].swizzle(0, 3, 2, 1));
1140*35238bceSAndroid Build Coastguard Worker }
1141*35238bceSAndroid Build Coastguard Worker
1142*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(nop)
DECLARE_UNARY_INT_GENTYPE_FUNCS(negate)1143*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(negate)
1144*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(addOne)
1145*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(subOne)
1146*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(add)
1147*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(sub)
1148*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(mul)
1149*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(div)
1150*35238bceSAndroid Build Coastguard Worker
1151*35238bceSAndroid Build Coastguard Worker void eval_selection_int(ShaderEvalContext &c)
1152*35238bceSAndroid Build Coastguard Worker {
1153*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)selection(c.in[0].z() > 0.0f, (int)c.in[1].x(), (int)c.in[2].y());
1154*35238bceSAndroid Build Coastguard Worker }
eval_selection_ivec2(ShaderEvalContext & c)1155*35238bceSAndroid Build Coastguard Worker void eval_selection_ivec2(ShaderEvalContext &c)
1156*35238bceSAndroid Build Coastguard Worker {
1157*35238bceSAndroid Build Coastguard Worker c.color.yz() =
1158*35238bceSAndroid Build Coastguard Worker selection(c.in[0].z() > 0.0f, c.in[1].swizzle(1, 0).asInt(), c.in[2].swizzle(2, 1).asInt()).asFloat();
1159*35238bceSAndroid Build Coastguard Worker }
eval_selection_ivec3(ShaderEvalContext & c)1160*35238bceSAndroid Build Coastguard Worker void eval_selection_ivec3(ShaderEvalContext &c)
1161*35238bceSAndroid Build Coastguard Worker {
1162*35238bceSAndroid Build Coastguard Worker c.color.xyz() =
1163*35238bceSAndroid Build Coastguard Worker selection(c.in[0].z() > 0.0f, c.in[1].swizzle(1, 2, 0).asInt(), c.in[2].swizzle(3, 1, 2).asInt()).asFloat();
1164*35238bceSAndroid Build Coastguard Worker }
eval_selection_ivec4(ShaderEvalContext & c)1165*35238bceSAndroid Build Coastguard Worker void eval_selection_ivec4(ShaderEvalContext &c)
1166*35238bceSAndroid Build Coastguard Worker {
1167*35238bceSAndroid Build Coastguard Worker c.color = selection(c.in[0].z() > 0.0f, c.in[1].swizzle(3, 2, 1, 0).asInt(), c.in[2].swizzle(0, 3, 2, 1).asInt())
1168*35238bceSAndroid Build Coastguard Worker .asFloat();
1169*35238bceSAndroid Build Coastguard Worker }
1170*35238bceSAndroid Build Coastguard Worker
1171*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_BOOL_GENTYPE_FUNCS(boolNot)
DECLARE_BINARY_BOOL_FUNCS(logicalAnd)1172*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_BOOL_FUNCS(logicalAnd)
1173*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_BOOL_FUNCS(logicalOr)
1174*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_BOOL_FUNCS(logicalXor)
1175*35238bceSAndroid Build Coastguard Worker
1176*35238bceSAndroid Build Coastguard Worker void eval_selection_bool(ShaderEvalContext &c)
1177*35238bceSAndroid Build Coastguard Worker {
1178*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)selection(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f, c.in[2].y() > 0.0f);
1179*35238bceSAndroid Build Coastguard Worker }
eval_selection_bvec2(ShaderEvalContext & c)1180*35238bceSAndroid Build Coastguard Worker void eval_selection_bvec2(ShaderEvalContext &c)
1181*35238bceSAndroid Build Coastguard Worker {
1182*35238bceSAndroid Build Coastguard Worker c.color.yz() = selection(c.in[0].z() > 0.0f, greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f, 0.0f)),
1183*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[2].swizzle(2, 1), Vec2(0.0f, 0.0f)))
1184*35238bceSAndroid Build Coastguard Worker .asFloat();
1185*35238bceSAndroid Build Coastguard Worker }
eval_selection_bvec3(ShaderEvalContext & c)1186*35238bceSAndroid Build Coastguard Worker void eval_selection_bvec3(ShaderEvalContext &c)
1187*35238bceSAndroid Build Coastguard Worker {
1188*35238bceSAndroid Build Coastguard Worker c.color.xyz() = selection(c.in[0].z() > 0.0f, greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f, 0.0f, 0.0f)),
1189*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[2].swizzle(3, 1, 2), Vec3(0.0f, 0.0f, 0.0f)))
1190*35238bceSAndroid Build Coastguard Worker .asFloat();
1191*35238bceSAndroid Build Coastguard Worker }
eval_selection_bvec4(ShaderEvalContext & c)1192*35238bceSAndroid Build Coastguard Worker void eval_selection_bvec4(ShaderEvalContext &c)
1193*35238bceSAndroid Build Coastguard Worker {
1194*35238bceSAndroid Build Coastguard Worker c.color = selection(c.in[0].z() > 0.0f, greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f, 0.0f, 0.0f, 0.0f)),
1195*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f)))
1196*35238bceSAndroid Build Coastguard Worker .asFloat();
1197*35238bceSAndroid Build Coastguard Worker }
1198*35238bceSAndroid Build Coastguard Worker
1199*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(addVecScalar)
DECLARE_VEC_FLOAT_FUNCS(subVecScalar)1200*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(subVecScalar)
1201*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(mulVecScalar)
1202*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(divVecScalar)
1203*35238bceSAndroid Build Coastguard Worker
1204*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(addScalarVec)
1205*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(subScalarVec)
1206*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(mulScalarVec)
1207*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(divScalarVec)
1208*35238bceSAndroid Build Coastguard Worker
1209*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(addVecScalar)
1210*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(subVecScalar)
1211*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(mulVecScalar)
1212*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(divVecScalar)
1213*35238bceSAndroid Build Coastguard Worker
1214*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(addScalarVec)
1215*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(subScalarVec)
1216*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(mulScalarVec)
1217*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(divScalarVec)
1218*35238bceSAndroid Build Coastguard Worker
1219*35238bceSAndroid Build Coastguard Worker // Built-in functions.
1220*35238bceSAndroid Build Coastguard Worker
1221*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(radians)
1222*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(degrees)
1223*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(sin)
1224*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(cos)
1225*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(tan)
1226*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(asin)
1227*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(acos)
1228*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(atan)
1229*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(atan2)
1230*35238bceSAndroid Build Coastguard Worker
1231*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(pow)
1232*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(exp)
1233*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(log)
1234*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(exp2)
1235*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(log2)
1236*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(sqrt)
1237*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(inverseSqrt)
1238*35238bceSAndroid Build Coastguard Worker
1239*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(abs)
1240*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(sign)
1241*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(floor)
1242*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(ceil)
1243*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(fract)
1244*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(mod)
1245*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(modVecFloat)
1246*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(min)
1247*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(minVecFloat)
1248*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(max)
1249*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(maxVecFloat)
1250*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_GENTYPE_FUNCS(clamp)
1251*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FLOAT_FUNCS(clampVecFloatFloat)
1252*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_GENTYPE_FUNCS(mix)
1253*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_VEC_FLOAT_FUNCS(mixVecVecFloat)
1254*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(step)
1255*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(stepFloatVec)
1256*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_GENTYPE_FUNCS(smoothStep)
1257*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_FLOAT_VEC_FUNCS(smoothStepFloatFloatVec)
1258*35238bceSAndroid Build Coastguard Worker
1259*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_SCALAR_GENTYPE_FUNCS(length)
1260*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_SCALAR_GENTYPE_FUNCS(distance)
1261*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_SCALAR_GENTYPE_FUNCS(dot)
1262*35238bceSAndroid Build Coastguard Worker void eval_cross_vec3(ShaderEvalContext &c)
1263*35238bceSAndroid Build Coastguard Worker {
1264*35238bceSAndroid Build Coastguard Worker c.color.xyz() = cross(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0));
1265*35238bceSAndroid Build Coastguard Worker }
1266*35238bceSAndroid Build Coastguard Worker
1267*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(normalize)
DECLARE_TERNARY_GENTYPE_FUNCS(faceForward)1268*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_GENTYPE_FUNCS(faceForward)
1269*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(reflect)
1270*35238bceSAndroid Build Coastguard Worker
1271*35238bceSAndroid Build Coastguard Worker void eval_refract_float(ShaderEvalContext &c)
1272*35238bceSAndroid Build Coastguard Worker {
1273*35238bceSAndroid Build Coastguard Worker c.color.x() = refract(c.in[0].z(), c.in[1].x(), c.in[2].y());
1274*35238bceSAndroid Build Coastguard Worker }
eval_refract_vec2(ShaderEvalContext & c)1275*35238bceSAndroid Build Coastguard Worker void eval_refract_vec2(ShaderEvalContext &c)
1276*35238bceSAndroid Build Coastguard Worker {
1277*35238bceSAndroid Build Coastguard Worker c.color.yz() = refract(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0), c.in[2].y());
1278*35238bceSAndroid Build Coastguard Worker }
eval_refract_vec3(ShaderEvalContext & c)1279*35238bceSAndroid Build Coastguard Worker void eval_refract_vec3(ShaderEvalContext &c)
1280*35238bceSAndroid Build Coastguard Worker {
1281*35238bceSAndroid Build Coastguard Worker c.color.xyz() = refract(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0), c.in[2].y());
1282*35238bceSAndroid Build Coastguard Worker }
eval_refract_vec4(ShaderEvalContext & c)1283*35238bceSAndroid Build Coastguard Worker void eval_refract_vec4(ShaderEvalContext &c)
1284*35238bceSAndroid Build Coastguard Worker {
1285*35238bceSAndroid Build Coastguard Worker c.color = refract(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0), c.in[2].y());
1286*35238bceSAndroid Build Coastguard Worker }
1287*35238bceSAndroid Build Coastguard Worker
1288*35238bceSAndroid Build Coastguard Worker // Compare functions.
1289*35238bceSAndroid Build Coastguard Worker
1290*35238bceSAndroid Build Coastguard Worker #define DECLARE_FLOAT_COMPARE_FUNCS(FUNC_NAME) \
1291*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_float(ShaderEvalContext &c) \
1292*35238bceSAndroid Build Coastguard Worker { \
1293*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].z(), c.in[1].x()); \
1294*35238bceSAndroid Build Coastguard Worker } \
1295*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
1296*35238bceSAndroid Build Coastguard Worker { \
1297*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0)); \
1298*35238bceSAndroid Build Coastguard Worker } \
1299*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
1300*35238bceSAndroid Build Coastguard Worker { \
1301*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0)); \
1302*35238bceSAndroid Build Coastguard Worker } \
1303*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
1304*35238bceSAndroid Build Coastguard Worker { \
1305*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)); \
1306*35238bceSAndroid Build Coastguard Worker }
1307*35238bceSAndroid Build Coastguard Worker
1308*35238bceSAndroid Build Coastguard Worker #define DECLARE_FLOAT_CWISE_COMPARE_FUNCS(FUNC_NAME) \
1309*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_float(ShaderEvalContext &c) \
1310*35238bceSAndroid Build Coastguard Worker { \
1311*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].z(), c.in[1].x()); \
1312*35238bceSAndroid Build Coastguard Worker } \
1313*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c) \
1314*35238bceSAndroid Build Coastguard Worker { \
1315*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0)).asFloat(); \
1316*35238bceSAndroid Build Coastguard Worker } \
1317*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c) \
1318*35238bceSAndroid Build Coastguard Worker { \
1319*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0)).asFloat(); \
1320*35238bceSAndroid Build Coastguard Worker } \
1321*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c) \
1322*35238bceSAndroid Build Coastguard Worker { \
1323*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)).asFloat(); \
1324*35238bceSAndroid Build Coastguard Worker }
1325*35238bceSAndroid Build Coastguard Worker
1326*35238bceSAndroid Build Coastguard Worker #define DECLARE_INT_COMPARE_FUNCS(FUNC_NAME) \
1327*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_int(ShaderEvalContext &c) \
1328*35238bceSAndroid Build Coastguard Worker { \
1329*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].z()), chopToInt(c.in[1].x())); \
1330*35238bceSAndroid Build Coastguard Worker } \
1331*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c) \
1332*35238bceSAndroid Build Coastguard Worker { \
1333*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].swizzle(3, 1)), chopToInt(c.in[1].swizzle(1, 0))); \
1334*35238bceSAndroid Build Coastguard Worker } \
1335*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c) \
1336*35238bceSAndroid Build Coastguard Worker { \
1337*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].swizzle(2, 0, 1)), chopToInt(c.in[1].swizzle(1, 2, 0))); \
1338*35238bceSAndroid Build Coastguard Worker } \
1339*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c) \
1340*35238bceSAndroid Build Coastguard Worker { \
1341*35238bceSAndroid Build Coastguard Worker c.color.x() = \
1342*35238bceSAndroid Build Coastguard Worker (float)FUNC_NAME(chopToInt(c.in[0].swizzle(1, 2, 3, 0)), chopToInt(c.in[1].swizzle(3, 2, 1, 0))); \
1343*35238bceSAndroid Build Coastguard Worker }
1344*35238bceSAndroid Build Coastguard Worker
1345*35238bceSAndroid Build Coastguard Worker #define DECLARE_INT_CWISE_COMPARE_FUNCS(FUNC_NAME) \
1346*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_int(ShaderEvalContext &c) \
1347*35238bceSAndroid Build Coastguard Worker { \
1348*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].z()), chopToInt(c.in[1].x())); \
1349*35238bceSAndroid Build Coastguard Worker } \
1350*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c) \
1351*35238bceSAndroid Build Coastguard Worker { \
1352*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(chopToInt(c.in[0].swizzle(3, 1)), chopToInt(c.in[1].swizzle(1, 0))).asFloat(); \
1353*35238bceSAndroid Build Coastguard Worker } \
1354*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c) \
1355*35238bceSAndroid Build Coastguard Worker { \
1356*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(chopToInt(c.in[0].swizzle(2, 0, 1)), chopToInt(c.in[1].swizzle(1, 2, 0))).asFloat(); \
1357*35238bceSAndroid Build Coastguard Worker } \
1358*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c) \
1359*35238bceSAndroid Build Coastguard Worker { \
1360*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(chopToInt(c.in[0].swizzle(1, 2, 3, 0)), chopToInt(c.in[1].swizzle(3, 2, 1, 0))).asFloat(); \
1361*35238bceSAndroid Build Coastguard Worker }
1362*35238bceSAndroid Build Coastguard Worker
1363*35238bceSAndroid Build Coastguard Worker #define DECLARE_BOOL_COMPARE_FUNCS(FUNC_NAME) \
1364*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bool(ShaderEvalContext &c) \
1365*35238bceSAndroid Build Coastguard Worker { \
1366*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f); \
1367*35238bceSAndroid Build Coastguard Worker } \
1368*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec2(ShaderEvalContext &c) \
1369*35238bceSAndroid Build Coastguard Worker { \
1370*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)), \
1371*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f))); \
1372*35238bceSAndroid Build Coastguard Worker } \
1373*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec3(ShaderEvalContext &c) \
1374*35238bceSAndroid Build Coastguard Worker { \
1375*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)), \
1376*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f))); \
1377*35238bceSAndroid Build Coastguard Worker } \
1378*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec4(ShaderEvalContext &c) \
1379*35238bceSAndroid Build Coastguard Worker { \
1380*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)), \
1381*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f))); \
1382*35238bceSAndroid Build Coastguard Worker }
1383*35238bceSAndroid Build Coastguard Worker
1384*35238bceSAndroid Build Coastguard Worker #define DECLARE_BOOL_CWISE_COMPARE_FUNCS(FUNC_NAME) \
1385*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bool(ShaderEvalContext &c) \
1386*35238bceSAndroid Build Coastguard Worker { \
1387*35238bceSAndroid Build Coastguard Worker c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f); \
1388*35238bceSAndroid Build Coastguard Worker } \
1389*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec2(ShaderEvalContext &c) \
1390*35238bceSAndroid Build Coastguard Worker { \
1391*35238bceSAndroid Build Coastguard Worker c.color.yz() = \
1392*35238bceSAndroid Build Coastguard Worker FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)), greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f))) \
1393*35238bceSAndroid Build Coastguard Worker .asFloat(); \
1394*35238bceSAndroid Build Coastguard Worker } \
1395*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec3(ShaderEvalContext &c) \
1396*35238bceSAndroid Build Coastguard Worker { \
1397*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)), \
1398*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f))) \
1399*35238bceSAndroid Build Coastguard Worker .asFloat(); \
1400*35238bceSAndroid Build Coastguard Worker } \
1401*35238bceSAndroid Build Coastguard Worker void eval_##FUNC_NAME##_bvec4(ShaderEvalContext &c) \
1402*35238bceSAndroid Build Coastguard Worker { \
1403*35238bceSAndroid Build Coastguard Worker c.color = FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)), \
1404*35238bceSAndroid Build Coastguard Worker greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f))) \
1405*35238bceSAndroid Build Coastguard Worker .asFloat(); \
1406*35238bceSAndroid Build Coastguard Worker }
1407*35238bceSAndroid Build Coastguard Worker
1408*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_COMPARE_FUNCS(allEqual)
DECLARE_FLOAT_COMPARE_FUNCS(anyNotEqual)1409*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_COMPARE_FUNCS(anyNotEqual)
1410*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(lessThan)
1411*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(lessThanEqual)
1412*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(greaterThan)
1413*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(greaterThanEqual)
1414*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(equal)
1415*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(notEqual)
1416*35238bceSAndroid Build Coastguard Worker
1417*35238bceSAndroid Build Coastguard Worker DECLARE_INT_COMPARE_FUNCS(allEqual)
1418*35238bceSAndroid Build Coastguard Worker DECLARE_INT_COMPARE_FUNCS(anyNotEqual)
1419*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(lessThan)
1420*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(lessThanEqual)
1421*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(greaterThan)
1422*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(greaterThanEqual)
1423*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(equal)
1424*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(notEqual)
1425*35238bceSAndroid Build Coastguard Worker
1426*35238bceSAndroid Build Coastguard Worker DECLARE_BOOL_COMPARE_FUNCS(allEqual)
1427*35238bceSAndroid Build Coastguard Worker DECLARE_BOOL_COMPARE_FUNCS(anyNotEqual)
1428*35238bceSAndroid Build Coastguard Worker DECLARE_BOOL_CWISE_COMPARE_FUNCS(equal)
1429*35238bceSAndroid Build Coastguard Worker DECLARE_BOOL_CWISE_COMPARE_FUNCS(notEqual)
1430*35238bceSAndroid Build Coastguard Worker
1431*35238bceSAndroid Build Coastguard Worker // Boolean functions.
1432*35238bceSAndroid Build Coastguard Worker
1433*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_SCALAR_BVEC_FUNCS(GLSL_NAME, FUNC_NAME) \
1434*35238bceSAndroid Build Coastguard Worker void eval_##GLSL_NAME##_bvec2(ShaderEvalContext &c) \
1435*35238bceSAndroid Build Coastguard Worker { \
1436*35238bceSAndroid Build Coastguard Worker c.color.x() = float(FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)))); \
1437*35238bceSAndroid Build Coastguard Worker } \
1438*35238bceSAndroid Build Coastguard Worker void eval_##GLSL_NAME##_bvec3(ShaderEvalContext &c) \
1439*35238bceSAndroid Build Coastguard Worker { \
1440*35238bceSAndroid Build Coastguard Worker c.color.x() = float(FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)))); \
1441*35238bceSAndroid Build Coastguard Worker } \
1442*35238bceSAndroid Build Coastguard Worker void eval_##GLSL_NAME##_bvec4(ShaderEvalContext &c) \
1443*35238bceSAndroid Build Coastguard Worker { \
1444*35238bceSAndroid Build Coastguard Worker c.color.x() = float(FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)))); \
1445*35238bceSAndroid Build Coastguard Worker }
1446*35238bceSAndroid Build Coastguard Worker
1447*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_BVEC_BVEC_FUNCS(GLSL_NAME, FUNC_NAME) \
1448*35238bceSAndroid Build Coastguard Worker void eval_##GLSL_NAME##_bvec2(ShaderEvalContext &c) \
1449*35238bceSAndroid Build Coastguard Worker { \
1450*35238bceSAndroid Build Coastguard Worker c.color.yz() = FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f))).asFloat(); \
1451*35238bceSAndroid Build Coastguard Worker } \
1452*35238bceSAndroid Build Coastguard Worker void eval_##GLSL_NAME##_bvec3(ShaderEvalContext &c) \
1453*35238bceSAndroid Build Coastguard Worker { \
1454*35238bceSAndroid Build Coastguard Worker c.color.xyz() = FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f))).asFloat(); \
1455*35238bceSAndroid Build Coastguard Worker } \
1456*35238bceSAndroid Build Coastguard Worker void eval_##GLSL_NAME##_bvec4(ShaderEvalContext &c) \
1457*35238bceSAndroid Build Coastguard Worker { \
1458*35238bceSAndroid Build Coastguard Worker c.color.xyzw() = FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f))).asFloat(); \
1459*35238bceSAndroid Build Coastguard Worker }
1460*35238bceSAndroid Build Coastguard Worker
1461*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_SCALAR_BVEC_FUNCS(any, boolAny)
1462*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_SCALAR_BVEC_FUNCS(all, boolAll)
1463*35238bceSAndroid Build Coastguard Worker
1464*35238bceSAndroid Build Coastguard Worker void ShaderOperatorTests::init(void)
1465*35238bceSAndroid Build Coastguard Worker {
1466*35238bceSAndroid Build Coastguard Worker // Requisites:
1467*35238bceSAndroid Build Coastguard Worker // - input types (const, uniform, dynamic, mixture)
1468*35238bceSAndroid Build Coastguard Worker // - data types (bool, int, float, vecs, mats)
1469*35238bceSAndroid Build Coastguard Worker // -
1470*35238bceSAndroid Build Coastguard Worker // - complex expressions (\todo [petri] move to expressions?)
1471*35238bceSAndroid Build Coastguard Worker // * early-exit from side effects
1472*35238bceSAndroid Build Coastguard Worker // * precedence
1473*35238bceSAndroid Build Coastguard Worker
1474*35238bceSAndroid Build Coastguard Worker // unary plus, minus
1475*35238bceSAndroid Build Coastguard Worker // add, sub
1476*35238bceSAndroid Build Coastguard Worker // mul (larger range)
1477*35238bceSAndroid Build Coastguard Worker // div (div-by-zero)
1478*35238bceSAndroid Build Coastguard Worker // incr, decr (int only)
1479*35238bceSAndroid Build Coastguard Worker // relational
1480*35238bceSAndroid Build Coastguard Worker // equality
1481*35238bceSAndroid Build Coastguard Worker // logical
1482*35238bceSAndroid Build Coastguard Worker // selection
1483*35238bceSAndroid Build Coastguard Worker // assignment
1484*35238bceSAndroid Build Coastguard Worker // arithmetic assignment
1485*35238bceSAndroid Build Coastguard Worker
1486*35238bceSAndroid Build Coastguard Worker // parenthesis
1487*35238bceSAndroid Build Coastguard Worker // sequence
1488*35238bceSAndroid Build Coastguard Worker // subscript, function call, field selector/swizzler
1489*35238bceSAndroid Build Coastguard Worker
1490*35238bceSAndroid Build Coastguard Worker // precedence
1491*35238bceSAndroid Build Coastguard Worker // data types (float, int, bool, vecs, matrices)
1492*35238bceSAndroid Build Coastguard Worker
1493*35238bceSAndroid Build Coastguard Worker // TestCaseGroup* group = new TestCaseGroup(m_testCtx, "additive", "Additive operator tests.");
1494*35238bceSAndroid Build Coastguard Worker // addChild(group);
1495*35238bceSAndroid Build Coastguard Worker
1496*35238bceSAndroid Build Coastguard Worker // * * *
1497*35238bceSAndroid Build Coastguard Worker
1498*35238bceSAndroid Build Coastguard Worker // Built-in functions
1499*35238bceSAndroid Build Coastguard Worker // - precision, data types
1500*35238bceSAndroid Build Coastguard Worker
1501*35238bceSAndroid Build Coastguard Worker #define BOOL_FUNCS(FUNC_NAME) eval_##FUNC_NAME##_bool, DE_NULL, DE_NULL, DE_NULL
1502*35238bceSAndroid Build Coastguard Worker
1503*35238bceSAndroid Build Coastguard Worker #define FLOAT_VEC_FUNCS(FUNC_NAME) DE_NULL, eval_##FUNC_NAME##_vec2, eval_##FUNC_NAME##_vec3, eval_##FUNC_NAME##_vec4
1504*35238bceSAndroid Build Coastguard Worker #define INT_VEC_FUNCS(FUNC_NAME) DE_NULL, eval_##FUNC_NAME##_ivec2, eval_##FUNC_NAME##_ivec3, eval_##FUNC_NAME##_ivec4
1505*35238bceSAndroid Build Coastguard Worker #define BOOL_VEC_FUNCS(FUNC_NAME) DE_NULL, eval_##FUNC_NAME##_bvec2, eval_##FUNC_NAME##_bvec3, eval_##FUNC_NAME##_bvec4
1506*35238bceSAndroid Build Coastguard Worker
1507*35238bceSAndroid Build Coastguard Worker #define FLOAT_GENTYPE_FUNCS(FUNC_NAME) \
1508*35238bceSAndroid Build Coastguard Worker eval_##FUNC_NAME##_float, eval_##FUNC_NAME##_vec2, eval_##FUNC_NAME##_vec3, eval_##FUNC_NAME##_vec4
1509*35238bceSAndroid Build Coastguard Worker #define INT_GENTYPE_FUNCS(FUNC_NAME) \
1510*35238bceSAndroid Build Coastguard Worker eval_##FUNC_NAME##_int, eval_##FUNC_NAME##_ivec2, eval_##FUNC_NAME##_ivec3, eval_##FUNC_NAME##_ivec4
1511*35238bceSAndroid Build Coastguard Worker #define BOOL_GENTYPE_FUNCS(FUNC_NAME) \
1512*35238bceSAndroid Build Coastguard Worker eval_##FUNC_NAME##_bool, eval_##FUNC_NAME##_bvec2, eval_##FUNC_NAME##_bvec3, eval_##FUNC_NAME##_bvec4
1513*35238bceSAndroid Build Coastguard Worker
1514*35238bceSAndroid Build Coastguard Worker Value notUsed = Value(VALUE_NONE, 0.0f, 0.0f);
1515*35238bceSAndroid Build Coastguard Worker
1516*35238bceSAndroid Build Coastguard Worker std::vector<BuiltinFuncGroup> funcInfoGroups;
1517*35238bceSAndroid Build Coastguard Worker
1518*35238bceSAndroid Build Coastguard Worker // Unary operators.
1519*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(
1520*35238bceSAndroid Build Coastguard Worker BuiltinFuncGroup("unary_operator", "Unary operator tests")
1521*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("plus", "+", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.5f, PRECMASK_ALL,
1522*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(nop))
1523*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("plus", "+", IGT, Value(IGT, -5.0f, 5.0f), notUsed, notUsed, 0.1f, 0.5f, PRECMASK_ALL,
1524*35238bceSAndroid Build Coastguard Worker INT_GENTYPE_FUNCS(nop))
1525*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("minus", "-", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.5f, PRECMASK_ALL,
1526*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(negate))
1527*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("minus", "-", IGT, Value(IGT, -5.0f, 5.0f), notUsed, notUsed, 0.1f, 0.5f, PRECMASK_ALL,
1528*35238bceSAndroid Build Coastguard Worker INT_GENTYPE_FUNCS(negate))
1529*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("not", "!", B, Value(B, -1.0f, 1.0f), notUsed, notUsed, 1.0f, 0.0f, PRECMASK_NA,
1530*35238bceSAndroid Build Coastguard Worker eval_boolNot_bool, DE_NULL, DE_NULL, DE_NULL)
1531*35238bceSAndroid Build Coastguard Worker
1532*35238bceSAndroid Build Coastguard Worker // Pre/post incr/decr side effect cases.
1533*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("pre_increment_effect", "++", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f,
1534*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(addOne))
1535*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("pre_increment_effect", "++", IGT, Value(IGT, -6.0f, 4.0f), notUsed, notUsed, 0.1f,
1536*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(addOne))
1537*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("pre_decrement_effect", "--", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f,
1538*35238bceSAndroid Build Coastguard Worker 1.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(subOne))
1539*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("pre_decrement_effect", "--", IGT, Value(IGT, -4.0f, 6.0f), notUsed, notUsed, 0.1f,
1540*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(subOne))
1541*35238bceSAndroid Build Coastguard Worker << BuiltinPostSideEffOperInfo("post_increment_effect", "++", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f,
1542*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(addOne))
1543*35238bceSAndroid Build Coastguard Worker << BuiltinPostSideEffOperInfo("post_increment_effect", "++", IGT, Value(IGT, -6.0f, 4.0f), notUsed, notUsed,
1544*35238bceSAndroid Build Coastguard Worker 0.1f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(addOne))
1545*35238bceSAndroid Build Coastguard Worker << BuiltinPostSideEffOperInfo("post_decrement_effect", "--", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f,
1546*35238bceSAndroid Build Coastguard Worker 1.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(subOne))
1547*35238bceSAndroid Build Coastguard Worker << BuiltinPostSideEffOperInfo("post_decrement_effect", "--", IGT, Value(IGT, -4.0f, 6.0f), notUsed, notUsed,
1548*35238bceSAndroid Build Coastguard Worker 0.1f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(subOne))
1549*35238bceSAndroid Build Coastguard Worker
1550*35238bceSAndroid Build Coastguard Worker // Pre/post incr/decr result cases.
1551*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("pre_increment_result", "++", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.0f,
1552*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(addOne))
1553*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("pre_increment_result", "++", IGT, Value(IGT, -6.0f, 4.0f), notUsed, notUsed, 0.1f, 0.5f,
1554*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_GENTYPE_FUNCS(addOne))
1555*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("pre_decrement_result", "--", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 1.0f,
1556*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(subOne))
1557*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("pre_decrement_result", "--", IGT, Value(IGT, -4.0f, 6.0f), notUsed, notUsed, 0.1f, 0.5f,
1558*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_GENTYPE_FUNCS(subOne))
1559*35238bceSAndroid Build Coastguard Worker << BuiltinPostOperInfo("post_increment_result", "++", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.5f,
1560*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(nop))
1561*35238bceSAndroid Build Coastguard Worker << BuiltinPostOperInfo("post_increment_result", "++", IGT, Value(IGT, -5.0f, 5.0f), notUsed, notUsed, 0.1f,
1562*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(nop))
1563*35238bceSAndroid Build Coastguard Worker << BuiltinPostOperInfo("post_decrement_result", "--", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.5f,
1564*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(nop))
1565*35238bceSAndroid Build Coastguard Worker << BuiltinPostOperInfo("post_decrement_result", "--", IGT, Value(IGT, -5.0f, 5.0f), notUsed, notUsed, 0.1f,
1566*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(nop)));
1567*35238bceSAndroid Build Coastguard Worker
1568*35238bceSAndroid Build Coastguard Worker // Binary operators.
1569*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(
1570*35238bceSAndroid Build Coastguard Worker BuiltinFuncGroup("binary_operator", "Binary operator tests")
1571*35238bceSAndroid Build Coastguard Worker // Arithmetic operators.
1572*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add", "+", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1573*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(add))
1574*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add", "+", IGT, Value(IGT, -4.0f, 6.0f), Value(IGT, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1575*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_GENTYPE_FUNCS(add))
1576*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add", "+", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1577*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(addVecScalar))
1578*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add", "+", IV, Value(IV, -4.0f, 6.0f), Value(I, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1579*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(addVecScalar))
1580*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add", "+", FV, Value(F, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1581*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(addScalarVec))
1582*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add", "+", IV, Value(I, -4.0f, 6.0f), Value(IV, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1583*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(addScalarVec))
1584*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub", "-", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1585*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(sub))
1586*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub", "-", IGT, Value(IGT, -4.0f, 6.0f), Value(IGT, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1587*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_GENTYPE_FUNCS(sub))
1588*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub", "-", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1589*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(subVecScalar))
1590*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub", "-", IV, Value(IV, -4.0f, 6.0f), Value(I, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1591*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(subVecScalar))
1592*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub", "-", FV, Value(F, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1593*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(subScalarVec))
1594*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub", "-", IV, Value(I, -4.0f, 6.0f), Value(IV, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1595*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(subScalarVec))
1596*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul", "*", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1597*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(mul))
1598*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul", "*", IGT, Value(IGT, -4.0f, 6.0f), Value(IGT, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1599*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_GENTYPE_FUNCS(mul))
1600*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul", "*", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1601*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(mulVecScalar))
1602*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul", "*", IV, Value(IV, -4.0f, 6.0f), Value(I, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1603*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(mulVecScalar))
1604*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul", "*", FV, Value(F, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1605*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(mulScalarVec))
1606*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul", "*", IV, Value(I, -4.0f, 6.0f), Value(IV, -6.0f, 5.0f), notUsed, 0.1f, 0.5f,
1607*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(mulScalarVec))
1608*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div", "/", GT, Value(GT, -1.0f, 1.0f), Value(GT, -2.0f, -0.5f), notUsed, 1.0f, 0.0f,
1609*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(div))
1610*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div", "/", IGT, Value(IGT, 24.0f, 24.0f), Value(IGT, -4.0f, -1.0f), notUsed, 0.04f, 1.0f,
1611*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_GENTYPE_FUNCS(div))
1612*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div", "/", FV, Value(FV, -1.0f, 1.0f), Value(F, -2.0f, -0.5f), notUsed, 1.0f, 0.0f,
1613*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(divVecScalar))
1614*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div", "/", IV, Value(IV, 24.0f, 24.0f), Value(I, -4.0f, -1.0f), notUsed, 0.04f, 1.0f,
1615*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(divVecScalar))
1616*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div", "/", FV, Value(F, -1.0f, 1.0f), Value(FV, -2.0f, -0.5f), notUsed, 1.0f, 0.0f,
1617*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(divScalarVec))
1618*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div", "/", IV, Value(I, 24.0f, 24.0f), Value(IV, -4.0f, -1.0f), notUsed, 0.04f, 1.0f,
1619*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(divScalarVec))
1620*35238bceSAndroid Build Coastguard Worker
1621*35238bceSAndroid Build Coastguard Worker // Arithmetic assignment side effect cases.
1622*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("add_assign_effect", "+=", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f),
1623*35238bceSAndroid Build Coastguard Worker notUsed, 0.25f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(add))
1624*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("add_assign_effect", "+=", IGT, Value(IGT, -5.0f, 5.0f), Value(IGT, -5.0f, 5.0f),
1625*35238bceSAndroid Build Coastguard Worker notUsed, 0.05f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(add))
1626*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("add_assign_effect", "+=", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed,
1627*35238bceSAndroid Build Coastguard Worker 0.25f, 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(addVecScalar))
1628*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("add_assign_effect", "+=", IV, Value(IV, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed,
1629*35238bceSAndroid Build Coastguard Worker 0.05f, 0.5f, PRECMASK_ALL, INT_VEC_FUNCS(addVecScalar))
1630*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("sub_assign_effect", "-=", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f),
1631*35238bceSAndroid Build Coastguard Worker notUsed, 0.25f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(sub))
1632*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("sub_assign_effect", "-=", IGT, Value(IGT, -5.0f, 5.0f), Value(IGT, -5.0f, 5.0f),
1633*35238bceSAndroid Build Coastguard Worker notUsed, 0.05f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(sub))
1634*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("sub_assign_effect", "-=", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed,
1635*35238bceSAndroid Build Coastguard Worker 0.25f, 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(subVecScalar))
1636*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("sub_assign_effect", "-=", IV, Value(IV, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed,
1637*35238bceSAndroid Build Coastguard Worker 0.05f, 0.5f, PRECMASK_ALL, INT_VEC_FUNCS(subVecScalar))
1638*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("mul_assign_effect", "*=", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f),
1639*35238bceSAndroid Build Coastguard Worker notUsed, 0.5f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(mul))
1640*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("mul_assign_effect", "*=", IGT, Value(IGT, -4.0f, 4.0f), Value(IGT, -4.0f, 4.0f),
1641*35238bceSAndroid Build Coastguard Worker notUsed, 0.03f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(mul))
1642*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("mul_assign_effect", "*=", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed,
1643*35238bceSAndroid Build Coastguard Worker 0.5f, 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(mulVecScalar))
1644*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("mul_assign_effect", "*=", IV, Value(IV, -4.0f, 4.0f), Value(I, -4.0f, 4.0f), notUsed,
1645*35238bceSAndroid Build Coastguard Worker 0.03f, 0.5f, PRECMASK_ALL, INT_VEC_FUNCS(mulVecScalar))
1646*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("div_assign_effect", "/=", GT, Value(GT, -1.0f, 1.0f), Value(GT, -2.0f, -0.5f),
1647*35238bceSAndroid Build Coastguard Worker notUsed, 0.25f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(div))
1648*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("div_assign_effect", "/=", IGT, Value(IGT, 24.0f, 24.0f), Value(IGT, -4.0f, -1.0f),
1649*35238bceSAndroid Build Coastguard Worker notUsed, 0.04f, 1.0f, PRECMASK_ALL, INT_GENTYPE_FUNCS(div))
1650*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("div_assign_effect", "/=", FV, Value(FV, -1.0f, 1.0f), Value(F, -2.0f, -0.5f),
1651*35238bceSAndroid Build Coastguard Worker notUsed, 0.25f, 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(divVecScalar))
1652*35238bceSAndroid Build Coastguard Worker << BuiltinSideEffOperInfo("div_assign_effect", "/=", IV, Value(IV, 24.0f, 24.0f), Value(I, -4.0f, -1.0f),
1653*35238bceSAndroid Build Coastguard Worker notUsed, 0.04f, 1.0f, PRECMASK_ALL, INT_VEC_FUNCS(divVecScalar))
1654*35238bceSAndroid Build Coastguard Worker
1655*35238bceSAndroid Build Coastguard Worker // Arithmetic assignment result cases.
1656*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add_assign_result", "+=", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed,
1657*35238bceSAndroid Build Coastguard Worker 0.25f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(add))
1658*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add_assign_result", "+=", IGT, Value(IGT, -5.0f, 5.0f), Value(IGT, -5.0f, 5.0f), notUsed,
1659*35238bceSAndroid Build Coastguard Worker 0.05f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(add))
1660*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add_assign_result", "+=", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 0.25f,
1661*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(addVecScalar))
1662*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("add_assign_result", "+=", IV, Value(IV, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 0.05f,
1663*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, INT_VEC_FUNCS(addVecScalar))
1664*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub_assign_result", "-=", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed,
1665*35238bceSAndroid Build Coastguard Worker 0.25f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(sub))
1666*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub_assign_result", "-=", IGT, Value(IGT, -5.0f, 5.0f), Value(IGT, -5.0f, 5.0f), notUsed,
1667*35238bceSAndroid Build Coastguard Worker 0.05f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(sub))
1668*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub_assign_result", "-=", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 0.25f,
1669*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(subVecScalar))
1670*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("sub_assign_result", "-=", IV, Value(IV, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 0.05f,
1671*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, INT_VEC_FUNCS(subVecScalar))
1672*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul_assign_result", "*=", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 0.5f,
1673*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(mul))
1674*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul_assign_result", "*=", IGT, Value(IGT, -4.0f, 4.0f), Value(IGT, -4.0f, 4.0f), notUsed,
1675*35238bceSAndroid Build Coastguard Worker 0.03f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(mul))
1676*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul_assign_result", "*=", FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 0.5f,
1677*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(mulVecScalar))
1678*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("mul_assign_result", "*=", IV, Value(IV, -4.0f, 4.0f), Value(I, -4.0f, 4.0f), notUsed, 0.03f,
1679*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, INT_VEC_FUNCS(mulVecScalar))
1680*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div_assign_result", "/=", GT, Value(GT, -1.0f, 1.0f), Value(GT, -2.0f, -0.5f), notUsed,
1681*35238bceSAndroid Build Coastguard Worker 0.25f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(div))
1682*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div_assign_result", "/=", IGT, Value(IGT, 24.0f, 24.0f), Value(IGT, -4.0f, -1.0f), notUsed,
1683*35238bceSAndroid Build Coastguard Worker 0.04f, 1.0f, PRECMASK_ALL, INT_GENTYPE_FUNCS(div))
1684*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div_assign_result", "/=", FV, Value(FV, -1.0f, 1.0f), Value(F, -2.0f, -0.5f), notUsed,
1685*35238bceSAndroid Build Coastguard Worker 0.25f, 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(divVecScalar))
1686*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("div_assign_result", "/=", IV, Value(IV, 24.0f, 24.0f), Value(I, -4.0f, -1.0f), notUsed,
1687*35238bceSAndroid Build Coastguard Worker 0.04f, 1.0f, PRECMASK_ALL, INT_VEC_FUNCS(divVecScalar))
1688*35238bceSAndroid Build Coastguard Worker
1689*35238bceSAndroid Build Coastguard Worker // Scalar relational operators.
1690*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("less", "<", B, Value(F, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1691*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, eval_lessThan_float, DE_NULL, DE_NULL, DE_NULL)
1692*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("less", "<", B, Value(I, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 1.0f, 0.0f,
1693*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, eval_lessThan_int, DE_NULL, DE_NULL, DE_NULL)
1694*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("less_or_equal", "<=", B, Value(F, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1695*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, eval_lessThanEqual_float, DE_NULL, DE_NULL, DE_NULL)
1696*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("less_or_equal", "<=", B, Value(I, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 1.0f, 0.0f,
1697*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, eval_lessThanEqual_int, DE_NULL, DE_NULL, DE_NULL)
1698*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("greater", ">", B, Value(F, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1699*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, eval_greaterThan_float, DE_NULL, DE_NULL, DE_NULL)
1700*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("greater", ">", B, Value(I, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 1.0f, 0.0f,
1701*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, eval_greaterThan_int, DE_NULL, DE_NULL, DE_NULL)
1702*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("greater_or_equal", ">=", B, Value(F, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f,
1703*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_ALL, eval_greaterThanEqual_float, DE_NULL, DE_NULL, DE_NULL)
1704*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("greater_or_equal", ">=", B, Value(I, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 1.0f,
1705*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_ALL, eval_greaterThanEqual_int, DE_NULL, DE_NULL, DE_NULL)
1706*35238bceSAndroid Build Coastguard Worker
1707*35238bceSAndroid Build Coastguard Worker // Equality comparison operators.
1708*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("equal", "==", B, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1709*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(allEqual))
1710*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("equal", "==", B, Value(IGT, -5.5f, 4.7f), Value(IGT, -4.9f, 5.8f), notUsed, 1.0f, 0.0f,
1711*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_GENTYPE_FUNCS(allEqual))
1712*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("equal", "==", B, Value(BGT, -2.1f, 2.1f), Value(BGT, -1.1f, 3.0f), notUsed, 1.0f, 0.0f,
1713*35238bceSAndroid Build Coastguard Worker PRECMASK_NA, BOOL_GENTYPE_FUNCS(allEqual))
1714*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("not_equal", "!=", B, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1715*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(anyNotEqual))
1716*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("not_equal", "!=", B, Value(IGT, -5.5f, 4.7f), Value(IGT, -4.9f, 5.8f), notUsed, 1.0f, 0.0f,
1717*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_GENTYPE_FUNCS(anyNotEqual))
1718*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("not_equal", "!=", B, Value(BGT, -2.1f, 2.1f), Value(BGT, -1.1f, 3.0f), notUsed, 1.0f, 0.0f,
1719*35238bceSAndroid Build Coastguard Worker PRECMASK_NA, BOOL_GENTYPE_FUNCS(anyNotEqual))
1720*35238bceSAndroid Build Coastguard Worker
1721*35238bceSAndroid Build Coastguard Worker // Logical operators.
1722*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("logical_and", "&&", B, Value(B, -1.0f, 1.0f), Value(B, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1723*35238bceSAndroid Build Coastguard Worker PRECMASK_NA, BOOL_FUNCS(logicalAnd))
1724*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("logical_or", "||", B, Value(B, -1.0f, 1.0f), Value(B, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1725*35238bceSAndroid Build Coastguard Worker PRECMASK_NA, BOOL_FUNCS(logicalOr))
1726*35238bceSAndroid Build Coastguard Worker << BuiltinOperInfo("logical_xor", "^^", B, Value(B, -1.0f, 1.0f), Value(B, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1727*35238bceSAndroid Build Coastguard Worker PRECMASK_NA, BOOL_FUNCS(logicalXor)));
1728*35238bceSAndroid Build Coastguard Worker
1729*35238bceSAndroid Build Coastguard Worker // 8.1 Angle and Trigonometry Functions.
1730*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(BuiltinFuncGroup("angle_and_trigonometry", "Angle and trigonometry function tests.")
1731*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("radians", "radians", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed,
1732*35238bceSAndroid Build Coastguard Worker 25.0f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(radians))
1733*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("degrees", "degrees", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed,
1734*35238bceSAndroid Build Coastguard Worker 0.04f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(degrees))
1735*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("sin", "sin", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f, 0.5f,
1736*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(sin))
1737*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("sin", "sin", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.5f, 0.5f,
1738*35238bceSAndroid Build Coastguard Worker PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(sin))
1739*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("cos", "cos", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f, 0.5f,
1740*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(cos))
1741*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("cos", "cos", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.5f, 0.5f,
1742*35238bceSAndroid Build Coastguard Worker PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(cos))
1743*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("tan", "tan", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f, 0.5f,
1744*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(tan))
1745*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("tan", "tan", GT, Value(GT, -1.5f, 5.5f), notUsed, notUsed, 0.5f, 0.5f,
1746*35238bceSAndroid Build Coastguard Worker PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(tan))
1747*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("asin", "asin", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 1.0f,
1748*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(asin))
1749*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("acos", "acos", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 1.0f,
1750*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(acos))
1751*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("atan", "atan", GT, Value(GT, -4.0f, 4.0f), notUsed, notUsed, 0.5f,
1752*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(atan))
1753*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("atan2", "atan", GT, Value(GT, -4.0f, 4.0f), Value(GT, 0.5f, 2.0f),
1754*35238bceSAndroid Build Coastguard Worker notUsed, 0.5f, 0.5f, PRECMASK_MEDIUMP_HIGHP,
1755*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(atan2)));
1756*35238bceSAndroid Build Coastguard Worker
1757*35238bceSAndroid Build Coastguard Worker // 8.2 Exponential Functions.
1758*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(BuiltinFuncGroup("exponential", "Exponential function tests")
1759*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("pow", "pow", GT, Value(GT, 0.1f, 8.0f), Value(GT, -4.0f, 2.0f),
1760*35238bceSAndroid Build Coastguard Worker notUsed, 1.0f, 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(pow))
1761*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("exp", "exp", GT, Value(GT, -6.0f, 3.0f), notUsed, notUsed, 0.5f, 0.0f,
1762*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(exp))
1763*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("log", "log", GT, Value(GT, 0.1f, 10.0f), notUsed, notUsed, 0.5f, 0.3f,
1764*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(log))
1765*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("exp2", "exp2", GT, Value(GT, -7.0f, 2.0f), notUsed, notUsed, 1.0f,
1766*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(exp2))
1767*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("log2", "log2", GT, Value(GT, 0.1f, 10.0f), notUsed, notUsed, 1.0f,
1768*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(log2))
1769*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("sqrt", "sqrt", GT, Value(GT, 0.0f, 10.0f), notUsed, notUsed, 0.3f,
1770*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(sqrt))
1771*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("inversesqrt", "inversesqrt", GT, Value(GT, 0.5f, 10.0f), notUsed,
1772*35238bceSAndroid Build Coastguard Worker notUsed, 1.0f, 0.0f, PRECMASK_MEDIUMP_HIGHP,
1773*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(inverseSqrt)));
1774*35238bceSAndroid Build Coastguard Worker
1775*35238bceSAndroid Build Coastguard Worker // 8.3 Common Functions.
1776*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(
1777*35238bceSAndroid Build Coastguard Worker BuiltinFuncGroup("common_functions", "Common function tests.")
1778*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("abs", "abs", GT, Value(GT, -2.0f, 2.0f), notUsed, notUsed, 0.5f, 0.5f, PRECMASK_ALL,
1779*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(abs))
1780*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("sign", "sign", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.3f, 0.5f, PRECMASK_ALL,
1781*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(sign))
1782*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("floor", "floor", GT, Value(GT, -2.5f, 2.5f), notUsed, notUsed, 0.2f, 0.7f, PRECMASK_ALL,
1783*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(floor))
1784*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("ceil", "ceil", GT, Value(GT, -2.5f, 2.5f), notUsed, notUsed, 0.2f, 0.5f, PRECMASK_ALL,
1785*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(ceil))
1786*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("fract", "fract", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.8f, 0.1f, PRECMASK_ALL,
1787*35238bceSAndroid Build Coastguard Worker FLOAT_GENTYPE_FUNCS(fract))
1788*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("mod", "mod", GT, Value(GT, -2.0f, 2.0f), Value(GT, 0.9f, 6.0f), notUsed, 0.5f, 0.5f,
1789*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(mod))
1790*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("mod", "mod", GT, Value(FV, -2.0f, 2.0f), Value(F, 0.9f, 6.0f), notUsed, 0.5f, 0.5f,
1791*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_VEC_FUNCS(modVecFloat))
1792*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("min", "min", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 0.5f, 0.5f,
1793*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(min))
1794*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("min", "min", GT, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 0.5f, 0.5f,
1795*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(minVecFloat))
1796*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("max", "max", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 0.5f, 0.5f,
1797*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(max))
1798*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("max", "max", GT, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 0.5f, 0.5f,
1799*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(maxVecFloat))
1800*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("clamp", "clamp", GT, Value(GT, -1.0f, 1.0f), Value(GT, -0.5f, 0.5f), Value(GT, 0.5f, 1.0f),
1801*35238bceSAndroid Build Coastguard Worker 0.5f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(clamp))
1802*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("clamp", "clamp", GT, Value(FV, -1.0f, 1.0f), Value(F, -0.5f, 0.5f), Value(F, 0.5f, 1.0f),
1803*35238bceSAndroid Build Coastguard Worker 0.5f, 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(clampVecFloatFloat))
1804*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("mix", "mix", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), Value(GT, 0.0f, 1.0f),
1805*35238bceSAndroid Build Coastguard Worker 0.5f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(mix))
1806*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("mix", "mix", GT, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), Value(F, 0.0f, 1.0f), 0.5f,
1807*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(mixVecVecFloat))
1808*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("step", "step", GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 0.0f), notUsed, 0.5f, 0.25f,
1809*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(step))
1810*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("step", "step", GT, Value(F, -1.0f, 1.0f), Value(FV, -1.0f, 0.0f), notUsed, 0.5f, 0.25f,
1811*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(stepFloatVec))
1812*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("smoothstep", "smoothstep", GT, Value(GT, -0.5f, 0.0f), Value(GT, 0.1f, 1.0f),
1813*35238bceSAndroid Build Coastguard Worker Value(GT, -1.0f, 1.0f), 0.5f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(smoothStep))
1814*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("smoothstep", "smoothstep", GT, Value(F, -0.5f, 0.0f), Value(F, 0.1f, 1.0f),
1815*35238bceSAndroid Build Coastguard Worker Value(FV, -1.0f, 1.0f), 0.5f, 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(smoothStepFloatFloatVec)));
1816*35238bceSAndroid Build Coastguard Worker
1817*35238bceSAndroid Build Coastguard Worker // 8.4 Geometric Functions.
1818*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(
1819*35238bceSAndroid Build Coastguard Worker BuiltinFuncGroup("geometric", "Geometric function tests.")
1820*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("length", "length", F, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.1f, 0.5f,
1821*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(length))
1822*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("distance", "distance", F, Value(GT, -5.0f, 5.0f), Value(GT, -5.0f, 5.0f), notUsed, 0.1f,
1823*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(distance))
1824*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("dot", "dot", F, Value(GT, -5.0f, 5.0f), Value(GT, -5.0f, 5.0f), notUsed, 0.1f, 0.5f,
1825*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(dot))
1826*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("cross", "cross", V3, Value(GT, -5.0f, 5.0f), Value(GT, -5.0f, 5.0f), notUsed, 0.1f, 0.5f,
1827*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, DE_NULL, DE_NULL, eval_cross_vec3, DE_NULL)
1828*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("normalize", "normalize", GT, Value(GT, 0.1f, 4.0f), notUsed, notUsed, 0.5f, 0.5f,
1829*35238bceSAndroid Build Coastguard Worker PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(normalize))
1830*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("faceforward", "faceforward", GT, Value(GT, -5.0f, 5.0f), Value(GT, -5.0f, 5.0f),
1831*35238bceSAndroid Build Coastguard Worker Value(GT, -1.0f, 1.0f), 0.5f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(faceForward))
1832*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("reflect", "reflect", GT, Value(GT, -0.8f, -0.5f), Value(GT, 0.5f, 0.8f), notUsed, 0.5f,
1833*35238bceSAndroid Build Coastguard Worker 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(reflect))
1834*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("refract", "refract", GT, Value(GT, -0.8f, 1.2f), Value(GT, -1.1f, 0.5f),
1835*35238bceSAndroid Build Coastguard Worker Value(F, 0.2f, 1.5f), 0.5f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(refract)));
1836*35238bceSAndroid Build Coastguard Worker
1837*35238bceSAndroid Build Coastguard Worker // 8.5 Matrix Functions.
1838*35238bceSAndroid Build Coastguard Worker // separate matrix tests?
1839*35238bceSAndroid Build Coastguard Worker // funcInfoGroups.push_back(
1840*35238bceSAndroid Build Coastguard Worker // BuiltinFuncGroup("matrix", "Matrix function tests.")
1841*35238bceSAndroid Build Coastguard Worker // << BuiltinFuncInfo("matrixCompMult", "matrixCompMult", M, ... )
1842*35238bceSAndroid Build Coastguard Worker // );
1843*35238bceSAndroid Build Coastguard Worker
1844*35238bceSAndroid Build Coastguard Worker // 8.6 Vector Relational Functions.
1845*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(
1846*35238bceSAndroid Build Coastguard Worker BuiltinFuncGroup("float_compare", "Floating point comparison tests.")
1847*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("lessThan", "lessThan", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed, 1.0f,
1848*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(lessThan))
1849*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("lessThanEqual", "lessThanEqual", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f),
1850*35238bceSAndroid Build Coastguard Worker notUsed, 1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(lessThanEqual))
1851*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("greaterThan", "greaterThan", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed,
1852*35238bceSAndroid Build Coastguard Worker 1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(greaterThan))
1853*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("greaterThanEqual", "greaterThanEqual", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f),
1854*35238bceSAndroid Build Coastguard Worker notUsed, 1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(greaterThanEqual))
1855*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("equal", "equal", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
1856*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, FLOAT_VEC_FUNCS(equal))
1857*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("notEqual", "notEqual", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed, 1.0f,
1858*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(notEqual)));
1859*35238bceSAndroid Build Coastguard Worker
1860*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(
1861*35238bceSAndroid Build Coastguard Worker BuiltinFuncGroup("int_compare", "Integer comparison tests.")
1862*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("lessThan", "lessThan", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f), notUsed, 1.0f,
1863*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_ALL, INT_VEC_FUNCS(lessThan))
1864*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("lessThanEqual", "lessThanEqual", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f),
1865*35238bceSAndroid Build Coastguard Worker notUsed, 1.0f, 0.0f, PRECMASK_ALL, INT_VEC_FUNCS(lessThanEqual))
1866*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("greaterThan", "greaterThan", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f), notUsed,
1867*35238bceSAndroid Build Coastguard Worker 1.0f, 0.0f, PRECMASK_ALL, INT_VEC_FUNCS(greaterThan))
1868*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("greaterThanEqual", "greaterThanEqual", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f),
1869*35238bceSAndroid Build Coastguard Worker notUsed, 1.0f, 0.0f, PRECMASK_ALL, INT_VEC_FUNCS(greaterThanEqual))
1870*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("equal", "equal", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f), notUsed, 1.0f, 0.0f,
1871*35238bceSAndroid Build Coastguard Worker PRECMASK_ALL, INT_VEC_FUNCS(equal))
1872*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("notEqual", "notEqual", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f), notUsed, 1.0f,
1873*35238bceSAndroid Build Coastguard Worker 0.0f, PRECMASK_ALL, INT_VEC_FUNCS(notEqual)));
1874*35238bceSAndroid Build Coastguard Worker
1875*35238bceSAndroid Build Coastguard Worker funcInfoGroups.push_back(BuiltinFuncGroup("bool_compare", "Boolean comparison tests.")
1876*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("equal", "equal", BV, Value(BV, -5.2f, 4.9f), Value(BV, -5.0f, 5.0f),
1877*35238bceSAndroid Build Coastguard Worker notUsed, 1.0f, 0.0f, PRECMASK_NA, BOOL_VEC_FUNCS(equal))
1878*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("notEqual", "notEqual", BV, Value(BV, -5.2f, 4.9f),
1879*35238bceSAndroid Build Coastguard Worker Value(BV, -5.0f, 5.0f), notUsed, 1.0f, 0.0f, PRECMASK_NA,
1880*35238bceSAndroid Build Coastguard Worker BOOL_VEC_FUNCS(notEqual))
1881*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("any", "any", B, Value(BV, -1.0f, 0.3f), notUsed, notUsed, 1.0f, 0.0f,
1882*35238bceSAndroid Build Coastguard Worker PRECMASK_NA, BOOL_VEC_FUNCS(any))
1883*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("all", "all", B, Value(BV, -0.3f, 1.0f), notUsed, notUsed, 1.0f, 0.0f,
1884*35238bceSAndroid Build Coastguard Worker PRECMASK_NA, BOOL_VEC_FUNCS(all))
1885*35238bceSAndroid Build Coastguard Worker << BuiltinFuncInfo("not", "not", BV, Value(BV, -1.0f, 1.0f), notUsed, notUsed, 1.0f, 0.0f,
1886*35238bceSAndroid Build Coastguard Worker PRECMASK_NA, BOOL_VEC_FUNCS(boolNot)));
1887*35238bceSAndroid Build Coastguard Worker
1888*35238bceSAndroid Build Coastguard Worker // 8.7 Texture Lookup Functions
1889*35238bceSAndroid Build Coastguard Worker // texture2D (sampler, vec2)
1890*35238bceSAndroid Build Coastguard Worker // texture2D (sampler, vec2, bias)
1891*35238bceSAndroid Build Coastguard Worker // texture2DProj (sampler, vec3)
1892*35238bceSAndroid Build Coastguard Worker // texture2DProj (sampler, vec3, bias)
1893*35238bceSAndroid Build Coastguard Worker // texture2DProj (sampler, vec4)
1894*35238bceSAndroid Build Coastguard Worker // texture2DProj (sampler, vec4, bias)
1895*35238bceSAndroid Build Coastguard Worker // texture2DLod (sampler, vec2, lod)
1896*35238bceSAndroid Build Coastguard Worker // texture2DProjLod (sampler, vec3, lod)
1897*35238bceSAndroid Build Coastguard Worker // texture2DProjLod (sampler, vec4, lod)
1898*35238bceSAndroid Build Coastguard Worker // textureCube (sampler, vec3)
1899*35238bceSAndroid Build Coastguard Worker // textureCube (sampler, vec3, bias)
1900*35238bceSAndroid Build Coastguard Worker // textureCubeLod (sampler, vec3, lod)
1901*35238bceSAndroid Build Coastguard Worker
1902*35238bceSAndroid Build Coastguard Worker static const ShaderType s_shaderTypes[] = {SHADERTYPE_VERTEX, SHADERTYPE_FRAGMENT};
1903*35238bceSAndroid Build Coastguard Worker
1904*35238bceSAndroid Build Coastguard Worker static const DataType s_floatTypes[] = {TYPE_FLOAT, TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC4};
1905*35238bceSAndroid Build Coastguard Worker
1906*35238bceSAndroid Build Coastguard Worker static const DataType s_intTypes[] = {TYPE_INT, TYPE_INT_VEC2, TYPE_INT_VEC3, TYPE_INT_VEC4};
1907*35238bceSAndroid Build Coastguard Worker
1908*35238bceSAndroid Build Coastguard Worker static const DataType s_boolTypes[] = {TYPE_BOOL, TYPE_BOOL_VEC2, TYPE_BOOL_VEC3, TYPE_BOOL_VEC4};
1909*35238bceSAndroid Build Coastguard Worker
1910*35238bceSAndroid Build Coastguard Worker for (int outerGroupNdx = 0; outerGroupNdx < (int)funcInfoGroups.size(); outerGroupNdx++)
1911*35238bceSAndroid Build Coastguard Worker {
1912*35238bceSAndroid Build Coastguard Worker // Create outer group.
1913*35238bceSAndroid Build Coastguard Worker const BuiltinFuncGroup &outerGroupInfo = funcInfoGroups[outerGroupNdx];
1914*35238bceSAndroid Build Coastguard Worker TestCaseGroup *outerGroup = new TestCaseGroup(m_context, outerGroupInfo.name, outerGroupInfo.description);
1915*35238bceSAndroid Build Coastguard Worker addChild(outerGroup);
1916*35238bceSAndroid Build Coastguard Worker
1917*35238bceSAndroid Build Coastguard Worker // Only create new group if name differs from previous one.
1918*35238bceSAndroid Build Coastguard Worker TestCaseGroup *innerGroup = DE_NULL;
1919*35238bceSAndroid Build Coastguard Worker
1920*35238bceSAndroid Build Coastguard Worker for (int funcInfoNdx = 0; funcInfoNdx < (int)outerGroupInfo.funcInfos.size(); funcInfoNdx++)
1921*35238bceSAndroid Build Coastguard Worker {
1922*35238bceSAndroid Build Coastguard Worker const BuiltinFuncInfo &funcInfo = outerGroupInfo.funcInfos[funcInfoNdx];
1923*35238bceSAndroid Build Coastguard Worker const char *shaderFuncName = funcInfo.shaderFuncName;
1924*35238bceSAndroid Build Coastguard Worker bool isBoolCase = (funcInfo.precisionMask == PRECMASK_NA);
1925*35238bceSAndroid Build Coastguard Worker bool isIntCase = (funcInfo.input0.valueType & (VALUE_INT | VALUE_INT_VEC | VALUE_INT_GENTYPE)) != 0;
1926*35238bceSAndroid Build Coastguard Worker bool isFloatCase = !isBoolCase && !isIntCase; // \todo [petri] Better check.
1927*35238bceSAndroid Build Coastguard Worker bool isBoolOut = (funcInfo.outValue & (VALUE_BOOL | VALUE_BOOL_VEC | VALUE_BOOL_GENTYPE)) != 0;
1928*35238bceSAndroid Build Coastguard Worker bool isIntOut = (funcInfo.outValue & (VALUE_INT | VALUE_INT_VEC | VALUE_INT_GENTYPE)) != 0;
1929*35238bceSAndroid Build Coastguard Worker bool isFloatOut = !isBoolOut && !isIntOut;
1930*35238bceSAndroid Build Coastguard Worker
1931*35238bceSAndroid Build Coastguard Worker if (!innerGroup || (string(innerGroup->getName()) != funcInfo.caseName))
1932*35238bceSAndroid Build Coastguard Worker {
1933*35238bceSAndroid Build Coastguard Worker string groupDesc = string("Built-in function ") + shaderFuncName + "() tests.";
1934*35238bceSAndroid Build Coastguard Worker innerGroup = new TestCaseGroup(m_context, funcInfo.caseName, groupDesc.c_str());
1935*35238bceSAndroid Build Coastguard Worker outerGroup->addChild(innerGroup);
1936*35238bceSAndroid Build Coastguard Worker }
1937*35238bceSAndroid Build Coastguard Worker
1938*35238bceSAndroid Build Coastguard Worker for (int inScalarSize = 1; inScalarSize <= 4; inScalarSize++)
1939*35238bceSAndroid Build Coastguard Worker {
1940*35238bceSAndroid Build Coastguard Worker int outScalarSize = ((funcInfo.outValue == VALUE_FLOAT) || (funcInfo.outValue == VALUE_BOOL)) ?
1941*35238bceSAndroid Build Coastguard Worker 1 :
1942*35238bceSAndroid Build Coastguard Worker inScalarSize; // \todo [petri] Int.
1943*35238bceSAndroid Build Coastguard Worker DataType outDataType = isFloatOut ? s_floatTypes[outScalarSize - 1] :
1944*35238bceSAndroid Build Coastguard Worker isIntOut ? s_intTypes[outScalarSize - 1] :
1945*35238bceSAndroid Build Coastguard Worker isBoolOut ? s_boolTypes[outScalarSize - 1] :
1946*35238bceSAndroid Build Coastguard Worker TYPE_LAST;
1947*35238bceSAndroid Build Coastguard Worker
1948*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc = DE_NULL;
1949*35238bceSAndroid Build Coastguard Worker if (inScalarSize == 1)
1950*35238bceSAndroid Build Coastguard Worker evalFunc = funcInfo.evalFuncScalar;
1951*35238bceSAndroid Build Coastguard Worker else if (inScalarSize == 2)
1952*35238bceSAndroid Build Coastguard Worker evalFunc = funcInfo.evalFuncVec2;
1953*35238bceSAndroid Build Coastguard Worker else if (inScalarSize == 3)
1954*35238bceSAndroid Build Coastguard Worker evalFunc = funcInfo.evalFuncVec3;
1955*35238bceSAndroid Build Coastguard Worker else if (inScalarSize == 4)
1956*35238bceSAndroid Build Coastguard Worker evalFunc = funcInfo.evalFuncVec4;
1957*35238bceSAndroid Build Coastguard Worker else
1958*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1959*35238bceSAndroid Build Coastguard Worker
1960*35238bceSAndroid Build Coastguard Worker // Skip if no valid eval func.
1961*35238bceSAndroid Build Coastguard Worker // \todo [petri] Better check for V3 only etc. cases?
1962*35238bceSAndroid Build Coastguard Worker if (evalFunc == DE_NULL)
1963*35238bceSAndroid Build Coastguard Worker continue;
1964*35238bceSAndroid Build Coastguard Worker
1965*35238bceSAndroid Build Coastguard Worker for (int precision = 0; precision < PRECISION_LAST; precision++)
1966*35238bceSAndroid Build Coastguard Worker {
1967*35238bceSAndroid Build Coastguard Worker if ((funcInfo.precisionMask & (1 << precision)) ||
1968*35238bceSAndroid Build Coastguard Worker (funcInfo.precisionMask == PRECMASK_NA &&
1969*35238bceSAndroid Build Coastguard Worker precision == PRECISION_MEDIUMP)) // use mediump interpolators for booleans
1970*35238bceSAndroid Build Coastguard Worker {
1971*35238bceSAndroid Build Coastguard Worker const char *precisionStr = getPrecisionName((Precision)precision);
1972*35238bceSAndroid Build Coastguard Worker string precisionPrefix = isBoolCase ? "" : (string(precisionStr) + "_");
1973*35238bceSAndroid Build Coastguard Worker
1974*35238bceSAndroid Build Coastguard Worker for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
1975*35238bceSAndroid Build Coastguard Worker {
1976*35238bceSAndroid Build Coastguard Worker ShaderType shaderType = s_shaderTypes[shaderTypeNdx];
1977*35238bceSAndroid Build Coastguard Worker ShaderDataSpec shaderSpec;
1978*35238bceSAndroid Build Coastguard Worker const char *shaderTypeName = getShaderTypeName(shaderType);
1979*35238bceSAndroid Build Coastguard Worker bool isVertexCase = (ShaderType)shaderType == SHADERTYPE_VERTEX;
1980*35238bceSAndroid Build Coastguard Worker bool isUnaryOp = (funcInfo.input1.valueType == VALUE_NONE);
1981*35238bceSAndroid Build Coastguard Worker
1982*35238bceSAndroid Build Coastguard Worker // \note Data type names will be added to description and name in a following loop.
1983*35238bceSAndroid Build Coastguard Worker string desc = string("Built-in function ") + shaderFuncName + "(";
1984*35238bceSAndroid Build Coastguard Worker string name = precisionPrefix;
1985*35238bceSAndroid Build Coastguard Worker
1986*35238bceSAndroid Build Coastguard Worker // Generate shader op.
1987*35238bceSAndroid Build Coastguard Worker string shaderOp = string("res = ");
1988*35238bceSAndroid Build Coastguard Worker
1989*35238bceSAndroid Build Coastguard Worker // Setup shader data info.
1990*35238bceSAndroid Build Coastguard Worker shaderSpec.numInputs = 0;
1991*35238bceSAndroid Build Coastguard Worker shaderSpec.precision = isBoolCase ? PRECISION_LAST : (Precision)precision;
1992*35238bceSAndroid Build Coastguard Worker shaderSpec.output = outDataType;
1993*35238bceSAndroid Build Coastguard Worker shaderSpec.resultScale = funcInfo.resultScale;
1994*35238bceSAndroid Build Coastguard Worker shaderSpec.resultBias = funcInfo.resultBias;
1995*35238bceSAndroid Build Coastguard Worker
1996*35238bceSAndroid Build Coastguard Worker if (funcInfo.type == OPERATOR)
1997*35238bceSAndroid Build Coastguard Worker {
1998*35238bceSAndroid Build Coastguard Worker if (isUnaryOp && funcInfo.isUnaryPrefix)
1999*35238bceSAndroid Build Coastguard Worker shaderOp += shaderFuncName;
2000*35238bceSAndroid Build Coastguard Worker }
2001*35238bceSAndroid Build Coastguard Worker else if (funcInfo.type == FUNCTION)
2002*35238bceSAndroid Build Coastguard Worker shaderOp += string(shaderFuncName) + "(";
2003*35238bceSAndroid Build Coastguard Worker else // SIDE_EFFECT_OPERATOR
2004*35238bceSAndroid Build Coastguard Worker shaderOp += "in0;\n\t";
2005*35238bceSAndroid Build Coastguard Worker
2006*35238bceSAndroid Build Coastguard Worker for (int inputNdx = 0; inputNdx < MAX_INPUTS; inputNdx++)
2007*35238bceSAndroid Build Coastguard Worker {
2008*35238bceSAndroid Build Coastguard Worker const Value &v = (inputNdx == 0) ? funcInfo.input0 :
2009*35238bceSAndroid Build Coastguard Worker (inputNdx == 1) ? funcInfo.input1 :
2010*35238bceSAndroid Build Coastguard Worker funcInfo.input2;
2011*35238bceSAndroid Build Coastguard Worker const Value &prevV = (inputNdx == 1) ? funcInfo.input0 :
2012*35238bceSAndroid Build Coastguard Worker (inputNdx == 2) ? funcInfo.input1 :
2013*35238bceSAndroid Build Coastguard Worker funcInfo.input2;
2014*35238bceSAndroid Build Coastguard Worker
2015*35238bceSAndroid Build Coastguard Worker if (v.valueType == VALUE_NONE)
2016*35238bceSAndroid Build Coastguard Worker continue; // Skip unused input.
2017*35238bceSAndroid Build Coastguard Worker
2018*35238bceSAndroid Build Coastguard Worker int curInScalarSize = isScalarType(v.valueType) ? 1 : inScalarSize;
2019*35238bceSAndroid Build Coastguard Worker DataType curInDataType = isFloatCase ? s_floatTypes[curInScalarSize - 1] :
2020*35238bceSAndroid Build Coastguard Worker isIntCase ? s_intTypes[curInScalarSize - 1] :
2021*35238bceSAndroid Build Coastguard Worker isBoolCase ? s_boolTypes[curInScalarSize - 1] :
2022*35238bceSAndroid Build Coastguard Worker TYPE_LAST;
2023*35238bceSAndroid Build Coastguard Worker
2024*35238bceSAndroid Build Coastguard Worker // Write input type(s) to case description and name.
2025*35238bceSAndroid Build Coastguard Worker
2026*35238bceSAndroid Build Coastguard Worker if (inputNdx > 0)
2027*35238bceSAndroid Build Coastguard Worker desc += ", ";
2028*35238bceSAndroid Build Coastguard Worker
2029*35238bceSAndroid Build Coastguard Worker desc += getDataTypeName(curInDataType);
2030*35238bceSAndroid Build Coastguard Worker
2031*35238bceSAndroid Build Coastguard Worker if (inputNdx == 0 ||
2032*35238bceSAndroid Build Coastguard Worker isScalarType(prevV.valueType) !=
2033*35238bceSAndroid Build Coastguard Worker isScalarType(
2034*35238bceSAndroid Build Coastguard Worker v.valueType)) // \note Only write input type to case name if different from previous input type (avoid overly long names).
2035*35238bceSAndroid Build Coastguard Worker name += string("") + getDataTypeName(curInDataType) + "_";
2036*35238bceSAndroid Build Coastguard Worker
2037*35238bceSAndroid Build Coastguard Worker // Generate op input source.
2038*35238bceSAndroid Build Coastguard Worker
2039*35238bceSAndroid Build Coastguard Worker if (funcInfo.type == OPERATOR || funcInfo.type == FUNCTION)
2040*35238bceSAndroid Build Coastguard Worker {
2041*35238bceSAndroid Build Coastguard Worker if (inputNdx != 0)
2042*35238bceSAndroid Build Coastguard Worker {
2043*35238bceSAndroid Build Coastguard Worker if (funcInfo.type == OPERATOR && !isUnaryOp)
2044*35238bceSAndroid Build Coastguard Worker shaderOp += " " + string(shaderFuncName) + " ";
2045*35238bceSAndroid Build Coastguard Worker else
2046*35238bceSAndroid Build Coastguard Worker shaderOp += ", ";
2047*35238bceSAndroid Build Coastguard Worker }
2048*35238bceSAndroid Build Coastguard Worker
2049*35238bceSAndroid Build Coastguard Worker shaderOp += "in" + de::toString(inputNdx);
2050*35238bceSAndroid Build Coastguard Worker
2051*35238bceSAndroid Build Coastguard Worker if (funcInfo.type == OPERATOR && isUnaryOp && !funcInfo.isUnaryPrefix)
2052*35238bceSAndroid Build Coastguard Worker shaderOp += string(shaderFuncName);
2053*35238bceSAndroid Build Coastguard Worker }
2054*35238bceSAndroid Build Coastguard Worker else
2055*35238bceSAndroid Build Coastguard Worker {
2056*35238bceSAndroid Build Coastguard Worker DE_ASSERT(funcInfo.type == SIDE_EFFECT_OPERATOR);
2057*35238bceSAndroid Build Coastguard Worker
2058*35238bceSAndroid Build Coastguard Worker if (inputNdx != 0 || (isUnaryOp && funcInfo.isUnaryPrefix))
2059*35238bceSAndroid Build Coastguard Worker shaderOp += string("") + (isUnaryOp ? "" : " ") + shaderFuncName +
2060*35238bceSAndroid Build Coastguard Worker (isUnaryOp ? "" : " ");
2061*35238bceSAndroid Build Coastguard Worker
2062*35238bceSAndroid Build Coastguard Worker shaderOp +=
2063*35238bceSAndroid Build Coastguard Worker inputNdx == 0 ?
2064*35238bceSAndroid Build Coastguard Worker "res" :
2065*35238bceSAndroid Build Coastguard Worker "in" +
2066*35238bceSAndroid Build Coastguard Worker de::toString(
2067*35238bceSAndroid Build Coastguard Worker inputNdx); // \note in0 has already been assigned to res, so start from in1.
2068*35238bceSAndroid Build Coastguard Worker
2069*35238bceSAndroid Build Coastguard Worker if (isUnaryOp && !funcInfo.isUnaryPrefix)
2070*35238bceSAndroid Build Coastguard Worker shaderOp += shaderFuncName;
2071*35238bceSAndroid Build Coastguard Worker }
2072*35238bceSAndroid Build Coastguard Worker
2073*35238bceSAndroid Build Coastguard Worker // Fill in shader info.
2074*35238bceSAndroid Build Coastguard Worker shaderSpec.inputs[shaderSpec.numInputs++] =
2075*35238bceSAndroid Build Coastguard Worker ShaderValue(curInDataType, v.rangeMin, v.rangeMax);
2076*35238bceSAndroid Build Coastguard Worker }
2077*35238bceSAndroid Build Coastguard Worker
2078*35238bceSAndroid Build Coastguard Worker if (funcInfo.type == FUNCTION)
2079*35238bceSAndroid Build Coastguard Worker shaderOp += ")";
2080*35238bceSAndroid Build Coastguard Worker
2081*35238bceSAndroid Build Coastguard Worker shaderOp += ";";
2082*35238bceSAndroid Build Coastguard Worker
2083*35238bceSAndroid Build Coastguard Worker desc += ").";
2084*35238bceSAndroid Build Coastguard Worker name += shaderTypeName;
2085*35238bceSAndroid Build Coastguard Worker
2086*35238bceSAndroid Build Coastguard Worker // Create the test case.
2087*35238bceSAndroid Build Coastguard Worker innerGroup->addChild(new ShaderOperatorCase(m_context, name.c_str(), desc.c_str(),
2088*35238bceSAndroid Build Coastguard Worker isVertexCase, evalFunc, shaderOp.c_str(),
2089*35238bceSAndroid Build Coastguard Worker shaderSpec));
2090*35238bceSAndroid Build Coastguard Worker }
2091*35238bceSAndroid Build Coastguard Worker }
2092*35238bceSAndroid Build Coastguard Worker }
2093*35238bceSAndroid Build Coastguard Worker }
2094*35238bceSAndroid Build Coastguard Worker }
2095*35238bceSAndroid Build Coastguard Worker }
2096*35238bceSAndroid Build Coastguard Worker
2097*35238bceSAndroid Build Coastguard Worker // The ?: selection operator.
2098*35238bceSAndroid Build Coastguard Worker
2099*35238bceSAndroid Build Coastguard Worker static const struct
2100*35238bceSAndroid Build Coastguard Worker {
2101*35238bceSAndroid Build Coastguard Worker DataType type; // The type of "Y" and "Z" operands in "X ? Y : Z" (X is always bool).
2102*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc;
2103*35238bceSAndroid Build Coastguard Worker } s_selectionInfo[] = {{TYPE_FLOAT, eval_selection_float}, {TYPE_FLOAT_VEC2, eval_selection_vec2},
2104*35238bceSAndroid Build Coastguard Worker {TYPE_FLOAT_VEC3, eval_selection_vec3}, {TYPE_FLOAT_VEC4, eval_selection_vec4},
2105*35238bceSAndroid Build Coastguard Worker {TYPE_INT, eval_selection_int}, {TYPE_INT_VEC2, eval_selection_ivec2},
2106*35238bceSAndroid Build Coastguard Worker {TYPE_INT_VEC3, eval_selection_ivec3}, {TYPE_INT_VEC4, eval_selection_ivec4},
2107*35238bceSAndroid Build Coastguard Worker {TYPE_BOOL, eval_selection_bool}, {TYPE_BOOL_VEC2, eval_selection_bvec2},
2108*35238bceSAndroid Build Coastguard Worker {TYPE_BOOL_VEC3, eval_selection_bvec3}, {TYPE_BOOL_VEC4, eval_selection_bvec4}};
2109*35238bceSAndroid Build Coastguard Worker
2110*35238bceSAndroid Build Coastguard Worker TestCaseGroup *selectionGroup = new TestCaseGroup(m_context, "selection", "Selection operator tests");
2111*35238bceSAndroid Build Coastguard Worker addChild(selectionGroup);
2112*35238bceSAndroid Build Coastguard Worker
2113*35238bceSAndroid Build Coastguard Worker for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(s_selectionInfo); typeNdx++)
2114*35238bceSAndroid Build Coastguard Worker {
2115*35238bceSAndroid Build Coastguard Worker DataType curType = s_selectionInfo[typeNdx].type;
2116*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc = s_selectionInfo[typeNdx].evalFunc;
2117*35238bceSAndroid Build Coastguard Worker bool isBoolCase = isDataTypeBoolOrBVec(curType);
2118*35238bceSAndroid Build Coastguard Worker bool isFloatCase = isDataTypeFloatOrVec(curType);
2119*35238bceSAndroid Build Coastguard Worker bool isIntCase = isDataTypeIntOrIVec(curType);
2120*35238bceSAndroid Build Coastguard Worker const char *dataTypeStr = getDataTypeName(curType);
2121*35238bceSAndroid Build Coastguard Worker
2122*35238bceSAndroid Build Coastguard Worker DE_ASSERT(isBoolCase || isFloatCase || isIntCase);
2123*35238bceSAndroid Build Coastguard Worker DE_UNREF(isIntCase);
2124*35238bceSAndroid Build Coastguard Worker
2125*35238bceSAndroid Build Coastguard Worker for (int precision = 0; precision < (int)PRECISION_LAST; precision++)
2126*35238bceSAndroid Build Coastguard Worker {
2127*35238bceSAndroid Build Coastguard Worker if (isBoolCase && precision != PRECISION_MEDIUMP) // Use mediump interpolators for booleans.
2128*35238bceSAndroid Build Coastguard Worker continue;
2129*35238bceSAndroid Build Coastguard Worker
2130*35238bceSAndroid Build Coastguard Worker const char *precisionStr = getPrecisionName((Precision)precision);
2131*35238bceSAndroid Build Coastguard Worker string precisionPrefix = isBoolCase ? "" : (string(precisionStr) + "_");
2132*35238bceSAndroid Build Coastguard Worker
2133*35238bceSAndroid Build Coastguard Worker for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
2134*35238bceSAndroid Build Coastguard Worker {
2135*35238bceSAndroid Build Coastguard Worker ShaderType shaderType = s_shaderTypes[shaderTypeNdx];
2136*35238bceSAndroid Build Coastguard Worker ShaderDataSpec shaderSpec;
2137*35238bceSAndroid Build Coastguard Worker const char *shaderTypeName = getShaderTypeName(shaderType);
2138*35238bceSAndroid Build Coastguard Worker bool isVertexCase = (ShaderType)shaderType == SHADERTYPE_VERTEX;
2139*35238bceSAndroid Build Coastguard Worker
2140*35238bceSAndroid Build Coastguard Worker string name = precisionPrefix + dataTypeStr + "_" + shaderTypeName;
2141*35238bceSAndroid Build Coastguard Worker
2142*35238bceSAndroid Build Coastguard Worker shaderSpec.numInputs = 3;
2143*35238bceSAndroid Build Coastguard Worker shaderSpec.precision = isBoolCase ? PRECISION_LAST : (Precision)precision;
2144*35238bceSAndroid Build Coastguard Worker shaderSpec.output = curType;
2145*35238bceSAndroid Build Coastguard Worker shaderSpec.resultScale = isBoolCase ? 1.0f : isFloatCase ? 0.5f : 0.1f;
2146*35238bceSAndroid Build Coastguard Worker shaderSpec.resultBias = isBoolCase ? 0.0f : isFloatCase ? 0.5f : 0.5f;
2147*35238bceSAndroid Build Coastguard Worker
2148*35238bceSAndroid Build Coastguard Worker float rangeMin = isBoolCase ? -1.0f : isFloatCase ? -1.0f : -5.0f;
2149*35238bceSAndroid Build Coastguard Worker float rangeMax = isBoolCase ? 1.0f : isFloatCase ? 1.0f : 5.0f;
2150*35238bceSAndroid Build Coastguard Worker
2151*35238bceSAndroid Build Coastguard Worker shaderSpec.inputs[0] = ShaderValue(TYPE_BOOL, -1.0f, 1.0f);
2152*35238bceSAndroid Build Coastguard Worker shaderSpec.inputs[1] = ShaderValue(curType, rangeMin, rangeMax);
2153*35238bceSAndroid Build Coastguard Worker shaderSpec.inputs[2] = ShaderValue(curType, rangeMin, rangeMax);
2154*35238bceSAndroid Build Coastguard Worker
2155*35238bceSAndroid Build Coastguard Worker selectionGroup->addChild(new ShaderOperatorCase(m_context, name.c_str(), "", isVertexCase, evalFunc,
2156*35238bceSAndroid Build Coastguard Worker "res = in0 ? in1 : in2;", shaderSpec));
2157*35238bceSAndroid Build Coastguard Worker }
2158*35238bceSAndroid Build Coastguard Worker }
2159*35238bceSAndroid Build Coastguard Worker }
2160*35238bceSAndroid Build Coastguard Worker
2161*35238bceSAndroid Build Coastguard Worker // The sequence operator (comma).
2162*35238bceSAndroid Build Coastguard Worker
2163*35238bceSAndroid Build Coastguard Worker TestCaseGroup *sequenceGroup = new TestCaseGroup(m_context, "sequence", "Sequence operator tests");
2164*35238bceSAndroid Build Coastguard Worker addChild(sequenceGroup);
2165*35238bceSAndroid Build Coastguard Worker
2166*35238bceSAndroid Build Coastguard Worker TestCaseGroup *sequenceNoSideEffGroup =
2167*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "no_side_effects", "Sequence tests without side-effects");
2168*35238bceSAndroid Build Coastguard Worker TestCaseGroup *sequenceSideEffGroup =
2169*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "side_effects", "Sequence tests with side-effects");
2170*35238bceSAndroid Build Coastguard Worker sequenceGroup->addChild(sequenceNoSideEffGroup);
2171*35238bceSAndroid Build Coastguard Worker sequenceGroup->addChild(sequenceSideEffGroup);
2172*35238bceSAndroid Build Coastguard Worker
2173*35238bceSAndroid Build Coastguard Worker static const struct
2174*35238bceSAndroid Build Coastguard Worker {
2175*35238bceSAndroid Build Coastguard Worker bool containsSideEffects;
2176*35238bceSAndroid Build Coastguard Worker const char *caseName;
2177*35238bceSAndroid Build Coastguard Worker const char *expressionStr;
2178*35238bceSAndroid Build Coastguard Worker int numInputs;
2179*35238bceSAndroid Build Coastguard Worker DataType inputTypes[MAX_INPUTS];
2180*35238bceSAndroid Build Coastguard Worker DataType resultType;
2181*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc;
2182*35238bceSAndroid Build Coastguard Worker } s_sequenceCases[] = {{false,
2183*35238bceSAndroid Build Coastguard Worker "vec4",
2184*35238bceSAndroid Build Coastguard Worker "in0, in2 + in1, in1 + in0",
2185*35238bceSAndroid Build Coastguard Worker 3,
2186*35238bceSAndroid Build Coastguard Worker {TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4},
2187*35238bceSAndroid Build Coastguard Worker TYPE_FLOAT_VEC4,
2188*35238bceSAndroid Build Coastguard Worker evalSequenceNoSideEffCase0},
2189*35238bceSAndroid Build Coastguard Worker {false,
2190*35238bceSAndroid Build Coastguard Worker "float_int",
2191*35238bceSAndroid Build Coastguard Worker "in0 + in2, in1 + in1",
2192*35238bceSAndroid Build Coastguard Worker 3,
2193*35238bceSAndroid Build Coastguard Worker {TYPE_FLOAT, TYPE_INT, TYPE_FLOAT},
2194*35238bceSAndroid Build Coastguard Worker TYPE_INT,
2195*35238bceSAndroid Build Coastguard Worker evalSequenceNoSideEffCase1},
2196*35238bceSAndroid Build Coastguard Worker {false,
2197*35238bceSAndroid Build Coastguard Worker "bool_vec2",
2198*35238bceSAndroid Build Coastguard Worker "in0 && in1, in0, ivec2(vec2(in0) + in2)",
2199*35238bceSAndroid Build Coastguard Worker 3,
2200*35238bceSAndroid Build Coastguard Worker {TYPE_BOOL, TYPE_BOOL, TYPE_FLOAT_VEC2},
2201*35238bceSAndroid Build Coastguard Worker TYPE_INT_VEC2,
2202*35238bceSAndroid Build Coastguard Worker evalSequenceNoSideEffCase2},
2203*35238bceSAndroid Build Coastguard Worker {false,
2204*35238bceSAndroid Build Coastguard Worker "vec4_ivec4_bvec4",
2205*35238bceSAndroid Build Coastguard Worker "in0 + vec4(in1), in2, in1",
2206*35238bceSAndroid Build Coastguard Worker 3,
2207*35238bceSAndroid Build Coastguard Worker {TYPE_FLOAT_VEC4, TYPE_INT_VEC4, TYPE_BOOL_VEC4},
2208*35238bceSAndroid Build Coastguard Worker TYPE_INT_VEC4,
2209*35238bceSAndroid Build Coastguard Worker evalSequenceNoSideEffCase3},
2210*35238bceSAndroid Build Coastguard Worker
2211*35238bceSAndroid Build Coastguard Worker {true,
2212*35238bceSAndroid Build Coastguard Worker "vec4",
2213*35238bceSAndroid Build Coastguard Worker "in0++, in1 = in0 + in2, in2 = in1",
2214*35238bceSAndroid Build Coastguard Worker 3,
2215*35238bceSAndroid Build Coastguard Worker {TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4},
2216*35238bceSAndroid Build Coastguard Worker TYPE_FLOAT_VEC4,
2217*35238bceSAndroid Build Coastguard Worker evalSequenceSideEffCase0},
2218*35238bceSAndroid Build Coastguard Worker {true,
2219*35238bceSAndroid Build Coastguard Worker "float_int",
2220*35238bceSAndroid Build Coastguard Worker "in1++, in0 = float(in1), in1 = int(in0 + in2)",
2221*35238bceSAndroid Build Coastguard Worker 3,
2222*35238bceSAndroid Build Coastguard Worker {TYPE_FLOAT, TYPE_INT, TYPE_FLOAT},
2223*35238bceSAndroid Build Coastguard Worker TYPE_INT,
2224*35238bceSAndroid Build Coastguard Worker evalSequenceSideEffCase1},
2225*35238bceSAndroid Build Coastguard Worker {true,
2226*35238bceSAndroid Build Coastguard Worker "bool_vec2",
2227*35238bceSAndroid Build Coastguard Worker "in1 = in0, in2++, in2 = in2 + vec2(in1), ivec2(in2)",
2228*35238bceSAndroid Build Coastguard Worker 3,
2229*35238bceSAndroid Build Coastguard Worker {TYPE_BOOL, TYPE_BOOL, TYPE_FLOAT_VEC2},
2230*35238bceSAndroid Build Coastguard Worker TYPE_INT_VEC2,
2231*35238bceSAndroid Build Coastguard Worker evalSequenceSideEffCase2},
2232*35238bceSAndroid Build Coastguard Worker {true,
2233*35238bceSAndroid Build Coastguard Worker "vec4_ivec4_bvec4",
2234*35238bceSAndroid Build Coastguard Worker "in0 = in0 + vec4(in2), in1 = in1 + ivec4(in0), in1++",
2235*35238bceSAndroid Build Coastguard Worker 3,
2236*35238bceSAndroid Build Coastguard Worker {TYPE_FLOAT_VEC4, TYPE_INT_VEC4, TYPE_BOOL_VEC4},
2237*35238bceSAndroid Build Coastguard Worker TYPE_INT_VEC4,
2238*35238bceSAndroid Build Coastguard Worker evalSequenceSideEffCase3}};
2239*35238bceSAndroid Build Coastguard Worker
2240*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(s_sequenceCases); caseNdx++)
2241*35238bceSAndroid Build Coastguard Worker {
2242*35238bceSAndroid Build Coastguard Worker for (int precision = 0; precision < (int)PRECISION_LAST; precision++)
2243*35238bceSAndroid Build Coastguard Worker {
2244*35238bceSAndroid Build Coastguard Worker for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
2245*35238bceSAndroid Build Coastguard Worker {
2246*35238bceSAndroid Build Coastguard Worker ShaderType shaderType = s_shaderTypes[shaderTypeNdx];
2247*35238bceSAndroid Build Coastguard Worker ShaderDataSpec shaderSpec;
2248*35238bceSAndroid Build Coastguard Worker const char *shaderTypeName = getShaderTypeName(shaderType);
2249*35238bceSAndroid Build Coastguard Worker bool isVertexCase = (ShaderType)shaderType == SHADERTYPE_VERTEX;
2250*35238bceSAndroid Build Coastguard Worker
2251*35238bceSAndroid Build Coastguard Worker string name = string("") + getPrecisionName((Precision)precision) + "_" +
2252*35238bceSAndroid Build Coastguard Worker s_sequenceCases[caseNdx].caseName + "_" + shaderTypeName;
2253*35238bceSAndroid Build Coastguard Worker
2254*35238bceSAndroid Build Coastguard Worker shaderSpec.numInputs = s_sequenceCases[caseNdx].numInputs;
2255*35238bceSAndroid Build Coastguard Worker shaderSpec.precision = (Precision)precision;
2256*35238bceSAndroid Build Coastguard Worker shaderSpec.output = s_sequenceCases[caseNdx].resultType;
2257*35238bceSAndroid Build Coastguard Worker shaderSpec.resultScale = 0.5f;
2258*35238bceSAndroid Build Coastguard Worker shaderSpec.resultBias = 0.0f;
2259*35238bceSAndroid Build Coastguard Worker
2260*35238bceSAndroid Build Coastguard Worker for (int inputNdx = 0; inputNdx < s_sequenceCases[caseNdx].numInputs; inputNdx++)
2261*35238bceSAndroid Build Coastguard Worker {
2262*35238bceSAndroid Build Coastguard Worker DataType type = s_sequenceCases[caseNdx].inputTypes[inputNdx];
2263*35238bceSAndroid Build Coastguard Worker float rangeMin = isDataTypeFloatOrVec(type) ? -0.5f : isDataTypeIntOrIVec(type) ? -2.0f : -1.0f;
2264*35238bceSAndroid Build Coastguard Worker float rangeMax = isDataTypeFloatOrVec(type) ? 0.5f : isDataTypeIntOrIVec(type) ? 2.0f : 1.0f;
2265*35238bceSAndroid Build Coastguard Worker
2266*35238bceSAndroid Build Coastguard Worker shaderSpec.inputs[inputNdx] = ShaderValue(type, rangeMin, rangeMax);
2267*35238bceSAndroid Build Coastguard Worker }
2268*35238bceSAndroid Build Coastguard Worker
2269*35238bceSAndroid Build Coastguard Worker string expression = string("") + "res = (" + s_sequenceCases[caseNdx].expressionStr + ");";
2270*35238bceSAndroid Build Coastguard Worker
2271*35238bceSAndroid Build Coastguard Worker TestCaseGroup *group =
2272*35238bceSAndroid Build Coastguard Worker s_sequenceCases[caseNdx].containsSideEffects ? sequenceSideEffGroup : sequenceNoSideEffGroup;
2273*35238bceSAndroid Build Coastguard Worker group->addChild(new ShaderOperatorCase(m_context, name.c_str(), "", isVertexCase,
2274*35238bceSAndroid Build Coastguard Worker s_sequenceCases[caseNdx].evalFunc, expression.c_str(),
2275*35238bceSAndroid Build Coastguard Worker shaderSpec));
2276*35238bceSAndroid Build Coastguard Worker }
2277*35238bceSAndroid Build Coastguard Worker }
2278*35238bceSAndroid Build Coastguard Worker }
2279*35238bceSAndroid Build Coastguard Worker
2280*35238bceSAndroid Build Coastguard Worker // Regression tests for sequence operator.
2281*35238bceSAndroid Build Coastguard Worker // http://khronos.org/registry/webgl/sdk/tests/conformance/glsl/bugs/sequence-operator-evaluation-order.html
2282*35238bceSAndroid Build Coastguard Worker {
2283*35238bceSAndroid Build Coastguard Worker class Case : public ShaderRenderCase
2284*35238bceSAndroid Build Coastguard Worker {
evalFunc(ShaderEvalContext & c)2285*35238bceSAndroid Build Coastguard Worker static void evalFunc(ShaderEvalContext &c)
2286*35238bceSAndroid Build Coastguard Worker {
2287*35238bceSAndroid Build Coastguard Worker c.color = tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f); // green
2288*35238bceSAndroid Build Coastguard Worker }
2289*35238bceSAndroid Build Coastguard Worker
2290*35238bceSAndroid Build Coastguard Worker public:
Case(Context & context,const char * name,const char * description,const char * fragShaderSource)2291*35238bceSAndroid Build Coastguard Worker Case(Context &context, const char *name, const char *description, const char *fragShaderSource)
2292*35238bceSAndroid Build Coastguard Worker : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name,
2293*35238bceSAndroid Build Coastguard Worker description, false, &evalFunc)
2294*35238bceSAndroid Build Coastguard Worker {
2295*35238bceSAndroid Build Coastguard Worker m_vertShaderSource = "attribute vec4 a_position;\n"
2296*35238bceSAndroid Build Coastguard Worker "void main()\n"
2297*35238bceSAndroid Build Coastguard Worker "{\n"
2298*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
2299*35238bceSAndroid Build Coastguard Worker "}\n";
2300*35238bceSAndroid Build Coastguard Worker m_fragShaderSource = fragShaderSource;
2301*35238bceSAndroid Build Coastguard Worker }
2302*35238bceSAndroid Build Coastguard Worker };
2303*35238bceSAndroid Build Coastguard Worker
2304*35238bceSAndroid Build Coastguard Worker // ESSL 1.00 section 5.9, about sequence operator:
2305*35238bceSAndroid Build Coastguard Worker // "All expressions are evaluated, in order, from left to right"
2306*35238bceSAndroid Build Coastguard Worker // Also use a ternary operator where the third operand has side effects to make sure
2307*35238bceSAndroid Build Coastguard Worker // only the second operand is evaluated.
2308*35238bceSAndroid Build Coastguard Worker sequenceSideEffGroup->addChild(new Case(m_context, "affect_ternary",
2309*35238bceSAndroid Build Coastguard Worker "Expression where first operand of a sequence operator has side "
2310*35238bceSAndroid Build Coastguard Worker "effects which affect the second operand that is a ternary operator",
2311*35238bceSAndroid Build Coastguard Worker ("precision mediump float;\n"
2312*35238bceSAndroid Build Coastguard Worker "bool correct = true;\n"
2313*35238bceSAndroid Build Coastguard Worker "uniform float u_zero;\n"
2314*35238bceSAndroid Build Coastguard Worker "float wrong() {\n"
2315*35238bceSAndroid Build Coastguard Worker " correct = false;\n"
2316*35238bceSAndroid Build Coastguard Worker " return 0.0;\n"
2317*35238bceSAndroid Build Coastguard Worker "}\n"
2318*35238bceSAndroid Build Coastguard Worker "void main() {\n"
2319*35238bceSAndroid Build Coastguard Worker " float a = u_zero - 0.5; // Result should be -0.5.\n"
2320*35238bceSAndroid Build Coastguard Worker " float green = (a++, a > 0.0 ? 1.0 : wrong());\n"
2321*35238bceSAndroid Build Coastguard Worker " gl_FragColor = vec4(0.0, correct ? green : 0.0, 0.0, 1.0);\n"
2322*35238bceSAndroid Build Coastguard Worker "}\n")));
2323*35238bceSAndroid Build Coastguard Worker
2324*35238bceSAndroid Build Coastguard Worker sequenceSideEffGroup->addChild(
2325*35238bceSAndroid Build Coastguard Worker new Case(m_context, "affect_and",
2326*35238bceSAndroid Build Coastguard Worker "Expression where first operand of a sequence operator has side effects which affect the second "
2327*35238bceSAndroid Build Coastguard Worker "operand that is an and operator",
2328*35238bceSAndroid Build Coastguard Worker ("precision mediump float;\n"
2329*35238bceSAndroid Build Coastguard Worker "uniform bool u_false;\n"
2330*35238bceSAndroid Build Coastguard Worker "bool sideEffectA = false;\n"
2331*35238bceSAndroid Build Coastguard Worker "bool funcA() {\n"
2332*35238bceSAndroid Build Coastguard Worker " sideEffectA = true;\n"
2333*35238bceSAndroid Build Coastguard Worker " return true;\n"
2334*35238bceSAndroid Build Coastguard Worker "}\n"
2335*35238bceSAndroid Build Coastguard Worker "bool sideEffectB = false;\n"
2336*35238bceSAndroid Build Coastguard Worker "bool funcB() {\n"
2337*35238bceSAndroid Build Coastguard Worker " sideEffectB = true;\n"
2338*35238bceSAndroid Build Coastguard Worker " return true;\n"
2339*35238bceSAndroid Build Coastguard Worker "}\n"
2340*35238bceSAndroid Build Coastguard Worker "void main() {\n"
2341*35238bceSAndroid Build Coastguard Worker " bool b = (funcA(), u_false == sideEffectA && funcB());\n"
2342*35238bceSAndroid Build Coastguard Worker " gl_FragColor = (!b && sideEffectA && !sideEffectB) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);\n"
2343*35238bceSAndroid Build Coastguard Worker "}\n")));
2344*35238bceSAndroid Build Coastguard Worker
2345*35238bceSAndroid Build Coastguard Worker sequenceSideEffGroup->addChild(
2346*35238bceSAndroid Build Coastguard Worker new Case(m_context, "affect_or",
2347*35238bceSAndroid Build Coastguard Worker "Expression where first operand of a sequence operator has side effects which affect the second "
2348*35238bceSAndroid Build Coastguard Worker "operand that is an or operator",
2349*35238bceSAndroid Build Coastguard Worker ("precision mediump float;\n"
2350*35238bceSAndroid Build Coastguard Worker "uniform bool u_false;\n"
2351*35238bceSAndroid Build Coastguard Worker "bool sideEffectA = false;\n"
2352*35238bceSAndroid Build Coastguard Worker "bool funcA() {\n"
2353*35238bceSAndroid Build Coastguard Worker " sideEffectA = true;\n"
2354*35238bceSAndroid Build Coastguard Worker " return false;\n"
2355*35238bceSAndroid Build Coastguard Worker "}\n"
2356*35238bceSAndroid Build Coastguard Worker "bool sideEffectB = false;\n"
2357*35238bceSAndroid Build Coastguard Worker "bool funcB() {\n"
2358*35238bceSAndroid Build Coastguard Worker " sideEffectB = true;\n"
2359*35238bceSAndroid Build Coastguard Worker " return false;\n"
2360*35238bceSAndroid Build Coastguard Worker "}\n"
2361*35238bceSAndroid Build Coastguard Worker "void main() {\n"
2362*35238bceSAndroid Build Coastguard Worker " bool b = (funcA(), (u_false == !sideEffectA) || funcB());\n"
2363*35238bceSAndroid Build Coastguard Worker " gl_FragColor = (b && sideEffectA && !sideEffectB) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);\n"
2364*35238bceSAndroid Build Coastguard Worker "}\n")));
2365*35238bceSAndroid Build Coastguard Worker }
2366*35238bceSAndroid Build Coastguard Worker }
2367*35238bceSAndroid Build Coastguard Worker
2368*35238bceSAndroid Build Coastguard Worker } // namespace Functional
2369*35238bceSAndroid Build Coastguard Worker } // namespace gles2
2370*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2371