Commit 65d87d07 authored by Daniel Stone's avatar Daniel Stone Committed by Pekka Paalanen

compositor-drm: Turn vblank_pending from bool to refcount

vblank_pending is currently a bool, which is reset on every vblank
requests (i.e. sprite pageflip). This can occur more than once per
frame, so turn it into a callback, so we only fire frame-done when we've
collected all the events.

This fixes unexpected behaviour when multiple views per output have been
promoted to DRM planes.
Signed-off-by: Daniel Stone's avatarDaniel Stone <>
Reviewed-by: Pekka Paalanen's avatarPekka Paalanen <>
parent f30a18c1
......@@ -937,7 +937,7 @@ drm_output_repaint(struct weston_output *output_base,
s->fb_last = s->fb_current;
s->fb_current = s->fb_pending;
s->fb_pending = NULL;
output->vblank_pending = 1;
return 0;
......@@ -1048,13 +1048,14 @@ vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec,
drm_output_update_msc(output, frame);
output->vblank_pending = 0;
assert(output->vblank_pending >= 0);
assert(s->fb_last || s->fb_current);
s->fb_last = NULL;
if (!output->page_flip_pending) {
if (!output->page_flip_pending && !output->vblank_pending) {
/* Stop the pageflip timer instead of rearming it here */
if (output->pageflip_timer)
wl_event_source_timer_update(output->pageflip_timer, 0);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment