Commit 205c0a01 authored by Daniel Stone's avatar Daniel Stone Committed by Pekka Paalanen

compositor-drm: Clean up page_flip_pending path

page_flip_pending is only be set when do a pageflip to a newly-rendered
buffer; if the flag is not set, we have landed in the start_repaint_loop
path where the vblank query fails, and thus we must pageflip to the same

This test was not sufficient for what it was supposed to guard:
releasing framebuffers back. When using client-supplied framebuffers, it
is possible to reuse the same buffer multiple times, and we would send a
framebuffer-release event too early.

However, since we have a properly reference-counted drm_fb now, we can
just drop this test, and rely on the reference counting to prevent
too-early release of client framebuffers.

page_flip_pending now becomes exactly what the name suggests: a flag
which indicates whether or not we are expecting a pageflip event. Add
asserts here to verify that we never receive a pageflip event we weren't
Signed-off-by: Daniel Stone's avatarDaniel Stone <>
Reviewed-by: Pekka Paalanen's avatarPekka Paalanen <>
parent 65d87d07
......@@ -883,6 +883,7 @@ drm_output_repaint(struct weston_output *output_base,
output->fb_current = output->fb_pending;
output->fb_pending = NULL;
output->page_flip_pending = 1;
if (output->pageflip_timer)
......@@ -1008,6 +1009,9 @@ drm_output_start_repaint_loop(struct weston_output *output_base)
fb_id = output->fb_current->fb_id;
if (drmModePageFlip(backend->drm.fd, output->crtc_id, fb_id,
DRM_MODE_PAGE_FLIP_EVENT, output) < 0) {
weston_log("queueing pageflip failed: %m\n");
......@@ -1018,6 +1022,9 @@ drm_output_start_repaint_loop(struct weston_output *output_base)
output->fb_last = drm_fb_ref(output->fb_current);
output->page_flip_pending = 1;
......@@ -1081,16 +1088,12 @@ page_flip_handler(int fd, unsigned int frame,
drm_output_update_msc(output, frame);
/* We don't set page_flip_pending on start_repaint_loop, in that case
* we just want to page flip to the current buffer to get an accurate
* timestamp */
if (output->page_flip_pending) {
output->fb_last = NULL;
output->page_flip_pending = 0;
output->fb_last = NULL;
if (output->destroy_pending)
else if (output->disable_pending)
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