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 3DImage' 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 47d87a3195Smrg 48d87a3195Smrgstatic void ImageSync(ScrnInfoPtr pScrn); 49d87a3195Smrgstatic void ImageSyncClip(ScrnInfoPtr pScrn); 50d87a3195Smrg#if 0 51d87a3195Smrgstatic void ImageSetupForSolidLine(ScrnInfoPtr pScrn, 52d87a3195Smrg int color, 53d87a3195Smrg int rop, 54d87a3195Smrg unsigned int planemask); 55d87a3195Smrgstatic void ImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, 56d87a3195Smrg int x, int y, 57d87a3195Smrg int dmaj, int dmin, 58d87a3195Smrg int e, int len, 59d87a3195Smrg int octant); 60d87a3195Smrg#endif 61d87a3195Smrgstatic void ImageSetupForFillRectSolid(ScrnInfoPtr pScrn, 62d87a3195Smrg int color, 63d87a3195Smrg int rop, 64d87a3195Smrg unsigned int planemask); 65d87a3195Smrgstatic void ImageSubsequentFillRectSolid(ScrnInfoPtr pScrn, 66d87a3195Smrg int x, int y, 67d87a3195Smrg int w, int h); 68d87a3195Smrgstatic void ImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 69d87a3195Smrg int x1, int y1, 70d87a3195Smrg int x2, int y2, 71d87a3195Smrg int w, int h); 72d87a3195Smrgstatic void ImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 73d87a3195Smrg int xdir, int ydir, 74d87a3195Smrg int rop, 75d87a3195Smrg unsigned int planemask, 76d87a3195Smrg int transparency_color); 77d87a3195Smrgstatic void ImageSetClippingRectangle(ScrnInfoPtr pScrn, 78d87a3195Smrg int x1, int y1, 79d87a3195Smrg int x2, int y2); 80d87a3195Smrgstatic void ImageDisableClipping(ScrnInfoPtr pScrn); 81d87a3195Smrgstatic void ImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 82d87a3195Smrg int patternx, 83d87a3195Smrg int patterny, 84d87a3195Smrg int fg, int bg, 85d87a3195Smrg int rop, 86d87a3195Smrg unsigned int planemask); 87d87a3195Smrgstatic void ImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 88d87a3195Smrg int patternx, 89d87a3195Smrg int patterny, 90d87a3195Smrg int x, int y, 91d87a3195Smrg int w, int h); 92d87a3195Smrg#if 0 93d87a3195Smrgstatic void ImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, 94d87a3195Smrg int patternx, 95d87a3195Smrg int patterny, 96d87a3195Smrg int rop, 97d87a3195Smrg unsigned int planemask, 98d87a3195Smrg int trans_col); 99d87a3195Smrgstatic void ImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, 100d87a3195Smrg int patternx, 101d87a3195Smrg int patterny, 102d87a3195Smrg int x, int y, 103d87a3195Smrg int w, int h); 104d87a3195Smrg#endif 105d87a3195Smrgstatic void ImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn, 106d87a3195Smrg int rop, 107d87a3195Smrg unsigned int planemask, 108d87a3195Smrg int transparency_color, 109d87a3195Smrg int bpp, 110d87a3195Smrg int depth); 111d87a3195Smrgstatic void ImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn, 112d87a3195Smrg int x, int y, 113d87a3195Smrg int w, int h, 114d87a3195Smrg int skipleft); 115d87a3195Smrgstatic void ImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn, 116d87a3195Smrg int bufno); 117d87a3195Smrgstatic void ImageSetupForScanlineCPUToScreenColorExpandFill( 118d87a3195Smrg ScrnInfoPtr pScrn, 119d87a3195Smrg int fg, int bg, 120d87a3195Smrg int rop, 121d87a3195Smrg unsigned int planemask); 122d87a3195Smrgstatic void ImageSubsequentScanlineCPUToScreenColorExpandFill( 123d87a3195Smrg ScrnInfoPtr pScrn, 124d87a3195Smrg int x, int y, 125d87a3195Smrg int w, int h, 126d87a3195Smrg int skipleft); 127d87a3195Smrgstatic void ImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn, 128d87a3195Smrg int bufno); 129d87a3195Smrg 130d87a3195Smrg 131d87a3195Smrgstatic void 132d87a3195SmrgImageInitializeAccelerator(ScrnInfoPtr pScrn) 133d87a3195Smrg{ 134d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 135d87a3195Smrg 136d87a3195Smrg switch (pScrn->depth) { 137d87a3195Smrg case 8: 138d87a3195Smrg pTrident->EngineOperation = 0; 139d87a3195Smrg break; 140d87a3195Smrg case 15: 141d87a3195Smrg pTrident->EngineOperation = 5; 142d87a3195Smrg break; 143d87a3195Smrg case 16: 144d87a3195Smrg pTrident->EngineOperation = 1; 145d87a3195Smrg break; 146d87a3195Smrg case 24: 147d87a3195Smrg pTrident->EngineOperation = 2; 148d87a3195Smrg break; 149d87a3195Smrg } 150d87a3195Smrg IMAGE_OUT(0x2120, 0xF0000000); 151d87a3195Smrg IMAGE_OUT(0x2120, 0x40000000 | pTrident->EngineOperation); 152d87a3195Smrg IMAGE_OUT(0x2120, 0x80000000); 153d87a3195Smrg IMAGE_OUT(0x2144, 0x00000000); 154d87a3195Smrg IMAGE_OUT(0x2148, 0x00000000); 155d87a3195Smrg IMAGE_OUT(0x2150, 0x00000000); 156d87a3195Smrg IMAGE_OUT(0x2154, 0x00000000); 157d87a3195Smrg IMAGE_OUT(0x2120, 0x60000000 | 158d87a3195Smrg (pScrn->displayWidth << 16) | 159d87a3195Smrg pScrn->displayWidth); 160d87a3195Smrg IMAGE_OUT(0x216C, 0x00000000); 161d87a3195Smrg IMAGE_OUT(0x2170, 0x00000000); 162d87a3195Smrg IMAGE_OUT(0x217C, 0x00000000); 163d87a3195Smrg IMAGE_OUT(0x2120, 0x10000000); 164d87a3195Smrg IMAGE_OUT(0x2130, (2047 << 16) | 2047); 165d87a3195Smrg pTrident->Clipping = FALSE; 166d87a3195Smrg pTrident->DstEnable = FALSE; 167d87a3195Smrg} 168d87a3195Smrg#endif 169d87a3195Smrg 170d87a3195SmrgBool 171d87a3195SmrgImageAccelInit(ScreenPtr pScreen) 172d87a3195Smrg{ 173d87a3195Smrg#ifdef HAVE_XAA_H 174d87a3195Smrg XAAInfoRecPtr infoPtr; 175d87a3195Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 176d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 177d87a3195Smrg 178d87a3195Smrg if (pTrident->NoAccel) 179d87a3195Smrg return FALSE; 180d87a3195Smrg 181d87a3195Smrg pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec(); 182d87a3195Smrg if (!infoPtr) return FALSE; 183d87a3195Smrg 184d87a3195Smrg pTrident->InitializeAccelerator = ImageInitializeAccelerator; 185d87a3195Smrg ImageInitializeAccelerator(pScrn); 186d87a3195Smrg 187d87a3195Smrg infoPtr->Flags = PIXMAP_CACHE | 188d87a3195Smrg LINEAR_FRAMEBUFFER | 189d87a3195Smrg OFFSCREEN_PIXMAPS; 190d87a3195Smrg 191d87a3195Smrg infoPtr->Sync = ImageSync; 192d87a3195Smrg 193d87a3195Smrg#if 0 194d87a3195Smrg infoPtr->SetClippingRectangle = ImageSetClippingRectangle; 195d87a3195Smrg infoPtr->DisableClipping = ImageDisableClipping; 196d87a3195Smrg infoPtr->ClippingFlags = HARDWARE_CLIP_SOLID_FILL | 197d87a3195Smrg HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY | 198d87a3195Smrg HARDWARE_CLIP_MONO_8x8_FILL; 199d87a3195Smrg#endif 200d87a3195Smrg 201d87a3195Smrg#if 0 202d87a3195Smrg infoPtr->SolidLineFlags = NO_PLANEMASK; 203d87a3195Smrg infoPtr->SetupForSolidLine = ImageSetupForSolidLine; 204d87a3195Smrg infoPtr->SolidBresenhamLineErrorTermBits = 13; 205d87a3195Smrg infoPtr->SubsequentSolidBresenhamLine = 206d87a3195Smrg ImageSubsequentSolidBresenhamLine; 207d87a3195Smrg infoPtr->ClippingFlags |= HARDWARE_CLIP_SOLID_LINE; 208d87a3195Smrg#endif 209d87a3195Smrg 210d87a3195Smrg infoPtr->SolidFillFlags = NO_PLANEMASK; 211d87a3195Smrg infoPtr->SetupForSolidFill = ImageSetupForFillRectSolid; 212d87a3195Smrg infoPtr->SubsequentSolidFillRect = ImageSubsequentFillRectSolid; 213d87a3195Smrg 214d87a3195Smrg infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK | 215d87a3195Smrg NO_TRANSPARENCY | 216d87a3195Smrg ONLY_TWO_BITBLT_DIRECTIONS; 217d87a3195Smrg 218d87a3195Smrg infoPtr->SetupForScreenToScreenCopy = 219d87a3195Smrg ImageSetupForScreenToScreenCopy; 220d87a3195Smrg infoPtr->SubsequentScreenToScreenCopy = 221d87a3195Smrg ImageSubsequentScreenToScreenCopy; 222d87a3195Smrg 223d87a3195Smrg infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | 224d87a3195Smrg BIT_ORDER_IN_BYTE_MSBFIRST | 225d87a3195Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 226d87a3195Smrg HARDWARE_PATTERN_PROGRAMMED_BITS; 227d87a3195Smrg 228d87a3195Smrg infoPtr->SetupForMono8x8PatternFill = 229d87a3195Smrg ImageSetupForMono8x8PatternFill; 230d87a3195Smrg infoPtr->SubsequentMono8x8PatternFillRect = 231d87a3195Smrg ImageSubsequentMono8x8PatternFillRect; 232d87a3195Smrg 233d87a3195Smrg#if 0 234d87a3195Smrg infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK | 235d87a3195Smrg NO_TRANSPARENCY | 236d87a3195Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 237d87a3195Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 238d87a3195Smrg 239d87a3195Smrg infoPtr->SetupForColor8x8PatternFill = 240d87a3195Smrg ImageSetupForColor8x8PatternFill; 241d87a3195Smrg infoPtr->SubsequentColor8x8PatternFillRect = 242d87a3195Smrg ImageSubsequentColor8x8PatternFillRect; 243d87a3195Smrg infoPtr->ClippingFlags |= HARDWARE_CLIP_COLOR_8x8_FILL; 244d87a3195Smrg#endif 245d87a3195Smrg 246d87a3195Smrg if (pTrident->Chipset != CYBER9397DVD) { 247d87a3195Smrg /* 248d87a3195Smrg * It seems as though the 9397DVD doesn't like the transfer 249d87a3195Smrg * window. But then, I've also tried at the two port 250d87a3195Smrg * addresses too, with no luck. Disable for this chipset for 251d87a3195Smrg * now. I'd guess there's some extra setup needed for this 252d87a3195Smrg * chipset. 253d87a3195Smrg */ 254d87a3195Smrg infoPtr->ScanlineCPUToScreenColorExpandFillFlags = 255d87a3195Smrg NO_PLANEMASK | 256d87a3195Smrg LEFT_EDGE_CLIPPING | 257d87a3195Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 258d87a3195Smrg 259d87a3195Smrg pTrident->XAAScanlineColorExpandBuffers[0] = 260d87a3195Smrg xnfalloc(((pScrn->virtualX + 63)) * 4 * 261d87a3195Smrg (pScrn->bitsPerPixel / 8)); 262d87a3195Smrg 263d87a3195Smrg infoPtr->NumScanlineColorExpandBuffers = 1; 264d87a3195Smrg infoPtr->ScanlineColorExpandBuffers = 265d87a3195Smrg pTrident->XAAScanlineColorExpandBuffers; 266d87a3195Smrg 267d87a3195Smrg infoPtr->SetupForScanlineCPUToScreenColorExpandFill = 268d87a3195Smrg ImageSetupForScanlineCPUToScreenColorExpandFill; 269d87a3195Smrg infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = 270d87a3195Smrg ImageSubsequentScanlineCPUToScreenColorExpandFill; 271d87a3195Smrg infoPtr->SubsequentColorExpandScanline = 272d87a3195Smrg ImageSubsequentColorExpandScanline; 273d87a3195Smrg 274d87a3195Smrg infoPtr->ScanlineImageWriteFlags = NO_PLANEMASK | 275d87a3195Smrg LEFT_EDGE_CLIPPING; 276d87a3195Smrg 277d87a3195Smrg infoPtr->SetupForScanlineImageWrite = 278d87a3195Smrg ImageSetupForScanlineImageWrite; 279d87a3195Smrg infoPtr->SubsequentScanlineImageWriteRect = 280d87a3195Smrg ImageSubsequentScanlineImageWriteRect; 281d87a3195Smrg infoPtr->SubsequentImageWriteScanline = 282d87a3195Smrg ImageSubsequentImageWriteScanline; 283d87a3195Smrg 284d87a3195Smrg infoPtr->NumScanlineImageWriteBuffers = 1; 285d87a3195Smrg infoPtr->ScanlineImageWriteBuffers = 286d87a3195Smrg pTrident->XAAImageScanlineBuffer; 287d87a3195Smrg 288d87a3195Smrg pTrident->XAAImageScanlineBuffer[0] = 289d87a3195Smrg xnfalloc(pScrn->virtualX * pScrn->bitsPerPixel / 8); 290d87a3195Smrg 291d87a3195Smrg infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000; 292d87a3195Smrg } 293d87a3195Smrg 294d87a3195Smrg return(XAAInit(pScreen, infoPtr)); 295d87a3195Smrg#else 296d87a3195Smrg return FALSE; 297d87a3195Smrg#endif 298d87a3195Smrg} 299d87a3195Smrg 300d87a3195Smrg#ifdef HAVE_XAA_H 301d87a3195Smrgstatic void 302d87a3195SmrgImageSync(ScrnInfoPtr pScrn) 303d87a3195Smrg{ 304d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 305d87a3195Smrg int busy; 306d87a3195Smrg int cnt = 5000000; 307d87a3195Smrg 308d87a3195Smrg if (pTrident->Clipping) ImageDisableClipping(pScrn); 309d87a3195Smrg if (pTrident->DstEnable) { 310d87a3195Smrg IMAGE_OUT(0x2120, 0x70000000); 311d87a3195Smrg pTrident->DstEnable = FALSE; 312d87a3195Smrg } 313d87a3195Smrg 314d87a3195Smrg IMAGEBUSY(busy); 315d87a3195Smrg while (busy != 0) { 316d87a3195Smrg if (--cnt < 0) { 317d87a3195Smrg ErrorF("GE timeout\n"); 318d87a3195Smrg IMAGE_OUT(0x2164, 0x80000000); 319d87a3195Smrg } 320d87a3195Smrg 321d87a3195Smrg IMAGEBUSY(busy); 322d87a3195Smrg } 323d87a3195Smrg} 324d87a3195Smrg 325d87a3195Smrgstatic void 326d87a3195SmrgImageSyncClip(ScrnInfoPtr pScrn) 327d87a3195Smrg{ 328d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 329d87a3195Smrg int busy; 330d87a3195Smrg int cnt = 5000000; 331d87a3195Smrg 332d87a3195Smrg IMAGEBUSY(busy); 333d87a3195Smrg while (busy != 0) { 334d87a3195Smrg if (--cnt < 0) { 335d87a3195Smrg ErrorF("GE timeout\n"); 336d87a3195Smrg IMAGE_OUT(0x2164, 0x80000000); 337d87a3195Smrg } 338d87a3195Smrg 339d87a3195Smrg IMAGEBUSY(busy); 340d87a3195Smrg } 341d87a3195Smrg} 342d87a3195Smrg 343d87a3195Smrgstatic void 344d87a3195SmrgImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 345d87a3195Smrg int xdir, int ydir, 346d87a3195Smrg int rop, 347d87a3195Smrg unsigned int planemask, 348d87a3195Smrg int transparency_color) 349d87a3195Smrg{ 350d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 351d87a3195Smrg 352d87a3195Smrg pTrident->BltScanDirection = 0; 353d87a3195Smrg if ((xdir < 0) || (ydir < 0)) 354d87a3195Smrg pTrident->BltScanDirection |= (1 << 2); 355d87a3195Smrg 356d87a3195Smrg IMAGE_OUT(0x2120, 0x80000000); 357d87a3195Smrg IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop)); 358d87a3195Smrg 359d87a3195Smrg if (transparency_color != -1) { 360d87a3195Smrg IMAGE_OUT(0x2120, 0x70000000 | 361d87a3195Smrg (1 << 26) | 362d87a3195Smrg (transparency_color & 0xffffff)); 363d87a3195Smrg pTrident->DstEnable = TRUE; 364d87a3195Smrg } 365d87a3195Smrg} 366d87a3195Smrg 367d87a3195Smrgstatic void 368d87a3195SmrgImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 369d87a3195Smrg int x1, int y1, 370d87a3195Smrg int x2, int y2, 371d87a3195Smrg int w, int h) 372d87a3195Smrg{ 373d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 374d87a3195Smrg 375d87a3195Smrg if (pTrident->BltScanDirection) { 376d87a3195Smrg IMAGE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1)); 377d87a3195Smrg IMAGE_OUT(0x2104, (y1 << 16) | x1); 378d87a3195Smrg IMAGE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1)); 379d87a3195Smrg IMAGE_OUT(0x210C, y2<<16 | x2); 380d87a3195Smrg } else { 381d87a3195Smrg IMAGE_OUT(0x2100, (y1 << 16) | x1); 382d87a3195Smrg IMAGE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1)); 383d87a3195Smrg IMAGE_OUT(0x2108, (y2 << 16) | x2); 384d87a3195Smrg IMAGE_OUT(0x210C, ((y2 + h - 1) << 16) | (x2 + w - 1)); 385d87a3195Smrg } 386d87a3195Smrg 387d87a3195Smrg IMAGE_OUT(0x2124, 0x80000000 | 388d87a3195Smrg (1 << 7) | (1 << 22) | (1 << 10) | 389d87a3195Smrg pTrident->BltScanDirection | 390d87a3195Smrg (pTrident->Clipping ? 1 : 0)); 391d87a3195Smrg 392d87a3195Smrg if (!pTrident->UsePCIRetry) 393d87a3195Smrg ImageSyncClip(pScrn); 394d87a3195Smrg} 395d87a3195Smrg 396d87a3195Smrgstatic void 397d87a3195SmrgImageSetClippingRectangle(ScrnInfoPtr pScrn, 398d87a3195Smrg int x1, int y1, 399d87a3195Smrg int x2, int y2) 400d87a3195Smrg{ 401d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 402d87a3195Smrg 403d87a3195Smrg IMAGE_OUT(0x2120, 0x10000000 | 404d87a3195Smrg ((y1 & 0xfff) << 16) | (x1 & 0xfff)); 405d87a3195Smrg IMAGE_OUT(0x2130, ((y2 & 0xfff) << 16) | (x2 & 0xfff)); 406d87a3195Smrg pTrident->Clipping = TRUE; 407d87a3195Smrg} 408d87a3195Smrg 409d87a3195Smrgstatic void 410d87a3195SmrgImageDisableClipping(ScrnInfoPtr pScrn) 411d87a3195Smrg{ 412d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 413d87a3195Smrg pTrident->Clipping = FALSE; 414d87a3195Smrg} 415d87a3195Smrg 416d87a3195Smrg#if 0 417d87a3195Smrgstatic void 418d87a3195SmrgImageSetupForSolidLine(ScrnInfoPtr pScrn, 419d87a3195Smrg int color, 420d87a3195Smrg int rop, 421d87a3195Smrg unsigned int planemask) 422d87a3195Smrg{ 423d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 424d87a3195Smrg 425d87a3195Smrg REPLICATE(color); 426d87a3195Smrg IMAGE_OUT(0x2120, 0x84000000); 427d87a3195Smrg IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop)); 428d87a3195Smrg IMAGE_OUT(0x2144, color); 429d87a3195Smrg} 430d87a3195Smrg 431d87a3195Smrgstatic void 432d87a3195SmrgImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, 433d87a3195Smrg int x, int y, 434d87a3195Smrg int dmaj, int dmin, 435d87a3195Smrg int e, int len, int octant) 436d87a3195Smrg{ 437d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 438d87a3195Smrg int tmp; 439d87a3195Smrg int D = 0, E = 0, ymajor = 0; 440d87a3195Smrg 441d87a3195Smrg IMAGE_OUT(0x2124, 0x20000000 | 442d87a3195Smrg (3 << 22) | (1 << 10) | (1 << 9) | 443d87a3195Smrg (pTrident->Clipping ? 1 : 0)); 444d87a3195Smrg if (!(octant & YMAJOR)) { 445d87a3195Smrg if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) { 446d87a3195Smrg E = 1; 447d87a3195Smrg D = 0; 448d87a3195Smrg } 449d87a3195Smrg 450d87a3195Smrg if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) { 451d87a3195Smrg E = 1; 452d87a3195Smrg D = 1; 453d87a3195Smrg } 454d87a3195Smrg 455d87a3195Smrg if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) { 456d87a3195Smrg E = 1; 457d87a3195Smrg D = 2; 458d87a3195Smrg } 459d87a3195Smrg if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) { 460d87a3195Smrg E = 1; 461d87a3195Smrg D = 3; 462d87a3195Smrg } 463d87a3195Smrg 464d87a3195Smrg ymajor = 0; 465d87a3195Smrg } else { 466d87a3195Smrg if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) { 467d87a3195Smrg E = 0; 468d87a3195Smrg D = 0; 469d87a3195Smrg } 470d87a3195Smrg 471d87a3195Smrg if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) { 472d87a3195Smrg E = 0; 473d87a3195Smrg D = 2; 474d87a3195Smrg } 475d87a3195Smrg 476d87a3195Smrg if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) { 477d87a3195Smrg E = 0; 478d87a3195Smrg D = 1; 479d87a3195Smrg } 480d87a3195Smrg 481d87a3195Smrg if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) { 482d87a3195Smrg E = 0; 483d87a3195Smrg D = 3; 484d87a3195Smrg } 485d87a3195Smrg 486d87a3195Smrg ymajor = (1 << 18); 487d87a3195Smrg } 488d87a3195Smrg 489d87a3195Smrg if (E) { 490d87a3195Smrg tmp = x; 491d87a3195Smrg x = y; 492d87a3195Smrg y = tmp; 493d87a3195Smrg } 494d87a3195Smrg if (D & 0x02) { 495d87a3195Smrg IMAGE_OUT(0x21FC, 0x20000000 | 496d87a3195Smrg (1 << 27) | (1 << 19) | (1 << 17) | 497d87a3195Smrg ymajor | (x + len - 1)); 498d87a3195Smrg } else { 499d87a3195Smrg IMAGE_OUT(0x21FC, 0x20000000 | 500d87a3195Smrg (1 << 27) | (1 << 19) | (1 << 17) | 501d87a3195Smrg ymajor | ( y + len - 1)); 502d87a3195Smrg } 503d87a3195Smrg IMAGE_OUT(0x2100, (E << 30) | ((y & 0xfff) << 16) | (x & 0xfff)); 504d87a3195Smrg IMAGE_OUT(0x2104, (D << 30) | 505d87a3195Smrg (((dmaj - dmin) & 0xfff) << 16) | 506d87a3195Smrg (-dmin & 0xfff)); 507d87a3195Smrg IMAGE_OUT(0x2108, ((-e & 0xfff) << 16)); 508d87a3195Smrg 509d87a3195Smrg if (!pTrident->UsePCIRetry) 510d87a3195Smrg ImageSyncClip(pScrn); 511d87a3195Smrg} 512d87a3195Smrg#endif 513d87a3195Smrg 514d87a3195Smrgstatic void 515d87a3195SmrgImageSetupForFillRectSolid(ScrnInfoPtr pScrn, 516d87a3195Smrg int color, 517d87a3195Smrg int rop, 518d87a3195Smrg unsigned int planemask) 519d87a3195Smrg{ 520d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 521d87a3195Smrg 522d87a3195Smrg REPLICATE(color); 523d87a3195Smrg IMAGE_OUT(0x2120, 0x80000000); 524d87a3195Smrg IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop)); 525d87a3195Smrg IMAGE_OUT(0x2144, color); 526d87a3195Smrg} 527d87a3195Smrg 528d87a3195Smrgstatic void 529d87a3195SmrgImageSubsequentFillRectSolid(ScrnInfoPtr pScrn, 530d87a3195Smrg int x, int y, 531d87a3195Smrg int w, int h) 532d87a3195Smrg{ 533d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 534d87a3195Smrg 535d87a3195Smrg if ((w <= 0) || (h <= 0)) 536d87a3195Smrg return; 537d87a3195Smrg 538d87a3195Smrg IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff)); 539d87a3195Smrg IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 540d87a3195Smrg ((x + w - 1) & 0xfff)); 541d87a3195Smrg IMAGE_OUT(0x2124, 0x80000000 | 542d87a3195Smrg (3 << 22) | (1 << 10) | (1 << 9) | 543d87a3195Smrg (pTrident->Clipping ? 1 : 0)); 544d87a3195Smrg if (!pTrident->UsePCIRetry) 545d87a3195Smrg ImageSyncClip(pScrn); 546d87a3195Smrg} 547d87a3195Smrg 548d87a3195Smrgstatic void 549d87a3195SmrgMoveDWORDS(register CARD32* dest, 550d87a3195Smrg register CARD32* src, 551d87a3195Smrg register int dwords ) 552d87a3195Smrg{ 553d87a3195Smrg Bool extra = FALSE; 554d87a3195Smrg 555d87a3195Smrg if (dwords & 0x01) extra = TRUE; 556d87a3195Smrg 557d87a3195Smrg while(dwords & ~0x03) { 558d87a3195Smrg *dest = *src; 559d87a3195Smrg *(dest + 1) = *(src + 1); 560d87a3195Smrg *(dest + 2) = *(src + 2); 561d87a3195Smrg *(dest + 3) = *(src + 3); 562d87a3195Smrg src += 4; 563d87a3195Smrg dest += 4; 564d87a3195Smrg dwords -= 4; 565d87a3195Smrg } 566d87a3195Smrg 567d87a3195Smrg if(!dwords) { 568d87a3195Smrg if (extra) *dest = 0x00000000; 569d87a3195Smrg return; 570d87a3195Smrg } 571d87a3195Smrg 572d87a3195Smrg *dest = *src; 573d87a3195Smrg if(dwords == 1) { 574d87a3195Smrg if (extra) *(dest + 1) = 0x00000000; 575d87a3195Smrg return; 576d87a3195Smrg } 577d87a3195Smrg 578d87a3195Smrg *(dest + 1) = *(src + 1); 579d87a3195Smrg if(dwords == 2) { 580d87a3195Smrg if (extra) *(dest + 2) = 0x00000000; 581d87a3195Smrg return; 582d87a3195Smrg } 583d87a3195Smrg 584d87a3195Smrg *(dest + 2) = *(src + 2); 585d87a3195Smrg if (extra) *(dest + 3) = 0x00000000; 586d87a3195Smrg} 587d87a3195Smrg 588d87a3195Smrgstatic void 589d87a3195SmrgImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 590d87a3195Smrg int patternx, int patterny, 591d87a3195Smrg int fg, int bg, 592d87a3195Smrg int rop, 593d87a3195Smrg unsigned int planemask) 594d87a3195Smrg{ 595d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 596d87a3195Smrg 597d87a3195Smrg IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop)); 598d87a3195Smrg if (bg == -1) { 599d87a3195Smrg REPLICATE(fg); 600d87a3195Smrg IMAGE_OUT(0x2120, 0x80000000 | (1 << 27)); 601d87a3195Smrg IMAGE_OUT(0x2130, patternx); 602d87a3195Smrg IMAGE_OUT(0x2134, patterny); 603d87a3195Smrg IMAGE_OUT(0x2150, fg); 604d87a3195Smrg IMAGE_OUT(0x2154, ~fg); 605d87a3195Smrg } else { 606d87a3195Smrg REPLICATE(bg); 607d87a3195Smrg REPLICATE(fg); 608d87a3195Smrg IMAGE_OUT(0x2120, 0x80000000 | (1 << 27) | (1 << 26)); 609d87a3195Smrg IMAGE_OUT(0x2130, patternx); 610d87a3195Smrg IMAGE_OUT(0x2134, patterny); 611d87a3195Smrg IMAGE_OUT(0x2150, fg); 612d87a3195Smrg IMAGE_OUT(0x2154, bg); 613d87a3195Smrg } 614d87a3195Smrg} 615d87a3195Smrg 616d87a3195Smrgstatic void 617d87a3195SmrgImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 618d87a3195Smrg int patternx, int patterny, 619d87a3195Smrg int x, int y, 620d87a3195Smrg int w, int h) 621d87a3195Smrg{ 622d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 623d87a3195Smrg 624d87a3195Smrg IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff)); 625d87a3195Smrg IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 626d87a3195Smrg ((x + w - 1) & 0xfff)); 627d87a3195Smrg IMAGE_OUT(0x2124, 0x80000000 | 628d87a3195Smrg (7 << 18) | (1 << 22) | (1 << 10) | (1 << 9) | 629d87a3195Smrg (pTrident->Clipping ? 1 : 0)); 630d87a3195Smrg if (!pTrident->UsePCIRetry) 631d87a3195Smrg ImageSyncClip(pScrn); 632d87a3195Smrg} 633d87a3195Smrg 634d87a3195Smrg#if 0 635d87a3195Smrgstatic void 636d87a3195SmrgImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, 637d87a3195Smrg int patternx, int patterny, 638d87a3195Smrg int rop, 639d87a3195Smrg unsigned int planemask, 640d87a3195Smrg int transparency_color) 641d87a3195Smrg{ 642d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 643d87a3195Smrg 644d87a3195Smrg IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop)); 645d87a3195Smrg IMAGE_OUT(0x2120, 0x80000000 | (1 << 26)); 646d87a3195Smrg if (transparency_color != -1) { 647d87a3195Smrg IMAGE_OUT(0x2120, 0x70000000 | 648d87a3195Smrg (1 << 26) | 649d87a3195Smrg (transparency_color & 0xffffff)); 650d87a3195Smrg pTrident->DstEnable = TRUE; 651d87a3195Smrg } 652d87a3195Smrg} 653d87a3195Smrg 654d87a3195Smrgstatic void 655d87a3195SmrgImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, 656d87a3195Smrg int patternx, int patterny, 657d87a3195Smrg int x, int y, 658d87a3195Smrg int w, int h) 659d87a3195Smrg{ 660d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 661d87a3195Smrg 662d87a3195Smrg IMAGE_OUT(0x2100, ((patterny & 0xfff) << 16) | 663d87a3195Smrg (patternx & 0xfff)); 664d87a3195Smrg IMAGE_OUT(0x2104, (((patterny + h - 1) & 0xfff) << 16) | 665d87a3195Smrg ((patternx + w - 1) & 0xfff)); 666d87a3195Smrg IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff)); 667d87a3195Smrg IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 668d87a3195Smrg ((x + w - 1) & 0xfff)); 669d87a3195Smrg IMAGE_OUT(0x2124, 0x80000000 | 670d87a3195Smrg (1 << 22) | (1 << 10) | (1 << 7) | 671d87a3195Smrg (pTrident->Clipping ? 1 : 0)); 672d87a3195Smrg if (!pTrident->UsePCIRetry) 673d87a3195Smrg ImageSyncClip(pScrn); 674d87a3195Smrg} 675d87a3195Smrg#endif 676d87a3195Smrg 677d87a3195Smrgstatic void 678d87a3195SmrgImageSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 679d87a3195Smrg int fg, int bg, 680d87a3195Smrg int rop, 681d87a3195Smrg unsigned int planemask 682d87a3195Smrg){ 683d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 684d87a3195Smrg 685d87a3195Smrg IMAGE_OUT(0x2120, 0x80000000); 686d87a3195Smrg IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop)); 687d87a3195Smrg if (bg == -1) { 688d87a3195Smrg pTrident->ROP = (2 << 22); 689d87a3195Smrg REPLICATE(fg); 690d87a3195Smrg IMAGE_OUT(0x2144, fg); 691d87a3195Smrg IMAGE_OUT(0x2148, ~fg); 692d87a3195Smrg } else { 693d87a3195Smrg pTrident->ROP = (3 << 22); 694d87a3195Smrg REPLICATE(fg); 695d87a3195Smrg IMAGE_OUT(0x2144, fg); 696d87a3195Smrg REPLICATE(bg); 697d87a3195Smrg IMAGE_OUT(0x2148, bg); 698d87a3195Smrg } 699d87a3195Smrg} 700d87a3195Smrg 701d87a3195Smrgstatic void 702d87a3195SmrgImageSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 703d87a3195Smrg int x, int y, 704d87a3195Smrg int w, int h, 705d87a3195Smrg int skipleft 706d87a3195Smrg){ 707d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 708d87a3195Smrg ImageSetClippingRectangle(pScrn,(x + skipleft), y, 709d87a3195Smrg (x + w - 1), (y + h - 1)); 710d87a3195Smrg IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff)); 711d87a3195Smrg IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 712d87a3195Smrg ((x + w - 1) & 0xfff)); 713d87a3195Smrg IMAGE_OUT(0x2124, 0x80000000 | (pTrident->ROP) | (1 << 10) | 1); 714d87a3195Smrg pTrident->dwords = (w + 31) >> 5; 715d87a3195Smrg pTrident->h = h; 716d87a3195Smrg} 717d87a3195Smrg 718d87a3195Smrgstatic void 719d87a3195SmrgImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 720d87a3195Smrg{ 721d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 722d87a3195Smrg XAAInfoRecPtr infoRec; 723d87a3195Smrg infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); 724d87a3195Smrg 725d87a3195Smrg MoveDWORDS((CARD32*)infoRec->ImageWriteBase, 726d87a3195Smrg (CARD32*)pTrident->XAAScanlineColorExpandBuffers[bufno], 727d87a3195Smrg pTrident->dwords); 728d87a3195Smrg 729d87a3195Smrg pTrident->h--; 730d87a3195Smrg if (!pTrident->h) 731d87a3195Smrg ImageSync(pScrn); 732d87a3195Smrg} 733d87a3195Smrg 734d87a3195Smrgstatic void 735d87a3195SmrgImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn, 736d87a3195Smrg int rop, 737d87a3195Smrg unsigned int planemask, 738d87a3195Smrg int transparency_color, 739d87a3195Smrg int bpp, int depth) 740d87a3195Smrg{ 741d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 742d87a3195Smrg IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop)); 743d87a3195Smrg if (transparency_color != -1) { 744d87a3195Smrg IMAGE_OUT(0x2120, 0x70000000 | 745d87a3195Smrg (1 << 26) | 746d87a3195Smrg (transparency_color & 0xffffff)); 747d87a3195Smrg pTrident->DstEnable = TRUE; 748d87a3195Smrg } 749d87a3195Smrg 750d87a3195Smrg IMAGE_OUT(0x2120, 0x80000000); 751d87a3195Smrg} 752d87a3195Smrg 753d87a3195Smrgstatic void 754d87a3195SmrgImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn, 755d87a3195Smrg int x, int y, 756d87a3195Smrg int w, int h, 757d87a3195Smrg int skipleft) 758d87a3195Smrg{ 759d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 760d87a3195Smrg ImageSetClippingRectangle(pScrn, 761d87a3195Smrg (x + skipleft), y, 762d87a3195Smrg (x + w - 1), (y + h - 1)); 763d87a3195Smrg IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff)); 764d87a3195Smrg IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) | 765d87a3195Smrg ((x + w - 1) & 0xfff)); 766d87a3195Smrg IMAGE_OUT(0x2124, 0x80000000 | 767d87a3195Smrg (1 << 22) | (1 << 10) | 1); 768d87a3195Smrg pTrident->dwords = ((w * (pScrn->bitsPerPixel / 8)) + 3) >> 2; 769d87a3195Smrg pTrident->h = h; 770d87a3195Smrg} 771d87a3195Smrg 772d87a3195Smrg 773d87a3195Smrgstatic void 774d87a3195SmrgImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno) 775d87a3195Smrg{ 776d87a3195Smrg TRIDENTPtr pTrident = TRIDENTPTR(pScrn); 777d87a3195Smrg XAAInfoRecPtr infoRec; 778d87a3195Smrg infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); 779d87a3195Smrg 780d87a3195Smrg MoveDWORDS((CARD32*)infoRec->ImageWriteBase, 781d87a3195Smrg (CARD32*)pTrident->XAAImageScanlineBuffer[bufno], 782d87a3195Smrg pTrident->dwords); 783d87a3195Smrg 784d87a3195Smrg pTrident->h--; 785d87a3195Smrg if (!pTrident->h) 786d87a3195Smrg ImageSync(pScrn); 787d87a3195Smrg} 788d87a3195Smrg#endif 789