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;
|
||||
int i, j;
|
||||
|
||||
if (pScrPriv->primaryOutput)
|
||||
if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc)
|
||||
return pScrPriv->primaryOutput;
|
||||
|
||||
for (i = 0; i < pScrPriv->numCrtcs; i++)
|
||||
|
|
|
@ -324,7 +324,7 @@ rrGetScreenResources(ClientPtr client, Bool query)
|
|||
rrScrPrivPtr pScrPriv;
|
||||
CARD8 *extra;
|
||||
unsigned long extraLen;
|
||||
int i, n, rc, has_primary;
|
||||
int i, n, rc, has_primary = 0;
|
||||
RRCrtc *crtcs;
|
||||
RROutput *outputs;
|
||||
xRRModeInfo *modeinfos;
|
||||
|
@ -402,19 +402,22 @@ rrGetScreenResources(ClientPtr client, Bool query)
|
|||
modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
|
||||
names = (CARD8 *) (modeinfos + num_modes);
|
||||
|
||||
has_primary = (pScrPriv->primaryOutput != NULL);
|
||||
if (pScrPriv->primaryOutput)
|
||||
if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc)
|
||||
{
|
||||
crtcs[0] = pScrPriv->primaryOutput->id;
|
||||
has_primary = 1;
|
||||
crtcs[0] = pScrPriv->primaryOutput->crtc->id;
|
||||
if (client->swapped)
|
||||
swapl (&crtcs[0], n);
|
||||
}
|
||||
|
||||
for (i = 0; i < pScrPriv->numCrtcs; i++)
|
||||
{
|
||||
if (pScrPriv->primaryOutput &&
|
||||
if (has_primary &&
|
||||
pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i])
|
||||
{
|
||||
has_primary = 0;
|
||||
continue;
|
||||
}
|
||||
crtcs[i + has_primary] = pScrPriv->crtcs[i]->id;
|
||||
if (client->swapped)
|
||||
swapl (&crtcs[i + has_primary], n);
|
||||
|
|
|
@ -324,16 +324,21 @@ ProcRRXineramaQueryScreens(ClientPtr client)
|
|||
if(rep.number) {
|
||||
rrScrPriv(pScreen);
|
||||
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);
|
||||
}
|
||||
|
||||
for(i = 0; i < pScrPriv->numCrtcs; i++) {
|
||||
RRCrtcPtr crtc = pScrPriv->crtcs[i];
|
||||
if (!has_primary || (crtc != pScrPriv->primaryOutput->crtc))
|
||||
RRXineramaWriteCrtc(client, crtc);
|
||||
if (has_primary &&
|
||||
pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i])
|
||||
{
|
||||
has_primary = 0;
|
||||
continue;
|
||||
}
|
||||
RRXineramaWriteCrtc(client, pScrPriv->crtcs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue