Import Tint changes from Dawn

Manual fixes:
 * Add build_with_angle to build_overrides

Changes:
  - d32858a3045a89e8c5ff919107ee76c8b103afdf Use Chromium's abseil build files when building in ANGLE by Geoff Lang <geofflang@chromium.org>
  - 81f462abd508c64f57bae402547e41aee79eb682 [msl] Make printer type tests produce valid MSL by James Price <jrprice@google.com>
  - 08f33fe5c6daea5cede4c1a5ac891fd3bf975c31 [tint][ast] Fix ClampFragDepth fuzzer by Ben Clayton <bclayton@google.com>
GitOrigin-RevId: d32858a3045a89e8c5ff919107ee76c8b103afdf
Change-Id: I8dce8a336e4dffe52f8d19f411e3bb3bf190f357
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/187880
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: David Neto <dneto@google.com>
diff --git a/build_overrides/dawn.gni b/build_overrides/dawn.gni
index b34d77f..dbf5451 100644
--- a/build_overrides/dawn.gni
+++ b/build_overrides/dawn.gni
@@ -23,6 +23,9 @@
 # True if Dawn can access build/, testing/ and other Chrome folders.
 dawn_has_build = true
 
+# True if building within an ANGLE checkout
+build_with_angle = false
+
 # Defaults for these are set again in dawn_overrides_with_defaults.gni so that
 # users of Dawn don't have to set dirs if they happen to use the same as Dawn.
 
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 30d21d4..f17d0f3 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -242,10 +242,10 @@
 }
 
 group("abseil") {
-  # When build_with_chromium=true we need to include "//third_party/abseil-cpp:absl" while
+  # When building within Chromium or ANGLE we need to include "//third_party/abseil-cpp:absl" while
   # it's beneficial to be more specific with standalone Dawn, especially when it comes to
   # including it as a dependency in other projects (such as Skia).
-  if (build_with_chromium) {
+  if (build_with_chromium || build_with_angle) {
     public_deps = [ "$dawn_abseil_dir:absl" ]
   } else {
     public_deps = [ "${dawn_root}/third_party/gn/abseil-cpp:strings" ]
diff --git a/src/tint/lang/msl/writer/printer/type_test.cc b/src/tint/lang/msl/writer/printer/type_test.cc
index 13d6b06..0af7e7d 100644
--- a/src/tint/lang/msl/writer/printer/type_test.cc
+++ b/src/tint/lang/msl/writer/printer/type_test.cc
@@ -211,30 +211,30 @@
 
 TEST_F(MslPrinterTest, EmitType_Atomic_U32) {
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, ty.atomic<u32>()));
+    auto* param = b.FunctionParam("a", ty.ptr(core::AddressSpace::kWorkgroup, ty.atomic<u32>()));
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup atomic_uint a;
+void foo(threadgroup atomic_uint* const a) {
 }
 )");
 }
 
 TEST_F(MslPrinterTest, EmitType_Atomic_I32) {
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, ty.atomic<i32>()));
+    auto* param = b.FunctionParam("a", ty.ptr(core::AddressSpace::kWorkgroup, ty.atomic<i32>()));
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup atomic_int a;
+void foo(threadgroup atomic_int* const a) {
 }
 )");
 }
@@ -257,29 +257,28 @@
 TEST_F(MslPrinterTest, EmitType_VectorPacked) {
     auto* func = b.Function("foo", ty.void_());
     b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, ty.packed_vec(ty.f32(), 3)));
+        b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.packed_vec(ty.f32(), 3)));
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
 void foo() {
-  threadgroup packed_float3 a;
+  packed_float3 a = 0.0f;
 }
 )");
 }
 
 TEST_F(MslPrinterTest, EmitType_Void) {
+    // Tested via the function return type.
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, ty.void_()));
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
 void foo() {
-  threadgroup void a;
 }
 )");
 }
