On Wed, Sep 30, 2009 at 11:40:19AM -0700, Keith Packard wrote: > Here's an updated patch -- removes the _X_INTERNAL from the .c files, > renames xf86DiDGAInit to _xf86_di_dga_init_internal, and renames > xf86DiDGAReInit to _xf86_di_dga_reinit_internal. > > Thanks for previous review.
> >From 894680ec0335d7bc2c744c53f6a28b40ab850b6c Mon Sep 17 00:00:00 2001 > From: Keith Packard <[email protected]> > Date: Mon, 28 Sep 2009 12:39:47 -0700 > Subject: [PATCH] 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 <[email protected]> > --- > 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..506fbb9 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_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 > } > > diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h > index 69afaa5..9baa956 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_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 > diff --git a/hw/xfree86/modes/xf86DiDGA.c b/hw/xfree86/modes/xf86DiDGA.c > index 0f7b834..60fbdbf 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; > +} > + > +Bool > +_xf86_di_dga_reinit_internal (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; > +} > + > +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; > -- > 1.6.4.3 Thanks, I've pushed this to master and nominated for 1.7 Cheers, Peter _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
