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 + -
显示快捷键?