Home | History | Annotate | Download | only in tests
      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 
     14 // Note that the optimizer will aggressively kill dead code and substitute constants in place of
     15 // variables, so we have to jump through a few hoops to ensure that the code in these tests has the
     16 // necessary side-effects to remain live. In some cases we rely on the optimizer not (yet) being
     17 // smart enough to optimize around certain constructs; as the optimizer gets smarter it will
     18 // undoubtedly end up breaking some of these tests. That is a good thing, as long as the new code is
     19 // equivalent!
     20 
     21 static void test(skiatest::Reporter* r, const char* src, const SkSL::Program::Settings& settings,
     22                  const char* expected, SkSL::Program::Inputs* inputs,
     23                  SkSL::Program::Kind kind = SkSL::Program::kFragment_Kind) {
     24     SkSL::Compiler compiler;
     25     SkSL::String output;
     26     std::unique_ptr<SkSL::Program> program = compiler.convertProgram(kind, SkSL::String(src),
     27                                                                      settings);
     28     if (!program) {
     29         SkDebugf("Unexpected error compiling %s\n%s", src, compiler.errorText().c_str());
     30     }
     31     REPORTER_ASSERT(r, program);
     32     *inputs = program->fInputs;
     33     REPORTER_ASSERT(r, compiler.toGLSL(*program, &output));
     34     if (program) {
     35         SkSL::String skExpected(expected);
     36         if (output != skExpected) {
     37             SkDebugf("GLSL MISMATCH:\nsource:\n%s\n\nexpected:\n'%s'\n\nreceived:\n'%s'", src,
     38                      expected, output.c_str());
     39         }
     40         REPORTER_ASSERT(r, output == skExpected);
     41     }
     42 }
     43 
     44 static void test(skiatest::Reporter* r, const char* src, const GrShaderCaps& caps,
     45                  const char* expected, SkSL::Program::Kind kind = SkSL::Program::kFragment_Kind) {
     46     SkSL::Program::Settings settings;
     47     settings.fCaps = &caps;
     48     SkSL::Program::Inputs inputs;
     49     test(r, src, settings, expected, &inputs, kind);
     50 }
     51 
     52 DEF_TEST(SkSLHelloWorld, r) {
     53     test(r,
     54          "void main() { sk_FragColor = float4(0.75); }",
     55          *SkSL::ShaderCapsFactory::Default(),
     56          "#version 400\n"
     57          "out vec4 sk_FragColor;\n"
     58          "void main() {\n"
     59          "    sk_FragColor = vec4(0.75);\n"
     60          "}\n");
     61 }
     62 
     63 DEF_TEST(SkSLControl, r) {
     64     test(r,
     65          "void main() {"
     66          "if (sqrt(2) > 5) { sk_FragColor = float4(0.75); } else { discard; }"
     67          "int i = 0;"
     68          "while (i < 10) { sk_FragColor *= 0.5; i++; }"
     69          "do { sk_FragColor += 0.01; } while (sk_FragColor.x < 0.75);"
     70          "for (int i = 0; i < 10; i++) {"
     71          "if (i % 2 == 1) break; else continue;"
     72          "}"
     73          "return;"
     74          "}",
     75          *SkSL::ShaderCapsFactory::Default(),
     76          "#version 400\n"
     77          "out vec4 sk_FragColor;\n"
     78          "void main() {\n"
     79          "    if (sqrt(2.0) > 5.0) {\n"
     80          "        sk_FragColor = vec4(0.75);\n"
     81          "    } else {\n"
     82          "        discard;\n"
     83          "    }\n"
     84          "    int i = 0;\n"
     85          "    while (i < 10) {\n"
     86          "        sk_FragColor *= 0.5;\n"
     87          "        i++;\n"
     88          "    }\n"
     89          "    do {\n"
     90          "        sk_FragColor += 0.01;\n"
     91          "    } while (sk_FragColor.x < 0.75);\n"
     92          "    for (int i = 0;i < 10; i++) {\n"
     93          "        if (i % 2 == 1) break; else continue;\n"
     94          "    }\n"
     95          "    return;\n"
     96          "}\n");
     97 }
     98 
     99 DEF_TEST(SkSLFunctions, r) {
    100     test(r,
    101          "float foo(float v[2]) { return v[0] * v[1]; }"
    102          "void bar(inout float x) { float y[2], z; y[0] = x; y[1] = x * 2; z = foo(y); x = z; }"
    103          "void main() { float x = 10; bar(x); sk_FragColor = float4(x); }",
    104          *SkSL::ShaderCapsFactory::Default(),
    105          "#version 400\n"
    106          "out vec4 sk_FragColor;\n"
    107          "float foo(float v[2]) {\n"
    108          "    return v[0] * v[1];\n"
    109          "}\n"
    110          "void bar(inout float x) {\n"
    111          "    float y[2], z;\n"
    112          "    y[0] = x;\n"
    113          "    y[1] = x * 2.0;\n"
    114          "    z = foo(y);\n"
    115          "    x = z;\n"
    116          "}\n"
    117          "void main() {\n"
    118          "    float x = 10.0;\n"
    119          "    bar(x);\n"
    120          "    sk_FragColor = vec4(x);\n"
    121          "}\n");
    122 }
    123 
    124 DEF_TEST(SkSLOperators, r) {
    125     test(r,
    126          "void main() {"
    127          "float x = 1, y = 2;"
    128          "int z = 3;"
    129          "x = x - x + y * z * x * (y - z);"
    130          "y = x / y / z;"
    131          "z = (z / 2 % 3 << 4) >> 2 << 1;"
    132          "bool b = (x > 4) == x < 2 || 2 >= sqrt(2) && y <= z;"
    133          "x += 12;"
    134          "x -= 12;"
    135          "x *= y /= z = 10;"
    136          "b ||= false;"
    137          "b &&= true;"
    138          "b ^^= false;"
    139          "z |= 0;"
    140          "z &= -1;"
    141          "z ^= 0;"
    142          "z >>= 2;"
    143          "z <<= 4;"
    144          "z %= 5;"
    145          "x = (float2(sqrt(1)) , 6);"
    146          "z = (float2(sqrt(1)) , 6);"
    147          "}",
    148          *SkSL::ShaderCapsFactory::Default(),
    149          "#version 400\n"
    150          "out vec4 sk_FragColor;\n"
    151          "void main() {\n"
    152          "    float x = 1.0, y = 2.0;\n"
    153          "    int z = 3;\n"
    154          "    x = -6.0;\n"
    155          "    y = -1.0;\n"
    156          "    z = 8;\n"
    157          "    bool b = false == true || 2.0 >= sqrt(2.0) && true;\n"
    158          "    x += 12.0;\n"
    159          "    x -= 12.0;\n"
    160          "    x *= (y /= float(z = 10));\n"
    161          "    b ||= false;\n"
    162          "    b &&= true;\n"
    163          "    b ^^= false;\n"
    164          "    z |= 0;\n"
    165          "    z &= -1;\n"
    166          "    z ^= 0;\n"
    167          "    z >>= 2;\n"
    168          "    z <<= 4;\n"
    169          "    z %= 5;\n"
    170          "    x = float((vec2(sqrt(1.0)) , 6));\n"
    171          "    z = (vec2(sqrt(1.0)) , 6);\n"
    172          "}\n");
    173 }
    174 
    175 DEF_TEST(SkSLMatrices, r) {
    176     test(r,
    177          "void main() {"
    178          "float2x4 x = float2x4(1);"
    179          "float3x2 y = float3x2(1, 0, 0, 1, float2(2, 2));"
    180          "float3x4 z = x * y;"
    181          "float3 v1 = float3x3(1) * float3(2);"
    182          "float3 v2 = float3(2) * float3x3(1);"
    183          "sk_FragColor = float4(z[0].x, v1 + v2);"
    184          "}",
    185          *SkSL::ShaderCapsFactory::Default(),
    186          "#version 400\n"
    187          "out vec4 sk_FragColor;\n"
    188          "void main() {\n"
    189          "    mat3x4 z = mat2x4(1.0) * mat3x2(1.0, 0.0, 0.0, 1.0, vec2(2.0, 2.0));\n"
    190          "    vec3 v1 = mat3(1.0) * vec3(2.0);\n"
    191          "    vec3 v2 = vec3(2.0) * mat3(1.0);\n"
    192          "    sk_FragColor = vec4(z[0].x, v1 + v2);\n"
    193          "}\n");
    194 }
    195 
    196 DEF_TEST(SkSLInterfaceBlock, r) {
    197     test(r,
    198          "uniform testBlock {"
    199          "half x;"
    200          "half y[2];"
    201          "layout(binding=12) half3x2 z;"
    202          "bool w;"
    203          "};"
    204          "void main() {"
    205          "    sk_FragColor = half4(x, y[0], y[1], 0);"
    206          "}",
    207          *SkSL::ShaderCapsFactory::Default(),
    208          "#version 400\n"
    209          "out vec4 sk_FragColor;\n"
    210          "uniform testBlock {\n"
    211          "    float x;\n"
    212          "    float[2] y;\n"
    213          "    layout (binding = 12) mat3x2 z;\n"
    214          "    bool w;\n"
    215          "};\n"
    216          "void main() {\n"
    217          "    sk_FragColor = vec4(x, y[0], y[1], 0.0);\n"
    218          "}\n");
    219     test(r,
    220          "uniform testBlock {"
    221          "float x;"
    222          "} test;"
    223          "void main() {"
    224          "    sk_FragColor = half4(test.x);"
    225          "}",
    226          *SkSL::ShaderCapsFactory::Default(),
    227          "#version 400\n"
    228          "out vec4 sk_FragColor;\n"
    229          "uniform testBlock {\n"
    230          "    float x;\n"
    231          "} test;\n"
    232          "void main() {\n"
    233          "    sk_FragColor = vec4(test.x);\n"
    234          "}\n");
    235     test(r,
    236          "uniform testBlock {"
    237          "float x;"
    238          "} test[2];"
    239          "void main() {"
    240          "    sk_FragColor = half4(test[1].x);"
    241          "}",
    242          *SkSL::ShaderCapsFactory::Default(),
    243          "#version 400\n"
    244          "out vec4 sk_FragColor;\n"
    245          "uniform testBlock {\n"
    246          "    float x;\n"
    247          "} test[2];\n"
    248          "void main() {\n"
    249          "    sk_FragColor = vec4(test[1].x);\n"
    250          "}\n");
    251 }
    252 
    253 DEF_TEST(SkSLStructs, r) {
    254     test(r,
    255          "struct A {"
    256          "int x;"
    257          "int y;"
    258          "} a1, a2;"
    259          "A a3;"
    260          "struct B {"
    261          "float x;"
    262          "float y[2];"
    263          "layout(binding=1) A z;"
    264          "};"
    265          "B b1, b2, b3;"
    266          "void main() {"
    267          "}",
    268          *SkSL::ShaderCapsFactory::Default(),
    269          "#version 400\n"
    270          "out vec4 sk_FragColor;\n"
    271          "struct A {\n"
    272          "    int x;\n"
    273          "    int y;\n"
    274          "} a1, a2;\n"
    275          "A a3;\n"
    276          "struct B {\n"
    277          "    float x;\n"
    278          "    float[2] y;\n"
    279          "    layout (binding = 1) A z;\n"
    280          "} b1, b2, b3;\n"
    281          "void main() {\n"
    282          "}\n");
    283 }
    284 
    285 DEF_TEST(SkSLVersion, r) {
    286     test(r,
    287          "in float test; void main() { sk_FragColor = float4(0.75); }",
    288          *SkSL::ShaderCapsFactory::Version450Core(),
    289          "#version 450 core\n"
    290          "out vec4 sk_FragColor;\n"
    291          "in float test;\n"
    292          "void main() {\n"
    293          "    sk_FragColor = vec4(0.75);\n"
    294          "}\n");
    295     test(r,
    296          "in float test; void main() { sk_FragColor = float4(0.75); }",
    297          *SkSL::ShaderCapsFactory::Version110(),
    298          "#version 110\n"
    299          "varying float test;\n"
    300          "void main() {\n"
    301          "    gl_FragColor = vec4(0.75);\n"
    302          "}\n");
    303 }
    304 
    305 DEF_TEST(SkSLUsesPrecisionModifiers, r) {
    306     test(r,
    307          "void main() { half x = 0.75; float y = 1; x++; y++;"
    308          "sk_FragColor.rg = half2(x, y); }",
    309          *SkSL::ShaderCapsFactory::Default(),
    310          "#version 400\n"
    311          "out vec4 sk_FragColor;\n"
    312          "void main() {\n"
    313          "    float x = 0.75;\n"
    314          "    float y = 1.0;\n"
    315          "    x++;\n"
    316          "    y++;\n"
    317          "    sk_FragColor.xy = vec2(x, y);\n"
    318          "}\n");
    319     test(r,
    320          "void main() { half x = 0.75; float y = 1; x++; y++;"
    321          "sk_FragColor.rg = half2(x, y); }",
    322          *SkSL::ShaderCapsFactory::UsesPrecisionModifiers(),
    323          "#version 400\n"
    324          "precision mediump float;\n"
    325          "out mediump vec4 sk_FragColor;\n"
    326          "void main() {\n"
    327          "    mediump float x = 0.75;\n"
    328          "    highp float y = 1.0;\n"
    329          "    x++;\n"
    330          "    y++;\n"
    331          "    sk_FragColor.xy = vec2(x, y);\n"
    332          "}\n");
    333 }
    334 
    335 DEF_TEST(SkSLMinAbs, r) {
    336     test(r,
    337          "void main() {"
    338          "float x = -5;"
    339          "sk_FragColor.r = min(abs(x), 6);"
    340          "}",
    341          *SkSL::ShaderCapsFactory::Default(),
    342          "#version 400\n"
    343          "out vec4 sk_FragColor;\n"
    344          "void main() {\n"
    345          "    sk_FragColor.x = min(abs(-5.0), 6.0);\n"
    346          "}\n");
    347 
    348     test(r,
    349          "void main() {"
    350          "float x = -5.0;"
    351          "sk_FragColor.r = min(abs(x), 6.0);"
    352          "}",
    353          *SkSL::ShaderCapsFactory::CannotUseMinAndAbsTogether(),
    354          "#version 400\n"
    355          "out vec4 sk_FragColor;\n"
    356          "void main() {\n"
    357          "    float minAbsHackVar0;\n"
    358          "    float minAbsHackVar1;\n"
    359          "    sk_FragColor.x = ((minAbsHackVar0 = abs(-5.0)) < (minAbsHackVar1 = 6.0) ? "
    360                                                                "minAbsHackVar0 : minAbsHackVar1);\n"
    361          "}\n");
    362 }
    363 
    364 DEF_TEST(SkSLFractNegative, r) {
    365     static constexpr char input[] =
    366         "void main() {"
    367         "float x = -42.0;"
    368         "sk_FragColor.r = fract(x);"
    369         "}";
    370     static constexpr char output_default[] =
    371         "#version 400\n"
    372         "out vec4 sk_FragColor;\n"
    373         "void main() {\n"
    374         "    sk_FragColor.x = fract(-42.0);\n"
    375         "}\n";
    376     static constexpr char output_workaround[] =
    377         "#version 400\n"
    378         "out vec4 sk_FragColor;\n"
    379         "void main() {\n"
    380         "    sk_FragColor.x = (0.5 - sign(-42.0) * (0.5 - fract(abs(-42.0))));\n"
    381         "}\n";
    382 
    383     test(r, input, *SkSL::ShaderCapsFactory::Default(), output_default);
    384     test(r, input, *SkSL::ShaderCapsFactory::CannotUseFractForNegativeValues(), output_workaround);
    385 }
    386 
    387 DEF_TEST(SkSLNegatedAtan, r) {
    388     test(r,
    389          "void main() { float2 x = float2(sqrt(2)); sk_FragColor.r = atan(x.x, -x.y); }",
    390          *SkSL::ShaderCapsFactory::Default(),
    391          "#version 400\n"
    392          "out vec4 sk_FragColor;\n"
    393          "void main() {\n"
    394          "    vec2 x = vec2(sqrt(2.0));\n"
    395          "    sk_FragColor.x = atan(x.x, -x.y);\n"
    396          "}\n");
    397     test(r,
    398          "void main() { float2 x = float2(sqrt(2)); sk_FragColor.r = atan(x.x, -x.y); }",
    399          *SkSL::ShaderCapsFactory::MustForceNegatedAtanParamToFloat(),
    400          "#version 400\n"
    401          "out vec4 sk_FragColor;\n"
    402          "void main() {\n"
    403          "    vec2 x = vec2(sqrt(2.0));\n"
    404          "    sk_FragColor.x = atan(x.x, -1.0 * x.y);\n"
    405          "}\n");
    406 }
    407 
    408 DEF_TEST(SkSLModifiersDeclaration, r) {
    409     test(r,
    410          "layout(blend_support_all_equations) out;"
    411          "layout(blend_support_all_equations) out;"
    412          "layout(blend_support_multiply) out;"
    413          "layout(blend_support_screen) out;"
    414          "layout(blend_support_overlay) out;"
    415          "layout(blend_support_darken) out;"
    416          "layout(blend_support_lighten) out;"
    417          "layout(blend_support_colordodge) out;"
    418          "layout(blend_support_colorburn) out;"
    419          "layout(blend_support_hardlight) out;"
    420          "layout(blend_support_softlight) out;"
    421          "layout(blend_support_difference) out;"
    422          "layout(blend_support_exclusion) out;"
    423          "layout(blend_support_hsl_hue) out;"
    424          "layout(blend_support_hsl_saturation) out;"
    425          "layout(blend_support_hsl_color) out;"
    426          "layout(blend_support_hsl_luminosity) out;"
    427          "void main() { }",
    428          *SkSL::ShaderCapsFactory::Default(),
    429          "#version 400\n"
    430          "out vec4 sk_FragColor;\n"
    431          "layout (blend_support_all_equations) out ;\n"
    432          "layout (blend_support_all_equations) out ;\n"
    433          "layout (blend_support_multiply) out ;\n"
    434          "layout (blend_support_screen) out ;\n"
    435          "layout (blend_support_overlay) out ;\n"
    436          "layout (blend_support_darken) out ;\n"
    437          "layout (blend_support_lighten) out ;\n"
    438          "layout (blend_support_colordodge) out ;\n"
    439          "layout (blend_support_colorburn) out ;\n"
    440          "layout (blend_support_hardlight) out ;\n"
    441          "layout (blend_support_softlight) out ;\n"
    442          "layout (blend_support_difference) out ;\n"
    443          "layout (blend_support_exclusion) out ;\n"
    444          "layout (blend_support_hsl_hue) out ;\n"
    445          "layout (blend_support_hsl_saturation) out ;\n"
    446          "layout (blend_support_hsl_color) out ;\n"
    447          "layout (blend_support_hsl_luminosity) out ;\n"
    448          "void main() {\n"
    449          "}\n");
    450 }
    451 
    452 DEF_TEST(SkSLHex, r) {
    453     test(r,
    454          "void main() {"
    455          "int i1 = 0x0;"
    456          "i1++;"
    457          "int i2 = 0x1234abcd;"
    458          "i2++;"
    459          "int i3 = 0x7fffffff;"
    460          "i3++;"
    461          "int i4 = 0xffffffff;"
    462          "i4++;"
    463          "int i5 = -0xbeef;"
    464          "i5++;"
    465          "uint u1 = 0x0;"
    466          "u1++;"
    467          "uint u2 = 0x1234abcd;"
    468          "u2++;"
    469          "uint u3 = 0x7fffffff;"
    470          "u3++;"
    471          "uint u4 = 0xffffffff;"
    472          "u4++;"
    473          "ushort u5 = 0xffff;"
    474          "u5++;"
    475          "}",
    476          *SkSL::ShaderCapsFactory::Default(),
    477          "#version 400\n"
    478          "out vec4 sk_FragColor;\n"
    479          "void main() {\n"
    480          "    int i1 = 0;\n"
    481          "    i1++;\n"
    482          "    int i2 = 305441741;\n"
    483          "    i2++;\n"
    484          "    int i3 = 2147483647;\n"
    485          "    i3++;\n"
    486          "    int i4 = -1;\n"
    487          "    i4++;\n"
    488          "    int i5 = -48879;\n"
    489          "    i5++;\n"
    490          "    uint u1 = 0u;\n"
    491          "    u1++;\n"
    492          "    uint u2 = 305441741u;\n"
    493          "    u2++;\n"
    494          "    uint u3 = 2147483647u;\n"
    495          "    u3++;\n"
    496          "    uint u4 = 4294967295u;\n"
    497          "    u4++;\n"
    498          "    uint u5 = 65535u;\n"
    499          "    u5++;\n"
    500          "}\n");
    501 }
    502 
    503 DEF_TEST(SkSLVectorConstructors, r) {
    504     test(r,
    505          "float2 v1 = float2(1);"
    506          "float2 v2 = float2(1, 2);"
    507          "float2 v3 = float2(float2(1));"
    508          "float3 v4 = float3(float2(1), 1.0);"
    509          "int2 v5 = int2(1);"
    510          "int2 v6 = int2(float2(1, 2));"
    511          "float2 v7 = float2(int2(1, 2));",
    512          *SkSL::ShaderCapsFactory::Default(),
    513          "#version 400\n"
    514          "out vec4 sk_FragColor;\n"
    515          "vec2 v1 = vec2(1.0);\n"
    516          "vec2 v2 = vec2(1.0, 2.0);\n"
    517          "vec2 v3 = vec2(1.0);\n"
    518          "vec3 v4 = vec3(vec2(1.0), 1.0);\n"
    519          "ivec2 v5 = ivec2(1);\n"
    520          "ivec2 v6 = ivec2(vec2(1.0, 2.0));\n"
    521          "vec2 v7 = vec2(ivec2(1, 2));\n");
    522 }
    523 
    524 DEF_TEST(SkSLArrayConstructors, r) {
    525     test(r,
    526          "float test1[] = float[](1, 2, 3, 4);"
    527          "float2 test2[] = float2[](float2(1, 2), float2(3, 4));"
    528          "float4x4 test3[] = float4x4[]();",
    529          *SkSL::ShaderCapsFactory::Default(),
    530          "#version 400\n"
    531          "out vec4 sk_FragColor;\n"
    532          "float test1[] = float[](1.0, 2.0, 3.0, 4.0);\n"
    533          "vec2 test2[] = vec2[](vec2(1.0, 2.0), vec2(3.0, 4.0));\n"
    534          "mat4 test3[] = mat4[]();\n");
    535 }
    536 
    537 DEF_TEST(SkSLDerivatives, r) {
    538     test(r,
    539          "void main() { sk_FragColor.r = dFdx(1); }",
    540          *SkSL::ShaderCapsFactory::Default(),
    541          "#version 400\n"
    542          "out vec4 sk_FragColor;\n"
    543          "void main() {\n"
    544          "    sk_FragColor.x = dFdx(1.0);\n"
    545          "}\n");
    546     test(r,
    547          "void main() { sk_FragColor.r = 1; }",
    548          *SkSL::ShaderCapsFactory::ShaderDerivativeExtensionString(),
    549          "#version 400\n"
    550          "precision mediump float;\n"
    551          "out mediump vec4 sk_FragColor;\n"
    552          "void main() {\n"
    553          "    sk_FragColor.x = 1.0;\n"
    554          "}\n");
    555     test(r,
    556          "void main() { sk_FragColor.r = dFdx(1); }",
    557          *SkSL::ShaderCapsFactory::ShaderDerivativeExtensionString(),
    558          "#version 400\n"
    559          "#extension GL_OES_standard_derivatives : require\n"
    560          "precision mediump float;\n"
    561          "out mediump vec4 sk_FragColor;\n"
    562          "void main() {\n"
    563          "    sk_FragColor.x = dFdx(1.0);\n"
    564          "}\n");
    565 }
    566 
    567 
    568 DEF_TEST(SkSLIntFolding, r) {
    569     test(r,
    570          "void main() {"
    571          "sk_FragColor.r = 32 + 2;"
    572          "sk_FragColor.r = 32 - 2;"
    573          "sk_FragColor.r = 32 * 2;"
    574          "sk_FragColor.r = 32 / 2;"
    575          "sk_FragColor.r = 12 | 6;"
    576          "sk_FragColor.r = 254 & 7;"
    577          "sk_FragColor.r = 2 ^ 7;"
    578          "sk_FragColor.r = 1 << 4;"
    579          "sk_FragColor.r = 128 >> 2;"
    580          "sk_FragColor.r = -1 == -1 ? 1 : -1;"
    581          "sk_FragColor.r = -1 == -2 ? 2 : -2;"
    582          "sk_FragColor.r = 0 != 1 ? 3 : -3;"
    583          "sk_FragColor.r = 0 != 0 ? 4 : -4;"
    584          "sk_FragColor.r = 6 > 5 ? 5 : -5;"
    585          "sk_FragColor.r = 6 > 6 ? 6 : -6;"
    586          "sk_FragColor.r = -1 < 0 ? 7 : -7;"
    587          "sk_FragColor.r = 1 < 0 ? 8 : -8;"
    588          "sk_FragColor.r = 6 >= 6 ? 9 : -9;"
    589          "sk_FragColor.r = 6 >= 7 ? 10 : -10;"
    590          "sk_FragColor.r = 6 <= 6 ? 11 : -11;"
    591          "sk_FragColor.r = 6 <= 5 ? 12 : -12;"
    592          "sk_FragColor.r = int(sqrt(1)) + 0;"
    593          "sk_FragColor.r = 0 + int(sqrt(2));"
    594          "sk_FragColor.r = int(sqrt(3)) - 0;"
    595          "sk_FragColor.r = int(sqrt(4)) * 0;"
    596          "sk_FragColor.r = int(sqrt(5)) * 1;"
    597          "sk_FragColor.r = 1 * int(sqrt(6));"
    598          "sk_FragColor.r = 0 * int(sqrt(7));"
    599          "sk_FragColor.r = int(sqrt(8)) / 1;"
    600          "sk_FragColor.r = 0 / int(sqrt(9));"
    601          "int x = int(sqrt(2));"
    602          "x += 1;"
    603          "x += 0;"
    604          "x -= 1;"
    605          "x -= 0;"
    606          "x *= 1;"
    607          "x *= 2;"
    608          "x /= 1;"
    609          "x /= 2;"
    610          "sk_FragColor.r = x;"
    611          "}",
    612          *SkSL::ShaderCapsFactory::Default(),
    613          "#version 400\n"
    614          "out vec4 sk_FragColor;\n"
    615          "void main() {\n"
    616          "    sk_FragColor.x = 34.0;\n"
    617          "    sk_FragColor.x = 30.0;\n"
    618          "    sk_FragColor.x = 64.0;\n"
    619          "    sk_FragColor.x = 16.0;\n"
    620          "    sk_FragColor.x = 14.0;\n"
    621          "    sk_FragColor.x = 6.0;\n"
    622          "    sk_FragColor.x = 5.0;\n"
    623          "    sk_FragColor.x = 16.0;\n"
    624          "    sk_FragColor.x = 32.0;\n"
    625          "    sk_FragColor.x = 1.0;\n"
    626          "    sk_FragColor.x = -2.0;\n"
    627          "    sk_FragColor.x = 3.0;\n"
    628          "    sk_FragColor.x = -4.0;\n"
    629          "    sk_FragColor.x = 5.0;\n"
    630          "    sk_FragColor.x = -6.0;\n"
    631          "    sk_FragColor.x = 7.0;\n"
    632          "    sk_FragColor.x = -8.0;\n"
    633          "    sk_FragColor.x = 9.0;\n"
    634          "    sk_FragColor.x = -10.0;\n"
    635          "    sk_FragColor.x = 11.0;\n"
    636          "    sk_FragColor.x = -12.0;\n"
    637          "    sk_FragColor.x = float(int(sqrt(1.0)));\n"
    638          "    sk_FragColor.x = float(int(sqrt(2.0)));\n"
    639          "    sk_FragColor.x = float(int(sqrt(3.0)));\n"
    640          "    sk_FragColor.x = 0.0;\n"
    641          "    sk_FragColor.x = float(int(sqrt(5.0)));\n"
    642          "    sk_FragColor.x = float(int(sqrt(6.0)));\n"
    643          "    sk_FragColor.x = 0.0;\n"
    644          "    sk_FragColor.x = float(int(sqrt(8.0)));\n"
    645          "    sk_FragColor.x = 0.0;\n"
    646          "    int x = int(sqrt(2.0));\n"
    647          "    x += 1;\n"
    648          "    x -= 1;\n"
    649          "    x *= 2;\n"
    650          "    x /= 2;\n"
    651          "    sk_FragColor.x = float(x);\n"
    652          "}\n");
    653 }
    654 
    655 DEF_TEST(SkSLFloatFolding, r) {
    656     test(r,
    657          "void main() {"
    658          "sk_FragColor.r = 32.0 + 2.0;"
    659          "sk_FragColor.r = 32.0 - 2.0;"
    660          "sk_FragColor.r = 32.0 * 2.0;"
    661          "sk_FragColor.r = 32.0 / 2.0;"
    662          "sk_FragColor.r = (12 > 2.0) ? (10 * 2 / 5 + 18 - 3) : 0;"
    663          "sk_FragColor.r = 0.0 == 0.0 ? 1 : -1;"
    664          "sk_FragColor.r = 0.0 == 1.0 ? 2 : -2;"
    665          "sk_FragColor.r = 0.0 != 1.0 ? 3 : -3;"
    666          "sk_FragColor.r = 0.0 != 0.0 ? 4 : -4;"
    667          "sk_FragColor.r = 6.0 > 5.0 ? 5 : -5;"
    668          "sk_FragColor.r = 6.0 > 6.0 ? 6 : -6;"
    669          "sk_FragColor.r = 6.0 >= 6.0 ? 7 : -7;"
    670          "sk_FragColor.r = 6.0 >= 7.0 ? 8 : -8;"
    671          "sk_FragColor.r = 5.0 < 6.0 ? 9 : -9;"
    672          "sk_FragColor.r = 6.0 < 6.0 ? 10 : -10;"
    673          "sk_FragColor.r = 6.0 <= 6.0 ? 11 : -11;"
    674          "sk_FragColor.r = 6.0 <= 5.0 ? 12 : -12;"
    675          "sk_FragColor.r = sqrt(1) + 0;"
    676          "sk_FragColor.r = 0 + sqrt(2);"
    677          "sk_FragColor.r = sqrt(3) - 0;"
    678          "sk_FragColor.r = sqrt(4) * 0;"
    679          "sk_FragColor.r = sqrt(5) * 1;"
    680          "sk_FragColor.r = 1 * sqrt(6);"
    681          "sk_FragColor.r = 0 * sqrt(7);"
    682          "sk_FragColor.r = sqrt(8) / 1;"
    683          "sk_FragColor.r = 0 / sqrt(9);"
    684          "sk_FragColor.r += 1;"
    685          "sk_FragColor.r += 0;"
    686          "sk_FragColor.r -= 1;"
    687          "sk_FragColor.r -= 0;"
    688          "sk_FragColor.r *= 1;"
    689          "sk_FragColor.r *= 2;"
    690          "sk_FragColor.r /= 1;"
    691          "sk_FragColor.r /= 2;"
    692          "}",
    693          *SkSL::ShaderCapsFactory::Default(),
    694          "#version 400\n"
    695          "out vec4 sk_FragColor;\n"
    696          "void main() {\n"
    697          "    sk_FragColor.x = 34.0;\n"
    698          "    sk_FragColor.x = 30.0;\n"
    699          "    sk_FragColor.x = 64.0;\n"
    700          "    sk_FragColor.x = 16.0;\n"
    701          "    sk_FragColor.x = 19.0;\n"
    702          "    sk_FragColor.x = 1.0;\n"
    703          "    sk_FragColor.x = -2.0;\n"
    704          "    sk_FragColor.x = 3.0;\n"
    705          "    sk_FragColor.x = -4.0;\n"
    706          "    sk_FragColor.x = 5.0;\n"
    707          "    sk_FragColor.x = -6.0;\n"
    708          "    sk_FragColor.x = 7.0;\n"
    709          "    sk_FragColor.x = -8.0;\n"
    710          "    sk_FragColor.x = 9.0;\n"
    711          "    sk_FragColor.x = -10.0;\n"
    712          "    sk_FragColor.x = 11.0;\n"
    713          "    sk_FragColor.x = -12.0;\n"
    714          "    sk_FragColor.x = sqrt(1.0);\n"
    715          "    sk_FragColor.x = sqrt(2.0);\n"
    716          "    sk_FragColor.x = sqrt(3.0);\n"
    717          "    sk_FragColor.x = 0.0;\n"
    718          "    sk_FragColor.x = sqrt(5.0);\n"
    719          "    sk_FragColor.x = sqrt(6.0);\n"
    720          "    sk_FragColor.x = 0.0;\n"
    721          "    sk_FragColor.x = sqrt(8.0);\n"
    722          "    sk_FragColor.x = 0.0;\n"
    723          "    sk_FragColor.x += 1.0;\n"
    724          "    sk_FragColor.x -= 1.0;\n"
    725          "    sk_FragColor.x *= 2.0;\n"
    726          "    sk_FragColor.x /= 2.0;\n"
    727          "}\n");
    728 }
    729 
    730 DEF_TEST(SkSLBoolFolding, r) {
    731     test(r,
    732          "void main() {"
    733          "sk_FragColor.r = 1 == 1 || 2 == 8 ? 1 : -1;"
    734          "sk_FragColor.r = 1 > 1 || 2 == 8 ? 2 : -2;"
    735          "sk_FragColor.r = 1 == 1 && 2 <= 8 ? 3 : -3;"
    736          "sk_FragColor.r = 1 == 2 && 2 == 8 ? 4 : -4;"
    737          "sk_FragColor.r = 1 == 1 ^^ 1 != 1 ? 5 : -5;"
    738          "sk_FragColor.r = 1 == 1 ^^ 1 == 1 ? 6 : -6;"
    739          "}",
    740          *SkSL::ShaderCapsFactory::Default(),
    741          "#version 400\n"
    742          "out vec4 sk_FragColor;\n"
    743          "void main() {\n"
    744          "    sk_FragColor.x = 1.0;\n"
    745          "    sk_FragColor.x = -2.0;\n"
    746          "    sk_FragColor.x = 3.0;\n"
    747          "    sk_FragColor.x = -4.0;\n"
    748          "    sk_FragColor.x = 5.0;\n"
    749          "    sk_FragColor.x = -6.0;\n"
    750          "}\n");
    751 }
    752 
    753 DEF_TEST(SkSLVecFolding, r) {
    754     test(r,
    755          "void main() {"
    756          "sk_FragColor.r = float4(0.5, 1, 1, 1).x;"
    757          "sk_FragColor = float4(float2(1), float2(2, 3)) + float4(5, 6, 7, 8);"
    758          "sk_FragColor = float4(8, float3(10)) - float4(1);"
    759          "sk_FragColor = float4(2) * float4(1, 2, 3, 4);"
    760          "sk_FragColor = float4(12) / float4(1, 2, 3, 4);"
    761          "sk_FragColor.r = (float4(12) / float4(1, 2, 3, 4)).y;"
    762          "sk_FragColor.x = float4(1) == float4(1) ? 1.0 : -1.0;"
    763          "sk_FragColor.x = float4(1) == float4(2) ? 2.0 : -2.0;"
    764          "sk_FragColor.x = float2(1) == float2(1, 1) ? 3.0 : -3.0;"
    765          "sk_FragColor.x = float2(1, 1) == float2(1, 1) ? 4.0 : -4.0;"
    766          "sk_FragColor.x = float2(1) == float2(1, 0) ? 5.0 : -5.0;"
    767          "sk_FragColor.x = float4(1) == float4(float2(1), float2(1)) ? 6.0 : -6.0;"
    768          "sk_FragColor.x = float4(float3(1), 1) == float4(float2(1), float2(1)) ? 7.0 : -7.0;"
    769          "sk_FragColor.x = float4(float3(1), 1) == float4(float2(1), 1, 0) ? 8.0 : -8.0;"
    770          "sk_FragColor.x = float2(1) != float2(1, 0) ? 9.0 : -9.0;"
    771          "sk_FragColor.x = float4(1) != float4(float2(1), float2(1)) ? 10.0 : -10.0;"
    772          "sk_FragColor = float4(sqrt(1)) * float4(1);"
    773          "sk_FragColor = float4(1) * float4(sqrt(2));"
    774          "sk_FragColor = float4(0) * float4(sqrt(3));"
    775          "sk_FragColor = float4(sqrt(4)) * float4(0);"
    776          "sk_FragColor = float4(0) / float4(sqrt(5));"
    777          "sk_FragColor = float4(0) + float4(sqrt(6));"
    778          "sk_FragColor = float4(sqrt(7)) + float4(0);"
    779          "sk_FragColor = float4(sqrt(8)) - float4(0);"
    780          "sk_FragColor = float4(0) + sqrt(9);"
    781          "sk_FragColor = float4(0) * sqrt(10);"
    782          "sk_FragColor = float4(0) / sqrt(11);"
    783          "sk_FragColor = float4(1) * sqrt(12);"
    784          "sk_FragColor = 0 + float4(sqrt(13));"
    785          "sk_FragColor = 0 * float4(sqrt(14));"
    786          "sk_FragColor = 0 / float4(sqrt(15));"
    787          "sk_FragColor = 1 * float4(sqrt(16));"
    788          "sk_FragColor = float4(sqrt(17)) + 0;"
    789          "sk_FragColor = float4(sqrt(18)) * 0;"
    790          "sk_FragColor = float4(sqrt(19)) * 1;"
    791          "sk_FragColor = float4(sqrt(19.5)) - 0;"
    792          "sk_FragColor = sqrt(20) * float4(1);"
    793          "sk_FragColor = sqrt(21) + float4(0);"
    794          "sk_FragColor = sqrt(22) - float4(0);"
    795          "sk_FragColor = sqrt(23) / float4(1);"
    796          "sk_FragColor = float4(sqrt(24)) / 1;"
    797          "sk_FragColor += float4(1);"
    798          "sk_FragColor += float4(0);"
    799          "sk_FragColor -= float4(1);"
    800          "sk_FragColor -= float4(0);"
    801          "sk_FragColor *= float4(1);"
    802          "sk_FragColor *= float4(2);"
    803          "sk_FragColor /= float4(1);"
    804          "sk_FragColor /= float4(2);"
    805          "}",
    806          *SkSL::ShaderCapsFactory::Default(),
    807          "#version 400\n"
    808          "out vec4 sk_FragColor;\n"
    809          "void main() {\n"
    810          "    sk_FragColor.x = 0.5;\n"
    811          "    sk_FragColor = vec4(6.0, 7.0, 9.0, 11.0);\n"
    812          "    sk_FragColor = vec4(7.0, 9.0, 9.0, 9.0);\n"
    813          "    sk_FragColor = vec4(2.0, 4.0, 6.0, 8.0);\n"
    814          "    sk_FragColor = vec4(12.0, 6.0, 4.0, 3.0);\n"
    815          "    sk_FragColor.x = 6.0;\n"
    816          "    sk_FragColor.x = 1.0;\n"
    817          "    sk_FragColor.x = -2.0;\n"
    818          "    sk_FragColor.x = 3.0;\n"
    819          "    sk_FragColor.x = 4.0;\n"
    820          "    sk_FragColor.x = -5.0;\n"
    821          "    sk_FragColor.x = 6.0;\n"
    822          "    sk_FragColor.x = 7.0;\n"
    823          "    sk_FragColor.x = -8.0;\n"
    824          "    sk_FragColor.x = 9.0;\n"
    825          "    sk_FragColor.x = -10.0;\n"
    826          "    sk_FragColor = vec4(sqrt(1.0));\n"
    827          "    sk_FragColor = vec4(sqrt(2.0));\n"
    828          "    sk_FragColor = vec4(0.0);\n"
    829          "    sk_FragColor = vec4(0.0);\n"
    830          "    sk_FragColor = vec4(0.0);\n"
    831          "    sk_FragColor = vec4(sqrt(6.0));\n"
    832          "    sk_FragColor = vec4(sqrt(7.0));\n"
    833          "    sk_FragColor = vec4(sqrt(8.0));\n"
    834          "    sk_FragColor = vec4(sqrt(9.0));\n"
    835          "    sk_FragColor = vec4(0.0);\n"
    836          "    sk_FragColor = vec4(0.0);\n"
    837          "    sk_FragColor = vec4(sqrt(12.0));\n"
    838          "    sk_FragColor = vec4(sqrt(13.0));\n"
    839          "    sk_FragColor = vec4(0.0);\n"
    840          "    sk_FragColor = vec4(0.0);\n"
    841          "    sk_FragColor = vec4(sqrt(16.0));\n"
    842          "    sk_FragColor = vec4(sqrt(17.0));\n"
    843          "    sk_FragColor = vec4(0.0);\n"
    844          "    sk_FragColor = vec4(sqrt(19.0));\n"
    845          "    sk_FragColor = vec4(sqrt(19.5));\n"
    846          "    sk_FragColor = vec4(sqrt(20.0));\n"
    847          "    sk_FragColor = vec4(sqrt(21.0));\n"
    848          "    sk_FragColor = vec4(sqrt(22.0));\n"
    849          "    sk_FragColor = vec4(sqrt(23.0));\n"
    850          "    sk_FragColor = vec4(sqrt(24.0));\n"
    851          "    sk_FragColor += vec4(1.0);\n"
    852          "    sk_FragColor -= vec4(1.0);\n"
    853          "    sk_FragColor *= vec4(2.0);\n"
    854          "    sk_FragColor /= vec4(2.0);\n"
    855          "}\n");
    856 }
    857 
    858 DEF_TEST(SkSLMatFolding, r) {
    859     test(r,
    860          "void main() {"
    861          "sk_FragColor.x = float2x2(float2(1.0, 0.0), float2(0.0, 1.0)) == "
    862                           "float2x2(float2(1.0, 0.0), float2(0.0, 1.0)) ? 1 : -1;"
    863          "sk_FragColor.x = float2x2(float2(1.0, 0.0), float2(1.0, 1.0)) == "
    864                           "float2x2(float2(1.0, 0.0), float2(0.0, 1.0)) ? 2 : -2;"
    865          "sk_FragColor.x = float2x2(1) == float2x2(1) ? 3 : -3;"
    866          "sk_FragColor.x = float2x2(1) == float2x2(0) ? 4 : -4;"
    867          "sk_FragColor.x = float2x2(1) == float2x2(float2(1.0, 0.0), float2(0.0, 1.0)) ? 5 : -5;"
    868          "sk_FragColor.x = float2x2(2) == float2x2(float2(1.0, 0.0), float2(0.0, 1.0)) ? 6 : -6;"
    869          "sk_FragColor.x = float3x2(2) == float3x2(float2(2.0, 0.0), float2(0.0, 2.0), float2(0.0))"
    870                            "? 7 : -7;"
    871          "sk_FragColor.x = float2x2(1) != float2x2(1) ? 8 : -8;"
    872          "sk_FragColor.x = float2x2(1) != float2x2(0) ? 9 : -9;"
    873          "sk_FragColor.x = float3x3(float3(1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), "
    874                           "float3(0.0, 0.0, 0.0)) == float3x3(float2x2(1.0)) ? 10 : -10;"
    875          "sk_FragColor.x = float2x2(float3x3(1.0)) == float2x2(1.0) ? 11 : -11;"
    876          "sk_FragColor.x = float2x2(float4(1.0, 0.0, 0.0, 1.0)) == float2x2(1.0) ? 12 : -12;"
    877          "sk_FragColor.x = float2x2(1.0, 0.0, float2(0.0, 1.0)) == float2x2(1.0) ? 13 : -13;"
    878          "sk_FragColor.x = float2x2(float2(1.0, 0.0), 0.0, 1.0) == float2x2(1.0) ? 14 : -14;"
    879          "}",
    880          *SkSL::ShaderCapsFactory::Default(),
    881          "#version 400\n"
    882          "out vec4 sk_FragColor;\n"
    883          "void main() {\n"
    884          "    sk_FragColor.x = 1.0;\n"
    885          "    sk_FragColor.x = -2.0;\n"
    886          "    sk_FragColor.x = 3.0;\n"
    887          "    sk_FragColor.x = -4.0;\n"
    888          "    sk_FragColor.x = 5.0;\n"
    889          "    sk_FragColor.x = -6.0;\n"
    890          "    sk_FragColor.x = 7.0;\n"
    891          "    sk_FragColor.x = -8.0;\n"
    892          "    sk_FragColor.x = 9.0;\n"
    893          "    sk_FragColor.x = 10.0;\n"
    894          "    sk_FragColor.x = 11.0;\n"
    895          "    sk_FragColor.x = 12.0;\n"
    896          "    sk_FragColor.x = 13.0;\n"
    897          "    sk_FragColor.x = 14.0;\n"
    898          "}\n");
    899 }
    900 
    901 DEF_TEST(SkSLConstantIf, r) {
    902     test(r,
    903          "void main() {"
    904          "int x;"
    905          "if (true) x = 1;"
    906          "if (2 > 1) x = 2; else x = 3;"
    907          "if (1 > 2) x = 4; else x = 5;"
    908          "if (false) x = 6;"
    909          "sk_FragColor.r = x;"
    910          "}",
    911          *SkSL::ShaderCapsFactory::Default(),
    912          "#version 400\n"
    913          "out vec4 sk_FragColor;\n"
    914          "void main() {\n"
    915          "    sk_FragColor.x = 5.0;\n"
    916          "}\n");
    917 }
    918 
    919 DEF_TEST(SkSLCaps, r) {
    920     test(r,
    921          "void main() {"
    922          "int x = 0;"
    923          "int y = 0;"
    924          "int z = 0;"
    925          "int w = 0;"
    926          "if (sk_Caps.externalTextureSupport) x = 1;"
    927          "if (sk_Caps.fbFetchSupport) y = 1;"
    928          "if (sk_Caps.dropsTileOnZeroDivide && sk_Caps.texelFetchSupport) z = 1;"
    929          "if (sk_Caps.dropsTileOnZeroDivide && sk_Caps.canUseAnyFunctionInShader) w = 1;"
    930          "sk_FragColor = half4(x, y, z, w);"
    931          "}",
    932          *SkSL::ShaderCapsFactory::VariousCaps(),
    933          "#version 400\n"
    934          "out vec4 sk_FragColor;\n"
    935          "void main() {\n"
    936          "    sk_FragColor = vec4(1.0, 0.0, 1.0, 0.0);\n"
    937          "}\n");
    938 }
    939 
    940 DEF_TEST(SkSLTexture, r) {
    941     test(r,
    942          "uniform sampler1D one;"
    943          "uniform sampler2D two;"
    944          "void main() {"
    945          "float4 a = texture(one, 0);"
    946          "float4 b = texture(two, float2(0));"
    947          "float4 c = texture(one, float2(0));"
    948          "float4 d = texture(two, float3(0));"
    949          "sk_FragColor = half4(a.x, b.x, c.x, d.x);"
    950          "}",
    951          *SkSL::ShaderCapsFactory::Default(),
    952          "#version 400\n"
    953          "out vec4 sk_FragColor;\n"
    954          "uniform sampler1D one;\n"
    955          "uniform sampler2D two;\n"
    956          "void main() {\n"
    957          "    vec4 a = texture(one, 0.0);\n"
    958          "    vec4 b = texture(two, vec2(0.0));\n"
    959          "    vec4 c = textureProj(one, vec2(0.0));\n"
    960          "    vec4 d = textureProj(two, vec3(0.0));\n"
    961          "    sk_FragColor = vec4(a.x, b.x, c.x, d.x);\n"
    962          "}\n");
    963     test(r,
    964          "uniform sampler1D one;"
    965          "uniform sampler2D two;"
    966          "void main() {"
    967          "float4 a = texture(one, 0);"
    968          "float4 b = texture(two, float2(0));"
    969          "float4 c = texture(one, float2(0));"
    970          "float4 d = texture(two, float3(0));"
    971          "sk_FragColor = half4(a.x, b.x, c.x, d.x);"
    972          "}",
    973          *SkSL::ShaderCapsFactory::Version110(),
    974          "#version 110\n"
    975          "uniform sampler1D one;\n"
    976          "uniform sampler2D two;\n"
    977          "void main() {\n"
    978          "    vec4 a = texture1D(one, 0.0);\n"
    979          "    vec4 b = texture2D(two, vec2(0.0));\n"
    980          "    vec4 c = texture1DProj(one, vec2(0.0));\n"
    981          "    vec4 d = texture2DProj(two, vec3(0.0));\n"
    982          "    gl_FragColor = vec4(a.x, b.x, c.x, d.x);\n"
    983          "}\n");
    984 }
    985 
    986 DEF_TEST(SkSLSharpen, r) {
    987     SkSL::Program::Settings settings;
    988     settings.fSharpenTextures = true;
    989     sk_sp<GrShaderCaps> caps = SkSL::ShaderCapsFactory::Default();
    990     settings.fCaps = caps.get();
    991     SkSL::Program::Inputs inputs;
    992     test(r,
    993          "uniform sampler1D one;"
    994          "uniform sampler2D two;"
    995          "void main() {"
    996          "float4 a = texture(one, 0);"
    997          "float4 b = texture(two, float2(0));"
    998          "float4 c = texture(one, float2(0));"
    999          "float4 d = texture(two, float3(0));"
   1000          "sk_FragColor = half4(a.x, b.x, c.x, d.x);"
   1001          "}",
   1002          settings,
   1003          "#version 400\n"
   1004          "out vec4 sk_FragColor;\n"
   1005          "uniform sampler1D one;\n"
   1006          "uniform sampler2D two;\n"
   1007          "void main() {\n"
   1008          "    vec4 a = texture(one, 0.0, -0.5);\n"
   1009          "    vec4 b = texture(two, vec2(0.0), -0.5);\n"
   1010          "    vec4 c = textureProj(one, vec2(0.0), -0.5);\n"
   1011          "    vec4 d = textureProj(two, vec3(0.0), -0.5);\n"
   1012          "    sk_FragColor = vec4(a.x, b.x, c.x, d.x);\n"
   1013          "}\n",
   1014          &inputs);
   1015 
   1016     caps = SkSL::ShaderCapsFactory::Version110();
   1017     settings.fCaps = caps.get();
   1018     test(r,
   1019          "uniform sampler1D one;"
   1020          "uniform sampler2D two;"
   1021          "void main() {"
   1022          "float4 a = texture(one, 0);"
   1023          "float4 b = texture(two, float2(0));"
   1024          "float4 c = texture(one, float2(0));"
   1025          "float4 d = texture(two, float3(0));"
   1026          "sk_FragColor = half4(a.x, b.x, c.x, d.x);"
   1027          "}",
   1028          settings,
   1029          "#version 110\n"
   1030          "uniform sampler1D one;\n"
   1031          "uniform sampler2D two;\n"
   1032          "void main() {\n"
   1033          "    vec4 a = texture1D(one, 0.0, -0.5);\n"
   1034          "    vec4 b = texture2D(two, vec2(0.0), -0.5);\n"
   1035          "    vec4 c = texture1DProj(one, vec2(0.0), -0.5);\n"
   1036          "    vec4 d = texture2DProj(two, vec3(0.0), -0.5);\n"
   1037          "    gl_FragColor = vec4(a.x, b.x, c.x, d.x);\n"
   1038          "}\n",
   1039          &inputs);
   1040 }
   1041 
   1042 DEF_TEST(SkSLOffset, r) {
   1043     test(r,
   1044          "struct Test {"
   1045          "layout(offset = 0) int x;"
   1046          "layout(offset = 4) int y;"
   1047          "int z;"
   1048          "} test;",
   1049          *SkSL::ShaderCapsFactory::Default(),
   1050          "#version 400\n"
   1051          "out vec4 sk_FragColor;\n"
   1052          "struct Test {\n"
   1053          "    layout (offset = 0) int x;\n"
   1054          "    layout (offset = 4) int y;\n"
   1055          "    int z;\n"
   1056          "} test;\n");
   1057 }
   1058 
   1059 DEF_TEST(SkSLFragCoord, r) {
   1060     SkSL::Program::Settings settings;
   1061     settings.fFlipY = true;
   1062     sk_sp<GrShaderCaps> caps = SkSL::ShaderCapsFactory::FragCoordsOld();
   1063     settings.fCaps = caps.get();
   1064     SkSL::Program::Inputs inputs;
   1065     test(r,
   1066          "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
   1067          settings,
   1068          "#version 110\n"
   1069          "#extension GL_ARB_fragment_coord_conventions : require\n"
   1070          "layout(origin_upper_left) in vec4 gl_FragCoord;\n"
   1071          "void main() {\n"
   1072          "    gl_FragColor.xy = gl_FragCoord.xy;\n"
   1073          "}\n",
   1074          &inputs);
   1075     REPORTER_ASSERT(r, !inputs.fRTHeight);
   1076 
   1077     caps = SkSL::ShaderCapsFactory::FragCoordsNew();
   1078     settings.fCaps = caps.get();
   1079     test(r,
   1080          "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
   1081          settings,
   1082          "#version 400\n"
   1083          "layout(origin_upper_left) in vec4 gl_FragCoord;\n"
   1084          "out vec4 sk_FragColor;\n"
   1085          "void main() {\n"
   1086          "    sk_FragColor.xy = gl_FragCoord.xy;\n"
   1087          "}\n",
   1088          &inputs);
   1089     REPORTER_ASSERT(r, !inputs.fRTHeight);
   1090 
   1091     caps = SkSL::ShaderCapsFactory::Default();
   1092     settings.fCaps = caps.get();
   1093     test(r,
   1094          "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
   1095          settings,
   1096          "#version 400\n"
   1097          "uniform float u_skRTHeight;\n"
   1098          "out vec4 sk_FragColor;\n"
   1099          "void main() {\n"
   1100          "    vec2 _sktmpCoord = gl_FragCoord.xy;\n"
   1101          "    vec4 sk_FragCoord = vec4(_sktmpCoord.x, u_skRTHeight - _sktmpCoord.y, 1.0, 1.0);\n"
   1102          "    sk_FragColor.xy = sk_FragCoord.xy;\n"
   1103          "}\n",
   1104          &inputs);
   1105     REPORTER_ASSERT(r, inputs.fRTHeight);
   1106 
   1107     settings.fFlipY = false;
   1108     test(r,
   1109          "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
   1110          settings,
   1111          "#version 400\n"
   1112          "out vec4 sk_FragColor;\n"
   1113          "void main() {\n"
   1114          "    sk_FragColor.xy = gl_FragCoord.xy;\n"
   1115          "}\n",
   1116          &inputs);
   1117     REPORTER_ASSERT(r, !inputs.fRTHeight);
   1118 
   1119     test(r,
   1120          "in float4 pos; void main() { sk_Position = pos; }",
   1121          *SkSL::ShaderCapsFactory::CannotUseFragCoord(),
   1122          "#version 400\n"
   1123          "out vec4 sk_FragCoord_Workaround;\n"
   1124          "in vec4 pos;\n"
   1125          "void main() {\n"
   1126          "    sk_FragCoord_Workaround = (gl_Position = pos);\n"
   1127          "}\n",
   1128          SkSL::Program::kVertex_Kind);
   1129 
   1130     test(r,
   1131          "in uniform float4 sk_RTAdjust; in float4 pos; void main() { sk_Position = pos; }",
   1132          *SkSL::ShaderCapsFactory::CannotUseFragCoord(),
   1133          "#version 400\n"
   1134          "out vec4 sk_FragCoord_Workaround;\n"
   1135          "in uniform vec4 sk_RTAdjust;\n"
   1136          "in vec4 pos;\n"
   1137          "void main() {\n"
   1138          "    sk_FragCoord_Workaround = (gl_Position = pos);\n"
   1139          "    gl_Position = vec4(gl_Position.x * sk_RTAdjust.x + gl_Position.w * sk_RTAdjust.y, "
   1140               "gl_Position.y * sk_RTAdjust.z + gl_Position.w * sk_RTAdjust.w, 0.0, "
   1141               "gl_Position.w);\n"
   1142          "}\n",
   1143          SkSL::Program::kVertex_Kind);
   1144 
   1145     test(r,
   1146          "void main() { sk_FragColor.xy = sk_FragCoord.xy; }",
   1147          *SkSL::ShaderCapsFactory::CannotUseFragCoord(),
   1148          "#version 400\n"
   1149          "in vec4 sk_FragCoord_Workaround;\n"
   1150          "out vec4 sk_FragColor;\n"
   1151          "void main() {\n"
   1152          "    float sk_FragCoord_InvW = 1. / sk_FragCoord_Workaround.w;\n"
   1153          "    vec4 sk_FragCoord_Resolved = vec4(sk_FragCoord_Workaround.xyz * "
   1154               "sk_FragCoord_InvW, sk_FragCoord_InvW);\n"
   1155          "    sk_FragCoord_Resolved.xy = floor(sk_FragCoord_Resolved.xy) + vec2(.5);\n"
   1156          "    sk_FragColor.xy = sk_FragCoord_Resolved.xy;\n"
   1157          "}\n");
   1158 }
   1159 
   1160 DEF_TEST(SkSLVertexID, r) {
   1161     test(r,
   1162          "out int id; void main() { id = sk_VertexID; }",
   1163          *SkSL::ShaderCapsFactory::Default(),
   1164          "#version 400\n"
   1165          "out int id;\n"
   1166          "void main() {\n"
   1167          "    id = gl_VertexID;\n"
   1168          "}\n",
   1169          SkSL::Program::kVertex_Kind);
   1170 }
   1171 
   1172 DEF_TEST(SkSLInstanceID, r) {
   1173     test(r,
   1174          "out int id; void main() { id = sk_InstanceID; }",
   1175          *SkSL::ShaderCapsFactory::Default(),
   1176          "#version 400\n"
   1177          "out int id;\n"
   1178          "void main() {\n"
   1179          "    id = gl_InstanceID;\n"
   1180          "}\n",
   1181          SkSL::Program::kVertex_Kind);
   1182 }
   1183 
   1184 DEF_TEST(SkSLClipDistance, r) {
   1185     test(r,
   1186          "void main() { sk_ClipDistance[0] = 0; }",
   1187          *SkSL::ShaderCapsFactory::Default(),
   1188          "#version 400\n"
   1189          "void main() {\n"
   1190          "    gl_ClipDistance[0] = 0.0;\n"
   1191          "}\n",
   1192          SkSL::Program::kVertex_Kind);
   1193     test(r,
   1194          "void main() { sk_FragColor = half4(sk_ClipDistance[0]); }",
   1195          *SkSL::ShaderCapsFactory::Default(),
   1196          "#version 400\n"
   1197          "out vec4 sk_FragColor;\n"
   1198          "void main() {\n"
   1199          "    sk_FragColor = vec4(gl_ClipDistance[0]);\n"
   1200          "}\n");
   1201 }
   1202 
   1203 DEF_TEST(SkSLArrayTypes, r) {
   1204     test(r,
   1205          "void main() { float2 x[2] = float2[2](float2(1), float2(2));"
   1206          "float2[2] y = float2[2](float2(3), float2(4));"
   1207          "sk_FragColor = float4(x[0], y[1]); }",
   1208          *SkSL::ShaderCapsFactory::Default(),
   1209          "#version 400\n"
   1210          "out vec4 sk_FragColor;\n"
   1211          "void main() {\n"
   1212          "    sk_FragColor = vec4(vec2[2](vec2(1.0), vec2(2.0))[0], "
   1213                                  "vec2[2](vec2(3.0), vec2(4.0))[1]);\n"
   1214          "}\n");
   1215 }
   1216 
   1217 DEF_TEST(SkSLArrayIndexTypes, r) {
   1218     test(r,
   1219          "void main() { float array[4] = float[4](1, 2, 3, 4);"
   1220          "short x = 0; ushort y = 1; int z = 2; uint w = 3;"
   1221          "sk_FragColor = float4(array[x], array[y], array[z], array[w]); }",
   1222          *SkSL::ShaderCapsFactory::Default(),
   1223          "#version 400\n"
   1224          "out vec4 sk_FragColor;\n"
   1225          "void main() {\n"
   1226          "    sk_FragColor = vec4(float[4](1.0, 2.0, 3.0, 4.0)[0], "
   1227                                  "float[4](1.0, 2.0, 3.0, 4.0)[1], "
   1228                                  "float[4](1.0, 2.0, 3.0, 4.0)[2], "
   1229                                  "float[4](1.0, 2.0, 3.0, 4.0)[3]);\n"
   1230          "}\n");
   1231 }
   1232 
   1233 DEF_TEST(SkSLGeometry, r) {
   1234     test(r,
   1235          "layout(points) in;"
   1236          "layout(invocations = 2) in;"
   1237          "layout(line_strip, max_vertices = 2) out;"
   1238          "void main() {"
   1239          "sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);"
   1240          "EmitVertex();"
   1241          "sk_Position = sk_in[0].sk_Position + float4(0.5, 0, 0, sk_InvocationID);"
   1242          "EmitVertex();"
   1243          "EndPrimitive();"
   1244          "}",
   1245          *SkSL::ShaderCapsFactory::GeometryShaderSupport(),
   1246          "#version 400\n"
   1247          "layout (points) in ;\n"
   1248          "layout (invocations = 2) in ;\n"
   1249          "layout (line_strip, max_vertices = 2) out ;\n"
   1250          "void main() {\n"
   1251          "    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));\n"
   1252          "    EmitVertex();\n"
   1253          "    gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(gl_InvocationID));\n"
   1254          "    EmitVertex();\n"
   1255          "    EndPrimitive();\n"
   1256          "}\n",
   1257          SkSL::Program::kGeometry_Kind);
   1258 }
   1259 
   1260 DEF_TEST(SkSLSwitch, r) {
   1261     // basic "does a switch even work" test
   1262     test(r,
   1263          "void main() {"
   1264          "    float x;"
   1265          "    switch (int(sqrt(1))) {"
   1266          "        case 0:"
   1267          "            x = 0.0;"
   1268          "            break;"
   1269          "        case 1:"
   1270          "            x = 1.0;"
   1271          "            break;"
   1272          "        default:"
   1273          "            x = 2.0;"
   1274          "    }"
   1275          "    sk_FragColor = float4(x);"
   1276          "}",
   1277          *SkSL::ShaderCapsFactory::Default(),
   1278          "#version 400\n"
   1279          "out vec4 sk_FragColor;\n"
   1280          "void main() {\n"
   1281          "    float x;\n"
   1282          "    switch (int(sqrt(1.0))) {\n"
   1283          "        case 0:\n"
   1284          "            x = 0.0;\n"
   1285          "            break;\n"
   1286          "        case 1:\n"
   1287          "            x = 1.0;\n"
   1288          "            break;\n"
   1289          "        default:\n"
   1290          "            x = 2.0;\n"
   1291          "    }\n"
   1292          "    sk_FragColor = vec4(x);\n"
   1293          "}\n");
   1294     // dead code inside of switch
   1295     test(r,
   1296          "void main() {"
   1297          "    float x;"
   1298          "    switch (int(sqrt(2))) {"
   1299          "        case 0:"
   1300          "            x = 0.0;"
   1301          "        case 1:"
   1302          "            x = 1.0;"
   1303          "        default:"
   1304          "            x = 2.0;"
   1305          "    }"
   1306          "    sk_FragColor = half4(x);"
   1307          "}",
   1308          *SkSL::ShaderCapsFactory::Default(),
   1309          "#version 400\n"
   1310          "out vec4 sk_FragColor;\n"
   1311          "void main() {\n"
   1312          "    switch (int(sqrt(2.0))) {\n"
   1313          "        case 0:\n"
   1314          "            ;\n"
   1315          "        case 1:\n"
   1316          "            ;\n"
   1317          "        default:\n"
   1318          "            ;\n"
   1319          "    }\n"
   1320          "    sk_FragColor = vec4(2.0);\n"
   1321          "}\n");
   1322     // non-static test w/ fallthrough
   1323     test(r,
   1324          "void main() {"
   1325          "    float x = 0.0;"
   1326          "    switch (int(sqrt(3))) {"
   1327          "        case 0:"
   1328          "            x = 0.0;"
   1329          "        case 1:"
   1330          "            x = 1.0;"
   1331          "    }"
   1332          "    sk_FragColor = half4(x);"
   1333          "}",
   1334          *SkSL::ShaderCapsFactory::Default(),
   1335          "#version 400\n"
   1336          "out vec4 sk_FragColor;\n"
   1337          "void main() {\n"
   1338          "    float x = 0.0;\n"
   1339          "    switch (int(sqrt(3.0))) {\n"
   1340          "        case 0:\n"
   1341          "            x = 0.0;\n"
   1342          "        case 1:\n"
   1343          "            x = 1.0;\n"
   1344          "    }\n"
   1345          "    sk_FragColor = vec4(x);\n"
   1346          "}\n");
   1347     // static test w/ fallthrough
   1348     test(r,
   1349          "void main() {"
   1350          "    float x = 0.0;"
   1351          "    switch (0) {"
   1352          "        case 0:"
   1353          "            x = 0.0;"
   1354          "        case 1:"
   1355          "            x = 1.0;"
   1356          "    }"
   1357          "    sk_FragColor = half4(x);"
   1358          "}",
   1359          *SkSL::ShaderCapsFactory::Default(),
   1360          "#version 400\n"
   1361          "out vec4 sk_FragColor;\n"
   1362          "void main() {\n"
   1363          "    sk_FragColor = vec4(1.0);\n"
   1364          "}\n");
   1365     // static test w/ fallthrough, different entry point
   1366     test(r,
   1367          "void main() {"
   1368          "    float x = 0.0;"
   1369          "    switch (1) {"
   1370          "        case 0:"
   1371          "            x = 0.0;"
   1372          "        case 1:"
   1373          "            x = 1.0;"
   1374          "    }"
   1375          "    sk_FragColor = half4(x);"
   1376          "}",
   1377          *SkSL::ShaderCapsFactory::Default(),
   1378          "#version 400\n"
   1379          "out vec4 sk_FragColor;\n"
   1380          "void main() {\n"
   1381          "    sk_FragColor = vec4(1.0);\n"
   1382          "}\n");
   1383     // static test w/ break
   1384     test(r,
   1385          "void main() {"
   1386          "    float x = 0.0;"
   1387          "    switch (0) {"
   1388          "        case 0:"
   1389          "            x = 0.0;"
   1390          "            break;"
   1391          "        case 1:"
   1392          "            x = 1.0;"
   1393          "    }"
   1394          "    sk_FragColor = half4(x);"
   1395          "}",
   1396          *SkSL::ShaderCapsFactory::Default(),
   1397          "#version 400\n"
   1398          "out vec4 sk_FragColor;\n"
   1399          "void main() {\n"
   1400          "    sk_FragColor = vec4(0.0);\n"
   1401          "}\n");
   1402     // static test w/ static conditional break
   1403     test(r,
   1404          "void main() {"
   1405          "    float x = 0.0;"
   1406          "    switch (0) {"
   1407          "        case 0:"
   1408          "            x = 0.0;"
   1409          "            if (x < 1) break;"
   1410          "        case 1:"
   1411          "            x = 1.0;"
   1412          "    }"
   1413          "    sk_FragColor = half4(x);"
   1414          "}",
   1415          *SkSL::ShaderCapsFactory::Default(),
   1416          "#version 400\n"
   1417          "out vec4 sk_FragColor;\n"
   1418          "void main() {\n"
   1419          "    sk_FragColor = vec4(0.0);\n"
   1420          "}\n");
   1421     // static test w/ non-static conditional break
   1422     test(r,
   1423          "void main() {"
   1424          "    float x = 0.0;"
   1425          "    switch (0) {"
   1426          "        case 0:"
   1427          "            x = 0.0;"
   1428          "            if (x < sqrt(1)) break;"
   1429          "        case 1:"
   1430          "            x = 1.0;"
   1431          "    }"
   1432          "    sk_FragColor = half4(x);"
   1433          "}",
   1434          *SkSL::ShaderCapsFactory::Default(),
   1435          "#version 400\n"
   1436          "out vec4 sk_FragColor;\n"
   1437          "void main() {\n"
   1438          "    float x = 0.0;\n"
   1439          "    switch (0) {\n"
   1440          "        case 0:\n"
   1441          "            x = 0.0;\n"
   1442          "            if (0.0 < sqrt(1.0)) break;\n"
   1443          "        case 1:\n"
   1444          "            x = 1.0;\n"
   1445          "    }\n"
   1446          "    sk_FragColor = vec4(x);\n"
   1447          "}\n");
   1448 }
   1449 
   1450 DEF_TEST(SkSLRectangleTexture, r) {
   1451     test(r,
   1452          "uniform sampler2D test;"
   1453          "void main() {"
   1454          "    sk_FragColor = texture(test, float2(0.5));"
   1455          "}",
   1456          *SkSL::ShaderCapsFactory::Default(),
   1457          "#version 400\n"
   1458          "out vec4 sk_FragColor;\n"
   1459          "uniform sampler2D test;\n"
   1460          "void main() {\n"
   1461          "    sk_FragColor = texture(test, vec2(0.5));\n"
   1462          "}\n");
   1463     test(r,
   1464          "uniform sampler2DRect test;"
   1465          "void main() {"
   1466          "    sk_FragColor = texture(test, float2(0.5));"
   1467          "}",
   1468          *SkSL::ShaderCapsFactory::Default(),
   1469          "#version 400\n"
   1470          "out vec4 sk_FragColor;\n"
   1471          "uniform sampler2DRect test;\n"
   1472          "void main() {\n"
   1473          "    sk_FragColor = texture(test, textureSize(test) * vec2(0.5));\n"
   1474          "}\n");
   1475     test(r,
   1476          "uniform sampler2DRect test;"
   1477          "void main() {"
   1478          "    sk_FragColor = texture(test, float3(0.5));"
   1479          "}",
   1480          *SkSL::ShaderCapsFactory::Default(),
   1481          "#version 400\n"
   1482          "out vec4 sk_FragColor;\n"
   1483          "uniform sampler2DRect test;\n"
   1484          "void main() {\n"
   1485          "    sk_FragColor = texture(test, vec3(textureSize(test), 1.0) * vec3(0.5));\n"
   1486          "}\n");
   1487 }
   1488 
   1489 DEF_TEST(SkSLUnusedVars, r) {
   1490     test(r,
   1491          "void main() {"
   1492          "float a = 1, b = 2, c = 3;"
   1493          "float d = c;"
   1494          "float e = d;"
   1495          "b++;"
   1496          "d++;"
   1497          "sk_FragColor = float4(b, b, d, d);"
   1498          "}",
   1499         *SkSL::ShaderCapsFactory::Default(),
   1500          "#version 400\n"
   1501          "out vec4 sk_FragColor;\n"
   1502          "void main() {\n"
   1503          "    float b = 2.0;\n"
   1504          "    float d = 3.0;\n"
   1505          "    b++;\n"
   1506          "    d++;\n"
   1507          "    sk_FragColor = vec4(b, b, d, d);\n"
   1508          "}\n");
   1509 }
   1510 
   1511 DEF_TEST(SkSLMultipleAssignments, r) {
   1512     test(r,
   1513          "void main() {"
   1514          "float x;"
   1515          "float y;"
   1516          "int z;"
   1517          "x = y = z = 1;"
   1518          "sk_FragColor = float4(z);"
   1519          "}",
   1520          *SkSL::ShaderCapsFactory::Default(),
   1521          "#version 400\n"
   1522          "out vec4 sk_FragColor;\n"
   1523          "void main() {\n"
   1524          "    sk_FragColor = vec4(1.0);\n"
   1525          "}\n");
   1526 }
   1527 
   1528 DEF_TEST(SkSLComplexDelete, r) {
   1529     test(r,
   1530          "uniform float4x4 colorXform;"
   1531          "uniform sampler2D sampler;"
   1532          "void main() {"
   1533          "float4 tmpColor;"
   1534          "sk_FragColor = float4(1.0) * (tmpColor = texture(sampler, float2(1)) , "
   1535          "colorXform != float4x4(1.0) ? float4(clamp((float4x4(colorXform) * "
   1536                                                      "float4(tmpColor.xyz, 1.0)).xyz, "
   1537                                                      "0.0, tmpColor.w), tmpColor.w) : tmpColor);"
   1538          "}",
   1539          *SkSL::ShaderCapsFactory::Default(),
   1540          "#version 400\n"
   1541          "out vec4 sk_FragColor;\n"
   1542          "uniform mat4 colorXform;\n"
   1543          "uniform sampler2D sampler;\n"
   1544          "void main() {\n"
   1545          "    vec4 tmpColor;\n"
   1546          "    sk_FragColor = (tmpColor = texture(sampler, vec2(1.0)) , colorXform != mat4(1.0) ? "
   1547          "vec4(clamp((colorXform * vec4(tmpColor.xyz, 1.0)).xyz, 0.0, tmpColor.w), tmpColor.w) : "
   1548          "tmpColor);\n"
   1549          "}\n");
   1550 }
   1551 
   1552 DEF_TEST(SkSLDependentInitializers, r) {
   1553     test(r,
   1554          "void main() {"
   1555          "float x = 0.5, y = x * 2;"
   1556          "sk_FragColor = float4(y);"
   1557          "}",
   1558          *SkSL::ShaderCapsFactory::Default(),
   1559          "#version 400\n"
   1560          "out vec4 sk_FragColor;\n"
   1561          "void main() {\n"
   1562          "    sk_FragColor = vec4(1.0);\n"
   1563          "}\n");
   1564 }
   1565 
   1566 DEF_TEST(SkSLDeadLoopVar, r) {
   1567     test(r,
   1568          "void main() {"
   1569          "for (int x = 0; x < 4; ) {"
   1570          "break;"
   1571          "}"
   1572          "}",
   1573          *SkSL::ShaderCapsFactory::Default(),
   1574          "#version 400\n"
   1575          "out vec4 sk_FragColor;\n"
   1576          "void main() {\n"
   1577          "    for (; true; ) {\n"
   1578          "        break;\n"
   1579          "    }\n"
   1580          "}\n"
   1581          );
   1582 }
   1583 
   1584 DEF_TEST(SkSLGeometryShaders, r) {
   1585     test(r,
   1586          "layout(points) in;"
   1587          "layout(invocations = 2) in;"
   1588          "layout(line_strip, max_vertices = 2) out;"
   1589          "void test() {"
   1590          "sk_Position = sk_in[0].sk_Position + float4(0.5, 0, 0, sk_InvocationID);"
   1591          "EmitVertex();"
   1592          "}"
   1593          "void main() {"
   1594          "sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);"
   1595          "EmitVertex();"
   1596          "}",
   1597          *SkSL::ShaderCapsFactory::NoGSInvocationsSupport(),
   1598          "#version 400\n"
   1599          "int sk_InvocationID;\n"
   1600          "layout (points) in ;\n"
   1601          "layout (line_strip, max_vertices = 4) out ;\n"
   1602          "void test() {\n"
   1603          "    gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(sk_InvocationID));\n"
   1604          "    EmitVertex();\n"
   1605          "}\n"
   1606          "void _invoke() {\n"
   1607          "    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(sk_InvocationID));\n"
   1608          "    EmitVertex();\n"
   1609          "}\n"
   1610          "void main() {\n"
   1611          "    for (sk_InvocationID = 0;sk_InvocationID < 2; sk_InvocationID++) {\n"
   1612          "        _invoke();\n"
   1613          "        EndPrimitive();\n"
   1614          "    }\n"
   1615          "}\n",
   1616          SkSL::Program::kGeometry_Kind);
   1617     test(r,
   1618          "layout(points, invocations = 2) in;"
   1619          "layout(invocations = 3) in;"
   1620          "layout(line_strip, max_vertices = 2) out;"
   1621          "void main() {"
   1622          "sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);"
   1623          "EmitVertex();"
   1624          "EndPrimitive();"
   1625          "}",
   1626          *SkSL::ShaderCapsFactory::GSInvocationsExtensionString(),
   1627          "#version 400\n"
   1628          "#extension GL_ARB_gpu_shader5 : require\n"
   1629          "layout (points, invocations = 2) in ;\n"
   1630          "layout (invocations = 3) in ;\n"
   1631          "layout (line_strip, max_vertices = 2) out ;\n"
   1632          "void main() {\n"
   1633          "    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));\n"
   1634          "    EmitVertex();\n"
   1635          "    EndPrimitive();\n"
   1636          "}\n",
   1637          SkSL::Program::kGeometry_Kind);
   1638     test(r,
   1639          "layout(points, invocations = 2) in;"
   1640          "layout(invocations = 3) in;"
   1641          "layout(line_strip, max_vertices = 2) out;"
   1642          "void main() {"
   1643          "sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);"
   1644          "EmitVertex();"
   1645          "EndPrimitive();"
   1646          "}",
   1647          *SkSL::ShaderCapsFactory::GeometryShaderExtensionString(),
   1648          "#version 310es\n"
   1649          "#extension GL_EXT_geometry_shader : require\n"
   1650          "layout (points, invocations = 2) in ;\n"
   1651          "layout (invocations = 3) in ;\n"
   1652          "layout (line_strip, max_vertices = 2) out ;\n"
   1653          "void main() {\n"
   1654          "    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));\n"
   1655          "    EmitVertex();\n"
   1656          "    EndPrimitive();\n"
   1657          "}\n",
   1658          SkSL::Program::kGeometry_Kind);
   1659 }
   1660 
   1661 DEF_TEST(SkSLTypePrecision, r) {
   1662     test(r,
   1663          "float f = 1;"
   1664          "half h = 2;"
   1665          "double d = 3;"
   1666          "float2 f2 = float2(1, 2);"
   1667          "half3 h3 = half3(1, 2, 3);"
   1668          "double4 d4 = double4(1, 2, 3, 4);"
   1669          "float2x2 f22 = float2x2(1, 2, 3, 4);"
   1670          "half2x4 h24 = half2x4(1, 2, 3, 4, 5, 6, 7, 8);"
   1671          "double4x2 d42 = double4x2(1, 2, 3, 4, 5, 6, 7, 8);",
   1672          *SkSL::ShaderCapsFactory::Default(),
   1673          "#version 400\n"
   1674          "out vec4 sk_FragColor;\n"
   1675          "float f = 1.0;\n"
   1676          "float h = 2.0;\n"
   1677          "double d = 3.0;\n"
   1678          "vec2 f2 = vec2(1.0, 2.0);\n"
   1679          "vec3 h3 = vec3(1.0, 2.0, 3.0);\n"
   1680          "dvec4 d4 = dvec4(1.0, 2.0, 3.0, 4.0);\n"
   1681          "mat2 f22 = mat2(1.0, 2.0, 3.0, 4.0);\n"
   1682          "mat2x4 h24 = mat2x4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);\n"
   1683          "dmat4x2 d42 = dmat4x2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);\n");
   1684     test(r,
   1685          "float f = 1;"
   1686          "half h = 2;"
   1687          "float2 f2 = float2(1, 2);"
   1688          "half3 h3 = half3(1, 2, 3);"
   1689          "float2x2 f22 = float2x2(1, 2, 3, 4);"
   1690          "half2x4 h24 = half2x4(1, 2, 3, 4, 5, 6, 7, 8);",
   1691          *SkSL::ShaderCapsFactory::UsesPrecisionModifiers(),
   1692          "#version 400\n"
   1693          "precision mediump float;\n"
   1694          "out mediump vec4 sk_FragColor;\n"
   1695          "highp float f = 1.0;\n"
   1696          "mediump float h = 2.0;\n"
   1697          "highp vec2 f2 = vec2(1.0, 2.0);\n"
   1698          "mediump vec3 h3 = vec3(1.0, 2.0, 3.0);\n"
   1699          "highp mat2 f22 = mat2(1.0, 2.0, 3.0, 4.0);\n"
   1700          "mediump mat2x4 h24 = mat2x4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);\n");
   1701 }
   1702 
   1703 DEF_TEST(SkSLNumberConversions, r) {
   1704     test(r,
   1705          "short s = short(sqrt(1));"
   1706          "int i = int(sqrt(1));"
   1707          "ushort us = ushort(sqrt(1));"
   1708          "uint ui = uint(sqrt(1));"
   1709          "half h = sqrt(1);"
   1710          "float f = sqrt(1);"
   1711          "short s2s = s;"
   1712          "short i2s = i;"
   1713          "short us2s = short(us);"
   1714          "short ui2s = short(ui);"
   1715          "short h2s = short(h);"
   1716          "short f2s = short(f);"
   1717          "int s2i = s;"
   1718          "int i2i = i;"
   1719          "int us2i = int(us);"
   1720          "int ui2i = int(ui);"
   1721          "int h2i = int(h);"
   1722          "int f2i = int(f);"
   1723          "ushort s2us = ushort(s);"
   1724          "ushort i2us = ushort(i);"
   1725          "ushort us2us = us;"
   1726          "ushort ui2us = ui;"
   1727          "ushort h2us = ushort(h);"
   1728          "ushort f2us = ushort(f);"
   1729          "uint s2ui = uint(s);"
   1730          "uint i2ui = uint(i);"
   1731          "uint us2ui = us;"
   1732          "uint ui2ui = ui;"
   1733          "uint h2ui = uint(h);"
   1734          "uint f2ui = uint(f);"
   1735          "float s2f = s;"
   1736          "float i2f = i;"
   1737          "float us2f = us;"
   1738          "float ui2f = ui;"
   1739          "float h2f = h;"
   1740          "float f2f = f;",
   1741          *SkSL::ShaderCapsFactory::Default(),
   1742          "#version 400\n"
   1743          "out vec4 sk_FragColor;\n"
   1744          "int s = int(sqrt(1.0));\n"
   1745          "int i = int(sqrt(1.0));\n"
   1746          "uint us = uint(sqrt(1.0));\n"
   1747          "uint ui = uint(sqrt(1.0));\n"
   1748          "float h = sqrt(1.0);\n"
   1749          "float f = sqrt(1.0);\n"
   1750          "int s2s = s;\n"
   1751          "int i2s = i;\n"
   1752          "int us2s = int(us);\n"
   1753          "int ui2s = int(ui);\n"
   1754          "int h2s = int(h);\n"
   1755          "int f2s = int(f);\n"
   1756          "int s2i = s;\n"
   1757          "int i2i = i;\n"
   1758          "int us2i = int(us);\n"
   1759          "int ui2i = int(ui);\n"
   1760          "int h2i = int(h);\n"
   1761          "int f2i = int(f);\n"
   1762          "uint s2us = uint(s);\n"
   1763          "uint i2us = uint(i);\n"
   1764          "uint us2us = us;\n"
   1765          "uint ui2us = ui;\n"
   1766          "uint h2us = uint(h);\n"
   1767          "uint f2us = uint(f);\n"
   1768          "uint s2ui = uint(s);\n"
   1769          "uint i2ui = uint(i);\n"
   1770          "uint us2ui = us;\n"
   1771          "uint ui2ui = ui;\n"
   1772          "uint h2ui = uint(h);\n"
   1773          "uint f2ui = uint(f);\n"
   1774          "float s2f = float(s);\n"
   1775          "float i2f = float(i);\n"
   1776          "float us2f = float(us);\n"
   1777          "float ui2f = float(ui);\n"
   1778          "float h2f = h;\n"
   1779          "float f2f = f;\n");
   1780 }
   1781 
   1782 DEF_TEST(SkSLForceHighPrecision, r) {
   1783     test(r,
   1784          "void main() { half x = sqrt(1); half4 y = half4(x); sk_FragColor = y; }",
   1785          *SkSL::ShaderCapsFactory::UsesPrecisionModifiers(),
   1786          "#version 400\n"
   1787          "precision mediump float;\n"
   1788          "out mediump vec4 sk_FragColor;\n"
   1789          "void main() {\n"
   1790          "    mediump float x = sqrt(1.0);\n"
   1791          "    mediump vec4 y = vec4(x);\n"
   1792          "    sk_FragColor = y;\n"
   1793          "}\n");
   1794     SkSL::Program::Settings settings;
   1795     settings.fForceHighPrecision = true;
   1796     sk_sp<GrShaderCaps> caps = SkSL::ShaderCapsFactory::UsesPrecisionModifiers();
   1797     settings.fCaps = caps.get();
   1798     SkSL::Program::Inputs inputs;
   1799     test(r,
   1800          "void main() { half x = sqrt(1); half4 y = half4(x); sk_FragColor = y; }",
   1801          settings,
   1802          "#version 400\n"
   1803          "precision mediump float;\n"
   1804          "out mediump vec4 sk_FragColor;\n"
   1805          "void main() {\n"
   1806          "    highp float x = sqrt(1.0);\n"
   1807          "    highp vec4 y = vec4(x);\n"
   1808          "    sk_FragColor = y;\n"
   1809          "}\n",
   1810          &inputs);
   1811 }
   1812 
   1813 DEF_TEST(SkSLNormalization, r) {
   1814     test(r,
   1815          "uniform float4 sk_RTAdjust; void main() { sk_Position = half4(1); }",
   1816          *SkSL::ShaderCapsFactory::Default(),
   1817          "#version 400\n"
   1818          "uniform vec4 sk_RTAdjust;\n"
   1819          "void main() {\n"
   1820          "    gl_Position = vec4(1.0);\n"
   1821          "    gl_Position = vec4(gl_Position.x * sk_RTAdjust.x + gl_Position.w * sk_RTAdjust.y, "
   1822                                 "gl_Position.y * sk_RTAdjust.z + gl_Position.w * sk_RTAdjust.w, "
   1823                                 "0.0, "
   1824                                 "gl_Position.w);\n"
   1825          "}\n",
   1826          SkSL::Program::kVertex_Kind);
   1827     test(r,
   1828          "uniform float4 sk_RTAdjust;"
   1829          "layout(points) in;"
   1830          "layout(invocations = 2) in;"
   1831          "layout(line_strip, max_vertices = 2) out;"
   1832          "void main() {"
   1833          "sk_Position = sk_in[0].sk_Position + float4(-0.5, 0, 0, sk_InvocationID);"
   1834          "EmitVertex();"
   1835          "sk_Position = sk_in[0].sk_Position + float4(0.5, 0, 0, sk_InvocationID);"
   1836          "EmitVertex();"
   1837          "EndPrimitive();"
   1838          "}",
   1839          *SkSL::ShaderCapsFactory::GeometryShaderSupport(),
   1840          "#version 400\n"
   1841          "uniform vec4 sk_RTAdjust;\n"
   1842          "layout (points) in ;\n"
   1843          "layout (invocations = 2) in ;\n"
   1844          "layout (line_strip, max_vertices = 2) out ;\n"
   1845          "void main() {\n"
   1846          "    gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(gl_InvocationID));\n"
   1847          "    {\n"
   1848          "        gl_Position = vec4(gl_Position.x * sk_RTAdjust.x + gl_Position.w * "
   1849                                "sk_RTAdjust.y, gl_Position.y * sk_RTAdjust.z + gl_Position.w * "
   1850                                "sk_RTAdjust.w, 0.0, gl_Position.w);\n"
   1851          "        EmitVertex();\n"
   1852          "    }\n"
   1853          "    gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(gl_InvocationID));\n"
   1854          "    {\n"
   1855          "        gl_Position = vec4(gl_Position.x * sk_RTAdjust.x + gl_Position.w * "
   1856                                "sk_RTAdjust.y, gl_Position.y * sk_RTAdjust.z + gl_Position.w * "
   1857                                "sk_RTAdjust.w, 0.0, gl_Position.w);\n"
   1858          "        EmitVertex();\n"
   1859          "    }\n"
   1860          "    EndPrimitive();\n"
   1861          "}\n",
   1862          SkSL::Program::kGeometry_Kind);
   1863 }
   1864 
   1865 DEF_TEST(SkSLTernaryLValue, r) {
   1866     test(r,
   1867          "void main() { half r, g; (true ? r : g) = 1; (false ? r : g) = 0; "
   1868          "sk_FragColor = half4(r, g, 1, 1); }",
   1869          *SkSL::ShaderCapsFactory::Default(),
   1870          "#version 400\n"
   1871          "out vec4 sk_FragColor;\n"
   1872          "void main() {\n"
   1873          "    sk_FragColor = vec4(1.0, 0.0, 1.0, 1.0);\n"
   1874          "}\n");
   1875     test(r,
   1876          "void main() { half r, g; (true ? r : g) = sqrt(1); (false ? r : g) = sqrt(0); "
   1877          "sk_FragColor = half4(r, g, 1, 1); }",
   1878          *SkSL::ShaderCapsFactory::Default(),
   1879          "#version 400\n"
   1880          "out vec4 sk_FragColor;\n"
   1881          "void main() {\n"
   1882          "    float r, g;\n"
   1883          "    r = sqrt(1.0);\n"
   1884          "    g = sqrt(0.0);\n"
   1885          "    sk_FragColor = vec4(r, g, 1.0, 1.0);\n"
   1886          "}\n");
   1887     test(r,
   1888          "void main() {"
   1889          "half r, g;"
   1890          "(sqrt(1) > 0 ? r : g) = sqrt(1);"
   1891          "(sqrt(0) > 0 ? r : g) = sqrt(0);"
   1892          "sk_FragColor = half4(r, g, 1, 1);"
   1893          "}",
   1894          *SkSL::ShaderCapsFactory::Default(),
   1895          "#version 400\n"
   1896          "out vec4 sk_FragColor;\n"
   1897          "void main() {\n"
   1898          "    float r, g;\n"
   1899          "    sqrt(1.0) > 0.0 ? r : g = sqrt(1.0);\n"
   1900          "    sqrt(0.0) > 0.0 ? r : g = sqrt(0.0);\n"
   1901          "    sk_FragColor = vec4(r, g, 1.0, 1.0);\n"
   1902          "}\n");
   1903 }
   1904 
   1905 #endif
   1906