Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | List of all members
impeller::PipelineLibraryMTL Class Referencefinal

#include <pipeline_library_mtl.h>

Inheritance diagram for impeller::PipelineLibraryMTL:
impeller::PipelineLibrary

Public Member Functions

 PipelineLibraryMTL ()
 
 ~PipelineLibraryMTL () override
 
- Public Member Functions inherited from impeller::PipelineLibrary
virtual ~PipelineLibrary ()
 
PipelineFuture< PipelineDescriptorGetPipeline (std::optional< PipelineDescriptor > descriptor)
 
PipelineFuture< ComputePipelineDescriptorGetPipeline (std::optional< ComputePipelineDescriptor > descriptor)
 

Private Member Functions

bool IsValid () const override
 
PipelineFuture< PipelineDescriptorGetPipeline (PipelineDescriptor descriptor) override
 
PipelineFuture< ComputePipelineDescriptorGetPipeline (ComputePipelineDescriptor descriptor) override
 
void RemovePipelinesWithEntryPoint (std::shared_ptr< const ShaderFunction > function) override
 

Additional Inherited Members

- Protected Member Functions inherited from impeller::PipelineLibrary
 PipelineLibrary ()
 

Detailed Description

Definition at line 17 of file pipeline_library_mtl.h.

Constructor & Destructor Documentation

◆ PipelineLibraryMTL()

impeller::PipelineLibraryMTL::PipelineLibraryMTL ( )

◆ ~PipelineLibraryMTL()

impeller::PipelineLibraryMTL::~PipelineLibraryMTL ( )
overridedefault

Member Function Documentation

◆ GetPipeline() [1/2]

PipelineFuture< ComputePipelineDescriptor > impeller::PipelineLibraryMTL::GetPipeline ( ComputePipelineDescriptor  descriptor)
overrideprivatevirtual

Implements impeller::PipelineLibrary.

Definition at line 164 of file pipeline_library_mtl.mm.

165 {
166 if (auto found = compute_pipelines_.find(descriptor);
167 found != compute_pipelines_.end()) {
168 return found->second;
169 }
170
171 if (!IsValid()) {
172 return {
173 descriptor,
174 RealizedFuture<std::shared_ptr<Pipeline<ComputePipelineDescriptor>>>(
175 nullptr)};
176 }
177
178 auto promise = std::make_shared<
179 std::promise<std::shared_ptr<Pipeline<ComputePipelineDescriptor>>>>();
180 auto pipeline_future = PipelineFuture<ComputePipelineDescriptor>{
181 descriptor, promise->get_future()};
182 compute_pipelines_[descriptor] = pipeline_future;
183 auto weak_this = weak_from_this();
184
185 auto completion_handler =
186 ^(id<MTLComputePipelineState> _Nullable compute_pipeline_state,
187 MTLComputePipelineReflection* _Nullable reflection,
188 NSError* _Nullable error) {
189 if (error != nil) {
190 VALIDATION_LOG << "Could not create compute pipeline: "
191 << error.localizedDescription.UTF8String;
192 promise->set_value(nullptr);
193 return;
194 }
195
196 auto strong_this = weak_this.lock();
197 if (!strong_this) {
198 VALIDATION_LOG << "Library was collected before a pending pipeline "
199 "creation could finish.";
200 promise->set_value(nullptr);
201 return;
202 }
203
204 auto new_pipeline = std::shared_ptr<ComputePipelineMTL>(
205 new ComputePipelineMTL(weak_this,
206 descriptor, //
207 compute_pipeline_state //
208 ));
209 promise->set_value(new_pipeline);
210 };
211 [device_
212 newComputePipelineStateWithDescriptor:GetMTLComputePipelineDescriptor(
213 descriptor)
214 options:MTLPipelineOptionNone
215 completionHandler:completion_handler];
216 return pipeline_future;
217}
const char * options
const uint8_t uint32_t uint32_t GError ** error
static MTLComputePipelineDescriptor * GetMTLComputePipelineDescriptor(const ComputePipelineDescriptor &desc)
#define VALIDATION_LOG
Definition validation.h:73

◆ GetPipeline() [2/2]

PipelineFuture< PipelineDescriptor > impeller::PipelineLibraryMTL::GetPipeline ( PipelineDescriptor  descriptor)
overrideprivatevirtual

Implements impeller::PipelineLibrary.

Definition at line 111 of file pipeline_library_mtl.mm.

112 {
113 if (auto found = pipelines_.find(descriptor); found != pipelines_.end()) {
114 return found->second;
115 }
116
117 if (!IsValid()) {
118 return {
119 descriptor,
120 RealizedFuture<std::shared_ptr<Pipeline<PipelineDescriptor>>>(nullptr)};
121 }
122
123 auto promise = std::make_shared<
124 std::promise<std::shared_ptr<Pipeline<PipelineDescriptor>>>>();
125 auto pipeline_future =
126 PipelineFuture<PipelineDescriptor>{descriptor, promise->get_future()};
127 pipelines_[descriptor] = pipeline_future;
128 auto weak_this = weak_from_this();
129
130 auto completion_handler =
131 ^(id<MTLRenderPipelineState> _Nullable render_pipeline_state,
132 NSError* _Nullable error) {
133 if (error != nil) {
134 VALIDATION_LOG << "Could not create render pipeline for "
135 << descriptor.GetLabel() << " :"
136 << error.localizedDescription.UTF8String;
137 promise->set_value(nullptr);
138 return;
139 }
140
141 auto strong_this = weak_this.lock();
142 if (!strong_this) {
143 promise->set_value(nullptr);
144 return;
145 }
146
147 auto new_pipeline = std::shared_ptr<PipelineMTL>(new PipelineMTL(
148 weak_this,
149 descriptor, //
150 render_pipeline_state, //
151 CreateDepthStencilDescriptor(descriptor, device_) //
152 ));
153 promise->set_value(new_pipeline);
154 };
156 descriptor, [device = device_, completion_handler](
157 MTLRenderPipelineDescriptor* descriptor) {
158 [device newRenderPipelineStateWithDescriptor:descriptor
159 completionHandler:completion_handler];
160 });
161 return pipeline_future;
162}
VkDevice device
Definition main.cc:53
static void GetMTLRenderPipelineDescriptor(const PipelineDescriptor &desc, const Callback &callback)
static id< MTLDepthStencilState > CreateDepthStencilDescriptor(const PipelineDescriptor &desc, id< MTLDevice > device)

◆ IsValid()

bool impeller::PipelineLibraryMTL::IsValid ( ) const
overrideprivatevirtual

Implements impeller::PipelineLibrary.

Definition at line 106 of file pipeline_library_mtl.mm.

106 {
107 return device_ != nullptr;
108}

◆ RemovePipelinesWithEntryPoint()

void impeller::PipelineLibraryMTL::RemovePipelinesWithEntryPoint ( std::shared_ptr< const ShaderFunction function)
overrideprivatevirtual

Implements impeller::PipelineLibrary.

Definition at line 220 of file pipeline_library_mtl.mm.

221 {
222 fml::erase_if(pipelines_, [&](auto item) {
223 return item->first.GetEntrypointForStage(function->GetStage())
224 ->IsEqual(*function);
225 });
226}
Dart_NativeFunction function
Definition fuchsia.cc:51
void erase_if(Collection &container, std::function< bool(typename Collection::iterator)> predicate)
Definition container.h:16

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