diff options
author | Alan Hourihane <alanh@fairlite.demon.co.uk> | 2005-04-01 14:17:24 +0000 |
---|---|---|
committer | Alan Hourihane <alanh@fairlite.demon.co.uk> | 2005-04-01 14:17:24 +0000 |
commit | e637630908f40f42367c94344d44918b6cdb0eb2 (patch) | |
tree | 3fab43efba72d251c8144e8137ee6d1652ea3998 | |
parent | 5090c8ba6778091aa4ce24b16b058d534ba78dc7 (diff) |
Check the VESA BIOS scanline requirements and adjust the displayWidthXORG-6_8_99_2XORG-6_8_99_1
accordingly. Fixes an assumption that the screen width was always used as the
displayWidth.
-rw-r--r-- | src/i830_driver.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/i830_driver.c b/src/i830_driver.c index dc28c50f..e3027a67 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -2841,13 +2841,30 @@ I830BIOSPreInit(ScrnInfoPtr pScrn, int flags) xf86PruneDriverModes(pScrn); - pScrn->currentMode = pScrn->modes; - if (pScrn->modes == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No modes.\n"); PreInitCleanup(pScrn); return FALSE; } + + /* Now we check the VESA BIOS's displayWidth and reset if necessary */ + p = pScrn->modes; + do { + VbeModeInfoData *data = (VbeModeInfoData *) p->Private; + VbeModeInfoBlock *modeInfo; + + /* Get BytesPerScanline so we can reset displayWidth */ + if ((modeInfo = VBEGetModeInfo(pI830->pVbe, data->mode))) { + if (pScrn->displayWidth < modeInfo->BytesPerScanline / pI830->cpp) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Correcting stride (%d -> %d)\n", pScrn->displayWidth, modeInfo->BytesPerScanline); + pScrn->displayWidth = modeInfo->BytesPerScanline / pI830->cpp; + } + } + p = p->next; + } while (p != NULL && p != pScrn->modes); + + pScrn->currentMode = pScrn->modes; + #ifndef USE_PITCHES #define USE_PITCHES 1 #endif |