Commit db98b26e authored by Keith Packard's avatar Keith Packard Committed by Peter Hutterer

Re-fix DGA removal.

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's avatarKeith Packard <keithp@keithp.com>
Signed-off-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
parent 873467ad
......@@ -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;
}
......
......@@ -806,7 +806,7 @@ xf86CrtcScreenInit (ScreenPtr screen)
screen->CloseScreen = xf86CrtcCloseScreen;
#ifdef XFreeXDGA
xf86DiDGAInit(screen, 0);
_xf86_di_dga_init_internal(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_internal(scrn->pScreen);
#endif
}
......
......@@ -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_internal (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_internal (ScreenPtr pScreen);
/*
* Set the subpixel order reported for the screen using
* the information from the outputs
......
......@@ -174,6 +174,12 @@ static DGAFunctionRec xf86_dga_funcs = {
Bool
xf86DiDGAReInit (ScreenPtr pScreen)
{
return TRUE;
}
Bool
_xf86_di_dga_reinit_internal (ScreenPtr pScreen)
{
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
......@@ -189,13 +195,16 @@ xf86DiDGAReInit (ScreenPtr pScreen)
Bool
xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address)
{
return TRUE;
}
Bool
_xf86_di_dga_init_internal (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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment