xserver: Branch 'master' - 2 commits

Keith Packard keithp at kemper.freedesktop.org
Mon Dec 8 16:39:39 PST 2014


 present/present.c |   13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

New commits:
commit aae6460694ac3667abb8c34fdf3a7dae524827a4
Author: Mario Kleiner <mario.kleiner.de at gmail.com>
Date:   Sat Dec 6 05:40:08 2014 +0100

    present: Fix use of vsynced pageflips and honor PresentOptionAsync. (v4)
    
    Pageflips for Pixmap presents were not synchronized to vblank on
    drivers with support for PresentCapabilityAsync, due to some
    missing init for vblank->sync_flips. The PresentOptionAsync
    flag was completely ignored for pageflipped presents.
    
    Vsynced flips only worked by accident on the intel-ddx, as that
    driver doesn't have PresentCapabilityAsync support.
    
    On nouveau-ddx, which supports PresentCapabilityAsync, this
    always caused non-vsynced pageflips with pretty ugly tearing.
    
    This patch fixes the problem, as tested on top of XOrg 1.16.2
    on nouveau and intel.
    
    v4: Add additional PresentCapabilityAsync caps check, as
    suggested by Eric Anholt.
    
    Please also apply to XOrg 1.17 and XOrg 1.16.2 stable.
    
    Applying on top of XOrg 1.16.2 requires cherry-picking
    commit 2051514652481a83bd7cf22e57cb0fcd40333f33
    which trivially fixes lack of support for protocol option
    PresentOptionCopy - get two bug fixes for the price of one!
    
    Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com>
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/present/present.c b/present/present.c
index e5d3fd5..e27fe30 100644
--- a/present/present.c
+++ b/present/present.c
@@ -834,10 +834,13 @@ present_pixmap(WindowPtr window,
     vblank->notifies = notifies;
     vblank->num_notifies = num_notifies;
 
-    if (!screen_priv->info || !(screen_priv->info->capabilities & PresentCapabilityAsync))
+    if (!(options & PresentOptionAsync))
         vblank->sync_flip = TRUE;
 
     if (!(options & PresentOptionCopy) &&
+        !((options & PresentOptionAsync) &&
+          (!screen_priv->info ||
+           !(screen_priv->info->capabilities & PresentCapabilityAsync))) &&
         pixmap != NULL &&
         present_check_flip (target_crtc, window, pixmap, vblank->sync_flip, valid, x_off, y_off))
     {
commit 32d3100bd78efe41d468f7d66861296aee468b6f
Author: Mario Kleiner <mario.kleiner.de at gmail.com>
Date:   Sat Dec 6 05:40:07 2014 +0100

    present: Avoid crashes in DebugPresent(), a bit more info.
    
    DebugPresent() crashed the server when a dri3 drawable
    was closed while a pageflipped present was still pending,
    due to vblank->window-> Null-Ptr deref, so debug builds
    caused new problems to debug.
    
    E.g.,
    
    glXSwapBuffers(...);
    glXDestroyWindow(...);
    -> Pageflip for non-existent window completes -> boom.
    
    Also often happens when switching desktop compositor on/off
    due to Present unflips, or when logging out of session.
    
    Also add info if a Present is queued for copyswap or pageflip,
    if the present is vsynced, and the serial no of the Present
    request, to aid debugging of pageflip and vsync issues. The
    serial number is useful as Mesa's dri3/present backend encodes
    its sendSBC in the serial number, so one can easily correlate
    server debug output with Mesa and with the SBC values returned
    to actual OpenGL client applications via OML_sync_control and
    INTEL_swap_events extension, makes debugging quite a bit more
    easy.
    
    Please also cherry-pick this for a 1.16.x stable update.
    
    Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com>
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/present/present.c b/present/present.c
index ac9047e..e5d3fd5 100644
--- a/present/present.c
+++ b/present/present.c
@@ -440,7 +440,7 @@ present_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
     DebugPresent(("\tn %lld %p %8lld: %08lx -> %08lx\n",
                   vblank->event_id, vblank, vblank->target_msc,
                   vblank->pixmap ? vblank->pixmap->drawable.id : 0,
-                  vblank->window->drawable.id));
+                  vblank->window ? vblank->window->drawable.id : 0));
 
     assert (vblank == screen_priv->flip_pending);
 
@@ -859,10 +859,10 @@ present_pixmap(WindowPtr window,
     }
 
     if (pixmap)
-        DebugPresent(("q %lld %p %8lld: %08lx -> %08lx (crtc %p)\n",
+        DebugPresent(("q %lld %p %8lld: %08lx -> %08lx (crtc %p) flip %d vsync %d serial %d\n",
                       vblank->event_id, vblank, target_msc,
                       vblank->pixmap->drawable.id, vblank->window->drawable.id,
-                      target_crtc));
+                      target_crtc, vblank->flip, vblank->sync_flip, vblank->serial));
 
     xorg_list_add(&vblank->event_queue, &present_exec_queue);
     vblank->queued = TRUE;
@@ -955,7 +955,7 @@ present_vblank_destroy(present_vblank_ptr vblank)
     DebugPresent(("\td %lld %p %8lld: %08lx -> %08lx\n",
                   vblank->event_id, vblank, vblank->target_msc,
                   vblank->pixmap ? vblank->pixmap->drawable.id : 0,
-                  vblank->window->drawable.id));
+                  vblank->window ? vblank->window->drawable.id : 0));
 
     /* Drop pixmap reference */
     if (vblank->pixmap)


More information about the xorg-commit mailing list