@@ -147,7 +147,7 @@ void Rasterizer::DrawLastLayerTree(
147147 DrawToSurface (*frame_timings_recorder, *last_layer_tree_);
148148}
149149
150- void Rasterizer::Draw (
150+ RasterStatus Rasterizer::Draw (
151151 std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder,
152152 std::shared_ptr<Pipeline<flutter::LayerTree>> pipeline,
153153 LayerTreeDiscardCallback discardCallback) {
@@ -156,7 +156,7 @@ void Rasterizer::Draw(
156156 if (raster_thread_merger_ &&
157157 !raster_thread_merger_->IsOnRasterizingThread ()) {
158158 // we yield and let this frame be serviced on the right thread.
159- return ;
159+ return RasterStatus:: kYielded ;
160160 }
161161 FML_DCHECK (delegate_.GetTaskRunners ()
162162 .GetRasterTaskRunner ()
@@ -217,6 +217,8 @@ void Rasterizer::Draw(
217217 default :
218218 break ;
219219 }
220+
221+ return raster_status;
220222}
221223
222224namespace {
@@ -385,6 +387,8 @@ RasterStatus Rasterizer::DoDraw(
385387 raster_status == RasterStatus::kSkipAndRetry ) {
386388 resubmitted_layer_tree_ = std::move (layer_tree);
387389 return raster_status;
390+ } else if (raster_status == RasterStatus::kDiscarded ) {
391+ return raster_status;
388392 }
389393
390394 if (persistent_cache->IsDumpingSkp () &&
@@ -465,6 +469,31 @@ RasterStatus Rasterizer::DrawToSurface(
465469 TRACE_EVENT0 (" flutter" , " Rasterizer::DrawToSurface" );
466470 FML_DCHECK (surface_);
467471
472+ RasterStatus raster_status;
473+ if (surface_->AllowsDrawingWhenGpuDisabled ()) {
474+ raster_status = DrawToSurfaceUnsafe (frame_timings_recorder, layer_tree);
475+ } else {
476+ delegate_.GetIsGpuDisabledSyncSwitch ()->Execute (
477+ fml::SyncSwitch::Handlers ()
478+ .SetIfTrue ([&] { raster_status = RasterStatus::kDiscarded ; })
479+ .SetIfFalse ([&] {
480+ raster_status =
481+ DrawToSurfaceUnsafe (frame_timings_recorder, layer_tree);
482+ }));
483+ }
484+
485+ return raster_status;
486+ }
487+
488+ // / Unsafe because it assumes we have access to the GPU which isn't the case
489+ // / when iOS is backgrounded, for example.
490+ // / \see Rasterizer::DrawToSurface
491+ RasterStatus Rasterizer::DrawToSurfaceUnsafe (
492+ FrameTimingsRecorder& frame_timings_recorder,
493+ flutter::LayerTree& layer_tree) {
494+ TRACE_EVENT0 (" flutter" , " Rasterizer::DrawToSurfaceUnsafe" );
495+ FML_DCHECK (surface_);
496+
468497 compositor_context_->ui_time ().SetLapTime (
469498 frame_timings_recorder.GetBuildDuration ());
470499
@@ -512,9 +541,8 @@ RasterStatus Rasterizer::DrawToSurface(
512541 if (external_view_embedder_ &&
513542 (!raster_thread_merger_ || raster_thread_merger_->IsMerged ())) {
514543 FML_DCHECK (!frame->IsSubmitted ());
515- external_view_embedder_->SubmitFrame (
516- surface_->GetContext (), std::move (frame),
517- delegate_.GetIsGpuDisabledSyncSwitch ());
544+ external_view_embedder_->SubmitFrame (surface_->GetContext (),
545+ std::move (frame));
518546 } else {
519547 frame->Submit ();
520548 }
0 commit comments