Dave Airlie 02cbf43
From ce3de2dcb1b3bd99a693c828278a416c245acc37 Mon Sep 17 00:00:00 2001
Peter Hutterer cd9fdcb
From: Dave Airlie <airlied@redhat.com>
Dave Airlie 02cbf43
Date: Wed, 9 Jan 2013 14:23:57 +1000
Dave Airlie 02cbf43
Subject: [PATCH] randr upstream set changed fixes
Peter Hutterer cd9fdcb
Peter Hutterer cd9fdcb
Signed-off-by: Dave Airlie <airlied@redhat.com>
Peter Hutterer cd9fdcb
---
Dave Airlie 02cbf43
 hw/xfree86/common/xf86platformBus.c |  3 ++-
Dave Airlie 02cbf43
 hw/xfree86/modes/xf86RandR12.c      |  2 ++
Dave Airlie 02cbf43
 randr/randr.c                       | 24 +++++++++++++++++++++++-
Dave Airlie 02cbf43
 randr/randrstr.h                    |  4 ++++
Dave Airlie 02cbf43
 randr/rrcrtc.c                      |  2 +-
Dave Airlie 02cbf43
 randr/rrinfo.c                      |  2 +-
Dave Airlie 02cbf43
 randr/rroutput.c                    |  2 +-
Dave Airlie 02cbf43
 randr/rrscreen.c                    |  2 +-
Dave Airlie 02cbf43
 8 files changed, 35 insertions(+), 6 deletions(-)
Peter Hutterer cd9fdcb
Dave Airlie 02cbf43
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
Dave Airlie 02cbf43
index 9034dad..bcb65ff 100644
Dave Airlie 02cbf43
--- a/hw/xfree86/common/xf86platformBus.c
Dave Airlie 02cbf43
+++ b/hw/xfree86/common/xf86platformBus.c
Dave Airlie 02cbf43
@@ -47,6 +47,7 @@
Dave Airlie 02cbf43
 #include "Pci.h"
Dave Airlie 02cbf43
 #include "xf86platformBus.h"
Dave Airlie 02cbf43
 
Dave Airlie 02cbf43
+#include "randrstr.h"
Dave Airlie 02cbf43
 int platformSlotClaimed;
Dave Airlie 02cbf43
 
Dave Airlie 02cbf43
 int xf86_num_platform_devices;
Dave Airlie 02cbf43
@@ -499,7 +500,7 @@ xf86platformRemoveDevice(int index)
Dave Airlie 02cbf43
     xf86UnclaimPlatformSlot(&xf86_platform_devices[index], NULL);
Dave Airlie 02cbf43
 
Dave Airlie 02cbf43
     xf86_remove_platform_device(index);
Dave Airlie 02cbf43
-
Dave Airlie 02cbf43
+    RRTellChanged(xf86Screens[0]->pScreen);
Dave Airlie 02cbf43
  out:
Dave Airlie 02cbf43
     return;
Dave Airlie 02cbf43
 }
Dave Airlie 02cbf43
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
Dave Airlie 02cbf43
index 01fc9c5..7f570cf 100644
Dave Airlie 02cbf43
--- a/hw/xfree86/modes/xf86RandR12.c
Dave Airlie 02cbf43
+++ b/hw/xfree86/modes/xf86RandR12.c
Dave Airlie 02cbf43
@@ -1895,10 +1895,12 @@ xf86RandR14ProviderDestroy(ScreenPtr screen, RRProviderPtr provider)
Dave Airlie 02cbf43
         if (config->randr_provider->offload_sink) {
Dave Airlie 02cbf43
             DetachOffloadGPU(screen);
Dave Airlie 02cbf43
             config->randr_provider->offload_sink = NULL;
Dave Airlie 02cbf43
+            RRSetChanged(screen);
Dave Airlie 02cbf43
         }
Dave Airlie 02cbf43
         else if (config->randr_provider->output_source) {
Dave Airlie 02cbf43
             DetachOutputGPU(screen);
Dave Airlie 02cbf43
             config->randr_provider->output_source = NULL;
Dave Airlie 02cbf43
+            RRSetChanged(screen);
Dave Airlie 02cbf43
         }
