📄 radeon_dri.c
字号:
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 + -