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

📄 radeon_accel.c

📁 ati driver
💻 C
📖 第 1 页 / 共 2 页
字号:
    RADEONWaitForFifo(pScrn, 7);    OUTREG(RADEON_DST_LINE_START,    0);    OUTREG(RADEON_DST_LINE_END,      0);    OUTREG(RADEON_DP_BRUSH_FRGD_CLR, 0xffffffff);    OUTREG(RADEON_DP_BRUSH_BKGD_CLR, 0x00000000);    OUTREG(RADEON_DP_SRC_FRGD_CLR,   0xffffffff);    OUTREG(RADEON_DP_SRC_BKGD_CLR,   0x00000000);    OUTREG(RADEON_DP_WRITE_MASK,     0xffffffff);    RADEONWaitForIdleMMIO(pScrn);}/* Initialize the acceleration hardware */void RADEONEngineInit(ScrnInfoPtr pScrn){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    RADEONTRACE(("EngineInit (%d/%d)\n",		 info->CurrentLayout.pixel_code,		 info->CurrentLayout.bitsPerPixel));    OUTREG(RADEON_RB3D_CNTL, 0);#if defined(__powerpc__)#if defined(XF86_DRI)    if(!info->directRenderingEnabled)#endif    {	OUTREG(RADEON_MC_FB_LOCATION, 0xffff0000);    	OUTREG(RADEON_MC_AGP_LOCATION, 0xfffff000);    }#endif    RADEONEngineReset(pScrn);    switch (info->CurrentLayout.pixel_code) {    case 8:  info->datatype = 2; break;    case 15: info->datatype = 3; break;    case 16: info->datatype = 4; break;    case 24: info->datatype = 5; break;    case 32: info->datatype = 6; break;    default:	RADEONTRACE(("Unknown depth/bpp = %d/%d (code = %d)\n",		     info->CurrentLayout.depth,		     info->CurrentLayout.bitsPerPixel,		     info->CurrentLayout.pixel_code));    }    info->pitch = ((info->CurrentLayout.displayWidth / 8) *		   (info->CurrentLayout.pixel_bytes == 3 ? 3 : 1));    RADEONTRACE(("Pitch for acceleration = %d\n", info->pitch));    info->dp_gui_master_cntl =	((info->datatype << RADEON_GMC_DST_DATATYPE_SHIFT)	 | RADEON_GMC_CLR_CMP_CNTL_DIS);#ifdef XF86DRI    info->sc_left         = 0x00000000;    info->sc_right        = RADEON_DEFAULT_SC_RIGHT_MAX;    info->sc_top          = 0x00000000;    info->sc_bottom       = RADEON_DEFAULT_SC_BOTTOM_MAX;    info->re_top_left     = 0x00000000;    info->re_width_height = ((0x7ff << RADEON_RE_WIDTH_SHIFT) |			     (0x7ff << RADEON_RE_HEIGHT_SHIFT));    info->aux_sc_cntl     = 0x00000000;#endif    RADEONEngineRestore(pScrn);}#define ACCEL_MMIO#define ACCEL_PREAMBLE()        unsigned char *RADEONMMIO = info->MMIO#define BEGIN_ACCEL(n)          RADEONWaitForFifo(pScrn, (n))#define OUT_ACCEL_REG(reg, val) OUTREG(reg, val)#define FINISH_ACCEL()#include "radeon_accelfuncs.c"#undef ACCEL_MMIO#undef ACCEL_PREAMBLE#undef BEGIN_ACCEL#undef OUT_ACCEL_REG#undef FINISH_ACCEL#ifdef XF86DRI#define ACCEL_CP#define ACCEL_PREAMBLE()						\    RING_LOCALS;							\    RADEONCP_REFRESH(pScrn, info)#define BEGIN_ACCEL(n)          BEGIN_RING(2*(n))#define OUT_ACCEL_REG(reg, val) OUT_RING_REG(reg, val)#define FINISH_ACCEL()          ADVANCE_RING()#include "radeon_accelfuncs.c"#undef ACCEL_CP#undef ACCEL_PREAMBLE#undef BEGIN_ACCEL#undef OUT_ACCEL_REG#undef FINISH_ACCEL/* Stop the CP */int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info){    drmRadeonCPStop  stop;    int              ret, i;    stop.flush = 1;    stop.idle  = 1;    ret = drmCommandWrite(info->drmFD, DRM_RADEON_CP_STOP, &stop, 			  sizeof(drmRadeonCPStop));    if (ret == 0) {	return 0;    } else if (errno != EBUSY) {	return -errno;    }    stop.flush = 0;     i = 0;    do {	ret = drmCommandWrite(info->drmFD, DRM_RADEON_CP_STOP, &stop, 			      sizeof(drmRadeonCPStop));    } while (ret && errno == EBUSY && i++ < RADEON_IDLE_RETRY);    if (ret == 0) {	return 0;    } else if (errno != EBUSY) {	return -errno;    }    stop.idle = 0;    if (drmCommandWrite(info->drmFD, DRM_RADEON_CP_STOP,			&stop, sizeof(drmRadeonCPStop))) {	return -errno;    } else {	return 0;    }}/* Get an indirect buffer for the CP 2D acceleration commands  */drmBufPtr RADEONCPGetBuffer(ScrnInfoPtr pScrn){    RADEONInfoPtr  info = RADEONPTR(pScrn);    drmDMAReq      dma;    drmBufPtr      buf = NULL;    int            indx = 0;    int            size = 0;    int            i = 0;    int            ret;#if 0    /* FIXME: pScrn->pScreen has not been initialized when this is first     * called from RADEONSelectBuffer via RADEONDRICPInit.  We could use     * the screen index from pScrn, which is initialized, and then get     * the screen from screenInfo.screens[index], but that is a hack.     */    dma.context = DRIGetContext(pScrn->pScreen);#else    /* This is the X server's context */    dma.context = 0x00000001;#endif    dma.send_count    = 0;    dma.send_list     = NULL;    dma.send_sizes    = NULL;    dma.flags         = 0;    dma.request_count = 1;    dma.request_size  = RADEON_BUFFER_SIZE;    dma.request_list  = &indx;    dma.request_sizes = &size;    dma.granted_count = 0;    while (1) {	do {	    ret = drmDMA(info->drmFD, &dma);	    if (ret && ret != -EBUSY) {		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,			   "%s: CP GetBuffer %d\n", __FUNCTION__, ret);	    }	} while ((ret == -EBUSY) && (i++ < RADEON_TIMEOUT));	if (ret == 0) {	    buf = &info->buffers->list[indx];	    buf->used = 0;	    if (RADEON_VERBOSE) {		xf86DrvMsg(pScrn->scrnIndex, X_INFO,			   "   GetBuffer returning %d %p\n",			   buf->idx, buf->address);	    }	    return buf;	}	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,		   "GetBuffer timed out, resetting engine...\n");	RADEONEngineReset(pScrn);	RADEONEngineRestore(pScrn);	/* Always restart the engine when doing CP 2D acceleration */	RADEONCP_RESET(pScrn, info);	RADEONCP_START(pScrn, info);    }}/* Flush the indirect buffer to the kernel for submission to the card */void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard){    RADEONInfoPtr      info   = RADEONPTR(pScrn);    drmBufPtr          buffer = info->indirectBuffer;    int                start  = info->indirectStart;    drmRadeonIndirect  indirect;    if (!buffer) return;    if (start == buffer->used && !discard) return;    if (RADEON_VERBOSE) {	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Flushing buffer %d\n",		   buffer->idx);    }    indirect.idx     = buffer->idx;    indirect.start   = start;    indirect.end     = buffer->used;    indirect.discard = discard;    drmCommandWriteRead(info->drmFD, DRM_RADEON_INDIRECT,			&indirect, sizeof(drmRadeonIndirect));    if (discard) {	info->indirectBuffer = RADEONCPGetBuffer(pScrn);	info->indirectStart  = 0;    } else {	/* Start on a double word boundary */	info->indirectStart  = buffer->used = (buffer->used + 7) & ~7;	if (RADEON_VERBOSE) {	    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "   Starting at %d\n",		       info->indirectStart);	}    }}/* Flush and release the indirect buffer */void RADEONCPReleaseIndirect(ScrnInfoPtr pScrn){    RADEONInfoPtr      info   = RADEONPTR(pScrn);    drmBufPtr          buffer = info->indirectBuffer;    int                start  = info->indirectStart;    drmRadeonIndirect  indirect;    info->indirectBuffer = NULL;    info->indirectStart  = 0;    if (!buffer) return;    if (RADEON_VERBOSE) {	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Releasing buffer %d\n",		   buffer->idx);    }    indirect.idx     = buffer->idx;    indirect.start   = start;    indirect.end     = buffer->used;    indirect.discard = 1;    drmCommandWriteRead(info->drmFD, DRM_RADEON_INDIRECT,			&indirect, sizeof(drmRadeonIndirect));}#endif/* Initialize XAA for supported acceleration and also initialize the * graphics hardware for acceleration */Bool RADEONAccelInit(ScreenPtr pScreen){    ScrnInfoPtr    pScrn = xf86Screens[pScreen->myNum];    RADEONInfoPtr  info  = RADEONPTR(pScrn);    XAAInfoRecPtr  a;    if (!(a = info->accel = XAACreateInfoRec())) {	xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "XAACreateInfoRec Error\n");	return FALSE;    }#ifdef XF86DRI    if (info->directRenderingEnabled)	RADEONAccelInitCP(pScreen, a);    else#endif	RADEONAccelInitMMIO(pScreen, a);    RADEONEngineInit(pScrn);    if (!XAAInit(pScreen, a)) {	xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "XAAInit Error\n");	return FALSE;    }    return TRUE;}

⌨️ 快捷键说明

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