From 65d87d071f739fe2580a0c3ecb95686384eb0bf3 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Tue, 4 Apr 2017 17:54:32 +0100 Subject: [PATCH] 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 Reviewed-by: Pekka Paalanen --- libweston/compositor-drm.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 732b35ce..88782371 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -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; + output->vblank_pending++; } return 0; @@ -1048,13 +1048,14 @@ vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec, WP_PRESENTATION_FEEDBACK_KIND_HW_CLOCK; drm_output_update_msc(output, frame); - output->vblank_pending = 0; + output->vblank_pending--; + assert(output->vblank_pending >= 0); assert(s->fb_last || s->fb_current); drm_fb_unref(s->fb_last); 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);