Flutter iOS Embedder
flutter::IOSContext Class Referenceabstract

Manages the lifetime of the on-screen and off-screen rendering contexts on iOS. On-screen contexts are used by Flutter for rendering into the surface. The lifecycle of this context may be tied to the lifecycle of the surface. On the other hand, the lifecycle of the off-screen context it tied to that of the platform view. This one object used to manage both context because GPU handles may need to be shared between the two context. To achieve this, context may need references to one another at creation time. This one object manages the creation, use and collection of both contexts in a client rendering API agnostic manner. More...

#include <ios_context.h>

Inheritance diagram for flutter::IOSContext:
flutter::IOSContextMetalImpeller flutter::IOSContextMetalSkia flutter::IOSContextSoftware

Public Member Functions

virtual ~IOSContext ()
 Collects the context object. This must happen on the thread on which this object was created. More...
 
virtual IOSRenderingBackend GetBackend () const
 Get the rendering backend used by this context. More...
 
virtual sk_sp< GrDirectContext > CreateResourceContext ()=0
 Create a resource context for use on the IO task runner. This resource context is used by Skia to upload texture to asynchronously and collect resources that are no longer needed on the render task runner. More...
 
virtual std::unique_ptr< GLContextResult > MakeCurrent ()=0
 When using client rendering APIs whose contexts need to be bound to a specific thread, the engine will call this method to give the on-screen context a chance to bind to the current thread. More...
 
virtual std::unique_ptr< Texture > CreateExternalTexture (int64_t texture_id, fml::scoped_nsobject< NSObject< FlutterTexture >> texture)=0
 Creates an external texture proxy of the appropriate client rendering API. More...
 
virtual sk_sp< GrDirectContext > GetMainContext () const =0
 Accessor for the Skia context associated with IOSSurfaces and the raster thread. More...
 
virtual std::shared_ptr< impeller::Context > GetImpellerContext () const
 

Static Public Member Functions

static std::unique_ptr< IOSContextCreate (IOSRenderingAPI api, IOSRenderingBackend backend, const std::shared_ptr< const fml::SyncSwitch > &is_gpu_disabled_sync_switch)
 Create an iOS context object capable of creating the on-screen and off-screen GPU context for use by Skia. More...
 

Protected Member Functions

 IOSContext ()
 

Detailed Description

Manages the lifetime of the on-screen and off-screen rendering contexts on iOS. On-screen contexts are used by Flutter for rendering into the surface. The lifecycle of this context may be tied to the lifecycle of the surface. On the other hand, the lifecycle of the off-screen context it tied to that of the platform view. This one object used to manage both context because GPU handles may need to be shared between the two context. To achieve this, context may need references to one another at creation time. This one object manages the creation, use and collection of both contexts in a client rendering API agnostic manner.

Definition at line 39 of file ios_context.h.

Constructor & Destructor Documentation

◆ ~IOSContext()

flutter::IOSContext::~IOSContext ( )
virtualdefault

Collects the context object. This must happen on the thread on which this object was created.

◆ IOSContext()

flutter::IOSContext::IOSContext ( )
explicitprotecteddefault

Member Function Documentation

◆ Create()

std::unique_ptr< IOSContext > flutter::IOSContext::Create ( IOSRenderingAPI  api,
IOSRenderingBackend  backend,
const std::shared_ptr< const fml::SyncSwitch > &  is_gpu_disabled_sync_switch 
)
static

Create an iOS context object capable of creating the on-screen and off-screen GPU context for use by Skia.

In case the engine does not support the specified client rendering API, this a nullptr may be returned.

Parameters
[in]apiA client rendering API supported by the engine/platform.
[in]backendA client rendering backend supported by the engine/platform.
Returns
A valid context on success. nullptr on failure.

Definition at line 21 of file ios_context.mm.

