5 #ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_METAL_CONTEXT_MTL_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_METAL_CONTEXT_MTL_H_
8 #include <Metal/Metal.h>
13 #include "flutter/fml/concurrent_message_loop.h"
14 #include "flutter/fml/synchronization/sync_switch.h"
15 #include "fml/closure.h"
27 #if TARGET_OS_SIMULATOR
28 #define IMPELLER_CA_METAL_LAYER_AVAILABLE API_AVAILABLE(macos(10.11), ios(13.0))
30 #define IMPELLER_CA_METAL_LAYER_AVAILABLE API_AVAILABLE(macos(10.11), ios(8.0))
58 id<MTLCaptureScope> current_capture_scope_;
59 bool scope_active_ =
false;
67 public std::enable_shared_from_this<ContextMTL> {
69 static std::shared_ptr<ContextMTL>
Create(
71 const std::vector<std::string>& shader_library_paths,
72 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch);
74 static std::shared_ptr<ContextMTL>
Create(
76 const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries_data,
77 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
78 const std::string& label,
79 std::optional<PixelFormat> pixel_format_override = std::nullopt);
81 static std::shared_ptr<ContextMTL>
Create(
84 id<MTLCommandQueue> command_queue,
85 const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries_data,
86 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
87 const std::string& label);
122 const std::shared_ptr<const Capabilities>&
GetCapabilities()
const override;
127 void SetCapabilities(
const std::shared_ptr<const Capabilities>& capabilities);
139 #ifdef IMPELLER_DEBUG
140 std::shared_ptr<GPUTracerMTL> GetGPUTracer()
const;
142 const std::shared_ptr<ImpellerMetalCaptureManager> GetCaptureManager()
const;
147 const fml::closure& failure)
override;
150 class SyncSwitchObserver :
public fml::SyncSwitch::Observer {
152 explicit SyncSwitchObserver(
ContextMTL& parent);
153 virtual ~SyncSwitchObserver() =
default;
154 void OnSyncSwitchUpdate(
bool new_value)
override;
160 struct PendingTasks {
162 fml::closure failure;
165 id<MTLDevice> device_ =
nullptr;
166 id<MTLCommandQueue> command_queue_ =
nullptr;
167 std::shared_ptr<ShaderLibraryMTL> shader_library_;
168 std::shared_ptr<PipelineLibraryMTL> pipeline_library_;
169 std::shared_ptr<SamplerLibrary> sampler_library_;
170 std::shared_ptr<AllocatorMTL> resource_allocator_;
171 std::shared_ptr<const Capabilities> device_capabilities_;
172 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch_;
173 Mutex tasks_awaiting_gpu_mutex_;
174 std::deque<PendingTasks> tasks_awaiting_gpu_ IPLR_GUARDED_BY(
175 tasks_awaiting_gpu_mutex_);
176 std::unique_ptr<SyncSwitchObserver> sync_switch_observer_;
177 std::shared_ptr<CommandQueue> command_queue_ip_;
178 #ifdef IMPELLER_DEBUG
179 std::shared_ptr<GPUTracerMTL> gpu_tracer_;
180 std::shared_ptr<ImpellerMetalCaptureManager> capture_manager_;
182 bool is_valid_ =
false;
185 id<MTLDevice> device,
186 id<MTLCommandQueue> command_queue,
187 NSArray<id<MTLLibrary>>* shader_libraries,
188 std::shared_ptr<const fml::SyncSwitch> is_gpu_disabled_sync_switch,
189 std::optional<PixelFormat> pixel_format_override = std::nullopt);
191 std::shared_ptr<CommandBuffer> CreateCommandBufferInQueue(
192 id<MTLCommandQueue> queue)
const;
194 void FlushTasksAwaitingGPU();
To do anything rendering related with Impeller, you need a context.
std::shared_ptr< SamplerLibrary > GetSamplerLibrary() const override
Returns the library of combined image samplers used in shaders.
std::shared_ptr< CommandBuffer > CreateCommandBuffer() const override
Create a new command buffer. Command buffers can be used to encode graphics, blit,...
id< MTLCommandBuffer > CreateMTLCommandBuffer(const std::string &label) const
void SetCapabilities(const std::shared_ptr< const Capabilities > &capabilities)
std::shared_ptr< PipelineLibrary > GetPipelineLibrary() const override
Returns the library of pipelines used by render or compute commands.
std::shared_ptr< CommandQueue > GetCommandQueue() const override
Return the graphics queue for submitting command buffers.
const std::shared_ptr< const Capabilities > & GetCapabilities() const override
Get the capabilities of Impeller context. All optionally supported feature of the platform,...
static std::shared_ptr< ContextMTL > Create(const Flags &flags, const std::vector< std::string > &shader_library_paths, std::shared_ptr< const fml::SyncSwitch > is_gpu_disabled_sync_switch)
std::string DescribeGpuModel() const override
RuntimeStageBackend GetRuntimeStageBackend() const override
Retrieve the runtime stage for this context type.
BackendType GetBackendType() const override
Get the graphics backend of an Impeller context.
void Shutdown() override
Force all pending asynchronous work to finish. This is achieved by deleting all owned concurrent mess...
void StoreTaskForGPU(const fml::closure &task, const fml::closure &failure) override
std::shared_ptr< ShaderLibrary > GetShaderLibrary() const override
Returns the library of shaders used to specify the programmable stages of a pipeline.
bool UpdateOffscreenLayerPixelFormat(PixelFormat format) override
std::shared_ptr< Allocator > GetResourceAllocator() const override
Returns the allocator used to create textures and buffers on the device.
bool IsValid() const override
Determines if a context is valid. If the caller ever receives an invalid context, they must discard i...
id< MTLDevice > GetMTLDevice() const
std::shared_ptr< const fml::SyncSwitch > GetIsGpuDisabledSyncSwitch() const
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...