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

📄 radeon_dri.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
	 return 0;      }    }   if (info->ChipFamily >= CHIP_FAMILY_R300) {      fprintf(stderr, 	      "Direct rendering not yet supported on "	      "Radeon 9700 and newer cards\n");      return 0;   }      radeon_drm_page_size = getpagesize();      info->registerSize = ctx->MMIOSize;   ctx->shared.SAREASize = SAREA_MAX;   /* Note that drmOpen will try to load the kernel module, if needed. */   ctx->drmFD = drmOpen("radeon", NULL );   if (ctx->drmFD < 0) {      fprintf(stderr, "[drm] drmOpen failed\n");      return 0;   }   if ((err = drmSetBusid(ctx->drmFD, ctx->pciBusID)) < 0) {      fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n",	      ctx->drmFD, ctx->pciBusID, strerror(-err));      return 0;   }   if (drmAddMap( ctx->drmFD,		  0,		  ctx->shared.SAREASize,		  DRM_SHM,		  DRM_CONTAINS_LOCK,		  &ctx->shared.hSAREA) < 0)   {      fprintf(stderr, "[drm] drmAddMap failed\n");      return 0;   }   fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n",	   ctx->shared.SAREASize, ctx->shared.hSAREA);   if (drmMap( ctx->drmFD,	       ctx->shared.hSAREA,	       ctx->shared.SAREASize,	       (drmAddressPtr)(&ctx->pSAREA)) < 0)   {      fprintf(stderr, "[drm] drmMap failed\n");      return 0;   }   memset(ctx->pSAREA, 0, ctx->shared.SAREASize);   fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n",	   ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize);      /* Need to AddMap the framebuffer and mmio regions here:    */   if (drmAddMap( ctx->drmFD,		  (drm_handle_t)ctx->FBStart,		  ctx->FBSize,		  DRM_FRAME_BUFFER,#ifndef _EMBEDDED		  0,#else		  DRM_READ_ONLY,#endif		  &ctx->shared.hFrameBuffer) < 0)   {      fprintf(stderr, "[drm] drmAddMap framebuffer failed\n");      return 0;   }   fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n",	   ctx->shared.hFrameBuffer);   if (drmAddMap(ctx->drmFD, 		 ctx->MMIOStart,		 ctx->MMIOSize,		 DRM_REGISTERS, 		 DRM_READ_ONLY, 		 &info->registerHandle) < 0) {      fprintf(stderr, "[drm] drmAddMap mmio failed\n");	      return 0;   }   fprintf(stderr,	   "[drm] register handle = 0x%08lx\n", info->registerHandle);   /* Check the radeon DRM version */   if (!RADEONCheckDRMVersion(ctx, info)) {      return 0;   }   if (ctx->isPCI) {      /* Initialize PCI */      if (!RADEONDRIPciInit(ctx, info))         return 0;   }   else {      /* Initialize AGP */      if (!RADEONDRIAgpInit(ctx, info))         return 0;   }   /* Memory manager setup */   if (!RADEONMemoryInit(ctx, info)) {      return 0;   }   /* Create a 'server' context so we can grab the lock for    * initialization ioctls.    */   if ((err = drmCreateContext(ctx->drmFD, &ctx->serverContext)) != 0) {      fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err);      return 0;   }   DRM_LOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext, 0);    /* Initialize the kernel data structures */   if (!RADEONDRIKernelInit(ctx, info)) {      fprintf(stderr, "RADEONDRIKernelInit failed\n");      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext);      return 0;   }   /* Initialize the vertex buffers list */   if (!RADEONDRIBufInit(ctx, info)) {      fprintf(stderr, "RADEONDRIBufInit failed\n");      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext);      return 0;   }   RADEONColorTilingInit(ctx, info);   /* Initialize IRQ */   RADEONDRIIrqInit(ctx, info);   /* Initialize kernel gart memory manager */   RADEONDRIAgpHeapInit(ctx, info);   fprintf(stderr,"color tiling %sabled\n", info->colorTiling?"en":"dis");   fprintf(stderr,"page flipping %sabled\n", info->page_flip_enable?"en":"dis");   /* Initialize the SAREA private data structure */   {      drm_radeon_sarea_t *pSAREAPriv;      pSAREAPriv = (drm_radeon_sarea_t *)(((char*)ctx->pSAREA) + 					sizeof(drm_sarea_t));      memset(pSAREAPriv, 0, sizeof(*pSAREAPriv));      pSAREAPriv->pfState = info->page_flip_enable;   }   /* Quick hack to clear the front & back buffers.  Could also use    * the clear ioctl to do this, but would need to setup hw state    * first.    */   drimemsetio((char *)ctx->FBAddress + info->frontOffset,	  0,	  info->frontPitch * ctx->cpp * ctx->shared.virtualHeight );   drimemsetio((char *)ctx->FBAddress + info->backOffset,	  0,	  info->backPitch * ctx->cpp * ctx->shared.virtualHeight );   /* This is the struct passed to radeon_dri.so for its initialization */   ctx->driverClientMsg = malloc(sizeof(RADEONDRIRec));   ctx->driverClientMsgSize = sizeof(RADEONDRIRec);   pRADEONDRI                    = (RADEONDRIPtr)ctx->driverClientMsg;   pRADEONDRI->deviceID          = info->Chipset;   pRADEONDRI->width             = ctx->shared.virtualWidth;   pRADEONDRI->height            = ctx->shared.virtualHeight;   pRADEONDRI->depth             = ctx->bpp; /* XXX: depth */   pRADEONDRI->bpp               = ctx->bpp;   pRADEONDRI->IsPCI             = ctx->isPCI;   pRADEONDRI->AGPMode           = ctx->agpmode;   pRADEONDRI->frontOffset       = info->frontOffset;   pRADEONDRI->frontPitch        = info->frontPitch;   pRADEONDRI->backOffset        = info->backOffset;   pRADEONDRI->backPitch         = info->backPitch;   pRADEONDRI->depthOffset       = info->depthOffset;   pRADEONDRI->depthPitch        = info->depthPitch;   pRADEONDRI->textureOffset     = info->textureOffset;   pRADEONDRI->textureSize       = info->textureSize;   pRADEONDRI->log2TexGran       = info->log2TexGran;   pRADEONDRI->registerHandle    = info->registerHandle;   pRADEONDRI->registerSize      = info->registerSize;    pRADEONDRI->statusHandle      = info->ringReadPtrHandle;   pRADEONDRI->statusSize        = info->ringReadMapSize;   pRADEONDRI->gartTexHandle      = info->gartTexHandle;   pRADEONDRI->gartTexMapSize     = info->gartTexMapSize;   pRADEONDRI->log2GARTTexGran    = info->log2GARTTexGran;   pRADEONDRI->gartTexOffset      = info->gartTexStart;   pRADEONDRI->sarea_priv_offset = sizeof(drm_sarea_t);   /* Don't release the lock now - let the VT switch handler do it. */   return 1;}/** * \brief Get Radeon chip family from chipset number. *  * \param info driver private data. * * \return non-zero on success, or zero on failure. * * Called by radeonInitFBDev() to set RADEONInfoRec::ChipFamily * according to the value of RADEONInfoRec::Chipset.  Fails if the * chipset is unrecognized or not appropriate for this driver (i.e., not * an r100 style radeon) */static int get_chipfamily_from_chipset( RADEONInfoPtr info ){    switch (info->Chipset) {    case PCI_CHIP_RADEON_LY:    case PCI_CHIP_RADEON_LZ:	info->ChipFamily = CHIP_FAMILY_M6;	break;    case PCI_CHIP_RADEON_QY:    case PCI_CHIP_RADEON_QZ:	info->ChipFamily = CHIP_FAMILY_VE;	break;    case PCI_CHIP_R200_QL:    case PCI_CHIP_R200_QN:    case PCI_CHIP_R200_QO:    case PCI_CHIP_R200_Ql:    case PCI_CHIP_R200_BB:	info->ChipFamily = CHIP_FAMILY_R200;	break;    case PCI_CHIP_RV200_QW: /* RV200 desktop */    case PCI_CHIP_RV200_QX:	info->ChipFamily = CHIP_FAMILY_RV200;	break;    case PCI_CHIP_RADEON_LW:    case PCI_CHIP_RADEON_LX:	info->ChipFamily = CHIP_FAMILY_M7;	break;    case PCI_CHIP_RV250_Id:    case PCI_CHIP_RV250_Ie:    case PCI_CHIP_RV250_If:    case PCI_CHIP_RV250_Ig:	info->ChipFamily = CHIP_FAMILY_RV250;	break;    case PCI_CHIP_RV250_Ld:    case PCI_CHIP_RV250_Le:    case PCI_CHIP_RV250_Lf:    case PCI_CHIP_RV250_Lg:	info->ChipFamily = CHIP_FAMILY_M9;	break;    case PCI_CHIP_RV280_Y_:    case PCI_CHIP_RV280_Ya:    case PCI_CHIP_RV280_Yb:    case PCI_CHIP_RV280_Yc:	info->ChipFamily = CHIP_FAMILY_RV280;        break;    case PCI_CHIP_R300_ND:    case PCI_CHIP_R300_NE:    case PCI_CHIP_R300_NF:    case PCI_CHIP_R300_NG:	info->ChipFamily = CHIP_FAMILY_R300;        break;    default:	/* Original Radeon/7200 */	info->ChipFamily = CHIP_FAMILY_RADEON;    }    return 1;}/** * \brief Validate the fbdev mode. *  * \param ctx display handle. * * \return one on success, or zero on failure. * * Saves some registers and returns 1. * * \sa radeonValidateMode(). */static int radeonValidateMode( const DRIDriverContext *ctx ){   unsigned char *RADEONMMIO = ctx->MMIOAddress;   RADEONInfoPtr info = ctx->driverPrivate;   info->gen_int_cntl = INREG(RADEON_GEN_INT_CNTL);   info->crtc_offset_cntl = INREG(RADEON_CRTC_OFFSET_CNTL);   if (info->colorTiling)	   info->crtc_offset_cntl |= RADEON_CRTC_TILE_EN;   return 1;}/** * \brief Examine mode returned by fbdev. *  * \param ctx display handle. * * \return one on success, or zero on failure. * * Restores registers that fbdev has clobbered and returns 1. * * \sa radeonValidateMode(). */static int radeonPostValidateMode( const DRIDriverContext *ctx ){   unsigned char *RADEONMMIO = ctx->MMIOAddress;   RADEONInfoPtr info = ctx->driverPrivate;   RADEONColorTilingInit( ctx, info);   OUTREG(RADEON_GEN_INT_CNTL, info->gen_int_cntl);   if (info->colorTiling)	   info->crtc_offset_cntl |= RADEON_CRTC_TILE_EN;   OUTREG(RADEON_CRTC_OFFSET_CNTL, info->crtc_offset_cntl);      return 1;}/** * \brief Initialize the framebuffer device mode * * \param ctx display handle. * * \return one on success, or zero on failure. * * Fills in \p info with some default values and some information from \p ctx * and then calls RADEONScreenInit() for the screen initialization. *  * Before exiting clears the framebuffer memory accessing it directly. */static int radeonInitFBDev( DRIDriverContext *ctx ){   RADEONInfoPtr info = calloc(1, sizeof(*info));   {      int  dummy = ctx->shared.virtualWidth;      if (ctx->colorTiling==1)      {         switch (ctx->bpp / 8) {         case 1: dummy = (ctx->shared.virtualWidth + 255) & ~255; break;         case 2: dummy = (ctx->shared.virtualWidth + 127) & ~127; break;         case 3:         case 4: dummy = (ctx->shared.virtualWidth +  63) &  ~63; break;         }      } else {	 switch (ctx->bpp / 8) {         case 1: dummy = (ctx->shared.virtualWidth + 127) & ~127; break;         case 2: dummy = (ctx->shared.virtualWidth +  31) &  ~31; break;         case 3:         case 4: dummy = (ctx->shared.virtualWidth +  15) &  ~15; break;         }      }      ctx->shared.virtualWidth = dummy;      ctx->shared.Width = dummy;   }   fprintf(stderr,"shared virtual width is %d\n", ctx->shared.virtualWidth);   ctx->driverPrivate = (void *)info;      info->gartFastWrite  = RADEON_DEFAULT_AGP_FAST_WRITE;   info->gartSize       = RADEON_DEFAULT_AGP_SIZE;   info->gartTexSize    = RADEON_DEFAULT_AGP_TEX_SIZE;   info->bufSize       = RADEON_DEFAULT_BUFFER_SIZE;   info->ringSize      = RADEON_DEFAULT_RING_SIZE;   info->page_flip_enable = RADEON_DEFAULT_PAGE_FLIP;   info->colorTiling = ctx->colorTiling;     info->Chipset = ctx->chipset;   if (!get_chipfamily_from_chipset( info )) {      fprintf(stderr, "Unknown or non-radeon chipset -- cannot continue\n");      fprintf(stderr, "==> Verify PCI BusID is correct in miniglx.conf\n");      return 0;   }   info->frontPitch = ctx->shared.virtualWidth;   info->LinearAddr = ctx->FBStart & 0xfc000000;       if (!RADEONScreenInit( ctx, info ))      return 0;   return 1;}/** * \brief The screen is being closed, so clean up any state and free any * resources used by the DRI. * * \param ctx display handle. * * Unmaps the SAREA, closes the DRM device file descriptor and frees the driver * private data. */static void radeonHaltFBDev( DRIDriverContext *ctx ){    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize );    drmClose(ctx->drmFD);    if (ctx->driverPrivate) {       free(ctx->driverPrivate);       ctx->driverPrivate = 0;    }}extern void radeonNotifyFocus( int );/** * \brief Exported driver interface for Mini GLX. * * \sa DRIDriverRec. */const struct DRIDriverRec __driDriver = {   radeonValidateMode,   radeonPostValidateMode,   radeonInitFBDev,   radeonHaltFBDev,   RADEONEngineShutdown,   RADEONEngineRestore,  #ifndef _EMBEDDED   0,#else   radeonNotifyFocus, #endif};

⌨️ 快捷键说明

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