📄 atidri.c
字号:
xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Could not bind\n" ); drmAgpFree( pATI->drmFD, pATIDRIServer->agpHandle ); drmAgpRelease( pATI->drmFD ); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] Using %d kB for DMA descriptor ring\n", pATIDRIServer->ringSize); if (pATI->OptionBufferSize) { if (pATI->OptionBufferSize < 1 || pATI->OptionBufferSize > pATIDRIServer->agpSize ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Illegal DMA buffers size: %d MB\n", pATI->OptionBufferSize ); return FALSE; } if (pATI->OptionBufferSize > 2) { xf86DrvMsg( pScreen->myNum, X_WARNING, "[agp] Illegal DMA buffers size: %d MB\n", pATI->OptionBufferSize ); xf86DrvMsg( pScreen->myNum, X_WARNING, "[agp] Clamping DMA buffers size to 2 MB\n"); pATIDRIServer->bufferSize = 2; } else { pATIDRIServer->bufferSize = pATI->OptionBufferSize; xf86DrvMsg( pScreen->myNum, X_CONFIG, "[agp] Using %d MB for DMA buffers\n", pATIDRIServer->bufferSize ); } } else { xf86DrvMsg( pScreen->myNum, X_DEFAULT, "[agp] Using %d MB for DMA buffers\n", pATIDRIServer->bufferSize ); } pATIDRIServer->agpTexSize = pATIDRIServer->agpSize - pATIDRIServer->bufferSize; /* Reserve space for the DMA descriptor ring */ pATIDRIServer->ringStart = pATIDRIServer->agpOffset; pATIDRIServer->ringMapSize = pATIDRIServer->ringSize*1024; /* ringSize is in kB */ /* Reserve space for the vertex buffer */ pATIDRIServer->bufferStart = pATIDRIServer->ringStart + pATIDRIServer->ringMapSize; pATIDRIServer->bufferMapSize = pATIDRIServer->bufferSize*1024*1024; /* Reserve the rest for AGP textures */ pATIDRIServer->agpTexStart = pATIDRIServer->bufferStart + pATIDRIServer->bufferMapSize; s = (pATIDRIServer->agpSize*1024*1024 - pATIDRIServer->agpTexStart); l = Mach64MinBits((s-1) / MACH64_NR_TEX_REGIONS); if (l < MACH64_LOG_TEX_GRANULARITY) l = MACH64_LOG_TEX_GRANULARITY; pATIDRIServer->agpTexMapSize = (s >> l) << l; pATIDRIServer->log2AGPTexGran = l; xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] Using %d kB for AGP textures\n", pATIDRIServer->agpTexMapSize/1024); /* Map DMA descriptor ring */ if ( drmAddMap( pATI->drmFD, pATIDRIServer->ringStart, pATIDRIServer->ringMapSize, DRM_AGP, DRM_RESTRICTED, &pATIDRIServer->ringHandle ) < 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Could not add ring mapping\n" ); return FALSE; } xf86DrvMsg( pScreen->myNum, X_INFO, "[agp] ring handle = 0x%08x\n", pATIDRIServer->ringHandle ); if ( drmMap( pATI->drmFD, pATIDRIServer->ringHandle, pATIDRIServer->ringMapSize, &pATIDRIServer->ringMap ) < 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Could not map ring\n" ); return FALSE; } xf86DrvMsg( pScreen->myNum, X_INFO, "[agp] Ring mapped at 0x%08lx\n", (unsigned long)pATIDRIServer->ringMap ); /* Map vertex buffers */ if ( drmAddMap( pATI->drmFD, pATIDRIServer->bufferStart, pATIDRIServer->bufferMapSize, DRM_AGP, 0, &pATIDRIServer->bufferHandle ) < 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Could not add vertex buffers mapping\n" ); return FALSE; } xf86DrvMsg( pScreen->myNum, X_INFO, "[agp] vertex buffers handle = 0x%08x\n", pATIDRIServer->bufferHandle ); if ( drmMap( pATI->drmFD, pATIDRIServer->bufferHandle, pATIDRIServer->bufferMapSize, &pATIDRIServer->bufferMap ) < 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Could not map vertex buffers\n" ); return FALSE; } xf86DrvMsg( pScreen->myNum, X_INFO, "[agp] Vertex buffers mapped at 0x%08lx\n", (unsigned long)pATIDRIServer->bufferMap ); /* Map AGP Textures */ if (drmAddMap(pATI->drmFD, pATIDRIServer->agpTexStart, pATIDRIServer->agpTexMapSize, DRM_AGP, 0, &pATIDRIServer->agpTexHandle) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not add AGP texture region mapping\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] AGP texture region handle = 0x%08x\n", pATIDRIServer->agpTexHandle); if (drmMap(pATI->drmFD, pATIDRIServer->agpTexHandle, pATIDRIServer->agpTexMapSize, &pATIDRIServer->agpTexMap) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not map AGP texture region\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] AGP Texture region mapped at 0x%08lx\n", (unsigned long)pATIDRIServer->agpTexMap); /* Initialize Mach64's AGP registers */ cntl = inm( AGP_CNTL ); cntl &= ~AGP_APER_SIZE_MASK; switch ( pATIDRIServer->agpSize ) { case 256: cntl |= AGP_APER_SIZE_256MB; break; case 128: cntl |= AGP_APER_SIZE_128MB; break; case 64: cntl |= AGP_APER_SIZE_64MB; break; case 32: cntl |= AGP_APER_SIZE_32MB; break; case 16: cntl |= AGP_APER_SIZE_16MB; break; case 8: cntl |= AGP_APER_SIZE_8MB; break; case 4: cntl |= AGP_APER_SIZE_4MB; break; default: xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Illegal aperture size %d kB\n", pATIDRIServer->agpSize*1024 ); return FALSE; } /* 1 = DATA comes in clock in which TRDY sampled (default) */ /* 0 = DATA comes in clock after TRDY sampled */ cntl |= AGP_TRDY_MODE; /* 1 = generate all reads as high priority */ /* 0 = generate all reads as their default priority (default) */ /* Setting this only works for me at AGP 1x mode (LLD) */ if (pATIDRIServer->agpMode == 1) { cntl |= HIGH_PRIORITY_READ_EN; } else { cntl &= ~HIGH_PRIORITY_READ_EN; } outm( AGP_BASE, drmAgpBase(pATI->drmFD) ); outm( AGP_CNTL, cntl ); return TRUE;}/* Add a map for the MMIO registers that will be accessed by any * DRI-based clients. */static Bool ATIDRIMapInit( ScreenPtr pScreen ){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; pATIDRIServer->regsSize = getpagesize(); if ( drmAddMap( pATI->drmFD, pATI->Block1Base, pATIDRIServer->regsSize, DRM_REGISTERS, DRM_READ_ONLY, &pATIDRIServer->regsHandle ) < 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[drm] failed to map registers\n" ); return FALSE; } xf86DrvMsg( pScreen->myNum, X_INFO, "[drm] register handle = 0x%08x\n", pATIDRIServer->regsHandle ); return TRUE;}/* Initialize the kernel data structures. */static Bool ATIDRIKernelInit( ScreenPtr pScreen ){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; drmMach64Init info; memset( &info, 0, sizeof(drmMach64Init) ); info.func = DRM_MACH64_INIT_DMA; info.sarea_priv_offset = sizeof(XF86DRISAREARec); info.is_pci = pATIDRIServer->IsPCI; info.dma_mode = pATI->OptionDMAMode; info.fb_bpp = pATI->bitsPerPixel; info.front_offset = pATIDRIServer->frontOffset; info.front_pitch = pATIDRIServer->frontPitch; info.back_offset = pATIDRIServer->backOffset; info.back_pitch = pATIDRIServer->backPitch; info.depth_bpp = 16; info.depth_offset = pATIDRIServer->depthOffset; info.depth_pitch = pATIDRIServer->depthPitch; info.fb_offset = pATI->LinearBase; info.mmio_offset = pATIDRIServer->regsHandle; info.ring_offset = pATIDRIServer->ringHandle; info.buffers_offset = pATIDRIServer->bufferHandle; info.agp_textures_offset = pATIDRIServer->agpTexHandle; if ( drmCommandWrite( pATI->drmFD, DRM_MACH64_INIT, &info, sizeof(drmMach64Init) ) < 0 ) { return FALSE; } else { return TRUE; }}/* Add a map for the DMA buffers that will be accessed by any * DRI-based clients. */static Bool ATIDRIAddBuffers( ScreenPtr pScreen ){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; /* Initialize vertex buffers */ if ( pATIDRIServer->IsPCI ) { pATIDRIServer->numBuffers = drmAddBufs( pATI->drmFD, (pATIDRIServer->bufferSize*1024*1024)/MACH64_BUFFER_SIZE, MACH64_BUFFER_SIZE, 0, 0 ); } else { pATIDRIServer->numBuffers = drmAddBufs( pATI->drmFD, pATIDRIServer->bufferMapSize/MACH64_BUFFER_SIZE, MACH64_BUFFER_SIZE, DRM_AGP_BUFFER, pATIDRIServer->bufferStart ); } if ( pATIDRIServer->numBuffers <= 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[drm] Could not create DMA buffers list\n" ); return FALSE; } xf86DrvMsg( pScreen->myNum, X_INFO, "[drm] Added %d %d byte DMA buffers\n", pATIDRIServer->numBuffers, MACH64_BUFFER_SIZE ); return TRUE;}static Bool ATIDRIMapBuffers( ScreenPtr pScreen ){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo; pATIDRIServer->drmBuffers = drmMapBufs( pATI->drmFD ); if ( !pATIDRIServer->drmBuffers ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[drm] Failed to map DMA buffers list\n" ); return FALSE; } xf86DrvMsg( pScreen->myNum, X_INFO, "[drm] Mapped %d DMA buffers at 0x%08lx\n", pATIDRIServer->drmBuffers->count, (unsigned long)pATIDRIServer->drmBuffers->list->address ); return TRUE;}static Bool ATIDRIIrqInit( ScreenPtr pScreen ){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); if ( pATI->irq <= 0 ) { pATI->irq = drmGetInterruptFromBusID(pATI->drmFD, ((pciConfigPtr)pATI->PCIInfo ->thisCard)->busnum, ((pciConfigPtr)pATI->PCIInfo ->thisCard)->devnum, ((pciConfigPtr)pATI->PCIInfo ->thisCard)->funcnum); if ( pATI->irq <= 0 ) { xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, "[drm] Couldn't find IRQ for bus id %d:%d:%d\n", ((pciConfigPtr)pATI->PCIInfo->thisCard)->busnum, ((pciConfigPtr)pATI->PCIInfo->thisCard)->devnum, ((pciConfigPtr)pATI->PCIInfo->thisCard)->funcnum); pATI->irq = 0; } else if ((drmCtlInstHandler(pATI->drmFD, pATI->irq)) != 0) { xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, "[drm] Failed to initialize interrupt handler with IRQ %d\n", pATI->irq); pATI->irq = 0; } if (pATI->irq) xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "[drm] Installed interrupt handler, using IRQ %d\n", pATI->irq); else { xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "[drm] Falling back to irq-free operation\n"); return FALSE; } } return TRUE;}/* Initialize the screen-specific data structures for the DRI and the * Rage Pro. This is the main entry point to the device-specific * initialization code. It calls device-independent DRI functions to * create the DRI data structures and initialize the DRI state. */Bool ATIDRIScreenInit( ScreenPtr pScreen ){ ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; ATIPtr pATI = ATIPTR(pScreenInfo); DRIInfoPtr pDRIInfo; ATIDRIPtr pATIDRI; ATIDRIServerInfoPtr pATIDRIServer; drmVersionPtr version; int major, minor, patch; /* Check that the GLX, DRI, and DRM modules have been loaded by testing * for known symbols in each module. */ if ( !xf86LoaderCheckSymbol("GlxSetVisualConfigs") ) return FALSE; if ( !xf86LoaderCheckSymbol("drmAvailable") ) return FALSE; if ( !xf86LoaderCheckSymbol("DRIQueryVersion") ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[dri] ATIDRIScreenInit failed (libdri.a too old)\n" ); return FALSE; } /* Check the DRI version */ DRIQueryVersion( &major, &minor, &patch ); if ( major != DRIINFO_MAJOR_VERSION || minor < DRIINFO_MINOR_VERSION ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[dri] ATIDRIScreenInit failed because of a version mismatch.\n" "[dri] libdri version is %d.%d.%d but version %d.%d.x is needed.\n" "[dri] Disabling the DRI.\n", major, minor, patch, DRIINFO_MAJOR_VERSION, DRIINFO_MINOR_VERSION ); return FALSE; } switch ( pATI->bitsPerPixel ) { case 8: /* These modes are not supported (yet). */ case 15: case 24: xf86DrvMsg( pScreen->myNum, X_ERROR, "[dri] Direct rendering only supported in 16 and 32 bpp modes\n"); return FALSE; /* Only 16 and 32 color depths are supported currently. */ case 16: if ( pATI->depth != 16) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[dri] Direct rendering not supported for depth %d at fbbpp 16.\n", pATI->depth ); return FALSE; } break; case 32: break; } /* Create the DRI data structure, and fill it in before calling the * DRIScreenInit(). */ pDRIInfo = DRICreateInfoRec(); if ( !pDRIInfo ) return FALSE; pATI->pDRIInfo = pDRIInfo; pDRIInfo->drmDriverName = ATIKernelDriverName; pDRIInfo->clientDriverName = ATIClientDriverName; if (xf86LoaderCheckSymbol("DRICreatePCIBusID")) { pDRIInfo->busIdString = DRICreatePCIBusID(pATI->PCIInfo); } else { pDRIInfo->busIdString = xalloc( 64 ); sprintf( pDRIInfo->busIdString, "PCI:%d:%d:%d", pATI->PCIInfo->bus, pATI->PCIInfo->device, pATI->PCIInfo->func ); } pDRIInfo->ddxDriverMajorVersion = ATI_VERSION_MAJOR; pDRIInfo->ddxDriverMinorVersion = ATI_VERSION_MINOR; pDRIInfo->ddxDriverPatchVersion = ATI_VERSION_PATCH; pDRIInfo->frameBufferPhysicalAddress = (void *)pATI->LinearBase; pDRIInfo->frameBufferSize = pATI->LinearSize; pDRIInfo->frameBufferStride = (pScreenInfo->displayWidth * pATI->FBBytesPerPixel); pDRIInfo->ddxDrawableTableEntry = ATI_MAX_DRAWABLES; if ( SAREA_MAX_DRAWABLES < ATI_MAX_DRAWABLES ) { pDRIInfo->maxDrawableTableEntry = SAREA_MAX_DRAWABLES;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -