Add golden outputs for the Metal backend.

This CL also updates the blend tests to use sk_FragColor instead of
returning a half4, as the Metal backend assumes that a fragment
processor's `main` will return void and always synthesizes a
`return *_out;` at the end.

(context link:
https://osscs.corp.google.com/android/platform/superproject/+/master:external/skqp/src/sksl/SkSLMetalCodeGenerator.cpp;l=803;drc=842d31b14159626054e01dd32826563a8f4214bf )

BYPASS_INCLUSIVE_LANGUAGE_REASON=see http://b/168134166

Change-Id: I330a456bf25ee72d3a29c59cd624625378ae80a0
Bug: skia:10649, skia:10757, skia:10758, skia:10759, skia:10760, skia:10761, skia:10762
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/319409
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 02e3462..e7a79b9 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -732,6 +732,15 @@
     lang = "--glsl"
     settings = "--nosettings"
   }
+  compile_sksl("metal_tests") {
+    sources = sksl_metal_tests_sources
+    outputPatterns = [ [
+          "/golden/",
+          ".metal",
+        ] ]
+    lang = "--metal"
+    settings = "--settings"
+  }
 } else {
   group("compile_sksl_fp_tests") {
   }
@@ -739,6 +748,8 @@
   }
   group("compile_sksl_glsl_nosettings_tests") {
   }
+  group("compile_sksl_metal_tests") {
+  }
 }
 
 optional("gpu") {
@@ -748,6 +759,7 @@
     ":compile_sksl_fp_tests",
     ":compile_sksl_glsl_nosettings_tests",
     ":compile_sksl_glsl_tests",
+    ":compile_sksl_metal_tests",
     ":dehydrate_sksl",
     ":run_sksllex",
   ]
diff --git a/gn/compile_sksl_tests.py b/gn/compile_sksl_tests.py
index 8effff6..fc65747 100755
--- a/gn/compile_sksl_tests.py
+++ b/gn/compile_sksl_tests.py
@@ -64,5 +64,7 @@
             makeEmptyFile(target + ".h")
     elif lang == "--glsl":
         compile(skslc, input, target, ".glsl")
+    elif lang == "--metal":
+        compile(skslc, input, target, ".metal")
     else:
