1 /*
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
12 #if SK_SUPPORT_GPU
13
test(skiatest::Reporter * r,const char * src,const SkSL::Program::Settings & settings,const char * expected,SkSL::Program::Inputs * inputs,SkSL::Program::Kind kind=SkSL::Program::kFragment_Kind)14 static void test(skiatest::Reporter* r, const char* src, const SkSL::Program::Settings& settings,
15 const char* expected, SkSL::Program::Inputs* inputs,
16 SkSL::Program::Kind kind = SkSL::Program::kFragment_Kind) {
17 SkSL::Compiler compiler;
18 SkString output;
19 std::unique_ptr<SkSL::Program> program = compiler.convertProgram(kind, SkString(src), settings);
20 if (!program) {
21 SkDebugf("Unexpected error compiling %s\n%s", src, compiler.errorText().c_str());
22 }
23 REPORTER_ASSERT(r, program);
24 *inputs = program->fInputs;
25 REPORTER_ASSERT(r, compiler.toGLSL(*program, &output));
26 if (program) {
27 SkString skExpected(expected);
28 if (output != skExpected) {
29 SkDebugf("GLSL MISMATCH:\nsource:\n%s\n\nexpected:\n'%s'\n\nreceived:\n'%s'", src,
30 expected, output.c_str());
31 }
32 REPORTER_ASSERT(r, output == skExpected);
33 }
34 }
35
test(skiatest::Reporter * r,const char * src,const GrShaderCaps & caps,const char * expected,SkSL::Program::Kind kind=SkSL::Program::kFragment_Kind)36 static void test(skiatest::Reporter* r, const char* src, const GrShaderCaps& caps,
37 const char* expected, SkSL::Program::Kind kind = SkSL::Program::kFragment_Kind) {
38 SkSL::Program::Settings settings;
39 settings.fCaps = ∩︀
40 SkSL::Program::Inputs inputs;
41 test(r, src, settings, expected, &inputs, kind);
42 }
43
DEF_TEST(SkSLHelloWorld,r)44 DEF_TEST(SkSLHelloWorld, r) {
45 test(r,
46 "void main() { sk_FragColor = vec4(0.75); }",
47 *SkSL::ShaderCapsFactory::Default(),
48 "#version 400\n"
49 "out vec4 sk_FragColor;\n"
50 "void main() {\n"
51 " sk_FragColor = vec4(0.75);\n"
52 "}\n");
53 }
54
DEF_TEST(SkSLControl,r)55 DEF_TEST(SkSLControl, r) {
56 test(r,
57 "void main() {"
58 "if (sqrt(2) > 5) { sk_FragColor = vec4(0.75); } else { discard; }"
59 "int i = 0;"
60 "while (i < 10) sk_FragColor *= 0.5;"
61 "do { sk_FragColor += 0.01; } while (sk_FragColor.x < 0.75);"
62 "for (int i = 0; i < 10; i++) {"
63 "if (i % 2 == 1) break; else continue;"
64 "}"
65 "return;"
66 "}",
67 *SkSL::ShaderCapsFactory::Default(),
68 "#version 400\n"
69 "out vec4 sk_FragColor;\n"
70 "void main() {\n"
71 " if (sqrt(2.0) > 5.0) {\n"
72 " sk_FragColor = vec4(0.75);\n"
73 " } else {\n"
74 " discard;\n"
75 " }\n"
76 " int i = 0;\n"
77 " while (true) sk_FragColor *= 0.5;\n"
78 " do {\n"
79 " sk_FragColor += 0.01;\n"
80 " } while (sk_FragColor.x < 0.75);\n"
81 " for (int i = 0;i < 10; i++) {\n"
82 " if (i % 2 == 1) break; else continue;\n"
83 " }\n"
84 " return;\n"
85 "}\n");
86 }
87
DEF_TEST(SkSLFunctions,r)88 DEF_TEST(SkSLFunctions, r) {
89 test(r,
90 "float foo(float v[2]) { return v[0] * v[1]; }"
91 "void bar(inout float x) { float y[2], z; y[0] = x; y[1] = x * 2; z = foo(y); x = z; }"
92 "void main() { float x = 10; bar(x); sk_FragColor = vec4(x); }",
93 *SkSL::ShaderCapsFactory::Default(),
94 "#version 400\n"
95 "out vec4 sk_FragColor;\n"
96 "float foo(in float v[2]) {\n"
97 " return v[0] * v[1];\n"
98 "}\n"
99 "void bar(inout float x) {\n"
100 " float y[2], z;\n"
101 " y[0] = x;\n"
102 " y[1] = x * 2.0;\n"
103 " z = foo(y);\n"
104 " x = z;\n"
105 "}\n"
106 "void main() {\n"
107 " float x = 10.0;\n"
108 " bar(10.0);\n"
109 " sk_FragColor = vec4(10.0);\n"
110 "}\n");
111 }
112
DEF_TEST(SkSLOperators,r)113 DEF_TEST(SkSLOperators, r) {
114 test(r,
115 "void main() {"
116 "float x = 1, y = 2;"
117 "int z = 3;"
118 "x = x - x + y * z * x * (y - z);"
119 "y = x / y / z;"
120 "z = (z / 2 % 3 << 4) >> 2 << 1;"
121 "bool b = (x > 4) == x < 2 || 2 >= sqrt(2) && y <= z;"
122 "x += 12;"
123 "x -= 12;"
124 "x *= y /= z = 10;"
125 "b ||= false;"
126 "b &&= true;"
127 "b ^^= false;"
128 "z |= 0;"
129 "z &= -1;"
130 "z ^= 0;"
131 "z >>= 2;"
132 "z <<= 4;"
133 "z %= 5;"
134 "}",
135 *SkSL::ShaderCapsFactory::Default(),
136 "#version 400\n"
137 "out vec4 sk_FragColor;\n"
138 "void main() {\n"
139 " float x = 1.0, y = 2.0;\n"
140 " int z = 3;\n"
141 " x = -6.0;\n"
142 " y = -1.0;\n"
143 " z = 8;\n"
144 " bool b = false == true || 2.0 >= sqrt(2.0) && true;\n"
145 " x += 12.0;\n"
146 " x -= 12.0;\n"
147 " x *= (y /= float(z = 10));\n"
148 " b ||= false;\n"
149 " b &&= true;\n"
150 " b ^^= false;\n"
151 " z |= 0;\n"
152 " z &= -1;\n"
153 " z ^= 0;\n"
154 " z >>= 2;\n"
155 " z <<= 4;\n"
156 " z %= 5;\n"
157 "}\n");
158 }
159
DEF_TEST(SkSLMatrices,r)160 DEF_TEST(SkSLMatrices, r) {
161 test(r,
162 "void main() {"
163 "mat2x4 x = mat2x4(1);"
164 "mat3x2 y = mat3x2(1, 0, 0, 1, vec2(2, 2));"
165 "mat3x4 z = x * y;"
166 "vec3 v1 = mat3(1) * vec3(1);"
167 "vec3 v2 = vec3(1) * mat3(1);"
168 "}",
169 *SkSL::ShaderCapsFactory::Default(),
170 "#version 400\n"
171 "out vec4 sk_FragColor;\n"
172 "void main() {\n"
173 " mat2x4 x = mat2x4(1.0);\n"
174 " mat3x2 y = mat3x2(1.0, 0.0, 0.0, 1.0, vec2(2.0, 2.0));\n"
175 " mat3x4 z = x * y;\n"
176 " vec3 v1 = mat3(1.0) * vec3(1.0);\n"
177 " vec3 v2 = vec3(1.0) * mat3(1.0);\n"
178 "}\n");
179 }
180
DEF_TEST(SkSLInterfaceBlock,r)181 DEF_TEST(SkSLInterfaceBlock, r) {
182 test(r,
183 "uniform testBlock {"
184 "float x;"
185 "float y[2];"
186 "layout(binding=12) mat3x2 z;"
187 "bool w;"
188 "};"
189 "void main() {"
190 " sk_FragColor = vec4(x, y[0], y[1], 0);"
191 "}",
192 *SkSL::ShaderCapsFactory::Default(),
193 "#version 400\n"
194 "out vec4 sk_FragColor;\n"
195 "uniform testBlock {\n"
196 " float x;\n"
197 " float[2] y;\n"
198 " layout (binding = 12) mat3x2 z;\n"
199 " bool w;\n"
200 "};\n"
201 "void main() {\n"
202 " sk_FragColor = vec4(x, y[0], y[1], 0.0);\n"
203 "}\n");
204 test(r,
205 "uniform testBlock {"
206 "float x;"
207 "} test;"
208 "void main() {"
209 " sk_FragColor = vec4(test.x);"
210 "}",
211 *SkSL::ShaderCapsFactory::Default(),
212 "#version 400\n"
213 "out vec4 sk_FragColor;\n"
214 "uniform testBlock {\n"
215 " float x;\n"
216 "} test;\n"
217 "void main() {\n"
218 " sk_FragColor = vec4(test.x);\n"
219 "}\n");
220 test(r,
221 "uniform testBlock {"
222 "float x;"
223 "} test[2];"
224 "void main() {"
225 " sk_FragColor = vec4(test[1].x);"
226 "}",
227 *SkSL::ShaderCapsFactory::Default(),
228 "#version 400\n"
229 "out vec4 sk_FragColor;\n"
230 "uniform testBlock {\n"
231 " float x;\n"
232 "} test[2];\n"
233 "void main() {\n"
234 " sk_FragColor = vec4(test[1].x);\n"
235 "}\n");
236 }
237
DEF_TEST(SkSLStructs,r)238 DEF_TEST(SkSLStructs, r) {
239 test(r,
240 "struct A {"
241 "int x;"
242 "int y;"
243 "} a1, a2;"
244 "A a3;"
245 "struct B {"
246 "float x;"
247 "float y[2];"
248 "layout(binding=1) A z;"
249 "};"
250 "B b1, b2, b3;"
251 "void main() {"
252 "}",
253 *SkSL::ShaderCapsFactory::Default(),
254 "#version 400\n"
255 "out vec4 sk_FragColor;\n"
256 "struct A {\n"
257 " int x;\n"
258 " int y;\n"
259 "} a1, a2;\n"
260 "A a3;\n"
261 "struct B {\n"
262 " float x;\n"
263 " float[2] y;\n"
264 " layout (binding = 1) A z;\n"
265 "} b1, b2, b3;\n"
266 "void main() {\n"
267 "}\n");
268 }
269
DEF_TEST(SkSLVersion,r)270 DEF_TEST(SkSLVersion, r) {
271 test(r,
272 "in float test; void main() { sk_FragColor = vec4(0.75); }",
273 *SkSL::ShaderCapsFactory::Version450Core(),
274 "#version 450 core\n"
275 "out vec4 sk_FragColor;\n"
276 "in float test;\n"
277 "void main() {\n"
278 " sk_FragColor = vec4(0.75);\n"
279 "}\n");
280 test(r,
281 "in float test; void main() { sk_FragColor = vec4(0.75); }",
282 *SkSL::ShaderCapsFactory::Version110(),
283 "#version 110\n"
284 "varying float test;\n"
285 "void main() {\n"
286 " gl_FragColor = vec4(0.75);\n"
287 "}\n");
288 }
289
DEF_TEST(SkSLUsesPrecisionModifiers,r)290 DEF_TEST(SkSLUsesPrecisionModifiers, r) {
291 test(r,
292 "void main() { float x = 0.75; highp float y = 1; }",
293 *SkSL::ShaderCapsFactory::Default(),
294 "#version 400\n"
295 "out vec4 sk_FragColor;\n"
296 "void main() {\n"
297 " float x = 0.75;\n"
298 " float y = 1.0;\n"
299 "}\n");
300 test(r,
301 "void main() { float x = 0.75; highp float y = 1; }",
302 *SkSL::ShaderCapsFactory::UsesPrecisionModifiers(),
303 "#version 400\n"
304 "precision highp float;\n"
305 "out mediump vec4 sk_FragColor;\n"
306 "void main() {\n"
307 " float x = 0.75;\n"
308 " highp float y = 1.0;\n"
309 "}\n");
310 }
311
DEF_TEST(SkSLMinAbs,r)312 DEF_TEST(SkSLMinAbs, r) {
313 test(r,
314 "void main() {"
315 "float x = -5;"
316 "x = min(abs(x), 6);"
317 "}",
318 *SkSL::ShaderCapsFactory::Default(),
319 "#version 400\n"
320 "out vec4 sk_FragColor;\n"
321 "void main() {\n"
322 " float x = -5.0;\n"
323 " x = min(abs(-5.0), 6.0);\n"
324 "}\n");
325
326 test(r,
327 "void main() {"
328 "float x = -5.0;"
329 "x = min(abs(x), 6.0);"
330 "}",
331 *SkSL::ShaderCapsFactory::CannotUseMinAndAbsTogether(),
332 "#version 400\n"
333 "out vec4 sk_FragColor;\n"
334 "void main() {\n"
335 " float minAbsHackVar0;\n"
336 " float minAbsHackVar1;\n"
337 " float x = -5.0;\n"
338 " x = ((minAbsHackVar0 = abs(-5.0)) < (minAbsHackVar1 = 6.0) ? minAbsHackVar0 : "
339 "minAbsHackVar1);\n"
340 "}\n");
341 }
342
DEF_TEST(SkSLNegatedAtan,r)343 DEF_TEST(SkSLNegatedAtan, r) {
344 test(r,
345 "void main() { vec2 x = vec2(1, 2); float y = atan(x.x, -(2 * x.y)); }",
346 *SkSL::ShaderCapsFactory::Default(),
347 "#version 400\n"
348 "out vec4 sk_FragColor;\n"
349 "void main() {\n"
350 " vec2 x = vec2(1.0, 2.0);\n"
351 " float y = atan(x.x, -(2.0 * x.y));\n"
352 "}\n");
353 test(r,
354 "void main() { vec2 x = vec2(1, 2); float y = atan(x.x, -(2 * x.y)); }",
355 *SkSL::ShaderCapsFactory::MustForceNegatedAtanParamToFloat(),
356 "#version 400\n"
357 "out vec4 sk_FragColor;\n"
358 "void main() {\n"
359 " vec2 x = vec2(1.0, 2.0);\n"
360 " float y = atan(x.x, -1.0 * (2.0 * x.y));\n"
361 "}\n");
362 }
363
DEF_TEST(SkSLModifiersDeclaration,r)364 DEF_TEST(SkSLModifiersDeclaration, r) {
365 test(r,
366 "layout(blend_support_all_equations) out;"
367 "void main() { }",
368 *SkSL::ShaderCapsFactory::Default(),
369 "#version 400\n"
370 "out vec4 sk_FragColor;\n"
371 "layout (blend_support_all_equations) out ;\n"
372 "void main() {\n"
373 "}\n");
374 }
375
DEF_TEST(SkSLHex,r)376 DEF_TEST(SkSLHex, r) {
377 test(r,
378 "void main() {"
379 "int i1 = 0x0;"
380 "int i2 = 0x1234abcd;"
381 "int i3 = 0x7fffffff;"
382 "int i4 = 0xffffffff;"
383 "int i5 = -0xbeef;"
384 "uint u1 = 0x0;"
385 "uint u2 = 0x1234abcd;"
386 "uint u3 = 0x7fffffff;"
387 "uint u4 = 0xffffffff;"
388 "}",
389 *SkSL::ShaderCapsFactory::Default(),
390 "#version 400\n"
391 "out vec4 sk_FragColor;\n"
392 "void main() {\n"
393 " int i1 = 0;\n"
394 " int i2 = 305441741;\n"
395 " int i3 = 2147483647;\n"
396 " int i4 = -1;\n"
397 " int i5 = -48879;\n"
398 " uint u1 = 0u;\n"
399 " uint u2 = 305441741u;\n"
400 " uint u3 = 2147483647u;\n"
401 " uint u4 = 4294967295u;\n"
402 "}\n");
403 }
404
DEF_TEST(SkSLVectorConstructors,r)405 DEF_TEST(SkSLVectorConstructors, r) {
406 test(r,
407 "vec2 v1 = vec2(1);"
408 "vec2 v2 = vec2(1, 2);"
409 "vec2 v3 = vec2(vec2(1));"
410 "vec3 v4 = vec3(vec2(1), 1.0);"
411 "ivec2 v5 = ivec2(1);"
412 "ivec2 v6 = ivec2(vec2(1, 2));"
413 "vec2 v7 = vec2(ivec2(1, 2));",
414 *SkSL::ShaderCapsFactory::Default(),
415 "#version 400\n"
416 "out vec4 sk_FragColor;\n"
417 "vec2 v1 = vec2(1.0);\n"
418 "vec2 v2 = vec2(1.0, 2.0);\n"
419 "vec2 v3 = vec2(1.0);\n"
420 "vec3 v4 = vec3(vec2(1.0), 1.0);\n"
421 "ivec2 v5 = ivec2(1);\n"
422 "ivec2 v6 = ivec2(vec2(1.0, 2.0));\n"
423 "vec2 v7 = vec2(ivec2(1, 2));\n");
424 }
425
DEF_TEST(SkSLArrayConstructors,r)426 DEF_TEST(SkSLArrayConstructors, r) {
427 test(r,
428 "float test1[] = float[](1, 2, 3, 4);"
429 "vec2 test2[] = vec2[](vec2(1, 2), vec2(3, 4));"
430 "mat4 test3[] = mat4[]();",
431 *SkSL::ShaderCapsFactory::Default(),
432 "#version 400\n"
433 "out vec4 sk_FragColor;\n"
434 "float test1[] = float[](1.0, 2.0, 3.0, 4.0);\n"
435 "vec2 test2[] = vec2[](vec2(1.0, 2.0), vec2(3.0, 4.0));\n"
436 "mat4 test3[] = mat4[]();\n");
437 }
438
DEF_TEST(SkSLDerivatives,r)439 DEF_TEST(SkSLDerivatives, r) {
440 test(r,
441 "void main() { float x = dFdx(1); }",
442 *SkSL::ShaderCapsFactory::Default(),
443 "#version 400\n"
444 "out vec4 sk_FragColor;\n"
445 "void main() {\n"
446 " float x = dFdx(1.0);\n"
447 "}\n");
448 test(r,
449 "void main() { float x = 1; }",
450 *SkSL::ShaderCapsFactory::ShaderDerivativeExtensionString(),
451 "#version 400\n"
452 "out vec4 sk_FragColor;\n"
453 "void main() {\n"
454 " float x = 1.0;\n"
455 "}\n");
456 test(r,
457 "void main() { float x = dFdx(1); }",
458 *SkSL::ShaderCapsFactory::ShaderDerivativeExtensionString(),
459 "#version 400\n"
460 "#extension GL_OES_standard_derivatives : require\n"
461 "out vec4 sk_FragColor;\n"
462 "void main() {\n"
463 " float x = dFdx(1.0);\n"
464 "}\n");
465 }
466
DEF_TEST(SkSLConstantFolding,r)467 DEF_TEST(SkSLConstantFolding, r) {
468 test(r,
469 "void main() {"
470 "float f_add = 32 + 2;"
471 "float f_sub = 32 - 2;"
472 "float f_mul = 32 * 2;"
473 "float f_div = 32 / 2;"
474 "float mixed = (12 > 2.0) ? (10 * 2 / 5 + 18 - 3) : 0;"
475 "int i_add = 32 + 2;"
476 "int i_sub = 32 - 2;"
477 "int i_mul = 32 * 2;"
478 "int i_div = 32 / 2;"
479 "int i_or = 12 | 6;"
480 "int i_and = 254 & 7;"
481 "int i_xor = 2 ^ 7;"
482 "int i_shl = 1 << 4;"
483 "int i_shr = 128 >> 2;"
484 "bool gt_it = 6 > 5;"
485 "bool gt_if = 6 > 6;"
486 "bool gt_ft = 6.0 > 5.0;"
487 "bool gt_ff = 6.0 > 6.0;"
488 "bool gte_it = 6 >= 6;"
489 "bool gte_if = 6 >= 7;"
490 "bool gte_ft = 6.0 >= 6.0;"
491 "bool gte_ff = 6.0 >= 7.0;"
492 "bool lte_it = 6 <= 6;"
493 "bool lte_if = 6 <= 5;"
494 "bool lte_ft = 6.0 <= 6.0;"
495 "bool lte_ff = 6.0 <= 5.0;"
496 "bool or_t = 1 == 1 || 2 == 8;"
497 "bool or_f = 1 > 1 || 2 == 8;"
498 "bool and_t = 1 == 1 && 2 <= 8;"
499 "bool and_f = 1 == 2 && 2 == 8;"
500 "bool xor_t = 1 == 1 ^^ 1 != 1;"
501 "bool xor_f = 1 == 1 ^^ 1 == 1;"
502 "int ternary = 10 > 5 ? 10 : 5;"
503 "}",
504 *SkSL::ShaderCapsFactory::Default(),
505 "#version 400\n"
506 "out vec4 sk_FragColor;\n"
507 "void main() {\n"
508 " float f_add = 34.0;\n"
509 " float f_sub = 30.0;\n"
510 " float f_mul = 64.0;\n"
511 " float f_div = 16.0;\n"
512 " float mixed = 19.0;\n"
513 " int i_add = 34;\n"
514 " int i_sub = 30;\n"
515 " int i_mul = 64;\n"
516 " int i_div = 16;\n"
517 " int i_or = 14;\n"
518 " int i_and = 6;\n"
519 " int i_xor = 5;\n"
520 " int i_shl = 16;\n"
521 " int i_shr = 32;\n"
522 " bool gt_it = true;\n"
523 " bool gt_if = false;\n"
524 " bool gt_ft = true;\n"
525 " bool gt_ff = false;\n"
526 " bool gte_it = true;\n"
527 " bool gte_if = false;\n"
528 " bool gte_ft = true;\n"
529 " bool gte_ff = false;\n"
530 " bool lte_it = true;\n"
531 " bool lte_if = false;\n"
532 " bool lte_ft = true;\n"
533 " bool lte_ff = false;\n"
534 " bool or_t = true;\n"
535 " bool or_f = false;\n"
536 " bool and_t = true;\n"
537 " bool and_f = false;\n"
538 " bool xor_t = true;\n"
539 " bool xor_f = false;\n"
540 " int ternary = 10;\n"
541 "}\n");
542 }
543
DEF_TEST(SkSLStaticIf,r)544 DEF_TEST(SkSLStaticIf, r) {
545 test(r,
546 "void main() {"
547 "int x;"
548 "if (true) x = 1;"
549 "if (2 > 1) x = 2; else x = 3;"
550 "if (1 > 2) x = 4; else x = 5;"
551 "if (false) x = 6;"
552 "}",
553 *SkSL::ShaderCapsFactory::Default(),
554 "#version 400\n"
555 "out vec4 sk_FragColor;\n"
556 "void main() {\n"
557 " int x;\n"
558 " x = 1;\n"
559 " x = 2;\n"
560 " x = 5;\n"
561 " {\n"
562 " }\n"
563 "}\n");
564 }
565
DEF_TEST(SkSLCaps,r)566 DEF_TEST(SkSLCaps, r) {
567 test(r,
568 "void main() {"
569 "int x;"
570 "if (sk_Caps.externalTextureSupport) x = 1;"
571 "if (sk_Caps.fbFetchSupport) x = 2;"
572 "if (sk_Caps.dropsTileOnZeroDivide && sk_Caps.texelFetchSupport) x = 3;"
573 "if (sk_Caps.dropsTileOnZeroDivide && sk_Caps.canUseAnyFunctionInShader) x = 4;"
574 "}",
575 *SkSL::ShaderCapsFactory::VariousCaps(),
576 "#version 400\n"
577 "out vec4 sk_FragColor;\n"
578 "void main() {\n"
579 " int x;\n"
580 " x = 1;\n"
581 " {\n"
582 " }\n"
583 " x = 3;\n"
584 " {\n"
585 " }\n"
586 "}\n");
587 }
588
DEF_TEST(SkSLTexture,r)589 DEF_TEST(SkSLTexture, r) {
590 test(r,
591 "uniform sampler1D one;"
592 "uniform sampler2D two;"
593 "void main() {"
594 "vec4 a = texture(one, 0);"
595 "vec4 b = texture(two, vec2(0));"
596 "vec4 c = texture(one, vec2(0));"
597 "vec4 d = texture(two, vec3(0));"
598 "}",
599 *SkSL::ShaderCapsFactory::Default(),
600 "#version 400\n"
601 "out vec4 sk_FragColor;\n"
602 "uniform sampler1D one;\n"
603 "uniform sampler2D two;\n"
604 "void main() {\n"
605 " vec4 a = texture(one, 0.0);\n"
606 " vec4 b = texture(two, vec2(0.0));\n"
607 " vec4 c = textureProj(one, vec2(0.0));\n"
608 " vec4 d = textureProj(two, vec3(0.0));\n"
609 "}\n");
610 test(r,
611 "uniform sampler1D one;"
612 "uniform sampler2D two;"
613 "void main() {"
614 "vec4 a = texture(one, 0);"
615 "vec4 b = texture(two, vec2(0));"
616 "vec4 c = texture(one, vec2(0));"
617 "vec4 d = texture(two, vec3(0));"
618 "}",
619 *SkSL::ShaderCapsFactory::Version110(),
620 "#version 110\n"
621 "uniform sampler1D one;\n"
622 "uniform sampler2D two;\n"
623 "void main() {\n"
624 " vec4 a = texture1D(one, 0.0);\n"
625 " vec4 b = texture2D(two, vec2(0.0));\n"
626 " vec4 c = texture1DProj(one, vec2(0.0));\n"
627 " vec4 d = texture2DProj(two, vec3(0.0));\n"
628 "}\n");
629 }
630
DEF_TEST(SkSLOffset,r)631 DEF_TEST(SkSLOffset, r) {
632 test(r,
633 "struct Test {"
634 "layout(offset = 0) int x;"
635 "layout(offset = 4) int y;"
636 "int z;"
637 "} test;",
638 *SkSL::ShaderCapsFactory::Default(),
639 "#version 400\n"
640 "out vec4 sk_FragColor;\n"
641 "struct Test {\n"
642 " layout (offset = 0) int x;\n"
643 " layout (offset = 4) int y;\n"
644 " int z;\n"
645 "} test;\n");
646 }
647
DEF_TEST(SkSLFragCoord,r)648 DEF_TEST(SkSLFragCoord, r) {
649 SkSL::Program::Settings settings;
650 settings.fFlipY = true;
651 sk_sp<GrShaderCaps> caps = SkSL::ShaderCapsFactory::FragCoordsOld();
652 settings.fCaps = caps.get();
653 SkSL::Program::Inputs inputs;
654 test(r,
655 "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
656 settings,
657 "#version 110\n"
658 "#extension GL_ARB_fragment_coord_conventions : require\n"
659 "layout(origin_upper_left) in vec4 gl_FragCoord;\n"
660 "void main() {\n"
661 " gl_FragColor.xy = gl_FragCoord.xy;\n"
662 "}\n",
663 &inputs);
664 REPORTER_ASSERT(r, !inputs.fRTHeight);
665
666 caps = SkSL::ShaderCapsFactory::FragCoordsNew();
667 settings.fCaps = caps.get();
668 test(r,
669 "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
670 settings,
671 "#version 400\n"
672 "layout(origin_upper_left) in vec4 gl_FragCoord;\n"
673 "out vec4 sk_FragColor;\n"
674 "void main() {\n"
675 " sk_FragColor.xy = gl_FragCoord.xy;\n"
676 "}\n",
677 &inputs);
678 REPORTER_ASSERT(r, !inputs.fRTHeight);
679
680 caps = SkSL::ShaderCapsFactory::Default();
681 settings.fCaps = caps.get();
682 test(r,
683 "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
684 settings,
685 "#version 400\n"
686 "uniform float u_skRTHeight;\n"
687 "out vec4 sk_FragColor;\n"
688 "void main() {\n"
689 " vec2 _sktmpCoord = gl_FragCoord.xy;\n"
690 " vec4 sk_FragCoord = vec4(_sktmpCoord.x, u_skRTHeight - _sktmpCoord.y, 1.0, 1.0);\n"
691 " sk_FragColor.xy = sk_FragCoord.xy;\n"
692 "}\n",
693 &inputs);
694 REPORTER_ASSERT(r, inputs.fRTHeight);
695
696 settings.fFlipY = false;
697 test(r,
698 "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
699 settings,
700 "#version 400\n"
701 "out vec4 sk_FragColor;\n"
702 "void main() {\n"
703 " sk_FragColor.xy = gl_FragCoord.xy;\n"
704 "}\n",
705 &inputs);
706 REPORTER_ASSERT(r, !inputs.fRTHeight);
707 }
708
DEF_TEST(SkSLVertexID,r)709 DEF_TEST(SkSLVertexID, r) {
710 test(r,
711 "out int id; void main() { id = sk_VertexID; }",
712 *SkSL::ShaderCapsFactory::Default(),
713 "#version 400\n"
714 "out int id;\n"
715 "void main() {\n"
716 " id = gl_VertexID;\n"
717 "}\n",
718 SkSL::Program::kVertex_Kind);
719 }
720
DEF_TEST(SkSLClipDistance,r)721 DEF_TEST(SkSLClipDistance, r) {
722 test(r,
723 "void main() { sk_ClipDistance[0] = 0; }",
724 *SkSL::ShaderCapsFactory::Default(),
725 "#version 400\n"
726 "void main() {\n"
727 " gl_ClipDistance[0] = 0.0;\n"
728 "}\n",
729 SkSL::Program::kVertex_Kind);
730 test(r,
731 "void main() { sk_FragColor = vec4(sk_ClipDistance[0]); }",
732 *SkSL::ShaderCapsFactory::Default(),
733 "#version 400\n"
734 "out vec4 sk_FragColor;\n"
735 "void main() {\n"
736 " sk_FragColor = vec4(gl_ClipDistance[0]);\n"
737 "}\n");
738 }
739
DEF_TEST(SkSLArrayTypes,r)740 DEF_TEST(SkSLArrayTypes, r) {
741 test(r,
742 "void main() { vec2 x[2] = vec2[2](vec2(1), vec2(2));"
743 "vec2[2] y = vec2[2](vec2(3), vec2(4)); }",
744 *SkSL::ShaderCapsFactory::Default(),
745 "#version 400\n"
746 "out vec4 sk_FragColor;\n"
747 "void main() {\n"
748 " vec2 x[2] = vec2[2](vec2(1.0), vec2(2.0));\n"
749 " vec2[2] y = vec2[2](vec2(3.0), vec2(4.0));\n"
750 "}\n");
751 }
752
DEF_TEST(SkSLGeometry,r)753 DEF_TEST(SkSLGeometry, r) {
754 test(r,
755 "layout(points) in;"
756 "layout(invocations = 2) in;"
757 "layout(line_strip, max_vertices = 2) out;"
758 "void main() {"
759 "gl_Position = sk_in[0].gl_Position + vec4(-0.5, 0, 0, sk_InvocationID);"
760 "EmitVertex();"
761 "gl_Position = sk_in[0].gl_Position + vec4(0.5, 0, 0, sk_InvocationID);"
762 "EmitVertex();"
763 "EndPrimitive();"
764 "}",
765 *SkSL::ShaderCapsFactory::Default(),
766 "#version 400\n"
767 "layout (points) in ;\n"
768 "layout (invocations = 2) in ;\n"
769 "layout (line_strip, max_vertices = 2) out ;\n"
770 "void main() {\n"
771 " gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));\n"
772 " EmitVertex();\n"
773 " gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(gl_InvocationID));\n"
774 " EmitVertex();\n"
775 " EndPrimitive();\n"
776 "}\n",
777 SkSL::Program::kGeometry_Kind);
778 }
779
DEF_TEST(SkSLSwitch,r)780 DEF_TEST(SkSLSwitch, r) {
781 test(r,
782 "void main() {"
783 " float x;"
784 " switch (1) {"
785 " case 0:"
786 " x = 0.0;"
787 " break;"
788 " case 1:"
789 " x = 1.0;"
790 " break;"
791 " default:"
792 " x = 2.0;"
793 " }"
794 " sk_FragColor = vec4(x);"
795 "}",
796 *SkSL::ShaderCapsFactory::Default(),
797 "#version 400\n"
798 "out vec4 sk_FragColor;\n"
799 "void main() {\n"
800 " float x;\n"
801 " switch (1) {\n"
802 " case 0:\n"
803 " x = 0.0;\n"
804 " break;\n"
805 " case 1:\n"
806 " x = 1.0;\n"
807 " break;\n"
808 " default:\n"
809 " x = 2.0;\n"
810 " }\n"
811 " sk_FragColor = vec4(x);\n"
812 "}\n");
813 test(r,
814 "void main() {"
815 " float x;"
816 " switch (2) {"
817 " case 0:"
818 " x = 0.0;"
819 " case 1:"
820 " x = 1.0;"
821 " default:"
822 " x = 2.0;"
823 " }"
824 " sk_FragColor = vec4(x);"
825 "}",
826 *SkSL::ShaderCapsFactory::Default(),
827 "#version 400\n"
828 "out vec4 sk_FragColor;\n"
829 "void main() {\n"
830 " float x;\n"
831 " switch (2) {\n"
832 " case 0:\n"
833 " x = 0.0;\n"
834 " case 1:\n"
835 " x = 1.0;\n"
836 " default:\n"
837 " x = 2.0;\n"
838 " }\n"
839 " sk_FragColor = vec4(2.0);\n"
840 "}\n");
841 test(r,
842 "void main() {"
843 " float x = 0.0;"
844 " switch (3) {"
845 " case 0:"
846 " x = 0.0;"
847 " case 1:"
848 " x = 1.0;"
849 " }"
850 " sk_FragColor = vec4(x);"
851 "}",
852 *SkSL::ShaderCapsFactory::Default(),
853 "#version 400\n"
854 "out vec4 sk_FragColor;\n"
855 "void main() {\n"
856 " float x = 0.0;\n"
857 " switch (3) {\n"
858 " case 0:\n"
859 " x = 0.0;\n"
860 " case 1:\n"
861 " x = 1.0;\n"
862 " }\n"
863 " sk_FragColor = vec4(x);\n"
864 "}\n");
865 }
866
867 #endif
868