[Impeller] Make Metal layers readable (#41085)
Resolves https://github.com/flutter/flutter/issues/124612.
Doing this would also allow us to remove the final blit on iOS when
advanced blends/backdrop filters are present (all of the facilities
would remain in place for GLES + Vulkan though).
diff --git a/shell/platform/darwin/ios/ios_surface_metal_impeller.mm b/shell/platform/darwin/ios/ios_surface_metal_impeller.mm
index 15df8b7..b4a7436 100644
--- a/shell/platform/darwin/ios/ios_surface_metal_impeller.mm
+++ b/shell/platform/darwin/ios/ios_surface_metal_impeller.mm
@@ -61,6 +61,10 @@
layer.drawableSize = drawable_size;
}
+ // Flutter needs to read from the color attachment in cases where there are effects such as
+ // backdrop filters. Flutter plugins that create platform views may also read from the layer.
+ layer.framebufferOnly = NO;
+
// When there are platform views in the scene, the drawable needs to be presented in the same
// transaction as the one created for platform views. When the drawable are being presented from
// the raster thread, there is no such transaction.
diff --git a/shell/platform/darwin/ios/ios_surface_metal_skia.mm b/shell/platform/darwin/ios/ios_surface_metal_skia.mm
index 13ac639..d010c18 100644
--- a/shell/platform/darwin/ios/ios_surface_metal_skia.mm
+++ b/shell/platform/darwin/ios/ios_surface_metal_skia.mm
@@ -55,7 +55,7 @@
layer.pixelFormat = MTLPixelFormatBGRA8Unorm;
// Flutter needs to read from the color attachment in cases where there are effects such as
- // backdrop filters.
+ // backdrop filters. Flutter plugins that create platform views may also read from the layer.
layer.framebufferOnly = NO;
const auto drawable_size = CGSizeMake(frame_info.width(), frame_info.height());