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