RandR crtcs not fetched correctly when primary output is set.

Primary outputs may not have a CRTC.
Loops fetching CRTCs respecting primary output were broken.

Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Keith Packard 2009-01-30 20:17:10 -08:00
parent f716e3f344
commit 4de5705545
3 changed files with 19 additions and 11 deletions

View File

@ -436,7 +436,7 @@ RRFirstOutput (ScreenPtr pScreen)
RROutputPtr output; RROutputPtr output;
int i, j; int i, j;
if (pScrPriv->primaryOutput) if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc)
return pScrPriv->primaryOutput; return pScrPriv->primaryOutput;
for (i = 0; i < pScrPriv->numCrtcs; i++) for (i = 0; i < pScrPriv->numCrtcs; i++)

View File

@ -324,7 +324,7 @@ rrGetScreenResources(ClientPtr client, Bool query)
rrScrPrivPtr pScrPriv; rrScrPrivPtr pScrPriv;
CARD8 *extra; CARD8 *extra;
unsigned long extraLen; unsigned long extraLen;
int i, n, rc, has_primary; int i, n, rc, has_primary = 0;
RRCrtc *crtcs; RRCrtc *crtcs;
RROutput *outputs; RROutput *outputs;
xRRModeInfo *modeinfos; xRRModeInfo *modeinfos;
@ -402,19 +402,22 @@ rrGetScreenResources(ClientPtr client, Bool query)
modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs); modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
names = (CARD8 *) (modeinfos + num_modes); names = (CARD8 *) (modeinfos + num_modes);
has_primary = (pScrPriv->primaryOutput != NULL); if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc)
if (pScrPriv->primaryOutput)
{ {
crtcs[0] = pScrPriv->primaryOutput->id; has_primary = 1;
crtcs[0] = pScrPriv->primaryOutput->crtc->id;
if (client->swapped) if (client->swapped)
swapl (&crtcs[0], n); swapl (&crtcs[0], n);
} }
for (i = 0; i < pScrPriv->numCrtcs; i++) for (i = 0; i < pScrPriv->numCrtcs; i++)
{ {
if (pScrPriv->primaryOutput && if (has_primary &&
pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i]) pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i])
{
has_primary = 0;
continue; continue;
}
crtcs[i + has_primary] = pScrPriv->crtcs[i]->id; crtcs[i + has_primary] = pScrPriv->crtcs[i]->id;
if (client->swapped) if (client->swapped)
swapl (&crtcs[i + has_primary], n); swapl (&crtcs[i + has_primary], n);

View File

@ -324,16 +324,21 @@ ProcRRXineramaQueryScreens(ClientPtr client)
if(rep.number) { if(rep.number) {
rrScrPriv(pScreen); rrScrPriv(pScreen);
int i; int i;
int has_primary = (pScrPriv->primaryOutput != NULL); int has_primary = 0;
if (has_primary) { if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc) {
has_primary = 1;
RRXineramaWriteCrtc(client, pScrPriv->primaryOutput->crtc); RRXineramaWriteCrtc(client, pScrPriv->primaryOutput->crtc);
} }
for(i = 0; i < pScrPriv->numCrtcs; i++) { for(i = 0; i < pScrPriv->numCrtcs; i++) {
RRCrtcPtr crtc = pScrPriv->crtcs[i]; if (has_primary &&
if (!has_primary || (crtc != pScrPriv->primaryOutput->crtc)) pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i])
RRXineramaWriteCrtc(client, crtc); {
has_primary = 0;
continue;
}
RRXineramaWriteCrtc(client, pScrPriv->crtcs[i]);
} }
} }