xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fShaderConstExprTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief GLES3 shader constant expression tests
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3fShaderConstExprTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "glsShaderLibrary.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "glsShaderConstExprTests.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker namespace deqp
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker namespace gles3
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace Functional
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker // builtins
43*35238bceSAndroid Build Coastguard Worker class ShaderConstExprBuiltinTests : public TestCaseGroup
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker public:
ShaderConstExprBuiltinTests(Context & context)46*35238bceSAndroid Build Coastguard Worker     ShaderConstExprBuiltinTests(Context &context) : TestCaseGroup(context, "builtin_functions", "Builtin functions")
47*35238bceSAndroid Build Coastguard Worker     {
48*35238bceSAndroid Build Coastguard Worker     }
~ShaderConstExprBuiltinTests(void)49*35238bceSAndroid Build Coastguard Worker     virtual ~ShaderConstExprBuiltinTests(void)
50*35238bceSAndroid Build Coastguard Worker     {
51*35238bceSAndroid Build Coastguard Worker     }
52*35238bceSAndroid Build Coastguard Worker 
53*35238bceSAndroid Build Coastguard Worker     void init(void);
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker     void addChildGroup(const char *name, const char *desc, const gls::ShaderConstExpr::TestParams *cases, int numCases);
56*35238bceSAndroid Build Coastguard Worker };
57*35238bceSAndroid Build Coastguard Worker 
addChildGroup(const char * name,const char * desc,const gls::ShaderConstExpr::TestParams * cases,int numCases)58*35238bceSAndroid Build Coastguard Worker void ShaderConstExprBuiltinTests::addChildGroup(const char *name, const char *desc,
59*35238bceSAndroid Build Coastguard Worker                                                 const gls::ShaderConstExpr::TestParams *cases, int numCases)
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker     const std::vector<tcu::TestNode *> children = createTests(
62*35238bceSAndroid Build Coastguard Worker         m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), cases, numCases, glu::GLSL_VERSION_300_ES);
63*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *group = new tcu::TestCaseGroup(m_testCtx, name, desc);
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker     addChild(group);
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < (int)children.size(); i++)
68*35238bceSAndroid Build Coastguard Worker         group->addChild(children[i]);
69*35238bceSAndroid Build Coastguard Worker }
70*35238bceSAndroid Build Coastguard Worker 
init(void)71*35238bceSAndroid Build Coastguard Worker void ShaderConstExprBuiltinTests::init(void)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker     using namespace gls::ShaderConstExpr;
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker     // ${T} => final type, ${MT} => final type but with scalar version usable even when T is a vector
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker     // Trigonometry
78*35238bceSAndroid Build Coastguard Worker     {
79*35238bceSAndroid Build Coastguard Worker         const TestParams cases[] = {
80*35238bceSAndroid Build Coastguard Worker             {"radians", "radians(${T} (90.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatRadians(90.0f)},
81*35238bceSAndroid Build Coastguard Worker             {"degrees", "degrees(${T} (2.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatDegrees(2.0f)},
82*35238bceSAndroid Build Coastguard Worker             {"sin", "sin(${T} (3.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatSin(3.0f)},
83*35238bceSAndroid Build Coastguard Worker             {"cos", "cos(${T} (3.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatCos(3.2f)},
84*35238bceSAndroid Build Coastguard Worker             {"tan", "tan(${T} (1.5))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatTan(1.5f)},
85*35238bceSAndroid Build Coastguard Worker             {"asin", "asin(${T} (0.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatAsin(0.0f)},
86*35238bceSAndroid Build Coastguard Worker             {"acos", "acos(${T} (1.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatAcos(1.0f)},
87*35238bceSAndroid Build Coastguard Worker             {"atan_separate", "atan(${T} (-1.0), ${T} (-1.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT,
88*35238bceSAndroid Build Coastguard Worker              deFloatAtan2(-1.0f, -1.0f)},
89*35238bceSAndroid Build Coastguard Worker             {"atan_combined", "atan(${T} (2.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatAtanOver(2.0f)},
90*35238bceSAndroid Build Coastguard Worker             {"sinh", "sinh(${T} (1.5))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatSinh(1.5f)},
91*35238bceSAndroid Build Coastguard Worker             {"cosh", "cosh(${T} (1.5))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatCosh(1.5f)},
92*35238bceSAndroid Build Coastguard Worker             {"tanh", "tanh(${T} (1.5))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatTanh(1.5f)},
93*35238bceSAndroid Build Coastguard Worker             {"asinh", "asinh(${T} (2.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatAsinh(2.0f)},
94*35238bceSAndroid Build Coastguard Worker             {"acosh", "acosh(${T} (2.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatAcosh(2.0f)},
95*35238bceSAndroid Build Coastguard Worker             {"atanh", "atanh(${T} (0.8))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatAtanh(0.8f)},
96*35238bceSAndroid Build Coastguard Worker         };
97*35238bceSAndroid Build Coastguard Worker 
98*35238bceSAndroid Build Coastguard Worker         addChildGroup("angle_and_trigonometry", "Angles and Trigonometry", cases, DE_LENGTH_OF_ARRAY(cases));
99*35238bceSAndroid Build Coastguard Worker     }
100*35238bceSAndroid Build Coastguard Worker     // Exponential
101*35238bceSAndroid Build Coastguard Worker     {
102*35238bceSAndroid Build Coastguard Worker         const TestParams cases[] = {
103*35238bceSAndroid Build Coastguard Worker             {"pow", "pow(${T} (1.7), ${T} (3.5))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatPow(1.7f, 3.5f)},
104*35238bceSAndroid Build Coastguard Worker             {"exp", "exp(${T} (4.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatExp(4.2f)},
105*35238bceSAndroid Build Coastguard Worker             {"log", "log(${T} (42.12))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatLog(42.12f)},
106*35238bceSAndroid Build Coastguard Worker             {"exp2", "exp2(${T} (6.7))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatExp2(6.7f)},
107*35238bceSAndroid Build Coastguard Worker             {"log2", "log2(${T} (100.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatLog2(100.0f)},
108*35238bceSAndroid Build Coastguard Worker             {"sqrt", "sqrt(${T} (10.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatSqrt(10.0f)},
109*35238bceSAndroid Build Coastguard Worker             {"inversesqrt", "inversesqrt(${T} (10.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatRsq(10.0f)},
110*35238bceSAndroid Build Coastguard Worker         };
111*35238bceSAndroid Build Coastguard Worker 
112*35238bceSAndroid Build Coastguard Worker         addChildGroup("exponential", "Exponential", cases, DE_LENGTH_OF_ARRAY(cases));
113*35238bceSAndroid Build Coastguard Worker     }
114*35238bceSAndroid Build Coastguard Worker     // Common
115*35238bceSAndroid Build Coastguard Worker     {
116*35238bceSAndroid Build Coastguard Worker         const TestParams cases[] = {
117*35238bceSAndroid Build Coastguard Worker             {"abs", "abs(${T} (-42.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 42.0f},
118*35238bceSAndroid Build Coastguard Worker             {"abs", "abs(${T} (-42))", glu::TYPE_INT, 1, 4, glu::TYPE_INT, 42.0f},
119*35238bceSAndroid Build Coastguard Worker             {"sign", "sign(${T} (-18.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, -1.0f},
120*35238bceSAndroid Build Coastguard Worker             {"sign", "sign(${T} (-18))", glu::TYPE_INT, 1, 4, glu::TYPE_INT, -1.0f},
121*35238bceSAndroid Build Coastguard Worker             {"floor", "floor(${T} (37.3))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatFloor(37.3f)},
122*35238bceSAndroid Build Coastguard Worker             {"trunc", "trunc(${T} (-1.8))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, -1.0f},
123*35238bceSAndroid Build Coastguard Worker             {"round", "round(${T} (42.7))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 42.0f},
124*35238bceSAndroid Build Coastguard Worker             {"roundEven", "roundEven(${T} (1.5))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 2.0f},
125*35238bceSAndroid Build Coastguard Worker             {"ceil", "ceil(${T} (82.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatCeil(82.2f)},
126*35238bceSAndroid Build Coastguard Worker             {"fract", "fract(${T} (17.75))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatFrac(17.75f)},
127*35238bceSAndroid Build Coastguard Worker             {"mod", "mod(${T} (87.65), ${MT} (3.7))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, deFloatMod(87.65f, 3.7f)},
128*35238bceSAndroid Build Coastguard Worker             // modf cannot be tested due to lacking valid ways of using the 'out' parameter in a constant expression
129*35238bceSAndroid Build Coastguard Worker             {"min", "min(${T} (12.3), ${MT} (32.1))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 12.3f},
130*35238bceSAndroid Build Coastguard Worker             {"min", "min(${T} (13), ${MT} (-14))", glu::TYPE_INT, 1, 4, glu::TYPE_INT, -14.0f},
131*35238bceSAndroid Build Coastguard Worker             {"min", "min(${T} (13), ${MT} (14))", glu::TYPE_UINT, 1, 4, glu::TYPE_UINT, 13.0f},
132*35238bceSAndroid Build Coastguard Worker             {"max", "max(${T} (12.3), ${MT} (32.1))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 32.1f},
133*35238bceSAndroid Build Coastguard Worker             {"max", "max(${T} (13), ${MT} (-14))", glu::TYPE_INT, 1, 4, glu::TYPE_INT, 13.0f},
134*35238bceSAndroid Build Coastguard Worker             {"max", "max(${T} (13), ${MT} (14))", glu::TYPE_UINT, 1, 4, glu::TYPE_UINT, 14.0f},
135*35238bceSAndroid Build Coastguard Worker             {"clamp", "clamp(${T} (42.1), ${MT} (10.0), ${MT} (15.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 15.0f},
136*35238bceSAndroid Build Coastguard Worker             {"clamp", "clamp(${T} (42), ${MT} (-10), ${MT} (15))", glu::TYPE_INT, 1, 4, glu::TYPE_INT, 15.0f},
137*35238bceSAndroid Build Coastguard Worker             {"clamp", "clamp(${T} (42), ${MT} (10), ${MT} (15))", glu::TYPE_UINT, 1, 4, glu::TYPE_UINT, 15.0f},
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker             {"mix", "mix(${T} (10.0), ${T} (20.0), ${MT}(0.75))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 17.5f},
140*35238bceSAndroid Build Coastguard Worker             {"mix_float_bool", "mix(float(10.0), float(20.0), bool(1))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 20.0f},
141*35238bceSAndroid Build Coastguard Worker             {"mix_vec2_bvec2", "mix(vec2(10.0), vec2(20.0), bvec2(1)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
142*35238bceSAndroid Build Coastguard Worker              20.0f},
143*35238bceSAndroid Build Coastguard Worker             {"mix_vec3_bvec3", "mix(vec3(10.0), vec3(20.0), bvec3(1)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
144*35238bceSAndroid Build Coastguard Worker              20.0f},
145*35238bceSAndroid Build Coastguard Worker             {"mix_vec4_bvec4", "mix(vec4(10.0), vec4(20.0), bvec4(1)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
146*35238bceSAndroid Build Coastguard Worker              20.0f},
147*35238bceSAndroid Build Coastguard Worker 
148*35238bceSAndroid Build Coastguard Worker             {"step", "step(${MT} (3.2), ${T} (4.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 1.0f},
149*35238bceSAndroid Build Coastguard Worker             {"smoothstep", "smoothstep(${MT} (3.0), ${MT} (5.0), ${T} (4.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT,
150*35238bceSAndroid Build Coastguard Worker              0.5f},
151*35238bceSAndroid Build Coastguard Worker             {"isnan", "isnan(${T} (1.3))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_BOOL, 0.0f},
152*35238bceSAndroid Build Coastguard Worker             {"isinf", "isinf(${T} (1.3))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_BOOL, 0.0f},
153*35238bceSAndroid Build Coastguard Worker             {"floatbits_int", "intBitsToFloat(floatBitsToInt(42.12))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 42.12f},
154*35238bceSAndroid Build Coastguard Worker             {"floatbits_uint", "uintBitsToFloat(floatBitsToUint(-14.2))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
155*35238bceSAndroid Build Coastguard Worker              -14.2f},
156*35238bceSAndroid Build Coastguard Worker         };
157*35238bceSAndroid Build Coastguard Worker 
158*35238bceSAndroid Build Coastguard Worker         addChildGroup("common", "Common", cases, DE_LENGTH_OF_ARRAY(cases));
159*35238bceSAndroid Build Coastguard Worker     }
160*35238bceSAndroid Build Coastguard Worker     // Floating point pack & unpack
161*35238bceSAndroid Build Coastguard Worker     {
162*35238bceSAndroid Build Coastguard Worker         const TestParams cases[] = {
163*35238bceSAndroid Build Coastguard Worker             {"packSnorm2x16", "packSnorm2x16(vec2(0.7, 0.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_UINT, 22937.0f},
164*35238bceSAndroid Build Coastguard Worker             {"unpackSnorm2x16", "unpackSnorm2x16(22937u).x", glu::TYPE_UINT, 1, 1, glu::TYPE_FLOAT, 0.7f},
165*35238bceSAndroid Build Coastguard Worker             {"packUnorm2x16", "packUnorm2x16(vec2(0.6, -0.3))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_UINT, 39321.0f},
166*35238bceSAndroid Build Coastguard Worker             {"unpackUnorm2x16", "unpackUnorm2x16(39321u).x", glu::TYPE_UINT, 1, 1, glu::TYPE_FLOAT, 0.6f},
167*35238bceSAndroid Build Coastguard Worker             {"packHalf2x16", "unpackHalf2x16(packHalf2x16(vec2(0.3, 0.1))).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
168*35238bceSAndroid Build Coastguard Worker              0.3f},
169*35238bceSAndroid Build Coastguard Worker             // \todo [2014-01-29 otto] Separate testing of half-precision pack & unpack
170*35238bceSAndroid Build Coastguard Worker         };
171*35238bceSAndroid Build Coastguard Worker 
172*35238bceSAndroid Build Coastguard Worker         addChildGroup("float_pack_unpack", "Floating point pack & unpack", cases, DE_LENGTH_OF_ARRAY(cases));
173*35238bceSAndroid Build Coastguard Worker     }
174*35238bceSAndroid Build Coastguard Worker     // Geometric
175*35238bceSAndroid Build Coastguard Worker     {
176*35238bceSAndroid Build Coastguard Worker         const TestParams cases[] = {
177*35238bceSAndroid Build Coastguard Worker             {"length_float", "length(1.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 1.0f},
178*35238bceSAndroid Build Coastguard Worker             {"length_vec2", "length(vec2(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, deFloatSqrt(2.0f)},
179*35238bceSAndroid Build Coastguard Worker             {"length_vec3", "length(vec3(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, deFloatSqrt(3.0f)},
180*35238bceSAndroid Build Coastguard Worker             {"length_vec4", "length(vec4(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, deFloatSqrt(4.0f)},
181*35238bceSAndroid Build Coastguard Worker 
182*35238bceSAndroid Build Coastguard Worker             {"distance_float", "distance(1.0, 2.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 1.0f},
183*35238bceSAndroid Build Coastguard Worker             {"distance_vec2", "distance(vec2(1.0), vec2(2.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
184*35238bceSAndroid Build Coastguard Worker              deFloatSqrt(2.0f)},
185*35238bceSAndroid Build Coastguard Worker             {"distance_vec3", "distance(vec3(1.0), vec3(2.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
186*35238bceSAndroid Build Coastguard Worker              deFloatSqrt(3.0f)},
187*35238bceSAndroid Build Coastguard Worker             {"distance_vec4", "distance(vec4(1.0), vec4(2.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
188*35238bceSAndroid Build Coastguard Worker              deFloatSqrt(4.0f)},
189*35238bceSAndroid Build Coastguard Worker 
190*35238bceSAndroid Build Coastguard Worker             {"dot_float", "dot(1.0, 1.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 1.0f},
191*35238bceSAndroid Build Coastguard Worker             {"dot_vec2", "dot(vec2(1.0), vec2(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.0f},
192*35238bceSAndroid Build Coastguard Worker             {"dot_vec3", "dot(vec3(1.0), vec3(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 3.0f},
193*35238bceSAndroid Build Coastguard Worker             {"dot_vec4", "dot(vec4(1.0), vec4(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 4.0f},
194*35238bceSAndroid Build Coastguard Worker 
195*35238bceSAndroid Build Coastguard Worker             {"normalize_float", "normalize(1.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 1.0f},
196*35238bceSAndroid Build Coastguard Worker             {"normalize_vec2", "normalize(vec2(1.0)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, deFloatRsq(2.0f)},
197*35238bceSAndroid Build Coastguard Worker             {"normalize_vec3", "normalize(vec3(1.0)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, deFloatRsq(3.0f)},
198*35238bceSAndroid Build Coastguard Worker             {"normalize_vec4", "normalize(vec4(1.0)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, deFloatRsq(4.0f)},
199*35238bceSAndroid Build Coastguard Worker 
200*35238bceSAndroid Build Coastguard Worker             {"faceforward", "faceforward(${T} (1.0), ${T} (1.0), ${T} (1.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT,
201*35238bceSAndroid Build Coastguard Worker              -1.0f},
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker             // reflect(I, N) => I - 2*dot(N, I)*N
204*35238bceSAndroid Build Coastguard Worker             {"reflect_float", "reflect(1.0, 1.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, -1.0f},
205*35238bceSAndroid Build Coastguard Worker             {"reflect_vec2", "reflect(vec2(1.0), vec2(1.0, 0.0)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, -1.0f},
206*35238bceSAndroid Build Coastguard Worker             {"reflect_vec3", "reflect(vec3(1.0), vec3(1.0, 0.0, 0.0)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
207*35238bceSAndroid Build Coastguard Worker              -1.0f},
208*35238bceSAndroid Build Coastguard Worker             {"reflect_vec4", "reflect(vec4(1.0), vec4(1.0, 0.0, 0.0, 0.0)).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
209*35238bceSAndroid Build Coastguard Worker              -1.0f},
210*35238bceSAndroid Build Coastguard Worker 
211*35238bceSAndroid Build Coastguard Worker             /*
212*35238bceSAndroid Build Coastguard Worker             genType refract(genType I, genType N, float eta) =>
213*35238bceSAndroid Build Coastguard Worker                 k = 1.0 - (eta^2)*(1.0-dot(N,I)^2)
214*35238bceSAndroid Build Coastguard Worker                 if k < 0 return 0.0
215*35238bceSAndroid Build Coastguard Worker                 else return eta*I - (eta*dot(N,I) + sqrt(k))*N
216*35238bceSAndroid Build Coastguard Worker             */
217*35238bceSAndroid Build Coastguard Worker             {"refract_float", "refract(1.0, 1.0, 0.5)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, -1.0f},
218*35238bceSAndroid Build Coastguard Worker             {"refract_vec2", "refract(vec2(1.0), vec2(1.0, 0.0), 0.5).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
219*35238bceSAndroid Build Coastguard Worker              -1.0f},
220*35238bceSAndroid Build Coastguard Worker             {"refract_vec3", "refract(vec3(1.0), vec3(1.0, 0.0, 0.0), 0.5).x", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
221*35238bceSAndroid Build Coastguard Worker              -1.0f},
222*35238bceSAndroid Build Coastguard Worker             {"refract_vec4", "refract(vec4(1.0), vec4(1.0, 0.0, 0.0, 0.0), 0.5).x", glu::TYPE_FLOAT, 1, 1,
223*35238bceSAndroid Build Coastguard Worker              glu::TYPE_FLOAT, -1.0f},
224*35238bceSAndroid Build Coastguard Worker         };
225*35238bceSAndroid Build Coastguard Worker 
226*35238bceSAndroid Build Coastguard Worker         addChildGroup("geometric", "Geometric", cases, DE_LENGTH_OF_ARRAY(cases));
227*35238bceSAndroid Build Coastguard Worker     }
228*35238bceSAndroid Build Coastguard Worker     // Matrix
229*35238bceSAndroid Build Coastguard Worker     {
230*35238bceSAndroid Build Coastguard Worker         const TestParams cases[] = {
231*35238bceSAndroid Build Coastguard Worker             {"compMult_mat2", "matrixCompMult(mat2(1.0), mat2(1.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
232*35238bceSAndroid Build Coastguard Worker              1.0f},
233*35238bceSAndroid Build Coastguard Worker             {"compMult_mat3", "matrixCompMult(mat3(1.0), mat3(1.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
234*35238bceSAndroid Build Coastguard Worker              1.0f},
235*35238bceSAndroid Build Coastguard Worker             {"compMult_mat4", "matrixCompMult(mat4(1.0), mat4(1.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
236*35238bceSAndroid Build Coastguard Worker              1.0f},
237*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat2", "outerProduct(vec2(3.0), vec2(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
238*35238bceSAndroid Build Coastguard Worker              9.0f},
239*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat3", "outerProduct(vec3(3.0), vec3(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
240*35238bceSAndroid Build Coastguard Worker              9.0f},
241*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat4", "outerProduct(vec4(3.0), vec4(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
242*35238bceSAndroid Build Coastguard Worker              9.0f},
243*35238bceSAndroid Build Coastguard Worker 
244*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat2x3", "outerProduct(vec3(3.0), vec2(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
245*35238bceSAndroid Build Coastguard Worker              9.0f},
246*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat3x2", "outerProduct(vec2(3.0), vec3(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
247*35238bceSAndroid Build Coastguard Worker              9.0f},
248*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat2x4", "outerProduct(vec4(3.0), vec2(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
249*35238bceSAndroid Build Coastguard Worker              9.0f},
250*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat4x2", "outerProduct(vec2(3.0), vec4(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
251*35238bceSAndroid Build Coastguard Worker              9.0f},
252*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat3x4", "outerProduct(vec4(3.0), vec3(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
253*35238bceSAndroid Build Coastguard Worker              9.0f},
254*35238bceSAndroid Build Coastguard Worker             {"outerProd_mat4x3", "outerProduct(vec3(3.0), vec4(3.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT,
255*35238bceSAndroid Build Coastguard Worker              9.0f},
256*35238bceSAndroid Build Coastguard Worker 
257*35238bceSAndroid Build Coastguard Worker             {"transpose_mat2", "transpose(mat2(2.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.0f},
258*35238bceSAndroid Build Coastguard Worker             {"transpose_mat3", "transpose(mat3(2.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.0f},
259*35238bceSAndroid Build Coastguard Worker             {"transpose_mat4", "transpose(mat4(2.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.0f},
260*35238bceSAndroid Build Coastguard Worker             {"transpose_mat3x2", "transpose(mat3x2(2.3))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.3f},
261*35238bceSAndroid Build Coastguard Worker             {"transpose_mat2x3", "transpose(mat2x3(2.3))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.3f},
262*35238bceSAndroid Build Coastguard Worker             {"transpose_mat4x2", "transpose(mat4x2(2.3))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.3f},
263*35238bceSAndroid Build Coastguard Worker             {"transpose_mat4x3", "transpose(mat4x3(2.3))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.3f},
264*35238bceSAndroid Build Coastguard Worker             {"transpose_mat2x4", "transpose(mat2x4(2.3))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.3f},
265*35238bceSAndroid Build Coastguard Worker             {"transpose_mat3x4", "transpose(mat3x4(2.3))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 2.3f},
266*35238bceSAndroid Build Coastguard Worker 
267*35238bceSAndroid Build Coastguard Worker             {"determinant_mat2", "determinant(mat2(2.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 4.0f},
268*35238bceSAndroid Build Coastguard Worker             {"determinant_mat3", "determinant(mat3(2.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 8.0f},
269*35238bceSAndroid Build Coastguard Worker             {"determinant_mat4", "determinant(mat4(2.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 16.0f},
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker             {"inverse_mat2", "inverse(mat2(2.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 0.5f},
272*35238bceSAndroid Build Coastguard Worker             {"inverse_mat3", "inverse(mat3(2.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 0.5f},
273*35238bceSAndroid Build Coastguard Worker             {"inverse_mat4", "inverse(mat4(2.0))[0][0]", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, 0.5f},
274*35238bceSAndroid Build Coastguard Worker         };
275*35238bceSAndroid Build Coastguard Worker 
276*35238bceSAndroid Build Coastguard Worker         addChildGroup("matrix", "Matrix", cases, DE_LENGTH_OF_ARRAY(cases));
277*35238bceSAndroid Build Coastguard Worker     }
278*35238bceSAndroid Build Coastguard Worker     // Vector relational
279*35238bceSAndroid Build Coastguard Worker     {
280*35238bceSAndroid Build Coastguard Worker         const TestParams cases[] = {
281*35238bceSAndroid Build Coastguard Worker             {"lessThan", "lessThan(${T} (1.0), ${T} (2.0))", glu::TYPE_FLOAT, 2, 4, glu::TYPE_BOOL, 1.0f},
282*35238bceSAndroid Build Coastguard Worker             {"lessThan", "lessThan(${T} (-1), ${T} (2))", glu::TYPE_INT, 2, 4, glu::TYPE_BOOL, 1.0f},
283*35238bceSAndroid Build Coastguard Worker             {"lessThan", "lessThan(${T} (1), ${T} (2))", glu::TYPE_UINT, 2, 4, glu::TYPE_BOOL, 1.0f},
284*35238bceSAndroid Build Coastguard Worker             {"lessThanEqual", "lessThanEqual(${T} (1.0), ${T} (1.0))", glu::TYPE_FLOAT, 2, 4, glu::TYPE_BOOL, 1.0f},
285*35238bceSAndroid Build Coastguard Worker             {"lessThanEqual", "lessThanEqual(${T} (-1), ${T} (-1))", glu::TYPE_INT, 2, 4, glu::TYPE_BOOL, 1.0f},
286*35238bceSAndroid Build Coastguard Worker             {"lessThanEqual", "lessThanEqual(${T} (1), ${T} (1))", glu::TYPE_UINT, 2, 4, glu::TYPE_BOOL, 1.0f},
287*35238bceSAndroid Build Coastguard Worker             {"greaterThan", "greaterThan(${T} (1.0), ${T} (2.0))", glu::TYPE_FLOAT, 2, 4, glu::TYPE_BOOL, 0.0f},
288*35238bceSAndroid Build Coastguard Worker             {"greaterThan", "greaterThan(${T} (-1), ${T} (2))", glu::TYPE_INT, 2, 4, glu::TYPE_BOOL, 0.0f},
289*35238bceSAndroid Build Coastguard Worker             {"greaterThan", "greaterThan(${T} (1), ${T} (2))", glu::TYPE_UINT, 2, 4, glu::TYPE_BOOL, 0.0f},
290*35238bceSAndroid Build Coastguard Worker             {"greaterThanEqual", "greaterThanEqual(${T} (1.0), ${T} (2.0))", glu::TYPE_FLOAT, 2, 4, glu::TYPE_BOOL,
291*35238bceSAndroid Build Coastguard Worker              0.0f},
292*35238bceSAndroid Build Coastguard Worker             {"greaterThanEqual", "greaterThanEqual(${T} (-1), ${T} (2))", glu::TYPE_INT, 2, 4, glu::TYPE_BOOL, 0.0f},
293*35238bceSAndroid Build Coastguard Worker             {"greaterThanEqual", "greaterThanEqual(${T} (1), ${T} (2))", glu::TYPE_UINT, 2, 4, glu::TYPE_BOOL, 0.0f},
294*35238bceSAndroid Build Coastguard Worker             {"equal", "equal(${T} (1.0), ${T} (1.2))", glu::TYPE_FLOAT, 2, 4, glu::TYPE_BOOL, 0.0f},
295*35238bceSAndroid Build Coastguard Worker             {"equal", "equal(${T} (1), ${T} (-2))", glu::TYPE_INT, 2, 4, glu::TYPE_BOOL, 0.0f},
296*35238bceSAndroid Build Coastguard Worker             {"equal", "equal(${T} (1), ${T} (2))", glu::TYPE_UINT, 2, 4, glu::TYPE_BOOL, 0.0f},
297*35238bceSAndroid Build Coastguard Worker             {"equal", "equal(${T} (true), ${T} (false))", glu::TYPE_BOOL, 2, 4, glu::TYPE_BOOL, 0.0f},
298*35238bceSAndroid Build Coastguard Worker             {"notEqual", "notEqual(${T} (1.0), ${T} (1.2))", glu::TYPE_FLOAT, 2, 4, glu::TYPE_BOOL, 1.0f},
299*35238bceSAndroid Build Coastguard Worker             {"notEqual", "notEqual(${T} (1), ${T} (-2))", glu::TYPE_INT, 2, 4, glu::TYPE_BOOL, 1.0f},
300*35238bceSAndroid Build Coastguard Worker             {"notEqual", "notEqual(${T} (1), ${T} (2))", glu::TYPE_UINT, 2, 4, glu::TYPE_BOOL, 1.0f},
301*35238bceSAndroid Build Coastguard Worker             {"notEqual", "notEqual(${T} (true), ${T} (false))", glu::TYPE_BOOL, 2, 4, glu::TYPE_BOOL, 1.0f},
302*35238bceSAndroid Build Coastguard Worker             {"any_bvec2", "any(bvec2(true, false))", glu::TYPE_BOOL, 1, 1, glu::TYPE_BOOL, 1.0f},
303*35238bceSAndroid Build Coastguard Worker             {"any_bvec3", "any(bvec3(true, false, false))", glu::TYPE_BOOL, 1, 1, glu::TYPE_BOOL, 1.0f},
304*35238bceSAndroid Build Coastguard Worker             {"any_bvec4", "any(bvec4(true, false, false, false))", glu::TYPE_BOOL, 1, 1, glu::TYPE_BOOL, 1.0f},
305*35238bceSAndroid Build Coastguard Worker             {"all_bvec2", "all(bvec2(true, false))", glu::TYPE_BOOL, 1, 1, glu::TYPE_BOOL, 0.0f},
306*35238bceSAndroid Build Coastguard Worker             {"all_bvec3", "all(bvec3(true, false, false))", glu::TYPE_BOOL, 1, 1, glu::TYPE_BOOL, 0.0f},
307*35238bceSAndroid Build Coastguard Worker             {"all_bvec4", "all(bvec4(true, false, false, false))", glu::TYPE_BOOL, 1, 1, glu::TYPE_BOOL, 0.0f},
308*35238bceSAndroid Build Coastguard Worker             {"not", "not(${T} (false))", glu::TYPE_BOOL, 2, 4, glu::TYPE_BOOL, 1.0f},
309*35238bceSAndroid Build Coastguard Worker         };
310*35238bceSAndroid Build Coastguard Worker 
311*35238bceSAndroid Build Coastguard Worker         addChildGroup("vector_relational", "Vector relational", cases, DE_LENGTH_OF_ARRAY(cases));
312*35238bceSAndroid Build Coastguard Worker     }
313*35238bceSAndroid Build Coastguard Worker     // Fragment processing (must return zero when used in initilizer with constexpr arguement)
314*35238bceSAndroid Build Coastguard Worker     {
315*35238bceSAndroid Build Coastguard Worker         const TestParams cases[] = {
316*35238bceSAndroid Build Coastguard Worker             {"dFdx", "dFdx(${T} (123.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 0.0},
317*35238bceSAndroid Build Coastguard Worker             {"dFdy", "dFdx(${T} (234.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 0.0},
318*35238bceSAndroid Build Coastguard Worker             {"fwidth", "fwidth(${T} (345.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, 0.0},
319*35238bceSAndroid Build Coastguard Worker         };
320*35238bceSAndroid Build Coastguard Worker 
321*35238bceSAndroid Build Coastguard Worker         const std::vector<tcu::TestNode *> children =
322*35238bceSAndroid Build Coastguard Worker             createTests(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), cases,
323*35238bceSAndroid Build Coastguard Worker                         DE_LENGTH_OF_ARRAY(cases), glu::GLSL_VERSION_300_ES, SHADER_FRAGMENT);
324*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *group = new tcu::TestCaseGroup(m_testCtx, "fragment_processing", "Fragment processing");
325*35238bceSAndroid Build Coastguard Worker 
326*35238bceSAndroid Build Coastguard Worker         addChild(group);
327*35238bceSAndroid Build Coastguard Worker 
328*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < (int)children.size(); i++)
329*35238bceSAndroid Build Coastguard Worker             group->addChild(children[i]);
330*35238bceSAndroid Build Coastguard Worker     }
331*35238bceSAndroid Build Coastguard Worker }
332*35238bceSAndroid Build Coastguard Worker 
333*35238bceSAndroid Build Coastguard Worker // all
ShaderConstExprTests(Context & context)334*35238bceSAndroid Build Coastguard Worker ShaderConstExprTests::ShaderConstExprTests(Context &context)
335*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "constant_expressions", "Constant expressions")
336*35238bceSAndroid Build Coastguard Worker {
337*35238bceSAndroid Build Coastguard Worker }
338*35238bceSAndroid Build Coastguard Worker 
~ShaderConstExprTests(void)339*35238bceSAndroid Build Coastguard Worker ShaderConstExprTests::~ShaderConstExprTests(void)
340*35238bceSAndroid Build Coastguard Worker {
341*35238bceSAndroid Build Coastguard Worker }
342*35238bceSAndroid Build Coastguard Worker 
init(void)343*35238bceSAndroid Build Coastguard Worker void ShaderConstExprTests::init(void)
344*35238bceSAndroid Build Coastguard Worker {
345*35238bceSAndroid Build Coastguard Worker     const std::vector<tcu::TestNode *> children =
346*35238bceSAndroid Build Coastguard Worker         gls::ShaderLibrary(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo())
347*35238bceSAndroid Build Coastguard Worker             .loadShaderFile("shaders/constant_expressions.test");
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < (int)children.size(); i++)
350*35238bceSAndroid Build Coastguard Worker         addChild(children[i]);
351*35238bceSAndroid Build Coastguard Worker 
352*35238bceSAndroid Build Coastguard Worker     addChild(new ShaderConstExprBuiltinTests(m_context));
353*35238bceSAndroid Build Coastguard Worker }
354*35238bceSAndroid Build Coastguard Worker 
355*35238bceSAndroid Build Coastguard Worker } // namespace Functional
356*35238bceSAndroid Build Coastguard Worker } // namespace gles3
357*35238bceSAndroid Build Coastguard Worker } // namespace deqp
358