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

📄 i810_dri.c

📁 是由intel提供的针对intel显卡915以上系列的linux驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
   pI810->cursorARGBHandle = agpHandle;   if (agpHandle != DRM_AGP_NO_HANDLE) { 	int r;      if ((r = drmAgpBind(pI810->drmSubFD, agpHandle, tom)) == 0) {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] GART: Allocated 16K for ARGB mouse cursor image\n");	 pI810->CursorARGBStart = tom;	 tom += 16384;      } else {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] GART: ARGB cursor bind failed\n");	 pI810->CursorARGBPhysical = 0;      }   } else {      xf86DrvMsg(pScrn->scrnIndex, X_INFO,		 "[agp] GART: ARGB cursor alloc failed\n");      pI810->CursorARGBPhysical = 0;   }   /* Steal some of the excess cursor space for the overlay regs.    */   pI810->OverlayPhysical = pI810->CursorPhysical + 1024;   pI810->OverlayStart = pI810->CursorStart + 1024;   I810SetTiledMemory(pScrn, 1,		      pI810->DepthBuffer.Start,		      i810_pitches[pitch_idx], 8 * 1024 * 1024);   I810SetTiledMemory(pScrn, 2,		      pI810->BackBuffer.Start,		      i810_pitches[pitch_idx], 8 * 1024 * 1024);   /* These are for HWMC surfaces */   if (pI810->numSurfaces == 6) {      I810SetTiledMemory(pScrn, 3, pI810->MC.Start, 512, 1024 * 1024);      I810SetTiledMemory(pScrn, 4,			 pI810->MC.Start + 1024 * 1024, 512, 1024 * 1024);      I810SetTiledMemory(pScrn, 5,			 pI810->MC.Start + 1024 * 1024 * 2,			 1024, 1024 * 1024);      I810SetTiledMemory(pScrn, 6,			 pI810->MC.Start + 1024 * 1024 * 3,			 1024, 4 * 1024 * 1024);   }   if (pI810->numSurfaces == 7) {      I810SetTiledMemory(pScrn, 3, pI810->MC.Start, 512, 2 * 1024 * 1024);      I810SetTiledMemory(pScrn, 4,			 pI810->MC.Start + 2 * 1024 * 1024, 512, 512 * 1024);      I810SetTiledMemory(pScrn, 5,			 pI810->MC.Start + 2 * 1024 * 1024 + 512 * 1024,			 1024, 512 * 1024);      I810SetTiledMemory(pScrn, 6,			 pI810->MC.Start + 3 * 1024 * 1024,			 1024, 1 * 1024 * 1024);      I810SetTiledMemory(pScrn, 7,			 pI810->MC.Start + 4 * 1024 * 1024,			 1024, 4 * 1024 * 1024);   }   pI810->auxPitch = i810_pitches[pitch_idx];   pI810->auxPitchBits = i810_pitch_flags[pitch_idx];   pI810->SavedDcacheMem = pI810->DcacheMem;   pI810DRI->backbufferSize = pI810->BackBuffer.Size;   if (drmAddMap(pI810->drmSubFD, (drm_handle_t) pI810->BackBuffer.Start,		 pI810->BackBuffer.Size, DRM_AGP, 0,		 &pI810DRI->backbuffer) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[drm] drmAddMap(backbuffer) failed.  Disabling DRI\n");      DRICloseScreen(pScreen);      return FALSE;   }   pI810DRI->depthbufferSize = pI810->DepthBuffer.Size;   if (drmAddMap(pI810->drmSubFD, (drm_handle_t) pI810->DepthBuffer.Start,		 pI810->DepthBuffer.Size, DRM_AGP, 0,		 &pI810DRI->depthbuffer) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[drm] drmAddMap(depthbuffer) failed.  Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }   /* Allocate FrontBuffer etc. */   if (!I810AllocateFront(pScrn)) {      DRICloseScreen(pScreen);      return FALSE;   }   /* Allocate buffer memory */   I810AllocHigh(&(pI810->BufferMem), &(pI810->SysMem),		 I810_DMA_BUF_NR * I810_DMA_BUF_SZ);   xf86DrvMsg(pScreen->myNum, X_INFO, "[dri] Buffer map : %lx\n",	      pI810->BufferMem.Start);   if (pI810->BufferMem.Start == 0 ||       pI810->BufferMem.End - pI810->BufferMem.Start >       I810_DMA_BUF_NR * I810_DMA_BUF_SZ) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[dri] Not enough memory for dma buffers.  Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }   if (drmAddMap(pI810->drmSubFD, (drm_handle_t) pI810->BufferMem.Start,		 pI810->BufferMem.Size, DRM_AGP, 0, &pI810->buffer_map) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[drm] drmAddMap(buffer_map) failed.  Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }   pI810DRI->agp_buffers = pI810->buffer_map;   pI810DRI->agp_buf_size = pI810->BufferMem.Size;   if (drmAddMap(pI810->drmSubFD, (drm_handle_t) pI810->LpRing->mem.Start,		 pI810->LpRing->mem.Size, DRM_AGP, 0, &pI810->ring_map) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[drm] drmAddMap(ring_map) failed.  Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }   /* Use the rest of memory for textures. */   pI810DRI->textureSize = pI810->SysMem.Size;   i = mylog2(pI810DRI->textureSize / I810_NR_TEX_REGIONS);   if (i < I810_LOG_MIN_TEX_REGION_SIZE)      i = I810_LOG_MIN_TEX_REGION_SIZE;   pI810DRI->logTextureGranularity = i;   pI810DRI->textureSize = (pI810DRI->textureSize >> i) << i;	/* truncate */   if (pI810DRI->textureSize < 512 * 1024) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[drm] Less then 512k memory left for textures.  Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }   I810AllocLow(&(pI810->TexMem), &(pI810->SysMem), pI810DRI->textureSize);   if (drmAddMap(pI810->drmSubFD, (drm_handle_t) pI810->TexMem.Start,		 pI810->TexMem.Size, DRM_AGP, 0, &pI810DRI->textures) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[drm] drmAddMap(textures) failed.  Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }   if ((bufs = drmAddBufs(pI810->drmSubFD,			  I810_DMA_BUF_NR,			  I810_DMA_BUF_SZ,			  DRM_AGP_BUFFER, pI810->BufferMem.Start)) <= 0) {      xf86DrvMsg(pScrn->scrnIndex, X_INFO,		 "[drm] failure adding %d %d byte DMA buffers.  Disabling DRI.\n",		 I810_DMA_BUF_NR, I810_DMA_BUF_SZ);      DRICloseScreen(pScreen);      return FALSE;   }   xf86DrvMsg(pScrn->scrnIndex, X_INFO,	      "[drm] added %d %d byte DMA buffers\n", bufs, I810_DMA_BUF_SZ);   I810InitDma(pScrn);   /* Okay now initialize the dma engine */   if (!pI810DRI->irq) {      pI810DRI->irq = drmGetInterruptFromBusID(pI810->drmSubFD,					       ((pciConfigPtr) pI810->						PciInfo->thisCard)->busnum,					       ((pciConfigPtr) pI810->						PciInfo->thisCard)->devnum,					       ((pciConfigPtr) pI810->						PciInfo->thisCard)->funcnum);      if ((drmCtlInstHandler(pI810->drmSubFD, pI810DRI->irq)) != 0) {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[drm] failure adding irq handler, there is a device "		    "already using that irq\n Consider rearranging your "		    "PCI cards.  Disabling DRI.\n");	 DRICloseScreen(pScreen);	 return FALSE;      }   }   xf86DrvMsg(pScrn->scrnIndex, X_INFO,	      "[drm] dma control initialized, using IRQ %d\n", pI810DRI->irq);   pI810DRI->deviceID = pI810->PciInfo->chipType;   pI810DRI->width = pScrn->virtualX;   pI810DRI->height = pScrn->virtualY;   pI810DRI->mem = pScrn->videoRam * 1024;   pI810DRI->cpp = pI810->cpp;   pI810DRI->fbOffset = pI810->FrontBuffer.Start;   pI810DRI->fbStride = pI810->auxPitch;   pI810DRI->bitsPerPixel = pScrn->bitsPerPixel;   pI810DRI->textureOffset = pI810->TexMem.Start;   pI810DRI->backOffset = pI810->BackBuffer.Start;   pI810DRI->depthOffset = pI810->DepthBuffer.Start;   pI810DRI->ringOffset = pI810->LpRing->mem.Start;   pI810DRI->ringSize = pI810->LpRing->mem.Size;   pI810DRI->auxPitch = pI810->auxPitch;   pI810DRI->auxPitchBits = pI810->auxPitchBits;   pI810DRI->sarea_priv_offset = sizeof(XF86DRISAREARec);   if (!(I810InitVisualConfigs(pScreen))) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[dri] I810InitVisualConfigs failed.  Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }   xf86DrvMsg(pScrn->scrnIndex, X_INFO,	      "[dri] visual configs initialized.\n");   pI810->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT;   return TRUE;}voidI810DRICloseScreen(ScreenPtr pScreen){   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];   I810Ptr pI810 = I810PTR(pScrn);   I810DRIPtr pI810DRI = (I810DRIPtr) pI810->pDRIInfo->devPrivate;   if (pI810DRI->irq) {       drmCtlUninstHandler(pI810->drmSubFD);       pI810DRI->irq = 0;   }   I810CleanupDma(pScrn);   if (pI810->dcacheHandle!=DRM_AGP_NO_HANDLE)      drmAgpFree(pI810->drmSubFD, pI810->dcacheHandle);   if (pI810->backHandle!=DRM_AGP_NO_HANDLE)      drmAgpFree(pI810->drmSubFD, pI810->backHandle);   if (pI810->zHandle!=DRM_AGP_NO_HANDLE)      drmAgpFree(pI810->drmSubFD, pI810->zHandle);   if (pI810->cursorHandle!=DRM_AGP_NO_HANDLE)      drmAgpFree(pI810->drmSubFD, pI810->cursorHandle);   if (pI810->xvmcHandle!=DRM_AGP_NO_HANDLE)      drmAgpFree(pI810->drmSubFD, pI810->xvmcHandle);   if (pI810->sysmemHandle!=DRM_AGP_NO_HANDLE)      drmAgpFree(pI810->drmSubFD, pI810->sysmemHandle);   if (pI810->agpAcquired == TRUE)      drmAgpRelease(pI810->drmSubFD);   pI810->backHandle = DRM_AGP_NO_HANDLE;   pI810->zHandle = DRM_AGP_NO_HANDLE;   pI810->cursorHandle = DRM_AGP_NO_HANDLE;   pI810->xvmcHandle = DRM_AGP_NO_HANDLE;   pI810->sysmemHandle = DRM_AGP_NO_HANDLE;   pI810->agpAcquired = FALSE;   pI810->dcacheHandle = DRM_AGP_NO_HANDLE;   DRICloseScreen(pScreen);   if (pI810->pDRIInfo) {      if (pI810->pDRIInfo->devPrivate) {	 xfree(pI810->pDRIInfo->devPrivate);	 pI810->pDRIInfo->devPrivate = 0;      }      DRIDestroyInfoRec(pI810->pDRIInfo);      pI810->pDRIInfo = 0;   }   if (pI810->pVisualConfigs)      xfree(pI810->pVisualConfigs);   if (pI810->pVisualConfigsPriv)      xfree(pI810->pVisualConfigsPriv);}static BoolI810CreateContext(ScreenPtr pScreen, VisualPtr visual,		  drm_context_t hwContext, void *pVisualConfigPriv,		  DRIContextType contextStore){   return TRUE;}static voidI810DestroyContext(ScreenPtr pScreen, drm_context_t hwContext,		   DRIContextType contextStore){}BoolI810DRIFinishScreenInit(ScreenPtr pScreen){   I810SAREARec *sPriv = (I810SAREARec *) DRIGetSAREAPrivate(pScreen);   ScrnInfoPtr        pScrn = xf86Screens[pScreen->myNum];   I810Ptr info  = I810PTR(pScrn);   memset(sPriv, 0, sizeof(sPriv));   /* Have shadow run only while there is 3d active.    */   if (info->allowPageFlip && info->drmMinor >= 3) {     ShadowFBInit( pScreen, I810DRIRefreshArea );   }    else     info->allowPageFlip = 0;   return DRIFinishScreenInit(pScreen);}voidI810DRISwapContext(ScreenPtr pScreen, DRISyncType syncType,		   DRIContextType oldContextType, void *oldContext,		   DRIContextType newContextType, void *newContext){   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];   I810Ptr pI810 = I810PTR(pScrn);   if (syncType == DRI_3D_SYNC &&       oldContextType == DRI_2D_CONTEXT && newContextType == DRI_2D_CONTEXT) {      if (I810_DEBUG & DEBUG_VERBOSE_DRI)	 ErrorF("I810DRISwapContext (in)\n");      if (!pScrn->vtSema)	  return;      pI810->LockHeld = 1;      I810RefreshRing(pScrn);   } else if (syncType == DRI_2D_SYNC &&	      oldContextType == DRI_NO_CONTEXT &&	      newContextType == DRI_2D_CONTEXT) {      pI810->LockHeld = 0;      if (I810_DEBUG & DEBUG_VERBOSE_DRI)	 ErrorF("I810DRISwapContext (out)\n");   } else if (I810_DEBUG & DEBUG_VERBOSE_DRI)      ErrorF("I810DRISwapContext (other)\n");}static voidI810DRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index){   ScreenPtr pScreen = pWin->drawable.pScreen;   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];   I810Ptr pI810 = I810PTR(pScrn);   BoxPtr pbox = REGION_RECTS(prgn);   int nbox = REGION_NUM_RECTS(prgn);   if (I810_DEBUG & DEBUG_VERBOSE_DRI)      ErrorF("I810DRIInitBuffers\n");   I810SetupForSolidFill(pScrn, 0, GXcopy, -1);   while (nbox--) {      I810SelectBuffer(pScrn, I810_SELECT_BACK);      I810SubsequentSolidFillRect(pScrn, pbox->x1, pbox->y1,				  pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);      pbox++;   }   /* Clear the depth buffer - uses 0xffff rather than 0.    */   pbox = REGION_RECTS(prgn);   nbox = REGION_NUM_RECTS(prgn);   I810SelectBuffer(pScrn, I810_SELECT_DEPTH);   I810SetupForSolidFill(pScrn, 0xffff, GXcopy, -1);   while (nbox--) {      I810SubsequentSolidFillRect(pScrn, pbox->x1, pbox->y1,				  pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);      pbox++;   }   I810SelectBuffer(pScrn, I810_SELECT_FRONT);   pI810->AccelInfoRec->NeedToSync = TRUE;}/* This routine is a modified form of XAADoBitBlt with the calls to * ScreenToScreenBitBlt built in. My routine has the prgnSrc as source

⌨️ 快捷键说明

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