| Flutter Impeller |

Public Member Functions | Static Public Member Functions | List of all members
impeller::ContextMTL Class Referencefinal

`#include <context_mtl.h>`

Inheritance diagram for impeller::ContextMTL:

## Public Member Functions
| ~ContextMTL () override
BackendType | GetBackendType () const override
| Get the graphics backend of an Impeller context. More...
id< MTLDevice > | GetMTLDevice () const
std::string | DescribeGpuModel () const override
bool | IsValid () const override
| Determines if a context is valid. If the caller ever receives an invalid context, they must discard it and construct a new context. There is no recovery mechanism to repair a bad context. More...
std::shared_ptr< Allocator > | GetResourceAllocator () const override
| Returns the allocator used to create textures and buffers on the device. More...
std::shared_ptr< ShaderLibrary > | GetShaderLibrary () const override
| Returns the library of shaders used to specify the programmable stages of a pipeline. More...
std::shared_ptr< SamplerLibrary > | GetSamplerLibrary () const override
| Returns the library of combined image samplers used in shaders. More...
std::shared_ptr< PipelineLibrary > | GetPipelineLibrary () const override
| Returns the library of pipelines used by render or compute commands. More...
std::shared_ptr< CommandBuffer > | CreateCommandBuffer () const override
| Create a new command buffer. Command buffers can be used to encode graphics, blit, or compute commands to be submitted to the device. More...
const std::shared_ptr< const Capabilities > & | GetCapabilities () const override
| Get the capabilities of Impeller context. All optionally supported feature of the platform, client-rendering API, and device can be queried using the `Capabilities`. More...
bool | UpdateOffscreenLayerPixelFormat (PixelFormat format) override
void | Shutdown () override
| Force all pending asynchronous work to finish. This is achieved by deleting all owned concurrent message loops. More...
id< MTLCommandBuffer > | CreateMTLCommandBuffer (const std::string &label) const
const std::shared_ptr< fml::ConcurrentTaskRunner > | GetWorkerTaskRunner () const
std::shared_ptr< const fml::SyncSwitch > | GetIsGpuDisabledSyncSwitch () const
Public Member Functions inherited from impeller::Context
virtual | ~Context ()
| Destroys an Impeller context. More...
virtual void | SetSyncPresentation (bool value)
| Force the Vulkan presentation (submitKHR) to be performed on the raster task runner. More...
Pool< HostBuffer > & | GetHostBufferPool () const
| Accessor for a pool of HostBuffers. More...

## Static Public Member Functions
static std::shared_ptr< ContextMTL > | Create (const std::vector< std::string > &shader_library_paths, std::shared_ptr< const fml::SyncSwitch > is_gpu_disabled_sync_switch)
static std::shared_ptr< ContextMTL > | Create (const std::vector< std::shared_ptr< fml::Mapping >> &shader_libraries_data, 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< const fml::SyncSwitch > is_gpu_disabled_sync_switch, const std::string &label)
Static Public Member Functions inherited from impeller::BackendCast< ContextMTL, Context >
static ContextMTL & | Cast (Context &base)
static const ContextMTL & | Cast (const Context &base)
static ContextMTL * | Cast (Context *base)
static const ContextMTL * | Cast (const Context *base)

## Additional Inherited Members
Public Types inherited from impeller::Context
enum | BackendType { BackendType::kMetal, BackendType::kOpenGLES, BackendType::kVulkan }
Public Attributes inherited from impeller::Context
CaptureContext | capture
Protected Member Functions inherited from impeller::Context
| Context ()

## Detailed Description

Definition at line 32 of file context_mtl.h.

## Constructor & Destructor Documentation

## ◆ ~ContextMTL()

impeller::ContextMTL::~ContextMTL | ( |  | ) |
| override default

## Member Function Documentation

## ◆ Create() [1/3]

std::shared_ptr< ContextMTL > impeller::ContextMTL::Create | ( | const std::vector< std::shared_ptr< fml::Mapping >> & | shader_libraries_data,
|  | std::shared_ptr< const fml::SyncSwitch > | is_gpu_disabled_sync_switch,
|  | const std::string & | label
| ) |  |
| static

Definition at line 248 of file context_mtl.mm.

251 {
252 auto device = CreateMetalDevice();
253 auto command_queue = CreateMetalCommandQueue(device);
254 if (!command_queue) {
255 return nullptr;
256 }
257 auto context = std::shared_ptr<ContextMTL>(
258 new ContextMTL(device, command_queue,
259 MTLShaderLibraryFromFileData(device, shader_libraries_data,
260 library_label),
261 std::move(is_gpu_disabled_sync_switch)));
262 if (!context->IsValid()) {
263 FML_LOG(ERROR) << "Could not create Metal context.";
264 return nullptr;
265 }
266 return context;
267 }

References impeller::CreateMetalCommandQueue(), impeller::CreateMetalDevice(), and impeller::MTLShaderLibraryFromFileData().

## ◆ Create() [2/3]

