[xf86-video-trident,3/3] Rename blade_accel.c to blade_xaa.c

Submitted by Kevin Brace on Feb. 21, 2019, 7:55 p.m.

Details

Message ID 1550778950-4828-4-git-send-email-kevinbrace@gmx.com
State New
Headers show
Series "Convert blade_accel.c to blade_xaa.c" ( rev: 1 ) in X.org

Not browsing as part of any series.

Commit Message

Kevin Brace Feb. 21, 2019, 7:55 p.m.
Signed-off-by: Kevin Brace <kevinbrace@gmx.com>
---
 src/Makefile.am   |   2 +-
 src/blade_accel.c | 863 ------------------------------------------------------
 src/blade_xaa.c   | 863 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 864 insertions(+), 864 deletions(-)
 delete mode 100644 src/blade_accel.c
 create mode 100644 src/blade_xaa.c

Patch hide | download patch | download mbox

diff --git a/src/Makefile.am b/src/Makefile.am
index f2dc14c..d04dce8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -30,8 +30,8 @@  trident_drv_la_LIBADD = -lm
 trident_drv_ladir = @moduledir@/drivers
 
 trident_drv_la_SOURCES = \
-         blade_accel.c \
          blade_accel_exa.c \
+         blade_xaa.c \
          compat-api.h \
          image_xaa.c \
          tgui_xaa.c \
