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) {