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