[xf86-video-trident,3/3] Rename image_accel.c to image_xaa.c

Submitted by Kevin Brace on Feb. 19, 2019, 8:37 p.m.

Details

Message ID 1550608657-2814-4-git-send-email-kevinbrace@gmx.com
State New
Headers show
Series "Convert image_accel.c to image_xaa.c" ( rev: 1 ) in X.org

Not browsing as part of any series.

Commit Message

Kevin Brace Feb. 19, 2019, 8:37 p.m.
Signed-off-by: Kevin Brace <kevinbrace@gmx.com>
---
 src/Makefile.am   |   2 +-
 src/image_accel.c | 788 ------------------------------------------------------
 src/image_xaa.c   | 788 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 789 insertions(+), 789 deletions(-)
 delete mode 100644 src/image_accel.c
 create mode 100644 src/image_xaa.c

Patch hide | download patch | download mbox

diff --git a/src/Makefile.am b/src/Makefile.am
index 6c230ed..f2dc14c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -33,7 +33,7 @@  trident_drv_la_SOURCES = \
          blade_accel.c \
          blade_accel_exa.c \
          compat-api.h \
-         image_accel.c \
+         image_xaa.c \
          tgui_xaa.c \
          trident_bank.c \
          trident_dac.c \
diff --git a/src/image_accel.c b/src/image_accel.c
deleted file mode 100644
index b90e0d3..0000000
--- a/src/image_accel.c
+++ /dev/null
@@ -1,788 +0,0 @@ 
-/*
- * Copyright 1997-2003 by Alan Hourihane, North Wales, UK.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of Alan
- * Hourihane not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission.  Alan Hourihane makes no representations about the
- * suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
- *
- * Trident 3DImage' accelerated options.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "xf86.h"
-#include "xf86_OSproc.h"
-
-#include "xf86Pci.h"
-
-#include "miline.h"
-
-#include "trident.h"
-#include "trident_regs.h"
-
-#ifdef HAVE_XAA_H
-#include "xaarop.h"
-#include "xaalocal.h"
-
-
-static void ImageSync(ScrnInfoPtr pScrn);
-static void ImageSyncClip(ScrnInfoPtr pScrn);
-#if 0
-static void ImageSetupForSolidLine(ScrnInfoPtr pScrn,
-                                    int color,
-                                    int rop,
-                                    unsigned int planemask);
-static void ImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
-                                                int x, int y,
-                                                int dmaj, int dmin,
-                                                int e, int len,
-                                                int octant);
-#endif
-static void ImageSetupForFillRectSolid(ScrnInfoPtr pScrn,
-                                            int color,
-                                            int rop,
-                                            unsigned int planemask);
-static void ImageSubsequentFillRectSolid(ScrnInfoPtr pScrn,
-                                            int x, int y,
-                                            int w, int h);
-static void ImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
-                                                int x1, int y1,
-                                                int x2, int y2,
-                                                int w, int h);
-static void ImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
-                                            int xdir, int ydir,
-                                            int rop,
-                                            unsigned int planemask,
-                                            int transparency_color);
-static void ImageSetClippingRectangle(ScrnInfoPtr pScrn,
-                                        int x1, int y1,
-                                        int x2, int y2);
-static void ImageDisableClipping(ScrnInfoPtr pScrn);
-static void ImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
-                                            int patternx,
-                                            int patterny,
-                                            int fg, int bg,
-                                            int rop,
-                                            unsigned int planemask);
-static void ImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
-                                                    int patternx,
-                                                    int patterny,
-                                                    int x, int y,
-                                                    int w, int h);
-#if 0
-static void ImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
-                                                int patternx,
-                                                int patterny,
-                                                int rop,
-                                                unsigned int planemask,
-                                                int trans_col);
-static void ImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
-                                                    int patternx,
-                                                    int patterny,
-                                                    int x, int y,
-                                                    int w, int h);
-#endif
-static void ImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn,
-                                            int rop,
-                                            unsigned int planemask,
-                                            int transparency_color,
-                                            int bpp,
-                                            int depth);
-static void ImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn,
-                                                    int x, int y,
-                                                    int w, int h,
-                                                    int skipleft);
-static void ImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn,
-                                                int bufno);
-static void ImageSetupForScanlineCPUToScreenColorExpandFill(
-                                            ScrnInfoPtr pScrn,
-                                            int fg, int bg,
-                                            int rop,
-                                            unsigned int planemask);
-static void ImageSubsequentScanlineCPUToScreenColorExpandFill(
-                                                    ScrnInfoPtr pScrn,
-                                                    int x, int y,
-                                                    int w, int h,
-                                                    int skipleft);
-static void ImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn,
-                                                int bufno);
-
-
-static void
-ImageInitializeAccelerator(ScrnInfoPtr pScrn)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    switch (pScrn->depth) {
-    case 8:
-        pTrident->EngineOperation = 0;
-        break;
-    case 15:
-        pTrident->EngineOperation = 5;
-        break;
-    case 16:
-        pTrident->EngineOperation = 1;
-        break;
-    case 24:
-        pTrident->EngineOperation = 2;
-        break;
-    }
-    IMAGE_OUT(0x2120, 0xF0000000);
-    IMAGE_OUT(0x2120, 0x40000000 | pTrident->EngineOperation);
-    IMAGE_OUT(0x2120, 0x80000000);
-    IMAGE_OUT(0x2144, 0x00000000);
-    IMAGE_OUT(0x2148, 0x00000000);
-    IMAGE_OUT(0x2150, 0x00000000);
-    IMAGE_OUT(0x2154, 0x00000000);
-    IMAGE_OUT(0x2120, 0x60000000 |
-                        (pScrn->displayWidth << 16) |
-                        pScrn->displayWidth);
-    IMAGE_OUT(0x216C, 0x00000000);
-    IMAGE_OUT(0x2170, 0x00000000);
-    IMAGE_OUT(0x217C, 0x00000000);
-    IMAGE_OUT(0x2120, 0x10000000);
-    IMAGE_OUT(0x2130, (2047 << 16) | 2047);
-    pTrident->Clipping = FALSE;
-    pTrident->DstEnable = FALSE;
-}
-#endif
-
-Bool
-ImageAccelInit(ScreenPtr pScreen)
-{
-#ifdef HAVE_XAA_H
-    XAAInfoRecPtr infoPtr;
-    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    if (pTrident->NoAccel)
-        return FALSE;
-
-    pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
-    if (!infoPtr) return FALSE;
-
-    pTrident->InitializeAccelerator = ImageInitializeAccelerator;
-    ImageInitializeAccelerator(pScrn);
-
-    infoPtr->Flags = PIXMAP_CACHE |
-            LINEAR_FRAMEBUFFER |
-            OFFSCREEN_PIXMAPS;
-
-    infoPtr->Sync = ImageSync;
-
-#if 0
-    infoPtr->SetClippingRectangle = ImageSetClippingRectangle;
-    infoPtr->DisableClipping = ImageDisableClipping;
-    infoPtr->ClippingFlags = HARDWARE_CLIP_SOLID_FILL |
-                                HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY |
-                                HARDWARE_CLIP_MONO_8x8_FILL;
-#endif
-
-#if 0
-    infoPtr->SolidLineFlags = NO_PLANEMASK;
-    infoPtr->SetupForSolidLine = ImageSetupForSolidLine;
-    infoPtr->SolidBresenhamLineErrorTermBits = 13;
-    infoPtr->SubsequentSolidBresenhamLine =
-                                    ImageSubsequentSolidBresenhamLine;
-    infoPtr->ClippingFlags |= HARDWARE_CLIP_SOLID_LINE;
-#endif
-
-    infoPtr->SolidFillFlags = NO_PLANEMASK;
-    infoPtr->SetupForSolidFill = ImageSetupForFillRectSolid;
-    infoPtr->SubsequentSolidFillRect = ImageSubsequentFillRectSolid;
-
-    infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK |
-                                        NO_TRANSPARENCY |
-                                        ONLY_TWO_BITBLT_DIRECTIONS;
-
-    infoPtr->SetupForScreenToScreenCopy =
-                                    ImageSetupForScreenToScreenCopy;
-    infoPtr->SubsequentScreenToScreenCopy =
-                                    ImageSubsequentScreenToScreenCopy;
-
-    infoPtr->Mono8x8PatternFillFlags =  NO_PLANEMASK |
-                                    BIT_ORDER_IN_BYTE_MSBFIRST |
-                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
-                                    HARDWARE_PATTERN_PROGRAMMED_BITS;
-
-    infoPtr->SetupForMono8x8PatternFill =
-                                    ImageSetupForMono8x8PatternFill;
-    infoPtr->SubsequentMono8x8PatternFillRect =
-                                ImageSubsequentMono8x8PatternFillRect;
-
-#if 0
-    infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
-                                    NO_TRANSPARENCY |
-                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
-                                    BIT_ORDER_IN_BYTE_MSBFIRST;
-
-    infoPtr->SetupForColor8x8PatternFill =
-                                    ImageSetupForColor8x8PatternFill;
-    infoPtr->SubsequentColor8x8PatternFillRect =
-                            ImageSubsequentColor8x8PatternFillRect;
-    infoPtr->ClippingFlags |= HARDWARE_CLIP_COLOR_8x8_FILL;
-#endif
-
-    if (pTrident->Chipset != CYBER9397DVD) {
-        /*
-         * It seems as though the 9397DVD doesn't like the transfer
-         * window.  But then, I've also tried at the two port
-         * addresses too, with no luck.  Disable for this chipset for
-         * now. I'd guess there's some extra setup needed for this
-         * chipset.
-         */
-        infoPtr->ScanlineCPUToScreenColorExpandFillFlags =
-                                            NO_PLANEMASK |
-                                            LEFT_EDGE_CLIPPING |
-                                            BIT_ORDER_IN_BYTE_MSBFIRST;
-
-        pTrident->XAAScanlineColorExpandBuffers[0] =
-                            xnfalloc(((pScrn->virtualX + 63)) * 4 *
-                                        (pScrn->bitsPerPixel / 8));
-
-        infoPtr->NumScanlineColorExpandBuffers = 1;
-        infoPtr->ScanlineColorExpandBuffers =
-                            pTrident->XAAScanlineColorExpandBuffers;
-
-        infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
-                    ImageSetupForScanlineCPUToScreenColorExpandFill;
-        infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
-                    ImageSubsequentScanlineCPUToScreenColorExpandFill;
-        infoPtr->SubsequentColorExpandScanline =
-                                ImageSubsequentColorExpandScanline;
-
-        infoPtr->ScanlineImageWriteFlags = NO_PLANEMASK |
-                                                LEFT_EDGE_CLIPPING;
-
-        infoPtr->SetupForScanlineImageWrite =
-                                    ImageSetupForScanlineImageWrite;
-        infoPtr->SubsequentScanlineImageWriteRect =
-                ImageSubsequentScanlineImageWriteRect;
-        infoPtr->SubsequentImageWriteScanline =
-                                    ImageSubsequentImageWriteScanline;
-
-        infoPtr->NumScanlineImageWriteBuffers = 1;
-        infoPtr->ScanlineImageWriteBuffers =
-                                    pTrident->XAAImageScanlineBuffer;
-
-        pTrident->XAAImageScanlineBuffer[0] =
-                xnfalloc(pScrn->virtualX * pScrn->bitsPerPixel / 8);
-
-        infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000;
-    }
-
-    return(XAAInit(pScreen, infoPtr));
-#else
-    return FALSE;
-#endif
-}
-
-#ifdef HAVE_XAA_H
-static void
-ImageSync(ScrnInfoPtr pScrn)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    int busy;
-    int cnt = 5000000;
-
-    if (pTrident->Clipping) ImageDisableClipping(pScrn);
-    if (pTrident->DstEnable) {
-        IMAGE_OUT(0x2120, 0x70000000);
-        pTrident->DstEnable = FALSE;
-    }
-
-    IMAGEBUSY(busy);
-    while (busy != 0) {
-        if (--cnt < 0) {
-            ErrorF("GE timeout\n");
-            IMAGE_OUT(0x2164, 0x80000000);
-        }
-
-        IMAGEBUSY(busy);
-    }
-}
-
-static void
-ImageSyncClip(ScrnInfoPtr pScrn)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    int busy;
-    int cnt = 5000000;
-
-    IMAGEBUSY(busy);
-    while (busy != 0) {
-        if (--cnt < 0) {
-            ErrorF("GE timeout\n");
-            IMAGE_OUT(0x2164, 0x80000000);
-        }
-
-        IMAGEBUSY(busy);
-    }
-}
-
-static void
-ImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
-                                int xdir, int ydir,
-                                int rop,
-                                unsigned int planemask,
-                                int transparency_color)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    pTrident->BltScanDirection = 0;
-    if ((xdir < 0) || (ydir < 0))
-        pTrident->BltScanDirection |= (1 << 2);
-
-    IMAGE_OUT(0x2120, 0x80000000);
-    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
-
-    if (transparency_color != -1) {
-        IMAGE_OUT(0x2120, 0x70000000 |
-                            (1 << 26) |
-                            (transparency_color & 0xffffff));
-        pTrident->DstEnable = TRUE;
-    }
-}
-
-static void
-ImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
-                                    int x1, int y1,
-                                    int x2, int y2,
-                                    int w, int h)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    if (pTrident->BltScanDirection) {
-        IMAGE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1));
-        IMAGE_OUT(0x2104, (y1 << 16) | x1);
-        IMAGE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1));
-        IMAGE_OUT(0x210C, y2<<16 | x2);
-    } else {
-        IMAGE_OUT(0x2100, (y1 << 16) | x1);
-        IMAGE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1));
-        IMAGE_OUT(0x2108, (y2 << 16) | x2);
-        IMAGE_OUT(0x210C, ((y2 + h - 1) << 16) | (x2 + w - 1));
-    }
-
-    IMAGE_OUT(0x2124, 0x80000000 |
-                        (1 << 7) | (1 << 22) | (1 << 10) |
-                        pTrident->BltScanDirection |
-                        (pTrident->Clipping ? 1 : 0));
-
-    if (!pTrident->UsePCIRetry)
-        ImageSyncClip(pScrn);
-}
-
-static void
-ImageSetClippingRectangle(ScrnInfoPtr pScrn,
-                            int x1, int y1,
-                            int x2, int y2)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    IMAGE_OUT(0x2120, 0x10000000 |
-                        ((y1 & 0xfff) << 16) | (x1 & 0xfff));
-    IMAGE_OUT(0x2130, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
-    pTrident->Clipping = TRUE;
-}
-
-static void
-ImageDisableClipping(ScrnInfoPtr pScrn)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    pTrident->Clipping = FALSE;
-}
-
-#if 0
-static void
-ImageSetupForSolidLine(ScrnInfoPtr pScrn,
-                        int color,
-                        int rop,
-                        unsigned int planemask)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    REPLICATE(color);
-    IMAGE_OUT(0x2120, 0x84000000);
-    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
-    IMAGE_OUT(0x2144, color);
-}
-
-static void
-ImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
-                                    int x, int y,
-                                    int dmaj, int dmin,
-                                    int e, int len, int octant)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    int tmp;
-    int D = 0, E = 0, ymajor = 0;
-
-    IMAGE_OUT(0x2124, 0x20000000 |
-                        (3 << 22) | (1 << 10) | (1 << 9) |
-                        (pTrident->Clipping ? 1 : 0));
-    if (!(octant & YMAJOR)) {
-        if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
-            E = 1;
-            D = 0;
-        }
-
-        if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
-            E = 1;
-            D = 1;
-        }
-
-        if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
-            E = 1;
-            D = 2;
-        }
-        if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
-            E = 1;
-            D = 3;
-        }
-
-        ymajor = 0;
-    } else {
-        if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
-            E = 0;
-            D = 0;
-        }
-
-        if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
-            E = 0;
-            D = 2;
-        }
-
-        if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
-            E = 0;
-            D = 1;
-        }
-
-        if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
-            E = 0;
-            D = 3;
-        }
-
-        ymajor = (1 << 18);
-    }
-
-    if (E) {
-        tmp = x;
-        x = y;
-        y = tmp;
-    }
-    if (D & 0x02) {
-        IMAGE_OUT(0x21FC, 0x20000000 |
-                            (1 << 27) | (1 << 19) | (1 << 17) |
-                            ymajor | (x + len - 1));
-    } else {
-        IMAGE_OUT(0x21FC, 0x20000000 |
-                            (1 << 27) | (1 << 19) | (1 << 17) |
-                            ymajor | ( y + len - 1));
-    }
-    IMAGE_OUT(0x2100, (E << 30) | ((y & 0xfff) << 16) | (x & 0xfff));
-    IMAGE_OUT(0x2104, (D << 30) |
-                        (((dmaj - dmin) & 0xfff) << 16) |
-                        (-dmin & 0xfff));
-    IMAGE_OUT(0x2108, ((-e & 0xfff) << 16));
-
-    if (!pTrident->UsePCIRetry)
-        ImageSyncClip(pScrn);
-}
-#endif
-
-static void
-ImageSetupForFillRectSolid(ScrnInfoPtr pScrn,
-                            int color,
-                            int rop,
-                            unsigned int planemask)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    REPLICATE(color);
-    IMAGE_OUT(0x2120, 0x80000000);
-    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
-    IMAGE_OUT(0x2144, color);
-}
-
-static void
-ImageSubsequentFillRectSolid(ScrnInfoPtr pScrn,
-                                int x, int y,
-                                int w, int h)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    if ((w <= 0) || (h <= 0))
-        return;
-
-    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
-    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-    IMAGE_OUT(0x2124, 0x80000000 |
-                        (3 << 22) | (1 << 10) | (1 << 9) |
-                        (pTrident->Clipping ? 1 : 0));
-    if (!pTrident->UsePCIRetry)
-        ImageSyncClip(pScrn);
-}
-
-static void
-MoveDWORDS(register CARD32* dest,
-            register CARD32* src,
-            register int dwords )
-{
-    Bool extra = FALSE;
-
-    if (dwords & 0x01) extra = TRUE;
-
-    while(dwords & ~0x03) {
-        *dest = *src;
-        *(dest + 1) = *(src + 1);
-        *(dest + 2) = *(src + 2);
-        *(dest + 3) = *(src + 3);
-        src += 4;
-        dest += 4;
-        dwords -= 4;
-    }
-
-    if(!dwords) {
-        if (extra) *dest = 0x00000000;
-        return;
-    }
-
-    *dest = *src;
-    if(dwords == 1) {
-        if (extra) *(dest + 1) = 0x00000000;
-        return;
-    }
-
-    *(dest + 1) = *(src + 1);
-    if(dwords == 2) {
-        if (extra) *(dest + 2) = 0x00000000;
-        return;
-    }
-
-    *(dest + 2) = *(src + 2);
-    if (extra) *(dest + 3) = 0x00000000;
-}
-
-static void
-ImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
-                                int patternx, int patterny,
-                                int fg, int bg,
-                                int rop,
-                                unsigned int planemask)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop));
-    if (bg == -1) {
-        REPLICATE(fg);
-        IMAGE_OUT(0x2120, 0x80000000 | (1 << 27));
-        IMAGE_OUT(0x2130, patternx);
-        IMAGE_OUT(0x2134, patterny);
-        IMAGE_OUT(0x2150, fg);
-        IMAGE_OUT(0x2154, ~fg);
-    } else {
-        REPLICATE(bg);
-        REPLICATE(fg);
-        IMAGE_OUT(0x2120, 0x80000000 | (1 << 27) | (1 << 26));
-        IMAGE_OUT(0x2130, patternx);
-        IMAGE_OUT(0x2134, patterny);
-        IMAGE_OUT(0x2150, fg);
-        IMAGE_OUT(0x2154, bg);
-    }
-}
-
-static void
-ImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
-                                        int patternx, int patterny,
-                                        int x, int y,
-                                        int w, int h)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
-    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-    IMAGE_OUT(0x2124, 0x80000000 |
-                        (7 << 18) | (1 << 22) | (1 << 10) | (1 << 9) |
-                        (pTrident->Clipping ? 1 : 0));
-    if (!pTrident->UsePCIRetry)
-        ImageSyncClip(pScrn);
-}
-
-#if 0
-static void
-ImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
-                                    int patternx, int patterny,
-                                    int rop,
-                                    unsigned int planemask,
-                                    int transparency_color)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop));
-    IMAGE_OUT(0x2120, 0x80000000 | (1 << 26));
-    if (transparency_color != -1) {
-        IMAGE_OUT(0x2120, 0x70000000 |
-                            (1 << 26) |
-                            (transparency_color & 0xffffff));
-        pTrident->DstEnable = TRUE;
-    }
-}
-
-static void
-ImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
-                                        int patternx, int patterny,
-                                        int x, int y,
-                                        int w, int h)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    IMAGE_OUT(0x2100, ((patterny & 0xfff) << 16) |
-                        (patternx & 0xfff));
-    IMAGE_OUT(0x2104, (((patterny + h - 1) & 0xfff) << 16) |
-                        ((patternx + w - 1) & 0xfff));
-    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
-    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-    IMAGE_OUT(0x2124, 0x80000000 |
-                        (1 << 22) | (1 << 10) | (1 << 7) |
-                        (pTrident->Clipping ? 1 : 0));
-    if (!pTrident->UsePCIRetry)
-        ImageSyncClip(pScrn);
-}
-#endif
-
-static void
-ImageSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
-                                                int fg, int bg,
-                                                int rop,
-                                                unsigned int planemask
-){
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    IMAGE_OUT(0x2120, 0x80000000);
-    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
-    if (bg == -1) {
-        pTrident->ROP = (2 << 22);
-        REPLICATE(fg);
-        IMAGE_OUT(0x2144, fg);
-        IMAGE_OUT(0x2148, ~fg);
-    } else {
-        pTrident->ROP = (3 << 22);
-        REPLICATE(fg);
-        IMAGE_OUT(0x2144, fg);
-        REPLICATE(bg);
-        IMAGE_OUT(0x2148, bg);
-    }
-}
-
-static void
-ImageSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
-                                                    int x, int y,
-                                                    int w, int h,
-                                                    int skipleft
-){
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    ImageSetClippingRectangle(pScrn,(x + skipleft), y,
-                                (x + w - 1), (y + h - 1));
-    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
-    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-    IMAGE_OUT(0x2124, 0x80000000 | (pTrident->ROP) | (1 << 10) | 1);
-    pTrident->dwords = (w + 31) >> 5;
-    pTrident->h = h;
-}
-
-static void
-ImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    XAAInfoRecPtr infoRec;
-    infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
-
-    MoveDWORDS((CARD32*)infoRec->ImageWriteBase,
-            (CARD32*)pTrident->XAAScanlineColorExpandBuffers[bufno],
-            pTrident->dwords);
-
-    pTrident->h--;
-    if (!pTrident->h)
-        ImageSync(pScrn);
-}
-
-static void
-ImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn,
-                                int rop,
-                                unsigned int planemask,
-                                int transparency_color,
-                                int bpp, int depth)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
-    if (transparency_color != -1) {
-        IMAGE_OUT(0x2120, 0x70000000 |
-                            (1 << 26) |
-                            (transparency_color & 0xffffff));
-        pTrident->DstEnable = TRUE;
-    }
-
-    IMAGE_OUT(0x2120, 0x80000000);
-}
-
-static void
-ImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn,
-                                        int x, int y,
-                                        int w, int h,
-                                        int skipleft)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    ImageSetClippingRectangle(pScrn,
-                                (x + skipleft), y,
-                                (x + w - 1), (y + h - 1));
-    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
-    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-    IMAGE_OUT(0x2124, 0x80000000 |
-                        (1 << 22) | (1 << 10) | 1);
-    pTrident->dwords = ((w * (pScrn->bitsPerPixel / 8)) + 3) >> 2;
-    pTrident->h = h;
-}
-
-
-static void
-ImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    XAAInfoRecPtr infoRec;
-    infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
-
-    MoveDWORDS((CARD32*)infoRec->ImageWriteBase,
-                (CARD32*)pTrident->XAAImageScanlineBuffer[bufno],
-                pTrident->dwords);
-
-    pTrident->h--;
-    if (!pTrident->h)
-        ImageSync(pScrn);
-}
-#endif
diff --git a/src/image_xaa.c b/src/image_xaa.c
new file mode 100644
index 0000000..b90e0d3
--- /dev/null
+++ b/src/image_xaa.c
@@ -0,0 +1,788 @@ 
+/*
+ * Copyright 1997-2003 by Alan Hourihane, North Wales, UK.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of Alan
+ * Hourihane not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission.  Alan Hourihane makes no representations about the
+ * suitability of this software for any purpose.  It is provided
+ * "as is" without express or implied warranty.
+ *
+ * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
+ *
+ * Trident 3DImage' accelerated options.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "xf86.h"
+#include "xf86_OSproc.h"
+
+#include "xf86Pci.h"
+
+#include "miline.h"
+
+#include "trident.h"
+#include "trident_regs.h"
+
+#ifdef HAVE_XAA_H
+#include "xaarop.h"
+#include "xaalocal.h"
+
+
+static void ImageSync(ScrnInfoPtr pScrn);
+static void ImageSyncClip(ScrnInfoPtr pScrn);
+#if 0
+static void ImageSetupForSolidLine(ScrnInfoPtr pScrn,
+                                    int color,
+                                    int rop,
+                                    unsigned int planemask);
+static void ImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
+                                                int x, int y,
+                                                int dmaj, int dmin,
+                                                int e, int len,
+                                                int octant);
+#endif
+static void ImageSetupForFillRectSolid(ScrnInfoPtr pScrn,
+                                            int color,
+                                            int rop,
+                                            unsigned int planemask);
+static void ImageSubsequentFillRectSolid(ScrnInfoPtr pScrn,
+                                            int x, int y,
+                                            int w, int h);
+static void ImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
+                                                int x1, int y1,
+                                                int x2, int y2,
+                                                int w, int h);
+static void ImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
+                                            int xdir, int ydir,
+                                            int rop,
+                                            unsigned int planemask,
+                                            int transparency_color);
+static void ImageSetClippingRectangle(ScrnInfoPtr pScrn,
+                                        int x1, int y1,
+                                        int x2, int y2);
+static void ImageDisableClipping(ScrnInfoPtr pScrn);
+static void ImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
+                                            int patternx,
+                                            int patterny,
+                                            int fg, int bg,
+                                            int rop,
+                                            unsigned int planemask);
+static void ImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
+                                                    int patternx,
+                                                    int patterny,
+                                                    int x, int y,
+                                                    int w, int h);
+#if 0
+static void ImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
+                                                int patternx,
+                                                int patterny,
+                                                int rop,
+                                                unsigned int planemask,
+                                                int trans_col);
+static void ImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
+                                                    int patternx,
+                                                    int patterny,
+                                                    int x, int y,
+                                                    int w, int h);
+#endif
+static void ImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn,
+                                            int rop,
+                                            unsigned int planemask,
+                                            int transparency_color,
+                                            int bpp,
+                                            int depth);
+static void ImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn,
+                                                    int x, int y,
+                                                    int w, int h,
+                                                    int skipleft);
+static void ImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn,
+                                                int bufno);
+static void ImageSetupForScanlineCPUToScreenColorExpandFill(
+                                            ScrnInfoPtr pScrn,
+                                            int fg, int bg,
+                                            int rop,
+                                            unsigned int planemask);
+static void ImageSubsequentScanlineCPUToScreenColorExpandFill(
+                                                    ScrnInfoPtr pScrn,
+                                                    int x, int y,
+                                                    int w, int h,
+                                                    int skipleft);
+static void ImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn,
+                                                int bufno);
+
+
+static void
+ImageInitializeAccelerator(ScrnInfoPtr pScrn)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    switch (pScrn->depth) {
+    case 8:
+        pTrident->EngineOperation = 0;
+        break;
+    case 15:
+        pTrident->EngineOperation = 5;
+        break;
+    case 16:
+        pTrident->EngineOperation = 1;
+        break;
+    case 24:
+        pTrident->EngineOperation = 2;
+        break;
+    }
+    IMAGE_OUT(0x2120, 0xF0000000);
+    IMAGE_OUT(0x2120, 0x40000000 | pTrident->EngineOperation);
+    IMAGE_OUT(0x2120, 0x80000000);
+    IMAGE_OUT(0x2144, 0x00000000);
+    IMAGE_OUT(0x2148, 0x00000000);
+    IMAGE_OUT(0x2150, 0x00000000);
+    IMAGE_OUT(0x2154, 0x00000000);
+    IMAGE_OUT(0x2120, 0x60000000 |
+                        (pScrn->displayWidth << 16) |
+                        pScrn->displayWidth);
+    IMAGE_OUT(0x216C, 0x00000000);
+    IMAGE_OUT(0x2170, 0x00000000);
+    IMAGE_OUT(0x217C, 0x00000000);
+    IMAGE_OUT(0x2120, 0x10000000);
+    IMAGE_OUT(0x2130, (2047 << 16) | 2047);
+    pTrident->Clipping = FALSE;
+    pTrident->DstEnable = FALSE;
+}
+#endif
+
+Bool
+ImageAccelInit(ScreenPtr pScreen)
+{
+#ifdef HAVE_XAA_H
+    XAAInfoRecPtr infoPtr;
+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    if (pTrident->NoAccel)
+        return FALSE;
+
+    pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
+    if (!infoPtr) return FALSE;
+
+    pTrident->InitializeAccelerator = ImageInitializeAccelerator;
+    ImageInitializeAccelerator(pScrn);
+
+    infoPtr->Flags = PIXMAP_CACHE |
+            LINEAR_FRAMEBUFFER |
+            OFFSCREEN_PIXMAPS;
+
+    infoPtr->Sync = ImageSync;
+
+#if 0
+    infoPtr->SetClippingRectangle = ImageSetClippingRectangle;
+    infoPtr->DisableClipping = ImageDisableClipping;
+    infoPtr->ClippingFlags = HARDWARE_CLIP_SOLID_FILL |
+                                HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY |
+                                HARDWARE_CLIP_MONO_8x8_FILL;
+#endif
+
+#if 0
+    infoPtr->SolidLineFlags = NO_PLANEMASK;
+    infoPtr->SetupForSolidLine = ImageSetupForSolidLine;
+    infoPtr->SolidBresenhamLineErrorTermBits = 13;
+    infoPtr->SubsequentSolidBresenhamLine =
+                                    ImageSubsequentSolidBresenhamLine;
+    infoPtr->ClippingFlags |= HARDWARE_CLIP_SOLID_LINE;
+#endif
+
+    infoPtr->SolidFillFlags = NO_PLANEMASK;
+    infoPtr->SetupForSolidFill = ImageSetupForFillRectSolid;
+    infoPtr->SubsequentSolidFillRect = ImageSubsequentFillRectSolid;
+
+    infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK |
+                                        NO_TRANSPARENCY |
+                                        ONLY_TWO_BITBLT_DIRECTIONS;
+
+    infoPtr->SetupForScreenToScreenCopy =
+                                    ImageSetupForScreenToScreenCopy;
+    infoPtr->SubsequentScreenToScreenCopy =
+                                    ImageSubsequentScreenToScreenCopy;
+
+    infoPtr->Mono8x8PatternFillFlags =  NO_PLANEMASK |
+                                    BIT_ORDER_IN_BYTE_MSBFIRST |
+                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
+                                    HARDWARE_PATTERN_PROGRAMMED_BITS;
+
+    infoPtr->SetupForMono8x8PatternFill =
+                                    ImageSetupForMono8x8PatternFill;
+    infoPtr->SubsequentMono8x8PatternFillRect =
+                                ImageSubsequentMono8x8PatternFillRect;
+
+#if 0
+    infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
+                                    NO_TRANSPARENCY |
+                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
+                                    BIT_ORDER_IN_BYTE_MSBFIRST;
+
+    infoPtr->SetupForColor8x8PatternFill =
+                                    ImageSetupForColor8x8PatternFill;
+    infoPtr->SubsequentColor8x8PatternFillRect =
+                            ImageSubsequentColor8x8PatternFillRect;
+    infoPtr->ClippingFlags |= HARDWARE_CLIP_COLOR_8x8_FILL;
+#endif
+
+    if (pTrident->Chipset != CYBER9397DVD) {
+        /*
+         * It seems as though the 9397DVD doesn't like the transfer
+         * window.  But then, I've also tried at the two port
+         * addresses too, with no luck.  Disable for this chipset for
+         * now. I'd guess there's some extra setup needed for this
+         * chipset.
+         */
+        infoPtr->ScanlineCPUToScreenColorExpandFillFlags =
+                                            NO_PLANEMASK |
+                                            LEFT_EDGE_CLIPPING |
+                                            BIT_ORDER_IN_BYTE_MSBFIRST;
+
+        pTrident->XAAScanlineColorExpandBuffers[0] =
+                            xnfalloc(((pScrn->virtualX + 63)) * 4 *
+                                        (pScrn->bitsPerPixel / 8));
+
+        infoPtr->NumScanlineColorExpandBuffers = 1;
+        infoPtr->ScanlineColorExpandBuffers =
+                            pTrident->XAAScanlineColorExpandBuffers;
+
+        infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
+                    ImageSetupForScanlineCPUToScreenColorExpandFill;
+        infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
+                    ImageSubsequentScanlineCPUToScreenColorExpandFill;
+        infoPtr->SubsequentColorExpandScanline =
+                                ImageSubsequentColorExpandScanline;
+
+        infoPtr->ScanlineImageWriteFlags = NO_PLANEMASK |
+                                                LEFT_EDGE_CLIPPING;
+
+        infoPtr->SetupForScanlineImageWrite =
+                                    ImageSetupForScanlineImageWrite;
+        infoPtr->SubsequentScanlineImageWriteRect =
+                ImageSubsequentScanlineImageWriteRect;
+        infoPtr->SubsequentImageWriteScanline =
+                                    ImageSubsequentImageWriteScanline;
+
+        infoPtr->NumScanlineImageWriteBuffers = 1;
+        infoPtr->ScanlineImageWriteBuffers =
+                                    pTrident->XAAImageScanlineBuffer;
+
+        pTrident->XAAImageScanlineBuffer[0] =
+                xnfalloc(pScrn->virtualX * pScrn->bitsPerPixel / 8);
+
+        infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000;
+    }
+
+    return(XAAInit(pScreen, infoPtr));
+#else
+    return FALSE;
+#endif
+}
+
+#ifdef HAVE_XAA_H
+static void
+ImageSync(ScrnInfoPtr pScrn)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    int busy;
+    int cnt = 5000000;
+
+    if (pTrident->Clipping) ImageDisableClipping(pScrn);
+    if (pTrident->DstEnable) {
+        IMAGE_OUT(0x2120, 0x70000000);
+        pTrident->DstEnable = FALSE;
+    }
+
+    IMAGEBUSY(busy);
+    while (busy != 0) {
+        if (--cnt < 0) {
+            ErrorF("GE timeout\n");
+            IMAGE_OUT(0x2164, 0x80000000);
+        }
+
+        IMAGEBUSY(busy);
+    }
+}
+
+static void
+ImageSyncClip(ScrnInfoPtr pScrn)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    int busy;
+    int cnt = 5000000;
+
+    IMAGEBUSY(busy);
+    while (busy != 0) {
+        if (--cnt < 0) {
+            ErrorF("GE timeout\n");
+            IMAGE_OUT(0x2164, 0x80000000);
+        }
+
+        IMAGEBUSY(busy);
+    }
+}
+
+static void
+ImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
+                                int xdir, int ydir,
+                                int rop,
+                                unsigned int planemask,
+                                int transparency_color)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    pTrident->BltScanDirection = 0;
+    if ((xdir < 0) || (ydir < 0))
+        pTrident->BltScanDirection |= (1 << 2);
+
+    IMAGE_OUT(0x2120, 0x80000000);
+    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
+
+    if (transparency_color != -1) {
+        IMAGE_OUT(0x2120, 0x70000000 |
+                            (1 << 26) |
+                            (transparency_color & 0xffffff));
+        pTrident->DstEnable = TRUE;
+    }
+}
+
+static void
+ImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
+                                    int x1, int y1,
+                                    int x2, int y2,
+                                    int w, int h)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    if (pTrident->BltScanDirection) {
+        IMAGE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1));
+        IMAGE_OUT(0x2104, (y1 << 16) | x1);
+        IMAGE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1));
+        IMAGE_OUT(0x210C, y2<<16 | x2);
+    } else {
+        IMAGE_OUT(0x2100, (y1 << 16) | x1);
+        IMAGE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1));
+        IMAGE_OUT(0x2108, (y2 << 16) | x2);
+        IMAGE_OUT(0x210C, ((y2 + h - 1) << 16) | (x2 + w - 1));
+    }
+
+    IMAGE_OUT(0x2124, 0x80000000 |
+                        (1 << 7) | (1 << 22) | (1 << 10) |
+                        pTrident->BltScanDirection |
+                        (pTrident->Clipping ? 1 : 0));
+
+    if (!pTrident->UsePCIRetry)
+        ImageSyncClip(pScrn);
+}
+
+static void
+ImageSetClippingRectangle(ScrnInfoPtr pScrn,
+                            int x1, int y1,
+                            int x2, int y2)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    IMAGE_OUT(0x2120, 0x10000000 |
+                        ((y1 & 0xfff) << 16) | (x1 & 0xfff));
+    IMAGE_OUT(0x2130, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
+    pTrident->Clipping = TRUE;
+}
+
+static void
+ImageDisableClipping(ScrnInfoPtr pScrn)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    pTrident->Clipping = FALSE;
+}
+
+#if 0
+static void
+ImageSetupForSolidLine(ScrnInfoPtr pScrn,
+                        int color,
+                        int rop,
+                        unsigned int planemask)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    REPLICATE(color);
+    IMAGE_OUT(0x2120, 0x84000000);
+    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
+    IMAGE_OUT(0x2144, color);
+}
+
+static void
+ImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
+                                    int x, int y,
+                                    int dmaj, int dmin,
+                                    int e, int len, int octant)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    int tmp;
+    int D = 0, E = 0, ymajor = 0;
+
+    IMAGE_OUT(0x2124, 0x20000000 |
+                        (3 << 22) | (1 << 10) | (1 << 9) |
+                        (pTrident->Clipping ? 1 : 0));
+    if (!(octant & YMAJOR)) {
+        if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
+            E = 1;
+            D = 0;
+        }
+
+        if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
+            E = 1;
+            D = 1;
+        }
+
+        if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
+            E = 1;
+            D = 2;
+        }
+        if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
+            E = 1;
+            D = 3;
+        }
+
+        ymajor = 0;
+    } else {
+        if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
+            E = 0;
+            D = 0;
+        }
+
+        if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
+            E = 0;
+            D = 2;
+        }
+
+        if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
+            E = 0;
+            D = 1;
+        }
+
+        if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
+            E = 0;
+            D = 3;
+        }
+
+        ymajor = (1 << 18);
+    }
+
+    if (E) {
+        tmp = x;
+        x = y;
+        y = tmp;
+    }
+    if (D & 0x02) {
+        IMAGE_OUT(0x21FC, 0x20000000 |
+                            (1 << 27) | (1 << 19) | (1 << 17) |
+                            ymajor | (x + len - 1));
+    } else {
+        IMAGE_OUT(0x21FC, 0x20000000 |
+                            (1 << 27) | (1 << 19) | (1 << 17) |
+                            ymajor | ( y + len - 1));
+    }
+    IMAGE_OUT(0x2100, (E << 30) | ((y & 0xfff) << 16) | (x & 0xfff));
+    IMAGE_OUT(0x2104, (D << 30) |
+                        (((dmaj - dmin) & 0xfff) << 16) |
+                        (-dmin & 0xfff));
+    IMAGE_OUT(0x2108, ((-e & 0xfff) << 16));
+
+    if (!pTrident->UsePCIRetry)
+        ImageSyncClip(pScrn);
+}
+#endif
+
+static void
+ImageSetupForFillRectSolid(ScrnInfoPtr pScrn,
+                            int color,
+                            int rop,
+                            unsigned int planemask)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    REPLICATE(color);
+    IMAGE_OUT(0x2120, 0x80000000);
+    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
+    IMAGE_OUT(0x2144, color);
+}
+
+static void
+ImageSubsequentFillRectSolid(ScrnInfoPtr pScrn,
+                                int x, int y,
+                                int w, int h)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    if ((w <= 0) || (h <= 0))
+        return;
+
+    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
+    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+    IMAGE_OUT(0x2124, 0x80000000 |
+                        (3 << 22) | (1 << 10) | (1 << 9) |
+                        (pTrident->Clipping ? 1 : 0));
+    if (!pTrident->UsePCIRetry)
+        ImageSyncClip(pScrn);
+}
+
+static void
+MoveDWORDS(register CARD32* dest,
+            register CARD32* src,
+            register int dwords )
+{
+    Bool extra = FALSE;
+
+    if (dwords & 0x01) extra = TRUE;
+
+    while(dwords & ~0x03) {
+        *dest = *src;
+        *(dest + 1) = *(src + 1);
+        *(dest + 2) = *(src + 2);
+        *(dest + 3) = *(src + 3);
+        src += 4;
+        dest += 4;
+        dwords -= 4;
+    }
+
+    if(!dwords) {
+        if (extra) *dest = 0x00000000;
+        return;
+    }
+
+    *dest = *src;
+    if(dwords == 1) {
+        if (extra) *(dest + 1) = 0x00000000;
+        return;
+    }
+
+    *(dest + 1) = *(src + 1);
+    if(dwords == 2) {
+        if (extra) *(dest + 2) = 0x00000000;
+        return;
+    }
+
+    *(dest + 2) = *(src + 2);
+    if (extra) *(dest + 3) = 0x00000000;
+}
+
+static void
+ImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
+                                int patternx, int patterny,
+                                int fg, int bg,
+                                int rop,
+                                unsigned int planemask)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop));
+    if (bg == -1) {
+        REPLICATE(fg);
+        IMAGE_OUT(0x2120, 0x80000000 | (1 << 27));
+        IMAGE_OUT(0x2130, patternx);
+        IMAGE_OUT(0x2134, patterny);
+        IMAGE_OUT(0x2150, fg);
+        IMAGE_OUT(0x2154, ~fg);
+    } else {
+        REPLICATE(bg);
+        REPLICATE(fg);
+        IMAGE_OUT(0x2120, 0x80000000 | (1 << 27) | (1 << 26));
+        IMAGE_OUT(0x2130, patternx);
+        IMAGE_OUT(0x2134, patterny);
+        IMAGE_OUT(0x2150, fg);
+        IMAGE_OUT(0x2154, bg);
+    }
+}
+
+static void
+ImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
+                                        int patternx, int patterny,
+                                        int x, int y,
+                                        int w, int h)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
+    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+    IMAGE_OUT(0x2124, 0x80000000 |
+                        (7 << 18) | (1 << 22) | (1 << 10) | (1 << 9) |
+                        (pTrident->Clipping ? 1 : 0));
+    if (!pTrident->UsePCIRetry)
+        ImageSyncClip(pScrn);
+}
+
+#if 0
+static void
+ImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
+                                    int patternx, int patterny,
+                                    int rop,
+                                    unsigned int planemask,
+                                    int transparency_color)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop));
+    IMAGE_OUT(0x2120, 0x80000000 | (1 << 26));
+    if (transparency_color != -1) {
+        IMAGE_OUT(0x2120, 0x70000000 |
+                            (1 << 26) |
+                            (transparency_color & 0xffffff));
+        pTrident->DstEnable = TRUE;
+    }
+}
+
+static void
+ImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
+                                        int patternx, int patterny,
+                                        int x, int y,
+                                        int w, int h)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    IMAGE_OUT(0x2100, ((patterny & 0xfff) << 16) |
+                        (patternx & 0xfff));
+    IMAGE_OUT(0x2104, (((patterny + h - 1) & 0xfff) << 16) |
+                        ((patternx + w - 1) & 0xfff));
+    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
+    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+    IMAGE_OUT(0x2124, 0x80000000 |
+                        (1 << 22) | (1 << 10) | (1 << 7) |
+                        (pTrident->Clipping ? 1 : 0));
+    if (!pTrident->UsePCIRetry)
+        ImageSyncClip(pScrn);
+}
+#endif
+
+static void
+ImageSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
+                                                int fg, int bg,
+                                                int rop,
+                                                unsigned int planemask
+){
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    IMAGE_OUT(0x2120, 0x80000000);
+    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
+    if (bg == -1) {
+        pTrident->ROP = (2 << 22);
+        REPLICATE(fg);
+        IMAGE_OUT(0x2144, fg);
+        IMAGE_OUT(0x2148, ~fg);
+    } else {
+        pTrident->ROP = (3 << 22);
+        REPLICATE(fg);
+        IMAGE_OUT(0x2144, fg);
+        REPLICATE(bg);
+        IMAGE_OUT(0x2148, bg);
+    }
+}
+
+static void
+ImageSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
+                                                    int x, int y,
+                                                    int w, int h,
+                                                    int skipleft
+){
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    ImageSetClippingRectangle(pScrn,(x + skipleft), y,
+                                (x + w - 1), (y + h - 1));
+    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
+    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+    IMAGE_OUT(0x2124, 0x80000000 | (pTrident->ROP) | (1 << 10) | 1);
+    pTrident->dwords = (w + 31) >> 5;
+    pTrident->h = h;
+}
+
+static void
+ImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    XAAInfoRecPtr infoRec;
+    infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
+
+    MoveDWORDS((CARD32*)infoRec->ImageWriteBase,
+            (CARD32*)pTrident->XAAScanlineColorExpandBuffers[bufno],
+            pTrident->dwords);
+
+    pTrident->h--;
+    if (!pTrident->h)
+        ImageSync(pScrn);
+}
+
+static void
+ImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn,
+                                int rop,
+                                unsigned int planemask,
+                                int transparency_color,
+                                int bpp, int depth)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
+    if (transparency_color != -1) {
+        IMAGE_OUT(0x2120, 0x70000000 |
+                            (1 << 26) |
+                            (transparency_color & 0xffffff));
+        pTrident->DstEnable = TRUE;
+    }
+
+    IMAGE_OUT(0x2120, 0x80000000);
+}
+
+static void
+ImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn,
+                                        int x, int y,
+                                        int w, int h,
+                                        int skipleft)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    ImageSetClippingRectangle(pScrn,
+                                (x + skipleft), y,
+                                (x + w - 1), (y + h - 1));
+    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
+    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+    IMAGE_OUT(0x2124, 0x80000000 |
+                        (1 << 22) | (1 << 10) | 1);
+    pTrident->dwords = ((w * (pScrn->bitsPerPixel / 8)) + 3) >> 2;
+    pTrident->h = h;
+}
+
+
+static void
+ImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    XAAInfoRecPtr infoRec;
+    infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
+
+    MoveDWORDS((CARD32*)infoRec->ImageWriteBase,
+                (CARD32*)pTrident->XAAImageScanlineBuffer[bufno],
+                pTrident->dwords);
+
+    pTrident->h--;
+    if (!pTrident->h)
+        ImageSync(pScrn);
+}
+#endif