From a43ee366a57cfe68a51e088b18fddc16ede2b2e8 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 1 Jul 2024 12:40:49 -0700 Subject: [PATCH] [CP][Impeller] Create framebuffer blend vertices based on the snapshot's texture size instead of coverage (#52790) (#53235) The snapshot's transform is provided to the pipeline. If the vertices are based on the coverage rectangle, then that will apply the snapshot's transform twice. Fixes https://github.com/flutter/flutter/issues/148213 --- impeller/aiks/aiks_unittests.cc | 15 +++++++++++++++ .../entity/contents/framebuffer_blend_contents.cc | 7 +------ testing/impeller_golden_tests_output.txt | 3 +++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index 7df6ebd554cb6..0fd95b5d4c23a 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -3458,6 +3458,21 @@ TEST_P(AiksTest, CanRenderClippedBackdropFilter) { ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); } +TEST_P(AiksTest, FramebufferAdvancedBlendCoverage) { + auto texture = CreateTextureForFixture("airplane.jpg", + /*enable_mipmapping=*/true); + + // Draw with an advanced blend that can use FramebufferBlendContents and + // verify that the scale transform is correctly applied to the image. + Canvas canvas; + canvas.DrawPaint({.color = Color::DarkGray()}); + canvas.Scale(Vector2(0.4, 0.4)); + canvas.DrawImage(std::make_shared(texture), {20, 20}, + {.blend_mode = BlendMode::kMultiply}); + + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + } // namespace testing } // namespace impeller diff --git a/impeller/entity/contents/framebuffer_blend_contents.cc b/impeller/entity/contents/framebuffer_blend_contents.cc index c4a75ddd03ab4..4b57b1a8b3672 100644 --- a/impeller/entity/contents/framebuffer_blend_contents.cc +++ b/impeller/entity/contents/framebuffer_blend_contents.cc @@ -52,13 +52,8 @@ bool FramebufferBlendContents::Render(const ContentContext& renderer, if (!src_snapshot.has_value()) { return true; } - auto coverage = src_snapshot->GetCoverage(); - if (!coverage.has_value()) { - return true; - } - Rect src_coverage = coverage.value(); - auto size = src_coverage.GetSize(); + auto size = src_snapshot->texture->GetSize(); VertexBufferBuilder vtx_builder; vtx_builder.AddVertices({ {Point(0, 0), Point(0, 0)}, diff --git a/testing/impeller_golden_tests_output.txt b/testing/impeller_golden_tests_output.txt index 6f301c29df503..565c89cd169f4 100644 --- a/testing/impeller_golden_tests_output.txt +++ b/testing/impeller_golden_tests_output.txt @@ -476,6 +476,9 @@ impeller_Play_AiksTest_FilledRoundRectsRenderCorrectly_Vulkan.png impeller_Play_AiksTest_ForegroundBlendSubpassCollapseOptimization_Metal.png impeller_Play_AiksTest_ForegroundBlendSubpassCollapseOptimization_OpenGLES.png impeller_Play_AiksTest_ForegroundBlendSubpassCollapseOptimization_Vulkan.png +impeller_Play_AiksTest_FramebufferAdvancedBlendCoverage_Metal.png +impeller_Play_AiksTest_FramebufferAdvancedBlendCoverage_OpenGLES.png +impeller_Play_AiksTest_FramebufferAdvancedBlendCoverage_Vulkan.png impeller_Play_AiksTest_GaussianBlurAnimatedBackdrop_Metal.png impeller_Play_AiksTest_GaussianBlurAnimatedBackdrop_OpenGLES.png impeller_Play_AiksTest_GaussianBlurAnimatedBackdrop_Vulkan.png