diff options
author | Kenneth Graunke <kenneth@whitecape.org> | 2014-12-18 17:22:00 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-12-25 13:39:04 -0800 |
commit | b51f804b1ca826699296aff9de27d19257d78dae (patch) | |
tree | 1a263162aae965fe8e9d9819be7e8da94270962c /present | |
parent | f9e22cefcb9684bf495ada3ec4b0231ab2dc6cff (diff) |
present: If present_queue_vblank() fails, do present_execute().
Previously, if present_queue_vblank() failed, we simply dropped the
present request on the floor, and returned an error. This was rather
mean to clients - after presenting, they wait for a PresentComplete
event to come back. But since the present never happens, they end up
waiting forever, and lock up in poll().
This patch falls back to present_execute if present_queue_vblank fails.
We still print a debugging message to warn when queueing fails, which
allows us to continue debugging problems, but makes Present robust
enough to not lock up people's compositing manager when vblank bugs
happen.
v2: Don't do present_queue_vblank() /and/ present_execute() (a bug that
snuck in during last minute tidying).
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Keith Packard <keithp@keithp.com>
Tested-by: Jason Ekstrand <jason.ekstrand@intel.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'present')
-rw-r--r-- | present/present.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/present/present.c b/present/present.c index e27fe30ad..2a705a968 100644 --- a/present/present.c +++ b/present/present.c @@ -871,19 +871,18 @@ present_pixmap(WindowPtr window, vblank->queued = TRUE; if ((pixmap && target_msc >= crtc_msc) || (!pixmap && target_msc > crtc_msc)) { ret = present_queue_vblank(screen, target_crtc, vblank->event_id, target_msc); - if (ret != Success) { - xorg_list_del(&vblank->event_queue); - vblank->queued = FALSE; - goto failure; - } - } else - present_execute(vblank, ust, crtc_msc); + if (ret == Success) + return Success; + + DebugPresent(("present_queue_vblank failed\n")); + } + + present_execute(vblank, ust, crtc_msc); return Success; no_mem: ret = BadAlloc; -failure: vblank->notifies = NULL; present_vblank_destroy(vblank); return ret; |