From 7650c1e155f08a37c9c351a3af21d8d5024f4001 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 29 Jul 2024 14:00:44 -0700 Subject: [PATCH 1/7] [Impeller] delete rasterizer class. --- ci/licenses_golden/licenses_flutter | 4 - impeller/aiks/aiks_context.cc | 2 +- impeller/aiks/aiks_context.h | 2 +- impeller/playground/playground.cc | 130 ++++++++++------------- impeller/playground/playground.h | 6 +- impeller/renderer/BUILD.gn | 2 - impeller/renderer/renderer.cc | 65 ------------ impeller/renderer/renderer.h | 49 --------- impeller/renderer/renderer_unittests.cc | 10 +- impeller/scene/scene_unittests.cc | 8 +- shell/gpu/gpu_surface_gl_impeller.cc | 23 +--- shell/gpu/gpu_surface_gl_impeller.h | 2 - shell/gpu/gpu_surface_metal_impeller.h | 2 - shell/gpu/gpu_surface_metal_impeller.mm | 101 +++++++----------- shell/gpu/gpu_surface_vulkan_impeller.cc | 76 ++++++------- shell/gpu/gpu_surface_vulkan_impeller.h | 2 - 16 files changed, 140 insertions(+), 344 deletions(-) delete mode 100644 impeller/renderer/renderer.cc delete mode 100644 impeller/renderer/renderer.h diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 9ac21f7cfaf8c..18f7d2df019e8 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -42501,8 +42501,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 @@ -45386,8 +45384,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/impeller/aiks/aiks_context.cc b/impeller/aiks/aiks_context.cc index 3be53f953713b..d455681ca09d0 100644 --- a/impeller/aiks/aiks_context.cc +++ b/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/impeller/aiks/aiks_context.h b/impeller/aiks/aiks_context.h index 5c3d113d64b79..da5273213095c 100644 --- a/impeller/aiks/aiks_context.h +++ b/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/impeller/playground/playground.cc b/impeller/playground/playground.cc index 9a173c56ec020..cf1f08f771f89 100644 --- a/impeller/playground/playground.cc +++ b/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,60 +262,55 @@ 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(); - - // Render ImGui overlay. - { - auto buffer = renderer->GetContext()->CreateCommandBuffer(); - if (!buffer) { - return false; - } - buffer->SetLabel("ImGui Command Buffer"); - - if (render_target.GetColorAttachments().empty()) { - return false; - } - - 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); + auto surface = impl_->AcquireSurfaceFrame(context_); + RenderTarget render_target = surface->GetTargetRenderPassDescriptor(); + + ImGui::NewFrame(); + ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), + ImGuiDockNodeFlags_PassthruCentralNode); + bool result = render_callback(render_target); + ImGui::Render(); + + // Render ImGui overlay. + { + auto buffer = context_->CreateCommandBuffer(); + if (!buffer) { + VALIDATION_LOG << "Could not create command buffer."; + return false; + } + buffer->SetLabel("ImGui Command Buffer"); - render_target.SetStencilAttachment(std::nullopt); - render_target.SetDepthAttachment(std::nullopt); + if (render_target.GetColorAttachments().empty()) { + VALIDATION_LOG << "render target attachments are empty."; + return false; + } - auto pass = buffer->CreateRenderPass(render_target); - if (!pass) { - return false; - } - pass->SetLabel("ImGui Render Pass"); + 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); - ImGui_ImplImpeller_RenderDrawData(ImGui::GetDrawData(), *pass); + render_target.SetStencilAttachment(std::nullopt); + render_target.SetDepthAttachment(std::nullopt); - pass->EncodeCommands(); - if (!renderer->GetContext()->GetCommandQueue()->Submit({buffer}).ok()) { - return false; - } + auto pass = buffer->CreateRenderPass(render_target); + if (!pass) { + VALIDATION_LOG << "Could not create render pass."; + return false; } + pass->SetLabel("ImGui Render Pass"); - return result; - }; + ImGui_ImplImpeller_RenderDrawData(ImGui::GetDrawData(), *pass); - if (!renderer_->Render(impl_->AcquireSurfaceFrame(renderer_->GetContext()), - wrapped_callback)) { - VALIDATION_LOG << "Could not render into the surface."; - return false; + pass->EncodeCommands(); + + if (!context_->GetCommandQueue()->Submit({buffer}).ok()) { + return false; + } } if (!ShouldKeepRendering()) { @@ -454,9 +438,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 +466,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/impeller/playground/playground.h b/impeller/playground/playground.h index 339ee8cba024f..0a3ed68f15d23 100644 --- a/impeller/playground/playground.h +++ b/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/impeller/renderer/BUILD.gn b/impeller/renderer/BUILD.gn index 5ffb79ec9135c..fe75154f28569 100644 --- a/impeller/renderer/BUILD.gn +++ b/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/impeller/renderer/renderer.cc b/impeller/renderer/renderer.cc deleted file mode 100644 index abc5dc2b7ce75..0000000000000 --- a/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/impeller/renderer/renderer.h b/impeller/renderer/renderer.h deleted file mode 100644 index 1a07e59dcd02f..0000000000000 --- a/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/impeller/renderer/renderer_unittests.cc b/impeller/renderer/renderer_unittests.cc index c97fd05f5bed6..3b105e0ec8414 100644 --- a/impeller/renderer/renderer_unittests.cc +++ b/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/impeller/scene/scene_unittests.cc b/impeller/scene/scene_unittests.cc index ccfd51d4ac6d3..6469d8997dfa0 100644 --- a/impeller/scene/scene_unittests.cc +++ b/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/shell/gpu/gpu_surface_gl_impeller.cc b/shell/gpu/gpu_surface_gl_impeller.cc index ca2c90da8f4a9..e254d2ca922ba 100644 --- a/shell/gpu/gpu_surface_gl_impeller.cc +++ b/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,9 @@ 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(); + return aiks_context->Render(picture, render_target, reset_host_buffer); }); return std::make_unique( diff --git a/shell/gpu/gpu_surface_gl_impeller.h b/shell/gpu/gpu_surface_gl_impeller.h index d35dd14e962f5..5d6e63b1ad48e 100644 --- a/shell/gpu/gpu_surface_gl_impeller.h +++ b/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/shell/gpu/gpu_surface_metal_impeller.h b/shell/gpu/gpu_surface_metal_impeller.h index ef0c1e955cd48..58a269dee20c2 100644 --- a/shell/gpu/gpu_surface_metal_impeller.h +++ b/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/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm index e14ac5c4a224b..d55a5ba0cbe69 100644 --- a/shell/gpu/gpu_surface_metal_impeller.mm +++ b/shell/gpu/gpu_surface_metal_impeller.mm @@ -19,24 +19,13 @@ 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 @@ 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 @@ } #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 @@ 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,21 @@ 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 true; #else impeller::DlDispatcher impeller_dispatcher(cull_rect); display_list->Dispatch(impeller_dispatcher, sk_cull_rect); @@ -192,12 +177,7 @@ 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); - })); + return aiks_context->Render(picture, render_target, reset_host_buffer); #endif }); @@ -239,17 +219,16 @@ } #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 +262,8 @@ 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 +275,24 @@ 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/shell/gpu/gpu_surface_vulkan_impeller.cc b/shell/gpu/gpu_surface_vulkan_impeller.cc index d32cef7e6ea4c..28150997c9d0a 100644 --- a/shell/gpu/gpu_surface_vulkan_impeller.cc +++ b/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,38 @@ 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 true; #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; + return aiks_context->Render(picture, render_target, reset_host_buffer); #endif - })); }); return std::make_unique( diff --git a/shell/gpu/gpu_surface_vulkan_impeller.h b/shell/gpu/gpu_surface_vulkan_impeller.h index fb761329ee95a..06f3bf37f4876 100644 --- a/shell/gpu/gpu_surface_vulkan_impeller.h +++ b/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; From ef04e5f6cd258693781ec70d46f540f6a0ce0d5b Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 29 Jul 2024 15:10:01 -0700 Subject: [PATCH 2/7] wip --- flow/surface_frame.cc | 31 +++++++++++- flow/surface_frame.h | 10 +++- flow/surface_frame_unittests.cc | 16 +++++-- impeller/scene/README.md | 48 +++++++++---------- shell/common/rasterizer_unittests.cc | 36 +++++++++----- shell/gpu/gpu_surface_gl_impeller.cc | 18 +++---- shell/gpu/gpu_surface_metal_impeller.mm | 28 ++++++----- shell/gpu/gpu_surface_metal_skia.mm | 34 ++++++++----- shell/gpu/gpu_surface_vulkan_impeller.cc | 16 ++++--- .../external_view_embedder_unittests.cc | 17 +++++++ 10 files changed, 175 insertions(+), 79 deletions(-) diff --git a/flow/surface_frame.cc b/flow/surface_frame.cc index 60855ce0e0d3d..2a73c468050c0 100644 --- a/flow/surface_frame.cc +++ b/flow/surface_frame.cc @@ -17,12 +17,14 @@ namespace flutter { SurfaceFrame::SurfaceFrame(sk_sp surface, FramebufferInfo framebuffer_info, + const EncodeCallback& encode_callback, const SubmitCallback& submit_callback, SkISize frame_size, std::unique_ptr context_result, bool display_list_fallback) : surface_(std::move(surface)), framebuffer_info_(framebuffer_info), + encode_callback_(encode_callback), submit_callback_(submit_callback), context_result_(std::move(context_result)) { FML_DCHECK(submit_callback_); @@ -47,8 +49,23 @@ SurfaceFrame::SurfaceFrame(sk_sp surface, } } +bool SurfaceFrame::Encode() { + TRACE_EVENT0("flutter", "SurfaceFrame::Encode"); + if (encoded_) { + return false; + } + + encoded_ = PerformEncode(); + + return encoded_; +} + bool SurfaceFrame::Submit() { TRACE_EVENT0("flutter", "SurfaceFrame::Submit"); + if (!encoded_ && !Encode()) { + return false; + } + if (submitted_) { return false; } @@ -70,12 +87,24 @@ sk_sp SurfaceFrame::SkiaSurface() const { return surface_; } +bool SurfaceFrame::PerformEncode() { + if (encode_callback_ == nullptr) { + return false; + } + + if (encode_callback_(*this, Canvas())) { + return true; + } + + return false; +} + bool SurfaceFrame::PerformSubmit() { if (submit_callback_ == nullptr) { return false; } - if (submit_callback_(*this, Canvas())) { + if (submit_callback_(*this)) { return true; } diff --git a/flow/surface_frame.h b/flow/surface_frame.h index da5516feaacab..d3d5f6a817d99 100644 --- a/flow/surface_frame.h +++ b/flow/surface_frame.h @@ -23,8 +23,9 @@ namespace flutter { // underlying client rendering API. A frame may only be submitted once. class SurfaceFrame { public: - using SubmitCallback = + using EncodeCallback = std::function; + using SubmitCallback = std::function; // Information about the underlying framebuffer struct FramebufferInfo { @@ -58,6 +59,7 @@ class SurfaceFrame { SurfaceFrame(sk_sp surface, FramebufferInfo framebuffer_info, + const EncodeCallback& encode_callback, const SubmitCallback& submit_callback, SkISize frame_size, std::unique_ptr context_result = nullptr, @@ -89,6 +91,8 @@ class SurfaceFrame { bool frame_boundary = true; }; + bool Encode(); + bool Submit(); bool IsSubmitted() const; @@ -108,6 +112,7 @@ class SurfaceFrame { private: bool submitted_ = false; + bool encoded_ = false; #if !SLIMPELLER DlSkCanvasAdapter adapter_; @@ -117,11 +122,14 @@ class SurfaceFrame { DlCanvas* canvas_ = nullptr; FramebufferInfo framebuffer_info_; SubmitInfo submit_info_; + EncodeCallback encode_callback_; SubmitCallback submit_callback_; std::unique_ptr context_result_; bool PerformSubmit(); + bool PerformEncode(); + FML_DISALLOW_COPY_AND_ASSIGN(SurfaceFrame); }; diff --git a/flow/surface_frame_unittests.cc b/flow/surface_frame_unittests.cc index 81516ad266dda..cf88cbf7b5567 100644 --- a/flow/surface_frame_unittests.cc +++ b/flow/surface_frame_unittests.cc @@ -11,13 +11,19 @@ namespace flutter { TEST(FlowTest, SurfaceFrameDoesNotSubmitInDtor) { SurfaceFrame::FramebufferInfo framebuffer_info; - auto callback = [](const SurfaceFrame&, DlCanvas*) { + auto callback = [](const SurfaceFrame&) { EXPECT_FALSE(true); return true; }; + auto encode_callback = [](const SurfaceFrame&, DlCanvas*) { + EXPECT_FALSE(true); + return true; + }; + auto surface_frame = std::make_unique( /*surface=*/nullptr, /*framebuffer_info=*/framebuffer_info, + /*encode_callback=*/encode_callback, /*submit_callback=*/callback, /*frame_size=*/SkISize::Make(800, 600)); surface_frame.reset(); @@ -26,10 +32,12 @@ TEST(FlowTest, SurfaceFrameDoesNotSubmitInDtor) { TEST(FlowTest, SurfaceFrameDoesNotHaveEmptyCanvas) { SurfaceFrame::FramebufferInfo framebuffer_info; auto callback = [](const SurfaceFrame&, DlCanvas*) { return true; }; + auto submit_callback = [](const SurfaceFrame&) { return true; }; SurfaceFrame frame( /*surface=*/nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/callback, + /*encode_callback=*/callback, + /*submit_callback=*/submit_callback, /*frame_size=*/SkISize::Make(800, 600), /*context_result=*/nullptr, /*display_list_fallback=*/true); @@ -41,10 +49,12 @@ TEST(FlowTest, SurfaceFrameDoesNotHaveEmptyCanvas) { TEST(FlowTest, SurfaceFrameDoesNotPrepareRtree) { SurfaceFrame::FramebufferInfo framebuffer_info; auto callback = [](const SurfaceFrame&, DlCanvas*) { return true; }; + auto submit_callback = [](const SurfaceFrame&) { return true; }; auto surface_frame = std::make_unique( /*surface=*/nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/callback, + /*encode_callback=*/callback, + /*submit_callback=*/submit_callback, /*frame_size=*/SkISize::Make(800, 600), /*context_result=*/nullptr, /*display_list_fallback=*/true); diff --git a/impeller/scene/README.md b/impeller/scene/README.md index 228a0be0491af..c622ed4766c1a 100644 --- a/impeller/scene/README.md +++ b/impeller/scene/README.md @@ -104,35 +104,33 @@ auto renderer = impeller::Renderer(context); while(true) { std::unique_ptr surface = /* Wrap the window surface */; - renderer->Render(surface, [&scene](RenderTarget& render_target) { - /// Render a perspective view. + const auto& render_target = surface->GetTargetRenderPassDescriptor(); - auto camera = - impeller::Camera::MakePerspective( - /* fov */ kPiOver4, - /* position */ {50, -30, 50}) - .LookAt( - /* target */ impeller::Vector3::Zero, - /* up */ {0, -1, 0}); + /// Render a perspective view. - scene.Render(render_target, camera); + auto camera = + impeller::Camera::MakePerspective( + /* fov */ kPiOver4, + /* position */ {50, -30, 50}) + .LookAt( + /* target */ impeller::Vector3::Zero, + /* up */ {0, -1, 0}); + + scene.Render(render_target, camera); /// Render an overhead view on the bottom right corner of the screen. - auto size = render_target.GetRenderTargetSize(); - auto minimap_camera = - impeller::Camera::MakeOrthographic( - /* view */ Rect::MakeLTRB(-100, -100, 100, 100), - /* position */ {0, -50, 0}) - .LookAt( - /* target */ impeller::Vector3::Zero, - /* up */ {0, 0, 1}) - .WithViewport(IRect::MakeXYWH(size.width / 4, size.height / 4, - size.height / 5, size.height / 5)); - - scene.Render(render_target, minimap_camera); - - return true; - }); + auto size = render_target.GetRenderTargetSize(); + auto minimap_camera = + impeller::Camera::MakeOrthographic( + /* view */ Rect::MakeLTRB(-100, -100, 100, 100), + /* position */ {0, -50, 0}) + .LookAt( + /* target */ impeller::Vector3::Zero, + /* up */ {0, 0, 1}) + .WithViewport(IRect::MakeXYWH(size.width / 4, size.height / 4, + size.height / 5, size.height / 5)); + + scene.Render(render_target, minimap_camera); } ``` diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index 5306b195e74ef..52980917d3ef0 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "flow/surface_frame.h" #define FML_USED_ON_EMBEDDER #include "flutter/shell/common/rasterizer.h" @@ -209,7 +210,8 @@ TEST(RasterizerTest, auto surface_frame = std::make_unique( /*surface=*/ nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); EXPECT_CALL(*surface, AcquireFrame(SkISize())) @@ -287,7 +289,8 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/ nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); EXPECT_CALL(*surface, AcquireFrame(SkISize())) @@ -365,7 +368,8 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/ nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); EXPECT_CALL(*surface, AcquireFrame(SkISize())) @@ -440,12 +444,14 @@ TEST(RasterizerTest, auto surface_frame1 = std::make_unique( /*surface=*/ nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_frame2 = std::make_unique( /*surface=*/ nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()) .WillRepeatedly(Return(true)); @@ -688,7 +694,8 @@ TEST(RasterizerTest, drawMultipleViewsWithExternalViewEmbedder) { return std::make_unique( /*surface=*/ nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); }); EXPECT_CALL(*surface, MakeRenderContextCurrent()) @@ -765,7 +772,8 @@ TEST(RasterizerTest, auto surface_frame = std::make_unique( /*surface=*/ nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); ON_CALL(delegate, GetIsGpuDisabledSyncSwitch()) @@ -826,7 +834,8 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/ nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); ON_CALL(delegate, GetIsGpuDisabledSyncSwitch()) @@ -888,7 +897,8 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/ nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(false)); EXPECT_CALL(delegate, GetIsGpuDisabledSyncSwitch()) @@ -949,7 +959,8 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/ nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*encode_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(false)); EXPECT_CALL(delegate, GetIsGpuDisabledSyncSwitch()) @@ -1074,8 +1085,9 @@ TEST(RasterizerTest, return std::make_unique( /*surface=*/ nullptr, framebuffer_info, - /*submit_callback=*/ - [](const SurfaceFrame& frame, DlCanvas*) { return true; }, + /*encode_callback=*/ + [](const SurfaceFrame&, DlCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame& frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); })); ON_CALL(*surface, MakeRenderContextCurrent()) diff --git a/shell/gpu/gpu_surface_gl_impeller.cc b/shell/gpu/gpu_surface_gl_impeller.cc index e254d2ca922ba..a62cff4b71722 100644 --- a/shell/gpu/gpu_surface_gl_impeller.cc +++ b/shell/gpu/gpu_surface_gl_impeller.cc @@ -4,6 +4,7 @@ #include "flutter/shell/gpu/gpu_surface_gl_impeller.h" +#include "flow/surface_frame.h" #include "flutter/fml/make_copyable.h" #include "impeller/display_list/dl_dispatcher.h" #include "impeller/renderer/backend/gles/surface_gles.h" @@ -83,7 +84,7 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, - size); + [](const SurfaceFrame& surface_frame) { return true; }, size); } GLFrameInfo frame_info = {static_cast(size.width()), @@ -97,7 +98,7 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( impeller::ISize{size.width(), size.height()} // fbo_size ); - SurfaceFrame::SubmitCallback submit_callback = + SurfaceFrame::EncodeCallback encode_calback = fml::MakeCopyable([aiks_context = aiks_context_, // surface = std::move(surface) // ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { @@ -128,12 +129,13 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( }); return std::make_unique( - nullptr, // surface - delegate_->GLContextFramebufferInfo(), // framebuffer info - submit_callback, // submit callback - size, // frame size - std::move(context_switch), // context result - true // display list fallback + nullptr, // surface + delegate_->GLContextFramebufferInfo(), // framebuffer info + encode_calback, // encode callback + [](const SurfaceFrame&) { return true; }, // submit callback + size, // frame size + std::move(context_switch), // context result + true // display list fallback ); } diff --git a/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm index d55a5ba0cbe69..60a4e1c89581e 100644 --- a/shell/gpu/gpu_surface_metal_impeller.mm +++ b/shell/gpu/gpu_surface_metal_impeller.mm @@ -6,6 +6,8 @@ #import #import +#include "flow/surface.h" +#include "flow/surface_frame.h" #include "flutter/common/settings.h" #include "flutter/fml/make_copyable.h" @@ -100,7 +102,7 @@ #endif // IMPELLER_DEBUG id last_texture = static_cast>(last_texture_); - SurfaceFrame::SubmitCallback submit_callback = + SurfaceFrame::EncodeCallback encode_callback = fml::MakeCopyable([damage = damage_, disable_partial_repaint = disable_partial_repaint_, // aiks_context = aiks_context_, // @@ -149,7 +151,7 @@ } if (clip_rect && clip_rect->IsEmpty()) { - return surface->Present(); + return true; //surface->Present(); } impeller::IRect cull_rect = surface->coverage(); @@ -222,13 +224,11 @@ impeller::ContextMTL::Cast(*aiks_context_->GetContext()).GetCaptureManager()->StartCapture(); #endif // IMPELLER_DEBUG - SurfaceFrame::SubmitCallback submit_callback = + SurfaceFrame::EncodeCallback encode_callback = fml::MakeCopyable([disable_partial_repaint = disable_partial_repaint_, // damage = damage_, aiks_context = aiks_context_, // - texture_info, // - mtl_texture, // - delegate = delegate_ // + mtl_texture // ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { if (!aiks_context) { return false; @@ -299,9 +299,14 @@ return false; } - return delegate->PresentTexture(texture_info); + return true; }); + SurfaceFrame::SubmitCallback submit_callback = + [texture_info, delegate = delegate_](const SurfaceFrame& surface_frame) { + return delegate->PresentTexture(texture_info); + }; + SurfaceFrame::FramebufferInfo framebuffer_info; framebuffer_info.supports_readback = true; @@ -318,10 +323,11 @@ return std::make_unique(nullptr, // surface framebuffer_info, // framebuffer info - submit_callback, // submit callback - frame_size, // frame size - nullptr, // context result - true // display list fallback + encode_callback, + submit_callback, // submit callback + frame_size, // frame size + nullptr, // context result + true // display list fallback ); } diff --git a/shell/gpu/gpu_surface_metal_skia.mm b/shell/gpu/gpu_surface_metal_skia.mm index c945c8894a70c..c4f4e4d377f40 100644 --- a/shell/gpu/gpu_surface_metal_skia.mm +++ b/shell/gpu/gpu_surface_metal_skia.mm @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "flow/surface_frame.h" #if !SLIMPELLER #include "flutter/shell/gpu/gpu_surface_metal_skia.h" @@ -102,8 +103,12 @@ if (!render_to_surface_) { return std::make_unique( - nullptr, SurfaceFrame::FramebufferInfo(), - [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, frame_size); + nullptr, // + SurfaceFrame::FramebufferInfo(), // + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, // + [](const SurfaceFrame& surface_frame) { return true; }, // + frame_size // + ); } PrecompileKnownSkSLsIfNecessary(); @@ -152,9 +157,8 @@ return nullptr; } - auto submit_callback = [this, drawable](const SurfaceFrame& surface_frame, + auto encode_callback = [this, drawable](const SurfaceFrame& surface_frame, DlCanvas* canvas) -> bool { - TRACE_EVENT0("flutter", "GPUSurfaceMetal::Submit"); if (canvas == nullptr) { FML_DLOG(ERROR) << "Canvas not available."; return false; @@ -179,6 +183,11 @@ damage_[texture] = SkIRect::MakeEmpty(); } + return true; + }; + + auto submit_callback = [this, drawable](const SurfaceFrame& surface_frame) -> bool { + TRACE_EVENT0("flutter", "GPUSurfaceMetal::Submit"); return delegate_->PresentDrawable(drawable); }; @@ -196,8 +205,8 @@ framebuffer_info.supports_partial_repaint = true; } - return std::make_unique(std::move(surface), framebuffer_info, submit_callback, - frame_info); + return std::make_unique(std::move(surface), framebuffer_info, encode_callback, + submit_callback, frame_info); } std::unique_ptr GPUSurfaceMetalSkia::AcquireFrameFromMTLTexture( @@ -220,9 +229,7 @@ return nullptr; } - auto submit_callback = [texture = texture, delegate = delegate_]( - const SurfaceFrame& surface_frame, DlCanvas* canvas) -> bool { - TRACE_EVENT0("flutter", "GPUSurfaceMetal::PresentTexture"); + auto encode_callback = [](const SurfaceFrame& surface_frame, DlCanvas* canvas) -> bool { if (canvas == nullptr) { FML_DLOG(ERROR) << "Canvas not available."; return false; @@ -233,14 +240,19 @@ canvas->Flush(); } + return true; + }; + auto submit_callback = [texture = texture, + delegate = delegate_](const SurfaceFrame& surface_frame) { + TRACE_EVENT0("flutter", "GPUSurfaceMetal::PresentTexture"); return delegate->PresentTexture(texture); }; SurfaceFrame::FramebufferInfo framebuffer_info; framebuffer_info.supports_readback = true; - return std::make_unique(std::move(surface), framebuffer_info, submit_callback, - frame_info); + return std::make_unique(std::move(surface), framebuffer_info, encode_callback, + submit_callback, frame_info); } // |Surface| diff --git a/shell/gpu/gpu_surface_vulkan_impeller.cc b/shell/gpu/gpu_surface_vulkan_impeller.cc index 28150997c9d0a..5748421fa4ce6 100644 --- a/shell/gpu/gpu_surface_vulkan_impeller.cc +++ b/shell/gpu/gpu_surface_vulkan_impeller.cc @@ -4,6 +4,7 @@ #include "flutter/shell/gpu/gpu_surface_vulkan_impeller.h" +#include "flow/surface_frame.h" #include "flutter/fml/make_copyable.h" #include "impeller/display_list/dl_dispatcher.h" #include "impeller/renderer/backend/vulkan/surface_context_vk.h" @@ -58,7 +59,7 @@ std::unique_ptr GPUSurfaceVulkanImpeller::AcquireFrame( return nullptr; } - SurfaceFrame::SubmitCallback submit_callback = + SurfaceFrame::EncodeCallback encode_callback = fml::MakeCopyable([aiks_context = aiks_context_, // surface = std::move(surface) // ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { @@ -110,12 +111,13 @@ std::unique_ptr GPUSurfaceVulkanImpeller::AcquireFrame( }); return std::make_unique( - nullptr, // surface - SurfaceFrame::FramebufferInfo{}, // framebuffer info - submit_callback, // submit callback - size, // frame size - nullptr, // context result - true // display list fallback + nullptr, // surface + SurfaceFrame::FramebufferInfo{}, // framebuffer info + encode_callback, // encode callback + [](const SurfaceFrame&) { return true; }, // submit callback + size, // frame size + nullptr, // context result + true // display list fallback ); } diff --git a/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc b/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc index 57eec1e60d2eb..20282ba848333 100644 --- a/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc +++ b/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc @@ -273,12 +273,14 @@ TEST(AndroidExternalViewEmbedder, SubmitFlutterView) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_frame_2 = std::make_unique( SkSurfaces::Null(1000, 1000), framebuffer_info, [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_mock = std::make_unique(); @@ -314,6 +316,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFlutterView) { } return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, @@ -384,6 +387,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFlutterView) { } return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, @@ -452,6 +456,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFlutterView) { } return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, std::move(surface_frame)); @@ -485,6 +490,7 @@ TEST(AndroidExternalViewEmbedder, OverlayCoverTwoPlatformViews) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_mock = std::make_unique(); @@ -560,6 +566,7 @@ TEST(AndroidExternalViewEmbedder, OverlayCoverTwoPlatformViews) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) mutable { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, @@ -585,6 +592,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFrameOverlayComposition) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_mock = std::make_unique(); @@ -665,6 +673,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFrameOverlayComposition) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) mutable { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, @@ -690,6 +699,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFramePlatformViewWithoutAnyOverlay) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_mock = std::make_unique(); @@ -735,6 +745,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFramePlatformViewWithoutAnyOverlay) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) mutable { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, @@ -780,6 +791,7 @@ TEST(AndroidExternalViewEmbedder, DestroyOverlayLayersOnSizeChange) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_mock = std::make_unique(); @@ -839,6 +851,7 @@ TEST(AndroidExternalViewEmbedder, DestroyOverlayLayersOnSizeChange) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, std::move(surface_frame)); @@ -870,6 +883,7 @@ TEST(AndroidExternalViewEmbedder, DoesNotDestroyOverlayLayersOnSizeChange) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_mock = std::make_unique(); @@ -928,6 +942,7 @@ TEST(AndroidExternalViewEmbedder, DoesNotDestroyOverlayLayersOnSizeChange) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, std::move(surface_frame)); @@ -998,6 +1013,7 @@ TEST(AndroidExternalViewEmbedder, Teardown) { [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_mock = std::make_unique(); @@ -1042,6 +1058,7 @@ TEST(AndroidExternalViewEmbedder, Teardown) { auto surface_frame = std::make_unique( SkSurfaces::Null(1000, 1000), framebuffer_info, [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFlutterView(kImplicitViewId, gr_context.get(), nullptr, std::move(surface_frame)); From 5a566a518a23388ebd6c71eced7a5bff94f5eb6e Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 29 Jul 2024 16:28:44 -0700 Subject: [PATCH 3/7] [engine] split up encode and submit. --- flow/surface_frame.cc | 2 +- flow/surface_frame.h | 13 +++ shell/gpu/gpu_surface_gl_impeller.cc | 70 ++++++------ shell/gpu/gpu_surface_gl_skia.cc | 28 ++--- shell/gpu/gpu_surface_gl_skia.h | 2 +- shell/gpu/gpu_surface_metal_impeller.mm | 26 +++-- shell/gpu/gpu_surface_software.cc | 20 +++- shell/gpu/gpu_surface_vulkan.cc | 19 ++-- shell/gpu/gpu_surface_vulkan_impeller.cc | 101 +++++++++--------- .../Source/FlutterPlatformViewsTest.mm | 9 ++ 10 files changed, 169 insertions(+), 121 deletions(-) diff --git a/flow/surface_frame.cc b/flow/surface_frame.cc index 2a73c468050c0..7c90ee5513fa2 100644 --- a/flow/surface_frame.cc +++ b/flow/surface_frame.cc @@ -62,7 +62,7 @@ bool SurfaceFrame::Encode() { bool SurfaceFrame::Submit() { TRACE_EVENT0("flutter", "SurfaceFrame::Submit"); - if (!encoded_ && !Encode()) { + if (!encoded_ && !Encode()) { return false; } diff --git a/flow/surface_frame.h b/flow/surface_frame.h index d3d5f6a817d99..44b0c9ca703bb 100644 --- a/flow/surface_frame.h +++ b/flow/surface_frame.h @@ -17,6 +17,10 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkSurface.h" +namespace impeller { +class Surface; +} + namespace flutter { // This class represents a frame that has been fully configured for the @@ -110,6 +114,14 @@ class SurfaceFrame { sk_sp BuildDisplayList(); + void set_user_data(std::shared_ptr data) { + user_data_ = std::move(data); + } + + std::shared_ptr take_user_data() { + return std::move(user_data_); + } + private: bool submitted_ = false; bool encoded_ = false; @@ -124,6 +136,7 @@ class SurfaceFrame { SubmitInfo submit_info_; EncodeCallback encode_callback_; SubmitCallback submit_callback_; + std::shared_ptr user_data_; std::unique_ptr context_result_; bool PerformSubmit(); diff --git a/shell/gpu/gpu_surface_gl_impeller.cc b/shell/gpu/gpu_surface_gl_impeller.cc index a62cff4b71722..763956ebc496b 100644 --- a/shell/gpu/gpu_surface_gl_impeller.cc +++ b/shell/gpu/gpu_surface_gl_impeller.cc @@ -98,44 +98,44 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( impeller::ISize{size.width(), size.height()} // fbo_size ); + const impeller::RenderTarget& render_target = + surface->GetTargetRenderPassDescriptor(); + SurfaceFrame::EncodeCallback encode_calback = - fml::MakeCopyable([aiks_context = aiks_context_, // - surface = std::move(surface) // - ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { - if (!aiks_context) { - return false; - } - - auto display_list = surface_frame.BuildDisplayList(); - if (!display_list) { - FML_LOG(ERROR) << "Could not build display list for surface frame."; - return false; - } - - auto cull_rect = - surface->GetTargetRenderPassDescriptor().GetRenderTargetSize(); - 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; - - const impeller::RenderTarget& render_target = - surface->GetTargetRenderPassDescriptor(); - return aiks_context->Render(picture, render_target, reset_host_buffer); - }); + [aiks_context = aiks_context_, // + render_target](SurfaceFrame& surface_frame, + DlCanvas* canvas) mutable -> bool { + if (!aiks_context) { + return false; + } + + auto display_list = surface_frame.BuildDisplayList(); + if (!display_list) { + FML_LOG(ERROR) << "Could not build display list for surface frame."; + return false; + } + + auto cull_rect = render_target.GetRenderTargetSize(); + 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); + }; return std::make_unique( - nullptr, // surface - delegate_->GLContextFramebufferInfo(), // framebuffer info - encode_calback, // encode callback - [](const SurfaceFrame&) { return true; }, // submit callback - size, // frame size - std::move(context_switch), // context result - true // display list fallback + nullptr, // surface + delegate_->GLContextFramebufferInfo(), // framebuffer info + encode_calback, // encode callback + fml::MakeCopyable([surface = std::move(surface)](const SurfaceFrame&) { + return surface->Present(); + }), // submit callback + size, // frame size + std::move(context_switch), // context result + true // display list fallback ); } diff --git a/shell/gpu/gpu_surface_gl_skia.cc b/shell/gpu/gpu_surface_gl_skia.cc index 04c708808e0a9..332202a1554e1 100644 --- a/shell/gpu/gpu_surface_gl_skia.cc +++ b/shell/gpu/gpu_surface_gl_skia.cc @@ -235,7 +235,7 @@ std::unique_ptr GPUSurfaceGLSkia::AcquireFrame( [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, - size); + [](const SurfaceFrame& surface_frame) { return true; }, size); } const auto root_surface_transformation = GetRootTransformation(); @@ -248,10 +248,20 @@ std::unique_ptr GPUSurfaceGLSkia::AcquireFrame( } surface->getCanvas()->setMatrix(root_surface_transformation); - SurfaceFrame::SubmitCallback submit_callback = + + SurfaceFrame::EncodeCallback encode_callback = [weak = weak_factory_.GetWeakPtr()](const SurfaceFrame& surface_frame, DlCanvas* canvas) { - return weak ? weak->PresentSurface(surface_frame, canvas) : false; + TRACE_EVENT0("flutter", "GrDirectContext::flushAndSubmit"); + if (weak) { + weak->context_->flushAndSubmit(); + return true; + } + return false; + }; + SurfaceFrame::SubmitCallback submit_callback = + [weak = weak_factory_.GetWeakPtr()](const SurfaceFrame& surface_frame) { + return weak ? weak->PresentSurface(surface_frame) : false; }; framebuffer_info = delegate_->GLContextFramebufferInfo(); @@ -259,23 +269,17 @@ std::unique_ptr GPUSurfaceGLSkia::AcquireFrame( framebuffer_info.existing_damage = existing_damage_; } return std::make_unique(surface, framebuffer_info, - submit_callback, size, + encode_callback, submit_callback, size, std::move(context_switch)); } -bool GPUSurfaceGLSkia::PresentSurface(const SurfaceFrame& frame, - DlCanvas* canvas) { - if (delegate_ == nullptr || canvas == nullptr || context_ == nullptr) { +bool GPUSurfaceGLSkia::PresentSurface(const SurfaceFrame& frame) { + if (delegate_ == nullptr || context_ == nullptr) { return false; } delegate_->GLContextSetDamageRegion(frame.submit_info().buffer_damage); - { - TRACE_EVENT0("flutter", "GrDirectContext::flushAndSubmit"); - context_->flushAndSubmit(); - } - GLPresentInfo present_info = { .fbo_id = fbo_id_, .frame_damage = frame.submit_info().frame_damage, diff --git a/shell/gpu/gpu_surface_gl_skia.h b/shell/gpu/gpu_surface_gl_skia.h index ae6cdaf52d13f..0101b2a2f18cc 100644 --- a/shell/gpu/gpu_surface_gl_skia.h +++ b/shell/gpu/gpu_surface_gl_skia.h @@ -62,7 +62,7 @@ class GPUSurfaceGLSkia : public Surface { const SkISize& untransformed_size, const SkMatrix& root_surface_transformation); - bool PresentSurface(const SurfaceFrame& frame, DlCanvas* canvas); + bool PresentSurface(const SurfaceFrame& frame); GPUSurfaceGLDelegate* delegate_; sk_sp context_; diff --git a/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm index 60a4e1c89581e..86f0517e429de 100644 --- a/shell/gpu/gpu_surface_metal_impeller.mm +++ b/shell/gpu/gpu_surface_metal_impeller.mm @@ -62,7 +62,8 @@ if (!render_to_surface_) { return std::make_unique( nullptr, SurfaceFrame::FramebufferInfo(), - [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, frame_size); + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame) { return true; }, frame_size); } switch (render_target_type_) { @@ -102,6 +103,7 @@ #endif // IMPELLER_DEBUG id last_texture = static_cast>(last_texture_); + SurfaceFrame::EncodeCallback encode_callback = fml::MakeCopyable([damage = damage_, disable_partial_repaint = disable_partial_repaint_, // @@ -151,13 +153,17 @@ } if (clip_rect && clip_rect->IsEmpty()) { - return true; //surface->Present(); + surface_frame.set_user_data(std::move(surface)); + return true; } 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(); + surface->SetFrameBoundary(surface_frame.submit_info().frame_boundary); + + surface_frame.set_user_data(std::move(surface)); #if EXPERIMENTAL_CANVAS impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(), impeller::Matrix()); @@ -177,8 +183,6 @@ display_list->Dispatch(impeller_dispatcher, sk_cull_rect); auto picture = impeller_dispatcher.EndRecordingAsPicture(); const bool reset_host_buffer = surface_frame.submit_info().frame_boundary; - surface->SetFrameBoundary(surface_frame.submit_info().frame_boundary); - return aiks_context->Render(picture, render_target, reset_host_buffer); #endif }); @@ -197,12 +201,14 @@ framebuffer_info.supports_partial_repaint = true; } - return std::make_unique(nullptr, // surface - framebuffer_info, // framebuffer info - submit_callback, // submit callback - frame_size, // frame size - nullptr, // context result - true // display list fallback + return std::make_unique( + nullptr, // surface + framebuffer_info, // framebuffer info + encode_callback, // submit callback + [](SurfaceFrame& surface_frame) { return surface_frame.take_user_data()->Present(); }, + frame_size, // frame size + nullptr, // context result + true // display list fallback ); } diff --git a/shell/gpu/gpu_surface_software.cc b/shell/gpu/gpu_surface_software.cc index efb905ba24ecb..8a2998d180996 100644 --- a/shell/gpu/gpu_surface_software.cc +++ b/shell/gpu/gpu_surface_software.cc @@ -6,6 +6,7 @@ #include +#include "flow/surface_frame.h" #include "flutter/fml/logging.h" #include "third_party/skia/include/core/SkSurface.h" @@ -39,7 +40,7 @@ std::unique_ptr GPUSurfaceSoftware::AcquireFrame( [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, - logical_size); + [](const SurfaceFrame& surface_frame) { return true; }, logical_size); } if (!IsValid()) { @@ -64,7 +65,7 @@ std::unique_ptr GPUSurfaceSoftware::AcquireFrame( SkCanvas* canvas = backing_store->getCanvas(); canvas->resetMatrix(); - SurfaceFrame::SubmitCallback on_submit = + SurfaceFrame::EncodeCallback encode_callback = [self = weak_factory_.GetWeakPtr()](const SurfaceFrame& surface_frame, DlCanvas* canvas) -> bool { // If the surface itself went away, there is nothing more to do. @@ -73,12 +74,21 @@ std::unique_ptr GPUSurfaceSoftware::AcquireFrame( } canvas->Flush(); - - return self->delegate_->PresentBackingStore(surface_frame.SkiaSurface()); + return true; }; + SurfaceFrame::SubmitCallback submit_callback = + [self = weak_factory_.GetWeakPtr()](const SurfaceFrame& surface_frame) { + // If the surface itself went away, there is nothing more to do. + if (!self || !self->IsValid()) { + return false; + } + return self->delegate_->PresentBackingStore( + surface_frame.SkiaSurface()); + }; return std::make_unique(backing_store, framebuffer_info, - on_submit, logical_size); + encode_callback, submit_callback, + logical_size); } // |Surface| diff --git a/shell/gpu/gpu_surface_vulkan.cc b/shell/gpu/gpu_surface_vulkan.cc index 63f1359722c17..816963d0b1e30 100644 --- a/shell/gpu/gpu_surface_vulkan.cc +++ b/shell/gpu/gpu_surface_vulkan.cc @@ -50,7 +50,7 @@ std::unique_ptr GPUSurfaceVulkan::AcquireFrame( [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, - frame_size); + [](const SurfaceFrame& surface_frame) { return true; }, frame_size); } FlutterVulkanImage image = delegate_->AcquireImage(frame_size); @@ -67,10 +67,9 @@ std::unique_ptr GPUSurfaceVulkan::AcquireFrame( return nullptr; } - SurfaceFrame::SubmitCallback callback = [image = image, delegate = delegate_]( - const SurfaceFrame&, - DlCanvas* canvas) -> bool { - TRACE_EVENT0("flutter", "GPUSurfaceVulkan::PresentImage"); + SurfaceFrame::EncodeCallback encode_callback = + [image = image, delegate = delegate_](const SurfaceFrame&, + DlCanvas* canvas) -> bool { if (canvas == nullptr) { FML_DLOG(ERROR) << "Canvas not available."; return false; @@ -82,10 +81,18 @@ std::unique_ptr GPUSurfaceVulkan::AcquireFrame( static_cast(image.format)); }; + SurfaceFrame::SubmitCallback submit_callback = + [image = image, delegate = delegate_](const SurfaceFrame&) -> bool { + TRACE_EVENT0("flutter", "GPUSurfaceVulkan::PresentImage"); + return delegate->PresentImage(reinterpret_cast(image.image), + static_cast(image.format)); + }; + SurfaceFrame::FramebufferInfo framebuffer_info{.supports_readback = true}; return std::make_unique(std::move(surface), framebuffer_info, - std::move(callback), frame_size); + std::move(encode_callback), + std::move(submit_callback), frame_size); } SkMatrix GPUSurfaceVulkan::GetRootTransformation() const { diff --git a/shell/gpu/gpu_surface_vulkan_impeller.cc b/shell/gpu/gpu_surface_vulkan_impeller.cc index 5748421fa4ce6..33cf1dd35e4ec 100644 --- a/shell/gpu/gpu_surface_vulkan_impeller.cc +++ b/shell/gpu/gpu_surface_vulkan_impeller.cc @@ -59,65 +59,64 @@ std::unique_ptr GPUSurfaceVulkanImpeller::AcquireFrame( return nullptr; } - SurfaceFrame::EncodeCallback encode_callback = - fml::MakeCopyable([aiks_context = aiks_context_, // - surface = std::move(surface) // - ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { - if (!aiks_context) { - return false; - } + auto cull_rect = + surface->GetTargetRenderPassDescriptor().GetRenderTargetSize(); + + const impeller::RenderTarget& render_target = + surface->GetTargetRenderPassDescriptor(); - auto display_list = surface_frame.BuildDisplayList(); - if (!display_list) { - FML_LOG(ERROR) << "Could not build display list for surface frame."; - return false; - } + SurfaceFrame::EncodeCallback encode_callback = [aiks_context = + aiks_context_, // + render_target, + cull_rect // + ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { + if (!aiks_context) { + return false; + } - auto cull_rect = - surface->GetTargetRenderPassDescriptor().GetRenderTargetSize(); + auto display_list = surface_frame.BuildDisplayList(); + if (!display_list) { + FML_LOG(ERROR) << "Could not build display list for surface frame."; + return false; + } - 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 true; #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; + return aiks_context->Render(picture, render_target, reset_host_buffer); #endif - }); + }; return std::make_unique( - nullptr, // surface - SurfaceFrame::FramebufferInfo{}, // framebuffer info - encode_callback, // encode callback - [](const SurfaceFrame&) { return true; }, // submit callback - size, // frame size - nullptr, // context result - true // display list fallback + nullptr, // surface + SurfaceFrame::FramebufferInfo{}, // framebuffer info + encode_callback, // encode callback + fml::MakeCopyable([surface = std::move(surface)](const SurfaceFrame&) { + return surface->Present(); + }), // submit callback + size, // frame size + nullptr, // context result + true // display list fallback ); } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm index a14dcf8007844..9da628cbd400e 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm @@ -2402,6 +2402,7 @@ - (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashin auto mock_surface = std::make_unique( nullptr, framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return false; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertFalse( flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface))); @@ -2413,6 +2414,7 @@ - (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashin auto mock_surface_submit_true = std::make_unique( nullptr, framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue(flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface_submit_true))); @@ -2592,6 +2594,7 @@ - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder { auto mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue( @@ -2620,6 +2623,7 @@ - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder { mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue( flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface))); @@ -2692,6 +2696,7 @@ - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder { auto mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue( @@ -2720,6 +2725,7 @@ - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder { mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue( flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface))); @@ -3201,6 +3207,7 @@ - (void)testDisposingViewInCompositionOrderDoNotCrash { auto mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue( flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface))); @@ -3228,6 +3235,7 @@ - (void)testDisposingViewInCompositionOrderDoNotCrash { auto mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue( flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface))); @@ -3296,6 +3304,7 @@ - (void)testOnlyPlatformViewsAreRemovedWhenReset { auto mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface)); From 48bc74593ebf8bf3451e016f393abc5ba8f17312 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 29 Jul 2024 16:48:43 -0700 Subject: [PATCH 4/7] ++ --- shell/common/rasterizer_unittests.cc | 2 +- shell/common/shell_test_platform_view_vulkan.cc | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index 52980917d3ef0..abd7fa043878f 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "flow/surface_frame.h" #define FML_USED_ON_EMBEDDER +#include "flow/surface_frame.h" #include "flutter/shell/common/rasterizer.h" #include diff --git a/shell/common/shell_test_platform_view_vulkan.cc b/shell/common/shell_test_platform_view_vulkan.cc index c148702b765c0..f0989007931b1 100644 --- a/shell/common/shell_test_platform_view_vulkan.cc +++ b/shell/common/shell_test_platform_view_vulkan.cc @@ -203,17 +203,21 @@ ShellTestPlatformViewVulkan::OffScreenSurface::AcquireFrame( SkAlphaType::kOpaque_SkAlphaType); auto surface = SkSurfaces::RenderTarget(context_.get(), skgpu::Budgeted::kNo, image_info, 0, nullptr); - SurfaceFrame::SubmitCallback callback = [](const SurfaceFrame&, - DlCanvas* canvas) -> bool { + + SurfaceFrame::EncodeCallback encode_callback = [](const SurfaceFrame&, + DlCanvas* canvas) -> bool { canvas->Flush(); return true; }; + SurfaceFrame::SubmitCallback submit_callback = + [](const SurfaceFrame&) -> bool { return true; }; SurfaceFrame::FramebufferInfo framebuffer_info; framebuffer_info.supports_readback = true; return std::make_unique(std::move(surface), framebuffer_info, - std::move(callback), + std::move(encode_callback), + std::move(submit_callback), /*frame_size=*/SkISize::Make(800, 600)); } From 7aa84fa6c1b71304af492e1aeb2ee32b1ceab71c Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 29 Jul 2024 17:04:13 -0700 Subject: [PATCH 5/7] fuchsia fix. --- shell/platform/fuchsia/flutter/surface.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/fuchsia/flutter/surface.cc b/shell/platform/fuchsia/flutter/surface.cc index 49d06f023cbf8..29381ccfef392 100644 --- a/shell/platform/fuchsia/flutter/surface.cc +++ b/shell/platform/fuchsia/flutter/surface.cc @@ -36,7 +36,7 @@ std::unique_ptr Surface::AcquireFrame( nullptr, std::move(framebuffer_info), [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, - size); + [](const flutter::SurfaceFrame& surface_frame) { return true; }, size); } // |flutter::Surface| From d540ba52384e6c816763250ec7d332711fc23158 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 29 Jul 2024 17:41:53 -0700 Subject: [PATCH 6/7] ++ --- .../fuchsia/flutter/tests/external_view_embedder_unittests.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/fuchsia/flutter/tests/external_view_embedder_unittests.cc b/shell/platform/fuchsia/flutter/tests/external_view_embedder_unittests.cc index bd34c85508124..f5a312e2c757c 100644 --- a/shell/platform/fuchsia/flutter/tests/external_view_embedder_unittests.cc +++ b/shell/platform/fuchsia/flutter/tests/external_view_embedder_unittests.cc @@ -343,6 +343,7 @@ void DrawSimpleFrame(ExternalViewEmbedder& external_view_embedder, nullptr, std::move(framebuffer_info), [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, frame_size)); } From 8c18ad6bbdd92cf7276d32eee96f985c08fba3c5 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 29 Jul 2024 18:26:53 -0700 Subject: [PATCH 7/7] ++ --- .../fuchsia/flutter/tests/external_view_embedder_unittests.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/fuchsia/flutter/tests/external_view_embedder_unittests.cc b/shell/platform/fuchsia/flutter/tests/external_view_embedder_unittests.cc index f5a312e2c757c..1e00f5f11bea2 100644 --- a/shell/platform/fuchsia/flutter/tests/external_view_embedder_unittests.cc +++ b/shell/platform/fuchsia/flutter/tests/external_view_embedder_unittests.cc @@ -376,6 +376,7 @@ void DrawFrameWithView( nullptr, std::move(framebuffer_info), [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame) { return true; }, frame_size)); }