diff options
author | Daniel Stone <daniels@collabora.com> | 2016-10-24 14:07:10 +0100 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2017-02-07 19:16:31 +0000 |
commit | b0b53ddfbbdf2d2f5923af2a8b73cc87d3165109 (patch) | |
tree | 90bc8751e8297190c8722cf92ab574d4d016a1f4 | |
parent | 99f860c2d7b78e50bdb8bf1194307fef3f79d894 (diff) |
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 <daniels@collabora.com>
Differential Revision: https://phabricator.freedesktop.org/D1418
-rw-r--r-- | libweston/compositor-drm.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 825e0afe..1198a714 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -836,7 +836,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; @@ -943,13 +943,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) { ts.tv_sec = sec; ts.tv_nsec = usec * 1000; weston_output_finish_frame(&output->base, &ts, flags); |