xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fShaderOperatorTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.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 "es3fShaderOperatorTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
34*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker #include <map>
37*35238bceSAndroid Build Coastguard Worker #include <limits>
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker using namespace tcu;
40*35238bceSAndroid Build Coastguard Worker using namespace glu;
41*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls;
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker using std::map;
44*35238bceSAndroid Build Coastguard Worker using std::ostringstream;
45*35238bceSAndroid Build Coastguard Worker using std::pair;
46*35238bceSAndroid Build Coastguard Worker using std::string;
47*35238bceSAndroid Build Coastguard Worker using std::vector;
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker namespace deqp
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker namespace gles3
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker namespace Functional
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker 
56*35238bceSAndroid Build Coastguard Worker #if defined(abs)
57*35238bceSAndroid Build Coastguard Worker #undef abs
58*35238bceSAndroid Build Coastguard Worker #endif
59*35238bceSAndroid Build Coastguard Worker 
60*35238bceSAndroid Build Coastguard Worker using de::clamp;
61*35238bceSAndroid Build Coastguard Worker using de::max;
62*35238bceSAndroid Build Coastguard Worker using de::min;
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker // \note VS2013 gets confused without these
65*35238bceSAndroid Build Coastguard Worker using tcu::acosh;
66*35238bceSAndroid Build Coastguard Worker using tcu::asinh;
67*35238bceSAndroid Build Coastguard Worker using tcu::atanh;
68*35238bceSAndroid Build Coastguard Worker using tcu::exp2;
69*35238bceSAndroid Build Coastguard Worker using tcu::log2;
70*35238bceSAndroid Build Coastguard Worker using tcu::trunc;
71*35238bceSAndroid Build Coastguard Worker 
abs(float v)72*35238bceSAndroid Build Coastguard Worker inline float abs(float v)
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker     return deFloatAbs(v);
75*35238bceSAndroid Build Coastguard Worker }
76*35238bceSAndroid Build Coastguard Worker 
logicalAnd(bool a,bool b)77*35238bceSAndroid Build Coastguard Worker inline bool logicalAnd(bool a, bool b)
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker     return (a && b);
80*35238bceSAndroid Build Coastguard Worker }
logicalOr(bool a,bool b)81*35238bceSAndroid Build Coastguard Worker inline bool logicalOr(bool a, bool b)
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker     return (a || b);
84*35238bceSAndroid Build Coastguard Worker }
logicalXor(bool a,bool b)85*35238bceSAndroid Build Coastguard Worker inline bool logicalXor(bool a, bool b)
86*35238bceSAndroid Build Coastguard Worker {
87*35238bceSAndroid Build Coastguard Worker     return (a != b);
88*35238bceSAndroid Build Coastguard Worker }
89*35238bceSAndroid Build Coastguard Worker 
90*35238bceSAndroid Build Coastguard Worker // \note stdlib.h defines div() that is not compatible with the macros.
91*35238bceSAndroid Build Coastguard Worker template <typename T>
div(T a,T b)92*35238bceSAndroid Build Coastguard Worker inline T div(T a, T b)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker     return a / b;
95*35238bceSAndroid Build Coastguard Worker }
96*35238bceSAndroid Build Coastguard Worker 
97*35238bceSAndroid Build Coastguard Worker template <typename T>
leftShift(T value,int amount)98*35238bceSAndroid Build Coastguard Worker inline T leftShift(T value, int amount)
99*35238bceSAndroid Build Coastguard Worker {
100*35238bceSAndroid Build Coastguard Worker     return value << amount;
101*35238bceSAndroid Build Coastguard Worker }
102*35238bceSAndroid Build Coastguard Worker 
rightShift(uint32_t value,int amount)103*35238bceSAndroid Build Coastguard Worker inline uint32_t rightShift(uint32_t value, int amount)
104*35238bceSAndroid Build Coastguard Worker {
105*35238bceSAndroid Build Coastguard Worker     return value >> amount;
106*35238bceSAndroid Build Coastguard Worker }
rightShift(int value,int amount)107*35238bceSAndroid Build Coastguard Worker inline int rightShift(int value, int amount)
108*35238bceSAndroid Build Coastguard Worker {
109*35238bceSAndroid Build Coastguard Worker     return (value >> amount) | (value >= 0 ? 0 : ~(~0U >> amount));
110*35238bceSAndroid Build Coastguard Worker } // \note Arithmetic shift.
111*35238bceSAndroid Build Coastguard Worker 
112*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
leftShift(const Vector<T,Size> & value,const Vector<int,Size> & amount)113*35238bceSAndroid Build Coastguard Worker Vector<T, Size> leftShift(const Vector<T, Size> &value, const Vector<int, Size> &amount)
114*35238bceSAndroid Build Coastguard Worker {
115*35238bceSAndroid Build Coastguard Worker     Vector<T, Size> result;
116*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < Size; i++)
117*35238bceSAndroid Build Coastguard Worker         result[i] = leftShift(value[i], amount[i]);
118*35238bceSAndroid Build Coastguard Worker     return result;
119*35238bceSAndroid Build Coastguard Worker }
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
rightShift(const Vector<T,Size> & value,const Vector<int,Size> & amount)122*35238bceSAndroid Build Coastguard Worker Vector<T, Size> rightShift(const Vector<T, Size> &value, const Vector<int, Size> &amount)
123*35238bceSAndroid Build Coastguard Worker {
124*35238bceSAndroid Build Coastguard Worker     Vector<T, Size> result;
125*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < Size; i++)
126*35238bceSAndroid Build Coastguard Worker         result[i] = rightShift(value[i], amount[i]);
127*35238bceSAndroid Build Coastguard Worker     return result;
128*35238bceSAndroid Build Coastguard Worker }
129*35238bceSAndroid Build Coastguard Worker 
130*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
leftShiftVecScalar(const Vector<T,Size> & value,int amount)131*35238bceSAndroid Build Coastguard Worker Vector<T, Size> leftShiftVecScalar(const Vector<T, Size> &value, int amount)
132*35238bceSAndroid Build Coastguard Worker {
133*35238bceSAndroid Build Coastguard Worker     return leftShift(value, Vector<int, Size>(amount));
134*35238bceSAndroid Build Coastguard Worker }
135*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
rightShiftVecScalar(const Vector<T,Size> & value,int amount)136*35238bceSAndroid Build Coastguard Worker Vector<T, Size> rightShiftVecScalar(const Vector<T, Size> &value, int amount)
137*35238bceSAndroid Build Coastguard Worker {
138*35238bceSAndroid Build Coastguard Worker     return rightShift(value, Vector<int, Size>(amount));
139*35238bceSAndroid Build Coastguard Worker }
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
minVecScalar(const Vector<T,Size> & v,T s)142*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> minVecScalar(const Vector<T, Size> &v, T s)
143*35238bceSAndroid Build Coastguard Worker {
144*35238bceSAndroid Build Coastguard Worker     Vector<T, Size> res;
145*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < Size; i++)
146*35238bceSAndroid Build Coastguard Worker         res[i] = min(v[i], s);
147*35238bceSAndroid Build Coastguard Worker     return res;
148*35238bceSAndroid Build Coastguard Worker }
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
maxVecScalar(const Vector<T,Size> & v,T s)151*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> maxVecScalar(const Vector<T, Size> &v, T s)
152*35238bceSAndroid Build Coastguard Worker {
153*35238bceSAndroid Build Coastguard Worker     Vector<T, Size> res;
154*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < Size; i++)
155*35238bceSAndroid Build Coastguard Worker         res[i] = max(v[i], s);
156*35238bceSAndroid Build Coastguard Worker     return res;
157*35238bceSAndroid Build Coastguard Worker }
158*35238bceSAndroid Build Coastguard Worker 
159*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
clampVecScalarScalar(const Vector<T,Size> & v,T s0,T s1)160*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> clampVecScalarScalar(const Vector<T, Size> &v, T s0, T s1)
161*35238bceSAndroid Build Coastguard Worker {
162*35238bceSAndroid Build Coastguard Worker     Vector<T, Size> res;
163*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < Size; i++)
164*35238bceSAndroid Build Coastguard Worker         res[i] = clamp(v[i], s0, s1);
165*35238bceSAndroid Build Coastguard Worker     return res;
166*35238bceSAndroid Build Coastguard Worker }
167*35238bceSAndroid Build Coastguard Worker 
168*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
mixVecVecScalar(const Vector<T,Size> & v0,const Vector<T,Size> & v1,T s)169*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> mixVecVecScalar(const Vector<T, Size> &v0, const Vector<T, Size> &v1, T s)
170*35238bceSAndroid Build Coastguard Worker {
171*35238bceSAndroid Build Coastguard Worker     Vector<T, Size> res;
172*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < Size; i++)
173*35238bceSAndroid Build Coastguard Worker         res[i] = mix(v0[i], v1[i], s);
174*35238bceSAndroid Build Coastguard Worker     return res;
175*35238bceSAndroid Build Coastguard Worker }
176*35238bceSAndroid Build Coastguard Worker 
177*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
stepScalarVec(T s,const Vector<T,Size> & v)178*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> stepScalarVec(T s, const Vector<T, Size> &v)
179*35238bceSAndroid Build Coastguard Worker {
180*35238bceSAndroid Build Coastguard Worker     Vector<T, Size> res;
181*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < Size; i++)
182*35238bceSAndroid Build Coastguard Worker         res[i] = step(s, v[i]);
183*35238bceSAndroid Build Coastguard Worker     return res;
184*35238bceSAndroid Build Coastguard Worker }
185*35238bceSAndroid Build Coastguard Worker 
186*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
smoothStepScalarScalarVec(T s0,T s1,const Vector<T,Size> & v)187*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> smoothStepScalarScalarVec(T s0, T s1, const Vector<T, Size> &v)
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker     Vector<T, Size> res;
190*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < Size; i++)
191*35238bceSAndroid Build Coastguard Worker         res[i] = smoothStep(s0, s1, v[i]);
192*35238bceSAndroid Build Coastguard Worker     return res;
193*35238bceSAndroid Build Coastguard Worker }
194*35238bceSAndroid Build Coastguard Worker 
addOne(float v)195*35238bceSAndroid Build Coastguard Worker inline float addOne(float v)
196*35238bceSAndroid Build Coastguard Worker {
197*35238bceSAndroid Build Coastguard Worker     return v + 1.0f;
198*35238bceSAndroid Build Coastguard Worker }
subOne(float v)199*35238bceSAndroid Build Coastguard Worker inline float subOne(float v)
200*35238bceSAndroid Build Coastguard Worker {
201*35238bceSAndroid Build Coastguard Worker     return v - 1.0f;
202*35238bceSAndroid Build Coastguard Worker }
addOne(int v)203*35238bceSAndroid Build Coastguard Worker inline int addOne(int v)
204*35238bceSAndroid Build Coastguard Worker {
205*35238bceSAndroid Build Coastguard Worker     return v + 1;
206*35238bceSAndroid Build Coastguard Worker }
subOne(int v)207*35238bceSAndroid Build Coastguard Worker inline int subOne(int v)
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker     return v - 1;
210*35238bceSAndroid Build Coastguard Worker }
addOne(uint32_t v)211*35238bceSAndroid Build Coastguard Worker inline uint32_t addOne(uint32_t v)
212*35238bceSAndroid Build Coastguard Worker {
213*35238bceSAndroid Build Coastguard Worker     return v + 1;
214*35238bceSAndroid Build Coastguard Worker }
subOne(uint32_t v)215*35238bceSAndroid Build Coastguard Worker inline uint32_t subOne(uint32_t v)
216*35238bceSAndroid Build Coastguard Worker {
217*35238bceSAndroid Build Coastguard Worker     return v - 1;
218*35238bceSAndroid Build Coastguard Worker }
219*35238bceSAndroid Build Coastguard Worker 
220*35238bceSAndroid Build Coastguard Worker template <int Size>
addOne(const Vector<float,Size> & v)221*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> addOne(const Vector<float, Size> &v)
222*35238bceSAndroid Build Coastguard Worker {
223*35238bceSAndroid Build Coastguard Worker     return v + 1.0f;
224*35238bceSAndroid Build Coastguard Worker }
225*35238bceSAndroid Build Coastguard Worker template <int Size>
subOne(const Vector<float,Size> & v)226*35238bceSAndroid Build Coastguard Worker inline Vector<float, Size> subOne(const Vector<float, Size> &v)
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker     return v - 1.0f;
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker template <int Size>
addOne(const Vector<int,Size> & v)231*35238bceSAndroid Build Coastguard Worker inline Vector<int, Size> addOne(const Vector<int, Size> &v)
232*35238bceSAndroid Build Coastguard Worker {
233*35238bceSAndroid Build Coastguard Worker     return v + 1;
234*35238bceSAndroid Build Coastguard Worker }
235*35238bceSAndroid Build Coastguard Worker template <int Size>
subOne(const Vector<int,Size> & v)236*35238bceSAndroid Build Coastguard Worker inline Vector<int, Size> subOne(const Vector<int, Size> &v)
237*35238bceSAndroid Build Coastguard Worker {
238*35238bceSAndroid Build Coastguard Worker     return v - 1;
239*35238bceSAndroid Build Coastguard Worker }
240*35238bceSAndroid Build Coastguard Worker template <int Size>
addOne(const Vector<uint32_t,Size> & v)241*35238bceSAndroid Build Coastguard Worker inline Vector<uint32_t, Size> addOne(const Vector<uint32_t, Size> &v)
242*35238bceSAndroid Build Coastguard Worker {
243*35238bceSAndroid Build Coastguard Worker     return v + 1U;
244*35238bceSAndroid Build Coastguard Worker }
245*35238bceSAndroid Build Coastguard Worker template <int Size>
subOne(const Vector<uint32_t,Size> & v)246*35238bceSAndroid Build Coastguard Worker inline Vector<uint32_t, Size> subOne(const Vector<uint32_t, Size> &v)
247*35238bceSAndroid Build Coastguard Worker {
248*35238bceSAndroid Build Coastguard Worker     return (v.asInt() - 1).asUint();
249*35238bceSAndroid Build Coastguard Worker }
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker template <typename T>
selection(bool cond,T a,T b)252*35238bceSAndroid Build Coastguard Worker inline T selection(bool cond, T a, T b)
253*35238bceSAndroid Build Coastguard Worker {
254*35238bceSAndroid Build Coastguard Worker     return cond ? a : b;
255*35238bceSAndroid Build Coastguard Worker }
256*35238bceSAndroid Build Coastguard Worker 
257*35238bceSAndroid Build Coastguard Worker // Vec-scalar and scalar-vec binary operators.
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker // \note This one is done separately due to how the overloaded minus operator is implemented for vector-scalar operands.
260*35238bceSAndroid Build Coastguard Worker template <int Size>
subVecScalar(const Vector<uint32_t,Size> & v,uint32_t s)261*35238bceSAndroid Build Coastguard Worker inline Vector<uint32_t, Size> subVecScalar(const Vector<uint32_t, Size> &v, uint32_t s)
262*35238bceSAndroid Build Coastguard Worker {
263*35238bceSAndroid Build Coastguard Worker     return (v.asInt() - (int)s).asUint();
264*35238bceSAndroid Build Coastguard Worker }
265*35238bceSAndroid Build Coastguard Worker 
266*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
addVecScalar(const Vector<T,Size> & v,T s)267*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> addVecScalar(const Vector<T, Size> &v, T s)
268*35238bceSAndroid Build Coastguard Worker {
269*35238bceSAndroid Build Coastguard Worker     return v + s;
270*35238bceSAndroid Build Coastguard Worker }
271*35238bceSAndroid Build Coastguard Worker 
272*35238bceSAndroid Build Coastguard Worker // Specialize add, sub, and mul integer operations to use 64bit to avoid undefined signed integer overflows.
add(int a,int b)273*35238bceSAndroid Build Coastguard Worker inline int add(int a, int b)
274*35238bceSAndroid Build Coastguard Worker {
275*35238bceSAndroid Build Coastguard Worker     return static_cast<int>(static_cast<int64_t>(a) + static_cast<int64_t>(b));
276*35238bceSAndroid Build Coastguard Worker }
sub(int a,int b)277*35238bceSAndroid Build Coastguard Worker inline int sub(int a, int b)
278*35238bceSAndroid Build Coastguard Worker {
279*35238bceSAndroid Build Coastguard Worker     return static_cast<int>(static_cast<int64_t>(a) - static_cast<int64_t>(b));
280*35238bceSAndroid Build Coastguard Worker }
mul(int a,int b)281*35238bceSAndroid Build Coastguard Worker inline int mul(int a, int b)
282*35238bceSAndroid Build Coastguard Worker {
283*35238bceSAndroid Build Coastguard Worker     return static_cast<int>(static_cast<int64_t>(a) * static_cast<int64_t>(b));
284*35238bceSAndroid Build Coastguard Worker }
285*35238bceSAndroid Build Coastguard Worker 
add(uint32_t a,uint32_t b)286*35238bceSAndroid Build Coastguard Worker inline uint32_t add(uint32_t a, uint32_t b)
287*35238bceSAndroid Build Coastguard Worker {
288*35238bceSAndroid Build Coastguard Worker     return a + b;
289*35238bceSAndroid Build Coastguard Worker }
sub(uint32_t a,uint32_t b)290*35238bceSAndroid Build Coastguard Worker inline uint32_t sub(uint32_t a, uint32_t b)
291*35238bceSAndroid Build Coastguard Worker {
292*35238bceSAndroid Build Coastguard Worker     return a - b;
293*35238bceSAndroid Build Coastguard Worker }
mul(uint32_t a,uint32_t b)294*35238bceSAndroid Build Coastguard Worker inline uint32_t mul(uint32_t a, uint32_t b)
295*35238bceSAndroid Build Coastguard Worker {
296*35238bceSAndroid Build Coastguard Worker     return a * b;
297*35238bceSAndroid Build Coastguard Worker }
298*35238bceSAndroid Build Coastguard Worker 
299*35238bceSAndroid Build Coastguard Worker #define DECLARE_IVEC_BINARY_FUNC(OP_NAME)                                                    \
300*35238bceSAndroid Build Coastguard Worker     template <int Size>                                                                      \
301*35238bceSAndroid Build Coastguard Worker     inline Vector<int, Size> OP_NAME(const Vector<int, Size> &a, const Vector<int, Size> &b) \
302*35238bceSAndroid Build Coastguard Worker     {                                                                                        \
303*35238bceSAndroid Build Coastguard Worker         Vector<int, Size> res;                                                               \
304*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < Size; i++)                                                       \
305*35238bceSAndroid Build Coastguard Worker             res.m_data[i] = OP_NAME(a.m_data[i], b.m_data[i]);                               \
306*35238bceSAndroid Build Coastguard Worker         return res;                                                                          \
307*35238bceSAndroid Build Coastguard Worker     }
308*35238bceSAndroid Build Coastguard Worker 
309*35238bceSAndroid Build Coastguard Worker #define DECLARE_IVEC_INT_BINARY_FUNC(OP_NAME)                                      \
310*35238bceSAndroid Build Coastguard Worker     template <int Size>                                                            \
311*35238bceSAndroid Build Coastguard Worker     inline Vector<int, Size> OP_NAME##VecScalar(const Vector<int, Size> &v, int s) \
312*35238bceSAndroid Build Coastguard Worker     {                                                                              \
313*35238bceSAndroid Build Coastguard Worker         Vector<int, Size> ret;                                                     \
314*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < Size; i++)                                             \
315*35238bceSAndroid Build Coastguard Worker             ret[i] = OP_NAME(v.m_data[i], s);                                      \
316*35238bceSAndroid Build Coastguard Worker         return ret;                                                                \
317*35238bceSAndroid Build Coastguard Worker     };
318*35238bceSAndroid Build Coastguard Worker 
319*35238bceSAndroid Build Coastguard Worker #define DECLARE_INT_IVEC_BINARY_FUNC(OP_NAME)                                      \
320*35238bceSAndroid Build Coastguard Worker     template <int Size>                                                            \
321*35238bceSAndroid Build Coastguard Worker     inline Vector<int, Size> OP_NAME##ScalarVec(int s, const Vector<int, Size> &v) \
322*35238bceSAndroid Build Coastguard Worker     {                                                                              \
323*35238bceSAndroid Build Coastguard Worker         Vector<int, Size> ret;                                                     \
324*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < Size; i++)                                             \
325*35238bceSAndroid Build Coastguard Worker             ret[i] = OP_NAME(s, v.m_data[i]);                                      \
326*35238bceSAndroid Build Coastguard Worker         return ret;                                                                \
327*35238bceSAndroid Build Coastguard Worker     };
328*35238bceSAndroid Build Coastguard Worker 
329*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_BINARY_FUNC(add)
DECLARE_IVEC_BINARY_FUNC(sub)330*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_BINARY_FUNC(sub)
331*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_BINARY_FUNC(mul)
332*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_BINARY_FUNC(add)
333*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_BINARY_FUNC(sub)
334*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_BINARY_FUNC(mul)
335*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_BINARY_FUNC(add)
336*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_BINARY_FUNC(sub)
337*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_BINARY_FUNC(mul)
338*35238bceSAndroid Build Coastguard Worker 
339*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
340*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> subVecScalar(const Vector<T, Size> &v, T s)
341*35238bceSAndroid Build Coastguard Worker {
342*35238bceSAndroid Build Coastguard Worker     return v - s;
343*35238bceSAndroid Build Coastguard Worker }
344*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
mulVecScalar(const Vector<T,Size> & v,T s)345*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> mulVecScalar(const Vector<T, Size> &v, T s)
346*35238bceSAndroid Build Coastguard Worker {
347*35238bceSAndroid Build Coastguard Worker     return v * s;
348*35238bceSAndroid Build Coastguard Worker }
349*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
divVecScalar(const Vector<T,Size> & v,T s)350*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> divVecScalar(const Vector<T, Size> &v, T s)
351*35238bceSAndroid Build Coastguard Worker {
352*35238bceSAndroid Build Coastguard Worker     return v / s;
353*35238bceSAndroid Build Coastguard Worker }
354*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
modVecScalar(const Vector<T,Size> & v,T s)355*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> modVecScalar(const Vector<T, Size> &v, T s)
356*35238bceSAndroid Build Coastguard Worker {
357*35238bceSAndroid Build Coastguard Worker     return mod(v, Vector<T, Size>(s));
358*35238bceSAndroid Build Coastguard Worker }
359*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
bitwiseAndVecScalar(const Vector<T,Size> & v,T s)360*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> bitwiseAndVecScalar(const Vector<T, Size> &v, T s)
361*35238bceSAndroid Build Coastguard Worker {
362*35238bceSAndroid Build Coastguard Worker     return bitwiseAnd(v, Vector<T, Size>(s));
363*35238bceSAndroid Build Coastguard Worker }
364*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
bitwiseOrVecScalar(const Vector<T,Size> & v,T s)365*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> bitwiseOrVecScalar(const Vector<T, Size> &v, T s)
366*35238bceSAndroid Build Coastguard Worker {
367*35238bceSAndroid Build Coastguard Worker     return bitwiseOr(v, Vector<T, Size>(s));
368*35238bceSAndroid Build Coastguard Worker }
369*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
bitwiseXorVecScalar(const Vector<T,Size> & v,T s)370*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> bitwiseXorVecScalar(const Vector<T, Size> &v, T s)
371*35238bceSAndroid Build Coastguard Worker {
372*35238bceSAndroid Build Coastguard Worker     return bitwiseXor(v, Vector<T, Size>(s));
373*35238bceSAndroid Build Coastguard Worker }
374*35238bceSAndroid Build Coastguard Worker 
375*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
addScalarVec(T s,const Vector<T,Size> & v)376*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> addScalarVec(T s, const Vector<T, Size> &v)
377*35238bceSAndroid Build Coastguard Worker {
378*35238bceSAndroid Build Coastguard Worker     return s + v;
379*35238bceSAndroid Build Coastguard Worker }
380*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
subScalarVec(T s,const Vector<T,Size> & v)381*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> subScalarVec(T s, const Vector<T, Size> &v)
382*35238bceSAndroid Build Coastguard Worker {
383*35238bceSAndroid Build Coastguard Worker     return s - v;
384*35238bceSAndroid Build Coastguard Worker }
385*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
mulScalarVec(T s,const Vector<T,Size> & v)386*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> mulScalarVec(T s, const Vector<T, Size> &v)
387*35238bceSAndroid Build Coastguard Worker {
388*35238bceSAndroid Build Coastguard Worker     return s * v;
389*35238bceSAndroid Build Coastguard Worker }
390*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
divScalarVec(T s,const Vector<T,Size> & v)391*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> divScalarVec(T s, const Vector<T, Size> &v)
392*35238bceSAndroid Build Coastguard Worker {
393*35238bceSAndroid Build Coastguard Worker     return s / v;
394*35238bceSAndroid Build Coastguard Worker }
395*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
modScalarVec(T s,const Vector<T,Size> & v)396*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> modScalarVec(T s, const Vector<T, Size> &v)
397*35238bceSAndroid Build Coastguard Worker {
398*35238bceSAndroid Build Coastguard Worker     return mod(Vector<T, Size>(s), v);
399*35238bceSAndroid Build Coastguard Worker }
400*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
bitwiseAndScalarVec(T s,const Vector<T,Size> & v)401*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> bitwiseAndScalarVec(T s, const Vector<T, Size> &v)
402*35238bceSAndroid Build Coastguard Worker {
403*35238bceSAndroid Build Coastguard Worker     return bitwiseAnd(Vector<T, Size>(s), v);
404*35238bceSAndroid Build Coastguard Worker }
405*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
bitwiseOrScalarVec(T s,const Vector<T,Size> & v)406*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> bitwiseOrScalarVec(T s, const Vector<T, Size> &v)
407*35238bceSAndroid Build Coastguard Worker {
408*35238bceSAndroid Build Coastguard Worker     return bitwiseOr(Vector<T, Size>(s), v);
409*35238bceSAndroid Build Coastguard Worker }
410*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
bitwiseXorScalarVec(T s,const Vector<T,Size> & v)411*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> bitwiseXorScalarVec(T s, const Vector<T, Size> &v)
412*35238bceSAndroid Build Coastguard Worker {
413*35238bceSAndroid Build Coastguard Worker     return bitwiseXor(Vector<T, Size>(s), v);
414*35238bceSAndroid Build Coastguard Worker }
415*35238bceSAndroid Build Coastguard Worker 
416*35238bceSAndroid Build Coastguard Worker // Reference functions for specific sequence operations for the sequence operator tests.
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0, in2 + in1, in1 + in0"
sequenceNoSideEffCase0(const Vec4 & in0,const Vec4 & in1,const Vec4 & in2)419*35238bceSAndroid Build Coastguard Worker inline Vec4 sequenceNoSideEffCase0(const Vec4 &in0, const Vec4 &in1, const Vec4 &in2)
420*35238bceSAndroid Build Coastguard Worker {
421*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in2);
422*35238bceSAndroid Build Coastguard Worker     return in1 + in0;
423*35238bceSAndroid Build Coastguard Worker }
424*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0, in2 + in1, in1 + in0"
sequenceNoSideEffCase1(float in0,uint32_t in1,float in2)425*35238bceSAndroid Build Coastguard Worker inline uint32_t sequenceNoSideEffCase1(float in0, uint32_t in1, float in2)
426*35238bceSAndroid Build Coastguard Worker {
427*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in0);
428*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in2);
429*35238bceSAndroid Build Coastguard Worker     return in1 + in1;
430*35238bceSAndroid Build Coastguard Worker }
431*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0 && in1, in0, ivec2(vec2(in0) + in2)"
sequenceNoSideEffCase2(bool in0,bool in1,const Vec2 & in2)432*35238bceSAndroid Build Coastguard Worker inline IVec2 sequenceNoSideEffCase2(bool in0, bool in1, const Vec2 &in2)
433*35238bceSAndroid Build Coastguard Worker {
434*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in1);
435*35238bceSAndroid Build Coastguard Worker     return IVec2((int)((float)in0 + in2.x()), (int)((float)in0 + in2.y()));
436*35238bceSAndroid Build Coastguard Worker }
437*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0 + vec4(in1), in2, in1"
sequenceNoSideEffCase3(const Vec4 & in0,const IVec4 & in1,const BVec4 & in2)438*35238bceSAndroid Build Coastguard Worker inline IVec4 sequenceNoSideEffCase3(const Vec4 &in0, const IVec4 &in1, const BVec4 &in2)
439*35238bceSAndroid Build Coastguard Worker {
440*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in0);
441*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in2);
442*35238bceSAndroid Build Coastguard Worker     return in1;
443*35238bceSAndroid Build Coastguard Worker }
444*35238bceSAndroid Build Coastguard Worker // Reference for expression "in0++, in1 = in0 + in2, in2 = in1"
sequenceSideEffCase0(const Vec4 & in0,const Vec4 & in1,const Vec4 & in2)445*35238bceSAndroid Build Coastguard Worker inline Vec4 sequenceSideEffCase0(const Vec4 &in0, const Vec4 &in1, const Vec4 &in2)
446*35238bceSAndroid Build Coastguard Worker {
447*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in1);
448*35238bceSAndroid Build Coastguard Worker     return in0 + 1.0f + in2;
449*35238bceSAndroid Build Coastguard Worker }
450*35238bceSAndroid Build Coastguard Worker // Reference for expression "in1++, in0 = float(in1), in1 = uint(in0 + in2)"
sequenceSideEffCase1(float in0,uint32_t in1,float in2)451*35238bceSAndroid Build Coastguard Worker inline uint32_t sequenceSideEffCase1(float in0, uint32_t in1, float in2)
452*35238bceSAndroid Build Coastguard Worker {
453*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in0);
454*35238bceSAndroid Build Coastguard Worker     return (uint32_t)(float(in1) + 1.0f + in2);
455*35238bceSAndroid Build Coastguard Worker }
456*35238bceSAndroid Build Coastguard Worker // Reference for expression "in1 = in0, in2++, in2 = in2 + vec2(in1), ivec2(in2)"
sequenceSideEffCase2(bool in0,bool in1,const Vec2 & in2)457*35238bceSAndroid Build Coastguard Worker inline IVec2 sequenceSideEffCase2(bool in0, bool in1, const Vec2 &in2)
458*35238bceSAndroid Build Coastguard Worker {
459*35238bceSAndroid Build Coastguard Worker     DE_UNREF(in1);
460*35238bceSAndroid Build Coastguard Worker     return (in2 + Vec2(1.0f) + Vec2((float)in0)).asInt();
461*35238bceSAndroid Build Coastguard Worker }
462*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)463*35238bceSAndroid Build Coastguard Worker inline IVec4 sequenceSideEffCase3(const Vec4 &in0, const IVec4 &in1, const BVec4 &in2)
464*35238bceSAndroid Build Coastguard Worker {
465*35238bceSAndroid Build Coastguard Worker     return in1 + (in0 + Vec4((float)in2.x(), (float)in2.y(), (float)in2.z(), (float)in2.w())).asInt();
466*35238bceSAndroid Build Coastguard Worker }
467*35238bceSAndroid Build Coastguard Worker 
468*35238bceSAndroid Build Coastguard Worker // ShaderEvalFunc-type wrappers for the above functions.
evalSequenceNoSideEffCase0(ShaderEvalContext & ctx)469*35238bceSAndroid Build Coastguard Worker void evalSequenceNoSideEffCase0(ShaderEvalContext &ctx)
470*35238bceSAndroid Build Coastguard Worker {
471*35238bceSAndroid Build Coastguard Worker     ctx.color = sequenceNoSideEffCase0(ctx.in[0].swizzle(1, 2, 3, 0), ctx.in[1].swizzle(3, 2, 1, 0),
472*35238bceSAndroid Build Coastguard Worker                                        ctx.in[2].swizzle(0, 3, 2, 1));
473*35238bceSAndroid Build Coastguard Worker }
evalSequenceNoSideEffCase1(ShaderEvalContext & ctx)474*35238bceSAndroid Build Coastguard Worker void evalSequenceNoSideEffCase1(ShaderEvalContext &ctx)
475*35238bceSAndroid Build Coastguard Worker {
476*35238bceSAndroid Build Coastguard Worker     ctx.color.x() = (float)sequenceNoSideEffCase1(ctx.in[0].z(), (uint32_t)ctx.in[1].x(), ctx.in[2].y());
477*35238bceSAndroid Build Coastguard Worker }
evalSequenceNoSideEffCase2(ShaderEvalContext & ctx)478*35238bceSAndroid Build Coastguard Worker void evalSequenceNoSideEffCase2(ShaderEvalContext &ctx)
479*35238bceSAndroid Build Coastguard Worker {
480*35238bceSAndroid Build Coastguard Worker     ctx.color.yz() =
481*35238bceSAndroid Build Coastguard Worker         sequenceNoSideEffCase2(ctx.in[0].z() > 0.0f, ctx.in[1].x() > 0.0f, ctx.in[2].swizzle(2, 1)).asFloat();
482*35238bceSAndroid Build Coastguard Worker }
evalSequenceNoSideEffCase3(ShaderEvalContext & ctx)483*35238bceSAndroid Build Coastguard Worker void evalSequenceNoSideEffCase3(ShaderEvalContext &ctx)
484*35238bceSAndroid Build Coastguard Worker {
485*35238bceSAndroid Build Coastguard Worker     ctx.color = sequenceNoSideEffCase3(ctx.in[0].swizzle(1, 2, 3, 0), ctx.in[1].swizzle(3, 2, 1, 0).asInt(),
486*35238bceSAndroid Build Coastguard Worker                                        greaterThan(ctx.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f)))
487*35238bceSAndroid Build Coastguard Worker                     .asFloat();
488*35238bceSAndroid Build Coastguard Worker }
evalSequenceSideEffCase0(ShaderEvalContext & ctx)489*35238bceSAndroid Build Coastguard Worker void evalSequenceSideEffCase0(ShaderEvalContext &ctx)
490*35238bceSAndroid Build Coastguard Worker {
491*35238bceSAndroid Build Coastguard Worker     ctx.color = sequenceSideEffCase0(ctx.in[0].swizzle(1, 2, 3, 0), ctx.in[1].swizzle(3, 2, 1, 0),
492*35238bceSAndroid Build Coastguard Worker                                      ctx.in[2].swizzle(0, 3, 2, 1));
493*35238bceSAndroid Build Coastguard Worker }
evalSequenceSideEffCase1(ShaderEvalContext & ctx)494*35238bceSAndroid Build Coastguard Worker void evalSequenceSideEffCase1(ShaderEvalContext &ctx)
495*35238bceSAndroid Build Coastguard Worker {
496*35238bceSAndroid Build Coastguard Worker     ctx.color.x() = (float)sequenceSideEffCase1(ctx.in[0].z(), (uint32_t)ctx.in[1].x(), ctx.in[2].y());
497*35238bceSAndroid Build Coastguard Worker }
evalSequenceSideEffCase2(ShaderEvalContext & ctx)498*35238bceSAndroid Build Coastguard Worker void evalSequenceSideEffCase2(ShaderEvalContext &ctx)
499*35238bceSAndroid Build Coastguard Worker {
500*35238bceSAndroid Build Coastguard Worker     ctx.color.yz() =
501*35238bceSAndroid Build Coastguard Worker         sequenceSideEffCase2(ctx.in[0].z() > 0.0f, ctx.in[1].x() > 0.0f, ctx.in[2].swizzle(2, 1)).asFloat();
502*35238bceSAndroid Build Coastguard Worker }
evalSequenceSideEffCase3(ShaderEvalContext & ctx)503*35238bceSAndroid Build Coastguard Worker void evalSequenceSideEffCase3(ShaderEvalContext &ctx)
504*35238bceSAndroid Build Coastguard Worker {
505*35238bceSAndroid Build Coastguard Worker     ctx.color = sequenceSideEffCase3(ctx.in[0].swizzle(1, 2, 3, 0), ctx.in[1].swizzle(3, 2, 1, 0).asInt(),
506*35238bceSAndroid Build Coastguard Worker                                      greaterThan(ctx.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f)))
507*35238bceSAndroid Build Coastguard Worker                     .asFloat();
508*35238bceSAndroid Build Coastguard Worker }
509*35238bceSAndroid Build Coastguard Worker 
stringJoin(const vector<string> & elems,const string & delim)510*35238bceSAndroid Build Coastguard Worker static string stringJoin(const vector<string> &elems, const string &delim)
511*35238bceSAndroid Build Coastguard Worker {
512*35238bceSAndroid Build Coastguard Worker     string result;
513*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < (int)elems.size(); i++)
514*35238bceSAndroid Build Coastguard Worker         result += (i > 0 ? delim : "") + elems[i];
515*35238bceSAndroid Build Coastguard Worker     return result;
516*35238bceSAndroid Build Coastguard Worker }
517*35238bceSAndroid Build Coastguard Worker 
stringReplace(string & str,const string & from,const string & to)518*35238bceSAndroid Build Coastguard Worker static void stringReplace(string &str, const string &from, const string &to)
519*35238bceSAndroid Build Coastguard Worker {
520*35238bceSAndroid Build Coastguard Worker     size_t start_pos = 0;
521*35238bceSAndroid Build Coastguard Worker     while ((start_pos = str.find(from, start_pos)) != std::string::npos)
522*35238bceSAndroid Build Coastguard Worker     {
523*35238bceSAndroid Build Coastguard Worker         str.replace(start_pos, from.length(), to);
524*35238bceSAndroid Build Coastguard Worker         start_pos += to.length();
525*35238bceSAndroid Build Coastguard Worker     }
526*35238bceSAndroid Build Coastguard Worker }
527*35238bceSAndroid Build Coastguard Worker 
twoValuedVec4(const string & first,const string & second,const BVec4 & firstMask)528*35238bceSAndroid Build Coastguard Worker static string twoValuedVec4(const string &first, const string &second, const BVec4 &firstMask)
529*35238bceSAndroid Build Coastguard Worker {
530*35238bceSAndroid Build Coastguard Worker     vector<string> elems(4);
531*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < 4; i++)
532*35238bceSAndroid Build Coastguard Worker         elems[i] = firstMask[i] ? first : second;
533*35238bceSAndroid Build Coastguard Worker 
534*35238bceSAndroid Build Coastguard Worker     return "vec4(" + stringJoin(elems, ", ") + ")";
535*35238bceSAndroid Build Coastguard Worker }
536*35238bceSAndroid Build Coastguard Worker 
537*35238bceSAndroid Build Coastguard Worker enum
538*35238bceSAndroid Build Coastguard Worker {
539*35238bceSAndroid Build Coastguard Worker     MAX_INPUTS = 3
540*35238bceSAndroid Build Coastguard Worker };
541*35238bceSAndroid Build Coastguard Worker 
542*35238bceSAndroid Build Coastguard Worker enum PrecisionMask
543*35238bceSAndroid Build Coastguard Worker {
544*35238bceSAndroid Build Coastguard Worker     PRECMASK_NA      = 0, //!< Precision not applicable (booleans)
545*35238bceSAndroid Build Coastguard Worker     PRECMASK_LOWP    = (1 << PRECISION_LOWP),
546*35238bceSAndroid Build Coastguard Worker     PRECMASK_MEDIUMP = (1 << PRECISION_MEDIUMP),
547*35238bceSAndroid Build Coastguard Worker     PRECMASK_HIGHP   = (1 << PRECISION_HIGHP),
548*35238bceSAndroid Build Coastguard Worker 
549*35238bceSAndroid Build Coastguard Worker     PRECMASK_LOWP_MEDIUMP  = PRECMASK_LOWP | PRECMASK_MEDIUMP,
550*35238bceSAndroid Build Coastguard Worker     PRECMASK_MEDIUMP_HIGHP = PRECMASK_MEDIUMP | PRECMASK_HIGHP,
551*35238bceSAndroid Build Coastguard Worker     PRECMASK_ALL           = PRECMASK_LOWP | PRECMASK_MEDIUMP | PRECMASK_HIGHP
552*35238bceSAndroid Build Coastguard Worker };
553*35238bceSAndroid Build Coastguard Worker 
554*35238bceSAndroid Build Coastguard Worker enum ValueType
555*35238bceSAndroid Build Coastguard Worker {
556*35238bceSAndroid Build Coastguard Worker     VALUE_NONE          = 0,
557*35238bceSAndroid Build Coastguard Worker     VALUE_FLOAT         = (1 << 0),  // float scalar
558*35238bceSAndroid Build Coastguard Worker     VALUE_FLOAT_VEC     = (1 << 1),  // float vector
559*35238bceSAndroid Build Coastguard Worker     VALUE_FLOAT_GENTYPE = (1 << 2),  // float scalar/vector
560*35238bceSAndroid Build Coastguard Worker     VALUE_VEC3          = (1 << 3),  // vec3 only
561*35238bceSAndroid Build Coastguard Worker     VALUE_MATRIX        = (1 << 4),  // matrix
562*35238bceSAndroid Build Coastguard Worker     VALUE_BOOL          = (1 << 5),  // boolean scalar
563*35238bceSAndroid Build Coastguard Worker     VALUE_BOOL_VEC      = (1 << 6),  // boolean vector
564*35238bceSAndroid Build Coastguard Worker     VALUE_BOOL_GENTYPE  = (1 << 7),  // boolean scalar/vector
565*35238bceSAndroid Build Coastguard Worker     VALUE_INT           = (1 << 8),  // int scalar
566*35238bceSAndroid Build Coastguard Worker     VALUE_INT_VEC       = (1 << 9),  // int vector
567*35238bceSAndroid Build Coastguard Worker     VALUE_INT_GENTYPE   = (1 << 10), // int scalar/vector
568*35238bceSAndroid Build Coastguard Worker     VALUE_UINT          = (1 << 11), // uint scalar
569*35238bceSAndroid Build Coastguard Worker     VALUE_UINT_VEC      = (1 << 12), // uint vector
570*35238bceSAndroid Build Coastguard Worker     VALUE_UINT_GENTYPE  = (1 << 13), // uint scalar/vector
571*35238bceSAndroid Build Coastguard Worker 
572*35238bceSAndroid Build Coastguard Worker     // Shorthands.
573*35238bceSAndroid Build Coastguard Worker     F   = VALUE_FLOAT,
574*35238bceSAndroid Build Coastguard Worker     FV  = VALUE_FLOAT_VEC,
575*35238bceSAndroid Build Coastguard Worker     GT  = VALUE_FLOAT_GENTYPE,
576*35238bceSAndroid Build Coastguard Worker     V3  = VALUE_VEC3,
577*35238bceSAndroid Build Coastguard Worker     M   = VALUE_MATRIX,
578*35238bceSAndroid Build Coastguard Worker     B   = VALUE_BOOL,
579*35238bceSAndroid Build Coastguard Worker     BV  = VALUE_BOOL_VEC,
580*35238bceSAndroid Build Coastguard Worker     BGT = VALUE_BOOL_GENTYPE,
581*35238bceSAndroid Build Coastguard Worker     I   = VALUE_INT,
582*35238bceSAndroid Build Coastguard Worker     IV  = VALUE_INT_VEC,
583*35238bceSAndroid Build Coastguard Worker     IGT = VALUE_INT_GENTYPE,
584*35238bceSAndroid Build Coastguard Worker     U   = VALUE_UINT,
585*35238bceSAndroid Build Coastguard Worker     UV  = VALUE_UINT_VEC,
586*35238bceSAndroid Build Coastguard Worker     UGT = VALUE_UINT_GENTYPE
587*35238bceSAndroid Build Coastguard Worker };
588*35238bceSAndroid Build Coastguard Worker 
isScalarType(ValueType type)589*35238bceSAndroid Build Coastguard Worker static inline bool isScalarType(ValueType type)
590*35238bceSAndroid Build Coastguard Worker {
591*35238bceSAndroid Build Coastguard Worker     return type == VALUE_FLOAT || type == VALUE_BOOL || type == VALUE_INT || type == VALUE_UINT;
592*35238bceSAndroid Build Coastguard Worker }
593*35238bceSAndroid Build Coastguard Worker 
isFloatType(ValueType type)594*35238bceSAndroid Build Coastguard Worker static inline bool isFloatType(ValueType type)
595*35238bceSAndroid Build Coastguard Worker {
596*35238bceSAndroid Build Coastguard Worker     return (type & (VALUE_FLOAT | VALUE_FLOAT_VEC | VALUE_FLOAT_GENTYPE)) != 0;
597*35238bceSAndroid Build Coastguard Worker }
598*35238bceSAndroid Build Coastguard Worker 
isIntType(ValueType type)599*35238bceSAndroid Build Coastguard Worker static inline bool isIntType(ValueType type)
600*35238bceSAndroid Build Coastguard Worker {
601*35238bceSAndroid Build Coastguard Worker     return (type & (VALUE_INT | VALUE_INT_VEC | VALUE_INT_GENTYPE)) != 0;
602*35238bceSAndroid Build Coastguard Worker }
603*35238bceSAndroid Build Coastguard Worker 
isUintType(ValueType type)604*35238bceSAndroid Build Coastguard Worker static inline bool isUintType(ValueType type)
605*35238bceSAndroid Build Coastguard Worker {
606*35238bceSAndroid Build Coastguard Worker     return (type & (VALUE_UINT | VALUE_UINT_VEC | VALUE_UINT_GENTYPE)) != 0;
607*35238bceSAndroid Build Coastguard Worker }
608*35238bceSAndroid Build Coastguard Worker 
isBoolType(ValueType type)609*35238bceSAndroid Build Coastguard Worker static inline bool isBoolType(ValueType type)
610*35238bceSAndroid Build Coastguard Worker {
611*35238bceSAndroid Build Coastguard Worker     return (type & (VALUE_BOOL | VALUE_BOOL_VEC | VALUE_BOOL_GENTYPE)) != 0;
612*35238bceSAndroid Build Coastguard Worker }
613*35238bceSAndroid Build Coastguard Worker 
getGLSLUintBits(const glw::Functions & gl,ShaderType shaderType,Precision uintPrecision)614*35238bceSAndroid Build Coastguard Worker static inline int getGLSLUintBits(const glw::Functions &gl, ShaderType shaderType, Precision uintPrecision)
615*35238bceSAndroid Build Coastguard Worker {
616*35238bceSAndroid Build Coastguard Worker     uint32_t intPrecisionGL;
617*35238bceSAndroid Build Coastguard Worker     uint32_t shaderTypeGL;
618*35238bceSAndroid Build Coastguard Worker 
619*35238bceSAndroid Build Coastguard Worker     switch (uintPrecision)
620*35238bceSAndroid Build Coastguard Worker     {
621*35238bceSAndroid Build Coastguard Worker     case PRECISION_LOWP:
622*35238bceSAndroid Build Coastguard Worker         intPrecisionGL = GL_LOW_INT;
623*35238bceSAndroid Build Coastguard Worker         break;
624*35238bceSAndroid Build Coastguard Worker     case PRECISION_MEDIUMP:
625*35238bceSAndroid Build Coastguard Worker         intPrecisionGL = GL_MEDIUM_INT;
626*35238bceSAndroid Build Coastguard Worker         break;
627*35238bceSAndroid Build Coastguard Worker     case PRECISION_HIGHP:
628*35238bceSAndroid Build Coastguard Worker         intPrecisionGL = GL_HIGH_INT;
629*35238bceSAndroid Build Coastguard Worker         break;
630*35238bceSAndroid Build Coastguard Worker     default:
631*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
632*35238bceSAndroid Build Coastguard Worker         intPrecisionGL = 0;
633*35238bceSAndroid Build Coastguard Worker     }
634*35238bceSAndroid Build Coastguard Worker 
635*35238bceSAndroid Build Coastguard Worker     switch (shaderType)
636*35238bceSAndroid Build Coastguard Worker     {
637*35238bceSAndroid Build Coastguard Worker     case SHADERTYPE_VERTEX:
638*35238bceSAndroid Build Coastguard Worker         shaderTypeGL = GL_VERTEX_SHADER;
639*35238bceSAndroid Build Coastguard Worker         break;
640*35238bceSAndroid Build Coastguard Worker     case SHADERTYPE_FRAGMENT:
641*35238bceSAndroid Build Coastguard Worker         shaderTypeGL = GL_FRAGMENT_SHADER;
642*35238bceSAndroid Build Coastguard Worker         break;
643*35238bceSAndroid Build Coastguard Worker     default:
644*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
645*35238bceSAndroid Build Coastguard Worker         shaderTypeGL = 0;
646*35238bceSAndroid Build Coastguard Worker     }
647*35238bceSAndroid Build Coastguard Worker 
648*35238bceSAndroid Build Coastguard Worker     glw::GLint range[2]  = {-1, -1};
649*35238bceSAndroid Build Coastguard Worker     glw::GLint precision = -1;
650*35238bceSAndroid Build Coastguard Worker 
651*35238bceSAndroid Build Coastguard Worker     gl.getShaderPrecisionFormat(shaderTypeGL, intPrecisionGL, &range[0], &precision);
652*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderPrecisionFormat failed");
653*35238bceSAndroid Build Coastguard Worker 
654*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(de::inBounds(range[0], 8, 32));
655*35238bceSAndroid Build Coastguard Worker 
656*35238bceSAndroid Build Coastguard Worker     const int numBitsInType = range[0] + 1;
657*35238bceSAndroid Build Coastguard Worker     return numBitsInType;
658*35238bceSAndroid Build Coastguard Worker }
659*35238bceSAndroid Build Coastguard Worker 
getGLSLUintMaxAsFloat(const glw::Functions & gl,ShaderType shaderType,Precision uintPrecision)660*35238bceSAndroid Build Coastguard Worker static inline float getGLSLUintMaxAsFloat(const glw::Functions &gl, ShaderType shaderType, Precision uintPrecision)
661*35238bceSAndroid Build Coastguard Worker {
662*35238bceSAndroid Build Coastguard Worker     const int numBitsInType             = getGLSLUintBits(gl, shaderType, uintPrecision);
663*35238bceSAndroid Build Coastguard Worker     const float maxAsFloat              = static_cast<float>((1ull << numBitsInType) - 1);
664*35238bceSAndroid Build Coastguard Worker     const float maxRepresentableAsFloat = floorf(nextafterf(maxAsFloat, 0));
665*35238bceSAndroid Build Coastguard Worker 
666*35238bceSAndroid Build Coastguard Worker     // Not accurate for integers wider than 24 bits.
667*35238bceSAndroid Build Coastguard Worker     return numBitsInType > 24 ? maxRepresentableAsFloat : maxAsFloat;
668*35238bceSAndroid Build Coastguard Worker }
669*35238bceSAndroid Build Coastguard Worker 
670*35238bceSAndroid Build Coastguard Worker // Float scalar that can be either constant or a symbol that can be evaluated later.
671*35238bceSAndroid Build Coastguard Worker class FloatScalar
672*35238bceSAndroid Build Coastguard Worker {
673*35238bceSAndroid Build Coastguard Worker public:
674*35238bceSAndroid Build Coastguard Worker     enum Symbol
675*35238bceSAndroid Build Coastguard Worker     {
676*35238bceSAndroid Build Coastguard Worker         SYMBOL_LOWP_UINT_MAX = 0,
677*35238bceSAndroid Build Coastguard Worker         SYMBOL_MEDIUMP_UINT_MAX,
678*35238bceSAndroid Build Coastguard Worker 
679*35238bceSAndroid Build Coastguard Worker         SYMBOL_LOWP_UINT_MAX_RECIPROCAL,
680*35238bceSAndroid Build Coastguard Worker         SYMBOL_MEDIUMP_UINT_MAX_RECIPROCAL,
681*35238bceSAndroid Build Coastguard Worker 
682*35238bceSAndroid Build Coastguard Worker         SYMBOL_ONE_MINUS_UINT32MAX_DIV_LOWP_UINT_MAX,
683*35238bceSAndroid Build Coastguard Worker         SYMBOL_ONE_MINUS_UINT32MAX_DIV_MEDIUMP_UINT_MAX,
684*35238bceSAndroid Build Coastguard Worker 
685*35238bceSAndroid Build Coastguard Worker         SYMBOL_LAST
686*35238bceSAndroid Build Coastguard Worker     };
687*35238bceSAndroid Build Coastguard Worker 
FloatScalar(float c)688*35238bceSAndroid Build Coastguard Worker     FloatScalar(float c) : m_isConstant(true), m_value(c)
689*35238bceSAndroid Build Coastguard Worker     {
690*35238bceSAndroid Build Coastguard Worker     }
FloatScalar(Symbol s)691*35238bceSAndroid Build Coastguard Worker     FloatScalar(Symbol s) : m_isConstant(false), m_value(s)
692*35238bceSAndroid Build Coastguard Worker     {
693*35238bceSAndroid Build Coastguard Worker     }
694*35238bceSAndroid Build Coastguard Worker 
getValue(const glw::Functions & gl,ShaderType shaderType) const695*35238bceSAndroid Build Coastguard Worker     float getValue(const glw::Functions &gl, ShaderType shaderType) const
696*35238bceSAndroid Build Coastguard Worker     {
697*35238bceSAndroid Build Coastguard Worker         if (m_isConstant)
698*35238bceSAndroid Build Coastguard Worker             return m_value.constant;
699*35238bceSAndroid Build Coastguard Worker         else
700*35238bceSAndroid Build Coastguard Worker         {
701*35238bceSAndroid Build Coastguard Worker             switch (m_value.symbol)
702*35238bceSAndroid Build Coastguard Worker             {
703*35238bceSAndroid Build Coastguard Worker             case SYMBOL_LOWP_UINT_MAX:
704*35238bceSAndroid Build Coastguard Worker                 return getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_LOWP);
705*35238bceSAndroid Build Coastguard Worker             case SYMBOL_MEDIUMP_UINT_MAX:
706*35238bceSAndroid Build Coastguard Worker                 return getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_MEDIUMP);
707*35238bceSAndroid Build Coastguard Worker 
708*35238bceSAndroid Build Coastguard Worker             case SYMBOL_LOWP_UINT_MAX_RECIPROCAL:
709*35238bceSAndroid Build Coastguard Worker                 return 1.0f / getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_LOWP);
710*35238bceSAndroid Build Coastguard Worker             case SYMBOL_MEDIUMP_UINT_MAX_RECIPROCAL:
711*35238bceSAndroid Build Coastguard Worker                 return 1.0f / getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_MEDIUMP);
712*35238bceSAndroid Build Coastguard Worker 
713*35238bceSAndroid Build Coastguard Worker             case SYMBOL_ONE_MINUS_UINT32MAX_DIV_LOWP_UINT_MAX:
714*35238bceSAndroid Build Coastguard Worker                 return 1.0f - (float)std::numeric_limits<uint32_t>::max() /
715*35238bceSAndroid Build Coastguard Worker                                   getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_LOWP);
716*35238bceSAndroid Build Coastguard Worker             case SYMBOL_ONE_MINUS_UINT32MAX_DIV_MEDIUMP_UINT_MAX:
717*35238bceSAndroid Build Coastguard Worker                 return 1.0f - (float)std::numeric_limits<uint32_t>::max() /
718*35238bceSAndroid Build Coastguard Worker                                   getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_MEDIUMP);
719*35238bceSAndroid Build Coastguard Worker 
720*35238bceSAndroid Build Coastguard Worker             default:
721*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
722*35238bceSAndroid Build Coastguard Worker                 return 0.0f;
723*35238bceSAndroid Build Coastguard Worker             }
724*35238bceSAndroid Build Coastguard Worker         }
725*35238bceSAndroid Build Coastguard Worker     }
726*35238bceSAndroid Build Coastguard Worker 
getValueMask(const glw::Functions & gl,ShaderType shaderType) const727*35238bceSAndroid Build Coastguard Worker     uint32_t getValueMask(const glw::Functions &gl, ShaderType shaderType) const
728*35238bceSAndroid Build Coastguard Worker     {
729*35238bceSAndroid Build Coastguard Worker         if (m_isConstant)
730*35238bceSAndroid Build Coastguard Worker             return 0;
731*35238bceSAndroid Build Coastguard Worker 
732*35238bceSAndroid Build Coastguard Worker         int bits = 0;
733*35238bceSAndroid Build Coastguard Worker         switch (m_value.symbol)
734*35238bceSAndroid Build Coastguard Worker         {
735*35238bceSAndroid Build Coastguard Worker         case SYMBOL_LOWP_UINT_MAX_RECIPROCAL:
736*35238bceSAndroid Build Coastguard Worker         case SYMBOL_LOWP_UINT_MAX:
737*35238bceSAndroid Build Coastguard Worker             bits = getGLSLUintBits(gl, shaderType, PRECISION_LOWP);
738*35238bceSAndroid Build Coastguard Worker             break;
739*35238bceSAndroid Build Coastguard Worker 
740*35238bceSAndroid Build Coastguard Worker         case SYMBOL_MEDIUMP_UINT_MAX_RECIPROCAL:
741*35238bceSAndroid Build Coastguard Worker         case SYMBOL_MEDIUMP_UINT_MAX:
742*35238bceSAndroid Build Coastguard Worker             bits = getGLSLUintBits(gl, shaderType, PRECISION_MEDIUMP);
743*35238bceSAndroid Build Coastguard Worker             break;
744*35238bceSAndroid Build Coastguard Worker 
745*35238bceSAndroid Build Coastguard Worker         case SYMBOL_ONE_MINUS_UINT32MAX_DIV_LOWP_UINT_MAX:
746*35238bceSAndroid Build Coastguard Worker         case SYMBOL_ONE_MINUS_UINT32MAX_DIV_MEDIUMP_UINT_MAX:
747*35238bceSAndroid Build Coastguard Worker             return 0;
748*35238bceSAndroid Build Coastguard Worker 
749*35238bceSAndroid Build Coastguard Worker         default:
750*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
751*35238bceSAndroid Build Coastguard Worker             return 0;
752*35238bceSAndroid Build Coastguard Worker         }
753*35238bceSAndroid Build Coastguard Worker 
754*35238bceSAndroid Build Coastguard Worker         return bits == 32 ? 0 : (1u << bits) - 1;
755*35238bceSAndroid Build Coastguard Worker     }
756*35238bceSAndroid Build Coastguard Worker 
757*35238bceSAndroid Build Coastguard Worker private:
758*35238bceSAndroid Build Coastguard Worker     bool m_isConstant;
759*35238bceSAndroid Build Coastguard Worker 
760*35238bceSAndroid Build Coastguard Worker     union ConstantOrSymbol
761*35238bceSAndroid Build Coastguard Worker     {
762*35238bceSAndroid Build Coastguard Worker         float constant;
763*35238bceSAndroid Build Coastguard Worker         Symbol symbol;
764*35238bceSAndroid Build Coastguard Worker 
ConstantOrSymbol(float c)765*35238bceSAndroid Build Coastguard Worker         ConstantOrSymbol(float c) : constant(c)
766*35238bceSAndroid Build Coastguard Worker         {
767*35238bceSAndroid Build Coastguard Worker         }
ConstantOrSymbol(Symbol s)768*35238bceSAndroid Build Coastguard Worker         ConstantOrSymbol(Symbol s) : symbol(s)
769*35238bceSAndroid Build Coastguard Worker         {
770*35238bceSAndroid Build Coastguard Worker         }
771*35238bceSAndroid Build Coastguard Worker     } m_value;
772*35238bceSAndroid Build Coastguard Worker };
773*35238bceSAndroid Build Coastguard Worker 
774*35238bceSAndroid Build Coastguard Worker struct Value
775*35238bceSAndroid Build Coastguard Worker {
Valuedeqp::gles3::Functional::Value776*35238bceSAndroid Build Coastguard Worker     Value(ValueType valueType_, const FloatScalar &rangeMin_, const FloatScalar &rangeMax_)
777*35238bceSAndroid Build Coastguard Worker         : valueType(valueType_)
778*35238bceSAndroid Build Coastguard Worker         , rangeMin(rangeMin_)
779*35238bceSAndroid Build Coastguard Worker         , rangeMax(rangeMax_)
780*35238bceSAndroid Build Coastguard Worker     {
781*35238bceSAndroid Build Coastguard Worker     }
782*35238bceSAndroid Build Coastguard Worker 
783*35238bceSAndroid Build Coastguard Worker     ValueType valueType;
784*35238bceSAndroid Build Coastguard Worker     FloatScalar rangeMin;
785*35238bceSAndroid Build Coastguard Worker     FloatScalar rangeMax;
786*35238bceSAndroid Build Coastguard Worker };
787*35238bceSAndroid Build Coastguard Worker 
788*35238bceSAndroid Build Coastguard Worker enum OperationType
789*35238bceSAndroid Build Coastguard Worker {
790*35238bceSAndroid Build Coastguard Worker     FUNCTION = 0,
791*35238bceSAndroid Build Coastguard Worker     OPERATOR,
792*35238bceSAndroid Build Coastguard Worker     SIDE_EFFECT_OPERATOR // Test the side-effect (as opposed to the result) of a side-effect operator.
793*35238bceSAndroid Build Coastguard Worker };
794*35238bceSAndroid Build Coastguard Worker 
795*35238bceSAndroid Build Coastguard Worker struct BuiltinFuncInfo
796*35238bceSAndroid Build Coastguard Worker {
BuiltinFuncInfodeqp::gles3::Functional::BuiltinFuncInfo797*35238bceSAndroid Build Coastguard Worker     BuiltinFuncInfo(const char *caseName_, const char *shaderFuncName_, ValueType outValue_, Value input0_,
798*35238bceSAndroid Build Coastguard Worker                     Value input1_, Value input2_, const FloatScalar &resultScale_, const FloatScalar &resultBias_,
799*35238bceSAndroid Build Coastguard Worker                     uint32_t precisionMask_, ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_,
800*35238bceSAndroid Build Coastguard Worker                     ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_, OperationType type_ = FUNCTION,
801*35238bceSAndroid Build Coastguard Worker                     bool isUnaryPrefix_ = true)
802*35238bceSAndroid Build Coastguard Worker         : caseName(caseName_)
803*35238bceSAndroid Build Coastguard Worker         , shaderFuncName(shaderFuncName_)
804*35238bceSAndroid Build Coastguard Worker         , outValue(outValue_)
805*35238bceSAndroid Build Coastguard Worker         , input0(input0_)
806*35238bceSAndroid Build Coastguard Worker         , input1(input1_)
807*35238bceSAndroid Build Coastguard Worker         , input2(input2_)
808*35238bceSAndroid Build Coastguard Worker         , resultScale(resultScale_)
809*35238bceSAndroid Build Coastguard Worker         , resultBias(resultBias_)
810*35238bceSAndroid Build Coastguard Worker         , referenceScale(resultScale_)
811*35238bceSAndroid Build Coastguard Worker         , referenceBias(resultBias_)
812*35238bceSAndroid Build Coastguard Worker         , precisionMask(precisionMask_)
813*35238bceSAndroid Build Coastguard Worker         , evalFuncScalar(evalFuncScalar_)
814*35238bceSAndroid Build Coastguard Worker         , evalFuncVec2(evalFuncVec2_)
815*35238bceSAndroid Build Coastguard Worker         , evalFuncVec3(evalFuncVec3_)
816*35238bceSAndroid Build Coastguard Worker         , evalFuncVec4(evalFuncVec4_)
817*35238bceSAndroid Build Coastguard Worker         , type(type_)
818*35238bceSAndroid Build Coastguard Worker         , isUnaryPrefix(isUnaryPrefix_)
819*35238bceSAndroid Build Coastguard Worker     {
820*35238bceSAndroid Build Coastguard Worker     }
821*35238bceSAndroid Build Coastguard Worker 
BuiltinFuncInfodeqp::gles3::Functional::BuiltinFuncInfo822*35238bceSAndroid Build Coastguard Worker     BuiltinFuncInfo(const char *caseName_, const char *shaderFuncName_, ValueType outValue_, Value input0_,
823*35238bceSAndroid Build Coastguard Worker                     Value input1_, Value input2_, const FloatScalar &resultScale_, const FloatScalar &resultBias_,
824*35238bceSAndroid Build Coastguard Worker                     const FloatScalar &referenceScale_, const FloatScalar &referenceBias_, uint32_t precisionMask_,
825*35238bceSAndroid Build Coastguard Worker                     ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_,
826*35238bceSAndroid Build Coastguard Worker                     ShaderEvalFunc evalFuncVec4_, OperationType type_ = FUNCTION, bool isUnaryPrefix_ = true)
827*35238bceSAndroid Build Coastguard Worker         : caseName(caseName_)
828*35238bceSAndroid Build Coastguard Worker         , shaderFuncName(shaderFuncName_)
829*35238bceSAndroid Build Coastguard Worker         , outValue(outValue_)
830*35238bceSAndroid Build Coastguard Worker         , input0(input0_)
831*35238bceSAndroid Build Coastguard Worker         , input1(input1_)
832*35238bceSAndroid Build Coastguard Worker         , input2(input2_)
833*35238bceSAndroid Build Coastguard Worker         , resultScale(resultScale_)
834*35238bceSAndroid Build Coastguard Worker         , resultBias(resultBias_)
835*35238bceSAndroid Build Coastguard Worker         , referenceScale(referenceScale_)
836*35238bceSAndroid Build Coastguard Worker         , referenceBias(referenceBias_)
837*35238bceSAndroid Build Coastguard Worker         , precisionMask(precisionMask_)
838*35238bceSAndroid Build Coastguard Worker         , evalFuncScalar(evalFuncScalar_)
839*35238bceSAndroid Build Coastguard Worker         , evalFuncVec2(evalFuncVec2_)
840*35238bceSAndroid Build Coastguard Worker         , evalFuncVec3(evalFuncVec3_)
841*35238bceSAndroid Build Coastguard Worker         , evalFuncVec4(evalFuncVec4_)
842*35238bceSAndroid Build Coastguard Worker         , type(type_)
843*35238bceSAndroid Build Coastguard Worker         , isUnaryPrefix(isUnaryPrefix_)
844*35238bceSAndroid Build Coastguard Worker     {
845*35238bceSAndroid Build Coastguard Worker     }
846*35238bceSAndroid Build Coastguard Worker 
847*35238bceSAndroid Build Coastguard Worker     const char *caseName;       //!< Name of case.
848*35238bceSAndroid Build Coastguard Worker     const char *shaderFuncName; //!< Name in shading language.
849*35238bceSAndroid Build Coastguard Worker     ValueType outValue;
850*35238bceSAndroid Build Coastguard Worker     Value input0;
851*35238bceSAndroid Build Coastguard Worker     Value input1;
852*35238bceSAndroid Build Coastguard Worker     Value input2;
853*35238bceSAndroid Build Coastguard Worker     FloatScalar resultScale;
854*35238bceSAndroid Build Coastguard Worker     FloatScalar resultBias;
855*35238bceSAndroid Build Coastguard Worker     FloatScalar referenceScale;
856*35238bceSAndroid Build Coastguard Worker     FloatScalar referenceBias;
857*35238bceSAndroid Build Coastguard Worker     uint32_t precisionMask;
858*35238bceSAndroid Build Coastguard Worker     ShaderEvalFunc evalFuncScalar;
859*35238bceSAndroid Build Coastguard Worker     ShaderEvalFunc evalFuncVec2;
860*35238bceSAndroid Build Coastguard Worker     ShaderEvalFunc evalFuncVec3;
861*35238bceSAndroid Build Coastguard Worker     ShaderEvalFunc evalFuncVec4;
862*35238bceSAndroid Build Coastguard Worker     OperationType type;
863*35238bceSAndroid Build Coastguard Worker     bool isUnaryPrefix; //!< Whether a unary operator is a prefix operator; redundant unless unary.
864*35238bceSAndroid Build Coastguard Worker };
865*35238bceSAndroid Build Coastguard Worker 
BuiltinOperInfo(const char * caseName_,const char * shaderFuncName_,ValueType outValue_,Value input0_,Value input1_,Value input2_,const FloatScalar & resultScale_,const FloatScalar & resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_)866*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinOperInfo(const char *caseName_, const char *shaderFuncName_, ValueType outValue_,
867*35238bceSAndroid Build Coastguard Worker                                               Value input0_, Value input1_, Value input2_,
868*35238bceSAndroid Build Coastguard Worker                                               const FloatScalar &resultScale_, const FloatScalar &resultBias_,
869*35238bceSAndroid Build Coastguard Worker                                               uint32_t precisionMask_, ShaderEvalFunc evalFuncScalar_,
870*35238bceSAndroid Build Coastguard Worker                                               ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_,
871*35238bceSAndroid Build Coastguard Worker                                               ShaderEvalFunc evalFuncVec4_)
872*35238bceSAndroid Build Coastguard Worker {
873*35238bceSAndroid Build Coastguard Worker     return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
874*35238bceSAndroid Build Coastguard Worker                            resultScale_, resultBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_,
875*35238bceSAndroid Build Coastguard Worker                            evalFuncVec4_, OPERATOR);
876*35238bceSAndroid Build Coastguard Worker }
877*35238bceSAndroid Build Coastguard Worker 
BuiltinOperInfoSeparateRefScaleBias(const char * caseName_,const char * shaderFuncName_,ValueType outValue_,Value input0_,Value input1_,Value input2_,const FloatScalar & resultScale_,const FloatScalar & resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_,const FloatScalar & referenceScale_,const FloatScalar & referenceBias_)878*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinOperInfoSeparateRefScaleBias(
879*35238bceSAndroid Build Coastguard Worker     const char *caseName_, const char *shaderFuncName_, ValueType outValue_, Value input0_, Value input1_,
880*35238bceSAndroid Build Coastguard Worker     Value input2_, const FloatScalar &resultScale_, const FloatScalar &resultBias_, uint32_t precisionMask_,
881*35238bceSAndroid Build Coastguard Worker     ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_,
882*35238bceSAndroid Build Coastguard Worker     ShaderEvalFunc evalFuncVec4_, const FloatScalar &referenceScale_, const FloatScalar &referenceBias_)
883*35238bceSAndroid Build Coastguard Worker {
884*35238bceSAndroid Build Coastguard Worker     return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
885*35238bceSAndroid Build Coastguard Worker                            referenceScale_, referenceBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_,
886*35238bceSAndroid Build Coastguard Worker                            evalFuncVec3_, evalFuncVec4_, OPERATOR);
887*35238bceSAndroid Build Coastguard Worker }
888*35238bceSAndroid Build Coastguard Worker 
889*35238bceSAndroid Build Coastguard Worker // For postfix (unary) operators.
BuiltinPostOperInfo(const char * caseName_,const char * shaderFuncName_,ValueType outValue_,Value input0_,Value input1_,Value input2_,const FloatScalar & resultScale_,const FloatScalar & resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_)890*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinPostOperInfo(const char *caseName_, const char *shaderFuncName_,
891*35238bceSAndroid Build Coastguard Worker                                                   ValueType outValue_, Value input0_, Value input1_, Value input2_,
892*35238bceSAndroid Build Coastguard Worker                                                   const FloatScalar &resultScale_, const FloatScalar &resultBias_,
893*35238bceSAndroid Build Coastguard Worker                                                   uint32_t precisionMask_, ShaderEvalFunc evalFuncScalar_,
894*35238bceSAndroid Build Coastguard Worker                                                   ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_,
895*35238bceSAndroid Build Coastguard Worker                                                   ShaderEvalFunc evalFuncVec4_)
896*35238bceSAndroid Build Coastguard Worker {
897*35238bceSAndroid Build Coastguard Worker     return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
898*35238bceSAndroid Build Coastguard Worker                            resultScale_, resultBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_,
899*35238bceSAndroid Build Coastguard Worker                            evalFuncVec4_, OPERATOR, false);
900*35238bceSAndroid Build Coastguard Worker }
901*35238bceSAndroid Build Coastguard Worker 
BuiltinSideEffOperInfo(const char * caseName_,const char * shaderFuncName_,ValueType outValue_,Value input0_,Value input1_,Value input2_,const FloatScalar & resultScale_,const FloatScalar & resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_)902*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinSideEffOperInfo(const char *caseName_, const char *shaderFuncName_,
903*35238bceSAndroid Build Coastguard Worker                                                      ValueType outValue_, Value input0_, Value input1_, Value input2_,
904*35238bceSAndroid Build Coastguard Worker                                                      const FloatScalar &resultScale_, const FloatScalar &resultBias_,
905*35238bceSAndroid Build Coastguard Worker                                                      uint32_t precisionMask_, ShaderEvalFunc evalFuncScalar_,
906*35238bceSAndroid Build Coastguard Worker                                                      ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_,
907*35238bceSAndroid Build Coastguard Worker                                                      ShaderEvalFunc evalFuncVec4_)
908*35238bceSAndroid Build Coastguard Worker {
909*35238bceSAndroid Build Coastguard Worker     return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
910*35238bceSAndroid Build Coastguard Worker                            resultScale_, resultBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_,
911*35238bceSAndroid Build Coastguard Worker                            evalFuncVec4_, SIDE_EFFECT_OPERATOR);
912*35238bceSAndroid Build Coastguard Worker }
913*35238bceSAndroid Build Coastguard Worker 
914*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_,const FloatScalar & resultScale_,const FloatScalar & resultBias_,uint32_t precisionMask_,ShaderEvalFunc evalFuncScalar_,ShaderEvalFunc evalFuncVec2_,ShaderEvalFunc evalFuncVec3_,ShaderEvalFunc evalFuncVec4_)915*35238bceSAndroid Build Coastguard Worker static inline BuiltinFuncInfo BuiltinPostSideEffOperInfo(const char *caseName_, const char *shaderFuncName_,
916*35238bceSAndroid Build Coastguard Worker                                                          ValueType outValue_, Value input0_, Value input1_,
917*35238bceSAndroid Build Coastguard Worker                                                          Value input2_, const FloatScalar &resultScale_,
918*35238bceSAndroid Build Coastguard Worker                                                          const FloatScalar &resultBias_, uint32_t precisionMask_,
919*35238bceSAndroid Build Coastguard Worker                                                          ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_,
920*35238bceSAndroid Build Coastguard Worker                                                          ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_)
921*35238bceSAndroid Build Coastguard Worker {
922*35238bceSAndroid Build Coastguard Worker     return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_,
923*35238bceSAndroid Build Coastguard Worker                            resultScale_, resultBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_,
924*35238bceSAndroid Build Coastguard Worker                            evalFuncVec4_, SIDE_EFFECT_OPERATOR, false);
925*35238bceSAndroid Build Coastguard Worker }
926*35238bceSAndroid Build Coastguard Worker 
927*35238bceSAndroid Build Coastguard Worker // BuiltinFuncGroup
928*35238bceSAndroid Build Coastguard Worker 
929*35238bceSAndroid Build Coastguard Worker struct BuiltinFuncGroup
930*35238bceSAndroid Build Coastguard Worker {
BuiltinFuncGroupdeqp::gles3::Functional::BuiltinFuncGroup931*35238bceSAndroid Build Coastguard Worker     BuiltinFuncGroup(const char *name_, const char *description_) : name(name_), description(description_)
932*35238bceSAndroid Build Coastguard Worker     {
933*35238bceSAndroid Build Coastguard Worker     }
operator <<deqp::gles3::Functional::BuiltinFuncGroup934*35238bceSAndroid Build Coastguard Worker     BuiltinFuncGroup &operator<<(const BuiltinFuncInfo &info)
935*35238bceSAndroid Build Coastguard Worker     {
936*35238bceSAndroid Build Coastguard Worker         funcInfos.push_back(info);
937*35238bceSAndroid Build Coastguard Worker         return *this;
938*35238bceSAndroid Build Coastguard Worker     }
939*35238bceSAndroid Build Coastguard Worker 
940*35238bceSAndroid Build Coastguard Worker     const char *name;
941*35238bceSAndroid Build Coastguard Worker     const char *description;
942*35238bceSAndroid Build Coastguard Worker     std::vector<BuiltinFuncInfo> funcInfos;
943*35238bceSAndroid Build Coastguard Worker };
944*35238bceSAndroid Build Coastguard Worker 
945*35238bceSAndroid Build Coastguard Worker static const char *s_inSwizzles[MAX_INPUTS][4] = {{"z", "wy", "zxy", "yzwx"},
946*35238bceSAndroid Build Coastguard Worker                                                   {"x", "yx", "yzx", "wzyx"},
947*35238bceSAndroid Build Coastguard Worker                                                   {"y", "zy", "wyz", "xwzy"}};
948*35238bceSAndroid Build Coastguard Worker 
949*35238bceSAndroid Build Coastguard Worker static const char *s_outSwizzles[] = {"x", "yz", "xyz", "xyzw"};
950*35238bceSAndroid Build Coastguard Worker 
951*35238bceSAndroid Build Coastguard Worker static const BVec4 s_outSwizzleChannelMasks[] = {BVec4(true, false, false, false), BVec4(false, true, true, false),
952*35238bceSAndroid Build Coastguard Worker                                                  BVec4(true, true, true, false), BVec4(true, true, true, true)};
953*35238bceSAndroid Build Coastguard Worker 
954*35238bceSAndroid Build Coastguard Worker // OperatorShaderEvaluator
955*35238bceSAndroid Build Coastguard Worker 
956*35238bceSAndroid Build Coastguard Worker class OperatorShaderEvaluator : public ShaderEvaluator
957*35238bceSAndroid Build Coastguard Worker {
958*35238bceSAndroid Build Coastguard Worker public:
OperatorShaderEvaluator(const glw::Functions & gl,ShaderType shaderType,ShaderEvalFunc evalFunc,const FloatScalar & scale,const FloatScalar & bias,int resultScalarSize)959*35238bceSAndroid Build Coastguard Worker     OperatorShaderEvaluator(const glw::Functions &gl, ShaderType shaderType, ShaderEvalFunc evalFunc,
960*35238bceSAndroid Build Coastguard Worker                             const FloatScalar &scale, const FloatScalar &bias, int resultScalarSize)
961*35238bceSAndroid Build Coastguard Worker         : m_gl(gl)
962*35238bceSAndroid Build Coastguard Worker         , m_shaderType(shaderType)
963*35238bceSAndroid Build Coastguard Worker         , m_evalFunc(evalFunc)
964*35238bceSAndroid Build Coastguard Worker         , m_scale(scale)
965*35238bceSAndroid Build Coastguard Worker         , m_bias(bias)
966*35238bceSAndroid Build Coastguard Worker         , m_resultScalarSize(resultScalarSize)
967*35238bceSAndroid Build Coastguard Worker         , m_areScaleAndBiasEvaluated(false)
968*35238bceSAndroid Build Coastguard Worker         , m_evaluatedScale(-1.0f)
969*35238bceSAndroid Build Coastguard Worker         , m_evaluatedBias(-1.0f)
970*35238bceSAndroid Build Coastguard Worker     {
971*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::inRange(resultScalarSize, 1, 4));
972*35238bceSAndroid Build Coastguard Worker     }
973*35238bceSAndroid Build Coastguard Worker 
~OperatorShaderEvaluator(void)974*35238bceSAndroid Build Coastguard Worker     virtual ~OperatorShaderEvaluator(void)
975*35238bceSAndroid Build Coastguard Worker     {
976*35238bceSAndroid Build Coastguard Worker     }
977*35238bceSAndroid Build Coastguard Worker 
evaluate(ShaderEvalContext & ctx)978*35238bceSAndroid Build Coastguard Worker     virtual void evaluate(ShaderEvalContext &ctx)
979*35238bceSAndroid Build Coastguard Worker     {
980*35238bceSAndroid Build Coastguard Worker         m_evalFunc(ctx);
981*35238bceSAndroid Build Coastguard Worker 
982*35238bceSAndroid Build Coastguard Worker         if (!m_areScaleAndBiasEvaluated)
983*35238bceSAndroid Build Coastguard Worker         {
984*35238bceSAndroid Build Coastguard Worker             m_evaluatedScale           = m_scale.getValue(m_gl, m_shaderType);
985*35238bceSAndroid Build Coastguard Worker             m_evaluatedBias            = m_bias.getValue(m_gl, m_shaderType);
986*35238bceSAndroid Build Coastguard Worker             m_areScaleAndBiasEvaluated = true;
987*35238bceSAndroid Build Coastguard Worker         }
988*35238bceSAndroid Build Coastguard Worker 
989*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < 4; i++)
990*35238bceSAndroid Build Coastguard Worker             if (s_outSwizzleChannelMasks[m_resultScalarSize - 1][i])
991*35238bceSAndroid Build Coastguard Worker                 ctx.color[i] = ctx.color[i] * m_evaluatedScale + m_evaluatedBias;
992*35238bceSAndroid Build Coastguard Worker     }
993*35238bceSAndroid Build Coastguard Worker 
994*35238bceSAndroid Build Coastguard Worker private:
995*35238bceSAndroid Build Coastguard Worker     const glw::Functions &m_gl;
996*35238bceSAndroid Build Coastguard Worker     ShaderType m_shaderType;
997*35238bceSAndroid Build Coastguard Worker     ShaderEvalFunc m_evalFunc;
998*35238bceSAndroid Build Coastguard Worker     FloatScalar m_scale;
999*35238bceSAndroid Build Coastguard Worker     FloatScalar m_bias;
1000*35238bceSAndroid Build Coastguard Worker     int m_resultScalarSize;
1001*35238bceSAndroid Build Coastguard Worker 
1002*35238bceSAndroid Build Coastguard Worker     bool m_areScaleAndBiasEvaluated;
1003*35238bceSAndroid Build Coastguard Worker     float m_evaluatedScale;
1004*35238bceSAndroid Build Coastguard Worker     float m_evaluatedBias;
1005*35238bceSAndroid Build Coastguard Worker };
1006*35238bceSAndroid Build Coastguard Worker 
1007*35238bceSAndroid Build Coastguard Worker // Concrete value.
1008*35238bceSAndroid Build Coastguard Worker 
1009*35238bceSAndroid Build Coastguard Worker struct ShaderValue
1010*35238bceSAndroid Build Coastguard Worker {
ShaderValuedeqp::gles3::Functional::ShaderValue1011*35238bceSAndroid Build Coastguard Worker     ShaderValue(DataType type_, const FloatScalar &rangeMin_, const FloatScalar &rangeMax_)
1012*35238bceSAndroid Build Coastguard Worker         : type(type_)
1013*35238bceSAndroid Build Coastguard Worker         , rangeMin(rangeMin_)
1014*35238bceSAndroid Build Coastguard Worker         , rangeMax(rangeMax_)
1015*35238bceSAndroid Build Coastguard Worker     {
1016*35238bceSAndroid Build Coastguard Worker     }
1017*35238bceSAndroid Build Coastguard Worker 
ShaderValuedeqp::gles3::Functional::ShaderValue1018*35238bceSAndroid Build Coastguard Worker     ShaderValue(void) : type(TYPE_LAST), rangeMin(0.0f), rangeMax(0.0f)
1019*35238bceSAndroid Build Coastguard Worker     {
1020*35238bceSAndroid Build Coastguard Worker     }
1021*35238bceSAndroid Build Coastguard Worker 
1022*35238bceSAndroid Build Coastguard Worker     DataType type;
1023*35238bceSAndroid Build Coastguard Worker     FloatScalar rangeMin;
1024*35238bceSAndroid Build Coastguard Worker     FloatScalar rangeMax;
1025*35238bceSAndroid Build Coastguard Worker };
1026*35238bceSAndroid Build Coastguard Worker 
1027*35238bceSAndroid Build Coastguard Worker struct ShaderDataSpec
1028*35238bceSAndroid Build Coastguard Worker {
ShaderDataSpecdeqp::gles3::Functional::ShaderDataSpec1029*35238bceSAndroid Build Coastguard Worker     ShaderDataSpec(void)
1030*35238bceSAndroid Build Coastguard Worker         : resultScale(1.0f)
1031*35238bceSAndroid Build Coastguard Worker         , resultBias(0.0f)
1032*35238bceSAndroid Build Coastguard Worker         , referenceScale(1.0f)
1033*35238bceSAndroid Build Coastguard Worker         , referenceBias(0.0f)
1034*35238bceSAndroid Build Coastguard Worker         , precision(PRECISION_LAST)
1035*35238bceSAndroid Build Coastguard Worker         , output(TYPE_LAST)
1036*35238bceSAndroid Build Coastguard Worker         , numInputs(0)
1037*35238bceSAndroid Build Coastguard Worker     {
1038*35238bceSAndroid Build Coastguard Worker     }
1039*35238bceSAndroid Build Coastguard Worker 
1040*35238bceSAndroid Build Coastguard Worker     FloatScalar resultScale;
1041*35238bceSAndroid Build Coastguard Worker     FloatScalar resultBias;
1042*35238bceSAndroid Build Coastguard Worker     FloatScalar referenceScale;
1043*35238bceSAndroid Build Coastguard Worker     FloatScalar referenceBias;
1044*35238bceSAndroid Build Coastguard Worker     Precision precision;
1045*35238bceSAndroid Build Coastguard Worker     DataType output;
1046*35238bceSAndroid Build Coastguard Worker     int numInputs;
1047*35238bceSAndroid Build Coastguard Worker     ShaderValue inputs[MAX_INPUTS];
1048*35238bceSAndroid Build Coastguard Worker };
1049*35238bceSAndroid Build Coastguard Worker 
1050*35238bceSAndroid Build Coastguard Worker // ShaderOperatorCase
1051*35238bceSAndroid Build Coastguard Worker 
1052*35238bceSAndroid Build Coastguard Worker class ShaderOperatorCase : public ShaderRenderCase
1053*35238bceSAndroid Build Coastguard Worker {
1054*35238bceSAndroid Build Coastguard Worker public:
1055*35238bceSAndroid Build Coastguard Worker     ShaderOperatorCase(Context &context, const char *caseName, const char *description, bool isVertexCase,
1056*35238bceSAndroid Build Coastguard Worker                        ShaderEvalFunc evalFunc, const string &shaderOp, const ShaderDataSpec &spec);
1057*35238bceSAndroid Build Coastguard Worker     virtual ~ShaderOperatorCase(void);
1058*35238bceSAndroid Build Coastguard Worker 
1059*35238bceSAndroid Build Coastguard Worker protected:
1060*35238bceSAndroid Build Coastguard Worker     void setupShaderData(void);
1061*35238bceSAndroid Build Coastguard Worker 
1062*35238bceSAndroid Build Coastguard Worker private:
1063*35238bceSAndroid Build Coastguard Worker     ShaderOperatorCase(const ShaderOperatorCase &);            // not allowed!
1064*35238bceSAndroid Build Coastguard Worker     ShaderOperatorCase &operator=(const ShaderOperatorCase &); // not allowed!
1065*35238bceSAndroid Build Coastguard Worker 
1066*35238bceSAndroid Build Coastguard Worker     ShaderDataSpec m_spec;
1067*35238bceSAndroid Build Coastguard Worker     string m_shaderOp;
1068*35238bceSAndroid Build Coastguard Worker     OperatorShaderEvaluator m_evaluator;
1069*35238bceSAndroid Build Coastguard Worker };
1070*35238bceSAndroid Build Coastguard Worker 
ShaderOperatorCase(Context & context,const char * caseName,const char * description,bool isVertexCase,ShaderEvalFunc evalFunc,const string & shaderOp,const ShaderDataSpec & spec)1071*35238bceSAndroid Build Coastguard Worker ShaderOperatorCase::ShaderOperatorCase(Context &context, const char *caseName, const char *description,
1072*35238bceSAndroid Build Coastguard Worker                                        bool isVertexCase, ShaderEvalFunc evalFunc, const string &shaderOp,
1073*35238bceSAndroid Build Coastguard Worker                                        const ShaderDataSpec &spec)
1074*35238bceSAndroid Build Coastguard Worker     : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), caseName,
1075*35238bceSAndroid Build Coastguard Worker                        description, isVertexCase, m_evaluator)
1076*35238bceSAndroid Build Coastguard Worker     , m_spec(spec)
1077*35238bceSAndroid Build Coastguard Worker     , m_shaderOp(shaderOp)
1078*35238bceSAndroid Build Coastguard Worker     , m_evaluator(m_renderCtx.getFunctions(), isVertexCase ? SHADERTYPE_VERTEX : SHADERTYPE_FRAGMENT, evalFunc,
1079*35238bceSAndroid Build Coastguard Worker                   spec.referenceScale, spec.referenceBias, getDataTypeScalarSize(spec.output))
1080*35238bceSAndroid Build Coastguard Worker {
1081*35238bceSAndroid Build Coastguard Worker }
1082*35238bceSAndroid Build Coastguard Worker 
setupShaderData(void)1083*35238bceSAndroid Build Coastguard Worker void ShaderOperatorCase::setupShaderData(void)
1084*35238bceSAndroid Build Coastguard Worker {
1085*35238bceSAndroid Build Coastguard Worker     ShaderType shaderType = m_isVertexCase ? SHADERTYPE_VERTEX : SHADERTYPE_FRAGMENT;
1086*35238bceSAndroid Build Coastguard Worker     const char *precision = m_spec.precision != PRECISION_LAST ? getPrecisionName(m_spec.precision) : DE_NULL;
1087*35238bceSAndroid Build Coastguard Worker     const char *inputPrecision[MAX_INPUTS];
1088*35238bceSAndroid Build Coastguard Worker 
1089*35238bceSAndroid Build Coastguard Worker     ostringstream vtx;
1090*35238bceSAndroid Build Coastguard Worker     ostringstream frag;
1091*35238bceSAndroid Build Coastguard Worker     ostringstream &op = m_isVertexCase ? vtx : frag;
1092*35238bceSAndroid Build Coastguard Worker 
1093*35238bceSAndroid Build Coastguard Worker     vtx << "#version 300 es\n";
1094*35238bceSAndroid Build Coastguard Worker     frag << "#version 300 es\n";
1095*35238bceSAndroid Build Coastguard Worker 
1096*35238bceSAndroid Build Coastguard Worker     // Compute precision for inputs.
1097*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < m_spec.numInputs; i++)
1098*35238bceSAndroid Build Coastguard Worker     {
1099*35238bceSAndroid Build Coastguard Worker         bool isBoolVal = de::inRange<int>(m_spec.inputs[i].type, TYPE_BOOL, TYPE_BOOL_VEC4);
1100*35238bceSAndroid Build Coastguard Worker         bool isIntVal  = de::inRange<int>(m_spec.inputs[i].type, TYPE_INT, TYPE_INT_VEC4);
1101*35238bceSAndroid Build Coastguard Worker         bool isUintVal = de::inRange<int>(m_spec.inputs[i].type, TYPE_UINT, TYPE_UINT_VEC4);
1102*35238bceSAndroid Build Coastguard Worker         // \note Mediump interpolators are used for booleans, and highp for integers.
1103*35238bceSAndroid Build Coastguard Worker         Precision prec    = isBoolVal ? PRECISION_MEDIUMP : isIntVal || isUintVal ? PRECISION_HIGHP : m_spec.precision;
1104*35238bceSAndroid Build Coastguard Worker         inputPrecision[i] = getPrecisionName(prec);
1105*35238bceSAndroid Build Coastguard Worker     }
1106*35238bceSAndroid Build Coastguard Worker 
1107*35238bceSAndroid Build Coastguard Worker     // Attributes.
1108*35238bceSAndroid Build Coastguard Worker     vtx << "in highp vec4 a_position;\n";
1109*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < m_spec.numInputs; i++)
1110*35238bceSAndroid Build Coastguard Worker         vtx << "in " << inputPrecision[i] << " vec4 a_in" << i << ";\n";
1111*35238bceSAndroid Build Coastguard Worker 
1112*35238bceSAndroid Build Coastguard Worker     // Color output.
1113*35238bceSAndroid Build Coastguard Worker     frag << "layout(location = 0) out mediump vec4 o_color;\n";
1114*35238bceSAndroid Build Coastguard Worker 
1115*35238bceSAndroid Build Coastguard Worker     if (m_isVertexCase)
1116*35238bceSAndroid Build Coastguard Worker     {
1117*35238bceSAndroid Build Coastguard Worker         vtx << "out mediump vec4 v_color;\n";
1118*35238bceSAndroid Build Coastguard Worker         frag << "in mediump vec4 v_color;\n";
1119*35238bceSAndroid Build Coastguard Worker     }
1120*35238bceSAndroid Build Coastguard Worker     else
1121*35238bceSAndroid Build Coastguard Worker     {
1122*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < m_spec.numInputs; i++)
1123*35238bceSAndroid Build Coastguard Worker         {
1124*35238bceSAndroid Build Coastguard Worker             vtx << "out " << inputPrecision[i] << " vec4 v_in" << i << ";\n";
1125*35238bceSAndroid Build Coastguard Worker             frag << "in " << inputPrecision[i] << " vec4 v_in" << i << ";\n";
1126*35238bceSAndroid Build Coastguard Worker         }
1127*35238bceSAndroid Build Coastguard Worker     }
1128*35238bceSAndroid Build Coastguard Worker 
1129*35238bceSAndroid Build Coastguard Worker     vtx << "\n";
1130*35238bceSAndroid Build Coastguard Worker     vtx << "void main()\n";
1131*35238bceSAndroid Build Coastguard Worker     vtx << "{\n";
1132*35238bceSAndroid Build Coastguard Worker     vtx << "    gl_Position = a_position;\n";
1133*35238bceSAndroid Build Coastguard Worker 
1134*35238bceSAndroid Build Coastguard Worker     frag << "\n";
1135*35238bceSAndroid Build Coastguard Worker     frag << "void main()\n";
1136*35238bceSAndroid Build Coastguard Worker     frag << "{\n";
1137*35238bceSAndroid Build Coastguard Worker 
1138*35238bceSAndroid Build Coastguard Worker     bool isResFloatVec = de::inRange<int>(m_spec.output, TYPE_FLOAT, TYPE_FLOAT_VEC4);
1139*35238bceSAndroid Build Coastguard Worker     bool isResBoolVec  = de::inRange<int>(m_spec.output, TYPE_BOOL, TYPE_BOOL_VEC4);
1140*35238bceSAndroid Build Coastguard Worker     bool hasReference  = !isResFloatVec && !isResBoolVec &&
1141*35238bceSAndroid Build Coastguard Worker                         (m_spec.precision == PRECISION_LOWP || m_spec.precision == PRECISION_MEDIUMP);
1142*35238bceSAndroid Build Coastguard Worker     string refShaderOp = m_shaderOp;
1143*35238bceSAndroid Build Coastguard Worker 
1144*35238bceSAndroid Build Coastguard Worker     // Expression inputs.
1145*35238bceSAndroid Build Coastguard Worker     string prefix = m_isVertexCase ? "a_" : "v_";
1146*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < m_spec.numInputs; i++)
1147*35238bceSAndroid Build Coastguard Worker     {
1148*35238bceSAndroid Build Coastguard Worker         DataType inType      = m_spec.inputs[i].type;
1149*35238bceSAndroid Build Coastguard Worker         int inSize           = getDataTypeScalarSize(inType);
1150*35238bceSAndroid Build Coastguard Worker         bool isBool          = de::inRange<int>(inType, TYPE_BOOL, TYPE_BOOL_VEC4);
1151*35238bceSAndroid Build Coastguard Worker         bool isInt           = de::inRange<int>(inType, TYPE_INT, TYPE_INT_VEC4);
1152*35238bceSAndroid Build Coastguard Worker         bool isUint          = de::inRange<int>(inType, TYPE_UINT, TYPE_UINT_VEC4);
1153*35238bceSAndroid Build Coastguard Worker         const char *typeName = getDataTypeName(inType);
1154*35238bceSAndroid Build Coastguard Worker         const char *swizzle  = s_inSwizzles[i][inSize - 1];
1155*35238bceSAndroid Build Coastguard Worker         bool hasReferenceIn  = hasReference && !isBool;
1156*35238bceSAndroid Build Coastguard Worker 
1157*35238bceSAndroid Build Coastguard Worker         // For int/uint types, generate:
1158*35238bceSAndroid Build Coastguard Worker         //
1159*35238bceSAndroid Build Coastguard Worker         //     highp type highp_inN = ...;
1160*35238bceSAndroid Build Coastguard Worker         //     precision type inN = highp_inN;
1161*35238bceSAndroid Build Coastguard Worker         //
1162*35238bceSAndroid Build Coastguard Worker         // inN_high will be used later for reference checking.
1163*35238bceSAndroid Build Coastguard Worker         //
1164*35238bceSAndroid Build Coastguard Worker         // For other types, generate:
1165*35238bceSAndroid Build Coastguard Worker         //
1166*35238bceSAndroid Build Coastguard Worker         //     precision type inN = ...;
1167*35238bceSAndroid Build Coastguard Worker         //
1168*35238bceSAndroid Build Coastguard Worker         op << "\t";
1169*35238bceSAndroid Build Coastguard Worker         if (precision && !isBool)
1170*35238bceSAndroid Build Coastguard Worker         {
1171*35238bceSAndroid Build Coastguard Worker             if (hasReferenceIn)
1172*35238bceSAndroid Build Coastguard Worker                 op << "highp ";
1173*35238bceSAndroid Build Coastguard Worker             else
1174*35238bceSAndroid Build Coastguard Worker                 op << precision << " ";
1175*35238bceSAndroid Build Coastguard Worker         }
1176*35238bceSAndroid Build Coastguard Worker 
1177*35238bceSAndroid Build Coastguard Worker         op << typeName << " ";
1178*35238bceSAndroid Build Coastguard Worker         if (hasReferenceIn)
1179*35238bceSAndroid Build Coastguard Worker             op << "highp_";
1180*35238bceSAndroid Build Coastguard Worker         op << "in" << i << " = ";
1181*35238bceSAndroid Build Coastguard Worker 
1182*35238bceSAndroid Build Coastguard Worker         if (isBool)
1183*35238bceSAndroid Build Coastguard Worker         {
1184*35238bceSAndroid Build Coastguard Worker             if (inSize == 1)
1185*35238bceSAndroid Build Coastguard Worker                 op << "(";
1186*35238bceSAndroid Build Coastguard Worker             else
1187*35238bceSAndroid Build Coastguard Worker                 op << "greaterThan(";
1188*35238bceSAndroid Build Coastguard Worker         }
1189*35238bceSAndroid Build Coastguard Worker         else if (isInt || isUint)
1190*35238bceSAndroid Build Coastguard Worker             op << typeName << "(";
1191*35238bceSAndroid Build Coastguard Worker 
1192*35238bceSAndroid Build Coastguard Worker         op << prefix << "in" << i << "." << swizzle;
1193*35238bceSAndroid Build Coastguard Worker 
1194*35238bceSAndroid Build Coastguard Worker         if (isBool)
1195*35238bceSAndroid Build Coastguard Worker         {
1196*35238bceSAndroid Build Coastguard Worker             if (inSize == 1)
1197*35238bceSAndroid Build Coastguard Worker                 op << " > 0.0)";
1198*35238bceSAndroid Build Coastguard Worker             else
1199*35238bceSAndroid Build Coastguard Worker                 op << ", vec" << inSize << "(0.0))";
1200*35238bceSAndroid Build Coastguard Worker         }
1201*35238bceSAndroid Build Coastguard Worker         else if (isInt || isUint)
1202*35238bceSAndroid Build Coastguard Worker             op << ")";
1203*35238bceSAndroid Build Coastguard Worker 
1204*35238bceSAndroid Build Coastguard Worker         op << ";\n";
1205*35238bceSAndroid Build Coastguard Worker 
1206*35238bceSAndroid Build Coastguard Worker         if (hasReferenceIn)
1207*35238bceSAndroid Build Coastguard Worker         {
1208*35238bceSAndroid Build Coastguard Worker             op << "\t" << precision << " " << typeName << " in" << i << " = highp_in" << i << ";\n";
1209*35238bceSAndroid Build Coastguard Worker 
1210*35238bceSAndroid Build Coastguard Worker             string inputName = "in" + string(1, static_cast<char>('0' + i));
1211*35238bceSAndroid Build Coastguard Worker             stringReplace(refShaderOp, inputName, "highp_" + inputName);
1212*35238bceSAndroid Build Coastguard Worker         }
1213*35238bceSAndroid Build Coastguard Worker     }
1214*35238bceSAndroid Build Coastguard Worker 
1215*35238bceSAndroid Build Coastguard Worker     // Result variable.
1216*35238bceSAndroid Build Coastguard Worker     {
1217*35238bceSAndroid Build Coastguard Worker         const char *outTypeName = getDataTypeName(m_spec.output);
1218*35238bceSAndroid Build Coastguard Worker         bool isBoolOut          = de::inRange<int>(m_spec.output, TYPE_BOOL, TYPE_BOOL_VEC4);
1219*35238bceSAndroid Build Coastguard Worker 
1220*35238bceSAndroid Build Coastguard Worker         op << "\t";
1221*35238bceSAndroid Build Coastguard Worker         if (precision && !isBoolOut)
1222*35238bceSAndroid Build Coastguard Worker             op << precision << " ";
1223*35238bceSAndroid Build Coastguard Worker         op << outTypeName << " res = " << outTypeName << "(0.0);\n";
1224*35238bceSAndroid Build Coastguard Worker 
1225*35238bceSAndroid Build Coastguard Worker         if (hasReference)
1226*35238bceSAndroid Build Coastguard Worker         {
1227*35238bceSAndroid Build Coastguard Worker             op << "\thighp " << outTypeName << " ref = " << outTypeName << "(0.0);\n";
1228*35238bceSAndroid Build Coastguard Worker         }
1229*35238bceSAndroid Build Coastguard Worker 
1230*35238bceSAndroid Build Coastguard Worker         op << "\n";
1231*35238bceSAndroid Build Coastguard Worker     }
1232*35238bceSAndroid Build Coastguard Worker 
1233*35238bceSAndroid Build Coastguard Worker     // Expression.
1234*35238bceSAndroid Build Coastguard Worker     op << "\t" << m_shaderOp << "\n";
1235*35238bceSAndroid Build Coastguard Worker     if (hasReference)
1236*35238bceSAndroid Build Coastguard Worker     {
1237*35238bceSAndroid Build Coastguard Worker         stringReplace(refShaderOp, "res", "ref");
1238*35238bceSAndroid Build Coastguard Worker         op << "\t" << refShaderOp << "\n";
1239*35238bceSAndroid Build Coastguard Worker     }
1240*35238bceSAndroid Build Coastguard Worker     op << "\n";
1241*35238bceSAndroid Build Coastguard Worker 
1242*35238bceSAndroid Build Coastguard Worker     // Implementations may use more bits than advertised.  Assume an implementation advertising 16
1243*35238bceSAndroid Build Coastguard Worker     // bits for mediump, but actually using 24 bits for a particular operation.  We have:
1244*35238bceSAndroid Build Coastguard Worker     //
1245*35238bceSAndroid Build Coastguard Worker     //     highp ref = expr;
1246*35238bceSAndroid Build Coastguard Worker     //     mediump res = expr;
1247*35238bceSAndroid Build Coastguard Worker     //
1248*35238bceSAndroid Build Coastguard Worker     // We expect res&0xFFFF to be correct, because that ensures that _at least_ 16 bits were
1249*35238bceSAndroid Build Coastguard Worker     // provided.  However, we also need to make sure that if there is anything in the upper 16 bits
1250*35238bceSAndroid Build Coastguard Worker     // of res, that those bits match with ref.  In short, we expect to see the following bits
1251*35238bceSAndroid Build Coastguard Worker     // (assume the advertised number of bits is N, and the actual calculation is done in M bits):
1252*35238bceSAndroid Build Coastguard Worker     //
1253*35238bceSAndroid Build Coastguard Worker     //     ref = a31 ... aM aM-1 ... aN aN-1 ... a0
1254*35238bceSAndroid Build Coastguard Worker     //     res =   0 ...  0 bM-1 ... bN bN-1 ... b0
1255*35238bceSAndroid Build Coastguard Worker     //
1256*35238bceSAndroid Build Coastguard Worker     // The test verifies that bN-1 ... b0 is correct based on the shader output.  We additionally
1257*35238bceSAndroid Build Coastguard Worker     // want to make sure that:
1258*35238bceSAndroid Build Coastguard Worker     //
1259*35238bceSAndroid Build Coastguard Worker     //  - bM-1 ... bN is identical to aM-1 ... aN
1260*35238bceSAndroid Build Coastguard Worker     //  - bits above bM-1 are zero.
1261*35238bceSAndroid Build Coastguard Worker     //
1262*35238bceSAndroid Build Coastguard Worker     // This is done as follows:
1263*35238bceSAndroid Build Coastguard Worker     //
1264*35238bceSAndroid Build Coastguard Worker     //     diff = res ^ ref  --> should produce a31 ... aM 0 ... 0
1265*35238bceSAndroid Build Coastguard Worker     //     diff == 0: accept res
1266*35238bceSAndroid Build Coastguard Worker     //     diff != 0:
1267*35238bceSAndroid Build Coastguard Worker     //         lsb = log2((~diff + 1u) & diff)  --> log2(0 .. 0 1 0 ...0)
1268*35238bceSAndroid Build Coastguard Worker     //                                              == findLSB(diff)
1269*35238bceSAndroid Build Coastguard Worker     //
1270*35238bceSAndroid Build Coastguard Worker     //         outOfRangeMask = 0xFFFFFFFF << lsb  --> 1 ... 1 0 ... 0
1271*35238bceSAndroid Build Coastguard Worker     //
1272*35238bceSAndroid Build Coastguard Worker     //         (res & outOfRangeMask) == 0: accept res
1273*35238bceSAndroid Build Coastguard Worker     //
1274*35238bceSAndroid Build Coastguard Worker     // Note that (diff & ~outOfRangeMask) == 0 necessarily holds, because outOfRangeMask has 1s
1275*35238bceSAndroid Build Coastguard Worker     // starting from the first bit that differs between res and ref, which means that res and ref
1276*35238bceSAndroid Build Coastguard Worker     // are identical in those bits.
1277*35238bceSAndroid Build Coastguard Worker     int outScalarSize = getDataTypeScalarSize(m_spec.output);
1278*35238bceSAndroid Build Coastguard Worker     string floatType  = "";
1279*35238bceSAndroid Build Coastguard Worker     if (!isResFloatVec)
1280*35238bceSAndroid Build Coastguard Worker     {
1281*35238bceSAndroid Build Coastguard Worker         if (outScalarSize == 1)
1282*35238bceSAndroid Build Coastguard Worker             floatType = "float";
1283*35238bceSAndroid Build Coastguard Worker         else
1284*35238bceSAndroid Build Coastguard Worker             floatType = "vec" + string(1, static_cast<char>('0' + outScalarSize));
1285*35238bceSAndroid Build Coastguard Worker     }
1286*35238bceSAndroid Build Coastguard Worker 
1287*35238bceSAndroid Build Coastguard Worker     if (hasReference)
1288*35238bceSAndroid Build Coastguard Worker     {
1289*35238bceSAndroid Build Coastguard Worker         bool isInt                   = de::inRange<int>(m_spec.output, TYPE_INT, TYPE_INT_VEC4);
1290*35238bceSAndroid Build Coastguard Worker         const char *outTypeName      = getDataTypeName(m_spec.output);
1291*35238bceSAndroid Build Coastguard Worker         const char *outBasicTypeName = getDataTypeName(isInt ? TYPE_INT : TYPE_UINT);
1292*35238bceSAndroid Build Coastguard Worker         uint32_t resultMask          = m_spec.resultScale.getValueMask(m_renderCtx.getFunctions(), shaderType);
1293*35238bceSAndroid Build Coastguard Worker 
1294*35238bceSAndroid Build Coastguard Worker         op << "\thighp " << outTypeName << " diff = res ^ ref;\n";
1295*35238bceSAndroid Build Coastguard Worker         op << "\tdiff = (~diff + " << outTypeName << "(1)) & diff;\n";
1296*35238bceSAndroid Build Coastguard Worker         op << "\thighp " << outTypeName << " lsb = " << outTypeName << "(32);\n";
1297*35238bceSAndroid Build Coastguard Worker         op << "\thighp " << outTypeName << " outOfRangeMask = " << outTypeName << "(0);\n";
1298*35238bceSAndroid Build Coastguard Worker         if (outScalarSize == 1)
1299*35238bceSAndroid Build Coastguard Worker         {
1300*35238bceSAndroid Build Coastguard Worker             op << "\tif (diff != " << outTypeName << "(0))\n\t{\n";
1301*35238bceSAndroid Build Coastguard Worker             op << "\t\tlsb = " << outTypeName << "(log2(" << floatType << "(diff)));\n";
1302*35238bceSAndroid Build Coastguard Worker             op << "\t\toutOfRangeMask = " << outTypeName << "(0xFFFFFFFF) << lsb;\n";
1303*35238bceSAndroid Build Coastguard Worker             op << "\t}\n";
1304*35238bceSAndroid Build Coastguard Worker         }
1305*35238bceSAndroid Build Coastguard Worker         else
1306*35238bceSAndroid Build Coastguard Worker         {
1307*35238bceSAndroid Build Coastguard Worker             op << "\tbvec" << outScalarSize << " isDiffZero = equal(diff, " << outTypeName << "(0));\n";
1308*35238bceSAndroid Build Coastguard Worker             op << "\thighp " << outTypeName << " lsbUnsantized = " << outTypeName << "(log2(vec" << outScalarSize
1309*35238bceSAndroid Build Coastguard Worker                << "((~diff + " << outTypeName << "(1)) & diff)));\n";
1310*35238bceSAndroid Build Coastguard Worker             for (int channel = 0; channel < outScalarSize; ++channel)
1311*35238bceSAndroid Build Coastguard Worker             {
1312*35238bceSAndroid Build Coastguard Worker                 op << "\tif (!isDiffZero[" << channel << "])\n\t{\n";
1313*35238bceSAndroid Build Coastguard Worker                 op << "\t\tlsb[" << channel << "] = lsbUnsantized[" << channel << "];\n";
1314*35238bceSAndroid Build Coastguard Worker                 op << "\t\toutOfRangeMask[" << channel << "] = " << outBasicTypeName << "(0xFFFFFFFF) << lsb["
1315*35238bceSAndroid Build Coastguard Worker                    << channel << "];\n";
1316*35238bceSAndroid Build Coastguard Worker                 op << "\t}\n";
1317*35238bceSAndroid Build Coastguard Worker             }
1318*35238bceSAndroid Build Coastguard Worker         }
1319*35238bceSAndroid Build Coastguard Worker         op << "\thighp " << outTypeName << " outOfRangeRes = res & outOfRangeMask;\n";
1320*35238bceSAndroid Build Coastguard Worker         op << "\tif (outOfRangeRes != " << outTypeName << "(0)) res = " << outTypeName << "(0);\n";
1321*35238bceSAndroid Build Coastguard Worker 
1322*35238bceSAndroid Build Coastguard Worker         if (resultMask != 0)
1323*35238bceSAndroid Build Coastguard Worker             op << "\tres &= " << outTypeName << "(" << resultMask << ");\n";
1324*35238bceSAndroid Build Coastguard Worker 
1325*35238bceSAndroid Build Coastguard Worker         op << "\n";
1326*35238bceSAndroid Build Coastguard Worker     }
1327*35238bceSAndroid Build Coastguard Worker 
1328*35238bceSAndroid Build Coastguard Worker     // Convert to color.
1329*35238bceSAndroid Build Coastguard Worker     op << "\thighp vec4 color = vec4(0.0, 0.0, 0.0, 1.0);\n";
1330*35238bceSAndroid Build Coastguard Worker     op << "\tcolor." << s_outSwizzles[outScalarSize - 1] << " = " << floatType << "(res);\n";
1331*35238bceSAndroid Build Coastguard Worker 
1332*35238bceSAndroid Build Coastguard Worker     // Scale & bias.
1333*35238bceSAndroid Build Coastguard Worker     float resultScale = m_spec.resultScale.getValue(m_renderCtx.getFunctions(), shaderType);
1334*35238bceSAndroid Build Coastguard Worker     float resultBias  = m_spec.resultBias.getValue(m_renderCtx.getFunctions(), shaderType);
1335*35238bceSAndroid Build Coastguard Worker     if ((resultScale != 1.0f) || (resultBias != 0.0f))
1336*35238bceSAndroid Build Coastguard Worker     {
1337*35238bceSAndroid Build Coastguard Worker         op << "\tcolor = color";
1338*35238bceSAndroid Build Coastguard Worker         if (resultScale != 1.0f)
1339*35238bceSAndroid Build Coastguard Worker             op << " * " << twoValuedVec4(de::toString(resultScale), "1.0", s_outSwizzleChannelMasks[outScalarSize - 1]);
1340*35238bceSAndroid Build Coastguard Worker         if (resultBias != 0.0f)
1341*35238bceSAndroid Build Coastguard Worker             op << " + "
1342*35238bceSAndroid Build Coastguard Worker                << twoValuedVec4(de::floatToString(resultBias, 2), "0.0", s_outSwizzleChannelMasks[outScalarSize - 1]);
1343*35238bceSAndroid Build Coastguard Worker         op << ";\n";
1344*35238bceSAndroid Build Coastguard Worker     }
1345*35238bceSAndroid Build Coastguard Worker 
1346*35238bceSAndroid Build Coastguard Worker     // ..
1347*35238bceSAndroid Build Coastguard Worker     if (m_isVertexCase)
1348*35238bceSAndroid Build Coastguard Worker     {
1349*35238bceSAndroid Build Coastguard Worker         vtx << "    v_color = color;\n";
1350*35238bceSAndroid Build Coastguard Worker         frag << "    o_color = v_color;\n";
1351*35238bceSAndroid Build Coastguard Worker     }
1352*35238bceSAndroid Build Coastguard Worker     else
1353*35238bceSAndroid Build Coastguard Worker     {
1354*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < m_spec.numInputs; i++)
1355*35238bceSAndroid Build Coastguard Worker             vtx << "    v_in" << i << " = a_in" << i << ";\n";
1356*35238bceSAndroid Build Coastguard Worker         frag << "    o_color = color;\n";
1357*35238bceSAndroid Build Coastguard Worker     }
1358*35238bceSAndroid Build Coastguard Worker 
1359*35238bceSAndroid Build Coastguard Worker     vtx << "}\n";
1360*35238bceSAndroid Build Coastguard Worker     frag << "}\n";
1361*35238bceSAndroid Build Coastguard Worker 
1362*35238bceSAndroid Build Coastguard Worker     m_vertShaderSource = vtx.str();
1363*35238bceSAndroid Build Coastguard Worker     m_fragShaderSource = frag.str();
1364*35238bceSAndroid Build Coastguard Worker 
1365*35238bceSAndroid Build Coastguard Worker     // Setup the user attributes.
1366*35238bceSAndroid Build Coastguard Worker     m_userAttribTransforms.resize(m_spec.numInputs);
1367*35238bceSAndroid Build Coastguard Worker     for (int inputNdx = 0; inputNdx < m_spec.numInputs; inputNdx++)
1368*35238bceSAndroid Build Coastguard Worker     {
1369*35238bceSAndroid Build Coastguard Worker         const ShaderValue &v = m_spec.inputs[inputNdx];
1370*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(v.type != TYPE_LAST);
1371*35238bceSAndroid Build Coastguard Worker 
1372*35238bceSAndroid Build Coastguard Worker         float rangeMin = v.rangeMin.getValue(m_renderCtx.getFunctions(), shaderType);
1373*35238bceSAndroid Build Coastguard Worker         float rangeMax = v.rangeMax.getValue(m_renderCtx.getFunctions(), shaderType);
1374*35238bceSAndroid Build Coastguard Worker         float scale    = rangeMax - rangeMin;
1375*35238bceSAndroid Build Coastguard Worker         float minBias  = rangeMin;
1376*35238bceSAndroid Build Coastguard Worker         float maxBias  = rangeMax;
1377*35238bceSAndroid Build Coastguard Worker         Mat4 attribMatrix;
1378*35238bceSAndroid Build Coastguard Worker 
1379*35238bceSAndroid Build Coastguard Worker         for (int rowNdx = 0; rowNdx < 4; rowNdx++)
1380*35238bceSAndroid Build Coastguard Worker         {
1381*35238bceSAndroid Build Coastguard Worker             Vec4 row;
1382*35238bceSAndroid Build Coastguard Worker 
1383*35238bceSAndroid Build Coastguard Worker             switch ((rowNdx + inputNdx) % 4)
1384*35238bceSAndroid Build Coastguard Worker             {
1385*35238bceSAndroid Build Coastguard Worker             case 0:
1386*35238bceSAndroid Build Coastguard Worker                 row = Vec4(scale, 0.0f, 0.0f, minBias);
1387*35238bceSAndroid Build Coastguard Worker                 break;
1388*35238bceSAndroid Build Coastguard Worker             case 1:
1389*35238bceSAndroid Build Coastguard Worker                 row = Vec4(0.0f, scale, 0.0f, minBias);
1390*35238bceSAndroid Build Coastguard Worker                 break;
1391*35238bceSAndroid Build Coastguard Worker             case 2:
1392*35238bceSAndroid Build Coastguard Worker                 row = Vec4(-scale, 0.0f, 0.0f, maxBias);
1393*35238bceSAndroid Build Coastguard Worker                 break;
1394*35238bceSAndroid Build Coastguard Worker             case 3:
1395*35238bceSAndroid Build Coastguard Worker                 row = Vec4(0.0f, -scale, 0.0f, maxBias);
1396*35238bceSAndroid Build Coastguard Worker                 break;
1397*35238bceSAndroid Build Coastguard Worker             default:
1398*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1399*35238bceSAndroid Build Coastguard Worker             }
1400*35238bceSAndroid Build Coastguard Worker 
1401*35238bceSAndroid Build Coastguard Worker             attribMatrix.setRow(rowNdx, row);
1402*35238bceSAndroid Build Coastguard Worker         }
1403*35238bceSAndroid Build Coastguard Worker 
1404*35238bceSAndroid Build Coastguard Worker         m_userAttribTransforms[inputNdx] = attribMatrix;
1405*35238bceSAndroid Build Coastguard Worker     }
1406*35238bceSAndroid Build Coastguard Worker }
1407*35238bceSAndroid Build Coastguard Worker 
~ShaderOperatorCase(void)1408*35238bceSAndroid Build Coastguard Worker ShaderOperatorCase::~ShaderOperatorCase(void)
1409*35238bceSAndroid Build Coastguard Worker {
1410*35238bceSAndroid Build Coastguard Worker }
1411*35238bceSAndroid Build Coastguard Worker 
1412*35238bceSAndroid Build Coastguard Worker // ShaderOperatorTests.
1413*35238bceSAndroid Build Coastguard Worker 
ShaderOperatorTests(Context & context)1414*35238bceSAndroid Build Coastguard Worker ShaderOperatorTests::ShaderOperatorTests(Context &context) : TestCaseGroup(context, "operator", "Operator tests.")
1415*35238bceSAndroid Build Coastguard Worker {
1416*35238bceSAndroid Build Coastguard Worker }
1417*35238bceSAndroid Build Coastguard Worker 
~ShaderOperatorTests(void)1418*35238bceSAndroid Build Coastguard Worker ShaderOperatorTests::~ShaderOperatorTests(void)
1419*35238bceSAndroid Build Coastguard Worker {
1420*35238bceSAndroid Build Coastguard Worker }
1421*35238bceSAndroid Build Coastguard Worker 
1422*35238bceSAndroid Build Coastguard Worker // Vector math functions.
1423*35238bceSAndroid Build Coastguard Worker template <typename T>
nop(T f)1424*35238bceSAndroid Build Coastguard Worker inline T nop(T f)
1425*35238bceSAndroid Build Coastguard Worker {
1426*35238bceSAndroid Build Coastguard Worker     return f;
1427*35238bceSAndroid Build Coastguard Worker }
1428*35238bceSAndroid Build Coastguard Worker 
1429*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
nop(const Vector<T,Size> & v)1430*35238bceSAndroid Build Coastguard Worker Vector<T, Size> nop(const Vector<T, Size> &v)
1431*35238bceSAndroid Build Coastguard Worker {
1432*35238bceSAndroid Build Coastguard Worker     return v;
1433*35238bceSAndroid Build Coastguard Worker }
1434*35238bceSAndroid Build Coastguard Worker 
1435*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_GENTYPE_FUNCS(FUNC_NAME)               \
1436*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_float(ShaderEvalContext &c)      \
1437*35238bceSAndroid Build Coastguard Worker     {                                                        \
1438*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(2)).x();     \
1439*35238bceSAndroid Build Coastguard Worker     }                                                        \
1440*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)       \
1441*35238bceSAndroid Build Coastguard Worker     {                                                        \
1442*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1));     \
1443*35238bceSAndroid Build Coastguard Worker     }                                                        \
1444*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)       \
1445*35238bceSAndroid Build Coastguard Worker     {                                                        \
1446*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1)); \
1447*35238bceSAndroid Build Coastguard Worker     }                                                        \
1448*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)       \
1449*35238bceSAndroid Build Coastguard Worker     {                                                        \
1450*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0));    \
1451*35238bceSAndroid Build Coastguard Worker     }
1452*35238bceSAndroid Build Coastguard Worker 
1453*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_GENTYPE_FUNCS(FUNC_NAME)                                        \
1454*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_float(ShaderEvalContext &c)                                \
1455*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1456*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(2), c.in[1].swizzle(0)).x();           \
1457*35238bceSAndroid Build Coastguard Worker     }                                                                                  \
1458*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                                 \
1459*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1460*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0));        \
1461*35238bceSAndroid Build Coastguard Worker     }                                                                                  \
1462*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                                 \
1463*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1464*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0)); \
1465*35238bceSAndroid Build Coastguard Worker     }                                                                                  \
1466*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                                 \
1467*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1468*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)); \
1469*35238bceSAndroid Build Coastguard Worker     }
1470*35238bceSAndroid Build Coastguard Worker 
1471*35238bceSAndroid Build Coastguard Worker #define DECLARE_TERNARY_GENTYPE_FUNCS(FUNC_NAME)                                                                    \
1472*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_float(ShaderEvalContext &c)                                                             \
1473*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
1474*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();                    \
1475*35238bceSAndroid Build Coastguard Worker     }                                                                                                               \
1476*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                                                              \
1477*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
1478*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));              \
1479*35238bceSAndroid Build Coastguard Worker     }                                                                                                               \
1480*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                                                              \
1481*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
1482*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));    \
1483*35238bceSAndroid Build Coastguard Worker     }                                                                                                               \
1484*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                                                              \
1485*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
1486*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)); \
1487*35238bceSAndroid Build Coastguard Worker     }
1488*35238bceSAndroid Build Coastguard Worker 
1489*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_SCALAR_GENTYPE_FUNCS(FUNC_NAME)         \
1490*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_float(ShaderEvalContext &c)       \
1491*35238bceSAndroid Build Coastguard Worker     {                                                         \
1492*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(2));          \
1493*35238bceSAndroid Build Coastguard Worker     }                                                         \
1494*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)        \
1495*35238bceSAndroid Build Coastguard Worker     {                                                         \
1496*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(3, 1));       \
1497*35238bceSAndroid Build Coastguard Worker     }                                                         \
1498*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)        \
1499*35238bceSAndroid Build Coastguard Worker     {                                                         \
1500*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(2, 0, 1));    \
1501*35238bceSAndroid Build Coastguard Worker     }                                                         \
1502*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)        \
1503*35238bceSAndroid Build Coastguard Worker     {                                                         \
1504*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0)); \
1505*35238bceSAndroid Build Coastguard Worker     }
1506*35238bceSAndroid Build Coastguard Worker 
1507*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_SCALAR_GENTYPE_FUNCS(FUNC_NAME)                                     \
1508*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_float(ShaderEvalContext &c)                                    \
1509*35238bceSAndroid Build Coastguard Worker     {                                                                                      \
1510*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(2), c.in[1].swizzle(0));                   \
1511*35238bceSAndroid Build Coastguard Worker     }                                                                                      \
1512*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                                     \
1513*35238bceSAndroid Build Coastguard Worker     {                                                                                      \
1514*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0));             \
1515*35238bceSAndroid Build Coastguard Worker     }                                                                                      \
1516*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                                     \
1517*35238bceSAndroid Build Coastguard Worker     {                                                                                      \
1518*35238bceSAndroid Build Coastguard Worker         c.color.x() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0));       \
1519*35238bceSAndroid Build Coastguard Worker     }                                                                                      \
1520*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                                     \
1521*35238bceSAndroid Build Coastguard Worker     {                                                                                      \
1522*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)); \
1523*35238bceSAndroid Build Coastguard Worker     }
1524*35238bceSAndroid Build Coastguard Worker 
1525*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_BOOL_FUNCS(FUNC_NAME)                                    \
1526*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bool(ShaderEvalContext &c)                          \
1527*35238bceSAndroid Build Coastguard Worker     {                                                                           \
1528*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f); \
1529*35238bceSAndroid Build Coastguard Worker     }
1530*35238bceSAndroid Build Coastguard Worker 
1531*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_BOOL_GENTYPE_FUNCS(FUNC_NAME)                                             \
1532*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bool(ShaderEvalContext &c)                                          \
1533*35238bceSAndroid Build Coastguard Worker     {                                                                                           \
1534*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f);                                     \
1535*35238bceSAndroid Build Coastguard Worker     }                                                                                           \
1536*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec2(ShaderEvalContext &c)                                         \
1537*35238bceSAndroid Build Coastguard Worker     {                                                                                           \
1538*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f))).asFloat();     \
1539*35238bceSAndroid Build Coastguard Worker     }                                                                                           \
1540*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec3(ShaderEvalContext &c)                                         \
1541*35238bceSAndroid Build Coastguard Worker     {                                                                                           \
1542*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f))).asFloat(); \
1543*35238bceSAndroid Build Coastguard Worker     }                                                                                           \
1544*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec4(ShaderEvalContext &c)                                         \
1545*35238bceSAndroid Build Coastguard Worker     {                                                                                           \
1546*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f))).asFloat();    \
1547*35238bceSAndroid Build Coastguard Worker     }
1548*35238bceSAndroid Build Coastguard Worker 
1549*35238bceSAndroid Build Coastguard Worker #define DECLARE_TERNARY_BOOL_GENTYPE_FUNCS(FUNC_NAME)                                                                 \
1550*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bool(ShaderEvalContext &c)                                                                \
1551*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
1552*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);                   \
1553*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
1554*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec2(ShaderEvalContext &c)                                                               \
1555*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
1556*35238bceSAndroid Build Coastguard Worker         c.color.yz() =                                                                                                \
1557*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)), \
1558*35238bceSAndroid Build Coastguard Worker                       greaterThan(c.in[2].swizzle(2, 1), Vec2(0.0f)))                                                 \
1559*35238bceSAndroid Build Coastguard Worker                 .asFloat();                                                                                           \
1560*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
1561*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec3(ShaderEvalContext &c)                                                               \
1562*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
1563*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)),                                  \
1564*35238bceSAndroid Build Coastguard Worker                                   greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f)),                                  \
1565*35238bceSAndroid Build Coastguard Worker                                   greaterThan(c.in[2].swizzle(3, 1, 2), Vec3(0.0f)))                                  \
1566*35238bceSAndroid Build Coastguard Worker                             .asFloat();                                                                               \
1567*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
1568*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec4(ShaderEvalContext &c)                                                               \
1569*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
1570*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)),                                     \
1571*35238bceSAndroid Build Coastguard Worker                             greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f)),                                     \
1572*35238bceSAndroid Build Coastguard Worker                             greaterThan(c.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f)))                                     \
1573*35238bceSAndroid Build Coastguard Worker                       .asFloat();                                                                                     \
1574*35238bceSAndroid Build Coastguard Worker     }
1575*35238bceSAndroid Build Coastguard Worker 
1576*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_INT_GENTYPE_FUNCS(FUNC_NAME)                             \
1577*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_int(ShaderEvalContext &c)                          \
1578*35238bceSAndroid Build Coastguard Worker     {                                                                          \
1579*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME((int)c.in[0].z());                      \
1580*35238bceSAndroid Build Coastguard Worker     }                                                                          \
1581*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                        \
1582*35238bceSAndroid Build Coastguard Worker     {                                                                          \
1583*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asInt()).asFloat();     \
1584*35238bceSAndroid Build Coastguard Worker     }                                                                          \
1585*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                        \
1586*35238bceSAndroid Build Coastguard Worker     {                                                                          \
1587*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt()).asFloat(); \
1588*35238bceSAndroid Build Coastguard Worker     }                                                                          \
1589*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                        \
1590*35238bceSAndroid Build Coastguard Worker     {                                                                          \
1591*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt()).asFloat();    \
1592*35238bceSAndroid Build Coastguard Worker     }
1593*35238bceSAndroid Build Coastguard Worker 
1594*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_INT_GENTYPE_FUNCS(FUNC_NAME)                                                              \
1595*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_int(ShaderEvalContext &c)                                                            \
1596*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
1597*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME((int)c.in[0].z(), (int)c.in[1].x());                                      \
1598*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
1599*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                                                          \
1600*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
1601*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asInt(), c.in[1].swizzle(1, 0).asInt()).asFloat();        \
1602*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
1603*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                                                          \
1604*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
1605*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(); \
1606*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
1607*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                                                          \
1608*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
1609*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(); \
1610*35238bceSAndroid Build Coastguard Worker     }
1611*35238bceSAndroid Build Coastguard Worker 
1612*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_UINT_GENTYPE_FUNCS(FUNC_NAME)                             \
1613*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uint(ShaderEvalContext &c)                          \
1614*35238bceSAndroid Build Coastguard Worker     {                                                                           \
1615*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME((uint32_t)c.in[0].z());                  \
1616*35238bceSAndroid Build Coastguard Worker     }                                                                           \
1617*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                         \
1618*35238bceSAndroid Build Coastguard Worker     {                                                                           \
1619*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asUint()).asFloat();     \
1620*35238bceSAndroid Build Coastguard Worker     }                                                                           \
1621*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                         \
1622*35238bceSAndroid Build Coastguard Worker     {                                                                           \
1623*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint()).asFloat(); \
1624*35238bceSAndroid Build Coastguard Worker     }                                                                           \
1625*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                         \
1626*35238bceSAndroid Build Coastguard Worker     {                                                                           \
1627*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint()).asFloat();    \
1628*35238bceSAndroid Build Coastguard Worker     }
1629*35238bceSAndroid Build Coastguard Worker 
1630*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_UINT_GENTYPE_FUNCS(FUNC_NAME)                                                               \
1631*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uint(ShaderEvalContext &c)                                                             \
1632*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1633*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME((uint32_t)c.in[0].z(), (uint32_t)c.in[1].x());                              \
1634*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1635*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                            \
1636*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1637*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), c.in[1].swizzle(1, 0).asUint()).asFloat();        \
1638*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1639*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                            \
1640*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1641*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), c.in[1].swizzle(1, 2, 0).asUint()).asFloat(); \
1642*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1643*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                            \
1644*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1645*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), c.in[1].swizzle(3, 2, 1, 0).asUint()).asFloat(); \
1646*35238bceSAndroid Build Coastguard Worker     }
1647*35238bceSAndroid Build Coastguard Worker 
1648*35238bceSAndroid Build Coastguard Worker #define DECLARE_TERNARY_INT_GENTYPE_FUNCS(FUNC_NAME)                                                               \
1649*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_int(ShaderEvalContext &c)                                                              \
1650*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1651*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());                      \
1652*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1653*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                                                            \
1654*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1655*35238bceSAndroid Build Coastguard Worker         c.color.yz() =                                                                                             \
1656*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()) \
1657*35238bceSAndroid Build Coastguard Worker                 .asFloat();                                                                                        \
1658*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1659*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                                                            \
1660*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1661*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(),              \
1662*35238bceSAndroid Build Coastguard Worker                                   c.in[2].swizzle(3, 1, 2).asInt())                                                \
1663*35238bceSAndroid Build Coastguard Worker                             .asFloat();                                                                            \
1664*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1665*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                                                            \
1666*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1667*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(),              \
1668*35238bceSAndroid Build Coastguard Worker                             c.in[2].swizzle(0, 3, 2, 1).asInt())                                                   \
1669*35238bceSAndroid Build Coastguard Worker                       .asFloat();                                                                                  \
1670*35238bceSAndroid Build Coastguard Worker     }
1671*35238bceSAndroid Build Coastguard Worker 
1672*35238bceSAndroid Build Coastguard Worker #define DECLARE_TERNARY_UINT_GENTYPE_FUNCS(FUNC_NAME)                                                                 \
1673*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uint(ShaderEvalContext &c)                                                                \
1674*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
1675*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME((uint32_t)c.in[0].z(), (uint32_t)c.in[1].x(), (uint32_t)c.in[2].y());          \
1676*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
1677*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                               \
1678*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
1679*35238bceSAndroid Build Coastguard Worker         c.color.yz() =                                                                                                \
1680*35238bceSAndroid Build Coastguard Worker             FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), c.in[1].swizzle(1, 0).asUint(), c.in[2].swizzle(2, 1).asUint()) \
1681*35238bceSAndroid Build Coastguard Worker                 .asFloat();                                                                                           \
1682*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
1683*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                               \
1684*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
1685*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), c.in[1].swizzle(1, 2, 0).asUint(),               \
1686*35238bceSAndroid Build Coastguard Worker                                   c.in[2].swizzle(3, 1, 2).asUint())                                                  \
1687*35238bceSAndroid Build Coastguard Worker                             .asFloat();                                                                               \
1688*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
1689*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                               \
1690*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
1691*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), c.in[1].swizzle(3, 2, 1, 0).asUint(),               \
1692*35238bceSAndroid Build Coastguard Worker                             c.in[2].swizzle(0, 3, 2, 1).asUint())                                                     \
1693*35238bceSAndroid Build Coastguard Worker                       .asFloat();                                                                                     \
1694*35238bceSAndroid Build Coastguard Worker     }
1695*35238bceSAndroid Build Coastguard Worker 
1696*35238bceSAndroid Build Coastguard Worker #define DECLARE_VEC_FLOAT_FUNCS(FUNC_NAME)                                \
1697*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                    \
1698*35238bceSAndroid Build Coastguard Worker     {                                                                     \
1699*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].x());     \
1700*35238bceSAndroid Build Coastguard Worker     }                                                                     \
1701*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                    \
1702*35238bceSAndroid Build Coastguard Worker     {                                                                     \
1703*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].x()); \
1704*35238bceSAndroid Build Coastguard Worker     }                                                                     \
1705*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                    \
1706*35238bceSAndroid Build Coastguard Worker     {                                                                     \
1707*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].x());    \
1708*35238bceSAndroid Build Coastguard Worker     }
1709*35238bceSAndroid Build Coastguard Worker 
1710*35238bceSAndroid Build Coastguard Worker #define DECLARE_VEC_FLOAT_FLOAT_FUNCS(FUNC_NAME)                                       \
1711*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                                 \
1712*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1713*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].x(), c.in[2].y());     \
1714*35238bceSAndroid Build Coastguard Worker     }                                                                                  \
1715*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                                 \
1716*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1717*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].x(), c.in[2].y()); \
1718*35238bceSAndroid Build Coastguard Worker     }                                                                                  \
1719*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                                 \
1720*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1721*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].x(), c.in[2].y());    \
1722*35238bceSAndroid Build Coastguard Worker     }
1723*35238bceSAndroid Build Coastguard Worker 
1724*35238bceSAndroid Build Coastguard Worker #define DECLARE_VEC_VEC_FLOAT_FUNCS(FUNC_NAME)                                                      \
1725*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                                              \
1726*35238bceSAndroid Build Coastguard Worker     {                                                                                               \
1727*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());        \
1728*35238bceSAndroid Build Coastguard Worker     }                                                                                               \
1729*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                                              \
1730*35238bceSAndroid Build Coastguard Worker     {                                                                                               \
1731*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()); \
1732*35238bceSAndroid Build Coastguard Worker     }                                                                                               \
1733*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                                              \
1734*35238bceSAndroid Build Coastguard Worker     {                                                                                               \
1735*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()); \
1736*35238bceSAndroid Build Coastguard Worker     }
1737*35238bceSAndroid Build Coastguard Worker 
1738*35238bceSAndroid Build Coastguard Worker #define DECLARE_FLOAT_FLOAT_VEC_FUNCS(FUNC_NAME)                                       \
1739*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                                 \
1740*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1741*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(2, 1));     \
1742*35238bceSAndroid Build Coastguard Worker     }                                                                                  \
1743*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                                 \
1744*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1745*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(3, 1, 2)); \
1746*35238bceSAndroid Build Coastguard Worker     }                                                                                  \
1747*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                                 \
1748*35238bceSAndroid Build Coastguard Worker     {                                                                                  \
1749*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(0, 3, 2, 1));    \
1750*35238bceSAndroid Build Coastguard Worker     }
1751*35238bceSAndroid Build Coastguard Worker 
1752*35238bceSAndroid Build Coastguard Worker #define DECLARE_FLOAT_VEC_FUNCS(FUNC_NAME)                                \
1753*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                    \
1754*35238bceSAndroid Build Coastguard Worker     {                                                                     \
1755*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].z(), c.in[1].swizzle(1, 0));     \
1756*35238bceSAndroid Build Coastguard Worker     }                                                                     \
1757*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                    \
1758*35238bceSAndroid Build Coastguard Worker     {                                                                     \
1759*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].z(), c.in[1].swizzle(1, 2, 0)); \
1760*35238bceSAndroid Build Coastguard Worker     }                                                                     \
1761*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                    \
1762*35238bceSAndroid Build Coastguard Worker     {                                                                     \
1763*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].z(), c.in[1].swizzle(3, 2, 1, 0));    \
1764*35238bceSAndroid Build Coastguard Worker     }
1765*35238bceSAndroid Build Coastguard Worker 
1766*35238bceSAndroid Build Coastguard Worker #define DECLARE_IVEC_INT_FUNCS(FUNC_NAME)                                                        \
1767*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                                          \
1768*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
1769*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asInt(), (int)c.in[1].x()).asFloat();     \
1770*35238bceSAndroid Build Coastguard Worker     }                                                                                            \
1771*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                                          \
1772*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
1773*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(), (int)c.in[1].x()).asFloat(); \
1774*35238bceSAndroid Build Coastguard Worker     }                                                                                            \
1775*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                                          \
1776*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
1777*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(), (int)c.in[1].x()).asFloat();    \
1778*35238bceSAndroid Build Coastguard Worker     }
1779*35238bceSAndroid Build Coastguard Worker 
1780*35238bceSAndroid Build Coastguard Worker #define DECLARE_IVEC_INT_INT_FUNCS(FUNC_NAME)                                                                      \
1781*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                                                            \
1782*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1783*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asInt(), (int)c.in[1].x(), (int)c.in[2].y()).asFloat();     \
1784*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1785*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                                                            \
1786*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1787*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(), (int)c.in[1].x(), (int)c.in[2].y()).asFloat(); \
1788*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1789*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                                                            \
1790*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1791*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(), (int)c.in[1].x(), (int)c.in[2].y()).asFloat();    \
1792*35238bceSAndroid Build Coastguard Worker     }
1793*35238bceSAndroid Build Coastguard Worker 
1794*35238bceSAndroid Build Coastguard Worker #define DECLARE_INT_IVEC_FUNCS(FUNC_NAME)                                                        \
1795*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                                          \
1796*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
1797*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME((int)c.in[0].z(), c.in[1].swizzle(1, 0).asInt()).asFloat();     \
1798*35238bceSAndroid Build Coastguard Worker     }                                                                                            \
1799*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                                          \
1800*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
1801*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME((int)c.in[0].z(), c.in[1].swizzle(1, 2, 0).asInt()).asFloat(); \
1802*35238bceSAndroid Build Coastguard Worker     }                                                                                            \
1803*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                                          \
1804*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
1805*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME((int)c.in[0].z(), c.in[1].swizzle(3, 2, 1, 0).asInt()).asFloat();    \
1806*35238bceSAndroid Build Coastguard Worker     }
1807*35238bceSAndroid Build Coastguard Worker 
1808*35238bceSAndroid Build Coastguard Worker #define DECLARE_UVEC_UINT_FUNCS(FUNC_NAME)                                                             \
1809*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                \
1810*35238bceSAndroid Build Coastguard Worker     {                                                                                                  \
1811*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), (uint32_t)c.in[1].x()).asFloat();     \
1812*35238bceSAndroid Build Coastguard Worker     }                                                                                                  \
1813*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                \
1814*35238bceSAndroid Build Coastguard Worker     {                                                                                                  \
1815*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), (uint32_t)c.in[1].x()).asFloat(); \
1816*35238bceSAndroid Build Coastguard Worker     }                                                                                                  \
1817*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                \
1818*35238bceSAndroid Build Coastguard Worker     {                                                                                                  \
1819*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), (uint32_t)c.in[1].x()).asFloat();    \
1820*35238bceSAndroid Build Coastguard Worker     }
1821*35238bceSAndroid Build Coastguard Worker 
1822*35238bceSAndroid Build Coastguard Worker #define DECLARE_UVEC_UINT_UINT_FUNCS(FUNC_NAME)                                                                      \
1823*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                              \
1824*35238bceSAndroid Build Coastguard Worker     {                                                                                                                \
1825*35238bceSAndroid Build Coastguard Worker         c.color.yz() =                                                                                               \
1826*35238bceSAndroid Build Coastguard Worker             FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), (uint32_t)c.in[1].x(), (uint32_t)c.in[2].y()).asFloat();       \
1827*35238bceSAndroid Build Coastguard Worker     }                                                                                                                \
1828*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                              \
1829*35238bceSAndroid Build Coastguard Worker     {                                                                                                                \
1830*35238bceSAndroid Build Coastguard Worker         c.color.xyz() =                                                                                              \
1831*35238bceSAndroid Build Coastguard Worker             FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), (uint32_t)c.in[1].x(), (uint32_t)c.in[2].y()).asFloat();    \
1832*35238bceSAndroid Build Coastguard Worker     }                                                                                                                \
1833*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                              \
1834*35238bceSAndroid Build Coastguard Worker     {                                                                                                                \
1835*35238bceSAndroid Build Coastguard Worker         c.color =                                                                                                    \
1836*35238bceSAndroid Build Coastguard Worker             FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), (uint32_t)c.in[1].x(), (uint32_t)c.in[2].y()).asFloat(); \
1837*35238bceSAndroid Build Coastguard Worker     }
1838*35238bceSAndroid Build Coastguard Worker 
1839*35238bceSAndroid Build Coastguard Worker #define DECLARE_UINT_UVEC_FUNCS(FUNC_NAME)                                                             \
1840*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                \
1841*35238bceSAndroid Build Coastguard Worker     {                                                                                                  \
1842*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME((uint32_t)c.in[0].z(), c.in[1].swizzle(1, 0).asUint()).asFloat();     \
1843*35238bceSAndroid Build Coastguard Worker     }                                                                                                  \
1844*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                \
1845*35238bceSAndroid Build Coastguard Worker     {                                                                                                  \
1846*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME((uint32_t)c.in[0].z(), c.in[1].swizzle(1, 2, 0).asUint()).asFloat(); \
1847*35238bceSAndroid Build Coastguard Worker     }                                                                                                  \
1848*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                \
1849*35238bceSAndroid Build Coastguard Worker     {                                                                                                  \
1850*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME((uint32_t)c.in[0].z(), c.in[1].swizzle(3, 2, 1, 0).asUint()).asFloat();    \
1851*35238bceSAndroid Build Coastguard Worker     }
1852*35238bceSAndroid Build Coastguard Worker 
1853*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_INT_VEC_FUNCS(FUNC_NAME)                                                                  \
1854*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                                                          \
1855*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
1856*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asInt(), c.in[1].swizzle(1, 0).asInt()).asFloat();        \
1857*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
1858*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                                                          \
1859*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
1860*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(); \
1861*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
1862*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                                                          \
1863*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
1864*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(); \
1865*35238bceSAndroid Build Coastguard Worker     }
1866*35238bceSAndroid Build Coastguard Worker 
1867*35238bceSAndroid Build Coastguard Worker #define DECLARE_BINARY_UINT_VEC_FUNCS(FUNC_NAME)                                                                   \
1868*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                            \
1869*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1870*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), c.in[1].swizzle(1, 0).asUint()).asFloat();        \
1871*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1872*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                            \
1873*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1874*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), c.in[1].swizzle(1, 2, 0).asUint()).asFloat(); \
1875*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
1876*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                            \
1877*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
1878*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), c.in[1].swizzle(3, 2, 1, 0).asUint()).asFloat(); \
1879*35238bceSAndroid Build Coastguard Worker     }
1880*35238bceSAndroid Build Coastguard Worker 
1881*35238bceSAndroid Build Coastguard Worker #define DECLARE_UINT_INT_GENTYPE_FUNCS(FUNC_NAME)                                                                 \
1882*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uint(ShaderEvalContext &c)                                                            \
1883*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
1884*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME((uint32_t)c.in[0].z(), (int)c.in[1].x());                                  \
1885*35238bceSAndroid Build Coastguard Worker     }                                                                                                             \
1886*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                           \
1887*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
1888*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), c.in[1].swizzle(1, 0).asInt()).asFloat();        \
1889*35238bceSAndroid Build Coastguard Worker     }                                                                                                             \
1890*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                           \
1891*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
1892*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), c.in[1].swizzle(1, 2, 0).asInt()).asFloat(); \
1893*35238bceSAndroid Build Coastguard Worker     }                                                                                                             \
1894*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                           \
1895*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
1896*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), c.in[1].swizzle(3, 2, 1, 0).asInt()).asFloat(); \
1897*35238bceSAndroid Build Coastguard Worker     }
1898*35238bceSAndroid Build Coastguard Worker 
1899*35238bceSAndroid Build Coastguard Worker #define DECLARE_UVEC_INT_FUNCS(FUNC_NAME)                                                         \
1900*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                           \
1901*35238bceSAndroid Build Coastguard Worker     {                                                                                             \
1902*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), (int)c.in[1].x()).asFloat();     \
1903*35238bceSAndroid Build Coastguard Worker     }                                                                                             \
1904*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                           \
1905*35238bceSAndroid Build Coastguard Worker     {                                                                                             \
1906*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), (int)c.in[1].x()).asFloat(); \
1907*35238bceSAndroid Build Coastguard Worker     }                                                                                             \
1908*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                           \
1909*35238bceSAndroid Build Coastguard Worker     {                                                                                             \
1910*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), (int)c.in[1].x()).asFloat();    \
1911*35238bceSAndroid Build Coastguard Worker     }
1912*35238bceSAndroid Build Coastguard Worker 
1913*35238bceSAndroid Build Coastguard Worker // Operators.
1914*35238bceSAndroid Build Coastguard Worker 
1915*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(nop)
DECLARE_UNARY_GENTYPE_FUNCS(negate)1916*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(negate)
1917*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(addOne)
1918*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(subOne)
1919*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(add)
1920*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(sub)
1921*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(mul)
1922*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(div)
1923*35238bceSAndroid Build Coastguard Worker 
1924*35238bceSAndroid Build Coastguard Worker void eval_selection_float(ShaderEvalContext &c)
1925*35238bceSAndroid Build Coastguard Worker {
1926*35238bceSAndroid Build Coastguard Worker     c.color.x() = selection(c.in[0].z() > 0.0f, c.in[1].x(), c.in[2].y());
1927*35238bceSAndroid Build Coastguard Worker }
eval_selection_vec2(ShaderEvalContext & c)1928*35238bceSAndroid Build Coastguard Worker void eval_selection_vec2(ShaderEvalContext &c)
1929*35238bceSAndroid Build Coastguard Worker {
1930*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));
1931*35238bceSAndroid Build Coastguard Worker }
eval_selection_vec3(ShaderEvalContext & c)1932*35238bceSAndroid Build Coastguard Worker void eval_selection_vec3(ShaderEvalContext &c)
1933*35238bceSAndroid Build Coastguard Worker {
1934*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));
1935*35238bceSAndroid Build Coastguard Worker }
eval_selection_vec4(ShaderEvalContext & c)1936*35238bceSAndroid Build Coastguard Worker void eval_selection_vec4(ShaderEvalContext &c)
1937*35238bceSAndroid Build Coastguard Worker {
1938*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));
1939*35238bceSAndroid Build Coastguard Worker }
1940*35238bceSAndroid Build Coastguard Worker 
1941*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(nop)
DECLARE_UNARY_INT_GENTYPE_FUNCS(negate)1942*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(negate)
1943*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(addOne)
1944*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(subOne)
1945*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_INT_GENTYPE_FUNCS(bitwiseNot)
1946*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(add)
1947*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(sub)
1948*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(mul)
1949*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(div)
1950*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(mod)
1951*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(bitwiseAnd)
1952*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(bitwiseOr)
1953*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(bitwiseXor)
1954*35238bceSAndroid Build Coastguard Worker 
1955*35238bceSAndroid Build Coastguard Worker void eval_leftShift_int(ShaderEvalContext &c)
1956*35238bceSAndroid Build Coastguard Worker {
1957*35238bceSAndroid Build Coastguard Worker     c.color.x() = (float)leftShift((int)c.in[0].z(), (int)c.in[1].x());
1958*35238bceSAndroid Build Coastguard Worker }
DECLARE_BINARY_INT_VEC_FUNCS(leftShift)1959*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_VEC_FUNCS(leftShift)
1960*35238bceSAndroid Build Coastguard Worker void eval_rightShift_int(ShaderEvalContext &c)
1961*35238bceSAndroid Build Coastguard Worker {
1962*35238bceSAndroid Build Coastguard Worker     c.color.x() = (float)rightShift((int)c.in[0].z(), (int)c.in[1].x());
1963*35238bceSAndroid Build Coastguard Worker }
1964*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_VEC_FUNCS(rightShift)
DECLARE_IVEC_INT_FUNCS(leftShiftVecScalar)1965*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(leftShiftVecScalar)
1966*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(rightShiftVecScalar)
1967*35238bceSAndroid Build Coastguard Worker 
1968*35238bceSAndroid Build Coastguard Worker void eval_selection_int(ShaderEvalContext &c)
1969*35238bceSAndroid Build Coastguard Worker {
1970*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());
1971*35238bceSAndroid Build Coastguard Worker }
eval_selection_ivec2(ShaderEvalContext & c)1972*35238bceSAndroid Build Coastguard Worker void eval_selection_ivec2(ShaderEvalContext &c)
1973*35238bceSAndroid Build Coastguard Worker {
1974*35238bceSAndroid Build Coastguard Worker     c.color.yz() =
1975*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();
1976*35238bceSAndroid Build Coastguard Worker }
eval_selection_ivec3(ShaderEvalContext & c)1977*35238bceSAndroid Build Coastguard Worker void eval_selection_ivec3(ShaderEvalContext &c)
1978*35238bceSAndroid Build Coastguard Worker {
1979*35238bceSAndroid Build Coastguard Worker     c.color.xyz() =
1980*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();
1981*35238bceSAndroid Build Coastguard Worker }
eval_selection_ivec4(ShaderEvalContext & c)1982*35238bceSAndroid Build Coastguard Worker void eval_selection_ivec4(ShaderEvalContext &c)
1983*35238bceSAndroid Build Coastguard Worker {
1984*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())
1985*35238bceSAndroid Build Coastguard Worker                   .asFloat();
1986*35238bceSAndroid Build Coastguard Worker }
1987*35238bceSAndroid Build Coastguard Worker 
1988*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_UINT_GENTYPE_FUNCS(nop)
DECLARE_UNARY_UINT_GENTYPE_FUNCS(negate)1989*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_UINT_GENTYPE_FUNCS(negate)
1990*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_UINT_GENTYPE_FUNCS(bitwiseNot)
1991*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_UINT_GENTYPE_FUNCS(addOne)
1992*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_UINT_GENTYPE_FUNCS(subOne)
1993*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(add)
1994*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(sub)
1995*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(mul)
1996*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(div)
1997*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(mod)
1998*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(bitwiseAnd)
1999*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(bitwiseOr)
2000*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(bitwiseXor)
2001*35238bceSAndroid Build Coastguard Worker 
2002*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_INT_GENTYPE_FUNCS(leftShift)
2003*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_INT_GENTYPE_FUNCS(rightShift)
2004*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_INT_FUNCS(leftShiftVecScalar)
2005*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_INT_FUNCS(rightShiftVecScalar)
2006*35238bceSAndroid Build Coastguard Worker 
2007*35238bceSAndroid Build Coastguard Worker void eval_selection_uint(ShaderEvalContext &c)
2008*35238bceSAndroid Build Coastguard Worker {
2009*35238bceSAndroid Build Coastguard Worker     c.color.x() = (float)selection(c.in[0].z() > 0.0f, (uint32_t)c.in[1].x(), (uint32_t)c.in[2].y());
2010*35238bceSAndroid Build Coastguard Worker }
eval_selection_uvec2(ShaderEvalContext & c)2011*35238bceSAndroid Build Coastguard Worker void eval_selection_uvec2(ShaderEvalContext &c)
2012*35238bceSAndroid Build Coastguard Worker {
2013*35238bceSAndroid Build Coastguard Worker     c.color.yz() =
2014*35238bceSAndroid Build Coastguard Worker         selection(c.in[0].z() > 0.0f, c.in[1].swizzle(1, 0).asUint(), c.in[2].swizzle(2, 1).asUint()).asFloat();
2015*35238bceSAndroid Build Coastguard Worker }
eval_selection_uvec3(ShaderEvalContext & c)2016*35238bceSAndroid Build Coastguard Worker void eval_selection_uvec3(ShaderEvalContext &c)
2017*35238bceSAndroid Build Coastguard Worker {
2018*35238bceSAndroid Build Coastguard Worker     c.color.xyz() =
2019*35238bceSAndroid Build Coastguard Worker         selection(c.in[0].z() > 0.0f, c.in[1].swizzle(1, 2, 0).asUint(), c.in[2].swizzle(3, 1, 2).asUint()).asFloat();
2020*35238bceSAndroid Build Coastguard Worker }
eval_selection_uvec4(ShaderEvalContext & c)2021*35238bceSAndroid Build Coastguard Worker void eval_selection_uvec4(ShaderEvalContext &c)
2022*35238bceSAndroid Build Coastguard Worker {
2023*35238bceSAndroid Build Coastguard Worker     c.color = selection(c.in[0].z() > 0.0f, c.in[1].swizzle(3, 2, 1, 0).asUint(), c.in[2].swizzle(0, 3, 2, 1).asUint())
2024*35238bceSAndroid Build Coastguard Worker                   .asFloat();
2025*35238bceSAndroid Build Coastguard Worker }
2026*35238bceSAndroid Build Coastguard Worker 
2027*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_BOOL_GENTYPE_FUNCS(boolNot)
DECLARE_BINARY_BOOL_FUNCS(logicalAnd)2028*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_BOOL_FUNCS(logicalAnd)
2029*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_BOOL_FUNCS(logicalOr)
2030*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_BOOL_FUNCS(logicalXor)
2031*35238bceSAndroid Build Coastguard Worker 
2032*35238bceSAndroid Build Coastguard Worker void eval_selection_bool(ShaderEvalContext &c)
2033*35238bceSAndroid Build Coastguard Worker {
2034*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);
2035*35238bceSAndroid Build Coastguard Worker }
eval_selection_bvec2(ShaderEvalContext & c)2036*35238bceSAndroid Build Coastguard Worker void eval_selection_bvec2(ShaderEvalContext &c)
2037*35238bceSAndroid Build Coastguard Worker {
2038*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)),
2039*35238bceSAndroid Build Coastguard Worker                              greaterThan(c.in[2].swizzle(2, 1), Vec2(0.0f, 0.0f)))
2040*35238bceSAndroid Build Coastguard Worker                        .asFloat();
2041*35238bceSAndroid Build Coastguard Worker }
eval_selection_bvec3(ShaderEvalContext & c)2042*35238bceSAndroid Build Coastguard Worker void eval_selection_bvec3(ShaderEvalContext &c)
2043*35238bceSAndroid Build Coastguard Worker {
2044*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)),
2045*35238bceSAndroid Build Coastguard Worker                               greaterThan(c.in[2].swizzle(3, 1, 2), Vec3(0.0f, 0.0f, 0.0f)))
2046*35238bceSAndroid Build Coastguard Worker                         .asFloat();
2047*35238bceSAndroid Build Coastguard Worker }
eval_selection_bvec4(ShaderEvalContext & c)2048*35238bceSAndroid Build Coastguard Worker void eval_selection_bvec4(ShaderEvalContext &c)
2049*35238bceSAndroid Build Coastguard Worker {
2050*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)),
2051*35238bceSAndroid Build Coastguard Worker                         greaterThan(c.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f)))
2052*35238bceSAndroid Build Coastguard Worker                   .asFloat();
2053*35238bceSAndroid Build Coastguard Worker }
2054*35238bceSAndroid Build Coastguard Worker 
2055*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(addVecScalar)
DECLARE_VEC_FLOAT_FUNCS(subVecScalar)2056*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(subVecScalar)
2057*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(mulVecScalar)
2058*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(divVecScalar)
2059*35238bceSAndroid Build Coastguard Worker 
2060*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(addScalarVec)
2061*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(subScalarVec)
2062*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(mulScalarVec)
2063*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(divScalarVec)
2064*35238bceSAndroid Build Coastguard Worker 
2065*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(addVecScalar)
2066*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(subVecScalar)
2067*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(mulVecScalar)
2068*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(divVecScalar)
2069*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(modVecScalar)
2070*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(bitwiseAndVecScalar)
2071*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(bitwiseOrVecScalar)
2072*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(bitwiseXorVecScalar)
2073*35238bceSAndroid Build Coastguard Worker 
2074*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(addScalarVec)
2075*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(subScalarVec)
2076*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(mulScalarVec)
2077*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(divScalarVec)
2078*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(modScalarVec)
2079*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(bitwiseAndScalarVec)
2080*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(bitwiseOrScalarVec)
2081*35238bceSAndroid Build Coastguard Worker DECLARE_INT_IVEC_FUNCS(bitwiseXorScalarVec)
2082*35238bceSAndroid Build Coastguard Worker 
2083*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(addVecScalar)
2084*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(subVecScalar)
2085*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(mulVecScalar)
2086*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(divVecScalar)
2087*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(modVecScalar)
2088*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(bitwiseAndVecScalar)
2089*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(bitwiseOrVecScalar)
2090*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(bitwiseXorVecScalar)
2091*35238bceSAndroid Build Coastguard Worker 
2092*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_UVEC_FUNCS(addScalarVec)
2093*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_UVEC_FUNCS(subScalarVec)
2094*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_UVEC_FUNCS(mulScalarVec)
2095*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_UVEC_FUNCS(divScalarVec)
2096*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_UVEC_FUNCS(modScalarVec)
2097*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_UVEC_FUNCS(bitwiseAndScalarVec)
2098*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_UVEC_FUNCS(bitwiseOrScalarVec)
2099*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_UVEC_FUNCS(bitwiseXorScalarVec)
2100*35238bceSAndroid Build Coastguard Worker 
2101*35238bceSAndroid Build Coastguard Worker // Built-in functions.
2102*35238bceSAndroid Build Coastguard Worker 
2103*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(radians)
2104*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(degrees)
2105*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(sin)
2106*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(cos)
2107*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(tan)
2108*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(asin)
2109*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(acos)
2110*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(atan)
2111*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(atan2)
2112*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(sinh)
2113*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(cosh)
2114*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(tanh)
2115*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(asinh)
2116*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(acosh)
2117*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(atanh)
2118*35238bceSAndroid Build Coastguard Worker 
2119*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(pow)
2120*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(exp)
2121*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(log)
2122*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(exp2)
2123*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(log2)
2124*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(sqrt)
2125*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(inverseSqrt)
2126*35238bceSAndroid Build Coastguard Worker 
2127*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(abs)
2128*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(sign)
2129*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(floor)
2130*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(trunc)
2131*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(roundToEven)
2132*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(ceil)
2133*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(fract)
2134*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(mod)
2135*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(modVecScalar)
2136*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(min)
2137*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(minVecScalar)
2138*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(min)
2139*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(minVecScalar)
2140*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(min)
2141*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(minVecScalar)
2142*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(max)
2143*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FUNCS(maxVecScalar)
2144*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_INT_GENTYPE_FUNCS(max)
2145*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_FUNCS(maxVecScalar)
2146*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_UINT_GENTYPE_FUNCS(max)
2147*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_FUNCS(maxVecScalar)
2148*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_GENTYPE_FUNCS(clamp)
2149*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_FLOAT_FLOAT_FUNCS(clampVecScalarScalar)
2150*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_INT_GENTYPE_FUNCS(clamp)
2151*35238bceSAndroid Build Coastguard Worker DECLARE_IVEC_INT_INT_FUNCS(clampVecScalarScalar)
2152*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_UINT_GENTYPE_FUNCS(clamp)
2153*35238bceSAndroid Build Coastguard Worker DECLARE_UVEC_UINT_UINT_FUNCS(clampVecScalarScalar)
2154*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_GENTYPE_FUNCS(mix)
2155*35238bceSAndroid Build Coastguard Worker DECLARE_VEC_VEC_FLOAT_FUNCS(mixVecVecScalar)
2156*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(step)
2157*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_VEC_FUNCS(stepScalarVec)
2158*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_GENTYPE_FUNCS(smoothStep)
2159*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_FLOAT_VEC_FUNCS(smoothStepScalarScalarVec)
2160*35238bceSAndroid Build Coastguard Worker 
2161*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_SCALAR_GENTYPE_FUNCS(length)
2162*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_SCALAR_GENTYPE_FUNCS(distance)
2163*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_SCALAR_GENTYPE_FUNCS(dot)
2164*35238bceSAndroid Build Coastguard Worker void eval_cross_vec3(ShaderEvalContext &c)
2165*35238bceSAndroid Build Coastguard Worker {
2166*35238bceSAndroid Build Coastguard Worker     c.color.xyz() = cross(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0));
2167*35238bceSAndroid Build Coastguard Worker }
2168*35238bceSAndroid Build Coastguard Worker 
2169*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_GENTYPE_FUNCS(normalize)
DECLARE_TERNARY_GENTYPE_FUNCS(faceForward)2170*35238bceSAndroid Build Coastguard Worker DECLARE_TERNARY_GENTYPE_FUNCS(faceForward)
2171*35238bceSAndroid Build Coastguard Worker DECLARE_BINARY_GENTYPE_FUNCS(reflect)
2172*35238bceSAndroid Build Coastguard Worker 
2173*35238bceSAndroid Build Coastguard Worker void eval_refract_float(ShaderEvalContext &c)
2174*35238bceSAndroid Build Coastguard Worker {
2175*35238bceSAndroid Build Coastguard Worker     c.color.x() = refract(c.in[0].z(), c.in[1].x(), c.in[2].y());
2176*35238bceSAndroid Build Coastguard Worker }
eval_refract_vec2(ShaderEvalContext & c)2177*35238bceSAndroid Build Coastguard Worker void eval_refract_vec2(ShaderEvalContext &c)
2178*35238bceSAndroid Build Coastguard Worker {
2179*35238bceSAndroid Build Coastguard Worker     c.color.yz() = refract(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0), c.in[2].y());
2180*35238bceSAndroid Build Coastguard Worker }
eval_refract_vec3(ShaderEvalContext & c)2181*35238bceSAndroid Build Coastguard Worker void eval_refract_vec3(ShaderEvalContext &c)
2182*35238bceSAndroid Build Coastguard Worker {
2183*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());
2184*35238bceSAndroid Build Coastguard Worker }
eval_refract_vec4(ShaderEvalContext & c)2185*35238bceSAndroid Build Coastguard Worker void eval_refract_vec4(ShaderEvalContext &c)
2186*35238bceSAndroid Build Coastguard Worker {
2187*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());
2188*35238bceSAndroid Build Coastguard Worker }
2189*35238bceSAndroid Build Coastguard Worker 
2190*35238bceSAndroid Build Coastguard Worker // Compare functions.
2191*35238bceSAndroid Build Coastguard Worker 
2192*35238bceSAndroid Build Coastguard Worker #define DECLARE_FLOAT_COMPARE_FUNCS(FUNC_NAME)                                                    \
2193*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_float(ShaderEvalContext &c)                                           \
2194*35238bceSAndroid Build Coastguard Worker     {                                                                                             \
2195*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].z(), c.in[1].x());                                 \
2196*35238bceSAndroid Build Coastguard Worker     }                                                                                             \
2197*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                                            \
2198*35238bceSAndroid Build Coastguard Worker     {                                                                                             \
2199*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0));             \
2200*35238bceSAndroid Build Coastguard Worker     }                                                                                             \
2201*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                                            \
2202*35238bceSAndroid Build Coastguard Worker     {                                                                                             \
2203*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0));       \
2204*35238bceSAndroid Build Coastguard Worker     }                                                                                             \
2205*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                                            \
2206*35238bceSAndroid Build Coastguard Worker     {                                                                                             \
2207*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)); \
2208*35238bceSAndroid Build Coastguard Worker     }
2209*35238bceSAndroid Build Coastguard Worker 
2210*35238bceSAndroid Build Coastguard Worker #define DECLARE_FLOAT_CWISE_COMPARE_FUNCS(FUNC_NAME)                                             \
2211*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_float(ShaderEvalContext &c)                                          \
2212*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
2213*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].z(), c.in[1].x());                                \
2214*35238bceSAndroid Build Coastguard Worker     }                                                                                            \
2215*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec2(ShaderEvalContext &c)                                           \
2216*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
2217*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1), c.in[1].swizzle(1, 0)).asFloat();        \
2218*35238bceSAndroid Build Coastguard Worker     }                                                                                            \
2219*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec3(ShaderEvalContext &c)                                           \
2220*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
2221*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0)).asFloat(); \
2222*35238bceSAndroid Build Coastguard Worker     }                                                                                            \
2223*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_vec4(ShaderEvalContext &c)                                           \
2224*35238bceSAndroid Build Coastguard Worker     {                                                                                            \
2225*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(); \
2226*35238bceSAndroid Build Coastguard Worker     }
2227*35238bceSAndroid Build Coastguard Worker 
2228*35238bceSAndroid Build Coastguard Worker #define DECLARE_INT_COMPARE_FUNCS(FUNC_NAME)                                                                      \
2229*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_int(ShaderEvalContext &c)                                                             \
2230*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
2231*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].z()), chopToInt(c.in[1].x()));                           \
2232*35238bceSAndroid Build Coastguard Worker     }                                                                                                             \
2233*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                                                           \
2234*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
2235*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].swizzle(3, 1)), chopToInt(c.in[1].swizzle(1, 0)));       \
2236*35238bceSAndroid Build Coastguard Worker     }                                                                                                             \
2237*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                                                           \
2238*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
2239*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))); \
2240*35238bceSAndroid Build Coastguard Worker     }                                                                                                             \
2241*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                                                           \
2242*35238bceSAndroid Build Coastguard Worker     {                                                                                                             \
2243*35238bceSAndroid Build Coastguard Worker         c.color.x() =                                                                                             \
2244*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)));     \
2245*35238bceSAndroid Build Coastguard Worker     }
2246*35238bceSAndroid Build Coastguard Worker 
2247*35238bceSAndroid Build Coastguard Worker #define DECLARE_INT_CWISE_COMPARE_FUNCS(FUNC_NAME)                                                                     \
2248*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_int(ShaderEvalContext &c)                                                                  \
2249*35238bceSAndroid Build Coastguard Worker     {                                                                                                                  \
2250*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].z()), chopToInt(c.in[1].x()));                                \
2251*35238bceSAndroid Build Coastguard Worker     }                                                                                                                  \
2252*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec2(ShaderEvalContext &c)                                                                \
2253*35238bceSAndroid Build Coastguard Worker     {                                                                                                                  \
2254*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(chopToInt(c.in[0].swizzle(3, 1)), chopToInt(c.in[1].swizzle(1, 0))).asFloat();        \
2255*35238bceSAndroid Build Coastguard Worker     }                                                                                                                  \
2256*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec3(ShaderEvalContext &c)                                                                \
2257*35238bceSAndroid Build Coastguard Worker     {                                                                                                                  \
2258*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(); \
2259*35238bceSAndroid Build Coastguard Worker     }                                                                                                                  \
2260*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_ivec4(ShaderEvalContext &c)                                                                \
2261*35238bceSAndroid Build Coastguard Worker     {                                                                                                                  \
2262*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(); \
2263*35238bceSAndroid Build Coastguard Worker     }
2264*35238bceSAndroid Build Coastguard Worker 
2265*35238bceSAndroid Build Coastguard Worker #define DECLARE_UINT_COMPARE_FUNCS(FUNC_NAME)                                                                       \
2266*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uint(ShaderEvalContext &c)                                                              \
2267*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
2268*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME((uint32_t)c.in[0].z(), (uint32_t)c.in[1].x());                               \
2269*35238bceSAndroid Build Coastguard Worker     }                                                                                                               \
2270*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                             \
2271*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
2272*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), c.in[1].swizzle(1, 0).asUint());             \
2273*35238bceSAndroid Build Coastguard Worker     }                                                                                                               \
2274*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                             \
2275*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
2276*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), c.in[1].swizzle(1, 2, 0).asUint());       \
2277*35238bceSAndroid Build Coastguard Worker     }                                                                                                               \
2278*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                             \
2279*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
2280*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), c.in[1].swizzle(3, 2, 1, 0).asUint()); \
2281*35238bceSAndroid Build Coastguard Worker     }
2282*35238bceSAndroid Build Coastguard Worker 
2283*35238bceSAndroid Build Coastguard Worker #define DECLARE_UINT_CWISE_COMPARE_FUNCS(FUNC_NAME)                                                                \
2284*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uint(ShaderEvalContext &c)                                                             \
2285*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
2286*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME((uint32_t)c.in[0].z(), (uint32_t)c.in[1].x());                              \
2287*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
2288*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec2(ShaderEvalContext &c)                                                            \
2289*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
2290*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(c.in[0].swizzle(3, 1).asUint(), c.in[1].swizzle(1, 0).asUint()).asFloat();        \
2291*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
2292*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec3(ShaderEvalContext &c)                                                            \
2293*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
2294*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(), c.in[1].swizzle(1, 2, 0).asUint()).asFloat(); \
2295*35238bceSAndroid Build Coastguard Worker     }                                                                                                              \
2296*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_uvec4(ShaderEvalContext &c)                                                            \
2297*35238bceSAndroid Build Coastguard Worker     {                                                                                                              \
2298*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), c.in[1].swizzle(3, 2, 1, 0).asUint()).asFloat(); \
2299*35238bceSAndroid Build Coastguard Worker     }
2300*35238bceSAndroid Build Coastguard Worker 
2301*35238bceSAndroid Build Coastguard Worker #define DECLARE_BOOL_COMPARE_FUNCS(FUNC_NAME)                                                 \
2302*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bool(ShaderEvalContext &c)                                        \
2303*35238bceSAndroid Build Coastguard Worker     {                                                                                         \
2304*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f);               \
2305*35238bceSAndroid Build Coastguard Worker     }                                                                                         \
2306*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec2(ShaderEvalContext &c)                                       \
2307*35238bceSAndroid Build Coastguard Worker     {                                                                                         \
2308*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)),        \
2309*35238bceSAndroid Build Coastguard Worker                                        greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f)));       \
2310*35238bceSAndroid Build Coastguard Worker     }                                                                                         \
2311*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec3(ShaderEvalContext &c)                                       \
2312*35238bceSAndroid Build Coastguard Worker     {                                                                                         \
2313*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)),     \
2314*35238bceSAndroid Build Coastguard Worker                                        greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f)));    \
2315*35238bceSAndroid Build Coastguard Worker     }                                                                                         \
2316*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec4(ShaderEvalContext &c)                                       \
2317*35238bceSAndroid Build Coastguard Worker     {                                                                                         \
2318*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)),  \
2319*35238bceSAndroid Build Coastguard Worker                                        greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f))); \
2320*35238bceSAndroid Build Coastguard Worker     }
2321*35238bceSAndroid Build Coastguard Worker 
2322*35238bceSAndroid Build Coastguard Worker #define DECLARE_BOOL_CWISE_COMPARE_FUNCS(FUNC_NAME)                                                                   \
2323*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bool(ShaderEvalContext &c)                                                                \
2324*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
2325*35238bceSAndroid Build Coastguard Worker         c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f);                                       \
2326*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
2327*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec2(ShaderEvalContext &c)                                                               \
2328*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
2329*35238bceSAndroid Build Coastguard Worker         c.color.yz() =                                                                                                \
2330*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))) \
2331*35238bceSAndroid Build Coastguard Worker                 .asFloat();                                                                                           \
2332*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
2333*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec3(ShaderEvalContext &c)                                                               \
2334*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
2335*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)),                                  \
2336*35238bceSAndroid Build Coastguard Worker                                   greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f)))                                  \
2337*35238bceSAndroid Build Coastguard Worker                             .asFloat();                                                                               \
2338*35238bceSAndroid Build Coastguard Worker     }                                                                                                                 \
2339*35238bceSAndroid Build Coastguard Worker     void eval_##FUNC_NAME##_bvec4(ShaderEvalContext &c)                                                               \
2340*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
2341*35238bceSAndroid Build Coastguard Worker         c.color = FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)),                                     \
2342*35238bceSAndroid Build Coastguard Worker                             greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f)))                                     \
2343*35238bceSAndroid Build Coastguard Worker                       .asFloat();                                                                                     \
2344*35238bceSAndroid Build Coastguard Worker     }
2345*35238bceSAndroid Build Coastguard Worker 
2346*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_COMPARE_FUNCS(allEqual)
DECLARE_FLOAT_COMPARE_FUNCS(anyNotEqual)2347*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_COMPARE_FUNCS(anyNotEqual)
2348*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(lessThan)
2349*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(lessThanEqual)
2350*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(greaterThan)
2351*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(greaterThanEqual)
2352*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(equal)
2353*35238bceSAndroid Build Coastguard Worker DECLARE_FLOAT_CWISE_COMPARE_FUNCS(notEqual)
2354*35238bceSAndroid Build Coastguard Worker 
2355*35238bceSAndroid Build Coastguard Worker DECLARE_INT_COMPARE_FUNCS(allEqual)
2356*35238bceSAndroid Build Coastguard Worker DECLARE_INT_COMPARE_FUNCS(anyNotEqual)
2357*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(lessThan)
2358*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(lessThanEqual)
2359*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(greaterThan)
2360*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(greaterThanEqual)
2361*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(equal)
2362*35238bceSAndroid Build Coastguard Worker DECLARE_INT_CWISE_COMPARE_FUNCS(notEqual)
2363*35238bceSAndroid Build Coastguard Worker 
2364*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_COMPARE_FUNCS(allEqual)
2365*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_COMPARE_FUNCS(anyNotEqual)
2366*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_CWISE_COMPARE_FUNCS(lessThan)
2367*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_CWISE_COMPARE_FUNCS(lessThanEqual)
2368*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_CWISE_COMPARE_FUNCS(greaterThan)
2369*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_CWISE_COMPARE_FUNCS(greaterThanEqual)
2370*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_CWISE_COMPARE_FUNCS(equal)
2371*35238bceSAndroid Build Coastguard Worker DECLARE_UINT_CWISE_COMPARE_FUNCS(notEqual)
2372*35238bceSAndroid Build Coastguard Worker 
2373*35238bceSAndroid Build Coastguard Worker DECLARE_BOOL_COMPARE_FUNCS(allEqual)
2374*35238bceSAndroid Build Coastguard Worker DECLARE_BOOL_COMPARE_FUNCS(anyNotEqual)
2375*35238bceSAndroid Build Coastguard Worker DECLARE_BOOL_CWISE_COMPARE_FUNCS(equal)
2376*35238bceSAndroid Build Coastguard Worker DECLARE_BOOL_CWISE_COMPARE_FUNCS(notEqual)
2377*35238bceSAndroid Build Coastguard Worker 
2378*35238bceSAndroid Build Coastguard Worker // Boolean functions.
2379*35238bceSAndroid Build Coastguard Worker 
2380*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_SCALAR_BVEC_FUNCS(GLSL_NAME, FUNC_NAME)                                 \
2381*35238bceSAndroid Build Coastguard Worker     void eval_##GLSL_NAME##_bvec2(ShaderEvalContext &c)                                       \
2382*35238bceSAndroid Build Coastguard Worker     {                                                                                         \
2383*35238bceSAndroid Build Coastguard Worker         c.color.x() = float(FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f))));       \
2384*35238bceSAndroid Build Coastguard Worker     }                                                                                         \
2385*35238bceSAndroid Build Coastguard Worker     void eval_##GLSL_NAME##_bvec3(ShaderEvalContext &c)                                       \
2386*35238bceSAndroid Build Coastguard Worker     {                                                                                         \
2387*35238bceSAndroid Build Coastguard Worker         c.color.x() = float(FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f))));    \
2388*35238bceSAndroid Build Coastguard Worker     }                                                                                         \
2389*35238bceSAndroid Build Coastguard Worker     void eval_##GLSL_NAME##_bvec4(ShaderEvalContext &c)                                       \
2390*35238bceSAndroid Build Coastguard Worker     {                                                                                         \
2391*35238bceSAndroid Build Coastguard Worker         c.color.x() = float(FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)))); \
2392*35238bceSAndroid Build Coastguard Worker     }
2393*35238bceSAndroid Build Coastguard Worker 
2394*35238bceSAndroid Build Coastguard Worker #define DECLARE_UNARY_BVEC_BVEC_FUNCS(GLSL_NAME, FUNC_NAME)                                         \
2395*35238bceSAndroid Build Coastguard Worker     void eval_##GLSL_NAME##_bvec2(ShaderEvalContext &c)                                             \
2396*35238bceSAndroid Build Coastguard Worker     {                                                                                               \
2397*35238bceSAndroid Build Coastguard Worker         c.color.yz() = FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f))).asFloat();         \
2398*35238bceSAndroid Build Coastguard Worker     }                                                                                               \
2399*35238bceSAndroid Build Coastguard Worker     void eval_##GLSL_NAME##_bvec3(ShaderEvalContext &c)                                             \
2400*35238bceSAndroid Build Coastguard Worker     {                                                                                               \
2401*35238bceSAndroid Build Coastguard Worker         c.color.xyz() = FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f))).asFloat();     \
2402*35238bceSAndroid Build Coastguard Worker     }                                                                                               \
2403*35238bceSAndroid Build Coastguard Worker     void eval_##GLSL_NAME##_bvec4(ShaderEvalContext &c)                                             \
2404*35238bceSAndroid Build Coastguard Worker     {                                                                                               \
2405*35238bceSAndroid Build Coastguard Worker         c.color.xyzw() = FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f))).asFloat(); \
2406*35238bceSAndroid Build Coastguard Worker     }
2407*35238bceSAndroid Build Coastguard Worker 
2408*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_SCALAR_BVEC_FUNCS(any, boolAny)
2409*35238bceSAndroid Build Coastguard Worker DECLARE_UNARY_SCALAR_BVEC_FUNCS(all, boolAll)
2410*35238bceSAndroid Build Coastguard Worker 
2411*35238bceSAndroid Build Coastguard Worker void ShaderOperatorTests::init(void)
2412*35238bceSAndroid Build Coastguard Worker {
2413*35238bceSAndroid Build Coastguard Worker #define BOOL_FUNCS(FUNC_NAME) eval_##FUNC_NAME##_bool, DE_NULL, DE_NULL, DE_NULL
2414*35238bceSAndroid Build Coastguard Worker 
2415*35238bceSAndroid Build Coastguard Worker #define FLOAT_VEC_FUNCS(FUNC_NAME) DE_NULL, eval_##FUNC_NAME##_vec2, eval_##FUNC_NAME##_vec3, eval_##FUNC_NAME##_vec4
2416*35238bceSAndroid Build Coastguard Worker #define INT_VEC_FUNCS(FUNC_NAME) DE_NULL, eval_##FUNC_NAME##_ivec2, eval_##FUNC_NAME##_ivec3, eval_##FUNC_NAME##_ivec4
2417*35238bceSAndroid Build Coastguard Worker #define UINT_VEC_FUNCS(FUNC_NAME) DE_NULL, eval_##FUNC_NAME##_uvec2, eval_##FUNC_NAME##_uvec3, eval_##FUNC_NAME##_uvec4
2418*35238bceSAndroid Build Coastguard Worker #define BOOL_VEC_FUNCS(FUNC_NAME) DE_NULL, eval_##FUNC_NAME##_bvec2, eval_##FUNC_NAME##_bvec3, eval_##FUNC_NAME##_bvec4
2419*35238bceSAndroid Build Coastguard Worker 
2420*35238bceSAndroid Build Coastguard Worker #define FLOAT_GENTYPE_FUNCS(FUNC_NAME) \
2421*35238bceSAndroid Build Coastguard Worker     eval_##FUNC_NAME##_float, eval_##FUNC_NAME##_vec2, eval_##FUNC_NAME##_vec3, eval_##FUNC_NAME##_vec4
2422*35238bceSAndroid Build Coastguard Worker #define INT_GENTYPE_FUNCS(FUNC_NAME) \
2423*35238bceSAndroid Build Coastguard Worker     eval_##FUNC_NAME##_int, eval_##FUNC_NAME##_ivec2, eval_##FUNC_NAME##_ivec3, eval_##FUNC_NAME##_ivec4
2424*35238bceSAndroid Build Coastguard Worker #define UINT_GENTYPE_FUNCS(FUNC_NAME) \
2425*35238bceSAndroid Build Coastguard Worker     eval_##FUNC_NAME##_uint, eval_##FUNC_NAME##_uvec2, eval_##FUNC_NAME##_uvec3, eval_##FUNC_NAME##_uvec4
2426*35238bceSAndroid Build Coastguard Worker #define BOOL_GENTYPE_FUNCS(FUNC_NAME) \
2427*35238bceSAndroid Build Coastguard Worker     eval_##FUNC_NAME##_bool, eval_##FUNC_NAME##_bvec2, eval_##FUNC_NAME##_bvec3, eval_##FUNC_NAME##_bvec4
2428*35238bceSAndroid Build Coastguard Worker 
2429*35238bceSAndroid Build Coastguard Worker     // Shorthands.
2430*35238bceSAndroid Build Coastguard Worker     Value notUsed              = Value(VALUE_NONE, 0.0f, 0.0f);
2431*35238bceSAndroid Build Coastguard Worker     FloatScalar::Symbol lUMax  = FloatScalar::SYMBOL_LOWP_UINT_MAX;
2432*35238bceSAndroid Build Coastguard Worker     FloatScalar::Symbol mUMax  = FloatScalar::SYMBOL_MEDIUMP_UINT_MAX;
2433*35238bceSAndroid Build Coastguard Worker     FloatScalar::Symbol lUMaxR = FloatScalar::SYMBOL_LOWP_UINT_MAX_RECIPROCAL;
2434*35238bceSAndroid Build Coastguard Worker     FloatScalar::Symbol mUMaxR = FloatScalar::SYMBOL_MEDIUMP_UINT_MAX_RECIPROCAL;
2435*35238bceSAndroid Build Coastguard Worker 
2436*35238bceSAndroid Build Coastguard Worker     std::vector<BuiltinFuncGroup> funcInfoGroups;
2437*35238bceSAndroid Build Coastguard Worker 
2438*35238bceSAndroid Build Coastguard Worker     // Unary operators.
2439*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(
2440*35238bceSAndroid Build Coastguard Worker         BuiltinFuncGroup("unary_operator", "Unary operator tests")
2441*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("plus", "+", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.5f, PRECMASK_ALL,
2442*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(nop))
2443*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("plus", "+", IGT, Value(IGT, -5.0f, 5.0f), notUsed, notUsed, 0.1f, 0.5f, PRECMASK_ALL,
2444*35238bceSAndroid Build Coastguard Worker                            INT_GENTYPE_FUNCS(nop))
2445*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("plus", "+", UGT, Value(UGT, 0.0f, 2e2f), notUsed, notUsed, 5e-3f, 0.0f, PRECMASK_ALL,
2446*35238bceSAndroid Build Coastguard Worker                            UINT_GENTYPE_FUNCS(nop))
2447*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("minus", "-", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.5f, PRECMASK_ALL,
2448*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(negate))
2449*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("minus", "-", IGT, Value(IGT, -5.0f, 5.0f), notUsed, notUsed, 0.1f, 0.5f, PRECMASK_ALL,
2450*35238bceSAndroid Build Coastguard Worker                            INT_GENTYPE_FUNCS(negate))
2451*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfoSeparateRefScaleBias("minus", "-", UGT, Value(UGT, 0.0f, lUMax), notUsed, notUsed, lUMaxR,
2452*35238bceSAndroid Build Coastguard Worker                                                0.0f, PRECMASK_LOWP, UINT_GENTYPE_FUNCS(negate), lUMaxR,
2453*35238bceSAndroid Build Coastguard Worker                                                FloatScalar::SYMBOL_ONE_MINUS_UINT32MAX_DIV_LOWP_UINT_MAX)
2454*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfoSeparateRefScaleBias("minus", "-", UGT, Value(UGT, 0.0f, mUMax), notUsed, notUsed, mUMaxR,
2455*35238bceSAndroid Build Coastguard Worker                                                0.0f, PRECMASK_MEDIUMP, UINT_GENTYPE_FUNCS(negate), mUMaxR,
2456*35238bceSAndroid Build Coastguard Worker                                                FloatScalar::SYMBOL_ONE_MINUS_UINT32MAX_DIV_MEDIUMP_UINT_MAX)
2457*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("minus", "-", UGT, Value(UGT, 0.0f, 4e9f), notUsed, notUsed, 2e-10f, 0.0f, PRECMASK_HIGHP,
2458*35238bceSAndroid Build Coastguard Worker                            UINT_GENTYPE_FUNCS(negate))
2459*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("not", "!", B, Value(B, -1.0f, 1.0f), notUsed, notUsed, 1.0f, 0.0f, PRECMASK_NA,
2460*35238bceSAndroid Build Coastguard Worker                            eval_boolNot_bool, DE_NULL, DE_NULL, DE_NULL)
2461*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("bitwise_not", "~", IGT, Value(IGT, -1e5f, 1e5f), notUsed, notUsed, 5e-5f, 0.5f,
2462*35238bceSAndroid Build Coastguard Worker                            PRECMASK_HIGHP, INT_GENTYPE_FUNCS(bitwiseNot))
2463*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("bitwise_not", "~", UGT, Value(UGT, 0.0f, 2e9f), notUsed, notUsed, 2e-10f, 0.0f,
2464*35238bceSAndroid Build Coastguard Worker                            PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(bitwiseNot))
2465*35238bceSAndroid Build Coastguard Worker 
2466*35238bceSAndroid Build Coastguard Worker         // Pre/post incr/decr side effect cases.
2467*35238bceSAndroid Build Coastguard Worker         << BuiltinSideEffOperInfo("pre_increment_effect", "++", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f,
2468*35238bceSAndroid Build Coastguard Worker                                   0.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(addOne))
2469*35238bceSAndroid Build Coastguard Worker         << BuiltinSideEffOperInfo("pre_increment_effect", "++", IGT, Value(IGT, -6.0f, 4.0f), notUsed, notUsed, 0.1f,
2470*35238bceSAndroid Build Coastguard Worker                                   0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(addOne))
2471*35238bceSAndroid Build Coastguard Worker         << BuiltinSideEffOperInfo("pre_increment_effect", "++", UGT, Value(UGT, 0.0f, 9.0f), notUsed, notUsed, 0.1f,
2472*35238bceSAndroid Build Coastguard Worker                                   0.0f, PRECMASK_ALL, UINT_GENTYPE_FUNCS(addOne))
2473*35238bceSAndroid Build Coastguard Worker         << BuiltinSideEffOperInfo("pre_decrement_effect", "--", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f,
2474*35238bceSAndroid Build Coastguard Worker                                   1.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(subOne))
2475*35238bceSAndroid Build Coastguard Worker         << BuiltinSideEffOperInfo("pre_decrement_effect", "--", IGT, Value(IGT, -4.0f, 6.0f), notUsed, notUsed, 0.1f,
2476*35238bceSAndroid Build Coastguard Worker                                   0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(subOne))
2477*35238bceSAndroid Build Coastguard Worker         << BuiltinSideEffOperInfo("pre_decrement_effect", "--", UGT, Value(UGT, 1.0f, 10.0f), notUsed, notUsed, 0.1f,
2478*35238bceSAndroid Build Coastguard Worker                                   0.0f, PRECMASK_ALL, UINT_GENTYPE_FUNCS(subOne))
2479*35238bceSAndroid Build Coastguard Worker         << BuiltinPostSideEffOperInfo("post_increment_effect", "++", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f,
2480*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(addOne))
2481*35238bceSAndroid Build Coastguard Worker         << BuiltinPostSideEffOperInfo("post_increment_effect", "++", IGT, Value(IGT, -6.0f, 4.0f), notUsed, notUsed,
2482*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(addOne))
2483*35238bceSAndroid Build Coastguard Worker         << BuiltinPostSideEffOperInfo("post_increment_effect", "++", UGT, Value(UGT, 0.0f, 9.0f), notUsed, notUsed,
2484*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.0f, PRECMASK_ALL, UINT_GENTYPE_FUNCS(addOne))
2485*35238bceSAndroid Build Coastguard Worker         << BuiltinPostSideEffOperInfo("post_decrement_effect", "--", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f,
2486*35238bceSAndroid Build Coastguard Worker                                       1.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(subOne))
2487*35238bceSAndroid Build Coastguard Worker         << BuiltinPostSideEffOperInfo("post_decrement_effect", "--", IGT, Value(IGT, -4.0f, 6.0f), notUsed, notUsed,
2488*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(subOne))
2489*35238bceSAndroid Build Coastguard Worker         << BuiltinPostSideEffOperInfo("post_decrement_effect", "--", UGT, Value(UGT, 1.0f, 10.0f), notUsed, notUsed,
2490*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.0f, PRECMASK_ALL, UINT_GENTYPE_FUNCS(subOne))
2491*35238bceSAndroid Build Coastguard Worker 
2492*35238bceSAndroid Build Coastguard Worker         // Pre/post incr/decr result cases.
2493*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("pre_increment_result", "++", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.0f,
2494*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(addOne))
2495*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("pre_increment_result", "++", IGT, Value(IGT, -6.0f, 4.0f), notUsed, notUsed, 0.1f, 0.5f,
2496*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_GENTYPE_FUNCS(addOne))
2497*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("pre_increment_result", "++", UGT, Value(UGT, 0.0f, 9.0f), notUsed, notUsed, 0.1f, 0.0f,
2498*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, UINT_GENTYPE_FUNCS(addOne))
2499*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("pre_decrement_result", "--", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 1.0f,
2500*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(subOne))
2501*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("pre_decrement_result", "--", IGT, Value(IGT, -4.0f, 6.0f), notUsed, notUsed, 0.1f, 0.5f,
2502*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_GENTYPE_FUNCS(subOne))
2503*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("pre_decrement_result", "--", UGT, Value(UGT, 1.0f, 10.0f), notUsed, notUsed, 0.1f, 0.0f,
2504*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, UINT_GENTYPE_FUNCS(subOne))
2505*35238bceSAndroid Build Coastguard Worker         << BuiltinPostOperInfo("post_increment_result", "++", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.5f,
2506*35238bceSAndroid Build Coastguard Worker                                PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(nop))
2507*35238bceSAndroid Build Coastguard Worker         << BuiltinPostOperInfo("post_increment_result", "++", IGT, Value(IGT, -5.0f, 5.0f), notUsed, notUsed, 0.1f,
2508*35238bceSAndroid Build Coastguard Worker                                0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(nop))
2509*35238bceSAndroid Build Coastguard Worker         << BuiltinPostOperInfo("post_increment_result", "++", UGT, Value(UGT, 0.0f, 9.0f), notUsed, notUsed, 0.1f, 0.0f,
2510*35238bceSAndroid Build Coastguard Worker                                PRECMASK_ALL, UINT_GENTYPE_FUNCS(nop))
2511*35238bceSAndroid Build Coastguard Worker         << BuiltinPostOperInfo("post_decrement_result", "--", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 0.5f, 0.5f,
2512*35238bceSAndroid Build Coastguard Worker                                PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(nop))
2513*35238bceSAndroid Build Coastguard Worker         << BuiltinPostOperInfo("post_decrement_result", "--", IGT, Value(IGT, -5.0f, 5.0f), notUsed, notUsed, 0.1f,
2514*35238bceSAndroid Build Coastguard Worker                                0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(nop))
2515*35238bceSAndroid Build Coastguard Worker         << BuiltinPostOperInfo("post_decrement_result", "--", UGT, Value(UGT, 1.0f, 10.0f), notUsed, notUsed, 0.1f,
2516*35238bceSAndroid Build Coastguard Worker                                0.0f, PRECMASK_ALL, UINT_GENTYPE_FUNCS(nop)));
2517*35238bceSAndroid Build Coastguard Worker 
2518*35238bceSAndroid Build Coastguard Worker     BuiltinFuncGroup binaryOpGroup("binary_operator", "Binary operator tests");
2519*35238bceSAndroid Build Coastguard Worker 
2520*35238bceSAndroid Build Coastguard Worker     // Normal binary operations and their corresponding assignment operations have lots in common; generate both in the following loop.
2521*35238bceSAndroid Build Coastguard Worker 
2522*35238bceSAndroid Build Coastguard Worker     for (int binaryOperatorType = 0; binaryOperatorType <= 2;
2523*35238bceSAndroid Build Coastguard Worker          binaryOperatorType++) // 0: normal op test, 1: assignment op side-effect test, 2: assignment op result test
2524*35238bceSAndroid Build Coastguard Worker     {
2525*35238bceSAndroid Build Coastguard Worker         bool isNormalOp  = binaryOperatorType == 0;
2526*35238bceSAndroid Build Coastguard Worker         bool isAssignEff = binaryOperatorType == 1;
2527*35238bceSAndroid Build Coastguard Worker         bool isAssignRes = binaryOperatorType == 2;
2528*35238bceSAndroid Build Coastguard Worker 
2529*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(isNormalOp || isAssignEff || isAssignRes);
2530*35238bceSAndroid Build Coastguard Worker         DE_UNREF(isAssignRes);
2531*35238bceSAndroid Build Coastguard Worker 
2532*35238bceSAndroid Build Coastguard Worker         const char *addName        = isNormalOp ? "add" : isAssignEff ? "add_assign_effect" : "add_assign_result";
2533*35238bceSAndroid Build Coastguard Worker         const char *subName        = isNormalOp ? "sub" : isAssignEff ? "sub_assign_effect" : "sub_assign_result";
2534*35238bceSAndroid Build Coastguard Worker         const char *mulName        = isNormalOp ? "mul" : isAssignEff ? "mul_assign_effect" : "mul_assign_result";
2535*35238bceSAndroid Build Coastguard Worker         const char *divName        = isNormalOp ? "div" : isAssignEff ? "div_assign_effect" : "div_assign_result";
2536*35238bceSAndroid Build Coastguard Worker         const char *modName        = isNormalOp ? "mod" : isAssignEff ? "mod_assign_effect" : "mod_assign_result";
2537*35238bceSAndroid Build Coastguard Worker         const char *andName        = isNormalOp  ? "bitwise_and" :
2538*35238bceSAndroid Build Coastguard Worker                                      isAssignEff ? "bitwise_and_assign_effect" :
2539*35238bceSAndroid Build Coastguard Worker                                                    "bitwise_and_assign_result";
2540*35238bceSAndroid Build Coastguard Worker         const char *orName         = isNormalOp  ? "bitwise_or" :
2541*35238bceSAndroid Build Coastguard Worker                                      isAssignEff ? "bitwise_or_assign_effect" :
2542*35238bceSAndroid Build Coastguard Worker                                                    "bitwise_or_assign_result";
2543*35238bceSAndroid Build Coastguard Worker         const char *xorName        = isNormalOp  ? "bitwise_xor" :
2544*35238bceSAndroid Build Coastguard Worker                                      isAssignEff ? "bitwise_xor_assign_effect" :
2545*35238bceSAndroid Build Coastguard Worker                                                    "bitwise_xor_assign_result";
2546*35238bceSAndroid Build Coastguard Worker         const char *leftShiftName  = isNormalOp  ? "left_shift" :
2547*35238bceSAndroid Build Coastguard Worker                                      isAssignEff ? "left_shift_assign_effect" :
2548*35238bceSAndroid Build Coastguard Worker                                                    "left_shift_assign_result";
2549*35238bceSAndroid Build Coastguard Worker         const char *rightShiftName = isNormalOp  ? "right_shift" :
2550*35238bceSAndroid Build Coastguard Worker                                      isAssignEff ? "right_shift_assign_effect" :
2551*35238bceSAndroid Build Coastguard Worker                                                    "right_shift_assign_result";
2552*35238bceSAndroid Build Coastguard Worker         const char *addOp          = isNormalOp ? "+" : "+=";
2553*35238bceSAndroid Build Coastguard Worker         const char *subOp          = isNormalOp ? "-" : "-=";
2554*35238bceSAndroid Build Coastguard Worker         const char *mulOp          = isNormalOp ? "*" : "*=";
2555*35238bceSAndroid Build Coastguard Worker         const char *divOp          = isNormalOp ? "/" : "/=";
2556*35238bceSAndroid Build Coastguard Worker         const char *modOp          = isNormalOp ? "%" : "%=";
2557*35238bceSAndroid Build Coastguard Worker         const char *andOp          = isNormalOp ? "&" : "&=";
2558*35238bceSAndroid Build Coastguard Worker         const char *orOp           = isNormalOp ? "|" : "|=";
2559*35238bceSAndroid Build Coastguard Worker         const char *xorOp          = isNormalOp ? "^" : "^=";
2560*35238bceSAndroid Build Coastguard Worker         const char *leftShiftOp    = isNormalOp ? "<<" : "<<=";
2561*35238bceSAndroid Build Coastguard Worker         const char *rightShiftOp   = isNormalOp ? ">>" : ">>=";
2562*35238bceSAndroid Build Coastguard Worker 
2563*35238bceSAndroid Build Coastguard Worker         // Pointer to appropriate OperInfo function.
2564*35238bceSAndroid Build Coastguard Worker         BuiltinFuncInfo (*operInfoFunc)(const char *, const char *, ValueType, Value, Value, Value, const FloatScalar &,
2565*35238bceSAndroid Build Coastguard Worker                                         const FloatScalar &, uint32_t, ShaderEvalFunc, ShaderEvalFunc, ShaderEvalFunc,
2566*35238bceSAndroid Build Coastguard Worker                                         ShaderEvalFunc) = isAssignEff ? BuiltinSideEffOperInfo : BuiltinOperInfo;
2567*35238bceSAndroid Build Coastguard Worker 
2568*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(operInfoFunc != DE_NULL);
2569*35238bceSAndroid Build Coastguard Worker 
2570*35238bceSAndroid Build Coastguard Worker         // The following cases will be added for each operator, precision and fundamental type (float, int, uint) combination, where applicable:
2571*35238bceSAndroid Build Coastguard Worker         // gentype <op> gentype
2572*35238bceSAndroid Build Coastguard Worker         // vector <op> scalar
2573*35238bceSAndroid Build Coastguard Worker         // For normal (non-assigning) operators only:
2574*35238bceSAndroid Build Coastguard Worker         //   scalar <op> vector
2575*35238bceSAndroid Build Coastguard Worker 
2576*35238bceSAndroid Build Coastguard Worker         // The add operator.
2577*35238bceSAndroid Build Coastguard Worker 
2578*35238bceSAndroid Build Coastguard Worker         binaryOpGroup << operInfoFunc(addName, addOp, GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f,
2579*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(add))
2580*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, IGT, Value(IGT, -4.0f, 6.0f), Value(IGT, -6.0f, 5.0f), notUsed,
2581*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_GENTYPE_FUNCS(add))
2582*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, IGT, Value(IGT, -2e9f, 2e9f), Value(IGT, -2e9f, 2e9f), notUsed,
2583*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_GENTYPE_FUNCS(add))
2584*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, UGT, Value(UGT, 0.0f, 1e2f), Value(UGT, 0.0f, 1e2f), notUsed,
2585*35238bceSAndroid Build Coastguard Worker                                       5e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_GENTYPE_FUNCS(add))
2586*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, UGT, Value(UGT, 0.0f, 4e9f), Value(UGT, 0.0f, 4e9f), notUsed,
2587*35238bceSAndroid Build Coastguard Worker                                       2e-10f, 0.0f, PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(add))
2588*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f,
2589*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(addVecScalar))
2590*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, IV, Value(IV, -4.0f, 6.0f), Value(I, -6.0f, 5.0f), notUsed, 0.1f,
2591*35238bceSAndroid Build Coastguard Worker                                       0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(addVecScalar))
2592*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, IV, Value(IV, -2e9f, 2e9f), Value(I, -2e9f, 2e9f), notUsed,
2593*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(addVecScalar))
2594*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, UV, Value(UV, 0.0f, 1e2f), Value(U, 0.0f, 1e2f), notUsed, 5e-3f,
2595*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(addVecScalar))
2596*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(addName, addOp, UV, Value(UV, 0.0f, 4e9f), Value(U, 0.0f, 4e9f), notUsed, 2e-10f,
2597*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(addVecScalar));
2598*35238bceSAndroid Build Coastguard Worker 
2599*35238bceSAndroid Build Coastguard Worker         if (isNormalOp)
2600*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(addName, addOp, FV, Value(F, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed,
2601*35238bceSAndroid Build Coastguard Worker                                           1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(addScalarVec))
2602*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(addName, addOp, IV, Value(I, -4.0f, 6.0f), Value(IV, -6.0f, 5.0f), notUsed,
2603*35238bceSAndroid Build Coastguard Worker                                           0.1f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(addScalarVec))
2604*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(addName, addOp, IV, Value(I, -2e9f, 2e9f), Value(IV, -2e9f, 2e9f), notUsed,
2605*35238bceSAndroid Build Coastguard Worker                                           4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(addScalarVec))
2606*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(addName, addOp, UV, Value(U, 0.0f, 1e2f), Value(UV, 0.0f, 1e2f), notUsed,
2607*35238bceSAndroid Build Coastguard Worker                                           5e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(addScalarVec))
2608*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(addName, addOp, UV, Value(U, 0.0f, 4e9f), Value(UV, 0.0f, 4e9f), notUsed,
2609*35238bceSAndroid Build Coastguard Worker                                           2e-10f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(addScalarVec));
2610*35238bceSAndroid Build Coastguard Worker 
2611*35238bceSAndroid Build Coastguard Worker         // The subtract operator.
2612*35238bceSAndroid Build Coastguard Worker 
2613*35238bceSAndroid Build Coastguard Worker         binaryOpGroup << operInfoFunc(subName, subOp, GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f,
2614*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(sub))
2615*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, IGT, Value(IGT, -4.0f, 6.0f), Value(IGT, -6.0f, 5.0f), notUsed,
2616*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_GENTYPE_FUNCS(sub))
2617*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, IGT, Value(IGT, -2e9f, 2e9f), Value(IGT, -2e9f, 2e9f), notUsed,
2618*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_GENTYPE_FUNCS(sub))
2619*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, UGT, Value(UGT, 1e2f, 2e2f), Value(UGT, 0.0f, 1e2f), notUsed,
2620*35238bceSAndroid Build Coastguard Worker                                       5e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_GENTYPE_FUNCS(sub))
2621*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, UGT, Value(UGT, .5e9f, 3.7e9f), Value(UGT, 0.0f, 3.9e9f), notUsed,
2622*35238bceSAndroid Build Coastguard Worker                                       2e-10f, 0.0f, PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(sub))
2623*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f,
2624*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(subVecScalar))
2625*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, IV, Value(IV, -4.0f, 6.0f), Value(I, -6.0f, 5.0f), notUsed, 0.1f,
2626*35238bceSAndroid Build Coastguard Worker                                       0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(subVecScalar))
2627*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, IV, Value(IV, -2e9f, 2e9f), Value(I, -2e9f, 2e9f), notUsed,
2628*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(subVecScalar))
2629*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, UV, Value(UV, 1e2f, 2e2f), Value(U, 0.0f, 1e2f), notUsed, 5e-3f,
2630*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(subVecScalar))
2631*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(subName, subOp, UV, Value(UV, 0.0f, 4e9f), Value(U, 0.0f, 4e9f), notUsed, 2e-10f,
2632*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(subVecScalar));
2633*35238bceSAndroid Build Coastguard Worker 
2634*35238bceSAndroid Build Coastguard Worker         if (isNormalOp)
2635*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(subName, subOp, FV, Value(F, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed,
2636*35238bceSAndroid Build Coastguard Worker                                           1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(subScalarVec))
2637*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(subName, subOp, IV, Value(I, -4.0f, 6.0f), Value(IV, -6.0f, 5.0f), notUsed,
2638*35238bceSAndroid Build Coastguard Worker                                           0.1f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(subScalarVec))
2639*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(subName, subOp, IV, Value(I, -2e9f, 2e9f), Value(IV, -2e9f, 2e9f), notUsed,
2640*35238bceSAndroid Build Coastguard Worker                                           4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(subScalarVec))
2641*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(subName, subOp, UV, Value(U, 1e2f, 2e2f), Value(UV, 0.0f, 1e2f), notUsed,
2642*35238bceSAndroid Build Coastguard Worker                                           5e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(subScalarVec))
2643*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(subName, subOp, UV, Value(U, 0.0f, 4e9f), Value(UV, 0.0f, 4e9f), notUsed,
2644*35238bceSAndroid Build Coastguard Worker                                           2e-10f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(subScalarVec));
2645*35238bceSAndroid Build Coastguard Worker 
2646*35238bceSAndroid Build Coastguard Worker         // The multiply operator.
2647*35238bceSAndroid Build Coastguard Worker 
2648*35238bceSAndroid Build Coastguard Worker         binaryOpGroup << operInfoFunc(mulName, mulOp, GT, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f,
2649*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(mul))
2650*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, IGT, Value(IGT, -4.0f, 6.0f), Value(IGT, -6.0f, 5.0f), notUsed,
2651*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_GENTYPE_FUNCS(mul))
2652*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, IGT, Value(IGT, -3e5f, 3e5f), Value(IGT, -3e4f, 3e4f), notUsed,
2653*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_GENTYPE_FUNCS(mul))
2654*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, UGT, Value(UGT, 0.0f, 16.0f), Value(UGT, 0.0f, 16.0f), notUsed,
2655*35238bceSAndroid Build Coastguard Worker                                       4e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_GENTYPE_FUNCS(mul))
2656*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, UGT, Value(UGT, 0.0f, 6e5f), Value(UGT, 0.0f, 6e4f), notUsed,
2657*35238bceSAndroid Build Coastguard Worker                                       2e-10f, 0.0f, PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(mul))
2658*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, FV, Value(FV, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f,
2659*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(mulVecScalar))
2660*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, IV, Value(IV, -4.0f, 6.0f), Value(I, -6.0f, 5.0f), notUsed, 0.1f,
2661*35238bceSAndroid Build Coastguard Worker                                       0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(mulVecScalar))
2662*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, IV, Value(IV, -3e5f, 3e5f), Value(I, -3e4f, 3e4f), notUsed,
2663*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(mulVecScalar))
2664*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, UV, Value(UV, 0.0f, 16.0f), Value(U, 0.0f, 16.0f), notUsed, 4e-3f,
2665*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(mulVecScalar))
2666*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(mulName, mulOp, UV, Value(UV, 0.0f, 6e5f), Value(U, 0.0f, 6e4f), notUsed, 2e-10f,
2667*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(mulVecScalar));
2668*35238bceSAndroid Build Coastguard Worker 
2669*35238bceSAndroid Build Coastguard Worker         if (isNormalOp)
2670*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(mulName, mulOp, FV, Value(F, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed,
2671*35238bceSAndroid Build Coastguard Worker                                           1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(mulScalarVec))
2672*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(mulName, mulOp, IV, Value(I, -4.0f, 6.0f), Value(IV, -6.0f, 5.0f), notUsed,
2673*35238bceSAndroid Build Coastguard Worker                                           0.1f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(mulScalarVec))
2674*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(mulName, mulOp, IV, Value(I, -3e5f, 3e5f), Value(IV, -3e4f, 3e4f), notUsed,
2675*35238bceSAndroid Build Coastguard Worker                                           4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(mulScalarVec))
2676*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(mulName, mulOp, UV, Value(U, 0.0f, 16.0f), Value(UV, 0.0f, 16.0f), notUsed,
2677*35238bceSAndroid Build Coastguard Worker                                           4e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(mulScalarVec))
2678*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(mulName, mulOp, UV, Value(U, 0.0f, 6e5f), Value(UV, 0.0f, 6e4f), notUsed,
2679*35238bceSAndroid Build Coastguard Worker                                           2e-10f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(mulScalarVec));
2680*35238bceSAndroid Build Coastguard Worker 
2681*35238bceSAndroid Build Coastguard Worker         // The divide operator.
2682*35238bceSAndroid Build Coastguard Worker 
2683*35238bceSAndroid Build Coastguard Worker         binaryOpGroup << operInfoFunc(divName, divOp, GT, Value(GT, -1.0f, 1.0f), Value(GT, -2.0f, -0.5f), notUsed,
2684*35238bceSAndroid Build Coastguard Worker                                       1.0f, 0.0f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(div))
2685*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, IGT, Value(IGT, 24.0f, 24.0f), Value(IGT, -4.0f, -1.0f), notUsed,
2686*35238bceSAndroid Build Coastguard Worker                                       0.04f, 1.0f, PRECMASK_LOWP_MEDIUMP, INT_GENTYPE_FUNCS(div))
2687*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, IGT, Value(IGT, 40320.0f, 40320.0f), Value(IGT, -8.0f, -1.0f),
2688*35238bceSAndroid Build Coastguard Worker                                       notUsed, 1e-5f, 0.5f, PRECMASK_HIGHP, INT_GENTYPE_FUNCS(div))
2689*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, UGT, Value(UGT, 0.0f, 24.0f), Value(UGT, 1.0f, 4.0f), notUsed,
2690*35238bceSAndroid Build Coastguard Worker                                       0.04f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_GENTYPE_FUNCS(div))
2691*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, UGT, Value(UGT, 0.0f, 40320.0f), Value(UGT, 1.0f, 8.0f), notUsed,
2692*35238bceSAndroid Build Coastguard Worker                                       1e-5f, 0.0f, PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(div))
2693*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, FV, Value(FV, -1.0f, 1.0f), Value(F, -2.0f, -0.5f), notUsed, 1.0f,
2694*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(divVecScalar))
2695*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, IV, Value(IV, 24.0f, 24.0f), Value(I, -4.0f, -1.0f), notUsed,
2696*35238bceSAndroid Build Coastguard Worker                                       0.04f, 1.0f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(divVecScalar))
2697*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, IV, Value(IV, 40320.0f, 40320.0f), Value(I, -8.0f, -1.0f),
2698*35238bceSAndroid Build Coastguard Worker                                       notUsed, 1e-5f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(divVecScalar))
2699*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, UV, Value(UV, 0.0f, 24.0f), Value(U, 1.0f, 4.0f), notUsed, 0.04f,
2700*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(divVecScalar))
2701*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(divName, divOp, UV, Value(UV, 0.0f, 40320.0f), Value(U, 1.0f, 8.0f), notUsed,
2702*35238bceSAndroid Build Coastguard Worker                                       1e-5f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(divVecScalar));
2703*35238bceSAndroid Build Coastguard Worker 
2704*35238bceSAndroid Build Coastguard Worker         if (isNormalOp)
2705*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(divName, divOp, FV, Value(F, -1.0f, 1.0f), Value(FV, -2.0f, -0.5f), notUsed,
2706*35238bceSAndroid Build Coastguard Worker                                           1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(divScalarVec))
2707*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(divName, divOp, IV, Value(I, 24.0f, 24.0f), Value(IV, -4.0f, -1.0f), notUsed,
2708*35238bceSAndroid Build Coastguard Worker                                           0.04f, 1.0f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(divScalarVec))
2709*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(divName, divOp, IV, Value(I, 40320.0f, 40320.0f), Value(IV, -8.0f, -1.0f),
2710*35238bceSAndroid Build Coastguard Worker                                           notUsed, 1e-5f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(divScalarVec))
2711*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(divName, divOp, UV, Value(U, 0.0f, 24.0f), Value(UV, 1.0f, 4.0f), notUsed,
2712*35238bceSAndroid Build Coastguard Worker                                           0.04f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(divScalarVec))
2713*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(divName, divOp, UV, Value(U, 0.0f, 40320.0f), Value(UV, 1.0f, 8.0f), notUsed,
2714*35238bceSAndroid Build Coastguard Worker                                           1e-5f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(divScalarVec));
2715*35238bceSAndroid Build Coastguard Worker 
2716*35238bceSAndroid Build Coastguard Worker         // The modulus operator.
2717*35238bceSAndroid Build Coastguard Worker 
2718*35238bceSAndroid Build Coastguard Worker         binaryOpGroup << operInfoFunc(modName, modOp, IGT, Value(IGT, 0.0f, 6.0f), Value(IGT, 1.1f, 6.1f), notUsed,
2719*35238bceSAndroid Build Coastguard Worker                                       0.25f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_GENTYPE_FUNCS(mod))
2720*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(modName, modOp, IGT, Value(IGT, 0.0f, 14.0f), Value(IGT, 1.1f, 11.1f), notUsed,
2721*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.5f, PRECMASK_HIGHP, INT_GENTYPE_FUNCS(mod))
2722*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(modName, modOp, UGT, Value(UGT, 0.0f, 6.0f), Value(UGT, 1.1f, 6.1f), notUsed,
2723*35238bceSAndroid Build Coastguard Worker                                       0.25f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_GENTYPE_FUNCS(mod))
2724*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(modName, modOp, UGT, Value(UGT, 0.0f, 24.0f), Value(UGT, 1.1f, 11.1f), notUsed,
2725*35238bceSAndroid Build Coastguard Worker                                       0.1f, 0.0f, PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(mod))
2726*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(modName, modOp, IV, Value(IV, 0.0f, 6.0f), Value(I, 1.1f, 6.1f), notUsed, 0.25f,
2727*35238bceSAndroid Build Coastguard Worker                                       0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(modVecScalar))
2728*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(modName, modOp, IV, Value(IV, 0.0f, 6.0f), Value(I, 1.1f, 11.1f), notUsed, 0.1f,
2729*35238bceSAndroid Build Coastguard Worker                                       0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(modVecScalar))
2730*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(modName, modOp, UV, Value(UV, 0.0f, 6.0f), Value(U, 1.1f, 6.1f), notUsed, 0.25f,
2731*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(modVecScalar))
2732*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(modName, modOp, UV, Value(UV, 0.0f, 24.0f), Value(U, 1.1f, 11.1f), notUsed, 0.1f,
2733*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(modVecScalar));
2734*35238bceSAndroid Build Coastguard Worker 
2735*35238bceSAndroid Build Coastguard Worker         if (isNormalOp)
2736*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(modName, modOp, IV, Value(I, 0.0f, 6.0f), Value(IV, 1.1f, 6.1f), notUsed,
2737*35238bceSAndroid Build Coastguard Worker                                           0.25f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(modScalarVec))
2738*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(modName, modOp, IV, Value(I, 0.0f, 6.0f), Value(IV, 1.1f, 11.1f), notUsed,
2739*35238bceSAndroid Build Coastguard Worker                                           0.1f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(modScalarVec))
2740*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(modName, modOp, UV, Value(U, 0.0f, 6.0f), Value(UV, 1.1f, 6.1f), notUsed,
2741*35238bceSAndroid Build Coastguard Worker                                           0.25f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(modScalarVec))
2742*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(modName, modOp, UV, Value(U, 0.0f, 24.0f), Value(UV, 1.1f, 11.1f), notUsed,
2743*35238bceSAndroid Build Coastguard Worker                                           0.1f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(modScalarVec));
2744*35238bceSAndroid Build Coastguard Worker 
2745*35238bceSAndroid Build Coastguard Worker         // The bitwise and operator.
2746*35238bceSAndroid Build Coastguard Worker 
2747*35238bceSAndroid Build Coastguard Worker         binaryOpGroup << operInfoFunc(andName, andOp, IGT, Value(IGT, -16.0f, 16.0f), Value(IGT, -16.0f, 16.0f),
2748*35238bceSAndroid Build Coastguard Worker                                       notUsed, 0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_GENTYPE_FUNCS(bitwiseAnd))
2749*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(andName, andOp, IGT, Value(IGT, -2e9f, 2e9f), Value(IGT, -2e9f, 2e9f), notUsed,
2750*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_GENTYPE_FUNCS(bitwiseAnd))
2751*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(andName, andOp, UGT, Value(UGT, 0.0f, 32.0f), Value(UGT, 0.0f, 32.0f), notUsed,
2752*35238bceSAndroid Build Coastguard Worker                                       0.03f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_GENTYPE_FUNCS(bitwiseAnd))
2753*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(andName, andOp, UGT, Value(UGT, 0.0f, 4e9f), Value(UGT, 0.0f, 4e9f), notUsed,
2754*35238bceSAndroid Build Coastguard Worker                                       2e-10f, 0.0f, PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(bitwiseAnd))
2755*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(andName, andOp, IV, Value(IV, -16.0f, 16.0f), Value(I, -16.0f, 16.0f), notUsed,
2756*35238bceSAndroid Build Coastguard Worker                                       0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(bitwiseAndVecScalar))
2757*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(andName, andOp, IV, Value(IV, -2e9f, 2e9f), Value(I, -2e9f, 2e9f), notUsed,
2758*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(bitwiseAndVecScalar))
2759*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(andName, andOp, UV, Value(UV, 0.0f, 32.0f), Value(U, 0.0f, 32.0f), notUsed, 0.03f,
2760*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(bitwiseAndVecScalar))
2761*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(andName, andOp, UV, Value(UV, 0.0f, 4e9f), Value(U, 0.0f, 4e9f), notUsed, 2e-10f,
2762*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(bitwiseAndVecScalar));
2763*35238bceSAndroid Build Coastguard Worker 
2764*35238bceSAndroid Build Coastguard Worker         if (isNormalOp)
2765*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(andName, andOp, IV, Value(I, -16.0f, 16.0f), Value(IV, -16.0f, 16.0f),
2766*35238bceSAndroid Build Coastguard Worker                                           notUsed, 0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP,
2767*35238bceSAndroid Build Coastguard Worker                                           INT_VEC_FUNCS(bitwiseAndScalarVec))
2768*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(andName, andOp, IV, Value(I, -2e9f, 2e9f), Value(IV, -2e9f, 2e9f), notUsed,
2769*35238bceSAndroid Build Coastguard Worker                                           4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(bitwiseAndScalarVec))
2770*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(andName, andOp, UV, Value(U, 0.0f, 32.0f), Value(UV, 0.0f, 32.0f), notUsed,
2771*35238bceSAndroid Build Coastguard Worker                                           0.03f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(bitwiseAndScalarVec))
2772*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(andName, andOp, UV, Value(U, 0.0f, 4e9f), Value(UV, 0.0f, 4e9f), notUsed,
2773*35238bceSAndroid Build Coastguard Worker                                           2e-10f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(bitwiseAndScalarVec));
2774*35238bceSAndroid Build Coastguard Worker 
2775*35238bceSAndroid Build Coastguard Worker         // The bitwise or operator.
2776*35238bceSAndroid Build Coastguard Worker 
2777*35238bceSAndroid Build Coastguard Worker         binaryOpGroup << operInfoFunc(orName, orOp, IGT, Value(IGT, -16.0f, 16.0f), Value(IGT, -16.0f, 16.0f), notUsed,
2778*35238bceSAndroid Build Coastguard Worker                                       0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_GENTYPE_FUNCS(bitwiseOr))
2779*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(orName, orOp, IGT, Value(IGT, -2e9f, 2e9f), Value(IGT, -2e9f, 2e9f), notUsed,
2780*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_GENTYPE_FUNCS(bitwiseOr))
2781*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(orName, orOp, UGT, Value(UGT, 0.0f, 32.0f), Value(UGT, 0.0f, 32.0f), notUsed,
2782*35238bceSAndroid Build Coastguard Worker                                       0.03f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_GENTYPE_FUNCS(bitwiseOr))
2783*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(orName, orOp, UGT, Value(UGT, 0.0f, 4e9f), Value(UGT, 0.0f, 4e9f), notUsed,
2784*35238bceSAndroid Build Coastguard Worker                                       2e-10f, 0.0f, PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(bitwiseOr))
2785*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(orName, orOp, IV, Value(IV, -16.0f, 16.0f), Value(I, -16.0f, 16.0f), notUsed,
2786*35238bceSAndroid Build Coastguard Worker                                       0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(bitwiseOrVecScalar))
2787*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(orName, orOp, IV, Value(IV, -2e9f, 2e9f), Value(I, -2e9f, 2e9f), notUsed, 4e-10f,
2788*35238bceSAndroid Build Coastguard Worker                                       0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(bitwiseOrVecScalar))
2789*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(orName, orOp, UV, Value(UV, 0.0f, 32.0f), Value(U, 0.0f, 32.0f), notUsed, 0.03f,
2790*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(bitwiseOrVecScalar))
2791*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(orName, orOp, UV, Value(UV, 0.0f, 4e9f), Value(U, 0.0f, 4e9f), notUsed, 2e-10f,
2792*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(bitwiseOrVecScalar));
2793*35238bceSAndroid Build Coastguard Worker 
2794*35238bceSAndroid Build Coastguard Worker         if (isNormalOp)
2795*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(orName, orOp, IV, Value(I, -16.0f, 16.0f), Value(IV, -16.0f, 16.0f), notUsed,
2796*35238bceSAndroid Build Coastguard Worker                                           0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(bitwiseOrScalarVec))
2797*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(orName, orOp, IV, Value(I, -2e9f, 2e9f), Value(IV, -2e9f, 2e9f), notUsed,
2798*35238bceSAndroid Build Coastguard Worker                                           4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(bitwiseOrScalarVec))
2799*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(orName, orOp, UV, Value(U, 0.0f, 32.0f), Value(UV, 0.0f, 32.0f), notUsed,
2800*35238bceSAndroid Build Coastguard Worker                                           0.03f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(bitwiseOrScalarVec))
2801*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(orName, orOp, UV, Value(U, 0.0f, 4e9f), Value(UV, 0.0f, 4e9f), notUsed,
2802*35238bceSAndroid Build Coastguard Worker                                           2e-10f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(bitwiseOrScalarVec));
2803*35238bceSAndroid Build Coastguard Worker 
2804*35238bceSAndroid Build Coastguard Worker         // The bitwise xor operator.
2805*35238bceSAndroid Build Coastguard Worker 
2806*35238bceSAndroid Build Coastguard Worker         binaryOpGroup << operInfoFunc(xorName, xorOp, IGT, Value(IGT, -16.0f, 16.0f), Value(IGT, -16.0f, 16.0f),
2807*35238bceSAndroid Build Coastguard Worker                                       notUsed, 0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_GENTYPE_FUNCS(bitwiseXor))
2808*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(xorName, xorOp, IGT, Value(IGT, -2e9f, 2e9f), Value(IGT, -2e9f, 2e9f), notUsed,
2809*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_GENTYPE_FUNCS(bitwiseXor))
2810*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(xorName, xorOp, UGT, Value(UGT, 0.0f, 32.0f), Value(UGT, 0.0f, 32.0f), notUsed,
2811*35238bceSAndroid Build Coastguard Worker                                       0.03f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_GENTYPE_FUNCS(bitwiseXor))
2812*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(xorName, xorOp, UGT, Value(UGT, 0.0f, 4e9f), Value(UGT, 0.0f, 4e9f), notUsed,
2813*35238bceSAndroid Build Coastguard Worker                                       2e-10f, 0.0f, PRECMASK_HIGHP, UINT_GENTYPE_FUNCS(bitwiseXor))
2814*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(xorName, xorOp, IV, Value(IV, -16.0f, 16.0f), Value(I, -16.0f, 16.0f), notUsed,
2815*35238bceSAndroid Build Coastguard Worker                                       0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP, INT_VEC_FUNCS(bitwiseXorVecScalar))
2816*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(xorName, xorOp, IV, Value(IV, -2e9f, 2e9f), Value(I, -2e9f, 2e9f), notUsed,
2817*35238bceSAndroid Build Coastguard Worker                                       4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(bitwiseXorVecScalar))
2818*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(xorName, xorOp, UV, Value(UV, 0.0f, 32.0f), Value(U, 0.0f, 32.0f), notUsed, 0.03f,
2819*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(bitwiseXorVecScalar))
2820*35238bceSAndroid Build Coastguard Worker                       << operInfoFunc(xorName, xorOp, UV, Value(UV, 0.0f, 4e9f), Value(U, 0.0f, 4e9f), notUsed, 2e-10f,
2821*35238bceSAndroid Build Coastguard Worker                                       0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(bitwiseXorVecScalar));
2822*35238bceSAndroid Build Coastguard Worker 
2823*35238bceSAndroid Build Coastguard Worker         if (isNormalOp)
2824*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(xorName, xorOp, IV, Value(I, -16.0f, 16.0f), Value(IV, -16.0f, 16.0f),
2825*35238bceSAndroid Build Coastguard Worker                                           notUsed, 0.03f, 0.5f, PRECMASK_LOWP_MEDIUMP,
2826*35238bceSAndroid Build Coastguard Worker                                           INT_VEC_FUNCS(bitwiseXorScalarVec))
2827*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(xorName, xorOp, IV, Value(I, -2e9f, 2e9f), Value(IV, -2e9f, 2e9f), notUsed,
2828*35238bceSAndroid Build Coastguard Worker                                           4e-10f, 0.5f, PRECMASK_HIGHP, INT_VEC_FUNCS(bitwiseXorScalarVec))
2829*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(xorName, xorOp, UV, Value(U, 0.0f, 32.0f), Value(UV, 0.0f, 32.0f), notUsed,
2830*35238bceSAndroid Build Coastguard Worker                                           0.03f, 0.0f, PRECMASK_LOWP_MEDIUMP, UINT_VEC_FUNCS(bitwiseXorScalarVec))
2831*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(xorName, xorOp, UV, Value(U, 0.0f, 4e9f), Value(UV, 0.0f, 4e9f), notUsed,
2832*35238bceSAndroid Build Coastguard Worker                                           2e-10f, 0.0f, PRECMASK_HIGHP, UINT_VEC_FUNCS(bitwiseXorScalarVec));
2833*35238bceSAndroid Build Coastguard Worker 
2834*35238bceSAndroid Build Coastguard Worker         // The left shift operator. Second operand (shift amount) can be either int or uint, even for uint and int first operand, respectively.
2835*35238bceSAndroid Build Coastguard Worker 
2836*35238bceSAndroid Build Coastguard Worker         for (int isSignedAmount = 0; isSignedAmount <= 1; isSignedAmount++)
2837*35238bceSAndroid Build Coastguard Worker         {
2838*35238bceSAndroid Build Coastguard Worker             ValueType gType = isSignedAmount == 0 ? UGT : IGT;
2839*35238bceSAndroid Build Coastguard Worker             ValueType sType = isSignedAmount == 0 ? U : I;
2840*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(leftShiftName, leftShiftOp, IGT, Value(IGT, -7.0f, 7.0f),
2841*35238bceSAndroid Build Coastguard Worker                                           Value(gType, 0.0f, 4.0f), notUsed, 4e-3f, 0.5f, PRECMASK_LOWP_MEDIUMP,
2842*35238bceSAndroid Build Coastguard Worker                                           INT_GENTYPE_FUNCS(leftShift))
2843*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(leftShiftName, leftShiftOp, IGT, Value(IGT, -7.0f, 7.0f),
2844*35238bceSAndroid Build Coastguard Worker                                           Value(gType, 0.0f, 27.0f), notUsed, 5e-10f, 0.5f, PRECMASK_HIGHP,
2845*35238bceSAndroid Build Coastguard Worker                                           INT_GENTYPE_FUNCS(leftShift))
2846*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(leftShiftName, leftShiftOp, UGT, Value(UGT, 0.0f, 7.0f),
2847*35238bceSAndroid Build Coastguard Worker                                           Value(gType, 0.0f, 5.0f), notUsed, 4e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP,
2848*35238bceSAndroid Build Coastguard Worker                                           UINT_GENTYPE_FUNCS(leftShift))
2849*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(leftShiftName, leftShiftOp, UGT, Value(UGT, 0.0f, 7.0f),
2850*35238bceSAndroid Build Coastguard Worker                                           Value(gType, 0.0f, 28.0f), notUsed, 5e-10f, 0.0f, PRECMASK_HIGHP,
2851*35238bceSAndroid Build Coastguard Worker                                           UINT_GENTYPE_FUNCS(leftShift))
2852*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(leftShiftName, leftShiftOp, IV, Value(IV, -7.0f, 7.0f),
2853*35238bceSAndroid Build Coastguard Worker                                           Value(sType, 0.0f, 4.0f), notUsed, 4e-3f, 0.5f, PRECMASK_LOWP_MEDIUMP,
2854*35238bceSAndroid Build Coastguard Worker                                           INT_VEC_FUNCS(leftShiftVecScalar))
2855*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(leftShiftName, leftShiftOp, IV, Value(IV, -7.0f, 7.0f),
2856*35238bceSAndroid Build Coastguard Worker                                           Value(sType, 0.0f, 27.0f), notUsed, 5e-10f, 0.5f, PRECMASK_HIGHP,
2857*35238bceSAndroid Build Coastguard Worker                                           INT_VEC_FUNCS(leftShiftVecScalar))
2858*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(leftShiftName, leftShiftOp, UV, Value(UV, 0.0f, 7.0f),
2859*35238bceSAndroid Build Coastguard Worker                                           Value(sType, 0.0f, 5.0f), notUsed, 4e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP,
2860*35238bceSAndroid Build Coastguard Worker                                           UINT_VEC_FUNCS(leftShiftVecScalar))
2861*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(leftShiftName, leftShiftOp, UV, Value(UV, 0.0f, 7.0f),
2862*35238bceSAndroid Build Coastguard Worker                                           Value(sType, 0.0f, 28.0f), notUsed, 5e-10f, 0.0f, PRECMASK_HIGHP,
2863*35238bceSAndroid Build Coastguard Worker                                           UINT_VEC_FUNCS(leftShiftVecScalar));
2864*35238bceSAndroid Build Coastguard Worker         }
2865*35238bceSAndroid Build Coastguard Worker 
2866*35238bceSAndroid Build Coastguard Worker         // The right shift operator. Second operand (shift amount) can be either int or uint, even for uint and int first operand, respectively.
2867*35238bceSAndroid Build Coastguard Worker 
2868*35238bceSAndroid Build Coastguard Worker         for (int isSignedAmount = 0; isSignedAmount <= 1; isSignedAmount++)
2869*35238bceSAndroid Build Coastguard Worker         {
2870*35238bceSAndroid Build Coastguard Worker             ValueType gType = isSignedAmount == 0 ? UGT : IGT;
2871*35238bceSAndroid Build Coastguard Worker             ValueType sType = isSignedAmount == 0 ? U : I;
2872*35238bceSAndroid Build Coastguard Worker             binaryOpGroup << operInfoFunc(rightShiftName, rightShiftOp, IGT, Value(IGT, -127.0f, 127.0f),
2873*35238bceSAndroid Build Coastguard Worker                                           Value(gType, 0.0f, 8.0f), notUsed, 4e-3f, 0.5f, PRECMASK_LOWP_MEDIUMP,
2874*35238bceSAndroid Build Coastguard Worker                                           INT_GENTYPE_FUNCS(rightShift))
2875*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(rightShiftName, rightShiftOp, IGT, Value(IGT, -2e9f, 2e9f),
2876*35238bceSAndroid Build Coastguard Worker                                           Value(gType, 0.0f, 31.0f), notUsed, 5e-10f, 0.5f, PRECMASK_HIGHP,
2877*35238bceSAndroid Build Coastguard Worker                                           INT_GENTYPE_FUNCS(rightShift))
2878*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(rightShiftName, rightShiftOp, UGT, Value(UGT, 0.0f, 255.0f),
2879*35238bceSAndroid Build Coastguard Worker                                           Value(gType, 0.0f, 8.0f), notUsed, 4e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP,
2880*35238bceSAndroid Build Coastguard Worker                                           UINT_GENTYPE_FUNCS(rightShift))
2881*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(rightShiftName, rightShiftOp, UGT, Value(UGT, 0.0f, 4e9f),
2882*35238bceSAndroid Build Coastguard Worker                                           Value(gType, 0.0f, 31.0f), notUsed, 5e-10f, 0.0f, PRECMASK_HIGHP,
2883*35238bceSAndroid Build Coastguard Worker                                           UINT_GENTYPE_FUNCS(rightShift))
2884*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(rightShiftName, rightShiftOp, IV, Value(IV, -127.0f, 127.0f),
2885*35238bceSAndroid Build Coastguard Worker                                           Value(sType, 0.0f, 8.0f), notUsed, 4e-3f, 0.5f, PRECMASK_LOWP_MEDIUMP,
2886*35238bceSAndroid Build Coastguard Worker                                           INT_VEC_FUNCS(rightShiftVecScalar))
2887*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(rightShiftName, rightShiftOp, IV, Value(IV, -2e9f, 2e9f),
2888*35238bceSAndroid Build Coastguard Worker                                           Value(sType, 0.0f, 31.0f), notUsed, 5e-10f, 0.5f, PRECMASK_HIGHP,
2889*35238bceSAndroid Build Coastguard Worker                                           INT_VEC_FUNCS(rightShiftVecScalar))
2890*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(rightShiftName, rightShiftOp, UV, Value(UV, 0.0f, 255.0f),
2891*35238bceSAndroid Build Coastguard Worker                                           Value(sType, 0.0f, 8.0f), notUsed, 4e-3f, 0.0f, PRECMASK_LOWP_MEDIUMP,
2892*35238bceSAndroid Build Coastguard Worker                                           UINT_VEC_FUNCS(rightShiftVecScalar))
2893*35238bceSAndroid Build Coastguard Worker                           << operInfoFunc(rightShiftName, rightShiftOp, UV, Value(UV, 0.0f, 4e9f),
2894*35238bceSAndroid Build Coastguard Worker                                           Value(sType, 0.0f, 31.0f), notUsed, 5e-10f, 0.0f, PRECMASK_HIGHP,
2895*35238bceSAndroid Build Coastguard Worker                                           UINT_VEC_FUNCS(rightShiftVecScalar));
2896*35238bceSAndroid Build Coastguard Worker         }
2897*35238bceSAndroid Build Coastguard Worker     }
2898*35238bceSAndroid Build Coastguard Worker 
2899*35238bceSAndroid Build Coastguard Worker     // Rest of binary operators.
2900*35238bceSAndroid Build Coastguard Worker 
2901*35238bceSAndroid Build Coastguard Worker     binaryOpGroup
2902*35238bceSAndroid Build Coastguard Worker         // Scalar relational operators.
2903*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("less", "<", B, Value(F, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
2904*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_lessThan_float, DE_NULL, DE_NULL, DE_NULL)
2905*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("less", "<", B, Value(I, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 1.0f, 0.0f,
2906*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_lessThan_int, DE_NULL, DE_NULL, DE_NULL)
2907*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("less", "<", B, Value(U, 0.0f, 16.0f), Value(U, 0.0f, 16.0f), notUsed, 1.0f, 0.0f,
2908*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_lessThan_uint, DE_NULL, DE_NULL, DE_NULL)
2909*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,
2910*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_lessThanEqual_float, DE_NULL, DE_NULL, DE_NULL)
2911*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,
2912*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_lessThanEqual_int, DE_NULL, DE_NULL, DE_NULL)
2913*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("less_or_equal", "<=", B, Value(U, 0.0f, 16.0f), Value(U, 0.0f, 16.0f), notUsed, 1.0f, 0.0f,
2914*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_lessThanEqual_uint, DE_NULL, DE_NULL, DE_NULL)
2915*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("greater", ">", B, Value(F, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
2916*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_greaterThan_float, DE_NULL, DE_NULL, DE_NULL)
2917*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("greater", ">", B, Value(I, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 1.0f, 0.0f,
2918*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_greaterThan_int, DE_NULL, DE_NULL, DE_NULL)
2919*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("greater", ">", B, Value(U, 0.0f, 16.0f), Value(U, 0.0f, 16.0f), notUsed, 1.0f, 0.0f,
2920*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, eval_greaterThan_uint, DE_NULL, DE_NULL, DE_NULL)
2921*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("greater_or_equal", ">=", B, Value(F, -1.0f, 1.0f), Value(F, -1.0f, 1.0f), notUsed, 1.0f,
2922*35238bceSAndroid Build Coastguard Worker                            0.0f, PRECMASK_ALL, eval_greaterThanEqual_float, DE_NULL, DE_NULL, DE_NULL)
2923*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("greater_or_equal", ">=", B, Value(I, -5.0f, 5.0f), Value(I, -5.0f, 5.0f), notUsed, 1.0f,
2924*35238bceSAndroid Build Coastguard Worker                            0.0f, PRECMASK_ALL, eval_greaterThanEqual_int, DE_NULL, DE_NULL, DE_NULL)
2925*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("greater_or_equal", ">=", B, Value(U, 0.0f, 16.0f), Value(U, 0.0f, 16.0f), notUsed, 1.0f,
2926*35238bceSAndroid Build Coastguard Worker                            0.0f, PRECMASK_ALL, eval_greaterThanEqual_uint, DE_NULL, DE_NULL, DE_NULL)
2927*35238bceSAndroid Build Coastguard Worker 
2928*35238bceSAndroid Build Coastguard Worker         // Equality comparison operators.
2929*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("equal", "==", B, Value(GT, -1.0f, 1.0f), Value(GT, -1.0f, 1.0f), notUsed, 1.0f, 0.0f,
2930*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(allEqual))
2931*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("equal", "==", B, Value(IGT, -5.5f, 4.7f), Value(IGT, -2.1f, 0.1f), notUsed, 1.0f, 0.0f,
2932*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_GENTYPE_FUNCS(allEqual))
2933*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("equal", "==", B, Value(UGT, 0.0f, 8.0f), Value(UGT, 3.5f, 4.5f), notUsed, 1.0f, 0.0f,
2934*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, UINT_GENTYPE_FUNCS(allEqual))
2935*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("equal", "==", B, Value(BGT, -2.1f, 2.1f), Value(BGT, -1.1f, 3.0f), notUsed, 1.0f, 0.0f,
2936*35238bceSAndroid Build Coastguard Worker                            PRECMASK_NA, BOOL_GENTYPE_FUNCS(allEqual))
2937*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,
2938*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(anyNotEqual))
2939*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("not_equal", "!=", B, Value(IGT, -5.5f, 4.7f), Value(IGT, -2.1f, 0.1f), notUsed, 1.0f, 0.0f,
2940*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_GENTYPE_FUNCS(anyNotEqual))
2941*35238bceSAndroid Build Coastguard Worker         << BuiltinOperInfo("not_equal", "!=", B, Value(UGT, 0.0f, 8.0f), Value(UGT, 3.5f, 4.5f), notUsed, 1.0f, 0.0f,
2942*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, UINT_GENTYPE_FUNCS(anyNotEqual))
2943*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,
2944*35238bceSAndroid Build Coastguard Worker                            PRECMASK_NA, BOOL_GENTYPE_FUNCS(anyNotEqual))
2945*35238bceSAndroid Build Coastguard Worker 
2946*35238bceSAndroid Build Coastguard Worker         // Logical operators.
2947*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,
2948*35238bceSAndroid Build Coastguard Worker                            PRECMASK_NA, BOOL_FUNCS(logicalAnd))
2949*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,
2950*35238bceSAndroid Build Coastguard Worker                            PRECMASK_NA, BOOL_FUNCS(logicalOr))
2951*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,
2952*35238bceSAndroid Build Coastguard Worker                            PRECMASK_NA, BOOL_FUNCS(logicalXor));
2953*35238bceSAndroid Build Coastguard Worker 
2954*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(binaryOpGroup);
2955*35238bceSAndroid Build Coastguard Worker 
2956*35238bceSAndroid Build Coastguard Worker     // 8.1 Angle and Trigonometry Functions.
2957*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(BuiltinFuncGroup("angle_and_trigonometry", "Angle and trigonometry function tests.")
2958*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("radians", "radians", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed,
2959*35238bceSAndroid Build Coastguard Worker                                                 25.0f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(radians))
2960*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("degrees", "degrees", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed,
2961*35238bceSAndroid Build Coastguard Worker                                                 0.04f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(degrees))
2962*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("sin", "sin", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f, 0.5f,
2963*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(sin))
2964*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("sin", "sin", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.5f, 0.5f,
2965*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(sin))
2966*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("cos", "cos", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f, 0.5f,
2967*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(cos))
2968*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("cos", "cos", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.5f, 0.5f,
2969*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(cos))
2970*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("tan", "tan", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f, 0.5f,
2971*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(tan))
2972*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("tan", "tan", GT, Value(GT, -1.5f, 5.5f), notUsed, notUsed, 0.5f, 0.5f,
2973*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(tan))
2974*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("asin", "asin", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 1.0f,
2975*35238bceSAndroid Build Coastguard Worker                                                 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(asin))
2976*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("acos", "acos", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 1.0f,
2977*35238bceSAndroid Build Coastguard Worker                                                 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(acos))
2978*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("atan", "atan", GT, Value(GT, -4.0f, 4.0f), notUsed, notUsed, 0.5f,
2979*35238bceSAndroid Build Coastguard Worker                                                 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(atan))
2980*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("atan2", "atan", GT, Value(GT, -4.0f, 4.0f), Value(GT, 0.5f, 2.0f),
2981*35238bceSAndroid Build Coastguard Worker                                                 notUsed, 0.5f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(atan2))
2982*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("sinh", "sinh", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f,
2983*35238bceSAndroid Build Coastguard Worker                                                 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(sinh))
2984*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("sinh", "sinh", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.5f,
2985*35238bceSAndroid Build Coastguard Worker                                                 0.5f, PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(sinh))
2986*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("cosh", "cosh", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f,
2987*35238bceSAndroid Build Coastguard Worker                                                 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(cosh))
2988*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("cosh", "cosh", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.5f,
2989*35238bceSAndroid Build Coastguard Worker                                                 0.5f, PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(cosh))
2990*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("tanh", "tanh", GT, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.5f,
2991*35238bceSAndroid Build Coastguard Worker                                                 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(tanh))
2992*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("tanh", "tanh", GT, Value(GT, -1.5f, 5.5f), notUsed, notUsed, 0.5f,
2993*35238bceSAndroid Build Coastguard Worker                                                 0.5f, PRECMASK_LOWP, FLOAT_GENTYPE_FUNCS(tanh))
2994*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("asinh", "asinh", GT, Value(GT, -1.0f, 1.0f), notUsed, notUsed, 1.0f,
2995*35238bceSAndroid Build Coastguard Worker                                                 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(asinh))
2996*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("acosh", "acosh", GT, Value(GT, 1.0f, 2.2f), notUsed, notUsed, 1.0f,
2997*35238bceSAndroid Build Coastguard Worker                                                 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(acosh))
2998*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("atanh", "atanh", GT, Value(GT, -0.99f, 0.99f), notUsed, notUsed, 1.0f,
2999*35238bceSAndroid Build Coastguard Worker                                                 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(atanh)));
3000*35238bceSAndroid Build Coastguard Worker 
3001*35238bceSAndroid Build Coastguard Worker     // 8.2 Exponential Functions.
3002*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(BuiltinFuncGroup("exponential", "Exponential function tests")
3003*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("pow", "pow", GT, Value(GT, 0.1f, 8.0f), Value(GT, -4.0f, 2.0f),
3004*35238bceSAndroid Build Coastguard Worker                                                 notUsed, 1.0f, 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(pow))
3005*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("exp", "exp", GT, Value(GT, -6.0f, 3.0f), notUsed, notUsed, 0.5f, 0.0f,
3006*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(exp))
3007*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("log", "log", GT, Value(GT, 0.1f, 10.0f), notUsed, notUsed, 0.5f, 0.3f,
3008*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(log))
3009*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("exp2", "exp2", GT, Value(GT, -7.0f, 2.0f), notUsed, notUsed, 1.0f,
3010*35238bceSAndroid Build Coastguard Worker                                                 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(exp2))
3011*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("log2", "log2", GT, Value(GT, 0.1f, 10.0f), notUsed, notUsed, 1.0f,
3012*35238bceSAndroid Build Coastguard Worker                                                 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(log2))
3013*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("sqrt", "sqrt", GT, Value(GT, 0.0f, 10.0f), notUsed, notUsed, 0.3f,
3014*35238bceSAndroid Build Coastguard Worker                                                 0.0f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(sqrt))
3015*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("inversesqrt", "inversesqrt", GT, Value(GT, 0.5f, 10.0f), notUsed,
3016*35238bceSAndroid Build Coastguard Worker                                                 notUsed, 1.0f, 0.0f, PRECMASK_MEDIUMP_HIGHP,
3017*35238bceSAndroid Build Coastguard Worker                                                 FLOAT_GENTYPE_FUNCS(inverseSqrt)));
3018*35238bceSAndroid Build Coastguard Worker 
3019*35238bceSAndroid Build Coastguard Worker     // 8.3 Common Functions.
3020*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(
3021*35238bceSAndroid Build Coastguard Worker         BuiltinFuncGroup("common_functions", "Common function tests.")
3022*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("abs", "abs", GT, Value(GT, -2.0f, 2.0f), notUsed, notUsed, 0.5f, 0.5f, PRECMASK_ALL,
3023*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(abs))
3024*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("sign", "sign", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.3f, 0.5f, PRECMASK_ALL,
3025*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(sign))
3026*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("floor", "floor", GT, Value(GT, -2.5f, 2.5f), notUsed, notUsed, 0.2f, 0.7f, PRECMASK_ALL,
3027*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(floor))
3028*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("trunc", "trunc", GT, Value(GT, -2.5f, 2.5f), notUsed, notUsed, 0.2f, 0.7f, PRECMASK_ALL,
3029*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(trunc))
3030*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("round", "round", GT, Value(GT, -2.5f, 2.5f), notUsed, notUsed, 0.2f, 0.7f, PRECMASK_ALL,
3031*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(roundToEven))
3032*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("roundEven", "roundEven", GT, Value(GT, -2.5f, 2.5f), notUsed, notUsed, 0.2f, 0.7f,
3033*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(roundToEven))
3034*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("ceil", "ceil", GT, Value(GT, -2.5f, 2.5f), notUsed, notUsed, 0.2f, 0.5f, PRECMASK_ALL,
3035*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(ceil))
3036*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("fract", "fract", GT, Value(GT, -1.5f, 1.5f), notUsed, notUsed, 0.8f, 0.1f, PRECMASK_ALL,
3037*35238bceSAndroid Build Coastguard Worker                            FLOAT_GENTYPE_FUNCS(fract))
3038*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,
3039*35238bceSAndroid Build Coastguard Worker                            PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(mod))
3040*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,
3041*35238bceSAndroid Build Coastguard Worker                            PRECMASK_MEDIUMP_HIGHP, FLOAT_VEC_FUNCS(modVecScalar))
3042*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,
3043*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(min))
3044*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,
3045*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_VEC_FUNCS(minVecScalar))
3046*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("min", "min", IGT, Value(IGT, -4.0f, 4.0f), Value(IGT, -4.0f, 4.0f), notUsed, 0.125f, 0.5f,
3047*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_GENTYPE_FUNCS(min))
3048*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("min", "min", IGT, Value(IV, -4.0f, 4.0f), Value(I, -4.0f, 4.0f), notUsed, 0.125f, 0.5f,
3049*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_VEC_FUNCS(minVecScalar))
3050*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("min", "min", UGT, Value(UGT, 0.0f, 8.0f), Value(UGT, 0.0f, 8.0f), notUsed, 0.125f, 0.0f,
3051*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, UINT_GENTYPE_FUNCS(min))
3052*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("min", "min", UGT, Value(UV, 0.0f, 8.0f), Value(U, 0.0f, 8.0f), notUsed, 0.125f, 0.0f,
3053*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, UINT_VEC_FUNCS(minVecScalar))
3054*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,
3055*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(max))
3056*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,
3057*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_VEC_FUNCS(maxVecScalar))
3058*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("max", "max", IGT, Value(IGT, -4.0f, 4.0f), Value(IGT, -4.0f, 4.0f), notUsed, 0.125f, 0.5f,
3059*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_GENTYPE_FUNCS(max))
3060*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("max", "max", IGT, Value(IV, -4.0f, 4.0f), Value(I, -4.0f, 4.0f), notUsed, 0.125f, 0.5f,
3061*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_VEC_FUNCS(maxVecScalar))
3062*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("max", "max", UGT, Value(UGT, 0.0f, 8.0f), Value(UGT, 0.0f, 8.0f), notUsed, 0.125f, 0.0f,
3063*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, UINT_GENTYPE_FUNCS(max))
3064*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("max", "max", UGT, Value(UV, 0.0f, 8.0f), Value(U, 0.0f, 8.0f), notUsed, 0.125f, 0.0f,
3065*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, UINT_VEC_FUNCS(maxVecScalar))
3066*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),
3067*35238bceSAndroid Build Coastguard Worker                            0.5f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(clamp))
3068*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),
3069*35238bceSAndroid Build Coastguard Worker                            0.5f, 0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(clampVecScalarScalar))
3070*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("clamp", "clamp", IGT, Value(IGT, -4.0f, 4.0f), Value(IGT, -2.0f, 2.0f),
3071*35238bceSAndroid Build Coastguard Worker                            Value(IGT, 2.0f, 4.0f), 0.125f, 0.5f, PRECMASK_ALL, INT_GENTYPE_FUNCS(clamp))
3072*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("clamp", "clamp", IGT, Value(IV, -4.0f, 4.0f), Value(I, -2.0f, 2.0f), Value(I, 2.0f, 4.0f),
3073*35238bceSAndroid Build Coastguard Worker                            0.125f, 0.5f, PRECMASK_ALL, INT_VEC_FUNCS(clampVecScalarScalar))
3074*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("clamp", "clamp", UGT, Value(UGT, 0.0f, 8.0f), Value(UGT, 2.0f, 6.0f),
3075*35238bceSAndroid Build Coastguard Worker                            Value(UGT, 6.0f, 8.0f), 0.125f, 0.0f, PRECMASK_ALL, UINT_GENTYPE_FUNCS(clamp))
3076*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("clamp", "clamp", UGT, Value(UV, 0.0f, 8.0f), Value(U, 2.0f, 6.0f), Value(U, 6.0f, 8.0f),
3077*35238bceSAndroid Build Coastguard Worker                            0.125f, 0.0f, PRECMASK_ALL, UINT_VEC_FUNCS(clampVecScalarScalar))
3078*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),
3079*35238bceSAndroid Build Coastguard Worker                            0.5f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(mix))
3080*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,
3081*35238bceSAndroid Build Coastguard Worker                            0.5f, PRECMASK_ALL, FLOAT_VEC_FUNCS(mixVecVecScalar))
3082*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,
3083*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(step))
3084*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,
3085*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_VEC_FUNCS(stepScalarVec))
3086*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("smoothstep", "smoothstep", GT, Value(GT, -0.5f, 0.0f), Value(GT, 0.1f, 1.0f),
3087*35238bceSAndroid Build Coastguard Worker                            Value(GT, -1.0f, 1.0f), 0.5f, 0.5f, PRECMASK_ALL, FLOAT_GENTYPE_FUNCS(smoothStep))
3088*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("smoothstep", "smoothstep", GT, Value(F, -0.5f, 0.0f), Value(F, 0.1f, 1.0f),
3089*35238bceSAndroid Build Coastguard Worker                            Value(FV, -1.0f, 1.0f), 0.5f, 0.5f, PRECMASK_ALL,
3090*35238bceSAndroid Build Coastguard Worker                            FLOAT_VEC_FUNCS(smoothStepScalarScalarVec)));
3091*35238bceSAndroid Build Coastguard Worker 
3092*35238bceSAndroid Build Coastguard Worker     // 8.4 Geometric Functions.
3093*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(
3094*35238bceSAndroid Build Coastguard Worker         BuiltinFuncGroup("geometric", "Geometric function tests.")
3095*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("length", "length", F, Value(GT, -5.0f, 5.0f), notUsed, notUsed, 0.1f, 0.5f,
3096*35238bceSAndroid Build Coastguard Worker                            PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(length))
3097*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("distance", "distance", F, Value(GT, -5.0f, 5.0f), Value(GT, -5.0f, 5.0f), notUsed, 0.1f,
3098*35238bceSAndroid Build Coastguard Worker                            0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(distance))
3099*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,
3100*35238bceSAndroid Build Coastguard Worker                            PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(dot))
3101*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,
3102*35238bceSAndroid Build Coastguard Worker                            PRECMASK_MEDIUMP_HIGHP, DE_NULL, DE_NULL, eval_cross_vec3, DE_NULL)
3103*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("normalize", "normalize", GT, Value(GT, 0.1f, 4.0f), notUsed, notUsed, 0.5f, 0.5f,
3104*35238bceSAndroid Build Coastguard Worker                            PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(normalize))
3105*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("faceforward", "faceforward", GT, Value(GT, -5.0f, 5.0f), Value(GT, -5.0f, 5.0f),
3106*35238bceSAndroid Build Coastguard Worker                            Value(GT, -1.0f, 1.0f), 0.5f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(faceForward))
3107*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("reflect", "reflect", GT, Value(GT, -0.8f, -0.5f), Value(GT, 0.5f, 0.8f), notUsed, 0.5f,
3108*35238bceSAndroid Build Coastguard Worker                            0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(reflect))
3109*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("refract", "refract", GT, Value(GT, -0.8f, 1.2f), Value(GT, -1.1f, 0.5f),
3110*35238bceSAndroid Build Coastguard Worker                            Value(F, 0.2f, 1.5f), 0.5f, 0.5f, PRECMASK_MEDIUMP_HIGHP, FLOAT_GENTYPE_FUNCS(refract)));
3111*35238bceSAndroid Build Coastguard Worker 
3112*35238bceSAndroid Build Coastguard Worker     // 8.5 Matrix Functions.
3113*35238bceSAndroid Build Coastguard Worker     // separate matrix tests?
3114*35238bceSAndroid Build Coastguard Worker     //    funcInfoGroups.push_back(
3115*35238bceSAndroid Build Coastguard Worker     //        BuiltinFuncGroup("matrix", "Matrix function tests.")
3116*35238bceSAndroid Build Coastguard Worker     //        << BuiltinFuncInfo("matrixCompMult", "matrixCompMult", M, ... )
3117*35238bceSAndroid Build Coastguard Worker     // );
3118*35238bceSAndroid Build Coastguard Worker 
3119*35238bceSAndroid Build Coastguard Worker     // 8.6 Vector Relational Functions.
3120*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(
3121*35238bceSAndroid Build Coastguard Worker         BuiltinFuncGroup("float_compare", "Floating point comparison tests.")
3122*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("lessThan", "lessThan", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed, 1.0f,
3123*35238bceSAndroid Build Coastguard Worker                            0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(lessThan))
3124*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("lessThanEqual", "lessThanEqual", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f),
3125*35238bceSAndroid Build Coastguard Worker                            notUsed, 1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(lessThanEqual))
3126*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("greaterThan", "greaterThan", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed,
3127*35238bceSAndroid Build Coastguard Worker                            1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(greaterThan))
3128*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("greaterThanEqual", "greaterThanEqual", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f),
3129*35238bceSAndroid Build Coastguard Worker                            notUsed, 1.0f, 0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(greaterThanEqual))
3130*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,
3131*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, FLOAT_VEC_FUNCS(equal))
3132*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("notEqual", "notEqual", BV, Value(FV, -1.0f, 1.0f), Value(FV, -1.0f, 1.0f), notUsed, 1.0f,
3133*35238bceSAndroid Build Coastguard Worker                            0.0f, PRECMASK_ALL, FLOAT_VEC_FUNCS(notEqual)));
3134*35238bceSAndroid Build Coastguard Worker 
3135*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(
3136*35238bceSAndroid Build Coastguard Worker         BuiltinFuncGroup("int_compare", "Integer comparison tests.")
3137*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("lessThan", "lessThan", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f), notUsed, 1.0f,
3138*35238bceSAndroid Build Coastguard Worker                            0.0f, PRECMASK_ALL, INT_VEC_FUNCS(lessThan))
3139*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("lessThanEqual", "lessThanEqual", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f),
3140*35238bceSAndroid Build Coastguard Worker                            notUsed, 1.0f, 0.0f, PRECMASK_ALL, INT_VEC_FUNCS(lessThanEqual))
3141*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("greaterThan", "greaterThan", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f), notUsed,
3142*35238bceSAndroid Build Coastguard Worker                            1.0f, 0.0f, PRECMASK_ALL, INT_VEC_FUNCS(greaterThan))
3143*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("greaterThanEqual", "greaterThanEqual", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f),
3144*35238bceSAndroid Build Coastguard Worker                            notUsed, 1.0f, 0.0f, PRECMASK_ALL, INT_VEC_FUNCS(greaterThanEqual))
3145*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,
3146*35238bceSAndroid Build Coastguard Worker                            PRECMASK_ALL, INT_VEC_FUNCS(equal))
3147*35238bceSAndroid Build Coastguard Worker         << BuiltinFuncInfo("notEqual", "notEqual", BV, Value(IV, -5.2f, 4.9f), Value(IV, -5.0f, 5.0f), notUsed, 1.0f,
3148*35238bceSAndroid Build Coastguard Worker                            0.0f, PRECMASK_ALL, INT_VEC_FUNCS(notEqual)));
3149*35238bceSAndroid Build Coastguard Worker 
3150*35238bceSAndroid Build Coastguard Worker     funcInfoGroups.push_back(BuiltinFuncGroup("bool_compare", "Boolean comparison tests.")
3151*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("equal", "equal", BV, Value(BV, -5.2f, 4.9f), Value(BV, -5.0f, 5.0f),
3152*35238bceSAndroid Build Coastguard Worker                                                 notUsed, 1.0f, 0.0f, PRECMASK_NA, BOOL_VEC_FUNCS(equal))
3153*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("notEqual", "notEqual", BV, Value(BV, -5.2f, 4.9f),
3154*35238bceSAndroid Build Coastguard Worker                                                 Value(BV, -5.0f, 5.0f), notUsed, 1.0f, 0.0f, PRECMASK_NA,
3155*35238bceSAndroid Build Coastguard Worker                                                 BOOL_VEC_FUNCS(notEqual))
3156*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("any", "any", B, Value(BV, -1.0f, 0.3f), notUsed, notUsed, 1.0f, 0.0f,
3157*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_NA, BOOL_VEC_FUNCS(any))
3158*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("all", "all", B, Value(BV, -0.3f, 1.0f), notUsed, notUsed, 1.0f, 0.0f,
3159*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_NA, BOOL_VEC_FUNCS(all))
3160*35238bceSAndroid Build Coastguard Worker                              << BuiltinFuncInfo("not", "not", BV, Value(BV, -1.0f, 1.0f), notUsed, notUsed, 1.0f, 0.0f,
3161*35238bceSAndroid Build Coastguard Worker                                                 PRECMASK_NA, BOOL_VEC_FUNCS(boolNot)));
3162*35238bceSAndroid Build Coastguard Worker 
3163*35238bceSAndroid Build Coastguard Worker     static const ShaderType s_shaderTypes[] = {SHADERTYPE_VERTEX, SHADERTYPE_FRAGMENT};
3164*35238bceSAndroid Build Coastguard Worker 
3165*35238bceSAndroid Build Coastguard Worker     static const DataType s_floatTypes[] = {TYPE_FLOAT, TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC4};
3166*35238bceSAndroid Build Coastguard Worker 
3167*35238bceSAndroid Build Coastguard Worker     static const DataType s_intTypes[] = {TYPE_INT, TYPE_INT_VEC2, TYPE_INT_VEC3, TYPE_INT_VEC4};
3168*35238bceSAndroid Build Coastguard Worker 
3169*35238bceSAndroid Build Coastguard Worker     static const DataType s_uintTypes[] = {TYPE_UINT, TYPE_UINT_VEC2, TYPE_UINT_VEC3, TYPE_UINT_VEC4};
3170*35238bceSAndroid Build Coastguard Worker 
3171*35238bceSAndroid Build Coastguard Worker     static const DataType s_boolTypes[] = {TYPE_BOOL, TYPE_BOOL_VEC2, TYPE_BOOL_VEC3, TYPE_BOOL_VEC4};
3172*35238bceSAndroid Build Coastguard Worker 
3173*35238bceSAndroid Build Coastguard Worker     for (int outerGroupNdx = 0; outerGroupNdx < (int)funcInfoGroups.size(); outerGroupNdx++)
3174*35238bceSAndroid Build Coastguard Worker     {
3175*35238bceSAndroid Build Coastguard Worker         // Create outer group.
3176*35238bceSAndroid Build Coastguard Worker         const BuiltinFuncGroup &outerGroupInfo = funcInfoGroups[outerGroupNdx];
3177*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *outerGroup = new TestCaseGroup(m_context, outerGroupInfo.name, outerGroupInfo.description);
3178*35238bceSAndroid Build Coastguard Worker         addChild(outerGroup);
3179*35238bceSAndroid Build Coastguard Worker 
3180*35238bceSAndroid Build Coastguard Worker         // Only create new group if name differs from previous one.
3181*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *innerGroup = DE_NULL;
3182*35238bceSAndroid Build Coastguard Worker 
3183*35238bceSAndroid Build Coastguard Worker         for (int funcInfoNdx = 0; funcInfoNdx < (int)outerGroupInfo.funcInfos.size(); funcInfoNdx++)
3184*35238bceSAndroid Build Coastguard Worker         {
3185*35238bceSAndroid Build Coastguard Worker             const BuiltinFuncInfo &funcInfo = outerGroupInfo.funcInfos[funcInfoNdx];
3186*35238bceSAndroid Build Coastguard Worker             const char *shaderFuncName      = funcInfo.shaderFuncName;
3187*35238bceSAndroid Build Coastguard Worker             bool isBoolCase                 = (funcInfo.precisionMask == PRECMASK_NA);
3188*35238bceSAndroid Build Coastguard Worker             bool isBoolOut  = (funcInfo.outValue & (VALUE_BOOL | VALUE_BOOL_VEC | VALUE_BOOL_GENTYPE)) != 0;
3189*35238bceSAndroid Build Coastguard Worker             bool isIntOut   = (funcInfo.outValue & (VALUE_INT | VALUE_INT_VEC | VALUE_INT_GENTYPE)) != 0;
3190*35238bceSAndroid Build Coastguard Worker             bool isUintOut  = (funcInfo.outValue & (VALUE_UINT | VALUE_UINT_VEC | VALUE_UINT_GENTYPE)) != 0;
3191*35238bceSAndroid Build Coastguard Worker             bool isFloatOut = !isBoolOut && !isIntOut && !isUintOut;
3192*35238bceSAndroid Build Coastguard Worker 
3193*35238bceSAndroid Build Coastguard Worker             if (!innerGroup || (string(innerGroup->getName()) != funcInfo.caseName))
3194*35238bceSAndroid Build Coastguard Worker             {
3195*35238bceSAndroid Build Coastguard Worker                 string groupDesc = string("Built-in function ") + shaderFuncName + "() tests.";
3196*35238bceSAndroid Build Coastguard Worker                 innerGroup       = new TestCaseGroup(m_context, funcInfo.caseName, groupDesc.c_str());
3197*35238bceSAndroid Build Coastguard Worker                 outerGroup->addChild(innerGroup);
3198*35238bceSAndroid Build Coastguard Worker             }
3199*35238bceSAndroid Build Coastguard Worker 
3200*35238bceSAndroid Build Coastguard Worker             for (int inScalarSize = 1; inScalarSize <= 4; inScalarSize++)
3201*35238bceSAndroid Build Coastguard Worker             {
3202*35238bceSAndroid Build Coastguard Worker                 int outScalarSize    = ((funcInfo.outValue == VALUE_FLOAT) || (funcInfo.outValue == VALUE_BOOL)) ?
3203*35238bceSAndroid Build Coastguard Worker                                            1 :
3204*35238bceSAndroid Build Coastguard Worker                                            inScalarSize; // \todo [petri] Int.
3205*35238bceSAndroid Build Coastguard Worker                 DataType outDataType = isFloatOut ? s_floatTypes[outScalarSize - 1] :
3206*35238bceSAndroid Build Coastguard Worker                                        isIntOut   ? s_intTypes[outScalarSize - 1] :
3207*35238bceSAndroid Build Coastguard Worker                                        isUintOut  ? s_uintTypes[outScalarSize - 1] :
3208*35238bceSAndroid Build Coastguard Worker                                        isBoolOut  ? s_boolTypes[outScalarSize - 1] :
3209*35238bceSAndroid Build Coastguard Worker                                                     TYPE_LAST;
3210*35238bceSAndroid Build Coastguard Worker 
3211*35238bceSAndroid Build Coastguard Worker                 ShaderEvalFunc evalFunc = DE_NULL;
3212*35238bceSAndroid Build Coastguard Worker                 switch (inScalarSize)
3213*35238bceSAndroid Build Coastguard Worker                 {
3214*35238bceSAndroid Build Coastguard Worker                 case 1:
3215*35238bceSAndroid Build Coastguard Worker                     evalFunc = funcInfo.evalFuncScalar;
3216*35238bceSAndroid Build Coastguard Worker                     break;
3217*35238bceSAndroid Build Coastguard Worker                 case 2:
3218*35238bceSAndroid Build Coastguard Worker                     evalFunc = funcInfo.evalFuncVec2;
3219*35238bceSAndroid Build Coastguard Worker                     break;
3220*35238bceSAndroid Build Coastguard Worker                 case 3:
3221*35238bceSAndroid Build Coastguard Worker                     evalFunc = funcInfo.evalFuncVec3;
3222*35238bceSAndroid Build Coastguard Worker                     break;
3223*35238bceSAndroid Build Coastguard Worker                 case 4:
3224*35238bceSAndroid Build Coastguard Worker                     evalFunc = funcInfo.evalFuncVec4;
3225*35238bceSAndroid Build Coastguard Worker                     break;
3226*35238bceSAndroid Build Coastguard Worker                 default:
3227*35238bceSAndroid Build Coastguard Worker                     DE_ASSERT(false);
3228*35238bceSAndroid Build Coastguard Worker                 }
3229*35238bceSAndroid Build Coastguard Worker                 // Skip if no valid eval func.
3230*35238bceSAndroid Build Coastguard Worker                 // \todo [petri] Better check for V3 only etc. cases?
3231*35238bceSAndroid Build Coastguard Worker                 if (evalFunc == DE_NULL)
3232*35238bceSAndroid Build Coastguard Worker                     continue;
3233*35238bceSAndroid Build Coastguard Worker 
3234*35238bceSAndroid Build Coastguard Worker                 for (int precision = 0; precision < PRECISION_LAST; precision++)
3235*35238bceSAndroid Build Coastguard Worker                 {
3236*35238bceSAndroid Build Coastguard Worker                     if ((funcInfo.precisionMask & (1 << precision)) ||
3237*35238bceSAndroid Build Coastguard Worker                         (funcInfo.precisionMask == PRECMASK_NA &&
3238*35238bceSAndroid Build Coastguard Worker                          precision == PRECISION_MEDIUMP)) // use mediump interpolators for booleans
3239*35238bceSAndroid Build Coastguard Worker                     {
3240*35238bceSAndroid Build Coastguard Worker                         const char *precisionStr = getPrecisionName((Precision)precision);
3241*35238bceSAndroid Build Coastguard Worker                         string precisionPrefix   = isBoolCase ? "" : (string(precisionStr) + "_");
3242*35238bceSAndroid Build Coastguard Worker 
3243*35238bceSAndroid Build Coastguard Worker                         for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
3244*35238bceSAndroid Build Coastguard Worker                         {
3245*35238bceSAndroid Build Coastguard Worker                             ShaderType shaderType = s_shaderTypes[shaderTypeNdx];
3246*35238bceSAndroid Build Coastguard Worker                             ShaderDataSpec shaderSpec;
3247*35238bceSAndroid Build Coastguard Worker                             const char *shaderTypeName = getShaderTypeName(shaderType);
3248*35238bceSAndroid Build Coastguard Worker                             bool isVertexCase          = (ShaderType)shaderType == SHADERTYPE_VERTEX;
3249*35238bceSAndroid Build Coastguard Worker                             bool isUnaryOp             = (funcInfo.input1.valueType == VALUE_NONE);
3250*35238bceSAndroid Build Coastguard Worker 
3251*35238bceSAndroid Build Coastguard Worker                             // \note Data type names will be added to description and name in a following loop.
3252*35238bceSAndroid Build Coastguard Worker                             string desc = string("Built-in function ") + shaderFuncName + "(";
3253*35238bceSAndroid Build Coastguard Worker                             string name = precisionPrefix;
3254*35238bceSAndroid Build Coastguard Worker 
3255*35238bceSAndroid Build Coastguard Worker                             // Generate shader op.
3256*35238bceSAndroid Build Coastguard Worker                             string shaderOp = "res = ";
3257*35238bceSAndroid Build Coastguard Worker 
3258*35238bceSAndroid Build Coastguard Worker                             // Setup shader data info.
3259*35238bceSAndroid Build Coastguard Worker                             shaderSpec.numInputs      = 0;
3260*35238bceSAndroid Build Coastguard Worker                             shaderSpec.precision      = isBoolCase ? PRECISION_LAST : (Precision)precision;
3261*35238bceSAndroid Build Coastguard Worker                             shaderSpec.output         = outDataType;
3262*35238bceSAndroid Build Coastguard Worker                             shaderSpec.resultScale    = funcInfo.resultScale;
3263*35238bceSAndroid Build Coastguard Worker                             shaderSpec.resultBias     = funcInfo.resultBias;
3264*35238bceSAndroid Build Coastguard Worker                             shaderSpec.referenceScale = funcInfo.referenceScale;
3265*35238bceSAndroid Build Coastguard Worker                             shaderSpec.referenceBias  = funcInfo.referenceBias;
3266*35238bceSAndroid Build Coastguard Worker 
3267*35238bceSAndroid Build Coastguard Worker                             if (funcInfo.type == OPERATOR)
3268*35238bceSAndroid Build Coastguard Worker                             {
3269*35238bceSAndroid Build Coastguard Worker                                 if (isUnaryOp && funcInfo.isUnaryPrefix)
3270*35238bceSAndroid Build Coastguard Worker                                     shaderOp += shaderFuncName;
3271*35238bceSAndroid Build Coastguard Worker                             }
3272*35238bceSAndroid Build Coastguard Worker                             else if (funcInfo.type == FUNCTION)
3273*35238bceSAndroid Build Coastguard Worker                                 shaderOp += string(shaderFuncName) + "(";
3274*35238bceSAndroid Build Coastguard Worker                             else // SIDE_EFFECT_OPERATOR
3275*35238bceSAndroid Build Coastguard Worker                                 shaderOp += "in0;\n\t";
3276*35238bceSAndroid Build Coastguard Worker 
3277*35238bceSAndroid Build Coastguard Worker                             for (int inputNdx = 0; inputNdx < MAX_INPUTS; inputNdx++)
3278*35238bceSAndroid Build Coastguard Worker                             {
3279*35238bceSAndroid Build Coastguard Worker                                 const Value &prevV = (inputNdx == 1) ? funcInfo.input0 :
3280*35238bceSAndroid Build Coastguard Worker                                                      (inputNdx == 2) ? funcInfo.input1 :
3281*35238bceSAndroid Build Coastguard Worker                                                                        funcInfo.input2;
3282*35238bceSAndroid Build Coastguard Worker                                 const Value &v     = (inputNdx == 0) ? funcInfo.input0 :
3283*35238bceSAndroid Build Coastguard Worker                                                      (inputNdx == 1) ? funcInfo.input1 :
3284*35238bceSAndroid Build Coastguard Worker                                                                        funcInfo.input2;
3285*35238bceSAndroid Build Coastguard Worker 
3286*35238bceSAndroid Build Coastguard Worker                                 if (v.valueType == VALUE_NONE)
3287*35238bceSAndroid Build Coastguard Worker                                     continue; // Skip unused input.
3288*35238bceSAndroid Build Coastguard Worker 
3289*35238bceSAndroid Build Coastguard Worker                                 int prevInScalarSize = isScalarType(prevV.valueType) ? 1 : inScalarSize;
3290*35238bceSAndroid Build Coastguard Worker                                 DataType prevInDataType =
3291*35238bceSAndroid Build Coastguard Worker                                     isFloatType(prevV.valueType) ? s_floatTypes[prevInScalarSize - 1] :
3292*35238bceSAndroid Build Coastguard Worker                                     isIntType(prevV.valueType)   ? s_intTypes[prevInScalarSize - 1] :
3293*35238bceSAndroid Build Coastguard Worker                                     isUintType(prevV.valueType)  ? s_uintTypes[prevInScalarSize - 1] :
3294*35238bceSAndroid Build Coastguard Worker                                     isBoolType(prevV.valueType)  ? s_boolTypes[prevInScalarSize - 1] :
3295*35238bceSAndroid Build Coastguard Worker                                                                    TYPE_LAST;
3296*35238bceSAndroid Build Coastguard Worker 
3297*35238bceSAndroid Build Coastguard Worker                                 int curInScalarSize    = isScalarType(v.valueType) ? 1 : inScalarSize;
3298*35238bceSAndroid Build Coastguard Worker                                 DataType curInDataType = isFloatType(v.valueType) ? s_floatTypes[curInScalarSize - 1] :
3299*35238bceSAndroid Build Coastguard Worker                                                          isIntType(v.valueType)   ? s_intTypes[curInScalarSize - 1] :
3300*35238bceSAndroid Build Coastguard Worker                                                          isUintType(v.valueType)  ? s_uintTypes[curInScalarSize - 1] :
3301*35238bceSAndroid Build Coastguard Worker                                                          isBoolType(v.valueType)  ? s_boolTypes[curInScalarSize - 1] :
3302*35238bceSAndroid Build Coastguard Worker                                                                                     TYPE_LAST;
3303*35238bceSAndroid Build Coastguard Worker 
3304*35238bceSAndroid Build Coastguard Worker                                 // Write input type(s) to case description and name.
3305*35238bceSAndroid Build Coastguard Worker 
3306*35238bceSAndroid Build Coastguard Worker                                 if (inputNdx > 0)
3307*35238bceSAndroid Build Coastguard Worker                                     desc += ", ";
3308*35238bceSAndroid Build Coastguard Worker 
3309*35238bceSAndroid Build Coastguard Worker                                 desc += getDataTypeName(curInDataType);
3310*35238bceSAndroid Build Coastguard Worker 
3311*35238bceSAndroid Build Coastguard Worker                                 if (inputNdx == 0 ||
3312*35238bceSAndroid Build Coastguard Worker                                     prevInDataType !=
3313*35238bceSAndroid Build Coastguard Worker                                         curInDataType) // \note Only write input type to case name if different from previous input type (avoid overly long names).
3314*35238bceSAndroid Build Coastguard Worker                                     name += string("") + getDataTypeName(curInDataType) + "_";
3315*35238bceSAndroid Build Coastguard Worker 
3316*35238bceSAndroid Build Coastguard Worker                                 // Generate op input source.
3317*35238bceSAndroid Build Coastguard Worker 
3318*35238bceSAndroid Build Coastguard Worker                                 if (funcInfo.type == OPERATOR || funcInfo.type == FUNCTION)
3319*35238bceSAndroid Build Coastguard Worker                                 {
3320*35238bceSAndroid Build Coastguard Worker                                     if (inputNdx != 0)
3321*35238bceSAndroid Build Coastguard Worker                                     {
3322*35238bceSAndroid Build Coastguard Worker                                         if (funcInfo.type == OPERATOR && !isUnaryOp)
3323*35238bceSAndroid Build Coastguard Worker                                             shaderOp += " " + string(shaderFuncName) + " ";
3324*35238bceSAndroid Build Coastguard Worker                                         else
3325*35238bceSAndroid Build Coastguard Worker                                             shaderOp += ", ";
3326*35238bceSAndroid Build Coastguard Worker                                     }
3327*35238bceSAndroid Build Coastguard Worker 
3328*35238bceSAndroid Build Coastguard Worker                                     shaderOp += "in" + de::toString(inputNdx);
3329*35238bceSAndroid Build Coastguard Worker 
3330*35238bceSAndroid Build Coastguard Worker                                     if (funcInfo.type == OPERATOR && isUnaryOp && !funcInfo.isUnaryPrefix)
3331*35238bceSAndroid Build Coastguard Worker                                         shaderOp += string(shaderFuncName);
3332*35238bceSAndroid Build Coastguard Worker                                 }
3333*35238bceSAndroid Build Coastguard Worker                                 else
3334*35238bceSAndroid Build Coastguard Worker                                 {
3335*35238bceSAndroid Build Coastguard Worker                                     DE_ASSERT(funcInfo.type == SIDE_EFFECT_OPERATOR);
3336*35238bceSAndroid Build Coastguard Worker 
3337*35238bceSAndroid Build Coastguard Worker                                     if (inputNdx != 0 || (isUnaryOp && funcInfo.isUnaryPrefix))
3338*35238bceSAndroid Build Coastguard Worker                                         shaderOp += string("") + (isUnaryOp ? "" : " ") + shaderFuncName +
3339*35238bceSAndroid Build Coastguard Worker                                                     (isUnaryOp ? "" : " ");
3340*35238bceSAndroid Build Coastguard Worker 
3341*35238bceSAndroid Build Coastguard Worker                                     shaderOp +=
3342*35238bceSAndroid Build Coastguard Worker                                         inputNdx == 0 ?
3343*35238bceSAndroid Build Coastguard Worker                                             "res" :
3344*35238bceSAndroid Build Coastguard Worker                                             "in" +
3345*35238bceSAndroid Build Coastguard Worker                                                 de::toString(
3346*35238bceSAndroid Build Coastguard Worker                                                     inputNdx); // \note in0 has already been assigned to res, so start from in1.
3347*35238bceSAndroid Build Coastguard Worker 
3348*35238bceSAndroid Build Coastguard Worker                                     if (isUnaryOp && !funcInfo.isUnaryPrefix)
3349*35238bceSAndroid Build Coastguard Worker                                         shaderOp += shaderFuncName;
3350*35238bceSAndroid Build Coastguard Worker                                 }
3351*35238bceSAndroid Build Coastguard Worker 
3352*35238bceSAndroid Build Coastguard Worker                                 // Fill in shader info.
3353*35238bceSAndroid Build Coastguard Worker                                 shaderSpec.inputs[shaderSpec.numInputs++] =
3354*35238bceSAndroid Build Coastguard Worker                                     ShaderValue(curInDataType, v.rangeMin, v.rangeMax);
3355*35238bceSAndroid Build Coastguard Worker                             }
3356*35238bceSAndroid Build Coastguard Worker 
3357*35238bceSAndroid Build Coastguard Worker                             if (funcInfo.type == FUNCTION)
3358*35238bceSAndroid Build Coastguard Worker                                 shaderOp += ")";
3359*35238bceSAndroid Build Coastguard Worker 
3360*35238bceSAndroid Build Coastguard Worker                             shaderOp += ";";
3361*35238bceSAndroid Build Coastguard Worker 
3362*35238bceSAndroid Build Coastguard Worker                             desc += ").";
3363*35238bceSAndroid Build Coastguard Worker                             name += shaderTypeName;
3364*35238bceSAndroid Build Coastguard Worker 
3365*35238bceSAndroid Build Coastguard Worker                             // Create the test case.
3366*35238bceSAndroid Build Coastguard Worker                             innerGroup->addChild(new ShaderOperatorCase(m_context, name.c_str(), desc.c_str(),
3367*35238bceSAndroid Build Coastguard Worker                                                                         isVertexCase, evalFunc, shaderOp, shaderSpec));
3368*35238bceSAndroid Build Coastguard Worker                         }
3369*35238bceSAndroid Build Coastguard Worker                     }
3370*35238bceSAndroid Build Coastguard Worker                 }
3371*35238bceSAndroid Build Coastguard Worker             }
3372*35238bceSAndroid Build Coastguard Worker         }
3373*35238bceSAndroid Build Coastguard Worker     }
3374*35238bceSAndroid Build Coastguard Worker 
3375*35238bceSAndroid Build Coastguard Worker     // The ?: selection operator.
3376*35238bceSAndroid Build Coastguard Worker 
3377*35238bceSAndroid Build Coastguard Worker     static const struct
3378*35238bceSAndroid Build Coastguard Worker     {
3379*35238bceSAndroid Build Coastguard Worker         DataType type; // The type of "Y" and "Z" operands in "X ? Y : Z" (X is always bool).
3380*35238bceSAndroid Build Coastguard Worker         ShaderEvalFunc evalFunc;
3381*35238bceSAndroid Build Coastguard Worker     } s_selectionInfo[] = {{TYPE_FLOAT, eval_selection_float},     {TYPE_FLOAT_VEC2, eval_selection_vec2},
3382*35238bceSAndroid Build Coastguard Worker                            {TYPE_FLOAT_VEC3, eval_selection_vec3}, {TYPE_FLOAT_VEC4, eval_selection_vec4},
3383*35238bceSAndroid Build Coastguard Worker                            {TYPE_INT, eval_selection_int},         {TYPE_INT_VEC2, eval_selection_ivec2},
3384*35238bceSAndroid Build Coastguard Worker                            {TYPE_INT_VEC3, eval_selection_ivec3},  {TYPE_INT_VEC4, eval_selection_ivec4},
3385*35238bceSAndroid Build Coastguard Worker                            {TYPE_UINT, eval_selection_uint},       {TYPE_UINT_VEC2, eval_selection_uvec2},
3386*35238bceSAndroid Build Coastguard Worker                            {TYPE_UINT_VEC3, eval_selection_uvec3}, {TYPE_UINT_VEC4, eval_selection_uvec4},
3387*35238bceSAndroid Build Coastguard Worker                            {TYPE_BOOL, eval_selection_bool},       {TYPE_BOOL_VEC2, eval_selection_bvec2},
3388*35238bceSAndroid Build Coastguard Worker                            {TYPE_BOOL_VEC3, eval_selection_bvec3}, {TYPE_BOOL_VEC4, eval_selection_bvec4}};
3389*35238bceSAndroid Build Coastguard Worker 
3390*35238bceSAndroid Build Coastguard Worker     TestCaseGroup *selectionGroup = new TestCaseGroup(m_context, "selection", "Selection operator tests");
3391*35238bceSAndroid Build Coastguard Worker     addChild(selectionGroup);
3392*35238bceSAndroid Build Coastguard Worker 
3393*35238bceSAndroid Build Coastguard Worker     for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(s_selectionInfo); typeNdx++)
3394*35238bceSAndroid Build Coastguard Worker     {
3395*35238bceSAndroid Build Coastguard Worker         DataType curType        = s_selectionInfo[typeNdx].type;
3396*35238bceSAndroid Build Coastguard Worker         ShaderEvalFunc evalFunc = s_selectionInfo[typeNdx].evalFunc;
3397*35238bceSAndroid Build Coastguard Worker         bool isBoolCase         = isDataTypeBoolOrBVec(curType);
3398*35238bceSAndroid Build Coastguard Worker         bool isFloatCase        = isDataTypeFloatOrVec(curType);
3399*35238bceSAndroid Build Coastguard Worker         bool isIntCase          = isDataTypeIntOrIVec(curType);
3400*35238bceSAndroid Build Coastguard Worker         bool isUintCase         = isDataTypeUintOrUVec(curType);
3401*35238bceSAndroid Build Coastguard Worker         const char *dataTypeStr = getDataTypeName(curType);
3402*35238bceSAndroid Build Coastguard Worker 
3403*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(isBoolCase || isFloatCase || isIntCase || isUintCase);
3404*35238bceSAndroid Build Coastguard Worker         DE_UNREF(isIntCase);
3405*35238bceSAndroid Build Coastguard Worker 
3406*35238bceSAndroid Build Coastguard Worker         for (int precision = 0; precision < (int)PRECISION_LAST; precision++)
3407*35238bceSAndroid Build Coastguard Worker         {
3408*35238bceSAndroid Build Coastguard Worker             if (isBoolCase && precision != PRECISION_MEDIUMP) // Use mediump interpolators for booleans.
3409*35238bceSAndroid Build Coastguard Worker                 continue;
3410*35238bceSAndroid Build Coastguard Worker 
3411*35238bceSAndroid Build Coastguard Worker             const char *precisionStr = getPrecisionName((Precision)precision);
3412*35238bceSAndroid Build Coastguard Worker             string precisionPrefix   = isBoolCase ? "" : (string(precisionStr) + "_");
3413*35238bceSAndroid Build Coastguard Worker 
3414*35238bceSAndroid Build Coastguard Worker             for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
3415*35238bceSAndroid Build Coastguard Worker             {
3416*35238bceSAndroid Build Coastguard Worker                 ShaderType shaderType = s_shaderTypes[shaderTypeNdx];
3417*35238bceSAndroid Build Coastguard Worker                 ShaderDataSpec shaderSpec;
3418*35238bceSAndroid Build Coastguard Worker                 const char *shaderTypeName = getShaderTypeName(shaderType);
3419*35238bceSAndroid Build Coastguard Worker                 bool isVertexCase          = (ShaderType)shaderType == SHADERTYPE_VERTEX;
3420*35238bceSAndroid Build Coastguard Worker 
3421*35238bceSAndroid Build Coastguard Worker                 string name = precisionPrefix + dataTypeStr + "_" + shaderTypeName;
3422*35238bceSAndroid Build Coastguard Worker 
3423*35238bceSAndroid Build Coastguard Worker                 shaderSpec.numInputs      = 3;
3424*35238bceSAndroid Build Coastguard Worker                 shaderSpec.precision      = isBoolCase ? PRECISION_LAST : (Precision)precision;
3425*35238bceSAndroid Build Coastguard Worker                 shaderSpec.output         = curType;
3426*35238bceSAndroid Build Coastguard Worker                 shaderSpec.resultScale    = isBoolCase ? 1.0f : isFloatCase ? 0.5f : isUintCase ? 0.5f : 0.1f;
3427*35238bceSAndroid Build Coastguard Worker                 shaderSpec.resultBias     = isBoolCase ? 0.0f : isFloatCase ? 0.5f : isUintCase ? 0.0f : 0.5f;
3428*35238bceSAndroid Build Coastguard Worker                 shaderSpec.referenceScale = shaderSpec.resultScale;
3429*35238bceSAndroid Build Coastguard Worker                 shaderSpec.referenceBias  = shaderSpec.resultBias;
3430*35238bceSAndroid Build Coastguard Worker 
3431*35238bceSAndroid Build Coastguard Worker                 float rangeMin = isBoolCase ? -1.0f : isFloatCase ? -1.0f : isUintCase ? 0.0f : -5.0f;
3432*35238bceSAndroid Build Coastguard Worker                 float rangeMax = isBoolCase ? 1.0f : isFloatCase ? 1.0f : isUintCase ? 2.0f : 5.0f;
3433*35238bceSAndroid Build Coastguard Worker 
3434*35238bceSAndroid Build Coastguard Worker                 shaderSpec.inputs[0] = ShaderValue(TYPE_BOOL, -1.0f, 1.0f);
3435*35238bceSAndroid Build Coastguard Worker                 shaderSpec.inputs[1] = ShaderValue(curType, rangeMin, rangeMax);
3436*35238bceSAndroid Build Coastguard Worker                 shaderSpec.inputs[2] = ShaderValue(curType, rangeMin, rangeMax);
3437*35238bceSAndroid Build Coastguard Worker 
3438*35238bceSAndroid Build Coastguard Worker                 selectionGroup->addChild(new ShaderOperatorCase(m_context, name.c_str(), "", isVertexCase, evalFunc,
3439*35238bceSAndroid Build Coastguard Worker                                                                 "res = in0 ? in1 : in2;", shaderSpec));
3440*35238bceSAndroid Build Coastguard Worker             }
3441*35238bceSAndroid Build Coastguard Worker         }
3442*35238bceSAndroid Build Coastguard Worker     }
3443*35238bceSAndroid Build Coastguard Worker 
3444*35238bceSAndroid Build Coastguard Worker     // The sequence operator (comma).
3445*35238bceSAndroid Build Coastguard Worker 
3446*35238bceSAndroid Build Coastguard Worker     TestCaseGroup *sequenceGroup = new TestCaseGroup(m_context, "sequence", "Sequence operator tests");
3447*35238bceSAndroid Build Coastguard Worker     addChild(sequenceGroup);
3448*35238bceSAndroid Build Coastguard Worker 
3449*35238bceSAndroid Build Coastguard Worker     TestCaseGroup *sequenceNoSideEffGroup =
3450*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(m_context, "no_side_effects", "Sequence tests without side-effects");
3451*35238bceSAndroid Build Coastguard Worker     TestCaseGroup *sequenceSideEffGroup =
3452*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(m_context, "side_effects", "Sequence tests with side-effects");
3453*35238bceSAndroid Build Coastguard Worker     sequenceGroup->addChild(sequenceNoSideEffGroup);
3454*35238bceSAndroid Build Coastguard Worker     sequenceGroup->addChild(sequenceSideEffGroup);
3455*35238bceSAndroid Build Coastguard Worker 
3456*35238bceSAndroid Build Coastguard Worker     static const struct
3457*35238bceSAndroid Build Coastguard Worker     {
3458*35238bceSAndroid Build Coastguard Worker         bool containsSideEffects;
3459*35238bceSAndroid Build Coastguard Worker         const char *caseName;
3460*35238bceSAndroid Build Coastguard Worker         const char *expressionStr;
3461*35238bceSAndroid Build Coastguard Worker         int numInputs;
3462*35238bceSAndroid Build Coastguard Worker         DataType inputTypes[MAX_INPUTS];
3463*35238bceSAndroid Build Coastguard Worker         DataType resultType;
3464*35238bceSAndroid Build Coastguard Worker         ShaderEvalFunc evalFunc;
3465*35238bceSAndroid Build Coastguard Worker     } s_sequenceCases[] = {{false,
3466*35238bceSAndroid Build Coastguard Worker                             "vec4",
3467*35238bceSAndroid Build Coastguard Worker                             "in0, in2 + in1, in1 + in0",
3468*35238bceSAndroid Build Coastguard Worker                             3,
3469*35238bceSAndroid Build Coastguard Worker                             {TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4},
3470*35238bceSAndroid Build Coastguard Worker                             TYPE_FLOAT_VEC4,
3471*35238bceSAndroid Build Coastguard Worker                             evalSequenceNoSideEffCase0},
3472*35238bceSAndroid Build Coastguard Worker                            {false,
3473*35238bceSAndroid Build Coastguard Worker                             "float_uint",
3474*35238bceSAndroid Build Coastguard Worker                             "in0 + in2, in1 + in1",
3475*35238bceSAndroid Build Coastguard Worker                             3,
3476*35238bceSAndroid Build Coastguard Worker                             {TYPE_FLOAT, TYPE_UINT, TYPE_FLOAT},
3477*35238bceSAndroid Build Coastguard Worker                             TYPE_UINT,
3478*35238bceSAndroid Build Coastguard Worker                             evalSequenceNoSideEffCase1},
3479*35238bceSAndroid Build Coastguard Worker                            {false,
3480*35238bceSAndroid Build Coastguard Worker                             "bool_vec2",
3481*35238bceSAndroid Build Coastguard Worker                             "in0 && in1, in0, ivec2(vec2(in0) + in2)",
3482*35238bceSAndroid Build Coastguard Worker                             3,
3483*35238bceSAndroid Build Coastguard Worker                             {TYPE_BOOL, TYPE_BOOL, TYPE_FLOAT_VEC2},
3484*35238bceSAndroid Build Coastguard Worker                             TYPE_INT_VEC2,
3485*35238bceSAndroid Build Coastguard Worker                             evalSequenceNoSideEffCase2},
3486*35238bceSAndroid Build Coastguard Worker                            {false,
3487*35238bceSAndroid Build Coastguard Worker                             "vec4_ivec4_bvec4",
3488*35238bceSAndroid Build Coastguard Worker                             "in0 + vec4(in1), in2, in1",
3489*35238bceSAndroid Build Coastguard Worker                             3,
3490*35238bceSAndroid Build Coastguard Worker                             {TYPE_FLOAT_VEC4, TYPE_INT_VEC4, TYPE_BOOL_VEC4},
3491*35238bceSAndroid Build Coastguard Worker                             TYPE_INT_VEC4,
3492*35238bceSAndroid Build Coastguard Worker                             evalSequenceNoSideEffCase3},
3493*35238bceSAndroid Build Coastguard Worker 
3494*35238bceSAndroid Build Coastguard Worker                            {true,
3495*35238bceSAndroid Build Coastguard Worker                             "vec4",
3496*35238bceSAndroid Build Coastguard Worker                             "in0++, in1 = in0 + in2, in2 = in1",
3497*35238bceSAndroid Build Coastguard Worker                             3,
3498*35238bceSAndroid Build Coastguard Worker                             {TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4},
3499*35238bceSAndroid Build Coastguard Worker                             TYPE_FLOAT_VEC4,
3500*35238bceSAndroid Build Coastguard Worker                             evalSequenceSideEffCase0},
3501*35238bceSAndroid Build Coastguard Worker                            {true,
3502*35238bceSAndroid Build Coastguard Worker                             "float_uint",
3503*35238bceSAndroid Build Coastguard Worker                             "in1++, in0 = float(in1), in1 = uint(in0 + in2)",
3504*35238bceSAndroid Build Coastguard Worker                             3,
3505*35238bceSAndroid Build Coastguard Worker                             {TYPE_FLOAT, TYPE_UINT, TYPE_FLOAT},
3506*35238bceSAndroid Build Coastguard Worker                             TYPE_UINT,
3507*35238bceSAndroid Build Coastguard Worker                             evalSequenceSideEffCase1},
3508*35238bceSAndroid Build Coastguard Worker                            {true,
3509*35238bceSAndroid Build Coastguard Worker                             "bool_vec2",
3510*35238bceSAndroid Build Coastguard Worker                             "in1 = in0, in2++, in2 = in2 + vec2(in1), ivec2(in2)",
3511*35238bceSAndroid Build Coastguard Worker                             3,
3512*35238bceSAndroid Build Coastguard Worker                             {TYPE_BOOL, TYPE_BOOL, TYPE_FLOAT_VEC2},
3513*35238bceSAndroid Build Coastguard Worker                             TYPE_INT_VEC2,
3514*35238bceSAndroid Build Coastguard Worker                             evalSequenceSideEffCase2},
3515*35238bceSAndroid Build Coastguard Worker                            {true,
3516*35238bceSAndroid Build Coastguard Worker                             "vec4_ivec4_bvec4",
3517*35238bceSAndroid Build Coastguard Worker                             "in0 = in0 + vec4(in2), in1 = in1 + ivec4(in0), in1++",
3518*35238bceSAndroid Build Coastguard Worker                             3,
3519*35238bceSAndroid Build Coastguard Worker                             {TYPE_FLOAT_VEC4, TYPE_INT_VEC4, TYPE_BOOL_VEC4},
3520*35238bceSAndroid Build Coastguard Worker                             TYPE_INT_VEC4,
3521*35238bceSAndroid Build Coastguard Worker                             evalSequenceSideEffCase3}};
3522*35238bceSAndroid Build Coastguard Worker 
3523*35238bceSAndroid Build Coastguard Worker     for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(s_sequenceCases); caseNdx++)
3524*35238bceSAndroid Build Coastguard Worker     {
3525*35238bceSAndroid Build Coastguard Worker         for (int precision = 0; precision < (int)PRECISION_LAST; precision++)
3526*35238bceSAndroid Build Coastguard Worker         {
3527*35238bceSAndroid Build Coastguard Worker             for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
3528*35238bceSAndroid Build Coastguard Worker             {
3529*35238bceSAndroid Build Coastguard Worker                 ShaderType shaderType = s_shaderTypes[shaderTypeNdx];
3530*35238bceSAndroid Build Coastguard Worker                 ShaderDataSpec shaderSpec;
3531*35238bceSAndroid Build Coastguard Worker                 const char *shaderTypeName = getShaderTypeName(shaderType);
3532*35238bceSAndroid Build Coastguard Worker                 bool isVertexCase          = (ShaderType)shaderType == SHADERTYPE_VERTEX;
3533*35238bceSAndroid Build Coastguard Worker 
3534*35238bceSAndroid Build Coastguard Worker                 string name = string("") + getPrecisionName((Precision)precision) + "_" +
3535*35238bceSAndroid Build Coastguard Worker                               s_sequenceCases[caseNdx].caseName + "_" + shaderTypeName;
3536*35238bceSAndroid Build Coastguard Worker 
3537*35238bceSAndroid Build Coastguard Worker                 shaderSpec.numInputs      = s_sequenceCases[caseNdx].numInputs;
3538*35238bceSAndroid Build Coastguard Worker                 shaderSpec.precision      = (Precision)precision;
3539*35238bceSAndroid Build Coastguard Worker                 shaderSpec.output         = s_sequenceCases[caseNdx].resultType;
3540*35238bceSAndroid Build Coastguard Worker                 shaderSpec.resultScale    = 0.5f;
3541*35238bceSAndroid Build Coastguard Worker                 shaderSpec.resultBias     = 0.0f;
3542*35238bceSAndroid Build Coastguard Worker                 shaderSpec.referenceScale = shaderSpec.resultScale;
3543*35238bceSAndroid Build Coastguard Worker                 shaderSpec.referenceBias  = shaderSpec.resultBias;
3544*35238bceSAndroid Build Coastguard Worker 
3545*35238bceSAndroid Build Coastguard Worker                 for (int inputNdx = 0; inputNdx < s_sequenceCases[caseNdx].numInputs; inputNdx++)
3546*35238bceSAndroid Build Coastguard Worker                 {
3547*35238bceSAndroid Build Coastguard Worker                     DataType type  = s_sequenceCases[caseNdx].inputTypes[inputNdx];
3548*35238bceSAndroid Build Coastguard Worker                     float rangeMin = isDataTypeFloatOrVec(type) ? -0.5f :
3549*35238bceSAndroid Build Coastguard Worker                                      isDataTypeIntOrIVec(type)  ? -2.0f :
3550*35238bceSAndroid Build Coastguard Worker                                      isDataTypeUintOrUVec(type) ? 0.0f :
3551*35238bceSAndroid Build Coastguard Worker                                                                   -1.0f;
3552*35238bceSAndroid Build Coastguard Worker                     float rangeMax = isDataTypeFloatOrVec(type) ? 0.5f :
3553*35238bceSAndroid Build Coastguard Worker                                      isDataTypeIntOrIVec(type)  ? 2.0f :
3554*35238bceSAndroid Build Coastguard Worker                                      isDataTypeUintOrUVec(type) ? 2.0f :
3555*35238bceSAndroid Build Coastguard Worker                                                                   1.0f;
3556*35238bceSAndroid Build Coastguard Worker 
3557*35238bceSAndroid Build Coastguard Worker                     shaderSpec.inputs[inputNdx] = ShaderValue(type, rangeMin, rangeMax);
3558*35238bceSAndroid Build Coastguard Worker                 }
3559*35238bceSAndroid Build Coastguard Worker 
3560*35238bceSAndroid Build Coastguard Worker                 string expression = string("res = (") + s_sequenceCases[caseNdx].expressionStr + ");";
3561*35238bceSAndroid Build Coastguard Worker 
3562*35238bceSAndroid Build Coastguard Worker                 TestCaseGroup *group =
3563*35238bceSAndroid Build Coastguard Worker                     s_sequenceCases[caseNdx].containsSideEffects ? sequenceSideEffGroup : sequenceNoSideEffGroup;
3564*35238bceSAndroid Build Coastguard Worker                 group->addChild(new ShaderOperatorCase(m_context, name.c_str(), "", isVertexCase,
3565*35238bceSAndroid Build Coastguard Worker                                                        s_sequenceCases[caseNdx].evalFunc, expression.c_str(),
3566*35238bceSAndroid Build Coastguard Worker                                                        shaderSpec));
3567*35238bceSAndroid Build Coastguard Worker             }
3568*35238bceSAndroid Build Coastguard Worker         }
3569*35238bceSAndroid Build Coastguard Worker     }
3570*35238bceSAndroid Build Coastguard Worker }
3571*35238bceSAndroid Build Coastguard Worker 
3572*35238bceSAndroid Build Coastguard Worker } // namespace Functional
3573*35238bceSAndroid Build Coastguard Worker } // namespace gles3
3574*35238bceSAndroid Build Coastguard Worker } // namespace deqp
3575