ethannicholas | 5961bc9 | 2016-10-12 06:39:56 -0700 | [diff] [blame] | 1 | Overview |
| 2 | ======== |
| 3 | |
| 4 | SkSL ("Skia Shading Language") is a variant of GLSL which is used as Skia's |
| 5 | internal shading language. SkSL is, at its heart, a single standardized version |
| 6 | of GLSL which avoids all of the various version and dialect differences found |
| 7 | in GLSL "in the wild", but it does bring a few of its own changes to the table. |
| 8 | |
| 9 | Skia uses the SkSL compiler to convert SkSL code to GLSL, GLSL ES, or SPIR-V |
| 10 | before handing it over to the graphics driver. |
| 11 | |
| 12 | Differences from GLSL |
| 13 | ===================== |
| 14 | |
| 15 | SkSL is based on GLSL 4.5. For the most part, write SkSL exactly as you would |
| 16 | desktop GLSL, and the SkSL compiler will take care of version and dialect |
| 17 | differences (for instance, you always use "in" and "out", and skslc will handle |
| 18 | translating them to "varying" and "attribute" as appropriate). Be aware of the |
| 19 | following differences between SkSL and GLSL: |
| 20 | |
Ethan Nicholas | 3605ace | 2016-11-21 15:59:48 -0500 | [diff] [blame] | 21 | * GLSL caps can be referenced via the syntax 'sk_Caps.<name>', e.g. |
| 22 | sk_Caps.sampleVariablesSupport. The value will be a constant boolean or int, |
| 23 | as appropriate. As SkSL supports constant folding and branch elimination, this |
| 24 | means that an 'if' statement which statically queries a cap will collapse down |
| 25 | to the chosen branch, meaning that: |
| 26 | |
| 27 | if (sk_Caps.externalTextureSupport) |
| 28 | do_something(); |
| 29 | else |
| 30 | do_something_else(); |
| 31 | |
| 32 | will compile as if you had written either 'do_something();' or |
| 33 | 'do_something_else();', depending on whether that cap is enabled or not. |
ethannicholas | 22f939e | 2016-10-13 13:25:34 -0700 | [diff] [blame] | 34 | * no #version statement is required, and will be ignored if present |
ethannicholas | 5961bc9 | 2016-10-12 06:39:56 -0700 | [diff] [blame] | 35 | * the output color is sk_FragColor (do not declare it) |
| 36 | * lowp, mediump, and highp are always permitted (but will only be respected if |
Ethan Nicholas | cae3a4c | 2017-02-02 10:43:58 -0500 | [diff] [blame^] | 37 | you run on a GLES device) |
ethannicholas | 5961bc9 | 2016-10-12 06:39:56 -0700 | [diff] [blame] | 38 | * you do not need to include ".0" to make a number a float (meaning that |
| 39 | "vec2(x, y) * 4" is perfectly legal in SkSL, unlike GLSL where it would often |
| 40 | have to be expressed "vec2(x, y) * 4.0". There is no performance penalty for |
| 41 | this, as the number is converted to a float at compile time) |
| 42 | * type suffixes on numbers (1.0f, 0xFFu) are both unnecessary and unsupported |
Ethan Nicholas | 2b3dab6 | 2016-11-28 12:03:26 -0500 | [diff] [blame] | 43 | * Use texture() instead of textureProj(), e.g. texture(sampler2D, vec3) is |
| 44 | equivalent to GLSL's textureProj(sampler2D, vec3) |
ethannicholas | 5961bc9 | 2016-10-12 06:39:56 -0700 | [diff] [blame] | 45 | * some built-in functions and one or two rarely-used language features are not |
| 46 | yet supported (sorry!) |
| 47 | |
| 48 | SkSL is still under development, and is expected to diverge further from GLSL |
| 49 | over time. |