Import Tint changes from Dawn

Bump abseil-cpp dependency to fix build.

Changes:
  - 0794566e597a14da217bf040dac2c5297aa87abc Reland "Use abseil's build targets instead of custom ones." by Geoff Lang <geofflang@google.com>
  - 6fd43a01049844ab9645881cd75f9efd12147b65 [tint] Polyfill fwidthFine for MSL and HLSL by James Price <jrprice@google.com>
GitOrigin-RevId: 0794566e597a14da217bf040dac2c5297aa87abc
Change-Id: I01d86d2660e9a9ef6405f0b8135f119df4b9c279
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/184684
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/DEPS b/DEPS
index 55f27cc..a7097d7 100644
--- a/DEPS
+++ b/DEPS
@@ -108,7 +108,7 @@
   },
 
   'third_party/abseil-cpp': {
-    'url': '{chromium_git}/chromium/src/third_party/abseil-cpp@4ef9b33175828ea46d091e7e5ec28259d39a8ba5',
+    'url': '{chromium_git}/chromium/src/third_party/abseil-cpp@a64dd87cec79c80c88190265cfea0cbd4027677f',
   },
 
   # Dependencies required for testing
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index a8ba5d2..d39bd62 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -244,7 +244,7 @@
   if (build_with_chromium) {
     public_deps = [ "$dawn_abseil_dir:absl" ]
   } else {
-    public_deps = [ "${dawn_root}/third_party/gn/abseil-cpp:strings" ]
+    public_deps = [ "${dawn_abseil_dir}/absl/strings:strings" ]
   }
 }
 
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index ffde096..13b1fd6 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -258,6 +258,7 @@
         polyfills.extract_bits = ast::transform::BuiltinPolyfill::Level::kFull;
         polyfills.first_leading_bit = true;
         polyfills.first_trailing_bit = true;
+        polyfills.fwidth_fine = true;
         polyfills.insert_bits = ast::transform::BuiltinPolyfill::Level::kFull;
         polyfills.int_div_mod = !options.disable_polyfill_integer_div_mod;
         polyfills.precise_float_mod = true;
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index 6b4d13d..bb583cd 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -178,6 +178,7 @@
         polyfills.extract_bits = ast::transform::BuiltinPolyfill::Level::kClampParameters;
         polyfills.first_leading_bit = true;
         polyfills.first_trailing_bit = true;
+        polyfills.fwidth_fine = true;
         polyfills.insert_bits = ast::transform::BuiltinPolyfill::Level::kClampParameters;
         polyfills.int_div_mod = !options.disable_polyfill_integer_div_mod;
         polyfills.sign_int = true;
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
index b1f36fc..f82fe95 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
@@ -587,6 +587,27 @@
         return name;
     }
 
+    /// Builds the polyfill function for the `fwidthFine` builtin
+    /// @param ty the parameter and return type for the function
+    /// @return the polyfill function name
+    Symbol fwidthFine(const core::type::Type* ty) {
+        auto name = b.Symbols().New("tint_fwidth_fine");
+        // WGSL polyfill function:
+        //      fn tint_fwidth_fine(v : T) -> T {
+        //          return abs(dpdxFine(v)) + abs(dpdyFine(v));
+        //      }
+        auto body = tint::Vector{
+            b.Return(b.Add(b.Call("abs", b.Call("dpdxFine", "v")),
+                           b.Call("abs", b.Call("dpdyFine", "v")))),
+        };
+        b.Func(name,
+               tint::Vector{
+                   b.Param("v", T(ty)),
+               },
+               T(ty), body);
+        return name;
+    }
+
     /// Builds the polyfill function for the `insertBits` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
@@ -1359,6 +1380,13 @@
                         }
                         return Symbol{};
 
+                    case wgsl::BuiltinFn::kFwidthFine:
+                        if (cfg.builtins.fwidth_fine) {
+                            return builtin_polyfills.GetOrAdd(
+                                builtin, [&] { return fwidthFine(builtin->ReturnType()); });
+                        }
+                        return Symbol{};
+
                     case wgsl::BuiltinFn::kInsertBits:
                         if (cfg.builtins.insert_bits != Level::kNone) {
                             return builtin_polyfills.GetOrAdd(
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.h b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.h
index 2634f74..bdbe157 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.h
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.h
@@ -78,6 +78,8 @@
         bool first_leading_bit = false;
         /// Should `firstTrailingBit()` be polyfilled?
         bool first_trailing_bit = false;
+        /// Should `fwidthFine()` be polyfilled?
+        bool fwidth_fine = false;
         /// Should `insertBits()` be polyfilled?
         Level insert_bits = Level::kNone;
         /// Should integer scalar / vector divides and modulos be polyfilled to avoid DBZ and
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill_test.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill_test.cc
index 0c64163..53a9fc4 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill_test.cc
@@ -1971,6 +1971,77 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
+// fwidthFine
+////////////////////////////////////////////////////////////////////////////////
+DataMap polyfillFwidthFine() {
+    BuiltinPolyfill::Builtins builtins;
+    builtins.fwidth_fine = true;
+    DataMap data;
+    data.Add<BuiltinPolyfill::Config>(builtins);
+    return data;
+}
+
+TEST_F(BuiltinPolyfillTest, ShouldRunFwidthFine) {
+    auto* src = R"(
+fn f() {
+  let v = 0.5f;
+  _ = fwidthFine(v);
+}
+)";
+
+    EXPECT_FALSE(ShouldRun<BuiltinPolyfill>(src));
+    EXPECT_TRUE(ShouldRun<BuiltinPolyfill>(src, polyfillFwidthFine()));
+}
+
+TEST_F(BuiltinPolyfillTest, FwidthFine_f32) {
+    auto* src = R"(
+fn f() {
+  let v = 0.5f;
+  let r : f32 = fwidthFine(v);
+}
+)";
+
+    auto* expect = R"(
+fn tint_fwidth_fine(v : f32) -> f32 {
+  return (abs(dpdxFine(v)) + abs(dpdyFine(v)));
+}
+
+fn f() {
+  let v = 0.5f;
+  let r : f32 = tint_fwidth_fine(v);
+}
+)";
+
+    auto got = Run<BuiltinPolyfill>(src, polyfillFwidthFine());
+
+    EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(BuiltinPolyfillTest, FwidthFine_vec3_f32) {
+    auto* src = R"(
+fn f() {
+  let v = 0.5f;
+  let r : vec3<f32> = fwidthFine(vec3<f32>(v));
+}
+)";
+
+    auto* expect = R"(
+fn tint_fwidth_fine(v : vec3<f32>) -> vec3<f32> {
+  return (abs(dpdxFine(v)) + abs(dpdyFine(v)));
+}
+
+fn f() {
+  let v = 0.5f;
+  let r : vec3<f32> = tint_fwidth_fine(vec3<f32>(v));
+}
+)";
+
+    auto got = Run<BuiltinPolyfill>(src, polyfillFwidthFine());
+
+    EXPECT_EQ(expect, str(got));
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // insertBits
 ////////////////////////////////////////////////////////////////////////////////
 DataMap polyfillInsertBits(Level level) {