From f2c5ad0b1e60d0166e7244bdf5c0521e270d89f8 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 29 Jul 2024 15:59:11 -0700 Subject: [PATCH] [Impeller] delete rasterizer class. (flutter/engine#54196) The rasterizer class doesn't actually do anything besides call impeller::Surface to get the render target. lets just remove it. Simplifies refactores needed to make https://github.com/flutter/engine/pull/53826 work well. --- .../ci/licenses_golden/licenses_flutter | 4 - .../src/flutter/impeller/aiks/aiks_context.cc | 2 +- .../src/flutter/impeller/aiks/aiks_context.h | 2 +- .../flutter/impeller/playground/playground.cc | 134 ++++++++---------- .../flutter/impeller/playground/playground.h | 6 +- engine/src/flutter/impeller/renderer/BUILD.gn | 2 - .../src/flutter/impeller/renderer/renderer.cc | 65 --------- .../src/flutter/impeller/renderer/renderer.h | 49 ------- .../impeller/renderer/renderer_unittests.cc | 10 +- .../flutter/impeller/scene/scene_unittests.cc | 8 +- .../shell/gpu/gpu_surface_gl_impeller.cc | 26 ++-- .../shell/gpu/gpu_surface_gl_impeller.h | 2 - .../shell/gpu/gpu_surface_metal_impeller.h | 2 - .../shell/gpu/gpu_surface_metal_impeller.mm | 105 ++++++-------- .../shell/gpu/gpu_surface_vulkan_impeller.cc | 79 +++++------ .../shell/gpu/gpu_surface_vulkan_impeller.h | 2 - 16 files changed, 154 insertions(+), 344 deletions(-) delete mode 100644 engine/src/flutter/impeller/renderer/renderer.cc delete mode 100644 engine/src/flutter/impeller/renderer/renderer.h diff --git a/engine/src/flutter/ci/licenses_golden/licenses_flutter b/engine/src/flutter/ci/licenses_golden/licenses_flutter index c6fdedf54b..0ea00a6e86 100644 --- a/engine/src/flutter/ci/licenses_golden/licenses_flutter +++ b/engine/src/flutter/ci/licenses_golden/licenses_flutter @@ -42499,8 +42499,6 @@ ORIGIN: ../../../flutter/impeller/renderer/render_pass.cc + ../../../flutter/LIC ORIGIN: ../../../flutter/impeller/renderer/render_pass.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/renderer/render_target.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/renderer/render_target.h + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/renderer/renderer.cc + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/renderer/renderer.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/renderer/sampler_library.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/renderer/sampler_library.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/renderer/shader_function.cc + ../../../flutter/LICENSE @@ -45382,8 +45380,6 @@ FILE: ../../../flutter/impeller/renderer/render_pass.cc FILE: ../../../flutter/impeller/renderer/render_pass.h FILE: ../../../flutter/impeller/renderer/render_target.cc FILE: ../../../flutter/impeller/renderer/render_target.h -FILE: ../../../flutter/impeller/renderer/renderer.cc -FILE: ../../../flutter/impeller/renderer/renderer.h FILE: ../../../flutter/impeller/renderer/sampler_library.cc FILE: ../../../flutter/impeller/renderer/sampler_library.h FILE: ../../../flutter/impeller/renderer/shader_function.cc diff --git a/engine/src/flutter/impeller/aiks/aiks_context.cc b/engine/src/flutter/impeller/aiks/aiks_context.cc index 3be53f9537..d455681ca0 100644 --- a/engine/src/flutter/impeller/aiks/aiks_context.cc +++ b/engine/src/flutter/impeller/aiks/aiks_context.cc @@ -46,7 +46,7 @@ ContentContext& AiksContext::GetContentContext() const { } bool AiksContext::Render(const Picture& picture, - RenderTarget& render_target, + const RenderTarget& render_target, bool reset_host_buffer) { if (!IsValid()) { return false; diff --git a/engine/src/flutter/impeller/aiks/aiks_context.h b/engine/src/flutter/impeller/aiks/aiks_context.h index 5c3d113d64..da52732130 100644 --- a/engine/src/flutter/impeller/aiks/aiks_context.h +++ b/engine/src/flutter/impeller/aiks/aiks_context.h @@ -43,7 +43,7 @@ class AiksContext { ContentContext& GetContentContext() const; bool Render(const Picture& picture, - RenderTarget& render_target, + const RenderTarget& render_target, bool reset_host_buffer); private: diff --git a/engine/src/flutter/impeller/playground/playground.cc b/engine/src/flutter/impeller/playground/playground.cc index 9a173c56ec..80373a4c81 100644 --- a/engine/src/flutter/impeller/playground/playground.cc +++ b/engine/src/flutter/impeller/playground/playground.cc @@ -12,6 +12,7 @@ #include "impeller/playground/image/backends/skia/compressed_image_skia.h" #include "impeller/playground/image/decompressed_image.h" #include "impeller/renderer/command_buffer.h" +#include "impeller/renderer/render_target.h" #include "impeller/runtime_stage/runtime_stage.h" #define GLFW_INCLUDE_NONE @@ -28,7 +29,6 @@ #include "impeller/playground/playground_impl.h" #include "impeller/renderer/context.h" #include "impeller/renderer/render_pass.h" -#include "impeller/renderer/renderer.h" #include "third_party/imgui/backends/imgui_impl_glfw.h" #include "third_party/imgui/imgui.h" @@ -140,12 +140,6 @@ void Playground::SetupWindow() { "SetupContext first)."; return; } - auto renderer = std::make_unique(context_); - if (!renderer->IsValid()) { - return; - } - renderer_ = std::move(renderer); - start_time_ = fml::TimePoint::Now().ToEpochDelta(); } @@ -158,7 +152,6 @@ void Playground::TeardownWindow() { context_->Shutdown(); } context_.reset(); - renderer_.reset(); impl_.reset(); } @@ -202,7 +195,7 @@ void Playground::SetCursorPosition(Point pos) { } bool Playground::OpenPlaygroundHere( - const Renderer::RenderCallback& render_callback) { + const Playground::RenderCallback& render_callback) { if (!switches_.enable_playground) { return true; } @@ -211,10 +204,6 @@ bool Playground::OpenPlaygroundHere( return true; } - if (!renderer_ || !renderer_->IsValid()) { - return false; - } - IMGUI_CHECKVERSION(); ImGui::CreateContext(); fml::ScopedCleanupClosure destroy_imgui_context( @@ -251,7 +240,7 @@ bool Playground::OpenPlaygroundHere( ImGui_ImplGlfw_InitForOther(window, true); fml::ScopedCleanupClosure shutdown_imgui([]() { ImGui_ImplGlfw_Shutdown(); }); - ImGui_ImplImpeller_Init(renderer_->GetContext()); + ImGui_ImplImpeller_Init(context_); fml::ScopedCleanupClosure shutdown_imgui_impeller( []() { ImGui_ImplImpeller_Shutdown(); }); @@ -273,59 +262,58 @@ bool Playground::OpenPlaygroundHere( ImGui_ImplGlfw_NewFrame(); - Renderer::RenderCallback wrapped_callback = - [render_callback, - &renderer = renderer_](RenderTarget& render_target) -> bool { - ImGui::NewFrame(); - ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), - ImGuiDockNodeFlags_PassthruCentralNode); - bool result = render_callback(render_target); - ImGui::Render(); + auto surface = impl_->AcquireSurfaceFrame(context_); + RenderTarget render_target = surface->GetTargetRenderPassDescriptor(); - // Render ImGui overlay. - { - auto buffer = renderer->GetContext()->CreateCommandBuffer(); - if (!buffer) { - return false; - } - buffer->SetLabel("ImGui Command Buffer"); + ImGui::NewFrame(); + ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), + ImGuiDockNodeFlags_PassthruCentralNode); + bool result = render_callback(render_target); + ImGui::Render(); - if (render_target.GetColorAttachments().empty()) { - return false; - } + // Render ImGui overlay. + { + auto buffer = context_->CreateCommandBuffer(); + if (!buffer) { + VALIDATION_LOG << "Could not create command buffer."; + return false; + } + buffer->SetLabel("ImGui Command Buffer"); - auto color0 = render_target.GetColorAttachments().find(0)->second; - color0.load_action = LoadAction::kLoad; - if (color0.resolve_texture) { - color0.texture = color0.resolve_texture; - color0.resolve_texture = nullptr; - color0.store_action = StoreAction::kStore; - } - render_target.SetColorAttachment(color0, 0); - - render_target.SetStencilAttachment(std::nullopt); - render_target.SetDepthAttachment(std::nullopt); - - auto pass = buffer->CreateRenderPass(render_target); - if (!pass) { - return false; - } - pass->SetLabel("ImGui Render Pass"); - - ImGui_ImplImpeller_RenderDrawData(ImGui::GetDrawData(), *pass); - - pass->EncodeCommands(); - if (!renderer->GetContext()->GetCommandQueue()->Submit({buffer}).ok()) { - return false; - } + if (render_target.GetColorAttachments().empty()) { + VALIDATION_LOG << "render target attachments are empty."; + return false; } - return result; - }; + auto color0 = render_target.GetColorAttachments().find(0)->second; + color0.load_action = LoadAction::kLoad; + if (color0.resolve_texture) { + color0.texture = color0.resolve_texture; + color0.resolve_texture = nullptr; + color0.store_action = StoreAction::kStore; + } + render_target.SetColorAttachment(color0, 0); - if (!renderer_->Render(impl_->AcquireSurfaceFrame(renderer_->GetContext()), - wrapped_callback)) { - VALIDATION_LOG << "Could not render into the surface."; + render_target.SetStencilAttachment(std::nullopt); + render_target.SetDepthAttachment(std::nullopt); + + auto pass = buffer->CreateRenderPass(render_target); + if (!pass) { + VALIDATION_LOG << "Could not create render pass."; + return false; + } + pass->SetLabel("ImGui Render Pass"); + + ImGui_ImplImpeller_RenderDrawData(ImGui::GetDrawData(), *pass); + + pass->EncodeCommands(); + + if (!context_->GetCommandQueue()->Submit({buffer}).ok()) { + return false; + } + } + + if (!result || !surface->Present()) { return false; } @@ -454,9 +442,8 @@ std::shared_ptr Playground::CreateTextureForMapping( std::shared_ptr Playground::CreateTextureForFixture( const char* fixture_name, bool enable_mipmapping) const { - auto texture = CreateTextureForMapping(renderer_->GetContext(), - OpenAssetAsMapping(fixture_name), - enable_mipmapping); + auto texture = CreateTextureForMapping( + context_, OpenAssetAsMapping(fixture_name), enable_mipmapping); if (texture == nullptr) { return nullptr; } @@ -483,30 +470,25 @@ std::shared_ptr Playground::CreateTextureCubeForFixture( texture_descriptor.size = images[0].GetSize(); texture_descriptor.mip_count = 1u; - auto texture = renderer_->GetContext()->GetResourceAllocator()->CreateTexture( - texture_descriptor); + auto texture = + context_->GetResourceAllocator()->CreateTexture(texture_descriptor); if (!texture) { VALIDATION_LOG << "Could not allocate texture cube."; return nullptr; } texture->SetLabel("Texture cube"); - auto cmd_buffer = renderer_->GetContext()->CreateCommandBuffer(); + auto cmd_buffer = context_->CreateCommandBuffer(); auto blit_pass = cmd_buffer->CreateBlitPass(); for (size_t i = 0; i < fixture_names.size(); i++) { - auto device_buffer = - renderer_->GetContext()->GetResourceAllocator()->CreateBufferWithCopy( - *images[i].GetAllocation()); + auto device_buffer = context_->GetResourceAllocator()->CreateBufferWithCopy( + *images[i].GetAllocation()); blit_pass->AddCopy(DeviceBuffer::AsBufferView(device_buffer), texture, {}, "", /*slice=*/i); } - if (!blit_pass->EncodeCommands( - renderer_->GetContext()->GetResourceAllocator()) || - !renderer_->GetContext() - ->GetCommandQueue() - ->Submit({std::move(cmd_buffer)}) - .ok()) { + if (!blit_pass->EncodeCommands(context_->GetResourceAllocator()) || + !context_->GetCommandQueue()->Submit({std::move(cmd_buffer)}).ok()) { VALIDATION_LOG << "Could not upload texture to device memory."; return nullptr; } diff --git a/engine/src/flutter/impeller/playground/playground.h b/engine/src/flutter/impeller/playground/playground.h index 339ee8cba0..0a3ed68f15 100644 --- a/engine/src/flutter/impeller/playground/playground.h +++ b/engine/src/flutter/impeller/playground/playground.h @@ -17,7 +17,6 @@ #include "impeller/playground/image/decompressed_image.h" #include "impeller/playground/switches.h" #include "impeller/renderer/render_pass.h" -#include "impeller/renderer/renderer.h" #include "impeller/runtime_stage/runtime_stage.h" namespace impeller { @@ -78,7 +77,9 @@ class Playground { std::shared_ptr MakeContext() const; - bool OpenPlaygroundHere(const Renderer::RenderCallback& render_callback); + using RenderCallback = std::function; + + bool OpenPlaygroundHere(const RenderCallback& render_callback); bool OpenPlaygroundHere(SinglePassCallback pass_callback); @@ -124,7 +125,6 @@ class Playground { fml::TimeDelta start_time_; std::unique_ptr impl_; std::shared_ptr context_; - std::unique_ptr renderer_; Point cursor_position_; ISize window_size_ = ISize{1024, 768}; diff --git a/engine/src/flutter/impeller/renderer/BUILD.gn b/engine/src/flutter/impeller/renderer/BUILD.gn index 5ffb79ec91..fe75154f28 100644 --- a/engine/src/flutter/impeller/renderer/BUILD.gn +++ b/engine/src/flutter/impeller/renderer/BUILD.gn @@ -61,8 +61,6 @@ impeller_component("renderer") { "render_pass.h", "render_target.cc", "render_target.h", - "renderer.cc", - "renderer.h", "sampler_library.cc", "sampler_library.h", "shader_function.cc", diff --git a/engine/src/flutter/impeller/renderer/renderer.cc b/engine/src/flutter/impeller/renderer/renderer.cc deleted file mode 100644 index abc5dc2b7c..0000000000 --- a/engine/src/flutter/impeller/renderer/renderer.cc +++ /dev/null @@ -1,65 +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 "impeller/renderer/renderer.h" - -#include - -#include "flutter/fml/trace_event.h" -#include "impeller/renderer/command_buffer.h" -#include "impeller/renderer/surface.h" - -namespace impeller { - -Renderer::Renderer(std::shared_ptr context, - size_t max_frames_in_flight) - : frames_in_flight_sema_(std::make_shared( - std::max(1u, max_frames_in_flight))), - context_(std::move(context)) { - if (!context_ || !context_->IsValid()) { - return; - } - - is_valid_ = true; -} - -Renderer::~Renderer() = default; - -bool Renderer::IsValid() const { - return is_valid_; -} - -bool Renderer::Render(std::unique_ptr surface, - const RenderCallback& render_callback) const { - TRACE_EVENT0("impeller", "Renderer::Render"); - if (!IsValid()) { - return false; - } - - if (!surface || !surface->IsValid()) { - return false; - } - - RenderTarget render_target = surface->GetTargetRenderPassDescriptor(); - - if (render_callback && !render_callback(render_target)) { - return false; - } - - if (!frames_in_flight_sema_->Wait()) { - return false; - } - - const auto present_result = surface->Present(); - - frames_in_flight_sema_->Signal(); - - return present_result; -} - -std::shared_ptr Renderer::GetContext() const { - return context_; -} - -} // namespace impeller diff --git a/engine/src/flutter/impeller/renderer/renderer.h b/engine/src/flutter/impeller/renderer/renderer.h deleted file mode 100644 index 1a07e59dcd..0000000000 --- a/engine/src/flutter/impeller/renderer/renderer.h +++ /dev/null @@ -1,49 +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. - -#ifndef FLUTTER_IMPELLER_RENDERER_RENDERER_H_ -#define FLUTTER_IMPELLER_RENDERER_RENDERER_H_ - -#include -#include - -#include "flutter/fml/synchronization/semaphore.h" -#include "impeller/renderer/context.h" -#include "impeller/renderer/render_target.h" - -namespace impeller { - -class Surface; - -class Renderer { - public: - static constexpr size_t kDefaultMaxFramesInFlight = 3u; - - using RenderCallback = std::function; - - explicit Renderer(std::shared_ptr context, - size_t max_frames_in_flight = kDefaultMaxFramesInFlight); - - ~Renderer(); - - bool IsValid() const; - - bool Render(std::unique_ptr surface, - const RenderCallback& callback) const; - - std::shared_ptr GetContext() const; - - private: - std::shared_ptr frames_in_flight_sema_; - std::shared_ptr context_; - bool is_valid_ = false; - - Renderer(const Renderer&) = delete; - - Renderer& operator=(const Renderer&) = delete; -}; - -} // namespace impeller - -#endif // FLUTTER_IMPELLER_RENDERER_RENDERER_H_ diff --git a/engine/src/flutter/impeller/renderer/renderer_unittests.cc b/engine/src/flutter/impeller/renderer/renderer_unittests.cc index c97fd05f5b..3b105e0ec8 100644 --- a/engine/src/flutter/impeller/renderer/renderer_unittests.cc +++ b/engine/src/flutter/impeller/renderer/renderer_unittests.cc @@ -32,13 +32,13 @@ #include "impeller/fixtures/texture.frag.h" #include "impeller/fixtures/texture.vert.h" #include "impeller/geometry/path_builder.h" +#include "impeller/playground/playground.h" #include "impeller/playground/playground_test.h" #include "impeller/renderer/command_buffer.h" #include "impeller/renderer/pipeline_builder.h" #include "impeller/renderer/pipeline_library.h" #include "impeller/renderer/render_pass.h" #include "impeller/renderer/render_target.h" -#include "impeller/renderer/renderer.h" #include "impeller/renderer/vertex_buffer_builder.h" #include "third_party/imgui/imgui.h" @@ -545,7 +545,7 @@ TEST_P(RendererTest, CanBlitTextureToTexture) { ASSERT_TRUE(vertex_buffer); auto host_buffer = HostBuffer::Create(context->GetResourceAllocator()); - Renderer::RenderCallback callback = [&](RenderTarget& render_target) { + Playground::RenderCallback callback = [&](RenderTarget& render_target) { auto buffer = context->CreateCommandBuffer(); if (!buffer) { return false; @@ -665,7 +665,7 @@ TEST_P(RendererTest, CanBlitTextureToBuffer) { ASSERT_TRUE(vertex_buffer); auto host_buffer = HostBuffer::Create(context->GetResourceAllocator()); - Renderer::RenderCallback callback = [&](RenderTarget& render_target) { + Playground::RenderCallback callback = [&](RenderTarget& render_target) { { auto buffer = context->CreateCommandBuffer(); if (!buffer) { @@ -782,7 +782,7 @@ TEST_P(RendererTest, CanGenerateMipmaps) { bool first_frame = true; auto host_buffer = HostBuffer::Create(context->GetResourceAllocator()); - Renderer::RenderCallback callback = [&](RenderTarget& render_target) { + Playground::RenderCallback callback = [&](RenderTarget& render_target) { const char* mip_filter_names[] = {"Base", "Nearest", "Linear"}; const MipFilter mip_filters[] = {MipFilter::kBase, MipFilter::kNearest, MipFilter::kLinear}; @@ -1231,7 +1231,7 @@ TEST_P(RendererTest, StencilMask) { CompareFunctionUI().IndexOf(CompareFunction::kLessEqual); auto host_buffer = HostBuffer::Create(context->GetResourceAllocator()); - Renderer::RenderCallback callback = [&](RenderTarget& render_target) { + Playground::RenderCallback callback = [&](RenderTarget& render_target) { auto buffer = context->CreateCommandBuffer(); if (!buffer) { return false; diff --git a/engine/src/flutter/impeller/scene/scene_unittests.cc b/engine/src/flutter/impeller/scene/scene_unittests.cc index ccfd51d4ac..6469d8997d 100644 --- a/engine/src/flutter/impeller/scene/scene_unittests.cc +++ b/engine/src/flutter/impeller/scene/scene_unittests.cc @@ -37,7 +37,7 @@ INSTANTIATE_PLAYGROUND_SUITE(SceneTest); TEST_P(SceneTest, CuboidUnlit) { auto scene_context = std::make_shared(GetContext()); - Renderer::RenderCallback callback = [&](RenderTarget& render_target) { + Playground::RenderCallback callback = [&](RenderTarget& render_target) { auto allocator = GetContext()->GetResourceAllocator(); auto scene = Scene(scene_context); @@ -91,7 +91,7 @@ TEST_P(SceneTest, FlutterLogo) { scene.GetRoot().AddChild(std::move(gltf_scene)); scene.GetRoot().SetLocalTransform(Matrix::MakeScale({3, 3, 3})); - Renderer::RenderCallback callback = [&](RenderTarget& render_target) { + Playground::RenderCallback callback = [&](RenderTarget& render_target) { Quaternion rotation({0, 1, 0}, -GetSecondsElapsed() * 0.5); Vector3 start_position(-1, -1.5, -5); @@ -136,7 +136,7 @@ TEST_P(SceneTest, TwoTriangles) { auto scene = Scene(scene_context); scene.GetRoot().AddChild(std::move(gltf_scene)); - Renderer::RenderCallback callback = [&](RenderTarget& render_target) { + Playground::RenderCallback callback = [&](RenderTarget& render_target) { ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize); { static Scalar playback_time_scale = 1; @@ -232,7 +232,7 @@ TEST_P(SceneTest, Dash) { auto scene = Scene(scene_context); scene.GetRoot().AddChild(std::move(gltf_scene)); - Renderer::RenderCallback callback = [&](RenderTarget& render_target) { + Playground::RenderCallback callback = [&](RenderTarget& render_target) { ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize); { static Scalar playback_time_scale = 1; 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 ca2c90da8f..b9f3f7ba1a 100644 --- a/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.cc +++ b/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.cc @@ -7,7 +7,6 @@ #include "flutter/fml/make_copyable.h" #include "impeller/display_list/dl_dispatcher.h" #include "impeller/renderer/backend/gles/surface_gles.h" -#include "impeller/renderer/renderer.h" #include "impeller/typographer/backends/skia/typographer_context_skia.h" namespace flutter { @@ -25,11 +24,6 @@ GPUSurfaceGLImpeller::GPUSurfaceGLImpeller( return; } - auto renderer = std::make_shared(context); - if (!renderer->IsValid()) { - return; - } - auto aiks_context = std::make_shared( context, impeller::TypographerContextSkia::Make()); @@ -40,7 +34,6 @@ 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; } @@ -105,9 +98,8 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( ); SurfaceFrame::SubmitCallback submit_callback = - fml::MakeCopyable([renderer = impeller_renderer_, // - aiks_context = aiks_context_, // - surface = std::move(surface) // + fml::MakeCopyable([aiks_context = aiks_context_, // + surface = std::move(surface) // ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { if (!aiks_context) { return false; @@ -130,14 +122,12 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( const bool reset_host_buffer = surface_frame.submit_info().frame_boundary; - return renderer->Render( - std::move(surface), - fml::MakeCopyable( - [aiks_context, picture = std::move(picture), reset_host_buffer]( - impeller::RenderTarget& render_target) -> bool { - return aiks_context->Render(picture, render_target, - reset_host_buffer); - })); + const impeller::RenderTarget& render_target = + surface->GetTargetRenderPassDescriptor(); + if (!aiks_context->Render(picture, render_target, reset_host_buffer)) { + return false; + } + return surface->Present(); }); return std::make_unique( 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 d35dd14e96..5d6e63b1ad 100644 --- a/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.h +++ b/engine/src/flutter/shell/gpu/gpu_surface_gl_impeller.h @@ -12,7 +12,6 @@ #include "flutter/impeller/aiks/aiks_context.h" #include "flutter/impeller/renderer/context.h" #include "flutter/shell/gpu/gpu_surface_gl_delegate.h" -#include "impeller/renderer/renderer.h" namespace flutter { @@ -32,7 +31,6 @@ class GPUSurfaceGLImpeller final : public Surface { 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; fml::TaskRunnerAffineWeakPtrFactory weak_factory_; diff --git a/engine/src/flutter/shell/gpu/gpu_surface_metal_impeller.h b/engine/src/flutter/shell/gpu/gpu_surface_metal_impeller.h index ef0c1e955c..58a269dee2 100644 --- a/engine/src/flutter/shell/gpu/gpu_surface_metal_impeller.h +++ b/engine/src/flutter/shell/gpu/gpu_surface_metal_impeller.h @@ -12,7 +12,6 @@ #include "flutter/fml/platform/darwin/scoped_nsobject.h" #include "flutter/impeller/aiks/aiks_context.h" #include "flutter/impeller/renderer/backend/metal/context_mtl.h" -#include "flutter/impeller/renderer/renderer.h" #include "flutter/shell/gpu/gpu_surface_metal_delegate.h" #include "third_party/skia/include/gpu/ganesh/mtl/GrMtlTypes.h" @@ -36,7 +35,6 @@ class IMPELLER_CA_METAL_LAYER_AVAILABLE GPUSurfaceMetalImpeller private: const GPUSurfaceMetalDelegate* delegate_; const MTLRenderTargetType render_target_type_; - std::shared_ptr impeller_renderer_; std::shared_ptr aiks_context_; fml::scoped_nsprotocol> last_texture_; // TODO(38466): Refactor GPU surface APIs take into account the fact that an diff --git a/engine/src/flutter/shell/gpu/gpu_surface_metal_impeller.mm b/engine/src/flutter/shell/gpu/gpu_surface_metal_impeller.mm index e14ac5c4a2..20c54bd307 100644 --- a/engine/src/flutter/shell/gpu/gpu_surface_metal_impeller.mm +++ b/engine/src/flutter/shell/gpu/gpu_surface_metal_impeller.mm @@ -19,24 +19,13 @@ static_assert(!__has_feature(objc_arc), "ARC must be disabled."); namespace flutter { -static std::shared_ptr CreateImpellerRenderer( - std::shared_ptr context) { - auto renderer = std::make_shared(std::move(context)); - if (!renderer->IsValid()) { - FML_LOG(ERROR) << "Could not create valid Impeller Renderer."; - return nullptr; - } - return renderer; -} - GPUSurfaceMetalImpeller::GPUSurfaceMetalImpeller(GPUSurfaceMetalDelegate* delegate, const std::shared_ptr& context, bool render_to_surface) : delegate_(delegate), render_target_type_(delegate->GetRenderTargetType()), - impeller_renderer_(CreateImpellerRenderer(context)), aiks_context_( - std::make_shared(impeller_renderer_ ? context : nullptr, + std::make_shared(context, impeller::TypographerContextSkia::Make())), render_to_surface_(render_to_surface) { // If this preference is explicitly set, we allow for disabling partial repaint. @@ -97,8 +86,8 @@ std::unique_ptr GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa auto* mtl_layer = (CAMetalLayer*)layer; - auto drawable = impeller::SurfaceMTL::GetMetalDrawableAndValidate( - impeller_renderer_->GetContext(), mtl_layer); + auto drawable = + impeller::SurfaceMTL::GetMetalDrawableAndValidate(aiks_context_->GetContext(), mtl_layer); if (!drawable) { return nullptr; } @@ -107,14 +96,13 @@ std::unique_ptr GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa } #ifdef IMPELLER_DEBUG - impeller::ContextMTL::Cast(*impeller_renderer_->GetContext()).GetCaptureManager()->StartCapture(); + impeller::ContextMTL::Cast(*aiks_context_->GetContext()).GetCaptureManager()->StartCapture(); #endif // IMPELLER_DEBUG id last_texture = static_cast>(last_texture_); SurfaceFrame::SubmitCallback submit_callback = fml::MakeCopyable([damage = damage_, disable_partial_repaint = disable_partial_repaint_, // - renderer = impeller_renderer_, // aiks_context = aiks_context_, // drawable, // last_texture // @@ -151,7 +139,7 @@ std::unique_ptr GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa buffer_damage->width(), buffer_damage->height()); } - auto surface = impeller::SurfaceMTL::MakeFromMetalLayerDrawable(renderer->GetContext(), + auto surface = impeller::SurfaceMTL::MakeFromMetalLayerDrawable(aiks_context->GetContext(), drawable, clip_rect); // The surface may be null if we failed to allocate the onscreen render target @@ -167,24 +155,22 @@ std::unique_ptr GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa impeller::IRect cull_rect = surface->coverage(); SkIRect sk_cull_rect = SkIRect::MakeWH(cull_rect.GetWidth(), cull_rect.GetHeight()); + const impeller::RenderTarget& render_target = surface->GetTargetRenderPassDescriptor(); #if EXPERIMENTAL_CANVAS impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(), impeller::Matrix()); display_list->Dispatch(collector, sk_cull_rect); - return renderer->Render( - std::move(surface), - fml::MakeCopyable([aiks_context, &display_list, &cull_rect, - &sk_cull_rect](impeller::RenderTarget& render_target) -> bool { - impeller::ExperimentalDlDispatcher impeller_dispatcher( - aiks_context->GetContentContext(), render_target, - display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(), - cull_rect); - display_list->Dispatch(impeller_dispatcher, sk_cull_rect); - impeller_dispatcher.FinishRecording(); - aiks_context->GetContentContext().GetTransientsBuffer().Reset(); - aiks_context->GetContentContext().GetLazyGlyphAtlas()->ResetTextFrames(); - return true; - })); + + impeller::ExperimentalDlDispatcher impeller_dispatcher( + aiks_context->GetContentContext(), render_target, + display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(), + cull_rect); + display_list->Dispatch(impeller_dispatcher, sk_cull_rect); + impeller_dispatcher.FinishRecording(); + aiks_context->GetContentContext().GetTransientsBuffer().Reset(); + aiks_context->GetContentContext().GetLazyGlyphAtlas()->ResetTextFrames(); + + return surface->Present(); #else impeller::DlDispatcher impeller_dispatcher(cull_rect); display_list->Dispatch(impeller_dispatcher, sk_cull_rect); @@ -192,12 +178,10 @@ std::unique_ptr GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa const bool reset_host_buffer = surface_frame.submit_info().frame_boundary; surface->SetFrameBoundary(surface_frame.submit_info().frame_boundary); - return renderer->Render( - std::move(surface), - fml::MakeCopyable([aiks_context, picture = std::move(picture), - reset_host_buffer](impeller::RenderTarget& render_target) -> bool { - return aiks_context->Render(picture, render_target, reset_host_buffer); - })); + if (!aiks_context->Render(picture, render_target, reset_host_buffer)) { + return false; + } + return surface->Present(); #endif }); @@ -239,17 +223,16 @@ std::unique_ptr GPUSurfaceMetalImpeller::AcquireFrameFromMTLTextur } #ifdef IMPELLER_DEBUG - impeller::ContextMTL::Cast(*impeller_renderer_->GetContext()).GetCaptureManager()->StartCapture(); + impeller::ContextMTL::Cast(*aiks_context_->GetContext()).GetCaptureManager()->StartCapture(); #endif // IMPELLER_DEBUG SurfaceFrame::SubmitCallback submit_callback = fml::MakeCopyable([disable_partial_repaint = disable_partial_repaint_, // damage = damage_, - renderer = impeller_renderer_, // - aiks_context = aiks_context_, // - texture_info, // - mtl_texture, // - delegate = delegate_ // + aiks_context = aiks_context_, // + texture_info, // + mtl_texture, // + delegate = delegate_ // ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { if (!aiks_context) { return false; @@ -283,8 +266,8 @@ std::unique_ptr GPUSurfaceMetalImpeller::AcquireFrameFromMTLTextur buffer_damage->width(), buffer_damage->height()); } - auto surface = - impeller::SurfaceMTL::MakeFromTexture(renderer->GetContext(), mtl_texture, clip_rect); + auto surface = impeller::SurfaceMTL::MakeFromTexture(aiks_context->GetContext(), + mtl_texture, clip_rect); if (clip_rect && clip_rect->IsEmpty()) { return surface->Present(); @@ -296,32 +279,24 @@ std::unique_ptr GPUSurfaceMetalImpeller::AcquireFrameFromMTLTextur impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(), impeller::Matrix()); display_list->Dispatch(collector, sk_cull_rect); - bool render_result = renderer->Render( - std::move(surface), - fml::MakeCopyable([aiks_context, &display_list, &cull_rect, - &sk_cull_rect](impeller::RenderTarget& render_target) -> bool { - impeller::ExperimentalDlDispatcher impeller_dispatcher( - aiks_context->GetContentContext(), render_target, - display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(), - cull_rect); - display_list->Dispatch(impeller_dispatcher, sk_cull_rect); - impeller_dispatcher.FinishRecording(); - aiks_context->GetContentContext().GetTransientsBuffer().Reset(); - aiks_context->GetContentContext().GetLazyGlyphAtlas()->ResetTextFrames(); - return true; - })); + const impeller::RenderTarget& render_target = surface->GetTargetRenderPassDescriptor(); + impeller::ExperimentalDlDispatcher impeller_dispatcher( + aiks_context->GetContentContext(), render_target, + display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(), + cull_rect); + display_list->Dispatch(impeller_dispatcher, sk_cull_rect); + impeller_dispatcher.FinishRecording(); + aiks_context->GetContentContext().GetTransientsBuffer().Reset(); + aiks_context->GetContentContext().GetLazyGlyphAtlas()->ResetTextFrames(); + bool render_result = true; #else impeller::DlDispatcher impeller_dispatcher(cull_rect); display_list->Dispatch(impeller_dispatcher, sk_cull_rect); auto picture = impeller_dispatcher.EndRecordingAsPicture(); const bool reset_host_buffer = surface_frame.submit_info().frame_boundary; - bool render_result = renderer->Render( - std::move(surface), - fml::MakeCopyable([aiks_context, picture = std::move(picture), - reset_host_buffer](impeller::RenderTarget& render_target) -> bool { - return aiks_context->Render(picture, render_target, reset_host_buffer); - })); + const impeller::RenderTarget& render_target = surface->GetTargetRenderPassDescriptor(); + bool render_result = aiks_context->Render(picture, render_target, reset_host_buffer); #endif if (!render_result) { FML_LOG(ERROR) << "Failed to render Impeller frame"; diff --git a/engine/src/flutter/shell/gpu/gpu_surface_vulkan_impeller.cc b/engine/src/flutter/shell/gpu/gpu_surface_vulkan_impeller.cc index d32cef7e6e..7393a8c731 100644 --- a/engine/src/flutter/shell/gpu/gpu_surface_vulkan_impeller.cc +++ b/engine/src/flutter/shell/gpu/gpu_surface_vulkan_impeller.cc @@ -7,7 +7,6 @@ #include "flutter/fml/make_copyable.h" #include "impeller/display_list/dl_dispatcher.h" #include "impeller/renderer/backend/vulkan/surface_context_vk.h" -#include "impeller/renderer/renderer.h" #include "impeller/renderer/surface.h" #include "impeller/typographer/backends/skia/typographer_context_skia.h" @@ -19,11 +18,6 @@ GPUSurfaceVulkanImpeller::GPUSurfaceVulkanImpeller( return; } - auto renderer = std::make_shared(context); - if (!renderer->IsValid()) { - return; - } - auto aiks_context = std::make_shared( context, impeller::TypographerContextSkia::Make()); if (!aiks_context->IsValid()) { @@ -31,7 +25,6 @@ GPUSurfaceVulkanImpeller::GPUSurfaceVulkanImpeller( } impeller_context_ = std::move(context); - impeller_renderer_ = std::move(renderer); aiks_context_ = std::move(aiks_context); is_valid_ = true; } @@ -66,9 +59,8 @@ std::unique_ptr GPUSurfaceVulkanImpeller::AcquireFrame( } SurfaceFrame::SubmitCallback submit_callback = - fml::MakeCopyable([renderer = impeller_renderer_, // - aiks_context = aiks_context_, // - surface = std::move(surface) // + fml::MakeCopyable([aiks_context = aiks_context_, // + surface = std::move(surface) // ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { if (!aiks_context) { return false; @@ -83,44 +75,41 @@ std::unique_ptr GPUSurfaceVulkanImpeller::AcquireFrame( auto cull_rect = surface->GetTargetRenderPassDescriptor().GetRenderTargetSize(); - return renderer->Render( - std::move(surface), - fml::MakeCopyable([&](impeller::RenderTarget& render_target) - -> bool { + const impeller::RenderTarget& render_target = + surface->GetTargetRenderPassDescriptor(); #if EXPERIMENTAL_CANVAS - impeller::TextFrameDispatcher collector( - aiks_context->GetContentContext(), impeller::Matrix()); - display_list->Dispatch( - collector, - SkIRect::MakeWH(cull_rect.width, cull_rect.height)); - impeller::ExperimentalDlDispatcher impeller_dispatcher( - aiks_context->GetContentContext(), render_target, - display_list->root_has_backdrop_filter(), - display_list->max_root_blend_mode(), - impeller::IRect::RoundOut( - impeller::Rect::MakeSize(cull_rect))); - display_list->Dispatch( - impeller_dispatcher, - SkIRect::MakeWH(cull_rect.width, cull_rect.height)); - impeller_dispatcher.FinishRecording(); - aiks_context->GetContentContext().GetTransientsBuffer().Reset(); - aiks_context->GetContentContext() - .GetLazyGlyphAtlas() - ->ResetTextFrames(); - return true; + impeller::TextFrameDispatcher collector( + aiks_context->GetContentContext(), impeller::Matrix()); + display_list->Dispatch( + collector, SkIRect::MakeWH(cull_rect.width, cull_rect.height)); + impeller::ExperimentalDlDispatcher impeller_dispatcher( + aiks_context->GetContentContext(), render_target, + display_list->root_has_backdrop_filter(), + display_list->max_root_blend_mode(), + impeller::IRect::RoundOut(impeller::Rect::MakeSize(cull_rect))); + display_list->Dispatch( + impeller_dispatcher, + SkIRect::MakeWH(cull_rect.width, cull_rect.height)); + impeller_dispatcher.FinishRecording(); + aiks_context->GetContentContext().GetTransientsBuffer().Reset(); + aiks_context->GetContentContext() + .GetLazyGlyphAtlas() + ->ResetTextFrames(); + return surface->Present(); #else - impeller::Rect dl_cull_rect = impeller::Rect::MakeSize(cull_rect); - impeller::DlDispatcher impeller_dispatcher(dl_cull_rect); - display_list->Dispatch( - impeller_dispatcher, - SkIRect::MakeWH(cull_rect.width, cull_rect.height)); - auto picture = impeller_dispatcher.EndRecordingAsPicture(); - const bool reset_host_buffer = - surface_frame.submit_info().frame_boundary; - return aiks_context->Render(picture, render_target, - reset_host_buffer); + impeller::Rect dl_cull_rect = impeller::Rect::MakeSize(cull_rect); + impeller::DlDispatcher impeller_dispatcher(dl_cull_rect); + display_list->Dispatch( + impeller_dispatcher, + SkIRect::MakeWH(cull_rect.width, cull_rect.height)); + auto picture = impeller_dispatcher.EndRecordingAsPicture(); + const bool reset_host_buffer = + surface_frame.submit_info().frame_boundary; + if (!aiks_context->Render(picture, render_target, reset_host_buffer)) { + return false; + } + return surface->Present(); #endif - })); }); return std::make_unique( diff --git a/engine/src/flutter/shell/gpu/gpu_surface_vulkan_impeller.h b/engine/src/flutter/shell/gpu/gpu_surface_vulkan_impeller.h index fb761329ee..06f3bf37f4 100644 --- a/engine/src/flutter/shell/gpu/gpu_surface_vulkan_impeller.h +++ b/engine/src/flutter/shell/gpu/gpu_surface_vulkan_impeller.h @@ -12,7 +12,6 @@ #include "flutter/impeller/aiks/aiks_context.h" #include "flutter/impeller/renderer/context.h" #include "flutter/shell/gpu/gpu_surface_vulkan_delegate.h" -#include "impeller/renderer/renderer.h" namespace flutter { @@ -28,7 +27,6 @@ class GPUSurfaceVulkanImpeller final : public Surface { private: std::shared_ptr impeller_context_; - std::shared_ptr impeller_renderer_; std::shared_ptr aiks_context_; bool is_valid_ = false;