std::shared_ptr< ContextMTL > impeller::ContextMTL::Create | ( | const std::vector< std::string > & | shader_library_paths,
|  | std::shared_ptr< const fml::SyncSwitch > | is_gpu_disabled_sync_switch
| ) |  |
| static

Definition at line 229 of file context_mtl.mm.

231 {
232 auto device = CreateMetalDevice();
233 auto command_queue = CreateMetalCommandQueue(device);
234 if (!command_queue) {
235 return nullptr;
236 }
237 auto context = std::shared_ptr<ContextMTL>(new ContextMTL(
238 device, command_queue,
239 MTLShaderLibraryFromFilePaths(device, shader_library_paths),
240 std::move(is_gpu_disabled_sync_switch)));
241 if (!context->IsValid()) {
242 FML_LOG(ERROR) << "Could not create Metal context.";
243 return nullptr;
244 }
245 return context;
246 }

References impeller::CreateMetalCommandQueue(), impeller::CreateMetalDevice(), and impeller::MTLShaderLibraryFromFilePaths().

Referenced by impeller::PlaygroundImplMTL::PlaygroundImplMTL().

## ◆ Create() [3/3]

std::shared_ptr< ContextMTL > impeller::ContextMTL::Create | ( | id< MTLDevice > | device,
|  | id< MTLCommandQueue > | command_queue,
|  | const std::vector< std::shared_ptr< fml::Mapping >> & | shader_libraries_data,
|  | std::shared_ptr< const fml::SyncSwitch > | is_gpu_disabled_sync_switch,
|  | const std::string & | label
| ) |  |
| static

Definition at line 269 of file context_mtl.mm.

274 {
275 auto context = std::shared_ptr<ContextMTL>(
276 new ContextMTL(device, command_queue,
277 MTLShaderLibraryFromFileData(device, shader_libraries_data,
278 library_label),
279 std::move(is_gpu_disabled_sync_switch)));
280 if (!context->IsValid()) {
281 FML_LOG(ERROR) << "Could not create Metal context.";
282 return nullptr;
283 }
284 return context;
285 }

References impeller::MTLShaderLibraryFromFileData().

## ◆ CreateCommandBuffer()

std::shared_ptr< CommandBuffer > impeller::ContextMTL::CreateCommandBuffer | ( |  | ) | const
| override virtual

Create a new command buffer. Command buffers can be used to encode graphics, blit, or compute commands to be submitted to the device.

A command buffer can only be used on a single thread. Multi-threaded render, blit, or compute passes must create a new command buffer on each thread.

Returns
  A new command buffer.

Implements impeller::Context.

Definition at line 319 of file context_mtl.mm.

319 {
320 return CreateCommandBufferInQueue(command_queue_);
321 }

## ◆ CreateMTLCommandBuffer()

id< MTLCommandBuffer > impeller::ContextMTL::CreateMTLCommandBuffer | ( | const std::string & | label | ) | const

Definition at line 370 of file context_mtl.mm.

371 {
372 auto buffer = [command_queue_ commandBuffer];
373 if (!label.empty()) {
374 [buffer setLabel:@(label.data())];
375 }
376 return buffer;
377 }

Referenced by impeller::SurfaceMTL::Present().

## ◆ DescribeGpuModel()

std::string impeller::ContextMTL::DescribeGpuModel | ( |  | ) | const
| override virtual

Implements impeller::Context.

Definition at line 294 of file context_mtl.mm.

294 {
295 return std::string([[device_ name] UTF8String]);
296 }

## ◆ GetBackendType()

Context::BackendType impeller::ContextMTL::GetBackendType | ( |  | ) | const
| override virtual

Get the graphics backend of an Impeller context.

            This is useful for cases where a renderer needs to track and
            lookup backend-specific resources, like shaders or uniform
            layout information.

            It's not recommended to use this as a substitute for
            per-backend capability checking. Instead, check for specific
            capabilities via `GetCapabilities()`.

Returns
  The graphics backend of the `Context`.

Implements impeller::Context.

Definition at line 289 of file context_mtl.mm.

289 {
290 return Context::BackendType::kMetal;
291 }

## ◆ GetCapabilities()

const std::shared_ptr< const Capabilities > & impeller::ContextMTL::GetCapabilities | ( |  | ) | const
| override virtual

Get the capabilities of Impeller context. All optionally supported feature of the platform, client-rendering API, and device can be queried using the `Capabilities`.

Returns
  The capabilities. Can never be `nullptr` for a valid context.

Implements impeller::Context.

Definition at line 360 of file context_mtl.mm.

360 {
361 return device_capabilities_;
362 }

## ◆ GetIsGpuDisabledSyncSwitch()

std::shared_ptr< const fml::SyncSwitch > impeller::ContextMTL::GetIsGpuDisabledSyncSwitch | ( |  | ) | const

Definition at line 333 of file context_mtl.mm.

334 {
335 return is_gpu_disabled_sync_switch_;
336 }

## ◆ GetMTLDevice()

id< MTLDevice > impeller::ContextMTL::GetMTLDevice | ( |  | ) | const

Definition at line 356 of file context_mtl.mm.

356 {
357 return device_;
358 }

Referenced by impeller::PlaygroundImplMTL::PlaygroundImplMTL().

## ◆ GetPipelineLibrary()

std::shared_ptr< PipelineLibrary > impeller::ContextMTL::GetPipelineLibrary | ( |  | ) | const
| override virtual

Returns the library of pipelines used by render or compute commands.

Returns
  The pipeline library. Can never be `nullptr` for a valid context.

Implements impeller::Context.

Definition at line 309 of file context_mtl.mm.

309 {
310 return pipeline_library_;
311 }

## ◆ GetResourceAllocator()

std::shared_ptr< Allocator > impeller::ContextMTL::GetResourceAllocator | ( |  | ) | const
| override virtual

Returns the allocator used to create textures and buffers on the device.

Returns
  The resource allocator. Can never be `nullptr` for a valid context.

Implements impeller::Context.

Definition at line 352 of file context_mtl.mm.

352 {
353 return resource_allocator_;
354 }

## ◆ GetSamplerLibrary()

std::shared_ptr< SamplerLibrary > impeller::ContextMTL::GetSamplerLibrary | ( |  | ) | const
| override virtual

Returns the library of combined image samplers used in shaders.

Returns
  The sampler library. Can never be `nullptr` for a valid context.

Implements impeller::Context.

Definition at line 314 of file context_mtl.mm.

314 {
315 return sampler_library_;
316 }

## ◆ GetShaderLibrary()

std::shared_ptr< ShaderLibrary > impeller::ContextMTL::GetShaderLibrary | ( |  | ) | const
| override virtual

Returns the library of shaders used to specify the programmable stages of a pipeline.

Returns
  The shader library. Can never be `nullptr` for a valid context.

Implements impeller::Context.

Definition at line 304 of file context_mtl.mm.

304 {
305 return shader_library_;
306 }

## ◆ GetWorkerTaskRunner()

const std::shared_ptr< fml::ConcurrentTaskRunner > impeller::ContextMTL::GetWorkerTaskRunner | ( |  | ) | const

Definition at line 329 of file context_mtl.mm.

329 {
330 return raster_message_loop_->GetTaskRunner();
331 }

## ◆ IsValid()

bool impeller::ContextMTL::IsValid | ( |  | ) | const
| override virtual

Determines if a context is valid. If the caller ever receives an invalid context, they must discard it and construct a new context. There is no recovery mechanism to repair a bad context.

It is convention in Impeller to never return an invalid context from a call that returns an pointer to a context. The call implementation performs validity checks itself and return a null context instead of a pointer to an invalid context.

How a context goes invalid is backend specific. It could happen due to device loss, or any other unrecoverable error.

Returns
  If the context is valid.

Implements impeller::Context.

Definition at line 299 of file context_mtl.mm.

299 {
300 return is_valid_;
301 }

## ◆ Shutdown()

void impeller::ContextMTL::Shutdown | ( |  | ) |
| override virtual

Force all pending asynchronous work to finish. This is achieved by deleting all owned concurrent message loops.

Implements impeller::Context.

Definition at line 324 of file context_mtl.mm.

324 {
325 raster_message_loop_.reset();
326 }

## ◆ UpdateOffscreenLayerPixelFormat()

bool impeller::ContextMTL::UpdateOffscreenLayerPixelFormat | ( | PixelFormat | format | ) |
| override virtual

Reimplemented from impeller::Context.

Definition at line 365 of file context_mtl.mm.

365 {
366 device_capabilities_ = InferMetalCapabilities(device_, format);
367 return true;
368 }

References impeller::InferMetalCapabilities().

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

- impeller/renderer/backend/metal/context_mtl.h
- impeller/renderer/backend/metal/context_mtl.mm

impeller::MTLShaderLibraryFromFileData
static NSArray< id< MTLLibrary > > * MTLShaderLibraryFromFileData(id< MTLDevice > device, const std::vector< std::shared_ptr< fml::Mapping >> &libraries_data, const std::string &label)
Definition: context_mtl.mm:172
impeller::CreateMetalCommandQueue
static id< MTLCommandQueue > CreateMetalCommandQueue(id< MTLDevice > device)
Definition: context_mtl.mm:219
impeller::CreateMetalDevice
static id< MTLDevice > CreateMetalDevice()
Definition: context_mtl.mm:215
impeller::InferMetalCapabilities
static std::unique_ptr< Capabilities > InferMetalCapabilities(id< MTLDevice > device, PixelFormat color_format)
Definition: context_mtl.mm:51
impeller::Context::BackendType::kMetal
@ kMetal
impeller::MTLShaderLibraryFromFilePaths
static NSArray< id< MTLLibrary > > * MTLShaderLibraryFromFilePaths(id< MTLDevice > device, const std::vector< std::string > &libraries_paths)
Definition: context_mtl.mm:149