Dave Airlie 02cbf43
         else if (screen->current_master)
Dave Airlie 02cbf43
             DetachUnboundGPU(screen);
Peter Hutterer cd9fdcb
diff --git a/randr/randr.c b/randr/randr.c
Dave Airlie 02cbf43
index f0decfc..cb6fce7 100644
Peter Hutterer cd9fdcb
--- a/randr/randr.c
Peter Hutterer cd9fdcb
+++ b/randr/randr.c
Dave Airlie 02cbf43
@@ -464,6 +464,28 @@ TellChanged(WindowPtr pWin, pointer value)
Peter Hutterer cd9fdcb
     return WT_WALKCHILDREN;
Peter Hutterer cd9fdcb
 }
Peter Hutterer cd9fdcb
 
Peter Hutterer cd9fdcb
+void
Peter Hutterer cd9fdcb
+RRSetChanged(ScreenPtr pScreen)
Peter Hutterer cd9fdcb
+{
Dave Airlie 02cbf43
+    /* set changed bits on the master screen only */
Dave Airlie 02cbf43
+    ScreenPtr master;
Peter Hutterer cd9fdcb
+    rrScrPriv(pScreen);
Dave Airlie 02cbf43
+    rrScrPrivPtr mastersp;
Dave Airlie 02cbf43
+
Dave Airlie 02cbf43
+    if (pScreen->isGPU) {
Dave Airlie 02cbf43
+        master = pScreen->current_master;
Dave Airlie 02cbf43
+        if (!master)
Dave Airlie 02cbf43
+            return;
Dave Airlie 02cbf43
+        mastersp = rrGetScrPriv(master);
Dave Airlie 02cbf43
+    }
Dave Airlie 02cbf43
+    else {
Dave Airlie 02cbf43
+        master = pScreen;
Dave Airlie 02cbf43
+        mastersp = pScrPriv;
Dave Airlie 02cbf43
+    }
Peter Hutterer cd9fdcb
+
Dave Airlie 02cbf43
+    mastersp->changed = TRUE;
Peter Hutterer cd9fdcb
+}
Peter Hutterer cd9fdcb
+
Peter Hutterer cd9fdcb
 /*
Peter Hutterer cd9fdcb
  * Something changed; send events and adjust pointer position
Peter Hutterer cd9fdcb
  */
Dave Airlie 02cbf43
@@ -484,7 +506,7 @@ RRTellChanged(ScreenPtr pScreen)
Dave Airlie 02cbf43
         mastersp = pScrPriv;
Dave Airlie 02cbf43
     }
Dave Airlie 02cbf43
 
