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 53c457bdda..2c45762a51 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 adf975fbbd..5b6fbd9c1f 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 662541ab64..b2d0b69d9a 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 adc2ad6c69..b83364b8b0 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 e205e8e747..cae8037083 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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 literal 0 HcmV?d00001 diff --git a/engine/src/flutter/shell/platform/embedder/fixtures/solid_red.png b/engine/src/flutter/shell/platform/embedder/fixtures/solid_red.png deleted file mode 100644 index 89f889b95dcb75ae7a60517e086d71ae98dec8b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3252 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>iV_;yIRn}C%z`(##?Bp53!NI{%!;#X# zz`&F3>EaktG3V`dLq-M#o&y^i>(4(}B%{Lht8DH}V+IC>#=lk!3=BWo85tQEjM!Kh z7*0qCFfb@2J1{Ub^o$CQ2FPe)7|jTyCBtZ`I9el&)`p|C;b?6*S{shmhS+Pvn0#@z Wb+hy{Vi_117(8A5T-G@yGywpl8{DS= 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 a8b411bd7b..a050e70f8f 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(