forked from pool/xorg-x11-server
Accepting request 21377 from X11:XOrg
Copy from X11:XOrg/xorg-x11-server based on submit request 21377 from user sndirsch OBS-URL: https://build.opensuse.org/request/show/21377 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/xorg-x11-server?expand=0&rev=143
This commit is contained in:
parent
7e80a0dbbc
commit
1884b4cb34
147
dga-removal-fix.diff
Normal file
147
dga-removal-fix.diff
Normal file
@ -0,0 +1,147 @@
|
||||
Removing DGA ended up breaking any drivers calling into the old
|
||||
xf86DiDGAInit function as it tried to see if DGA was already enabled
|
||||
and ended up crashing if the VT wasn't completely initialized. Oops.
|
||||
|
||||
Also, if the driver initializes DGA itself, have the DiDGA
|
||||
initialization overwrite that information as the DiDGA code will call
|
||||
ReInit on mode detect.
|
||||
|
||||
Signed-off-by: Keith Packard <keithp@keithp.com>
|
||||
---
|
||||
hw/xfree86/common/xf86DGA.c | 29 ++++++++++++++++-------------
|
||||
hw/xfree86/modes/xf86Crtc.c | 4 ++--
|
||||
hw/xfree86/modes/xf86Crtc.h | 8 ++++++++
|
||||
hw/xfree86/modes/xf86DiDGA.c | 15 ++++++++++++---
|
||||
4 files changed, 38 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
|
||||
index 42b7c58..804fd37 100644
|
||||
--- a/hw/xfree86/common/xf86DGA.c
|
||||
+++ b/hw/xfree86/common/xf86DGA.c
|
||||
@@ -120,8 +120,22 @@ DGAInit(
|
||||
|
||||
DGAScreenKey = &DGAScreenKeyIndex;
|
||||
|
||||
- if(!(pScreenPriv = (DGAScreenPtr)xalloc(sizeof(DGAScreenRec))))
|
||||
- return FALSE;
|
||||
+ pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
|
||||
+
|
||||
+ if (!pScreenPriv)
|
||||
+ {
|
||||
+ if(!(pScreenPriv = (DGAScreenPtr)xalloc(sizeof(DGAScreenRec))))
|
||||
+ return FALSE;
|
||||
+ dixSetPrivate(&pScreen->devPrivates, DGAScreenKey, pScreenPriv);
|
||||
+ pScreenPriv->CloseScreen = pScreen->CloseScreen;
|
||||
+ pScreen->CloseScreen = DGACloseScreen;
|
||||
+ pScreenPriv->DestroyColormap = pScreen->DestroyColormap;
|
||||
+ pScreen->DestroyColormap = DGADestroyColormap;
|
||||
+ pScreenPriv->InstallColormap = pScreen->InstallColormap;
|
||||
+ pScreen->InstallColormap = DGAInstallColormap;
|
||||
+ pScreenPriv->UninstallColormap = pScreen->UninstallColormap;
|
||||
+ pScreen->UninstallColormap = DGAUninstallColormap;
|
||||
+ }
|
||||
|
||||
pScreenPriv->pScrn = pScrn;
|
||||
pScreenPriv->numModes = num;
|
||||
@@ -146,17 +160,6 @@ DGAInit(
|
||||
modes[i].flags &= ~DGA_PIXMAP_AVAILABLE;
|
||||
#endif
|
||||
|
||||
- dixSetPrivate(&pScreen->devPrivates, DGAScreenKey, pScreenPriv);
|
||||
- pScreenPriv->CloseScreen = pScreen->CloseScreen;
|
||||
- pScreen->CloseScreen = DGACloseScreen;
|
||||
- pScreenPriv->DestroyColormap = pScreen->DestroyColormap;
|
||||
- pScreen->DestroyColormap = DGADestroyColormap;
|
||||
- pScreenPriv->InstallColormap = pScreen->InstallColormap;
|
||||
- pScreen->InstallColormap = DGAInstallColormap;
|
||||
- pScreenPriv->UninstallColormap = pScreen->UninstallColormap;
|
||||
- pScreen->UninstallColormap = DGAUninstallColormap;
|
||||
-
|
||||
-
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
|
||||
index c1e31e0..f274725 100644
|
||||
--- a/hw/xfree86/modes/xf86Crtc.c
|
||||
+++ b/hw/xfree86/modes/xf86Crtc.c
|
||||
@@ -806,7 +806,7 @@ xf86CrtcScreenInit (ScreenPtr screen)
|
||||
screen->CloseScreen = xf86CrtcCloseScreen;
|
||||
|
||||
#ifdef XFreeXDGA
|
||||
- xf86DiDGAInit(screen, 0);
|
||||
+ _xf86_di_dga_init_for_reals(screen);
|
||||
#endif
|
||||
#ifdef RANDR_13_INTERFACE
|
||||
return RANDR_INTERFACE_VERSION;
|
||||
@@ -1928,7 +1928,7 @@ xf86SetScrnInfoModes (ScrnInfoPtr scrn)
|
||||
scrn->currentMode = scrn->modes;
|
||||
#ifdef XFreeXDGA
|
||||
if (scrn->pScreen)
|
||||
- xf86DiDGAReInit(scrn->pScreen);
|
||||
+ _xf86_di_dga_reinit_for_reals(scrn->pScreen);
|
||||
#endif
|
||||
}
|
||||
|
||||
diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
|
||||
index 69afaa5..edf84d8 100644
|
||||
--- a/hw/xfree86/modes/xf86Crtc.h
|
||||
+++ b/hw/xfree86/modes/xf86Crtc.h
|
||||
@@ -833,6 +833,10 @@ xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus);
|
||||
extern _X_EXPORT Bool
|
||||
xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address);
|
||||
|
||||
+/* this is the real function, used only internally */
|
||||
+_X_INTERNAL Bool
|
||||
+_xf86_di_dga_init_for_reals (ScreenPtr pScreen);
|
||||
+
|
||||
/**
|
||||
* Re-initialize dga for this screen (as when the set of modes changes)
|
||||
*/
|
||||
@@ -841,6 +845,10 @@ extern _X_EXPORT Bool
|
||||
xf86DiDGAReInit (ScreenPtr pScreen);
|
||||
#endif
|
||||
|
||||
+/* This is the real function, used only internally */
|
||||
+_X_INTERNAL Bool
|
||||
+_xf86_di_dga_reinit_for_reals (ScreenPtr pScreen);
|
||||
+
|
||||
/*
|
||||
* Set the subpixel order reported for the screen using
|
||||
* the information from the outputs
|
||||
diff --git a/hw/xfree86/modes/xf86DiDGA.c b/hw/xfree86/modes/xf86DiDGA.c
|
||||
index 0f7b834..3df3754 100644
|
||||
--- a/hw/xfree86/modes/xf86DiDGA.c
|
||||
+++ b/hw/xfree86/modes/xf86DiDGA.c
|
||||
@@ -175,6 +175,12 @@ static DGAFunctionRec xf86_dga_funcs = {
|
||||
Bool
|
||||
xf86DiDGAReInit (ScreenPtr pScreen)
|
||||
{
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+_X_INTERNAL Bool
|
||||
+_xf86_di_dga_reinit_for_reals (ScreenPtr pScreen)
|
||||
+{
|
||||
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
||||
@@ -190,12 +196,15 @@ xf86DiDGAReInit (ScreenPtr pScreen)
|
||||
Bool
|
||||
xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address)
|
||||
{
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+_X_INTERNAL Bool
|
||||
+_xf86_di_dga_init_for_reals (ScreenPtr pScreen)
|
||||
+{
|
||||
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
||||
- if (DGAAvailable(pScreen->myNum))
|
||||
- return TRUE;
|
||||
-
|
||||
xf86_config->dga_flags = 0;
|
||||
xf86_config->dga_address = 0;
|
||||
xf86_config->dga_width = 0;
|
@ -1,3 +1,12 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Sep 29 19:43:23 CEST 2009 - sndirsch@suse.de
|
||||
|
||||
- dga-removal-fix.diff
|
||||
* "Removing DGA ended up breaking any drivers calling into the old
|
||||
xf86DiDGAInit function as it tried to see if DGA was already
|
||||
enabled and ended up crashing if the VT wasn't completely
|
||||
initialized. Oops."
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Sep 28 20:50:34 CEST 2009 - sndirsch@suse.de
|
||||
|
||||
|
@ -33,7 +33,7 @@ BuildRequires: libjpeg-devel
|
||||
Url: http://xorg.freedesktop.org/
|
||||
%define EXPERIMENTAL 0
|
||||
Version: 7.4
|
||||
Release: 55
|
||||
Release: 56
|
||||
License: GPL v2 or later ; MIT License (or similar)
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
Group: System/X11/Servers/XF86_4
|
||||
@ -138,6 +138,7 @@ Patch171: moblin-use_preferred_mode_for_all_outputs.diff
|
||||
Patch190: 0001-Unclaim-PCI-slot-if-driver-probing-fails.patch
|
||||
Patch191: 0001-Fix-sporadic-segfault-on-resume-with-intel-KMS-due-t.patch
|
||||
Patch200: bug534768-prefer_local_symbols.patch
|
||||
Patch201: dga-removal-fix.diff
|
||||
Patch532341: bug532341.diff
|
||||
|
||||
%description
|
||||
@ -281,6 +282,7 @@ popd
|
||||
%patch190 -p1
|
||||
%patch191 -p1
|
||||
%patch200 -p1
|
||||
%patch201 -p1
|
||||
%patch532341 -p1
|
||||
|
||||
%build
|
||||
|
Loading…
Reference in New Issue
Block a user