@@ -56,21 +56,23 @@ sk_sp<SkImage> ConvertBufferToSkImage(
5656 return raster_image;
5757}
5858
59- void DoConvertImageToRasterImpeller (
59+ [[nodiscard]] fml::Status DoConvertImageToRasterImpeller (
6060 const sk_sp<DlImage>& dl_image,
61- std::function<void (fml::StatusOr<sk_sp<SkImage>>)> encode_task,
61+ const std::function<void (fml::StatusOr<sk_sp<SkImage>>)>& encode_task,
6262 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch,
6363 const std::shared_ptr<impeller::Context>& impeller_context) {
64+ fml::Status result;
6465 is_gpu_disabled_sync_switch->Execute (
6566 fml::SyncSwitch::Handlers ()
66- .SetIfTrue ([&encode_task ] {
67- encode_task (
68- fml::Status (fml::StatusCode::kUnavailable , " GPU unavailable." )) ;
67+ .SetIfTrue ([&result ] {
68+ result =
69+ fml::Status (fml::StatusCode::kUnavailable , " GPU unavailable." );
6970 })
7071 .SetIfFalse ([&dl_image, &encode_task, &impeller_context] {
7172 ImageEncodingImpeller::ConvertDlImageToSkImage (
7273 dl_image, std::move (encode_task), impeller_context);
7374 }));
75+ return result;
7476}
7577
7678} // namespace
@@ -153,18 +155,57 @@ void ImageEncodingImpeller::ConvertImageToRaster(
153155 };
154156
155157 if (dl_image->owning_context () != DlImage::OwningContext::kRaster ) {
156- DoConvertImageToRasterImpeller (dl_image, std::move (encode_task),
157- is_gpu_disabled_sync_switch,
158- impeller_context);
158+ fml::Status status = DoConvertImageToRasterImpeller (
159+ dl_image, encode_task, is_gpu_disabled_sync_switch, impeller_context);
160+ if (!status.ok ()) {
161+ if (status.code () == fml::StatusCode::kUnavailable ) {
162+ impeller_context->StoreTaskForGPU ([dl_image = std::move (dl_image),
163+ encode_task = std::move (encode_task),
164+ is_gpu_disabled_sync_switch,
165+ impeller_context] {
166+ fml::Status retry_status = DoConvertImageToRasterImpeller (
167+ dl_image, encode_task, is_gpu_disabled_sync_switch,
168+ impeller_context);
169+ if (!retry_status.ok ()) {
170+ encode_task (retry_status);
171+ }
172+ });
173+ } else {
174+ encode_task (status);
175+ }
176+ }
159177 return ;
160178 }
161179
162180 raster_task_runner->PostTask ([dl_image, encode_task = std::move (encode_task),
163181 io_task_runner, is_gpu_disabled_sync_switch,
164- impeller_context]() mutable {
165- DoConvertImageToRasterImpeller (dl_image, std::move (encode_task),
166- is_gpu_disabled_sync_switch,
167- impeller_context);
182+ impeller_context,
183+ raster_task_runner]() mutable {
184+ fml::Status status = DoConvertImageToRasterImpeller (
185+ dl_image, std::move (encode_task), is_gpu_disabled_sync_switch,
186+ impeller_context);
187+ if (!status.ok ()) {
188+ if (status.code () == fml::StatusCode::kUnavailable ) {
189+ impeller_context->StoreTaskForGPU (
190+ [dl_image = std::move (dl_image),
191+ encode_task = std::move (encode_task), is_gpu_disabled_sync_switch,
192+ impeller_context, raster_task_runner] {
193+ raster_task_runner->PostTask (
194+ [dl_image = std::move (dl_image),
195+ encode_task = std::move (encode_task),
196+ is_gpu_disabled_sync_switch, impeller_context] {
197+ fml::Status retry_status = DoConvertImageToRasterImpeller (
198+ dl_image, encode_task, is_gpu_disabled_sync_switch,
199+ impeller_context);
200+ if (!retry_status.ok ()) {
201+ encode_task (retry_status);
202+ }
203+ });
204+ });
205+ } else {
206+ encode_task (status);
207+ }
208+ }
168209 });
169210}
170211
0 commit comments