165 {
166 if (auto found = compute_pipelines_.find(descriptor);
167 found != compute_pipelines_.end()) {
168 return found->second;
169 }
170
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) {
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_
213 descriptor)
215 completionHandler:completion_handler];
216 return pipeline_future;
217}
bool IsValid() const override
const uint8_t uint32_t uint32_t GError ** error
static MTLComputePipelineDescriptor * GetMTLComputePipelineDescriptor(const ComputePipelineDescriptor &desc)