blob: b01aad83d6c71f671fe2a5658e05a3e452cacf45 [file] [log] [blame]
ethannicholasf789b382016-08-03 12:43:36 -07001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkSLCompiler.h"
9
10#include "Test.h"
11
Greg Daniel792d0f12016-11-20 14:53:35 +000012#if SKIA_SUPPORT_GPU
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050013
14static void test(skiatest::Reporter* r, const char* src, const GrGLSLCaps& caps,
15 const char* expected) {
ethannicholasf789b382016-08-03 12:43:36 -070016 SkSL::Compiler compiler;
Greg Daniel792d0f12016-11-20 14:53:35 +000017 std::string output;
18 bool result = compiler.toGLSL(SkSL::Program::kFragment_Kind, src, caps, &output);
ethannicholasf789b382016-08-03 12:43:36 -070019 if (!result) {
20 SkDebugf("Unexpected error compiling %s\n%s", src, compiler.errorText().c_str());
21 }
22 REPORTER_ASSERT(r, result);
23 if (result) {
Greg Daniel792d0f12016-11-20 14:53:35 +000024 if (output != expected) {
ethannicholasf789b382016-08-03 12:43:36 -070025 SkDebugf("GLSL MISMATCH:\nsource:\n%s\n\nexpected:\n'%s'\n\nreceived:\n'%s'", src,
26 expected, output.c_str());
27 }
Greg Daniel792d0f12016-11-20 14:53:35 +000028 REPORTER_ASSERT(r, output == expected);
ethannicholasf789b382016-08-03 12:43:36 -070029 }
30}
31
32DEF_TEST(SkSLHelloWorld, r) {
ethannicholasf789b382016-08-03 12:43:36 -070033 test(r,
ethannicholas5961bc92016-10-12 06:39:56 -070034 "void main() { sk_FragColor = vec4(0.75); }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050035 *SkSL::GLSLCapsFactory::Default(),
ethannicholasf789b382016-08-03 12:43:36 -070036 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050037 "out vec4 sk_FragColor;\n"
ethannicholasf789b382016-08-03 12:43:36 -070038 "void main() {\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050039 " sk_FragColor = vec4(0.75);\n"
ethannicholasf789b382016-08-03 12:43:36 -070040 "}\n");
41}
42
43DEF_TEST(SkSLControl, r) {
ethannicholasf789b382016-08-03 12:43:36 -070044 test(r,
ethannicholasf789b382016-08-03 12:43:36 -070045 "void main() {"
ethannicholas08a92112016-11-09 13:26:45 -080046 "if (sqrt(2) > 5) { sk_FragColor = vec4(0.75); } else { discard; }"
ethannicholasf789b382016-08-03 12:43:36 -070047 "int i = 0;"
ethannicholas5961bc92016-10-12 06:39:56 -070048 "while (i < 10) sk_FragColor *= 0.5;"
Greg Daniel792d0f12016-11-20 14:53:35 +000049 "do { sk_FragColor += 0.01; } while (sk_FragColor.x < 0.7);"
ethannicholasf789b382016-08-03 12:43:36 -070050 "for (int i = 0; i < 10; i++) {"
51 "if (i % 0 == 1) break; else continue;"
52 "}"
53 "return;"
54 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050055 *SkSL::GLSLCapsFactory::Default(),
ethannicholasf789b382016-08-03 12:43:36 -070056 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050057 "out vec4 sk_FragColor;\n"
ethannicholasf789b382016-08-03 12:43:36 -070058 "void main() {\n"
ethannicholas08a92112016-11-09 13:26:45 -080059 " if (sqrt(2.0) > 5.0) {\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050060 " sk_FragColor = vec4(0.75);\n"
ethannicholasf789b382016-08-03 12:43:36 -070061 " } else {\n"
62 " discard;\n"
63 " }\n"
64 " int i = 0;\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050065 " while (i < 10) sk_FragColor *= 0.5;\n"
ethannicholasf789b382016-08-03 12:43:36 -070066 " do {\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050067 " sk_FragColor += 0.01;\n"
Greg Daniel792d0f12016-11-20 14:53:35 +000068 " } while (sk_FragColor.x < 0.7);\n"
ethannicholasf789b382016-08-03 12:43:36 -070069 " for (int i = 0;i < 10; i++) {\n"
70 " if (i % 0 == 1) break; else continue;\n"
71 " }\n"
72 " return;\n"
73 "}\n");
74}
75
76DEF_TEST(SkSLFunctions, r) {
ethannicholasf789b382016-08-03 12:43:36 -070077 test(r,
ethannicholasf789b382016-08-03 12:43:36 -070078 "float foo(float v[2]) { return v[0] * v[1]; }"
79 "void bar(inout float x) { float y[2], z; y[0] = x; y[1] = x * 2; z = foo(y); x = z; }"
ethannicholas5961bc92016-10-12 06:39:56 -070080 "void main() { float x = 10; bar(x); sk_FragColor = vec4(x); }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050081 *SkSL::GLSLCapsFactory::Default(),
ethannicholasf789b382016-08-03 12:43:36 -070082 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050083 "out vec4 sk_FragColor;\n"
ethannicholas5961bc92016-10-12 06:39:56 -070084 "float foo(in float v[2]) {\n"
ethannicholasf789b382016-08-03 12:43:36 -070085 " return v[0] * v[1];\n"
86 "}\n"
87 "void bar(inout float x) {\n"
88 " float y[2], z;\n"
89 " y[0] = x;\n"
ethannicholas5961bc92016-10-12 06:39:56 -070090 " y[1] = x * 2.0;\n"
ethannicholasf789b382016-08-03 12:43:36 -070091 " z = foo(y);\n"
92 " x = z;\n"
93 "}\n"
94 "void main() {\n"
ethannicholas5961bc92016-10-12 06:39:56 -070095 " float x = 10.0;\n"
ethannicholasf789b382016-08-03 12:43:36 -070096 " bar(x);\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -050097 " sk_FragColor = vec4(x);\n"
ethannicholasf789b382016-08-03 12:43:36 -070098 "}\n");
99}
100
101DEF_TEST(SkSLOperators, r) {
ethannicholasf789b382016-08-03 12:43:36 -0700102 test(r,
103 "void main() {"
104 "float x = 1, y = 2;"
105 "int z = 3;"
106 "x = x + y * z * x * (y - z);"
107 "y = x / y / z;"
108 "z = (z / 2 % 3 << 4) >> 2 << 1;"
ethannicholas08a92112016-11-09 13:26:45 -0800109 "bool b = (x > 4) == x < 2 || 2 >= sqrt(2) && y <= z;"
ethannicholasf789b382016-08-03 12:43:36 -0700110 "x += 12;"
111 "x -= 12;"
112 "x *= y /= z = 10;"
113 "b ||= false;"
114 "b &&= true;"
115 "b ^^= false;"
116 "z |= 0;"
117 "z &= -1;"
118 "z ^= 0;"
119 "z >>= 2;"
120 "z <<= 4;"
121 "z %= 5;"
122 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500123 *SkSL::GLSLCapsFactory::Default(),
ethannicholasf789b382016-08-03 12:43:36 -0700124 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500125 "out vec4 sk_FragColor;\n"
ethannicholasf789b382016-08-03 12:43:36 -0700126 "void main() {\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700127 " float x = 1.0, y = 2.0;\n"
ethannicholasf789b382016-08-03 12:43:36 -0700128 " int z = 3;\n"
129 " x = x + ((y * float(z)) * x) * (y - float(z));\n"
130 " y = (x / y) / float(z);\n"
131 " z = (((z / 2) % 3 << 4) >> 2) << 1;\n"
ethannicholas08a92112016-11-09 13:26:45 -0800132 " bool b = x > 4.0 == x < 2.0 || 2.0 >= sqrt(2.0) && y <= float(z);\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700133 " x += 12.0;\n"
134 " x -= 12.0;\n"
ethannicholasf789b382016-08-03 12:43:36 -0700135 " x *= (y /= float(z = 10));\n"
136 " b ||= false;\n"
137 " b &&= true;\n"
138 " b ^^= false;\n"
139 " z |= 0;\n"
140 " z &= -1;\n"
141 " z ^= 0;\n"
142 " z >>= 2;\n"
143 " z <<= 4;\n"
144 " z %= 5;\n"
145 "}\n");
146}
147
148DEF_TEST(SkSLMatrices, r) {
ethannicholasf789b382016-08-03 12:43:36 -0700149 test(r,
150 "void main() {"
151 "mat2x4 x = mat2x4(1);"
152 "mat3x2 y = mat3x2(1, 0, 0, 1, vec2(2, 2));"
153 "mat3x4 z = x * y;"
154 "vec3 v1 = mat3(1) * vec3(1);"
155 "vec3 v2 = vec3(1) * mat3(1);"
156 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500157 *SkSL::GLSLCapsFactory::Default(),
ethannicholasf789b382016-08-03 12:43:36 -0700158 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500159 "out vec4 sk_FragColor;\n"
ethannicholasf789b382016-08-03 12:43:36 -0700160 "void main() {\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700161 " mat2x4 x = mat2x4(1.0);\n"
162 " mat3x2 y = mat3x2(1.0, 0.0, 0.0, 1.0, vec2(2.0, 2.0));\n"
ethannicholasf789b382016-08-03 12:43:36 -0700163 " mat3x4 z = x * y;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700164 " vec3 v1 = mat3(1.0) * vec3(1.0);\n"
165 " vec3 v2 = vec3(1.0) * mat3(1.0);\n"
ethannicholasf789b382016-08-03 12:43:36 -0700166 "}\n");
167}
168
169DEF_TEST(SkSLInterfaceBlock, r) {
ethannicholasf789b382016-08-03 12:43:36 -0700170 test(r,
171 "uniform testBlock {"
172 "float x;"
173 "float y[2];"
174 "layout(binding=12) mat3x2 z;"
175 "bool w;"
176 "};"
177 "void main() {"
178 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500179 *SkSL::GLSLCapsFactory::Default(),
ethannicholasf789b382016-08-03 12:43:36 -0700180 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500181 "out vec4 sk_FragColor;\n"
ethannicholasf789b382016-08-03 12:43:36 -0700182 "uniform testBlock {\n"
183 " float x;\n"
184 " float[2] y;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700185 " layout (binding = 12) mat3x2 z;\n"
ethannicholasf789b382016-08-03 12:43:36 -0700186 " bool w;\n"
187 "};\n"
188 "void main() {\n"
189 "}\n");
190}
191
192DEF_TEST(SkSLStructs, r) {
ethannicholasf789b382016-08-03 12:43:36 -0700193 test(r,
194 "struct A {"
195 "int x;"
196 "int y;"
197 "} a1, a2;"
198 "A a3;"
199 "struct B {"
200 "float x;"
201 "float y[2];"
202 "layout(binding=1) A z;"
203 "};"
204 "B b1, b2, b3;"
205 "void main() {"
206 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500207 *SkSL::GLSLCapsFactory::Default(),
ethannicholasf789b382016-08-03 12:43:36 -0700208 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500209 "out vec4 sk_FragColor;\n"
ethannicholasf789b382016-08-03 12:43:36 -0700210 "struct A {\n"
211 " int x;\n"
212 " int y;\n"
213 "}\n"
214 " a1, a2;\n"
215 "A a3;\n"
216 "struct B {\n"
217 " float x;\n"
218 " float[2] y;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700219 " layout (binding = 1) A z;\n"
ethannicholasf789b382016-08-03 12:43:36 -0700220 "}\n"
221 " b1, b2, b3;\n"
222 "void main() {\n"
223 "}\n");
ethannicholas5961bc92016-10-12 06:39:56 -0700224}
ethannicholasf789b382016-08-03 12:43:36 -0700225
ethannicholas5961bc92016-10-12 06:39:56 -0700226DEF_TEST(SkSLVersion, r) {
ethannicholas5961bc92016-10-12 06:39:56 -0700227 test(r,
228 "in float test; void main() { sk_FragColor = vec4(0.75); }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500229 *SkSL::GLSLCapsFactory::Version450Core(),
ethannicholas5961bc92016-10-12 06:39:56 -0700230 "#version 450 core\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500231 "out vec4 sk_FragColor;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700232 "in float test;\n"
233 "void main() {\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500234 " sk_FragColor = vec4(0.75);\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700235 "}\n");
ethannicholas5961bc92016-10-12 06:39:56 -0700236 test(r,
237 "in float test; void main() { sk_FragColor = vec4(0.75); }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500238 *SkSL::GLSLCapsFactory::Version110(),
ethannicholas5961bc92016-10-12 06:39:56 -0700239 "#version 110\n"
240 "varying float test;\n"
241 "void main() {\n"
242 " gl_FragColor = vec4(0.75);\n"
243 "}\n");
244}
245
Leon Scroggins857cb972016-11-11 18:44:37 +0000246DEF_TEST(SkSLUsesPrecisionModifiers, r) {
Leon Scroggins857cb972016-11-11 18:44:37 +0000247 test(r,
248 "void main() { float x = 0.75; highp float y = 1; }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500249 *SkSL::GLSLCapsFactory::Default(),
Leon Scroggins857cb972016-11-11 18:44:37 +0000250 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500251 "out vec4 sk_FragColor;\n"
Leon Scroggins857cb972016-11-11 18:44:37 +0000252 "void main() {\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700253 " float x = 0.75;\n"
254 " float y = 1.0;\n"
255 "}\n");
ethannicholas5961bc92016-10-12 06:39:56 -0700256 test(r,
257 "void main() { float x = 0.75; highp float y = 1; }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500258 *SkSL::GLSLCapsFactory::UsesPrecisionModifiers(),
259 "#version 400\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700260 "precision highp float;\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500261 "out mediump vec4 sk_FragColor;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700262 "void main() {\n"
263 " float x = 0.75;\n"
264 " highp float y = 1.0;\n"
265 "}\n");
266}
267
268DEF_TEST(SkSLMinAbs, r) {
269 test(r,
270 "void main() {"
271 "float x = -5;"
272 "x = min(abs(x), 6);"
273 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500274 *SkSL::GLSLCapsFactory::Default(),
ethannicholas5961bc92016-10-12 06:39:56 -0700275 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500276 "out vec4 sk_FragColor;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700277 "void main() {\n"
278 " float x = -5.0;\n"
279 " x = min(abs(x), 6.0);\n"
280 "}\n");
281
ethannicholas5961bc92016-10-12 06:39:56 -0700282 test(r,
283 "void main() {"
284 "float x = -5.0;"
285 "x = min(abs(x), 6.0);"
286 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500287 *SkSL::GLSLCapsFactory::CannotUseMinAndAbsTogether(),
ethannicholas5961bc92016-10-12 06:39:56 -0700288 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500289 "out vec4 sk_FragColor;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700290 "void main() {\n"
291 " float minAbsHackVar0;\n"
292 " float minAbsHackVar1;\n"
293 " float x = -5.0;\n"
294 " x = ((minAbsHackVar0 = abs(x)) < (minAbsHackVar1 = 6.0) ? minAbsHackVar0 : "
295 "minAbsHackVar1);\n"
296 "}\n");
297}
298
ethannicholasad146f62016-10-14 06:40:02 -0700299DEF_TEST(SkSLNegatedAtan, r) {
300 test(r,
301 "void main() { vec2 x = vec2(1, 2); float y = atan(x.x, -(2 * x.y)); }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500302 *SkSL::GLSLCapsFactory::Default(),
ethannicholasad146f62016-10-14 06:40:02 -0700303 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500304 "out vec4 sk_FragColor;\n"
ethannicholasad146f62016-10-14 06:40:02 -0700305 "void main() {\n"
306 " vec2 x = vec2(1.0, 2.0);\n"
307 " float y = atan(x.x, -(2.0 * x.y));\n"
308 "}\n");
ethannicholasad146f62016-10-14 06:40:02 -0700309 test(r,
310 "void main() { vec2 x = vec2(1, 2); float y = atan(x.x, -(2 * x.y)); }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500311 *SkSL::GLSLCapsFactory::MustForceNegatedAtanParamToFloat(),
ethannicholasad146f62016-10-14 06:40:02 -0700312 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500313 "out vec4 sk_FragColor;\n"
ethannicholasad146f62016-10-14 06:40:02 -0700314 "void main() {\n"
315 " vec2 x = vec2(1.0, 2.0);\n"
316 " float y = atan(x.x, -1.0 * (2.0 * x.y));\n"
317 "}\n");
318}
319
ethannicholas5961bc92016-10-12 06:39:56 -0700320DEF_TEST(SkSLModifiersDeclaration, r) {
321 test(r,
322 "layout(blend_support_all_equations) out;"
323 "void main() { }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500324 *SkSL::GLSLCapsFactory::Default(),
ethannicholas5961bc92016-10-12 06:39:56 -0700325 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500326 "out vec4 sk_FragColor;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700327 "layout (blend_support_all_equations) out ;\n"
328 "void main() {\n"
329 "}\n");
330}
331
332DEF_TEST(SkSLHex, r) {
333 test(r,
334 "void main() {"
335 "int i1 = 0x0;"
336 "int i2 = 0x1234abcd;"
337 "int i3 = 0x7fffffff;"
338 "int i4 = 0xffffffff;"
339 "int i5 = -0xbeef;"
340 "uint u1 = 0x0;"
341 "uint u2 = 0x1234abcd;"
342 "uint u3 = 0x7fffffff;"
343 "uint u4 = 0xffffffff;"
344 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500345 *SkSL::GLSLCapsFactory::Default(),
ethannicholas5961bc92016-10-12 06:39:56 -0700346 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500347 "out vec4 sk_FragColor;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700348 "void main() {\n"
349 " int i1 = 0;\n"
350 " int i2 = 305441741;\n"
351 " int i3 = 2147483647;\n"
352 " int i4 = -1;\n"
353 " int i5 = -48879;\n"
354 " uint u1 = 0u;\n"
355 " uint u2 = 305441741u;\n"
356 " uint u3 = 2147483647u;\n"
357 " uint u4 = 4294967295u;\n"
358 "}\n");
359}
360
Ethan Nicholas4578a8e2016-11-01 11:57:42 -0400361DEF_TEST(SkSLVectorConstructors, r) {
362 test(r,
363 "vec2 v1 = vec2(1);"
364 "vec2 v2 = vec2(1, 2);"
365 "vec2 v3 = vec2(vec2(1));"
366 "vec2 v4 = vec2(vec3(1));"
367 "vec3 v5 = vec3(vec2(1), 1.0);"
368 "vec3 v6 = vec3(vec4(1, 2, 3, 4));"
369 "ivec2 v7 = ivec2(1);"
370 "ivec2 v8 = ivec2(vec2(1, 2));"
371 "vec2 v9 = vec2(ivec2(1, 2));",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500372 *SkSL::GLSLCapsFactory::Default(),
Ethan Nicholas4578a8e2016-11-01 11:57:42 -0400373 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500374 "out vec4 sk_FragColor;\n"
Ethan Nicholas4578a8e2016-11-01 11:57:42 -0400375 "vec2 v1 = vec2(1.0);\n"
376 "vec2 v2 = vec2(1.0, 2.0);\n"
377 "vec2 v3 = vec2(1.0);\n"
378 "vec2 v4 = vec2(vec3(1.0));\n"
379 "vec3 v5 = vec3(vec2(1.0), 1.0);\n"
380 "vec3 v6 = vec3(vec4(1.0, 2.0, 3.0, 4.0));\n"
381 "ivec2 v7 = ivec2(1);\n"
382 "ivec2 v8 = ivec2(vec2(1.0, 2.0));\n"
383 "vec2 v9 = vec2(ivec2(1, 2));\n");
384}
385
ethannicholas5961bc92016-10-12 06:39:56 -0700386DEF_TEST(SkSLArrayConstructors, r) {
387 test(r,
388 "float test1[] = float[](1, 2, 3, 4);"
389 "vec2 test2[] = vec2[](vec2(1, 2), vec2(3, 4));"
390 "mat4 test3[] = mat4[]();",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500391 *SkSL::GLSLCapsFactory::Default(),
ethannicholas5961bc92016-10-12 06:39:56 -0700392 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500393 "out vec4 sk_FragColor;\n"
ethannicholas5961bc92016-10-12 06:39:56 -0700394 "float test1[] = float[](1.0, 2.0, 3.0, 4.0);\n"
395 "vec2 test2[] = vec2[](vec2(1.0, 2.0), vec2(3.0, 4.0));\n"
396 "mat4 test3[] = mat4[]();\n");
ethannicholasf789b382016-08-03 12:43:36 -0700397}
ethannicholasddb37d62016-10-20 09:54:00 -0700398
399DEF_TEST(SkSLDerivatives, r) {
400 test(r,
401 "void main() { float x = dFdx(1); }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500402 *SkSL::GLSLCapsFactory::Default(),
ethannicholasddb37d62016-10-20 09:54:00 -0700403 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500404 "out vec4 sk_FragColor;\n"
ethannicholasddb37d62016-10-20 09:54:00 -0700405 "void main() {\n"
406 " float x = dFdx(1.0);\n"
407 "}\n");
ethannicholasddb37d62016-10-20 09:54:00 -0700408 test(r,
409 "void main() { float x = 1; }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500410 *SkSL::GLSLCapsFactory::ShaderDerivativeExtensionString(),
ethannicholasddb37d62016-10-20 09:54:00 -0700411 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500412 "out vec4 sk_FragColor;\n"
ethannicholasddb37d62016-10-20 09:54:00 -0700413 "void main() {\n"
414 " float x = 1.0;\n"
415 "}\n");
416 test(r,
417 "void main() { float x = dFdx(1); }",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500418 *SkSL::GLSLCapsFactory::ShaderDerivativeExtensionString(),
ethannicholasddb37d62016-10-20 09:54:00 -0700419 "#version 400\n"
420 "#extension GL_OES_standard_derivatives : require\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500421 "out vec4 sk_FragColor;\n"
ethannicholasddb37d62016-10-20 09:54:00 -0700422 "void main() {\n"
423 " float x = dFdx(1.0);\n"
424 "}\n");
425}
ethannicholas08a92112016-11-09 13:26:45 -0800426
427DEF_TEST(SkSLConstantFolding, r) {
428 test(r,
429 "void main() {"
430 "float f_add = 32 + 2;"
431 "float f_sub = 32 - 2;"
432 "float f_mul = 32 * 2;"
433 "float f_div = 32 / 2;"
434 "float mixed = (12 > 2.0) ? (10 * 2 / 5 + 18 - 3) : 0;"
435 "int i_add = 32 + 2;"
436 "int i_sub = 32 - 2;"
437 "int i_mul = 32 * 2;"
438 "int i_div = 32 / 2;"
439 "int i_or = 12 | 6;"
440 "int i_and = 254 & 7;"
441 "int i_xor = 2 ^ 7;"
442 "int i_shl = 1 << 4;"
443 "int i_shr = 128 >> 2;"
444 "bool gt_it = 6 > 5;"
445 "bool gt_if = 6 > 6;"
446 "bool gt_ft = 6.0 > 5.0;"
447 "bool gt_ff = 6.0 > 6.0;"
448 "bool gte_it = 6 >= 6;"
449 "bool gte_if = 6 >= 7;"
450 "bool gte_ft = 6.0 >= 6.0;"
451 "bool gte_ff = 6.0 >= 7.0;"
452 "bool lte_it = 6 <= 6;"
453 "bool lte_if = 6 <= 5;"
454 "bool lte_ft = 6.0 <= 6.0;"
455 "bool lte_ff = 6.0 <= 5.0;"
456 "bool or_t = 1 == 1 || 2 == 8;"
457 "bool or_f = 1 > 1 || 2 == 8;"
458 "bool and_t = 1 == 1 && 2 <= 8;"
459 "bool and_f = 1 == 2 && 2 == 8;"
460 "bool xor_t = 1 == 1 ^^ 1 != 1;"
461 "bool xor_f = 1 == 1 ^^ 1 == 1;"
462 "int ternary = 10 > 5 ? 10 : 5;"
463 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500464 *SkSL::GLSLCapsFactory::Default(),
ethannicholas08a92112016-11-09 13:26:45 -0800465 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500466 "out vec4 sk_FragColor;\n"
ethannicholas08a92112016-11-09 13:26:45 -0800467 "void main() {\n"
468 " float f_add = 34.0;\n"
469 " float f_sub = 30.0;\n"
470 " float f_mul = 64.0;\n"
471 " float f_div = 16.0;\n"
472 " float mixed = 19.0;\n"
473 " int i_add = 34;\n"
474 " int i_sub = 30;\n"
475 " int i_mul = 64;\n"
476 " int i_div = 16;\n"
477 " int i_or = 14;\n"
478 " int i_and = 6;\n"
479 " int i_xor = 5;\n"
480 " int i_shl = 16;\n"
481 " int i_shr = 32;\n"
482 " bool gt_it = true;\n"
483 " bool gt_if = false;\n"
484 " bool gt_ft = true;\n"
485 " bool gt_ff = false;\n"
486 " bool gte_it = true;\n"
487 " bool gte_if = false;\n"
488 " bool gte_ft = true;\n"
489 " bool gte_ff = false;\n"
490 " bool lte_it = true;\n"
491 " bool lte_if = false;\n"
492 " bool lte_ft = true;\n"
493 " bool lte_ff = false;\n"
494 " bool or_t = true;\n"
495 " bool or_f = false;\n"
496 " bool and_t = true;\n"
497 " bool and_f = false;\n"
498 " bool xor_t = true;\n"
499 " bool xor_f = false;\n"
500 " int ternary = 10;\n"
501 "}\n");
502}
503
504DEF_TEST(SkSLStaticIf, r) {
505 test(r,
506 "void main() {"
507 "int x;"
508 "if (true) x = 1;"
509 "if (2 > 1) x = 2; else x = 3;"
510 "if (1 > 2) x = 4; else x = 5;"
511 "if (false) x = 6;"
512 "}",
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500513 *SkSL::GLSLCapsFactory::Default(),
ethannicholas08a92112016-11-09 13:26:45 -0800514 "#version 400\n"
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500515 "out vec4 sk_FragColor;\n"
ethannicholas08a92112016-11-09 13:26:45 -0800516 "void main() {\n"
517 " int x;\n"
518 " x = 1;\n"
519 " x = 2;\n"
520 " x = 5;\n"
521 " {\n"
522 " }\n"
523 "}\n");
524}
Ethan Nicholas7ef4b742016-11-11 15:16:46 -0500525
526#endif