diff options
-rw-r--r-- | src/i830_randr.c | 110 |
1 files changed, 77 insertions, 33 deletions
diff --git a/src/i830_randr.c b/src/i830_randr.c index 87864f29..f579f411 100644 --- a/src/i830_randr.c +++ b/src/i830_randr.c @@ -527,8 +527,8 @@ I830RandRCrtcSet (ScreenPtr pScreen, int x, int y, Rotation rotation, - int numOutputs, - RROutputConfigPtr outputs) + int num_randr_outputs, + RROutputPtr *randr_outputs) { XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; @@ -536,29 +536,85 @@ I830RandRCrtcSet (ScreenPtr pScreen, int pipe = (int) (crtc->devPrivate); I830PipePtr pI830Pipe = &pI830->pipes[pipe]; DisplayModePtr display_mode = mode ? mode->devPrivate : NULL; - - /* Sync the engine before adjust mode */ - if (pI830->AccelInfoRec && pI830->AccelInfoRec->NeedToSync) { - (*pI830->AccelInfoRec->Sync)(pScrn); - pI830->AccelInfoRec->NeedToSync = FALSE; - } + Bool changed = FALSE; + Bool disable = FALSE; + int o, ro; + struct { + int pipe; + int enabled; + } save_output[MAX_OUTPUTS]; + Bool save_enabled = pI830Pipe->enabled; if (display_mode != randrp->modes[pipe]) { + changed = TRUE; + if (!display_mode) + disable = TRUE; + } + + for (o = 0; o < pI830->num_outputs; o++) + { + I830OutputPtr output = &pI830->output[o]; + RROutputPtr randr_output = NULL; + + save_output[o].enabled = output->enabled; + save_output[o].pipe = output->pipe; + for (ro = 0; ro < num_randr_outputs; ro++) + { + if (output->randr_output == randr_outputs[ro]) + { + randr_output = randr_outputs[ro]; + break; + } + } + if (randr_output) + { + if (output->pipe != pipe || !output->enabled) + { + output->pipe = pipe; + output->enabled = TRUE; + changed = TRUE; + } + } + else + { + /* Disable outputs which were on this pipe */ + if (output->enabled && output->pipe == pipe) + { + output->enabled = FALSE; + changed = TRUE; + disable = TRUE; + } + } + } + if (changed) + { pI830Pipe->enabled = mode != NULL; + /* Sync the engine before adjust mode */ + if (pI830->AccelInfoRec && pI830->AccelInfoRec->NeedToSync) { + (*pI830->AccelInfoRec->Sync)(pScrn); + pI830->AccelInfoRec->NeedToSync = FALSE; + } + if (display_mode) { if (!i830PipeSetMode (pScrn, display_mode, pipe, TRUE)) + { + pI830Pipe->enabled = save_enabled; + for (o = 0; o < pI830->num_outputs; o++) + { + I830OutputPtr output = &pI830->output[o]; + output->enabled = save_output[o].enabled; + output->pipe = save_output[o].pipe; + } return FALSE; - /* XXX need I830SDVOPostSetMode here */ - } - else - { - i830DisableUnusedFunctions (pScrn); + } + i830PipeSetBase(pScrn, pipe, x, y); } randrp->modes[pipe] = display_mode; + if (disable) + i830DisableUnusedFunctions (pScrn); } - i830PipeSetBase(pScrn, pipe, x, y); return I830RandRCrtcNotify (crtc); } @@ -644,8 +700,6 @@ I830RandRSetInfo12 (ScrnInfoPtr pScrn) int clone_types; int crtc_types; int subpixel; - CARD32 possibleOptions = 0; - CARD32 currentOptions = 0; RRCrtcPtr randr_crtc; RROutputPtr randr_output; int nclone; @@ -678,10 +732,6 @@ I830RandRSetInfo12 (ScrnInfoPtr pScrn) crtc_types = (1 << 1); clone_types = (1 << I830_OUTPUT_LVDS); subpixel = SubPixelHorizontalRGB; - possibleOptions = (RROutputOptionScaleNone| - RROutputOptionScaleMaxAspect | - RROutputOptionScaleMax); - currentOptions = RROutputOptionScaleMax; break; case I830_OUTPUT_TVOUT: crtc_types = ((1 << 0) | @@ -695,19 +745,16 @@ I830RandRSetInfo12 (ScrnInfoPtr pScrn) subpixel = SubPixelUnknown; break; } + ncrtc = 0; + for (p = 0; p < pI830->num_pipes; p++) + if (crtc_types & (1 << p)) + crtcs[ncrtc++] = pI830->pipes[p].randr_crtc; + if (output->enabled) - { - ncrtc = 0; - for (p = 0; p < pI830->num_pipes; p++) - if (crtc_types & (1 << p)) - crtcs[ncrtc++] = pI830->pipes[p].randr_crtc; randr_crtc = pI830->pipes[output->pipe].randr_crtc; - } else - { - ncrtc = 0; randr_crtc = NULL; - } + if (!RROutputSetCrtcs (output->randr_output, crtcs, ncrtc)) return FALSE; @@ -715,9 +762,6 @@ I830RandRSetInfo12 (ScrnInfoPtr pScrn) RROutputSetPhysicalSize(output->randr_output, output->mm_width, output->mm_height); - RROutputSetPossibleOptions (output->randr_output, possibleOptions); - RROutputSetCurrentOptions (output->randr_output, currentOptions); - I830xf86RROutputSetModes (output->randr_output, output->probed_modes); switch (output->detect(pScrn, output)) { @@ -833,7 +877,7 @@ I830RandRCreateScreenResources12 (ScreenPtr pScreen) mmHeight = pScreen->mmHeight; if (mode->HDisplay != pScreen->width) mmWidth = mmWidth * mode->HDisplay / pScreen->width; - if (mode->VDisplay == pScreen->height) + if (mode->VDisplay != pScreen->height) mmHeight = mmHeight * mode->VDisplay / pScreen->height; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Setting screen physical size to %d x %d\n", |