📄 atidri.c
字号:
pATI->have3DWindows = TRUE;}#endif /* USE_XAA */#ifdef USE_EXAstatic void ATIDRITransitionTo2d_EXA(ScreenPtr pScreen){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo);#if 0 ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; exaEnableDisableFBAccess(pScreen->myNum, FALSE); pATI->pExa->offScreenBase = pATIDRIServer->backOffset; exaEnableDisableFBAccess(pScreen->myNum, TRUE);#endif pATI->have3DWindows = FALSE;}static void ATIDRITransitionTo3d_EXA(ScreenPtr pScreen){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo);#if 0 ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; exaEnableDisableFBAccess(pScreen->myNum, FALSE); pATI->pExa->offScreenBase = pATIDRIServer->textureOffset + pATIDRIServer->textureSize; exaEnableDisableFBAccess(pScreen->myNum, TRUE);#endif pATI->have3DWindows = TRUE;}#endif /* USE_EXA *//* Initialize the state of the back and depth buffers. */static void ATIDRIInitBuffers( WindowPtr pWin, RegionPtr prgn, CARD32 indx ){#ifdef USE_XAA ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo; BoxPtr pbox, pboxSave; int nbox, nboxSave; int depth; depth = 0x0000ffff; if (!pXAAInfo) return; if (!pXAAInfo->SetupForSolidFill) return; /* FIXME: Only initialize the back and depth buffers for contexts that request them */ /* FIXME: Use drm clear? (see Radeon driver) */ pboxSave = pbox = REGION_RECTS(prgn); nboxSave = nbox = REGION_NUM_RECTS(prgn); (*pXAAInfo->SetupForSolidFill)(pScreenInfo, 0, GXcopy, (CARD32)(-1)); for (; nbox; nbox--, pbox++) { (*pXAAInfo->SubsequentSolidFillRect)(pScreenInfo, pbox->x1 + pATIDRIServer->fbX, pbox->y1 + pATIDRIServer->fbY, pbox->x2 - pbox->x1, pbox->y2 - pbox->y1); (*pXAAInfo->SubsequentSolidFillRect)(pScreenInfo, pbox->x1 + pATIDRIServer->backX, pbox->y1 + pATIDRIServer->backY, pbox->x2 - pbox->x1, pbox->y2 - pbox->y1); } pbox = pboxSave; nbox = nboxSave; (*pXAAInfo->SetupForSolidFill)(pScreenInfo, depth, GXcopy, (CARD32)(-1)); for (; nbox; nbox--, pbox++) (*pXAAInfo->SubsequentSolidFillRect)(pScreenInfo, pbox->x1 + pATIDRIServer->depthX, pbox->y1 + pATIDRIServer->depthY, pbox->x2 - pbox->x1, pbox->y2 - pbox->y1); ATIDRIMarkSyncInt(pScreenInfo);#endif}/* Copy the back and depth buffers when the X server moves a window. * * Note: this function was copied from the Radeon driver... * * This routine is a modified form of XAADoBitBlt with the calls to * ScreenToScreenBitBlt built in. My routine has the prgnSrc as source * instead of destination. My origin is upside down so the ydir cases * are reversed. */static void ATIDRIMoveBuffers( WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc, CARD32 indx ){#ifdef USE_XAA ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo; int backOffsetPitch = (((pATI->pDRIServerInfo->backPitch/8) << 22) | (pATI->pDRIServerInfo->backOffset >> 3));#if 0 int depthOffsetPitch = (((pATI->pDRIServerInfo->depthPitch/8) << 22) | (pATI->pDRIServerInfo->depthOffset >> 3));#endif BoxPtr pboxTmp, pboxNext, pboxBase; DDXPointPtr pptTmp; int xdir, ydir; int screenwidth = pScreenInfo->virtualX; int screenheight = pScreenInfo->virtualY; BoxPtr pbox = REGION_RECTS(prgnSrc); int nbox = REGION_NUM_RECTS(prgnSrc); BoxPtr pboxNew1 = NULL; BoxPtr pboxNew2 = NULL; DDXPointPtr pptNew1 = NULL; DDXPointPtr pptNew2 = NULL; DDXPointPtr pptSrc = &ptOldOrg; int dx = pWin->drawable.x - ptOldOrg.x; int dy = pWin->drawable.y - ptOldOrg.y; if (!pXAAInfo) return; if (!pXAAInfo->SetupForScreenToScreenCopy) return; /* FIXME: Only move the back and depth buffers for contexts * that request them. */ /* If the copy will overlap in Y, reverse the order */ if (dy > 0) { ydir = -1; if (nbox > 1) { /* Keep ordering in each band, reverse order of bands */ pboxNew1 = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec)*nbox); if (!pboxNew1) return; pptNew1 = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec)*nbox); if (!pptNew1) { DEALLOCATE_LOCAL(pboxNew1); return; } pboxBase = pboxNext = pbox+nbox-1; while (pboxBase >= pbox) { while ((pboxNext >= pbox) && (pboxBase->y1 == pboxNext->y1)) pboxNext--; pboxTmp = pboxNext+1; pptTmp = pptSrc + (pboxTmp - pbox); while (pboxTmp <= pboxBase) { *pboxNew1++ = *pboxTmp++; *pptNew1++ = *pptTmp++; } pboxBase = pboxNext; } pboxNew1 -= nbox; pbox = pboxNew1; pptNew1 -= nbox; pptSrc = pptNew1; } } else { /* No changes required */ ydir = 1; } /* If the regions will overlap in X, reverse the order */ if (dx > 0) { xdir = -1; if (nbox > 1) { /* reverse order of rects in each band */ pboxNew2 = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec)*nbox); pptNew2 = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec)*nbox); if (!pboxNew2 || !pptNew2) { DEALLOCATE_LOCAL(pptNew2); DEALLOCATE_LOCAL(pboxNew2); DEALLOCATE_LOCAL(pptNew1); DEALLOCATE_LOCAL(pboxNew1); return; } pboxBase = pboxNext = pbox; while (pboxBase < pbox+nbox) { while ((pboxNext < pbox+nbox) && (pboxNext->y1 == pboxBase->y1)) pboxNext++; pboxTmp = pboxNext; pptTmp = pptSrc + (pboxTmp - pbox); while (pboxTmp != pboxBase) { *pboxNew2++ = *--pboxTmp; *pptNew2++ = *--pptTmp; } pboxBase = pboxNext; } pboxNew2 -= nbox; pbox = pboxNew2; pptNew2 -= nbox; pptSrc = pptNew2; } } else { /* No changes are needed */ xdir = 1; } (*pXAAInfo->SetupForScreenToScreenCopy)(pScreenInfo, xdir, ydir, GXcopy, (CARD32)(-1), -1); for (; nbox-- ; pbox++) { int xa = pbox->x1; int ya = pbox->y1; int destx = xa + dx; int desty = ya + dy; int w = pbox->x2 - xa + 1; int h = pbox->y2 - ya + 1; if (destx < 0) xa -= destx, w += destx, destx = 0; if (desty < 0) ya -= desty, h += desty, desty = 0; if (destx + w > screenwidth) w = screenwidth - destx; if (desty + h > screenheight) h = screenheight - desty; if (w <= 0) continue; if (h <= 0) continue; ATIMach64WaitForFIFO(pATI, 2); outf(SRC_OFF_PITCH, backOffsetPitch); outf(DST_OFF_PITCH, backOffsetPitch); (*pXAAInfo->SubsequentScreenToScreenCopy)(pScreenInfo, xa, ya, destx, desty, w, h);#if 0 /* FIXME: Move depth buffers? */ ATIMach64WaitForFIFO(pATI, 2); outf(SRC_OFF_PITCH, depthOffsetPitch); outf(DST_OFF_PITCH, depthOffsetPitch); if (pATI->depthMoves) ATIScreenToScreenCopyDepth(pScreenInfo, xa, ya, destx, desty, w, h);#endif } ATIMach64WaitForFIFO(pATI, 2); outf(SRC_OFF_PITCH, pATI->NewHW.dst_off_pitch); outf(DST_OFF_PITCH, pATI->NewHW.src_off_pitch); DEALLOCATE_LOCAL(pptNew2); DEALLOCATE_LOCAL(pboxNew2); DEALLOCATE_LOCAL(pptNew1); DEALLOCATE_LOCAL(pboxNew1); ATIDRIMarkSyncInt(pScreenInfo);#endif}/* Compute log base 2 of val. */static int Mach64MinBits(int val){ int bits; if (!val) return 1; for (bits = 0; val; val >>= 1, ++bits); return bits;}static Bool ATIDRISetAgpMode( ScreenPtr pScreen ){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; unsigned long mode = drmAgpGetMode( pATI->drmFD ); /* Default mode */ unsigned int vendor = drmAgpVendorId( pATI->drmFD ); unsigned int device = drmAgpDeviceId( pATI->drmFD ); if (pATI->OptionAGPMode > 0 && pATI->OptionAGPMode <= ATI_AGP_MAX_MODE) { pATIDRIServer->agpMode = pATI->OptionAGPMode; xf86DrvMsg( pScreen->myNum, X_CONFIG, "[agp] Using AGP %dx Mode\n", pATIDRIServer->agpMode ); } else if (pATI->OptionAGPMode > 0) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Illegal AGP Mode: %d\n", pATI->OptionAGPMode ); return FALSE; } else { /* If no mode configured, use the default mode obtained from agpgart */ if ( mode & AGP_MODE_2X ) { pATIDRIServer->agpMode = 2; } else if ( mode & AGP_MODE_1X ) { pATIDRIServer->agpMode = 1; } xf86DrvMsg( pScreen->myNum, X_DEFAULT, "[agp] Using AGP %dx Mode\n", pATIDRIServer->agpMode ); } mode &= ~AGP_MODE_MASK; switch ( pATIDRIServer->agpMode ) { case 2: mode |= AGP_MODE_2X; case 1: default: mode |= AGP_MODE_1X; } if (pATI->OptionAGPSize) { switch (pATI->OptionAGPSize) { case 128: case 64: case 32: case 16: case 8: case 4: pATIDRIServer->agpSize = pATI->OptionAGPSize; xf86DrvMsg( pScreen->myNum, X_CONFIG, "[agp] Using %d MB AGP aperture\n", pATIDRIServer->agpSize ); break; default: xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Illegal aperture size %d MB\n", pATI->OptionAGPSize ); return FALSE; } } else { xf86DrvMsg( pScreen->myNum, X_DEFAULT, "[agp] Using %d MB AGP aperture\n", pATIDRIServer->agpSize ); } xf86DrvMsg( pScreen->myNum, X_INFO, "[agp] Mode 0x%08lx [AGP 0x%04x/0x%04x; Card 0x%04x/0x%04x]\n", mode, vendor, device, pATI->PCIInfo->vendor, pATI->PCIInfo->chipType ); if ( drmAgpEnable( pATI->drmFD, mode ) < 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] AGP not enabled\n" ); drmAgpRelease( pATI->drmFD ); return FALSE; } return TRUE;}/* Initialize the AGP state. Request memory for use in AGP space, and * initialize the Rage Pro registers to point to that memory. */static Bool ATIDRIAgpInit( ScreenPtr pScreen ){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; int ret; unsigned long cntl; int s, l; pATIDRIServer->agpSize = ATI_DEFAULT_AGP_SIZE; pATIDRIServer->agpMode = ATI_DEFAULT_AGP_MODE; pATIDRIServer->bufferSize = ATI_DEFAULT_BUFFER_SIZE; pATIDRIServer->ringSize = 16; /* 16 kB ring */ if ( drmAgpAcquire( pATI->drmFD ) < 0 ) { xf86DrvMsg( pScreen->myNum, X_WARNING, "[agp] AGP not available\n" ); return FALSE; } if (!ATIDRISetAgpMode( pScreen )) return FALSE; pATIDRIServer->agpOffset = 0; ret = drmAgpAlloc( pATI->drmFD, pATIDRIServer->agpSize*1024*1024, 0, NULL, &pATIDRIServer->agpHandle ); if ( ret < 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Out of memory (%d)\n", ret ); drmAgpRelease( pATI->drmFD ); return FALSE; } xf86DrvMsg( pScreen->myNum, X_INFO, "[agp] %d kB allocated with handle 0x%08x\n", pATIDRIServer->agpSize*1024, pATIDRIServer->agpHandle ); if ( drmAgpBind( pATI->drmFD, pATIDRIServer->agpHandle, pATIDRIServer->agpOffset) < 0 ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -