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
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's avatarKenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>
Tested-by: Jason Ekstrand's avatarJason Ekstrand <jason.ekstrand@intel.com>
Signed-off-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>
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) {
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;
......
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