[xorg-x11-server] Add patch from ickle to fix flicker on login / durin vt switch

Ray Strode rstrode at fedoraproject.org
Thu Feb 5 19:39:01 UTC 2015


commit 6fce07ef10e71dbda5b520fcc07cae964711ae6e
Author: Ray Strode <rstrode at redhat.com>
Date:   Thu Feb 5 14:38:25 2015 -0500

    Add patch from ickle to fix flicker on login / durin vt switch
    
    see https://bugzilla.gnome.org/show_bug.cgi?id=737226

 ...e-unflip-work-when-the-flip-window-is-des.patch |  128 ++++++++++++++++++++
 xorg-x11-server.spec                               |    9 ++-
 2 files changed, 136 insertions(+), 1 deletions(-)
---
diff --git a/0001-present-make-unflip-work-when-the-flip-window-is-des.patch b/0001-present-make-unflip-work-when-the-flip-window-is-des.patch
new file mode 100644
index 0000000..ca919a8
--- /dev/null
+++ b/0001-present-make-unflip-work-when-the-flip-window-is-des.patch
@@ -0,0 +1,128 @@
+From df3b03e05b5c826584fc75466f404b53844edcf4 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Thu, 5 Feb 2015 14:11:40 -0500
+Subject: [PATCH] present: make unflip work when the flip window is destroyed
+ or clipped
+
+Present allows a window to redirect itself to a client provided buffer.
+
+If that buffer is about to be invalidated, the window needs to direct
+itself back to its original buffer (some part of the root window/front
+buffer), and update that storage to have a current contents (a process
+called "unflipping").
+
+The present_unflip finds the original buffer by way of the drawable
+associated with the window presented to.  If the window is already
+destroyed, then it get dissociated from its drawable, and the copy
+operation used to update the original buffer fails.
+
+When the compositor exits its buffers become invalidated and the
+composite overlay window gets destroyed at the same time.  This leads
+to a temporary flash of the root window as it looked at the time
+the X server was started.
+
+The present_unflip function performs the copy using the clip list of
+the window presented to. If the window is clipped, the copy operation
+used to update the original buffer will be clipped as well.
+
+When VT switching away the X server sets the clip to 0, so that
+applications get fully reexposed the next time the VT is active.
+
+When VT switching the present_unflip function is called.  This leads
+to a temporary flash of the root window as it looked at the time
+the X server was started.
+
+This commit changes present_flip to update the front buffer directly,
+rather than by way of the drawable associated with the window presented
+to.  At the same time, doing this means avoiding the clip list
+associated with the window.
+---
+ present/present.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/present/present.c b/present/present.c
+index 8e4829e..a516575 100644
+--- a/present/present.c
++++ b/present/present.c
+@@ -377,74 +377,74 @@ present_set_tree_pixmap(WindowPtr window, PixmapPtr pixmap)
+ 
+     visit.old = (*screen->GetWindowPixmap)(window);
+     visit.new = pixmap;
+     if (visit.old == visit.new)
+         return;
+     TraverseTree(window, present_set_tree_pixmap_visit, &visit);
+ }
+ 
+ static void
+ present_set_abort_flip(ScreenPtr screen)
+ {
+     present_screen_priv_ptr screen_priv = present_screen_priv(screen);
+ 
+     /* Switch back to using the screen pixmap now to avoid
+      * 2D applications drawing to the wrong pixmap.
+      */
+ 
+     if (screen_priv->flip_window)
+         present_set_tree_pixmap(screen_priv->flip_window,
+                                   (*screen->GetScreenPixmap)(screen));
+ 
+     present_set_tree_pixmap(screen->root, (*screen->GetScreenPixmap)(screen));
+ 
+     screen_priv->flip_pending->abort_flip = TRUE;
+ }
+ 
+ static void
+ present_unflip(ScreenPtr screen)
+ {
+     present_screen_priv_ptr screen_priv = present_screen_priv(screen);
++    PixmapPtr pixmap = (*screen->GetScreenPixmap)(screen);
+ 
+     assert (!screen_priv->unflip_event_id);
+     assert (!screen_priv->flip_pending);
+ 
+     if (screen_priv->flip_window)
+-        present_set_tree_pixmap(screen_priv->flip_window,
+-                                  (*screen->GetScreenPixmap)(screen));
++        present_set_tree_pixmap(screen_priv->flip_window, pixmap);
+ 
+-    present_set_tree_pixmap(screen->root, (*screen->GetScreenPixmap)(screen));
++    present_set_tree_pixmap(screen->root, pixmap);
+ 
+     /* Update the screen pixmap with the current flip pixmap contents
+      */
+     if (screen_priv->flip_pixmap && screen_priv->flip_window) {
+-        present_copy_region(&screen_priv->flip_window->drawable,
++        present_copy_region(&pixmap->drawable,
+                             screen_priv->flip_pixmap,
+                             NULL, 0, 0);
+     }
+     screen_priv->unflip_event_id = ++present_event_id;
+     DebugPresent(("u %lld\n", screen_priv->unflip_event_id));
+     (*screen_priv->info->unflip) (screen, screen_priv->unflip_event_id);
+ }
+ 
+ static void
+ present_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
+ {
+     ScreenPtr                   screen = vblank->screen;
+     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
+ 
+     DebugPresent(("\tn %lld %p %8lld: %08lx -> %08lx\n",
+                   vblank->event_id, vblank, vblank->target_msc,
+                   vblank->pixmap ? vblank->pixmap->drawable.id : 0,
+                   vblank->window ? vblank->window->drawable.id : 0));
+ 
+     assert (vblank == screen_priv->flip_pending);
+ 
+     present_flip_idle(screen);
+ 
+     xorg_list_del(&vblank->event_queue);
+ 
+     /* Transfer reference for pixmap and fence from vblank to screen_priv */
+     screen_priv->flip_crtc = vblank->crtc;
+     screen_priv->flip_window = vblank->window;
+     screen_priv->flip_serial = vblank->serial;
+     screen_priv->flip_pixmap = vblank->pixmap;
+-- 
+2.1.0
+
diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec
index 385065b..ed67c84 100644
--- a/xorg-x11-server.spec
+++ b/xorg-x11-server.spec
@@ -42,7 +42,7 @@
 Summary:   X.Org X11 X server
 Name:      xorg-x11-server
 Version:   1.16.2.901
-Release:   1%{?gitdate:.%{gitdate}}%{dist}
+Release:   2%{?gitdate:.%{gitdate}}%{dist}
 URL:       http://www.x.org
 License:   MIT
 Group:     User Interface/X
@@ -82,6 +82,9 @@ Patch5002: xserver-1.4.99-ssh-isnt-local.patch
 Patch6030: xserver-1.6.99-right-of.patch
 #Patch6044: xserver-1.6.99-hush-prerelease-warning.patch
 
+# https://bugzilla.gnome.org/show_bug.cgi?id=737226
+Patch6045: 0001-present-make-unflip-work-when-the-flip-window-is-des.patch
+
 Patch7025: 0001-Always-install-vbe-and-int10-sdk-headers.patch
 
 # do not upstream - do not even use here yet
@@ -630,6 +633,10 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
 
 
 %changelog
+* Thu Feb 05 2015 Ray Strode <rstrode at redhat.com> 1.16.2.901-2
+- Add patch from ickle to fix flicker on login / durin vt switch
+  see https://bugzilla.gnome.org/show_bug.cgi?id=737226
+
 * Wed Dec 10 2014 Dave Airlie <airlied at redhat.com> 1.16.2.901-1
 - upstream security release. 1.16.2.901
 


More information about the scm-commits mailing list