Index: i810.h =================================================================== RCS file: /home/eich/cvs/xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h,v retrieving revision 1.1.1.25 diff -u -r1.1.1.25 i810.h --- i810.h 2002/12/12 14:45:32 1.1.1.25 +++ i810.h 2003/02/11 12:51:51 @@ -264,6 +264,9 @@ extern Bool I810DRIFinishScreenInit(ScreenPtr pScreen); extern Bool I810InitDma(ScrnInfoPtr pScrn); extern Bool I810CleanupDma(ScrnInfoPtr pScrn); +extern Bool I810DRILeave(ScrnInfoPtr pScrn); +extern Bool I810DRIEnter(ScrnInfoPtr pScrn); + #define I810PTR(p) ((I810Ptr)((p)->driverPrivate)) #define I810REGPTR(p) (&(I810PTR(p)->ModeReg)) Index: i810_dri.c =================================================================== RCS file: /home/eich/cvs/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c,v retrieving revision 1.1.1.23 diff -u -r1.1.1.23 i810_dri.c --- i810_dri.c 2002/12/12 14:45:32 1.1.1.23 +++ i810_dri.c 2003/02/11 12:56:35 @@ -1218,3 +1218,84 @@ pI810->AccelInfoRec->NeedToSync = TRUE; } + +Bool +I810DRILeave(ScrnInfoPtr pScrn) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (pI810->directRenderingEnabled) { + if (pI810->dcacheHandle != 0) + if (drmAgpUnbind(pI810->drmSubFD, pI810->dcacheHandle) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"%s\n",strerror(errno)); + return FALSE; + } + if (pI810->backHandle != 0) + if (drmAgpUnbind(pI810->drmSubFD, pI810->backHandle) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"%s\n",strerror(errno)); + return FALSE; + } + if (pI810->zHandle != 0) + if (drmAgpUnbind(pI810->drmSubFD, pI810->zHandle) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"%s\n",strerror(errno)); + return FALSE; + } + if (pI810->sysmemHandle != 0) + if (drmAgpUnbind(pI810->drmSubFD, pI810->sysmemHandle) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"%s\n",strerror(errno)); + return FALSE; + } + if (pI810->xvmcHandle != 0) + if (drmAgpUnbind(pI810->drmSubFD, pI810->xvmcHandle) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"%s\n",strerror(errno)); + return FALSE; + } + if (pI810->cursorHandle != 0) + if (drmAgpUnbind(pI810->drmSubFD, pI810->cursorHandle) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"%s\n",strerror(errno)); + return FALSE; + } + if (pI810->agpAcquired == TRUE) + drmAgpRelease(pI810->drmSubFD); + pI810->agpAcquired = FALSE; + } + return TRUE; +} + +Bool +I810DRIEnter(ScrnInfoPtr pScrn) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (pI810->directRenderingEnabled) { + + if (pI810->agpAcquired == FALSE) + drmAgpAcquire(pI810->drmSubFD); + pI810->agpAcquired = TRUE; + if (pI810->dcacheHandle != 0) + if (drmAgpBind(pI810->drmSubFD, pI810->dcacheHandle, + pI810->DepthOffset) != 0) + return FALSE; + if (pI810->backHandle != 0) + if (drmAgpBind(pI810->drmSubFD, pI810->backHandle, + pI810->BackOffset) != 0) + return FALSE; + if (pI810->zHandle != 0) + if (drmAgpBind(pI810->drmSubFD, pI810->zHandle, + pI810->DepthOffset) != 0) + return FALSE; + if (pI810->sysmemHandle != 0) + if (drmAgpBind(pI810->drmSubFD, pI810->sysmemHandle, + 0) != 0) + return FALSE; + if (pI810->xvmcHandle != 0) + if (drmAgpBind(pI810->drmSubFD, pI810->xvmcHandle, + pI810->MC.Start) != 0) + return FALSE; + if (pI810->cursorHandle != 0) + if (drmAgpBind(pI810->drmSubFD, pI810->cursorHandle, + pI810->CursorStart) != 0) + return FALSE; + } + return TRUE; +} Index: i810_driver.c =================================================================== RCS file: /home/eich/cvs/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c,v retrieving revision 1.1.1.38 diff -u -r1.1.1.38 i810_driver.c --- i810_driver.c 2002/12/12 14:45:32 1.1.1.38 +++ i810_driver.c 2003/02/11 16:48:34 @@ -1691,6 +1691,7 @@ #ifdef XF86DRI if (pI810->directRenderingEnabled) { DRILock(screenInfo.screens[pScrn->scrnIndex], 0); + ErrorF("DRILock\n"); pI810->LockHeld = 1; } #endif @@ -1700,6 +1701,7 @@ #ifdef XF86DRI if (pI810->directRenderingEnabled) { DRIUnlock(screenInfo.screens[pScrn->scrnIndex]); + ErrorF("DRIUnlock\n"); pI810->LockHeld = 0; } #endif @@ -2211,11 +2213,15 @@ if (!I810BindGARTMemory(pScrn)) return FALSE; + if (!I810DRIEnter(pScrn)) + return FALSE; + #ifdef XF86DRI if (pI810->directRenderingEnabled) { if (I810_DEBUG & DEBUG_VERBOSE_DRI) ErrorF("calling dri unlock\n"); DRIUnlock(screenInfo.screens[scrnIndex]); + ErrorF("DRIUnlock\n"); pI810->LockHeld = 0; } #endif @@ -2241,6 +2247,7 @@ if (I810_DEBUG & DEBUG_VERBOSE_DRI) ErrorF("calling dri lock\n"); DRILock(screenInfo.screens[scrnIndex], 0); + ErrorF("DRILock\n"); pI810->LockHeld = 1; } #endif @@ -2254,6 +2261,8 @@ if (!I810UnbindGARTMemory(pScrn)) return; + if (!I810DRILeave(pScrn)) + return; vgaHWLock(hwp); }