|
|
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 |
|