Reverts "Fixes MatrixFilterContents rendering/coverage (#52880)" (#52918)
Reverts: flutter/engine#52880
Initiated by: jonahwilliams
Reason for reverting: unexpected framework golden change
Original PR Author: gaaclarke
Reviewed By: {bdero}
This change reverts the following previous change:
fixes: https://github.com/flutter/flutter/issues/147807
relands https://github.com/flutter/engine/pull/43943 (with fixes that hopefully avoid it being reverted again)
[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#stylediff --git a/ci/licenses_golden/excluded_files b/ci/licenses_golden/excluded_files
index 62ff8bc..37cc6de 100644
--- a/ci/licenses_golden/excluded_files
+++ b/ci/licenses_golden/excluded_files
@@ -147,7 +147,6 @@
../../../flutter/impeller/entity/contents/clip_contents_unittests.cc
../../../flutter/impeller/entity/contents/filters/gaussian_blur_filter_contents_unittests.cc
../../../flutter/impeller/entity/contents/filters/inputs/filter_input_unittests.cc
-../../../flutter/impeller/entity/contents/filters/matrix_filter_contents_unittests.cc
../../../flutter/impeller/entity/contents/host_buffer_unittests.cc
../../../flutter/impeller/entity/contents/test
../../../flutter/impeller/entity/contents/tiled_texture_contents_unittests.cc
diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc
index a99bff8..12c5414 100644
--- a/impeller/aiks/aiks_unittests.cc
+++ b/impeller/aiks/aiks_unittests.cc
@@ -2772,29 +2772,19 @@
}
TEST_P(AiksTest, MatrixImageFilterMagnify) {
- Scalar scale = 2.0;
- auto callback = [&](AiksContext& renderer) -> std::optional<Picture> {
- if (AiksTest::ImGuiBegin("Controls", nullptr,
- ImGuiWindowFlags_AlwaysAutoResize)) {
- ImGui::SliderFloat("Scale", &scale, 1, 2);
- ImGui::End();
- }
- Canvas canvas;
- canvas.Scale(GetContentScale());
- auto image =
- std::make_shared<Image>(CreateTextureForFixture("airplane.jpg"));
- canvas.Translate({600, -200});
- canvas.SaveLayer({
- .image_filter = std::make_shared<MatrixImageFilter>(
- Matrix::MakeScale({scale, scale, 1}), SamplerDescriptor{}),
- });
- canvas.DrawImage(image, {0, 0},
- Paint{.color = Color::White().WithAlpha(0.5)});
- canvas.Restore();
- return canvas.EndRecordingAsPicture();
- };
+ Canvas canvas;
+ canvas.Scale(GetContentScale());
+ auto image = std::make_shared<Image>(CreateTextureForFixture("airplane.jpg"));
+ canvas.Translate({600, -200});
+ canvas.SaveLayer({
+ .image_filter = std::make_shared<MatrixImageFilter>(
+ Matrix::MakeScale({2, 2, 2}), SamplerDescriptor{}),
+ });
+ canvas.DrawImage(image, {0, 0},
+ Paint{.color = Color::White().WithAlpha(0.5)});
+ canvas.Restore();
- ASSERT_TRUE(OpenPlaygroundHere(callback));
+ ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
}
// Render a white circle at the top left corner of the screen.
diff --git a/impeller/aiks/canvas.cc b/impeller/aiks/canvas.cc
index ace3495..4692d11 100644
--- a/impeller/aiks/canvas.cc
+++ b/impeller/aiks/canvas.cc
@@ -225,7 +225,7 @@
entry.cull_rect = transform_stack_.back().cull_rect;
entry.clip_height = transform_stack_.back().clip_height;
if (create_subpass) {
- entry.rendering_mode = Entity::RenderingMode::kBackdropSubpass;
+ entry.rendering_mode = Entity::RenderingMode::kSubpass;
auto subpass = std::make_unique<EntityPass>();
if (backdrop_filter) {
EntityPass::BackdropFilterProc backdrop_filter_proc =
@@ -261,9 +261,7 @@
current_pass_->PopClips(num_clips, current_depth_);
if (transform_stack_.back().rendering_mode ==
- Entity::RenderingMode::kBackdropSubpass ||
- transform_stack_.back().rendering_mode ==
- Entity::RenderingMode::kImageFilterSubpass) {
+ Entity::RenderingMode::kSubpass) {
current_pass_->SetClipDepth(++current_depth_);
current_pass_ = GetCurrentPass().GetSuperpass();
FML_DCHECK(current_pass_);
diff --git a/impeller/aiks/experimental_canvas.cc b/impeller/aiks/experimental_canvas.cc
index b8df394..7837b0c 100644
--- a/impeller/aiks/experimental_canvas.cc
+++ b/impeller/aiks/experimental_canvas.cc
@@ -230,7 +230,7 @@
<< entry.clip_depth << " <=? " << transform_stack_.back().clip_depth
<< " after allocating " << total_content_depth;
entry.clip_height = transform_stack_.back().clip_height;
- entry.rendering_mode = Entity::RenderingMode::kBackdropSubpass;
+ entry.rendering_mode = Entity::RenderingMode::kSubpass;
transform_stack_.emplace_back(entry);
auto inline_pass = std::make_unique<InlinePassContext>(
@@ -272,9 +272,7 @@
current_depth_ = transform_stack_.back().clip_depth;
if (transform_stack_.back().rendering_mode ==
- Entity::RenderingMode::kBackdropSubpass ||
- transform_stack_.back().rendering_mode ==
- Entity::RenderingMode::kImageFilterSubpass) {
+ Entity::RenderingMode::kSubpass) {
auto inline_pass = std::move(inline_pass_contexts_.back());
SaveLayerState save_layer_state = save_layer_state_.back();
diff --git a/impeller/aiks/paint.cc b/impeller/aiks/paint.cc
index 32252b3..1efb587 100644
--- a/impeller/aiks/paint.cc
+++ b/impeller/aiks/paint.cc
@@ -67,8 +67,8 @@
std::shared_ptr<Contents> Paint::WithFiltersForSubpassTarget(
std::shared_ptr<Contents> input,
const Matrix& effect_transform) const {
- auto image_filter = WithImageFilter(
- input, effect_transform, Entity::RenderingMode::kImageFilterSubpass);
+ auto image_filter =
+ WithImageFilter(input, effect_transform, Entity::RenderingMode::kSubpass);
if (image_filter) {
input = image_filter;
}
diff --git a/impeller/aiks/paint_pass_delegate.cc b/impeller/aiks/paint_pass_delegate.cc
index 2879075..3461048 100644
--- a/impeller/aiks/paint_pass_delegate.cc
+++ b/impeller/aiks/paint_pass_delegate.cc
@@ -51,7 +51,7 @@
const FilterInput::Variant& input,
const Matrix& effect_transform) const {
return paint_.WithImageFilter(input, effect_transform,
- Entity::RenderingMode::kImageFilterSubpass);
+ Entity::RenderingMode::kSubpass);
}
/// OpacityPeepholePassDelegate
@@ -153,7 +153,7 @@
const FilterInput::Variant& input,
const Matrix& effect_transform) const {
return paint_.WithImageFilter(input, effect_transform,
- Entity::RenderingMode::kImageFilterSubpass);
+ Entity::RenderingMode::kSubpass);
}
} // namespace impeller
diff --git a/impeller/display_list/dl_golden_unittests.cc b/impeller/display_list/dl_golden_unittests.cc
index 89f04aa..81f9e70 100644
--- a/impeller/display_list/dl_golden_unittests.cc
+++ b/impeller/display_list/dl_golden_unittests.cc
@@ -13,7 +13,6 @@
using impeller::PlaygroundBackend;
using impeller::PlaygroundTest;
-using impeller::Point;
INSTANTIATE_PLAYGROUND_SUITE(DlGoldenTest);
@@ -49,56 +48,5 @@
ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
}
-// Asserts that subpass rendering of MatrixImageFilters works.
-// https://github.com/flutter/flutter/issues/147807
-TEST_P(DlGoldenTest, Bug147807) {
- Point content_scale = GetContentScale();
- auto draw = [content_scale](DlCanvas* canvas,
- const std::vector<sk_sp<DlImage>>& images) {
- canvas->Transform2DAffine(content_scale.x, 0, 0, 0, content_scale.y, 0);
- DlPaint paint;
- paint.setColor(DlColor(0xfffef7ff));
- canvas->DrawRect(SkRect::MakeLTRB(0, 0, 375, 667), paint);
- paint.setColor(DlColor(0xffff9800));
- canvas->DrawRect(SkRect::MakeLTRB(0, 0, 187.5, 333.5), paint);
- paint.setColor(DlColor(0xff9c27b0));
- canvas->DrawRect(SkRect::MakeLTRB(187.5, 0, 375, 333.5), paint);
- paint.setColor(DlColor(0xff4caf50));
- canvas->DrawRect(SkRect::MakeLTRB(0, 333.5, 187.5, 667), paint);
- paint.setColor(DlColor(0xfff44336));
- canvas->DrawRect(SkRect::MakeLTRB(187.5, 333.5, 375, 667), paint);
-
- canvas->Save();
- {
- canvas->ClipRRect(
- SkRRect::MakeOval(SkRect::MakeLTRB(201.25, 10, 361.25, 170)),
- DlCanvas::ClipOp::kIntersect, true);
- SkRect save_layer_bounds = SkRect::MakeLTRB(201.25, 10, 361.25, 170);
- DlMatrixImageFilter backdrop(SkMatrix::MakeAll(3, 0, -280, //
- 0, 3, -920, //
- 0, 0, 1),
- DlImageSampling::kLinear);
- canvas->SaveLayer(&save_layer_bounds, /*paint=*/nullptr, &backdrop);
- {
- canvas->Translate(201.25, 10);
- auto paint = DlPaint()
- .setAntiAlias(true)
- .setColor(DlColor(0xff2196f3))
- .setStrokeWidth(5)
- .setDrawStyle(DlDrawStyle::kStroke);
- canvas->DrawCircle(SkPoint::Make(80, 80), 80, paint);
- }
- canvas->Restore();
- }
- canvas->Restore();
- };
-
- DisplayListBuilder builder;
- std::vector<sk_sp<DlImage>> images;
- draw(&builder, images);
-
- ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
-}
-
} // namespace testing
} // namespace flutter
diff --git a/impeller/entity/BUILD.gn b/impeller/entity/BUILD.gn
index fbf419d..c529d46 100644
--- a/impeller/entity/BUILD.gn
+++ b/impeller/entity/BUILD.gn
@@ -241,7 +241,6 @@
"contents/clip_contents_unittests.cc",
"contents/filters/gaussian_blur_filter_contents_unittests.cc",
"contents/filters/inputs/filter_input_unittests.cc",
- "contents/filters/matrix_filter_contents_unittests.cc",
"contents/host_buffer_unittests.cc",
"contents/tiled_texture_contents_unittests.cc",
"entity_pass_target_unittests.cc",
diff --git a/impeller/entity/contents/filters/matrix_filter_contents.cc b/impeller/entity/contents/filters/matrix_filter_contents.cc
index 1c73cd3..9681e8a 100644
--- a/impeller/entity/contents/filters/matrix_filter_contents.cc
+++ b/impeller/entity/contents/filters/matrix_filter_contents.cc
@@ -28,26 +28,6 @@
sampler_descriptor_ = std::move(desc);
}
-namespace {
-Matrix CalculateSubpassTransform(const Matrix& snapshot_transform,
- const Matrix& effect_transform,
- const Matrix& matrix,
- Entity::RenderingMode rendering_mode) {
- if (rendering_mode == Entity::RenderingMode::kBackdropSubpass) {
- return snapshot_transform * //
- effect_transform * //
- matrix * //
- effect_transform.Invert();
- } else {
- FML_DCHECK(rendering_mode == Entity::RenderingMode::kImageFilterSubpass);
- return effect_transform * //
- matrix * //
- effect_transform.Invert() * //
- snapshot_transform;
- }
-}
-} // namespace
-
std::optional<Entity> MatrixFilterContents::RenderFilter(
const FilterInput::Vector& inputs,
const ContentContext& renderer,
@@ -60,43 +40,29 @@
return std::nullopt;
}
- if (rendering_mode_ == Entity::RenderingMode::kImageFilterSubpass ||
- rendering_mode_ == Entity::RenderingMode::kBackdropSubpass) {
- // There are two special quirks with how Matrix filters behave when used as
- // subpass backdrop filters:
- //
- // 1. For subpass backdrop filters, the snapshot transform is always just a
- // translation that positions the parent pass texture correctly relative
- // to the subpass texture. However, this translation always needs to be
- // applied in screen space.
- //
- // Since we know the snapshot transform will always have an identity
- // basis in this case, we safely reverse the order and apply the filter's
- // matrix within the snapshot transform space.
- //
- // 2. The filter's matrix needs to be applied within the space defined by
- // the scene's current transformation matrix (CTM). For example: If the
- // CTM is scaled up, then translations applied by the matrix should be
- // magnified accordingly.
- //
- // To accomplish this, we sandwitch the filter's matrix within the CTM in
- // both cases. But notice that for the subpass backdrop filter case, we
- // use the "effect transform" instead of the Entity's transform!
- //
- // That's because in the subpass backdrop filter case, the Entity's
- // transform isn't actually the captured CTM of the scene like it usually
- // is; instead, it's just a screen space translation that offsets the
- // backdrop texture (as mentioned above). And so we sneak the subpass's
- // captured CTM in through the effect transform.
- //
- snapshot->transform = CalculateSubpassTransform(
- snapshot->transform, effect_transform, matrix_, rendering_mode_);
- } else {
- snapshot->transform = entity.GetTransform() * //
- matrix_ * //
- entity.GetTransform().Invert() * //
- snapshot->transform;
- }
+ // The filter's matrix needs to be applied within the space defined by the
+ // scene's current transform matrix (CTM). For example: If the CTM is
+ // scaled up, then translations applied by the matrix should be magnified
+ // accordingly.
+ //
+ // To accomplish this, we sandwich the filter's matrix within the CTM in both
+ // cases. But notice that for the subpass backdrop filter case, we use the
+ // "effect transform" instead of the Entity's transform!
+ //
+ // That's because in the subpass backdrop filter case, the Entity's transform
+ // isn't actually the captured CTM of the scene like it usually is; instead,
+ // it's just a screen space translation that offsets the backdrop texture (as
+ // mentioned above). And so we sneak the subpass's captured CTM in through the
+ // effect transform.
+
+ auto transform = rendering_mode_ == Entity::RenderingMode::kSubpass
+ ? effect_transform
+ : entity.GetTransform();
+ snapshot->transform = transform * //
+ matrix_ * //
+ transform.Invert() * //
+ snapshot->transform;
+
snapshot->sampler_descriptor = sampler_descriptor_;
if (!snapshot.has_value()) {
return std::nullopt;
@@ -125,24 +91,17 @@
return std::nullopt;
}
- std::optional<Rect> coverage = inputs[0]->GetCoverage(entity);
+ auto coverage = inputs[0]->GetCoverage(entity);
if (!coverage.has_value()) {
return std::nullopt;
}
-
- Matrix input_transform = inputs[0]->GetTransform(entity);
- if (rendering_mode_ == Entity::RenderingMode::kImageFilterSubpass ||
- rendering_mode_ == Entity::RenderingMode::kBackdropSubpass) {
- Rect coverage_bounds = coverage->TransformBounds(input_transform.Invert());
- Matrix transform = CalculateSubpassTransform(
- input_transform, effect_transform, matrix_, rendering_mode_);
- return coverage_bounds.TransformBounds(transform);
- } else {
- Matrix transform = input_transform * //
- matrix_ * //
- input_transform.Invert(); //
- return coverage->TransformBounds(transform);
- }
+ auto& m = rendering_mode_ == Entity::RenderingMode::kSubpass
+ ? effect_transform
+ : inputs[0]->GetTransform(entity);
+ auto transform = m * //
+ matrix_ * //
+ m.Invert(); //
+ return coverage->TransformBounds(transform);
}
} // namespace impeller
diff --git a/impeller/entity/contents/filters/matrix_filter_contents_unittests.cc b/impeller/entity/contents/filters/matrix_filter_contents_unittests.cc
deleted file mode 100644
index 3c2a3af..0000000
--- a/impeller/entity/contents/filters/matrix_filter_contents_unittests.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "flutter/testing/testing.h"
-#include "gmock/gmock.h"
-#include "impeller/entity/contents/filters/matrix_filter_contents.h"
-#include "impeller/entity/entity_playground.h"
-#include "impeller/geometry/geometry_asserts.h"
-
-namespace impeller {
-namespace testing {
-
-class MatrixFilterContentsTest : public EntityPlayground {
- public:
- /// Create a texture that has been cleared to transparent black.
- std::shared_ptr<Texture> MakeTexture(ISize size) {
- std::shared_ptr<CommandBuffer> command_buffer =
- GetContentContext()->GetContext()->CreateCommandBuffer();
- if (!command_buffer) {
- return nullptr;
- }
-
- auto render_target = GetContentContext()->MakeSubpass(
- "Clear Subpass", size, command_buffer,
- [](const ContentContext&, RenderPass&) { return true; });
-
- if (!GetContentContext()
- ->GetContext()
- ->GetCommandQueue()
- ->Submit(/*buffers=*/{command_buffer})
- .ok()) {
- return nullptr;
- }
-
- if (render_target.ok()) {
- return render_target.value().GetRenderTargetTexture();
- }
- return nullptr;
- }
-};
-
-INSTANTIATE_PLAYGROUND_SUITE(MatrixFilterContentsTest);
-
-TEST(MatrixFilterContentsTest, Create) {
- MatrixFilterContents contents;
- EXPECT_TRUE(contents.IsTranslationOnly());
-}
-
-TEST(MatrixFilterContentsTest, CoverageEmpty) {
- MatrixFilterContents contents;
- FilterInput::Vector inputs = {};
- Entity entity;
- std::optional<Rect> coverage =
- contents.GetFilterCoverage(inputs, entity, /*effect_transform=*/Matrix());
- ASSERT_FALSE(coverage.has_value());
-}
-
-TEST(MatrixFilterContentsTest, CoverageSimple) {
- MatrixFilterContents contents;
- FilterInput::Vector inputs = {
- FilterInput::Make(Rect::MakeLTRB(10, 10, 110, 110))};
- Entity entity;
- std::optional<Rect> coverage =
- contents.GetFilterCoverage(inputs, entity, /*effect_transform=*/Matrix());
-
- ASSERT_EQ(coverage, Rect::MakeLTRB(10, 10, 110, 110));
-}
-
-TEST(MatrixFilterContentsTest, Coverage2x) {
- MatrixFilterContents contents;
- contents.SetMatrix(Matrix::MakeScale({2.0, 2.0, 1.0}));
- FilterInput::Vector inputs = {
- FilterInput::Make(Rect::MakeXYWH(10, 10, 100, 100))};
- Entity entity;
- std::optional<Rect> coverage =
- contents.GetFilterCoverage(inputs, entity, /*effect_transform=*/Matrix());
-
- ASSERT_EQ(coverage, Rect::MakeXYWH(20, 20, 200, 200));
-}
-
-TEST(MatrixFilterContentsTest, Coverage2xEffect) {
- MatrixFilterContents contents;
- FilterInput::Vector inputs = {
- FilterInput::Make(Rect::MakeXYWH(10, 10, 100, 100))};
- Entity entity;
- std::optional<Rect> coverage = contents.GetFilterCoverage(
- inputs, entity, /*effect_transform=*/Matrix::MakeScale({2.0, 2.0, 1.0}));
-
- ASSERT_EQ(coverage, Rect::MakeXYWH(10, 10, 100, 100));
-}
-
-namespace {
-void expectRenderCoverageEqual(const std::optional<Entity>& result,
- const std::optional<Rect> contents_coverage,
- const Rect& expected) {
- EXPECT_TRUE(result.has_value());
- if (result.has_value()) {
- EXPECT_EQ(result.value().GetBlendMode(), BlendMode::kSourceOver);
- std::optional<Rect> result_coverage = result.value().GetCoverage();
- EXPECT_TRUE(result_coverage.has_value());
- EXPECT_TRUE(contents_coverage.has_value());
- if (result_coverage.has_value() && contents_coverage.has_value()) {
- EXPECT_TRUE(RectNear(contents_coverage.value(), expected));
- EXPECT_TRUE(RectNear(result_coverage.value(), expected));
- }
- }
-}
-} // namespace
-
-TEST_P(MatrixFilterContentsTest, RenderCoverageMatchesGetCoverageIdentity) {
- std::shared_ptr<Texture> texture = MakeTexture(ISize(100, 100));
- MatrixFilterContents contents;
- contents.SetInputs({FilterInput::Make(texture)});
-
- Entity entity;
- entity.SetTransform(Matrix::MakeTranslation({100, 200, 0}));
-
- std::shared_ptr<ContentContext> renderer = GetContentContext();
- std::optional<Entity> result =
- contents.GetEntity(*renderer, entity, /*coverage_hint=*/{});
- expectRenderCoverageEqual(result, contents.GetCoverage(entity),
- Rect::MakeXYWH(100, 200, 100, 100));
-}
-
-TEST_P(MatrixFilterContentsTest, RenderCoverageMatchesGetCoverageTranslate) {
- std::shared_ptr<Texture> texture = MakeTexture(ISize(100, 100));
- MatrixFilterContents contents;
- contents.SetInputs({FilterInput::Make(texture)});
- contents.SetMatrix(Matrix::MakeTranslation({50, 100, 0}));
- contents.SetEffectTransform(Matrix::MakeScale({2, 2, 1}));
-
- Entity entity;
- entity.SetTransform(Matrix::MakeTranslation({100, 200, 0}));
-
- std::shared_ptr<ContentContext> renderer = GetContentContext();
- std::optional<Entity> result =
- contents.GetEntity(*renderer, entity, /*coverage_hint=*/{});
- expectRenderCoverageEqual(result, contents.GetCoverage(entity),
- Rect::MakeXYWH(150, 300, 100, 100));
-}
-
-TEST_P(MatrixFilterContentsTest,
- RenderCoverageMatchesGetCoverageBackdropSubpassTranslate) {
- std::shared_ptr<Texture> texture = MakeTexture(ISize(100, 100));
- MatrixFilterContents contents;
- contents.SetInputs({FilterInput::Make(texture)});
- contents.SetMatrix(Matrix::MakeTranslation({50, 100, 0}));
- contents.SetEffectTransform(Matrix::MakeScale({2, 2, 1}));
- contents.SetRenderingMode(Entity::RenderingMode::kBackdropSubpass);
-
- Entity entity;
- entity.SetTransform(Matrix::MakeTranslation({100, 200, 0}));
-
- std::shared_ptr<ContentContext> renderer = GetContentContext();
- std::optional<Entity> result =
- contents.GetEntity(*renderer, entity, /*coverage_hint=*/{});
- expectRenderCoverageEqual(result, contents.GetCoverage(entity),
- Rect::MakeXYWH(200, 400, 100, 100));
-}
-
-TEST_P(MatrixFilterContentsTest, RenderCoverageMatchesGetCoverageScale) {
- std::shared_ptr<Texture> texture = MakeTexture(ISize(100, 100));
- MatrixFilterContents contents;
- contents.SetInputs({FilterInput::Make(texture)});
- contents.SetMatrix(Matrix::MakeScale({3, 3, 1}));
- contents.SetEffectTransform(Matrix::MakeScale({2, 2, 1}));
-
- Entity entity;
- entity.SetTransform(Matrix::MakeTranslation({100, 200, 0}));
-
- std::shared_ptr<ContentContext> renderer = GetContentContext();
- std::optional<Entity> result =
- contents.GetEntity(*renderer, entity, /*coverage_hint=*/{});
- expectRenderCoverageEqual(result, contents.GetCoverage(entity),
- Rect::MakeXYWH(100, 200, 300, 300));
-}
-
-TEST_P(MatrixFilterContentsTest,
- RenderCoverageMatchesGetCoverageBackdropSubpassScale) {
- std::shared_ptr<Texture> texture = MakeTexture(ISize(100, 100));
- MatrixFilterContents contents;
- contents.SetInputs({FilterInput::Make(texture)});
- contents.SetMatrix(Matrix::MakeScale({3, 3, 1}));
- contents.SetEffectTransform(Matrix::MakeScale({2, 2, 1}));
- contents.SetRenderingMode(Entity::RenderingMode::kBackdropSubpass);
-
- Entity entity;
- entity.SetTransform(Matrix::MakeTranslation({100, 200, 0}));
-
- std::shared_ptr<ContentContext> renderer = GetContentContext();
- std::optional<Entity> result =
- contents.GetEntity(*renderer, entity, /*coverage_hint=*/{});
- expectRenderCoverageEqual(result, contents.GetCoverage(entity),
- Rect::MakeXYWH(100, 200, 300, 300));
-}
-
-TEST_P(MatrixFilterContentsTest,
- RenderCoverageMatchesGetCoverageImageFilterSubpassScale) {
- std::shared_ptr<Texture> texture = MakeTexture(ISize(100, 100));
- MatrixFilterContents contents;
- contents.SetInputs({FilterInput::Make(texture)});
- contents.SetMatrix(Matrix::MakeScale({3, 3, 1}));
- contents.SetEffectTransform(Matrix::MakeScale({2, 2, 1}));
- contents.SetRenderingMode(Entity::RenderingMode::kImageFilterSubpass);
-
- Entity entity;
- entity.SetTransform(Matrix::MakeTranslation({100, 200, 0}));
-
- std::shared_ptr<ContentContext> renderer = GetContentContext();
- std::optional<Entity> result =
- contents.GetEntity(*renderer, entity, /*coverage_hint=*/{});
- expectRenderCoverageEqual(result, contents.GetCoverage(entity),
- Rect::MakeXYWH(300, 600, 300, 300));
-}
-
-} // namespace testing
-} // namespace impeller
diff --git a/impeller/entity/entity.h b/impeller/entity/entity.h
index 293a178..d2d4eb9 100644
--- a/impeller/entity/entity.h
+++ b/impeller/entity/entity.h
@@ -33,8 +33,7 @@
/// rather than local space, and so some filters (namely,
/// MatrixFilterContents) need to interpret the given EffectTransform as the
/// current transform matrix.
- kBackdropSubpass,
- kImageFilterSubpass,
+ kSubpass,
};
/// An enum to define how to repeat, fold, or omit colors outside of the
diff --git a/impeller/entity/entity_pass.cc b/impeller/entity/entity_pass.cc
index ee28a0d..596f441 100644
--- a/impeller/entity/entity_pass.cc
+++ b/impeller/entity/entity_pass.cc
@@ -185,7 +185,7 @@
std::shared_ptr<FilterContents> backdrop_filter =
subpass.backdrop_filter_proc_(
FilterInput::Make(accumulated_coverage.value()),
- subpass.transform_, Entity::RenderingMode::kBackdropSubpass);
+ subpass.transform_, Entity::RenderingMode::kSubpass);
if (backdrop_filter) {
auto backdrop_coverage = backdrop_filter->GetCoverage({});
unfiltered_coverage =
@@ -585,9 +585,9 @@
auto texture = pass_context.GetTexture();
// Render the backdrop texture before any of the pass elements.
const auto& proc = subpass->backdrop_filter_proc_;
- subpass_backdrop_filter_contents = proc(
- FilterInput::Make(std::move(texture)), subpass->transform_.Basis(),
- Entity::RenderingMode::kBackdropSubpass);
+ subpass_backdrop_filter_contents =
+ proc(FilterInput::Make(std::move(texture)),
+ subpass->transform_.Basis(), Entity::RenderingMode::kSubpass);
// If the very first thing we render in this EntityPass is a subpass that
// happens to have a backdrop filter, than that backdrop filter will end
diff --git a/testing/impeller_golden_tests_output.txt b/testing/impeller_golden_tests_output.txt
index c291136..1ec4f81 100644
--- a/testing/impeller_golden_tests_output.txt
+++ b/testing/impeller_golden_tests_output.txt
@@ -777,9 +777,6 @@
impeller_Play_AiksTest_VerticesGeometryUVPositionData_Metal.png
impeller_Play_AiksTest_VerticesGeometryUVPositionData_OpenGLES.png
impeller_Play_AiksTest_VerticesGeometryUVPositionData_Vulkan.png
-impeller_Play_DlGoldenTest_Bug147807_Metal.png
-impeller_Play_DlGoldenTest_Bug147807_OpenGLES.png
-impeller_Play_DlGoldenTest_Bug147807_Vulkan.png
impeller_Play_DlGoldenTest_CanDrawPaint_Metal.png
impeller_Play_DlGoldenTest_CanDrawPaint_OpenGLES.png
impeller_Play_DlGoldenTest_CanDrawPaint_Vulkan.png