[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:
parent
3f20f61fe7
commit
f2c5ad0b1e
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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
|
@ -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_
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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>(
|
||||
|
@ -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_;
|
||||
|
@ -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
|
||||
|
@ -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";
|
||||
|
@ -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>(
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user