@@ -262,6 +262,8 @@ struct flutterpi {
262262 bool session_active ;
263263
264264 char * desired_videomode ;
265+
266+ struct frame_scheduler * scheduler ;
265267};
266268
267269struct device_id_and_fd {
@@ -470,16 +472,13 @@ struct frame_req {
470472};
471473
472474static int on_deferred_begin_frame (void * userdata ) {
473- FlutterEngineResult engine_result ;
474- struct frame_req * req ;
475-
476475 ASSERT_NOT_NULL (userdata );
477- req = userdata ;
476+ struct frame_req * req = userdata ;
478477
479478 assert (flutterpi_runs_platform_tasks_on_current_thread (req -> flutterpi ));
480479
481480 TRACER_INSTANT (req -> flutterpi -> tracer , "FlutterEngineOnVsync" );
482- engine_result = req -> flutterpi -> flutter .procs .OnVsync (req -> flutterpi -> flutter .engine , req -> baton , req -> vblank_ns , req -> next_vblank_ns );
481+ FlutterEngineResult engine_result = req -> flutterpi -> flutter .procs .OnVsync (req -> flutterpi -> flutter .engine , req -> baton , req -> vblank_ns , req -> next_vblank_ns );
483482
484483 free (req );
485484
@@ -491,88 +490,39 @@ static int on_deferred_begin_frame(void *userdata) {
491490 return 0 ;
492491}
493492
494- UNUSED static void on_begin_frame (void * userdata , uint64_t vblank_ns , uint64_t next_vblank_ns ) {
495- FlutterEngineResult engine_result ;
496- struct frame_req * req ;
497- int ok ;
498-
493+ static void on_begin_frame (void * userdata , intptr_t baton , uint64_t vblank_ns , uint64_t next_vblank_ns ) {
499494 ASSERT_NOT_NULL (userdata );
500- req = userdata ;
495+ struct flutterpi * flutterpi = userdata ;
501496
502- if (flutterpi_runs_platform_tasks_on_current_thread (req -> flutterpi )) {
503- TRACER_INSTANT (req -> flutterpi -> tracer , "FlutterEngineOnVsync" );
497+ if (flutterpi_runs_platform_tasks_on_current_thread (flutterpi )) {
498+ TRACER_INSTANT (flutterpi -> tracer , "FlutterEngineOnVsync" );
504499
505- engine_result = req -> flutterpi -> flutter .procs .OnVsync (req -> flutterpi -> flutter .engine , req -> baton , vblank_ns , next_vblank_ns );
500+ FlutterEngineResult engine_result = flutterpi -> flutter .procs .OnVsync (flutterpi -> flutter .engine , baton , vblank_ns , next_vblank_ns );
506501 if (engine_result != kSuccess ) {
507502 LOG_ERROR ("Couldn't signal frame begin to flutter engine. FlutterEngineOnVsync: %s\n" , FLUTTER_RESULT_TO_STRING (engine_result ));
508- goto fail_free_req ;
509503 }
510-
511- free (req );
512504 } else {
505+ struct frame_req * req = malloc (sizeof (struct frame_req ));
506+ req -> flutterpi = flutterpi ;
507+ req -> baton = baton ;
513508 req -> vblank_ns = vblank_ns ;
514509 req -> next_vblank_ns = next_vblank_ns ;
515- ok = flutterpi_post_platform_task (on_deferred_begin_frame , req );
510+
511+ int ok = flutterpi_post_platform_task (on_deferred_begin_frame , req );
516512 if (ok != 0 ) {
517513 LOG_ERROR ("Couldn't defer signalling frame begin.\n" );
518- goto fail_free_req ;
514+ free ( req ) ;
519515 }
520516 }
521-
522- return ;
523-
524- fail_free_req :
525- free (req );
526- return ;
527517}
528518
529- /// Called on some flutter internal thread to request a frame,
530- /// and also get the vblank timestamp of the pageflip preceding that frame.
531- UNUSED static void on_frame_request (void * userdata , intptr_t baton ) {
532- FlutterEngineResult engine_result ;
533- struct flutterpi * flutterpi ;
534- struct frame_req * req ;
535- int ok ;
536-
519+ static void on_frame_timings_request (void * userdata , intptr_t baton ) {
537520 ASSERT_NOT_NULL (userdata );
538- flutterpi = userdata ;
521+ struct flutterpi * flutterpi = userdata ;
539522
540- TRACER_INSTANT (flutterpi -> tracer , "on_frame_request " );
523+ TRACER_INSTANT (flutterpi -> tracer , "on_frame_timings_request " );
541524
542- req = malloc (sizeof * req );
543- if (req == NULL ) {
544- LOG_ERROR ("Out of memory\n" );
545- return ;
546- }
547-
548- req -> flutterpi = flutterpi ;
549- req -> baton = baton ;
550- req -> vblank_ns = get_monotonic_time ();
551- req -> next_vblank_ns = req -> vblank_ns + (uint64_t ) (1000000000.0 / compositor_get_refresh_rate (flutterpi -> compositor ));
552-
553- if (flutterpi_runs_platform_tasks_on_current_thread (req -> flutterpi )) {
554- TRACER_INSTANT (req -> flutterpi -> tracer , "FlutterEngineOnVsync" );
555-
556- engine_result =
557- req -> flutterpi -> flutter .procs .OnVsync (req -> flutterpi -> flutter .engine , req -> baton , req -> vblank_ns , req -> next_vblank_ns );
558- if (engine_result != kSuccess ) {
559- LOG_ERROR ("Couldn't signal frame begin to flutter engine. FlutterEngineOnVsync: %s\n" , FLUTTER_RESULT_TO_STRING (engine_result ));
560- goto fail_free_req ;
561- }
562-
563- free (req );
564- } else {
565- ok = flutterpi_post_platform_task (on_deferred_begin_frame , req );
566- if (ok != 0 ) {
567- LOG_ERROR ("Couldn't defer signalling frame begin.\n" );
568- goto fail_free_req ;
569- }
570- }
571-
572- return ;
573-
574- fail_free_req :
575- free (req );
525+ frame_scheduler_on_fl_vsync_request (flutterpi -> scheduler , baton );
576526}
577527
578528UNUSED static FlutterTransformation on_get_transformation (void * userdata ) {
@@ -1356,7 +1306,7 @@ static FlutterEngine create_flutter_engine(
13561306 project_args .update_semantics_custom_action_callback = NULL ;
13571307 project_args .persistent_cache_path = paths -> asset_bundle_path ;
13581308 project_args .is_persistent_cache_read_only = false;
1359- project_args .vsync_callback = NULL ; // on_frame_request, /* broken since 2.2, kinda *
1309+ project_args .vsync_callback = on_frame_timings_request ;
13601310 project_args .custom_dart_entrypoint = NULL ;
13611311 project_args .custom_task_runners = & custom_task_runners ;
13621312 project_args .shutdown_dart_vm_when_done = true;
@@ -2257,7 +2207,6 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
22572207 enum renderer_type renderer_type ;
22582208 struct texture_registry * texture_registry ;
22592209 struct plugin_registry * plugin_registry ;
2260- struct frame_scheduler * scheduler ;
22612210 struct flutter_paths * paths ;
22622211 struct view_geometry geometry ;
22632212 FlutterEngineAOTData aot_data ;
@@ -2278,7 +2227,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
22782227 char * * engine_argv , * desired_videomode ;
22792228 int ok , engine_argc , wakeup_fd ;
22802229
2281- fpi = malloc ( sizeof * fpi );
2230+ fpi = calloc ( 1 , sizeof * fpi );
22822231 if (fpi == NULL ) {
22832232 return NULL ;
22842233 }
@@ -2430,8 +2379,8 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
24302379 goto fail_destroy_drmdev ;
24312380 }
24322381
2433- scheduler = frame_scheduler_new (false , kDoubleBufferedVsync_PresentMode , NULL , NULL );
2434- if (scheduler == NULL ) {
2382+ fpi -> scheduler = frame_scheduler_new (true , kDoubleBufferedVsync_PresentMode , on_begin_frame , fpi );
2383+ if (fpi -> scheduler == NULL ) {
24352384 LOG_ERROR ("Couldn't create frame scheduler.\n" );
24362385 goto fail_unref_tracer ;
24372386 }
@@ -2480,7 +2429,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
24802429 if (cmd_args .dummy_display ) {
24812430 window = dummy_window_new (
24822431 tracer ,
2483- scheduler ,
2432+ fpi -> scheduler ,
24842433 renderer_type ,
24852434 gl_renderer ,
24862435 vk_renderer ,
@@ -2494,7 +2443,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
24942443 window = kms_window_new (
24952444 // clang-format off
24962445 tracer ,
2497- scheduler ,
2446+ fpi -> scheduler ,
24982447 renderer_type ,
24992448 gl_renderer ,
25002449 vk_renderer ,
@@ -2658,7 +2607,6 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
26582607 }
26592608
26602609 // We don't need these anymore.
2661- frame_scheduler_unref (scheduler );
26622610 window_unref (window );
26632611
26642612 free (cmd_args .bundle_path );
@@ -2720,7 +2668,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
27202668 }
27212669
27222670fail_unref_scheduler :
2723- frame_scheduler_unref (scheduler );
2671+ frame_scheduler_unref (fpi -> scheduler );
27242672
27252673fail_unref_tracer :
27262674 tracer_unref (tracer );
0 commit comments