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

📄 mga_dri.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
   fprintf(stderr, 	   "Will use back buffer at offset 0x%x\n",	   pMga->backOffset);   fprintf(stderr, 	   "Will use depth buffer at offset 0x%x\n",	   pMga->depthOffset);   fprintf(stderr, 	   "Will use %d kb for textures at offset 0x%x\n",	   pMga->textureSize/1024, pMga->textureOffset);   return 1;} static int MGACheckDRMVersion( struct DRIDriverContextRec *ctx, MGAPtr pMga ){  drmVersionPtr version;  /* Check the MGA DRM version */  version = drmGetVersion(ctx->drmFD);  if ( version ) {    if ( version->version_major != 3 ||         version->version_minor < 0 ) {            /* incompatible drm version */      fprintf( stderr,               "[dri] MGADRIScreenInit failed because of a version mismatch.\n"               "[dri] mga.o kernel module version is %d.%d.%d but version 3.0.x is needed.\n"               "[dri] Disabling DRI.\n",               version->version_major,               version->version_minor,               version->version_patchlevel );      drmFreeVersion( version );      return 0;    }    drmFreeVersion( version );  }  return 1;}static void print_client_msg( MGADRIPtr pMGADRI ){  fprintf( stderr, "chipset:                  %d\n", pMGADRI->chipset );  fprintf( stderr, "width:                    %d\n", pMGADRI->width );  fprintf( stderr, "height:                   %d\n", pMGADRI->height );  fprintf( stderr, "mem:                      %d\n", pMGADRI->mem );  fprintf( stderr, "cpp:                      %d\n", pMGADRI->cpp );  fprintf( stderr, "agpMode:                  %d\n", pMGADRI->agpMode );  fprintf( stderr, "frontOffset:              %d\n", pMGADRI->frontOffset );  fprintf( stderr, "frontPitch:               %d\n", pMGADRI->frontPitch );  fprintf( stderr, "backOffset:               %d\n", pMGADRI->backOffset );  fprintf( stderr, "backPitch:                %d\n", pMGADRI->backPitch );  fprintf( stderr, "depthOffset:              %d\n", pMGADRI->depthOffset );  fprintf( stderr, "depthPitch:               %d\n", pMGADRI->depthPitch );  fprintf( stderr, "textureOffset:            %d\n", pMGADRI->textureOffset );  fprintf( stderr, "textureSize:              %d\n", pMGADRI->textureSize );  fprintf( stderr, "logTextureGranularity:    %d\n", pMGADRI->logTextureGranularity );  fprintf( stderr, "logAgpTextureGranularity: %d\n", pMGADRI->logAgpTextureGranularity );  fprintf( stderr, "agpTextureHandle:         %u\n", (unsigned int)pMGADRI->agpTextureOffset );  fprintf( stderr, "agpTextureSize:           %u\n", (unsigned int)pMGADRI->agpTextureSize );#if 0   pMGADRI->registers.handle	= pMga->registers.handle;   pMGADRI->registers.size	= pMga->registers.size;   pMGADRI->status.handle	= pMga->status.handle;   pMGADRI->status.size		= pMga->status.size;   pMGADRI->primary.handle	= pMga->primary.handle;   pMGADRI->primary.size	= pMga->primary.size;   pMGADRI->buffers.handle	= pMga->buffers.handle;   pMGADRI->buffers.size	= pMga->buffers.size;   pMGADRI->sarea_priv_offset = sizeof(drm_sarea_t);#endif}static int MGAScreenInit( struct DRIDriverContextRec *ctx, MGAPtr pMga ){  int       i;  int       err;  MGADRIPtr pMGADRI;  usleep(100);  /*assert(!ctx->IsClient);*/   {      int  width_bytes = (ctx->shared.virtualWidth * ctx->cpp);      int  maxy        = ctx->shared.fbSize / width_bytes;      if (maxy <= ctx->shared.virtualHeight * 3) {	 fprintf(stderr, 		 "Static buffer allocation failed -- "		 "need at least %d kB video memory (have %d kB)\n",		 (ctx->shared.virtualWidth * ctx->shared.virtualHeight *		  ctx->cpp * 3 + 1023) / 1024,		 ctx->shared.fbSize / 1024);	 return 0;      }    }   switch(pMga->Chipset) {   case PCI_CHIP_MGAG550:   case PCI_CHIP_MGAG400:   case PCI_CHIP_MGAG200:#if 0   case PCI_CHIP_MGAG200_PCI:#endif      break;   default:      fprintf(stderr, "[drm] Direct rendering only supported with G200/G400/G550 AGP\n");      return 0;   }   fprintf( stderr,	       "[drm] bpp: %d depth: %d\n",            ctx->bpp, ctx->bpp /* FIXME: depth */ );   if ( (ctx->bpp / 8) != 2 &&	(ctx->bpp / 8) != 4 ) {      fprintf( stderr,		  "[dri] Direct rendering only supported in 16 and 32 bpp modes\n" );      return 0;   }   ctx->shared.SAREASize = SAREA_MAX;   /* Note that drmOpen will try to load the kernel module, if needed. */   ctx->drmFD = drmOpen("mga", 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,		  0,		  &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 0 /* will be done in MGADRIMapInit */   if (drmAddMap(ctx->drmFD, 		 ctx->FixedInfo.mmio_start,		 ctx->FixedInfo.mmio_len,		 DRM_REGISTERS, 		 DRM_READ_ONLY, 		 &pMga->registers.handle) < 0) {      fprintf(stderr, "[drm] drmAddMap mmio failed\n");	      return 0;   }   fprintf(stderr,	   "[drm] register handle = 0x%08lx\n", pMga->registers.handle);#endif   /* Check the mga DRM version */   if (!MGACheckDRMVersion(ctx, pMga)) {      return 0;   }   if ( !MGADRIAgpInit( ctx, pMga ) ) {      return 0;   }   if ( !MGADRIMapInit( ctx, pMga ) ) {      return 0;   }   /* Memory manager setup */   if (!MGAMemoryInit(ctx, pMga)) {      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 (!MGADRIKernelInit(ctx, pMga)) {      fprintf(stderr, "MGADRIKernelInit failed\n");      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext);      return 0;   }   /* Initialize the vertex buffers list */   if (!MGADRIBuffersInit(ctx, pMga)) {      fprintf(stderr, "MGADRIBuffersInit failed\n");      DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext);      return 0;   }   /* Initialize IRQ */   MGADRIIrqInit(ctx, pMga);   /* Initialize the SAREA private data structure */   {      drm_mga_sarea_t *pSAREAPriv;      pSAREAPriv = (drm_mga_sarea_t *)(((char*)ctx->pSAREA) + 					sizeof(drm_sarea_t));      memset(pSAREAPriv, 0, sizeof(*pSAREAPriv));   }   /* 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 + pMga->frontOffset,	  0,	  pMga->frontPitch * ctx->shared.virtualHeight );   drimemsetio((char *)ctx->FBAddress + pMga->backOffset,	  0,	  pMga->backPitch * ctx->shared.virtualHeight );   /* Can release the lock now *//*   DRM_UNLOCK(ctx->drmFD, ctx->pSAREA, ctx->serverContext);*/   /* This is the struct passed to radeon_dri.so for its initialization */   ctx->driverClientMsg = malloc(sizeof(MGADRIRec));   ctx->driverClientMsgSize = sizeof(MGADRIRec);   pMGADRI                    = (MGADRIPtr)ctx->driverClientMsg;   switch(pMga->Chipset) {   case PCI_CHIP_MGAG550:   case PCI_CHIP_MGAG400:      pMGADRI->chipset = MGA_CARD_TYPE_G400;      break;   case PCI_CHIP_MGAG200:   case PCI_CHIP_MGAG200_PCI:      pMGADRI->chipset = MGA_CARD_TYPE_G200;      break;   default:      return 0;   }   pMGADRI->width		= ctx->shared.virtualWidth;   pMGADRI->height		= ctx->shared.virtualHeight;   pMGADRI->mem			= ctx->shared.fbSize;   pMGADRI->cpp			= ctx->bpp / 8;   pMGADRI->agpMode		= pMga->agpMode;   pMGADRI->frontOffset		= pMga->frontOffset;   pMGADRI->frontPitch		= pMga->frontPitch;   pMGADRI->backOffset		= pMga->backOffset;   pMGADRI->backPitch		= pMga->backPitch;   pMGADRI->depthOffset		= pMga->depthOffset;   pMGADRI->depthPitch		= pMga->depthPitch;   pMGADRI->textureOffset	= pMga->textureOffset;   pMGADRI->textureSize		= pMga->textureSize;   pMGADRI->logTextureGranularity = pMga->logTextureGranularity;   i = mylog2( pMga->agpTextures.size / MGA_NR_TEX_REGIONS );   if ( i < MGA_LOG_MIN_TEX_REGION_SIZE )      i = MGA_LOG_MIN_TEX_REGION_SIZE;   pMGADRI->logAgpTextureGranularity = i;   pMGADRI->agpTextureOffset = (unsigned int)pMga->agpTextures.handle;   pMGADRI->agpTextureSize = (unsigned int)pMga->agpTextures.size;   pMGADRI->registers.handle	= pMga->registers.handle;   pMGADRI->registers.size	= pMga->registers.size;   pMGADRI->status.handle	= pMga->status.handle;   pMGADRI->status.size		= pMga->status.size;   pMGADRI->primary.handle	= pMga->primary.handle;   pMGADRI->primary.size	= pMga->primary.size;   pMGADRI->buffers.handle	= pMga->buffers.handle;   pMGADRI->buffers.size	= pMga->buffers.size;   pMGADRI->sarea_priv_offset = sizeof(drm_sarea_t);   print_client_msg( pMGADRI );   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 mgaValidateMode(). */static int mgaValidateMode( const DRIDriverContext *ctx ){   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 mgaValidateMode(). */static int mgaPostValidateMode( const DRIDriverContext *ctx ){   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 MGAScreenInit() for the screen initialization. *  * Before exiting clears the framebuffer memomry accessing it directly. */static int mgaInitFBDev( struct DRIDriverContextRec *ctx ){   MGAPtr pMga = calloc(1, sizeof(*pMga));   {      int  dummy = ctx->shared.virtualWidth;      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->driverPrivate = (void *)pMga;      pMga->agpMode       = MGA_DEFAULT_AGP_MODE;   pMga->agpSize       = MGA_DEFAULT_AGP_SIZE;     pMga->Chipset = ctx->chipset;   pMga->IOAddress = ctx->MMIOStart;   pMga->IOBase    = ctx->MMIOAddress;   pMga->frontPitch = ctx->shared.virtualWidth * ctx->cpp;   if (!MGAScreenInit( ctx, pMga ))      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 mgaHaltFBDev( struct DRIDriverContextRec *ctx ){    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize );    drmClose(ctx->drmFD);    if (ctx->driverPrivate) {       free(ctx->driverPrivate);       ctx->driverPrivate = NULL;    }}static int mgaEngineShutdown( const DRIDriverContext *ctx ){   fprintf(stderr, "%s() is not yet implemented!\n", __FUNCTION__);   return 1;}static int mgaEngineRestore( const DRIDriverContext *ctx ){   fprintf(stderr, "%s() is not yet implemented!\n", __FUNCTION__);   return 1;}/** * \brief Exported driver interface for Mini GLX. * * \sa DRIDriverRec. */struct DRIDriverRec __driDriver = {   mgaValidateMode,   mgaPostValidateMode,   mgaInitFBDev,   mgaHaltFBDev,   mgaEngineShutdown,   mgaEngineRestore,   0};#if 0void MGADRICloseScreen( ScreenPtr pScreen ){   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];   MGAPtr pMga = MGAPTR(pScrn);   MGADRIServerPrivatePtr pMga = pMga->DRIServerInfo;   drmMGAInit init;   if ( pMga->drmBuffers ) {      drmUnmapBufs( pMga->drmBuffers );      pMga->drmBuffers = NULL;   }   if (pMga->irq) {      drmCtlUninstHandler(ctx->drmFD);      pMga->irq = 0;   }   /* Cleanup DMA */   memset( &init, 0, sizeof(drmMGAInit) );   init.func = MGA_CLEANUP_DMA;   drmCommandWrite( ctx->drmFD, DRM_MGA_INIT, &init, sizeof(drmMGAInit) );   if ( pMga->status.map ) {      drmUnmap( pMga->status.map, pMga->status.size );      pMga->status.map = NULL;   }   if ( pMga->buffers.map ) {      drmUnmap( pMga->buffers.map, pMga->buffers.size );      pMga->buffers.map = NULL;   }   if ( pMga->primary.map ) {      drmUnmap( pMga->primary.map, pMga->primary.size );      pMga->primary.map = NULL;   }   if ( pMga->warp.map ) {      drmUnmap( pMga->warp.map, pMga->warp.size );      pMga->warp.map = NULL;   }   if ( pMga->agpTextures.map ) {      drmUnmap( pMga->agpTextures.map, pMga->agpTextures.size );      pMga->agpTextures.map = NULL;   }   if ( pMga->agp.handle ) {      drmAgpUnbind( ctx->drmFD, pMga->agp.handle );      drmAgpFree( ctx->drmFD, pMga->agp.handle );      pMga->agp.handle = 0;      drmAgpRelease( ctx->drmFD );   }   DRICloseScreen( pScreen );   if ( pMga->pDRIInfo ) {      if ( pMga->pDRIpMga->devPrivate ) {	 xfree( pMga->pDRIpMga->devPrivate );	 pMga->pDRIpMga->devPrivate = 0;      }      DRIDestroyInfoRec( pMga->pDRIInfo );      pMga->pDRIInfo = 0;   }   if ( pMga->DRIServerInfo ) {      xfree( pMga->DRIServerInfo );      pMga->DRIServerInfo = 0;   }   if ( pMga->pVisualConfigs ) {      xfree( pMga->pVisualConfigs );   }   if ( pMga->pVisualConfigsPriv ) {      xfree( pMga->pVisualConfigsPriv );   }}#endif

⌨️ 快捷键说明

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