226 {
227 auto context = context_.lock();
228 if (!context) {
229 return false;
230 }
231
232 if (requires_blit_) {
233 if (!(source_texture_ && destination_texture_)) {
234 return false;
235 }
236
237 auto blit_command_buffer = context->CreateCommandBuffer();
238 if (!blit_command_buffer) {
239 return false;
240 }
241 auto blit_pass = blit_command_buffer->CreateBlitPass();
242 if (!clip_rect_.has_value()) {
244 return false;
245 }
246 blit_pass->AddCopy(source_texture_, destination_texture_, std::nullopt,
247 clip_rect_->GetOrigin());
248 blit_pass->EncodeCommands(context->GetResourceAllocator());
249 if (!context->GetCommandQueue()->Submit({blit_command_buffer}).ok()) {
250 return false;
251 }
252 }
253#ifdef IMPELLER_DEBUG
255#endif
256
257 if (drawable_) {
258 id<MTLCommandBuffer> command_buffer =
261
262 id<CAMetalDrawable> metal_drawable =
263 reinterpret_cast<id<CAMetalDrawable>>(drawable_);
264 if ([metal_drawable conformsToProtocol:@protocol(FlutterMetalDrawable)]) {
265 [(id<FlutterMetalDrawable>)metal_drawable
266 flutterPrepareForPresent:command_buffer];
267 }
268
269
270
271
272 if ([[NSThread currentThread] isMainThread] ||
273 [[MTLCaptureManager sharedCaptureManager] isCapturing]) {
275 [command_buffer commit];
276 [command_buffer waitUntilScheduled];
277 [drawable_ present];
278 } else {
279
280
281 id<CAMetalDrawable>
drawable = drawable_;
282 [command_buffer addScheduledHandler:^(id<MTLCommandBuffer>
buffer) {
284 }];
285 [command_buffer commit];
286 }
287 }
288
289 return true;
290}
static ContextMTL & Cast(Context &base)
id< MTLCommandBuffer > CreateMTLCommandBuffer(const std::string &label) const
static const uint8_t buffer[]