| Overview |
| ======== |
| |
| SkSL ("Skia Shading Language") is a variant of GLSL which is used as Skia's |
| internal shading language. SkSL is, at its heart, a single standardized version |
| of GLSL which avoids all of the various version and dialect differences found |
| in GLSL "in the wild", but it does bring a few of its own changes to the table. |
| |
| Skia uses the SkSL compiler to convert SkSL code to GLSL, GLSL ES, or SPIR-V |
| before handing it over to the graphics driver. |
| |
| Differences from GLSL |
| ===================== |
| |
| SkSL is based on GLSL 4.5. For the most part, write SkSL exactly as you would |
| desktop GLSL, and the SkSL compiler will take care of version and dialect |
| differences (for instance, you always use "in" and "out", and skslc will handle |
| translating them to "varying" and "attribute" as appropriate). Be aware of the |
| following differences between SkSL and GLSL: |
| |
| * GLSL caps can be referenced via the syntax 'sk_Caps.<name>', e.g. |
| sk_Caps.sampleVariablesSupport. The value will be a constant boolean or int, |
| as appropriate. As SkSL supports constant folding and branch elimination, this |
| means that an 'if' statement which statically queries a cap will collapse down |
| to the chosen branch, meaning that: |
| |
| if (sk_Caps.externalTextureSupport) |
| do_something(); |
| else |
| do_something_else(); |
| |
| will compile as if you had written either 'do_something();' or |
| 'do_something_else();', depending on whether that cap is enabled or not. |
| * no #version statement is required, and will be ignored if present |
| * the output color is sk_FragColor (do not declare it) |
| * use sk_VertexID instead of gl_VertexID |
| * the fragment coordinate is sk_FragCoord, and is always relative to the upper |
| left. |
| * lowp, mediump, and highp are always permitted (but will only be respected if |
| you run on a device which supports them) |
| * you do not need to include ".0" to make a number a float (meaning that |
| "vec2(x, y) * 4" is perfectly legal in SkSL, unlike GLSL where it would often |
| have to be expressed "vec2(x, y) * 4.0". There is no performance penalty for |
| this, as the number is converted to a float at compile time) |
| * type suffixes on numbers (1.0f, 0xFFu) are both unnecessary and unsupported |
| * creating a smaller vector from a larger vector (e.g. vec2(vec3(1))) is |
| intentionally disallowed, as it is just a wordier way of performing a swizzle. |
| Use swizzles instead. |
| * Use texture() instead of textureProj(), e.g. texture(sampler2D, vec3) is |
| equivalent to GLSL's textureProj(sampler2D, vec3) |
| * some built-in functions and one or two rarely-used language features are not |
| yet supported (sorry!) |
| |
| SkSL is still under development, and is expected to diverge further from GLSL |
| over time. |