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(