1d87a3195Smrg/* 2d87a3195Smrg * Copyright 1997-2003 by Alan Hourihane, North Wales, UK. 3d87a3195Smrg * 4d87a3195Smrg * Permission to use, copy, modify, distribute, and sell this software 5d87a3195Smrg * and its documentation for any purpose is hereby granted without 6d87a3195Smrg * fee, provided that the above copyright notice appear in all copies 7d87a3195Smrg * and that both that copyright notice and this permission notice 8d87a3195Smrg * appear in supporting documentation, and that the name of Alan 9d87a3195Smrg * Hourihane not be used in advertising or publicity pertaining to 10d87a3195Smrg * distribution of the software without specific, written prior 11d87a3195Smrg * permission. Alan Hourihane makes no representations about the 12d87a3195Smrg * suitability of this software for any purpose. It is provided 13d87a3195Smrg * "as is" without express or implied warranty. 14d87a3195Smrg * 15d87a3195Smrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 16d87a3195Smrg * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 17d87a3195Smrg * FITNESS, IN NO EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY 18d87a3195Smrg * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 19d87a3195Smrg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 20d87a3195Smrg * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 21d87a3195Smrg * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 22d87a3195Smrg * SOFTWARE. 23d87a3195Smrg * 24d87a3195Smrg * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> 25d87a3195Smrg * 26d87a3195Smrg * Trident Blade3D accelerated options. 27d87a3195Smrg */ 28d87a3195Smrg 29d87a3195Smrg#ifdef HAVE_CONFIG_H 30d87a3195Smrg#include "config.h" 31d87a3195Smrg#endif 32d87a3195Smrg 33d87a3195Smrg#include "xf86.h" 34d87a3195Smrg#include "xf86_OSproc.h" 35d87a3195Smrg 36d87a3195Smrg#include "xf86Pci.h" 37d87a3195Smrg 38d87a3195Smrg#include "miline.h" 39d87a3195Smrg 40d87a3195Smrg#include "trident.h" 41d87a3195Smrg#include "trident_regs.h" 42d87a3195Smrg 43d87a3195Smrg#ifdef HAVE_XAA_H 44d87a3195Smrg#include "xaarop.h" 45d87a3195Smrg#include "xaalocal.h" 46d87a3195Smrg 47d87a3195Smrgstatic void BladeSync(ScrnInfoPtr pScrn); 48d87a3195Smrg#if 0 49d87a3195Smrgstatic void BladeSetupForSolidLine(ScrnInfoPtr pScrn, 50d87a3195Smrg int color, 51d87a3195Smrg int rop, 52d87a3195Smrg unsigned int planemask); 53d87a3195Smrgstatic void BladeSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, 54d87a3195Smrg int x, int y, 55d87a3195Smrg int dmaj, int dmin, 56d87a3195Smrg int e, int len, 57d87a3195Smrg int octant); 58d87a3195Smrgstatic void BladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 59d87a3195Smrg int x1, int y1, 60d87a3195Smrg int x2, int y2, 61d87a3195Smrg int flags); 62d87a3195Smrgstatic void BladeSetupForDashedLine(ScrnInfoPtr pScrn, 63d87a3195Smrg int fg, int bg, 64d87a3195Smrg int rop, 65d87a3195Smrg unsigned int planemask, 66d87a3195Smrg int length, 67d87a3195Smrg unsigned char *pattern); 68d87a3195Smrgstatic void BladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 69d87a3195Smrg int x1, int y1, 70d87a3195Smrg int x2, int y2, 71d87a3195Smrg int flags, int phase); 72d87a3195Smrg#endif 73d87a3195Smrgstatic void BladeSetupForFillRectSolid(ScrnInfoPtr pScrn, 74d87a3195Smrg int color, 75d87a3195Smrg int rop, 76d87a3195Smrg unsigned int planemask); 77d87a3195Smrgstatic void BladeSubsequentFillRectSolid(ScrnInfoPtr pScrn, 78d87a3195Smrg int x, int y, 79d87a3195Smrg int w, int h); 80d87a3195Smrgstatic void BladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 81d87a3195Smrg int x1, int y1, 82d87a3195Smrg int x2, int y2, 83d87a3195Smrg int w, int h); 84d87a3195Smrgstatic void BladeSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 85d87a3195Smrg int xdir, int ydir, 86d87a3195Smrg int rop, 87d87a3195Smrg unsigned int planemask, 88d87a3195Smrg int transparency_color); 89d87a3195Smrg#if 0 90d87a3195Smrgstatic void BladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn, 91d87a3195Smrg int fg, int bg, 92d87a3195Smrg int rop, 93d87a3195Smrg unsigned int planemask); 94d87a3195Smrgstatic void BladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn, 95d87a3195Smrg int x, int y, 96d87a3195Smrg int w, int h, 97d87a3195Smrg int srcx, int srcy, 98d87a3195Smrg int offset); 99d87a3195Smrg#endif 100d87a3195Smrgstatic void BladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn, 101d87a3195Smrg int fg, int bg, 102d87a3195Smrg int rop, 103d87a3195Smrg unsigned int planemask); 104d87a3195Smrgstatic void BladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn, 105d87a3195Smrg int x, int y, 106d87a3195Smrg int w, int h, 107d87a3195Smrg int skipleft); 108d87a3195Smrgstatic void BladeSetClippingRectangle(ScrnInfoPtr pScrn, 109d87a3195Smrg int x1, int y1, 110d87a3195Smrg int x2, int y2); 111d87a3195Smrgstatic void BladeDisableClipping(ScrnInfoPtr pScrn); 112d87a3195Smrgstatic void BladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 113d87a3195Smrg int patternx, 114d87a3195Smrg int patterny, 115d87a3195Smrg int fg, int bg, 116d87a3195Smrg int rop, 117d87a3195Smrg unsigned int planemask); 118d87a3195Smrgstatic void BladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 119d87a3195Smrg int patternx, 120d87a3195Smrg int patterny, 121d87a3195Smrg int x, int y, 122d87a3195Smrg int w, int h); 123d87a3195Smrg#if 0 124d87a3195Smrgstatic void BladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, 125d87a3195Smrg int patternx, 126d87a3195Smrg int patterny, 127d87a3195Smrg int rop, 128d87a3195Smrg unsigned int planemask, 129d87a3195Smrg int trans_col); 130d87a3195Smrgstatic void BladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, 131d87a3195Smrg int patternx, 132d87a3195Smrg int patterny, 133d87a3195Smrg int x, int y, 134d87a3195Smrg int w, int h); 135d87a3195Smrg#endif 136d87a3195Smrgstatic void BladeSetupForImageWrite(ScrnInfoPtr pScrn, 137d87a3195Smrg int rop, 138d87a3195Smrg unsigned int planemask, 139d87a3195Smrg int transparency_color, 140d87a3195Smrg int bpp, int depth); 141d87a3195Smrgstatic void BladeSubsequentImageWriteRect(ScrnInfoPtr pScrn, 142d87a3195Smrg int x, int y, 143d87a3195Smrg int w, int h, 144d87a3195Smrg int skipleft); 145d87a3195Smrg 146d87a3195Smrgstatic void 147d87a3195SmrgBladeInitializeAccelerator(ScrnInfoPtr pScrn) 148d87a3195Smrg{ 149d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 150d87a3195Smrg CARD32 stride; 151d87a3195Smrg 152d87a3195Smrg stride = (pScrn->displayWidth >> 3) << 20; 153d87a3195Smrg 154d87a3195Smrg BLADE_OUT(0x21C8, stride); 155d87a3195Smrg BLADE_OUT(0x21CC, stride); 156d87a3195Smrg BLADE_OUT(0x21D0, stride); 157d87a3195Smrg BLADE_OUT(0x21D4, stride); 158d87a3195Smrg switch (pScrn->depth) { 159d87a3195Smrg case 8: 160d87a3195Smrg stride |= (0 << 29); 161d87a3195Smrg break; 162d87a3195Smrg case 15: 163d87a3195Smrg stride |= (5 << 29); 164d87a3195Smrg break; 165d87a3195Smrg case 16: 166d87a3195Smrg stride |= (1 << 29); 167d87a3195Smrg break; 168d87a3195Smrg case 24: 169d87a3195Smrg stride |= (2 << 29); 170d87a3195Smrg break; 171d87a3195Smrg } 172d87a3195Smrg 173d87a3195Smrg BLADE_OUT(0x21B8, 0); 174d87a3195Smrg BLADE_OUT(0x21B8, stride); 175d87a3195Smrg BLADE_OUT(0x21BC, stride); 176d87a3195Smrg BLADE_OUT(0x21C0, stride); 177d87a3195Smrg BLADE_OUT(0x21C4, stride); 178d87a3195Smrg#if 0 179d87a3195Smrg /* It appears that the driver sometimes misdetects the RAM type, so we 180d87a3195Smrg * don't force this for now */ 181d87a3195Smrg if (pTrident->HasSGRAM) 182d87a3195Smrg BLADE_OUT(0x2168, 1 << 26); /* Enables Block Write if available (SGRAM) */ 183d87a3195Smrg else 184d87a3195Smrg BLADE_OUT(0x2168, 0); 185d87a3195Smrg#endif 186d87a3195Smrg BLADE_OUT(0x216C, 0); 187d87a3195Smrg} 188d87a3195Smrg#endif 189d87a3195Smrg 190d87a3195SmrgBool BladeXaaInit(ScreenPtr pScreen) { 191d87a3195Smrg#ifdef HAVE_XAA_H 192d87a3195Smrg XAAInfoRecPtr infoPtr; 193d87a3195Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 194d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 195d87a3195Smrg 196d87a3195Smrg if (pTrident->NoAccel) 197d87a3195Smrg return FALSE; 198d87a3195Smrg 199d87a3195Smrg pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec(); 200d87a3195Smrg if (!infoPtr) return FALSE; 201d87a3195Smrg 202d87a3195Smrg pTrident->InitializeAccelerator = BladeInitializeAccelerator; 203d87a3195Smrg BladeInitializeAccelerator(pScrn); 204d87a3195Smrg 205d87a3195Smrg infoPtr->Flags = PIXMAP_CACHE | 206d87a3195Smrg LINEAR_FRAMEBUFFER | 207d87a3195Smrg OFFSCREEN_PIXMAPS; 208d87a3195Smrg 209d87a3195Smrg infoPtr->Sync = BladeSync; 210d87a3195Smrg 211d87a3195Smrg infoPtr->SetClippingRectangle = BladeSetClippingRectangle; 212d87a3195Smrg infoPtr->DisableClipping = BladeDisableClipping; 213d87a3195Smrg 214d87a3195Smrg#if 0 215d87a3195Smrg infoPtr->SolidLineFlags = 0; 216d87a3195Smrg infoPtr->SetupForSolidLine = BladeSetupForSolidLine; 217d87a3195Smrg infoPtr->SubsequentSolidTwoPointLine = 218d87a3195Smrg BladeSubsequentSolidTwoPointLine; 219d87a3195Smrg infoPtr->SetupForDashedLine = BladeSetupForDashedLine; 220d87a3195Smrg infoPtr->SubsequentDashedTwoPointLine = 221d87a3195Smrg BladeSubsequentDashedTwoPointLine; 222d87a3195Smrg infoPtr->DashPatternMaxLength = 16; 223d87a3195Smrg infoPtr->DashedLineFlags = LINE_PATTERN_LSBFIRST_LSBJUSTIFIED | 224d87a3195Smrg LINE_PATTERN_POWER_OF_2_ONLY; 225d87a3195Smrg#endif 226d87a3195Smrg 227d87a3195Smrg infoPtr->SolidFillFlags = NO_PLANEMASK; 228d87a3195Smrg infoPtr->SetupForSolidFill = BladeSetupForFillRectSolid; 229d87a3195Smrg infoPtr->SubsequentSolidFillRect = BladeSubsequentFillRectSolid; 230d87a3195Smrg 231d87a3195Smrg infoPtr->ScreenToScreenCopyFlags = ONLY_TWO_BITBLT_DIRECTIONS | 232d87a3195Smrg NO_PLANEMASK | 233d87a3195Smrg NO_TRANSPARENCY; 234d87a3195Smrg 235d87a3195Smrg infoPtr->SetupForScreenToScreenCopy = 236d87a3195Smrg BladeSetupForScreenToScreenCopy; 237d87a3195Smrg infoPtr->SubsequentScreenToScreenCopy = 238d87a3195Smrg BladeSubsequentScreenToScreenCopy; 239d87a3195Smrg 240d87a3195Smrg infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | 241d87a3195Smrg NO_TRANSPARENCY | 242d87a3195Smrg BIT_ORDER_IN_BYTE_MSBFIRST | 243d87a3195Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 244d87a3195Smrg HARDWARE_PATTERN_PROGRAMMED_BITS; 245d87a3195Smrg 246d87a3195Smrg infoPtr->SetupForMono8x8PatternFill = 247d87a3195Smrg BladeSetupForMono8x8PatternFill; 248d87a3195Smrg infoPtr->SubsequentMono8x8PatternFillRect = 249d87a3195Smrg BladeSubsequentMono8x8PatternFillRect; 250d87a3195Smrg 251d87a3195Smrg#if 0 252d87a3195Smrg infoPtr->Color8x8PatternFillFlags = 253d87a3195Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 254d87a3195Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 255d87a3195Smrg 256d87a3195Smrg infoPtr->SetupForColor8x8PatternFill = 257d87a3195Smrg TridentSetupForColor8x8PatternFill; 258d87a3195Smrg infoPtr->SubsequentColor8x8PatternFillRect = 259d87a3195Smrg TridentSubsequentColor8x8PatternFillRect; 260d87a3195Smrg 261d87a3195Smrg infoPtr->ScreenToScreenColorExpandFillFlags = 0; 262d87a3195Smrg 263d87a3195Smrg infoPtr->SetupForScreenToScreenColorExpandFill = 264d87a3195Smrg BladeSetupForScreenToScreenColorExpand; 265d87a3195Smrg infoPtr->SubsequentScreenToScreenColorExpandFill = 266d87a3195Smrg BladeSubsequentScreenToScreenColorExpand; 267d87a3195Smrg#endif 268d87a3195Smrg 269d87a3195Smrg infoPtr->CPUToScreenColorExpandFillFlags = 270d87a3195Smrg CPU_TRANSFER_PAD_DWORD | 271d87a3195Smrg LEFT_EDGE_CLIPPING | 272d87a3195Smrg SYNC_AFTER_COLOR_EXPAND | 273d87a3195Smrg NO_PLANEMASK | 274d87a3195Smrg BIT_ORDER_IN_BYTE_MSBFIRST | 275d87a3195Smrg SCANLINE_PAD_DWORD; 276d87a3195Smrg infoPtr->ColorExpandRange = 0x10000; 277d87a3195Smrg infoPtr->ColorExpandBase = pTrident->IOBase + 0x10000; 278d87a3195Smrg infoPtr->SetupForCPUToScreenColorExpandFill = 279d87a3195Smrg BladeSetupForCPUToScreenColorExpand; 280d87a3195Smrg infoPtr->SubsequentCPUToScreenColorExpandFill = 281d87a3195Smrg BladeSubsequentCPUToScreenColorExpand; 282d87a3195Smrg 283d87a3195Smrg infoPtr->SetupForImageWrite = BladeSetupForImageWrite; 284d87a3195Smrg infoPtr->SubsequentImageWriteRect = 285d87a3195Smrg BladeSubsequentImageWriteRect; 286d87a3195Smrg infoPtr->ImageWriteFlags = NO_PLANEMASK | 287d87a3195Smrg LEFT_EDGE_CLIPPING | 288d87a3195Smrg CPU_TRANSFER_PAD_DWORD | 289d87a3195Smrg SYNC_AFTER_IMAGE_WRITE; 290d87a3195Smrg infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000; 291d87a3195Smrg infoPtr->ImageWriteRange = 0x10000; 292d87a3195Smrg 293d87a3195Smrg return(XAAInit(pScreen, infoPtr)); 294d87a3195Smrg#else 295d87a3195Smrg return FALSE; 296d87a3195Smrg#endif 297d87a3195Smrg} 298d87a3195Smrg 299d87a3195Smrg#ifdef HAVE_XAA_H 300d87a3195Smrgstatic void 301d87a3195SmrgBladeSync(ScrnInfoPtr pScrn) 302d87a3195Smrg{ 303d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 304d87a3195Smrg int busy; 305d87a3195Smrg int cnt = 10000000; 306d87a3195Smrg 307d87a3195Smrg if (pTrident->Clipping) BladeDisableClipping(pScrn); 308d87a3195Smrg BLADE_OUT(0x216C, 0); 309d87a3195Smrg 310d87a3195Smrg BLADEBUSY(busy); 311d87a3195Smrg while (busy != 0) { 312d87a3195Smrg if (--cnt < 0) { 313d87a3195Smrg ErrorF("GE timeout\n"); 314d87a3195Smrg BLADE_OUT(0x2124, 1 << 7); 315d87a3195Smrg BLADE_OUT(0x2124, 0); 316d87a3195Smrg break; 317d87a3195Smrg } 318d87a3195Smrg 319d87a3195Smrg BLADEBUSY(busy); 320d87a3195Smrg } 321d87a3195Smrg} 322d87a3195Smrg 323d87a3195Smrgstatic void 324d87a3195SmrgBladeSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 325d87a3195Smrg int xdir, int ydir, 326d87a3195Smrg int rop, 327d87a3195Smrg unsigned int planemask, 328d87a3195Smrg int transparency_color) 329d87a3195Smrg{ 330d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 331d87a3195Smrg 332d87a3195Smrg pTrident->BltScanDirection = 0; 333d87a3195Smrg if ((xdir < 0) || (ydir < 0)) 334d87a3195Smrg pTrident->BltScanDirection |= (1 << 1); 335d87a3195Smrg 336d87a3195Smrg#if 0 337d87a3195Smrg if (transparency_color != -1) { 338d87a3195Smrg BLADE_OUT(0x2168, transparency_color & 0xffffff); 339d87a3195Smrg pTrident->BltScanDirection |= (1 << 6); 340d87a3195Smrg } 341d87a3195Smrg 342d87a3195Smrg REPLICATE(planemask); 343d87a3195Smrg if (planemask != (unsigned int)-1) { 344d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 345d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 346d87a3195Smrg } 347d87a3195Smrg 348d87a3195Smrg#endif 349d87a3195Smrg BLADE_OUT(0x2148, XAAGetCopyROP(rop)); 350d87a3195Smrg} 351d87a3195Smrg 352d87a3195Smrgstatic void 353d87a3195SmrgBladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 354d87a3195Smrg int x1, int y1, 355d87a3195Smrg int x2, int y2, 356d87a3195Smrg int w, int h) 357d87a3195Smrg{ 358d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 359d87a3195Smrg int clip = 0; 360d87a3195Smrg 361d87a3195Smrg if (pTrident->Clipping) clip = 1; 362d87a3195Smrg 363d87a3195Smrg BLADE_OUT(0x2144, 0xE0000000 | 364d87a3195Smrg (1 << 19) | (1 << 4) | (1 << 2) | 365d87a3195Smrg pTrident->BltScanDirection | clip); 366d87a3195Smrg 367d87a3195Smrg if (pTrident->BltScanDirection) { 368d87a3195Smrg BLADE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1)); 369d87a3195Smrg BLADE_OUT(0x2104, (y1 << 16) | x1); 370d87a3195Smrg BLADE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1)); 371d87a3195Smrg BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff)); 372d87a3195Smrg } else { 373d87a3195Smrg BLADE_OUT(0x2100, (y1 << 16) | x1); 374d87a3195Smrg BLADE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1)); 375d87a3195Smrg BLADE_OUT(0x2108, (y2 << 16) | x2); 376d87a3195Smrg BLADE_OUT(0x210C, (((y2 + h - 1) & 0xfff) << 16) | 377d87a3195Smrg ((x2 + w - 1) & 0xfff)); 378d87a3195Smrg } 379d87a3195Smrg} 380d87a3195Smrg 381d87a3195Smrgstatic void 382d87a3195SmrgBladeSetClippingRectangle(ScrnInfoPtr pScrn, 383d87a3195Smrg int x1, int y1, 384d87a3195Smrg int x2, int y2) 385d87a3195Smrg{ 386d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 387d87a3195Smrg 388d87a3195Smrg BLADE_OUT(0x2154, ((y1 & 0x0fff) << 16) | (x1 & 0x0fff)); 389d87a3195Smrg BLADE_OUT(0x2158, ((y2 & 0x0fff) << 16) | (x2 & 0x0fff)); 390d87a3195Smrg pTrident->Clipping = TRUE; 391d87a3195Smrg} 392d87a3195Smrg 393d87a3195Smrgstatic void 394d87a3195SmrgBladeDisableClipping(ScrnInfoPtr pScrn) 395d87a3195Smrg{ 396d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 397d87a3195Smrg pTrident->Clipping = FALSE; 398d87a3195Smrg} 399d87a3195Smrg 400d87a3195Smrg#if 0 401d87a3195Smrgstatic void 402d87a3195SmrgBladeSetupForSolidLine(ScrnInfoPtr pScrn, 403d87a3195Smrg int color, 404d87a3195Smrg int rop, 405d87a3195Smrg unsigned int planemask) 406d87a3195Smrg{ 407d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 408d87a3195Smrg 409d87a3195Smrg REPLICATE(color); 410d87a3195Smrg BLADE_OUT(0x2160, color); 411d87a3195Smrg BLADE_OUT(0x2148, XAAGetCopyROP(rop)); 412d87a3195Smrg pTrident->BltScanDirection = 0; 413d87a3195Smrg REPLICATE(planemask); 414d87a3195Smrg if (planemask != -1) { 415d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 416d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 417d87a3195Smrg } 418d87a3195Smrg} 419d87a3195Smrg 420d87a3195Smrgstatic void 421d87a3195SmrgBladeSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, 422d87a3195Smrg int x, int y, 423d87a3195Smrg int dmaj, int dmin, 424d87a3195Smrg int e, int len, 425d87a3195Smrg int octant) 426d87a3195Smrg{ 427d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 428d87a3195Smrg int tmp; 429d87a3195Smrg int D = 0, E = 0, ymajor = 0; 430d87a3195Smrg 431d87a3195Smrg BLADE_OUT(0x2144, 0x20000000 | 432d87a3195Smrg (3 << 19) | (1 << 4) | (2 << 2) | 433d87a3195Smrg (pTrident->Clipping ? 1 : 0)); 434d87a3195Smrg 435d87a3195Smrg if (!(octant & YMAJOR)) { 436d87a3195Smrg if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) { 437d87a3195Smrg E = 1; D = 0; 438d87a3195Smrg } 439d87a3195Smrg 440d87a3195Smrg if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) { 441d87a3195Smrg E = 1; D = 1; 442d87a3195Smrg } 443d87a3195Smrg 444d87a3195Smrg if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) { 445d87a3195Smrg E = 1; D = 2; 446d87a3195Smrg } 447d87a3195Smrg 448d87a3195Smrg if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) { 449d87a3195Smrg E = 1; D = 3; 450d87a3195Smrg } 451d87a3195Smrg 452d87a3195Smrg ymajor = 0; 453d87a3195Smrg } else { 454d87a3195Smrg if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) { 455d87a3195Smrg E = 0; D = 0; 456d87a3195Smrg } 457d87a3195Smrg 458d87a3195Smrg if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) { 459d87a3195Smrg E = 0; D = 2; 460d87a3195Smrg } 461d87a3195Smrg 462d87a3195Smrg if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) { 463d87a3195Smrg E = 0; D = 1; 464d87a3195Smrg } 465d87a3195Smrg 466d87a3195Smrg if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) { 467d87a3195Smrg E = 0; D = 3; 468d87a3195Smrg } 469d87a3195Smrg 470d87a3195Smrg ymajor = 1 << 21; 471d87a3195Smrg } 472d87a3195Smrg 473d87a3195Smrg if (E) { 474d87a3195Smrg tmp = x; x = y; y = tmp; 475d87a3195Smrg } 476d87a3195Smrg 477d87a3195Smrg BLADE_OUT(0x2130, 0x00000001); 478d87a3195Smrg if (D & 0x02) { 479d87a3195Smrg BLADE_OUT(0x213C, 0x10000000 | 480d87a3195Smrg (1 << 25) | (1 << 19) | (1 << 17) | 481d87a3195Smrg ymajor | ((x + len - 1) << 4)); 482d87a3195Smrg } else { 483d87a3195Smrg BLADE_OUT(0x213C, 0x10000000 | 484d87a3195Smrg (1 << 25) | (1 << 19) | (1 << 17) | 485d87a3195Smrg ymajor | ((y + len - 1) << 4)); 486d87a3195Smrg } 487d87a3195Smrg 488d87a3195Smrg BLADE_OUT(0x2140, (E << 30) | 489d87a3195Smrg ((y & 0xfff) << 20) | ((x & 0xfff) << 4)); 490d87a3195Smrg BLADE_OUT(0x2144, (D << 30) | 491d87a3195Smrg (((dmaj - dmin) & 0xfff) << 16) | 492d87a3195Smrg (-dmin & 0xfff)); 493d87a3195Smrg BLADE_OUT(0x2148, ((-(dmin + e) & 0xfff) << 16)); 494d87a3195Smrg} 495d87a3195Smrg 496d87a3195Smrgstatic void 497d87a3195SmrgBladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 498d87a3195Smrg int x1, int y1, 499d87a3195Smrg int x2, int y2, 500d87a3195Smrg int flags) 501d87a3195Smrg{ 502d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 503d87a3195Smrg 504d87a3195Smrg#if 0 505d87a3195Smrg if (flags & OMIT_LAST) 506d87a3195Smrg BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1); 507d87a3195Smrg#endif 508d87a3195Smrg 509d87a3195Smrg BLADE_OUT(0x2144, 0x20000000 | 510d87a3195Smrg pTrident->BltScanDirection | 511d87a3195Smrg (1 << 19) | (1 << 4) | (2 << 2)); 512d87a3195Smrg BLADE_OUT(0x2130, 0x3); 513d87a3195Smrg BLADE_OUT(0x2108, (y1 << 16) | x1); 514d87a3195Smrg BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff)); 515d87a3195Smrg 516d87a3195Smrg#if 0 517d87a3195Smrg if (flags & OMIT_LAST) 518d87a3195Smrg BladeDisableClipping(pScrn); 519d87a3195Smrg#endif 520d87a3195Smrg} 521d87a3195Smrg 522d87a3195Smrgstatic void 523d87a3195SmrgBladeSetupForDashedLine(ScrnInfoPtr pScrn, 524d87a3195Smrg int fg, int bg, 525d87a3195Smrg int rop, 526d87a3195Smrg unsigned int planemask, 527d87a3195Smrg int length, 528d87a3195Smrg unsigned char *pattern) 529d87a3195Smrg{ 530d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 531d87a3195Smrg 532d87a3195Smrg pTrident->LinePattern = *((CARD16 *)pattern) & ((1 << length) - 1); 533d87a3195Smrg switch (length) { 534d87a3195Smrg case 2: 535d87a3195Smrg pTrident->LinePattern = pTrident->LinePattern | 536d87a3195Smrg (pTrident->LinePattern << 2); 537d87a3195Smrg case 4: 538d87a3195Smrg pTrident->LinePattern = pTrident->LinePattern | 539d87a3195Smrg (pTrident->LinePattern << 4); 540d87a3195Smrg case 8: 541d87a3195Smrg pTrident->LinePattern = pTrident->LinePattern | 542d87a3195Smrg (pTrident->LinePattern << 8); 543d87a3195Smrg } 544d87a3195Smrg 545d87a3195Smrg REPLICATE(fg); 546d87a3195Smrg REPLICATE(bg); 547d87a3195Smrg BLADE_OUT(0x2160, fg); 548d87a3195Smrg BLADE_OUT(0x2164, bg); 549d87a3195Smrg BLADE_OUT(0x2148, XAAGetCopyROP(rop)); 550d87a3195Smrg pTrident->BltScanDirection = 0; 551d87a3195Smrg REPLICATE(planemask); 552d87a3195Smrg if (planemask != -1) { 553d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 554d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 555d87a3195Smrg } 556d87a3195Smrg} 557d87a3195Smrg 558d87a3195Smrgstatic void 559d87a3195SmrgBladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 560d87a3195Smrg int x1, int y1, 561d87a3195Smrg int x2, int y2, 562d87a3195Smrg int flags, int phase) 563d87a3195Smrg{ 564d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 565d87a3195Smrg 566d87a3195Smrg if (flags & OMIT_LAST) 567d87a3195Smrg BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1); 568d87a3195Smrg 569d87a3195Smrg BLADE_OUT(0x216C, (pTrident->LinePattern >> phase) | 570d87a3195Smrg (pTrident->LinePattern << (16 - phase))); 571d87a3195Smrg BLADE_OUT(0x2144, 0x20000000 | 572d87a3195Smrg pTrident->BltScanDirection | 573d87a3195Smrg (1 << 27) | (1 << 19) | (1 << 4) | (2 << 2)); 574d87a3195Smrg BLADE_OUT(0x2108, (y1 << 16) | x1); 575d87a3195Smrg BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff)); 576d87a3195Smrg 577d87a3195Smrg if (flags & OMIT_LAST) 578d87a3195Smrg BladeDisableClipping(pScrn); 579d87a3195Smrg} 580d87a3195Smrg#endif 581d87a3195Smrg 582d87a3195Smrgstatic void 583d87a3195SmrgBladeSetupForFillRectSolid(ScrnInfoPtr pScrn, 584d87a3195Smrg int color, 585d87a3195Smrg int rop, 586d87a3195Smrg unsigned int planemask) 587d87a3195Smrg{ 588d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 589d87a3195Smrg 590d87a3195Smrg REPLICATE(color); 591d87a3195Smrg BLADE_OUT(0x2160, color); 592d87a3195Smrg BLADE_OUT(0x2148, XAAGetCopyROP(rop)); 593d87a3195Smrg pTrident->BltScanDirection = 0; 594d87a3195Smrg#if 0 595d87a3195Smrg REPLICATE(planemask); 596d87a3195Smrg if (planemask != -1) { 597d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 598d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 599d87a3195Smrg } 600d87a3195Smrg#endif 601d87a3195Smrg} 602d87a3195Smrg 603d87a3195Smrgstatic void 604d87a3195SmrgBladeSubsequentFillRectSolid(ScrnInfoPtr pScrn, 605d87a3195Smrg int x, int y, 606d87a3195Smrg int w, int h) 607d87a3195Smrg{ 608d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 609d87a3195Smrg 610d87a3195Smrg BLADE_OUT(0x2144, 0x20000000 | 611d87a3195Smrg pTrident->BltScanDirection | 612d87a3195Smrg (1 << 19) | (1 << 4) | (2 << 2) | 613d87a3195Smrg (pTrident->Clipping ? 1 : 0)); 614d87a3195Smrg BLADE_OUT(0x2108, (y << 16) | x); 615d87a3195Smrg BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 616d87a3195Smrg ((x + w - 1) & 0xfff)); 617d87a3195Smrg} 618d87a3195Smrg 619d87a3195Smrg#if 0 620d87a3195Smrgstatic void 621d87a3195SmrgBladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn, 622d87a3195Smrg int fg, int bg, 623d87a3195Smrg int rop, 624d87a3195Smrg unsigned int planemask) 625d87a3195Smrg{ 626d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 627d87a3195Smrg 628d87a3195Smrg pTrident->ROP = rop; 629d87a3195Smrg 630d87a3195Smrg REPLICATE(bg); 631d87a3195Smrg REPLICATE(fg); 632d87a3195Smrg IMAGE_OUT(0x44, fg); 633d87a3195Smrg IMAGE_OUT(0x48, bg); 634d87a3195Smrg IMAGE_OUT(0x20, 0x90000000 | XAAGetCopyROP(rop)); 635d87a3195Smrg pTrident->BltScanDirection = 0; 636d87a3195Smrg REPLICATE(planemask); 637d87a3195Smrg if (planemask != -1) { 638d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 639d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 640d87a3195Smrg } 641d87a3195Smrg} 642d87a3195Smrg 643d87a3195Smrgstatic void 644d87a3195SmrgBladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn, 645d87a3195Smrg int x, int y, 646d87a3195Smrg int w, int h, 647d87a3195Smrg int srcx, int srcy, 648d87a3195Smrg int offset) 649d87a3195Smrg{ 650d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 651d87a3195Smrg 652d87a3195Smrg IMAGE_OUT(0x00, (srcy << 16) | srcx); 653d87a3195Smrg IMAGE_OUT(0x04, ((srcy + h - 1) << 16) | (srcx + w - 1)); 654d87a3195Smrg IMAGE_OUT(0x08, (y << 16) | x); 655d87a3195Smrg IMAGE_OUT(0x0C, ((y + h - 1) << 16) | (x + w - 1)); 656d87a3195Smrg 657d87a3195Smrg IMAGE_OUT(0x24, 0x80000000 | 658d87a3195Smrg (3 << 22) | (1 << 7) | 659d87a3195Smrg pTrident->BltScanDirection | 660d87a3195Smrg (pTrident->ROP == GXcopy ? 0 : (1 << 10)) | 661d87a3195Smrg (offset << 25)); 662d87a3195Smrg} 663d87a3195Smrg#endif 664d87a3195Smrg 665d87a3195Smrgstatic void 666d87a3195SmrgBladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn, 667d87a3195Smrg int fg, int bg, 668d87a3195Smrg int rop, 669d87a3195Smrg unsigned int planemask) 670d87a3195Smrg{ 671d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 672d87a3195Smrg 673d87a3195Smrg pTrident->BltScanDirection = 0; 674d87a3195Smrg BLADE_OUT(0x2148, XAAGetCopyROP(rop)); 675d87a3195Smrg if (bg == -1) { 676d87a3195Smrg pTrident->BltScanDirection |= (2 << 19); 677d87a3195Smrg REPLICATE(fg); 678d87a3195Smrg BLADE_OUT(0x2160, fg); 679d87a3195Smrg BLADE_OUT(0x2164, ~fg); 680d87a3195Smrg } else { 681d87a3195Smrg pTrident->BltScanDirection |= (3 << 19); 682d87a3195Smrg REPLICATE(fg); 683d87a3195Smrg REPLICATE(bg); 684d87a3195Smrg BLADE_OUT(0x2160, fg); 685d87a3195Smrg BLADE_OUT(0x2164, bg); 686d87a3195Smrg } 687d87a3195Smrg 688d87a3195Smrg#if 0 689d87a3195Smrg REPLICATE(planemask); 690d87a3195Smrg if (planemask != -1) { 691d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 692d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 693d87a3195Smrg } 694d87a3195Smrg#endif 695d87a3195Smrg} 696d87a3195Smrg 697d87a3195Smrgstatic void 698d87a3195SmrgBladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn, 699d87a3195Smrg int x, int y, 700d87a3195Smrg int w, int h, 701d87a3195Smrg int skipleft) 702d87a3195Smrg{ 703d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 704d87a3195Smrg 705d87a3195Smrg if (skipleft) 706d87a3195Smrg BladeSetClippingRectangle(pScrn, 707d87a3195Smrg x + skipleft, y, 708d87a3195Smrg (x + w - 1), (y + h - 1)); 709d87a3195Smrg BLADE_OUT(0x2144, 0xE0000000 | 710d87a3195Smrg pTrident->BltScanDirection | 711d87a3195Smrg (1 << 4) | 712d87a3195Smrg (skipleft ? 1 : 0)); 713d87a3195Smrg BLADE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff)); 714d87a3195Smrg BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 715d87a3195Smrg ((x + w - 1) & 0xfff)); 716d87a3195Smrg} 717d87a3195Smrg 718d87a3195Smrgstatic void 719d87a3195SmrgBladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 720d87a3195Smrg int patternx, int patterny, 721d87a3195Smrg int fg, int bg, 722d87a3195Smrg int rop, 723d87a3195Smrg unsigned int planemask) 724d87a3195Smrg{ 725d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 726d87a3195Smrg 727d87a3195Smrg BladeSync(pScrn); 728d87a3195Smrg BLADE_OUT(0x2148, XAAGetPatternROP(rop)); 729d87a3195Smrg 730d87a3195Smrg if (bg == -1) { 731d87a3195Smrg REPLICATE(fg); 732d87a3195Smrg BLADE_OUT(0x216C, 0x80000000 | (1 << 30)); 733d87a3195Smrg BLADE_OUT(0x216C, 0x80000000 | (1 << 28) | (1 << 30)); 734d87a3195Smrg BLADE_OUT(0x2170, patternx); 735d87a3195Smrg BLADE_OUT(0x2170, patterny); 736d87a3195Smrg BLADE_OUT(0x2174, fg); 737d87a3195Smrg#if 0 738d87a3195Smrg BLADE_OUT(0x2178, ~fg); 739d87a3195Smrg#endif 740d87a3195Smrg } else { 741d87a3195Smrg REPLICATE(fg); 742d87a3195Smrg REPLICATE(bg); 743d87a3195Smrg BLADE_OUT(0x216C, 0x80000000); 744d87a3195Smrg BLADE_OUT(0x216C, 0x80000000 | (1 << 28)); 745d87a3195Smrg BLADE_OUT(0x2170, patternx); 746d87a3195Smrg BLADE_OUT(0x2170, patterny); 747d87a3195Smrg BLADE_OUT(0x2174, fg); 748d87a3195Smrg BLADE_OUT(0x2178, bg); 749d87a3195Smrg } 750d87a3195Smrg 751d87a3195Smrg pTrident->BltScanDirection = 0; 752d87a3195Smrg#if 0 753d87a3195Smrg REPLICATE(planemask); 754d87a3195Smrg if (planemask != -1) { 755d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 756d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 757d87a3195Smrg } 758d87a3195Smrg#endif 759d87a3195Smrg} 760d87a3195Smrg 761d87a3195Smrgstatic void 762d87a3195SmrgBladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 763d87a3195Smrg int patternx, int patterny, 764d87a3195Smrg int x, int y, 765d87a3195Smrg int w, int h) 766d87a3195Smrg{ 767d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 768d87a3195Smrg int clip = 0; 769d87a3195Smrg 770d87a3195Smrg if (pTrident->Clipping) clip = 1; 771d87a3195Smrg BLADE_OUT(0x2144, 0x20000000 | 772d87a3195Smrg pTrident->BltScanDirection | 773d87a3195Smrg (7 << 12) | (1 << 4) | 774d87a3195Smrg (1 << 19) | (2 << 2) | clip); 775d87a3195Smrg BLADE_OUT(0x2108, (y << 16) | x); 776d87a3195Smrg BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 777d87a3195Smrg ((x + w - 1) & 0xfff)); 778d87a3195Smrg} 779d87a3195Smrg 780d87a3195Smrg#if 0 781d87a3195Smrgstatic void 782d87a3195SmrgBladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, 783d87a3195Smrg int patternx, int patterny, 784d87a3195Smrg int rop, 785d87a3195Smrg unsigned int planemask, 786d87a3195Smrg int transparency_color) 787d87a3195Smrg{ 788d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 789d87a3195Smrg 790d87a3195Smrg TGUI_PATLOC(((patterny * 791d87a3195Smrg pScrn->displayWidth * 792d87a3195Smrg (pScrn->bitsPerPixel / 8)) + 793d87a3195Smrg (patternx * 794d87a3195Smrg (pScrn->bitsPerPixel / 8))) >> 6); 795d87a3195Smrg pTrident->BltScanDirection = 0; 796d87a3195Smrg if (transparency_color != -1) { 797d87a3195Smrg BLADE_OUT(0x2168, transparency_color & 0xffffff); 798d87a3195Smrg pTrident->BltScanDirection |= (1 << 6); 799d87a3195Smrg } 800d87a3195Smrg TGUI_FMIX(XAAGetPatternROP(rop)); 801d87a3195Smrg REPLICATE(planemask); 802d87a3195Smrg if (planemask != -1) { 803d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 804d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 805d87a3195Smrg } 806d87a3195Smrg} 807d87a3195Smrg 808d87a3195Smrgstatic void 809d87a3195SmrgBladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, 810d87a3195Smrg int patternx, int patterny, 811d87a3195Smrg int x, int y, 812d87a3195Smrg int w, int h) 813d87a3195Smrg{ 814d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 815d87a3195Smrg 816d87a3195Smrg TGUI_DEST_XY(x, y); 817d87a3195Smrg TGUI_DIM_XY(w, h); 818d87a3195Smrg TGUI_COMMAND(GE_BLT); 819d87a3195Smrg CHECKCLIPPING; 820d87a3195Smrg} 821d87a3195Smrg#endif 822d87a3195Smrg 823d87a3195Smrgstatic void 824d87a3195SmrgBladeSetupForImageWrite(ScrnInfoPtr pScrn, 825d87a3195Smrg int rop, 826d87a3195Smrg unsigned int planemask, 827d87a3195Smrg int transparency_color, 828d87a3195Smrg int bpp, int depth) 829d87a3195Smrg{ 830d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 831d87a3195Smrg 832d87a3195Smrg BLADE_OUT(0x2148, XAAGetCopyROP(rop)); 833d87a3195Smrg pTrident->BltScanDirection = 0; 834d87a3195Smrg#if 0 835d87a3195Smrg REPLICATE(planemask); 836d87a3195Smrg if (planemask != -1) { 837d87a3195Smrg BLADE_OUT(0x2184, ~planemask); 838d87a3195Smrg pTrident->BltScanDirection |= (1 << 5); 839d87a3195Smrg } 840d87a3195Smrg#endif 841d87a3195Smrg} 842d87a3195Smrg 843d87a3195Smrgstatic void 844d87a3195SmrgBladeSubsequentImageWriteRect(ScrnInfoPtr pScrn, 845d87a3195Smrg int x, int y, 846d87a3195Smrg int w, int h, 847d87a3195Smrg int skipleft) 848d87a3195Smrg{ 849d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 850d87a3195Smrg 851d87a3195Smrg if (skipleft) 852d87a3195Smrg BladeSetClippingRectangle(pScrn, 853d87a3195Smrg x + skipleft, y, 854d87a3195Smrg (x + w - 1), (y + h - 1)); 855d87a3195Smrg BLADE_OUT(0x2144, 0xE0000000 | 856d87a3195Smrg (1 << 19) | (1 << 4) | 857d87a3195Smrg pTrident->BltScanDirection | 858d87a3195Smrg (skipleft ? 1 : 0)); 859d87a3195Smrg BLADE_OUT(0x2108, (y << 16) | (x & 0xfff)); 860d87a3195Smrg BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 861d87a3195Smrg ((x + w - 1) & 0xfff)); 862d87a3195Smrg} 863d87a3195Smrg#endif 864