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

📄 atidri.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
   } else {      pDRIInfo->maxDrawableTableEntry = ATI_MAX_DRAWABLES;   }   /* For now the mapping works by using a fixed size defined    * in the SAREA header    */   if ( sizeof(XF86DRISAREARec) + sizeof(ATISAREAPrivRec) > SAREA_MAX ) {      ErrorF( "[dri] Data does not fit in SAREA\n" );      return FALSE;   }   xf86DrvMsg( pScreenInfo->scrnIndex, X_INFO, "[drm] SAREA %d+%d: %d\n",	       sizeof(XF86DRISAREARec), sizeof(ATISAREAPrivRec),	       sizeof(XF86DRISAREARec) + sizeof(ATISAREAPrivRec) );   pDRIInfo->SAREASize = SAREA_MAX;   pATIDRI = (ATIDRIPtr) xnfcalloc( sizeof(ATIDRIRec), 1 );   if ( !pATIDRI ) {      DRIDestroyInfoRec( pATI->pDRIInfo );      pATI->pDRIInfo = NULL;      xf86DrvMsg( pScreenInfo->scrnIndex, X_ERROR,		  "[dri] Failed to allocate memory for private record\n" );      return FALSE;   }   pATIDRIServer = (ATIDRIServerInfoPtr)      xnfcalloc( sizeof(ATIDRIServerInfoRec), 1 );   if ( !pATIDRIServer ) {      xfree( pATIDRI );      DRIDestroyInfoRec( pATI->pDRIInfo );      pATI->pDRIInfo = NULL;      xf86DrvMsg( pScreenInfo->scrnIndex, X_ERROR,		  "[dri] Failed to allocate memory for private record\n" );      return FALSE;   }   pATI->pDRIServerInfo = pATIDRIServer;   pDRIInfo->devPrivate		= pATIDRI;   pDRIInfo->devPrivateSize	= sizeof(ATIDRIRec);   pDRIInfo->contextSize	= sizeof(ATIDRIContextRec);   pDRIInfo->CreateContext	= ATICreateContext;   pDRIInfo->DestroyContext	= ATIDestroyContext;   pDRIInfo->SwapContext	= ATIDRISwapContext;   pDRIInfo->InitBuffers	= ATIDRIInitBuffers;   pDRIInfo->MoveBuffers	= ATIDRIMoveBuffers;#ifdef USE_XAA   if (!pATI->useEXA) {      pDRIInfo->TransitionTo2d  = ATIDRITransitionTo2d;      pDRIInfo->TransitionTo3d  = ATIDRITransitionTo3d;   }#endif /* USE_XAA */#ifdef USE_EXA   if (pATI->useEXA) {      pDRIInfo->TransitionTo2d  = ATIDRITransitionTo2d_EXA;      pDRIInfo->TransitionTo3d  = ATIDRITransitionTo3d_EXA;   }#endif /* USE_EXA */   pDRIInfo->bufferRequests	= DRI_ALL_WINDOWS;   pDRIInfo->createDummyCtx     = TRUE;   pDRIInfo->createDummyCtxPriv = FALSE;   pATI->have3DWindows = FALSE;   if ( !DRIScreenInit( pScreen, pDRIInfo, &pATI->drmFD ) ) {      xfree( pATIDRIServer );      pATI->pDRIServerInfo = NULL;      xfree( pDRIInfo->devPrivate );      pDRIInfo->devPrivate = NULL;      DRIDestroyInfoRec( pDRIInfo );      pDRIInfo = NULL;      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[dri] DRIScreenInit Failed\n" );      return FALSE;   }      /* Check the DRM lib version.      drmGetLibVersion was not supported in version 1.0, so check for      symbol first to avoid possible crash or hang.   */   if (xf86LoaderCheckSymbol("drmGetLibVersion")) {      version = drmGetLibVersion(pATI->drmFD);   } else {      /* drmlib version 1.0.0 didn't have the drmGetLibVersion	 entry point.  Fake it by allocating a version record	 via drmGetVersion and changing it to version 1.0.0      */      version = drmGetVersion(pATI->drmFD);      version->version_major      = 1;      version->version_minor      = 0;      version->version_patchlevel = 0;   }   if (version) {      if (version->version_major != 1 ||	  version->version_minor < 1) {	 /* incompatible drm library version */	 xf86DrvMsg(pScreen->myNum, X_ERROR,		    "[dri] ATIDRIScreenInit failed because of a version mismatch.\n"		    "[dri] libdrm.a module version is %d.%d.%d but version 1.1.x is needed.\n"		    "[dri] Disabling DRI.\n",		    version->version_major,		    version->version_minor,		    version->version_patchlevel);	 drmFreeVersion(version);	 ATIDRICloseScreen(pScreen);	 return FALSE;      }      drmFreeVersion(version);   }   /* Check the mach64 DRM version */   version = drmGetVersion( pATI->drmFD );   if ( version ) {      if ( version->version_major != 1 ||	   version->version_minor < 0 ) {	 /* Incompatible DRM version */	 xf86DrvMsg( pScreen->myNum, X_ERROR,		     "[dri] ATIDRIScreenInit failed because of a version mismatch.\n"		     "[dri] mach64.o kernel module version is %d.%d.%d, but version 1.0 or greater is needed.\n"		     "[dri] Disabling DRI.\n",		     version->version_major,		     version->version_minor,		     version->version_patchlevel );	 drmFreeVersion( version );	 ATIDRICloseScreen( pScreen );	 return FALSE;      }      drmFreeVersion( version );   }   switch ( pATI->OptionDMAMode ) {   case MACH64_MODE_DMA_ASYNC:      xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Will request asynchronous DMA mode\n");      break;   case MACH64_MODE_DMA_SYNC:      xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Will request synchronous DMA mode\n");      break;   case MACH64_MODE_MMIO:      xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Will request pseudo-DMA (MMIO) mode\n");      break;   default:      xf86DrvMsg(pScreen->myNum, X_WARNING, "[drm] Unknown DMA mode\n");   }   pATIDRIServer->IsPCI = (pATI->BusType == ATI_BUS_PCI || pATI->OptionIsPCI) ? TRUE : FALSE;   if ( pATI->BusType != ATI_BUS_PCI && pATI->OptionIsPCI ) {       outm( AGP_BASE, 0 );       outm( AGP_CNTL, 0 );       xf86DrvMsg(pScreen->myNum, X_CONFIG, "[dri] Forcing PCI mode\n");   }   /* Check buffer size option for PCI, since it won't be done in ATIDRIAgpInit */   if ( pATIDRIServer->IsPCI) {      pATIDRIServer->bufferSize = ATI_DEFAULT_BUFFER_SIZE;      if (pATI->OptionBufferSize) {      	 if (pATI->OptionBufferSize < 1) {	    xf86DrvMsg( pScreen->myNum, X_ERROR, "[pci] Illegal DMA buffers size: %d MB\n",			pATI->OptionBufferSize );	    ATIDRICloseScreen( pScreen );	    return FALSE;	 }	 if (pATI->OptionBufferSize > 2) {	    xf86DrvMsg( pScreen->myNum, X_WARNING, "[pci] Illegal DMA buffers size: %d MB\n",			pATI->OptionBufferSize );	    xf86DrvMsg( pScreen->myNum, X_WARNING, "[pci] Clamping DMA buffers size to 2 MB\n");	    pATIDRIServer->bufferSize = 2;	 } else {	    pATIDRIServer->bufferSize = pATI->OptionBufferSize;	    xf86DrvMsg( pScreen->myNum, X_CONFIG, "[pci] Using %d MB DMA buffer size\n",			pATIDRIServer->bufferSize );	 }      } else {	 xf86DrvMsg( pScreen->myNum, X_DEFAULT, "[pci] Using %d MB DMA buffer size\n",		     pATIDRIServer->bufferSize );      }   }   /* Initialize AGP */   if ( !pATIDRIServer->IsPCI && !ATIDRIAgpInit( pScreen ) ) {      pATIDRIServer->IsPCI = TRUE;      if ( pATI->BusType != ATI_BUS_PCI ) {	 outm( AGP_BASE, 0 );	 outm( AGP_CNTL, 0 );      }      xf86DrvMsg( pScreen->myNum, X_WARNING, "[agp] AGP failed to initialize -- falling back to PCI mode.\n" );      xf86DrvMsg( pScreen->myNum, X_WARNING, "[agp] Make sure you have the agpgart kernel module loaded.\n" );   }   if ( !ATIDRIMapInit( pScreen ) ) {      ATIDRICloseScreen( pScreen );      return FALSE;   }   if ( !ATIInitVisualConfigs( pScreen ) ) {      ATIDRICloseScreen( pScreen );      return FALSE;   }   xf86DrvMsg( pScreenInfo->scrnIndex, X_INFO,	       "[dri] Visual configs initialized\n" );   xf86DrvMsg( pScreenInfo->scrnIndex, X_INFO,	       "[dri] Block 0 base at 0x%08lx\n", pATI->Block0Base );   return TRUE;}/* Finish initializing the device-dependent DRI state, and call * DRIFinishScreenInit() to complete the device-independent DRI * initialization. */Bool ATIDRIFinishScreenInit( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   ATISAREAPrivPtr pSAREAPriv;   ATIDRIPtr pATIDRI;   ATIDRIServerInfoPtr pATIDRIServer;   pATI->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT;   /* NOTE: DRIFinishScreenInit must be called before *DRIKernelInit    * because *DRIKernelInit requires that the hardware lock is held by    * the X server, and the first time the hardware lock is grabbed is    * in DRIFinishScreenInit.    */   if ( !DRIFinishScreenInit( pScreen ) ) {      ATIDRICloseScreen( pScreen );      return FALSE;   }   /* Initialize the DMA buffer list */   /* Need to do this before ATIDRIKernelInit so we can init the freelist */   if ( !ATIDRIAddBuffers( pScreen ) ) {      ATIDRICloseScreen( pScreen );      return FALSE;   }   /* Initialize the kernel data structures */   if ( !ATIDRIKernelInit( pScreen ) ) {      xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 		 "[drm] Failed to initialize the mach64.o kernel module\n");      xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 		 "[drm] Check the system log for more information.\n");      ATIDRICloseScreen( pScreen );      return FALSE;   }   if ( !ATIDRIMapBuffers( pScreen ) ) {      ATIDRICloseScreen( pScreen );      return FALSE;   }   /* Initialize IRQ */   ATIDRIIrqInit( pScreen );   pSAREAPriv = (ATISAREAPrivPtr) DRIGetSAREAPrivate( pScreen );   memset( pSAREAPriv, 0, sizeof(*pSAREAPriv) );   pATIDRI = (ATIDRIPtr)pATI->pDRIInfo->devPrivate;   pATIDRIServer = pATI->pDRIServerInfo;   pATIDRI->width = pScreenInfo->virtualX;   pATIDRI->height = pScreenInfo->virtualY;   pATIDRI->mem = pScreenInfo->videoRam * 1024;   pATIDRI->cpp = pScreenInfo->bitsPerPixel / 8;   pATIDRI->IsPCI = pATIDRIServer->IsPCI;   pATIDRI->AGPMode = pATIDRIServer->agpMode;   pATIDRI->frontOffset = pATIDRIServer->frontOffset;   pATIDRI->frontPitch = pATIDRIServer->frontPitch;   pATIDRI->backOffset = pATIDRIServer->backOffset;   pATIDRI->backPitch = pATIDRIServer->backPitch;   pATIDRI->depthOffset = pATIDRIServer->depthOffset;   pATIDRI->depthPitch = pATIDRIServer->depthPitch;   pATIDRI->textureOffset = pATIDRIServer->textureOffset;   pATIDRI->textureSize	= pATIDRIServer->textureSize;   pATIDRI->logTextureGranularity = pATIDRIServer->logTextureGranularity;   pATIDRI->regs = pATIDRIServer->regsHandle;   pATIDRI->regsSize = pATIDRIServer->regsSize;   pATIDRI->agp = pATIDRIServer->agpTexHandle;   pATIDRI->agpSize = pATIDRIServer->agpTexMapSize;   pATIDRI->logAgpTextureGranularity = pATIDRIServer->log2AGPTexGran;   pATIDRI->agpTextureOffset = pATIDRIServer->agpTexStart;   return TRUE;}/* * This function will attempt to get the Mach64 hardware back into shape * after a resume from disc. Its an extract from ATIDRIAgpInit and ATIDRIFinishScreenInit * This also calls a new ioctl in the mach64 DRM that in its turn is * an extraction of the hardware-affecting bits from mach64_do_init_drm() * (see atidrm.c) * I am assuming here that pATI->pDRIServerInfo doesn't change * elsewhere in incomaptible ways. * How will this code react to resuming after a failed resumeor pci based dri ? */void ATIDRIResume( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo;   xf86DrvMsg( pScreen->myNum, X_INFO,		 "[RESUME] Attempting to re-init Mach64 hardware.\n");   if (!pATIDRIServer->IsPCI) {      if (!ATIDRISetAgpMode(pScreen))      return;      outm( AGP_BASE, drmAgpBase(pATI->drmFD) );   }}/* The screen is being closed, so clean up any state and free any * resources used by the DRI. */void ATIDRICloseScreen( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo;   drmMach64Init info;   /* Stop interrupt generation and handling if used */   if ( pATI->irq > 0 ) {      if ( drmCtlUninstHandler(pATI->drmFD) != 0 ) {	 xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,		    "[drm] Error uninstalling interrupt handler for IRQ %d\n", pATI->irq);      } else {	 xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO,		    "[drm] Uninstalled interrupt handler for IRQ %d\n", pATI->irq);      }      pATI->irq = 0;   }   /* De-allocate DMA buffers */   if ( pATIDRIServer->drmBuffers ) {      drmUnmapBufs( pATIDRIServer->drmBuffers );      pATIDRIServer->drmBuffers = NULL;   }   /* De-allocate all kernel resources */   memset(&info, 0, sizeof(drmMach64Init));   info.func = DRM_MACH64_CLEANUP_DMA;   drmCommandWrite( pATI->drmFD, DRM_MACH64_INIT,		    &info, sizeof(drmMach64Init) );   /* De-allocate all AGP resources */   if ( pATIDRIServer->agpTexMap ) {      drmUnmap( pATIDRIServer->agpTexMap, pATIDRIServer->agpTexMapSize );      pATIDRIServer->agpTexMap = NULL;   }   if ( pATIDRIServer->bufferMap ) {      drmUnmap( pATIDRIServer->bufferMap, pATIDRIServer->bufferMapSize );      pATIDRIServer->bufferMap = NULL;   }   if ( pATIDRIServer->agpHandle ) {      drmAgpUnbind( pATI->drmFD, pATIDRIServer->agpHandle );      drmAgpFree( pATI->drmFD, pATIDRIServer->agpHandle );      pATIDRIServer->agpHandle = 0;      drmAgpRelease( pATI->drmFD );   }   /* De-allocate all DRI resources */   DRICloseScreen( pScreen );   /* De-allocate all DRI data structures */   if ( pATI->pDRIInfo ) {      if ( pATI->pDRIInfo->devPrivate ) {	 xfree( pATI->pDRIInfo->devPrivate );	 pATI->pDRIInfo->devPrivate = NULL;      }      DRIDestroyInfoRec( pATI->pDRIInfo );      pATI->pDRIInfo = NULL;   }   if ( pATI->pDRIServerInfo ) {      xfree( pATI->pDRIServerInfo );      pATI->pDRIServerInfo = NULL;   }   if ( pATI->pVisualConfigs ) {      xfree( pATI->pVisualConfigs );      pATI->pVisualConfigs = NULL;   }   if ( pATI->pVisualConfigsPriv ) {      xfree( pATI->pVisualConfigsPriv );      pATI->pVisualConfigsPriv = NULL;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -