[glsl] Fill out `raise` method.

This CL fills out the GLSL with the existing raise transforms and marks
TODO entries for any missing transforms.

Bug: 42251044
Change-Id: Ia785c7c790be7a593d9eaca25d3553aeb9c5fad3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/200238
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/glsl/writer/BUILD.bazel b/src/tint/lang/glsl/writer/BUILD.bazel
index 751ec84..fa8e7fc 100644
--- a/src/tint/lang/glsl/writer/BUILD.bazel
+++ b/src/tint/lang/glsl/writer/BUILD.bazel
@@ -51,7 +51,6 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
-    "//src/tint/lang/glsl/writer/raise",
     "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
@@ -77,6 +76,7 @@
       "//src/tint/lang/glsl/writer/ast_printer",
       "//src/tint/lang/glsl/writer/common",
       "//src/tint/lang/glsl/writer/printer",
+      "//src/tint/lang/glsl/writer/raise",
     ],
     "//conditions:default": [],
   }),
diff --git a/src/tint/lang/glsl/writer/BUILD.cmake b/src/tint/lang/glsl/writer/BUILD.cmake
index 1d3b921..a859466 100644
--- a/src/tint/lang/glsl/writer/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/BUILD.cmake
@@ -59,7 +59,6 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
-  tint_lang_glsl_writer_raise
   tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
@@ -87,6 +86,7 @@
     tint_lang_glsl_writer_ast_printer
     tint_lang_glsl_writer_common
     tint_lang_glsl_writer_printer
+    tint_lang_glsl_writer_raise
   )
 endif(TINT_BUILD_GLSL_WRITER)
 
diff --git a/src/tint/lang/glsl/writer/BUILD.gn b/src/tint/lang/glsl/writer/BUILD.gn
index a4e3430..abd6f82 100644
--- a/src/tint/lang/glsl/writer/BUILD.gn
+++ b/src/tint/lang/glsl/writer/BUILD.gn
@@ -54,7 +54,6 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
-      "${tint_src_dir}/lang/glsl/writer/raise",
       "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
@@ -82,6 +81,7 @@
         "${tint_src_dir}/lang/glsl/writer/ast_printer",
         "${tint_src_dir}/lang/glsl/writer/common",
         "${tint_src_dir}/lang/glsl/writer/printer",
+        "${tint_src_dir}/lang/glsl/writer/raise",
       ]
     }
   }
diff --git a/src/tint/lang/glsl/writer/printer/BUILD.bazel b/src/tint/lang/glsl/writer/printer/BUILD.bazel
index 8961c7a..a538164 100644
--- a/src/tint/lang/glsl/writer/printer/BUILD.bazel
+++ b/src/tint/lang/glsl/writer/printer/BUILD.bazel
@@ -88,7 +88,11 @@
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
-    "//src/tint/lang/glsl/writer/raise",
+    "//src/tint/lang/wgsl",
+    "//src/tint/lang/wgsl/ast",
+    "//src/tint/lang/wgsl/ast/transform",
+    "//src/tint/lang/wgsl/program",
+    "//src/tint/lang/wgsl/sem",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
@@ -107,6 +111,7 @@
     ":tint_build_glsl_writer": [
       "//src/tint/lang/glsl/writer/common",
       "//src/tint/lang/glsl/writer/printer",
+      "//src/tint/lang/glsl/writer/raise",
     ],
     "//conditions:default": [],
   }),
diff --git a/src/tint/lang/glsl/writer/printer/BUILD.cmake b/src/tint/lang/glsl/writer/printer/BUILD.cmake
index 31486dd..1eb460f 100644
--- a/src/tint/lang/glsl/writer/printer/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/printer/BUILD.cmake
@@ -93,7 +93,11 @@
   tint_lang_core_intrinsic
   tint_lang_core_ir
   tint_lang_core_type
-  tint_lang_glsl_writer_raise
+  tint_lang_wgsl
+  tint_lang_wgsl_ast
+  tint_lang_wgsl_ast_transform
+  tint_lang_wgsl_program
+  tint_lang_wgsl_sem
   tint_utils_containers
   tint_utils_diagnostic
   tint_utils_ice
@@ -117,6 +121,7 @@
   tint_target_add_dependencies(tint_lang_glsl_writer_printer_test test
     tint_lang_glsl_writer_common
     tint_lang_glsl_writer_printer
+    tint_lang_glsl_writer_raise
   )
 endif(TINT_BUILD_GLSL_WRITER)
 
diff --git a/src/tint/lang/glsl/writer/printer/BUILD.gn b/src/tint/lang/glsl/writer/printer/BUILD.gn
index 59f838a..e66d5f3 100644
--- a/src/tint/lang/glsl/writer/printer/BUILD.gn
+++ b/src/tint/lang/glsl/writer/printer/BUILD.gn
@@ -90,7 +90,11 @@
         "${tint_src_dir}/lang/core/intrinsic",
         "${tint_src_dir}/lang/core/ir",
         "${tint_src_dir}/lang/core/type",
-        "${tint_src_dir}/lang/glsl/writer/raise",
+        "${tint_src_dir}/lang/wgsl",
+        "${tint_src_dir}/lang/wgsl/ast",
+        "${tint_src_dir}/lang/wgsl/ast/transform",
+        "${tint_src_dir}/lang/wgsl/program",
+        "${tint_src_dir}/lang/wgsl/sem",
         "${tint_src_dir}/utils/containers",
         "${tint_src_dir}/utils/diagnostic",
         "${tint_src_dir}/utils/ice",
@@ -110,6 +114,7 @@
         deps += [
           "${tint_src_dir}/lang/glsl/writer/common",
           "${tint_src_dir}/lang/glsl/writer/printer",
+          "${tint_src_dir}/lang/glsl/writer/raise",
         ]
       }
     }
diff --git a/src/tint/lang/glsl/writer/printer/function_test.cc b/src/tint/lang/glsl/writer/printer/function_test.cc
index 763a051..ae170ae 100644
--- a/src/tint/lang/glsl/writer/printer/function_test.cc
+++ b/src/tint/lang/glsl/writer/printer/function_test.cc
@@ -38,6 +38,8 @@
     EXPECT_EQ(output_, GlslHeader() + R"(
 void foo() {
 }
+void unused_entry_point() {
+}
 )");
 }
 
diff --git a/src/tint/lang/glsl/writer/printer/helper_test.h b/src/tint/lang/glsl/writer/printer/helper_test.h
index 2dbcd00..131922c 100644
--- a/src/tint/lang/glsl/writer/printer/helper_test.h
+++ b/src/tint/lang/glsl/writer/printer/helper_test.h
@@ -62,7 +62,7 @@
     /// Run the writer on the IR module and validate the result.
     /// @returns true if generation and validation succeeded
     bool Generate() {
-        if (auto raised = Raise(mod); raised != Success) {
+        if (auto raised = Raise(mod, {}); raised != Success) {
             err_ = raised.Failure().reason.Str();
             return false;
         }
diff --git a/src/tint/lang/glsl/writer/raise/BUILD.bazel b/src/tint/lang/glsl/writer/raise/BUILD.bazel
index ab458ab..2a36846 100644
--- a/src/tint/lang/glsl/writer/raise/BUILD.bazel
+++ b/src/tint/lang/glsl/writer/raise/BUILD.bazel
@@ -45,18 +45,42 @@
     "raise.h",
   ],
   deps = [
+    "//src/tint/api/common",
+    "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
+    "//src/tint/lang/core/constant",
+    "//src/tint/lang/core/ir/transform",
+    "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
+    "//src/tint/lang/wgsl/ast",
+    "//src/tint/lang/wgsl/ast/transform",
+    "//src/tint/lang/wgsl/program",
+    "//src/tint/lang/wgsl/sem",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
+    "//src/tint/utils/id",
     "//src/tint/utils/macros",
     "//src/tint/utils/math",
     "//src/tint/utils/memory",
+    "//src/tint/utils/reflection",
     "//src/tint/utils/result",
     "//src/tint/utils/rtti",
+    "//src/tint/utils/symbol",
     "//src/tint/utils/text",
     "//src/tint/utils/traits",
-  ],
+  ] + select({
+    ":tint_build_glsl_writer": [
+      "//src/tint/lang/glsl/writer/common",
+    ],
+    "//conditions:default": [],
+  }),
   copts = COPTS,
   visibility = ["//visibility:public"],
 )
 