diff --git a/src/blade_accel.c b/src/blade_accel.c
deleted file mode 100644
index 128913f..0000000
--- a/src/blade_accel.c
+++ /dev/null
@@ -1,863 +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 Blade3D 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 BladeSync(ScrnInfoPtr pScrn);
-#if 0
-static void BladeSetupForSolidLine(ScrnInfoPtr pScrn,
-                                    int color,
-                                    int rop,
-                                    unsigned int planemask);
-static void BladeSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
-                                                int x, int y,
-                                                int dmaj, int dmin,
-                                                int e, int len,
-                                                int octant);
-static void BladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
-                                                int x1, int y1,
-                                                int x2, int y2,
-                                                int flags);
-static void BladeSetupForDashedLine(ScrnInfoPtr pScrn,
-                                    int fg, int bg,
-                                    int rop,
-                                    unsigned int planemask,
-                                    int length,
-                                    unsigned char *pattern);
-static void BladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
-                                                int x1, int y1,
-                                                int x2, int y2,
-                                                int flags, int phase);
-#endif
-static void BladeSetupForFillRectSolid(ScrnInfoPtr pScrn,
-                                        int color,
-                                        int rop,
-                                        unsigned int planemask);
-static void BladeSubsequentFillRectSolid(ScrnInfoPtr pScrn,
-                                            int x, int y,
-                                            int w, int h);
-static void BladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
-                                                int x1, int y1,
-                                                int x2, int y2,
-                                                int w, int h);
-static void BladeSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
-                                            int xdir, int ydir,
-                                            int rop,
-                                            unsigned int planemask,
-                                            int transparency_color);
-#if 0
-static void BladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
-                                            int fg, int bg,
-                                            int rop,
-                                            unsigned int planemask);
-static void BladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
-                                                    int x, int y,
-                                                    int w, int h,
-                                                    int srcx, int srcy,
-                                                    int offset);
-#endif
-static void BladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
-                                            int fg, int bg,
-                                            int rop,
-                                            unsigned int planemask);
-static void BladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
-                                                    int x, int y,
-                                                    int w, int h,
-                                                    int skipleft);
-static void BladeSetClippingRectangle(ScrnInfoPtr pScrn,
-                                        int x1, int y1,
-                                        int x2, int y2);
-static void BladeDisableClipping(ScrnInfoPtr pScrn);
-static void BladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
-                                            int patternx,
-                                            int patterny,
-                                            int fg, int bg,
-                                            int rop,
-                                            unsigned int planemask);
-static void BladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
-                                                    int patternx,
-                                                    int patterny,
-                                                    int x, int y,
-                                                    int w, int h);
-#if 0
-static void BladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
-                                                int patternx,
-                                                int patterny,
-                                                int rop,
-                                                unsigned int planemask,
-                                                int trans_col);
-static void BladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
-                                                    int patternx,
-                                                    int patterny,
-                                                    int x, int y,
-                                                    int w, int h);
-#endif
-static void BladeSetupForImageWrite(ScrnInfoPtr pScrn,
-                                    int rop,
-                                    unsigned int planemask,
-                                    int transparency_color,
-                                    int bpp, int depth);
-static void BladeSubsequentImageWriteRect(ScrnInfoPtr pScrn,
-                                            int x, int y,
-                                            int w, int h,
-                                            int skipleft);
-
-static void
-BladeInitializeAccelerator(ScrnInfoPtr pScrn)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    CARD32 stride;
-
-    stride = (pScrn->displayWidth >> 3) << 20;
-
-    BLADE_OUT(0x21C8, stride);
-    BLADE_OUT(0x21CC, stride);
-    BLADE_OUT(0x21D0, stride);
-    BLADE_OUT(0x21D4, stride);
-    switch (pScrn->depth) {
-        case 8:
-        stride |= (0 << 29);
-        break;
-        case 15:
-        stride |= (5 << 29);
-        break;
-        case 16:
-        stride |= (1 << 29);
-        break;
-        case 24:
-        stride |= (2 << 29);
-        break;
-    }
-
-    BLADE_OUT(0x21B8, 0);
-    BLADE_OUT(0x21B8, stride);
-    BLADE_OUT(0x21BC, stride);
-    BLADE_OUT(0x21C0, stride);
-    BLADE_OUT(0x21C4, stride);
-#if 0
-    /* It appears that the driver sometimes misdetects the RAM type, so we
-     * don't force this for now */
-    if (pTrident->HasSGRAM)
-        BLADE_OUT(0x2168, 1 << 26); /* Enables Block Write if available (SGRAM) */
-    else
-        BLADE_OUT(0x2168, 0);
-#endif
-    BLADE_OUT(0x216C, 0);
-}
-#endif
-
-Bool BladeXaaInit(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 = BladeInitializeAccelerator;
-    BladeInitializeAccelerator(pScrn);
-
-    infoPtr->Flags = PIXMAP_CACHE |
-                        LINEAR_FRAMEBUFFER |
-                        OFFSCREEN_PIXMAPS;
-
-    infoPtr->Sync = BladeSync;
-
-    infoPtr->SetClippingRectangle = BladeSetClippingRectangle;
-    infoPtr->DisableClipping = BladeDisableClipping;
-
-#if 0
-    infoPtr->SolidLineFlags = 0;
-    infoPtr->SetupForSolidLine = BladeSetupForSolidLine;
-    infoPtr->SubsequentSolidTwoPointLine =
-                                    BladeSubsequentSolidTwoPointLine;
-    infoPtr->SetupForDashedLine = BladeSetupForDashedLine;
-    infoPtr->SubsequentDashedTwoPointLine =
-                                    BladeSubsequentDashedTwoPointLine;
-    infoPtr->DashPatternMaxLength = 16;
-    infoPtr->DashedLineFlags = LINE_PATTERN_LSBFIRST_LSBJUSTIFIED |
-                                LINE_PATTERN_POWER_OF_2_ONLY;
-#endif
-
-    infoPtr->SolidFillFlags = NO_PLANEMASK;
-    infoPtr->SetupForSolidFill = BladeSetupForFillRectSolid;
-    infoPtr->SubsequentSolidFillRect = BladeSubsequentFillRectSolid;
-
-    infoPtr->ScreenToScreenCopyFlags = ONLY_TWO_BITBLT_DIRECTIONS |
-                                        NO_PLANEMASK |
-                                        NO_TRANSPARENCY;
-
-    infoPtr->SetupForScreenToScreenCopy =
-                                    BladeSetupForScreenToScreenCopy;
-    infoPtr->SubsequentScreenToScreenCopy =
-                                    BladeSubsequentScreenToScreenCopy;
-
-    infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
-                                    NO_TRANSPARENCY |
-                                    BIT_ORDER_IN_BYTE_MSBFIRST |
-                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
-                                    HARDWARE_PATTERN_PROGRAMMED_BITS;
-
-    infoPtr->SetupForMono8x8PatternFill =
-                                    BladeSetupForMono8x8PatternFill;
-    infoPtr->SubsequentMono8x8PatternFillRect =
-                                BladeSubsequentMono8x8PatternFillRect;
-
-#if 0
-    infoPtr->Color8x8PatternFillFlags =
-                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
-                                    BIT_ORDER_IN_BYTE_MSBFIRST;
-
-    infoPtr->SetupForColor8x8PatternFill =
-                                TridentSetupForColor8x8PatternFill;
-    infoPtr->SubsequentColor8x8PatternFillRect =
-                            TridentSubsequentColor8x8PatternFillRect;
-
-    infoPtr->ScreenToScreenColorExpandFillFlags = 0;
-
-    infoPtr->SetupForScreenToScreenColorExpandFill =
-                            BladeSetupForScreenToScreenColorExpand;
-    infoPtr->SubsequentScreenToScreenColorExpandFill =
-                            BladeSubsequentScreenToScreenColorExpand;
-#endif
-
-    infoPtr->CPUToScreenColorExpandFillFlags =
-                                        CPU_TRANSFER_PAD_DWORD |
-                                        LEFT_EDGE_CLIPPING |
-                                        SYNC_AFTER_COLOR_EXPAND |
-                                        NO_PLANEMASK |
-                                        BIT_ORDER_IN_BYTE_MSBFIRST |
-                                        SCANLINE_PAD_DWORD;
-    infoPtr->ColorExpandRange = 0x10000;
-    infoPtr->ColorExpandBase = pTrident->IOBase + 0x10000;
-    infoPtr->SetupForCPUToScreenColorExpandFill =
-                                BladeSetupForCPUToScreenColorExpand;
-    infoPtr->SubsequentCPUToScreenColorExpandFill =
-                                BladeSubsequentCPUToScreenColorExpand;
-
-    infoPtr->SetupForImageWrite = BladeSetupForImageWrite;
-    infoPtr->SubsequentImageWriteRect =
-                                        BladeSubsequentImageWriteRect;
-    infoPtr->ImageWriteFlags = NO_PLANEMASK |
-                                LEFT_EDGE_CLIPPING |
-                                CPU_TRANSFER_PAD_DWORD |
-                                SYNC_AFTER_IMAGE_WRITE;
-    infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000;
-    infoPtr->ImageWriteRange = 0x10000;
-
-    return(XAAInit(pScreen, infoPtr));
-#else
-    return FALSE;
-#endif
-}
-
-#ifdef HAVE_XAA_H
-static void
-BladeSync(ScrnInfoPtr pScrn)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    int busy;
-    int cnt = 10000000;
-
-    if (pTrident->Clipping) BladeDisableClipping(pScrn);
-    BLADE_OUT(0x216C, 0);
-
-    BLADEBUSY(busy);
-    while (busy != 0) {
-        if (--cnt < 0) {
-            ErrorF("GE timeout\n");
-            BLADE_OUT(0x2124, 1 << 7);
-            BLADE_OUT(0x2124, 0);
-            break;
-        }
-
-        BLADEBUSY(busy);
-    }
-}
-
-static void
-BladeSetupForScreenToScreenCopy(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 << 1);
-
-#if 0
-    if (transparency_color != -1) {
-        BLADE_OUT(0x2168, transparency_color & 0xffffff);
-        pTrident->BltScanDirection |= (1 << 6);
-    }
-
-    REPLICATE(planemask);
-    if (planemask != (unsigned int)-1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-
-#endif
-    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
-}
-
-static void
-BladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
-                                    int x1, int y1,
-                                    int x2, int y2,
-                                    int w, int h)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    int clip = 0;
-
-    if (pTrident->Clipping) clip = 1;
-
-    BLADE_OUT(0x2144, 0xE0000000 |
-                        (1 << 19) | (1 << 4) | (1 << 2) |
-                        pTrident->BltScanDirection | clip);
-
-    if (pTrident->BltScanDirection) {
-        BLADE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1));
-        BLADE_OUT(0x2104, (y1 << 16) | x1);
-        BLADE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1));
-        BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
-    } else {
-        BLADE_OUT(0x2100, (y1 << 16) | x1);
-        BLADE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1));
-        BLADE_OUT(0x2108, (y2 << 16) | x2);
-        BLADE_OUT(0x210C, (((y2 + h - 1) & 0xfff) << 16) |
-                            ((x2 + w - 1) & 0xfff));
-    }
-}
-
-static void
-BladeSetClippingRectangle(ScrnInfoPtr pScrn,
-                            int x1, int y1,
-                            int x2, int y2)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    BLADE_OUT(0x2154, ((y1 & 0x0fff) << 16) | (x1 & 0x0fff));
-    BLADE_OUT(0x2158, ((y2 & 0x0fff) << 16) | (x2 & 0x0fff));
-    pTrident->Clipping = TRUE;
-}
-
-static void
-BladeDisableClipping(ScrnInfoPtr pScrn)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    pTrident->Clipping = FALSE;
-}
-
-#if 0
-static void
-BladeSetupForSolidLine(ScrnInfoPtr pScrn,
-                        int color,
-                        int rop,
-                        unsigned int planemask)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    REPLICATE(color);
-    BLADE_OUT(0x2160, color);
-    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
-    pTrident->BltScanDirection = 0;
-    REPLICATE(planemask);
-    if (planemask != -1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-}
-
-static void
-BladeSubsequentSolidBresenhamLine(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;
-
-    BLADE_OUT(0x2144, 0x20000000 |
-                        (3 << 19) | (1 << 4) | (2 << 2) |
-                        (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 << 21;
-    }
-
-    if (E) {
-        tmp = x; x = y; y = tmp;
-    }
-
-    BLADE_OUT(0x2130, 0x00000001);
-    if (D & 0x02) {
-        BLADE_OUT(0x213C, 0x10000000 |
-                            (1 << 25) | (1 << 19) | (1 << 17) |
-                            ymajor | ((x + len - 1) << 4));
-    } else {
-        BLADE_OUT(0x213C, 0x10000000 |
-                            (1 << 25) | (1 << 19) | (1 << 17) |
-                            ymajor | ((y + len - 1) << 4));
-    }
-
-    BLADE_OUT(0x2140, (E << 30) |
-                        ((y & 0xfff) << 20) | ((x & 0xfff) << 4));
-    BLADE_OUT(0x2144, (D << 30) |
-                        (((dmaj - dmin) & 0xfff) << 16) |
-                        (-dmin & 0xfff));
-    BLADE_OUT(0x2148, ((-(dmin + e) & 0xfff) << 16));
-}
-
-static void
-BladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
-                                    int x1, int y1,
-                                    int x2, int y2,
-                                    int flags)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-#if 0
-    if (flags & OMIT_LAST)
-        BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1);
-#endif
-
-    BLADE_OUT(0x2144, 0x20000000 |
-                        pTrident->BltScanDirection |
-                        (1 << 19) | (1 << 4) | (2 << 2));
-    BLADE_OUT(0x2130, 0x3);
-    BLADE_OUT(0x2108, (y1 << 16) | x1);
-    BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
-
-#if 0
-    if (flags & OMIT_LAST)
-    BladeDisableClipping(pScrn);
-#endif
-}
-
-static void
-BladeSetupForDashedLine(ScrnInfoPtr pScrn,
-                        int fg, int bg,
-                        int rop,
-                        unsigned int planemask,
-                        int length,
-                        unsigned char *pattern)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    pTrident->LinePattern = *((CARD16 *)pattern) & ((1 << length) - 1);
-    switch (length) {
-        case 2:
-        pTrident->LinePattern = pTrident->LinePattern |
-                                (pTrident->LinePattern << 2);
-        case 4:
-        pTrident->LinePattern = pTrident->LinePattern |
-                                (pTrident->LinePattern << 4);
-        case 8:
-        pTrident->LinePattern = pTrident->LinePattern |
-                                (pTrident->LinePattern << 8);
-    }
-
-    REPLICATE(fg);
-    REPLICATE(bg);
-    BLADE_OUT(0x2160, fg);
-    BLADE_OUT(0x2164, bg);
-    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
-    pTrident->BltScanDirection = 0;
-    REPLICATE(planemask);
-    if (planemask != -1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-}
-
-static void
-BladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
-                                    int x1, int y1,
-                                    int x2, int y2,
-                                    int flags, int phase)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    if (flags & OMIT_LAST)
-        BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1);
-
-    BLADE_OUT(0x216C, (pTrident->LinePattern >> phase) |
-                        (pTrident->LinePattern << (16 - phase)));
-    BLADE_OUT(0x2144, 0x20000000 |
-                        pTrident->BltScanDirection |
-                        (1 << 27) | (1 << 19) | (1 << 4) | (2 << 2));
-    BLADE_OUT(0x2108, (y1 << 16) | x1);
-    BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
-
-    if (flags & OMIT_LAST)
-        BladeDisableClipping(pScrn);
-}
-#endif
-
-static void
-BladeSetupForFillRectSolid(ScrnInfoPtr pScrn,
-                            int color,
-                            int rop,
-                            unsigned int planemask)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    REPLICATE(color);
-    BLADE_OUT(0x2160, color);
-    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
-    pTrident->BltScanDirection = 0;
-#if 0
-    REPLICATE(planemask);
-    if (planemask != -1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-#endif
-}
-
-static void
-BladeSubsequentFillRectSolid(ScrnInfoPtr pScrn,
-                                int x, int y,
-                                int w, int h)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    BLADE_OUT(0x2144, 0x20000000 |
-                        pTrident->BltScanDirection |
-                        (1 << 19) | (1 << 4) | (2 << 2) |
-                        (pTrident->Clipping ? 1 : 0));
-    BLADE_OUT(0x2108, (y << 16) | x);
-    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-}
-
-#if 0
-static void
-BladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
-                                        int fg, int bg,
-                                        int rop,
-                                        unsigned int planemask)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    pTrident->ROP = rop;
-
-    REPLICATE(bg);
-    REPLICATE(fg);
-    IMAGE_OUT(0x44, fg);
-    IMAGE_OUT(0x48, bg);
-    IMAGE_OUT(0x20, 0x90000000 | XAAGetCopyROP(rop));
-    pTrident->BltScanDirection = 0;
-    REPLICATE(planemask);
-    if (planemask != -1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-}
-
-static void
-BladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
-                                            int x, int y,
-                                            int w, int h,
-                                            int srcx, int srcy,
-                                            int offset)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    IMAGE_OUT(0x00, (srcy << 16) | srcx);
-    IMAGE_OUT(0x04, ((srcy + h - 1) << 16) | (srcx + w - 1));
-    IMAGE_OUT(0x08, (y << 16) | x);
-    IMAGE_OUT(0x0C, ((y + h - 1) << 16) | (x + w - 1));
-
-    IMAGE_OUT(0x24, 0x80000000 |
-                    (3 << 22) | (1 << 7) |
-                    pTrident->BltScanDirection |
-                    (pTrident->ROP == GXcopy ? 0 : (1 << 10)) |
-                    (offset << 25));
-}
-#endif
-
-static void
-BladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
-                                    int fg, int bg,
-                                    int rop,
-                                    unsigned int planemask)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    pTrident->BltScanDirection = 0;
-    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
-    if (bg == -1) {
-        pTrident->BltScanDirection |= (2 << 19);
-        REPLICATE(fg);
-        BLADE_OUT(0x2160, fg);
-        BLADE_OUT(0x2164, ~fg);
-    } else {
-        pTrident->BltScanDirection |= (3 << 19);
-        REPLICATE(fg);
-        REPLICATE(bg);
-        BLADE_OUT(0x2160, fg);
-        BLADE_OUT(0x2164, bg);
-    }
-
-#if 0
-    REPLICATE(planemask);
-    if (planemask != -1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-#endif
-}
-
-static void
-BladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
-                                        int x, int y,
-                                        int w, int h,
-                                        int skipleft)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    if (skipleft)
-        BladeSetClippingRectangle(pScrn,
-                                    x + skipleft, y,
-                                    (x + w - 1), (y + h - 1));
-    BLADE_OUT(0x2144, 0xE0000000 |
-                        pTrident->BltScanDirection |
-                        (1 << 4) |
-                        (skipleft ? 1 : 0));
-    BLADE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
-    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-}
-
-static void
-BladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
-                                int patternx, int patterny,
-                                int fg, int bg,
-                                int rop,
-                                unsigned int planemask)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    BladeSync(pScrn);
-    BLADE_OUT(0x2148, XAAGetPatternROP(rop));
-
-    if (bg == -1) {
-        REPLICATE(fg);
-        BLADE_OUT(0x216C, 0x80000000 | (1 << 30));
-        BLADE_OUT(0x216C, 0x80000000 | (1 << 28) | (1 << 30));
-        BLADE_OUT(0x2170, patternx);
-        BLADE_OUT(0x2170, patterny);
-        BLADE_OUT(0x2174, fg);
-#if 0
-        BLADE_OUT(0x2178, ~fg);
-#endif
-    } else {
-        REPLICATE(fg);
-        REPLICATE(bg);
-        BLADE_OUT(0x216C, 0x80000000);
-        BLADE_OUT(0x216C, 0x80000000 | (1 << 28));
-        BLADE_OUT(0x2170, patternx);
-        BLADE_OUT(0x2170, patterny);
-        BLADE_OUT(0x2174, fg);
-        BLADE_OUT(0x2178, bg);
-    }
-
-    pTrident->BltScanDirection = 0;
-#if 0
-    REPLICATE(planemask);
-    if (planemask != -1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-#endif
-}
-
-static void
-BladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
-                                        int patternx, int patterny,
-                                        int x, int y,
-                                        int w, int h)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-    int clip = 0;
-
-    if (pTrident->Clipping) clip = 1;
-    BLADE_OUT(0x2144, 0x20000000 |
-                        pTrident->BltScanDirection |
-                        (7 << 12) | (1 << 4) |
-                        (1 << 19) | (2 << 2) | clip);
-    BLADE_OUT(0x2108, (y << 16) | x);
-    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-}
-
-#if 0
-static void
-BladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
-                                    int patternx, int patterny,
-                                    int rop,
-                                    unsigned int planemask,
-                                    int transparency_color)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    TGUI_PATLOC(((patterny *
-                        pScrn->displayWidth *
-                        (pScrn->bitsPerPixel / 8)) +
-                    (patternx *
-                        (pScrn->bitsPerPixel / 8))) >> 6);
-    pTrident->BltScanDirection = 0;
-    if (transparency_color != -1) {
-        BLADE_OUT(0x2168, transparency_color & 0xffffff);
-        pTrident->BltScanDirection |= (1 << 6);
-    }
-    TGUI_FMIX(XAAGetPatternROP(rop));
-    REPLICATE(planemask);
-    if (planemask != -1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-}
-
-static void
-BladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
-                                        int patternx, int patterny,
-                                        int x, int y,
-                                        int w, int h)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    TGUI_DEST_XY(x, y);
-    TGUI_DIM_XY(w, h);
-    TGUI_COMMAND(GE_BLT);
-    CHECKCLIPPING;
-}
-#endif
-
-static void
-BladeSetupForImageWrite(ScrnInfoPtr pScrn,
-                        int rop,
-                        unsigned int planemask,
-                        int transparency_color,
-                        int bpp, int depth)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
-    pTrident->BltScanDirection = 0;
-#if 0
-    REPLICATE(planemask);
-    if (planemask != -1) {
-        BLADE_OUT(0x2184, ~planemask);
-        pTrident->BltScanDirection |= (1 << 5);
-    }
-#endif
-}
-
-static void
-BladeSubsequentImageWriteRect(ScrnInfoPtr pScrn,
-                                int x, int y,
-                                int w, int h,
-                                int skipleft)
-{
-    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
-
-    if (skipleft)
-        BladeSetClippingRectangle(pScrn,
-                                    x + skipleft, y,
-                                    (x + w - 1), (y + h - 1));
-    BLADE_OUT(0x2144, 0xE0000000 |
-                        (1 << 19) | (1 << 4) |
-                        pTrident->BltScanDirection |
-                        (skipleft ? 1 : 0));
-    BLADE_OUT(0x2108, (y << 16) | (x & 0xfff));
-    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
-                        ((x + w - 1) & 0xfff));
-}
-#endif
diff --git a/src/blade_xaa.c b/src/blade_xaa.c
new file mode 100644
index 0000000..128913f
--- /dev/null
+++ b/src/blade_xaa.c
@@ -0,0 +1,863 @@ 
+/*
+ * 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 Blade3D 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 BladeSync(ScrnInfoPtr pScrn);
+#if 0
+static void BladeSetupForSolidLine(ScrnInfoPtr pScrn,
+                                    int color,
+                                    int rop,
+                                    unsigned int planemask);
+static void BladeSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
+                                                int x, int y,
+                                                int dmaj, int dmin,
+                                                int e, int len,
+                                                int octant);
+static void BladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
+                                                int x1, int y1,
+                                                int x2, int y2,
+                                                int flags);
+static void BladeSetupForDashedLine(ScrnInfoPtr pScrn,
+                                    int fg, int bg,
+                                    int rop,
+                                    unsigned int planemask,
+                                    int length,
+                                    unsigned char *pattern);
+static void BladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
+                                                int x1, int y1,
+                                                int x2, int y2,
+                                                int flags, int phase);
+#endif
+static void BladeSetupForFillRectSolid(ScrnInfoPtr pScrn,
+                                        int color,
+                                        int rop,
+                                        unsigned int planemask);
+static void BladeSubsequentFillRectSolid(ScrnInfoPtr pScrn,
+                                            int x, int y,
+                                            int w, int h);
+static void BladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
+                                                int x1, int y1,
+                                                int x2, int y2,
+                                                int w, int h);
+static void BladeSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
+                                            int xdir, int ydir,
+                                            int rop,
+                                            unsigned int planemask,
+                                            int transparency_color);
+#if 0
+static void BladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
+                                            int fg, int bg,
+                                            int rop,
+                                            unsigned int planemask);
+static void BladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
+                                                    int x, int y,
+                                                    int w, int h,
+                                                    int srcx, int srcy,
+                                                    int offset);
+#endif
+static void BladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
+                                            int fg, int bg,
+                                            int rop,
+                                            unsigned int planemask);
+static void BladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
+                                                    int x, int y,
+                                                    int w, int h,
+                                                    int skipleft);
+static void BladeSetClippingRectangle(ScrnInfoPtr pScrn,
+                                        int x1, int y1,
+                                        int x2, int y2);
+static void BladeDisableClipping(ScrnInfoPtr pScrn);
+static void BladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
+                                            int patternx,
+                                            int patterny,
+                                            int fg, int bg,
+                                            int rop,
+                                            unsigned int planemask);
+static void BladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
+                                                    int patternx,
+                                                    int patterny,
+                                                    int x, int y,
+                                                    int w, int h);
+#if 0
+static void BladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
+                                                int patternx,
+                                                int patterny,
+                                                int rop,
+                                                unsigned int planemask,
+                                                int trans_col);
+static void BladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
+                                                    int patternx,
+                                                    int patterny,
+                                                    int x, int y,
+                                                    int w, int h);
+#endif
+static void BladeSetupForImageWrite(ScrnInfoPtr pScrn,
+                                    int rop,
+                                    unsigned int planemask,
+                                    int transparency_color,
+                                    int bpp, int depth);
+static void BladeSubsequentImageWriteRect(ScrnInfoPtr pScrn,
+                                            int x, int y,
+                                            int w, int h,
+                                            int skipleft);
+
+static void
+BladeInitializeAccelerator(ScrnInfoPtr pScrn)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    CARD32 stride;
+
+    stride = (pScrn->displayWidth >> 3) << 20;
+
+    BLADE_OUT(0x21C8, stride);
+    BLADE_OUT(0x21CC, stride);
+    BLADE_OUT(0x21D0, stride);
+    BLADE_OUT(0x21D4, stride);
+    switch (pScrn->depth) {
+        case 8:
+        stride |= (0 << 29);
+        break;
+        case 15:
+        stride |= (5 << 29);
+        break;
+        case 16:
+        stride |= (1 << 29);
+        break;
+        case 24:
+        stride |= (2 << 29);
+        break;
+    }
+
+    BLADE_OUT(0x21B8, 0);
+    BLADE_OUT(0x21B8, stride);
+    BLADE_OUT(0x21BC, stride);
+    BLADE_OUT(0x21C0, stride);
+    BLADE_OUT(0x21C4, stride);
+#if 0
+    /* It appears that the driver sometimes misdetects the RAM type, so we
+     * don't force this for now */
+    if (pTrident->HasSGRAM)
+        BLADE_OUT(0x2168, 1 << 26); /* Enables Block Write if available (SGRAM) */
+    else
+        BLADE_OUT(0x2168, 0);
+#endif
+    BLADE_OUT(0x216C, 0);
+}
+#endif
+
+Bool BladeXaaInit(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 = BladeInitializeAccelerator;
+    BladeInitializeAccelerator(pScrn);
+
+    infoPtr->Flags = PIXMAP_CACHE |
+                        LINEAR_FRAMEBUFFER |
+                        OFFSCREEN_PIXMAPS;
+
+    infoPtr->Sync = BladeSync;
+
+    infoPtr->SetClippingRectangle = BladeSetClippingRectangle;
+    infoPtr->DisableClipping = BladeDisableClipping;
+
+#if 0
+    infoPtr->SolidLineFlags = 0;
+    infoPtr->SetupForSolidLine = BladeSetupForSolidLine;
+    infoPtr->SubsequentSolidTwoPointLine =
+                                    BladeSubsequentSolidTwoPointLine;
+    infoPtr->SetupForDashedLine = BladeSetupForDashedLine;
+    infoPtr->SubsequentDashedTwoPointLine =
+                                    BladeSubsequentDashedTwoPointLine;
+    infoPtr->DashPatternMaxLength = 16;
+    infoPtr->DashedLineFlags = LINE_PATTERN_LSBFIRST_LSBJUSTIFIED |
+                                LINE_PATTERN_POWER_OF_2_ONLY;
+#endif
+
+    infoPtr->SolidFillFlags = NO_PLANEMASK;
+    infoPtr->SetupForSolidFill = BladeSetupForFillRectSolid;
+    infoPtr->SubsequentSolidFillRect = BladeSubsequentFillRectSolid;
+
+    infoPtr->ScreenToScreenCopyFlags = ONLY_TWO_BITBLT_DIRECTIONS |
+                                        NO_PLANEMASK |
+                                        NO_TRANSPARENCY;
+
+    infoPtr->SetupForScreenToScreenCopy =
+                                    BladeSetupForScreenToScreenCopy;
+    infoPtr->SubsequentScreenToScreenCopy =
+                                    BladeSubsequentScreenToScreenCopy;
+
+    infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
+                                    NO_TRANSPARENCY |
+                                    BIT_ORDER_IN_BYTE_MSBFIRST |
+                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
+                                    HARDWARE_PATTERN_PROGRAMMED_BITS;
+
+    infoPtr->SetupForMono8x8PatternFill =
+                                    BladeSetupForMono8x8PatternFill;
+    infoPtr->SubsequentMono8x8PatternFillRect =
+                                BladeSubsequentMono8x8PatternFillRect;
+
+#if 0
+    infoPtr->Color8x8PatternFillFlags =
+                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
+                                    BIT_ORDER_IN_BYTE_MSBFIRST;
+
+    infoPtr->SetupForColor8x8PatternFill =
+                                TridentSetupForColor8x8PatternFill;
+    infoPtr->SubsequentColor8x8PatternFillRect =
+                            TridentSubsequentColor8x8PatternFillRect;
+
+    infoPtr->ScreenToScreenColorExpandFillFlags = 0;
+
+    infoPtr->SetupForScreenToScreenColorExpandFill =
+                            BladeSetupForScreenToScreenColorExpand;
+    infoPtr->SubsequentScreenToScreenColorExpandFill =
+                            BladeSubsequentScreenToScreenColorExpand;
+#endif
+
+    infoPtr->CPUToScreenColorExpandFillFlags =
+                                        CPU_TRANSFER_PAD_DWORD |
+                                        LEFT_EDGE_CLIPPING |
+                                        SYNC_AFTER_COLOR_EXPAND |
+                                        NO_PLANEMASK |
+                                        BIT_ORDER_IN_BYTE_MSBFIRST |
+                                        SCANLINE_PAD_DWORD;
+    infoPtr->ColorExpandRange = 0x10000;
+    infoPtr->ColorExpandBase = pTrident->IOBase + 0x10000;
+    infoPtr->SetupForCPUToScreenColorExpandFill =
+                                BladeSetupForCPUToScreenColorExpand;
+    infoPtr->SubsequentCPUToScreenColorExpandFill =
+                                BladeSubsequentCPUToScreenColorExpand;
+
+    infoPtr->SetupForImageWrite = BladeSetupForImageWrite;
+    infoPtr->SubsequentImageWriteRect =
+                                        BladeSubsequentImageWriteRect;
+    infoPtr->ImageWriteFlags = NO_PLANEMASK |
+                                LEFT_EDGE_CLIPPING |
+                                CPU_TRANSFER_PAD_DWORD |
+                                SYNC_AFTER_IMAGE_WRITE;
+    infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000;
+    infoPtr->ImageWriteRange = 0x10000;
+
+    return(XAAInit(pScreen, infoPtr));
+#else
+    return FALSE;
+#endif
+}
+
+#ifdef HAVE_XAA_H
+static void
+BladeSync(ScrnInfoPtr pScrn)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    int busy;
+    int cnt = 10000000;
+
+    if (pTrident->Clipping) BladeDisableClipping(pScrn);
+    BLADE_OUT(0x216C, 0);
+
+    BLADEBUSY(busy);
+    while (busy != 0) {
+        if (--cnt < 0) {
+            ErrorF("GE timeout\n");
+            BLADE_OUT(0x2124, 1 << 7);
+            BLADE_OUT(0x2124, 0);
+            break;
+        }
+
+        BLADEBUSY(busy);
+    }
+}
+
+static void
+BladeSetupForScreenToScreenCopy(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 << 1);
+
+#if 0
+    if (transparency_color != -1) {
+        BLADE_OUT(0x2168, transparency_color & 0xffffff);
+        pTrident->BltScanDirection |= (1 << 6);
+    }
+
+    REPLICATE(planemask);
+    if (planemask != (unsigned int)-1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+
+#endif
+    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
+}
+
+static void
+BladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
+                                    int x1, int y1,
+                                    int x2, int y2,
+                                    int w, int h)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    int clip = 0;
+
+    if (pTrident->Clipping) clip = 1;
+
+    BLADE_OUT(0x2144, 0xE0000000 |
+                        (1 << 19) | (1 << 4) | (1 << 2) |
+                        pTrident->BltScanDirection | clip);
+
+    if (pTrident->BltScanDirection) {
+        BLADE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1));
+        BLADE_OUT(0x2104, (y1 << 16) | x1);
+        BLADE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1));
+        BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
+    } else {
+        BLADE_OUT(0x2100, (y1 << 16) | x1);
+        BLADE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1));
+        BLADE_OUT(0x2108, (y2 << 16) | x2);
+        BLADE_OUT(0x210C, (((y2 + h - 1) & 0xfff) << 16) |
+                            ((x2 + w - 1) & 0xfff));
+    }
+}
+
+static void
+BladeSetClippingRectangle(ScrnInfoPtr pScrn,
+                            int x1, int y1,
+                            int x2, int y2)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    BLADE_OUT(0x2154, ((y1 & 0x0fff) << 16) | (x1 & 0x0fff));
+    BLADE_OUT(0x2158, ((y2 & 0x0fff) << 16) | (x2 & 0x0fff));
+    pTrident->Clipping = TRUE;
+}
+
+static void
+BladeDisableClipping(ScrnInfoPtr pScrn)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    pTrident->Clipping = FALSE;
+}
+
+#if 0
+static void
+BladeSetupForSolidLine(ScrnInfoPtr pScrn,
+                        int color,
+                        int rop,
+                        unsigned int planemask)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    REPLICATE(color);
+    BLADE_OUT(0x2160, color);
+    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
+    pTrident->BltScanDirection = 0;
+    REPLICATE(planemask);
+    if (planemask != -1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+}
+
+static void
+BladeSubsequentSolidBresenhamLine(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;
+
+    BLADE_OUT(0x2144, 0x20000000 |
+                        (3 << 19) | (1 << 4) | (2 << 2) |
+                        (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 << 21;
+    }
+
+    if (E) {
+        tmp = x; x = y; y = tmp;
+    }
+
+    BLADE_OUT(0x2130, 0x00000001);
+    if (D & 0x02) {
+        BLADE_OUT(0x213C, 0x10000000 |
+                            (1 << 25) | (1 << 19) | (1 << 17) |
+                            ymajor | ((x + len - 1) << 4));
+    } else {
+        BLADE_OUT(0x213C, 0x10000000 |
+                            (1 << 25) | (1 << 19) | (1 << 17) |
+                            ymajor | ((y + len - 1) << 4));
+    }
+
+    BLADE_OUT(0x2140, (E << 30) |
+                        ((y & 0xfff) << 20) | ((x & 0xfff) << 4));
+    BLADE_OUT(0x2144, (D << 30) |
+                        (((dmaj - dmin) & 0xfff) << 16) |
+                        (-dmin & 0xfff));
+    BLADE_OUT(0x2148, ((-(dmin + e) & 0xfff) << 16));
+}
+
+static void
+BladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
+                                    int x1, int y1,
+                                    int x2, int y2,
+                                    int flags)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+#if 0
+    if (flags & OMIT_LAST)
+        BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1);
+#endif
+
+    BLADE_OUT(0x2144, 0x20000000 |
+                        pTrident->BltScanDirection |
+                        (1 << 19) | (1 << 4) | (2 << 2));
+    BLADE_OUT(0x2130, 0x3);
+    BLADE_OUT(0x2108, (y1 << 16) | x1);
+    BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
+
+#if 0
+    if (flags & OMIT_LAST)
+    BladeDisableClipping(pScrn);
+#endif
+}
+
+static void
+BladeSetupForDashedLine(ScrnInfoPtr pScrn,
+                        int fg, int bg,
+                        int rop,
+                        unsigned int planemask,
+                        int length,
+                        unsigned char *pattern)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    pTrident->LinePattern = *((CARD16 *)pattern) & ((1 << length) - 1);
+    switch (length) {
+        case 2:
+        pTrident->LinePattern = pTrident->LinePattern |
+                                (pTrident->LinePattern << 2);
+        case 4:
+        pTrident->LinePattern = pTrident->LinePattern |
+                                (pTrident->LinePattern << 4);
+        case 8:
+        pTrident->LinePattern = pTrident->LinePattern |
+                                (pTrident->LinePattern << 8);
+    }
+
+    REPLICATE(fg);
+    REPLICATE(bg);
+    BLADE_OUT(0x2160, fg);
+    BLADE_OUT(0x2164, bg);
+    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
+    pTrident->BltScanDirection = 0;
+    REPLICATE(planemask);
+    if (planemask != -1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+}
+
+static void
+BladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
+                                    int x1, int y1,
+                                    int x2, int y2,
+                                    int flags, int phase)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    if (flags & OMIT_LAST)
+        BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1);
+
+    BLADE_OUT(0x216C, (pTrident->LinePattern >> phase) |
+                        (pTrident->LinePattern << (16 - phase)));
+    BLADE_OUT(0x2144, 0x20000000 |
+                        pTrident->BltScanDirection |
+                        (1 << 27) | (1 << 19) | (1 << 4) | (2 << 2));
+    BLADE_OUT(0x2108, (y1 << 16) | x1);
+    BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
+
+    if (flags & OMIT_LAST)
+        BladeDisableClipping(pScrn);
+}
+#endif
+
+static void
+BladeSetupForFillRectSolid(ScrnInfoPtr pScrn,
+                            int color,
+                            int rop,
+                            unsigned int planemask)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    REPLICATE(color);
+    BLADE_OUT(0x2160, color);
+    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
+    pTrident->BltScanDirection = 0;
+#if 0
+    REPLICATE(planemask);
+    if (planemask != -1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+#endif
+}
+
+static void
+BladeSubsequentFillRectSolid(ScrnInfoPtr pScrn,
+                                int x, int y,
+                                int w, int h)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    BLADE_OUT(0x2144, 0x20000000 |
+                        pTrident->BltScanDirection |
+                        (1 << 19) | (1 << 4) | (2 << 2) |
+                        (pTrident->Clipping ? 1 : 0));
+    BLADE_OUT(0x2108, (y << 16) | x);
+    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+}
+
+#if 0
+static void
+BladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
+                                        int fg, int bg,
+                                        int rop,
+                                        unsigned int planemask)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    pTrident->ROP = rop;
+
+    REPLICATE(bg);
+    REPLICATE(fg);
+    IMAGE_OUT(0x44, fg);
+    IMAGE_OUT(0x48, bg);
+    IMAGE_OUT(0x20, 0x90000000 | XAAGetCopyROP(rop));
+    pTrident->BltScanDirection = 0;
+    REPLICATE(planemask);
+    if (planemask != -1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+}
+
+static void
+BladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
+                                            int x, int y,
+                                            int w, int h,
+                                            int srcx, int srcy,
+                                            int offset)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    IMAGE_OUT(0x00, (srcy << 16) | srcx);
+    IMAGE_OUT(0x04, ((srcy + h - 1) << 16) | (srcx + w - 1));
+    IMAGE_OUT(0x08, (y << 16) | x);
+    IMAGE_OUT(0x0C, ((y + h - 1) << 16) | (x + w - 1));
+
+    IMAGE_OUT(0x24, 0x80000000 |
+                    (3 << 22) | (1 << 7) |
+                    pTrident->BltScanDirection |
+                    (pTrident->ROP == GXcopy ? 0 : (1 << 10)) |
+                    (offset << 25));
+}
+#endif
+
+static void
+BladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
+                                    int fg, int bg,
+                                    int rop,
+                                    unsigned int planemask)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    pTrident->BltScanDirection = 0;
+    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
+    if (bg == -1) {
+        pTrident->BltScanDirection |= (2 << 19);
+        REPLICATE(fg);
+        BLADE_OUT(0x2160, fg);
+        BLADE_OUT(0x2164, ~fg);
+    } else {
+        pTrident->BltScanDirection |= (3 << 19);
+        REPLICATE(fg);
+        REPLICATE(bg);
+        BLADE_OUT(0x2160, fg);
+        BLADE_OUT(0x2164, bg);
+    }
+
+#if 0
+    REPLICATE(planemask);
+    if (planemask != -1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+#endif
+}
+
+static void
+BladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
+                                        int x, int y,
+                                        int w, int h,
+                                        int skipleft)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    if (skipleft)
+        BladeSetClippingRectangle(pScrn,
+                                    x + skipleft, y,
+                                    (x + w - 1), (y + h - 1));
+    BLADE_OUT(0x2144, 0xE0000000 |
+                        pTrident->BltScanDirection |
+                        (1 << 4) |
+                        (skipleft ? 1 : 0));
+    BLADE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
+    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+}
+
+static void
+BladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
+                                int patternx, int patterny,
+                                int fg, int bg,
+                                int rop,
+                                unsigned int planemask)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    BladeSync(pScrn);
+    BLADE_OUT(0x2148, XAAGetPatternROP(rop));
+
+    if (bg == -1) {
+        REPLICATE(fg);
+        BLADE_OUT(0x216C, 0x80000000 | (1 << 30));
+        BLADE_OUT(0x216C, 0x80000000 | (1 << 28) | (1 << 30));
+        BLADE_OUT(0x2170, patternx);
+        BLADE_OUT(0x2170, patterny);
+        BLADE_OUT(0x2174, fg);
+#if 0
+        BLADE_OUT(0x2178, ~fg);
+#endif
+    } else {
+        REPLICATE(fg);
+        REPLICATE(bg);
+        BLADE_OUT(0x216C, 0x80000000);
+        BLADE_OUT(0x216C, 0x80000000 | (1 << 28));
+        BLADE_OUT(0x2170, patternx);
+        BLADE_OUT(0x2170, patterny);
+        BLADE_OUT(0x2174, fg);
+        BLADE_OUT(0x2178, bg);
+    }
+
+    pTrident->BltScanDirection = 0;
+#if 0
+    REPLICATE(planemask);
+    if (planemask != -1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+#endif
+}
+
+static void
+BladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
+                                        int patternx, int patterny,
+                                        int x, int y,
+                                        int w, int h)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+    int clip = 0;
+
+    if (pTrident->Clipping) clip = 1;
+    BLADE_OUT(0x2144, 0x20000000 |
+                        pTrident->BltScanDirection |
+                        (7 << 12) | (1 << 4) |
+                        (1 << 19) | (2 << 2) | clip);
+    BLADE_OUT(0x2108, (y << 16) | x);
+    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+}
+
+#if 0
+static void
+BladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
+                                    int patternx, int patterny,
+                                    int rop,
+                                    unsigned int planemask,
+                                    int transparency_color)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    TGUI_PATLOC(((patterny *
+                        pScrn->displayWidth *
+                        (pScrn->bitsPerPixel / 8)) +
+                    (patternx *
+                        (pScrn->bitsPerPixel / 8))) >> 6);
+    pTrident->BltScanDirection = 0;
+    if (transparency_color != -1) {
+        BLADE_OUT(0x2168, transparency_color & 0xffffff);
+        pTrident->BltScanDirection |= (1 << 6);
+    }
+    TGUI_FMIX(XAAGetPatternROP(rop));
+    REPLICATE(planemask);
+    if (planemask != -1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+}
+
+static void
+BladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
+                                        int patternx, int patterny,
+                                        int x, int y,
+                                        int w, int h)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    TGUI_DEST_XY(x, y);
+    TGUI_DIM_XY(w, h);
+    TGUI_COMMAND(GE_BLT);
+    CHECKCLIPPING;
+}
+#endif
+
+static void
+BladeSetupForImageWrite(ScrnInfoPtr pScrn,
+                        int rop,
+                        unsigned int planemask,
+                        int transparency_color,
+                        int bpp, int depth)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
+    pTrident->BltScanDirection = 0;
+#if 0
+    REPLICATE(planemask);
+    if (planemask != -1) {
+        BLADE_OUT(0x2184, ~planemask);
+        pTrident->BltScanDirection |= (1 << 5);
+    }
+#endif
+}
+
+static void
+BladeSubsequentImageWriteRect(ScrnInfoPtr pScrn,
+                                int x, int y,
+                                int w, int h,
+                                int skipleft)
+{
+    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
+
+    if (skipleft)
+        BladeSetClippingRectangle(pScrn,
+                                    x + skipleft, y,
+                                    (x + w - 1), (y + h - 1));
+    BLADE_OUT(0x2144, 0xE0000000 |
+                        (1 << 19) | (1 << 4) |
+                        pTrident->BltScanDirection |
+                        (skipleft ? 1 : 0));
+    BLADE_OUT(0x2108, (y << 16) | (x & 0xfff));
+    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
+                        ((x + w - 1) & 0xfff));
+}
+#endif