i830_dri.c
来自「是由intel提供的针对intel显卡915以上系列的linux驱动」· C语言 代码 · 共 1,519 行 · 第 1/3 页
C
1,519 行
"[dri] Data does not fit in SAREA\n"); return FALSE; } /* This is a hack for now. We have to have more than a 4k page here * because of the size of the state. However, the state should be * in a per-context mapping. This will be added in the Mesa 3.5 port * of the I830 driver. */ pDRIInfo->SAREASize = SAREA_MAX; if (!(pI830DRI = (I830DRIPtr) xcalloc(sizeof(I830DRIRec), 1))) { DRIDestroyInfoRec(pI830->pDRIInfo); pI830->pDRIInfo = 0; return FALSE; } pDRIInfo->devPrivate = pI830DRI; pDRIInfo->devPrivateSize = sizeof(I830DRIRec); pDRIInfo->contextSize = sizeof(I830DRIContextRec); pDRIInfo->CreateContext = I830CreateContext; pDRIInfo->DestroyContext = I830DestroyContext; pDRIInfo->SwapContext = I830DRISwapContext; pDRIInfo->InitBuffers = I830DRIInitBuffers; pDRIInfo->MoveBuffers = I830DRIMoveBuffers; pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; pDRIInfo->OpenFullScreen = I830DRIOpenFullScreen; pDRIInfo->CloseFullScreen = I830DRICloseFullScreen; pDRIInfo->TransitionTo2d = I830DRITransitionTo2d; pDRIInfo->TransitionTo3d = I830DRITransitionTo3d; pDRIInfo->TransitionSingleToMulti3D = I830DRITransitionSingleToMulti3d; pDRIInfo->TransitionMultiToSingle3D = I830DRITransitionMultiToSingle3d; /* do driver-independent DRI screen initialization here */ if (!DRIScreenInit(pScreen, pDRIInfo, &pI830->drmSubFD)) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] DRIScreenInit failed. Disabling DRI.\n"); xfree(pDRIInfo->devPrivate); pDRIInfo->devPrivate = 0; DRIDestroyInfoRec(pI830->pDRIInfo); pI830->pDRIInfo = 0; return FALSE; }#if 0 /* disabled now, see frameBufferSize above being set to 0 */ /* for this driver, get rid of the front buffer mapping now */ if (xf86LoaderCheckSymbol("DRIGetScreenPrivate")) { DRIScreenPrivPtr pDRIPriv = (DRIScreenPrivPtr) DRIGetScreenPrivate(pScreen); if (pDRIPriv && pDRIPriv->drmFD && pDRIPriv->hFrameBuffer) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[intel] removing original screen mapping\n"); drmRmMap(pDRIPriv->drmFD, pDRIPriv->hFrameBuffer); pDRIPriv->hFrameBuffer = 0; xf86DrvMsg(pScreen->myNum, X_ERROR, "[intel] done removing original screen mapping\n"); } } else { xf86DrvMsg(pScreen->myNum, X_ERROR, "[intel] DRIGetScreenPrivate not found!!!!\n"); } #endif /* Check the i915 DRM versioning */ { drmVersionPtr version; /* 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(pI830->drmSubFD); } 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(pI830->drmSubFD); version->version_major = 1; version->version_minor = 0; version->version_patchlevel = 0; }#define REQ_MAJ 1#define REQ_MIN 1 if (version) { if (version->version_major != REQ_MAJ || version->version_minor < REQ_MIN) { /* incompatible drm library version */ xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] I830DRIScreenInit failed because of a version mismatch.\n" "[dri] libdrm.a module version is %d.%d.%d but version %d.%d.x is needed.\n" "[dri] Disabling DRI.\n", version->version_major, version->version_minor, version->version_patchlevel, REQ_MAJ, REQ_MIN); drmFreeVersion(version); I830DRICloseScreen(pScreen); return FALSE; } drmFreeVersion(version); } /* Check the i915 DRM version */ version = drmGetVersion(pI830->drmSubFD); if (version) { if (version->version_major != 1 || version->version_minor < 3) { /* incompatible drm version */ xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] %s failed because of a version mismatch.\n" "[dri] i915 kernel module version is %d.%d.%d but version 1.3 or greater is needed.\n" "[dri] Disabling DRI.\n", "I830DRIScreenInit", version->version_major, version->version_minor, version->version_patchlevel); I830DRICloseScreen(pScreen); drmFreeVersion(version); return FALSE; } if (strncmp(version->name, I830KernelDriverName, strlen(I830KernelDriverName))) { xf86DrvMsg(pScreen->myNum, X_WARNING, "i830 Kernel module detected, Use the i915 Kernel module instead, aborting DRI init.\n"); I830DRICloseScreen(pScreen); drmFreeVersion(version); return FALSE; } pI830->drmMinor = version->version_minor; drmFreeVersion(version); } } return TRUE;}BoolI830DRIMapScreenRegions(ScrnInfoPtr pScrn, drmI830Sarea *sarea){ ScreenPtr pScreen = pScrn->pScreen; I830Ptr pI830 = I830PTR(pScrn); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Mapping front buffer\n"); if (drmAddMap(pI830->drmSubFD, (drm_handle_t)(sarea->front_offset + pI830->LinearAddr), sarea->front_size, DRM_FRAME_BUFFER, /*DRM_AGP,*/ 0, &sarea->front_handle) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] drmAddMap(front_handle) failed. Disabling DRI\n"); DRICloseScreen(pScreen); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Front Buffer = 0x%08lx\n", sarea->front_handle); if (drmAddMap(pI830->drmSubFD, (drm_handle_t)(sarea->back_offset + pI830->LinearAddr), sarea->back_size, DRM_AGP, 0, &sarea->back_handle) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] drmAddMap(back_handle) failed. Disabling DRI\n"); DRICloseScreen(pScreen); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Back Buffer = 0x%08lx\n", sarea->back_handle); if (drmAddMap(pI830->drmSubFD, (drm_handle_t)sarea->depth_offset + pI830->LinearAddr, sarea->depth_size, DRM_AGP, 0, &sarea->depth_handle) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] drmAddMap(depth_handle) failed. Disabling DRI\n"); DRICloseScreen(pScreen); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Depth Buffer = 0x%08lx\n", sarea->depth_handle); if (drmAddMap(pI830->drmSubFD, (drm_handle_t)sarea->tex_offset + pI830->LinearAddr, sarea->tex_size, DRM_AGP, 0, &sarea->tex_handle) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] drmAddMap(tex_handle) failed. Disabling DRI\n"); DRICloseScreen(pScreen); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] textures = 0x%08lx\n", sarea->tex_handle); return TRUE;}voidI830DRIUnmapScreenRegions(ScrnInfoPtr pScrn, drmI830Sarea *sarea){ I830Ptr pI830 = I830PTR(pScrn);#if 1 if (sarea->front_handle) { drmRmMap(pI830->drmSubFD, sarea->front_handle); sarea->front_handle = 0; }#endif if (sarea->back_handle) { drmRmMap(pI830->drmSubFD, sarea->back_handle); sarea->back_handle = 0; } if (sarea->depth_handle) { drmRmMap(pI830->drmSubFD, sarea->depth_handle); sarea->depth_handle = 0; } if (sarea->tex_handle) { drmRmMap(pI830->drmSubFD, sarea->tex_handle); sarea->tex_handle = 0; }}static voidI830InitTextureHeap(ScrnInfoPtr pScrn, drmI830Sarea *sarea){ I830Ptr pI830 = I830PTR(pScrn); /* Start up the simple memory manager for agp space */ drmI830MemInitHeap drmHeap; drmHeap.region = I830_MEM_REGION_AGP; drmHeap.start = 0; drmHeap.size = sarea->tex_size; if (drmCommandWrite(pI830->drmSubFD, DRM_I830_INIT_HEAP, &drmHeap, sizeof(drmHeap))) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] Failed to initialized agp heap manager\n"); } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Initialized kernel agp heap manager, %d\n", sarea->tex_size); I830SetParam(pScrn, I830_SETPARAM_TEX_LRU_LOG_GRANULARITY, sarea->log_tex_granularity); }}BoolI830DRIDoMappings(ScreenPtr pScreen){ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); DRIInfoPtr pDRIInfo = pI830->pDRIInfo; I830DRIPtr pI830DRI = pDRIInfo->devPrivate; drmI830Sarea *sarea = (drmI830Sarea *) DRIGetSAREAPrivate(pScreen); DPRINTF(PFX, "I830DRIDoMappings\n"); pI830DRI->regsSize = I830_REG_SIZE; if (drmAddMap(pI830->drmSubFD, (drm_handle_t)pI830->MMIOAddr, pI830DRI->regsSize, DRM_REGISTERS, 0, &pI830DRI->regs) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAddMap(regs) failed\n"); DRICloseScreen(pScreen); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Registers = 0x%08lx\n", pI830DRI->regs); if (drmAddMap(pI830->drmSubFD, (drm_handle_t)pI830->LpRing->mem.Start + pI830->LinearAddr, pI830->LpRing->mem.Size, DRM_AGP, 0, &pI830->ring_map) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAddMap(ring_map) failed. Disabling DRI\n"); DRICloseScreen(pScreen); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] ring buffer = 0x%08lx\n", pI830->ring_map); if (!I830InitDma(pScrn)) { DRICloseScreen(pScreen); return FALSE; } /* init to zero to be safe */ sarea->front_handle = 0; sarea->back_handle = 0; sarea->depth_handle = 0; sarea->tex_handle = 0; /* Need to initialize pScreen now to let RandR know. */ pScrn->pScreen->width = pScrn->virtualX; pScrn->pScreen->height = pScrn->virtualY; /* this will map the screen regions */ if (!I830UpdateDRIBuffers(pScrn, sarea)) { /* screen mappings probably failed */ xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAddMap(screen mappings) failed. Disabling DRI\n"); DRICloseScreen(pScreen); return FALSE; } if (pI830->PciInfo->chipType != PCI_CHIP_845_G && pI830->PciInfo->chipType != PCI_CHIP_I830_M) { I830SetParam(pScrn, I830_SETPARAM_USE_MI_BATCHBUFFER_START, 1 ); } /* Okay now initialize the dma engine */ { pI830DRI->irq = drmGetInterruptFromBusID(pI830->drmSubFD, ((pciConfigPtr) pI830-> PciInfo->thisCard)->busnum, ((pciConfigPtr) pI830-> PciInfo->thisCard)->devnum, ((pciConfigPtr) pI830-> PciInfo->thisCard)->funcnum); if (drmCtlInstHandler(pI830->drmSubFD, pI830DRI->irq)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] failure adding irq handler\n"); pI830DRI->irq = 0; DRICloseScreen(pScreen); return FALSE; } else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] dma control initialized, using IRQ %d\n", pI830DRI->irq); } pI830DRI = (I830DRIPtr) pI830->pDRIInfo->devPrivate; pI830DRI->deviceID = pI830->PciInfo->chipType; pI830DRI->width = pScrn->virtualX; pI830DRI->height = pScrn->virtualY; pI830DRI->mem = pScrn->videoRam * 1024; pI830DRI->cpp = pI830->cpp; pI830DRI->fbOffset = pI830->FrontBuffer.Start; pI830DRI->fbStride = pI830->backPitch; pI830DRI->bitsPerPixel = pScrn->bitsPerPixel; pI830DRI->sarea_priv_offset = sizeof(XF86DRISAREARec); if (!(I830InitVisualConfigs(pScreen))) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] I830InitVisualConfigs failed. Disabling DRI\n"); DRICloseScreen(pScreen); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] visual configs initialized\n"); pI830->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; return TRUE;}BoolI830DRIResume(ScreenPtr pScreen){ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); I830DRIPtr pI830DRI = (I830DRIPtr) pI830->pDRIInfo->devPrivate; DPRINTF(PFX, "I830DRIResume\n"); I830ResumeDma(pScrn); { pI830DRI->irq = drmGetInterruptFromBusID(pI830->drmSubFD, ((pciConfigPtr) pI830-> PciInfo->thisCard)->busnum, ((pciConfigPtr) pI830-> PciInfo->thisCard)->devnum, ((pciConfigPtr) pI830-> PciInfo->thisCard)->funcnum); if (drmCtlInstHandler(pI830->drmSubFD, pI830DRI->irq)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] failure adding irq handler\n"); pI830DRI->irq = 0; return FALSE; } else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] dma control initialized, using IRQ %d\n", pI830DRI->irq); } return FALSE;}voidI830DRICloseScreen(ScreenPtr pScreen){ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); I830DRIPtr pI830DRI = (I830DRIPtr) pI830->pDRIInfo->devPrivate; DPRINTF(PFX, "I830DRICloseScreen\n"); if (pI830DRI->irq) { drmCtlUninstHandler(pI830->drmSubFD); pI830DRI->irq = 0; } I830CleanupDma(pScrn); DRICloseScreen(pScreen); if (pI830->pDRIInfo) { if (pI830->pDRIInfo->devPrivate) { xfree(pI830->pDRIInfo->devPrivate); pI830->pDRIInfo->devPrivate = 0; } DRIDestroyInfoRec(pI830->pDRIInfo); pI830->pDRIInfo = 0; } if (pI830->pVisualConfigs) xfree(pI830->pVisualConfigs); if (pI830->pVisualConfigsPriv) xfree(pI830->pVisualConfigsPriv);}static BoolI830CreateContext(ScreenPtr pScreen, VisualPtr visual, drm_context_t hwContext, void *pVisualConfigPriv, DRIContextType contextStore){ return TRUE;}static voidI830DestroyContext(ScreenPtr pScreen, drm_context_t hwContext, DRIContextType contextStore){}BoolI830DRIFinishScreenInit(ScreenPtr pScreen){ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); DPRINTF(PFX, "I830DRIFinishScreenInit\n"); /* Have shadow run only while there is 3d active. */#if 0 if (pI830->allowPageFlip && pI830->drmMinor >= 1) { I830shadowSetup(pScreen); I830shadowAdd(pScreen, 0, I830DRIShadowUpdate, 0, 0, 0); } else#endif pI830->allowPageFlip = 0; return DRIFinishScreenInit(pScreen);}voidI830DRISwapContext(ScreenPtr pScreen, DRISyncType syncType, DRIContextType oldContextType, void *oldContext, DRIContextType newContextType, void *newContext){ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); if (syncType == DRI_3D_SYNC && oldContextType == DRI_2D_CONTEXT && newContextType == DRI_2D_CONTEXT) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; if (I810_DEBUG & DEBUG_VERBOSE_DRI) ErrorF("i830DRISwapContext (in)\n"); if (!pScrn->vtSema) return; pI830->LockHeld = 1; I830RefreshRing(pScrn); } else if (syncType == DRI_2D_SYNC && oldContextType == DRI_NO_CONTEXT && newContextType == DRI_2D_CONTEXT) { pI830->LockHeld = 0; if (I810_DEBUG & DEBUG_VERBOSE_DRI) ErrorF("i830DRISwapContext (out)\n"); } else if (I810_DEBUG & DEBUG_VERBOSE_DRI) ErrorF("i830DRISwapContext (other)\n");}static voidI830DRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index){ ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); BoxPtr pbox = REGION_RECTS(prgn); int nbox = REGION_NUM_RECTS(prgn); if (I810_DEBUG & DEBUG_VERBOSE_DRI) ErrorF("I830DRIInitBuffers\n"); I830SetupForSolidFill(pScrn, 0, GXcopy, -1); while (nbox--) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?