@@ -912,30 +911,30 @@
 
 TEST_F(MslPrinterTest, EmitType_Sampler) {
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, ty.sampler()));
+    auto* param = b.FunctionParam("a", ty.sampler());
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup sampler a;
+void foo(sampler a) {
 }
 )");
 }
 
 TEST_F(MslPrinterTest, EmitType_SamplerComparison) {
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, ty.comparison_sampler()));
+    auto* param = b.FunctionParam("a", ty.comparison_sampler());
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup sampler a;
+void foo(sampler a) {
 }
 )");
 }
@@ -956,16 +955,16 @@
 
     auto* t = ty.Get<core::type::DepthTexture>(params.dim);
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, t));
+    auto* param = b.FunctionParam("a", t);
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup )" + params.result +
-                           R"( a;
+void foo()" + params.result +
+                           R"( a) {
 }
 )");
 }
@@ -981,18 +980,18 @@
                     MslDepthTextureData{core::type::TextureDimension::kCubeArray,
                                         "depthcube_array<float, access::sample>"}));
 
-TEST_F(MslPrinterTest, EmiType_DepthMultisampledTexture) {
+TEST_F(MslPrinterTest, EmitType_DepthMultisampledTexture) {
     auto* t = ty.Get<core::type::DepthMultisampledTexture>(core::type::TextureDimension::k2d);
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, t));
+    auto* param = b.FunctionParam("a", t);
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup depth2d_ms<float, access::read> a;
+void foo(depth2d_ms<float, access::read> a) {
 }
 )");
 }
@@ -1013,16 +1012,16 @@
 
     auto* t = ty.Get<core::type::SampledTexture>(params.dim, ty.f32());
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, t));
+    auto* param = b.FunctionParam("a", t);
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup )" + params.result +
-                           R"( a;
+void foo()" + params.result +
+                           R"( a) {
 }
 )");
 }
@@ -1039,18 +1038,18 @@
         MslTextureData{core::type::TextureDimension::kCubeArray,
                        "texturecube_array<float, access::sample>"}));
 
-TEST_F(MslPrinterTest, Emit_TypeMultisampledTexture) {
+TEST_F(MslPrinterTest, EmitType_MultisampledTexture) {
     auto* ms = ty.Get<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, ty.u32());
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, ms));
+    auto* param = b.FunctionParam("a", ms);
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup texture2d_ms<uint, access::read> a;
+void foo(texture2d_ms<uint, access::read> a) {
 }
 )");
 }
@@ -1072,16 +1071,16 @@
     auto s = ty.Get<core::type::StorageTexture>(params.dim, core::TexelFormat::kR32Float,
                                                 core::Access::kWrite, f32);
     auto* func = b.Function("foo", ty.void_());
-    b.Append(func->Block(), [&] {
-        b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, s));
+    auto* param = b.FunctionParam("a", s);
+    func->SetParams({param});
+    b.Append(func->Block(), [&] {  //
         b.Return(func);
     });
 
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
-void foo() {
-  threadgroup )" + params.result +
-                           R"( a;
+void foo()" + params.result +
+                           R"( a) {
 }
 )");
 }
diff --git a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth_fuzz.cc b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth_fuzz.cc
index 6de6553..7b75d69 100644
--- a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth_fuzz.cc
+++ b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth_fuzz.cc
@@ -33,8 +33,13 @@
 namespace {
 
 bool CanRun(const ClampFragDepth::Config& config) {
-    if (config.offsets && config.offsets->min >= config.offsets->max) {
-        return false;  // member offset collision / non-ascending
+    if (config.offsets) {
+        if (config.offsets->min >= config.offsets->max) {
+            return false;  // member offset collision / non-ascending
+        }
+        if ((config.offsets->min & 3) != 0 || (config.offsets->max & 3) != 0) {
+            return false;  // Offsets need 4-byte alignment.
+        }
     }
     return true;
 }