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, &reg);
     }
 
-    /* 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;
 }
 

Reply via email to