Commit b51f804b authored by Kenneth Graunke's avatar Kenneth Graunke Committed by Keith Packard

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

v2: Don't do present_queue_vblank() /and/ present_execute() (a bug that
    snuck in during last minute tidying).
Signed-off-by: Kenneth Graunke's avatarKenneth Graunke <>
Reviewed-by: Keith Packard's avatarKeith Packard <>
Tested-by: Jason Ekstrand's avatarJason Ekstrand <>
Signed-off-by: Keith Packard's avatarKeith Packard <>
parent f9e22cef
......@@ -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) {
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;
ret = BadAlloc;
vblank->notifies = NULL;
return ret;
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