1d87a3195Smrg/* 2d87a3195Smrg * Copyright 1992-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 * CyberBladeXP4 accelerated options. 27d87a3195Smrg */ 28d87a3195Smrg#ifdef HAVE_CONFIG_H 29d87a3195Smrg#include "config.h" 30d87a3195Smrg#endif 31d87a3195Smrg 32d87a3195Smrg#include "xf86.h" 33d87a3195Smrg#include "xf86_OSproc.h" 34d87a3195Smrg 35d87a3195Smrg#include "xf86Pci.h" 36d87a3195Smrg 37d87a3195Smrg#include "miline.h" 38d87a3195Smrg 39d87a3195Smrg#include "trident.h" 40d87a3195Smrg#include "trident_regs.h" 41d87a3195Smrg 42d87a3195Smrg#ifdef HAVE_XAA_H 43d87a3195Smrg#include "xaarop.h" 44d87a3195Smrg 45d87a3195Smrgstatic void XP4Sync(ScrnInfoPtr pScrn); 46d87a3195Smrg#if 0 47d87a3195Smrgstatic void XP4SetupForDashedLine(ScrnInfoPtr pScrn, 48d87a3195Smrg int fg, int bg, 49d87a3195Smrg int rop, 50d87a3195Smrg unsigned int planemask, 51d87a3195Smrg int length, 52d87a3195Smrg unsigned char *pattern); 53d87a3195Smrgstatic void XP4SubsequentDashedBresenhamLine(ScrnInfoPtr pScrn, 54d87a3195Smrg int x, int y, 55d87a3195Smrg int dmaj, int dmin, 56d87a3195Smrg int e, int len, 57d87a3195Smrg int octant, 58d87a3195Smrg int phase); 59d87a3195Smrgstatic void XP4SetupForSolidLine(ScrnInfoPtr pScrn, 60d87a3195Smrg int color, 61d87a3195Smrg int rop, 62d87a3195Smrg unsigned int planemask); 63d87a3195Smrgstatic void XP4SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, 64d87a3195Smrg int x, int y, 65d87a3195Smrg int dmaj, int dmin, 66d87a3195Smrg int e, int len, 67d87a3195Smrg int octant); 68d87a3195Smrgstatic void XP4SubsequentSolidHorVertLine(ScrnInfoPtr pScrn, 69d87a3195Smrg int x, int y, 70d87a3195Smrg int len, int dir); 71d87a3195Smrg#endif 72d87a3195Smrgstatic void XP4SetupForFillRectSolid(ScrnInfoPtr pScrn, 73d87a3195Smrg int color, 74d87a3195Smrg int rop, 75d87a3195Smrg unsigned int planemask); 76d87a3195Smrgstatic void XP4SubsequentFillRectSolid(ScrnInfoPtr pScrn, 77d87a3195Smrg int x, int y, 78d87a3195Smrg int w, int h); 79d87a3195Smrgstatic void XP4SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 80d87a3195Smrg int x1, int y1, 81d87a3195Smrg int x2, int y2, 82d87a3195Smrg int w, int h); 83d87a3195Smrgstatic void XP4SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 84d87a3195Smrg int xdir, int ydir, 85d87a3195Smrg int rop, 86d87a3195Smrg unsigned int planemask, 87d87a3195Smrg int transparency_color); 88d87a3195Smrgstatic void XP4SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 89d87a3195Smrg int patternx, 90d87a3195Smrg int patterny, 91d87a3195Smrg int fg, int bg, 92d87a3195Smrg int rop, 93d87a3195Smrg unsigned int planemask); 94d87a3195Smrgstatic void XP4SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 95d87a3195Smrg int patternx, 96d87a3195Smrg int patterny, 97d87a3195Smrg int x, int y, 98d87a3195Smrg int w, int h); 99d87a3195Smrg#if 0 100d87a3195Smrgstatic void XP4SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 101d87a3195Smrg int fg, int bg, 102d87a3195Smrg int rop, 103d87a3195Smrg unsigned int planemask); 104d87a3195Smrgstatic void XP4SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 105d87a3195Smrg int x, int y, 106d87a3195Smrg int w, int h, 107d87a3195Smrg int skipleft); 108d87a3195Smrg#endif 109d87a3195Smrg 110d87a3195Smrgstatic int bpp; 111d87a3195Smrgstatic int ropcode; 112d87a3195Smrg 113d87a3195Smrgstatic void 114d87a3195SmrgXP4InitializeAccelerator(ScrnInfoPtr pScrn) 115d87a3195Smrg{ 116d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 117d87a3195Smrg int shift; 118d87a3195Smrg 119d87a3195Smrg /* This forces updating the clipper */ 120d87a3195Smrg pTrident->Clipping = TRUE; 121d87a3195Smrg 122d87a3195Smrg CHECKCLIPPING; 123d87a3195Smrg 124d87a3195Smrg switch (pScrn->bitsPerPixel) { 125d87a3195Smrg case 8: 126d87a3195Smrg default: /* Muffle compiler */ 127d87a3195Smrg shift = 18; 128d87a3195Smrg break; 129d87a3195Smrg case 16: 130d87a3195Smrg shift = 19; 131d87a3195Smrg break; 132d87a3195Smrg case 32: 133d87a3195Smrg shift = 20; 134d87a3195Smrg break; 135d87a3195Smrg } 136d87a3195Smrg 137d87a3195Smrg switch (pScrn->bitsPerPixel) { 138d87a3195Smrg case 8: 139d87a3195Smrg bpp = 0x40; 140d87a3195Smrg break; 141d87a3195Smrg case 16: 142d87a3195Smrg bpp = 0x41; 143d87a3195Smrg break; 144d87a3195Smrg case 32: 145d87a3195Smrg bpp = 0x42; 146d87a3195Smrg break; 147d87a3195Smrg } 148d87a3195Smrg 149d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2154, 150d87a3195Smrg (pScrn->displayWidth) << shift); 151d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2150, 152d87a3195Smrg (pScrn->displayWidth) << shift); 153d87a3195Smrg} 154d87a3195Smrg#endif 155d87a3195Smrg 156d87a3195SmrgBool XP4XaaInit(ScreenPtr pScreen) 157d87a3195Smrg{ 158d87a3195Smrg#ifdef HAVE_XAA_H 159d87a3195Smrg XAAInfoRecPtr infoPtr; 160d87a3195Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 161d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 162d87a3195Smrg 163d87a3195Smrg if (pTrident->NoAccel) 164d87a3195Smrg return FALSE; 165d87a3195Smrg 166d87a3195Smrg pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec(); 167d87a3195Smrg if (!infoPtr) return FALSE; 168d87a3195Smrg 169d87a3195Smrg infoPtr->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS | 170d87a3195Smrg LINEAR_FRAMEBUFFER; 171d87a3195Smrg 172d87a3195Smrg pTrident->InitializeAccelerator = XP4InitializeAccelerator; 173d87a3195Smrg XP4InitializeAccelerator(pScrn); 174d87a3195Smrg 175d87a3195Smrg infoPtr->Sync = XP4Sync; 176d87a3195Smrg 177d87a3195Smrg#if 0 /* TO DO for the XP */ 178d87a3195Smrg infoPtr->SolidLineFlags = NO_PLANEMASK; 179d87a3195Smrg infoPtr->SetupForSolidLine = XP4SetupForSolidLine; 180d87a3195Smrg infoPtr->SolidBresenhamLineErrorTermBits = 12; 181d87a3195Smrg infoPtr->SubsequentSolidBresenhamLine = 182d87a3195Smrg XP4SubsequentSolidBresenhamLine; 183d87a3195Smrg 184d87a3195Smrg infoPtr->DashedLineFlags = LINE_PATTERN_MSBFIRST_LSBJUSTIFIED | 185d87a3195Smrg NO_PLANEMASK | 186d87a3195Smrg LINE_PATTERN_POWER_OF_2_ONLY; 187d87a3195Smrg infoPtr->SetupForDashedLine = XP4SetupForDashedLine; 188d87a3195Smrg infoPtr->DashedBresenhamLineErrorTermBits = 12; 189d87a3195Smrg infoPtr->SubsequentDashedBresenhamLine = 190d87a3195Smrg XP4SubsequentDashedBresenhamLine; 191d87a3195Smrg infoPtr->DashPatternMaxLength = 16; 192d87a3195Smrg#endif 193d87a3195Smrg 194d87a3195Smrg infoPtr->SolidFillFlags = NO_PLANEMASK; 195d87a3195Smrg infoPtr->SetupForSolidFill = XP4SetupForFillRectSolid; 196d87a3195Smrg infoPtr->SubsequentSolidFillRect = XP4SubsequentFillRectSolid; 197d87a3195Smrg#if 0 198d87a3195Smrg infoPtr->SubsequentSolidHorVertLine = XP4SubsequentSolidHorVertLine; 199d87a3195Smrg#endif 200d87a3195Smrg 201d87a3195Smrg infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK | NO_TRANSPARENCY; 202d87a3195Smrg 203d87a3195Smrg infoPtr->SetupForScreenToScreenCopy = 204d87a3195Smrg XP4SetupForScreenToScreenCopy; 205d87a3195Smrg infoPtr->SubsequentScreenToScreenCopy = 206d87a3195Smrg XP4SubsequentScreenToScreenCopy; 207d87a3195Smrg 208d87a3195Smrg infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | 209d87a3195Smrg HARDWARE_PATTERN_PROGRAMMED_BITS | 210d87a3195Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 211d87a3195Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 212d87a3195Smrg 213d87a3195Smrg infoPtr->SetupForMono8x8PatternFill = 214d87a3195Smrg XP4SetupForMono8x8PatternFill; 215d87a3195Smrg infoPtr->SubsequentMono8x8PatternFillRect = 216d87a3195Smrg XP4SubsequentMono8x8PatternFillRect; 217d87a3195Smrg 218d87a3195Smrg#if 0 219d87a3195Smrg infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK | 220d87a3195Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 221d87a3195Smrg infoPtr->ColorExpandBase = pTrident->D3Base; 222d87a3195Smrg infoPtr->ColorExpandRange = pScrn->displayWidth; 223d87a3195Smrg 224d87a3195Smrg infoPtr->SetupForCPUToScreenColorExpandFill = 225d87a3195Smrg XP4SetupForCPUToScreenColorExpandFill; 226d87a3195Smrg infoPtr->SubsequentCPUToScreenColorExpandFill = 227d87a3195Smrg XP4SubsequentCPUToScreenColorExpandFill; 228d87a3195Smrg#endif 229d87a3195Smrg 230d87a3195Smrg return(XAAInit(pScreen, infoPtr)); 231d87a3195Smrg#else 232d87a3195Smrg return FALSE; 233d87a3195Smrg#endif 234d87a3195Smrg} 235d87a3195Smrg 236d87a3195Smrg#ifdef HAVE_XAA_H 237d87a3195Smrgstatic void 238d87a3195SmrgXP4Sync(ScrnInfoPtr pScrn) 239d87a3195Smrg{ 240d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 241d87a3195Smrg int count = 0, timeout = 0; 242d87a3195Smrg int busy; 243d87a3195Smrg 244d87a3195Smrg for (;;) { 245d87a3195Smrg BLTBUSY(busy); 246d87a3195Smrg if (busy != GE_BUSY) { 247d87a3195Smrg return; 248d87a3195Smrg } 249d87a3195Smrg 250d87a3195Smrg count++; 251d87a3195Smrg if (count == 10000000) { 252d87a3195Smrg ErrorF("XP: BitBLT engine time-out.\n"); 253d87a3195Smrg count = 9990000; 254d87a3195Smrg timeout++; 255d87a3195Smrg if (timeout == 4) { 256d87a3195Smrg /* Reset BitBLT Engine */ 257d87a3195Smrg TGUI_STATUS(0x00); 258d87a3195Smrg return; 259d87a3195Smrg } 260d87a3195Smrg } 261d87a3195Smrg } 262d87a3195Smrg} 263d87a3195Smrg 264d87a3195Smrgstatic void 265d87a3195SmrgXP4SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 266d87a3195Smrg int xdir, int ydir, 267d87a3195Smrg int rop, 268d87a3195Smrg unsigned int planemask, 269d87a3195Smrg int transparency_color) 270d87a3195Smrg{ 271d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 272d87a3195Smrg int dst = 0; 273d87a3195Smrg 274d87a3195Smrg pTrident->BltScanDirection = 0; 275d87a3195Smrg if (xdir < 0) pTrident->BltScanDirection |= XNEG; 276d87a3195Smrg if (ydir < 0) pTrident->BltScanDirection |= YNEG; 277d87a3195Smrg 278d87a3195Smrg REPLICATE(transparency_color); 279d87a3195Smrg if (transparency_color != -1) { 280d87a3195Smrg dst |= 3<<16; 281d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2134, transparency_color); 282d87a3195Smrg } 283d87a3195Smrg 284d87a3195Smrg ropcode = rop; 285d87a3195Smrg 286d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2128, 287d87a3195Smrg pTrident->BltScanDirection | SCR2SCR); 288d87a3195Smrg} 289d87a3195Smrg 290d87a3195Smrgstatic void 291d87a3195SmrgXP4SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 292d87a3195Smrg int x1, int y1, 293d87a3195Smrg int x2, int y2, 294d87a3195Smrg int w, int h) 295d87a3195Smrg{ 296d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 297d87a3195Smrg 298d87a3195Smrg if (pTrident->BltScanDirection & YNEG) { 299d87a3195Smrg y1 = y1 + h - 1; 300d87a3195Smrg y2 = y2 + h - 1; 301d87a3195Smrg } 302d87a3195Smrg if (pTrident->BltScanDirection & XNEG) { 303d87a3195Smrg x1 = x1 + w - 1; 304d87a3195Smrg x2 = x2 + w - 1; 305d87a3195Smrg } 306d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2138, (x2 << 16) | y2); 307d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x213C, (x1 << 16) | y1); 308d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h); 309d87a3195Smrg XP4Sync(pScrn); 310d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2124, 311d87a3195Smrg (XAAGetCopyROP(ropcode) << 24) | 312d87a3195Smrg (bpp << 8) | 313d87a3195Smrg 1); 314d87a3195Smrg} 315d87a3195Smrg 316d87a3195Smrg#if 0 317d87a3195Smrgstatic void 318d87a3195SmrgXP4SetupForSolidLine(ScrnInfoPtr pScrn, 319d87a3195Smrg int color, 320d87a3195Smrg int rop, 321d87a3195Smrg unsigned int planemask) 322d87a3195Smrg{ 323d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 324d87a3195Smrg 325d87a3195Smrg pTrident->BltScanDirection = 0; 326d87a3195Smrg REPLICATE(color); 327d87a3195Smrg TGUI_FMIX(XAAPatternROP[rop]); 328d87a3195Smrg if (pTrident->Chipset >= PROVIDIA9685) { 329d87a3195Smrg TGUI_FPATCOL(color); 330d87a3195Smrg } else { 331d87a3195Smrg TGUI_FCOLOUR(color); 332d87a3195Smrg } 333d87a3195Smrg} 334d87a3195Smrg 335d87a3195Smrgstatic void 336d87a3195SmrgXP4SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, 337d87a3195Smrg int x, int y, 338d87a3195Smrg int dmaj, int dmin, 339d87a3195Smrg int e, int len, int octant) 340d87a3195Smrg{ 341d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 342d87a3195Smrg int tmp = pTrident->BltScanDirection; 343d87a3195Smrg 344d87a3195Smrg if (octant & YMAJOR) tmp |= YMAJ; 345d87a3195Smrg if (octant & XDECREASING) tmp |= XNEG; 346d87a3195Smrg if (octant & YDECREASING) tmp |= YNEG; 347d87a3195Smrg TGUI_DRAWFLAG(SOLIDFILL | STENCIL | tmp); 348d87a3195Smrg XP_SRC_XY(dmin - dmaj, dmin); 349d87a3195Smrg XP_DEST_XY(x, y); 350d87a3195Smrg XP_DIM_XY(dmin + e, len); 351d87a3195Smrg TGUI_COMMAND(GE_BRESLINE); 352d87a3195Smrg XP4Sync(pScrn); 353d87a3195Smrg} 354d87a3195Smrg 355d87a3195Smrgstatic void 356d87a3195SmrgXP4SubsequentSolidHorVertLine(ScrnInfoPtr pScrn, 357d87a3195Smrg int x, int y, 358d87a3195Smrg int len, int dir) 359d87a3195Smrg{ 360d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 361d87a3195Smrg 362d87a3195Smrg TGUI_DRAWFLAG(SOLIDFILL); 363d87a3195Smrg if (dir == DEGREES_0) { 364d87a3195Smrg XP_DIM_XY(len, 1); 365d87a3195Smrg XP_DEST_XY(x, y); 366d87a3195Smrg } else { 367d87a3195Smrg XP_DIM_XY(1, len); 368d87a3195Smrg XP_DEST_XY(x, y); 369d87a3195Smrg } 370d87a3195Smrg 371d87a3195Smrg TGUI_COMMAND(GE_BLT); 372d87a3195Smrg XP4Sync(pScrn); 373d87a3195Smrg} 374d87a3195Smrg 375d87a3195Smrgvoid 376d87a3195SmrgXP4SetupForDashedLine(ScrnInfoPtr pScrn, 377d87a3195Smrg int fg, int bg, 378d87a3195Smrg int rop, 379d87a3195Smrg unsigned int planemask, 380d87a3195Smrg int length, 381d87a3195Smrg unsigned char *pattern) 382d87a3195Smrg{ 383d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 384d87a3195Smrg CARD32 *DashPattern = (CARD32*)pattern; 385d87a3195Smrg CARD32 NiceDashPattern = DashPattern[0]; 386d87a3195Smrg 387d87a3195Smrg NiceDashPattern = *((CARD16 *)pattern) & ((1 << length) - 1); 388d87a3195Smrg switch(length) { 389d87a3195Smrg case 2: NiceDashPattern |= NiceDashPattern << 2; 390d87a3195Smrg case 4: NiceDashPattern |= NiceDashPattern << 4; 391d87a3195Smrg case 8: NiceDashPattern |= NiceDashPattern << 8; 392d87a3195Smrg } 393d87a3195Smrg pTrident->BltScanDirection = 0; 394d87a3195Smrg REPLICATE(fg); 395d87a3195Smrg if (pTrident->Chipset >= PROVIDIA9685) { 396d87a3195Smrg TGUI_FPATCOL(fg); 397d87a3195Smrg if (bg == -1) { 398d87a3195Smrg pTrident->BltScanDirection |= (1 << 12); 399d87a3195Smrg TGUI_BPATCOL(~fg); 400d87a3195Smrg } else { 401d87a3195Smrg REPLICATE(bg); 402d87a3195Smrg TGUI_BPATCOL(bg); 403d87a3195Smrg } 404d87a3195Smrg } else { 405d87a3195Smrg TGUI_FCOLOUR(fg); 406d87a3195Smrg if (bg == -1) { 407d87a3195Smrg pTrident->BltScanDirection |= (1 << 12); 408d87a3195Smrg TGUI_BCOLOUR(~fg); 409d87a3195Smrg } else { 410d87a3195Smrg REPLICATE(bg); 411d87a3195Smrg TGUI_BCOLOUR(bg); 412d87a3195Smrg } 413d87a3195Smrg } 414d87a3195Smrg 415d87a3195Smrg TGUI_FMIX(XAAPatternROP[rop]); 416d87a3195Smrg pTrident->LinePattern = NiceDashPattern; 417d87a3195Smrg} 418d87a3195Smrg 419d87a3195Smrgvoid 420d87a3195SmrgXP4SubsequentDashedBresenhamLine(ScrnInfoPtr pScrn, 421d87a3195Smrg int x, int y, 422d87a3195Smrg int dmaj, int dmin, 423d87a3195Smrg int e, int len, 424d87a3195Smrg int octant, int phase) 425d87a3195Smrg{ 426d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 427d87a3195Smrg int tmp = pTrident->BltScanDirection; 428d87a3195Smrg 429d87a3195Smrg if (octant & YMAJOR) tmp |= YMAJ; 430d87a3195Smrg if (octant & XDECREASING) tmp |= XNEG; 431d87a3195Smrg if (octant & YDECREASING) tmp |= YNEG; 432d87a3195Smrg 433d87a3195Smrg TGUI_STYLE(((pTrident->LinePattern >> phase) | 434d87a3195Smrg (pTrident->LinePattern << (16 - phase))) & 0x0000FFFF); 435d87a3195Smrg TGUI_DRAWFLAG(STENCIL | tmp); 436d87a3195Smrg XP_SRC_XY(dmin - dmaj, dmin); 437d87a3195Smrg XP_DEST_XY(x, y); 438d87a3195Smrg XP_DIM_XY(e + dmin, len); 439d87a3195Smrg TGUI_COMMAND(GE_BRESLINE); 440d87a3195Smrg XP4Sync(pScrn); 441d87a3195Smrg} 442d87a3195Smrg#endif 443d87a3195Smrg 444d87a3195Smrgstatic void 445d87a3195SmrgXP4SetupForFillRectSolid(ScrnInfoPtr pScrn, 446d87a3195Smrg int color, 447d87a3195Smrg int rop, 448d87a3195Smrg unsigned int planemask) 449d87a3195Smrg{ 450d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 451d87a3195Smrg 452d87a3195Smrg ropcode = rop; 453d87a3195Smrg 454d87a3195Smrg REPLICATE(color); 455d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2158, color); 456d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2128, 1 << 14); 457d87a3195Smrg} 458d87a3195Smrg 459d87a3195Smrgstatic void 460d87a3195SmrgXP4SubsequentFillRectSolid(ScrnInfoPtr pScrn, 461d87a3195Smrg int x, int y, 462d87a3195Smrg int w, int h) 463d87a3195Smrg{ 464d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 465d87a3195Smrg 466d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y); 467d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h); 468d87a3195Smrg XP4Sync(pScrn); 469d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2124, 470d87a3195Smrg (XAAGetPatternROP(ropcode) << 24) | 471d87a3195Smrg (bpp << 8) | 472d87a3195Smrg 2); 473d87a3195Smrg} 474d87a3195Smrg 475d87a3195Smrg#if 0 476d87a3195Smrgstatic void 477d87a3195SmrgMoveDWORDS(register CARD32* dest, 478d87a3195Smrg register CARD32* src, 479d87a3195Smrg register int dwords) 480d87a3195Smrg{ 481d87a3195Smrg while(dwords & ~0x03) { 482d87a3195Smrg *dest = *src; 483d87a3195Smrg *(dest + 1) = *(src + 1); 484d87a3195Smrg *(dest + 2) = *(src + 2); 485d87a3195Smrg *(dest + 3) = *(src + 3); 486d87a3195Smrg src += 4; 487d87a3195Smrg dest += 4; 488d87a3195Smrg dwords -= 4; 489d87a3195Smrg } 490d87a3195Smrg 491d87a3195Smrg if (!dwords) return; 492d87a3195Smrg *dest = *src; 493d87a3195Smrg dest += 1; 494d87a3195Smrg src += 1; 495d87a3195Smrg if (dwords == 1) return; 496d87a3195Smrg *dest = *src; 497d87a3195Smrg dest += 1; 498d87a3195Smrg src += 1; 499d87a3195Smrg if (dwords == 2) return; 500d87a3195Smrg *dest = *src; 501d87a3195Smrg dest += 1; 502d87a3195Smrg src += 1; 503d87a3195Smrg} 504d87a3195Smrg#endif 505d87a3195Smrg 506d87a3195Smrg#if 0 507d87a3195Smrgstatic void 508d87a3195SmrgMoveDWORDS_FixedBase(register CARD32* dest, 509d87a3195Smrg register CARD32* src, 510d87a3195Smrg register int dwords) 511d87a3195Smrg{ 512d87a3195Smrg while(dwords & ~0x03) { 513d87a3195Smrg *dest = *src; 514d87a3195Smrg *dest = *(src + 1); 515d87a3195Smrg *dest = *(src + 2); 516d87a3195Smrg *dest = *(src + 3); 517d87a3195Smrg dwords -= 4; 518d87a3195Smrg src += 4; 519d87a3195Smrg } 520d87a3195Smrg 521d87a3195Smrg if(!dwords) return; 522d87a3195Smrg *dest = *src; 523d87a3195Smrg if(dwords == 1) return; 524d87a3195Smrg *dest = *(src + 1); 525d87a3195Smrg if(dwords == 2) return; 526d87a3195Smrg *dest = *(src + 2); 527d87a3195Smrg} 528d87a3195Smrg#endif 529d87a3195Smrg 530d87a3195Smrgstatic void 531d87a3195SmrgXP4SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 532d87a3195Smrg int patternx, int patterny, 533d87a3195Smrg int fg, int bg, 534d87a3195Smrg int rop, 535d87a3195Smrg unsigned int planemask) 536d87a3195Smrg{ 537d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 538d87a3195Smrg int drawflag = 0; 539d87a3195Smrg 540d87a3195Smrg REPLICATE(fg); 541d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2158, fg); 542d87a3195Smrg 543d87a3195Smrg if (bg == -1) { 544d87a3195Smrg drawflag |= (1 << 12); 545d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x215C, ~fg); 546d87a3195Smrg } else { 547d87a3195Smrg REPLICATE(bg); 548d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x215C, bg); 549d87a3195Smrg } 550d87a3195Smrg 551d87a3195Smrg ropcode = rop; 552d87a3195Smrg 553d87a3195Smrg drawflag |= (7 << 18); 554d87a3195Smrg TGUI_DRAWFLAG(PATMONO | drawflag); 555d87a3195Smrg} 556d87a3195Smrg 557d87a3195Smrgstatic void 558d87a3195SmrgXP4SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 559d87a3195Smrg int patternx, int patterny, 560d87a3195Smrg int x, int y, 561d87a3195Smrg int w, int h) 562d87a3195Smrg{ 563d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 564d87a3195Smrg 565d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2180, patternx); 566d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2184, patterny); 567d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y); 568d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h); 569d87a3195Smrg XP4Sync(pScrn); 570d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2124, 571d87a3195Smrg (XAAGetPatternROP(ropcode) << 24) | 572d87a3195Smrg (bpp << 8) | 573d87a3195Smrg 2); 574d87a3195Smrg} 575d87a3195Smrg 576d87a3195Smrg#if 0 577d87a3195Smrgstatic void 578d87a3195SmrgXP4SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 579d87a3195Smrg int fg, int bg, 580d87a3195Smrg int rop, 581d87a3195Smrg unsigned int planemask) 582d87a3195Smrg{ 583d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 584d87a3195Smrg 585d87a3195Smrg ropcode = XAAGetCopyROP(rop); 586d87a3195Smrg#if 0 587d87a3195Smrg TGUI_FMIX(XAACopyROP[rop]); 588d87a3195Smrg#endif 589d87a3195Smrg if (bg == -1) { 590d87a3195Smrg TGUI_DRAWFLAG(SRCMONO | (1 << 12)); 591d87a3195Smrg REPLICATE(fg); 592d87a3195Smrg TGUI_FCOLOUR(fg); 593d87a3195Smrg } else { 594d87a3195Smrg TGUI_DRAWFLAG(SRCMONO); 595d87a3195Smrg REPLICATE(fg); 596d87a3195Smrg REPLICATE(bg); 597d87a3195Smrg TGUI_FCOLOUR(fg); 598d87a3195Smrg TGUI_BCOLOUR(bg); 599d87a3195Smrg } 600d87a3195Smrg} 601d87a3195Smrg 602d87a3195Smrgstatic void 603d87a3195SmrgXP4SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 604d87a3195Smrg int x, int y, 605d87a3195Smrg int w, int h, 606d87a3195Smrg int skipleft) 607d87a3195Smrg{ 608d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 609d87a3195Smrg 610d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y); 611d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h); 612d87a3195Smrg XP4Sync(pScrn); 613d87a3195Smrg MMIO_OUT32(pTrident->IOBase, 0x2124, (ropcode << 24) | 614d87a3195Smrg (bpp << 8) | 615d87a3195Smrg 2); 616d87a3195Smrg} 617d87a3195Smrg#endif 618d87a3195Smrg#endif 619