From f5315667c0d827cca56a0a855b33e0efe83e3fa0 Mon Sep 17 00:00:00 2001 From: Aaron Plattner <aplattner@nvidia.com> Date: Fri, 11 May 2007 15:06:50 -0700 Subject: [PATCH] Don't disable FB access when it's already disabled. Fixes a server segfault during xrandr resize. --- src/vesa.c | 21 ++++++++++++++++++--- src/vesa.h | 2 ++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/vesa.c b/src/vesa.c index f6fa4e4..85fb4af 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -814,6 +814,16 @@ vesaCreateScreenResources(ScreenPtr pScreen) return ret; } +static void +vesaEnableDisableFBAccess(int scrnIndex, Bool enable) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + VESAPtr pVesa = VESAGetRec(pScrn); + + pVesa->accessEnabled = enable; + pVesa->EnableDisableFBAccess(scrnIndex, enable); +} + static Bool VESAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { @@ -1039,6 +1049,10 @@ VESAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) VESALoadPalette, NULL, flags)) return (FALSE); + pVesa->accessEnabled = TRUE; + pVesa->EnableDisableFBAccess = pScrn->EnableDisableFBAccess; + pScrn->EnableDisableFBAccess = vesaEnableDisableFBAccess; + pVesa->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = VESACloseScreen; pScreen->SaveScreen = VESASaveScreen; @@ -1091,6 +1105,7 @@ VESACloseScreen(int scrnIndex, ScreenPtr pScreen) } pScrn->vtSema = FALSE; + pScrn->EnableDisableFBAccess = pVesa->EnableDisableFBAccess; pScreen->CreateScreenResources = pVesa->CreateScreenResources; pScreen->CloseScreen = pVesa->CloseScreen; return pScreen->CloseScreen(scrnIndex, pScreen); @@ -1101,12 +1116,12 @@ VESASwitchMode(int scrnIndex, DisplayModePtr pMode, int flags) { ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; VESAPtr pVesa = VESAGetRec(pScrn); - Bool ret; + Bool ret, disableAccess = pVesa->ModeSetClearScreen && pVesa->accessEnabled; - if (pVesa->ModeSetClearScreen) + if (disableAccess) pScrn->EnableDisableFBAccess(scrnIndex,FALSE); ret = VESASetMode(xf86Screens[scrnIndex], pMode); - if (pVesa->ModeSetClearScreen) + if (disableAccess) pScrn->EnableDisableFBAccess(scrnIndex,TRUE); return ret; } diff --git a/src/vesa.h b/src/vesa.h index f0c79da..b9e6009 100644 --- a/src/vesa.h +++ b/src/vesa.h @@ -125,6 +125,8 @@ typedef struct _VESARec int nDGAMode; CloseScreenProcPtr CloseScreen; CreateScreenResourcesProcPtr CreateScreenResources; + xf86EnableDisableFBAccessProc *EnableDisableFBAccess; + Bool accessEnabled; OptionInfoPtr Options; IOADDRESS ioBase; Bool ModeSetClearScreen; -- 1.5.2.4