@@ -861,24 +861,10 @@ void Engine::WarmupSkps(
861
861
std::shared_ptr<flutter::AssetManager> asset_manager,
862
862
std::optional<const std::vector<std::string>> skp_names,
863
863
std::optional<std::function<void (uint32_t )>> completion_callback) {
864
- // We use a raw pointer here because we want to keep this alive until all gpu
865
- // work is done and the callbacks skia takes for this are function pointers
866
- // so we are unable to use a lambda that captures the smart pointer.
867
- SurfaceProducerSurface* skp_warmup_surface =
868
- surface_producer->ProduceOffscreenSurface (size).release ();
869
- if (!skp_warmup_surface) {
870
- FML_LOG (ERROR) << " Failed to create offscreen warmup surface" ;
871
- // Tell client that zero shaders were warmed up because warmup failed.
872
- if (completion_callback.has_value () && completion_callback.value ()) {
873
- completion_callback.value ()(0 );
874
- }
875
- return ;
876
- }
877
-
878
864
// tell concurrent task runner to deserialize all skps available from
879
865
// the asset manager
880
- concurrent_task_runner->PostTask ([raster_task_runner, skp_warmup_surface ,
881
- surface_producer, asset_manager, skp_names,
866
+ concurrent_task_runner->PostTask ([raster_task_runner, size, surface_producer ,
867
+ asset_manager, skp_names,
882
868
completion_callback]() {
883
869
TRACE_DURATION (" flutter" , " DeserializeSkps" );
884
870
std::vector<std::unique_ptr<fml::Mapping>> skp_mappings;
@@ -895,6 +881,15 @@ void Engine::WarmupSkps(
895
881
skp_mappings = asset_manager->GetAsMappings (" .*\\ .skp$" , " shaders" );
896
882
}
897
883
884
+ if (skp_mappings.size () == 0 ) {
885
+ FML_LOG (WARNING)
886
+ << " Engine::WarmupSkps got zero SKP mappings, returning early" ;
887
+ if (completion_callback.has_value () && completion_callback.value ()) {
888
+ completion_callback.value ()(0 );
889
+ }
890
+ return ;
891
+ }
892
+
898
893
size_t total_size = 0 ;
899
894
for (auto & mapping : skp_mappings) {
900
895
total_size += mapping->GetSize ();
@@ -920,10 +915,25 @@ void Engine::WarmupSkps(
920
915
921
916
// Tell raster task runner to warmup have the compositor
922
917
// context warm up the newly deserialized picture
923
- raster_task_runner->PostTask ([skp_warmup_surface, picture ,
924
- surface_producer, completion_callback, i,
918
+ raster_task_runner->PostTask ([picture, size, surface_producer ,
919
+ completion_callback, i,
925
920
count = skp_mappings.size ()] {
926
921
TRACE_DURATION (" flutter" , " WarmupSkp" );
922
+
923
+ // We use a raw pointer here because we want to keep this alive until
924
+ // all gpu work is done and the callbacks skia takes for this are
925
+ // function pointers so we are unable to use a lambda that captures the
926
+ // smart pointer.
927
+ static SurfaceProducerSurface* skp_warmup_surface =
928
+ surface_producer->ProduceOffscreenSurface (size).release ();
929
+ if (!skp_warmup_surface) {
930
+ FML_LOG (ERROR) << " Failed to create offscreen warmup surface" ;
931
+ // Tell client that zero shaders were warmed up because warmup failed.
932
+ if (completion_callback.has_value () && completion_callback.value ()) {
933
+ completion_callback.value ()(0 );
934
+ }
935
+ return ;
936
+ }
927
937
skp_warmup_surface->GetSkiaSurface ()->getCanvas ()->drawPicture (picture);
928
938
929
939
if (i == count - 1 ) {
0 commit comments