[PATCH 16/19] present: Add cleanups for window flip mode

Roman Gilg subdiff at gmail.com
Mon Jan 29 13:34:14 UTC 2018


Make sure that vblanks and windows get cleaned up correctly
in window flip mode.

Signed-off-by: Roman Gilg <subdiff at gmail.com>
---
 present/present_screen.c | 33 ++++++++++++++++++++++++++++++++-
 present/present_vblank.c |  2 ++
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/present/present_screen.c b/present/present_screen.c
index b0cae0f..8ad14ad 100644
--- a/present/present_screen.c
+++ b/present/present_screen.c
@@ -109,6 +109,32 @@ present_clear_window_flip(WindowPtr window)
     }
 }
 
+static void
+present_wnmd_clear_window_flip(WindowPtr window)
+{
+    present_window_priv_ptr     window_priv = present_window_priv(window);
+    present_vblank_ptr          vblank, tmp;
+
+    if (window_priv->flip_pending) {
+        present_wnmd_set_abort_flip(window);
+        window_priv->flip_pending->window = NULL;
+    }
+
+    xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->idle_queue, event_queue) {
+        present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
+        /* The pixmap will be destroyed by freeing the window resources. */
+        vblank->pixmap = NULL;
+        present_vblank_destroy(vblank);
+    }
+
+    vblank = window_priv->flip_active;
+    if (vblank) {
+        present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
+        present_vblank_destroy(vblank);
+    }
+    window_priv->flip_active = NULL;
+}
+
 /*
  * Hook the close window function to clean up our window private
  */
@@ -124,7 +150,12 @@ present_destroy_window(WindowPtr window)
         present_clear_window_notifies(window);
         present_free_events(window);
         present_free_window_vblank(window);
-        present_clear_window_flip(window);
+
+        if (screen_priv->wnmd_info)
+            present_wnmd_clear_window_flip(window);
+        else
+            present_clear_window_flip(window);
+
         free(window_priv);
     }
     unwrap(screen_priv, screen, DestroyWindow);
diff --git a/present/present_vblank.c b/present/present_vblank.c
index dbfedb4..af6ebe5 100644
--- a/present/present_vblank.c
+++ b/present/present_vblank.c
@@ -169,6 +169,8 @@ present_vblank_destroy(present_vblank_ptr vblank)
 {
     /* Remove vblank from window and screen lists */
     xorg_list_del(&vblank->window_list);
+    /* Also make sure vblank is removed from event queue (wnmd) */
+    xorg_list_del(&vblank->event_queue);
 
     DebugPresent(("\td %lld %p %8lld: %08lx -> %08lx\n",
                   vblank->event_id, vblank, vblank->target_msc,
-- 
2.7.4



More information about the xorg-devel mailing list