-        sys.exit("### Expected one of: --fp --glsl, got " + lang)
+        sys.exit("### Expected one of: --fp --glsl --metal, got " + lang)
diff --git a/gn/sksl_tests.gni b/gn/sksl_tests.gni
index e880a3f..4114803 100644
--- a/gn/sksl_tests.gni
+++ b/gn/sksl_tests.gni
@@ -133,6 +133,7 @@
 sksl_glsl_tests = [
   "$_tests/sksl/glsl/ForceHighPrecision.sksl",
   "$_tests/sksl/glsl/IncompleteShortIntPrecision.sksl",
+  "$_tests/sksl/glsl/LayoutQualifiers.sksl",
   "$_tests/sksl/glsl/ShortIntPrecision.sksl",
   "$_tests/sksl/glsl/TextureSharpenVersion110.sksl",
   "$_tests/sksl/glsl/TextureVersion110.sksl",
@@ -184,7 +185,6 @@
   "$_tests/sksl/shared/InterfaceBlockNamed.sksl",
   "$_tests/sksl/shared/Matrices.sksl",
   "$_tests/sksl/shared/MatrixFolding.sksl",
-  "$_tests/sksl/shared/ModifiersDeclaration.sksl",
   "$_tests/sksl/shared/MultipleAssignments.sksl",
   "$_tests/sksl/shared/NegatedVectorLiteral.sksl",
   "$_tests/sksl/shared/NoFragCoordsPos.vert",
@@ -326,3 +326,7 @@
 # Tests in sksl_glsl_settings_tests_sources will be compiled twice, once with --settings and once
 # using --nosettings. In the latter mode, StandaloneSettings is appended to the output filename.
 sksl_glsl_settings_tests_sources = sksl_blend_tests + sksl_settings_tests
+
+# Tests in sksl_metal_tests_sources will be compiled with --settings on, and are expected to
+# generate a .metal output file.
+sksl_metal_tests_sources = sksl_blend_tests + sksl_shared_tests
diff --git a/tests/sksl/blend/BlendClear.sksl b/tests/sksl/blend/BlendClear.sksl
index 8d4c39b..74e2e4d 100644
--- a/tests/sksl/blend/BlendClear.sksl
+++ b/tests/sksl/blend/BlendClear.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_clear(src, dst);
+void main() {
+    sk_FragColor = blend_clear(src, dst);
 }
diff --git a/tests/sksl/blend/BlendColor.sksl b/tests/sksl/blend/BlendColor.sksl
index 21075b5..9cf0ae9 100644
--- a/tests/sksl/blend/BlendColor.sksl
+++ b/tests/sksl/blend/BlendColor.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_color(src, dst);
+void main() {
+    sk_FragColor = blend_color(src, dst);
 }
diff --git a/tests/sksl/blend/BlendColorBurn.sksl b/tests/sksl/blend/BlendColorBurn.sksl
index b70b6c5..28cb0a1 100644
--- a/tests/sksl/blend/BlendColorBurn.sksl
+++ b/tests/sksl/blend/BlendColorBurn.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_color_burn(src, dst);
+void main() {
+    sk_FragColor = blend_color_burn(src, dst);
 }
diff --git a/tests/sksl/blend/BlendColorDodge.sksl b/tests/sksl/blend/BlendColorDodge.sksl
index 6e27a96..a1e7d8c 100644
--- a/tests/sksl/blend/BlendColorDodge.sksl
+++ b/tests/sksl/blend/BlendColorDodge.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_color_dodge(src, dst);
+void main() {
+    sk_FragColor = blend_color_dodge(src, dst);
 }
diff --git a/tests/sksl/blend/BlendDarken.sksl b/tests/sksl/blend/BlendDarken.sksl
index f935696..9606bd5 100644
--- a/tests/sksl/blend/BlendDarken.sksl
+++ b/tests/sksl/blend/BlendDarken.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_darken(src, dst);
+void main() {
+    sk_FragColor = blend_darken(src, dst);
 }
diff --git a/tests/sksl/blend/BlendDifference.sksl b/tests/sksl/blend/BlendDifference.sksl
index 8ffdd0c..fc242e8 100644
--- a/tests/sksl/blend/BlendDifference.sksl
+++ b/tests/sksl/blend/BlendDifference.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_difference(src, dst);
+void main() {
+    sk_FragColor = blend_difference(src, dst);
 }
diff --git a/tests/sksl/blend/BlendDst.sksl b/tests/sksl/blend/BlendDst.sksl
index 03de18c..547a0aa 100644
--- a/tests/sksl/blend/BlendDst.sksl
+++ b/tests/sksl/blend/BlendDst.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_dst(src, dst);
+void main() {
+    sk_FragColor = blend_dst(src, dst);
 }
diff --git a/tests/sksl/blend/BlendDstAtop.sksl b/tests/sksl/blend/BlendDstAtop.sksl
index 80fb37b..a518ce5 100644
--- a/tests/sksl/blend/BlendDstAtop.sksl
+++ b/tests/sksl/blend/BlendDstAtop.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_src_atop(src, dst);
+void main() {
+    sk_FragColor = blend_src_atop(src, dst);
 }
diff --git a/tests/sksl/blend/BlendDstIn.sksl b/tests/sksl/blend/BlendDstIn.sksl
index 5e2e647..f0c6d83 100644
--- a/tests/sksl/blend/BlendDstIn.sksl
+++ b/tests/sksl/blend/BlendDstIn.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_dst_in(src, dst);
+void main() {
+    sk_FragColor = blend_dst_in(src, dst);
 }
diff --git a/tests/sksl/blend/BlendDstOut.sksl b/tests/sksl/blend/BlendDstOut.sksl
index 47e3fae..df0e440 100644
--- a/tests/sksl/blend/BlendDstOut.sksl
+++ b/tests/sksl/blend/BlendDstOut.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_dst_out(src, dst);
+void main() {
+    sk_FragColor = blend_dst_out(src, dst);
 }
diff --git a/tests/sksl/blend/BlendDstOver.sksl b/tests/sksl/blend/BlendDstOver.sksl
index cb63504..198dda7 100644
--- a/tests/sksl/blend/BlendDstOver.sksl
+++ b/tests/sksl/blend/BlendDstOver.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_dst_over(src, dst);
+void main() {
+    sk_FragColor = blend_dst_over(src, dst);
 }
diff --git a/tests/sksl/blend/BlendExclusion.sksl b/tests/sksl/blend/BlendExclusion.sksl
index 8923a3e..fba6de5 100644
--- a/tests/sksl/blend/BlendExclusion.sksl
+++ b/tests/sksl/blend/BlendExclusion.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_exclusion(src, dst);
+void main() {
+    sk_FragColor = blend_exclusion(src, dst);
 }
diff --git a/tests/sksl/blend/BlendHardLight.sksl b/tests/sksl/blend/BlendHardLight.sksl
index b023e6e..b3745b5 100644
--- a/tests/sksl/blend/BlendHardLight.sksl
+++ b/tests/sksl/blend/BlendHardLight.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_hard_light(src, dst);
+void main() {
+    sk_FragColor = blend_hard_light(src, dst);
 }
diff --git a/tests/sksl/blend/BlendHue.sksl b/tests/sksl/blend/BlendHue.sksl
index c7fd41c..db633e7 100644
--- a/tests/sksl/blend/BlendHue.sksl
+++ b/tests/sksl/blend/BlendHue.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_hue(src, dst);
+void main() {
+    sk_FragColor = blend_hue(src, dst);
 }
diff --git a/tests/sksl/blend/BlendLighten.sksl b/tests/sksl/blend/BlendLighten.sksl
index ae7f862..31f0d29 100644
--- a/tests/sksl/blend/BlendLighten.sksl
+++ b/tests/sksl/blend/BlendLighten.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_lighten(src, dst);
+void main() {
+    sk_FragColor = blend_lighten(src, dst);
 }
diff --git a/tests/sksl/blend/BlendLuminosity.sksl b/tests/sksl/blend/BlendLuminosity.sksl
index b865dbb..74f507b 100644
--- a/tests/sksl/blend/BlendLuminosity.sksl
+++ b/tests/sksl/blend/BlendLuminosity.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_luminosity(src, dst);
+void main() {
+    sk_FragColor = blend_luminosity(src, dst);
 }
diff --git a/tests/sksl/blend/BlendModulate.sksl b/tests/sksl/blend/BlendModulate.sksl
index c6b2e00..6bc2f15 100644
--- a/tests/sksl/blend/BlendModulate.sksl
+++ b/tests/sksl/blend/BlendModulate.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_modulate(src, dst);
+void main() {
+    sk_FragColor = blend_modulate(src, dst);
 }
diff --git a/tests/sksl/blend/BlendMultiply.sksl b/tests/sksl/blend/BlendMultiply.sksl
index 87d3066..57796fd 100644
--- a/tests/sksl/blend/BlendMultiply.sksl
+++ b/tests/sksl/blend/BlendMultiply.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_multiply(src, dst);
+void main() {
+    sk_FragColor = blend_multiply(src, dst);
 }
diff --git a/tests/sksl/blend/BlendOverlap.sksl b/tests/sksl/blend/BlendOverlap.sksl
index 79c9aba..df602c4 100644
--- a/tests/sksl/blend/BlendOverlap.sksl
+++ b/tests/sksl/blend/BlendOverlap.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_overlay(src, dst);
+void main() {
+    sk_FragColor = blend_overlay(src, dst);
 }
diff --git a/tests/sksl/blend/BlendPlus.sksl b/tests/sksl/blend/BlendPlus.sksl
index b6b226c..b640354 100644
--- a/tests/sksl/blend/BlendPlus.sksl
+++ b/tests/sksl/blend/BlendPlus.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_plus(src, dst);
+void main() {
+    sk_FragColor = blend_plus(src, dst);
 }
diff --git a/tests/sksl/blend/BlendSaturation.sksl b/tests/sksl/blend/BlendSaturation.sksl
index 11bd86a..305e269 100644
--- a/tests/sksl/blend/BlendSaturation.sksl
+++ b/tests/sksl/blend/BlendSaturation.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_saturation(src, dst);
+void main() {
+    sk_FragColor = blend_saturation(src, dst);
 }
diff --git a/tests/sksl/blend/BlendScreen.sksl b/tests/sksl/blend/BlendScreen.sksl
index 9c93db4..a044ab0 100644
--- a/tests/sksl/blend/BlendScreen.sksl
+++ b/tests/sksl/blend/BlendScreen.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_screen(src, dst);
+void main() {
+    sk_FragColor = blend_screen(src, dst);
 }
diff --git a/tests/sksl/blend/BlendSoftLight.sksl b/tests/sksl/blend/BlendSoftLight.sksl
index 744874d..2847c7e 100644
--- a/tests/sksl/blend/BlendSoftLight.sksl
+++ b/tests/sksl/blend/BlendSoftLight.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_soft_light(src, dst);
+void main() {
+    sk_FragColor = blend_soft_light(src, dst);
 }
diff --git a/tests/sksl/blend/BlendSrc.sksl b/tests/sksl/blend/BlendSrc.sksl
index 7a012b5..e5dbf0d 100644
--- a/tests/sksl/blend/BlendSrc.sksl
+++ b/tests/sksl/blend/BlendSrc.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_src(src, dst);
+void main() {
+    sk_FragColor = blend_src(src, dst);
 }
diff --git a/tests/sksl/blend/BlendSrcAtop.sksl b/tests/sksl/blend/BlendSrcAtop.sksl
index 80fb37b..a518ce5 100644
--- a/tests/sksl/blend/BlendSrcAtop.sksl
+++ b/tests/sksl/blend/BlendSrcAtop.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_src_atop(src, dst);
+void main() {
+    sk_FragColor = blend_src_atop(src, dst);
 }
diff --git a/tests/sksl/blend/BlendSrcIn.sksl b/tests/sksl/blend/BlendSrcIn.sksl
index c98c5b9..73544b8 100644
--- a/tests/sksl/blend/BlendSrcIn.sksl
+++ b/tests/sksl/blend/BlendSrcIn.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_src_in(src, dst);
+void main() {
+    sk_FragColor = blend_src_in(src, dst);
 }
diff --git a/tests/sksl/blend/BlendSrcOut.sksl b/tests/sksl/blend/BlendSrcOut.sksl
index 7597582..0caaa30 100644
--- a/tests/sksl/blend/BlendSrcOut.sksl
+++ b/tests/sksl/blend/BlendSrcOut.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_src_out(src, dst);
+void main() {
+    sk_FragColor = blend_src_out(src, dst);
 }
diff --git a/tests/sksl/blend/BlendSrcOver.sksl b/tests/sksl/blend/BlendSrcOver.sksl
index 13fba7b..c387d09 100644
--- a/tests/sksl/blend/BlendSrcOver.sksl
+++ b/tests/sksl/blend/BlendSrcOver.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_src_over(src, dst);
+void main() {
+    sk_FragColor = blend_src_over(src, dst);
 }
diff --git a/tests/sksl/blend/BlendXor.sksl b/tests/sksl/blend/BlendXor.sksl
index 1d76fdb..3cde08a 100644
--- a/tests/sksl/blend/BlendXor.sksl
+++ b/tests/sksl/blend/BlendXor.sksl
@@ -1,7 +1,7 @@
 /*#pragma settings Default*/
 
-uniform half4 src, dst;
+in half4 src, dst;
 
-half4 main() {
-    return blend_xor(src, dst);
+void main() {
+    sk_FragColor = blend_xor(src, dst);
 }
diff --git a/tests/sksl/blend/golden/BlendClear.glsl b/tests/sksl/blend/golden/BlendClear.glsl
index 09b6020..2130030 100644
--- a/tests/sksl/blend/golden/BlendClear.glsl
+++ b/tests/sksl/blend/golden/BlendClear.glsl
@@ -1,9 +1,10 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_clear(vec4 src, vec4 dst) {
     return vec4(0.0);
 }
-vec4 main() {
-    return vec4(0.0);
+void main() {
+    sk_FragColor = vec4(0.0);
 
 }
diff --git a/tests/sksl/blend/golden/BlendClear.metal b/tests/sksl/blend/golden/BlendClear.metal
new file mode 100644
index 0000000..bf75968
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendClear.metal
@@ -0,0 +1,20 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_clear(float4 src, float4 dst) {
+    return float4(0.0);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(0.0);
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendClearStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendClearStandaloneSettings.glsl
index db03140..4b97038 100644
--- a/tests/sksl/blend/golden/BlendClearStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendClearStandaloneSettings.glsl
@@ -1,9 +1,10 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_clear(vec4 src, vec4 dst) {
     return vec4(0.0);
 }
-vec4 main() {
-    return vec4(0.0);
+void main() {
+    sk_FragColor = vec4(0.0);
 
 }
diff --git a/tests/sksl/blend/golden/BlendColor.glsl b/tests/sksl/blend/golden/BlendColor.glsl
index fc1f8ed..0a8abb9 100644
--- a/tests/sksl/blend/golden/BlendColor.glsl
+++ b/tests/sksl/blend/golden/BlendColor.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_color_luminance(vec3 color) {
     return dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
 }
@@ -29,7 +30,7 @@
     vec3 dsa = dst.xyz * src.w;
     return vec4((((_blend_set_color_luminance(sda, alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_color;
     {
         float _1_alpha = dst.w * src.w;
@@ -38,6 +39,6 @@
         _0_blend_color = vec4((((_blend_set_color_luminance(_2_sda, _1_alpha, _3_dsa) + dst.xyz) - _3_dsa) + src.xyz) - _2_sda, (src.w + dst.w) - _1_alpha);
     }
 
-    return _0_blend_color;
+    sk_FragColor = _0_blend_color;
 
 }
diff --git a/tests/sksl/blend/golden/BlendColor.metal b/tests/sksl/blend/golden/BlendColor.metal
new file mode 100644
index 0000000..ae52139
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendColor.metal
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _blend_color_luminance(float3 color) {
+    return dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
+}
+float3 _blend_set_color_luminance(float3 hueSatColor, float alpha, float3 lumColor) {
+    float _4_blend_color_luminance;
+    {
+        _4_blend_color_luminance = dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), lumColor);
+    }
+    float lum = _4_blend_color_luminance;
+
+    float _5_blend_color_luminance;
+    {
+        _5_blend_color_luminance = dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), hueSatColor);
+    }
+    float3 result = (lum - _5_blend_color_luminance) + hueSatColor;
+
+    float minComp = min(min(result.x, result.y), result.z);
+    float maxComp = max(max(result.x, result.y), result.z);
+    if (minComp < 0.0 && lum != minComp) {
+        result = lum + ((result - lum) * lum) / (lum - minComp);
+    }
+    return maxComp > alpha && maxComp != lum ? lum + ((result - lum) * (alpha - lum)) / (maxComp - lum) : result;
+}
+float4 blend_color(float4 src, float4 dst) {
+    float alpha = dst.w * src.w;
+    float3 sda = src.xyz * dst.w;
+    float3 dsa = dst.xyz * src.w;
+    return float4((((_blend_set_color_luminance(sda, alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_color;
+    {
+        float _1_alpha = _in.dst.w * _in.src.w;
+        float3 _2_sda = _in.src.xyz * _in.dst.w;
+        float3 _3_dsa = _in.dst.xyz * _in.src.w;
+        _0_blend_color = float4((((_blend_set_color_luminance(_2_sda, _1_alpha, _3_dsa) + _in.dst.xyz) - _3_dsa) + _in.src.xyz) - _2_sda, (_in.src.w + _in.dst.w) - _1_alpha);
+    }
+
+    _out->sk_FragColor = _0_blend_color;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendColorBurn.glsl b/tests/sksl/blend/golden/BlendColorBurn.glsl
index b45684b..2bca526 100644
--- a/tests/sksl/blend/golden/BlendColorBurn.glsl
+++ b/tests/sksl/blend/golden/BlendColorBurn.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _guarded_divide(float n, float d) {
     return n / d;
 }
@@ -23,12 +24,12 @@
 vec4 blend_color_burn(vec4 src, vec4 dst) {
     return vec4(_color_burn_component(src.xw, dst.xw), _color_burn_component(src.yw, dst.yw), _color_burn_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_color_burn;
     {
         _0_blend_color_burn = vec4(_color_burn_component(src.xw, dst.xw), _color_burn_component(src.yw, dst.yw), _color_burn_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_color_burn;
+    sk_FragColor = _0_blend_color_burn;
 
 }
diff --git a/tests/sksl/blend/golden/BlendColorBurn.metal b/tests/sksl/blend/golden/BlendColorBurn.metal
new file mode 100644
index 0000000..a6c6d8d
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendColorBurn.metal
@@ -0,0 +1,45 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _guarded_divide(float n, float d) {
+    return n / d;
+}
+float _color_burn_component(float2 s, float2 d) {
+    if (d.y == d.x) {
+        return (s.y * d.y + s.x * (1.0 - d.y)) + d.x * (1.0 - s.y);
+    } else if (s.x == 0.0) {
+        return d.x * (1.0 - s.y);
+    } else {
+        float _1_guarded_divide;
+        float _2_n = (d.y - d.x) * s.y;
+        float _3_d = s.x;
+        {
+            _1_guarded_divide = _2_n / _3_d;
+        }
+        float delta = max(0.0, d.y - _1_guarded_divide);
+
+        return (delta * s.y + s.x * (1.0 - d.y)) + d.x * (1.0 - s.y);
+    }
+}
+float4 blend_color_burn(float4 src, float4 dst) {
+    return float4(_color_burn_component(src.xw, dst.xw), _color_burn_component(src.yw, dst.yw), _color_burn_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_color_burn;
+    {
+        _0_blend_color_burn = float4(_color_burn_component(_in.src.xw, _in.dst.xw), _color_burn_component(_in.src.yw, _in.dst.yw), _color_burn_component(_in.src.zw, _in.dst.zw), _in.src.w + (1.0 - _in.src.w) * _in.dst.w);
+    }
+
+    _out->sk_FragColor = _0_blend_color_burn;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendColorBurnStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendColorBurnStandaloneSettings.glsl
index 0cf3eac..251052a 100644
--- a/tests/sksl/blend/golden/BlendColorBurnStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendColorBurnStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _guarded_divide(float n, float d) {
     return n / d;
 }
@@ -23,12 +24,12 @@
 vec4 blend_color_burn(vec4 src, vec4 dst) {
     return vec4(_color_burn_component(src.xw, dst.xw), _color_burn_component(src.yw, dst.yw), _color_burn_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_color_burn;
     {
         _0_blend_color_burn = vec4(_color_burn_component(src.xw, dst.xw), _color_burn_component(src.yw, dst.yw), _color_burn_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_color_burn;
+    sk_FragColor = _0_blend_color_burn;
 
 }
diff --git a/tests/sksl/blend/golden/BlendColorDodge.glsl b/tests/sksl/blend/golden/BlendColorDodge.glsl
index 874ab3f..ce45c92 100644
--- a/tests/sksl/blend/golden/BlendColorDodge.glsl
+++ b/tests/sksl/blend/golden/BlendColorDodge.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _guarded_divide(float n, float d) {
     return n / d;
 }
@@ -25,12 +26,12 @@
 vec4 blend_color_dodge(vec4 src, vec4 dst) {
     return vec4(_color_dodge_component(src.xw, dst.xw), _color_dodge_component(src.yw, dst.yw), _color_dodge_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_color_dodge;
     {
         _0_blend_color_dodge = vec4(_color_dodge_component(src.xw, dst.xw), _color_dodge_component(src.yw, dst.yw), _color_dodge_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_color_dodge;
+    sk_FragColor = _0_blend_color_dodge;
 
 }
diff --git a/tests/sksl/blend/golden/BlendColorDodge.metal b/tests/sksl/blend/golden/BlendColorDodge.metal
new file mode 100644
index 0000000..bd48936
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendColorDodge.metal
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _guarded_divide(float n, float d) {
+    return n / d;
+}
+float _color_dodge_component(float2 s, float2 d) {
+    if (d.x == 0.0) {
+        return s.x * (1.0 - d.y);
+    } else {
+        float delta = s.y - s.x;
+        if (delta == 0.0) {
+            return (s.y * d.y + s.x * (1.0 - d.y)) + d.x * (1.0 - s.y);
+        } else {
+            float _1_guarded_divide;
+            float _2_n = d.x * s.y;
+            {
+                _1_guarded_divide = _2_n / delta;
+            }
+            delta = min(d.y, _1_guarded_divide);
+
+            return (delta * s.y + s.x * (1.0 - d.y)) + d.x * (1.0 - s.y);
+        }
+    }
+}
+float4 blend_color_dodge(float4 src, float4 dst) {
+    return float4(_color_dodge_component(src.xw, dst.xw), _color_dodge_component(src.yw, dst.yw), _color_dodge_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_color_dodge;
+    {
+        _0_blend_color_dodge = float4(_color_dodge_component(_in.src.xw, _in.dst.xw), _color_dodge_component(_in.src.yw, _in.dst.yw), _color_dodge_component(_in.src.zw, _in.dst.zw), _in.src.w + (1.0 - _in.src.w) * _in.dst.w);
+    }
+
+    _out->sk_FragColor = _0_blend_color_dodge;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendColorDodgeStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendColorDodgeStandaloneSettings.glsl
index 1d2b982..dcde287 100644
--- a/tests/sksl/blend/golden/BlendColorDodgeStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendColorDodgeStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _guarded_divide(float n, float d) {
     return n / d;
 }
@@ -25,12 +26,12 @@
 vec4 blend_color_dodge(vec4 src, vec4 dst) {
     return vec4(_color_dodge_component(src.xw, dst.xw), _color_dodge_component(src.yw, dst.yw), _color_dodge_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_color_dodge;
     {
         _0_blend_color_dodge = vec4(_color_dodge_component(src.xw, dst.xw), _color_dodge_component(src.yw, dst.yw), _color_dodge_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_color_dodge;
+    sk_FragColor = _0_blend_color_dodge;
 
 }
diff --git a/tests/sksl/blend/golden/BlendColorStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendColorStandaloneSettings.glsl
index 9ab77b3..cd3eef4 100644
--- a/tests/sksl/blend/golden/BlendColorStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendColorStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_color_luminance(vec3 color) {
     return dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
 }
@@ -29,7 +30,7 @@
     vec3 dsa = dst.xyz * src.w;
     return vec4((((_blend_set_color_luminance(sda, alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_color;
     {
         float _1_alpha = dst.w * src.w;
@@ -38,6 +39,6 @@
         _0_blend_color = vec4((((_blend_set_color_luminance(_2_sda, _1_alpha, _3_dsa) + dst.xyz) - _3_dsa) + src.xyz) - _2_sda, (src.w + dst.w) - _1_alpha);
     }
 
-    return _0_blend_color;
+    sk_FragColor = _0_blend_color;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDarken.glsl b/tests/sksl/blend/golden/BlendDarken.glsl
index 1e13d03..69afdbd 100644
--- a/tests/sksl/blend/golden/BlendDarken.glsl
+++ b/tests/sksl/blend/golden/BlendDarken.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_over(vec4 src, vec4 dst) {
     return src + (1.0 - src.w) * dst;
 }
@@ -13,7 +14,7 @@
     result.xyz = min(result.xyz, (1.0 - dst.w) * src.xyz + dst.xyz);
     return result;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_darken;
     {
         vec4 _3_blend_src_over;
@@ -26,6 +27,6 @@
         _0_blend_darken = _1_result;
     }
 
-    return _0_blend_darken;
+    sk_FragColor = _0_blend_darken;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDarken.metal b/tests/sksl/blend/golden/BlendDarken.metal
new file mode 100644
index 0000000..9c69c79
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendDarken.metal
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src_over(float4 src, float4 dst) {
+    return src + (1.0 - src.w) * dst;
+}
+float4 blend_darken(float4 src, float4 dst) {
+    float4 _2_blend_src_over;
+    {
+        _2_blend_src_over = src + (1.0 - src.w) * dst;
+    }
+    float4 result = _2_blend_src_over;
+
+    result.xyz = min(result.xyz, (1.0 - dst.w) * src.xyz + dst.xyz);
+    return result;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_darken;
+    {
+        float4 _3_blend_src_over;
+        {
+            _3_blend_src_over = _in.src + (1.0 - _in.src.w) * _in.dst;
+        }
+        float4 _1_result = _3_blend_src_over;
+
+        _1_result.xyz = min(_1_result.xyz, (1.0 - _in.dst.w) * _in.src.xyz + _in.dst.xyz);
+        _0_blend_darken = _1_result;
+    }
+
+    _out->sk_FragColor = _0_blend_darken;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendDarkenStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendDarkenStandaloneSettings.glsl
index 43d41a1..4c4ff90 100644
--- a/tests/sksl/blend/golden/BlendDarkenStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendDarkenStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_over(vec4 src, vec4 dst) {
     return src + (1.0 - src.w) * dst;
 }
@@ -13,7 +14,7 @@
     result.xyz = min(result.xyz, (1.0 - dst.w) * src.xyz + dst.xyz);
     return result;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_darken;
     {
         vec4 _3_blend_src_over;
@@ -26,6 +27,6 @@
         _0_blend_darken = _1_result;
     }
 
-    return _0_blend_darken;
+    sk_FragColor = _0_blend_darken;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDifference.glsl b/tests/sksl/blend/golden/BlendDifference.glsl
index e6c4636..f1c8e85 100644
--- a/tests/sksl/blend/golden/BlendDifference.glsl
+++ b/tests/sksl/blend/golden/BlendDifference.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_difference(vec4 src, vec4 dst) {
     return vec4((src.xyz + dst.xyz) - 2.0 * min(src.xyz * dst.w, dst.xyz * src.w), src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_difference;
     {
         _0_blend_difference = vec4((src.xyz + dst.xyz) - 2.0 * min(src.xyz * dst.w, dst.xyz * src.w), src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_difference;
+    sk_FragColor = _0_blend_difference;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDifference.metal b/tests/sksl/blend/golden/BlendDifference.metal
new file mode 100644
index 0000000..a11dd6c
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendDifference.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_difference(float4 src, float4 dst) {
+    return float4((src.xyz + dst.xyz) - 2.0 * min(src.xyz * dst.w, dst.xyz * src.w), src.w + (1.0 - src.w) * dst.w);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_difference;
+    {
+        _0_blend_difference = float4((_in.src.xyz + _in.dst.xyz) - 2.0 * min(_in.src.xyz * _in.dst.w, _in.dst.xyz * _in.src.w), _in.src.w + (1.0 - _in.src.w) * _in.dst.w);
+    }
+
+    _out->sk_FragColor = _0_blend_difference;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendDifferenceStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendDifferenceStandaloneSettings.glsl
index 73d0901..7ec4550 100644
--- a/tests/sksl/blend/golden/BlendDifferenceStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendDifferenceStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_difference(vec4 src, vec4 dst) {
     return vec4((src.xyz + dst.xyz) - 2.0 * min(src.xyz * dst.w, dst.xyz * src.w), src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_difference;
     {
         _0_blend_difference = vec4((src.xyz + dst.xyz) - 2.0 * min(src.xyz * dst.w, dst.xyz * src.w), src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_difference;
+    sk_FragColor = _0_blend_difference;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDst.glsl b/tests/sksl/blend/golden/BlendDst.glsl
index fb9657b..008a1d9 100644
--- a/tests/sksl/blend/golden/BlendDst.glsl
+++ b/tests/sksl/blend/golden/BlendDst.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_dst(vec4 src, vec4 dst) {
     return dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_dst;
     {
         _0_blend_dst = dst;
     }
 
-    return _0_blend_dst;
+    sk_FragColor = _0_blend_dst;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDst.metal b/tests/sksl/blend/golden/BlendDst.metal
new file mode 100644
index 0000000..e4d5e93
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendDst.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_dst(float4 src, float4 dst) {
+    return dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_dst;
+    {
+        _0_blend_dst = _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_dst;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendDstAtop.glsl b/tests/sksl/blend/golden/BlendDstAtop.glsl
index f131e13..8dbbb84 100644
--- a/tests/sksl/blend/golden/BlendDstAtop.glsl
+++ b/tests/sksl/blend/golden/BlendDstAtop.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_atop(vec4 src, vec4 dst) {
     return dst.w * src + (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_atop;
     {
         _0_blend_src_atop = dst.w * src + (1.0 - src.w) * dst;
     }
 
-    return _0_blend_src_atop;
+    sk_FragColor = _0_blend_src_atop;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDstAtop.metal b/tests/sksl/blend/golden/BlendDstAtop.metal
new file mode 100644
index 0000000..a1d43ca
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendDstAtop.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src_atop(float4 src, float4 dst) {
+    return dst.w * src + (1.0 - src.w) * dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_src_atop;
+    {
+        _0_blend_src_atop = _in.dst.w * _in.src + (1.0 - _in.src.w) * _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_src_atop;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendDstAtopStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendDstAtopStandaloneSettings.glsl
index c1f4177..b968793 100644
--- a/tests/sksl/blend/golden/BlendDstAtopStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendDstAtopStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_atop(vec4 src, vec4 dst) {
     return dst.w * src + (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_atop;
     {
         _0_blend_src_atop = dst.w * src + (1.0 - src.w) * dst;
     }
 
-    return _0_blend_src_atop;
+    sk_FragColor = _0_blend_src_atop;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDstIn.glsl b/tests/sksl/blend/golden/BlendDstIn.glsl
index a0eca0c..9e52c37 100644
--- a/tests/sksl/blend/golden/BlendDstIn.glsl
+++ b/tests/sksl/blend/golden/BlendDstIn.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_in(vec4 src, vec4 dst) {
     return src * dst.w;
 }
@@ -11,7 +12,7 @@
     return _1_blend_src_in;
 
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_dst_in;
     {
         vec4 _2_blend_src_in;
@@ -22,6 +23,6 @@
 
     }
 
-    return _0_blend_dst_in;
+    sk_FragColor = _0_blend_dst_in;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDstIn.metal b/tests/sksl/blend/golden/BlendDstIn.metal
new file mode 100644
index 0000000..1466fbc
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendDstIn.metal
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src_in(float4 src, float4 dst) {
+    return src * dst.w;
+}
+float4 blend_dst_in(float4 src, float4 dst) {
+    float4 _1_blend_src_in;
+    {
+        _1_blend_src_in = dst * src.w;
+    }
+    return _1_blend_src_in;
+
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_dst_in;
+    {
+        float4 _2_blend_src_in;
+        {
+            _2_blend_src_in = _in.dst * _in.src.w;
+        }
+        _0_blend_dst_in = _2_blend_src_in;
+
+    }
+
+    _out->sk_FragColor = _0_blend_dst_in;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendDstInStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendDstInStandaloneSettings.glsl
index f70b250..f9ca3a8 100644
--- a/tests/sksl/blend/golden/BlendDstInStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendDstInStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_in(vec4 src, vec4 dst) {
     return src * dst.w;
 }
@@ -11,7 +12,7 @@
     return _1_blend_src_in;
 
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_dst_in;
     {
         vec4 _2_blend_src_in;
@@ -22,6 +23,6 @@
 
     }
 
-    return _0_blend_dst_in;
+    sk_FragColor = _0_blend_dst_in;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDstOut.glsl b/tests/sksl/blend/golden/BlendDstOut.glsl
index a517270..f895391 100644
--- a/tests/sksl/blend/golden/BlendDstOut.glsl
+++ b/tests/sksl/blend/golden/BlendDstOut.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_dst_out(vec4 src, vec4 dst) {
     return (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_dst_out;
     {
         _0_blend_dst_out = (1.0 - src.w) * dst;
     }
 
-    return _0_blend_dst_out;
+    sk_FragColor = _0_blend_dst_out;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDstOut.metal b/tests/sksl/blend/golden/BlendDstOut.metal
new file mode 100644
index 0000000..b53f7fe0
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendDstOut.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_dst_out(float4 src, float4 dst) {
+    return (1.0 - src.w) * dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_dst_out;
+    {
+        _0_blend_dst_out = (1.0 - _in.src.w) * _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_dst_out;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendDstOutStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendDstOutStandaloneSettings.glsl
index d78c853..a1ab25d 100644
--- a/tests/sksl/blend/golden/BlendDstOutStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendDstOutStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_dst_out(vec4 src, vec4 dst) {
     return (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_dst_out;
     {
         _0_blend_dst_out = (1.0 - src.w) * dst;
     }
 
-    return _0_blend_dst_out;
+    sk_FragColor = _0_blend_dst_out;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDstOver.glsl b/tests/sksl/blend/golden/BlendDstOver.glsl
index 824a4b19..c2a54c0 100644
--- a/tests/sksl/blend/golden/BlendDstOver.glsl
+++ b/tests/sksl/blend/golden/BlendDstOver.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_dst_over(vec4 src, vec4 dst) {
     return (1.0 - dst.w) * src + dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_dst_over;
     {
         _0_blend_dst_over = (1.0 - dst.w) * src + dst;
     }
 
-    return _0_blend_dst_over;
+    sk_FragColor = _0_blend_dst_over;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDstOver.metal b/tests/sksl/blend/golden/BlendDstOver.metal
new file mode 100644
index 0000000..566fac1
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendDstOver.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_dst_over(float4 src, float4 dst) {
+    return (1.0 - dst.w) * src + dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_dst_over;
+    {
+        _0_blend_dst_over = (1.0 - _in.dst.w) * _in.src + _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_dst_over;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendDstOverStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendDstOverStandaloneSettings.glsl
index e81a533..6c3ec37 100644
--- a/tests/sksl/blend/golden/BlendDstOverStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendDstOverStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_dst_over(vec4 src, vec4 dst) {
     return (1.0 - dst.w) * src + dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_dst_over;
     {
         _0_blend_dst_over = (1.0 - dst.w) * src + dst;
     }
 
-    return _0_blend_dst_over;
+    sk_FragColor = _0_blend_dst_over;
 
 }
diff --git a/tests/sksl/blend/golden/BlendDstStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendDstStandaloneSettings.glsl
index 599aff2..1ef3eb3 100644
--- a/tests/sksl/blend/golden/BlendDstStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendDstStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_dst(vec4 src, vec4 dst) {
     return dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_dst;
     {
         _0_blend_dst = dst;
     }
 
-    return _0_blend_dst;
+    sk_FragColor = _0_blend_dst;
 
 }
diff --git a/tests/sksl/blend/golden/BlendExclusion.glsl b/tests/sksl/blend/golden/BlendExclusion.glsl
index 7a6cfc2..602762d 100644
--- a/tests/sksl/blend/golden/BlendExclusion.glsl
+++ b/tests/sksl/blend/golden/BlendExclusion.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_exclusion(vec4 src, vec4 dst) {
     return vec4((dst.xyz + src.xyz) - (2.0 * dst.xyz) * src.xyz, src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_exclusion;
     {
         _0_blend_exclusion = vec4((dst.xyz + src.xyz) - (2.0 * dst.xyz) * src.xyz, src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_exclusion;
+    sk_FragColor = _0_blend_exclusion;
 
 }
diff --git a/tests/sksl/blend/golden/BlendExclusion.metal b/tests/sksl/blend/golden/BlendExclusion.metal
new file mode 100644
index 0000000..b1f2683
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendExclusion.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_exclusion(float4 src, float4 dst) {
+    return float4((dst.xyz + src.xyz) - (2.0 * dst.xyz) * src.xyz, src.w + (1.0 - src.w) * dst.w);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_exclusion;
+    {
+        _0_blend_exclusion = float4((_in.dst.xyz + _in.src.xyz) - (2.0 * _in.dst.xyz) * _in.src.xyz, _in.src.w + (1.0 - _in.src.w) * _in.dst.w);
+    }
+
+    _out->sk_FragColor = _0_blend_exclusion;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendExclusionStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendExclusionStandaloneSettings.glsl
index 047580f..bfc74c8 100644
--- a/tests/sksl/blend/golden/BlendExclusionStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendExclusionStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_exclusion(vec4 src, vec4 dst) {
     return vec4((dst.xyz + src.xyz) - (2.0 * dst.xyz) * src.xyz, src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_exclusion;
     {
         _0_blend_exclusion = vec4((dst.xyz + src.xyz) - (2.0 * dst.xyz) * src.xyz, src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_exclusion;
+    sk_FragColor = _0_blend_exclusion;
 
 }
diff --git a/tests/sksl/blend/golden/BlendHardLight.glsl b/tests/sksl/blend/golden/BlendHardLight.glsl
index 6a60c48..779f9af 100644
--- a/tests/sksl/blend/golden/BlendHardLight.glsl
+++ b/tests/sksl/blend/golden/BlendHardLight.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_overlay_component(vec2 s, vec2 d) {
     return 2.0 * d.x <= d.y ? (2.0 * s.x) * d.x : s.y * d.y - (2.0 * (d.y - d.x)) * (s.y - s.x);
 }
@@ -32,12 +33,12 @@
 vec4 blend_hard_light(vec4 src, vec4 dst) {
     return blend_overlay(dst, src);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_hard_light;
     {
         _0_blend_hard_light = blend_overlay(dst, src);
     }
 
-    return _0_blend_hard_light;
+    sk_FragColor = _0_blend_hard_light;
 
 }
diff --git a/tests/sksl/blend/golden/BlendHardLight.metal b/tests/sksl/blend/golden/BlendHardLight.metal
new file mode 100644
index 0000000..7fcce70
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendHardLight.metal
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _blend_overlay_component(float2 s, float2 d) {
+    return 2.0 * d.x <= d.y ? (2.0 * s.x) * d.x : s.y * d.y - (2.0 * (d.y - d.x)) * (s.y - s.x);
+}
+float4 blend_overlay(float4 src, float4 dst) {
+    float _1_blend_overlay_component;
+    float2 _2_s = src.xw;
+    float2 _3_d = dst.xw;
+    {
+        _1_blend_overlay_component = 2.0 * _3_d.x <= _3_d.y ? (2.0 * _2_s.x) * _3_d.x : _2_s.y * _3_d.y - (2.0 * (_3_d.y - _3_d.x)) * (_2_s.y - _2_s.x);
+    }
+    float _4_blend_overlay_component;
+    float2 _5_s = src.yw;
+    float2 _6_d = dst.yw;
+    {
+        _4_blend_overlay_component = 2.0 * _6_d.x <= _6_d.y ? (2.0 * _5_s.x) * _6_d.x : _5_s.y * _6_d.y - (2.0 * (_6_d.y - _6_d.x)) * (_5_s.y - _5_s.x);
+    }
+    float _7_blend_overlay_component;
+    float2 _8_s = src.zw;
+    float2 _9_d = dst.zw;
+    {
+        _7_blend_overlay_component = 2.0 * _9_d.x <= _9_d.y ? (2.0 * _8_s.x) * _9_d.x : _8_s.y * _9_d.y - (2.0 * (_9_d.y - _9_d.x)) * (_8_s.y - _8_s.x);
+    }
+    float4 result = float4(_1_blend_overlay_component, _4_blend_overlay_component, _7_blend_overlay_component, src.w + (1.0 - src.w) * dst.w);
+
+
+
+    result.xyz = result.xyz + dst.xyz * (1.0 - src.w) + src.xyz * (1.0 - dst.w);
+    return result;
+}
+float4 blend_hard_light(float4 src, float4 dst) {
+    return blend_overlay(dst, src);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_hard_light;
+    {
+        _0_blend_hard_light = blend_overlay(_in.dst, _in.src);
+    }
+
+    _out->sk_FragColor = _0_blend_hard_light;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendHardLightStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendHardLightStandaloneSettings.glsl
index 5c55914..3dee5dc 100644
--- a/tests/sksl/blend/golden/BlendHardLightStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendHardLightStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_overlay_component(vec2 s, vec2 d) {
     return 2.0 * d.x <= d.y ? (2.0 * s.x) * d.x : s.y * d.y - (2.0 * (d.y - d.x)) * (s.y - s.x);
 }
@@ -32,12 +33,12 @@
 vec4 blend_hard_light(vec4 src, vec4 dst) {
     return blend_overlay(dst, src);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_hard_light;
     {
         _0_blend_hard_light = blend_overlay(dst, src);
     }
 
-    return _0_blend_hard_light;
+    sk_FragColor = _0_blend_hard_light;
 
 }
diff --git a/tests/sksl/blend/golden/BlendHue.glsl b/tests/sksl/blend/golden/BlendHue.glsl
index 73db773..c732860 100644
--- a/tests/sksl/blend/golden/BlendHue.glsl
+++ b/tests/sksl/blend/golden/BlendHue.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_color_luminance(vec3 color) {
     return dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
 }
@@ -94,6 +95,6 @@
     vec3 dsa = dst.xyz * src.w;
     return vec4((((_blend_set_color_luminance(_blend_set_color_saturation(sda, dsa), alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
 }
-vec4 main() {
-    return blend_hue(src, dst);
+void main() {
+    sk_FragColor = blend_hue(src, dst);
 }
diff --git a/tests/sksl/blend/golden/BlendHue.metal b/tests/sksl/blend/golden/BlendHue.metal
new file mode 100644
index 0000000..fd6b63b
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendHue.metal
@@ -0,0 +1,110 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _blend_color_luminance(float3 color) {
+    return dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
+}
+float3 _blend_set_color_luminance(float3 hueSatColor, float alpha, float3 lumColor) {
+    float _0_blend_color_luminance;
+    {
+        _0_blend_color_luminance = dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), lumColor);
+    }
+    float lum = _0_blend_color_luminance;
+
+    float _1_blend_color_luminance;
+    {
+        _1_blend_color_luminance = dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), hueSatColor);
+    }
+    float3 result = (lum - _1_blend_color_luminance) + hueSatColor;
+
+    float minComp = min(min(result.x, result.y), result.z);
+    float maxComp = max(max(result.x, result.y), result.z);
+    if (minComp < 0.0 && lum != minComp) {
+        result = lum + ((result - lum) * lum) / (lum - minComp);
+    }
+    return maxComp > alpha && maxComp != lum ? lum + ((result - lum) * (alpha - lum)) / (maxComp - lum) : result;
+}
+float _blend_color_saturation(float3 color) {
+    return max(max(color.x, color.y), color.z) - min(min(color.x, color.y), color.z);
+}
+float3 _blend_set_color_saturation_helper(float3 minMidMax, float sat) {
+    return minMidMax.x < minMidMax.z ? float3(0.0, (sat * (minMidMax.y - minMidMax.x)) / (minMidMax.z - minMidMax.x), sat) : float3(0.0);
+}
+float3 _blend_set_color_saturation(float3 hueLumColor, float3 satColor) {
+    float _2_blend_color_saturation;
+    {
+        _2_blend_color_saturation = max(max(satColor.x, satColor.y), satColor.z) - min(min(satColor.x, satColor.y), satColor.z);
+    }
+    float sat = _2_blend_color_saturation;
+
+    if (hueLumColor.x <= hueLumColor.y) {
+        if (hueLumColor.y <= hueLumColor.z) {
+            float3 _3_blend_set_color_saturation_helper;
+            {
+                _3_blend_set_color_saturation_helper = hueLumColor.x < hueLumColor.z ? float3(0.0, (sat * (hueLumColor.y - hueLumColor.x)) / (hueLumColor.z - hueLumColor.x), sat) : float3(0.0);
+            }
+            hueLumColor.xyz = _3_blend_set_color_saturation_helper;
+
+        } else if (hueLumColor.x <= hueLumColor.z) {
+            float3 _4_blend_set_color_saturation_helper;
+            float3 _5_minMidMax = hueLumColor.xzy;
+            {
+                _4_blend_set_color_saturation_helper = _5_minMidMax.x < _5_minMidMax.z ? float3(0.0, (sat * (_5_minMidMax.y - _5_minMidMax.x)) / (_5_minMidMax.z - _5_minMidMax.x), sat) : float3(0.0);
+            }
+            hueLumColor.xzy = _4_blend_set_color_saturation_helper;
+
+        } else {
+            float3 _6_blend_set_color_saturation_helper;
+            float3 _7_minMidMax = hueLumColor.zxy;
+            {
+                _6_blend_set_color_saturation_helper = _7_minMidMax.x < _7_minMidMax.z ? float3(0.0, (sat * (_7_minMidMax.y - _7_minMidMax.x)) / (_7_minMidMax.z - _7_minMidMax.x), sat) : float3(0.0);
+            }
+            hueLumColor.zxy = _6_blend_set_color_saturation_helper;
+
+        }
+    } else if (hueLumColor.x <= hueLumColor.z) {
+        float3 _8_blend_set_color_saturation_helper;
+        float3 _9_minMidMax = hueLumColor.yxz;
+        {
+            _8_blend_set_color_saturation_helper = _9_minMidMax.x < _9_minMidMax.z ? float3(0.0, (sat * (_9_minMidMax.y - _9_minMidMax.x)) / (_9_minMidMax.z - _9_minMidMax.x), sat) : float3(0.0);
+        }
+        hueLumColor.yxz = _8_blend_set_color_saturation_helper;
+
+    } else if (hueLumColor.y <= hueLumColor.z) {
+        float3 _10_blend_set_color_saturation_helper;
+        float3 _11_minMidMax = hueLumColor.yzx;
+        {
+            _10_blend_set_color_saturation_helper = _11_minMidMax.x < _11_minMidMax.z ? float3(0.0, (sat * (_11_minMidMax.y - _11_minMidMax.x)) / (_11_minMidMax.z - _11_minMidMax.x), sat) : float3(0.0);
+        }
+        hueLumColor.yzx = _10_blend_set_color_saturation_helper;
+
+    } else {
+        float3 _12_blend_set_color_saturation_helper;
+        float3 _13_minMidMax = hueLumColor.zyx;
+        {
+            _12_blend_set_color_saturation_helper = _13_minMidMax.x < _13_minMidMax.z ? float3(0.0, (sat * (_13_minMidMax.y - _13_minMidMax.x)) / (_13_minMidMax.z - _13_minMidMax.x), sat) : float3(0.0);
+        }
+        hueLumColor.zyx = _12_blend_set_color_saturation_helper;
+
+    }
+    return hueLumColor;
+}
+float4 blend_hue(float4 src, float4 dst) {
+    float alpha = dst.w * src.w;
+    float3 sda = src.xyz * dst.w;
+    float3 dsa = dst.xyz * src.w;
+    return float4((((_blend_set_color_luminance(_blend_set_color_saturation(sda, dsa), alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = blend_hue(_in.src, _in.dst);
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendHueStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendHueStandaloneSettings.glsl
index cb3bcd3..718ced9 100644
--- a/tests/sksl/blend/golden/BlendHueStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendHueStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_color_luminance(vec3 color) {
     return dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
 }
@@ -94,6 +95,6 @@
     vec3 dsa = dst.xyz * src.w;
     return vec4((((_blend_set_color_luminance(_blend_set_color_saturation(sda, dsa), alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
 }
-vec4 main() {
-    return blend_hue(src, dst);
+void main() {
+    sk_FragColor = blend_hue(src, dst);
 }
diff --git a/tests/sksl/blend/golden/BlendLighten.glsl b/tests/sksl/blend/golden/BlendLighten.glsl
index 1842231..de387e3 100644
--- a/tests/sksl/blend/golden/BlendLighten.glsl
+++ b/tests/sksl/blend/golden/BlendLighten.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_over(vec4 src, vec4 dst) {
     return src + (1.0 - src.w) * dst;
 }
@@ -13,7 +14,7 @@
     result.xyz = max(result.xyz, (1.0 - dst.w) * src.xyz + dst.xyz);
     return result;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_lighten;
     {
         vec4 _3_blend_src_over;
@@ -26,6 +27,6 @@
         _0_blend_lighten = _1_result;
     }
 
-    return _0_blend_lighten;
+    sk_FragColor = _0_blend_lighten;
 
 }
diff --git a/tests/sksl/blend/golden/BlendLighten.metal b/tests/sksl/blend/golden/BlendLighten.metal
new file mode 100644
index 0000000..3ff75bc
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendLighten.metal
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src_over(float4 src, float4 dst) {
+    return src + (1.0 - src.w) * dst;
+}
+float4 blend_lighten(float4 src, float4 dst) {
+    float4 _2_blend_src_over;
+    {
+        _2_blend_src_over = src + (1.0 - src.w) * dst;
+    }
+    float4 result = _2_blend_src_over;
+
+    result.xyz = max(result.xyz, (1.0 - dst.w) * src.xyz + dst.xyz);
+    return result;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_lighten;
+    {
+        float4 _3_blend_src_over;
+        {
+            _3_blend_src_over = _in.src + (1.0 - _in.src.w) * _in.dst;
+        }
+        float4 _1_result = _3_blend_src_over;
+
+        _1_result.xyz = max(_1_result.xyz, (1.0 - _in.dst.w) * _in.src.xyz + _in.dst.xyz);
+        _0_blend_lighten = _1_result;
+    }
+
+    _out->sk_FragColor = _0_blend_lighten;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendLightenStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendLightenStandaloneSettings.glsl
index 5b7c9cc..cdf673b 100644
--- a/tests/sksl/blend/golden/BlendLightenStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendLightenStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_over(vec4 src, vec4 dst) {
     return src + (1.0 - src.w) * dst;
 }
@@ -13,7 +14,7 @@
     result.xyz = max(result.xyz, (1.0 - dst.w) * src.xyz + dst.xyz);
     return result;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_lighten;
     {
         vec4 _3_blend_src_over;
@@ -26,6 +27,6 @@
         _0_blend_lighten = _1_result;
     }
 
-    return _0_blend_lighten;
+    sk_FragColor = _0_blend_lighten;
 
 }
diff --git a/tests/sksl/blend/golden/BlendLuminosity.glsl b/tests/sksl/blend/golden/BlendLuminosity.glsl
index 0b8b6e0..5131c15 100644
--- a/tests/sksl/blend/golden/BlendLuminosity.glsl
+++ b/tests/sksl/blend/golden/BlendLuminosity.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_color_luminance(vec3 color) {
     return dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
 }
@@ -29,7 +30,7 @@
     vec3 dsa = dst.xyz * src.w;
     return vec4((((_blend_set_color_luminance(dsa, alpha, sda) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_luminosity;
     {
         float _1_alpha = dst.w * src.w;
@@ -38,6 +39,6 @@
         _0_blend_luminosity = vec4((((_blend_set_color_luminance(_3_dsa, _1_alpha, _2_sda) + dst.xyz) - _3_dsa) + src.xyz) - _2_sda, (src.w + dst.w) - _1_alpha);
     }
 
-    return _0_blend_luminosity;
+    sk_FragColor = _0_blend_luminosity;
 
 }
diff --git a/tests/sksl/blend/golden/BlendLuminosity.metal b/tests/sksl/blend/golden/BlendLuminosity.metal
new file mode 100644
index 0000000..edc9ae8
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendLuminosity.metal
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _blend_color_luminance(float3 color) {
+    return dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
+}
+float3 _blend_set_color_luminance(float3 hueSatColor, float alpha, float3 lumColor) {
+    float _4_blend_color_luminance;
+    {
+        _4_blend_color_luminance = dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), lumColor);
+    }
+    float lum = _4_blend_color_luminance;
+
+    float _5_blend_color_luminance;
+    {
+        _5_blend_color_luminance = dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), hueSatColor);
+    }
+    float3 result = (lum - _5_blend_color_luminance) + hueSatColor;
+
+    float minComp = min(min(result.x, result.y), result.z);
+    float maxComp = max(max(result.x, result.y), result.z);
+    if (minComp < 0.0 && lum != minComp) {
+        result = lum + ((result - lum) * lum) / (lum - minComp);
+    }
+    return maxComp > alpha && maxComp != lum ? lum + ((result - lum) * (alpha - lum)) / (maxComp - lum) : result;
+}
+float4 blend_luminosity(float4 src, float4 dst) {
+    float alpha = dst.w * src.w;
+    float3 sda = src.xyz * dst.w;
+    float3 dsa = dst.xyz * src.w;
+    return float4((((_blend_set_color_luminance(dsa, alpha, sda) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_luminosity;
+    {
+        float _1_alpha = _in.dst.w * _in.src.w;
+        float3 _2_sda = _in.src.xyz * _in.dst.w;
+        float3 _3_dsa = _in.dst.xyz * _in.src.w;
+        _0_blend_luminosity = float4((((_blend_set_color_luminance(_3_dsa, _1_alpha, _2_sda) + _in.dst.xyz) - _3_dsa) + _in.src.xyz) - _2_sda, (_in.src.w + _in.dst.w) - _1_alpha);
+    }
+
+    _out->sk_FragColor = _0_blend_luminosity;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendLuminosityStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendLuminosityStandaloneSettings.glsl
index 52ab56a..d32473f 100644
--- a/tests/sksl/blend/golden/BlendLuminosityStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendLuminosityStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_color_luminance(vec3 color) {
     return dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
 }
@@ -29,7 +30,7 @@
     vec3 dsa = dst.xyz * src.w;
     return vec4((((_blend_set_color_luminance(dsa, alpha, sda) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_luminosity;
     {
         float _1_alpha = dst.w * src.w;
@@ -38,6 +39,6 @@
         _0_blend_luminosity = vec4((((_blend_set_color_luminance(_3_dsa, _1_alpha, _2_sda) + dst.xyz) - _3_dsa) + src.xyz) - _2_sda, (src.w + dst.w) - _1_alpha);
     }
 
-    return _0_blend_luminosity;
+    sk_FragColor = _0_blend_luminosity;
 
 }
diff --git a/tests/sksl/blend/golden/BlendModulate.glsl b/tests/sksl/blend/golden/BlendModulate.glsl
index 86cc71a..0b5254a 100644
--- a/tests/sksl/blend/golden/BlendModulate.glsl
+++ b/tests/sksl/blend/golden/BlendModulate.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_modulate(vec4 src, vec4 dst) {
     return src * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_modulate;
     {
         _0_blend_modulate = src * dst;
     }
 
-    return _0_blend_modulate;
+    sk_FragColor = _0_blend_modulate;
 
 }
diff --git a/tests/sksl/blend/golden/BlendModulate.metal b/tests/sksl/blend/golden/BlendModulate.metal
new file mode 100644
index 0000000..d36a5b2
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendModulate.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_modulate(float4 src, float4 dst) {
+    return src * dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_modulate;
+    {
+        _0_blend_modulate = _in.src * _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_modulate;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendModulateStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendModulateStandaloneSettings.glsl
index 76c3d02..867d0a0 100644
--- a/tests/sksl/blend/golden/BlendModulateStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendModulateStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_modulate(vec4 src, vec4 dst) {
     return src * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_modulate;
     {
         _0_blend_modulate = src * dst;
     }
 
-    return _0_blend_modulate;
+    sk_FragColor = _0_blend_modulate;
 
 }
diff --git a/tests/sksl/blend/golden/BlendMultiply.glsl b/tests/sksl/blend/golden/BlendMultiply.glsl
index 8c4bd02..6757581 100644
--- a/tests/sksl/blend/golden/BlendMultiply.glsl
+++ b/tests/sksl/blend/golden/BlendMultiply.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_multiply(vec4 src, vec4 dst) {
     return vec4(((1.0 - src.w) * dst.xyz + (1.0 - dst.w) * src.xyz) + src.xyz * dst.xyz, src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_multiply;
     {
         _0_blend_multiply = vec4(((1.0 - src.w) * dst.xyz + (1.0 - dst.w) * src.xyz) + src.xyz * dst.xyz, src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_multiply;
+    sk_FragColor = _0_blend_multiply;
 
 }
diff --git a/tests/sksl/blend/golden/BlendMultiply.metal b/tests/sksl/blend/golden/BlendMultiply.metal
new file mode 100644
index 0000000..65b5c74
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendMultiply.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_multiply(float4 src, float4 dst) {
+    return float4(((1.0 - src.w) * dst.xyz + (1.0 - dst.w) * src.xyz) + src.xyz * dst.xyz, src.w + (1.0 - src.w) * dst.w);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_multiply;
+    {
+        _0_blend_multiply = float4(((1.0 - _in.src.w) * _in.dst.xyz + (1.0 - _in.dst.w) * _in.src.xyz) + _in.src.xyz * _in.dst.xyz, _in.src.w + (1.0 - _in.src.w) * _in.dst.w);
+    }
+
+    _out->sk_FragColor = _0_blend_multiply;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendMultiplyStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendMultiplyStandaloneSettings.glsl
index 37afc72..f212214 100644
--- a/tests/sksl/blend/golden/BlendMultiplyStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendMultiplyStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_multiply(vec4 src, vec4 dst) {
     return vec4(((1.0 - src.w) * dst.xyz + (1.0 - dst.w) * src.xyz) + src.xyz * dst.xyz, src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_multiply;
     {
         _0_blend_multiply = vec4(((1.0 - src.w) * dst.xyz + (1.0 - dst.w) * src.xyz) + src.xyz * dst.xyz, src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_multiply;
+    sk_FragColor = _0_blend_multiply;
 
 }
diff --git a/tests/sksl/blend/golden/BlendOverlap.glsl b/tests/sksl/blend/golden/BlendOverlap.glsl
index 9b291fc..4513be8 100644
--- a/tests/sksl/blend/golden/BlendOverlap.glsl
+++ b/tests/sksl/blend/golden/BlendOverlap.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_overlay_component(vec2 s, vec2 d) {
     return 2.0 * d.x <= d.y ? (2.0 * s.x) * d.x : s.y * d.y - (2.0 * (d.y - d.x)) * (s.y - s.x);
 }
@@ -29,6 +30,6 @@
     result.xyz += dst.xyz * (1.0 - src.w) + src.xyz * (1.0 - dst.w);
     return result;
 }
-vec4 main() {
-    return blend_overlay(src, dst);
+void main() {
+    sk_FragColor = blend_overlay(src, dst);
 }
diff --git a/tests/sksl/blend/golden/BlendOverlap.metal b/tests/sksl/blend/golden/BlendOverlap.metal
new file mode 100644
index 0000000..83327db
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendOverlap.metal
@@ -0,0 +1,45 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _blend_overlay_component(float2 s, float2 d) {
+    return 2.0 * d.x <= d.y ? (2.0 * s.x) * d.x : s.y * d.y - (2.0 * (d.y - d.x)) * (s.y - s.x);
+}
+float4 blend_overlay(float4 src, float4 dst) {
+    float _0_blend_overlay_component;
+    float2 _1_s = src.xw;
+    float2 _2_d = dst.xw;
+    {
+        _0_blend_overlay_component = 2.0 * _2_d.x <= _2_d.y ? (2.0 * _1_s.x) * _2_d.x : _1_s.y * _2_d.y - (2.0 * (_2_d.y - _2_d.x)) * (_1_s.y - _1_s.x);
+    }
+    float _3_blend_overlay_component;
+    float2 _4_s = src.yw;
+    float2 _5_d = dst.yw;
+    {
+        _3_blend_overlay_component = 2.0 * _5_d.x <= _5_d.y ? (2.0 * _4_s.x) * _5_d.x : _4_s.y * _5_d.y - (2.0 * (_5_d.y - _5_d.x)) * (_4_s.y - _4_s.x);
+    }
+    float _6_blend_overlay_component;
+    float2 _7_s = src.zw;
+    float2 _8_d = dst.zw;
+    {
+        _6_blend_overlay_component = 2.0 * _8_d.x <= _8_d.y ? (2.0 * _7_s.x) * _8_d.x : _7_s.y * _8_d.y - (2.0 * (_8_d.y - _8_d.x)) * (_7_s.y - _7_s.x);
+    }
+    float4 result = float4(_0_blend_overlay_component, _3_blend_overlay_component, _6_blend_overlay_component, src.w + (1.0 - src.w) * dst.w);
+
+
+
+    result.xyz = result.xyz + dst.xyz * (1.0 - src.w) + src.xyz * (1.0 - dst.w);
+    return result;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = blend_overlay(_in.src, _in.dst);
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendOverlapStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendOverlapStandaloneSettings.glsl
index cef2132..ef1b15d 100644
--- a/tests/sksl/blend/golden/BlendOverlapStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendOverlapStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_overlay_component(vec2 s, vec2 d) {
     return 2.0 * d.x <= d.y ? (2.0 * s.x) * d.x : s.y * d.y - (2.0 * (d.y - d.x)) * (s.y - s.x);
 }
@@ -29,6 +30,6 @@
     result.xyz += dst.xyz * (1.0 - src.w) + src.xyz * (1.0 - dst.w);
     return result;
 }
-vec4 main() {
-    return blend_overlay(src, dst);
+void main() {
+    sk_FragColor = blend_overlay(src, dst);
 }
diff --git a/tests/sksl/blend/golden/BlendPlus.glsl b/tests/sksl/blend/golden/BlendPlus.glsl
index 7f270a7..aae0626 100644
--- a/tests/sksl/blend/golden/BlendPlus.glsl
+++ b/tests/sksl/blend/golden/BlendPlus.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_plus(vec4 src, vec4 dst) {
     return min(src + dst, 1.0);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_plus;
     {
         _0_blend_plus = min(src + dst, 1.0);
     }
 
-    return _0_blend_plus;
+    sk_FragColor = _0_blend_plus;
 
 }
diff --git a/tests/sksl/blend/golden/BlendPlus.metal b/tests/sksl/blend/golden/BlendPlus.metal
new file mode 100644
index 0000000..e50c555
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendPlus.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_plus(float4 src, float4 dst) {
+    return min(src + dst, 1.0);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_plus;
+    {
+        _0_blend_plus = min(_in.src + _in.dst, 1.0);
+    }
+
+    _out->sk_FragColor = _0_blend_plus;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendPlusStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendPlusStandaloneSettings.glsl
index 78f7184..43459ce 100644
--- a/tests/sksl/blend/golden/BlendPlusStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendPlusStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_plus(vec4 src, vec4 dst) {
     return min(src + dst, 1.0);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_plus;
     {
         _0_blend_plus = min(src + dst, 1.0);
     }
 
-    return _0_blend_plus;
+    sk_FragColor = _0_blend_plus;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSaturation.glsl b/tests/sksl/blend/golden/BlendSaturation.glsl
index 228c99d..4dcd4dd 100644
--- a/tests/sksl/blend/golden/BlendSaturation.glsl
+++ b/tests/sksl/blend/golden/BlendSaturation.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_color_luminance(vec3 color) {
     return dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
 }
@@ -94,6 +95,6 @@
     vec3 dsa = dst.xyz * src.w;
     return vec4((((_blend_set_color_luminance(_blend_set_color_saturation(dsa, sda), alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
 }
-vec4 main() {
-    return blend_saturation(src, dst);
+void main() {
+    sk_FragColor = blend_saturation(src, dst);
 }
diff --git a/tests/sksl/blend/golden/BlendSaturation.metal b/tests/sksl/blend/golden/BlendSaturation.metal
new file mode 100644
index 0000000..6f0facd
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendSaturation.metal
@@ -0,0 +1,110 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _blend_color_luminance(float3 color) {
+    return dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
+}
+float3 _blend_set_color_luminance(float3 hueSatColor, float alpha, float3 lumColor) {
+    float _0_blend_color_luminance;
+    {
+        _0_blend_color_luminance = dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), lumColor);
+    }
+    float lum = _0_blend_color_luminance;
+
+    float _1_blend_color_luminance;
+    {
+        _1_blend_color_luminance = dot(float3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), hueSatColor);
+    }
+    float3 result = (lum - _1_blend_color_luminance) + hueSatColor;
+
+    float minComp = min(min(result.x, result.y), result.z);
+    float maxComp = max(max(result.x, result.y), result.z);
+    if (minComp < 0.0 && lum != minComp) {
+        result = lum + ((result - lum) * lum) / (lum - minComp);
+    }
+    return maxComp > alpha && maxComp != lum ? lum + ((result - lum) * (alpha - lum)) / (maxComp - lum) : result;
+}
+float _blend_color_saturation(float3 color) {
+    return max(max(color.x, color.y), color.z) - min(min(color.x, color.y), color.z);
+}
+float3 _blend_set_color_saturation_helper(float3 minMidMax, float sat) {
+    return minMidMax.x < minMidMax.z ? float3(0.0, (sat * (minMidMax.y - minMidMax.x)) / (minMidMax.z - minMidMax.x), sat) : float3(0.0);
+}
+float3 _blend_set_color_saturation(float3 hueLumColor, float3 satColor) {
+    float _2_blend_color_saturation;
+    {
+        _2_blend_color_saturation = max(max(satColor.x, satColor.y), satColor.z) - min(min(satColor.x, satColor.y), satColor.z);
+    }
+    float sat = _2_blend_color_saturation;
+
+    if (hueLumColor.x <= hueLumColor.y) {
+        if (hueLumColor.y <= hueLumColor.z) {
+            float3 _3_blend_set_color_saturation_helper;
+            {
+                _3_blend_set_color_saturation_helper = hueLumColor.x < hueLumColor.z ? float3(0.0, (sat * (hueLumColor.y - hueLumColor.x)) / (hueLumColor.z - hueLumColor.x), sat) : float3(0.0);
+            }
+            hueLumColor.xyz = _3_blend_set_color_saturation_helper;
+
+        } else if (hueLumColor.x <= hueLumColor.z) {
+            float3 _4_blend_set_color_saturation_helper;
+            float3 _5_minMidMax = hueLumColor.xzy;
+            {
+                _4_blend_set_color_saturation_helper = _5_minMidMax.x < _5_minMidMax.z ? float3(0.0, (sat * (_5_minMidMax.y - _5_minMidMax.x)) / (_5_minMidMax.z - _5_minMidMax.x), sat) : float3(0.0);
+            }
+            hueLumColor.xzy = _4_blend_set_color_saturation_helper;
+
+        } else {
+            float3 _6_blend_set_color_saturation_helper;
+            float3 _7_minMidMax = hueLumColor.zxy;
+            {
+                _6_blend_set_color_saturation_helper = _7_minMidMax.x < _7_minMidMax.z ? float3(0.0, (sat * (_7_minMidMax.y - _7_minMidMax.x)) / (_7_minMidMax.z - _7_minMidMax.x), sat) : float3(0.0);
+            }
+            hueLumColor.zxy = _6_blend_set_color_saturation_helper;
+
+        }
+    } else if (hueLumColor.x <= hueLumColor.z) {
+        float3 _8_blend_set_color_saturation_helper;
+        float3 _9_minMidMax = hueLumColor.yxz;
+        {
+            _8_blend_set_color_saturation_helper = _9_minMidMax.x < _9_minMidMax.z ? float3(0.0, (sat * (_9_minMidMax.y - _9_minMidMax.x)) / (_9_minMidMax.z - _9_minMidMax.x), sat) : float3(0.0);
+        }
+        hueLumColor.yxz = _8_blend_set_color_saturation_helper;
+
+    } else if (hueLumColor.y <= hueLumColor.z) {
+        float3 _10_blend_set_color_saturation_helper;
+        float3 _11_minMidMax = hueLumColor.yzx;
+        {
+            _10_blend_set_color_saturation_helper = _11_minMidMax.x < _11_minMidMax.z ? float3(0.0, (sat * (_11_minMidMax.y - _11_minMidMax.x)) / (_11_minMidMax.z - _11_minMidMax.x), sat) : float3(0.0);
+        }
+        hueLumColor.yzx = _10_blend_set_color_saturation_helper;
+
+    } else {
+        float3 _12_blend_set_color_saturation_helper;
+        float3 _13_minMidMax = hueLumColor.zyx;
+        {
+            _12_blend_set_color_saturation_helper = _13_minMidMax.x < _13_minMidMax.z ? float3(0.0, (sat * (_13_minMidMax.y - _13_minMidMax.x)) / (_13_minMidMax.z - _13_minMidMax.x), sat) : float3(0.0);
+        }
+        hueLumColor.zyx = _12_blend_set_color_saturation_helper;
+
+    }
+    return hueLumColor;
+}
+float4 blend_saturation(float4 src, float4 dst) {
+    float alpha = dst.w * src.w;
+    float3 sda = src.xyz * dst.w;
+    float3 dsa = dst.xyz * src.w;
+    return float4((((_blend_set_color_luminance(_blend_set_color_saturation(dsa, sda), alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = blend_saturation(_in.src, _in.dst);
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendSaturationStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendSaturationStandaloneSettings.glsl
index 01dbff6..6606b8d 100644
--- a/tests/sksl/blend/golden/BlendSaturationStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendSaturationStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _blend_color_luminance(vec3 color) {
     return dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), color);
 }
@@ -94,6 +95,6 @@
     vec3 dsa = dst.xyz * src.w;
     return vec4((((_blend_set_color_luminance(_blend_set_color_saturation(dsa, sda), alpha, dsa) + dst.xyz) - dsa) + src.xyz) - sda, (src.w + dst.w) - alpha);
 }
-vec4 main() {
-    return blend_saturation(src, dst);
+void main() {
+    sk_FragColor = blend_saturation(src, dst);
 }
diff --git a/tests/sksl/blend/golden/BlendScreen.glsl b/tests/sksl/blend/golden/BlendScreen.glsl
index d3041c1..fe30678 100644
--- a/tests/sksl/blend/golden/BlendScreen.glsl
+++ b/tests/sksl/blend/golden/BlendScreen.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_screen(vec4 src, vec4 dst) {
     return src + (1.0 - src) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_screen;
     {
         _0_blend_screen = src + (1.0 - src) * dst;
     }
 
-    return _0_blend_screen;
+    sk_FragColor = _0_blend_screen;
 
 }
diff --git a/tests/sksl/blend/golden/BlendScreen.metal b/tests/sksl/blend/golden/BlendScreen.metal
new file mode 100644
index 0000000..ac232a4
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendScreen.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_screen(float4 src, float4 dst) {
+    return src + (1.0 - src) * dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_screen;
+    {
+        _0_blend_screen = _in.src + (1.0 - _in.src) * _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_screen;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendScreenStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendScreenStandaloneSettings.glsl
index 4959001..4f0270d 100644
--- a/tests/sksl/blend/golden/BlendScreenStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendScreenStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_screen(vec4 src, vec4 dst) {
     return src + (1.0 - src) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_screen;
     {
         _0_blend_screen = src + (1.0 - src) * dst;
     }
 
-    return _0_blend_screen;
+    sk_FragColor = _0_blend_screen;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSoftLight.glsl b/tests/sksl/blend/golden/BlendSoftLight.glsl
index 2ef9b11..ddc901d 100644
--- a/tests/sksl/blend/golden/BlendSoftLight.glsl
+++ b/tests/sksl/blend/golden/BlendSoftLight.glsl
@@ -1,5 +1,6 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _guarded_divide(float n, float d) {
     return n / d;
 }
@@ -32,12 +33,12 @@
 vec4 blend_soft_light(vec4 src, vec4 dst) {
     return dst.w == 0.0 ? src : vec4(_soft_light_component(src.xw, dst.xw), _soft_light_component(src.yw, dst.yw), _soft_light_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_soft_light;
     {
         _0_blend_soft_light = dst.w == 0.0 ? src : vec4(_soft_light_component(src.xw, dst.xw), _soft_light_component(src.yw, dst.yw), _soft_light_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_soft_light;
+    sk_FragColor = _0_blend_soft_light;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSoftLight.metal b/tests/sksl/blend/golden/BlendSoftLight.metal
new file mode 100644
index 0000000..2c5e50d
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendSoftLight.metal
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float _guarded_divide(float n, float d) {
+    return n / d;
+}
+float _soft_light_component(float2 s, float2 d) {
+    if (2.0 * s.x <= s.y) {
+        float _1_guarded_divide;
+        float _2_n = (d.x * d.x) * (s.y - 2.0 * s.x);
+        float _3_d = d.y;
+        {
+            _1_guarded_divide = _2_n / _3_d;
+        }
+        return (_1_guarded_divide + (1.0 - d.y) * s.x) + d.x * ((-s.y + 2.0 * s.x) + 1.0);
+
+    } else if (4.0 * d.x <= d.y) {
+        float DSqd = d.x * d.x;
+        float DCub = DSqd * d.x;
+        float DaSqd = d.y * d.y;
+        float DaCub = DaSqd * d.y;
+        float _4_guarded_divide;
+        float _5_n = ((DaSqd * (s.x - d.x * ((3.0 * s.y - 6.0 * s.x) - 1.0)) + ((12.0 * d.y) * DSqd) * (s.y - 2.0 * s.x)) - (16.0 * DCub) * (s.y - 2.0 * s.x)) - DaCub * s.x;
+        {
+            _4_guarded_divide = _5_n / DaSqd;
+        }
+        return _4_guarded_divide;
+
+    } else {
+        return ((d.x * ((s.y - 2.0 * s.x) + 1.0) + s.x) - sqrt(d.y * d.x) * (s.y - 2.0 * s.x)) - d.y * s.x;
+    }
+}
+float4 blend_soft_light(float4 src, float4 dst) {
+    return dst.w == 0.0 ? src : float4(_soft_light_component(src.xw, dst.xw), _soft_light_component(src.yw, dst.yw), _soft_light_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_soft_light;
+    {
+        _0_blend_soft_light = _in.dst.w == 0.0 ? _in.src : float4(_soft_light_component(_in.src.xw, _in.dst.xw), _soft_light_component(_in.src.yw, _in.dst.yw), _soft_light_component(_in.src.zw, _in.dst.zw), _in.src.w + (1.0 - _in.src.w) * _in.dst.w);
+    }
+
+    _out->sk_FragColor = _0_blend_soft_light;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendSoftLightStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendSoftLightStandaloneSettings.glsl
index 8fba433..03a9dfc 100644
--- a/tests/sksl/blend/golden/BlendSoftLightStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendSoftLightStandaloneSettings.glsl
@@ -1,5 +1,6 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 float _guarded_divide(float n, float d) {
     return n / d;
 }
@@ -32,12 +33,12 @@
 vec4 blend_soft_light(vec4 src, vec4 dst) {
     return dst.w == 0.0 ? src : vec4(_soft_light_component(src.xw, dst.xw), _soft_light_component(src.yw, dst.yw), _soft_light_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_soft_light;
     {
         _0_blend_soft_light = dst.w == 0.0 ? src : vec4(_soft_light_component(src.xw, dst.xw), _soft_light_component(src.yw, dst.yw), _soft_light_component(src.zw, dst.zw), src.w + (1.0 - src.w) * dst.w);
     }
 
-    return _0_blend_soft_light;
+    sk_FragColor = _0_blend_soft_light;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrc.glsl b/tests/sksl/blend/golden/BlendSrc.glsl
index 366d735..b3fa07a 100644
--- a/tests/sksl/blend/golden/BlendSrc.glsl
+++ b/tests/sksl/blend/golden/BlendSrc.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src(vec4 src, vec4 dst) {
     return src;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src;
     {
         _0_blend_src = src;
     }
 
-    return _0_blend_src;
+    sk_FragColor = _0_blend_src;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrc.metal b/tests/sksl/blend/golden/BlendSrc.metal
new file mode 100644
index 0000000..2271f9e
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendSrc.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src(float4 src, float4 dst) {
+    return src;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_src;
+    {
+        _0_blend_src = _in.src;
+    }
+
+    _out->sk_FragColor = _0_blend_src;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendSrcAtop.glsl b/tests/sksl/blend/golden/BlendSrcAtop.glsl
index f131e13..8dbbb84 100644
--- a/tests/sksl/blend/golden/BlendSrcAtop.glsl
+++ b/tests/sksl/blend/golden/BlendSrcAtop.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_atop(vec4 src, vec4 dst) {
     return dst.w * src + (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_atop;
     {
         _0_blend_src_atop = dst.w * src + (1.0 - src.w) * dst;
     }
 
-    return _0_blend_src_atop;
+    sk_FragColor = _0_blend_src_atop;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrcAtop.metal b/tests/sksl/blend/golden/BlendSrcAtop.metal
new file mode 100644
index 0000000..a1d43ca
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendSrcAtop.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src_atop(float4 src, float4 dst) {
+    return dst.w * src + (1.0 - src.w) * dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_src_atop;
+    {
+        _0_blend_src_atop = _in.dst.w * _in.src + (1.0 - _in.src.w) * _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_src_atop;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendSrcAtopStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendSrcAtopStandaloneSettings.glsl
index c1f4177..b968793 100644
--- a/tests/sksl/blend/golden/BlendSrcAtopStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendSrcAtopStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_atop(vec4 src, vec4 dst) {
     return dst.w * src + (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_atop;
     {
         _0_blend_src_atop = dst.w * src + (1.0 - src.w) * dst;
     }
 
-    return _0_blend_src_atop;
+    sk_FragColor = _0_blend_src_atop;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrcIn.glsl b/tests/sksl/blend/golden/BlendSrcIn.glsl
index 25294c8..4957ab1 100644
--- a/tests/sksl/blend/golden/BlendSrcIn.glsl
+++ b/tests/sksl/blend/golden/BlendSrcIn.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_in(vec4 src, vec4 dst) {
     return src * dst.w;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_in;
     {
         _0_blend_src_in = src * dst.w;
     }
 
-    return _0_blend_src_in;
+    sk_FragColor = _0_blend_src_in;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrcIn.metal b/tests/sksl/blend/golden/BlendSrcIn.metal
new file mode 100644
index 0000000..88687c7
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendSrcIn.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src_in(float4 src, float4 dst) {
+    return src * dst.w;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_src_in;
+    {
+        _0_blend_src_in = _in.src * _in.dst.w;
+    }
+
+    _out->sk_FragColor = _0_blend_src_in;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendSrcInStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendSrcInStandaloneSettings.glsl
index dd93696..0dd9cf0 100644
--- a/tests/sksl/blend/golden/BlendSrcInStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendSrcInStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_in(vec4 src, vec4 dst) {
     return src * dst.w;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_in;
     {
         _0_blend_src_in = src * dst.w;
     }
 
-    return _0_blend_src_in;
+    sk_FragColor = _0_blend_src_in;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrcOut.glsl b/tests/sksl/blend/golden/BlendSrcOut.glsl
index 6c19a9f..7b94f0b 100644
--- a/tests/sksl/blend/golden/BlendSrcOut.glsl
+++ b/tests/sksl/blend/golden/BlendSrcOut.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_out(vec4 src, vec4 dst) {
     return (1.0 - dst.w) * src;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_out;
     {
         _0_blend_src_out = (1.0 - dst.w) * src;
     }
 
-    return _0_blend_src_out;
+    sk_FragColor = _0_blend_src_out;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrcOut.metal b/tests/sksl/blend/golden/BlendSrcOut.metal
new file mode 100644
index 0000000..dbaffe8
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendSrcOut.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src_out(float4 src, float4 dst) {
+    return (1.0 - dst.w) * src;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_src_out;
+    {
+        _0_blend_src_out = (1.0 - _in.dst.w) * _in.src;
+    }
+
+    _out->sk_FragColor = _0_blend_src_out;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendSrcOutStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendSrcOutStandaloneSettings.glsl
index 3c42140..72df901 100644
--- a/tests/sksl/blend/golden/BlendSrcOutStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendSrcOutStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_out(vec4 src, vec4 dst) {
     return (1.0 - dst.w) * src;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_out;
     {
         _0_blend_src_out = (1.0 - dst.w) * src;
     }
 
-    return _0_blend_src_out;
+    sk_FragColor = _0_blend_src_out;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrcOver.glsl b/tests/sksl/blend/golden/BlendSrcOver.glsl
index 75cda20..52b2292 100644
--- a/tests/sksl/blend/golden/BlendSrcOver.glsl
+++ b/tests/sksl/blend/golden/BlendSrcOver.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_over(vec4 src, vec4 dst) {
     return src + (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_over;
     {
         _0_blend_src_over = src + (1.0 - src.w) * dst;
     }
 
-    return _0_blend_src_over;
+    sk_FragColor = _0_blend_src_over;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrcOver.metal b/tests/sksl/blend/golden/BlendSrcOver.metal
new file mode 100644
index 0000000..78be7f7
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendSrcOver.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_src_over(float4 src, float4 dst) {
+    return src + (1.0 - src.w) * dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_src_over;
+    {
+        _0_blend_src_over = _in.src + (1.0 - _in.src.w) * _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_src_over;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendSrcOverStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendSrcOverStandaloneSettings.glsl
index 356f995..79cb0e6 100644
--- a/tests/sksl/blend/golden/BlendSrcOverStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendSrcOverStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src_over(vec4 src, vec4 dst) {
     return src + (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src_over;
     {
         _0_blend_src_over = src + (1.0 - src.w) * dst;
     }
 
-    return _0_blend_src_over;
+    sk_FragColor = _0_blend_src_over;
 
 }
diff --git a/tests/sksl/blend/golden/BlendSrcStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendSrcStandaloneSettings.glsl
index 816158f..320b841 100644
--- a/tests/sksl/blend/golden/BlendSrcStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendSrcStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_src(vec4 src, vec4 dst) {
     return src;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_src;
     {
         _0_blend_src = src;
     }
 
-    return _0_blend_src;
+    sk_FragColor = _0_blend_src;
 
 }
diff --git a/tests/sksl/blend/golden/BlendXor.glsl b/tests/sksl/blend/golden/BlendXor.glsl
index 703dbd3..c88da3d 100644
--- a/tests/sksl/blend/golden/BlendXor.glsl
+++ b/tests/sksl/blend/golden/BlendXor.glsl
@@ -1,14 +1,15 @@
 #version 400
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_xor(vec4 src, vec4 dst) {
     return (1.0 - dst.w) * src + (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_xor;
     {
         _0_blend_xor = (1.0 - dst.w) * src + (1.0 - src.w) * dst;
     }
 
-    return _0_blend_xor;
+    sk_FragColor = _0_blend_xor;
 
 }
diff --git a/tests/sksl/blend/golden/BlendXor.metal b/tests/sksl/blend/golden/BlendXor.metal
new file mode 100644
index 0000000..fb838cb
--- /dev/null
+++ b/tests/sksl/blend/golden/BlendXor.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 srcdst;
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+
+float4 blend_xor(float4 src, float4 dst) {
+    return (1.0 - dst.w) * src + (1.0 - src.w) * dst;
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 _0_blend_xor;
+    {
+        _0_blend_xor = (1.0 - _in.dst.w) * _in.src + (1.0 - _in.src.w) * _in.dst;
+    }
+
+    _out->sk_FragColor = _0_blend_xor;
+
+    return *_out;
+}
diff --git a/tests/sksl/blend/golden/BlendXorStandaloneSettings.glsl b/tests/sksl/blend/golden/BlendXorStandaloneSettings.glsl
index 02370eb..c8f85d8 100644
--- a/tests/sksl/blend/golden/BlendXorStandaloneSettings.glsl
+++ b/tests/sksl/blend/golden/BlendXorStandaloneSettings.glsl
@@ -1,14 +1,15 @@
 
-uniform vec4 src, dst;
+out vec4 sk_FragColor;
+in vec4 src, dst;
 vec4 blend_xor(vec4 src, vec4 dst) {
     return (1.0 - dst.w) * src + (1.0 - src.w) * dst;
 }
-vec4 main() {
+void main() {
     vec4 _0_blend_xor;
     {
         _0_blend_xor = (1.0 - dst.w) * src + (1.0 - src.w) * dst;
     }
 
-    return _0_blend_xor;
+    sk_FragColor = _0_blend_xor;
 
 }
diff --git a/tests/sksl/shared/ModifiersDeclaration.sksl b/tests/sksl/glsl/LayoutQualifiers.sksl
similarity index 100%
rename from tests/sksl/shared/ModifiersDeclaration.sksl
rename to tests/sksl/glsl/LayoutQualifiers.sksl
diff --git a/tests/sksl/shared/golden/ModifiersDeclaration.glsl b/tests/sksl/glsl/golden/LayoutQualifiers.glsl
similarity index 100%
rename from tests/sksl/shared/golden/ModifiersDeclaration.glsl
rename to tests/sksl/glsl/golden/LayoutQualifiers.glsl
diff --git a/tests/sksl/shared/ComplexDelete.sksl b/tests/sksl/shared/ComplexDelete.sksl
index dc5bdad..3af2de8 100644
--- a/tests/sksl/shared/ComplexDelete.sksl
+++ b/tests/sksl/shared/ComplexDelete.sksl
@@ -1,5 +1,5 @@
-uniform float4x4 colorXform;
-uniform sampler2D sampler;
+layout(set=0) uniform float4x4 colorXform;
+layout(binding=0) uniform sampler2D sampler;
 
 void main() {
     float4 tmpColor;
diff --git a/tests/sksl/shared/NoFragCoordsPosRT.vert b/tests/sksl/shared/NoFragCoordsPosRT.vert
index 03ed7ca..1395247 100644
--- a/tests/sksl/shared/NoFragCoordsPosRT.vert
+++ b/tests/sksl/shared/NoFragCoordsPosRT.vert
@@ -1,6 +1,6 @@
 /*#pragma settings CannotUseFragCoord*/
 
-uniform float4 sk_RTAdjust;
+layout(set=0) uniform float4 sk_RTAdjust;
 in float4 pos;
 
 void main() {
diff --git a/tests/sksl/shared/NormalizationVert.vert b/tests/sksl/shared/NormalizationVert.vert
index 4fd7c5c..d919fef 100644
--- a/tests/sksl/shared/NormalizationVert.vert
+++ b/tests/sksl/shared/NormalizationVert.vert
@@ -1,4 +1,4 @@
-uniform float4 sk_RTAdjust;
+layout(set=0) uniform float4 sk_RTAdjust;
 
 void main() {
     sk_Position = half4(1);
diff --git a/tests/sksl/shared/RectangleTexture.sksl b/tests/sksl/shared/RectangleTexture.sksl
index 1f84462..b8b8c08 100644
--- a/tests/sksl/shared/RectangleTexture.sksl
+++ b/tests/sksl/shared/RectangleTexture.sksl
@@ -1,5 +1,5 @@
-uniform sampler2D test2D;
-uniform sampler2D test2DRect;
+layout(binding=0) uniform sampler2D test2D;
+layout(binding=1) uniform sampler2D test2DRect;
 
 void main() {
     sk_FragColor = sample(test2D, float2(0.5));
diff --git a/tests/sksl/shared/SwizzleBoolConstants.sksl b/tests/sksl/shared/SwizzleBoolConstants.sksl
index fe1af72..c2f74b8 100644
--- a/tests/sksl/shared/SwizzleBoolConstants.sksl
+++ b/tests/sksl/shared/SwizzleBoolConstants.sksl
@@ -1,6 +1,6 @@
-uniform bool4 v;
 
 void main() {
+    bool4 v = bool4(sqrt(1) == 1);
     bool4 result;
     result = bool4(v.x, true, true, true);
     result = bool4(v.xy, false, true);
diff --git a/tests/sksl/shared/golden/ArrayConstructors.metal b/tests/sksl/shared/golden/ArrayConstructors.metal
new file mode 100644
index 0000000..f7ff4c7
--- /dev/null
+++ b/tests/sksl/shared/golden/ArrayConstructors.metal
@@ -0,0 +1,24 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct Globals {
+    float[] test1;
+    float2[] test2;
+    float4x4[] test3;
+};
+
+
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{float[](1.0, 2.0, 3.0, 4.0), float2[](float2(1.0, 2.0), float2(3.0, 4.0)), float4x4[]()};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = (_globals->test1[0] + _globals->test2[0].x) + _globals->test3[0][0][0];
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ArrayIndexTypes.metal b/tests/sksl/shared/golden/ArrayIndexTypes.metal
new file mode 100644
index 0000000..843a29c
--- /dev/null
+++ b/tests/sksl/shared/golden/ArrayIndexTypes.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(float[4](1.0, 2.0, 3.0, 4.0)[0], float[4](1.0, 2.0, 3.0, 4.0)[1], float[4](1.0, 2.0, 3.0, 4.0)[2], float[4](1.0, 2.0, 3.0, 4.0)[3u]);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ArrayTypes.metal b/tests/sksl/shared/golden/ArrayTypes.metal
new file mode 100644
index 0000000..923c7ee
--- /dev/null
+++ b/tests/sksl/shared/golden/ArrayTypes.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(float2[2](float2(1.0), float2(2.0))[0], float2[2](float2(3.0), float2(4.0))[1]);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/AssignmentTypeMatch.metal b/tests/sksl/shared/golden/AssignmentTypeMatch.metal
new file mode 100644
index 0000000..c18cef3
--- /dev/null
+++ b/tests/sksl/shared/golden/AssignmentTypeMatch.metal
@@ -0,0 +1,13 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/BoolFolding.metal b/tests/sksl/shared/golden/BoolFolding.metal
new file mode 100644
index 0000000..b2368b3
--- /dev/null
+++ b/tests/sksl/shared/golden/BoolFolding.metal
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = 1.0;
+    _out->sk_FragColor.x = -2.0;
+    _out->sk_FragColor.x = 3.0;
+    _out->sk_FragColor.x = -4.0;
+    _out->sk_FragColor.x = 5.0;
+    _out->sk_FragColor.x = -6.0;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Caps.metal b/tests/sksl/shared/golden/Caps.metal
new file mode 100644
index 0000000..d3a7dc1
--- /dev/null
+++ b/tests/sksl/shared/golden/Caps.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.xyz = float3(1.0, 1.0, 0.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/CastsRoundTowardZero.metal b/tests/sksl/shared/golden/CastsRoundTowardZero.metal
new file mode 100644
index 0000000..ccb511d
--- /dev/null
+++ b/tests/sksl/shared/golden/CastsRoundTowardZero.metal
@@ -0,0 +1,15 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0);
+    _out->sk_FragColor = float4(2.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ClipDistanceFragment.metal b/tests/sksl/shared/golden/ClipDistanceFragment.metal
new file mode 100644
index 0000000..1ca49d5
--- /dev/null
+++ b/tests/sksl/shared/golden/ClipDistanceFragment.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(_globals->sk_ClipDistance[0]);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ClipDistanceVertex.metal b/tests/sksl/shared/golden/ClipDistanceVertex.metal
new file mode 100644
index 0000000..1123a9f
--- /dev/null
+++ b/tests/sksl/shared/golden/ClipDistanceVertex.metal
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_Position [[position]];
+    float sk_PointSize [[point_size]];
+};
+vertex Outputs vertexMain(Inputs _in [[stage_in]], uint sk_VertexID [[vertex_id]], uint sk_InstanceID [[instance_id]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    gl_ClipDistance[0] = 0.0;
+    _out->sk_Position.y = -_out->sk_Position.y;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Clockwise.metal b/tests/sksl/shared/golden/Clockwise.metal
new file mode 100644
index 0000000..5716e6f
--- /dev/null
+++ b/tests/sksl/shared/golden/Clockwise.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(float((!_frontFacing) ? 1 : -1));
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ComplexDelete.glsl b/tests/sksl/shared/golden/ComplexDelete.glsl
index 802aa86..0fcf225 100644
--- a/tests/sksl/shared/golden/ComplexDelete.glsl
+++ b/tests/sksl/shared/golden/ComplexDelete.glsl
@@ -1,7 +1,7 @@
 
 out vec4 sk_FragColor;
-uniform mat4 colorXform;
-uniform sampler2D sampler;
+layout (set = 0) uniform mat4 colorXform;
+layout (binding = 0) uniform sampler2D sampler;
 void main() {
     vec4 tmpColor;
     sk_FragColor = (tmpColor = texture(sampler, vec2(1.0)) , colorXform != mat4(1.0) ? vec4(clamp((colorXform * vec4(tmpColor.xyz, 1.0)).xyz, 0.0, tmpColor.w), tmpColor.w) : tmpColor);
diff --git a/tests/sksl/shared/golden/ComplexDelete.metal b/tests/sksl/shared/golden/ComplexDelete.metal
new file mode 100644
index 0000000..d775ba2
--- /dev/null
+++ b/tests/sksl/shared/golden/ComplexDelete.metal
@@ -0,0 +1,26 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Uniforms {
+    float4x4 colorXform;
+};
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct Globals {
+    texture2d<float> sampler;
+    sampler samplerSmplr;
+};
+
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], texture2d<float> sampler[[texture(0)]], sampler samplerSmplr[[sampler(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{sampler, samplerSmplr};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 tmpColor;
+    _out->sk_FragColor = (tmpColor = _globals->sampler.sample(_globals->samplerSmplr, float2(1.0)) , _uniforms.colorXform != float4x4(1.0) ? float4(clamp((_uniforms.colorXform * float4(tmpColor.xyz, 1.0)).xyz, 0.0, tmpColor.w), tmpColor.w) : tmpColor);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ConstArray.metal b/tests/sksl/shared/golden/ConstArray.metal
new file mode 100644
index 0000000..8c64743
--- /dev/null
+++ b/tests/sksl/shared/golden/ConstArray.metal
@@ -0,0 +1,15 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+constant float test[] = half[](1.0, 2.0, 3.0, 4.0);
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(_globals->test[0], _globals->test[1], _globals->test[2], _globals->test[3]);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ConstVariableComparison.metal b/tests/sksl/shared/golden/ConstVariableComparison.metal
new file mode 100644
index 0000000..c18cef3
--- /dev/null
+++ b/tests/sksl/shared/golden/ConstVariableComparison.metal
@@ -0,0 +1,13 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ConstantIf.metal b/tests/sksl/shared/golden/ConstantIf.metal
new file mode 100644
index 0000000..4f7e406
--- /dev/null
+++ b/tests/sksl/shared/golden/ConstantIf.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = 5.0;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Control.metal b/tests/sksl/shared/golden/Control.metal
new file mode 100644
index 0000000..3bff79e
--- /dev/null
+++ b/tests/sksl/shared/golden/Control.metal
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    if (sqrt(2.0) > 5.0) {
+        _out->sk_FragColor = float4(0.75);
+    } else {
+        discard_fragment();
+    }
+    int i = 0;
+    while (i < 10) {
+        _out->sk_FragColor *= 0.5;
+        i++;
+    }
+    do {
+        _out->sk_FragColor += 0.25;
+    } while (_out->sk_FragColor.x < 0.75);
+    for (int i = 0;i < 10; i++) {
+        if (i % 2 == 1) break; else continue;
+    }
+    return;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/DeadDoWhileLoop.metal b/tests/sksl/shared/golden/DeadDoWhileLoop.metal
new file mode 100644
index 0000000..dff2130
--- /dev/null
+++ b/tests/sksl/shared/golden/DeadDoWhileLoop.metal
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    do {
+        _out->sk_FragColor = float4(1.0);
+    } while (false);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/DeadLoopVariable.metal b/tests/sksl/shared/golden/DeadLoopVariable.metal
new file mode 100644
index 0000000..154a67a
--- /dev/null
+++ b/tests/sksl/shared/golden/DeadLoopVariable.metal
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    for (; true; ) {
+        break;
+    }
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/DependentInitializers.metal b/tests/sksl/shared/golden/DependentInitializers.metal
new file mode 100644
index 0000000..4627e82
--- /dev/null
+++ b/tests/sksl/shared/golden/DependentInitializers.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/DerivativesUnused.metal b/tests/sksl/shared/golden/DerivativesUnused.metal
new file mode 100644
index 0000000..9d9f2cd
--- /dev/null
+++ b/tests/sksl/shared/golden/DerivativesUnused.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = 1.0;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Discard.metal b/tests/sksl/shared/golden/Discard.metal
new file mode 100644
index 0000000..f12691a
--- /dev/null
+++ b/tests/sksl/shared/golden/Discard.metal
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    {
+        discard_fragment();
+    }
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/FloatFolding.metal b/tests/sksl/shared/golden/FloatFolding.metal
new file mode 100644
index 0000000..dfac04e
--- /dev/null
+++ b/tests/sksl/shared/golden/FloatFolding.metal
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = 34.0;
+    _out->sk_FragColor.x = 30.0;
+    _out->sk_FragColor.x = 64.0;
+    _out->sk_FragColor.x = 16.0;
+    _out->sk_FragColor.x = 19.0;
+    _out->sk_FragColor.x = 1.0;
+    _out->sk_FragColor.x = -2.0;
+    _out->sk_FragColor.x = 3.0;
+    _out->sk_FragColor.x = -4.0;
+    _out->sk_FragColor.x = 5.0;
+    _out->sk_FragColor.x = -6.0;
+    _out->sk_FragColor.x = 7.0;
+    _out->sk_FragColor.x = -8.0;
+    _out->sk_FragColor.x = 9.0;
+    _out->sk_FragColor.x = -10.0;
+    _out->sk_FragColor.x = 11.0;
+    _out->sk_FragColor.x = -12.0;
+    _out->sk_FragColor.x = sqrt(1.0);
+    _out->sk_FragColor.x = sqrt(2.0);
+    _out->sk_FragColor.x = sqrt(3.0);
+    _out->sk_FragColor.x = 0.0;
+    _out->sk_FragColor.x = sqrt(5.0);
+    _out->sk_FragColor.x = sqrt(6.0);
+    _out->sk_FragColor.x = 0.0;
+    _out->sk_FragColor.x = sqrt(8.0);
+    _out->sk_FragColor.x = 0.0;
+    _out->sk_FragColor.x = _out->sk_FragColor.x + 1.0;
+    _out->sk_FragColor.x = _out->sk_FragColor.x - 1.0;
+    _out->sk_FragColor.x = _out->sk_FragColor.x * 2.0;
+    _out->sk_FragColor.x = _out->sk_FragColor.x / 2.0;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/FrExp.metal b/tests/sksl/shared/golden/FrExp.metal
new file mode 100644
index 0000000..3d788ec
--- /dev/null
+++ b/tests/sksl/shared/golden/FrExp.metal
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    int exp;
+    float foo = frexp(0.5, &exp);
+    _out->sk_FragColor = float4(float(exp));
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/FragCoordsFlipY.metal b/tests/sksl/shared/golden/FragCoordsFlipY.metal
new file mode 100644
index 0000000..372ce96
--- /dev/null
+++ b/tests/sksl/shared/golden/FragCoordsFlipY.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.xy = float4(_fragCoord.x, _fragCoord.y, 0.0, _fragCoord.w).xy;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/FragCoordsNew.metal b/tests/sksl/shared/golden/FragCoordsNew.metal
new file mode 100644
index 0000000..372ce96
--- /dev/null
+++ b/tests/sksl/shared/golden/FragCoordsNew.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.xy = float4(_fragCoord.x, _fragCoord.y, 0.0, _fragCoord.w).xy;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/FragCoordsOld.metal b/tests/sksl/shared/golden/FragCoordsOld.metal
new file mode 100644
index 0000000..372ce96
--- /dev/null
+++ b/tests/sksl/shared/golden/FragCoordsOld.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.xy = float4(_fragCoord.x, _fragCoord.y, 0.0, _fragCoord.w).xy;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/FunctionArgumentMatch.metal b/tests/sksl/shared/golden/FunctionArgumentMatch.metal
new file mode 100644
index 0000000..c18cef3
--- /dev/null
+++ b/tests/sksl/shared/golden/FunctionArgumentMatch.metal
@@ -0,0 +1,13 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/FunctionPrototype.metal b/tests/sksl/shared/golden/FunctionPrototype.metal
new file mode 100644
index 0000000..c18cef3
--- /dev/null
+++ b/tests/sksl/shared/golden/FunctionPrototype.metal
@@ -0,0 +1,13 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Functions.metal b/tests/sksl/shared/golden/Functions.metal
new file mode 100644
index 0000000..db668ed
--- /dev/null
+++ b/tests/sksl/shared/golden/Functions.metal
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float x = 10.0;
+    {
+        float _1_y[2], _2_z;
+        _1_y[0] = 10.0;
+        _1_y[1] = 20.0;
+        float _3_0_foo;
+        {
+            _3_0_foo = _1_y[0] * _1_y[1];
+        }
+
+        _2_z = _3_0_foo;
+
+        x = _2_z;
+    }
+
+
+    _out->sk_FragColor = float4(x);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Geometry.metal b/tests/sksl/shared/golden/Geometry.metal
new file mode 100644
index 0000000..e76208e
--- /dev/null
+++ b/tests/sksl/shared/golden/Geometry.metal
@@ -0,0 +1,3 @@
+### Compilation failed:
+
+unsupported kind of program
diff --git a/tests/sksl/shared/golden/GeometryExtension.metal b/tests/sksl/shared/golden/GeometryExtension.metal
new file mode 100644
index 0000000..e76208e
--- /dev/null
+++ b/tests/sksl/shared/golden/GeometryExtension.metal
@@ -0,0 +1,3 @@
+### Compilation failed:
+
+unsupported kind of program
diff --git a/tests/sksl/shared/golden/GeometryGSInvocations.metal b/tests/sksl/shared/golden/GeometryGSInvocations.metal
new file mode 100644
index 0000000..e76208e
--- /dev/null
+++ b/tests/sksl/shared/golden/GeometryGSInvocations.metal
@@ -0,0 +1,3 @@
+### Compilation failed:
+
+unsupported kind of program
diff --git a/tests/sksl/shared/golden/GeometryNoGSInvocations.metal b/tests/sksl/shared/golden/GeometryNoGSInvocations.metal
new file mode 100644
index 0000000..e76208e
--- /dev/null
+++ b/tests/sksl/shared/golden/GeometryNoGSInvocations.metal
@@ -0,0 +1,3 @@
+### Compilation failed:
+
+unsupported kind of program
diff --git a/tests/sksl/shared/golden/Height.metal b/tests/sksl/shared/golden/Height.metal
new file mode 100644
index 0000000..b7ff3b1
--- /dev/null
+++ b/tests/sksl/shared/golden/Height.metal
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct sksl_synthetic_uniforms {
+    float u_skRTHeight;
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant sksl_synthetic_uniforms& _anonInterface0 [[buffer(1)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = float4(_fragCoord.x, _anonInterface0.u_skRTHeight - _fragCoord.y, 0.0, _fragCoord.w).y / _globals->sk_Height;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/HelloWorld.metal b/tests/sksl/shared/golden/HelloWorld.metal
new file mode 100644
index 0000000..3b7e37f
--- /dev/null
+++ b/tests/sksl/shared/golden/HelloWorld.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(0.75);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Hex.metal b/tests/sksl/shared/golden/Hex.metal
new file mode 100644
index 0000000..205c57d
--- /dev/null
+++ b/tests/sksl/shared/golden/Hex.metal
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    int i1 = 0;
+    i1++;
+    int i2 = 305441741;
+    i2++;
+    int i3 = 2147483647;
+    i3++;
+    int i4 = -1;
+    i4++;
+    int i5 = -48879;
+    i5++;
+    uint u1 = 0u;
+    u1++;
+    uint u2 = 305441741u;
+    u2++;
+    uint u3 = 2147483647u;
+    u3++;
+    uint u4 = 4294967295u;
+    u4++;
+    ushort u5 = 65535;
+    u5++;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/InstanceID.metal b/tests/sksl/shared/golden/InstanceID.metal
new file mode 100644
index 0000000..1ac4820
--- /dev/null
+++ b/tests/sksl/shared/golden/InstanceID.metal
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_Position [[position]];
+    int id  [[user(locn-1)]];
+    float sk_PointSize [[point_size]];
+};
+
+vertex Outputs vertexMain(Inputs _in [[stage_in]], uint sk_VertexID [[vertex_id]], uint sk_InstanceID [[instance_id]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->id = sk_InstanceID;
+    _out->sk_Position.y = -_out->sk_Position.y;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/IntFolding.metal b/tests/sksl/shared/golden/IntFolding.metal
new file mode 100644
index 0000000..8658726
--- /dev/null
+++ b/tests/sksl/shared/golden/IntFolding.metal
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = 34.0;
+    _out->sk_FragColor.x = 30.0;
+    _out->sk_FragColor.x = 64.0;
+    _out->sk_FragColor.x = 16.0;
+    _out->sk_FragColor.x = 14.0;
+    _out->sk_FragColor.x = 6.0;
+    _out->sk_FragColor.x = 5.0;
+    _out->sk_FragColor.x = 16.0;
+    _out->sk_FragColor.x = 32.0;
+    _out->sk_FragColor.x = 1.0;
+    _out->sk_FragColor.x = -2.0;
+    _out->sk_FragColor.x = 3.0;
+    _out->sk_FragColor.x = -4.0;
+    _out->sk_FragColor.x = 5.0;
+    _out->sk_FragColor.x = -6.0;
+    _out->sk_FragColor.x = 7.0;
+    _out->sk_FragColor.x = -8.0;
+    _out->sk_FragColor.x = 9.0;
+    _out->sk_FragColor.x = -10.0;
+    _out->sk_FragColor.x = 11.0;
+    _out->sk_FragColor.x = -12.0;
+    _out->sk_FragColor.x = float(int(sqrt(1.0)));
+    _out->sk_FragColor.x = float(int(sqrt(2.0)));
+    _out->sk_FragColor.x = float(int(sqrt(3.0)));
+    _out->sk_FragColor.x = 0.0;
+    _out->sk_FragColor.x = float(int(sqrt(5.0)));
+    _out->sk_FragColor.x = float(int(sqrt(6.0)));
+    _out->sk_FragColor.x = 0.0;
+    _out->sk_FragColor.x = float(int(sqrt(8.0)));
+    _out->sk_FragColor.x = 0.0;
+    int x = int(sqrt(2.0));
+    x += 1;
+    x -= 1;
+    x *= 2;
+    x /= 2;
+    _out->sk_FragColor.x = float(x);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/InterfaceBlockAnonymous.metal b/tests/sksl/shared/golden/InterfaceBlockAnonymous.metal
new file mode 100644
index 0000000..d1d23a8
--- /dev/null
+++ b/tests/sksl/shared/golden/InterfaceBlockAnonymous.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct testBlock {
+    float x;
+    float y[2];
+    float3x2 z;
+    bool w;
+};
+struct Globals {
+    constant testBlock* _anonInterface0;
+};fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant testBlock& _anonInterface0 [[buffer(-1)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{&_anonInterface0};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(_globals->_anonInterface0->x, _globals->_anonInterface0->y[0], _globals->_anonInterface0->y[1], 0.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/InterfaceBlockArray.metal b/tests/sksl/shared/golden/InterfaceBlockArray.metal
new file mode 100644
index 0000000..90c27e8
--- /dev/null
+++ b/tests/sksl/shared/golden/InterfaceBlockArray.metal
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct testBlock {
+    float x;
+} test[2];
+struct Globals {
+    constant testBlock* test;
+};fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant testBlock[2]& test [[buffer(-1)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{&test};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(_uniforms.test[1].x);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/InterfaceBlockNamed.metal b/tests/sksl/shared/golden/InterfaceBlockNamed.metal
new file mode 100644
index 0000000..b0c132e
--- /dev/null
+++ b/tests/sksl/shared/golden/InterfaceBlockNamed.metal
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct testBlock {
+    float x;
+} test;
+struct Globals {
+    constant testBlock* test;
+};fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant testBlock& test [[buffer(-1)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{&test};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(_uniforms.test.x);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Matrices.metal b/tests/sksl/shared/golden/Matrices.metal
new file mode 100644
index 0000000..0a7eae0
--- /dev/null
+++ b/tests/sksl/shared/golden/Matrices.metal
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float3x4 z = float2x4(1.0) * float3x2(float2(1.0, 0.0), float2(0.0, 1.0), float2(2.0, 2.0));
+    float3 v1 = float3x3(1.0) * float3(2.0);
+    float3 v2 = float3(2.0) * float3x3(1.0);
+    _out->sk_FragColor = float4(z[0].x, v1 + v2);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/MatrixFolding.metal b/tests/sksl/shared/golden/MatrixFolding.metal
new file mode 100644
index 0000000..c120731
--- /dev/null
+++ b/tests/sksl/shared/golden/MatrixFolding.metal
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = 1.0;
+    _out->sk_FragColor.x = -2.0;
+    _out->sk_FragColor.x = 3.0;
+    _out->sk_FragColor.x = -4.0;
+    _out->sk_FragColor.x = 5.0;
+    _out->sk_FragColor.x = -6.0;
+    _out->sk_FragColor.x = 7.0;
+    _out->sk_FragColor.x = -8.0;
+    _out->sk_FragColor.x = 9.0;
+    _out->sk_FragColor.x = 10.0;
+    _out->sk_FragColor.x = 11.0;
+    _out->sk_FragColor.x = 12.0;
+    _out->sk_FragColor.x = 13.0;
+    _out->sk_FragColor.x = 14.0;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/MultipleAssignments.metal b/tests/sksl/shared/golden/MultipleAssignments.metal
new file mode 100644
index 0000000..4627e82
--- /dev/null
+++ b/tests/sksl/shared/golden/MultipleAssignments.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/NegatedVectorLiteral.metal b/tests/sksl/shared/golden/NegatedVectorLiteral.metal
new file mode 100644
index 0000000..4627e82
--- /dev/null
+++ b/tests/sksl/shared/golden/NegatedVectorLiteral.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/NoFragCoordsPos.metal b/tests/sksl/shared/golden/NoFragCoordsPos.metal
new file mode 100644
index 0000000..da708b0
--- /dev/null
+++ b/tests/sksl/shared/golden/NoFragCoordsPos.metal
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+    float4 pos;
+};
+struct Outputs {
+    float4 sk_Position [[position]];
+    float sk_PointSize [[point_size]];
+};
+
+vertex Outputs vertexMain(Inputs _in [[stage_in]], uint sk_VertexID [[vertex_id]], uint sk_InstanceID [[instance_id]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_Position = _in.pos;
+    _out->sk_Position.y = -_out->sk_Position.y;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/NoFragCoordsPosRT.glsl b/tests/sksl/shared/golden/NoFragCoordsPosRT.glsl
index 0c686c3..974ce87 100644
--- a/tests/sksl/shared/golden/NoFragCoordsPosRT.glsl
+++ b/tests/sksl/shared/golden/NoFragCoordsPosRT.glsl
@@ -1,6 +1,6 @@
 #version 400
 out vec4 sk_FragCoord_Workaround;
-uniform vec4 sk_RTAdjust;
+layout (set = 0) uniform vec4 sk_RTAdjust;
 in vec4 pos;
 void main() {
     sk_FragCoord_Workaround = (gl_Position = pos);
diff --git a/tests/sksl/shared/golden/NoFragCoordsPosRT.metal b/tests/sksl/shared/golden/NoFragCoordsPosRT.metal
new file mode 100644
index 0000000..eef16c9
--- /dev/null
+++ b/tests/sksl/shared/golden/NoFragCoordsPosRT.metal
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Uniforms {
+    float4 sk_RTAdjust;
+};
+struct Inputs {
+    float4 pos;
+};
+struct Outputs {
+    float4 sk_Position [[position]];
+    float sk_PointSize [[point_size]];
+};
+
+
+vertex Outputs vertexMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], uint sk_VertexID [[vertex_id]], uint sk_InstanceID [[instance_id]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_Position = _in.pos;
+    _out->sk_Position = float4(_out->sk_Position.xy * _uniforms.sk_RTAdjust.xz + _out->sk_Position.ww * _uniforms.sk_RTAdjust.yw, 0.0, _out->sk_Position.w);
+    _out->sk_Position.y = -_out->sk_Position.y;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/NormalizationGeo.metal b/tests/sksl/shared/golden/NormalizationGeo.metal
new file mode 100644
index 0000000..e76208e
--- /dev/null
+++ b/tests/sksl/shared/golden/NormalizationGeo.metal
@@ -0,0 +1,3 @@
+### Compilation failed:
+
+unsupported kind of program
diff --git a/tests/sksl/shared/golden/NormalizationVert.glsl b/tests/sksl/shared/golden/NormalizationVert.glsl
index 926f988..90be4e5 100644
--- a/tests/sksl/shared/golden/NormalizationVert.glsl
+++ b/tests/sksl/shared/golden/NormalizationVert.glsl
@@ -1,5 +1,5 @@
 
-uniform vec4 sk_RTAdjust;
+layout (set = 0) uniform vec4 sk_RTAdjust;
 void main() {
     gl_Position = vec4(1.0);
     gl_Position = vec4(gl_Position.xy * sk_RTAdjust.xz + gl_Position.ww * sk_RTAdjust.yw, 0.0, gl_Position.w);
diff --git a/tests/sksl/shared/golden/NormalizationVert.metal b/tests/sksl/shared/golden/NormalizationVert.metal
new file mode 100644
index 0000000..209b4ef
--- /dev/null
+++ b/tests/sksl/shared/golden/NormalizationVert.metal
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Uniforms {
+    float4 sk_RTAdjust;
+};
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_Position [[position]];
+    float sk_PointSize [[point_size]];
+};
+
+vertex Outputs vertexMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], uint sk_VertexID [[vertex_id]], uint sk_InstanceID [[instance_id]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_Position = float4(1.0);
+    _out->sk_Position = float4(_out->sk_Position.xy * _uniforms.sk_RTAdjust.xz + _out->sk_Position.ww * _uniforms.sk_RTAdjust.yw, 0.0, _out->sk_Position.w);
+    _out->sk_Position.y = -_out->sk_Position.y;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/NumberConversions.metal b/tests/sksl/shared/golden/NumberConversions.metal
new file mode 100644
index 0000000..2bc41e0
--- /dev/null
+++ b/tests/sksl/shared/golden/NumberConversions.metal
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct Globals {
+    short s;
+    int i;
+    ushort us;
+    uint ui;
+    float h;
+    float f;
+    short s2s;
+    short i2s;
+    short us2s;
+    short ui2s;
+    short h2s;
+    short f2s;
+    int s2i;
+    int i2i;
+    int us2i;
+    int ui2i;
+    int h2i;
+    int f2i;
+    ushort s2us;
+    ushort i2us;
+    ushort us2us;
+    ushort ui2us;
+    ushort h2us;
+    ushort f2us;
+    uint s2ui;
+    uint i2ui;
+    uint us2ui;
+    uint ui2ui;
+    uint h2ui;
+    uint f2ui;
+    float s2f;
+    float i2f;
+    float us2f;
+    float ui2f;
+    float h2f;
+    float f2f;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{short(sqrt(1.0)), int(sqrt(1.0)), ushort(sqrt(1.0)), uint(sqrt(1.0)), sqrt(1.0), sqrt(1.0), _globals->s, short(_globals->i), short(_globals->us), short(_globals->ui), short(_globals->h), short(_globals->f), int(_globals->s), _globals->i, int(_globals->us), int(_globals->ui), int(_globals->h), int(_globals->f), ushort(_globals->s), ushort(_globals->i), _globals->us, ushort(_globals->ui), ushort(_globals->h), ushort(_globals->f), uint(_globals->s), uint(_globals->i), uint(_globals->us), _globals->ui, uint(_globals->h), uint(_globals->f), float(_globals->s), float(_globals->i), float(_globals->us), float(_globals->ui), _globals->h, _globals->f};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = (((((((((((((((((float((int(_globals->s) + _globals->i) + int(_globals->us)) + float(_globals->ui)) + _globals->h) + _globals->f) + float(_globals->s2s)) + float(_globals->i2s)) + float(_globals->us2s)) + float(_globals->ui2s)) + float(_globals->h2s)) + float(_globals->f2s)) + float(_globals->s2i)) + float(_globals->i2i)) + float(_globals->us2i)) + float(_globals->ui2i)) + float(_globals->h2i)) + float(_globals->f2i)) + float(_globals->s2us)) + float(_globals->i2us)) + float(_globals->us2us);
+    _out->sk_FragColor.x = _out->sk_FragColor.x + (((((((((((float((_globals->ui2us + _globals->h2us) + _globals->f2us) + float(_globals->s2ui)) + float(_globals->i2ui)) + float(_globals->us2ui)) + float(_globals->ui2ui)) + float(_globals->h2ui)) + float(_globals->f2ui)) + _globals->s2f) + _globals->i2f) + _globals->us2f) + _globals->ui2f) + _globals->h2f) + _globals->f2f;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Offset.metal b/tests/sksl/shared/golden/Offset.metal
new file mode 100644
index 0000000..df4ac49
--- /dev/null
+++ b/tests/sksl/shared/golden/Offset.metal
@@ -0,0 +1,20 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    struct Test {
+        int x;
+        int y;
+        int z;
+    } t;
+    t.x = 0;
+    _out->sk_FragColor.x = float(t.x);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Operators.metal b/tests/sksl/shared/golden/Operators.metal
new file mode 100644
index 0000000..275eed7
--- /dev/null
+++ b/tests/sksl/shared/golden/Operators.metal
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float x = 1.0, y = 2.0;
+    int z = 3;
+    x = -6.0;
+    y = -1.0;
+    z = 8;
+    bool b = false == true || 2.0 >= sqrt(2.0);
+    x += 12.0;
+    x -= 12.0;
+    x *= (y /= float(z = 10));
+    b ||= false;
+    b &&= true;
+    b ^^= false;
+    z |= 0;
+    z &= -1;
+    z ^= 0;
+    z >>= 2;
+    z <<= 4;
+    z %= 5;
+    x = float((float2(sqrt(1.0)) , 6));
+    z = (float2(sqrt(1.0)) , 6);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/OutParams.metal b/tests/sksl/shared/golden/OutParams.metal
new file mode 100644
index 0000000..dc7ae29
--- /dev/null
+++ b/tests/sksl/shared/golden/OutParams.metal
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0, 2.0, 3.0, 4.0);
+    _out->sk_FragColor = float4(float2x2(2.0)[0][0], float3x3(3.0)[0][0], float4x4(4.0)[0][0], 1.0);
+    _out->sk_FragColor = float4(1.0, 2.0, 3.0, 4.0);
+    _out->sk_FragColor = float4(1.0, 2.0, 3.0, 4.0);
+    _out->sk_FragColor = float4(float2x2(2.0)[0][0], float3x3(3.0)[0][0], float4x4(4.0)[0][0], 1.0);
+    _out->sk_FragColor = float4(1.0, bool2(false).x ? 1.0 : 0.0, bool3(true).x ? 1.0 : 0.0, bool4(false).x ? 1.0 : 0.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/RectangleTexture.glsl b/tests/sksl/shared/golden/RectangleTexture.glsl
index ab64a50..faa578a 100644
--- a/tests/sksl/shared/golden/RectangleTexture.glsl
+++ b/tests/sksl/shared/golden/RectangleTexture.glsl
@@ -1,7 +1,7 @@
 
 out vec4 sk_FragColor;
-uniform sampler2D test2D;
-uniform sampler2D test2DRect;
+layout (binding = 0) uniform sampler2D test2D;
+layout (binding = 1) uniform sampler2D test2DRect;
 void main() {
     sk_FragColor = texture(test2D, vec2(0.5));
     sk_FragColor = texture(test2DRect, vec2(0.5));
diff --git a/tests/sksl/shared/golden/RectangleTexture.metal b/tests/sksl/shared/golden/RectangleTexture.metal
new file mode 100644
index 0000000..029fd3c
--- /dev/null
+++ b/tests/sksl/shared/golden/RectangleTexture.metal
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct Globals {
+    texture2d<float> test2D;
+    sampler test2DSmplr;
+    texture2d<float> test2DRect;
+    sampler test2DRectSmplr;
+};
+
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], texture2d<float> test2D[[texture(0)]], sampler test2DSmplr[[sampler(0)]], texture2d<float> test2DRect[[texture(1)]], sampler test2DRectSmplr[[sampler(1)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{test2D, test2DSmplr, test2DRect, test2DRectSmplr};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float3 tmpCoord0;
+    _out->sk_FragColor = _globals->test2D.sample(_globals->test2DSmplr, float2(0.5));
+    _out->sk_FragColor = _globals->test2DRect.sample(_globals->test2DRectSmplr, float2(0.5));
+    _out->sk_FragColor = _globals->test2DRect.sample(_globals->test2DRectSmplr, (tmpCoord0 = float3(0.5), tmpCoord0.xy / tmpCoord0.z));
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ResizeMatrix.metal b/tests/sksl/shared/golden/ResizeMatrix.metal
new file mode 100644
index 0000000..f5eab4e
--- /dev/null
+++ b/tests/sksl/shared/golden/ResizeMatrix.metal
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+float2x2 float2x2_from_float3x3(float3x3 x0) {
+    return float2x2(float2(x0[0].xy), float2(x0[1].xy));
+}
+float2x2 float2x2_from_float4x4(float4x4 x0) {
+    return float2x2(float2(x0[0].xy), float2(x0[1].xy));
+}
+float3x3 float3x3_from_float4x4(float4x4 x0) {
+    return float3x3(float3(x0[0].xyz), float3(x0[1].xyz), float3(x0[2].xyz));
+}
+float3x3 float3x3_from_float2x2(float2x2 x0) {
+    return float3x3(float3(x0[0].xy, 0.0), float3(x0[1].xy, 0.0), float3(0.0, 0.0, 1.0));
+}
+float3x3 float3x3_from_float2x3(float2x3 x0) {
+    return float3x3(float3(x0[0].xyz), float3(x0[1].xyz), float3(0.0, 0.0, 1.0));
+}
+float3x3 float3x3_from_float3x2(float3x2 x0) {
+    return float3x3(float3(x0[0].xy, 0.0), float3(x0[1].xy, 0.0), float3(x0[2].xy, 1.0));
+}
+float4x4 float4x4_from_float3x3(float3x3 x0) {
+    return float4x4(float4(x0[0].xyz, 0.0), float4(x0[1].xyz, 0.0), float4(x0[2].xyz, 0.0), float4(0.0, 0.0, 0.0, 1.0));
+}
+float4x4 float4x4_from_float4x3(float4x3 x0) {
+    return float4x4(float4(x0[0].xyz, 0.0), float4(x0[1].xyz, 0.0), float4(x0[2].xyz, 0.0), float4(x0[3].xyz, 1.0));
+}
+float4x3 float4x3_from_float4x2(float4x2 x0) {
+    return float4x3(float3(x0[0].xy, 0.0), float3(x0[1].xy, 0.0), float3(x0[2].xy, 1.0), float3(x0[3].xy, 0.0));
+}
+float4x4 float4x4_from_float3x4(float3x4 x0) {
+    return float4x4(float4(x0[0].xyzw), float4(x0[1].xyzw), float4(x0[2].xyzw), float4(0.0, 0.0, 0.0, 1.0));
+}
+float3x4 float3x4_from_float2x4(float2x4 x0) {
+    return float3x4(float4(x0[0].xyzw), float4(x0[1].xyzw), float4(0.0, 0.0, 1.0, 0.0));
+}
+float2x4 float2x4_from_float4x2(float4x2 x0) {
+    return float2x4(float4(x0[0].xy, 0.0, 0.0), float4(x0[1].xy, 0.0, 0.0));
+}
+float4x2 float4x2_from_float2x4(float2x4 x0) {
+    return float4x2(float2(x0[0].xy), float2(x0[1].xy), float2(0.0, 0.0), float2(0.0, 0.0));
+}
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = float2x2_from_float3x3(float3x3(1.0))[0][0];
+    _out->sk_FragColor.x = float2x2_from_float4x4(float4x4(1.0))[0][0];
+    _out->sk_FragColor.x = float3x3_from_float4x4(float4x4(1.0))[0][0];
+    _out->sk_FragColor.x = float3x3_from_float2x2(float2x2(1.0))[0][0];
+    _out->sk_FragColor.x = float3x3_from_float2x3(float2x3(1.0))[0][0];
+    _out->sk_FragColor.x = float3x3_from_float3x2(float3x2(1.0))[0][0];
+    _out->sk_FragColor.x = float4x4_from_float3x3(float3x3_from_float2x2(float2x2(1.0)))[0][0];
+    _out->sk_FragColor.x = float4x4_from_float4x3(float4x3_from_float4x2(float4x2(1.0)))[0][0];
+    _out->sk_FragColor.x = float4x4_from_float3x4(float3x4_from_float2x4(float2x4(1.0)))[0][0];
+    _out->sk_FragColor.x = float2x4_from_float4x2(float4x2(1.0))[0][0];
+    _out->sk_FragColor.x = float4x2_from_float2x4(float2x4(1.0))[0][0];
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/SampleMask.metal b/tests/sksl/shared/golden/SampleMask.metal
new file mode 100644
index 0000000..6e929f2
--- /dev/null
+++ b/tests/sksl/shared/golden/SampleMask.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_SampleMask[0] |= 8;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ScopedSymbol.metal b/tests/sksl/shared/golden/ScopedSymbol.metal
new file mode 100644
index 0000000..c18cef3
--- /dev/null
+++ b/tests/sksl/shared/golden/ScopedSymbol.metal
@@ -0,0 +1,13 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/ShortCircuitBoolFolding.metal b/tests/sksl/shared/golden/ShortCircuitBoolFolding.metal
new file mode 100644
index 0000000..c2f96ae
--- /dev/null
+++ b/tests/sksl/shared/golden/ShortCircuitBoolFolding.metal
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    bool expr1 = float4(_fragCoord.x, _fragCoord.y, 0.0, _fragCoord.w).x > 0.0;
+    bool expr2 = float4(_fragCoord.x, _fragCoord.y, 0.0, _fragCoord.w).y > 0.0;
+    if (expr1) {
+        _out->sk_FragColor.x = 1.0;
+    } else if (!expr1) {
+        _out->sk_FragColor.x = 3.0;
+    } else if (expr2) {
+        _out->sk_FragColor.x = 4.0;
+    } else if (expr2) {
+        _out->sk_FragColor.x = 5.0;
+    } else {
+        _out->sk_FragColor.x = 6.0;
+    }
+    if (expr1) {
+        _out->sk_FragColor.x = 1.0;
+    } else if (!expr1) {
+        _out->sk_FragColor.x = 3.0;
+    } else if (expr2) {
+        _out->sk_FragColor.x = 4.0;
+    } else if (expr2) {
+        _out->sk_FragColor.x = 5.0;
+    } else {
+        _out->sk_FragColor.x = 6.0;
+    }
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StackingVectorCasts.metal b/tests/sksl/shared/golden/StackingVectorCasts.metal
new file mode 100644
index 0000000..4627e82
--- /dev/null
+++ b/tests/sksl/shared/golden/StackingVectorCasts.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticIf.metal b/tests/sksl/shared/golden/StaticIf.metal
new file mode 100644
index 0000000..ffe4f10
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticIf.metal
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    {
+        _out->sk_FragColor = float4(1.0);
+    }
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitch.metal b/tests/sksl/shared/golden/StaticSwitch.metal
new file mode 100644
index 0000000..ffe4f10
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitch.metal
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    {
+        _out->sk_FragColor = float4(1.0);
+    }
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitchWithBreak.metal b/tests/sksl/shared/golden/StaticSwitchWithBreak.metal
new file mode 100644
index 0000000..51c66d9
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitchWithBreak.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(0.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitchWithBreakInsideBlock.metal b/tests/sksl/shared/golden/StaticSwitchWithBreakInsideBlock.metal
new file mode 100644
index 0000000..8a4005d
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitchWithBreakInsideBlock.metal
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    {
+        {
+            _out->sk_FragColor = float4(0.0);
+        }
+    }
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitchWithConditionalBreak.metal b/tests/sksl/shared/golden/StaticSwitchWithConditionalBreak.metal
new file mode 100644
index 0000000..def740c
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitchWithConditionalBreak.metal
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float x = 0.0;
+    switch (0) {
+        case 0:
+            x = 0.0;
+            if (0.0 < sqrt(1.0)) break;
+        case 1:
+            x = 1.0;
+    }
+    _out->sk_FragColor = float4(x);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitchWithConditionalBreakInsideBlock.metal b/tests/sksl/shared/golden/StaticSwitchWithConditionalBreakInsideBlock.metal
new file mode 100644
index 0000000..4cd9531
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitchWithConditionalBreakInsideBlock.metal
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    switch (0) {
+        case 0:
+            ;
+            if (0.0 < sqrt(1.0)) {
+                _out->sk_FragColor = float4(0.0);
+                break;
+            }
+        case 1:
+            ;
+    }
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitchWithFallthroughA.metal b/tests/sksl/shared/golden/StaticSwitchWithFallthroughA.metal
new file mode 100644
index 0000000..4627e82
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitchWithFallthroughA.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitchWithFallthroughB.metal b/tests/sksl/shared/golden/StaticSwitchWithFallthroughB.metal
new file mode 100644
index 0000000..4627e82
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitchWithFallthroughB.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitchWithStaticConditionalBreak.metal b/tests/sksl/shared/golden/StaticSwitchWithStaticConditionalBreak.metal
new file mode 100644
index 0000000..51c66d9
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitchWithStaticConditionalBreak.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(0.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/StaticSwitchWithStaticConditionalBreakInsideBlock.metal b/tests/sksl/shared/golden/StaticSwitchWithStaticConditionalBreakInsideBlock.metal
new file mode 100644
index 0000000..8a4005d
--- /dev/null
+++ b/tests/sksl/shared/golden/StaticSwitchWithStaticConditionalBreakInsideBlock.metal
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    {
+        {
+            _out->sk_FragColor = float4(0.0);
+        }
+    }
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Structs.metal b/tests/sksl/shared/golden/Structs.metal
new file mode 100644
index 0000000..91cbe3f
--- /dev/null
+++ b/tests/sksl/shared/golden/Structs.metal
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct Globals {
+    struct A {
+    int x;
+    int y;
+} a1;
+    struct B {
+    float x;
+    float y[2];
+    A z;
+} b1;
+};
+
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{{}, {}};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _globals->a1.x = 0;
+    _globals->b1.x = 0.0;
+    _out->sk_FragColor.x = float(_globals->a1.x) + _globals->b1.x;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Switch.metal b/tests/sksl/shared/golden/Switch.metal
new file mode 100644
index 0000000..bcb0e11
--- /dev/null
+++ b/tests/sksl/shared/golden/Switch.metal
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float x;
+    switch (int(sqrt(1.0))) {
+        case 0:
+            x = 0.0;
+            break;
+        case 1:
+            x = 1.0;
+            break;
+        default:
+            x = 2.0;
+    }
+    _out->sk_FragColor = float4(x);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/SwitchContainingDeadCode.metal b/tests/sksl/shared/golden/SwitchContainingDeadCode.metal
new file mode 100644
index 0000000..f5702762
--- /dev/null
+++ b/tests/sksl/shared/golden/SwitchContainingDeadCode.metal
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    switch (int(sqrt(2.0))) {
+        case 0:
+            ;
+        case 1:
+            ;
+        default:
+            ;
+    }
+    _out->sk_FragColor = float4(2.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/SwitchWithFallthrough.metal b/tests/sksl/shared/golden/SwitchWithFallthrough.metal
new file mode 100644
index 0000000..d4318b6
--- /dev/null
+++ b/tests/sksl/shared/golden/SwitchWithFallthrough.metal
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float x = 0.0;
+    switch (int(sqrt(3.0))) {
+        case 0:
+            x = 0.0;
+        case 1:
+            x = 1.0;
+    }
+    _out->sk_FragColor = float4(x);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/SwizzleBoolConstants.glsl b/tests/sksl/shared/golden/SwizzleBoolConstants.glsl
index 69b62e8..fd99575 100644
--- a/tests/sksl/shared/golden/SwizzleBoolConstants.glsl
+++ b/tests/sksl/shared/golden/SwizzleBoolConstants.glsl
@@ -1,7 +1,7 @@
 
 out vec4 sk_FragColor;
-uniform bvec4 v;
 void main() {
+    bvec4 v = bvec4(sqrt(1.0) == 1.0);
     bvec4 result;
     result = bvec4(v.x, true, true, true);
     result = bvec4(v.xy, false, true);
diff --git a/tests/sksl/shared/golden/SwizzleBoolConstants.metal b/tests/sksl/shared/golden/SwizzleBoolConstants.metal
new file mode 100644
index 0000000..a0f080f
--- /dev/null
+++ b/tests/sksl/shared/golden/SwizzleBoolConstants.metal
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    bool4 v = bool4(sqrt(1.0) == 1.0);
+    bool4 result;
+    result = bool4(v.x, true, true, true);
+    result = bool4(v.xy, false, true);
+    result = bool4(bool2(v.x, true), true, false);
+    result = bool4(bool2(v.y, false).yx, true, true);
+    result = bool4(v.xyz, true);
+    result = bool4(bool3(v.xy, true), true);
+    result = bool4(bool3(v.xz, false).xzy, true);
+    result = bool4(bool3(v.x, true, false), false);
+    result = bool4(bool3(v.yz, true).zxy, false);
+    result = bool4(bool3(v.y, false, true).yxz, false);
+    result = bool4(bool2(v.z, true).yyx, false);
+    result = v;
+    result = bool4(v.xyz, true);
+    result = bool4(v.xyw, false).xywz;
+    result = bool4(v.xy, true, false);
+    result = bool4(v.xzw, true).xwyz;
+    result = bool4(v.xz, false, true).xzyw;
+    result = bool3(v.xw, true).xzzy;
+    result = bool3(v.x, true, false).xyzy;
+    result = bool4(v.yzw, true).wxyz;
+    result = bool4(v.yz, false, true).zxyw;
+    result = bool4(v.yw, false, true).zxwy;
+    result = bool2(v.y, true).yxyy;
+    result = bool3(v.zw, false).zzxy;
+    result = bool3(v.z, false, true).yyxz;
+    result = bool3(v.w, false, true).yzzx;
+    _out->sk_FragColor = any(result) ? float4(1.0) : float4(0.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/SwizzleConstants.metal b/tests/sksl/shared/golden/SwizzleConstants.metal
new file mode 100644
index 0000000..6c89152
--- /dev/null
+++ b/tests/sksl/shared/golden/SwizzleConstants.metal
@@ -0,0 +1,40 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float4 v = float4(sqrt(1.0));
+    _out->sk_FragColor = float4(v.x, 1.0, 1.0, 1.0);
+    _out->sk_FragColor = float4(v.xy, 1.0, 1.0);
+    _out->sk_FragColor = float4(float2(v.x, 1.0), 1.0, 1.0);
+    _out->sk_FragColor = float4(float2(v.y, 0.0).yx, 1.0, 1.0);
+    _out->sk_FragColor = float4(v.xyz, 1.0);
+    _out->sk_FragColor = float4(float3(v.xy, 1.0), 1.0);
+    _out->sk_FragColor = float4(float3(v.xz, 0.0).xzy, 1.0);
+    _out->sk_FragColor = float4(float3(v.x, 1.0, 0.0), 1.0);
+    _out->sk_FragColor = float4(float3(v.yz, 1.0).zxy, 1.0);
+    _out->sk_FragColor = float4(float3(v.y, 0.0, 1.0).yxz, 1.0);
+    _out->sk_FragColor = float4(float2(v.z, 1.0).yyx, 1.0);
+    _out->sk_FragColor = v;
+    _out->sk_FragColor = float4(v.xyz, 1.0);
+    _out->sk_FragColor = float4(v.xyw, 0.0).xywz;
+    _out->sk_FragColor = float4(v.xy, 1.0, 0.0);
+    _out->sk_FragColor = float4(v.xzw, 1.0).xwyz;
+    _out->sk_FragColor = float4(v.xz, 0.0, 1.0).xzyw;
+    _out->sk_FragColor = float3(v.xw, 1.0).xzzy;
+    _out->sk_FragColor = float3(v.x, 1.0, 0.0).xyzy;
+    _out->sk_FragColor = float4(v.yzw, 1.0).wxyz;
+    _out->sk_FragColor = float4(v.yz, 0.0, 1.0).zxyw;
+    _out->sk_FragColor = float4(v.yw, 0.0, 1.0).zxwy;
+    _out->sk_FragColor = float2(v.y, 1.0).yxyy;
+    _out->sk_FragColor = float3(v.zw, 0.0).zzxy;
+    _out->sk_FragColor = float3(v.z, 0.0, 1.0).yyxz;
+    _out->sk_FragColor = float3(v.w, 0.0, 1.0).yzzx;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/SwizzleLTRB.metal b/tests/sksl/shared/golden/SwizzleLTRB.metal
new file mode 100644
index 0000000..e2f778e
--- /dev/null
+++ b/tests/sksl/shared/golden/SwizzleLTRB.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = _out->sk_FragColor.wzyx;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/SwizzleOpt.metal b/tests/sksl/shared/golden/SwizzleOpt.metal
new file mode 100644
index 0000000..18e8e2f
--- /dev/null
+++ b/tests/sksl/shared/golden/SwizzleOpt.metal
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float v = sqrt(1.0);
+    _out->sk_FragColor = float4(v);
+    _out->sk_FragColor = float4(float4(v).xyz, 0.0).wzyx;
+    _out->sk_FragColor = float3(float4(v).xw, 0.0).zzxy;
+    _out->sk_FragColor = float3(float3(float4(v).xw, 0.0).yx, 1.0).zzxy;
+    _out->sk_FragColor = float3(float4(v).zy, 1.0).xyzz;
+    _out->sk_FragColor = float4(v);
+    _out->sk_FragColor = float4(float4(v).xx, 1.0, 1.0);
+    _out->sk_FragColor = float4(v).wzwz;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/SwizzleScalar.metal b/tests/sksl/shared/golden/SwizzleScalar.metal
new file mode 100644
index 0000000..655a966
--- /dev/null
+++ b/tests/sksl/shared/golden/SwizzleScalar.metal
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float x = sqrt(4.0);
+    _out->sk_FragColor = float4(float2(x), 0.0, 1.0);
+    _out->sk_FragColor = float4(float2(sqrt(4.0)), 0.0, 1.0);
+    _out->sk_FragColor = float3(sqrt(4.0), 0.0, 1.0).yxyz;
+    _out->sk_FragColor = float3(float2(sqrt(4.0)), 0.0).zxzy;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/TernaryAsLValueEntirelyFoldable.metal b/tests/sksl/shared/golden/TernaryAsLValueEntirelyFoldable.metal
new file mode 100644
index 0000000..12cd772
--- /dev/null
+++ b/tests/sksl/shared/golden/TernaryAsLValueEntirelyFoldable.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor = float4(1.0, 0.0, 1.0, 1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/TernaryAsLValueFoldableTest.metal b/tests/sksl/shared/golden/TernaryAsLValueFoldableTest.metal
new file mode 100644
index 0000000..2841396
--- /dev/null
+++ b/tests/sksl/shared/golden/TernaryAsLValueFoldableTest.metal
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float r, g;
+    r = sqrt(1.0);
+    g = sqrt(0.0);
+    _out->sk_FragColor = float4(r, g, 1.0, 1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/TernaryAsLValueUnfoldable.metal b/tests/sksl/shared/golden/TernaryAsLValueUnfoldable.metal
new file mode 100644
index 0000000..6bf289f
--- /dev/null
+++ b/tests/sksl/shared/golden/TernaryAsLValueUnfoldable.metal
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float r, g;
+    sqrt(1.0) > 0.0 ? r : g = sqrt(1.0);
+    sqrt(0.0) > 0.0 ? r : g = sqrt(0.0);
+    _out->sk_FragColor = float4(r, g, 1.0, 1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Texture.metal b/tests/sksl/shared/golden/Texture.metal
new file mode 100644
index 0000000..9d598bb
--- /dev/null
+++ b/tests/sksl/shared/golden/Texture.metal
@@ -0,0 +1,3 @@
+### Compilation failed:
+
+
diff --git a/tests/sksl/shared/golden/TextureSharpen.metal b/tests/sksl/shared/golden/TextureSharpen.metal
new file mode 100644
index 0000000..9d598bb
--- /dev/null
+++ b/tests/sksl/shared/golden/TextureSharpen.metal
@@ -0,0 +1,3 @@
+### Compilation failed:
+
+
diff --git a/tests/sksl/shared/golden/UnaryPositiveNegative.metal b/tests/sksl/shared/golden/UnaryPositiveNegative.metal
new file mode 100644
index 0000000..bab6afc
--- /dev/null
+++ b/tests/sksl/shared/golden/UnaryPositiveNegative.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.xy = -float2(1.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/UnusedVariables.metal b/tests/sksl/shared/golden/UnusedVariables.metal
new file mode 100644
index 0000000..dce87a4
--- /dev/null
+++ b/tests/sksl/shared/golden/UnusedVariables.metal
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    float b = 2.0;
+    float d = 3.0;
+    b++;
+    d++;
+    _out->sk_FragColor = float4(b, b, d, d);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/VectorConstructors.metal b/tests/sksl/shared/golden/VectorConstructors.metal
new file mode 100644
index 0000000..66e76b6
--- /dev/null
+++ b/tests/sksl/shared/golden/VectorConstructors.metal
@@ -0,0 +1,32 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+struct Globals {
+    float2 v1;
+    float2 v2;
+    float2 v3;
+    float3 v4;
+    int2 v5;
+    int2 v6;
+    float2 v7;
+};
+
+
+
+
+
+
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Globals globalStruct{float2(1.0), float2(1.0, 2.0), float2(1.0), float3(float2(1.0), 1.0), int2(1), int2(float2(1.0, 2.0)), float2(int2(1, 2))};
+    thread Globals* _globals = &globalStruct;
+    (void)_globals;
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = (((((_globals->v1.x + _globals->v2.x) + _globals->v3.x) + _globals->v4.x) + float(_globals->v5.x)) + float(_globals->v6.x)) + _globals->v7.x;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/VectorFolding.metal b/tests/sksl/shared/golden/VectorFolding.metal
new file mode 100644
index 0000000..a7f126a
--- /dev/null
+++ b/tests/sksl/shared/golden/VectorFolding.metal
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = 0.5;
+    _out->sk_FragColor = float4(6.0, 7.0, 9.0, 11.0);
+    _out->sk_FragColor = float4(7.0, 9.0, 9.0, 9.0);
+    _out->sk_FragColor = float4(2.0, 4.0, 6.0, 8.0);
+    _out->sk_FragColor = float4(12.0, 6.0, 4.0, 3.0);
+    _out->sk_FragColor.x = 6.0;
+    _out->sk_FragColor.x = 1.0;
+    _out->sk_FragColor.x = -2.0;
+    _out->sk_FragColor.x = 3.0;
+    _out->sk_FragColor.x = 4.0;
+    _out->sk_FragColor.x = -5.0;
+    _out->sk_FragColor.x = 6.0;
+    _out->sk_FragColor.x = 7.0;
+    _out->sk_FragColor.x = -8.0;
+    _out->sk_FragColor.x = 9.0;
+    _out->sk_FragColor.x = -10.0;
+    _out->sk_FragColor = float4(sqrt(1.0));
+    _out->sk_FragColor = float4(sqrt(2.0));
+    _out->sk_FragColor = float4(0.0);
+    _out->sk_FragColor = float4(0.0);
+    _out->sk_FragColor = float4(0.0);
+    _out->sk_FragColor = float4(sqrt(6.0));
+    _out->sk_FragColor = float4(sqrt(7.0));
+    _out->sk_FragColor = float4(sqrt(8.0));
+    _out->sk_FragColor = float4(sqrt(9.0));
+    _out->sk_FragColor = float4(0.0);
+    _out->sk_FragColor = float4(0.0);
+    _out->sk_FragColor = float4(sqrt(12.0));
+    _out->sk_FragColor = float4(sqrt(13.0));
+    _out->sk_FragColor = float4(0.0);
+    _out->sk_FragColor = float4(0.0);
+    _out->sk_FragColor = float4(sqrt(16.0));
+    _out->sk_FragColor = float4(sqrt(17.0));
+    _out->sk_FragColor = float4(0.0);
+    _out->sk_FragColor = float4(sqrt(19.0));
+    _out->sk_FragColor = float4(sqrt(19.5));
+    _out->sk_FragColor = float4(sqrt(20.0));
+    _out->sk_FragColor = float4(sqrt(21.0));
+    _out->sk_FragColor = float4(sqrt(22.0));
+    _out->sk_FragColor = float4(sqrt(23.0));
+    _out->sk_FragColor = float4(sqrt(24.0));
+    _out->sk_FragColor += float4(1.0);
+    _out->sk_FragColor -= float4(1.0);
+    _out->sk_FragColor *= float4(2.0);
+    _out->sk_FragColor /= float4(2.0);
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/VertexID.metal b/tests/sksl/shared/golden/VertexID.metal
new file mode 100644
index 0000000..f0f5bf5
--- /dev/null
+++ b/tests/sksl/shared/golden/VertexID.metal
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_Position [[position]];
+    int id  [[user(locn-1)]];
+    float sk_PointSize [[point_size]];
+};
+
+vertex Outputs vertexMain(Inputs _in [[stage_in]], uint sk_VertexID [[vertex_id]], uint sk_InstanceID [[instance_id]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->id = sk_VertexID;
+    _out->sk_Position.y = -_out->sk_Position.y;
+    return *_out;
+}
diff --git a/tests/sksl/shared/golden/Width.metal b/tests/sksl/shared/golden/Width.metal
new file mode 100644
index 0000000..290b5f9
--- /dev/null
+++ b/tests/sksl/shared/golden/Width.metal
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+using namespace metal;
+struct Inputs {
+};
+struct Outputs {
+    float4 sk_FragColor [[color(0)]];
+};
+fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
+    Outputs _outputStruct;
+    thread Outputs* _out = &_outputStruct;
+    _out->sk_FragColor.x = float4(_fragCoord.x, _fragCoord.y, 0.0, _fragCoord.w).x / _globals->sk_Width;
+    return *_out;
+}