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:
parent
f716e3f344
commit
4de5705545
|
@ -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++)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue