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

📄 i810_dri.c

📁 是由intel提供的针对intel显卡915以上系列的linux驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
   pDRIInfo->CreateContext = I810CreateContext;   pDRIInfo->DestroyContext = I810DestroyContext;   pDRIInfo->SwapContext = I810DRISwapContext;   pDRIInfo->InitBuffers = I810DRIInitBuffers;   pDRIInfo->MoveBuffers = I810DRIMoveBuffers;   pDRIInfo->bufferRequests = DRI_ALL_WINDOWS;   pDRIInfo->OpenFullScreen = I810DRIOpenFullScreen;   pDRIInfo->CloseFullScreen = I810DRICloseFullScreen;   pDRIInfo->TransitionTo2d = I810DRITransitionTo2d;   pDRIInfo->TransitionTo3d = I810DRITransitionTo3d;   pDRIInfo->TransitionSingleToMulti3D = I810DRITransitionSingleToMulti3d;   pDRIInfo->TransitionMultiToSingle3D = I810DRITransitionMultiToSingle3d;   pDRIInfo->createDummyCtx = TRUE;   pDRIInfo->createDummyCtxPriv = FALSE;   /* This adds the framebuffer as a drm map *before* we have asked agp    * to allocate it.  Scary stuff, hold on...    */   if (!DRIScreenInit(pScreen, pDRIInfo, &pI810->drmSubFD)) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[dri] DRIScreenInit failed.  Disabling DRI.\n");      xfree(pDRIInfo->devPrivate);      pDRIInfo->devPrivate = 0;      DRIDestroyInfoRec(pI810->pDRIInfo);      pI810->pDRIInfo = 0;      return FALSE;   }   /* Check the i810 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(pI810->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(pI810->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] I810DRIScreenInit 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);	    I810DRICloseScreen(pScreen);	    return FALSE;	 }	 drmFreeVersion(version);      }      /* Check the i810 DRM version */      version = drmGetVersion(pI810->drmSubFD);      if (version) {	i810_drm_version = (version->version_major<<16) |	                    version->version_minor;	 if (version->version_major != 1 || version->version_minor < 2) {	    /* incompatible drm version */	    xf86DrvMsg(pScreen->myNum, X_ERROR,		       "[dri] I810DRIScreenInit failed because of a version mismatch.\n"		       "[dri] i810.o kernel module version is %d.%d.%d but version 1.2.0 or greater is needed.\n"		       "[dri] Disabling DRI.\n",		       version->version_major,		       version->version_minor, version->version_patchlevel);	    I810DRICloseScreen(pScreen);	    drmFreeVersion(version);	    return FALSE;	 }         pI810->drmMinor = version->version_minor;	 drmFreeVersion(version);      }   }   pI810DRI->regsSize = I810_REG_SIZE;   if (drmAddMap(pI810->drmSubFD, (drm_handle_t) pI810->MMIOAddr,		 pI810DRI->regsSize, DRM_REGISTERS, 0, &pI810DRI->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",	      pI810DRI->regs);   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;   /* Agp Support - Need this just to get the framebuffer.    */   if (drmAgpAcquire(pI810->drmSubFD) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] drmAgpAquire failed\n");      DRICloseScreen(pScreen);      return FALSE;   }   pI810->agpAcquired = TRUE;   if (drmAgpEnable(pI810->drmSubFD, 0) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] drmAgpEnable failed\n");      DRICloseScreen(pScreen);      return FALSE;   }   memset(&pI810->DcacheMem, 0, sizeof(I810MemRange));   memset(&pI810->BackBuffer, 0, sizeof(I810MemRange));   memset(&pI810->DepthBuffer, 0, sizeof(I810MemRange));   pI810->CursorPhysical = 0;   pI810->CursorARGBPhysical = 0;   /* Dcache - half the speed of normal ram, but has use as a Z buffer    * under the DRI.    */   drmAgpAlloc(pI810->drmSubFD, 4096 * 1024, 1, NULL, &dcacheHandle);   pI810->dcacheHandle = dcacheHandle;   xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] dcacheHandle : 0x%lx\n",	      dcacheHandle);#define Elements(x) sizeof(x)/sizeof(*x)   for (pitch_idx = 0; pitch_idx < Elements(i810_pitches); pitch_idx++)      if (width <= i810_pitches[pitch_idx])	 break;   if (pitch_idx == Elements(i810_pitches)) {      xf86DrvMsg(pScrn->scrnIndex, X_INFO,		 "[dri] Couldn't find depth/back buffer pitch");      DRICloseScreen(pScreen);      return FALSE;   } else {      /* for tiled memory to work, the buffer needs to have the       * number of lines as a multiple of 16 (the tile size),       *  - airlied */      int lines = (pScrn->virtualY + 15) / 16 * 16;      back_size = i810_pitches[pitch_idx] * lines;      back_size = ((back_size + 4096 - 1) / 4096) * 4096;   }   sysmem_size = pScrn->videoRam * 1024;   if (dcacheHandle != DRM_AGP_NO_HANDLE) {      if (back_size > 4 * 1024 * 1024) {	 xf86DrvMsg(pScreen->myNum, X_INFO,		    "[dri] Backsize is larger then 4 meg\n");	 sysmem_size = sysmem_size - 2 * back_size;	 drmAgpFree(pI810->drmSubFD, dcacheHandle);	 pI810->dcacheHandle = dcacheHandle = DRM_AGP_NO_HANDLE;      } else {	 sysmem_size = sysmem_size - back_size;      }   } else {      sysmem_size = sysmem_size - 2 * back_size;   }   /* Max size is 48 without XvMC, 41 with 6 surfaces, 40 with 7 surfaces */   if (pI810->numSurfaces && (pI810->numSurfaces == 6)) {      if (sysmem_size > (pI810->FbMapSize - 7 * 1024 * 1024)) {	 sysmem_size = (pI810->FbMapSize - 7 * 1024 * 1024);	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "User requested more memory then fits in the agp aperture\n"		    "Truncating to %d bytes of memory\n", sysmem_size);      }   }   if (pI810->numSurfaces && (pI810->numSurfaces == 7)) {      if (sysmem_size > (pI810->FbMapSize - 8 * 1024 * 1024)) {	 sysmem_size = (pI810->FbMapSize - 8 * 1024 * 1024);	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "User requested more memory then fits in the agp aperture\n"		    "Truncating to %d bytes of memory\n", sysmem_size);      }   }   if (sysmem_size > pI810->FbMapSize) {      sysmem_size = pI810->FbMapSize;      xf86DrvMsg(pScrn->scrnIndex, X_INFO,		 "[dri] User requested more memory then fits in the agp"		 " aperture\n\tTruncating to %d bytes of memory\n",		 sysmem_size);   }   sysmem_size -= 4096;			/* remove 4k for the hw cursor */   sysmem_size -= 16384;		/* remove 16k for the ARGB hw cursor */   pI810->SysMem.Start = 0;   pI810->SysMem.Size = sysmem_size;   pI810->SysMem.End = sysmem_size;   tom = sysmem_size;   pI810->SavedSysMem = pI810->SysMem;   if (dcacheHandle != DRM_AGP_NO_HANDLE) {      if (drmAgpBind(pI810->drmSubFD, dcacheHandle, pI810->DepthOffset) == 0) {	 memset(&pI810->DcacheMem, 0, sizeof(I810MemRange));	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] GART: Found 4096K Z buffer memory\n");	 pI810->DcacheMem.Start = pI810->DepthOffset;	 pI810->DcacheMem.Size = 1024 * 4096;	 pI810->DcacheMem.End =	       pI810->DcacheMem.Start + pI810->DcacheMem.Size;	 if (!I810AllocLow	     (&(pI810->DepthBuffer), &(pI810->DcacheMem), back_size)) {	    xf86DrvMsg(pScrn->scrnIndex, X_INFO,		       "[agp] Depth buffer allocation failed\n");	    DRICloseScreen(pScreen);	    return FALSE;	 }      } else {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] GART: dcache bind failed\n");	 drmAgpFree(pI810->drmSubFD, dcacheHandle);	 pI810->dcacheHandle = dcacheHandle = DRM_AGP_NO_HANDLE;      }   } else {      xf86DrvMsg(pScrn->scrnIndex, X_INFO,		 "[agp] GART: no dcache memory found\n");   }   drmAgpAlloc(pI810->drmSubFD, back_size, 0, NULL, &agpHandle);   pI810->backHandle = agpHandle;   if (agpHandle != DRM_AGP_NO_HANDLE) {      if (drmAgpBind(pI810->drmSubFD, agpHandle, pI810->BackOffset) == 0) {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] Bound backbuffer memory\n");	 pI810->BackBuffer.Start = pI810->BackOffset;	 pI810->BackBuffer.Size = back_size;	 pI810->BackBuffer.End = (pI810->BackBuffer.Start +				  pI810->BackBuffer.Size);      } else {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] Unable to bind backbuffer.  Disabling DRI.\n");	 DRICloseScreen(pScreen);	 return FALSE;      }   } else {      xf86DrvMsg(pScrn->scrnIndex, X_INFO,		 "[dri] Unable to allocate backbuffer memory.  Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }   if (dcacheHandle == DRM_AGP_NO_HANDLE) {     drmAgpAlloc(pI810->drmSubFD, back_size, 0, NULL, &agpHandle);      pI810->zHandle = agpHandle;      if (agpHandle != DRM_AGP_NO_HANDLE) {	 if (drmAgpBind(pI810->drmSubFD, agpHandle, pI810->DepthOffset) == 0) {	    xf86DrvMsg(pScrn->scrnIndex, X_INFO,		       "[agp] Bound depthbuffer memory\n");	    pI810->DepthBuffer.Start = pI810->DepthOffset;	    pI810->DepthBuffer.Size = back_size;	    pI810->DepthBuffer.End = (pI810->DepthBuffer.Start +				      pI810->DepthBuffer.Size);	 } else {	    xf86DrvMsg(pScrn->scrnIndex, X_INFO,		       "[agp] Unable to bind depthbuffer.  Disabling DRI.\n");	    DRICloseScreen(pScreen);	    return FALSE;	 }      } else {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] Unable to allocate depthbuffer memory.  Disabling DRI.\n");	 DRICloseScreen(pScreen);	 return FALSE;      }   }   /* Now allocate and bind the agp space.  This memory will include the    * regular framebuffer as well as texture memory.    */   drmAgpAlloc(pI810->drmSubFD, sysmem_size, 0, NULL, &agpHandle);   pI810->sysmemHandle = agpHandle;      if (agpHandle != DRM_AGP_NO_HANDLE) {      if (drmAgpBind(pI810->drmSubFD, agpHandle, 0) == 0) {	xf86DrvMsg(pScrn->scrnIndex, X_INFO,		   "[agp] Bound System Texture Memory\n");      } else {          xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Unable to bind system texture memory. Disabling DRI.\n");	  DRICloseScreen(pScreen);	  return FALSE;      }   } else {      xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Unable to allocate system texture memory. Disabling DRI.\n");      DRICloseScreen(pScreen);      return FALSE;   }/* Allocate 7 or 8MB for XvMC this is setup as follows to best use tiled   regions and required surface pitches. (Numbers are adjusted if the   AGP region is only 32MB   For numSurfaces == 6   44 - 48MB = 4MB Fence, 8 Tiles wide   43 - 44MB = 1MB Fence, 8 Tiles wide   42 - 43MB = 1MB Fence, 4 Tiles wide   41 - 42MB = 1MB Fence, 4 Tiles wide   For numSurfaces == 7   44 - 48MB   = 4MB Fence, 8 Tiles wide   43 - 44MB   = 1MB Fence, 8 Tiles wide   42.5 - 43MB = 0.5MB Fence, 8 Tiles wide   42 - 42.5MB = 0.5MB Fence, 4 Tiles wide   40 - 42MB   = 2MB Fence, 4 Tiles wide */   if (pI810->numSurfaces) {      if (pI810->numSurfaces == 6) {	 pI810->MC.Size = 7 * 1024 * 1024;	 pI810->MC.Start = pI810->FbMapSize - 7 * 1024 * 1024;      }      if (pI810->numSurfaces == 7) {	 pI810->MC.Size = 8 * 1024 * 1024;	 pI810->MC.Start = pI810->FbMapSize - 8 * 1024 * 1024;      }      drmAgpAlloc(pI810->drmSubFD, pI810->MC.Size, 0, NULL, &agpHandle);            pI810->xvmcHandle = agpHandle;      if (agpHandle != DRM_AGP_NO_HANDLE) {	 if (drmAgpBind(pI810->drmSubFD, agpHandle, pI810->MC.Start) == 0) {	    xf86DrvMsg(pScrn->scrnIndex, X_INFO,		       "GART: Allocated 7MB for HWMC\n");	    pI810->MC.End = pI810->MC.Start + pI810->MC.Size;	 } else {	    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "GART: HWMC bind failed\n");	    pI810->MC.Start = 0;	    pI810->MC.Size = 0;	    pI810->MC.End = 0;	 }      } else {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "GART: HWMC alloc failed\n");	 pI810->MC.Start = 0;	 pI810->MC.Size = 0;	 pI810->MC.End = 0;      }      pI810->xvmcContext = 0;   }   drmAgpAlloc(pI810->drmSubFD, 4096, 2,	       (unsigned long *)&pI810->CursorPhysical, &agpHandle);   pI810->cursorHandle = agpHandle;   if (agpHandle != DRM_AGP_NO_HANDLE) {      tom = sysmem_size;      if (drmAgpBind(pI810->drmSubFD, agpHandle, tom) == 0) {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] GART: Allocated 4K for mouse cursor image\n");	 pI810->CursorStart = tom;	 tom += 4096;      } else {	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,		    "[agp] GART: cursor bind failed\n");	 pI810->CursorPhysical = 0;      }   } else {      xf86DrvMsg(pScrn->scrnIndex, X_INFO,		 "[agp] GART: cursor alloc failed\n");      pI810->CursorPhysical = 0;   }   drmAgpAlloc(pI810->drmSubFD, 16384, 2,	       (unsigned long *)&pI810->CursorARGBPhysical, &agpHandle);

⌨️ 快捷键说明

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