Flutter Engine
 
Loading...
Searching...
No Matches
flutter::SurfacePool Class Reference

#include <surface_pool.h>

Public Member Functions

 SurfacePool (bool use_new_surface_methods)
 
 ~SurfacePool ()
 
std::shared_ptr< OverlayLayerGetLayer (GrDirectContext *gr_context, const AndroidContext &android_context, const std::shared_ptr< PlatformViewAndroidJNI > &jni_facade, const std::shared_ptr< AndroidSurfaceFactory > &surface_factory)
 
std::vector< std::shared_ptr< OverlayLayer > > GetUnusedLayers ()
 
void RecycleLayers ()
 
void DestroyLayers (const std::shared_ptr< PlatformViewAndroidJNI > &jni_facade)
 
void SetFrameSize (DlISize frame_size)
 
bool HasLayers ()
 
void ResetLayers ()
 
void TrimLayers ()
 

Detailed Description

Definition at line 46 of file surface_pool.h.

Constructor & Destructor Documentation

◆ SurfacePool()

flutter::SurfacePool::SurfacePool ( bool  use_new_surface_methods)
explicit

Definition at line 20 of file surface_pool.cc.

21 : use_new_surface_methods_(use_new_surface_methods) {}

◆ ~SurfacePool()

flutter::SurfacePool::~SurfacePool ( )
default

Member Function Documentation

◆ DestroyLayers()

void flutter::SurfacePool::DestroyLayers ( const std::shared_ptr< PlatformViewAndroidJNI > &  jni_facade)

Definition at line 92 of file surface_pool.cc.

93 {
94 std::lock_guard lock(mutex_);
95 DestroyLayersLocked(jni_facade);
96}

◆ GetLayer()

std::shared_ptr< OverlayLayer > flutter::SurfacePool::GetLayer ( GrDirectContext *  gr_context,
const AndroidContext android_context,
const std::shared_ptr< PlatformViewAndroidJNI > &  jni_facade,
const std::shared_ptr< AndroidSurfaceFactory > &  surface_factory 
)

Definition at line 25 of file surface_pool.cc.

29 {
30 std::lock_guard lock(mutex_);
31 // Destroy current layers in the pool if the frame size has changed.
32 if (requested_frame_size_ != current_frame_size_) {
33 DestroyLayersLocked(jni_facade);
34 }
35 intptr_t gr_context_key = reinterpret_cast<intptr_t>(gr_context);
36 // Allocate a new surface if there isn't one available.
37 if (available_layer_index_ >= layers_.size()) {
38 std::unique_ptr<AndroidSurface> android_surface =
39 surface_factory->CreateSurface();
40
41 FML_CHECK(android_surface && android_surface->IsValid())
42 << "Could not create an OpenGL, Vulkan or Software surface to set up "
43 "rendering.";
44
45 std::unique_ptr<PlatformViewAndroidJNI::OverlayMetadata> java_metadata =
46 use_new_surface_methods_
47 ? jni_facade->createOverlaySurface2()
48 : jni_facade->FlutterViewCreateOverlaySurface();
49
50 FML_CHECK(java_metadata->window);
51 android_surface->SetNativeWindow(java_metadata->window, jni_facade);
52 android_surface->SetupImpellerSurface();
53
54 std::unique_ptr<Surface> surface =
55 android_surface->CreateGPUSurface(gr_context);
56
57 std::shared_ptr<OverlayLayer> layer =
58 std::make_shared<OverlayLayer>(java_metadata->id, //
59 std::move(android_surface), //
60 std::move(surface) //
61 );
62 layer->gr_context_key = gr_context_key;
63 layers_.push_back(layer);
64 }
65
66 std::shared_ptr<OverlayLayer> layer = layers_[available_layer_index_];
67 // Since the surfaces are recycled, it's possible that the GrContext is
68 // different.
69 if (gr_context_key != layer->gr_context_key) {
70 layer->gr_context_key = gr_context_key;
71 // The overlay already exists, but the GrContext was changed so we need to
72 // recreate the rendering surface with the new GrContext.
73 std::unique_ptr<Surface> surface =
74 layer->android_surface->CreateGPUSurface(gr_context);
75 layer->surface = std::move(surface);
76 }
77 available_layer_index_++;
78 current_frame_size_ = requested_frame_size_;
79 return layer;
80}
VkSurfaceKHR surface
Definition main.cc:65
#define FML_CHECK(condition)
Definition logging.h:104

References FML_CHECK, and surface.

◆ GetUnusedLayers()

std::vector< std::shared_ptr< OverlayLayer > > flutter::SurfacePool::GetUnusedLayers ( )

Definition at line 112 of file surface_pool.cc.

112 {
113 std::lock_guard lock(mutex_);
114 std::vector<std::shared_ptr<OverlayLayer>> results;
115 for (size_t i = available_layer_index_; i < layers_.size(); i++) {
116 results.push_back(layers_[i]);
117 }
118 return results;
119}

References i.

◆ HasLayers()

bool flutter::SurfacePool::HasLayers ( )

Definition at line 87 of file surface_pool.cc.

87 {
88 std::lock_guard lock(mutex_);
89 return !layers_.empty();
90}

◆ RecycleLayers()

void flutter::SurfacePool::RecycleLayers ( )

Definition at line 82 of file surface_pool.cc.

82 {
83 std::lock_guard lock(mutex_);
84 available_layer_index_ = 0;
85}

◆ ResetLayers()

void flutter::SurfacePool::ResetLayers ( )

Definition at line 126 of file surface_pool.cc.

126 {
127 available_layer_index_ = 0;
128}

◆ SetFrameSize()

void flutter::SurfacePool::SetFrameSize ( DlISize  frame_size)

Definition at line 121 of file surface_pool.cc.

121 {
122 std::lock_guard lock(mutex_);
123 requested_frame_size_ = frame_size;
124}

◆ TrimLayers()

void flutter::SurfacePool::TrimLayers ( )

Definition at line 130 of file surface_pool.cc.

130 {
131 std::lock_guard lock(mutex_);
132 layers_.erase(layers_.begin() + available_layer_index_, layers_.end());
133 available_layer_index_ = 0;
134}

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