Clean up SkSL test compilation in preparation for Metal support.

Now uses a GN template to avoid copy-pasting the same logic for each
type of test we want to perform, and the same file to be compiled in
more than one way at a time via an extra flag to compile_sksl_tests.py.

Change-Id: I8aadedeb140d78d58a345a2bac0da3d9c77e9a19
Bug: skia:10694
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/319347
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 0876f76..02e3462 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -670,77 +670,74 @@
 
 if (skia_compile_sksl_tests) {
   import("gn/sksl_tests.gni")
-  sksl_fp_tests_outputs = []
-  foreach(src, sksl_fp_tests_sources) {
-    dir = get_path_info(src, "dir")
-    name = get_path_info(src, "name")
-    sksl_fp_tests_outputs += [
-      "$target_out_dir/" + rebase_path("$dir/golden/$name.cpp", target_out_dir),
-      "$target_out_dir/" + rebase_path("$dir/golden/$name.h", target_out_dir),
-    ]
-  }
 
-  sksl_glsl_tests_outputs = []
-  foreach(src, sksl_glsl_tests_sources) {
-    dir = get_path_info(src, "dir")
-    name = get_path_info(src, "name")
-    sksl_glsl_tests_outputs +=
-        [ "$target_out_dir/" +
-          rebase_path("$dir/golden/$name.glsl", target_out_dir) ]
+  template("compile_sksl") {
+    # Compile the passed-in `sources` into `outputs` using skslc, with the given language/settings.
+    action("compile_sksl_${target_name}") {
+      script = "gn/compile_sksl_tests.py"
+      deps = [
+        ":create_sksl_fp",
+        ":sksl_pre_includes",
+        ":skslc(//gn/toolchain:$host_toolchain)",
+      ]
+      sources = invoker.sources
+      outputs = []
+      foreach(src, sources) {
+        dir = get_path_info(src, "dir")
+        name = get_path_info(src, "name")
+        foreach(outputPattern, invoker.outputPatterns) {
+          outputs += [ target_out_dir + "/" + rebase_path(
+                           dir + outputPattern[0] + name + outputPattern[1],
+                           target_out_dir) ]
+        }
+      }
+      args = [
+        rebase_path(skslc_path),
+        invoker.lang,
+        invoker.settings,
+      ]
+      args += rebase_path(sources)
+    }
   }
-
-  sksl_glsl_settings_tests_outputs = []
-  foreach(src, sksl_glsl_settings_tests_sources) {
-    dir = get_path_info(src, "dir")
-    name = get_path_info(src, "name")
-    sksl_glsl_tests_outputs +=
-        [ "$target_out_dir/" +
-          rebase_path("$dir/golden/$name.glsl", target_out_dir) ]
-    sksl_glsl_settings_tests_outputs +=
-        [ "$target_out_dir/" +
-          rebase_path("$dir/golden/${name}StandaloneSettings.glsl",
-                      target_out_dir) ]
+  compile_sksl("fp_tests") {
+    sources = sksl_fp_tests_sources
+    outputPatterns = [
+      [
+        "/golden/",
+        ".cpp",
+      ],
+      [
+        "/golden/",
+        ".h",
+      ],
+    ]
+    lang = "--fp"
+    settings = "--settings"
   }
-
-  action("compile_sksl_tests") {
-    # This action compiles SkSL tests with their settings enabled, i.e. in --settings mode.
-    script = "gn/compile_sksl_tests.py"
-    deps = [
-      ":create_sksl_fp",
-      ":sksl_pre_includes",
-      ":skslc(//gn/toolchain:$host_toolchain)",
-    ]
-    sources = sksl_fp_tests_sources + sksl_glsl_tests_sources +
-              sksl_glsl_settings_tests_sources
-    outputs = sksl_fp_tests_outputs + sksl_glsl_tests_outputs
-    args = [
-      rebase_path(skslc_path),
-      "--settings",
-    ]
-    args += rebase_path(sksl_fp_tests_sources)
-    args += rebase_path(sksl_glsl_tests_sources)
-    args += rebase_path(sksl_glsl_settings_tests_sources)
+  compile_sksl("glsl_tests") {
+    sources = sksl_glsl_tests_sources + sksl_glsl_settings_tests_sources
+    outputPatterns = [ [
+          "/golden/",
+          ".glsl",
+        ] ]
+    lang = "--glsl"
+    settings = "--settings"
   }
-  action("compile_sksl_tests_nosettings") {
-    # This action compiles SkSL tests with their settings disabled, i.e. in --nosettings mode.
-    script = "gn/compile_sksl_tests.py"
-    deps = [
-      ":create_sksl_fp",
-      ":sksl_pre_includes",
-      ":skslc(//gn/toolchain:$host_toolchain)",
-    ]
+  compile_sksl("glsl_nosettings_tests") {
     sources = sksl_glsl_settings_tests_sources
-    outputs = sksl_glsl_settings_tests_outputs
-    args = [
-      rebase_path(skslc_path),
-      "--nosettings",
-    ]
-    args += rebase_path(sksl_glsl_settings_tests_sources)
+    outputPatterns = [ [
+          "/golden/",
+          "StandaloneSettings.glsl",
+        ] ]
+    lang = "--glsl"
+    settings = "--nosettings"
   }
 } else {
-  group("compile_sksl_tests") {
+  group("compile_sksl_fp_tests") {
   }
-  group("compile_sksl_tests_nosettings") {
+  group("compile_sksl_glsl_tests") {
+  }
+  group("compile_sksl_glsl_nosettings_tests") {
   }
 }
 
@@ -748,8 +745,9 @@
   enabled = skia_enable_gpu
   deps = [
     ":compile_processors",
-    ":compile_sksl_tests",
-    ":compile_sksl_tests_nosettings",
+    ":compile_sksl_fp_tests",
+    ":compile_sksl_glsl_nosettings_tests",
+    ":compile_sksl_glsl_tests",
     ":dehydrate_sksl",
     ":run_sksllex",
   ]