From c0159abf1b3e61c7bdf686f476e4f2a339dc70cd Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Tue, 20 Feb 2024 11:27:09 -0800 Subject: [PATCH] Implement the render_to_surface flag in GPUSurfaceGLImpeller (flutter/engine#50669) Without this, the EmbedderExternalViewEmbedder's call to SurfaceFrame::Submit will render an empty display list that will overwrite the output rendered by the external view embedder's layers. See https://github.com/flutter/flutter/issues/143387 --- .../shell/gpu/gpu_surface_gl_impeller.cc | 13 ++++++++++++- .../flutter/shell/gpu/gpu_surface_gl_impeller.h | 4 +++- .../android/android_surface_gl_impeller.cc | 5 +++-- .../flutter/shell/platform/embedder/BUILD.gn | 2 +- .../embedder/embedder_surface_gl_impeller.cc | 5 +++-- .../embedder/fixtures/impeller_gl_gradient.png | Bin 0 -> 37220 bytes .../platform/embedder/fixtures/solid_red.png | Bin 3252 -> 0 bytes .../embedder/tests/embedder_gl_unittests.cc | 14 ++++++++++++-- 8 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 engine/src/flutter/shell/platform/embedder/fixtures/impeller_gl_gradient.png delete mode 100644 engine/src/flutter/shell/platform/embedder/fixtures/solid_red.png diff --git a/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.cc b/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.cc index 53c457bdda6..2c45762a512 100644 --- a/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.cc +++ b/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.cc @@ -14,7 +14,8 @@ namespace flutter { GPUSurfaceGLImpeller::GPUSurfaceGLImpeller( GPUSurfaceGLDelegate* delegate, - std::shared_ptr context) + std::shared_ptr context, + bool render_to_surface) : weak_factory_(this) { if (delegate == nullptr) { return; @@ -38,6 +39,7 @@ GPUSurfaceGLImpeller::GPUSurfaceGLImpeller( delegate_ = delegate; impeller_context_ = std::move(context); + render_to_surface_ = render_to_surface; impeller_renderer_ = std::move(renderer); aiks_context_ = std::move(aiks_context); is_valid_ = true; @@ -82,6 +84,15 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( return nullptr; } + if (!render_to_surface_) { + return std::make_unique( + nullptr, SurfaceFrame::FramebufferInfo{.supports_readback = true}, + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { + return true; + }, + size); + } + GLFrameInfo frame_info = {static_cast(size.width()), static_cast(size.height())}; const GLFBOInfo fbo_info = delegate_->GLContextFBO(frame_info); diff --git a/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.h b/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.h index adf975fbbdb..5b6fbd9c1f3 100644 --- a/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.h +++ b/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.h @@ -18,7 +18,8 @@ namespace flutter { class GPUSurfaceGLImpeller final : public Surface { public: explicit GPUSurfaceGLImpeller(GPUSurfaceGLDelegate* delegate, - std::shared_ptr context); + std::shared_ptr context, + bool render_to_surface); // |Surface| ~GPUSurfaceGLImpeller() override; @@ -29,6 +30,7 @@ class GPUSurfaceGLImpeller final : public Surface { private: GPUSurfaceGLDelegate* delegate_ = nullptr; std::shared_ptr impeller_context_; + bool render_to_surface_ = true; std::shared_ptr impeller_renderer_; std::shared_ptr aiks_context_; bool is_valid_ = false; diff --git a/engine/src/flutter/shell/platform/android/android_surface_gl_impeller.cc b/engine/src/flutter/shell/platform/android/android_surface_gl_impeller.cc index 662541ab64b..b2d0b69d9a9 100644 --- a/engine/src/flutter/shell/platform/android/android_surface_gl_impeller.cc +++ b/engine/src/flutter/shell/platform/android/android_surface_gl_impeller.cc @@ -36,8 +36,9 @@ bool AndroidSurfaceGLImpeller::IsValid() const { std::unique_ptr AndroidSurfaceGLImpeller::CreateGPUSurface( GrDirectContext* gr_context) { auto surface = std::make_unique( - this, // delegate - android_context_->GetImpellerContext() // context + this, // delegate + android_context_->GetImpellerContext(), // context + true // render to surface ); if (!surface->IsValid()) { return nullptr; diff --git a/engine/src/flutter/shell/platform/embedder/BUILD.gn b/engine/src/flutter/shell/platform/embedder/BUILD.gn index adc2ad6c699..b83364b8b09 100644 --- a/engine/src/flutter/shell/platform/embedder/BUILD.gn +++ b/engine/src/flutter/shell/platform/embedder/BUILD.gn @@ -242,6 +242,7 @@ test_fixtures("fixtures") { "fixtures/dpr_noxform.png", "fixtures/dpr_xform.png", "fixtures/gradient.png", + "fixtures/impeller_gl_gradient.png", "fixtures/vk_dpr_noxform.png", "fixtures/vk_gradient.png", "fixtures/gradient_metal.png", @@ -250,7 +251,6 @@ test_fixtures("fixtures") { "fixtures/scene_without_custom_compositor.png", "fixtures/scene_without_custom_compositor_with_xform.png", "fixtures/snapshot_large_scene.png", - "fixtures/solid_red.png", "fixtures/verifyb143464703.png", "fixtures/verifyb143464703_soft_noxform.png", ] diff --git a/engine/src/flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc b/engine/src/flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc index e205e8e7473..cae8037083c 100644 --- a/engine/src/flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc +++ b/engine/src/flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -179,8 +179,9 @@ EmbedderSurfaceGLImpeller::GLContextFramebufferInfo() const { // |EmbedderSurface| std::unique_ptr EmbedderSurfaceGLImpeller::CreateGPUSurface() { return std::make_unique( - this, // GPU surface GL delegate - impeller_context_ // render to surface + this, // GPU surface GL delegate + impeller_context_, // Impeller context + !external_view_embedder_ // render to surface ); } diff --git a/engine/src/flutter/shell/platform/embedder/fixtures/impeller_gl_gradient.png b/engine/src/flutter/shell/platform/embedder/fixtures/impeller_gl_gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..76fd5b12f1f122de5e771763d7c0af67af28837d GIT binary patch literal 37220 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 PL&4zb>gTe~DWM4fq#N9) diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_gl_unittests.cc b/engine/src/flutter/shell/platform/embedder/tests/embedder_gl_unittests.cc index a8b411bd7bc..a050e70f8f2 100644 --- a/engine/src/flutter/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/engine/src/flutter/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -4704,8 +4704,14 @@ TEST_F(EmbedderTest, CanRenderWithImpellerOpenGL) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); + bool present_called = false; + static_cast(context).SetGLPresentCallback( + [&present_called](FlutterPresentInfo present_info) { + present_called = true; + }); + builder.AddCommandLineArgument("--enable-impeller"); - builder.SetDartEntrypoint("draw_solid_red"); + builder.SetDartEntrypoint("render_gradient"); builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType( @@ -4727,8 +4733,12 @@ TEST_F(EmbedderTest, CanRenderWithImpellerOpenGL) { ASSERT_TRUE(ImageMatchesFixture( FixtureNameForBackend(EmbedderTestContextType::kOpenGLContext, - "solid_red.png"), + "impeller_gl_gradient.png"), rendered_scene)); + + // The scene will be rendered by the compositor, and the surface present + // callback should not be invoked. + ASSERT_FALSE(present_called); } INSTANTIATE_TEST_SUITE_P(