| Flutter iOS Embedder |

Public Member Functions | List of all members
flutter::OverlayLayerPool Class Reference

Storage for Overlay layers across frames. More...

`#include <overlay_layer_pool.h>`

## Public Member Functions
| OverlayLayerPool ()=default
| ~OverlayLayerPool ()=default
std::shared_ptr< OverlayLayer > | GetNextLayer ()
| Gets a layer from the pool if available. More...
void | CreateLayer (GrDirectContext *gr_context, const std::shared_ptr< IOSContext > &ios_context, MTLPixelFormat pixel_format)
| Create a new overlay layer. More...
std::vector< std::shared_ptr< OverlayLayer > > | RemoveUnusedLayers ()
| Removes unused layers from the pool. Returns the unused layers. More...
void | RecycleLayers ()
| Marks the layers in the pool as available for reuse. More...
size_t | size () const
| The count of layers currently in the pool. More...

## Detailed Description

Storage for Overlay layers across frames.

Note: this class does not synchronize access to its layers or any layer removal. As it is currently used, layers must be created on the platform thread but other methods of it are called on the raster thread. This is safe as overlay layers are only ever added while the raster thread is latched.

Definition at line 53 of file overlay_layer_pool.h.

## Constructor & Destructor Documentation

## ◆ OverlayLayerPool()

flutter::OverlayLayerPool::OverlayLayerPool | ( |  | ) |
| default

## ◆ ~OverlayLayerPool()

flutter::OverlayLayerPool::~OverlayLayerPool | ( |  | ) |
| default

## Member Function Documentation

## ◆ CreateLayer()

void flutter::OverlayLayerPool::CreateLayer | ( | GrDirectContext * | gr_context,
|  | const std::shared_ptr< IOSContext > & | ios_context,
|  | MTLPixelFormat | pixel_format
| ) |  |

Create a new overlay layer.

This method can only be called on the Platform thread.

Definition at line 57 of file overlay_layer_pool.mm.

59 {
60 FML_DCHECK([[NSThread currentThread] isMainThread]);
61 std::shared_ptr<OverlayLayer> layer;
62 fml::scoped_nsobject<UIView> overlay_view;
63 fml::scoped_nsobject<UIView> overlay_view_wrapper;
64
65 bool impeller_enabled = !!ios_context->GetImpellerContext();
66 if (!gr_context && !impeller_enabled) {
67 overlay_view.reset([[FlutterOverlayView alloc] init]);
68 overlay_view_wrapper.reset([[FlutterOverlayView alloc] init]);
69
70 auto ca_layer = fml::scoped_nsobject<CALayer>{[overlay_view.get() layer]};
71 std::unique_ptr<IOSSurface> ios_surface = IOSSurface::Create(ios_context, ca_layer);
72 std::unique_ptr<Surface> surface = ios_surface->CreateGPUSurface();
73
74 layer = std::make_shared<OverlayLayer>(std::move(overlay_view), std::move(overlay_view_wrapper),
75 std::move(ios_surface), std::move(surface));
76 } else {
77 CGFloat screenScale = [UIScreen mainScreen].scale;
78 overlay_view.reset([[FlutterOverlayView alloc] initWithContentsScale:screenScale
79 pixelFormat:pixel_format]);
80 overlay_view_wrapper.reset([[FlutterOverlayView alloc] initWithContentsScale:screenScale
81 pixelFormat:pixel_format]);
82
83 auto ca_layer = fml::scoped_nsobject<CALayer>{[overlay_view.get() layer]};
84 std::unique_ptr<IOSSurface> ios_surface = IOSSurface::Create(ios_context, ca_layer);
85 std::unique_ptr<Surface> surface = ios_surface->CreateGPUSurface(gr_context);
86
87 layer = std::make_shared<OverlayLayer>(std::move(overlay_view), std::move(overlay_view_wrapper),
88 std::move(ios_surface), std::move(surface));
89 layer->gr_context = gr_context;
90 }
91 // The overlay view wrapper masks the overlay view.
92 // This is required to keep the backing surface size unchanged between frames.
93 //
94 // Otherwise, changing the size of the overlay would require a new surface,
95 // which can be very expensive.
96 //
97 // This is the case of an animation in which the overlay size is changing in every frame.
98 //
99 // +------------------------+
100 // | overlay_view |
101 // | +--------------+ | +--------------+
102 // | | wrapper | | == mask => | overlay_view |
103 // | +--------------+ | +--------------+
104 // +------------------------+
105 layer->overlay_view_wrapper.get().clipsToBounds = YES;
106 [layer->overlay_view_wrapper.get() addSubview:layer->overlay_view];
107
108 layers_.push_back(layer);
109 }

References flutter::IOSSurface::Create().

## ◆ GetNextLayer()

std::shared_ptr< OverlayLayer > flutter::OverlayLayerPool::GetNextLayer | ( |  | ) |

Gets a layer from the pool if available.

The layer is marked as used until [RecycleLayers] is called.

Definition at line 47 of file overlay_layer_pool.mm.

47 {
48 std::shared_ptr<OverlayLayer> result;
49 if (available_layer_index_ < layers_.size()) {
50 result = layers_[available_layer_index_];
51 available_layer_index_++;
52 }
53
54 return result;
55 }

## ◆ RecycleLayers()

void flutter::OverlayLayerPool::RecycleLayers | ( |  | ) |

Marks the layers in the pool as available for reuse.

Definition at line 111 of file overlay_layer_pool.mm.

111 {
112 available_layer_index_ = 0;
113 }

## ◆ RemoveUnusedLayers()

std::vector< std::shared_ptr< OverlayLayer > > flutter::OverlayLayerPool::RemoveUnusedLayers | ( |  | ) |

Removes unused layers from the pool. Returns the unused layers.

Definition at line 115 of file overlay_layer_pool.mm.

115 {
116 std::vector<std::shared_ptr<OverlayLayer>> results;
117 for (size_t i = available_layer_index_; i < layers_.size(); i++) {
118 results.push_back(layers_[i]);
119 }
120 // Leave at least one overlay layer, to work around cases where scrolling
121 // platform views under an app bar continually adds and removes an
122 // overlay layer. This logic could be removed if https://github.com/flutter/flutter/issues/150646
123 // is fixed.
124 static constexpr size_t kLeakLayerCount = 1;
125 size_t erase_offset = std::max(available_layer_index_, kLeakLayerCount);
126 if (erase_offset < layers_.size()) {
127 layers_.erase(layers_.begin() + erase_offset, layers_.end());
128 }
129 return results;
130 }

## ◆ size()

size_t flutter::OverlayLayerPool::size | ( |  | ) | const

The count of layers currently in the pool.

Definition at line 132 of file overlay_layer_pool.mm.

132 {
133 return layers_.size();
134 }

The documentation for this class was generated from the following files:

- shell/platform/darwin/ios/framework/Source/overlay_layer_pool.h
- shell/platform/darwin/ios/framework/Source/overlay_layer_pool.mm

FlutterOverlayView
Definition: FlutterOverlayView.h:22
flutter::IOSSurface::Create
static std::unique_ptr< IOSSurface > Create(std::shared_ptr< IOSContext > context, const fml::scoped_nsobject< CALayer > &layer)
Definition: ios_surface.mm:19