24  {
25  switch (api) {
27  FML_CHECK(backend != IOSRenderingBackend::kImpeller)
28  << "Software rendering is incompatible with Impeller.\n"
29  "Software rendering may have been automatically selected when running on a simulator "
30  "in an environment that does not support Metal. Enabling GPU pass through in your "
31  "environment may fix this. If that is not possible, then disable Impeller.";
32  return std::make_unique<IOSContextSoftware>();
34  switch (backend) {
36 #if !SLIMPELLER
37  return std::make_unique<IOSContextMetalSkia>();
38 #else // !SLIMPELLER
39  FML_LOG(FATAL) << "Impeller opt-out unavailable.";
40  return nullptr;
41 #endif // !SLIMPELLER
43  return std::make_unique<IOSContextMetalImpeller>(is_gpu_disabled_sync_switch);
44  }
45  default:
46  break;
47  }
48  FML_CHECK(false);
49  return nullptr;
50 }

References flutter::kImpeller, flutter::kMetal, flutter::kSkia, and flutter::kSoftware.

◆ CreateExternalTexture()

virtual std::unique_ptr<Texture> flutter::IOSContext::CreateExternalTexture ( int64_t  texture_id,
fml::scoped_nsobject< NSObject< FlutterTexture >>  texture 
)
pure virtual

Creates an external texture proxy of the appropriate client rendering API.

Parameters
[in]texture_idThe texture identifier
[in]textureThe texture
Returns
The texture proxy if the rendering backend supports embedder provided external textures.

Implemented in flutter::IOSContextSoftware.

◆ CreateResourceContext()

virtual sk_sp<GrDirectContext> flutter::IOSContext::CreateResourceContext ( )
pure virtual

Create a resource context for use on the IO task runner. This resource context is used by Skia to upload texture to asynchronously and collect resources that are no longer needed on the render task runner.

Attention
Client rendering APIs for which a GrDirectContext cannot be realized (software rendering), this method will always return null.
Returns
A non-null Skia context on success. nullptr on failure.

Implemented in flutter::IOSContextSoftware.

◆ GetBackend()

IOSRenderingBackend flutter::IOSContext::GetBackend ( ) const
virtual

Get the rendering backend used by this context.

Returns
The rendering backend.

Reimplemented in flutter::IOSContextMetalSkia, and flutter::IOSContextMetalImpeller.

Definition at line 52 of file ios_context.mm.

52  {
54 }

References flutter::kSkia.

◆ GetImpellerContext()

std::shared_ptr< impeller::Context > flutter::IOSContext::GetImpellerContext ( ) const
virtual

Definition at line 56 of file ios_context.mm.

56  {
57  return nullptr;
58 }

◆ GetMainContext()

virtual sk_sp<GrDirectContext> flutter::IOSContext::GetMainContext ( ) const
pure virtual

Accessor for the Skia context associated with IOSSurfaces and the raster thread.

There can be any number of resource contexts but this is the one context that will be used by surfaces to draw to the screen from the raster thread.

Returns
nullptr on failure.
Attention
The software context doesn't have a Skia context, so this value will be nullptr.
See also
For contexts which are used for offscreen work like loading textures see IOSContext::CreateResourceContext.

Implemented in flutter::IOSContextMetalSkia, flutter::IOSContextMetalImpeller, and flutter::IOSContextSoftware.

◆ MakeCurrent()

virtual std::unique_ptr<GLContextResult> flutter::IOSContext::MakeCurrent ( )
pure virtual

When using client rendering APIs whose contexts need to be bound to a specific thread, the engine will call this method to give the on-screen context a chance to bind to the current thread.

Attention
Client rendering APIs that have no-concept of thread local bindings (anything that is not OpenGL) will always return true.
Client rendering APIs for which a GrDirectContext cannot be created (software rendering) will always return false.
This binds the on-screen context to the current thread. To bind the off-screen context to the thread, use the ResoruceMakeCurrent method instead.
Only one context may be bound to a thread at any given time. Making a binding on a thread, clears the old binding.
Returns
A GLContextResult that represents the result of the method. The GetResult() returns a bool that indicates If the on-screen context could be bound to the current thread.

Implemented in flutter::IOSContextSoftware.


The documentation for this class was generated from the following files:
flutter::IOSRenderingBackend::kSkia
@ kSkia
flutter::IOSRenderingBackend::kImpeller
@ kImpeller
flutter::IOSRenderingAPI::kMetal
@ kMetal
flutter::IOSRenderingAPI::kSoftware
@ kSoftware