Dave Airlie 02cbf43
-    if (pScrPriv->changed) {
Dave Airlie 02cbf43
+    if (mastersp->changed) {
Dave Airlie 02cbf43
         UpdateCurrentTimeIf();
Dave Airlie 02cbf43
         if (mastersp->configChanged) {
Dave Airlie 02cbf43
             mastersp->lastConfigTime = currentTime;
Peter Hutterer cd9fdcb
diff --git a/randr/randrstr.h b/randr/randrstr.h
Peter Hutterer cd9fdcb
index 2517479..2babfed 100644
Peter Hutterer cd9fdcb
--- a/randr/randrstr.h
Peter Hutterer cd9fdcb
+++ b/randr/randrstr.h
Peter Hutterer cd9fdcb
@@ -486,6 +486,10 @@ extern _X_EXPORT void
Peter Hutterer cd9fdcb
  RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen);
Peter Hutterer cd9fdcb
 
Peter Hutterer cd9fdcb
 /* randr.c */
Peter Hutterer cd9fdcb
+/* set a screen change on the primary screen */
Peter Hutterer cd9fdcb
+extern _X_EXPORT void
Peter Hutterer cd9fdcb
+RRSetChanged(ScreenPtr pScreen);
Peter Hutterer cd9fdcb
+
Peter Hutterer cd9fdcb
 /*
Peter Hutterer cd9fdcb
  * Send all pending events
Peter Hutterer cd9fdcb
  */
Peter Hutterer cd9fdcb
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
Peter Hutterer cd9fdcb
index 6e2eca5..b3fb5bd 100644
Peter Hutterer cd9fdcb
--- a/randr/rrcrtc.c
Peter Hutterer cd9fdcb
+++ b/randr/rrcrtc.c
Peter Hutterer cd9fdcb
@@ -39,7 +39,7 @@ RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged)
Peter Hutterer cd9fdcb
     if (pScreen) {
Peter Hutterer cd9fdcb
         rrScrPriv(pScreen);
Peter Hutterer cd9fdcb
 
Peter Hutterer cd9fdcb
-        pScrPriv->changed = TRUE;
Peter Hutterer cd9fdcb
+        RRSetChanged(pScreen);
Peter Hutterer cd9fdcb
         /*
Peter Hutterer cd9fdcb
          * Send ConfigureNotify on any layout change
Peter Hutterer cd9fdcb
          */
Peter Hutterer cd9fdcb
diff --git a/randr/rrinfo.c b/randr/rrinfo.c
Peter Hutterer cd9fdcb
index 1408d6f..fc57bd4 100644
Peter Hutterer cd9fdcb
--- a/randr/rrinfo.c
Peter Hutterer cd9fdcb
+++ b/randr/rrinfo.c
Peter Hutterer cd9fdcb
@@ -225,7 +225,7 @@ RRScreenSetSizeRange(ScreenPtr pScreen,
Peter Hutterer cd9fdcb
     pScrPriv->minHeight = minHeight;
Peter Hutterer cd9fdcb
     pScrPriv->maxWidth = maxWidth;
Peter Hutterer cd9fdcb
     pScrPriv->maxHeight = maxHeight;
Peter Hutterer cd9fdcb
-    pScrPriv->changed = TRUE;
Peter Hutterer cd9fdcb
+    RRSetChanged(pScreen);
Peter Hutterer cd9fdcb
     pScrPriv->configChanged = TRUE;
Peter Hutterer cd9fdcb
 }
Peter Hutterer cd9fdcb
 
Peter Hutterer cd9fdcb
diff --git a/randr/rroutput.c b/randr/rroutput.c
Peter Hutterer cd9fdcb
index 88781ba..922d61f 100644
Peter Hutterer cd9fdcb
--- a/randr/rroutput.c
Peter Hutterer cd9fdcb
+++ b/randr/rroutput.c
Peter Hutterer cd9fdcb
@@ -36,7 +36,7 @@ RROutputChanged(RROutputPtr output, Bool configChanged)
Peter Hutterer cd9fdcb
     output->changed = TRUE;
Peter Hutterer cd9fdcb
     if (pScreen) {
Peter Hutterer cd9fdcb
         rrScrPriv(pScreen);
Peter Hutterer cd9fdcb
-        pScrPriv->changed = TRUE;
Peter Hutterer cd9fdcb
+        RRSetChanged(pScreen);
Peter Hutterer cd9fdcb
         if (configChanged)
Peter Hutterer cd9fdcb
             pScrPriv->configChanged = TRUE;
Peter Hutterer cd9fdcb
     }
Peter Hutterer cd9fdcb
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
Peter Hutterer cd9fdcb
index 39340cc..36179ae 100644
Peter Hutterer cd9fdcb
--- a/randr/rrscreen.c
Peter Hutterer cd9fdcb
+++ b/randr/rrscreen.c
Peter Hutterer cd9fdcb
@@ -143,7 +143,7 @@ RRScreenSizeNotify(ScreenPtr pScreen)
Peter Hutterer cd9fdcb
     pScrPriv->height = pScreen->height;
Peter Hutterer cd9fdcb
     pScrPriv->mmWidth = pScreen->mmWidth;
Peter Hutterer cd9fdcb
     pScrPriv->mmHeight = pScreen->mmHeight;
Peter Hutterer cd9fdcb
-    pScrPriv->changed = TRUE;
Peter Hutterer cd9fdcb
+    RRSetChanged(pScreen);
Peter Hutterer cd9fdcb
 /*    pScrPriv->sizeChanged = TRUE; */
Peter Hutterer cd9fdcb
 
Peter Hutterer cd9fdcb
     RRTellChanged(pScreen);
Peter Hutterer cd9fdcb
-- 
Dave Airlie 02cbf43
1.8.2
Peter Hutterer cd9fdcb