[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_target.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/render_target.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/renderer.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/renderer.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/sampler_library.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/sampler_library.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/shader_function.cc + ../../../flutter/LICENSE
@ -45382,8 +45380,6 @@ FILE: ../../../flutter/impeller/renderer/render_pass.cc
FILE: ../../../flutter/impeller/renderer/render_pass.h
FILE: ../../../flutter/impeller/renderer/render_target.cc
FILE: ../../../flutter/impeller/renderer/render_target.h
FILE: ../../../flutter/impeller/renderer/renderer.cc
FILE: ../../../flutter/impeller/renderer/renderer.h
FILE: ../../../flutter/impeller/renderer/sampler_library.cc
FILE: ../../../flutter/impeller/renderer/sampler_library.h
FILE: ../../../flutter/impeller/renderer/shader_function.cc

View File

@ -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;

View File

@ -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:

View File

@ -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<Renderer>(context_);
if (!renderer->IsValid()) {
return;
}
renderer_ = std::move(renderer);
start_time_ = fml::TimePoint::Now().ToEpochDelta();
}
@ -158,7 +152,6 @@ void Playground::TeardownWindow() {
context_->Shutdown();
}
context_.reset();
renderer_.reset();
impl_.reset();
}
@ -202,7 +195,7 @@ void Playground::SetCursorPosition(Point pos) {
}
bool Playground::OpenPlaygroundHere(
const Renderer::RenderCallback& render_callback) {
const Playground::RenderCallback& render_callback) {
if (!switches_.enable_playground) {
return true;
}
@ -211,10 +204,6 @@ bool Playground::OpenPlaygroundHere(
return true;
}
if (!renderer_ || !renderer_->IsValid()) {
return false;
}
IMGUI_CHECKVERSION();
ImGui::CreateContext();
fml::ScopedCleanupClosure destroy_imgui_context(
@ -251,7 +240,7 @@ bool Playground::OpenPlaygroundHere(
ImGui_ImplGlfw_InitForOther(window, true);
fml::ScopedCleanupClosure shutdown_imgui([]() { ImGui_ImplGlfw_Shutdown(); });
ImGui_ImplImpeller_Init(renderer_->GetContext());
ImGui_ImplImpeller_Init(context_);
fml::ScopedCleanupClosure shutdown_imgui_impeller(
[]() { ImGui_ImplImpeller_Shutdown(); });
@ -273,59 +262,58 @@ bool Playground::OpenPlaygroundHere(
ImGui_ImplGlfw_NewFrame();
Renderer::RenderCallback wrapped_callback =
[render_callback,
&renderer = renderer_](RenderTarget& render_target) -> bool {
ImGui::NewFrame();
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(),
ImGuiDockNodeFlags_PassthruCentralNode);
bool result = render_callback(render_target);
ImGui::Render();
auto surface = impl_->AcquireSurfaceFrame(context_);
RenderTarget render_target = surface->GetTargetRenderPassDescriptor();
// Render ImGui overlay.
{
auto buffer = renderer->GetContext()->CreateCommandBuffer();
if (!buffer) {
return false;
}
buffer->SetLabel("ImGui Command Buffer");
ImGui::NewFrame();
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(),
ImGuiDockNodeFlags_PassthruCentralNode);
bool result = render_callback(render_target);
ImGui::Render();
if (render_target.GetColorAttachments().empty()) {
return false;
}
// Render ImGui overlay.
{
auto buffer = context_->CreateCommandBuffer();
if (!buffer) {
VALIDATION_LOG << "Could not create command buffer.";
return false;
}
buffer->SetLabel("ImGui Command Buffer");
auto color0 = render_target.GetColorAttachments().find(0)->second;
color0.load_action = LoadAction::kLoad;
if (color0.resolve_texture) {
color0.texture = color0.resolve_texture;
color0.resolve_texture = nullptr;
color0.store_action = StoreAction::kStore;
}
render_target.SetColorAttachment(color0, 0);
render_target.SetStencilAttachment(std::nullopt);
render_target.SetDepthAttachment(std::nullopt);
auto pass = buffer->CreateRenderPass(render_target);
if (!pass) {
return false;
}
pass->SetLabel("ImGui Render Pass");
ImGui_ImplImpeller_RenderDrawData(ImGui::GetDrawData(), *pass);
pass->EncodeCommands();
if (!renderer->GetContext()->GetCommandQueue()->Submit({buffer}).ok()) {
return false;
}
if (render_target.GetColorAttachments().empty()) {
VALIDATION_LOG << "render target attachments are empty.";
return false;
}
return result;
};
auto color0 = render_target.GetColorAttachments().find(0)->second;
color0.load_action = LoadAction::kLoad;
if (color0.resolve_texture) {
color0.texture = color0.resolve_texture;
color0.resolve_texture = nullptr;
color0.store_action = StoreAction::kStore;
}
render_target.SetColorAttachment(color0, 0);
if (!renderer_->Render(impl_->AcquireSurfaceFrame(renderer_->GetContext()),
wrapped_callback)) {
VALIDATION_LOG << "Could not render into the surface.";
render_target.SetStencilAttachment(std::nullopt);
render_target.SetDepthAttachment(std::nullopt);
auto pass = buffer->CreateRenderPass(render_target);
if (!pass) {
VALIDATION_LOG << "Could not create render pass.";
return false;
}
pass->SetLabel("ImGui Render Pass");
ImGui_ImplImpeller_RenderDrawData(ImGui::GetDrawData(), *pass);
pass->EncodeCommands();
if (!context_->GetCommandQueue()->Submit({buffer}).ok()) {
return false;
}
}
if (!result || !surface->Present()) {
return false;
}
@ -454,9 +442,8 @@ std::shared_ptr<Texture> Playground::CreateTextureForMapping(
std::shared_ptr<Texture> Playground::CreateTextureForFixture(
const char* fixture_name,
bool enable_mipmapping) const {
auto texture = CreateTextureForMapping(renderer_->GetContext(),
OpenAssetAsMapping(fixture_name),
enable_mipmapping);
auto texture = CreateTextureForMapping(
context_, OpenAssetAsMapping(fixture_name), enable_mipmapping);
if (texture == nullptr) {
return nullptr;
}
@ -483,30 +470,25 @@ std::shared_ptr<Texture> 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;
}

View File

@ -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<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);
@ -124,7 +125,6 @@ class Playground {
fml::TimeDelta start_time_;
std::unique_ptr<PlaygroundImpl> impl_;
std::shared_ptr<Context> context_;
std::unique_ptr<Renderer> renderer_;
Point cursor_position_;
ISize window_size_ = ISize{1024, 768};

View File

@ -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",

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.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;

View File

@ -37,7 +37,7 @@ INSTANTIATE_PLAYGROUND_SUITE(SceneTest);
TEST_P(SceneTest, CuboidUnlit) {
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 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;

View File

@ -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<impeller::Renderer>(context);
if (!renderer->IsValid()) {
return;
}
auto aiks_context = std::make_shared<impeller::AiksContext>(
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<SurfaceFrame> GPUSurfaceGLImpeller::AcquireFrame(
);
SurfaceFrame::SubmitCallback submit_callback =
fml::MakeCopyable([renderer = impeller_renderer_, //
aiks_context = aiks_context_, //
surface = std::move(surface) //
fml::MakeCopyable([aiks_context = aiks_context_, //
surface = std::move(surface) //
](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool {
if (!aiks_context) {
return false;
@ -130,14 +122,12 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceGLImpeller::AcquireFrame(
const bool reset_host_buffer =
surface_frame.submit_info().frame_boundary;
return renderer->Render(
std::move(surface),
fml::MakeCopyable(
[aiks_context, picture = std::move(picture), reset_host_buffer](
impeller::RenderTarget& render_target) -> bool {
return aiks_context->Render(picture, render_target,
reset_host_buffer);
}));
const impeller::RenderTarget& render_target =
surface->GetTargetRenderPassDescriptor();
if (!aiks_context->Render(picture, render_target, reset_host_buffer)) {
return false;
}
return surface->Present();
});
return std::make_unique<SurfaceFrame>(

View File

@ -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> impeller_context_;
bool render_to_surface_ = true;
std::shared_ptr<impeller::Renderer> impeller_renderer_;
std::shared_ptr<impeller::AiksContext> aiks_context_;
bool is_valid_ = false;
fml::TaskRunnerAffineWeakPtrFactory<GPUSurfaceGLImpeller> weak_factory_;

View File

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

View File

@ -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<impeller::Renderer>(context);
if (!renderer->IsValid()) {
return;
}
auto aiks_context = std::make_shared<impeller::AiksContext>(
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<SurfaceFrame> GPUSurfaceVulkanImpeller::AcquireFrame(
}
SurfaceFrame::SubmitCallback submit_callback =
fml::MakeCopyable([renderer = impeller_renderer_, //
aiks_context = aiks_context_, //
surface = std::move(surface) //
fml::MakeCopyable([aiks_context = aiks_context_, //
surface = std::move(surface) //
](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool {
if (!aiks_context) {
return false;
@ -83,44 +75,41 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceVulkanImpeller::AcquireFrame(
auto cull_rect =
surface->GetTargetRenderPassDescriptor().GetRenderTargetSize();
return renderer->Render(
std::move(surface),
fml::MakeCopyable([&](impeller::RenderTarget& render_target)
-> bool {
const impeller::RenderTarget& render_target =
surface->GetTargetRenderPassDescriptor();
#if EXPERIMENTAL_CANVAS
impeller::TextFrameDispatcher collector(
aiks_context->GetContentContext(), impeller::Matrix());
display_list->Dispatch(
collector,
SkIRect::MakeWH(cull_rect.width, cull_rect.height));
impeller::ExperimentalDlDispatcher impeller_dispatcher(
aiks_context->GetContentContext(), render_target,
display_list->root_has_backdrop_filter(),
display_list->max_root_blend_mode(),
impeller::IRect::RoundOut(
impeller::Rect::MakeSize(cull_rect)));
display_list->Dispatch(
impeller_dispatcher,
SkIRect::MakeWH(cull_rect.width, cull_rect.height));
impeller_dispatcher.FinishRecording();
aiks_context->GetContentContext().GetTransientsBuffer().Reset();
aiks_context->GetContentContext()
.GetLazyGlyphAtlas()
->ResetTextFrames();
return true;
impeller::TextFrameDispatcher collector(
aiks_context->GetContentContext(), impeller::Matrix());
display_list->Dispatch(
collector, SkIRect::MakeWH(cull_rect.width, cull_rect.height));
impeller::ExperimentalDlDispatcher impeller_dispatcher(
aiks_context->GetContentContext(), render_target,
display_list->root_has_backdrop_filter(),
display_list->max_root_blend_mode(),
impeller::IRect::RoundOut(impeller::Rect::MakeSize(cull_rect)));
display_list->Dispatch(
impeller_dispatcher,
SkIRect::MakeWH(cull_rect.width, cull_rect.height));
impeller_dispatcher.FinishRecording();
aiks_context->GetContentContext().GetTransientsBuffer().Reset();
aiks_context->GetContentContext()
.GetLazyGlyphAtlas()
->ResetTextFrames();
return surface->Present();
#else
impeller::Rect dl_cull_rect = impeller::Rect::MakeSize(cull_rect);
impeller::DlDispatcher impeller_dispatcher(dl_cull_rect);
display_list->Dispatch(
impeller_dispatcher,
SkIRect::MakeWH(cull_rect.width, cull_rect.height));
auto picture = impeller_dispatcher.EndRecordingAsPicture();
const bool reset_host_buffer =
surface_frame.submit_info().frame_boundary;
return aiks_context->Render(picture, render_target,
reset_host_buffer);
impeller::Rect dl_cull_rect = impeller::Rect::MakeSize(cull_rect);
impeller::DlDispatcher impeller_dispatcher(dl_cull_rect);
display_list->Dispatch(
impeller_dispatcher,
SkIRect::MakeWH(cull_rect.width, cull_rect.height));
auto picture = impeller_dispatcher.EndRecordingAsPicture();
const bool reset_host_buffer =
surface_frame.submit_info().frame_boundary;
if (!aiks_context->Render(picture, render_target, reset_host_buffer)) {
return false;
}
return surface->Present();
#endif
}));
});
return std::make_unique<SurfaceFrame>(

View File

@ -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> impeller_context_;
std::shared_ptr<impeller::Renderer> impeller_renderer_;
std::shared_ptr<impeller::AiksContext> aiks_context_;
bool is_valid_ = false;