1c35d236eSmrg/* 2c35d236eSmrg * Copyright 1997-2001 by Alan Hourihane, Wigan, England. 3c35d236eSmrg * 4c35d236eSmrg * Permission to use, copy, modify, distribute, and sell this software and its 5c35d236eSmrg * documentation for any purpose is hereby granted without fee, provided that 6c35d236eSmrg * the above copyright notice appear in all copies and that both that 7c35d236eSmrg * copyright notice and this permission notice appear in supporting 8c35d236eSmrg * documentation, and that the name of Alan Hourihane not be used in 9c35d236eSmrg * advertising or publicity pertaining to distribution of the software without 10c35d236eSmrg * specific, written prior permission. Alan Hourihane makes no representations 11c35d236eSmrg * about the suitability of this software for any purpose. It is provided 12c35d236eSmrg * "as is" without express or implied warranty. 13c35d236eSmrg * 14c35d236eSmrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15c35d236eSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16c35d236eSmrg * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17c35d236eSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18c35d236eSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19c35d236eSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20c35d236eSmrg * PERFORMANCE OF THIS SOFTWARE. 21c35d236eSmrg * 22c35d236eSmrg * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> 23c35d236eSmrg * Dirk Hohndel, <hohndel@suse.de> 24c35d236eSmrg * Stefan Dirsch, <sndirsch@suse.de> 25c35d236eSmrg * 26c35d236eSmrg * this work is sponsored by S.u.S.E. GmbH, Fuerth, Elsa GmbH, Aachen and 27c35d236eSmrg * Siemens Nixdorf Informationssysteme 28c35d236eSmrg * 29c35d236eSmrg * GLINT 500TX / MX accelerated options. 30c35d236eSmrg */ 31c35d236eSmrg 32c35d236eSmrg#ifdef HAVE_CONFIG_H 33c35d236eSmrg#include "config.h" 34c35d236eSmrg#endif 35c35d236eSmrg 36c35d236eSmrg#include "xf86.h" 37c35d236eSmrg#include "xf86_OSproc.h" 38c35d236eSmrg 39c35d236eSmrg#include "xf86Pci.h" 40c35d236eSmrg 41c35d236eSmrg#include "fb.h" 42c35d236eSmrg 43c35d236eSmrg#include "miline.h" 44c35d236eSmrg 45c35d236eSmrg#include "glint_regs.h" 46c35d236eSmrg#include "glint.h" 47c35d236eSmrg 481fb744b4Smrg#ifdef HAVE_XAA_H 49c35d236eSmrg#include "xaalocal.h" /* For replacements */ 50c35d236eSmrg 51c35d236eSmrgstatic void TXSync(ScrnInfoPtr pScrn); 52c35d236eSmrgstatic void DualTXSync(ScrnInfoPtr pScrn); 53c35d236eSmrgstatic void TXSetupForFillRectSolid(ScrnInfoPtr pScrn, int color, int rop, 54c35d236eSmrg unsigned int planemask); 55c35d236eSmrgstatic void TXSubsequentFillRectSolid(ScrnInfoPtr pScrn, int x, int y, 56c35d236eSmrg int w, int h); 57c35d236eSmrgstatic void TXSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patternx, 58c35d236eSmrg int patterny, 59c35d236eSmrg int fg, int bg, int rop, 60c35d236eSmrg unsigned int planemask); 61c35d236eSmrgstatic void TXSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int patternx, 62c35d236eSmrg int patterny, int x, int y, 63c35d236eSmrg int w, int h); 64c35d236eSmrgstatic void TXSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, 65c35d236eSmrg int rop, unsigned int planemask, 66c35d236eSmrg int transparency_color); 67c35d236eSmrgstatic void TXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, 68c35d236eSmrg int x2, int y2, int w, int h); 69c35d236eSmrgstatic void TXWriteBitmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, 70c35d236eSmrg unsigned char *src, int srcwidth, 71c35d236eSmrg int skipleft, int fg, int bg, int rop, 72c35d236eSmrg unsigned int planemask); 73c35d236eSmrgstatic void TXSetClippingRectangle(ScrnInfoPtr pScrn, int x1, int y1, 74c35d236eSmrg int x2,int y2); 75c35d236eSmrgstatic void TXDisableClipping(ScrnInfoPtr pScrn); 76c35d236eSmrgstatic void TXWritePixmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, 77c35d236eSmrg unsigned char *src, int srcwidth, int rop, 78c35d236eSmrg unsigned int planemask, int trans, 79c35d236eSmrg int bpp, int depth); 80c35d236eSmrgstatic void TXSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int fg, 81c35d236eSmrg int bg, int rop, unsigned int planemask); 82c35d236eSmrgstatic void TXSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, 83c35d236eSmrg int y, int w, int h, int skipleft); 84c35d236eSmrgstatic void TXSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno); 85c35d236eSmrgstatic void TXLoadCoord(ScrnInfoPtr pScrn, int x, int y, int w, int h, 86c35d236eSmrg int a, int d); 87c35d236eSmrgstatic void TXSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, 88c35d236eSmrg unsigned int planemask); 89c35d236eSmrgstatic void TXSubsequentHorVertLine(ScrnInfoPtr pScrn, int x1, int y1, 90c35d236eSmrg int len, int dir); 91c35d236eSmrgstatic void TXSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, 92c35d236eSmrg int x, int y, int dmaj, int dmin, int e, 93c35d236eSmrg int len, int octant); 94c35d236eSmrgstatic void TXPolylinesThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC, 95c35d236eSmrg int mode, int npt, DDXPointPtr pPts); 96c35d236eSmrgstatic void TXPolySegmentThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC, 97c35d236eSmrg int nseg, xSegment *pSeg); 98c35d236eSmrg 99c35d236eSmrgvoid 100c35d236eSmrgTXInitializeEngine(ScrnInfoPtr pScrn) 101c35d236eSmrg{ 102c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 103c35d236eSmrg /* Initialize the Accelerator Engine to defaults */ 104c35d236eSmrg pGlint->rasterizerMode = UNIT_DISABLE; 105c35d236eSmrg 106c35d236eSmrg if (pGlint->MultiAperture) { 107c35d236eSmrg pGlint->rasterizerMode = RMMultiGLINT; 108c35d236eSmrg 109c35d236eSmrg /* Only write the following register to the first chip */ 110c35d236eSmrg GLINT_SLOW_WRITE_REG(1, BroadcastMask); 111c35d236eSmrg GLINT_SLOW_WRITE_REG(0x00000001, ScanLineOwnership); 112c35d236eSmrg 113c35d236eSmrg /* Only write the following register to the second chip */ 114c35d236eSmrg GLINT_SLOW_WRITE_REG(2, BroadcastMask); 115c35d236eSmrg GLINT_SLOW_WRITE_REG(0x00000005, ScanLineOwnership); 116c35d236eSmrg 117c35d236eSmrg /* Make sure the rest of the register writes go to both chip's */ 118c35d236eSmrg GLINT_SLOW_WRITE_REG(3, BroadcastMask); 119c35d236eSmrg 120c35d236eSmrg pGlint->pprod |= FBRM_ScanlineInt2; 121c35d236eSmrg } 122c35d236eSmrg 123c35d236eSmrg GLINT_SLOW_WRITE_REG(pGlint->pprod, LBReadMode); 124c35d236eSmrg GLINT_SLOW_WRITE_REG(pGlint->rasterizerMode, RasterizerMode); 125c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ScissorMode); 126c35d236eSmrg GLINT_SLOW_WRITE_REG(pGlint->pprod, FBReadMode); 127c35d236eSmrg GLINT_SLOW_WRITE_REG(0, dXSub); 128c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBWriteMode); 129c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_ENABLE, FBWriteMode); 130c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DitherMode); 131c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaBlendMode); 132c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 133c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureColorMode); 134c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureAddressMode); 135c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureReadMode); 136c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, GLINTWindow); 137c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaBlendMode); 138c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); 139c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RouterMode); 140c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FogMode); 141c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AntialiasMode); 142c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaTestMode); 143c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StencilMode); 144c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AreaStippleMode); 145c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LineStippleMode); 146c35d236eSmrg GLINT_SLOW_WRITE_REG(0, UpdateLineStippleCounters); 147c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LogicalOpMode); 148c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); 149c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StatisticMode); 150c35d236eSmrg GLINT_SLOW_WRITE_REG(0x400, FilterMode); 151c35d236eSmrg GLINT_SLOW_WRITE_REG(0xffffffff, FBHardwareWriteMask); 152c35d236eSmrg GLINT_SLOW_WRITE_REG(0xffffffff, FBSoftwareWriteMask); 153c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, GLINTDepth); 154c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBSourceOffset); 155c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBPixelOffset); 156c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBSourceOffset); 157c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, WindowOrigin); 158c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBWindowBase); 159c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBWindowBase); 160c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureAddressMode); 161c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RouterMode); 162c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PatternRamMode); 163c35d236eSmrg 164c35d236eSmrg switch (pScrn->bitsPerPixel) { 165c35d236eSmrg case 8: 166c35d236eSmrg GLINT_SLOW_WRITE_REG(0x2, PixelSize); 167c35d236eSmrg break; 168c35d236eSmrg case 16: 169c35d236eSmrg GLINT_SLOW_WRITE_REG(0x1, PixelSize); 170c35d236eSmrg break; 171c35d236eSmrg case 32: 172c35d236eSmrg GLINT_SLOW_WRITE_REG(0x0, PixelSize); 173c35d236eSmrg break; 174c35d236eSmrg } 175c35d236eSmrg pGlint->ROP = 0xFF; 176c35d236eSmrg pGlint->ClippingOn = FALSE; 177c35d236eSmrg pGlint->startxsub = 0; 178c35d236eSmrg pGlint->startxdom = 0; 179c35d236eSmrg pGlint->starty = 0; 180c35d236eSmrg pGlint->count = 0; 181c35d236eSmrg pGlint->dxdom = 0; 182c35d236eSmrg pGlint->dy = 1; 183c35d236eSmrg pGlint->planemask = 0; 184c35d236eSmrg GLINT_SLOW_WRITE_REG(0, StartXSub); 185c35d236eSmrg GLINT_SLOW_WRITE_REG(0, StartXDom); 186c35d236eSmrg GLINT_SLOW_WRITE_REG(0, StartY); 187c35d236eSmrg GLINT_SLOW_WRITE_REG(0, GLINTCount); 188c35d236eSmrg GLINT_SLOW_WRITE_REG(0, dXDom); 189c35d236eSmrg GLINT_SLOW_WRITE_REG(1<<16, dY); 190c35d236eSmrg} 1911fb744b4Smrg#endif 192c35d236eSmrg 193c35d236eSmrgBool 194c35d236eSmrgTXAccelInit(ScreenPtr pScreen) 195c35d236eSmrg{ 1961fb744b4Smrg#ifdef HAVE_XAA_H 197c35d236eSmrg XAAInfoRecPtr infoPtr; 1981fb744b4Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 199c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 200c35d236eSmrg long memory = pGlint->FbMapSize; 201c35d236eSmrg BoxRec AvailFBArea; 202c35d236eSmrg 203c35d236eSmrg pGlint->AccelInfoRec = infoPtr = XAACreateInfoRec(); 204c35d236eSmrg if (!infoPtr) return FALSE; 205c35d236eSmrg 206c35d236eSmrg TXInitializeEngine(pScrn); 207c35d236eSmrg 208c35d236eSmrg infoPtr->Flags = PIXMAP_CACHE | 209c35d236eSmrg LINEAR_FRAMEBUFFER | 210c35d236eSmrg OFFSCREEN_PIXMAPS; 211c35d236eSmrg 212c35d236eSmrg if (pGlint->MultiAperture) 213c35d236eSmrg infoPtr->Sync = DualTXSync; 214c35d236eSmrg else 215c35d236eSmrg infoPtr->Sync = TXSync; 216c35d236eSmrg 217c35d236eSmrg infoPtr->SetClippingRectangle = TXSetClippingRectangle; 218c35d236eSmrg infoPtr->DisableClipping = TXDisableClipping; 219c35d236eSmrg infoPtr->ClippingFlags = HARDWARE_CLIP_MONO_8x8_FILL | 220c35d236eSmrg HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY | 221c35d236eSmrg HARDWARE_CLIP_SOLID_FILL; 222c35d236eSmrg 223c35d236eSmrg infoPtr->SolidFillFlags = 0; 224c35d236eSmrg infoPtr->SetupForSolidFill = TXSetupForFillRectSolid; 225c35d236eSmrg infoPtr->SubsequentSolidFillRect = TXSubsequentFillRectSolid; 226c35d236eSmrg 227c35d236eSmrg infoPtr->SolidLineFlags = 0; 228c35d236eSmrg infoPtr->PolySegmentThinSolidFlags = 0; 229c35d236eSmrg infoPtr->PolylinesThinSolidFlags = 0; 230c35d236eSmrg infoPtr->SetupForSolidLine = TXSetupForSolidLine; 231c35d236eSmrg infoPtr->SubsequentSolidHorVertLine = TXSubsequentHorVertLine; 232c35d236eSmrg if (!(pScrn->overlayFlags & OVERLAY_8_32_PLANAR)) 233c35d236eSmrg { 234c35d236eSmrg infoPtr->SubsequentSolidBresenhamLine = 235c35d236eSmrg TXSubsequentSolidBresenhamLine; 236c35d236eSmrg } 237c35d236eSmrg infoPtr->PolySegmentThinSolid = TXPolySegmentThinSolidWrapper; 238c35d236eSmrg infoPtr->PolylinesThinSolid = TXPolylinesThinSolidWrapper; 239c35d236eSmrg 240c35d236eSmrg if (!pGlint->MultiAperture) { 241c35d236eSmrg infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | 242c35d236eSmrg ONLY_LEFT_TO_RIGHT_BITBLT; 243c35d236eSmrg infoPtr->SetupForScreenToScreenCopy = TXSetupForScreenToScreenCopy; 244c35d236eSmrg infoPtr->SubsequentScreenToScreenCopy = TXSubsequentScreenToScreenCopy; 245c35d236eSmrg } 246c35d236eSmrg 247c35d236eSmrg infoPtr->Mono8x8PatternFillFlags = HARDWARE_PATTERN_PROGRAMMED_ORIGIN | 248c35d236eSmrg HARDWARE_PATTERN_SCREEN_ORIGIN | 249c35d236eSmrg HARDWARE_PATTERN_PROGRAMMED_BITS; 250c35d236eSmrg infoPtr->SetupForMono8x8PatternFill = TXSetupForMono8x8PatternFill; 251c35d236eSmrg infoPtr->SubsequentMono8x8PatternFillRect = TXSubsequentMono8x8PatternFillRect; 252c35d236eSmrg 253c35d236eSmrg infoPtr->ScanlineCPUToScreenColorExpandFillFlags = 254c35d236eSmrg TRANSPARENCY_ONLY | 255c35d236eSmrg BIT_ORDER_IN_BYTE_LSBFIRST; 256c35d236eSmrg 257c35d236eSmrg infoPtr->NumScanlineColorExpandBuffers = 1; 2581fb744b4Smrg pGlint->ScratchBuffer = malloc(((pScrn->virtualX + 62) / 32 * 4) + (pScrn->virtualX * pScrn->bitsPerPixel / 8)); 259c35d236eSmrg infoPtr->ScanlineColorExpandBuffers = 260c35d236eSmrg pGlint->XAAScanlineColorExpandBuffers; 261c35d236eSmrg pGlint->XAAScanlineColorExpandBuffers[0] = 262c35d236eSmrg pGlint->IOBase + OutputFIFO + 4; 263c35d236eSmrg 264c35d236eSmrg infoPtr->SetupForScanlineCPUToScreenColorExpandFill = 265c35d236eSmrg TXSetupForScanlineCPUToScreenColorExpandFill; 266c35d236eSmrg infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = 267c35d236eSmrg TXSubsequentScanlineCPUToScreenColorExpandFill; 268c35d236eSmrg infoPtr->SubsequentColorExpandScanline = 269c35d236eSmrg TXSubsequentColorExpandScanline; 270c35d236eSmrg 271c35d236eSmrg infoPtr->ColorExpandRange = pGlint->FIFOSize; 272c35d236eSmrg 273c35d236eSmrg infoPtr->WriteBitmap = TXWriteBitmap; 274c35d236eSmrg infoPtr->WritePixmap = TXWritePixmap; 275c35d236eSmrg 276c35d236eSmrg AvailFBArea.x1 = 0; 277c35d236eSmrg AvailFBArea.y1 = 0; 278c35d236eSmrg AvailFBArea.x2 = pScrn->displayWidth; 279c35d236eSmrg if (memory > (16383*1024)) memory = 16383*1024; 280c35d236eSmrg AvailFBArea.y2 = memory / (pScrn->displayWidth * 281c35d236eSmrg pScrn->bitsPerPixel / 8); 282c35d236eSmrg 283c35d236eSmrg if (AvailFBArea.y2 > 4095) AvailFBArea.y2 = 4095; 284c35d236eSmrg 285c35d236eSmrg xf86InitFBManager(pScreen, &AvailFBArea); 286c35d236eSmrg 287c35d236eSmrg return (XAAInit(pScreen, infoPtr)); 2881fb744b4Smrg#else 2891fb744b4Smrg return FALSE; 2901fb744b4Smrg#endif 291c35d236eSmrg} 292c35d236eSmrg 2931fb744b4Smrg#ifdef HAVE_XAA_H 294c35d236eSmrgstatic void TXLoadCoord( 295c35d236eSmrg ScrnInfoPtr pScrn, 296c35d236eSmrg int x, int y, 297c35d236eSmrg int w, int h, 298c35d236eSmrg int a, int d 299c35d236eSmrg){ 300c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 301c35d236eSmrg 302c35d236eSmrg if (w != pGlint->startxsub) { 303c35d236eSmrg GLINT_WRITE_REG(w<<16, StartXSub); 304c35d236eSmrg pGlint->startxsub = w; 305c35d236eSmrg } 306c35d236eSmrg if (x != pGlint->startxdom) { 307c35d236eSmrg GLINT_WRITE_REG(x<<16,StartXDom); 308c35d236eSmrg pGlint->startxdom = x; 309c35d236eSmrg } 310c35d236eSmrg if (y != pGlint->starty) { 311c35d236eSmrg GLINT_WRITE_REG(y<<16,StartY); 312c35d236eSmrg pGlint->starty = y; 313c35d236eSmrg } 314c35d236eSmrg if (h != pGlint->count) { 315c35d236eSmrg GLINT_WRITE_REG(h,GLINTCount); 316c35d236eSmrg pGlint->count = h; 317c35d236eSmrg } 318c35d236eSmrg if (a != pGlint->dxdom) { 319c35d236eSmrg GLINT_WRITE_REG(a<<16,dXDom); 320c35d236eSmrg pGlint->dxdom = a; 321c35d236eSmrg } 322c35d236eSmrg if (d != pGlint->dy) { 323c35d236eSmrg GLINT_WRITE_REG(d<<16,dY); 324c35d236eSmrg pGlint->dy = d; 325c35d236eSmrg } 326c35d236eSmrg} 327c35d236eSmrg 328c35d236eSmrgstatic void 329c35d236eSmrgTXSync( 330c35d236eSmrg ScrnInfoPtr pScrn 331c35d236eSmrg){ 332c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 333c35d236eSmrg CARD32 readValue; 334c35d236eSmrg 335c35d236eSmrg CHECKCLIPPING; 336c35d236eSmrg 337c35d236eSmrg while (GLINT_READ_REG(DMACount) != 0); 338c35d236eSmrg GLINT_WAIT(2); 339c35d236eSmrg GLINT_WRITE_REG(0x400, FilterMode); 340c35d236eSmrg GLINT_WRITE_REG(0, GlintSync); 341c35d236eSmrg do { 342c35d236eSmrg while(GLINT_READ_REG(OutFIFOWords) == 0); 343c35d236eSmrg readValue = GLINT_READ_REG(OutputFIFO); 344c35d236eSmrg } while (readValue != Sync_tag); 345c35d236eSmrg} 346c35d236eSmrg 347c35d236eSmrgstatic void 348c35d236eSmrgDualTXSync( 349c35d236eSmrg ScrnInfoPtr pScrn 350c35d236eSmrg){ 351c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 352c35d236eSmrg unsigned long readValue; 353c35d236eSmrg 354c35d236eSmrg CHECKCLIPPING; 355c35d236eSmrg 356c35d236eSmrg while (GLINT_READ_REG(DMACount) != 0); 357c35d236eSmrg GLINT_WAIT(3); 358c35d236eSmrg 359c35d236eSmrg /* hack! this shouldn't need to be reloaded */ 360c35d236eSmrg GLINT_WRITE_REG(3, BroadcastMask); 361c35d236eSmrg GLINT_WRITE_REG(0x400, FilterMode); 362c35d236eSmrg GLINT_WRITE_REG(0, GlintSync); 363c35d236eSmrg 364c35d236eSmrg /* Read 1st MX until Sync Tag shows */ 365c35d236eSmrg ACCESSCHIP1(); 366c35d236eSmrg do { 367c35d236eSmrg while(GLINT_READ_REG(OutFIFOWords) == 0); 368c35d236eSmrg readValue = GLINT_READ_REG(OutputFIFO); 369c35d236eSmrg } while (readValue != Sync_tag); 370c35d236eSmrg 371c35d236eSmrg ACCESSCHIP2(); 372c35d236eSmrg /* Read 2nd MX until Sync Tag shows */ 373c35d236eSmrg do { 374c35d236eSmrg while(GLINT_READ_REG(OutFIFOWords) == 0); 375c35d236eSmrg readValue = GLINT_READ_REG(OutputFIFO); 376c35d236eSmrg } while (readValue != Sync_tag); 377c35d236eSmrg 378c35d236eSmrg ACCESSCHIP1(); 379c35d236eSmrg} 380c35d236eSmrg 381c35d236eSmrg 382c35d236eSmrgstatic void 383c35d236eSmrgTXSetupForFillRectSolid( 384c35d236eSmrg ScrnInfoPtr pScrn, 385c35d236eSmrg int color, int rop, 386c35d236eSmrg unsigned int planemask 387c35d236eSmrg){ 388c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 389c35d236eSmrg pGlint->ForeGroundColor = color; 390c35d236eSmrg 391c35d236eSmrg GLINT_WAIT(5); 392c35d236eSmrg REPLICATE(color); 393c35d236eSmrg DO_PLANEMASK(planemask); 394c35d236eSmrg if (rop == GXcopy) { 395c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 396c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode); 397c35d236eSmrg GLINT_WRITE_REG(color, FBBlockColor); 398c35d236eSmrg pGlint->FrameBufferReadMode = FastFillEnable; 399c35d236eSmrg } else { 400c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 401c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, PatternRamMode); 402c35d236eSmrg GLINT_WRITE_REG(color, PatternRamData0); 403c35d236eSmrg pGlint->FrameBufferReadMode = FastFillEnable | SpanOperation; 404c35d236eSmrg } 405c35d236eSmrg LOADROP(rop); 406c35d236eSmrg} 407c35d236eSmrg 408c35d236eSmrgstatic void 409c35d236eSmrgTXSubsequentFillRectSolid( 410c35d236eSmrg ScrnInfoPtr pScrn, 411c35d236eSmrg int x, int y, 412c35d236eSmrg int w, int h 413c35d236eSmrg){ 414c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 415c35d236eSmrg 416c35d236eSmrg GLINT_WAIT(7); 417c35d236eSmrg TXLoadCoord(pScrn, x, y, x+w, h, 0, 1); 418c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | pGlint->FrameBufferReadMode,Render); 419c35d236eSmrg} 420c35d236eSmrg 421c35d236eSmrgstatic void 422c35d236eSmrgTXSetClippingRectangle( 423c35d236eSmrg ScrnInfoPtr pScrn, 424c35d236eSmrg int x1, int y1, 425c35d236eSmrg int x2, int y2 426c35d236eSmrg){ 427c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 428c35d236eSmrg 429c35d236eSmrg GLINT_WAIT(3); 430c35d236eSmrg GLINT_WRITE_REG((y1&0xFFFF)<<16|(x1&0xFFFF), ScissorMinXY); 431c35d236eSmrg GLINT_WRITE_REG((y2&0xFFFF)<<16|(x2&0xFFFF), ScissorMaxXY); 432c35d236eSmrg GLINT_WRITE_REG(1, ScissorMode); /* Enable Scissor Mode */ 433c35d236eSmrg pGlint->ClippingOn = TRUE; 434c35d236eSmrg} 435c35d236eSmrg 436c35d236eSmrgstatic void 437c35d236eSmrgTXDisableClipping( 438c35d236eSmrg ScrnInfoPtr pScrn 439c35d236eSmrg){ 440c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 441c35d236eSmrg CHECKCLIPPING; 442c35d236eSmrg} 443c35d236eSmrg 444c35d236eSmrgstatic void 445c35d236eSmrgTXSetupForScreenToScreenCopy( 446c35d236eSmrg ScrnInfoPtr pScrn, 447c35d236eSmrg int xdir, int ydir, 448c35d236eSmrg int rop, 449c35d236eSmrg unsigned int planemask, 450c35d236eSmrg int transparency_color 451c35d236eSmrg){ 452c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 453c35d236eSmrg 454c35d236eSmrg pGlint->BltScanDirection = ydir; 455c35d236eSmrg 456c35d236eSmrg GLINT_WAIT(5); 457c35d236eSmrg DO_PLANEMASK(planemask); 458c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode); 459c35d236eSmrg 460c35d236eSmrg if (rop == GXcopy) { 461c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_SrcEnable, FBReadMode); 462c35d236eSmrg } else { 463c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_SrcEnable | FBRM_DstEnable, FBReadMode); 464c35d236eSmrg } 465c35d236eSmrg LOADROP(rop); 466c35d236eSmrg} 467c35d236eSmrg 468c35d236eSmrgstatic void 469c35d236eSmrgTXSubsequentScreenToScreenCopy( 470c35d236eSmrg ScrnInfoPtr pScrn, 471c35d236eSmrg int x1, int y1, 472c35d236eSmrg int x2, int y2, 473c35d236eSmrg int w, int h 474c35d236eSmrg){ 475c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 476c35d236eSmrg int srcaddr, dstaddr; 477c35d236eSmrg 478c35d236eSmrg GLINT_WAIT(8); 479c35d236eSmrg if (pGlint->BltScanDirection != 1) { 480c35d236eSmrg y1 += h - 1; 481c35d236eSmrg y2 += h - 1; 482c35d236eSmrg TXLoadCoord(pScrn, x2, y2, x2+w, h, 0, -1); 483c35d236eSmrg } else { 484c35d236eSmrg TXLoadCoord(pScrn, x2, y2, x2+w, h, 0, 1); 485c35d236eSmrg } 486c35d236eSmrg 487c35d236eSmrg srcaddr = y1 * pScrn->displayWidth + x1; 488c35d236eSmrg dstaddr = y2 * pScrn->displayWidth + x2; 489c35d236eSmrg 490c35d236eSmrg GLINT_WRITE_REG(srcaddr - dstaddr, FBSourceOffset); 491c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid| FastFillEnable | SpanOperation, Render); 492c35d236eSmrg} 493c35d236eSmrg 494c35d236eSmrgstatic void 495c35d236eSmrgTXSetupForScanlineCPUToScreenColorExpandFill( 496c35d236eSmrg ScrnInfoPtr pScrn, 497c35d236eSmrg int fg, int bg, 498c35d236eSmrg int rop, 499c35d236eSmrg unsigned int planemask 500c35d236eSmrg){ 501c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 502c35d236eSmrg REPLICATE(fg); 503c35d236eSmrg REPLICATE(bg); 504c35d236eSmrg GLINT_WAIT(6); 505c35d236eSmrg DO_PLANEMASK(planemask); 506c35d236eSmrg GLINT_WRITE_REG(pGlint->rasterizerMode, RasterizerMode); 507c35d236eSmrg if (rop == GXcopy) { 508c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 509c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode); 510c35d236eSmrg pGlint->FrameBufferReadMode = FastFillEnable; 511c35d236eSmrg GLINT_WRITE_REG(fg, FBBlockColor); 512c35d236eSmrg } else { 513c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 514c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, PatternRamMode); 515c35d236eSmrg pGlint->FrameBufferReadMode = FastFillEnable | SpanOperation; 516c35d236eSmrg GLINT_WRITE_REG(fg, PatternRamData0); 517c35d236eSmrg } 518c35d236eSmrg LOADROP(rop); 519c35d236eSmrg} 520c35d236eSmrg 521c35d236eSmrgstatic void 522c35d236eSmrgTXSubsequentScanlineCPUToScreenColorExpandFill( 523c35d236eSmrg ScrnInfoPtr pScrn, 524c35d236eSmrg int x, int y, int w, int h, 525c35d236eSmrg int skipleft 526c35d236eSmrg){ 527c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 528c35d236eSmrg 529c35d236eSmrg pGlint->dwords = ((w + 31) >> 5); /* dwords per scanline */ 530c35d236eSmrg 531c35d236eSmrg pGlint->cpucount = h; 532c35d236eSmrg 533c35d236eSmrg GLINT_WAIT(8); 534c35d236eSmrg TXLoadCoord(pScrn, x, y, (x+w), h, 0, 1); 535c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | pGlint->FrameBufferReadMode | SyncOnBitMask, 536c35d236eSmrg Render); 537c35d236eSmrg#if defined(__alpha__) 538c35d236eSmrg if (0) /* force Alpha to use indirect always */ 539c35d236eSmrg#else 540c35d236eSmrg if ((pGlint->dwords*h) < pGlint->FIFOSize) 541c35d236eSmrg#endif 542c35d236eSmrg { 543c35d236eSmrg /* Turn on direct for less than FIFOSize dword colour expansion */ 544c35d236eSmrg pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->IOBase+OutputFIFO+4; 545c35d236eSmrg pGlint->ScanlineDirect = 1; 546c35d236eSmrg GLINT_WRITE_REG(((pGlint->dwords*h)-1)<<16 | 0x0D, OutputFIFO); 547c35d236eSmrg GLINT_WAIT(pGlint->dwords*h); 548c35d236eSmrg } else { 549c35d236eSmrg /* Use indirect for anything else */ 550c35d236eSmrg pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->ScratchBuffer; 551c35d236eSmrg pGlint->ScanlineDirect = 0; 552c35d236eSmrg } 553c35d236eSmrg 554c35d236eSmrg pGlint->cpucount--; 555c35d236eSmrg} 556c35d236eSmrg 557c35d236eSmrgstatic void 558c35d236eSmrgTXSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 559c35d236eSmrg{ 560c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 561c35d236eSmrg CARD32 *srcp = (CARD32*)pGlint->XAAScanlineColorExpandBuffers[bufno]; 562c35d236eSmrg int dwords = pGlint->dwords; 563c35d236eSmrg 564c35d236eSmrg if (!pGlint->ScanlineDirect) { 565c35d236eSmrg while(dwords >= pGlint->FIFOSize) { 566c35d236eSmrg GLINT_WAIT(pGlint->FIFOSize); 567c35d236eSmrg GLINT_WRITE_REG(((pGlint->FIFOSize - 2) << 16) | 0x0D, OutputFIFO); 568c35d236eSmrg GLINT_MoveDWORDS( 569c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 570c35d236eSmrg (CARD32*)srcp, pGlint->FIFOSize - 1); 571c35d236eSmrg dwords -= pGlint->FIFOSize - 1; 572c35d236eSmrg srcp += pGlint->FIFOSize - 1; 573c35d236eSmrg } 574c35d236eSmrg if(dwords) { 575c35d236eSmrg GLINT_WAIT(dwords + 1); 576c35d236eSmrg GLINT_WRITE_REG(((dwords - 1) << 16) | 0x0D, OutputFIFO); 577c35d236eSmrg GLINT_MoveDWORDS( 578c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 579c35d236eSmrg (CARD32*)srcp, dwords); 580c35d236eSmrg } 581c35d236eSmrg } 582c35d236eSmrg} 583c35d236eSmrg 584c35d236eSmrgvoid TXSetupForMono8x8PatternFill( 585c35d236eSmrg ScrnInfoPtr pScrn, 586c35d236eSmrg int patternx, int patterny, 587c35d236eSmrg int fg, int bg, int rop, 588c35d236eSmrg unsigned int planemask 589c35d236eSmrg){ 590c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 591c35d236eSmrg 592c35d236eSmrg if (bg == -1) pGlint->FrameBufferReadMode = -1; 593c35d236eSmrg else pGlint->FrameBufferReadMode = 0; 594c35d236eSmrg pGlint->ForeGroundColor = fg; 595c35d236eSmrg pGlint->BackGroundColor = bg; 596c35d236eSmrg REPLICATE(pGlint->ForeGroundColor); 597c35d236eSmrg REPLICATE(pGlint->BackGroundColor); 598c35d236eSmrg 599c35d236eSmrg GLINT_WAIT(13); 600c35d236eSmrg DO_PLANEMASK(planemask); 601c35d236eSmrg GLINT_WRITE_REG((patternx & 0x000000FF), AreaStipplePattern0); 602c35d236eSmrg GLINT_WRITE_REG((patternx & 0x0000FF00) >> 8, AreaStipplePattern1); 603c35d236eSmrg GLINT_WRITE_REG((patternx & 0x00FF0000) >> 16, AreaStipplePattern2); 604c35d236eSmrg GLINT_WRITE_REG((patternx & 0xFF000000) >> 24, AreaStipplePattern3); 605c35d236eSmrg GLINT_WRITE_REG((patterny & 0x000000FF), AreaStipplePattern4); 606c35d236eSmrg GLINT_WRITE_REG((patterny & 0x0000FF00) >> 8, AreaStipplePattern5); 607c35d236eSmrg GLINT_WRITE_REG((patterny & 0x00FF0000) >> 16, AreaStipplePattern6); 608c35d236eSmrg GLINT_WRITE_REG((patterny & 0xFF000000) >> 24, AreaStipplePattern7); 609c35d236eSmrg 610c35d236eSmrg if (rop == GXcopy) { 611c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode); 612c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 613c35d236eSmrg } else { 614c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, PatternRamMode); 615c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 616c35d236eSmrg } 617c35d236eSmrg LOADROP(rop); 618c35d236eSmrg} 619c35d236eSmrg 620c35d236eSmrgstatic void 621c35d236eSmrgTXSubsequentMono8x8PatternFillRect( 622c35d236eSmrg ScrnInfoPtr pScrn, 623c35d236eSmrg int patternx, int patterny, 624c35d236eSmrg int x, int y, 625c35d236eSmrg int w, int h 626c35d236eSmrg){ 627c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 628c35d236eSmrg int span = 0; 629c35d236eSmrg 630c35d236eSmrg GLINT_WAIT(12); 631c35d236eSmrg TXLoadCoord(pScrn, x, y, x+w, h, 0, 1); 632c35d236eSmrg 633c35d236eSmrg if (pGlint->FrameBufferReadMode != -1) { 634c35d236eSmrg if (pGlint->ROP == GXcopy) { 635c35d236eSmrg GLINT_WRITE_REG(pGlint->BackGroundColor, FBBlockColor); 636c35d236eSmrg span = 0; 637c35d236eSmrg } else { 638c35d236eSmrg GLINT_WRITE_REG(pGlint->BackGroundColor, PatternRamData0); 639c35d236eSmrg span = SpanOperation; 640c35d236eSmrg } 641c35d236eSmrg GLINT_WRITE_REG(2<<1|2<<4|patternx<<7|patterny<<12|ASM_InvertPattern | 642c35d236eSmrg UNIT_ENABLE, AreaStippleMode); 643c35d236eSmrg GLINT_WRITE_REG(AreaStippleEnable | span | FastFillEnable | 644c35d236eSmrg PrimitiveTrapezoid, Render); 645c35d236eSmrg } 646c35d236eSmrg 647c35d236eSmrg if (pGlint->ROP == GXcopy) { 648c35d236eSmrg GLINT_WRITE_REG(pGlint->ForeGroundColor, FBBlockColor); 649c35d236eSmrg span = 0; 650c35d236eSmrg } else { 651c35d236eSmrg GLINT_WRITE_REG(pGlint->ForeGroundColor, PatternRamData0); 652c35d236eSmrg span = SpanOperation; 653c35d236eSmrg } 654c35d236eSmrg GLINT_WRITE_REG(2<<1|2<<4|patternx<<7|patterny<<12| 655c35d236eSmrg UNIT_ENABLE, AreaStippleMode); 656c35d236eSmrg GLINT_WRITE_REG(AreaStippleEnable | span | FastFillEnable | 657c35d236eSmrg PrimitiveTrapezoid, Render); 658c35d236eSmrg} 659c35d236eSmrg 660c35d236eSmrgstatic void 661c35d236eSmrgTXWriteBitmap(ScrnInfoPtr pScrn, 662c35d236eSmrg int x, int y, int w, int h, 663c35d236eSmrg unsigned char *src, 664c35d236eSmrg int srcwidth, 665c35d236eSmrg int skipleft, 666c35d236eSmrg int fg, int bg, 667c35d236eSmrg int rop, 668c35d236eSmrg unsigned int planemask 669c35d236eSmrg){ 670c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); 671c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 672c35d236eSmrg unsigned char *srcpntr; 673c35d236eSmrg int dwords, height, mode; 674c35d236eSmrg Bool SecondPass = FALSE; 675c35d236eSmrg register int count; 676c35d236eSmrg register CARD32* pattern; 677c35d236eSmrg 678c35d236eSmrg w += skipleft; 679c35d236eSmrg x -= skipleft; 680c35d236eSmrg dwords = (w + 31) >> 5; 681c35d236eSmrg 682c35d236eSmrg TXSetClippingRectangle(pScrn,x+skipleft, y, x+w, y+h); 683c35d236eSmrg 684c35d236eSmrg GLINT_WAIT(11); 685c35d236eSmrg DO_PLANEMASK(planemask); 686c35d236eSmrg GLINT_WRITE_REG(pGlint->rasterizerMode, RasterizerMode); 687c35d236eSmrg LOADROP(rop); 688c35d236eSmrg if (rop == GXcopy) { 689c35d236eSmrg mode = 0; 690c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode); 691c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 692c35d236eSmrg } else { 693c35d236eSmrg mode = SpanOperation; 694c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, PatternRamMode); 695c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 696c35d236eSmrg } 697c35d236eSmrg TXLoadCoord(pScrn, x, y, x+w, h, 0, 1); 698c35d236eSmrg 699c35d236eSmrg if(bg == -1) { 700c35d236eSmrg REPLICATE(fg); 701c35d236eSmrg GLINT_WAIT(3); 702c35d236eSmrg if (rop == GXcopy) { 703c35d236eSmrg GLINT_WRITE_REG(fg, FBBlockColor); 704c35d236eSmrg } else { 705c35d236eSmrg GLINT_WRITE_REG(fg, PatternRamData0); 706c35d236eSmrg } 707c35d236eSmrg } else if(rop == GXcopy) { 708c35d236eSmrg REPLICATE(bg); 709c35d236eSmrg GLINT_WAIT(5); 710c35d236eSmrg if (rop == GXcopy) { 711c35d236eSmrg GLINT_WRITE_REG(bg, FBBlockColor); 712c35d236eSmrg } else { 713c35d236eSmrg GLINT_WRITE_REG(bg, PatternRamData0); 714c35d236eSmrg } 715c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid |mode|FastFillEnable,Render); 716c35d236eSmrg REPLICATE(fg); 717c35d236eSmrg if (rop == GXcopy) { 718c35d236eSmrg GLINT_WRITE_REG(fg, FBBlockColor); 719c35d236eSmrg } else { 720c35d236eSmrg GLINT_WRITE_REG(fg, PatternRamData0); 721c35d236eSmrg } 722c35d236eSmrg } else { 723c35d236eSmrg SecondPass = TRUE; 724c35d236eSmrg REPLICATE(fg); 725c35d236eSmrg GLINT_WAIT(3); 726c35d236eSmrg if (rop == GXcopy) { 727c35d236eSmrg GLINT_WRITE_REG(fg, FBBlockColor); 728c35d236eSmrg } else { 729c35d236eSmrg GLINT_WRITE_REG(fg, PatternRamData0); 730c35d236eSmrg } 731c35d236eSmrg } 732c35d236eSmrg 733c35d236eSmrgSECOND_PASS: 734c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | FastFillEnable | mode | SyncOnBitMask, Render); 735c35d236eSmrg 736c35d236eSmrg height = h; 737c35d236eSmrg srcpntr = src; 738c35d236eSmrg while(height--) { 739c35d236eSmrg count = dwords >> 3; 740c35d236eSmrg pattern = (CARD32*)srcpntr; 741c35d236eSmrg while(count--) { 742c35d236eSmrg GLINT_WAIT(8); 743c35d236eSmrg GLINT_WRITE_REG(*(pattern), BitMaskPattern); 744c35d236eSmrg GLINT_WRITE_REG(*(pattern+1), BitMaskPattern); 745c35d236eSmrg GLINT_WRITE_REG(*(pattern+2), BitMaskPattern); 746c35d236eSmrg GLINT_WRITE_REG(*(pattern+3), BitMaskPattern); 747c35d236eSmrg GLINT_WRITE_REG(*(pattern+4), BitMaskPattern); 748c35d236eSmrg GLINT_WRITE_REG(*(pattern+5), BitMaskPattern); 749c35d236eSmrg GLINT_WRITE_REG(*(pattern+6), BitMaskPattern); 750c35d236eSmrg GLINT_WRITE_REG(*(pattern+7), BitMaskPattern); 751c35d236eSmrg pattern+=8; 752c35d236eSmrg } 753c35d236eSmrg count = dwords & 0x07; 754c35d236eSmrg GLINT_WAIT(count); 755c35d236eSmrg while (count--) 756c35d236eSmrg GLINT_WRITE_REG(*(pattern++), BitMaskPattern); 757c35d236eSmrg srcpntr += srcwidth; 758c35d236eSmrg } 759c35d236eSmrg 760c35d236eSmrg if(SecondPass) { 761c35d236eSmrg SecondPass = FALSE; 762c35d236eSmrg REPLICATE(bg); 763c35d236eSmrg GLINT_WAIT(4); 764c35d236eSmrg GLINT_WRITE_REG(InvertBitMask | pGlint->rasterizerMode, RasterizerMode); 765c35d236eSmrg if (rop == GXcopy) { 766c35d236eSmrg GLINT_WRITE_REG(bg, FBBlockColor); 767c35d236eSmrg } else { 768c35d236eSmrg GLINT_WRITE_REG(bg, PatternRamData0); 769c35d236eSmrg } 770c35d236eSmrg goto SECOND_PASS; 771c35d236eSmrg } 772c35d236eSmrg 773c35d236eSmrg GLINT_WAIT(2); 774c35d236eSmrg GLINT_WRITE_REG(pGlint->rasterizerMode, RasterizerMode); 775c35d236eSmrg CHECKCLIPPING; 776c35d236eSmrg SET_SYNC_FLAG(infoRec); 777c35d236eSmrg} 778c35d236eSmrg 779c35d236eSmrgstatic void 780c35d236eSmrgTXWritePixmap( 781c35d236eSmrg ScrnInfoPtr pScrn, 782c35d236eSmrg int x, int y, int w, int h, 783c35d236eSmrg unsigned char *src, 784c35d236eSmrg int srcwidth, /* bytes */ 785c35d236eSmrg int rop, 786c35d236eSmrg unsigned int planemask, 787c35d236eSmrg int trans, 788c35d236eSmrg int bpp, int depth 789c35d236eSmrg){ 790c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); 791c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 792c35d236eSmrg CARD32 *srcp; 793c35d236eSmrg int count,dwords, skipleft, Bpp = bpp >> 3; 794c35d236eSmrg 795c35d236eSmrg if((skipleft = (long)src & 0x03L)) { 796c35d236eSmrg skipleft /= Bpp; 797c35d236eSmrg 798c35d236eSmrg x -= skipleft; 799c35d236eSmrg w += skipleft; 800c35d236eSmrg 801c35d236eSmrg src = (unsigned char*)((long)src & ~0x03L); 802c35d236eSmrg } 803c35d236eSmrg 804c35d236eSmrg switch(Bpp) { 805c35d236eSmrg case 1: dwords = (w + 3) >> 2; 806c35d236eSmrg break; 807c35d236eSmrg case 2: dwords = (w + 1) >> 1; 808c35d236eSmrg break; 809c35d236eSmrg case 4: dwords = w; 810c35d236eSmrg break; 811c35d236eSmrg default: return; 812c35d236eSmrg } 813c35d236eSmrg 814c35d236eSmrg TXSetClippingRectangle(pScrn,x+skipleft, y, x+w, y+h); 815c35d236eSmrg 816c35d236eSmrg GLINT_WAIT(12); 817c35d236eSmrg DO_PLANEMASK(planemask); 818c35d236eSmrg GLINT_WRITE_REG(0, PatternRamMode); 819c35d236eSmrg if (rop == GXcopy) { 820c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 821c35d236eSmrg } else { 822c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 823c35d236eSmrg } 824c35d236eSmrg LOADROP(rop); 825c35d236eSmrg TXLoadCoord(pScrn, x, y, x+w, h, 0, 1); 826c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | FastFillEnable | SpanOperation | 827c35d236eSmrg SyncOnHostData, Render); 828c35d236eSmrg 829c35d236eSmrg while(h--) { 830c35d236eSmrg count = dwords; 831c35d236eSmrg srcp = (CARD32*)src; 832c35d236eSmrg while(count >= infoRec->ColorExpandRange) { 833c35d236eSmrg GLINT_WAIT(infoRec->ColorExpandRange); 834c35d236eSmrg /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ 835c35d236eSmrg GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | (0x15 << 4) | 836c35d236eSmrg 0x05, OutputFIFO); 837c35d236eSmrg GLINT_MoveDWORDS( 838c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 839c35d236eSmrg (CARD32*)srcp, infoRec->ColorExpandRange - 1); 840c35d236eSmrg count -= infoRec->ColorExpandRange - 1; 841c35d236eSmrg srcp += infoRec->ColorExpandRange - 1; 842c35d236eSmrg } 843c35d236eSmrg if(count) { 844c35d236eSmrg GLINT_WAIT(count); 845c35d236eSmrg /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ 846c35d236eSmrg GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | 847c35d236eSmrg 0x05, OutputFIFO); 848c35d236eSmrg GLINT_MoveDWORDS( 849c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 850c35d236eSmrg (CARD32*)srcp, count); 851c35d236eSmrg } 852c35d236eSmrg src += srcwidth; 853c35d236eSmrg } 854c35d236eSmrg CHECKCLIPPING; 855c35d236eSmrg SET_SYNC_FLAG(infoRec); 856c35d236eSmrg} 857c35d236eSmrg 858c35d236eSmrgstatic void 859c35d236eSmrgTXPolylinesThinSolidWrapper( 860c35d236eSmrg DrawablePtr pDraw, 861c35d236eSmrg GCPtr pGC, 862c35d236eSmrg int mode, 863c35d236eSmrg int npt, 864c35d236eSmrg DDXPointPtr pPts 865c35d236eSmrg){ 866c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); 867c35d236eSmrg GLINTPtr pGlint = GLINTPTR(infoRec->pScrn); 868c35d236eSmrg pGlint->CurrentGC = pGC; 869c35d236eSmrg pGlint->CurrentDrawable = pDraw; 870c35d236eSmrg if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn); 871c35d236eSmrg XAAPolyLines(pDraw, pGC, mode, npt, pPts); 872c35d236eSmrg} 873c35d236eSmrg 874c35d236eSmrgstatic void 875c35d236eSmrgTXPolySegmentThinSolidWrapper( 876c35d236eSmrg DrawablePtr pDraw, 877c35d236eSmrg GCPtr pGC, 878c35d236eSmrg int nseg, 879c35d236eSmrg xSegment *pSeg 880c35d236eSmrg){ 881c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); 882c35d236eSmrg GLINTPtr pGlint = GLINTPTR(infoRec->pScrn); 883c35d236eSmrg pGlint->CurrentGC = pGC; 884c35d236eSmrg pGlint->CurrentDrawable = pDraw; 885c35d236eSmrg if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn); 886c35d236eSmrg XAAPolySegment(pDraw, pGC, nseg, pSeg); 887c35d236eSmrg} 888c35d236eSmrg 889c35d236eSmrgstatic void 890c35d236eSmrgTXSetupForSolidLine(ScrnInfoPtr pScrn, int color, 891c35d236eSmrg int rop, unsigned int planemask) 892c35d236eSmrg{ 893c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 894c35d236eSmrg 895c35d236eSmrg GLINT_WAIT(5); 896c35d236eSmrg DO_PLANEMASK(planemask); 897c35d236eSmrg GLINT_WRITE_REG(color, GLINTColor); 898c35d236eSmrg if (rop == GXcopy) { 899c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 900c35d236eSmrg } else { 901c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 902c35d236eSmrg } 903c35d236eSmrg LOADROP(rop); 904c35d236eSmrg} 905c35d236eSmrg 906c35d236eSmrgstatic void 907c35d236eSmrgTXSubsequentHorVertLine(ScrnInfoPtr pScrn,int x,int y,int len,int dir) 908c35d236eSmrg{ 909c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 910c35d236eSmrg 911c35d236eSmrg GLINT_WAIT(7); 912c35d236eSmrg if (dir == DEGREES_0) { 913c35d236eSmrg TXLoadCoord(pScrn, x, y, 0, len, 1, 0); 914c35d236eSmrg } else { 915c35d236eSmrg TXLoadCoord(pScrn, x, y, 0, len, 0, 1); 916c35d236eSmrg } 917c35d236eSmrg 918c35d236eSmrg GLINT_WRITE_REG(PrimitiveLine, Render); 919c35d236eSmrg} 920c35d236eSmrg 921c35d236eSmrgstatic void 922c35d236eSmrgTXSubsequentSolidBresenhamLine( ScrnInfoPtr pScrn, 923c35d236eSmrg int x, int y, int dmaj, int dmin, int e, int len, int octant) 924c35d236eSmrg{ 925c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 926c35d236eSmrg int dxdom, dy; 927c35d236eSmrg 928c35d236eSmrg if(dmaj == dmin) { 929c35d236eSmrg GLINT_WAIT(7); 930c35d236eSmrg if(octant & YDECREASING) { 931c35d236eSmrg dy = -1; 932c35d236eSmrg } else { 933c35d236eSmrg dy = 1; 934c35d236eSmrg } 935c35d236eSmrg 936c35d236eSmrg if(octant & XDECREASING) { 937c35d236eSmrg dxdom = -1; 938c35d236eSmrg } else { 939c35d236eSmrg dxdom = 1; 940c35d236eSmrg } 941c35d236eSmrg 942c35d236eSmrg TXLoadCoord(pScrn, x, y, 0, len, dxdom, dy); 943c35d236eSmrg GLINT_WRITE_REG(PrimitiveLine, Render); 944c35d236eSmrg return; 945c35d236eSmrg } 946c35d236eSmrg 947c35d236eSmrg fbBres(pGlint->CurrentDrawable, pGlint->CurrentGC, 0, 948c35d236eSmrg (octant & XDECREASING) ? -1 : 1, 949c35d236eSmrg (octant & YDECREASING) ? -1 : 1, 950c35d236eSmrg (octant & YMAJOR) ? Y_AXIS : X_AXIS, 951c35d236eSmrg x, y, e, dmin, -dmaj, len); 952c35d236eSmrg} 9531fb744b4Smrg#endif 954