⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atidri.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
   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 + -