@@ -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 ) {
@@ -1351,7 +1301,7 @@ static FlutterEngine create_flutter_engine(
1351
1301
project_args .update_semantics_custom_action_callback = NULL ;
1352
1302
project_args .persistent_cache_path = paths -> asset_bundle_path ;
1353
1303
project_args .is_persistent_cache_read_only = false;
1354
- project_args .vsync_callback = NULL ; // on_frame_request, /* broken since 2.2, kinda *
1304
+ project_args .vsync_callback = on_frame_timings_request ;
1355
1305
project_args .custom_dart_entrypoint = NULL ;
1356
1306
project_args .custom_task_runners = & custom_task_runners ;
1357
1307
project_args .shutdown_dart_vm_when_done = true;
@@ -2252,7 +2202,6 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2252
2202
enum renderer_type renderer_type ;
2253
2203
struct texture_registry * texture_registry ;
2254
2204
struct plugin_registry * plugin_registry ;
2255
- struct frame_scheduler * scheduler ;
2256
2205
struct flutter_paths * paths ;
2257
2206
struct view_geometry geometry ;
2258
2207
FlutterEngineAOTData aot_data ;
@@ -2273,7 +2222,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2273
2222
char * * engine_argv , * desired_videomode ;
2274
2223
int ok , engine_argc , wakeup_fd ;
2275
2224
2276
- fpi = malloc ( sizeof * fpi );
2225
+ fpi = calloc ( 1 , sizeof * fpi );
2277
2226
if (fpi == NULL ) {
2278
2227
return NULL ;
2279
2228
}
@@ -2425,8 +2374,8 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2425
2374
goto fail_destroy_drmdev ;
2426
2375
}
2427
2376
2428
- scheduler = frame_scheduler_new (false , kDoubleBufferedVsync_PresentMode , NULL , NULL );
2429
- if (scheduler == NULL ) {
2377
+ fpi -> scheduler = frame_scheduler_new (true , kDoubleBufferedVsync_PresentMode , on_begin_frame , fpi );
2378
+ if (fpi -> scheduler == NULL ) {
2430
2379
LOG_ERROR ("Couldn't create frame scheduler.\n" );
2431
2380
goto fail_unref_tracer ;
2432
2381
}
@@ -2475,7 +2424,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2475
2424
if (cmd_args .dummy_display ) {
2476
2425
window = dummy_window_new (
2477
2426
tracer ,
2478
- scheduler ,
2427
+ fpi -> scheduler ,
2479
2428
renderer_type ,
2480
2429
gl_renderer ,
2481
2430
vk_renderer ,
@@ -2489,7 +2438,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2489
2438
window = kms_window_new (
2490
2439
// clang-format off
2491
2440
tracer ,
2492
- scheduler ,
2441
+ fpi -> scheduler ,
2493
2442
renderer_type ,
2494
2443
gl_renderer ,
2495
2444
vk_renderer ,
@@ -2653,7 +2602,6 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2653
2602
}
2654
2603
2655
2604
// We don't need these anymore.
2656
- frame_scheduler_unref (scheduler );
2657
2605
window_unref (window );
2658
2606
2659
2607
free (cmd_args .bundle_path );
@@ -2715,7 +2663,7 @@ struct flutterpi *flutterpi_new_from_args(int argc, char **argv) {
2715
2663
}
2716
2664
2717
2665
fail_unref_scheduler :
2718
- frame_scheduler_unref (scheduler );
2666
+ frame_scheduler_unref (fpi -> scheduler );
2719
2667
2720
2668
fail_unref_tracer :
2721
2669
tracer_unref (tracer );
0 commit comments