291f2df
From c2794c826378e89c5914112a59f2ad939a38a262 Mon Sep 17 00:00:00 2001
291f2df
From: Chris Wilson <chris@chris-wilson.co.uk>
291f2df
Date: Sat, 14 Feb 2015 09:58:44 +0000
291f2df
Subject: [PATCH xserver 2/2] present: Fix presentation of flips out of order
291f2df
291f2df
The flip queue currently only holds events submitted to the driver for
291f2df
flipping, awaiting the completion notifier. It is short. We therefore
291f2df
can speed up interrupt processing by keeping the small number of events
291f2df
ready to be flipped on the end of the flip queue. By appending the
291f2df
events to the flip_queue in the order that they become ready, we also
291f2df
resolve one issue causing Present to display frames out of order.
291f2df
291f2df
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
291f2df
---
291f2df
 present/present.c | 9 ++++++---
291f2df
 1 file changed, 6 insertions(+), 3 deletions(-)
291f2df
291f2df
diff --git a/present/present.c b/present/present.c
291f2df
index 97ad783..43eeecb 100644
291f2df
--- a/present/present.c
291f2df
+++ b/present/present.c
291f2df
@@ -353,10 +353,10 @@ present_re_execute(present_vblank_ptr vblank)
291f2df
 static void
291f2df
 present_flip_try_ready(ScreenPtr screen)
291f2df
 {
291f2df
-    present_vblank_ptr  vblank, tmp;
291f2df
+    present_vblank_ptr  vblank;
291f2df
 
291f2df
-    xorg_list_for_each_entry_safe(vblank, tmp, &present_exec_queue, event_queue) {
291f2df
-        if (vblank->flip_ready) {
291f2df
+    xorg_list_for_each_entry(vblank, &present_flip_queue, event_queue) {
291f2df
+        if (vblank->queued) {
291f2df
             present_re_execute(vblank);
291f2df
             return;
291f2df
         }
291f2df
@@ -656,6 +656,8 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
291f2df
             DebugPresent(("\tr %lld %p (pending %p unflip %lld)\n",
291f2df
                           vblank->event_id, vblank,
291f2df
                           screen_priv->flip_pending, screen_priv->unflip_event_id));
291f2df
+            xorg_list_del(&vblank->event_queue);
291f2df
+            xorg_list_append(&vblank->event_queue, &present_flip_queue);
291f2df
             vblank->flip_ready = TRUE;
291f2df
             return;
291f2df
         }
291f2df
@@ -994,6 +996,7 @@ present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64
291f2df
     xorg_list_for_each_entry(vblank, &present_flip_queue, event_queue) {
291f2df
         if (vblank->event_id == event_id) {
291f2df
             xorg_list_del(&vblank->event_queue);
291f2df
+            vblank->queued = FALSE;
291f2df
             return;
291f2df
         }
291f2df
     }
291f2df
-- 
291f2df
2.5.0
291f2df