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

📄 radeon_accelfuncs.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
				     | RADEON_GMC_SRC_DATATYPE_COLOR				     | RADEON_ROP[rop].rop				     | RADEON_DP_SRC_SOURCE_MEMORY				     | RADEON_GMC_SRC_PITCH_OFFSET_CNTL);    BEGIN_ACCEL(3);    OUT_ACCEL_REG(RADEON_DP_GUI_MASTER_CNTL, info->dp_gui_master_cntl_clip);    OUT_ACCEL_REG(RADEON_DP_WRITE_MASK,      planemask);    OUT_ACCEL_REG(RADEON_DP_CNTL,		  ((xdir >= 0 ? RADEON_DST_X_LEFT_TO_RIGHT : 0) |		   (ydir >= 0 ? RADEON_DST_Y_TOP_TO_BOTTOM : 0)));    FINISH_ACCEL();    info->trans_color = trans_color;    FUNC_NAME(RADEONSetTransparency)(pScrn, trans_color);}/* Subsequent XAA screen-to-screen copy */static voidFUNC_NAME(RADEONSubsequentScreenToScreenCopy)(ScrnInfoPtr pScrn,					      int xa, int ya,					      int xb, int yb,					      int w, int h){    RADEONInfoPtr  info = RADEONPTR(pScrn);    ACCEL_PREAMBLE();    if (info->xdir < 0) xa += w - 1, xb += w - 1;    if (info->ydir < 0) ya += h - 1, yb += h - 1;    BEGIN_ACCEL(5);    OUT_ACCEL_REG(RADEON_SRC_PITCH_OFFSET, info->dst_pitch_offset |    	((info->tilingEnabled && (ya <= pScrn->virtualY)) ? RADEON_DST_TILE_MACRO : 0));    OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, info->dst_pitch_offset |    	((info->tilingEnabled && (yb <= pScrn->virtualY)) ? RADEON_DST_TILE_MACRO : 0));    OUT_ACCEL_REG(RADEON_SRC_Y_X,          (ya << 16) | xa);    OUT_ACCEL_REG(RADEON_DST_Y_X,          (yb << 16) | xb);    OUT_ACCEL_REG(RADEON_DST_HEIGHT_WIDTH, (h  << 16) | w);    FINISH_ACCEL();}/* Setup for XAA mono 8x8 pattern color expansion.  Patterns with * transparency use `bg == -1'.  This routine is only used if the XAA * pixmap cache is turned on. * * Tests: xtest XFree86/fllrctngl (no other test will test this routine with *                                 both transparency and non-transparency) */static voidFUNC_NAME(RADEONSetupForMono8x8PatternFill)(ScrnInfoPtr pScrn,					    int patternx,					    int patterny,					    int fg,					    int bg,					    int rop,					    unsigned int planemask){    RADEONInfoPtr  info = RADEONPTR(pScrn);#if X_BYTE_ORDER == X_BIG_ENDIAN    unsigned char  pattern[8];#endif    ACCEL_PREAMBLE();#if X_BYTE_ORDER == X_BIG_ENDIAN    /* Take care of endianness */    pattern[0] = (patternx & 0x000000ff);    pattern[1] = (patternx & 0x0000ff00) >> 8;    pattern[2] = (patternx & 0x00ff0000) >> 16;    pattern[3] = (patternx & 0xff000000) >> 24;    pattern[4] = (patterny & 0x000000ff);    pattern[5] = (patterny & 0x0000ff00) >> 8;    pattern[6] = (patterny & 0x00ff0000) >> 16;    pattern[7] = (patterny & 0xff000000) >> 24;#endif    /* Save for later clipping */    info->dp_gui_master_cntl_clip = (info->dp_gui_master_cntl				     | (bg == -1					? RADEON_GMC_BRUSH_8X8_MONO_FG_LA					: RADEON_GMC_BRUSH_8X8_MONO_FG_BG)				     | RADEON_ROP[rop].pattern#if X_BYTE_ORDER == X_LITTLE_ENDIAN				     | RADEON_GMC_BYTE_MSB_TO_LSB#endif				    );    BEGIN_ACCEL((bg == -1) ? 5 : 6);    OUT_ACCEL_REG(RADEON_DP_GUI_MASTER_CNTL, info->dp_gui_master_cntl_clip);    OUT_ACCEL_REG(RADEON_DP_WRITE_MASK,      planemask);    OUT_ACCEL_REG(RADEON_DP_BRUSH_FRGD_CLR,  fg);    if (bg != -1)	OUT_ACCEL_REG(RADEON_DP_BRUSH_BKGD_CLR, bg);#if X_BYTE_ORDER == X_LITTLE_ENDIAN    OUT_ACCEL_REG(RADEON_BRUSH_DATA0,        patternx);    OUT_ACCEL_REG(RADEON_BRUSH_DATA1,        patterny);#else    OUT_ACCEL_REG(RADEON_BRUSH_DATA0,        *(CARD32 *)(pointer)&pattern[0]);    OUT_ACCEL_REG(RADEON_BRUSH_DATA1,        *(CARD32 *)(pointer)&pattern[4]);#endif    FINISH_ACCEL();}/* Subsequent XAA 8x8 pattern color expansion.  Because they are used in * the setup function, `patternx' and `patterny' are not used here. */static voidFUNC_NAME(RADEONSubsequentMono8x8PatternFillRect)(ScrnInfoPtr pScrn,						  int patternx,						  int patterny,						  int x, int y,						  int w, int h){    RADEONInfoPtr  info = RADEONPTR(pScrn);    ACCEL_PREAMBLE();    BEGIN_ACCEL(4);    OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, info->dst_pitch_offset |    	((info->tilingEnabled && (y <= pScrn->virtualY)) ? RADEON_DST_TILE_MACRO : 0));    OUT_ACCEL_REG(RADEON_BRUSH_Y_X,        (patterny << 8) | patternx);    OUT_ACCEL_REG(RADEON_DST_Y_X,          (y << 16) | x);    OUT_ACCEL_REG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w);    FINISH_ACCEL();}#if 0/* Setup for XAA color 8x8 pattern fill * * Tests: xtest XFree86/fllrctngl (with Mono8x8PatternFill off) */static voidFUNC_NAME(RADEONSetupForColor8x8PatternFill)(ScrnInfoPtr pScrn,					     int patx, int paty,					     int rop,					     unsigned int planemask,					     int trans_color){    RADEONInfoPtr  info = RADEONPTR(pScrn);    ACCEL_PREAMBLE();    /* Save for later clipping */    info->dp_gui_master_cntl_clip = (info->dp_gui_master_cntl				     | RADEON_GMC_BRUSH_8x8_COLOR				     | RADEON_GMC_SRC_DATATYPE_COLOR				     | RADEON_ROP[rop].pattern				     | RADEON_DP_SRC_SOURCE_MEMORY);    BEGIN_ACCEL(3);    OUT_ACCEL_REG(RADEON_DP_GUI_MASTER_CNTL, info->dp_gui_master_cntl_clip);    OUT_ACCEL_REG(RADEON_DP_WRITE_MASK,      planemask);    OUT_ACCEL_REG(RADEON_SRC_Y_X,            (paty << 16) | patx);    FINISH_ACCEL();    info->trans_color = trans_color;    FUNC_NAME(RADEONSetTransparency)(pScrn, trans_color);}/* Subsequent XAA 8x8 pattern color expansion */static voidFUNC_NAME(RADEONSubsequentColor8x8PatternFillRect)(ScrnInfoPtr pScrn,						   int patx, int paty,						   int x, int y,						   int w, int h){    RADEONInfoPtr  info = RADEONPTR(pScrn);    ACCEL_PREAMBLE();    BEGIN_ACCEL(4);    OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, info->dst_pitch_offset |    	((info->tilingEnabled && (y <= pScrn->virtualY)) ? RADEON_DST_TILE_MACRO : 0));    OUT_ACCEL_REG(RADEON_BRUSH_Y_X,        (paty << 16) | patx);    OUT_ACCEL_REG(RADEON_DST_Y_X,          (y << 16) | x);    OUT_ACCEL_REG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w);    FINISH_ACCEL();}#endif#ifdef ACCEL_CP#define CP_BUFSIZE (info->indirectBuffer->total/4-10)/* Helper function to write out a HOSTDATA_BLT packet into the indirect * buffer and set the XAA scratch buffer address appropriately. */static voidRADEONCPScanlinePacket(ScrnInfoPtr pScrn, int bufno){    RADEONInfoPtr info = RADEONPTR(pScrn);    int           chunk_words = info->scanline_hpass * info->scanline_words;    ACCEL_PREAMBLE();    if (RADEON_VERBOSE) {	xf86DrvMsg(pScrn->scrnIndex, X_INFO,		   "CPScanline Packet h=%d hpass=%d chunkwords=%d\n",		   info->scanline_h, info->scanline_hpass, chunk_words);    }    BEGIN_RING(chunk_words+10);    OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_CNTL_HOSTDATA_BLT,chunk_words+10-2));    OUT_RING(info->dp_gui_master_cntl_clip);    OUT_RING(info->dst_pitch_offset |    	((info->tilingEnabled && (info->scanline_y <= pScrn->virtualY)) ? RADEON_DST_TILE_MACRO : 0));    OUT_RING((info->scanline_y << 16) |	     (info->scanline_x1clip & 0xffff));    OUT_RING(((info->scanline_y+info->scanline_hpass) << 16) |	     (info->scanline_x2clip & 0xffff));    OUT_RING(info->scanline_fg);    OUT_RING(info->scanline_bg);    OUT_RING((info->scanline_y << 16) |	     (info->scanline_x & 0xffff));    OUT_RING((info->scanline_hpass << 16) |	     (info->scanline_w & 0xffff));    OUT_RING(chunk_words);    info->scratch_buffer[bufno] = (unsigned char *)&__head[__count];    __count += chunk_words;    /* The ring can only be advanced after the __head and __count have       been adjusted above */    FINISH_ACCEL();    info->scanline_y += info->scanline_hpass;    info->scanline_h -= info->scanline_hpass;}#endif/* Setup for XAA indirect CPU-to-screen color expansion (indirect). * Because of how the scratch buffer is initialized, this is really a * mainstore-to-screen color expansion.  Transparency is supported when * `bg == -1'. */static voidFUNC_NAME(RADEONSetupForScanlineCPUToScreenColorExpandFill)(ScrnInfoPtr pScrn,							    int fg,							    int bg,							    int rop,							    unsigned int							    planemask){    RADEONInfoPtr  info = RADEONPTR(pScrn);    ACCEL_PREAMBLE();    info->scanline_bpp = 0;    /* Save for later clipping */    info->dp_gui_master_cntl_clip = (info->dp_gui_master_cntl				     | RADEON_GMC_DST_CLIPPING				     | RADEON_GMC_BRUSH_NONE				     | (bg == -1					? RADEON_GMC_SRC_DATATYPE_MONO_FG_LA					: RADEON_GMC_SRC_DATATYPE_MONO_FG_BG)				     | RADEON_ROP[rop].rop#if X_BYTE_ORDER == X_LITTLE_ENDIAN				     | RADEON_GMC_BYTE_LSB_TO_MSB#else				     | RADEON_GMC_BYTE_MSB_TO_LSB#endif				     | RADEON_DP_SRC_SOURCE_HOST_DATA);#ifdef ACCEL_MMIO#if X_BYTE_ORDER == X_LITTLE_ENDIAN    BEGIN_ACCEL(4);#else    BEGIN_ACCEL(5);    OUT_ACCEL_REG(RADEON_RBBM_GUICNTL,       RADEON_HOST_DATA_SWAP_NONE);#endif    OUT_ACCEL_REG(RADEON_DP_GUI_MASTER_CNTL, info->dp_gui_master_cntl_clip);    OUT_ACCEL_REG(RADEON_DP_WRITE_MASK,      planemask);    OUT_ACCEL_REG(RADEON_DP_SRC_FRGD_CLR,    fg);    OUT_ACCEL_REG(RADEON_DP_SRC_BKGD_CLR,    bg);#else /* ACCEL_CP */    info->scanline_fg = fg;    info->scanline_bg = bg;#if X_BYTE_ORDER == X_LITTLE_ENDIAN    BEGIN_ACCEL(1);#else    if (info->ChipFamily < CHIP_FAMILY_R300) {	BEGIN_ACCEL(2);	OUT_ACCEL_REG(RADEON_RBBM_GUICNTL,   RADEON_HOST_DATA_SWAP_32BIT);    } else	BEGIN_ACCEL(1);#endif    OUT_ACCEL_REG(RADEON_DP_WRITE_MASK,      planemask);#endif    FINISH_ACCEL();}/* Subsequent XAA indirect CPU-to-screen color expansion.  This is only * called once for each rectangle. */static voidFUNC_NAME(RADEONSubsequentScanlineCPUToScreenColorExpandFill)(ScrnInfoPtr							      pScrn,							      int x, int y,							      int w, int h,							      int skipleft){    RADEONInfoPtr  info = RADEONPTR(pScrn);#ifdef ACCEL_MMIO    ACCEL_PREAMBLE();    info->scanline_h      = h;    info->scanline_words  = (w + 31) >> 5;#ifdef __alpha__    /* Always use indirect for Alpha */    if (0)#else    if ((info->scanline_words * h) <= 9)#endif    {	/* Turn on direct for less than 9 dword colour expansion */	info->scratch_buffer[0] =	    (unsigned char *)(ADDRREG(RADEON_HOST_DATA_LAST)			      - (info->scanline_words - 1));	info->scanline_direct   = 1;    } else {	/* Use indirect for anything else */	info->scratch_buffer[0] = info->scratch_save;	info->scanline_direct   = 0;    }    BEGIN_ACCEL(5 + (info->scanline_direct ?		     (info->scanline_words * h) : 0));    OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, info->dst_pitch_offset |    	((info->tilingEnabled && (y <= pScrn->virtualY)) ? RADEON_DST_TILE_MACRO : 0));    OUT_ACCEL_REG(RADEON_SC_TOP_LEFT,      (y << 16)     | ((x+skipleft)							    & 0xffff));    OUT_ACCEL_REG(RADEON_SC_BOTTOM_RIGHT,  ((y+h) << 16) | ((x+w) & 0xffff));    OUT_ACCEL_REG(RADEON_DST_Y_X,          (y << 16)     | (x & 0xffff));    /* Have to pad the width here and use clipping engine */    OUT_ACCEL_REG(RADEON_DST_HEIGHT_WIDTH, (h << 16)     | ((w + 31) & ~31));    FINISH_ACCEL();#else /* ACCEL_CP */    info->scanline_x      = x;    info->scanline_y      = y;    /* Have to pad the width here and use clipping engine */    info->scanline_w      = (w + 31) & ~31;    info->scanline_h      = h;    info->scanline_x1clip = x + skipleft;    info->scanline_x2clip = x + w;    info->scanline_words  = info->scanline_w / 32;    info->scanline_hpass  = min(h,(CP_BUFSIZE/info->scanline_words));    RADEONCPScanlinePacket(pScrn, 0);#endif}/* Subsequent XAA indirect CPU-to-screen color expansion and indirect * image write.  This is called once for each scanline. */static voidFUNC_NAME(RADEONSubsequentScanline)(ScrnInfoPtr pScrn,				    int bufno){    RADEONInfoPtr    info = RADEONPTR(pScrn);#ifdef ACCEL_MMIO    CARD32          *p    = (pointer)info->scratch_buffer[bufno];    int              i;    int              left = info->scanline_words;    volatile CARD32 *d;    ACCEL_PREAMBLE();    if (info->scanline_direct) return;    --info->scanline_h;    while (left) {	write_mem_barrier();	if (left <= 8) {	  /* Last scanline - finish write to DATA_LAST */	  if (info->scanline_h == 0) {	    BEGIN_ACCEL(left);				/* Unrolling doesn't improve performance */	    for (d = ADDRREG(RADEON_HOST_DATA_LAST) - (left - 1); left; --left)		*d++ = *p++;	    return;	  } else {	    BEGIN_ACCEL(left);				/* Unrolling doesn't improve performance */	    for (d = ADDRREG(RADEON_HOST_DATA7) - (left - 1); left; --left)		*d++ = *p++;	  }	} else {	    BEGIN_ACCEL(8);				/* Unrolling doesn't improve performance */	    for (d = ADDRREG(RADEON_HOST_DATA0), i = 0; i < 8; i++)		*d++ = *p++;	    left -= 8;	}    }    FINISH_ACCEL();#else /* ACCEL_CP */#if X_BYTE_ORDER == X_BIG_ENDIAN    if (info->ChipFamily >= CHIP_FAMILY_R300) {	if (info->scanline_bpp == 16) {	    RADEONCopySwap(info->scratch_buffer[bufno],			   info->scratch_buffer[bufno],			   info->scanline_words << 2,			   RADEON_HOST_DATA_SWAP_HDW);	} else if (info->scanline_bpp < 15) {	    RADEONCopySwap(info->scratch_buffer[bufno],			   info->scratch_buffer[bufno],			   info->scanline_words << 2,			   RADEON_HOST_DATA_SWAP_32BIT);	}    }#endif    if (--info->scanline_hpass) {	info->scratch_buffer[bufno] += 4 * info->scanline_words;    } else if (info->scanline_h) {	info->scanline_hpass =	    min(info->scanline_h,(CP_BUFSIZE/info->scanline_words));	RADEONCPScanlinePacket(pScrn, bufno);    }#endif}/* Setup for XAA indirect image write */static void

⌨️ 快捷键说明

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