sna: Tidy computation of clone/crtcs for fake outputs

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2014-05-05 20:59:24 +01:00
parent 77507909a1
commit b8d71e029c
1 changed files with 15 additions and 32 deletions

View File

@ -239,9 +239,8 @@ static bool add_fake_output(struct sna *sna, bool late)
xf86CrtcPtr crtc;
RROutputPtr clones[32];
RRCrtcPtr crtcs[32];
unsigned mask;
char buf[80];
int i, j, len;
int i, len;
if (sna->mode.num_fake >= 32)
return false;
@ -264,6 +263,9 @@ static bool add_fake_output(struct sna *sna, bool late)
output->interlaceAllowed = FALSE;
output->subpixel_order = SubPixelNone;
output->possible_crtcs = ~((1 << sna->mode.num_real_crtc) - 1);
output->possible_clones = ~((1 << sna->mode.num_real_output) - 1);
if (late) {
ScreenPtr screen = xf86ScrnToScreen(scrn);
@ -277,46 +279,27 @@ static bool add_fake_output(struct sna *sna, bool late)
RRPostPendingProperties(output->randr_output);
mask = (1 << ++sna->mode.num_fake) - 1;
for (i = j = 0; i < xf86_config->num_output; i++) {
output = xf86_config->output[i];
if (output->driver_private)
continue;
for (i = sna->mode.num_real_output; i < xf86_config->num_output; i++)
clones[i - sna->mode.num_real_output] = xf86_config->output[i]->randr_output;
assert(i - sna->mode.num_real_output == sna->mode.num_fake + 1);
output->possible_crtcs = mask << sna->mode.num_real_crtc;
output->possible_clones = mask << sna->mode.num_real_output;
for (i = sna->mode.num_real_crtc; i < xf86_config->num_crtc; i++)
crtcs[i - sna->mode.num_real_crtc] = xf86_config->crtc[i]->randr_crtc;
assert(i - sna->mode.num_real_crtc == sna->mode.num_fake + 1);
clones[j++] = output->randr_output;
}
assert(j == sna->mode.num_fake);
for (i = sna->mode.num_real_output; i < xf86_config->num_output; i++) {
RROutputPtr rr_output = xf86_config->output[i]->randr_output;
for (i = j = 0; i < xf86_config->num_crtc; i++) {
crtc = xf86_config->crtc[i];
if (crtc->driver_private)
continue;
crtcs[j++] = crtc->randr_crtc;
}
assert(j == sna->mode.num_fake);
for (i = 0; i < xf86_config->num_output; i++) {
output = xf86_config->output[i];
if (output->driver_private)
continue;
if (!RROutputSetCrtcs(output->randr_output, crtcs, j) ||
!RROutputSetClones(output->randr_output, clones, j))
if (!RROutputSetCrtcs(rr_output, crtcs, sna->mode.num_fake + 1) ||
!RROutputSetClones(rr_output, clones, sna->mode.num_fake + 1))
goto err;
}
RRCrtcSetRotations(crtc->randr_crtc,
RR_Rotate_All | RR_Reflect_All);
} else {
mask = (1 << ++sna->mode.num_fake) - 1;
output->possible_crtcs = mask << sna->mode.num_real_crtc;
output->possible_clones = mask << sna->mode.num_real_output;
}
sna->mode.num_fake++;
return true;
err: