diff options
author | Keith Packard <keithp@neko.keithp.com> | 2006-11-16 13:38:35 -0800 |
---|---|---|
committer | Keith Packard <keithp@neko.keithp.com> | 2006-11-16 13:38:35 -0800 |
commit | 45a27f80e1c783627f570c309e7a853dcc9af0c1 (patch) | |
tree | 2fdd06423ed62105b2d3c723a72d0dc5b3d130b9 /src | |
parent | 9aea79d1e954fe4fb5c101edcb7c2d0f706a5c4c (diff) |
Remove output options. Let outputs be connected to other crtcs.
Output options will be replaced by properties.
Permits outputs to be connected to arbitrary CRTCs (within hardware limits).
No cloning yet.
Diffstat (limited to 'src')
-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", |