/* * 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, * * 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<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