[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.
This commit is contained in:
Jonah Williams 2024-07-29 15:59:11 -07:00 committed by GitHub
parent 3f20f61fe7
commit f2c5ad0b1e
16 changed files with 154 additions and 344 deletions

View File

@ -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_pass.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/render_target.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/renderer/render_target.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/render_target.h + ../../../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.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/sampler_library.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/renderer/sampler_library.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/shader_function.cc + ../../../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_pass.h
FILE: ../../../flutter/impeller/renderer/render_target.cc FILE: ../../../flutter/impeller/renderer/render_target.cc
FILE: ../../../flutter/impeller/renderer/render_target.h 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.cc
FILE: ../../../flutter/impeller/renderer/sampler_library.h FILE: ../../../flutter/impeller/renderer/sampler_library.h
FILE: ../../../flutter/impeller/renderer/shader_function.cc FILE: ../../../flutter/impeller/renderer/shader_function.cc

View File

@ -46,7 +46,7 @@ ContentContext& AiksContext::GetContentContext() const {
} }
bool AiksContext::Render(const Picture& picture, bool AiksContext::Render(const Picture& picture,
RenderTarget& render_target, const RenderTarget& render_target,
bool reset_host_buffer) { bool reset_host_buffer) {
if (!IsValid()) { if (!IsValid()) {
return false; return false;

View File

@ -43,7 +43,7 @@ class AiksContext {
ContentContext& GetContentContext() const; ContentContext& GetContentContext() const;
bool Render(const Picture& picture, bool Render(const Picture& picture,
RenderTarget& render_target, const RenderTarget& render_target,
bool reset_host_buffer); bool reset_host_buffer);
private: private:

View File

@ -12,6 +12,7 @@
#include "impeller/playground/image/backends/skia/compressed_image_skia.h" #include "impeller/playground/image/backends/skia/compressed_image_skia.h"
#include "impeller/playground/image/decompressed_image.h" #include "impeller/playground/image/decompressed_image.h"
#include "impeller/renderer/command_buffer.h" #include "impeller/renderer/command_buffer.h"
#include "impeller/renderer/render_target.h"
#include "impeller/runtime_stage/runtime_stage.h" #include "impeller/runtime_stage/runtime_stage.h"
#define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_NONE
@ -28,7 +29,6 @@
#include "impeller/playground/playground_impl.h" #include "impeller/playground/playground_impl.h"
#include "impeller/renderer/context.h" #include "impeller/renderer/context.h"
#include "impeller/renderer/render_pass.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/backends/imgui_impl_glfw.h"
#include "third_party/imgui/imgui.h" #include "third_party/imgui/imgui.h"
@ -140,12 +140,6 @@ void Playground::SetupWindow() {
"SetupContext first)."; "SetupContext first).";
return; return;
} }
auto renderer = std::make_unique<Renderer>(context_);
if (!renderer->IsValid()) {
return;
}
renderer_ = std::move(renderer);
start_time_ = fml::TimePoint::Now().ToEpochDelta(); start_time_ = fml::TimePoint::Now().ToEpochDelta();
} }
@ -158,7 +152,6 @@ void Playground::TeardownWindow() {
context_->Shutdown(); context_->Shutdown();
} }
context_.reset(); context_.reset();
renderer_.reset();
impl_.reset(); impl_.reset();
} }
@ -202,7 +195,7 @@ void Playground::SetCursorPosition(Point pos) {
} }
bool Playground::OpenPlaygroundHere( bool Playground::OpenPlaygroundHere(
const Renderer::RenderCallback& render_callback) { const Playground::RenderCallback& render_callback) {
if (!switches_.enable_playground) { if (!switches_.enable_playground) {
return true; return true;
} }
@ -211,10 +204,6 @@ bool Playground::OpenPlaygroundHere(
return true; return true;
} }
if (!renderer_ || !renderer_->IsValid()) {
return false;
}
IMGUI_CHECKVERSION(); IMGUI_CHECKVERSION();
ImGui::CreateContext(); ImGui::CreateContext();
fml::ScopedCleanupClosure destroy_imgui_context( fml::ScopedCleanupClosure destroy_imgui_context(
@ -251,7 +240,7 @@ bool Playground::OpenPlaygroundHere(
ImGui_ImplGlfw_InitForOther(window, true); ImGui_ImplGlfw_InitForOther(window, true);
fml::ScopedCleanupClosure shutdown_imgui([]() { ImGui_ImplGlfw_Shutdown(); }); fml::ScopedCleanupClosure shutdown_imgui([]() { ImGui_ImplGlfw_Shutdown(); });
ImGui_ImplImpeller_Init(renderer_->GetContext()); ImGui_ImplImpeller_Init(context_);
fml::ScopedCleanupClosure shutdown_imgui_impeller( fml::ScopedCleanupClosure shutdown_imgui_impeller(
[]() { ImGui_ImplImpeller_Shutdown(); }); []() { ImGui_ImplImpeller_Shutdown(); });
@ -273,9 +262,9 @@ bool Playground::OpenPlaygroundHere(
ImGui_ImplGlfw_NewFrame(); ImGui_ImplGlfw_NewFrame();
Renderer::RenderCallback wrapped_callback = auto surface = impl_->AcquireSurfaceFrame(context_);
[render_callback, RenderTarget render_target = surface->GetTargetRenderPassDescriptor();
&renderer = renderer_](RenderTarget& render_target) -> bool {
ImGui::NewFrame(); ImGui::NewFrame();
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(),
ImGuiDockNodeFlags_PassthruCentralNode); ImGuiDockNodeFlags_PassthruCentralNode);
@ -284,13 +273,15 @@ bool Playground::OpenPlaygroundHere(
// Render ImGui overlay. // Render ImGui overlay.
{ {
auto buffer = renderer->GetContext()->CreateCommandBuffer(); auto buffer = context_->CreateCommandBuffer();
if (!buffer) { if (!buffer) {
VALIDATION_LOG << "Could not create command buffer.";
return false; return false;
} }
buffer->SetLabel("ImGui Command Buffer"); buffer->SetLabel("ImGui Command Buffer");
if (render_target.GetColorAttachments().empty()) { if (render_target.GetColorAttachments().empty()) {
VALIDATION_LOG << "render target attachments are empty.";
return false; return false;
} }
@ -308,6 +299,7 @@ bool Playground::OpenPlaygroundHere(
auto pass = buffer->CreateRenderPass(render_target); auto pass = buffer->CreateRenderPass(render_target);
if (!pass) { if (!pass) {
VALIDATION_LOG << "Could not create render pass.";
return false; return false;
} }
pass->SetLabel("ImGui Render Pass"); pass->SetLabel("ImGui Render Pass");
@ -315,17 +307,13 @@ bool Playground::OpenPlaygroundHere(
ImGui_ImplImpeller_RenderDrawData(ImGui::GetDrawData(), *pass); ImGui_ImplImpeller_RenderDrawData(ImGui::GetDrawData(), *pass);
pass->EncodeCommands(); pass->EncodeCommands();
if (!renderer->GetContext()->GetCommandQueue()->Submit({buffer}).ok()) {
if (!context_->GetCommandQueue()->Submit({buffer}).ok()) {
return false; return false;
} }
} }
return result; if (!result || !surface->Present()) {
};
if (!renderer_->Render(impl_->AcquireSurfaceFrame(renderer_->GetContext()),
wrapped_callback)) {
VALIDATION_LOG << "Could not render into the surface.";
return false; return false;
} }
@ -454,9 +442,8 @@ std::shared_ptr<Texture> Playground::CreateTextureForMapping(
std::shared_ptr<Texture> Playground::CreateTextureForFixture( std::shared_ptr<Texture> Playground::CreateTextureForFixture(
const char* fixture_name, const char* fixture_name,
bool enable_mipmapping) const { bool enable_mipmapping) const {
auto texture = CreateTextureForMapping(renderer_->GetContext(), auto texture = CreateTextureForMapping(
OpenAssetAsMapping(fixture_name), context_, OpenAssetAsMapping(fixture_name), enable_mipmapping);
enable_mipmapping);
if (texture == nullptr) { if (texture == nullptr) {
return nullptr; return nullptr;
} }
@ -483,30 +470,25 @@ std::shared_ptr<Texture> Playground::CreateTextureCubeForFixture(
texture_descriptor.size = images[0].GetSize(); texture_descriptor.size = images[0].GetSize();
texture_descriptor.mip_count = 1u; texture_descriptor.mip_count = 1u;
auto texture = renderer_->GetContext()->GetResourceAllocator()->CreateTexture( auto texture =
texture_descriptor); context_->GetResourceAllocator()->CreateTexture(texture_descriptor);
if (!texture) { if (!texture) {
VALIDATION_LOG << "Could not allocate texture cube."; VALIDATION_LOG << "Could not allocate texture cube.";
return nullptr; return nullptr;
} }
texture->SetLabel("Texture cube"); texture->SetLabel("Texture cube");
auto cmd_buffer = renderer_->GetContext()->CreateCommandBuffer(); auto cmd_buffer = context_->CreateCommandBuffer();
auto blit_pass = cmd_buffer->CreateBlitPass(); auto blit_pass = cmd_buffer->CreateBlitPass();
for (size_t i = 0; i < fixture_names.size(); i++) { for (size_t i = 0; i < fixture_names.size(); i++) {
auto device_buffer = auto device_buffer = context_->GetResourceAllocator()->CreateBufferWithCopy(
renderer_->GetContext()->GetResourceAllocator()->CreateBufferWithCopy(
*images[i].GetAllocation()); *images[i].GetAllocation());
blit_pass->AddCopy(DeviceBuffer::AsBufferView(device_buffer), texture, {}, blit_pass->AddCopy(DeviceBuffer::AsBufferView(device_buffer), texture, {},
"", /*slice=*/i); "", /*slice=*/i);
} }
if (!blit_pass->EncodeCommands( if (!blit_pass->EncodeCommands(context_->GetResourceAllocator()) ||
renderer_->GetContext()->GetResourceAllocator()) || !context_->GetCommandQueue()->Submit({std::move(cmd_buffer)}).ok()) {
!renderer_->GetContext()
->GetCommandQueue()
->Submit({std::move(cmd_buffer)})
.ok()) {
VALIDATION_LOG << "Could not upload texture to device memory."; VALIDATION_LOG << "Could not upload texture to device memory.";
return nullptr; return nullptr;
} }

View File

@ -17,7 +17,6 @@
#include "impeller/playground/image/decompressed_image.h" #include "impeller/playground/image/decompressed_image.h"
#include "impeller/playground/switches.h" #include "impeller/playground/switches.h"
#include "impeller/renderer/render_pass.h" #include "impeller/renderer/render_pass.h"
#include "impeller/renderer/renderer.h"
#include "impeller/runtime_stage/runtime_stage.h" #include "impeller/runtime_stage/runtime_stage.h"
namespace impeller { namespace impeller {
@ -78,7 +77,9 @@ class Playground {
std::shared_ptr<Context> MakeContext() const; std::shared_ptr<Context> MakeContext() const;
bool OpenPlaygroundHere(const Renderer::RenderCallback& render_callback); using RenderCallback = std::function<bool(RenderTarget& render_target)>;
bool OpenPlaygroundHere(const RenderCallback& render_callback);
bool OpenPlaygroundHere(SinglePassCallback pass_callback); bool OpenPlaygroundHere(SinglePassCallback pass_callback);
@ -124,7 +125,6 @@ class Playground {
fml::TimeDelta start_time_; fml::TimeDelta start_time_;
std::unique_ptr<PlaygroundImpl> impl_; std::unique_ptr<PlaygroundImpl> impl_;
std::shared_ptr<Context> context_; std::shared_ptr<Context> context_;
std::unique_ptr<Renderer> renderer_;
Point cursor_position_; Point cursor_position_;
ISize window_size_ = ISize{1024, 768}; ISize window_size_ = ISize{1024, 768};

View File

@ -61,8 +61,6 @@ impeller_component("renderer") {
"render_pass.h", "render_pass.h",
"render_target.cc", "render_target.cc",
"render_target.h", "render_target.h",
"renderer.cc",
"renderer.h",
"sampler_library.cc", "sampler_library.cc",
"sampler_library.h", "sampler_library.h",
"shader_function.cc", "shader_function.cc",

View File

@ -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 <algorithm>
#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> context,
size_t max_frames_in_flight)
: frames_in_flight_sema_(std::make_shared<fml::Semaphore>(
std::max<std::size_t>(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> 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<Context> Renderer::GetContext() const {
return context_;
}
} // namespace impeller

View File

@ -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 <functional>
#include <memory>
#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<bool(RenderTarget& render_target)>;
explicit Renderer(std::shared_ptr<Context> context,
size_t max_frames_in_flight = kDefaultMaxFramesInFlight);
~Renderer();
bool IsValid() const;
bool Render(std::unique_ptr<Surface> surface,
const RenderCallback& callback) const;
std::shared_ptr<Context> GetContext() const;
private:
std::shared_ptr<fml::Semaphore> frames_in_flight_sema_;
std::shared_ptr<Context> context_;
bool is_valid_ = false;
Renderer(const Renderer&) = delete;
Renderer& operator=(const Renderer&) = delete;
};
} // namespace impeller
#endif // FLUTTER_IMPELLER_RENDERER_RENDERER_H_

View File

@ -32,13 +32,13 @@
#include "impeller/fixtures/texture.frag.h" #include "impeller/fixtures/texture.frag.h"
#include "impeller/fixtures/texture.vert.h" #include "impeller/fixtures/texture.vert.h"
#include "impeller/geometry/path_builder.h" #include "impeller/geometry/path_builder.h"
#include "impeller/playground/playground.h"
#include "impeller/playground/playground_test.h" #include "impeller/playground/playground_test.h"
#include "impeller/renderer/command_buffer.h" #include "impeller/renderer/command_buffer.h"
#include "impeller/renderer/pipeline_builder.h" #include "impeller/renderer/pipeline_builder.h"
#include "impeller/renderer/pipeline_library.h" #include "impeller/renderer/pipeline_library.h"
#include "impeller/renderer/render_pass.h" #include "impeller/renderer/render_pass.h"
#include "impeller/renderer/render_target.h" #include "impeller/renderer/render_target.h"
#include "impeller/renderer/renderer.h"
#include "impeller/renderer/vertex_buffer_builder.h" #include "impeller/renderer/vertex_buffer_builder.h"
#include "third_party/imgui/imgui.h" #include "third_party/imgui/imgui.h"
@ -545,7 +545,7 @@ TEST_P(RendererTest, CanBlitTextureToTexture) {
ASSERT_TRUE(vertex_buffer); ASSERT_TRUE(vertex_buffer);
auto host_buffer = HostBuffer::Create(context->GetResourceAllocator()); auto host_buffer = HostBuffer::Create(context->GetResourceAllocator());
Renderer::RenderCallback callback = [&](RenderTarget& render_target) { Playground::RenderCallback callback = [&](RenderTarget& render_target) {
auto buffer = context->CreateCommandBuffer(); auto buffer = context->CreateCommandBuffer();
if (!buffer) { if (!buffer) {
return false; return false;
@ -665,7 +665,7 @@ TEST_P(RendererTest, CanBlitTextureToBuffer) {
ASSERT_TRUE(vertex_buffer); ASSERT_TRUE(vertex_buffer);
auto host_buffer = HostBuffer::Create(context->GetResourceAllocator()); auto host_buffer = HostBuffer::Create(context->GetResourceAllocator());
Renderer::RenderCallback callback = [&](RenderTarget& render_target) { Playground::RenderCallback callback = [&](RenderTarget& render_target) {
{ {
auto buffer = context->CreateCommandBuffer(); auto buffer = context->CreateCommandBuffer();
if (!buffer) { if (!buffer) {
@ -782,7 +782,7 @@ TEST_P(RendererTest, CanGenerateMipmaps) {
bool first_frame = true; bool first_frame = true;
auto host_buffer = HostBuffer::Create(context->GetResourceAllocator()); 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 char* mip_filter_names[] = {"Base", "Nearest", "Linear"};
const MipFilter mip_filters[] = {MipFilter::kBase, MipFilter::kNearest, const MipFilter mip_filters[] = {MipFilter::kBase, MipFilter::kNearest,
MipFilter::kLinear}; MipFilter::kLinear};
@ -1231,7 +1231,7 @@ TEST_P(RendererTest, StencilMask) {
CompareFunctionUI().IndexOf(CompareFunction::kLessEqual); CompareFunctionUI().IndexOf(CompareFunction::kLessEqual);
auto host_buffer = HostBuffer::Create(context->GetResourceAllocator()); auto host_buffer = HostBuffer::Create(context->GetResourceAllocator());
Renderer::RenderCallback callback = [&](RenderTarget& render_target) { Playground::RenderCallback callback = [&](RenderTarget& render_target) {
auto buffer = context->CreateCommandBuffer(); auto buffer = context->CreateCommandBuffer();
if (!buffer) { if (!buffer) {
return false; return false;

View File

@ -37,7 +37,7 @@ INSTANTIATE_PLAYGROUND_SUITE(SceneTest);
TEST_P(SceneTest, CuboidUnlit) { TEST_P(SceneTest, CuboidUnlit) {
auto scene_context = std::make_shared<SceneContext>(GetContext()); auto scene_context = std::make_shared<SceneContext>(GetContext());
Renderer::RenderCallback callback = [&](RenderTarget& render_target) { Playground::RenderCallback callback = [&](RenderTarget& render_target) {
auto allocator = GetContext()->GetResourceAllocator(); auto allocator = GetContext()->GetResourceAllocator();
auto scene = Scene(scene_context); auto scene = Scene(scene_context);
@ -91,7 +91,7 @@ TEST_P(SceneTest, FlutterLogo) {
scene.GetRoot().AddChild(std::move(gltf_scene)); scene.GetRoot().AddChild(std::move(gltf_scene));
scene.GetRoot().SetLocalTransform(Matrix::MakeScale({3, 3, 3})); 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); Quaternion rotation({0, 1, 0}, -GetSecondsElapsed() * 0.5);
Vector3 start_position(-1, -1.5, -5); Vector3 start_position(-1, -1.5, -5);
@ -136,7 +136,7 @@ TEST_P(SceneTest, TwoTriangles) {
auto scene = Scene(scene_context); auto scene = Scene(scene_context);
scene.GetRoot().AddChild(std::move(gltf_scene)); 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); ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
{ {
static Scalar playback_time_scale = 1; static Scalar playback_time_scale = 1;
@ -232,7 +232,7 @@ TEST_P(SceneTest, Dash) {
auto scene = Scene(scene_context); auto scene = Scene(scene_context);
scene.GetRoot().AddChild(std::move(gltf_scene)); 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); ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
{ {
static Scalar playback_time_scale = 1; static Scalar playback_time_scale = 1;

View File

@ -7,7 +7,6 @@
#include "flutter/fml/make_copyable.h" #include "flutter/fml/make_copyable.h"
#include "impeller/display_list/dl_dispatcher.h" #include "impeller/display_list/dl_dispatcher.h"
#include "impeller/renderer/backend/gles/surface_gles.h" #include "impeller/renderer/backend/gles/surface_gles.h"
#include "impeller/renderer/renderer.h"
#include "impeller/typographer/backends/skia/typographer_context_skia.h" #include "impeller/typographer/backends/skia/typographer_context_skia.h"
namespace flutter { namespace flutter {
@ -25,11 +24,6 @@ GPUSurfaceGLImpeller::GPUSurfaceGLImpeller(
return; return;
} }
auto renderer = std::make_shared<impeller::Renderer>(context);
if (!renderer->IsValid()) {
return;
}
auto aiks_context = std::make_shared<impeller::AiksContext>( auto aiks_context = std::make_shared<impeller::AiksContext>(
context, impeller::TypographerContextSkia::Make()); context, impeller::TypographerContextSkia::Make());
@ -40,7 +34,6 @@ GPUSurfaceGLImpeller::GPUSurfaceGLImpeller(
delegate_ = delegate; delegate_ = delegate;
impeller_context_ = std::move(context); impeller_context_ = std::move(context);
render_to_surface_ = render_to_surface; render_to_surface_ = render_to_surface;
impeller_renderer_ = std::move(renderer);
aiks_context_ = std::move(aiks_context); aiks_context_ = std::move(aiks_context);
is_valid_ = true; is_valid_ = true;
} }
@ -105,8 +98,7 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceGLImpeller::AcquireFrame(
); );
SurfaceFrame::SubmitCallback submit_callback = SurfaceFrame::SubmitCallback submit_callback =
fml::MakeCopyable([renderer = impeller_renderer_, // fml::MakeCopyable([aiks_context = aiks_context_, //
aiks_context = aiks_context_, //
surface = std::move(surface) // surface = std::move(surface) //
](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool {
if (!aiks_context) { if (!aiks_context) {
@ -130,14 +122,12 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceGLImpeller::AcquireFrame(
const bool reset_host_buffer = const bool reset_host_buffer =
surface_frame.submit_info().frame_boundary; surface_frame.submit_info().frame_boundary;
return renderer->Render( const impeller::RenderTarget& render_target =
std::move(surface), surface->GetTargetRenderPassDescriptor();
fml::MakeCopyable( if (!aiks_context->Render(picture, render_target, reset_host_buffer)) {
[aiks_context, picture = std::move(picture), reset_host_buffer]( return false;
impeller::RenderTarget& render_target) -> bool { }
return aiks_context->Render(picture, render_target, return surface->Present();
reset_host_buffer);
}));
}); });
return std::make_unique<SurfaceFrame>( return std::make_unique<SurfaceFrame>(

View File

@ -12,7 +12,6 @@
#include "flutter/impeller/aiks/aiks_context.h" #include "flutter/impeller/aiks/aiks_context.h"
#include "flutter/impeller/renderer/context.h" #include "flutter/impeller/renderer/context.h"
#include "flutter/shell/gpu/gpu_surface_gl_delegate.h" #include "flutter/shell/gpu/gpu_surface_gl_delegate.h"
#include "impeller/renderer/renderer.h"
namespace flutter { namespace flutter {
@ -32,7 +31,6 @@ class GPUSurfaceGLImpeller final : public Surface {
GPUSurfaceGLDelegate* delegate_ = nullptr; GPUSurfaceGLDelegate* delegate_ = nullptr;
std::shared_ptr<impeller::Context> impeller_context_; std::shared_ptr<impeller::Context> impeller_context_;
bool render_to_surface_ = true; bool render_to_surface_ = true;
std::shared_ptr<impeller::Renderer> impeller_renderer_;
std::shared_ptr<impeller::AiksContext> aiks_context_; std::shared_ptr<impeller::AiksContext> aiks_context_;
bool is_valid_ = false; bool is_valid_ = false;
fml::TaskRunnerAffineWeakPtrFactory<GPUSurfaceGLImpeller> weak_factory_; fml::TaskRunnerAffineWeakPtrFactory<GPUSurfaceGLImpeller> weak_factory_;

View File

@ -12,7 +12,6 @@
#include "flutter/fml/platform/darwin/scoped_nsobject.h" #include "flutter/fml/platform/darwin/scoped_nsobject.h"
#include "flutter/impeller/aiks/aiks_context.h" #include "flutter/impeller/aiks/aiks_context.h"
#include "flutter/impeller/renderer/backend/metal/context_mtl.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 "flutter/shell/gpu/gpu_surface_metal_delegate.h"
#include "third_party/skia/include/gpu/ganesh/mtl/GrMtlTypes.h" #include "third_party/skia/include/gpu/ganesh/mtl/GrMtlTypes.h"
@ -36,7 +35,6 @@ class IMPELLER_CA_METAL_LAYER_AVAILABLE GPUSurfaceMetalImpeller
private: private:
const GPUSurfaceMetalDelegate* delegate_; const GPUSurfaceMetalDelegate* delegate_;
const MTLRenderTargetType render_target_type_; const MTLRenderTargetType render_target_type_;
std::shared_ptr<impeller::Renderer> impeller_renderer_;
std::shared_ptr<impeller::AiksContext> aiks_context_; std::shared_ptr<impeller::AiksContext> aiks_context_;
fml::scoped_nsprotocol<id<MTLTexture>> last_texture_; fml::scoped_nsprotocol<id<MTLTexture>> last_texture_;
// TODO(38466): Refactor GPU surface APIs take into account the fact that an // TODO(38466): Refactor GPU surface APIs take into account the fact that an

View File

@ -19,24 +19,13 @@ static_assert(!__has_feature(objc_arc), "ARC must be disabled.");
namespace flutter { namespace flutter {
static std::shared_ptr<impeller::Renderer> CreateImpellerRenderer(
std::shared_ptr<impeller::Context> context) {
auto renderer = std::make_shared<impeller::Renderer>(std::move(context));
if (!renderer->IsValid()) {
FML_LOG(ERROR) << "Could not create valid Impeller Renderer.";
return nullptr;
}
return renderer;
}
GPUSurfaceMetalImpeller::GPUSurfaceMetalImpeller(GPUSurfaceMetalDelegate* delegate, GPUSurfaceMetalImpeller::GPUSurfaceMetalImpeller(GPUSurfaceMetalDelegate* delegate,
const std::shared_ptr<impeller::Context>& context, const std::shared_ptr<impeller::Context>& context,
bool render_to_surface) bool render_to_surface)
: delegate_(delegate), : delegate_(delegate),
render_target_type_(delegate->GetRenderTargetType()), render_target_type_(delegate->GetRenderTargetType()),
impeller_renderer_(CreateImpellerRenderer(context)),
aiks_context_( aiks_context_(
std::make_shared<impeller::AiksContext>(impeller_renderer_ ? context : nullptr, std::make_shared<impeller::AiksContext>(context,
impeller::TypographerContextSkia::Make())), impeller::TypographerContextSkia::Make())),
render_to_surface_(render_to_surface) { render_to_surface_(render_to_surface) {
// If this preference is explicitly set, we allow for disabling partial repaint. // If this preference is explicitly set, we allow for disabling partial repaint.
@ -97,8 +86,8 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa
auto* mtl_layer = (CAMetalLayer*)layer; auto* mtl_layer = (CAMetalLayer*)layer;
auto drawable = impeller::SurfaceMTL::GetMetalDrawableAndValidate( auto drawable =
impeller_renderer_->GetContext(), mtl_layer); impeller::SurfaceMTL::GetMetalDrawableAndValidate(aiks_context_->GetContext(), mtl_layer);
if (!drawable) { if (!drawable) {
return nullptr; return nullptr;
} }
@ -107,14 +96,13 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa
} }
#ifdef IMPELLER_DEBUG #ifdef IMPELLER_DEBUG
impeller::ContextMTL::Cast(*impeller_renderer_->GetContext()).GetCaptureManager()->StartCapture(); impeller::ContextMTL::Cast(*aiks_context_->GetContext()).GetCaptureManager()->StartCapture();
#endif // IMPELLER_DEBUG #endif // IMPELLER_DEBUG
id<MTLTexture> last_texture = static_cast<id<MTLTexture>>(last_texture_); id<MTLTexture> last_texture = static_cast<id<MTLTexture>>(last_texture_);
SurfaceFrame::SubmitCallback submit_callback = SurfaceFrame::SubmitCallback submit_callback =
fml::MakeCopyable([damage = damage_, fml::MakeCopyable([damage = damage_,
disable_partial_repaint = disable_partial_repaint_, // disable_partial_repaint = disable_partial_repaint_, //
renderer = impeller_renderer_, //
aiks_context = aiks_context_, // aiks_context = aiks_context_, //
drawable, // drawable, //
last_texture // last_texture //
@ -151,7 +139,7 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa
buffer_damage->width(), buffer_damage->height()); buffer_damage->width(), buffer_damage->height());
} }
auto surface = impeller::SurfaceMTL::MakeFromMetalLayerDrawable(renderer->GetContext(), auto surface = impeller::SurfaceMTL::MakeFromMetalLayerDrawable(aiks_context->GetContext(),
drawable, clip_rect); drawable, clip_rect);
// The surface may be null if we failed to allocate the onscreen render target // The surface may be null if we failed to allocate the onscreen render target
@ -167,14 +155,12 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa
impeller::IRect cull_rect = surface->coverage(); impeller::IRect cull_rect = surface->coverage();
SkIRect sk_cull_rect = SkIRect::MakeWH(cull_rect.GetWidth(), cull_rect.GetHeight()); SkIRect sk_cull_rect = SkIRect::MakeWH(cull_rect.GetWidth(), cull_rect.GetHeight());
const impeller::RenderTarget& render_target = surface->GetTargetRenderPassDescriptor();
#if EXPERIMENTAL_CANVAS #if EXPERIMENTAL_CANVAS
impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(), impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(),
impeller::Matrix()); impeller::Matrix());
display_list->Dispatch(collector, sk_cull_rect); 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( impeller::ExperimentalDlDispatcher impeller_dispatcher(
aiks_context->GetContentContext(), render_target, aiks_context->GetContentContext(), render_target,
display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(), display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(),
@ -183,8 +169,8 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa
impeller_dispatcher.FinishRecording(); impeller_dispatcher.FinishRecording();
aiks_context->GetContentContext().GetTransientsBuffer().Reset(); aiks_context->GetContentContext().GetTransientsBuffer().Reset();
aiks_context->GetContentContext().GetLazyGlyphAtlas()->ResetTextFrames(); aiks_context->GetContentContext().GetLazyGlyphAtlas()->ResetTextFrames();
return true;
})); return surface->Present();
#else #else
impeller::DlDispatcher impeller_dispatcher(cull_rect); impeller::DlDispatcher impeller_dispatcher(cull_rect);
display_list->Dispatch(impeller_dispatcher, sk_cull_rect); display_list->Dispatch(impeller_dispatcher, sk_cull_rect);
@ -192,12 +178,10 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLa
const bool reset_host_buffer = surface_frame.submit_info().frame_boundary; const bool reset_host_buffer = surface_frame.submit_info().frame_boundary;
surface->SetFrameBoundary(surface_frame.submit_info().frame_boundary); surface->SetFrameBoundary(surface_frame.submit_info().frame_boundary);
return renderer->Render( if (!aiks_context->Render(picture, render_target, reset_host_buffer)) {
std::move(surface), return false;
fml::MakeCopyable([aiks_context, picture = std::move(picture), }
reset_host_buffer](impeller::RenderTarget& render_target) -> bool { return surface->Present();
return aiks_context->Render(picture, render_target, reset_host_buffer);
}));
#endif #endif
}); });
@ -239,13 +223,12 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromMTLTextur
} }
#ifdef IMPELLER_DEBUG #ifdef IMPELLER_DEBUG
impeller::ContextMTL::Cast(*impeller_renderer_->GetContext()).GetCaptureManager()->StartCapture(); impeller::ContextMTL::Cast(*aiks_context_->GetContext()).GetCaptureManager()->StartCapture();
#endif // IMPELLER_DEBUG #endif // IMPELLER_DEBUG
SurfaceFrame::SubmitCallback submit_callback = SurfaceFrame::SubmitCallback submit_callback =
fml::MakeCopyable([disable_partial_repaint = disable_partial_repaint_, // fml::MakeCopyable([disable_partial_repaint = disable_partial_repaint_, //
damage = damage_, damage = damage_,
renderer = impeller_renderer_, //
aiks_context = aiks_context_, // aiks_context = aiks_context_, //
texture_info, // texture_info, //
mtl_texture, // mtl_texture, //
@ -283,8 +266,8 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromMTLTextur
buffer_damage->width(), buffer_damage->height()); buffer_damage->width(), buffer_damage->height());
} }
auto surface = auto surface = impeller::SurfaceMTL::MakeFromTexture(aiks_context->GetContext(),
impeller::SurfaceMTL::MakeFromTexture(renderer->GetContext(), mtl_texture, clip_rect); mtl_texture, clip_rect);
if (clip_rect && clip_rect->IsEmpty()) { if (clip_rect && clip_rect->IsEmpty()) {
return surface->Present(); return surface->Present();
@ -296,10 +279,7 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromMTLTextur
impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(), impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(),
impeller::Matrix()); impeller::Matrix());
display_list->Dispatch(collector, sk_cull_rect); display_list->Dispatch(collector, sk_cull_rect);
bool render_result = renderer->Render( const impeller::RenderTarget& render_target = surface->GetTargetRenderPassDescriptor();
std::move(surface),
fml::MakeCopyable([aiks_context, &display_list, &cull_rect,
&sk_cull_rect](impeller::RenderTarget& render_target) -> bool {
impeller::ExperimentalDlDispatcher impeller_dispatcher( impeller::ExperimentalDlDispatcher impeller_dispatcher(
aiks_context->GetContentContext(), render_target, aiks_context->GetContentContext(), render_target,
display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(), display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(),
@ -308,20 +288,15 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromMTLTextur
impeller_dispatcher.FinishRecording(); impeller_dispatcher.FinishRecording();
aiks_context->GetContentContext().GetTransientsBuffer().Reset(); aiks_context->GetContentContext().GetTransientsBuffer().Reset();
aiks_context->GetContentContext().GetLazyGlyphAtlas()->ResetTextFrames(); aiks_context->GetContentContext().GetLazyGlyphAtlas()->ResetTextFrames();
return true; bool render_result = true;
}));
#else #else
impeller::DlDispatcher impeller_dispatcher(cull_rect); impeller::DlDispatcher impeller_dispatcher(cull_rect);
display_list->Dispatch(impeller_dispatcher, sk_cull_rect); display_list->Dispatch(impeller_dispatcher, sk_cull_rect);
auto picture = impeller_dispatcher.EndRecordingAsPicture(); auto picture = impeller_dispatcher.EndRecordingAsPicture();
const bool reset_host_buffer = surface_frame.submit_info().frame_boundary; const bool reset_host_buffer = surface_frame.submit_info().frame_boundary;
bool render_result = renderer->Render( const impeller::RenderTarget& render_target = surface->GetTargetRenderPassDescriptor();
std::move(surface), bool render_result = aiks_context->Render(picture, render_target, reset_host_buffer);
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);
}));
#endif #endif
if (!render_result) { if (!render_result) {
FML_LOG(ERROR) << "Failed to render Impeller frame"; FML_LOG(ERROR) << "Failed to render Impeller frame";

View File

@ -7,7 +7,6 @@
#include "flutter/fml/make_copyable.h" #include "flutter/fml/make_copyable.h"
#include "impeller/display_list/dl_dispatcher.h" #include "impeller/display_list/dl_dispatcher.h"
#include "impeller/renderer/backend/vulkan/surface_context_vk.h" #include "impeller/renderer/backend/vulkan/surface_context_vk.h"
#include "impeller/renderer/renderer.h"
#include "impeller/renderer/surface.h" #include "impeller/renderer/surface.h"
#include "impeller/typographer/backends/skia/typographer_context_skia.h" #include "impeller/typographer/backends/skia/typographer_context_skia.h"
@ -19,11 +18,6 @@ GPUSurfaceVulkanImpeller::GPUSurfaceVulkanImpeller(
return; return;
} }
auto renderer = std::make_shared<impeller::Renderer>(context);
if (!renderer->IsValid()) {
return;
}
auto aiks_context = std::make_shared<impeller::AiksContext>( auto aiks_context = std::make_shared<impeller::AiksContext>(
context, impeller::TypographerContextSkia::Make()); context, impeller::TypographerContextSkia::Make());
if (!aiks_context->IsValid()) { if (!aiks_context->IsValid()) {
@ -31,7 +25,6 @@ GPUSurfaceVulkanImpeller::GPUSurfaceVulkanImpeller(
} }
impeller_context_ = std::move(context); impeller_context_ = std::move(context);
impeller_renderer_ = std::move(renderer);
aiks_context_ = std::move(aiks_context); aiks_context_ = std::move(aiks_context);
is_valid_ = true; is_valid_ = true;
} }
@ -66,8 +59,7 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceVulkanImpeller::AcquireFrame(
} }
SurfaceFrame::SubmitCallback submit_callback = SurfaceFrame::SubmitCallback submit_callback =
fml::MakeCopyable([renderer = impeller_renderer_, // fml::MakeCopyable([aiks_context = aiks_context_, //
aiks_context = aiks_context_, //
surface = std::move(surface) // surface = std::move(surface) //
](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool {
if (!aiks_context) { if (!aiks_context) {
@ -83,22 +75,18 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceVulkanImpeller::AcquireFrame(
auto cull_rect = auto cull_rect =
surface->GetTargetRenderPassDescriptor().GetRenderTargetSize(); surface->GetTargetRenderPassDescriptor().GetRenderTargetSize();
return renderer->Render( const impeller::RenderTarget& render_target =
std::move(surface), surface->GetTargetRenderPassDescriptor();
fml::MakeCopyable([&](impeller::RenderTarget& render_target)
-> bool {
#if EXPERIMENTAL_CANVAS #if EXPERIMENTAL_CANVAS
impeller::TextFrameDispatcher collector( impeller::TextFrameDispatcher collector(
aiks_context->GetContentContext(), impeller::Matrix()); aiks_context->GetContentContext(), impeller::Matrix());
display_list->Dispatch( display_list->Dispatch(
collector, collector, SkIRect::MakeWH(cull_rect.width, cull_rect.height));
SkIRect::MakeWH(cull_rect.width, cull_rect.height));
impeller::ExperimentalDlDispatcher impeller_dispatcher( impeller::ExperimentalDlDispatcher impeller_dispatcher(
aiks_context->GetContentContext(), render_target, aiks_context->GetContentContext(), render_target,
display_list->root_has_backdrop_filter(), display_list->root_has_backdrop_filter(),
display_list->max_root_blend_mode(), display_list->max_root_blend_mode(),
impeller::IRect::RoundOut( impeller::IRect::RoundOut(impeller::Rect::MakeSize(cull_rect)));
impeller::Rect::MakeSize(cull_rect)));
display_list->Dispatch( display_list->Dispatch(
impeller_dispatcher, impeller_dispatcher,
SkIRect::MakeWH(cull_rect.width, cull_rect.height)); SkIRect::MakeWH(cull_rect.width, cull_rect.height));
@ -107,7 +95,7 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceVulkanImpeller::AcquireFrame(
aiks_context->GetContentContext() aiks_context->GetContentContext()
.GetLazyGlyphAtlas() .GetLazyGlyphAtlas()
->ResetTextFrames(); ->ResetTextFrames();
return true; return surface->Present();
#else #else
impeller::Rect dl_cull_rect = impeller::Rect::MakeSize(cull_rect); impeller::Rect dl_cull_rect = impeller::Rect::MakeSize(cull_rect);
impeller::DlDispatcher impeller_dispatcher(dl_cull_rect); impeller::DlDispatcher impeller_dispatcher(dl_cull_rect);
@ -117,10 +105,11 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceVulkanImpeller::AcquireFrame(
auto picture = impeller_dispatcher.EndRecordingAsPicture(); auto picture = impeller_dispatcher.EndRecordingAsPicture();
const bool reset_host_buffer = const bool reset_host_buffer =
surface_frame.submit_info().frame_boundary; surface_frame.submit_info().frame_boundary;
return aiks_context->Render(picture, render_target, if (!aiks_context->Render(picture, render_target, reset_host_buffer)) {
reset_host_buffer); return false;
}
return surface->Present();
#endif #endif
}));
}); });
return std::make_unique<SurfaceFrame>( return std::make_unique<SurfaceFrame>(

View File

@ -12,7 +12,6 @@
#include "flutter/impeller/aiks/aiks_context.h" #include "flutter/impeller/aiks/aiks_context.h"
#include "flutter/impeller/renderer/context.h" #include "flutter/impeller/renderer/context.h"
#include "flutter/shell/gpu/gpu_surface_vulkan_delegate.h" #include "flutter/shell/gpu/gpu_surface_vulkan_delegate.h"
#include "impeller/renderer/renderer.h"
namespace flutter { namespace flutter {
@ -28,7 +27,6 @@ class GPUSurfaceVulkanImpeller final : public Surface {
private: private:
std::shared_ptr<impeller::Context> impeller_context_; std::shared_ptr<impeller::Context> impeller_context_;
std::shared_ptr<impeller::Renderer> impeller_renderer_;
std::shared_ptr<impeller::AiksContext> aiks_context_; std::shared_ptr<impeller::AiksContext> aiks_context_;
bool is_valid_ = false; bool is_valid_ = false;