📄 atidri.c
字号:
} 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 + -