+alias(
+  name = "tint_build_glsl_writer",
+  actual = "//src/tint:tint_build_glsl_writer_true",
+)
+
diff --git a/src/tint/lang/glsl/writer/raise/BUILD.cfg b/src/tint/lang/glsl/writer/raise/BUILD.cfg
new file mode 100644
index 0000000..7459430
--- /dev/null
+++ b/src/tint/lang/glsl/writer/raise/BUILD.cfg
@@ -0,0 +1,3 @@
+{
+    "condition": "tint_build_glsl_writer"
+}
diff --git a/src/tint/lang/glsl/writer/raise/BUILD.cmake b/src/tint/lang/glsl/writer/raise/BUILD.cmake
index 90ff6d3..3e4ab10 100644
--- a/src/tint/lang/glsl/writer/raise/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/raise/BUILD.cmake
@@ -34,9 +34,11 @@
 #                       Do not modify this file directly
 ################################################################################
 
+if(TINT_BUILD_GLSL_WRITER)
 ################################################################################
 # Target:    tint_lang_glsl_writer_raise
 # Kind:      lib
+# Condition: TINT_BUILD_GLSL_WRITER
 ################################################################################
 tint_add_target(tint_lang_glsl_writer_raise lib
   lang/glsl/writer/raise/raise.cc
@@ -44,14 +46,36 @@
 )
 
 tint_target_add_dependencies(tint_lang_glsl_writer_raise lib
+  tint_api_common
+  tint_lang_core
+  tint_lang_core_common
+  tint_lang_core_constant
+  tint_lang_core_ir_transform
+  tint_lang_core_type
+  tint_lang_wgsl
+  tint_lang_wgsl_ast
+  tint_lang_wgsl_ast_transform
+  tint_lang_wgsl_program
+  tint_lang_wgsl_sem
   tint_utils_containers
   tint_utils_diagnostic
   tint_utils_ice
+  tint_utils_id
   tint_utils_macros
   tint_utils_math
   tint_utils_memory
+  tint_utils_reflection
   tint_utils_result
   tint_utils_rtti
+  tint_utils_symbol
   tint_utils_text
   tint_utils_traits
 )
+
+if(TINT_BUILD_GLSL_WRITER)
+  tint_target_add_dependencies(tint_lang_glsl_writer_raise lib
+    tint_lang_glsl_writer_common
+  )
+endif(TINT_BUILD_GLSL_WRITER)
+
+endif(TINT_BUILD_GLSL_WRITER)
\ No newline at end of file
diff --git a/src/tint/lang/glsl/writer/raise/BUILD.gn b/src/tint/lang/glsl/writer/raise/BUILD.gn
index bd20a51..ef33c7b 100644
--- a/src/tint/lang/glsl/writer/raise/BUILD.gn
+++ b/src/tint/lang/glsl/writer/raise/BUILD.gn
@@ -37,22 +37,41 @@
 import("../../../../../../scripts/tint_overrides_with_defaults.gni")
 
 import("${tint_src_dir}/tint.gni")
