@@ -40,8 +40,12 @@ struct frame_scheduler {
40
40
DEFINE_REF_OPS (frame_scheduler , n_refs )
41
41
DEFINE_STATIC_LOCK_OPS (frame_scheduler , mutex )
42
42
43
- struct frame_scheduler *
44
- frame_scheduler_new (bool uses_frame_requests , enum present_mode present_mode , fl_vsync_callback_t vsync_cb , void * userdata ) {
43
+ struct frame_scheduler * frame_scheduler_new (
44
+ bool uses_frame_requests ,
45
+ enum present_mode present_mode ,
46
+ fl_vsync_callback_t vsync_cb ,
47
+ void * userdata
48
+ ) {
45
49
// uses_frame_requests? => vsync_cb != NULL
46
50
assert (!uses_frame_requests || vsync_cb != NULL );
47
51
@@ -99,11 +103,11 @@ void frame_scheduler_on_fl_vsync_request(struct frame_scheduler *scheduler, intp
99
103
// as well if we draw too many frames at once. (Especially considering one framebuffer is probably busy with scanout right now)
100
104
//
101
105
106
+ bool begin_now = false;
107
+
102
108
if (scheduler -> present_mode == kTripleBufferedVsync_PresentMode ) {
103
109
/// TODO: Query actual frame interval and vblank timestamp here
104
- uint64_t now = get_monotonic_time ();
105
- uint64_t now_plus_frame_interval = now + 1000000000 /60 ;
106
- scheduler -> vsync_cb (scheduler -> userdata , vsync_baton , now , now_plus_frame_interval );
110
+ begin_now = true;
107
111
} else if (scheduler -> present_mode == kDoubleBufferedVsync_PresentMode ) {
108
112
frame_scheduler_lock (scheduler );
109
113
@@ -113,15 +117,19 @@ void frame_scheduler_on_fl_vsync_request(struct frame_scheduler *scheduler, intp
113
117
scheduler -> pending_frame_timings_request = vsync_baton ;
114
118
} else {
115
119
/// TODO: Query actual frame interval and vblank timestamp here
116
- uint64_t now = get_monotonic_time ();
117
- uint64_t now_plus_frame_interval = now + 1000000000 /60 ;
118
- scheduler -> vsync_cb (scheduler -> userdata , vsync_baton , now , now_plus_frame_interval );
120
+ begin_now = true;
119
121
}
120
122
121
123
frame_scheduler_unlock (scheduler );
122
124
} else {
123
125
UNREACHABLE ();
124
126
}
127
+
128
+ if (begin_now ) {
129
+ uint64_t now = get_monotonic_time ();
130
+ uint64_t now_plus_frame_interval = now + 1000000000 /60 ;
131
+ scheduler -> vsync_cb (scheduler -> userdata , vsync_baton , now , now_plus_frame_interval );
132
+ }
125
133
}
126
134
127
135
void frame_scheduler_on_rendering_complete (struct frame_scheduler * scheduler ) {
0 commit comments