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

📄 atimach64accel.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
ATIMach64SetupForSolidFill(    ScrnInfoPtr  pScreenInfo,    int          colour,    int          rop,    unsigned int planemask){    ATIPtr pATI = ATIPTR(pScreenInfo);    ATIDRISync(pScreenInfo);    ATIMach64WaitForFIFO(pATI, 5);    outf(DP_WRITE_MASK, planemask);    outf(DP_SRC, DP_MONO_SRC_ALLONES |        SetBits(SRC_FRGD, DP_FRGD_SRC) | SetBits(SRC_BKGD, DP_BKGD_SRC));    outf(DP_FRGD_CLR, colour);    outf(DP_MIX, SetBits(ATIMach64ALU[rop], DP_FRGD_MIX));    outf(CLR_CMP_CNTL, CLR_CMP_FN_FALSE);    if (pATI->XModifier == 1)        outf(DST_CNTL, DST_X_DIR | DST_Y_DIR);}/* * ATIMach64SubsequentSolidFillRect -- * * This function performs a solid rectangle fill. */static voidATIMach64SubsequentSolidFillRect(    ScrnInfoPtr pScreenInfo,    int         x,    int         y,    int         w,    int         h){    ATIPtr pATI = ATIPTR(pScreenInfo);    ATIDRISync(pScreenInfo);    if (pATI->XModifier != 1)    {        x *= pATI->XModifier;        w *= pATI->XModifier;        outf(DST_CNTL, SetBits((x / 4) % 6, DST_24_ROT) |            (DST_X_DIR | DST_Y_DIR | DST_24_ROT_EN));    }    /* Disable clipping if it gets in the way */    ATIMach64ValidateClip(pATI, x, x + w - 1, y, y + h - 1);    ATIMach64WaitForFIFO(pATI, 2);    outf(DST_Y_X, SetWord(x, 1) | SetWord(y, 0));    outf(DST_HEIGHT_WIDTH, SetWord(w, 1) | SetWord(h, 0));}/* * ATIMach64SetupForSolidLine -- * * This function sets up the draw engine for a series of solid lines.  It is * not used for 24bpp because the engine doesn't support it. */static voidATIMach64SetupForSolidLine(    ScrnInfoPtr  pScreenInfo,    int          colour,    int          rop,    unsigned int planemask){    ATIPtr pATI = ATIPTR(pScreenInfo);    ATIDRISync(pScreenInfo);    ATIMach64WaitForFIFO(pATI, 5);    outf(DP_WRITE_MASK, planemask);    outf(DP_SRC, DP_MONO_SRC_ALLONES |        SetBits(SRC_FRGD, DP_FRGD_SRC) | SetBits(SRC_BKGD, DP_BKGD_SRC));    outf(DP_FRGD_CLR, colour);    outf(DP_MIX, SetBits(ATIMach64ALU[rop], DP_FRGD_MIX));    outf(CLR_CMP_CNTL, CLR_CMP_FN_FALSE);    ATIMach64ValidateClip(pATI, pATI->NewHW.sc_left, pATI->NewHW.sc_right,        pATI->NewHW.sc_top, pATI->NewHW.sc_bottom);}/* * ATIMach64SubsequentSolidHorVertLine -- * * This is called to draw a solid horizontal or vertical line.  This does a * one-pixel wide solid fill. */static voidATIMach64SubsequentSolidHorVertLine(    ScrnInfoPtr pScreenInfo,    int         x,    int         y,    int         len,    int         dir){    ATIPtr pATI = ATIPTR(pScreenInfo);    ATIDRISync(pScreenInfo);    ATIMach64WaitForFIFO(pATI, 3);    outf(DST_CNTL, DST_X_DIR | DST_Y_DIR);    outf(DST_Y_X, SetWord(x, 1) | SetWord(y, 0));    if (dir == DEGREES_0)        outf(DST_HEIGHT_WIDTH, SetWord(len, 1) | SetWord(1, 0));    else /* if (dir == DEGREES_270) */        outf(DST_HEIGHT_WIDTH, SetWord(1, 1) | SetWord(len, 0));}/* * ATIMach64SubsequentSolidBresenhamLine -- * * This function draws a line using the Bresenham line engine. */static voidATIMach64SubsequentSolidBresenhamLine(    ScrnInfoPtr pScreenInfo,    int         x,    int         y,    int         major,    int         minor,    int         err,    int         len,    int         octant){    ATIPtr pATI = ATIPTR(pScreenInfo);    CARD32 dst_cntl = DST_LAST_PEL;    if (octant & YMAJOR)        dst_cntl |= DST_Y_MAJOR;    if (!(octant & XDECREASING))        dst_cntl |= DST_X_DIR;    if (!(octant & YDECREASING))        dst_cntl |= DST_Y_DIR;    ATIDRISync(pScreenInfo);    ATIMach64WaitForFIFO(pATI, 6);    outf(DST_CNTL, dst_cntl);    outf(DST_Y_X, SetWord(x, 1) | SetWord(y, 0));    outf(DST_BRES_ERR, minor + err);    outf(DST_BRES_INC, minor);    outf(DST_BRES_DEC, minor - major);    outf(DST_BRES_LNTH, len);}/* * ATIMach64SetupForMono8x8PatternFill -- * * This function sets up the draw engine for a series of 8x8 1bpp pattern * fills. */static voidATIMach64SetupForMono8x8PatternFill(    ScrnInfoPtr  pScreenInfo,    int          patx,    int          paty,    int          fg,    int          bg,    int          rop,    unsigned int planemask){    ATIPtr pATI = ATIPTR(pScreenInfo);    ATIDRISync(pScreenInfo);    ATIMach64WaitForFIFO(pATI, 3);    outf(DP_WRITE_MASK, planemask);    outf(DP_SRC, DP_MONO_SRC_PATTERN |        SetBits(SRC_FRGD, DP_FRGD_SRC) | SetBits(SRC_BKGD, DP_BKGD_SRC));    outf(DP_FRGD_CLR, fg);    if (bg == -1)    {        outf(DP_MIX, SetBits(ATIMach64ALU[rop], DP_FRGD_MIX) |            SetBits(MIX_DST, DP_BKGD_MIX));    }    else    {        ATIMach64WaitForFIFO(pATI, 2);        outf(DP_BKGD_CLR, bg);        outf(DP_MIX, SetBits(ATIMach64ALU[rop], DP_FRGD_MIX) |            SetBits(ATIMach64ALU[rop], DP_BKGD_MIX));    }    ATIMach64WaitForFIFO(pATI, 4);    outf(PAT_REG0, patx);    outf(PAT_REG1, paty);    outf(PAT_CNTL, PAT_MONO_EN);    outf(CLR_CMP_CNTL, CLR_CMP_FN_FALSE);    if (pATI->XModifier == 1)        outf(DST_CNTL, DST_X_DIR | DST_Y_DIR);}/* * ATIMach64SubsequentMono8x8PatternFillRect -- * * This function performs an 8x8 1bpp pattern fill. */static voidATIMach64SubsequentMono8x8PatternFillRect(    ScrnInfoPtr pScreenInfo,    int         patx,    int         paty,    int         x,    int         y,    int         w,    int         h){    ATIPtr pATI = ATIPTR(pScreenInfo);    ATIDRISync(pScreenInfo);    if (pATI->XModifier != 1)    {        x *= pATI->XModifier;        w *= pATI->XModifier;        outf(DST_CNTL, SetBits((x / 4) % 6, DST_24_ROT) |            (DST_X_DIR | DST_Y_DIR | DST_24_ROT_EN));    }    /* Disable clipping if it gets in the way */    ATIMach64ValidateClip(pATI, x, x + w - 1, y, y + h - 1);    ATIMach64WaitForFIFO(pATI, 2);    outf(DST_Y_X, SetWord(x, 1) | SetWord(y, 0));    outf(DST_HEIGHT_WIDTH, SetWord(w, 1) | SetWord(h, 0));}/* * ATIMach64SetupForScanlineCPUToScreenColorExpandFill -- * * This function sets up the engine for a series of colour expansion fills. */static voidATIMach64SetupForScanlineCPUToScreenColorExpandFill(    ScrnInfoPtr  pScreenInfo,    int          fg,    int          bg,    int          rop,    unsigned int planemask){    ATIPtr pATI = ATIPTR(pScreenInfo);    ATIDRISync(pScreenInfo);    ATIMach64WaitForFIFO(pATI, 3);    outf(DP_WRITE_MASK, planemask);    outf(DP_SRC, DP_MONO_SRC_HOST |        SetBits(SRC_FRGD, DP_FRGD_SRC) | SetBits(SRC_BKGD, DP_BKGD_SRC));    outf(DP_FRGD_CLR, fg);    if (bg == -1)    {        outf(DP_MIX, SetBits(ATIMach64ALU[rop], DP_FRGD_MIX) |            SetBits(MIX_DST, DP_BKGD_MIX));    }    else    {        ATIMach64WaitForFIFO(pATI, 2);        outf(DP_BKGD_CLR, bg);        outf(DP_MIX, SetBits(ATIMach64ALU[rop], DP_FRGD_MIX) |            SetBits(ATIMach64ALU[rop], DP_BKGD_MIX));    }    outf(CLR_CMP_CNTL, CLR_CMP_FN_FALSE);    if (pATI->XModifier == 1)        outf(DST_CNTL, DST_X_DIR | DST_Y_DIR);}/* * ATIMach64SubsequentScanlineCPUToScreenColorExpandFill -- * * This function sets up the engine for a single colour expansion fill. */static voidATIMach64SubsequentScanlineCPUToScreenColorExpandFill(    ScrnInfoPtr pScreenInfo,    int         x,    int         y,    int         w,    int         h,    int         skipleft){    ATIPtr pATI = ATIPTR(pScreenInfo);    ATIDRISync(pScreenInfo);    if (pATI->XModifier != 1)    {        x *= pATI->XModifier;        w *= pATI->XModifier;        skipleft *= pATI->XModifier;        outf(DST_CNTL, SetBits((x / 4) % 6, DST_24_ROT) |            (DST_X_DIR | DST_Y_DIR | DST_24_ROT_EN));    }    pATI->ExpansionBitmapWidth = (w + 31) / 32;    ATIMach64WaitForFIFO(pATI, 3);    pATI->sc_left = x + skipleft;    pATI->sc_right = x + w - 1;    outf(SC_LEFT_RIGHT,        SetWord(pATI->sc_right, 1) | SetWord(pATI->sc_left, 0));    outf(DST_Y_X, SetWord(x, 1) | SetWord(y, 0));    outf(DST_HEIGHT_WIDTH,        SetWord(pATI->ExpansionBitmapWidth * 32, 1) | SetWord(h, 0));}/* * ATIMach64SubsequentColorExpandScanline -- * * This function feeds a bitmap scanline to the engine for a colour expansion * fill.  This is written to do burst transfers for those platforms that can do * them, and to improve CPU/engine concurrency. */static voidATIMach64SubsequentColorExpandScanline(    ScrnInfoPtr pScreenInfo,    int         iBuffer){    ATIPtr          pATI         = ATIPTR(pScreenInfo);    CARD32          *pBitmapData = pATI->ExpansionBitmapScanlinePtr[iBuffer];    int             w            = pATI->ExpansionBitmapWidth;    int             nDWord;    ATIDRISync(pScreenInfo);    while (w > 0)    {        /*         * Transfers are done in chunks of up to 64 bytes in length (32 on         * earlier controllers).         */        nDWord = w;        if (nDWord > pATI->nHostFIFOEntries)            nDWord = pATI->nHostFIFOEntries;        /* Make enough FIFO slots available */        ATIMach64WaitForFIFO(pATI, nDWord);        /*         * Always start transfers on a chuck-sized boundary.  Note that         * HOST_DATA_0 is actually on a 512-byte boundary, but *pBitmapData can         * only be guaranteed to be on a chunk-sized boundary.         *         * Transfer current chunk.  With any luck, the compiler won't mangle         * this too badly...         */#       if defined(ATIMove32)        {            ATIMove32(pATI->pHOST_DATA, pBitmapData, nDWord);        }#       else        {            volatile CARD32 *pDst;            CARD32          *pSrc;            unsigned int    iDWord;            iDWord = 16 - nDWord;            pDst = (volatile CARD32 *)pATI->pHOST_DATA - iDWord;            pSrc = pBitmapData - iDWord;            switch (iDWord)            {                case  0:  MMIO_MOVE32(pDst +  0, 0, *(pSrc +  0));                case  1:  MMIO_MOVE32(pDst +  1, 0, *(pSrc +  1));                case  2:  MMIO_MOVE32(pDst +  2, 0, *(pSrc +  2));                case  3:  MMIO_MOVE32(pDst +  3, 0, *(pSrc +  3));                case  4:  MMIO_MOVE32(pDst +  4, 0, *(pSrc +  4));                case  5:  MMIO_MOVE32(pDst +  5, 0, *(pSrc +  5));                case  6:  MMIO_MOVE32(pDst +  6, 0, *(pSrc +  6));                case  7:  MMIO_MOVE32(pDst +  7, 0, *(pSrc +  7));                case  8:  MMIO_MOVE32(pDst +  8, 0, *(pSrc +  8));                case  9:  MMIO_MOVE32(pDst +  9, 0, *(pSrc +  9));                case 10:  MMIO_MOVE32(pDst + 10, 0, *(pSrc + 10));                case 11:  MMIO_MOVE32(pDst + 11, 0, *(pSrc + 11));                case 12:  MMIO_MOVE32(pDst + 12, 0, *(pSrc + 12));                case 13:  MMIO_MOVE32(pDst + 13, 0, *(pSrc + 13));                case 14:  MMIO_MOVE32(pDst + 14, 0, *(pSrc + 14));                case 15:  MMIO_MOVE32(pDst + 15, 0, *(pSrc + 15));                default:    /* Muffle compiler */                    break;            }        }#       endif        /* Step to next chunk */        pBitmapData += nDWord;        w -= nDWord;        pATI->nAvailableFIFOEntries -= nDWord;    }    pATI->EngineIsBusy = TRUE;}/* * ATIMach64AccelInit -- * * This function fills in structure fields needed for acceleration on Mach64 * variants. */intATIMach64AccelInit(    ATIPtr        pATI,    XAAInfoRecPtr pXAAInfo){    /* This doesn't seem quite right... */    if (pATI->XModifier == 1)    {        pXAAInfo->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS;#ifndef AVOID_CPIO        if (!pATI->BankInfo.BankSize)#endif /* AVOID_CPIO */        {            pXAAInfo->Flags |= LINEAR_FRAMEBUFFER;        }    }    /* Sync */    pXAAInfo->Sync = ATIMach64Sync;    /* Screen-to-screen copy */    pXAAInfo->SetupForScreenToScreenCopy = ATIMach64SetupForScreenToScreenCopy;    pXAAInfo->SubsequentScreenToScreenCopy =        ATIMach64SubsequentScreenToScreenCopy;    /* Solid fills */    pXAAInfo->SetupForSolidFill = ATIMach64SetupForSolidFill;    pXAAInfo->SubsequentSolidFillRect = ATIMach64SubsequentSolidFillRect;    /* 8x8 mono pattern fills */    pXAAInfo->Mono8x8PatternFillFlags =#if X_BYTE_ORDER != X_LITTLE_ENDIAN        BIT_ORDER_IN_BYTE_MSBFIRST |#endif /* X_BYTE_ORDER */        HARDWARE_PATTERN_PROGRAMMED_BITS | HARDWARE_PATTERN_SCREEN_ORIGIN;    pXAAInfo->SetupForMono8x8PatternFill = ATIMach64SetupForMono8x8PatternFill;    pXAAInfo->SubsequentMono8x8PatternFillRect =        ATIMach64SubsequentMono8x8PatternFillRect;    /*     * Use scanline version of colour expansion, not only for the non-ix86     * case, but also to avoid PCI retries.     */    pXAAInfo->ScanlineCPUToScreenColorExpandFillFlags =        LEFT_EDGE_CLIPPING | LEFT_EDGE_CLIPPING_NEGATIVE_X |        CPU_TRANSFER_PAD_DWORD | SCANLINE_PAD_DWORD;    if (pATI->XModifier != 1)        pXAAInfo->ScanlineCPUToScreenColorExpandFillFlags |= TRIPLE_BITS_24BPP;    pXAAInfo->NumScanlineColorExpandBuffers = 1;    /* Align bitmap data on a 64-byte boundary */    pATI->ExpansionBitmapWidth =        /* DWord size in bits */        ((pATI->displayWidth * pATI->XModifier) + 31) & ~31U;    pATI->ExpansionBitmapScanlinePtr[1] =        (CARD32 *)xnfalloc((pATI->ExpansionBitmapWidth >> 3) + 63);    pATI->ExpansionBitmapScanlinePtr[0] =        (pointer)(((unsigned long)pATI->ExpansionBitmapScanlinePtr[1] + 63) &                  ~63UL);    pXAAInfo->ScanlineColorExpandBuffers =        (CARD8 **)pATI->ExpansionBitmapScanlinePtr;    pXAAInfo->SetupForScanlineCPUToScreenColorExpandFill =        ATIMach64SetupForScanlineCPUToScreenColorExpandFill;    pXAAInfo->SubsequentScanlineCPUToScreenColorExpandFill =        ATIMach64SubsequentScanlineCPUToScreenColorExpandFill;    pXAAInfo->SubsequentColorExpandScanline =        ATIMach64SubsequentColorExpandScanline;    /* The engine does not support the following primitives for 24bpp */    if (pATI->XModifier != 1)        return ATIMach64MaxY;    /* Solid lines */    pXAAInfo->SetupForSolidLine = ATIMach64SetupForSolidLine;    pXAAInfo->SubsequentSolidHorVertLine = ATIMach64SubsequentSolidHorVertLine;    pXAAInfo->SubsequentSolidBresenhamLine =        ATIMach64SubsequentSolidBresenhamLine;    return ATIMach64MaxY;}#endif /* USE_XAA */

⌨️ 快捷键说明

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