+if (tint_build_glsl_writer) {
+  libtint_source_set("raise") {
+    sources = [
+      "raise.cc",
+      "raise.h",
+    ]
+    deps = [
+      "${tint_src_dir}/api/common",
+      "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
+      "${tint_src_dir}/lang/core/constant",
+      "${tint_src_dir}/lang/core/ir/transform",
+      "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
+      "${tint_src_dir}/lang/wgsl/ast",
+      "${tint_src_dir}/lang/wgsl/ast/transform",
+      "${tint_src_dir}/lang/wgsl/program",
+      "${tint_src_dir}/lang/wgsl/sem",
+      "${tint_src_dir}/utils/containers",
+      "${tint_src_dir}/utils/diagnostic",
+      "${tint_src_dir}/utils/ice",
+      "${tint_src_dir}/utils/id",
+      "${tint_src_dir}/utils/macros",
+      "${tint_src_dir}/utils/math",
+      "${tint_src_dir}/utils/memory",
+      "${tint_src_dir}/utils/reflection",
+      "${tint_src_dir}/utils/result",
+      "${tint_src_dir}/utils/rtti",
+      "${tint_src_dir}/utils/symbol",
+      "${tint_src_dir}/utils/text",
+      "${tint_src_dir}/utils/traits",
+    ]
 
-libtint_source_set("raise") {
-  sources = [
-    "raise.cc",
-    "raise.h",
-  ]
-  deps = [
-    "${tint_src_dir}/utils/containers",
-    "${tint_src_dir}/utils/diagnostic",
-    "${tint_src_dir}/utils/ice",
-    "${tint_src_dir}/utils/macros",
-    "${tint_src_dir}/utils/math",
-    "${tint_src_dir}/utils/memory",
-    "${tint_src_dir}/utils/result",
-    "${tint_src_dir}/utils/rtti",
-    "${tint_src_dir}/utils/text",
-    "${tint_src_dir}/utils/traits",
-  ]
+    if (tint_build_glsl_writer) {
+      deps += [ "${tint_src_dir}/lang/glsl/writer/common" ]
+    }
+  }
 }
diff --git a/src/tint/lang/glsl/writer/raise/raise.cc b/src/tint/lang/glsl/writer/raise/raise.cc
index 1985ec7..6d87810 100644
--- a/src/tint/lang/glsl/writer/raise/raise.cc
+++ b/src/tint/lang/glsl/writer/raise/raise.cc
@@ -27,16 +27,114 @@
 
 #include "src/tint/lang/glsl/writer/raise/raise.h"
 
+#include "src/tint/lang/core/ir/transform/add_empty_entry_point.h"
+#include "src/tint/lang/core/ir/transform/array_length_from_uniform.h"
+#include "src/tint/lang/core/ir/transform/binary_polyfill.h"
+#include "src/tint/lang/core/ir/transform/binding_remapper.h"
+#include "src/tint/lang/core/ir/transform/builtin_polyfill.h"
+#include "src/tint/lang/core/ir/transform/conversion_polyfill.h"
+#include "src/tint/lang/core/ir/transform/demote_to_helper.h"
+#include "src/tint/lang/core/ir/transform/direct_variable_access.h"
+#include "src/tint/lang/core/ir/transform/multiplanar_external_texture.h"
+#include "src/tint/lang/core/ir/transform/preserve_padding.h"
+#include "src/tint/lang/core/ir/transform/remove_terminator_args.h"
+#include "src/tint/lang/core/ir/transform/rename_conflicts.h"
+#include "src/tint/lang/core/ir/transform/robustness.h"
+#include "src/tint/lang/core/ir/transform/value_to_let.h"
+#include "src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h"
+#include "src/tint/lang/core/ir/transform/zero_init_workgroup_memory.h"
+#include "src/tint/lang/glsl/writer/common/option_helpers.h"
+
 namespace tint::glsl::writer {
 
-Result<SuccessType> Raise(core::ir::Module&) {
-    // #define RUN_TRANSFORM(name)
-    //     do {
-    //         auto result = core::ir::transform::name(module);
-    //         if (!result) {
-    //             return result;
-    //         }
-    //     } while (false)
+Result<SuccessType> Raise(core::ir::Module& module, const Options& options) {
+#define RUN_TRANSFORM(name, ...)         \
+    do {                                 \
+        auto result = name(__VA_ARGS__); \
+        if (result != Success) {         \
+            return result.Failure();     \
+        }                                \
+    } while (false)
+
+    tint::transform::multiplanar::BindingsMap multiplanar_map{};
+    RemapperData remapper_data{};
+    PopulateBindingInfo(options, remapper_data, multiplanar_map);
+    RUN_TRANSFORM(core::ir::transform::BindingRemapper, module, remapper_data);
+
+    {
+        core::ir::transform::BinaryPolyfillConfig binary_polyfills{};
+        binary_polyfills.int_div_mod = !options.disable_polyfill_integer_div_mod;
+        binary_polyfills.bitshift_modulo = true;  // crbug.com/tint/1543
+        RUN_TRANSFORM(core::ir::transform::BinaryPolyfill, module, binary_polyfills);
+    }
+
+    {
+        core::ir::transform::BuiltinPolyfillConfig core_polyfills{};
+        core_polyfills.clamp_int = true;
+        core_polyfills.count_leading_zeros = true;
+        core_polyfills.count_trailing_zeros = true;
+        core_polyfills.extract_bits = core::ir::transform::BuiltinPolyfillLevel::kClampOrRangeCheck;
+        core_polyfills.first_leading_bit = true;
+        core_polyfills.first_trailing_bit = true;
+        core_polyfills.insert_bits = core::ir::transform::BuiltinPolyfillLevel::kClampOrRangeCheck;
+        core_polyfills.saturate = true;
+        core_polyfills.texture_sample_base_clamp_to_edge_2d_f32 = true;
+        core_polyfills.dot_4x8_packed = true;
+        core_polyfills.pack_unpack_4x8 = true;
+        core_polyfills.pack_4xu8_clamp = true;
+
+        // TODO(dsinclair): bgra8unorm
+        // TODO(dsinclair): bitshift_modulo
+        // TODO(dsinclair): int_div_mod
+
+        RUN_TRANSFORM(core::ir::transform::BuiltinPolyfill, module, core_polyfills);
+    }
+
+    {
+        core::ir::transform::ConversionPolyfillConfig conversion_polyfills;
+        conversion_polyfills.ftoi = true;
+        RUN_TRANSFORM(core::ir::transform::ConversionPolyfill, module, conversion_polyfills);
+    }
+
+    if (!options.disable_robustness) {
+        core::ir::transform::RobustnessConfig config{};
+        RUN_TRANSFORM(core::ir::transform::Robustness, module, config);
+    }
+
+    RUN_TRANSFORM(core::ir::transform::MultiplanarExternalTexture, module, multiplanar_map);
+
+    // TODO(dsinclair): SingleEntryPoint
+    // TODO(dsinclair): TextureBuiltinsFromUniform
+    // TODO(dsinclair): AddBlockAttribute
+    // TODO(dsinclair): OffsetFirstIndex
+    // TODO(dsinclair): ClampFragDepth
+    // TODO(dsinclair): ShaderIO
+    // TODO(dsinclair): CombineSamplers
+    // TODO(dsinclair): PadStructs
+    // TODO(dsinclair): RemoveContinueInSwitch
+    // TODO(dsinclair): Std140
+    // TODO(dsinclair): Texture1DTo2D
+
+    RUN_TRANSFORM(core::ir::transform::DirectVariableAccess, module,
+                  core::ir::transform::DirectVariableAccessOptions{});
+
+    if (!options.disable_workgroup_init) {
+        RUN_TRANSFORM(core::ir::transform::ZeroInitWorkgroupMemory, module);
+    }
+
+    RUN_TRANSFORM(core::ir::transform::PreservePadding, module);
+    RUN_TRANSFORM(core::ir::transform::VectorizeScalarMatrixConstructors, module);
+
+    // DemoteToHelper must come before any transform that introduces non-core instructions.
+    RUN_TRANSFORM(core::ir::transform::DemoteToHelper, module);
+
+    RUN_TRANSFORM(core::ir::transform::AddEmptyEntryPoint, module);
+
+    // These transforms need to be run last as various transforms introduce terminator arguments,
+    // naming conflicts, and expressions that need to be explicitly not inlined.
+    RUN_TRANSFORM(core::ir::transform::RemoveTerminatorArgs, module);
+    RUN_TRANSFORM(core::ir::transform::RenameConflicts, module);
+    RUN_TRANSFORM(core::ir::transform::ValueToLet, module);
 
     return Success;
 }
diff --git a/src/tint/lang/glsl/writer/raise/raise.h b/src/tint/lang/glsl/writer/raise/raise.h
index 846790d..7b48911 100644
--- a/src/tint/lang/glsl/writer/raise/raise.h
+++ b/src/tint/lang/glsl/writer/raise/raise.h
@@ -28,6 +28,7 @@
 #ifndef SRC_TINT_LANG_GLSL_WRITER_RAISE_RAISE_H_
 #define SRC_TINT_LANG_GLSL_WRITER_RAISE_RAISE_H_
 
+#include "src/tint/lang/glsl/writer/common/options.h"
 #include "src/tint/utils/result/result.h"
 
 // Forward declarations
@@ -38,9 +39,10 @@
 namespace tint::glsl::writer {
 
 /// Raise a core IR module to the MSL dialect of the IR.
-/// @param mod the core IR module to raise to MSL dialect
+/// @param module the core IR module to raise to MSL dialect
+/// @param options the writer options
 /// @returns success or failure
-Result<SuccessType> Raise(core::ir::Module& mod);
+Result<SuccessType> Raise(core::ir::Module& module, const Options& options);
 
 }  // namespace tint::glsl::writer
 
diff --git a/src/tint/lang/glsl/writer/writer.cc b/src/tint/lang/glsl/writer/writer.cc
index 17bd7ef..4d07b03 100644
--- a/src/tint/lang/glsl/writer/writer.cc
+++ b/src/tint/lang/glsl/writer/writer.cc
@@ -40,7 +40,7 @@
     Output output;
 
     // Raise from core-dialect to GLSL-dialect.
-    if (auto res = Raise(ir); res != Success) {
+    if (auto res = Raise(ir, options); res != Success) {
         return res.Failure();
     }