Leif Delgass wrote: >>> On Fri, 5 Jul 2002, Jens Owen wrote: >>>>Okay, try the attached patch. I think I'll do more than this, but it >>>>would be great if you could test just this, first.
Okay, I have attached a more robust patch. Can you try this on your branch? > > I'll apply this to the > mach64 branch, but I'll let you patch the trunk. I'll apply this new patch to the trunk if it works okay for you. -- /\ Jens Owen / \/\ _ [EMAIL PROTECTED] / \ \ \ Steamboat Springs, Colorado
--- xc/programs/Xserver/GL/dri/dri.c.jens Fri Jul 5 13:07:43 2002 +++ xc/programs/Xserver/GL/dri/dri.c Sat Jul 6 09:27:10 2002 @@ -383,29 +383,29 @@ /* Wrap DRI support */ if (pDRIInfo->wrap.ValidateTree) { - pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree; - pScreen->ValidateTree = pDRIInfo->wrap.ValidateTree; + pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree; + pScreen->ValidateTree = pDRIInfo->wrap.ValidateTree; } if (pDRIInfo->wrap.PostValidateTree) { pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree; - pScreen->PostValidateTree = pDRIInfo->wrap.PostValidateTree; + pScreen->PostValidateTree = pDRIInfo->wrap.PostValidateTree; } if (pDRIInfo->wrap.WindowExposures) { - pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures; - pScreen->WindowExposures = pDRIInfo->wrap.WindowExposures; + pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures; + pScreen->WindowExposures = pDRIInfo->wrap.WindowExposures; } if (pDRIInfo->wrap.CopyWindow) { - pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow; - pScreen->CopyWindow = pDRIInfo->wrap.CopyWindow; + pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow; + pScreen->CopyWindow = pDRIInfo->wrap.CopyWindow; } if (pDRIInfo->wrap.ClipNotify) { - pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify; - pScreen->ClipNotify = pDRIInfo->wrap.ClipNotify; + pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify; + pScreen->ClipNotify = pDRIInfo->wrap.ClipNotify; } if (pDRIInfo->wrap.AdjustFrame) { - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - pDRIPriv->wrap.AdjustFrame = pScrn->AdjustFrame; - pScrn->AdjustFrame = pDRIInfo->wrap.AdjustFrame; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + pDRIPriv->wrap.AdjustFrame = pScrn->AdjustFrame; + pScrn->AdjustFrame = pDRIInfo->wrap.AdjustFrame; } DRIDrvMsg(pScreen->myNum, X_INFO, "[DRI] installation complete\n"); @@ -417,18 +417,42 @@ DRICloseScreen(ScreenPtr pScreen) { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); + DRIInfoPtr pDRIInfo; drmContextPtr reserved; int reserved_count; if (pDRIPriv && pDRIPriv->directRenderingSupport) { + pDRIInfo = pDRIPriv->pDriverInfo; + + /* Unwrap DRI Functions */ + if (pDRIPriv->wrap.ValidateTree) { + pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree; + pDRIPriv->wrap.ValidateTree = NULL; + } + if (pDRIPriv->wrap.PostValidateTree) { + pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree; + pDRIPriv->wrap.PostValidateTree = NULL; + } + if (pDRIPriv->wrap.WindowExposures) { + pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures; + pDRIPriv->wrap.WindowExposures = NULL; + } + if (pDRIPriv->wrap.CopyWindow) { + pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow; + pDRIPriv->wrap.CopyWindow = NULL; + } + if (pDRIPriv->wrap.ClipNotify) { + pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify; + pDRIPriv->wrap.ClipNotify = NULL; + } if (pDRIPriv->wrap.AdjustFrame) { - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame; - pDRIPriv->wrap.AdjustFrame = NULL; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame; + pScrn->AdjustFrame = NULL; } - if (pDRIPriv->pDriverInfo->driverSwapMethod != DRI_KERNEL_SWAP) { + if (pDRIInfo->driverSwapMethod != DRI_KERNEL_SWAP) { if (!drmRemoveSIGIOHandler(pDRIPriv->drmFD)) { DRIDrvMsg(pScreen->myNum, X_ERROR, "[drm] failed to remove DRM signal handler\n"); @@ -463,14 +487,14 @@ lockRefCount=0; DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] unmapping %d bytes of SAREA 0x%08lx at %p\n", - pDRIPriv->pDriverInfo->SAREASize, + pDRIInfo->SAREASize, pDRIPriv->hSAREA, pDRIPriv->pSAREA); - if (drmUnmap(pDRIPriv->pSAREA, pDRIPriv->pDriverInfo->SAREASize)) { + if (drmUnmap(pDRIPriv->pSAREA, pDRIInfo->SAREASize)) { DRIDrvMsg(pScreen->myNum, X_ERROR, "[drm] unable to unmap %d bytes" " of SAREA 0x%08lx at %p\n", - pDRIPriv->pDriverInfo->SAREASize, + pDRIInfo->SAREASize, pDRIPriv->hSAREA, pDRIPriv->pSAREA); } @@ -1478,13 +1502,19 @@ pDRIDrawablePriv->drawableIndex); } - pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures; + /* call lower wrapped functions */ + if (pDRIPriv && pDRIPriv->wrap.WindowExposures) { - (*pScreen->WindowExposures)(pWin, prgn, bsreg); + /* unwrap */ + pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures; - pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures; - pScreen->WindowExposures = DRIWindowExposures; + /* call lower layers */ + (*pScreen->WindowExposures)(pWin, prgn, bsreg); + /* rewrap */ + pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures; + pScreen->WindowExposures = DRIWindowExposures; + } } @@ -1512,6 +1542,8 @@ ScreenPtr pScreen = pWin->drawable.pScreen; DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); + if(!pDRIPriv) return; + if(pDRIPriv->nrWindows > 0) { RegionRec reg; @@ -1531,15 +1563,18 @@ REGION_UNINIT(pScreen, ®); } - /* unwrap */ - pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow; + /* call lower wrapped functions */ + if(pDRIPriv->wrap.CopyWindow) { + /* unwrap */ + pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow; - /* call lower layers */ - (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc); + /* call lower layers */ + (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc); - /* rewrap */ - pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow; - pScreen->CopyWindow = DRICopyWindow; + /* rewrap */ + pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow; + pScreen->CopyWindow = DRICopyWindow; + } } static void @@ -1607,6 +1642,8 @@ { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); + if(!pDRIPriv) return; + /* Restore the last known 3D context if the X context is hidden */ if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) { (*pDRIPriv->pDriverInfo->SwapContext)(pScreen, @@ -1624,7 +1661,7 @@ appropriate, since this should never time out except in the case of client death while the lock is being held. The timeout must be greater than any reasonable rendering time. */ - DRISpinLockTimeout(&pDRIPriv->pSAREA->drawable_lock, 1, 10000); /* 10 secs */ + DRISpinLockTimeout(&pDRIPriv->pSAREA->drawable_lock, 1, 10000); /*10 secs*/ /* Call kernel flush outstanding buffers and relock */ DRILock(pScreen, DRM_LOCK_QUIESCENT|DRM_LOCK_FLUSH_ALL); @@ -1653,7 +1690,10 @@ { ScreenPtr pScreen = pParent->drawable.pScreen; DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); - int returnValue; + + int returnValue = 1; /* always return 1, not checked by dix/window.c */ + + if(!pDRIPriv) return returnValue; DRIWindowsTouched = FALSE; @@ -1664,15 +1704,18 @@ } #endif - /* unwrap */ - pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree; + /* call lower wrapped functions */ + if(pDRIPriv->wrap.ValidateTree) { + /* unwrap */ + pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree; - /* call lower layers */ - returnValue = (*pScreen->ValidateTree)(pParent, pChild, kind); + /* call lower layers */ + returnValue = (*pScreen->ValidateTree)(pParent, pChild, kind); - /* rewrap */ - pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree; - pScreen->ValidateTree = DRIValidateTree; + /* rewrap */ + pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree; + pScreen->ValidateTree = DRIValidateTree; + } return returnValue; } @@ -1688,7 +1731,7 @@ } else { pScreen = pChild->drawable.pScreen; } - pDRIPriv = DRI_SCREEN_PRIV(pScreen); + if(!(pDRIPriv = DRI_SCREEN_PRIV(pScreen))) return; if (pDRIPriv->wrap.PostValidateTree) { /* unwrap */ @@ -1716,6 +1759,8 @@ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIDrawablePrivPtr pDRIDrawablePriv; + if(!pDRIPriv) return; + if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) { #ifndef DRI_BROKEN @@ -1729,11 +1774,16 @@ = DRIDrawableValidationStamp++; } + /* call lower wrapped functions */ if(pDRIPriv->wrap.ClipNotify) { + + /* unwrap */ pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify; + /* call lower layers */ (*pScreen->ClipNotify)(pWin, dx, dy); + /* rewrap */ pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify; pScreen->ClipNotify = DRIClipNotify; } @@ -1777,6 +1827,7 @@ DRILock(ScreenPtr pScreen, int flags) { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); + if(!pDRIPriv) return; if (!lockRefCount) DRM_LOCK(pDRIPriv->drmFD, pDRIPriv->pSAREA, pDRIPriv->myContext, flags); @@ -1787,6 +1838,7 @@ DRIUnlock(ScreenPtr pScreen) { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); + if(!pDRIPriv) return; if (lockRefCount > 0) { lockRefCount--; @@ -1803,17 +1855,17 @@ DRIGetSAREAPrivate(ScreenPtr pScreen) { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); - if (!pDRIPriv) - return 0; - return (void *)(((char*)pDRIPriv->pSAREA)+sizeof(XF86DRISAREARec)); + if (!pDRIPriv) return 0; + + return (void *)(((char*)pDRIPriv->pSAREA)+sizeof(XF86DRISAREARec)); } drmContext DRIGetContext(ScreenPtr pScreen) { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); - if (!pDRIPriv) - return 0; + if (!pDRIPriv) return 0; + return pDRIPriv->myContext; }