Flutter Engine
The Flutter Engine
context_mtl.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_METAL_CONTEXT_MTL_H_
6#define FLUTTER_IMPELLER_RENDERER_BACKEND_METAL_CONTEXT_MTL_H_
7
8#include <Metal/Metal.h>
9
10#include <deque>
11#include <string>
12
13#include "flutter/fml/concurrent_message_loop.h"
14#include "flutter/fml/synchronization/sync_switch.h"
25
26#if TARGET_OS_SIMULATOR
27#define IMPELLER_CA_METAL_LAYER_AVAILABLE API_AVAILABLE(macos(10.11), ios(13.0))
28#else // TARGET_OS_SIMULATOR
29#define IMPELLER_CA_METAL_LAYER_AVAILABLE API_AVAILABLE(macos(10.11), ios(8.0))
30#endif // TARGET_OS_SIMULATOR
31
32namespace impeller {
33
34class ContextMTL final : public Context,
35 public BackendCast<ContextMTL, Context>,
36 public std::enable_shared_from_this<ContextMTL> {
37 public:
38 static std::shared_ptr<ContextMTL> Create(
39 const std::vector<std::string>& shader_library_paths,
40 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch);
41
42 static std::shared_ptr<ContextMTL> Create(
43 const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries_data,
44 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
45 const std::string& label,
46 std::optional<PixelFormat> pixel_format_override = std::nullopt);
47
48 static std::shared_ptr<ContextMTL> Create(
49 id<MTLDevice> device,
50 id<MTLCommandQueue> command_queue,
51 const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries_data,
52 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
53 const std::string& label);
54
55 // |Context|
56 ~ContextMTL() override;
57
58 // |Context|
59 BackendType GetBackendType() const override;
60
61 id<MTLDevice> GetMTLDevice() const;
62
63 // |Context|
64 std::string DescribeGpuModel() const override;
65
66 // |Context|
67 bool IsValid() const override;
68
69 // |Context|
70 std::shared_ptr<Allocator> GetResourceAllocator() const override;
71
72 // |Context|
73 std::shared_ptr<ShaderLibrary> GetShaderLibrary() const override;
74
75 // |Context|
76 std::shared_ptr<SamplerLibrary> GetSamplerLibrary() const override;
77
78 // |Context|
79 std::shared_ptr<PipelineLibrary> GetPipelineLibrary() const override;
80
81 // |Context|
82 std::shared_ptr<CommandBuffer> CreateCommandBuffer() const override;
83
84 // |Context|
85 std::shared_ptr<CommandQueue> GetCommandQueue() const override;
86
87 // |Context|
88 const std::shared_ptr<const Capabilities>& GetCapabilities() const override;
89
90 void SetCapabilities(const std::shared_ptr<const Capabilities>& capabilities);
91
92 // |Context|
94
95 // |Context|
96 void Shutdown() override;
97
98 id<MTLCommandBuffer> CreateMTLCommandBuffer(const std::string& label) const;
99
100 std::shared_ptr<const fml::SyncSwitch> GetIsGpuDisabledSyncSwitch() const;
101
102#ifdef IMPELLER_DEBUG
103 std::shared_ptr<GPUTracerMTL> GetGPUTracer() const;
104#endif // IMPELLER_DEBUG
105
106 // |Context|
107 void StoreTaskForGPU(const std::function<void()>& task) override;
108
109 private:
110 class SyncSwitchObserver : public fml::SyncSwitch::Observer {
111 public:
112 explicit SyncSwitchObserver(ContextMTL& parent);
113 virtual ~SyncSwitchObserver() = default;
114 void OnSyncSwitchUpdate(bool new_value) override;
115
116 private:
117 ContextMTL& parent_;
118 };
119
120 id<MTLDevice> device_ = nullptr;
121 id<MTLCommandQueue> command_queue_ = nullptr;
122 std::shared_ptr<ShaderLibraryMTL> shader_library_;
123 std::shared_ptr<PipelineLibraryMTL> pipeline_library_;
124 std::shared_ptr<SamplerLibrary> sampler_library_;
125 std::shared_ptr<AllocatorMTL> resource_allocator_;
126 std::shared_ptr<const Capabilities> device_capabilities_;
127 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch_;
128#ifdef IMPELLER_DEBUG
129 std::shared_ptr<GPUTracerMTL> gpu_tracer_;
130#endif // IMPELLER_DEBUG
131 std::deque<std::function<void()>> tasks_awaiting_gpu_;
132 std::unique_ptr<SyncSwitchObserver> sync_switch_observer_;
133 std::shared_ptr<CommandQueue> command_queue_ip_;
134 bool is_valid_ = false;
135
136 ContextMTL(id<MTLDevice> device,
137 id<MTLCommandQueue> command_queue,
138 NSArray<id<MTLLibrary>>* shader_libraries,
139 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
140 std::optional<PixelFormat> pixel_format_override = std::nullopt);
141
142 std::shared_ptr<CommandBuffer> CreateCommandBufferInQueue(
143 id<MTLCommandQueue> queue) const;
144
145 void FlushTasksAwaitingGPU();
146
147 ContextMTL(const ContextMTL&) = delete;
148
149 ContextMTL& operator=(const ContextMTL&) = delete;
150};
151
152} // namespace impeller
153
154#endif // FLUTTER_IMPELLER_RENDERER_BACKEND_METAL_CONTEXT_MTL_H_
Observes changes to the SyncSwitch.
Definition: sync_switch.h:25
std::shared_ptr< SamplerLibrary > GetSamplerLibrary() const override
Returns the library of combined image samplers used in shaders.
Definition: context_mtl.mm:309
std::shared_ptr< CommandBuffer > CreateCommandBuffer() const override
Create a new command buffer. Command buffers can be used to encode graphics, blit,...
Definition: context_mtl.mm:314
id< MTLCommandBuffer > CreateMTLCommandBuffer(const std::string &label) const
Definition: context_mtl.mm:369
void SetCapabilities(const std::shared_ptr< const Capabilities > &capabilities)
Definition: context_mtl.mm:358
std::shared_ptr< PipelineLibrary > GetPipelineLibrary() const override
Returns the library of pipelines used by render or compute commands.
Definition: context_mtl.mm:304
std::shared_ptr< CommandQueue > GetCommandQueue() const override
Return the graphics queue for submitting command buffers.
Definition: context_mtl.mm:403
const std::shared_ptr< const Capabilities > & GetCapabilities() const override
Get the capabilities of Impeller context. All optionally supported feature of the platform,...
Definition: context_mtl.mm:354
std::string DescribeGpuModel() const override
Definition: context_mtl.mm:289
~ContextMTL() override
Definition: context_mtl.mm:280
BackendType GetBackendType() const override
Get the graphics backend of an Impeller context.
Definition: context_mtl.mm:284
void Shutdown() override
Force all pending asynchronous work to finish. This is achieved by deleting all owned concurrent mess...
Definition: context_mtl.mm:319
std::shared_ptr< ShaderLibrary > GetShaderLibrary() const override
Returns the library of shaders used to specify the programmable stages of a pipeline.
Definition: context_mtl.mm:299
void StoreTaskForGPU(const std::function< void()> &task) override
Definition: context_mtl.mm:378
bool UpdateOffscreenLayerPixelFormat(PixelFormat format) override
Definition: context_mtl.mm:364
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)
Definition: context_mtl.mm:221
std::shared_ptr< Allocator > GetResourceAllocator() const override
Returns the allocator used to create textures and buffers on the device.
Definition: context_mtl.mm:346
bool IsValid() const override
Determines if a context is valid. If the caller ever receives an invalid context, they must discard i...
Definition: context_mtl.mm:294
id< MTLDevice > GetMTLDevice() const
Definition: context_mtl.mm:350
std::shared_ptr< const fml::SyncSwitch > GetIsGpuDisabledSyncSwitch() const
Definition: context_mtl.mm:327
To do anything rendering related with Impeller, you need a context.
Definition: context.h:45
VkDevice device
Definition: main.cc:53
VkQueue queue
Definition: main.cc:55
uint32_t uint32_t * format
Dart_NativeFunction function
Definition: fuchsia.cc:51
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Definition: formats.h:99