@@ -262,6 +262,8 @@ struct flutterpi {
262
262
bool session_active ;
263
263
264
264
char * desired_videomode ;
265
+
266
+ struct frame_scheduler * scheduler ;
265
267
};
266
268
267
269
struct device_id_and_fd {
@@ -470,16 +472,13 @@ struct frame_req {
470
472
};
471
473
472
474
static int on_deferred_begin_frame (void * userdata ) {
473
- FlutterEngineResult engine_result ;
474
- struct frame_req * req ;
475
-
476
475
ASSERT_NOT_NULL (userdata );
477
- req = userdata ;
476
+ struct frame_req * req = userdata ;
478
477
479
478
assert (flutterpi_runs_platform_tasks_on_current_thread (req -> flutterpi ));
480
479
481
480
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 );
483
482
484
483
free (req );
485
484
@@ -491,88 +490,39 @@ static int on_deferred_begin_frame(void *userdata) {
491
490
return 0 ;
492
491
}
493
492
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 ) {
499
494
ASSERT_NOT_NULL (userdata );
500
- req = userdata ;
495
+ struct flutterpi * flutterpi = userdata ;
501
496
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" );
504
499
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 );
506
501
if (engine_result != kSuccess ) {
507
502
LOG_ERROR ("Couldn't signal frame begin to flutter engine. FlutterEngineOnVsync: %s\n" , FLUTTER_RESULT_TO_STRING (engine_result ));
508
- goto fail_free_req ;
509
503
}
510
-
511
- free (req );
512
504
} else {
505
+ struct frame_req * req = malloc (sizeof (struct frame_req ));
506
+ req -> flutterpi = flutterpi ;
507
+ req -> baton = baton ;
513
508
req -> vblank_ns = vblank_ns ;
514
509
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 );
516
512
if (ok != 0 ) {
517
513
LOG_ERROR ("Couldn't defer signalling frame begin.\n" );
518
- goto fail_free_req ;
514
+ free ( req ) ;
519
515
}
520
516
}
521
-
522
- return ;
523
-
524
- fail_free_req :
525
- free (req );
526
- return ;
527
517
}
528
518
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 ) {
537
520
ASSERT_NOT_NULL (userdata );
538
- flutterpi = userdata ;
521
+ struct flutterpi * flutterpi = userdata ;
539
522
540
- TRACER_INSTANT (flutterpi -> tracer , "on_frame_request " );
523
+ TRACER_INSTANT (flutterpi -> tracer , "on_frame_timings_request " );
541
524
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 );
576
526
}
577
527
578
528
UNUSED static FlutterTransformation on_get_transformation (void * userdata ) {
@@ -1356,7 +1306,7 @@ static FlutterEngine create_flutter_engine(
1356
1306
project_args .update_semantics_custom_action_callback = NULL ;
1357
1307
project_args .persistent_cache_path = paths -> asset_bundle_path ;
1358
1308
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 ;
1360
1310
project_args .custom_dart_entrypoint = NULL ;
1361
1311
project_args .custom_task_runners = & custom_task_runners ;
1362
1312
project_args .shutdown_dart_vm_when_done = true;
@@ -2257,7 +2207,6 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2257
2207
enum renderer_type renderer_type ;
2258
2208
struct texture_registry * texture_registry ;
2259
2209
struct plugin_registry * plugin_registry ;
2260
- struct frame_scheduler * scheduler ;
2261
2210
struct flutter_paths * paths ;
2262
2211
struct view_geometry geometry ;
2263
2212
FlutterEngineAOTData aot_data ;
@@ -2278,7 +2227,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2278
2227
char * * engine_argv , * desired_videomode ;
2279
2228
int ok , engine_argc , wakeup_fd ;
2280
2229
2281
- fpi = malloc ( sizeof * fpi );
2230
+ fpi = calloc ( 1 , sizeof * fpi );
2282
2231
if (fpi == NULL ) {
2283
2232
return NULL ;
2284
2233
}
@@ -2430,8 +2379,8 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2430
2379
goto fail_destroy_drmdev ;
2431
2380
}
2432
2381
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 ) {
2435
2384
LOG_ERROR ("Couldn't create frame scheduler.\n" );
2436
2385
goto fail_unref_tracer ;
2437
2386
}
@@ -2480,7 +2429,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2480
2429
if (cmd_args .dummy_display ) {
2481
2430
window = dummy_window_new (
2482
2431
tracer ,
2483
- scheduler ,
2432
+ fpi -> scheduler ,
2484
2433
renderer_type ,
2485
2434
gl_renderer ,
2486
2435
vk_renderer ,
@@ -2494,7 +2443,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2494
2443
window = kms_window_new (
2495
2444
// clang-format off
2496
2445
tracer ,
2497
- scheduler ,
2446
+ fpi -> scheduler ,
2498
2447
renderer_type ,
2499
2448
gl_renderer ,
2500
2449
vk_renderer ,
@@ -2658,7 +2607,6 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2658
2607
}
2659
2608
2660
2609
// We don't need these anymore.
2661
- frame_scheduler_unref (scheduler );
2662
2610
window_unref (window );
2663
2611
2664
2612
free (cmd_args .bundle_path );
@@ -2720,7 +2668,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2720
2668
}
2721
2669
2722
2670
fail_unref_scheduler :
2723
- frame_scheduler_unref (scheduler );
2671
+ frame_scheduler_unref (fpi -> scheduler );
2724
2672
2725
2673
fail_unref_tracer :
2726
2674
tracer_unref (tracer );
0 commit comments