xserver: Branch 'master'

Keith Packard keithp at kemper.freedesktop.org
Thu Jul 25 11:16:37 PDT 2013


 hw/xfree86/modes/xf86RandR12.c |   19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

New commits:
commit bdd1e22cbde9ea2324e4e1991c9e152f22f88151
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Tue Apr 30 14:14:23 2013 -0700

    xfree86: detach scanout pixmaps when detaching output GPUs
    
    Commit 8f4640bdb9d3988148e09a08d2c7e3bab1d538d6 fixed a bit of a
    chicken-and-egg problem by detaching GPU screens when their providers
    are destroyed, which happens before CloseScreen is called.  However,
    this created a new problem: the GPU screen tears down its RandR crtc
    objects during CloseScreen and if one of them is active, it tries to
    detach the scanout pixmap then.  This crashes because
    RRCrtcDetachScanoutPixmap tries to get the master screen's screen
    pixmap, but crtc->pScreen->current_master is already NULL at that
    point.
    
    It doesn't make sense for an unbound GPU screen to still be scanning
    out its former master screen's pixmap, so detach them first when the
    provider is destroyed.
    
    Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 2817aaa..76614de 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1771,6 +1771,19 @@ xf86RandR12EnterVT(ScrnInfoPtr pScrn)
     return RRGetInfo(pScreen, TRUE);    /* force a re-probe of outputs and notify clients about changes */
 }
 
+static void
+xf86DetachOutputGPU(ScreenPtr pScreen)
+{
+    rrScrPrivPtr rp = rrGetScrPriv(pScreen);
+    int i;
+
+    /* make sure there are no attached shared scanout pixmaps first */
+    for (i = 0; i < rp->numCrtcs; i++)
+        RRCrtcDetachScanoutPixmap(rp->crtcs[i]);
+
+    DetachOutputGPU(pScreen);
+}
+
 static Bool
 xf86RandR14ProviderSetOutputSource(ScreenPtr pScreen,
                                    RRProviderPtr provider,
@@ -1780,7 +1793,7 @@ xf86RandR14ProviderSetOutputSource(ScreenPtr pScreen,
         if (provider->output_source) {
             ScreenPtr cmScreen = pScreen->current_master;
 
-            DetachOutputGPU(pScreen);
+            xf86DetachOutputGPU(pScreen);
             AttachUnboundGPU(cmScreen, pScreen);
         }
         provider->output_source = NULL;
@@ -1808,7 +1821,7 @@ xf86RandR14ProviderSetOffloadSink(ScreenPtr pScreen,
     if (!sink_provider) {
         if (provider->offload_sink) {
             ScreenPtr cmScreen = pScreen->current_master;
-            DetachOutputGPU(pScreen);
+            xf86DetachOutputGPU(pScreen);
             AttachUnboundGPU(cmScreen, pScreen);
         }
 
@@ -1899,7 +1912,7 @@ xf86RandR14ProviderDestroy(ScreenPtr screen, RRProviderPtr provider)
             RRSetChanged(screen);
         }
         else if (config->randr_provider->output_source) {
-            DetachOutputGPU(screen);
+            xf86DetachOutputGPU(screen);
             config->randr_provider->output_source = NULL;
             RRSetChanged(screen);
         }


More information about the xorg-commit mailing list