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>
This commit is contained in:
Kenneth Graunke 2014-12-18 17:22:00 -08:00 committed by Keith Packard
parent f9e22cefcb
commit b51f804b1c
1 changed files with 7 additions and 8 deletions

View File

@ -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;