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

📄 r128_dri.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   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 (!R128MemoryInit(ctx))	return GL_FALSE;   				/* Initialize AGP */    if (!info->IsPCI && !R128DRIAgpInit(ctx)) {	info->IsPCI = GL_TRUE;	fprintf(stderr,		   "[agp] AGP failed to initialize -- falling back to PCI mode.\n");	fprintf(stderr,		   "[agp] Make sure you have the agpgart kernel module loaded.\n");    }				/* Initialize PCIGART */    if (info->IsPCI && !R128DRIPciInit(ctx)) {	return GL_FALSE;    }				/* DRIScreenInit doesn't add all the				   common mappings.  Add additional				   mappings here. */    if (!R128DRIMapInit(ctx)) {	return GL_FALSE;    }   /* 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 (!R128DRIKernelInit(ctx)) {	return GL_FALSE;    }    /* Initialize the vertex buffers list */    if (!R128DRIBufInit(ctx)) {	return GL_FALSE;    }    /* Initialize IRQ */    R128DRIIrqInit(ctx);    /* Initialize and start the CCE if required */    R128DRICCEInit(ctx);   /* 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 );        pSAREAPriv = (drm_r128_sarea_t *)(((char*)ctx->pSAREA) + 					sizeof(drm_sarea_t));    memset(pSAREAPriv, 0, sizeof(*pSAREAPriv));   /* This is the struct passed to radeon_dri.so for its initialization */   ctx->driverClientMsg = malloc(sizeof(R128DRIRec));   ctx->driverClientMsgSize = sizeof(R128DRIRec);       pR128DRI                    = (R128DRIPtr)ctx->driverClientMsg;    pR128DRI->deviceID          = info->Chipset;    pR128DRI->width             = ctx->shared.virtualWidth;    pR128DRI->height            = ctx->shared.virtualHeight;    pR128DRI->depth             = ctx->bpp;    pR128DRI->bpp               = ctx->bpp;    pR128DRI->IsPCI             = info->IsPCI;    pR128DRI->AGPMode           = info->agpMode;    pR128DRI->frontOffset       = info->frontOffset;    pR128DRI->frontPitch        = info->frontPitch;    pR128DRI->backOffset        = info->backOffset;    pR128DRI->backPitch         = info->backPitch;    pR128DRI->depthOffset       = info->depthOffset;    pR128DRI->depthPitch        = info->depthPitch;    pR128DRI->spanOffset        = info->spanOffset;    pR128DRI->textureOffset     = info->textureOffset;    pR128DRI->textureSize       = info->textureSize;    pR128DRI->log2TexGran       = info->log2TexGran;    pR128DRI->registerHandle    = info->registerHandle;    pR128DRI->registerSize      = info->registerSize;    pR128DRI->agpTexHandle      = info->agpTexHandle;    pR128DRI->agpTexMapSize     = info->agpTexMapSize;    pR128DRI->log2AGPTexGran    = info->log2AGPTexGran;    pR128DRI->agpTexOffset      = info->agpTexStart;    pR128DRI->sarea_priv_offset = sizeof(drm_sarea_t);    return GL_TRUE;}/* The screen is being closed, so clean up any state and free any   resources used by the DRI. */void R128DRICloseScreen(const DRIDriverContext *ctx){    R128InfoPtr info = ctx->driverPrivate;    drm_r128_init_t drmInfo;    /* Stop the CCE if it is still in use */    R128CCE_STOP(ctx, info);    if (info->irq) {	drmCtlUninstHandler(ctx->drmFD);	info->irq = 0;    }    /* De-allocate vertex buffers */    if (info->buffers) {	drmUnmapBufs(info->buffers);	info->buffers = NULL;    }    /* De-allocate all kernel resources */    memset(&drmInfo, 0, sizeof(drmInfo));    drmInfo.func = R128_CLEANUP_CCE;    drmCommandWrite(ctx->drmFD, DRM_R128_INIT,                    &drmInfo, sizeof(drmInfo));    /* De-allocate all AGP resources */    if (info->agpTex) {	drmUnmap(info->agpTex, info->agpTexMapSize);	info->agpTex = NULL;    }    if (info->buf) {	drmUnmap(info->buf, info->bufMapSize);	info->buf = NULL;    }    if (info->ringReadPtr) {	drmUnmap(info->ringReadPtr, info->ringReadMapSize);	info->ringReadPtr = NULL;    }    if (info->ring) {	drmUnmap(info->ring, info->ringMapSize);	info->ring = NULL;    }    if (info->agpMemHandle != DRM_AGP_NO_HANDLE) {	drmAgpUnbind(ctx->drmFD, info->agpMemHandle);	drmAgpFree(ctx->drmFD, info->agpMemHandle);	info->agpMemHandle = 0;	drmAgpRelease(ctx->drmFD);    }    if (info->pciMemHandle) {	drmScatterGatherFree(ctx->drmFD, info->pciMemHandle);	info->pciMemHandle = 0;    }}static GLboolean R128PreInitDRI(const DRIDriverContext *ctx){    R128InfoPtr info = ctx->driverPrivate;    /*info->CCEMode = R128_DEFAULT_CCE_PIO_MODE;*/    info->CCEMode = R128_DEFAULT_CCE_BM_MODE;    info->CCESecure = GL_TRUE;    info->agpMode        = R128_DEFAULT_AGP_MODE;    info->agpSize        = R128_DEFAULT_AGP_SIZE;    info->ringSize       = R128_DEFAULT_RING_SIZE;    info->bufSize        = R128_DEFAULT_BUFFER_SIZE;    info->agpTexSize     = R128_DEFAULT_AGP_TEX_SIZE;    info->CCEusecTimeout = R128_DEFAULT_CCE_TIMEOUT;    return GL_TRUE;}/** * \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 R128ScreenInit() for the screen initialization. *  * Before exiting clears the framebuffer memory accessing it directly. */static int R128InitFBDev( DRIDriverContext *ctx ){   R128InfoPtr info = calloc(1, sizeof(*info));   {      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 *)info;      info->Chipset = ctx->chipset;   switch (info->Chipset) {   case PCI_DEVICE_ID_ATI_RAGE128_LE:   case PCI_DEVICE_ID_ATI_RAGE128_RE:   case PCI_DEVICE_ID_ATI_RAGE128_RK:   case PCI_DEVICE_ID_ATI_RAGE128_PD:   case PCI_DEVICE_ID_ATI_RAGE128_PP:   case PCI_DEVICE_ID_ATI_RAGE128_PR:       /* This is a PCI card */       info->IsPCI = GL_TRUE;       break;   default:       /* This is an AGP card */       info->IsPCI = GL_FALSE;       break;   }   info->frontPitch = ctx->shared.virtualWidth;   info->LinearAddr = ctx->FBStart & 0xfc000000;      if (!R128PreInitDRI(ctx))       return 0;   if (!R128DRIScreenInit(ctx))      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 R128HaltFBDev( DRIDriverContext *ctx ){    drmUnmap( ctx->pSAREA, ctx->shared.SAREASize );    drmClose(ctx->drmFD);    if (ctx->driverPrivate) {       free(ctx->driverPrivate);       ctx->driverPrivate = 0;    }}/** * \brief Validate the fbdev mode. *  * \param ctx display handle. * * \return one on success, or zero on failure. * * Saves some registers and returns 1. * * \sa R128PostValidateMode(). */static int R128ValidateMode( 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 R128ValidateMode(). */static int R128PostValidateMode( const DRIDriverContext *ctx ){   return 1;}/** * \brief Shutdown the drawing engine. * * \param ctx display handle * * Turns off the command processor engine & restores the graphics card * to a state that fbdev understands. */static int R128EngineShutdown( const DRIDriverContext *ctx ){    return 1;}/** * \brief Restore the drawing engine. * * \param ctx display handle * * Resets the graphics card and sets initial values for several registers of * the card's drawing engine. * * Turns on the R128 command processor engine (i.e., the ringbuffer). */static int R128EngineRestore( const DRIDriverContext *ctx ){   return 1;}/** * \brief Exported driver interface for Mini GLX. * * \sa DRIDriverRec. */const struct DRIDriverRec __driDriver = {   R128ValidateMode,   R128PostValidateMode,   R128InitFBDev,   R128HaltFBDev,   R128EngineShutdown,   R128EngineRestore,     0,};

⌨️ 快捷键说明

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