From 7995974c3e85cdc2b1184a3f57338bac2b61aa8e Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 15 Oct 2024 15:37:29 -0700 Subject: [PATCH 1/5] Starts looking for the bdf fast path in relation to the snapshot_entity's transform --- .../entity/contents/filters/gaussian_blur_filter_contents.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc index d2e39ead1817b..9639a99dc3479 100644 --- a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc +++ b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc @@ -239,7 +239,7 @@ DownsamplePassArgs CalculateDownsamplePassArgs( // .Contains(coverage_hint.value())) std::optional snapshot_coverage = input_snapshot.GetCoverage(); - if (input_snapshot.transform.IsIdentity() && + if (input_snapshot.transform == snapshot_entity.GetTransform() && source_expanded_coverage_hint.has_value() && snapshot_coverage.has_value() && snapshot_coverage->Contains(source_expanded_coverage_hint.value())) { From e8b6ec6576b37a57a42882f10cb7f7445ad7f7c7 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 16 Oct 2024 09:53:18 -0700 Subject: [PATCH 2/5] added fuzzy equals --- .../filters/gaussian_blur_filter_contents.cc | 2 +- impeller/geometry/matrix.h | 13 +++++++++++++ impeller/geometry/matrix_unittests.cc | 12 ++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc index 9639a99dc3479..b70c717394894 100644 --- a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc +++ b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc @@ -239,7 +239,7 @@ DownsamplePassArgs CalculateDownsamplePassArgs( // .Contains(coverage_hint.value())) std::optional snapshot_coverage = input_snapshot.GetCoverage(); - if (input_snapshot.transform == snapshot_entity.GetTransform() && + if (input_snapshot.transform.Equals(snapshot_entity.GetTransform()) && source_expanded_coverage_hint.has_value() && snapshot_coverage.has_value() && snapshot_coverage->Contains(source_expanded_coverage_hint.value())) { diff --git a/impeller/geometry/matrix.h b/impeller/geometry/matrix.h index 1726c30151fdf..8009604072a8a 100644 --- a/impeller/geometry/matrix.h +++ b/impeller/geometry/matrix.h @@ -407,6 +407,19 @@ struct Matrix { std::optional Decompose() const; + bool Equals(const Matrix& matrix, Scalar epsilon = 1e-5) const { + const Scalar* a = m; + const Scalar* b = matrix.m; + return !(fabsf(a[0] - b[0]) > epsilon || fabsf(a[1] - b[1]) > epsilon || + fabsf(a[2] - b[2]) > epsilon || fabsf(a[3] - b[3]) > epsilon || + fabsf(a[4] - b[4]) > epsilon || fabsf(a[5] - b[5]) > epsilon || + fabsf(a[6] - b[6]) > epsilon || fabsf(a[7] - b[7]) > epsilon || + fabsf(a[8] - b[8]) > epsilon || fabsf(a[9] - b[9]) > epsilon || + fabsf(a[10] - b[10]) > epsilon || fabsf(a[11] - b[11]) > epsilon || + fabsf(a[12] - b[12]) > epsilon || fabsf(a[13] - b[13]) > epsilon || + fabsf(a[14] - b[14]) > epsilon || fabsf(a[15] - b[15]) > epsilon); +} + constexpr bool operator==(const Matrix& m) const { // clang-format off return vec[0] == m.vec[0] diff --git a/impeller/geometry/matrix_unittests.cc b/impeller/geometry/matrix_unittests.cc index ac160086994e3..91a2a50f2a7d4 100644 --- a/impeller/geometry/matrix_unittests.cc +++ b/impeller/geometry/matrix_unittests.cc @@ -25,6 +25,18 @@ TEST(MatrixTest, Multiply) { 11.0, 21.0, 0.0, 1.0))); } +TEST(MatrixTest, Equals) { + Matrix x; + Matrix y = x; + EXPECT_TRUE(x.Equals(y)); +} + +TEST(MatrixTest, NotEquals) { + Matrix x; + Matrix y = x.Translate({1, 0, 0}); + EXPECT_FALSE(x.Equals(y)); +} + TEST(MatrixTest, HasPerspective2D) { EXPECT_FALSE(Matrix().HasPerspective2D()); From dc1847f64e3bc9bc654405f8d0cfa5694f5cc107 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 16 Oct 2024 10:08:58 -0700 Subject: [PATCH 3/5] float literal --- impeller/geometry/matrix.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impeller/geometry/matrix.h b/impeller/geometry/matrix.h index 8009604072a8a..ff3aed02db93f 100644 --- a/impeller/geometry/matrix.h +++ b/impeller/geometry/matrix.h @@ -407,7 +407,7 @@ struct Matrix { std::optional Decompose() const; - bool Equals(const Matrix& matrix, Scalar epsilon = 1e-5) const { + bool Equals(const Matrix& matrix, Scalar epsilon = 1e-5f) const { const Scalar* a = m; const Scalar* b = matrix.m; return !(fabsf(a[0] - b[0]) > epsilon || fabsf(a[1] - b[1]) > epsilon || From 2aa14f10867082cd2b319cc8ad9744976472706b Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 16 Oct 2024 10:12:12 -0700 Subject: [PATCH 4/5] format --- impeller/geometry/matrix.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impeller/geometry/matrix.h b/impeller/geometry/matrix.h index ff3aed02db93f..4cdfb7ce5b485 100644 --- a/impeller/geometry/matrix.h +++ b/impeller/geometry/matrix.h @@ -418,7 +418,7 @@ struct Matrix { fabsf(a[10] - b[10]) > epsilon || fabsf(a[11] - b[11]) > epsilon || fabsf(a[12] - b[12]) > epsilon || fabsf(a[13] - b[13]) > epsilon || fabsf(a[14] - b[14]) > epsilon || fabsf(a[15] - b[15]) > epsilon); -} + } constexpr bool operator==(const Matrix& m) const { // clang-format off From 60cb8d31b18416d6e02ba2d7213e899b26f521c0 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 16 Oct 2024 11:09:02 -0700 Subject: [PATCH 5/5] moved to using scalarnearlyequal --- impeller/geometry/matrix.h | 24 ++++++++++++++++-------- impeller/geometry/scalar.h | 5 +++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/impeller/geometry/matrix.h b/impeller/geometry/matrix.h index 4cdfb7ce5b485..166fc11f9609f 100644 --- a/impeller/geometry/matrix.h +++ b/impeller/geometry/matrix.h @@ -410,14 +410,22 @@ struct Matrix { bool Equals(const Matrix& matrix, Scalar epsilon = 1e-5f) const { const Scalar* a = m; const Scalar* b = matrix.m; - return !(fabsf(a[0] - b[0]) > epsilon || fabsf(a[1] - b[1]) > epsilon || - fabsf(a[2] - b[2]) > epsilon || fabsf(a[3] - b[3]) > epsilon || - fabsf(a[4] - b[4]) > epsilon || fabsf(a[5] - b[5]) > epsilon || - fabsf(a[6] - b[6]) > epsilon || fabsf(a[7] - b[7]) > epsilon || - fabsf(a[8] - b[8]) > epsilon || fabsf(a[9] - b[9]) > epsilon || - fabsf(a[10] - b[10]) > epsilon || fabsf(a[11] - b[11]) > epsilon || - fabsf(a[12] - b[12]) > epsilon || fabsf(a[13] - b[13]) > epsilon || - fabsf(a[14] - b[14]) > epsilon || fabsf(a[15] - b[15]) > epsilon); + return ScalarNearlyEqual(a[0], b[0], epsilon) && + ScalarNearlyEqual(a[1], b[1], epsilon) && + ScalarNearlyEqual(a[2], b[2], epsilon) && + ScalarNearlyEqual(a[3], b[3], epsilon) && + ScalarNearlyEqual(a[4], b[4], epsilon) && + ScalarNearlyEqual(a[5], b[5], epsilon) && + ScalarNearlyEqual(a[6], b[6], epsilon) && + ScalarNearlyEqual(a[7], b[7], epsilon) && + ScalarNearlyEqual(a[8], b[8], epsilon) && + ScalarNearlyEqual(a[9], b[9], epsilon) && + ScalarNearlyEqual(a[10], b[10], epsilon) && + ScalarNearlyEqual(a[11], b[11], epsilon) && + ScalarNearlyEqual(a[12], b[12], epsilon) && + ScalarNearlyEqual(a[13], b[13], epsilon) && + ScalarNearlyEqual(a[14], b[14], epsilon) && + ScalarNearlyEqual(a[15], b[15], epsilon); } constexpr bool operator==(const Matrix& m) const { diff --git a/impeller/geometry/scalar.h b/impeller/geometry/scalar.h index 2600a49c42dc5..dadc52850cb5f 100644 --- a/impeller/geometry/scalar.h +++ b/impeller/geometry/scalar.h @@ -22,6 +22,11 @@ constexpr T Absolute(const T& val) { return val >= T{} ? val : -val; } +template <> +constexpr Scalar Absolute(const float& val) { + return fabsf(val); +} + constexpr inline bool ScalarNearlyZero(Scalar x, Scalar tolerance = kEhCloseEnough) { return Absolute(x) <= tolerance;