Sophie

Sophie

distrib > * > 2008.0 > x86_64 > by-pkgid > 17ee654bd08d246e15f4028311b64c76 > files > 2

x11-driver-video-vesa-1.3.0-3mdv2008.0.src.rpm

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