Revert "[Impeller] Add Impeller Metal support in the embedder API (#42411)" (#42532)
This reverts commit 052e22661754d278b33a55deec9c26b0a5d402c1.
Expected to resolve https://github.com/flutter/flutter/issues/128145
diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index e2eb8ee..69d87bc 100644
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -1482,8 +1482,6 @@
ORIGIN: ../../../flutter/impeller/renderer/backend/metal/surface_mtl.mm + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/metal/texture_mtl.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/metal/texture_mtl.mm + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/impeller/renderer/backend/metal/texture_wrapper_mtl.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/impeller/renderer/backend/metal/texture_wrapper_mtl.mm + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/metal/vertex_descriptor_mtl.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/metal/vertex_descriptor_mtl.mm + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/allocator_vk.cc + ../../../flutter/LICENSE
@@ -2803,10 +2801,6 @@
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_render_target.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_render_target_cache.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_render_target_cache.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/embedder/embedder_render_target_impeller.cc + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/embedder/embedder_render_target_impeller.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/embedder/embedder_render_target_skia.cc + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/embedder/embedder_render_target_skia.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_struct_macros.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface.h + ../../../flutter/LICENSE
@@ -2814,8 +2808,6 @@
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal.mm + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal_impeller.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal_impeller.mm + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_software.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_software.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_vulkan.cc + ../../../flutter/LICENSE
@@ -4156,8 +4148,6 @@
FILE: ../../../flutter/impeller/renderer/backend/metal/surface_mtl.mm
FILE: ../../../flutter/impeller/renderer/backend/metal/texture_mtl.h
FILE: ../../../flutter/impeller/renderer/backend/metal/texture_mtl.mm
-FILE: ../../../flutter/impeller/renderer/backend/metal/texture_wrapper_mtl.h
-FILE: ../../../flutter/impeller/renderer/backend/metal/texture_wrapper_mtl.mm
FILE: ../../../flutter/impeller/renderer/backend/metal/vertex_descriptor_mtl.h
FILE: ../../../flutter/impeller/renderer/backend/metal/vertex_descriptor_mtl.mm
FILE: ../../../flutter/impeller/renderer/backend/vulkan/allocator_vk.cc
@@ -5493,10 +5483,6 @@
FILE: ../../../flutter/shell/platform/embedder/embedder_render_target.h
FILE: ../../../flutter/shell/platform/embedder/embedder_render_target_cache.cc
FILE: ../../../flutter/shell/platform/embedder/embedder_render_target_cache.h
-FILE: ../../../flutter/shell/platform/embedder/embedder_render_target_impeller.cc
-FILE: ../../../flutter/shell/platform/embedder/embedder_render_target_impeller.h
-FILE: ../../../flutter/shell/platform/embedder/embedder_render_target_skia.cc
-FILE: ../../../flutter/shell/platform/embedder/embedder_render_target_skia.h
FILE: ../../../flutter/shell/platform/embedder/embedder_struct_macros.h
FILE: ../../../flutter/shell/platform/embedder/embedder_surface.cc
FILE: ../../../flutter/shell/platform/embedder/embedder_surface.h
@@ -5504,8 +5490,6 @@
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl.h
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal.h
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal.mm
-FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal_impeller.h
-FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal_impeller.mm
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_software.cc
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_software.h
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_vulkan.cc
diff --git a/flow/BUILD.gn b/flow/BUILD.gn
index 560b067..efda895 100644
--- a/flow/BUILD.gn
+++ b/flow/BUILD.gn
@@ -4,7 +4,6 @@
import("//build/fuchsia/sdk.gni")
import("//flutter/common/config.gni")
-import("//flutter/impeller/tools/impeller.gni")
import("//flutter/shell/config.gni")
import("//flutter/testing/testing.gni")
@@ -97,10 +96,6 @@
"//third_party/skia",
]
- if (impeller_supports_rendering) {
- deps += [ "//flutter/impeller" ]
- }
-
public_deps = [ "//flutter/display_list" ]
}
diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc
index c19f1c1..b76c973 100644
--- a/flow/embedded_views.cc
+++ b/flow/embedded_views.cc
@@ -42,10 +42,8 @@
return builder_ == nullptr;
}
-void ExternalViewEmbedder::SubmitFrame(
- GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
- std::unique_ptr<SurfaceFrame> frame) {
+void ExternalViewEmbedder::SubmitFrame(GrDirectContext* context,
+ std::unique_ptr<SurfaceFrame> frame) {
frame->Submit();
};
diff --git a/flow/embedded_views.h b/flow/embedded_views.h
index 5293bab..4162e79 100644
--- a/flow/embedded_views.h
+++ b/flow/embedded_views.h
@@ -5,7 +5,6 @@
#ifndef FLUTTER_FLOW_EMBEDDED_VIEWS_H_
#define FLUTTER_FLOW_EMBEDDED_VIEWS_H_
-#include <memory>
#include <vector>
#include "flutter/display_list/dl_builder.h"
@@ -23,16 +22,6 @@
#include "third_party/skia/include/core/SkSize.h"
#include "third_party/skia/include/core/SkSurface.h"
-#if IMPELLER_SUPPORTS_RENDERING
-#include "flutter/impeller/aiks/aiks_context.h" // nogncheck
-#include "flutter/impeller/renderer/context.h" // nogncheck
-#else // IMPELLER_SUPPORTS_RENDERING
-namespace impeller {
-class Context;
-class AiksContext;
-} // namespace impeller
-#endif // !IMPELLER_SUPPORTS_RENDERING
-
class GrDirectContext;
namespace flutter {
@@ -425,10 +414,8 @@
// This method can mutate the root Skia canvas before submitting the frame.
//
// It can also allocate frames for overlay surfaces to compose hybrid views.
- virtual void SubmitFrame(
- GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
- std::unique_ptr<SurfaceFrame> frame);
+ virtual void SubmitFrame(GrDirectContext* context,
+ std::unique_ptr<SurfaceFrame> frame);
// This method provides the embedder a way to do additional tasks after
// |SubmitFrame|. For example, merge task runners if `should_resubmit_frame`
diff --git a/impeller/playground/backend/metal/playground_impl_mtl.mm b/impeller/playground/backend/metal/playground_impl_mtl.mm
index 55e1787..25f1086 100644
--- a/impeller/playground/backend/metal/playground_impl_mtl.mm
+++ b/impeller/playground/backend/metal/playground_impl_mtl.mm
@@ -121,7 +121,7 @@
auto drawable =
SurfaceMTL::GetMetalDrawableAndValidate(context, data_->metal_layer);
- return SurfaceMTL::MakeFromMetalLayerDrawable(context, drawable);
+ return SurfaceMTL::WrapCurrentMetalLayerDrawable(context, drawable);
}
} // namespace impeller
diff --git a/impeller/renderer/backend/metal/BUILD.gn b/impeller/renderer/backend/metal/BUILD.gn
index 9a0f6a6..7ad03e9 100644
--- a/impeller/renderer/backend/metal/BUILD.gn
+++ b/impeller/renderer/backend/metal/BUILD.gn
@@ -42,8 +42,6 @@
"surface_mtl.mm",
"texture_mtl.h",
"texture_mtl.mm",
- "texture_wrapper_mtl.h",
- "texture_wrapper_mtl.mm",
"vertex_descriptor_mtl.h",
"vertex_descriptor_mtl.mm",
]
diff --git a/impeller/renderer/backend/metal/context_mtl.h b/impeller/renderer/backend/metal/context_mtl.h
index 820c0e2..fe46160 100644
--- a/impeller/renderer/backend/metal/context_mtl.h
+++ b/impeller/renderer/backend/metal/context_mtl.h
@@ -21,12 +21,6 @@
#include "impeller/renderer/capabilities.h"
#include "impeller/renderer/context.h"
-#if TARGET_OS_SIMULATOR
-#define IMPELLER_CA_METAL_LAYER_AVAILABLE API_AVAILABLE(macos(10.11), ios(13.0))
-#else // TARGET_OS_SIMULATOR
-#define IMPELLER_CA_METAL_LAYER_AVAILABLE API_AVAILABLE(macos(10.11), ios(8.0))
-#endif // TARGET_OS_SIMULATOR
-
namespace impeller {
class ContextMTL final : public Context,
@@ -44,14 +38,6 @@
std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
const std::string& label);
- static std::shared_ptr<ContextMTL> Create(
- id<MTLDevice> device,
- id<MTLCommandQueue> command_queue,
- const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries_data,
- std::shared_ptr<fml::ConcurrentTaskRunner> worker_task_runner,
- std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
- const std::string& label);
-
// |Context|
~ContextMTL() override;
@@ -104,7 +90,6 @@
ContextMTL(
id<MTLDevice> device,
- id<MTLCommandQueue> command_queue,
NSArray<id<MTLLibrary>>* shader_libraries,
std::shared_ptr<fml::ConcurrentTaskRunner> worker_task_runner,
std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch);
diff --git a/impeller/renderer/backend/metal/context_mtl.mm b/impeller/renderer/backend/metal/context_mtl.mm
index cc4ea36..20af3b8 100644
--- a/impeller/renderer/backend/metal/context_mtl.mm
+++ b/impeller/renderer/backend/metal/context_mtl.mm
@@ -6,11 +6,9 @@
#include <Foundation/Foundation.h>
-#include "flutter/fml/concurrent_message_loop.h"
#include "flutter/fml/file.h"
#include "flutter/fml/logging.h"
#include "flutter/fml/paths.h"
-#include "flutter/fml/synchronization/sync_switch.h"
#include "impeller/core/sampler_descriptor.h"
#include "impeller/renderer/backend/metal/sampler_library_mtl.h"
#include "impeller/renderer/capabilities.h"
@@ -69,12 +67,10 @@
ContextMTL::ContextMTL(
id<MTLDevice> device,
- id<MTLCommandQueue> command_queue,
NSArray<id<MTLLibrary>>* shader_libraries,
std::shared_ptr<fml::ConcurrentTaskRunner> worker_task_runner,
std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch)
: device_(device),
- command_queue_(command_queue),
worker_task_runner_(std::move(worker_task_runner)),
is_gpu_disabled_sync_switch_(std::move(is_gpu_disabled_sync_switch)) {
// Validate device.
@@ -100,6 +96,16 @@
shader_library_ = std::move(library);
}
+ // Setup command queue.
+ {
+ command_queue_ = device_.newCommandQueue;
+ if (!command_queue_) {
+ VALIDATION_LOG << "Could not setup the command queue.";
+ return;
+ }
+ command_queue_.label = @"Impeller Command Queue";
+ }
+
// Setup the pipeline library.
{
pipeline_library_ =
@@ -198,28 +204,13 @@
return ::MTLCreateSystemDefaultDevice();
}
-static id<MTLCommandQueue> CreateMetalCommandQueue(id<MTLDevice> device) {
- auto command_queue = device.newCommandQueue;
- if (!command_queue) {
- VALIDATION_LOG << "Could not setup the command queue.";
- return nullptr;
- }
- command_queue.label = @"Impeller Command Queue";
- return command_queue;
-}
-
std::shared_ptr<ContextMTL> ContextMTL::Create(
const std::vector<std::string>& shader_library_paths,
std::shared_ptr<fml::ConcurrentTaskRunner> worker_task_runner,
std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch) {
auto device = CreateMetalDevice();
- auto command_queue = CreateMetalCommandQueue(device);
- if (!command_queue) {
- return nullptr;
- }
auto context = std::shared_ptr<ContextMTL>(new ContextMTL(
- device, command_queue,
- MTLShaderLibraryFromFilePaths(device, shader_library_paths),
+ device, MTLShaderLibraryFromFilePaths(device, shader_library_paths),
std::move(worker_task_runner), std::move(is_gpu_disabled_sync_switch)));
if (!context->IsValid()) {
FML_LOG(ERROR) << "Could not create Metal context.";
@@ -232,36 +223,12 @@
const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries_data,
std::shared_ptr<fml::ConcurrentTaskRunner> worker_task_runner,
std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
- const std::string& library_label) {
+ const std::string& label) {
auto device = CreateMetalDevice();
- auto command_queue = CreateMetalCommandQueue(device);
- if (!command_queue) {
- return nullptr;
- }
auto context = std::shared_ptr<ContextMTL>(new ContextMTL(
- device, command_queue,
- MTLShaderLibraryFromFileData(device, shader_libraries_data,
- library_label),
- std::move(worker_task_runner), std::move(is_gpu_disabled_sync_switch)));
- if (!context->IsValid()) {
- FML_LOG(ERROR) << "Could not create Metal context.";
- return nullptr;
- }
- return context;
-}
-
-std::shared_ptr<ContextMTL> ContextMTL::Create(
- id<MTLDevice> device,
- id<MTLCommandQueue> command_queue,
- const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries_data,
- std::shared_ptr<fml::ConcurrentTaskRunner> worker_task_runner,
- std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
- const std::string& library_label) {
- auto context = std::shared_ptr<ContextMTL>(new ContextMTL(
- device, command_queue,
- MTLShaderLibraryFromFileData(device, shader_libraries_data,
- library_label),
- std::move(worker_task_runner), std::move(is_gpu_disabled_sync_switch)));
+ device,
+ MTLShaderLibraryFromFileData(device, shader_libraries_data, label),
+ worker_task_runner, std::move(is_gpu_disabled_sync_switch)));
if (!context->IsValid()) {
FML_LOG(ERROR) << "Could not create Metal context.";
return nullptr;
diff --git a/impeller/renderer/backend/metal/surface_mtl.h b/impeller/renderer/backend/metal/surface_mtl.h
index 3a7db1c..cebc43e 100644
--- a/impeller/renderer/backend/metal/surface_mtl.h
+++ b/impeller/renderer/backend/metal/surface_mtl.h
@@ -5,7 +5,6 @@
#pragma once
#include <QuartzCore/CAMetalLayer.h>
-#include <memory>
#include "flutter/fml/macros.h"
#include "impeller/geometry/rect.h"
@@ -38,15 +37,10 @@
const std::shared_ptr<Context>& context,
CAMetalLayer* layer);
- static std::unique_ptr<SurfaceMTL> MakeFromMetalLayerDrawable(
+ static std::unique_ptr<SurfaceMTL> WrapCurrentMetalLayerDrawable(
const std::shared_ptr<Context>& context,
id<CAMetalDrawable> drawable,
std::optional<IRect> clip_rect = std::nullopt);
-
- static std::unique_ptr<SurfaceMTL> MakeFromTexture(
- const std::shared_ptr<Context>& context,
- id<MTLTexture> texture,
- std::optional<IRect> clip_rect);
#pragma GCC diagnostic pop
// |Surface|
@@ -64,8 +58,6 @@
std::weak_ptr<Context> context_;
std::shared_ptr<Texture> resolve_texture_;
id<CAMetalDrawable> drawable_ = nil;
- std::shared_ptr<Texture> source_texture_;
- std::shared_ptr<Texture> destination_texture_;
bool requires_blit_ = false;
std::optional<IRect> clip_rect_;
@@ -75,8 +67,6 @@
const RenderTarget& target,
std::shared_ptr<Texture> resolve_texture,
id<CAMetalDrawable> drawable,
- std::shared_ptr<Texture> source_texture,
- std::shared_ptr<Texture> destination_texture,
bool requires_blit,
std::optional<IRect> clip_rect);
diff --git a/impeller/renderer/backend/metal/surface_mtl.mm b/impeller/renderer/backend/metal/surface_mtl.mm
index 7ff1810..90f70f5 100644
--- a/impeller/renderer/backend/metal/surface_mtl.mm
+++ b/impeller/renderer/backend/metal/surface_mtl.mm
@@ -7,7 +7,6 @@
#include "flutter/fml/trace_event.h"
#include "flutter/impeller/renderer/command_buffer.h"
#include "impeller/base/validation.h"
-#include "impeller/core/texture_descriptor.h"
#include "impeller/renderer/backend/metal/context_mtl.h"
#include "impeller/renderer/backend/metal/formats_mtl.h"
#include "impeller/renderer/backend/metal/texture_mtl.h"
@@ -40,11 +39,17 @@
return current_drawable;
}
-static std::optional<RenderTarget> WrapTextureWithRenderTarget(
- Allocator& allocator,
- id<MTLTexture> texture,
- bool requires_blit,
+std::unique_ptr<SurfaceMTL> SurfaceMTL::WrapCurrentMetalLayerDrawable(
+ const std::shared_ptr<Context>& context,
+ id<CAMetalDrawable> drawable,
std::optional<IRect> clip_rect) {
+ bool requires_blit = ShouldPerformPartialRepaint(clip_rect);
+ const auto color_format = FromMTLPixelFormat(drawable.texture.pixelFormat);
+
+ if (color_format == PixelFormat::kUnknown) {
+ VALIDATION_LOG << "Unknown drawable color format.";
+ return nullptr;
+ }
// compositor_context.cc will offset the rendering by the clip origin. Here we
// shrink to the size of the clip. This has the same effect as clipping the
// rendering but also creates smaller intermediate passes.
@@ -52,144 +57,80 @@
if (requires_blit) {
if (!clip_rect.has_value()) {
VALIDATION_LOG << "Missing clip rectangle.";
- return std::nullopt;
+ return nullptr;
}
root_size = ISize(clip_rect->size.width, clip_rect->size.height);
} else {
- root_size = {static_cast<ISize::Type>(texture.width),
- static_cast<ISize::Type>(texture.height)};
+ root_size = {static_cast<ISize::Type>(drawable.texture.width),
+ static_cast<ISize::Type>(drawable.texture.height)};
}
- TextureDescriptor resolve_tex_desc;
- resolve_tex_desc.format = FromMTLPixelFormat(texture.pixelFormat);
- resolve_tex_desc.size = root_size;
- resolve_tex_desc.usage = static_cast<uint64_t>(TextureUsage::kRenderTarget) |
- static_cast<uint64_t>(TextureUsage::kShaderRead);
- resolve_tex_desc.sample_count = SampleCount::kCount1;
- resolve_tex_desc.storage_mode = StorageMode::kDevicePrivate;
-
- if (resolve_tex_desc.format == PixelFormat::kUnknown) {
- VALIDATION_LOG << "Unknown drawable color format.";
- return std::nullopt;
- }
-
- // Create color resolve texture.
- std::shared_ptr<Texture> resolve_tex;
- if (requires_blit) {
- resolve_tex_desc.compression_type = CompressionType::kLossy;
- resolve_tex = allocator.CreateTexture(resolve_tex_desc);
- } else {
- resolve_tex = std::make_shared<TextureMTL>(resolve_tex_desc, texture);
- }
-
- if (!resolve_tex) {
- VALIDATION_LOG << "Could not wrap resolve texture.";
- return std::nullopt;
- }
- resolve_tex->SetLabel("ImpellerOnscreenResolve");
-
TextureDescriptor msaa_tex_desc;
msaa_tex_desc.storage_mode = StorageMode::kDeviceTransient;
msaa_tex_desc.type = TextureType::kTexture2DMultisample;
msaa_tex_desc.sample_count = SampleCount::kCount4;
- msaa_tex_desc.format = resolve_tex->GetTextureDescriptor().format;
- msaa_tex_desc.size = resolve_tex->GetSize();
+ msaa_tex_desc.format = color_format;
+ msaa_tex_desc.size = root_size;
msaa_tex_desc.usage = static_cast<uint64_t>(TextureUsage::kRenderTarget);
- auto msaa_tex = allocator.CreateTexture(msaa_tex_desc);
+ auto msaa_tex = context->GetResourceAllocator()->CreateTexture(msaa_tex_desc);
if (!msaa_tex) {
VALIDATION_LOG << "Could not allocate MSAA color texture.";
- return std::nullopt;
+ return nullptr;
}
msaa_tex->SetLabel("ImpellerOnscreenColorMSAA");
+ TextureDescriptor resolve_tex_desc;
+ resolve_tex_desc.format = color_format;
+ resolve_tex_desc.size = msaa_tex_desc.size;
+ resolve_tex_desc.usage = static_cast<uint64_t>(TextureUsage::kRenderTarget) |
+ static_cast<uint64_t>(TextureUsage::kShaderRead);
+ resolve_tex_desc.sample_count = SampleCount::kCount1;
+ resolve_tex_desc.storage_mode = StorageMode::kDevicePrivate;
+
+ // Create color resolve texture.
+ std::shared_ptr<Texture> resolve_tex;
+ if (requires_blit) {
+ resolve_tex_desc.compression_type = CompressionType::kLossy;
+ resolve_tex =
+ context->GetResourceAllocator()->CreateTexture(resolve_tex_desc);
+ } else {
+ resolve_tex =
+ std::make_shared<TextureMTL>(resolve_tex_desc, drawable.texture);
+ }
+
+ if (!resolve_tex) {
+ VALIDATION_LOG << "Could not wrap resolve texture.";
+ return nullptr;
+ }
+ resolve_tex->SetLabel("ImpellerOnscreenResolve");
+
ColorAttachment color0;
color0.texture = msaa_tex;
color0.clear_color = Color::DarkSlateGray();
color0.load_action = LoadAction::kClear;
color0.store_action = StoreAction::kMultisampleResolve;
- color0.resolve_texture = std::move(resolve_tex);
+ color0.resolve_texture = resolve_tex;
RenderTarget render_target_desc;
render_target_desc.SetColorAttachment(color0, 0u);
- return render_target_desc;
-}
-
-std::unique_ptr<SurfaceMTL> SurfaceMTL::MakeFromMetalLayerDrawable(
- const std::shared_ptr<Context>& context,
- id<CAMetalDrawable> drawable,
- std::optional<IRect> clip_rect) {
- bool requires_blit = ShouldPerformPartialRepaint(clip_rect);
-
- auto render_target =
- WrapTextureWithRenderTarget(*context->GetResourceAllocator(),
- drawable.texture, requires_blit, clip_rect);
- if (!render_target) {
- return nullptr;
- }
-
- auto source_texture =
- requires_blit ? render_target->GetRenderTargetTexture() : nullptr;
- auto destination_texture = TextureMTL::Wrapper(
- render_target->GetRenderTargetTexture()->GetTextureDescriptor(),
- drawable.texture);
-
- return std::unique_ptr<SurfaceMTL>(new SurfaceMTL(
- context, // context
- *render_target, // target
- render_target->GetRenderTargetTexture(), // resolve_texture
- drawable, // drawable
- source_texture, // source_texture
- destination_texture, // destination_texture
- requires_blit, // requires_blit
- clip_rect // clip_rect
- ));
-}
-
-std::unique_ptr<SurfaceMTL> SurfaceMTL::MakeFromTexture(
- const std::shared_ptr<Context>& context,
- id<MTLTexture> texture,
- std::optional<IRect> clip_rect) {
- bool requires_blit = ShouldPerformPartialRepaint(clip_rect);
-
- auto render_target = WrapTextureWithRenderTarget(
- *context->GetResourceAllocator(), texture, requires_blit, clip_rect);
- if (!render_target) {
- return nullptr;
- }
-
- auto source_texture =
- requires_blit ? render_target->GetRenderTargetTexture() : nullptr;
- auto destination_texture = TextureMTL::Wrapper(
- render_target->GetRenderTargetTexture()->GetTextureDescriptor(), texture);
-
- return std::unique_ptr<SurfaceMTL>(new SurfaceMTL(
- context, // context
- *render_target, // target
- render_target->GetRenderTargetTexture(), // resolve_texture
- nil, // drawable
- source_texture, // source_texture
- destination_texture, // destination_texture
- requires_blit, // requires_blit
- clip_rect // clip_rect
- ));
+ // The constructor is private. So make_unique may not be used.
+ return std::unique_ptr<SurfaceMTL>(new SurfaceMTL(context, render_target_desc,
+ resolve_tex, drawable,
+ requires_blit, clip_rect));
}
SurfaceMTL::SurfaceMTL(const std::weak_ptr<Context>& context,
const RenderTarget& target,
std::shared_ptr<Texture> resolve_texture,
id<CAMetalDrawable> drawable,
- std::shared_ptr<Texture> source_texture,
- std::shared_ptr<Texture> destination_texture,
bool requires_blit,
std::optional<IRect> clip_rect)
: Surface(target),
context_(context),
resolve_texture_(std::move(resolve_texture)),
drawable_(drawable),
- source_texture_(std::move(source_texture)),
- destination_texture_(std::move(destination_texture)),
requires_blit_(requires_blit),
clip_rect_(clip_rect) {}
@@ -232,16 +173,16 @@
// |Surface|
bool SurfaceMTL::Present() const {
+ if (drawable_ == nil) {
+ return false;
+ }
+
auto context = context_.lock();
if (!context) {
return false;
}
if (requires_blit_) {
- if (!(source_texture_ && destination_texture_)) {
- return false;
- }
-
auto blit_command_buffer = context->CreateCommandBuffer();
if (!blit_command_buffer) {
return false;
@@ -251,7 +192,8 @@
VALIDATION_LOG << "Missing clip rectangle.";
return false;
}
- blit_pass->AddCopy(source_texture_, destination_texture_, std::nullopt,
+ auto current = TextureMTL::Wrapper({}, drawable_.texture);
+ blit_pass->AddCopy(resolve_texture_, current, std::nullopt,
clip_rect_->origin);
blit_pass->EncodeCommands(context->GetResourceAllocator());
if (!blit_command_buffer->SubmitCommands()) {
@@ -259,15 +201,13 @@
}
}
- if (drawable_) {
- if (ShouldWaitForCommandBuffer()) {
- id<MTLCommandBuffer> command_buffer =
- ContextMTL::Cast(context.get())->CreateMTLCommandBuffer();
- [command_buffer commit];
- [command_buffer waitUntilScheduled];
- }
- [drawable_ present];
+ if (ShouldWaitForCommandBuffer()) {
+ id<MTLCommandBuffer> command_buffer =
+ ContextMTL::Cast(context.get())->CreateMTLCommandBuffer();
+ [command_buffer commit];
+ [command_buffer waitUntilScheduled];
}
+ [drawable_ present];
return true;
}
diff --git a/impeller/renderer/backend/metal/texture_mtl.h b/impeller/renderer/backend/metal/texture_mtl.h
index 91cd8a1..9d9378d 100644
--- a/impeller/renderer/backend/metal/texture_mtl.h
+++ b/impeller/renderer/backend/metal/texture_mtl.h
@@ -19,10 +19,8 @@
id<MTLTexture> texture,
bool wrapped = false);
- static std::shared_ptr<TextureMTL> Wrapper(
- TextureDescriptor desc,
- id<MTLTexture> texture,
- std::function<void()> deletion_proc = nullptr);
+ static std::shared_ptr<TextureMTL> Wrapper(TextureDescriptor desc,
+ id<MTLTexture> texture);
// |Texture|
~TextureMTL() override;
diff --git a/impeller/renderer/backend/metal/texture_mtl.mm b/impeller/renderer/backend/metal/texture_mtl.mm
index bc57684..5c63624 100644
--- a/impeller/renderer/backend/metal/texture_mtl.mm
+++ b/impeller/renderer/backend/metal/texture_mtl.mm
@@ -9,13 +9,6 @@
namespace impeller {
-std::shared_ptr<Texture> WrapperMTL(TextureDescriptor desc,
- const void* mtl_texture,
- std::function<void()> deletion_proc) {
- return TextureMTL::Wrapper(desc, (__bridge id<MTLTexture>)mtl_texture,
- std::move(deletion_proc));
-}
-
TextureMTL::TextureMTL(TextureDescriptor p_desc,
id<MTLTexture> texture,
bool wrapped)
@@ -35,18 +28,9 @@
is_valid_ = true;
}
-std::shared_ptr<TextureMTL> TextureMTL::Wrapper(
- TextureDescriptor desc,
- id<MTLTexture> texture,
- std::function<void()> deletion_proc) {
- if (deletion_proc) {
- return std::shared_ptr<TextureMTL>(
- new TextureMTL(desc, texture, true),
- [deletion_proc = std::move(deletion_proc)](TextureMTL* t) {
- deletion_proc();
- });
- }
- return std::shared_ptr<TextureMTL>(new TextureMTL(desc, texture, true));
+std::shared_ptr<TextureMTL> TextureMTL::Wrapper(TextureDescriptor desc,
+ id<MTLTexture> texture) {
+ return std::make_shared<TextureMTL>(desc, texture, true);
}
TextureMTL::~TextureMTL() = default;
diff --git a/impeller/renderer/backend/metal/texture_wrapper_mtl.h b/impeller/renderer/backend/metal/texture_wrapper_mtl.h
deleted file mode 100644
index e6fe71f..0000000
--- a/impeller/renderer/backend/metal/texture_wrapper_mtl.h
+++ /dev/null
@@ -1,16 +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.
-
-#pragma once
-
-#include "impeller/core/texture.h"
-
-namespace impeller {
-
-std::shared_ptr<Texture> WrapTextureMTL(
- TextureDescriptor desc,
- const void* mtl_texture,
- std::function<void()> deletion_proc = nullptr);
-
-} // namespace impeller
diff --git a/impeller/renderer/backend/metal/texture_wrapper_mtl.mm b/impeller/renderer/backend/metal/texture_wrapper_mtl.mm
deleted file mode 100644
index 2b6a908..0000000
--- a/impeller/renderer/backend/metal/texture_wrapper_mtl.mm
+++ /dev/null
@@ -1,22 +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/backend/metal/texture_wrapper_mtl.h"
-
-#include <Metal/Metal.h>
-
-#include "impeller/renderer/backend/metal/formats_mtl.h"
-#include "impeller/renderer/backend/metal/texture_mtl.h"
-
-namespace impeller {
-
-std::shared_ptr<Texture> WrapTextureMTL(TextureDescriptor desc,
- const void* mtl_texture,
- std::function<void()> deletion_proc) {
- auto texture = (__bridge id<MTLTexture>)mtl_texture;
- desc.format = FromMTLPixelFormat(texture.pixelFormat);
- return TextureMTL::Wrapper(desc, texture, std::move(deletion_proc));
-}
-
-} // namespace impeller
diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc
index 963c500..493befc 100644
--- a/shell/common/rasterizer.cc
+++ b/shell/common/rasterizer.cc
@@ -626,8 +626,8 @@
if (external_view_embedder_ &&
(!raster_thread_merger_ || raster_thread_merger_->IsMerged())) {
FML_DCHECK(!frame->IsSubmitted());
- external_view_embedder_->SubmitFrame(
- surface_->GetContext(), surface_->GetAiksContext(), std::move(frame));
+ external_view_embedder_->SubmitFrame(surface_->GetContext(),
+ std::move(frame));
} else {
frame->Submit();
}
diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc
index daf36364..53de96c 100644
--- a/shell/common/rasterizer_unittests.cc
+++ b/shell/common/rasterizer_unittests.cc
@@ -74,9 +74,8 @@
PostPrerollResult(
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger));
MOCK_METHOD1(CompositeEmbeddedView, DlCanvas*(int64_t view_id));
- MOCK_METHOD3(SubmitFrame,
+ MOCK_METHOD2(SubmitFrame,
void(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame));
MOCK_METHOD2(EndFrame,
void(bool should_resubmit_frame,
diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc
index 22b9bfe..2536bb6 100644
--- a/shell/common/shell_test_external_view_embedder.cc
+++ b/shell/common/shell_test_external_view_embedder.cc
@@ -91,7 +91,6 @@
// |ExternalViewEmbedder|
void ShellTestExternalViewEmbedder::SubmitFrame(
GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame) {
if (!frame) {
return;
diff --git a/shell/common/shell_test_external_view_embedder.h b/shell/common/shell_test_external_view_embedder.h
index 36a392d..204472d 100644
--- a/shell/common/shell_test_external_view_embedder.h
+++ b/shell/common/shell_test_external_view_embedder.h
@@ -75,7 +75,6 @@
// |ExternalViewEmbedder|
void SubmitFrame(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame) override;
// |ExternalViewEmbedder|
diff --git a/shell/gpu/gpu_surface_metal_impeller.h b/shell/gpu/gpu_surface_metal_impeller.h
index d89e5bf..3b139c1 100644
--- a/shell/gpu/gpu_surface_metal_impeller.h
+++ b/shell/gpu/gpu_surface_metal_impeller.h
@@ -5,25 +5,22 @@
#ifndef FLUTTER_SHELL_GPU_GPU_SURFACE_METAL_IMPELLER_H_
#define FLUTTER_SHELL_GPU_GPU_SURFACE_METAL_IMPELLER_H_
-#include <Metal/Metal.h>
+#include <QuartzCore/CAMetalLayer.h>
#include "flutter/flow/surface.h"
#include "flutter/fml/macros.h"
#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/mtl/GrMtlTypes.h"
namespace flutter {
-class IMPELLER_CA_METAL_LAYER_AVAILABLE GPUSurfaceMetalImpeller
- : public Surface {
+class SK_API_AVAILABLE_CA_METAL_LAYER GPUSurfaceMetalImpeller : public Surface {
public:
GPUSurfaceMetalImpeller(GPUSurfaceMetalDelegate* delegate,
- const std::shared_ptr<impeller::Context>& context,
- bool render_to_surface = true);
+ const std::shared_ptr<impeller::Context>& context);
// |Surface|
~GPUSurfaceMetalImpeller();
@@ -35,29 +32,16 @@
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
- // external view embedder may want to render to the root surface. This is a
- // hack to make avoid allocating resources for the root surface when an
- // external view embedder is present.
- bool render_to_surface_ = true;
+ fml::scoped_nsprotocol<id<MTLDrawable>> last_drawable_;
bool disable_partial_repaint_ = false;
// Accumulated damage for each framebuffer; Key is address of underlying
// MTLTexture for each drawable
std::map<uintptr_t, SkIRect> damage_;
// |Surface|
- std::unique_ptr<SurfaceFrame> AcquireFrame(
- const SkISize& frame_size) override;
-
- std::unique_ptr<SurfaceFrame> AcquireFrameFromCAMetalLayer(
- const SkISize& frame_size);
-
- std::unique_ptr<SurfaceFrame> AcquireFrameFromMTLTexture(
- const SkISize& frame_size);
+ std::unique_ptr<SurfaceFrame> AcquireFrame(const SkISize& size) override;
// |Surface|
SkMatrix GetRootTransformation() const override;
diff --git a/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm
index 32b2f28..94f77a1 100644
--- a/shell/gpu/gpu_surface_metal_impeller.mm
+++ b/shell/gpu/gpu_surface_metal_impeller.mm
@@ -29,14 +29,11 @@
}
GPUSurfaceMetalImpeller::GPUSurfaceMetalImpeller(GPUSurfaceMetalDelegate* delegate,
- const std::shared_ptr<impeller::Context>& context,
- bool render_to_surface)
+ const std::shared_ptr<impeller::Context>& context)
: delegate_(delegate),
- render_target_type_(delegate->GetRenderTargetType()),
impeller_renderer_(CreateImpellerRenderer(context)),
aiks_context_(
- std::make_shared<impeller::AiksContext>(impeller_renderer_ ? context : nullptr)),
- render_to_surface_(render_to_surface) {
+ std::make_shared<impeller::AiksContext>(impeller_renderer_ ? context : nullptr)) {
// If this preference is explicitly set, we allow for disabling partial repaint.
NSNumber* disablePartialRepaint =
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"FLTDisablePartialRepaint"];
@@ -53,7 +50,7 @@
}
// |Surface|
-std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrame(const SkISize& frame_size) {
+std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrame(const SkISize& frame_info) {
TRACE_EVENT0("impeller", "GPUSurfaceMetalImpeller::AcquireFrame");
if (!IsValid()) {
@@ -61,33 +58,7 @@
return nullptr;
}
- if (frame_size.isEmpty()) {
- FML_LOG(ERROR) << "Metal surface was asked for an empty frame.";
- return nullptr;
- }
-
- if (!render_to_surface_) {
- return std::make_unique<SurfaceFrame>(
- nullptr, SurfaceFrame::FramebufferInfo(),
- [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, frame_size);
- }
-
- switch (render_target_type_) {
- case MTLRenderTargetType::kCAMetalLayer:
- return AcquireFrameFromCAMetalLayer(frame_size);
- case MTLRenderTargetType::kMTLTexture:
- return AcquireFrameFromMTLTexture(frame_size);
- default:
- FML_CHECK(false) << "Unknown MTLRenderTargetType type.";
- }
-
- return nullptr;
-}
-
-std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromCAMetalLayer(
- const SkISize& frame_size) {
- auto layer = delegate_->GetCAMetalLayer(frame_size);
-
+ auto layer = delegate_->GetCAMetalLayer(frame_info);
if (!layer) {
FML_LOG(ERROR) << "Invalid CAMetalLayer given by the embedder.";
return nullptr;
@@ -98,16 +69,15 @@
auto drawable = impeller::SurfaceMTL::GetMetalDrawableAndValidate(
impeller_renderer_->GetContext(), mtl_layer);
if (Settings::kSurfaceDataAccessible) {
- last_texture_.reset([drawable.texture retain]);
+ last_drawable_.reset([drawable retain]);
}
- id<MTLTexture> last_texture = static_cast<id<MTLTexture>>(last_texture_);
+ id<CAMetalDrawable> metal_drawable = static_cast<id<CAMetalDrawable>>(last_drawable_);
SurfaceFrame::SubmitCallback submit_callback =
fml::MakeCopyable([this, //
renderer = impeller_renderer_, //
aiks_context = aiks_context_, //
- drawable, //
- last_texture //
+ metal_drawable //
](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool {
if (!aiks_context) {
return false;
@@ -120,7 +90,7 @@
}
if (!disable_partial_repaint_) {
- uintptr_t texture = reinterpret_cast<uintptr_t>(last_texture);
+ uintptr_t texture = reinterpret_cast<uintptr_t>(metal_drawable.texture);
for (auto& entry : damage_) {
if (entry.first != texture) {
@@ -141,8 +111,8 @@
buffer_damage->width(), buffer_damage->height());
}
- auto surface = impeller::SurfaceMTL::MakeFromMetalLayerDrawable(
- impeller_renderer_->GetContext(), drawable, clip_rect);
+ auto surface = impeller::SurfaceMTL::WrapCurrentMetalLayerDrawable(
+ impeller_renderer_->GetContext(), metal_drawable, clip_rect);
if (clip_rect && (clip_rect->size.width == 0 || clip_rect->size.height == 0)) {
return surface->Present();
@@ -168,7 +138,7 @@
if (!disable_partial_repaint_) {
// Provide accumulated damage to rasterizer (area in current framebuffer that lags behind
// front buffer)
- uintptr_t texture = reinterpret_cast<uintptr_t>(drawable.texture);
+ uintptr_t texture = reinterpret_cast<uintptr_t>(metal_drawable.texture);
auto i = damage_.find(texture);
if (i != damage_.end()) {
framebuffer_info.existing_damage = i->second;
@@ -179,107 +149,7 @@
return std::make_unique<SurfaceFrame>(nullptr, // surface
framebuffer_info, // framebuffer info
submit_callback, // submit callback
- frame_size, // frame size
- nullptr, // context result
- true // display list fallback
- );
-}
-
-std::unique_ptr<SurfaceFrame> GPUSurfaceMetalImpeller::AcquireFrameFromMTLTexture(
- const SkISize& frame_size) {
- GPUMTLTextureInfo texture_info = delegate_->GetMTLTexture(frame_size);
- id<MTLTexture> mtl_texture = (id<MTLTexture>)(texture_info.texture);
-
- if (!mtl_texture) {
- FML_LOG(ERROR) << "Invalid MTLTexture given by the embedder.";
- return nullptr;
- }
-
- if (Settings::kSurfaceDataAccessible) {
- last_texture_.reset([mtl_texture retain]);
- }
-
- SurfaceFrame::SubmitCallback submit_callback =
- fml::MakeCopyable([this, //
- renderer = impeller_renderer_, //
- aiks_context = aiks_context_, //
- texture_info, //
- mtl_texture, //
- delegate = delegate_ //
- ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool {
- if (!aiks_context) {
- return false;
- }
-
- auto display_list = surface_frame.BuildDisplayList();
- if (!display_list) {
- FML_LOG(ERROR) << "Could not build display list for surface frame.";
- return false;
- }
-
- if (!disable_partial_repaint_) {
- uintptr_t texture_ptr = reinterpret_cast<uintptr_t>(mtl_texture);
-
- for (auto& entry : damage_) {
- if (entry.first != texture_ptr) {
- // Accumulate damage for other framebuffers
- if (surface_frame.submit_info().frame_damage) {
- entry.second.join(*surface_frame.submit_info().frame_damage);
- }
- }
- }
- // Reset accumulated damage for current framebuffer
- damage_[texture_ptr] = SkIRect::MakeEmpty();
- }
-
- std::optional<impeller::IRect> clip_rect;
- if (surface_frame.submit_info().buffer_damage.has_value()) {
- auto buffer_damage = surface_frame.submit_info().buffer_damage;
- clip_rect = impeller::IRect::MakeXYWH(buffer_damage->x(), buffer_damage->y(),
- buffer_damage->width(), buffer_damage->height());
- }
-
- auto surface =
- impeller::SurfaceMTL::MakeFromTexture(renderer->GetContext(), mtl_texture, clip_rect);
-
- if (clip_rect && (clip_rect->size.width == 0 || clip_rect->size.height == 0)) {
- return surface->Present();
- }
-
- impeller::IRect cull_rect = surface->coverage();
- SkIRect sk_cull_rect = SkIRect::MakeWH(cull_rect.size.width, cull_rect.size.height);
- impeller::DlDispatcher impeller_dispatcher(cull_rect);
- display_list->Dispatch(impeller_dispatcher, sk_cull_rect);
- auto picture = impeller_dispatcher.EndRecordingAsPicture();
-
- return renderer->Render(
- std::move(surface),
- fml::MakeCopyable([aiks_context, picture = std::move(picture)](
- impeller::RenderTarget& render_target) -> bool {
- return aiks_context->Render(picture, render_target);
- }));
-
- delegate->PresentTexture(texture_info);
- });
-
- SurfaceFrame::FramebufferInfo framebuffer_info;
- framebuffer_info.supports_readback = true;
-
- if (!disable_partial_repaint_) {
- // Provide accumulated damage to rasterizer (area in current framebuffer that lags behind
- // front buffer)
- uintptr_t texture = reinterpret_cast<uintptr_t>(mtl_texture);
- auto i = damage_.find(texture);
- if (i != damage_.end()) {
- framebuffer_info.existing_damage = i->second;
- }
- framebuffer_info.supports_partial_repaint = true;
- }
-
- return std::make_unique<SurfaceFrame>(nullptr, // surface
- framebuffer_info, // framebuffer info
- submit_callback, // submit callback
- frame_size, // frame size
+ frame_info, // frame size
nullptr, // context result
true // display list fallback
);
@@ -318,10 +188,11 @@
}
Surface::SurfaceData GPUSurfaceMetalImpeller::GetSurfaceData() const {
- if (!(last_texture_ && [last_texture_ conformsToProtocol:@protocol(MTLTexture)])) {
+ if (!(last_drawable_ && [last_drawable_ conformsToProtocol:@protocol(CAMetalDrawable)])) {
return {};
}
- id<MTLTexture> texture = last_texture_.get();
+ id<CAMetalDrawable> metal_drawable = static_cast<id<CAMetalDrawable>>(last_drawable_);
+ id<MTLTexture> texture = metal_drawable.texture;
int bytesPerPixel = 0;
std::string pixel_format;
switch (texture.pixelFormat) {
diff --git a/shell/platform/android/external_view_embedder/external_view_embedder.cc b/shell/platform/android/external_view_embedder/external_view_embedder.cc
index d29a80e..f1d8af9 100644
--- a/shell/platform/android/external_view_embedder/external_view_embedder.cc
+++ b/shell/platform/android/external_view_embedder/external_view_embedder.cc
@@ -64,7 +64,6 @@
// |ExternalViewEmbedder|
void AndroidExternalViewEmbedder::SubmitFrame(
GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame) {
TRACE_EVENT0("flutter", "AndroidExternalViewEmbedder::SubmitFrame");
diff --git a/shell/platform/android/external_view_embedder/external_view_embedder.h b/shell/platform/android/external_view_embedder/external_view_embedder.h
index 33b8766..03bae5e 100644
--- a/shell/platform/android/external_view_embedder/external_view_embedder.h
+++ b/shell/platform/android/external_view_embedder/external_view_embedder.h
@@ -46,7 +46,6 @@
// |ExternalViewEmbedder|
void SubmitFrame(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame) override;
// |ExternalViewEmbedder|
diff --git a/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc b/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc
index e6417a0..3c08eef 100644
--- a/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc
+++ b/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc
@@ -313,7 +313,7 @@
},
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
// Submits frame if no Android view in the current frame.
EXPECT_TRUE(did_submit_frame);
// Doesn't resubmit frame.
@@ -381,7 +381,7 @@
},
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
// Doesn't submit frame if there aren't Android views in the previous frame.
EXPECT_FALSE(did_submit_frame);
// Resubmits frame.
@@ -446,7 +446,7 @@
return true;
},
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
// Submits frame if there are Android views in the previous frame.
EXPECT_TRUE(did_submit_frame);
// Doesn't resubmit frame.
@@ -553,7 +553,7 @@
},
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
@@ -656,7 +656,7 @@
},
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
@@ -724,7 +724,7 @@
},
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
@@ -825,7 +825,7 @@
return true;
},
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
@@ -912,7 +912,7 @@
return true;
},
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
@@ -1023,7 +1023,7 @@
SkSurfaces::Null(1000, 1000), framebuffer_info,
[](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
- embedder->SubmitFrame(gr_context.get(), nullptr, std::move(surface_frame));
+ embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h
index d83b435..3893cce 100644
--- a/shell/platform/darwin/ios/ios_external_view_embedder.h
+++ b/shell/platform/darwin/ios/ios_external_view_embedder.h
@@ -51,7 +51,6 @@
// |ExternalViewEmbedder|
void SubmitFrame(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame) override;
// |ExternalViewEmbedder|
diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm
index 67112e9..4e28b6c 100644
--- a/shell/platform/darwin/ios/ios_external_view_embedder.mm
+++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm
@@ -66,10 +66,8 @@
}
// |ExternalViewEmbedder|
-void IOSExternalViewEmbedder::SubmitFrame(
- GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
- std::unique_ptr<SurfaceFrame> frame) {
+void IOSExternalViewEmbedder::SubmitFrame(GrDirectContext* context,
+ std::unique_ptr<SurfaceFrame> frame) {
TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::SubmitFrame");
FML_CHECK(platform_views_controller_);
platform_views_controller_->SubmitFrame(context, ios_context_, std::move(frame));
diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn
index aa43f3f..9c827ac 100644
--- a/shell/platform/embedder/BUILD.gn
+++ b/shell/platform/embedder/BUILD.gn
@@ -5,7 +5,6 @@
import("//build/toolchain/clang.gni")
import("//flutter/build/zip_bundle.gni")
import("//flutter/common/config.gni")
-import("//flutter/impeller/tools/impeller.gni")
import("//flutter/shell/gpu/gpu.gni")
import("//flutter/shell/platform/embedder/embedder.gni")
import("//flutter/testing/testing.gni")
@@ -76,8 +75,6 @@
"embedder_render_target.h",
"embedder_render_target_cache.cc",
"embedder_render_target_cache.h",
- "embedder_render_target_skia.cc",
- "embedder_render_target_skia.h",
"embedder_struct_macros.h",
"embedder_surface.cc",
"embedder_surface.h",
@@ -94,8 +91,6 @@
"vsync_waiter_embedder.h",
]
- public_deps = [ ":embedder_headers" ]
-
if (embedder_enable_gl) {
sources += [
"embedder_external_texture_gl.cc",
@@ -121,15 +116,6 @@
"//third_party/skia",
]
- if (impeller_supports_rendering) {
- sources += [
- "embedder_render_target_impeller.cc",
- "embedder_render_target_impeller.h",
- ]
-
- deps += [ "//flutter/impeller" ]
- }
-
if (embedder_enable_metal) {
sources += [
"embedder_external_texture_metal.h",
@@ -138,13 +124,6 @@
"embedder_surface_metal.mm",
]
- if (impeller_supports_rendering) {
- sources += [
- "embedder_surface_metal_impeller.h",
- "embedder_surface_metal_impeller.mm",
- ]
- }
-
cflags_objc = flutter_cflags_objc
cflags_objcc = flutter_cflags_objcc
@@ -163,11 +142,12 @@
]
}
+ public_deps = [ ":embedder_headers" ]
+
public_configs += [
":embedder_gpu_configuration_config",
":embedder_header_config",
"//flutter:config",
- "//flutter/impeller:impeller_public_config",
]
}
}
diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc
index 7e026d8..3090f58 100644
--- a/shell/platform/embedder/embedder.cc
+++ b/shell/platform/embedder/embedder.cc
@@ -54,7 +54,6 @@
#include "flutter/shell/platform/embedder/embedder_external_texture_resolver.h"
#include "flutter/shell/platform/embedder/embedder_platform_message_response.h"
#include "flutter/shell/platform/embedder/embedder_render_target.h"
-#include "flutter/shell/platform/embedder/embedder_render_target_skia.h"
#include "flutter/shell/platform/embedder/embedder_struct_macros.h"
#include "flutter/shell/platform/embedder/embedder_task_runner.h"
#include "flutter/shell/platform/embedder/embedder_thread_host.h"
@@ -69,14 +68,7 @@
#ifdef SHELL_ENABLE_METAL
#include "flutter/shell/platform/embedder/embedder_surface_metal.h"
-#ifdef IMPELLER_SUPPORTS_RENDERING
-#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" // nogncheck
-#include "flutter/shell/platform/embedder/embedder_surface_metal_impeller.h" // nogncheck
-#include "impeller/core/texture.h" // nogncheck
-#include "impeller/renderer/backend/metal/texture_wrapper_mtl.h" // nogncheck
-#include "impeller/renderer/render_target.h" // nogncheck
-#endif // IMPELLER_SUPPORTS_RENDERING
-#endif // SHELL_ENABLE_METAL
+#endif
const int32_t kFlutterSemanticsNodeIdBatchEnd = -1;
const int32_t kFlutterSemanticsCustomActionIdBatchEnd = -1;
@@ -460,8 +452,7 @@
const flutter::PlatformViewEmbedder::PlatformDispatchTable&
platform_dispatch_table,
std::unique_ptr<flutter::EmbedderExternalViewEmbedder>
- external_view_embedder,
- bool enable_impeller) {
+ external_view_embedder) {
if (config->type != kMetal) {
return nullptr;
}
@@ -495,33 +486,20 @@
return texture_info;
};
+ flutter::EmbedderSurfaceMetal::MetalDispatchTable metal_dispatch_table = {
+ .present = metal_present,
+ .get_texture = metal_get_texture,
+ };
+
std::shared_ptr<flutter::EmbedderExternalViewEmbedder> view_embedder =
std::move(external_view_embedder);
- std::unique_ptr<flutter::EmbedderSurface> embedder_surface;
-
- if (enable_impeller) {
- flutter::EmbedderSurfaceMetalImpeller::MetalDispatchTable
- metal_dispatch_table = {
- .present = metal_present,
- .get_texture = metal_get_texture,
- };
- embedder_surface = std::make_unique<flutter::EmbedderSurfaceMetalImpeller>(
- const_cast<flutter::GPUMTLDeviceHandle>(config->metal.device),
- const_cast<flutter::GPUMTLCommandQueueHandle>(
- config->metal.present_command_queue),
- metal_dispatch_table, view_embedder);
- } else {
- flutter::EmbedderSurfaceMetal::MetalDispatchTable metal_dispatch_table = {
- .present = metal_present,
- .get_texture = metal_get_texture,
- };
- embedder_surface = std::make_unique<flutter::EmbedderSurfaceMetal>(
- const_cast<flutter::GPUMTLDeviceHandle>(config->metal.device),
- const_cast<flutter::GPUMTLCommandQueueHandle>(
- config->metal.present_command_queue),
- metal_dispatch_table, view_embedder);
- }
+ std::unique_ptr<flutter::EmbedderSurfaceMetal> embedder_surface =
+ std::make_unique<flutter::EmbedderSurfaceMetal>(
+ const_cast<flutter::GPUMTLDeviceHandle>(config->metal.device),
+ const_cast<flutter::GPUMTLCommandQueueHandle>(
+ config->metal.present_command_queue),
+ metal_dispatch_table, view_embedder);
// The static leak checker gets confused by the use of fml::MakeCopyable.
// NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
@@ -672,8 +650,7 @@
const flutter::PlatformViewEmbedder::PlatformDispatchTable&
platform_dispatch_table,
std::unique_ptr<flutter::EmbedderExternalViewEmbedder>
- external_view_embedder,
- bool enable_impeller) {
+ external_view_embedder) {
if (config == nullptr) {
return nullptr;
}
@@ -690,7 +667,7 @@
case kMetal:
return InferMetalPlatformViewCreationCallback(
config, user_data, platform_dispatch_table,
- std::move(external_view_embedder), enable_impeller);
+ std::move(external_view_embedder));
case kVulkan:
return InferVulkanPlatformViewCreationCallback(
config, user_data, platform_dispatch_table,
@@ -920,76 +897,6 @@
#endif
}
-static std::unique_ptr<flutter::EmbedderRenderTarget>
-MakeRenderTargetFromBackingStoreImpeller(
- FlutterBackingStore backing_store,
- const fml::closure& on_release,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
- const FlutterBackingStoreConfig& config,
- const FlutterMetalBackingStore* metal) {
-#if defined(SHELL_ENABLE_METAL) && defined(IMPELLER_SUPPORTS_RENDERING)
- if (!metal->texture.texture) {
- FML_LOG(ERROR) << "Embedder supplied null Metal texture.";
- return nullptr;
- }
-
- const auto size = impeller::ISize(config.size.width, config.size.height);
-
- impeller::TextureDescriptor resolve_tex_desc;
- resolve_tex_desc.size = size;
- resolve_tex_desc.sample_count = impeller::SampleCount::kCount1;
- resolve_tex_desc.storage_mode = impeller::StorageMode::kDevicePrivate;
- resolve_tex_desc.usage =
- static_cast<uint64_t>(impeller::TextureUsage::kRenderTarget) |
- static_cast<uint64_t>(impeller::TextureUsage::kShaderRead);
-
- auto resolve_tex = impeller::WrapTextureMTL(
- resolve_tex_desc, metal->texture.texture,
- [callback = metal->texture.destruction_callback,
- user_data = metal->texture.user_data]() { callback(user_data); });
- if (!resolve_tex) {
- FML_LOG(ERROR) << "Could not wrap embedder supplied Metal render texture.";
- return nullptr;
- }
- resolve_tex->SetLabel("ImpellerBackingStoreResolve");
-
- impeller::TextureDescriptor msaa_tex_desc;
- msaa_tex_desc.storage_mode = impeller::StorageMode::kDeviceTransient;
- msaa_tex_desc.type = impeller::TextureType::kTexture2DMultisample;
- msaa_tex_desc.sample_count = impeller::SampleCount::kCount4;
- msaa_tex_desc.format = resolve_tex->GetTextureDescriptor().format;
- msaa_tex_desc.size = size;
- msaa_tex_desc.usage =
- static_cast<uint64_t>(impeller::TextureUsage::kRenderTarget);
-
- auto msaa_tex =
- aiks_context->GetContext()->GetResourceAllocator()->CreateTexture(
- msaa_tex_desc);
- if (!msaa_tex) {
- FML_LOG(ERROR) << "Could not allocate MSAA color texture.";
- return nullptr;
- }
- msaa_tex->SetLabel("ImpellerBackingStoreColorMSAA");
-
- impeller::ColorAttachment color0;
- color0.texture = msaa_tex;
- color0.clear_color = impeller::Color::DarkSlateGray();
- color0.load_action = impeller::LoadAction::kClear;
- color0.store_action = impeller::StoreAction::kMultisampleResolve;
- color0.resolve_texture = resolve_tex;
-
- impeller::RenderTarget render_target_desc;
- render_target_desc.SetColorAttachment(color0, 0u);
-
- return std::make_unique<flutter::EmbedderRenderTargetImpeller>(
- backing_store, aiks_context,
- std::make_unique<impeller::RenderTarget>(std::move(render_target_desc)),
- on_release);
-#else
- return nullptr;
-#endif
-}
-
static sk_sp<SkSurface> MakeSkSurfaceFromBackingStore(
GrDirectContext* context,
const FlutterBackingStoreConfig& config,
@@ -1044,23 +951,9 @@
}
static std::unique_ptr<flutter::EmbedderRenderTarget>
-MakeRenderTargetFromSkSurface(FlutterBackingStore backing_store,
- sk_sp<SkSurface> skia_surface,
- fml::closure on_release) {
- if (!skia_surface) {
- return nullptr;
- }
- return std::make_unique<flutter::EmbedderRenderTargetSkia>(
- backing_store, std::move(skia_surface), std::move(on_release));
-}
-
-static std::unique_ptr<flutter::EmbedderRenderTarget>
-CreateEmbedderRenderTarget(
- const FlutterCompositor* compositor,
- const FlutterBackingStoreConfig& config,
- GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
- bool enable_impeller) {
+CreateEmbedderRenderTarget(const FlutterCompositor* compositor,
+ const FlutterBackingStoreConfig& config,
+ GrDirectContext* context) {
FlutterBackingStore backing_store = {};
backing_store.struct_size = sizeof(backing_store);
@@ -1095,77 +988,53 @@
// No safe access checks on the renderer are necessary since we allocated
// the struct.
- std::unique_ptr<flutter::EmbedderRenderTarget> render_target;
+ sk_sp<SkSurface> render_surface;
switch (backing_store.type) {
- case kFlutterBackingStoreTypeOpenGL: {
+ case kFlutterBackingStoreTypeOpenGL:
switch (backing_store.open_gl.type) {
- case kFlutterOpenGLTargetTypeTexture: {
- auto skia_surface = MakeSkSurfaceFromBackingStore(
+ case kFlutterOpenGLTargetTypeTexture:
+ render_surface = MakeSkSurfaceFromBackingStore(
context, config, &backing_store.open_gl.texture);
- render_target = MakeRenderTargetFromSkSurface(
- backing_store, std::move(skia_surface),
- collect_callback.Release());
break;
- }
- case kFlutterOpenGLTargetTypeFramebuffer: {
- auto skia_surface = MakeSkSurfaceFromBackingStore(
+ case kFlutterOpenGLTargetTypeFramebuffer:
+ render_surface = MakeSkSurfaceFromBackingStore(
context, config, &backing_store.open_gl.framebuffer);
- render_target = MakeRenderTargetFromSkSurface(
- backing_store, std::move(skia_surface),
- collect_callback.Release());
break;
- }
}
break;
- }
- case kFlutterBackingStoreTypeSoftware: {
- auto skia_surface = MakeSkSurfaceFromBackingStore(
- context, config, &backing_store.software);
- render_target = MakeRenderTargetFromSkSurface(
- backing_store, std::move(skia_surface), collect_callback.Release());
+ case kFlutterBackingStoreTypeSoftware:
+ render_surface = MakeSkSurfaceFromBackingStore(context, config,
+ &backing_store.software);
break;
- }
- case kFlutterBackingStoreTypeSoftware2: {
- auto skia_surface = MakeSkSurfaceFromBackingStore(
- context, config, &backing_store.software2);
- render_target = MakeRenderTargetFromSkSurface(
- backing_store, std::move(skia_surface), collect_callback.Release());
+ case kFlutterBackingStoreTypeSoftware2:
+ render_surface = MakeSkSurfaceFromBackingStore(context, config,
+ &backing_store.software2);
break;
- }
- case kFlutterBackingStoreTypeMetal: {
- if (enable_impeller) {
- auto impeller_target = MakeRenderTargetFromBackingStoreImpeller(
- backing_store, collect_callback.Release(), aiks_context, config,
- &backing_store.metal);
- } else {
- auto skia_surface = MakeSkSurfaceFromBackingStore(context, config,
- &backing_store.metal);
- render_target = MakeRenderTargetFromSkSurface(
- backing_store, std::move(skia_surface), collect_callback.Release());
- }
+ case kFlutterBackingStoreTypeMetal:
+ render_surface =
+ MakeSkSurfaceFromBackingStore(context, config, &backing_store.metal);
break;
- }
- case kFlutterBackingStoreTypeVulkan: {
- auto skia_surface =
+
+ case kFlutterBackingStoreTypeVulkan:
+ render_surface =
MakeSkSurfaceFromBackingStore(context, config, &backing_store.vulkan);
- render_target = MakeRenderTargetFromSkSurface(
- backing_store, std::move(skia_surface), collect_callback.Release());
break;
- }
};
- if (!render_target) {
+ if (!render_surface) {
FML_LOG(ERROR) << "Could not create a surface from an embedder provided "
"render target.";
+ return nullptr;
}
- return render_target;
+
+ return std::make_unique<flutter::EmbedderRenderTarget>(
+ backing_store, std::move(render_surface), collect_callback.Release());
}
static std::pair<std::unique_ptr<flutter::EmbedderExternalViewEmbedder>,
bool /* halt engine launch if true */>
-InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor,
- bool enable_impeller) {
+InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor) {
if (compositor == nullptr) {
return {nullptr, false};
}
@@ -1189,13 +1058,9 @@
flutter::EmbedderExternalViewEmbedder::CreateRenderTargetCallback
create_render_target_callback =
- [captured_compositor, enable_impeller](
- GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
- const auto& config) {
+ [captured_compositor](GrDirectContext* context, const auto& config) {
return CreateEmbedderRenderTarget(&captured_compositor, config,
- context, aiks_context,
- enable_impeller);
+ context);
};
flutter::EmbedderExternalViewEmbedder::PresentCallback present_callback =
@@ -1947,8 +1812,8 @@
user_data]() { return ptr(user_data); };
}
- auto external_view_embedder_result = InferExternalViewEmbedderFromArgs(
- SAFE_ACCESS(args, compositor, nullptr), settings.enable_impeller);
+ auto external_view_embedder_result =
+ InferExternalViewEmbedderFromArgs(SAFE_ACCESS(args, compositor, nullptr));
if (external_view_embedder_result.second) {
return LOG_EMBEDDER_ERROR(kInvalidArguments,
"Compositor arguments were invalid.");
@@ -1965,7 +1830,7 @@
auto on_create_platform_view = InferPlatformViewCreationCallback(
config, user_data, platform_dispatch_table,
- std::move(external_view_embedder_result.first), settings.enable_impeller);
+ std::move(external_view_embedder_result.first));
if (!on_create_platform_view) {
return LOG_EMBEDDER_ERROR(
diff --git a/shell/platform/embedder/embedder_external_view.cc b/shell/platform/embedder/embedder_external_view.cc
index fe013ef..cd72a3e 100644
--- a/shell/platform/embedder/embedder_external_view.cc
+++ b/shell/platform/embedder/embedder_external_view.cc
@@ -3,15 +3,9 @@
// found in the LICENSE file.
#include "flutter/shell/platform/embedder/embedder_external_view.h"
-
-#include "flutter/display_list/dl_builder.h"
#include "flutter/fml/trace_event.h"
#include "flutter/shell/common/dl_op_spy.h"
-#ifdef IMPELLER_SUPPORTS_RENDERING
-#include "impeller/display_list/dl_dispatcher.h"
-#endif // IMPELLER_SUPPORTS_RENDERING
-
namespace flutter {
static SkISize TransformedSurfaceSize(const SkISize& size,
@@ -89,30 +83,15 @@
<< "Unnecessarily asked to render into a render target when there was "
"nothing to render.";
-#ifdef IMPELLER_SUPPORTS_RENDERING
- auto* impeller_target = render_target.GetImpellerRenderTarget();
- if (impeller_target) {
- auto aiks_context = render_target.GetAiksContext();
-
- auto dl_builder = DisplayListBuilder();
- dl_builder.SetTransform(&surface_transformation_);
- slice_->render_into(&dl_builder);
-
- auto dispatcher = impeller::DlDispatcher();
- dispatcher.drawDisplayList(dl_builder.Build(), 1);
- return aiks_context->Render(dispatcher.EndRecordingAsPicture(),
- *impeller_target);
- }
-#endif // IMPELLER_SUPPORTS_RENDERING
-
- auto skia_surface = render_target.GetSkiaSurface();
- if (!skia_surface) {
+ auto surface = render_target.GetRenderSurface();
+ if (!surface) {
return false;
}
- FML_DCHECK(render_target.GetRenderTargetSize() == render_surface_size_);
+ FML_DCHECK(SkISize::Make(surface->width(), surface->height()) ==
+ render_surface_size_);
- auto canvas = skia_surface->getCanvas();
+ auto canvas = surface->getCanvas();
if (!canvas) {
return false;
}
diff --git a/shell/platform/embedder/embedder_external_view_embedder.cc b/shell/platform/embedder/embedder_external_view_embedder.cc
index f87d451..e487009 100644
--- a/shell/platform/embedder/embedder_external_view_embedder.cc
+++ b/shell/platform/embedder/embedder_external_view_embedder.cc
@@ -125,7 +125,6 @@
// |ExternalViewEmbedder|
void EmbedderExternalViewEmbedder::SubmitFrame(
GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame) {
auto [matched_render_targets, pending_keys] =
render_target_cache_.GetExistingTargetsInCache(pending_views_);
@@ -173,8 +172,8 @@
// the context must be reset.
//
// @warning: Embedder may trample on our OpenGL context here.
- auto render_target = create_render_target_callback_(context, aiks_context,
- backing_store_config);
+ auto render_target =
+ create_render_target_callback_(context, backing_store_config);
if (!render_target) {
FML_LOG(ERROR) << "Embedder did not return a valid render target.";
diff --git a/shell/platform/embedder/embedder_external_view_embedder.h b/shell/platform/embedder/embedder_external_view_embedder.h
index 014f739..55a08f0 100644
--- a/shell/platform/embedder/embedder_external_view_embedder.h
+++ b/shell/platform/embedder/embedder_external_view_embedder.h
@@ -6,7 +6,6 @@
#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_EXTERNAL_VIEW_EMBEDDER_H_
#include <map>
-#include <memory>
#include <unordered_map>
#include "flutter/flow/embedded_views.h"
@@ -32,7 +31,6 @@
using CreateRenderTargetCallback =
std::function<std::unique_ptr<EmbedderRenderTarget>(
GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
const FlutterBackingStoreConfig& config)>;
using PresentCallback =
std::function<bool(const std::vector<const FlutterLayer*>& layers)>;
@@ -97,7 +95,6 @@
// |ExternalViewEmbedder|
void SubmitFrame(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame) override;
// |ExternalViewEmbedder|
diff --git a/shell/platform/embedder/embedder_render_target.cc b/shell/platform/embedder/embedder_render_target.cc
index 69259e3..5d6d228 100644
--- a/shell/platform/embedder/embedder_render_target.cc
+++ b/shell/platform/embedder/embedder_render_target.cc
@@ -4,17 +4,24 @@
#include "flutter/shell/platform/embedder/embedder_render_target.h"
-#include <optional>
#include <utility>
+#include "flutter/fml/logging.h"
+
+#include "third_party/skia/include/core/SkSurface.h"
+
namespace flutter {
EmbedderRenderTarget::EmbedderRenderTarget(FlutterBackingStore backing_store,
+ sk_sp<SkSurface> render_surface,
fml::closure on_release)
- : backing_store_(backing_store), on_release_(std::move(on_release)) {
+ : backing_store_(backing_store),
+ render_surface_(std::move(render_surface)),
+ on_release_(std::move(on_release)) {
// TODO(38468): The optimization to elide backing store updates between frames
// has not been implemented yet.
backing_store_.did_update = true;
+ FML_DCHECK(render_surface_);
}
EmbedderRenderTarget::~EmbedderRenderTarget() {
@@ -27,4 +34,8 @@
return &backing_store_;
}
+sk_sp<SkSurface> EmbedderRenderTarget::GetRenderSurface() const {
+ return render_surface_;
+}
+
} // namespace flutter
diff --git a/shell/platform/embedder/embedder_render_target.h b/shell/platform/embedder/embedder_render_target.h
index cfbb67c..8afbed3 100644
--- a/shell/platform/embedder/embedder_render_target.h
+++ b/shell/platform/embedder/embedder_render_target.h
@@ -5,18 +5,12 @@
#ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_H_
#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_H_
-#include <memory>
#include "flutter/fml/closure.h"
#include "flutter/fml/macros.h"
#include "flutter/shell/platform/embedder/embedder.h"
-#include "third_party/skia/include/core/SkSize.h"
+#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h"
-namespace impeller {
-class RenderTarget;
-class AiksContext;
-} // namespace impeller
-
namespace flutter {
//------------------------------------------------------------------------------
@@ -28,11 +22,28 @@
class EmbedderRenderTarget {
public:
//----------------------------------------------------------------------------
+ /// @brief Creates a render target whose backing store is managed by the
+ /// embedder. The way this render target is exposed to the engine
+ /// is via an SkSurface and a callback that is invoked by this
+ /// object in its destructor.
+ ///
+ /// @param[in] backing_store The backing store describing this render
+ /// target.
+ /// @param[in] render_surface The surface for this target.
+ /// @param[in] on_release The callback to invoke (eventually forwarded
+ /// to the embedder) when the backing store is no
+ /// longer required by the engine.
+ ///
+ EmbedderRenderTarget(FlutterBackingStore backing_store,
+ sk_sp<SkSurface> render_surface,
+ fml::closure on_release);
+
+ //----------------------------------------------------------------------------
/// @brief Destroys this instance of the render target and invokes the
/// callback for the embedder to release its resource associated
/// with the particular backing store.
///
- virtual ~EmbedderRenderTarget();
+ ~EmbedderRenderTarget();
//----------------------------------------------------------------------------
/// @brief A render surface the rasterizer can use to draw into the
@@ -40,30 +51,7 @@
///
/// @return The render surface.
///
- virtual sk_sp<SkSurface> GetSkiaSurface() const = 0;
-
- //----------------------------------------------------------------------------
- /// @brief An impeller render target the rasterizer can use to draw into
- /// the backing store.
- ///
- /// @return The Impeller render target.
- ///
- virtual impeller::RenderTarget* GetImpellerRenderTarget() const = 0;
-
- //----------------------------------------------------------------------------
- /// @brief Returns the AiksContext that should be used for rendering, if
- /// this render target is backed by Impeller.
- ///
- /// @return The Impeller Aiks context.
- ///
- virtual std::shared_ptr<impeller::AiksContext> GetAiksContext() const = 0;
-
- //----------------------------------------------------------------------------
- /// @brief Returns the size of the render target.
- ///
- /// @return The size of the render target.
- ///
- virtual SkISize GetRenderTargetSize() const = 0;
+ sk_sp<SkSurface> GetRenderSurface() const;
//----------------------------------------------------------------------------
/// @brief The embedder backing store descriptor. This is the descriptor
@@ -77,25 +65,9 @@
///
const FlutterBackingStore* GetBackingStore() const;
- protected:
- //----------------------------------------------------------------------------
- /// @brief Creates a render target whose backing store is managed by the
- /// embedder. The way this render target is exposed to the engine
- /// is via an SkSurface and a callback that is invoked by this
- /// object in its destructor.
- ///
- /// @param[in] backing_store The backing store describing this render
- /// target.
- /// @param[in] on_release The callback to invoke (eventually forwarded
- /// to the embedder) when the backing store is no
- /// longer required by the engine.
- ///
- EmbedderRenderTarget(FlutterBackingStore backing_store,
- fml::closure on_release);
-
private:
FlutterBackingStore backing_store_;
-
+ sk_sp<SkSurface> render_surface_;
fml::closure on_release_;
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderRenderTarget);
diff --git a/shell/platform/embedder/embedder_render_target_cache.cc b/shell/platform/embedder/embedder_render_target_cache.cc
index 3d0e6b4..1347b03 100644
--- a/shell/platform/embedder/embedder_render_target_cache.cc
+++ b/shell/platform/embedder/embedder_render_target_cache.cc
@@ -56,8 +56,9 @@
if (target == nullptr) {
return;
}
+ auto surface = target->GetRenderSurface();
auto desc = EmbedderExternalView::RenderTargetDescriptor{
- view_identifier, target->GetRenderTargetSize()};
+ view_identifier, SkISize::Make(surface->width(), surface->height())};
cached_render_targets_[desc].push(std::move(target));
}
diff --git a/shell/platform/embedder/embedder_render_target_impeller.cc b/shell/platform/embedder/embedder_render_target_impeller.cc
deleted file mode 100644
index 44f23b6..0000000
--- a/shell/platform/embedder/embedder_render_target_impeller.cc
+++ /dev/null
@@ -1,45 +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 "flutter/shell/platform/embedder/embedder_render_target_impeller.h"
-
-#include "flutter/fml/logging.h"
-#include "flutter/impeller/renderer/render_target.h"
-
-namespace flutter {
-
-EmbedderRenderTargetImpeller::EmbedderRenderTargetImpeller(
- FlutterBackingStore backing_store,
- std::shared_ptr<impeller::AiksContext> aiks_context,
- std::unique_ptr<impeller::RenderTarget> impeller_target,
- fml::closure on_release)
- : EmbedderRenderTarget(backing_store, std::move(on_release)),
- aiks_context_(std::move(aiks_context)),
- impeller_target_(std::move(impeller_target)) {
- FML_DCHECK(aiks_context_);
- FML_DCHECK(impeller_target_);
-}
-
-EmbedderRenderTargetImpeller::~EmbedderRenderTargetImpeller() = default;
-
-sk_sp<SkSurface> EmbedderRenderTargetImpeller::GetSkiaSurface() const {
- return nullptr;
-}
-
-impeller::RenderTarget* EmbedderRenderTargetImpeller::GetImpellerRenderTarget()
- const {
- return impeller_target_.get();
-}
-
-std::shared_ptr<impeller::AiksContext>
-EmbedderRenderTargetImpeller::GetAiksContext() const {
- return aiks_context_;
-}
-
-SkISize EmbedderRenderTargetImpeller::GetRenderTargetSize() const {
- auto size = impeller_target_->GetRenderTargetSize();
- return SkISize::Make(size.width, size.height);
-}
-
-} // namespace flutter
diff --git a/shell/platform/embedder/embedder_render_target_impeller.h b/shell/platform/embedder/embedder_render_target_impeller.h
deleted file mode 100644
index 2425402..0000000
--- a/shell/platform/embedder/embedder_render_target_impeller.h
+++ /dev/null
@@ -1,44 +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_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_IMPELLER_H_
-#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_IMPELLER_H_
-
-#include "flutter/shell/platform/embedder/embedder_render_target.h"
-
-namespace flutter {
-
-class EmbedderRenderTargetImpeller final : public EmbedderRenderTarget {
- public:
- EmbedderRenderTargetImpeller(
- FlutterBackingStore backing_store,
- std::shared_ptr<impeller::AiksContext> aiks_context,
- std::unique_ptr<impeller::RenderTarget> impeller_target,
- fml::closure on_release);
-
- // |EmbedderRenderTarget|
- ~EmbedderRenderTargetImpeller() override;
-
- // |EmbedderRenderTarget|
- sk_sp<SkSurface> GetSkiaSurface() const override;
-
- // |EmbedderRenderTarget|
- impeller::RenderTarget* GetImpellerRenderTarget() const override;
-
- // |EmbedderRenderTarget|
- std::shared_ptr<impeller::AiksContext> GetAiksContext() const override;
-
- // |EmbedderRenderTarget|
- SkISize GetRenderTargetSize() const override;
-
- private:
- std::shared_ptr<impeller::AiksContext> aiks_context_;
- std::unique_ptr<impeller::RenderTarget> impeller_target_;
-
- FML_DISALLOW_COPY_AND_ASSIGN(EmbedderRenderTargetImpeller);
-};
-
-} // namespace flutter
-
-#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_IMPELLER_H_
diff --git a/shell/platform/embedder/embedder_render_target_skia.cc b/shell/platform/embedder/embedder_render_target_skia.cc
deleted file mode 100644
index e8d60ca..0000000
--- a/shell/platform/embedder/embedder_render_target_skia.cc
+++ /dev/null
@@ -1,40 +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 "flutter/shell/platform/embedder/embedder_render_target_skia.h"
-
-#include "flutter/fml/logging.h"
-
-namespace flutter {
-
-EmbedderRenderTargetSkia::EmbedderRenderTargetSkia(
- FlutterBackingStore backing_store,
- sk_sp<SkSurface> render_surface,
- fml::closure on_release)
- : EmbedderRenderTarget(backing_store, std::move(on_release)),
- render_surface_(std::move(render_surface)) {
- FML_DCHECK(render_surface_);
-}
-
-EmbedderRenderTargetSkia::~EmbedderRenderTargetSkia() = default;
-
-sk_sp<SkSurface> EmbedderRenderTargetSkia::GetSkiaSurface() const {
- return render_surface_;
-}
-
-impeller::RenderTarget* EmbedderRenderTargetSkia::GetImpellerRenderTarget()
- const {
- return nullptr;
-}
-
-std::shared_ptr<impeller::AiksContext>
-EmbedderRenderTargetSkia::GetAiksContext() const {
- return nullptr;
-}
-
-SkISize EmbedderRenderTargetSkia::GetRenderTargetSize() const {
- return SkISize::Make(render_surface_->width(), render_surface_->height());
-}
-
-} // namespace flutter
diff --git a/shell/platform/embedder/embedder_render_target_skia.h b/shell/platform/embedder/embedder_render_target_skia.h
deleted file mode 100644
index 2ccacfe..0000000
--- a/shell/platform/embedder/embedder_render_target_skia.h
+++ /dev/null
@@ -1,41 +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_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_SKIA_H_
-#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_SKIA_H_
-
-#include "flutter/shell/platform/embedder/embedder_render_target.h"
-
-namespace flutter {
-
-class EmbedderRenderTargetSkia final : public EmbedderRenderTarget {
- public:
- EmbedderRenderTargetSkia(FlutterBackingStore backing_store,
- sk_sp<SkSurface> render_surface,
- fml::closure on_release);
-
- // |EmbedderRenderTarget|
- ~EmbedderRenderTargetSkia() override;
-
- // |EmbedderRenderTarget|
- sk_sp<SkSurface> GetSkiaSurface() const override;
-
- // |EmbedderRenderTarget|
- impeller::RenderTarget* GetImpellerRenderTarget() const override;
-
- // |EmbedderRenderTarget|
- std::shared_ptr<impeller::AiksContext> GetAiksContext() const override;
-
- // |EmbedderRenderTarget|
- SkISize GetRenderTargetSize() const override;
-
- private:
- sk_sp<SkSurface> render_surface_;
-
- FML_DISALLOW_COPY_AND_ASSIGN(EmbedderRenderTargetSkia);
-};
-
-} // namespace flutter
-
-#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_SKIA_H_
diff --git a/shell/platform/embedder/embedder_surface.cc b/shell/platform/embedder/embedder_surface.cc
index 029833f..dbe619b 100644
--- a/shell/platform/embedder/embedder_surface.cc
+++ b/shell/platform/embedder/embedder_surface.cc
@@ -10,13 +10,4 @@
EmbedderSurface::~EmbedderSurface() = default;
-std::shared_ptr<impeller::Context> EmbedderSurface::CreateImpellerContext()
- const {
- return nullptr;
-}
-
-sk_sp<GrDirectContext> EmbedderSurface::CreateResourceContext() const {
- return nullptr;
-}
-
} // namespace flutter
diff --git a/shell/platform/embedder/embedder_surface.h b/shell/platform/embedder/embedder_surface.h
index 32873f1..ed8dbff 100644
--- a/shell/platform/embedder/embedder_surface.h
+++ b/shell/platform/embedder/embedder_surface.h
@@ -5,7 +5,6 @@
#ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SURFACE_H_
#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SURFACE_H_
-#include <memory>
#include "flutter/flow/embedded_views.h"
#include "flutter/flow/surface.h"
#include "flutter/fml/macros.h"
@@ -22,9 +21,7 @@
virtual std::unique_ptr<Surface> CreateGPUSurface() = 0;
- virtual std::shared_ptr<impeller::Context> CreateImpellerContext() const;
-
- virtual sk_sp<GrDirectContext> CreateResourceContext() const;
+ virtual sk_sp<GrDirectContext> CreateResourceContext() const = 0;
private:
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderSurface);
diff --git a/shell/platform/embedder/embedder_surface_metal_impeller.h b/shell/platform/embedder/embedder_surface_metal_impeller.h
deleted file mode 100644
index 4fb2b99..0000000
--- a/shell/platform/embedder/embedder_surface_metal_impeller.h
+++ /dev/null
@@ -1,70 +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_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SURFACE_METAL_IMPELLER_H_
-#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SURFACE_METAL_IMPELLER_H_
-
-#include <memory>
-#include "flutter/fml/macros.h"
-#include "flutter/shell/gpu/gpu_surface_metal_delegate.h"
-#include "flutter/shell/gpu/gpu_surface_metal_skia.h"
-#include "flutter/shell/platform/embedder/embedder_external_view_embedder.h"
-#include "flutter/shell/platform/embedder/embedder_surface.h"
-#include "fml/concurrent_message_loop.h"
-
-namespace impeller {
-class Context;
-}
-
-namespace flutter {
-
-class EmbedderSurfaceMetalImpeller final : public EmbedderSurface,
- public GPUSurfaceMetalDelegate {
- public:
- struct MetalDispatchTable {
- std::function<bool(GPUMTLTextureInfo texture)> present; // required
- std::function<GPUMTLTextureInfo(const SkISize& frame_size)>
- get_texture; // required
- };
-
- EmbedderSurfaceMetalImpeller(
- GPUMTLDeviceHandle device,
- GPUMTLCommandQueueHandle command_queue,
- MetalDispatchTable dispatch_table,
- std::shared_ptr<EmbedderExternalViewEmbedder> external_view_embedder);
-
- ~EmbedderSurfaceMetalImpeller() override;
-
- private:
- bool valid_ = false;
- MetalDispatchTable metal_dispatch_table_;
- std::shared_ptr<EmbedderExternalViewEmbedder> external_view_embedder_;
- std::shared_ptr<impeller::Context> context_;
- std::shared_ptr<fml::ConcurrentMessageLoop> concurrent_loop_;
-
- // |EmbedderSurface|
- bool IsValid() const override;
-
- // |EmbedderSurface|
- std::unique_ptr<Surface> CreateGPUSurface() override;
-
- // |GPUSurfaceMetalDelegate|
- GPUCAMetalLayerHandle GetCAMetalLayer(
- const SkISize& frame_size) const override;
-
- // |GPUSurfaceMetalDelegate|
- bool PresentDrawable(GrMTLHandle drawable) const override;
-
- // |GPUSurfaceMetalDelegate|
- GPUMTLTextureInfo GetMTLTexture(const SkISize& frame_size) const override;
-
- // |GPUSurfaceMetalDelegate|
- bool PresentTexture(GPUMTLTextureInfo texture) const override;
-
- FML_DISALLOW_COPY_AND_ASSIGN(EmbedderSurfaceMetalImpeller);
-};
-
-} // namespace flutter
-
-#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SURFACE_METAL_IMPELLER_H_
diff --git a/shell/platform/embedder/embedder_surface_metal_impeller.mm b/shell/platform/embedder/embedder_surface_metal_impeller.mm
deleted file mode 100644
index c7984f4..0000000
--- a/shell/platform/embedder/embedder_surface_metal_impeller.mm
+++ /dev/null
@@ -1,97 +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 <memory>
-#include <utility>
-
-#include "flutter/shell/platform/embedder/embedder_surface_metal_impeller.h"
-
-#include "flutter/fml/logging.h"
-#include "flutter/fml/synchronization/sync_switch.h"
-#include "flutter/shell/gpu/gpu_surface_metal_delegate.h"
-#include "flutter/shell/gpu/gpu_surface_metal_impeller.h"
-#import "flutter/shell/platform/darwin/graphics/FlutterDarwinContextMetalImpeller.h"
-#include "impeller/entity/mtl/entity_shaders.h"
-#include "impeller/entity/mtl/framebuffer_blend_shaders.h"
-#include "impeller/entity/mtl/modern_shaders.h"
-#include "impeller/renderer/backend/metal/context_mtl.h"
-#include "impeller/scene/shaders/mtl/scene_shaders.h"
-
-FLUTTER_ASSERT_NOT_ARC
-
-namespace flutter {
-
-EmbedderSurfaceMetalImpeller::EmbedderSurfaceMetalImpeller(
- GPUMTLDeviceHandle device,
- GPUMTLCommandQueueHandle command_queue,
- MetalDispatchTable metal_dispatch_table,
- std::shared_ptr<EmbedderExternalViewEmbedder> external_view_embedder)
- : GPUSurfaceMetalDelegate(MTLRenderTargetType::kMTLTexture),
- metal_dispatch_table_(std::move(metal_dispatch_table)),
- external_view_embedder_(std::move(external_view_embedder)),
- concurrent_loop_(fml::ConcurrentMessageLoop::Create()) {
- std::vector<std::shared_ptr<fml::Mapping>> shader_mappings = {
- std::make_shared<fml::NonOwnedMapping>(impeller_entity_shaders_data,
- impeller_entity_shaders_length),
- std::make_shared<fml::NonOwnedMapping>(impeller_scene_shaders_data,
- impeller_scene_shaders_length),
- std::make_shared<fml::NonOwnedMapping>(impeller_modern_shaders_data,
- impeller_modern_shaders_length),
- std::make_shared<fml::NonOwnedMapping>(impeller_framebuffer_blend_shaders_data,
- impeller_framebuffer_blend_shaders_length),
- };
- context_ = impeller::ContextMTL::Create(
- (id<MTLDevice>)device, // device
- (id<MTLCommandQueue>)command_queue, // command_queue
- shader_mappings, // shader_libraries_data
- concurrent_loop_->GetTaskRunner(), // worker_task_runner
- std::make_shared<fml::SyncSwitch>(false), // is_gpu_disabled_sync_switch
- "Impeller Library" // library_label
- );
-
- valid_ = !!context_;
-}
-
-EmbedderSurfaceMetalImpeller::~EmbedderSurfaceMetalImpeller() = default;
-
-bool EmbedderSurfaceMetalImpeller::IsValid() const {
- return valid_;
-}
-
-std::unique_ptr<Surface> EmbedderSurfaceMetalImpeller::CreateGPUSurface()
- IMPELLER_CA_METAL_LAYER_AVAILABLE {
- if (!IsValid()) {
- return nullptr;
- }
-
- const bool render_to_surface = !external_view_embedder_;
- auto surface = std::make_unique<GPUSurfaceMetalImpeller>(this, context_, render_to_surface);
-
- if (!surface->IsValid()) {
- return nullptr;
- }
-
- return surface;
-}
-
-GPUCAMetalLayerHandle EmbedderSurfaceMetalImpeller::GetCAMetalLayer(
- const SkISize& frame_info) const {
- FML_CHECK(false) << "Only rendering to MTLTexture is supported.";
- return nullptr;
-}
-
-bool EmbedderSurfaceMetalImpeller::PresentDrawable(GrMTLHandle drawable) const {
- FML_CHECK(false) << "Only rendering to MTLTexture is supported.";
- return false;
-}
-
-GPUMTLTextureInfo EmbedderSurfaceMetalImpeller::GetMTLTexture(const SkISize& frame_info) const {
- return metal_dispatch_table_.get_texture(frame_info);
-}
-
-bool EmbedderSurfaceMetalImpeller::PresentTexture(GPUMTLTextureInfo texture) const {
- return metal_dispatch_table_.present(texture);
-}
-
-} // namespace flutter
diff --git a/shell/platform/embedder/platform_view_embedder.cc b/shell/platform/embedder/platform_view_embedder.cc
index ccbe0fc..1cedc22 100644
--- a/shell/platform/embedder/platform_view_embedder.cc
+++ b/shell/platform/embedder/platform_view_embedder.cc
@@ -86,7 +86,7 @@
PlatformViewEmbedder::PlatformViewEmbedder(
PlatformView::Delegate& delegate,
const flutter::TaskRunners& task_runners,
- std::unique_ptr<EmbedderSurface> embedder_surface,
+ std::unique_ptr<EmbedderSurfaceMetal> embedder_surface,
PlatformDispatchTable platform_dispatch_table,
std::shared_ptr<EmbedderExternalViewEmbedder> external_view_embedder)
: PlatformView(delegate, task_runners),
@@ -157,11 +157,6 @@
return external_view_embedder_;
}
-std::shared_ptr<impeller::Context> PlatformViewEmbedder::GetImpellerContext()
- const {
- return embedder_surface_->CreateImpellerContext();
-}
-
// |PlatformView|
sk_sp<GrDirectContext> PlatformViewEmbedder::CreateResourceContext() const {
if (embedder_surface_ == nullptr) {
diff --git a/shell/platform/embedder/platform_view_embedder.h b/shell/platform/embedder/platform_view_embedder.h
index 87378b5..20f4dc1 100644
--- a/shell/platform/embedder/platform_view_embedder.h
+++ b/shell/platform/embedder/platform_view_embedder.h
@@ -76,7 +76,7 @@
PlatformViewEmbedder(
PlatformView::Delegate& delegate,
const flutter::TaskRunners& task_runners,
- std::unique_ptr<EmbedderSurface> embedder_surface,
+ std::unique_ptr<EmbedderSurfaceMetal> embedder_surface,
PlatformDispatchTable platform_dispatch_table,
std::shared_ptr<EmbedderExternalViewEmbedder> external_view_embedder);
#endif
@@ -119,9 +119,6 @@
std::shared_ptr<ExternalViewEmbedder> CreateExternalViewEmbedder() override;
// |PlatformView|
- std::shared_ptr<impeller::Context> GetImpellerContext() const override;
-
- // |PlatformView|
sk_sp<GrDirectContext> CreateResourceContext() const override;
// |PlatformView|
diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc
index 366b72b..901bd8c 100644
--- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc
+++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc
@@ -132,7 +132,6 @@
void FlatlandExternalViewEmbedder::SubmitFrame(
GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<flutter::SurfaceFrame> frame) {
TRACE_EVENT0("flutter", "FlatlandExternalViewEmbedder::SubmitFrame");
std::vector<std::unique_ptr<SurfaceProducerSurface>> frame_surfaces;
diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h
index 5a3142e..00a845c 100644
--- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h
+++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h
@@ -87,7 +87,6 @@
// |ExternalViewEmbedder|
void SubmitFrame(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<flutter::SurfaceFrame> frame) override;
// |ExternalViewEmbedder|
diff --git a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc
index 37e8d6a..21c6810 100644
--- a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc
+++ b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc
@@ -231,7 +231,6 @@
void GfxExternalViewEmbedder::SubmitFrame(
GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<flutter::SurfaceFrame> frame) {
TRACE_EVENT0("flutter", "GfxExternalViewEmbedder::SubmitFrame");
std::vector<std::unique_ptr<SurfaceProducerSurface>> frame_surfaces;
diff --git a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h
index 6d0bc30..eb37d2e 100644
--- a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h
+++ b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h
@@ -110,7 +110,6 @@
// |ExternalViewEmbedder|
void SubmitFrame(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<flutter::SurfaceFrame> frame) override;
// |ExternalViewEmbedder|
diff --git a/shell/platform/fuchsia/flutter/platform_view_unittest.cc b/shell/platform/fuchsia/flutter/platform_view_unittest.cc
index c0aa42e..4959461 100644
--- a/shell/platform/fuchsia/flutter/platform_view_unittest.cc
+++ b/shell/platform/fuchsia/flutter/platform_view_unittest.cc
@@ -54,7 +54,6 @@
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override {}
void SubmitFrame(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<flutter::SurfaceFrame> frame) override {}
void PrerollCompositeEmbeddedView(
diff --git a/shell/platform/fuchsia/flutter/tests/flatland_external_view_embedder_unittests.cc b/shell/platform/fuchsia/flutter/tests/flatland_external_view_embedder_unittests.cc
index 58af0cc..35f734d 100644
--- a/shell/platform/fuchsia/flutter/tests/flatland_external_view_embedder_unittests.cc
+++ b/shell/platform/fuchsia/flutter/tests/flatland_external_view_embedder_unittests.cc
@@ -335,12 +335,11 @@
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
framebuffer_info.supports_readback = true;
external_view_embedder.SubmitFrame(
- nullptr, nullptr,
- std::make_unique<flutter::SurfaceFrame>(
- nullptr, std::move(framebuffer_info),
- [](const flutter::SurfaceFrame& surface_frame,
- flutter::DlCanvas* canvas) { return true; },
- frame_size));
+ nullptr, std::make_unique<flutter::SurfaceFrame>(
+ nullptr, std::move(framebuffer_info),
+ [](const flutter::SurfaceFrame& surface_frame,
+ flutter::DlCanvas* canvas) { return true; },
+ frame_size));
}
void DrawFrameWithView(
@@ -366,12 +365,11 @@
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
framebuffer_info.supports_readback = true;
external_view_embedder.SubmitFrame(
- nullptr, nullptr,
- std::make_unique<flutter::SurfaceFrame>(
- nullptr, std::move(framebuffer_info),
- [](const flutter::SurfaceFrame& surface_frame,
- flutter::DlCanvas* canvas) { return true; },
- frame_size));
+ nullptr, std::make_unique<flutter::SurfaceFrame>(
+ nullptr, std::move(framebuffer_info),
+ [](const flutter::SurfaceFrame& surface_frame,
+ flutter::DlCanvas* canvas) { return true; },
+ frame_size));
}
}; // namespace
diff --git a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc
index 78f6f95..ce1d55f 100644
--- a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc
+++ b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc
@@ -53,7 +53,6 @@
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override {}
void SubmitFrame(GrDirectContext* context,
- const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<flutter::SurfaceFrame> frame) override {}
void PrerollCompositeEmbeddedView(
diff --git a/shell/platform/fuchsia/flutter/tests/gfx_external_view_embedder_unittests.cc b/shell/platform/fuchsia/flutter/tests/gfx_external_view_embedder_unittests.cc
index eba9a2d..77c04bb 100644
--- a/shell/platform/fuchsia/flutter/tests/gfx_external_view_embedder_unittests.cc
+++ b/shell/platform/fuchsia/flutter/tests/gfx_external_view_embedder_unittests.cc
@@ -458,12 +458,11 @@
external_view_embedder.EndFrame(false, nullptr);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
external_view_embedder.SubmitFrame(
- nullptr, nullptr,
- std::make_unique<flutter::SurfaceFrame>(
- nullptr, framebuffer_info,
- [](const flutter::SurfaceFrame& surface_frame,
- flutter::DlCanvas* canvas) { return true; },
- frame_size));
+ nullptr, std::make_unique<flutter::SurfaceFrame>(
+ nullptr, framebuffer_info,
+ [](const flutter::SurfaceFrame& surface_frame,
+ flutter::DlCanvas* canvas) { return true; },
+ frame_size));
}
void DrawFrameWithView(
@@ -488,12 +487,11 @@
external_view_embedder.EndFrame(false, nullptr);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
external_view_embedder.SubmitFrame(
- nullptr, nullptr,
- std::make_unique<flutter::SurfaceFrame>(
- nullptr, framebuffer_info,
- [](const flutter::SurfaceFrame& surface_frame,
- flutter::DlCanvas* canvas) { return true; },
- frame_size));
+ nullptr, std::make_unique<flutter::SurfaceFrame>(
+ nullptr, framebuffer_info,
+ [](const flutter::SurfaceFrame& surface_frame,
+ flutter::DlCanvas* canvas) { return true; },
+ frame_size));
}
FramePresentedInfo MakeFramePresentedInfoForOnePresent(