1515#include " flutter/fml/synchronization/waitable_event.h"
1616#include " flutter/fml/task_runner.h"
1717#include " flutter/runtime/dart_vm_lifecycle.h"
18+ #include " flutter/shell/common/persistent_cache.h"
1819#include " flutter/shell/common/rasterizer.h"
1920#include " flutter/shell/common/run_configuration.h"
21+ #include " flutter/shell/common/serialization_callbacks.h"
2022#include " flutter_runner_product_configuration.h"
2123#include " fuchsia_intl.h"
24+ #include " include/core/SkPicture.h"
25+ #include " include/core/SkSerialProcs.h"
2226#include " platform_view.h"
2327#include " runtime/dart/utils/files.h"
2428#include " task_runner_adapter.h"
@@ -198,34 +202,6 @@ Engine::Engine(Delegate& delegate,
198202 CreateFMLTaskRunner (threads_[2 ]->dispatcher ()) // io
199203 );
200204
201- // Setup the callback that will instantiate the rasterizer.
202- flutter::Shell::CreateCallback<flutter::Rasterizer> on_create_rasterizer =
203- fml::MakeCopyable ([thread_label = thread_label_, //
204- view_token = std::move (view_token), //
205- view_ref_pair = std::move (view_ref_pair), //
206- session = std::move (session), //
207- on_session_error_callback, //
208- vsync_event = vsync_event_.get () //
209- ](flutter::Shell& shell) mutable {
210- std::unique_ptr<flutter_runner::CompositorContext> compositor_context;
211- {
212- TRACE_DURATION (" flutter" , " CreateCompositorContext" );
213- compositor_context =
214- std::make_unique<flutter_runner::CompositorContext>(
215- thread_label, // debug label
216- std::move (view_token), // scenic view we attach our tree to
217- std::move (view_ref_pair), // scenic view ref/view ref control
218- std::move (session), // scenic session
219- on_session_error_callback, // session did encounter error
220- vsync_event); // vsync event handle
221- }
222-
223- return std::make_unique<flutter::Rasterizer>(
224- /* task_runners=*/ shell.GetTaskRunners (),
225- /* compositor_context=*/ std::move (compositor_context),
226- /* is_gpu_disabled_sync_switch=*/ shell.GetIsGpuDisabledSyncSwitch ());
227- });
228-
229205 UpdateNativeThreadLabelNames (thread_label_, task_runners);
230206
231207 settings_.verbose_logging = true ;
@@ -247,6 +223,76 @@ Engine::Engine(Delegate& delegate,
247223 });
248224 });
249225
226+ // Launch the engine in the appropriate configuration.
227+ auto run_configuration = flutter::RunConfiguration::InferFromSettings (
228+ settings_, task_runners.GetIOTaskRunner ());
229+
230+ // Setup the callback that will instantiate the rasterizer.
231+ flutter::Shell::CreateCallback<flutter::Rasterizer> on_create_rasterizer =
232+ fml::MakeCopyable ([thread_label = thread_label_, //
233+ view_token = std::move (view_token), //
234+ view_ref_pair = std::move (view_ref_pair), //
235+ session = std::move (session), //
236+ on_session_error_callback, //
237+ vsync_event = vsync_event_.get () //
238+ ](flutter::Shell& shell) mutable {
239+ std::unique_ptr<flutter_runner::CompositorContext> compositor_context;
240+ {
241+ {
242+ TRACE_DURATION (" flutter" , " CreateCompositorContext" );
243+ compositor_context =
244+ std::make_unique<flutter_runner::CompositorContext>(
245+ thread_label, // debug label
246+ std::move (view_token), // scenic view we attach our tree to
247+ std::move (view_ref_pair), // scenic view ref/view ref control
248+ std::move (session), // scenic session
249+ on_session_error_callback, // session did encounter error
250+ vsync_event); // vsync event handle
251+ }
252+
253+
254+ // tell concurrent task runner to deserialize all skps available from
255+ // the asset manager
256+ shell.GetDartVM ()->GetConcurrentMessageLoop ()->GetTaskRunner ()->PostTask ([raster_task_runner =
257+ shell.GetTaskRunners ().GetRasterTaskRunner (),
258+ compositor_context = compositor_context.get ()]() {
259+ TRACE_DURATION (" flutter" , " DeserializeSkps" );
260+ std::vector<std::unique_ptr<fml::Mapping>> skp_mappings =
261+ flutter::PersistentCache::GetCacheForProcess ()
262+ ->GetSkpsFromAssetManager ();
263+ std::vector<sk_sp<SkPicture>> pictures;
264+ int i = 0 ;
265+ for (auto & mapping : skp_mappings) {
266+
267+ std::unique_ptr<SkMemoryStream> stream =
268+ SkMemoryStream::MakeDirect (mapping->GetMapping (),
269+ mapping->GetSize ());
270+ SkDeserialProcs procs = {0 };
271+ procs.fImageProc = flutter::DeserializeImageWithoutData;
272+ procs.fTypefaceProc = flutter::DeserializeTypefaceWithoutData;
273+ sk_sp<SkPicture> picture =
274+ SkPicture::MakeFromStream (stream.get (), &procs);
275+ if (!picture) {
276+ FML_LOG (ERROR) << " Failed to deserialize picture " << i++;
277+ continue ;
278+ }
279+
280+ // Tell raster task runner to warmup have the compositor
281+ // context warm up the newly deserialized picture
282+ raster_task_runner->PostTask ([compositor_context, picture] {
283+ TRACE_DURATION (" flutter" , " WarmupSkp" );
284+ compositor_context->WarmupSkp (picture);
285+ });
286+ }
287+ });
288+ }
289+
290+ return std::make_unique<flutter::Rasterizer>(
291+ /* task_runners=*/ shell.GetTaskRunners (),
292+ /* compositor_context=*/ std::move (compositor_context),
293+ /* is_gpu_disabled_sync_switch=*/ shell.GetIsGpuDisabledSyncSwitch ());
294+ });
295+
250296 auto vm = flutter::DartVMRef::Create (settings_);
251297
252298 if (!isolate_snapshot) {
@@ -337,10 +383,6 @@ Engine::Engine(Delegate& delegate,
337383 };
338384 }
339385
340- // Launch the engine in the appropriate configuration.
341- auto run_configuration = flutter::RunConfiguration::InferFromSettings (
342- settings_, task_runners.GetIOTaskRunner ());
343-
344386 auto on_run_failure = [weak = weak_factory_.GetWeakPtr ()]() {
345387 // The engine could have been killed by the caller right after the
346388 // constructor was called but before it could run on the UI thread.
0 commit comments