Blame SOURCES/0001-randr-attempt-to-fix-primary-on-slave-output.patch

d64d53
From 535366ffcf36b38815c9c344402b21c126050188 Mon Sep 17 00:00:00 2001
d64d53
From: Fedora X Ninjas <x@fedoraproject.org>
d64d53
Date: Fri, 21 Feb 2014 03:30:50 +0000
d64d53
Subject: [PATCH] randr: attempt to fix primary on slave output
d64d53
d64d53
---
d64d53
 randr/rroutput.c   |  6 +++++-
d64d53
 randr/rrscreen.c   | 22 ++++++++++++++++++----
d64d53
 randr/rrxinerama.c | 12 ++++++++++--
d64d53
 3 files changed, 33 insertions(+), 7 deletions(-)
d64d53
d64d53
diff --git a/randr/rroutput.c b/randr/rroutput.c
d64d53
index 2b0b82f..07aa0ec 100644
d64d53
--- a/randr/rroutput.c
d64d53
+++ b/randr/rroutput.c
d64d53
@@ -540,7 +540,11 @@ ProcRRSetOutputPrimary(ClientPtr client)
d64d53
     if (stuff->output) {
d64d53
         VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
d64d53
 
d64d53
-        if (output->pScreen != pWin->drawable.pScreen) {
d64d53
+        if (!output->pScreen->isGPU && output->pScreen != pWin->drawable.pScreen) {
d64d53
+            client->errorValue = stuff->window;
d64d53
+            return BadMatch;
d64d53
+        }
d64d53
+        if (output->pScreen->isGPU && output->pScreen->current_master != pWin->drawable.pScreen) {
d64d53
             client->errorValue = stuff->window;
d64d53
             return BadMatch;
d64d53
         }
d64d53
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
d64d53
index 36179ae..47d1823 100644
d64d53
--- a/randr/rrscreen.c
d64d53
+++ b/randr/rrscreen.c
d64d53
@@ -322,8 +322,13 @@ static inline void swap_modeinfos(xRRModeInfo *modeinfos, int i)
d64d53
     swapl(&modeinfos[i].modeFlags);
d64d53
 }
d64d53
 
d64d53
-#define update_arrays(gpuscreen, pScrPriv) do {            \
d64d53
+#define update_arrays(gpuscreen, pScrPriv, primary_crtc) do {            \
d64d53
     for (j = 0; j < pScrPriv->numCrtcs; j++) {             \
d64d53
+        if (has_primary && \
d64d53
+            primary_crtc == pScrPriv->crtcs[j]) { \
d64d53
+            has_primary = 0;   \
d64d53
+            continue; \
d64d53
+        }\
d64d53
         crtcs[crtc_count] = pScrPriv->crtcs[j]->id;        \
d64d53
         if (client->swapped)                               \
d64d53
             swapl(&crtcs[crtc_count]);                     \
d64d53
@@ -366,9 +371,11 @@ rrGetMultiScreenResources(ClientPtr client, Bool query, ScreenPtr pScreen)
d64d53
     unsigned long extraLen;
d64d53
     CARD8 *extra;
d64d53
     RRCrtc *crtcs;
d64d53
+    RRCrtcPtr primary_crtc = NULL;
d64d53
     RROutput *outputs;
d64d53
     xRRModeInfo *modeinfos;
d64d53
     CARD8 *names;
d64d53
+    int has_primary = 0;
d64d53
 
d64d53
     /* we need to iterate all the GPU masters and all their output slaves */
d64d53
     total_crtcs = 0;
d64d53
@@ -426,18 +433,25 @@ rrGetMultiScreenResources(ClientPtr client, Bool query, ScreenPtr pScreen)
d64d53
     modeinfos = (xRRModeInfo *)(outputs + total_outputs);
d64d53
     names = (CARD8 *)(modeinfos + total_modes);
d64d53
 
d64d53
-    /* TODO primary */
d64d53
     crtc_count = 0;
d64d53
     output_count = 0;
d64d53
     mode_count = 0;
d64d53
 
d64d53
     pScrPriv = rrGetScrPriv(pScreen);
d64d53
-    update_arrays(pScreen, pScrPriv);
d64d53
+    if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc) {
d64d53
+        has_primary = 1;
d64d53
+	primary_crtc = pScrPriv->primaryOutput->crtc;
d64d53
+        crtcs[0] = pScrPriv->primaryOutput->crtc->id;
d64d53
+        if (client->swapped)
d64d53
+            swapl(&crtcs[0]);
d64d53
+	crtc_count = 1;
d64d53
+    }
d64d53
+    update_arrays(pScreen, pScrPriv, primary_crtc);
d64d53
 
d64d53
     xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
d64d53
         pScrPriv = rrGetScrPriv(iter);
d64d53
 
d64d53
-        update_arrays(iter, pScrPriv);
d64d53
+        update_arrays(iter, pScrPriv, primary_crtc);
d64d53
     }
d64d53
 
d64d53
     assert(bytes_to_int32((char *) names - (char *) extra) == rep.length);
d64d53
diff --git a/randr/rrxinerama.c b/randr/rrxinerama.c
d64d53
index 76d728c..363cead 100644
d64d53
--- a/randr/rrxinerama.c
d64d53
+++ b/randr/rrxinerama.c
d64d53
@@ -344,15 +344,17 @@ ProcRRXineramaQueryScreens(ClientPtr client)
d64d53
         ScreenPtr slave;
d64d53
         rrScrPriv(pScreen);
d64d53
         int has_primary = 0;
d64d53
+        RRCrtcPtr primary_crtc = NULL;
d64d53
 
d64d53
         if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc) {
d64d53
             has_primary = 1;
d64d53
+            primary_crtc = pScrPriv->primaryOutput->crtc;
d64d53
             RRXineramaWriteCrtc(client, pScrPriv->primaryOutput->crtc);
d64d53
         }
d64d53
 
d64d53
         for (i = 0; i < pScrPriv->numCrtcs; i++) {
d64d53
             if (has_primary &&
d64d53
-                pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i]) {
d64d53
+                primary_crtc == pScrPriv->crtcs[i]) {
d64d53
                 has_primary = 0;
d64d53
                 continue;
d64d53
             }
d64d53
@@ -362,8 +364,14 @@ ProcRRXineramaQueryScreens(ClientPtr client)
d64d53
         xorg_list_for_each_entry(slave, &pScreen->output_slave_list, output_head) {
d64d53
             rrScrPrivPtr pSlavePriv;
d64d53
             pSlavePriv = rrGetScrPriv(slave);
d64d53
-            for (i = 0; i < pSlavePriv->numCrtcs; i++)
d64d53
+            for (i = 0; i < pSlavePriv->numCrtcs; i++) {
d64d53
+                if (has_primary &&
d64d53
+                    primary_crtc == pSlavePriv->crtcs[i]) {
d64d53
+                    has_primary = 0;
d64d53
+                    continue;
d64d53
+                }
d64d53
                 RRXineramaWriteCrtc(client, pSlavePriv->crtcs[i]);
d64d53
+            }
d64d53
         }
d64d53
     }
d64d53
 
d64d53
-- 
d64d53
1.8.3.1
d64d53