summaryrefslogtreecommitdiff
path: root/present/present.c
diff options
context:
space:
mode:
Diffstat (limited to 'present/present.c')
-rw-r--r--present/present.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/present/present.c b/present/present.c
index 66e0f21b3..8cf3b6f77 100644
--- a/present/present.c
+++ b/present/present.c
@@ -717,6 +717,28 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
present_vblank_destroy(vblank);
}
+/*
+ * Returns:
+ * TRUE if the first MSC value is after the second one
+ * FALSE if the first MSC value is equal to or before the second one
+ */
+static Bool
+msc_is_after(uint64_t test, uint64_t reference)
+{
+ return (int64_t)(test - reference) > 0;
+}
+
+/*
+ * Returns:
+ * TRUE if the first MSC value is equal to or after the second one
+ * FALSE if the first MSC value is before the second one
+ */
+static Bool
+msc_is_equal_or_after(uint64_t test, uint64_t reference)
+{
+ return (int64_t)(test - reference) >= 0;
+}
+
int
present_pixmap(WindowPtr window,
PixmapPtr pixmap,
@@ -771,14 +793,14 @@ present_pixmap(WindowPtr window,
/* Adjust target_msc to match modulus
*/
- if (crtc_msc >= target_msc) {
+ if (msc_is_equal_or_after(crtc_msc, target_msc)) {
if (divisor != 0) {
target_msc = crtc_msc - (crtc_msc % divisor) + remainder;
if (options & PresentOptionAsync) {
- if (target_msc < crtc_msc)
+ if (msc_is_after(crtc_msc, target_msc))
target_msc += divisor;
} else {
- if (target_msc <= crtc_msc)
+ if (msc_is_equal_or_after(crtc_msc, target_msc))
target_msc += divisor;
}
} else {
@@ -864,7 +886,7 @@ present_pixmap(WindowPtr window,
if (pixmap != NULL &&
!(options & PresentOptionCopy) &&
screen_priv->info) {
- if (target_msc > crtc_msc &&
+ if (msc_is_after(target_msc, crtc_msc) &&
present_check_flip (target_crtc, window, pixmap, TRUE, valid, x_off, y_off))
{
vblank->flip = TRUE;
@@ -897,7 +919,7 @@ present_pixmap(WindowPtr window,
xorg_list_add(&vblank->event_queue, &present_exec_queue);
vblank->queued = TRUE;
- if (target_msc > crtc_msc) {
+ if (msc_is_after(target_msc, crtc_msc)) {
ret = present_queue_vblank(screen, target_crtc, vblank->event_id, target_msc);
if (ret == Success)
return Success;