pm_accel.c revision e29e96eb
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 * Permedia 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 "glint_regs.h" 44c35d236eSmrg#include "glint.h" 45c35d236eSmrg 461fb744b4Smrg#ifdef HAVE_XAA_H 47c35d236eSmrg#include "miline.h" /* for octants */ 48c35d236eSmrg#include "xaalocal.h" /* For replacements */ 49c35d236eSmrg 50c35d236eSmrgstatic void PermediaSync(ScrnInfoPtr pScrn); 51c35d236eSmrgstatic void PermediaSetupForFillRectSolid(ScrnInfoPtr pScrn, int color, int rop, 52c35d236eSmrg unsigned int planemask); 53c35d236eSmrgstatic void PermediaSubsequentFillRectSolid(ScrnInfoPtr pScrn, int x, int y, 54c35d236eSmrg int w, int h); 55c35d236eSmrgstatic void PermediaSetupForSolidLine(ScrnInfoPtr pScrn, int color, 56c35d236eSmrg int rop, unsigned int planemask); 57c35d236eSmrgstatic void PermediaSubsequentHorVertLine(ScrnInfoPtr pScrn, int x, int y, 58c35d236eSmrg int len, int dir); 59c35d236eSmrgstatic void PermediaSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, 60c35d236eSmrg int x, int y, int dmaj, int dmin, int e, 61c35d236eSmrg int len, int octant); 62c35d236eSmrgstatic void PermediaSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, 63c35d236eSmrg int y1, int x2, int y2, int w, int h); 64c35d236eSmrgstatic void PermediaSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, 65c35d236eSmrg int ydir, int rop, unsigned int planemask, 66c35d236eSmrg int transparency_color); 67c35d236eSmrgstatic void PermediaSetClippingRectangle(ScrnInfoPtr pScrn, int x1, int y1, 68c35d236eSmrg int x2, int y2); 69c35d236eSmrgstatic void PermediaDisableClipping(ScrnInfoPtr pScrn); 70c35d236eSmrgstatic void PermediaSetupForScanlineCPUToScreenColorExpandFill( 71c35d236eSmrg ScrnInfoPtr pScrn, 72c35d236eSmrg int fg, int bg, int rop, 73c35d236eSmrg unsigned int planemask); 74c35d236eSmrgstatic void PermediaSubsequentScanlineCPUToScreenColorExpandFill( 75c35d236eSmrg ScrnInfoPtr pScrn, int x, 76c35d236eSmrg int y, int w, int h, int skipleft); 77c35d236eSmrgstatic void PermediaSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno); 78c35d236eSmrgstatic void PermediaWriteBitmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, 79c35d236eSmrg unsigned char *src, int srcwidth, int skipleft, 80c35d236eSmrg int fg, int bg, int rop,unsigned int planemask); 81c35d236eSmrgstatic void PermediaWritePixmap8bpp(ScrnInfoPtr pScrn, int x, int y, int w, 82c35d236eSmrg int h, unsigned char *src, int srcwidth, 83c35d236eSmrg int rop, unsigned int planemask, 84c35d236eSmrg int transparency_color, int bpp, int depth); 85c35d236eSmrgstatic void PermediaWritePixmap16bpp(ScrnInfoPtr pScrn, int x, int y, int w, 86c35d236eSmrg int h, unsigned char *src, int srcwidth, 87c35d236eSmrg int rop, unsigned int planemask, 88c35d236eSmrg int transparency_color, int bpp, int depth); 89c35d236eSmrgstatic void PermediaWritePixmap32bpp(ScrnInfoPtr pScrn, int x, int y, int w, 90c35d236eSmrg int h, unsigned char *src, int srcwidth, 91c35d236eSmrg int rop, unsigned int planemask, 92c35d236eSmrg int transparency_color, int bpp, int depth); 93c35d236eSmrgstatic void PermediaSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 94c35d236eSmrg int patternx, int patterny, 95c35d236eSmrg int fg, int bg, int rop, 96c35d236eSmrg unsigned planemask); 97c35d236eSmrgstatic void PermediaSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 98c35d236eSmrg int patternx, int patterny, int x, int y, 99c35d236eSmrg int w, int h); 100c35d236eSmrgstatic void PermediaLoadCoord(ScrnInfoPtr pScrn, int x, int y, int w, int h, 101c35d236eSmrg int a, int d); 102c35d236eSmrgstatic void PermediaPolylinesThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC, 103c35d236eSmrg int mode, int npt, DDXPointPtr pPts); 104c35d236eSmrgstatic void PermediaPolySegmentThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC, 105c35d236eSmrg int nseg, xSegment *pSeg); 106c35d236eSmrg 107c35d236eSmrgvoid 108c35d236eSmrgPermediaInitializeEngine(ScrnInfoPtr pScrn) 109c35d236eSmrg{ 110c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 111c35d236eSmrg 112c35d236eSmrg /* Initialize the Accelerator Engine to defaults */ 113c35d236eSmrg 114c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ScissorMode); 115c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_ENABLE, FBWriteMode); 116c35d236eSmrg GLINT_SLOW_WRITE_REG(0, dXSub); 117c35d236eSmrg GLINT_SLOW_WRITE_REG(GWIN_DisableLBUpdate, GLINTWindow); 118c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DitherMode); 119c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaBlendMode); 120c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 121c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureColorMode); 122c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureAddressMode); 123c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PMTextureReadMode); 124c35d236eSmrg GLINT_SLOW_WRITE_REG(pGlint->pprod, LBReadMode); 125c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaBlendMode); 126c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TexelLUTMode); 127c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, YUVMode); 128c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); 129c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RouterMode); 130c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FogMode); 131c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AntialiasMode); 132c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaTestMode); 133c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StencilMode); 134c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AreaStippleMode); 135c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LogicalOpMode); 136c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); 137c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StatisticMode); 138c35d236eSmrg GLINT_SLOW_WRITE_REG(0x400, FilterMode); 139c35d236eSmrg GLINT_SLOW_WRITE_REG(0xffffffff, FBHardwareWriteMask); 140c35d236eSmrg GLINT_SLOW_WRITE_REG(0xffffffff, FBSoftwareWriteMask); 141c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RasterizerMode); 142c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, GLINTDepth); 143c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBSourceOffset); 144c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBPixelOffset); 145c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBSourceOffset); 146c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, WindowOrigin); 147c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBWindowBase); 148c35d236eSmrg GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBWindowBase); 149c35d236eSmrg 150c35d236eSmrg switch (pScrn->bitsPerPixel) { 151c35d236eSmrg case 8: 152c35d236eSmrg GLINT_SLOW_WRITE_REG(0x0, FBReadPixel); /* 8 Bits */ 153c35d236eSmrg GLINT_SLOW_WRITE_REG(pGlint->pprod, PMTextureMapFormat); 154c35d236eSmrg break; 155c35d236eSmrg case 16: 156c35d236eSmrg GLINT_SLOW_WRITE_REG(0x1, FBReadPixel); /* 16 Bits */ 157c35d236eSmrg GLINT_SLOW_WRITE_REG(pGlint->pprod | 1<<19, PMTextureMapFormat); 158c35d236eSmrg break; 159c35d236eSmrg case 32: 160c35d236eSmrg GLINT_SLOW_WRITE_REG(0x2, FBReadPixel); /* 32 Bits */ 161c35d236eSmrg GLINT_SLOW_WRITE_REG(pGlint->pprod | 2<<19, PMTextureMapFormat); 162c35d236eSmrg break; 163c35d236eSmrg } 164c35d236eSmrg pGlint->ROP = 0xFF; 165c35d236eSmrg pGlint->ClippingOn = FALSE; 166c35d236eSmrg pGlint->startxsub = 0; 167c35d236eSmrg pGlint->startxdom = 0; 168c35d236eSmrg pGlint->starty = 0; 169c35d236eSmrg pGlint->count = 0; 170c35d236eSmrg pGlint->dxdom = 0; 171c35d236eSmrg pGlint->dy = 1<<16; 172c35d236eSmrg GLINT_WAIT(6); 173c35d236eSmrg GLINT_WRITE_REG(0, StartXSub); 174c35d236eSmrg GLINT_WRITE_REG(0,StartXDom); 175c35d236eSmrg GLINT_WRITE_REG(0,StartY); 176c35d236eSmrg GLINT_WRITE_REG(0,GLINTCount); 177c35d236eSmrg GLINT_WRITE_REG(0,dXDom); 178c35d236eSmrg GLINT_WRITE_REG(1<<16,dY); 179c35d236eSmrg} 1801fb744b4Smrg#endif 181c35d236eSmrg 182c35d236eSmrgBool 183c35d236eSmrgPermediaAccelInit(ScreenPtr pScreen) 184c35d236eSmrg{ 1851fb744b4Smrg#ifdef HAVE_XAA_H 186c35d236eSmrg XAAInfoRecPtr infoPtr; 1871fb744b4Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 188c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 189c35d236eSmrg BoxRec AvailFBArea; 190c35d236eSmrg 191c35d236eSmrg pGlint->AccelInfoRec = infoPtr = XAACreateInfoRec(); 192c35d236eSmrg if (!infoPtr) return FALSE; 193c35d236eSmrg 194c35d236eSmrg PermediaInitializeEngine(pScrn); 195c35d236eSmrg 196c35d236eSmrg infoPtr->Flags = PIXMAP_CACHE | 197c35d236eSmrg LINEAR_FRAMEBUFFER | 198c35d236eSmrg OFFSCREEN_PIXMAPS; 199c35d236eSmrg 200c35d236eSmrg infoPtr->Sync = PermediaSync; 201c35d236eSmrg 202c35d236eSmrg infoPtr->SetClippingRectangle = PermediaSetClippingRectangle; 203c35d236eSmrg infoPtr->DisableClipping = PermediaDisableClipping; 204c35d236eSmrg infoPtr->ClippingFlags = HARDWARE_CLIP_MONO_8x8_FILL; 205c35d236eSmrg 206c35d236eSmrg infoPtr->SolidFillFlags = 0; 207c35d236eSmrg infoPtr->SetupForSolidFill = PermediaSetupForFillRectSolid; 208c35d236eSmrg infoPtr->SubsequentSolidFillRect = PermediaSubsequentFillRectSolid; 209c35d236eSmrg infoPtr->SolidLineFlags = 0; 210c35d236eSmrg infoPtr->PolySegmentThinSolidFlags = 0; 211c35d236eSmrg infoPtr->PolylinesThinSolidFlags = 0; 212c35d236eSmrg infoPtr->SetupForSolidLine = PermediaSetupForSolidLine; 213c35d236eSmrg infoPtr->SubsequentSolidHorVertLine = PermediaSubsequentHorVertLine; 214c35d236eSmrg if (!(pScrn->overlayFlags & OVERLAY_8_32_PLANAR)) 215c35d236eSmrg { 216c35d236eSmrg infoPtr->SubsequentSolidBresenhamLine = 217c35d236eSmrg PermediaSubsequentSolidBresenhamLine; 218c35d236eSmrg } 219c35d236eSmrg infoPtr->PolySegmentThinSolid = PermediaPolySegmentThinSolidWrapper; 220c35d236eSmrg infoPtr->PolylinesThinSolid = PermediaPolylinesThinSolidWrapper; 221c35d236eSmrg 222c35d236eSmrg infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY; 223c35d236eSmrg 224c35d236eSmrg infoPtr->SetupForScreenToScreenCopy = PermediaSetupForScreenToScreenCopy; 225c35d236eSmrg infoPtr->SubsequentScreenToScreenCopy = PermediaSubsequentScreenToScreenCopy; 226c35d236eSmrg 227c35d236eSmrg infoPtr->Mono8x8PatternFillFlags = 228c35d236eSmrg HARDWARE_PATTERN_PROGRAMMED_ORIGIN | 229c35d236eSmrg HARDWARE_PATTERN_PROGRAMMED_BITS | 230c35d236eSmrg HARDWARE_PATTERN_SCREEN_ORIGIN; 231c35d236eSmrg 232c35d236eSmrg infoPtr->SetupForMono8x8PatternFill = 233c35d236eSmrg PermediaSetupForMono8x8PatternFill; 234c35d236eSmrg infoPtr->SubsequentMono8x8PatternFillRect = 235c35d236eSmrg PermediaSubsequentMono8x8PatternFillRect; 236c35d236eSmrg 237c35d236eSmrg infoPtr->ScanlineCPUToScreenColorExpandFillFlags = 238c35d236eSmrg#if 0 239c35d236eSmrg LEFT_EDGE_CLIPPING | 240c35d236eSmrg LEFT_EDGE_CLIPPING_NEGATIVE_X | 241c35d236eSmrg#endif 242c35d236eSmrg BIT_ORDER_IN_BYTE_LSBFIRST; 243c35d236eSmrg 244c35d236eSmrg infoPtr->NumScanlineColorExpandBuffers = 1; 2451fb744b4Smrg pGlint->ScratchBuffer = malloc(((pScrn->virtualX + 62) / 32 * 4) + (pScrn->virtualX * pScrn->bitsPerPixel / 8)); 246c35d236eSmrg infoPtr->ScanlineColorExpandBuffers = 247c35d236eSmrg pGlint->XAAScanlineColorExpandBuffers; 248c35d236eSmrg pGlint->XAAScanlineColorExpandBuffers[0] = 249c35d236eSmrg pGlint->IOBase + OutputFIFO + 4; 250c35d236eSmrg 251c35d236eSmrg infoPtr->SetupForScanlineCPUToScreenColorExpandFill = 252c35d236eSmrg PermediaSetupForScanlineCPUToScreenColorExpandFill; 253c35d236eSmrg infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = 254c35d236eSmrg PermediaSubsequentScanlineCPUToScreenColorExpandFill; 255c35d236eSmrg infoPtr->SubsequentColorExpandScanline = 256c35d236eSmrg PermediaSubsequentColorExpandScanline; 257c35d236eSmrg 258c35d236eSmrg infoPtr->ColorExpandRange = pGlint->FIFOSize; 259c35d236eSmrg 260c35d236eSmrg infoPtr->WriteBitmap = PermediaWriteBitmap; 261c35d236eSmrg 262c35d236eSmrg if (pScrn->bitsPerPixel == 8) 263c35d236eSmrg infoPtr->WritePixmap = PermediaWritePixmap8bpp; 264c35d236eSmrg else 265c35d236eSmrg if (pScrn->bitsPerPixel == 16) 266c35d236eSmrg infoPtr->WritePixmap = PermediaWritePixmap16bpp; 267c35d236eSmrg else 268c35d236eSmrg if (pScrn->bitsPerPixel == 32) 269c35d236eSmrg infoPtr->WritePixmap = PermediaWritePixmap32bpp; 270c35d236eSmrg 271c35d236eSmrg AvailFBArea.x1 = 0; 272c35d236eSmrg AvailFBArea.y1 = 0; 273c35d236eSmrg AvailFBArea.x2 = pScrn->displayWidth; 274c35d236eSmrg AvailFBArea.y2 = pGlint->FbMapSize / (pScrn->displayWidth * 275c35d236eSmrg pScrn->bitsPerPixel / 8); 276c35d236eSmrg 277c35d236eSmrg if (AvailFBArea.y2 > 1023) AvailFBArea.y2 = 1023; 278c35d236eSmrg 279c35d236eSmrg xf86InitFBManager(pScreen, &AvailFBArea); 280c35d236eSmrg 281c35d236eSmrg return (XAAInit(pScreen, infoPtr)); 2821fb744b4Smrg#else 2831fb744b4Smrg return FALSE; 2841fb744b4Smrg#endif 285c35d236eSmrg} 286c35d236eSmrg 2871fb744b4Smrg#ifdef HAVE_XAA_H 288c35d236eSmrgstatic void PermediaLoadCoord( 289c35d236eSmrg ScrnInfoPtr pScrn, 290c35d236eSmrg int x, int y, 291c35d236eSmrg int w, int h, 292c35d236eSmrg int a, int d 293c35d236eSmrg){ 294c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 295c35d236eSmrg 296c35d236eSmrg if (w != pGlint->startxsub) { 297c35d236eSmrg GLINT_WRITE_REG(w, StartXSub); 298c35d236eSmrg pGlint->startxsub = w; 299c35d236eSmrg } 300c35d236eSmrg if (x != pGlint->startxdom) { 301c35d236eSmrg GLINT_WRITE_REG(x,StartXDom); 302c35d236eSmrg pGlint->startxdom = x; 303c35d236eSmrg } 304c35d236eSmrg if (y != pGlint->starty) { 305c35d236eSmrg GLINT_WRITE_REG(y,StartY); 306c35d236eSmrg pGlint->starty = y; 307c35d236eSmrg } 308c35d236eSmrg if (h != pGlint->count) { 309c35d236eSmrg GLINT_WRITE_REG(h,GLINTCount); 310c35d236eSmrg pGlint->count = h; 311c35d236eSmrg } 312c35d236eSmrg if (a != pGlint->dxdom) { 313c35d236eSmrg GLINT_WRITE_REG(a,dXDom); 314c35d236eSmrg pGlint->dxdom = a; 315c35d236eSmrg } 316c35d236eSmrg if (d != pGlint->dy) { 317c35d236eSmrg GLINT_WRITE_REG(d,dY); 318c35d236eSmrg pGlint->dy = d; 319c35d236eSmrg } 320c35d236eSmrg} 321c35d236eSmrg 322c35d236eSmrgstatic void 323c35d236eSmrgPermediaSync(ScrnInfoPtr pScrn) 324c35d236eSmrg{ 325c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 326c35d236eSmrg 327c35d236eSmrg CHECKCLIPPING; 328c35d236eSmrg 329c35d236eSmrg while (GLINT_READ_REG(DMACount) != 0); 330c35d236eSmrg GLINT_WAIT(2); 331c35d236eSmrg GLINT_WRITE_REG(0x400, FilterMode); 332c35d236eSmrg GLINT_WRITE_REG(0, GlintSync); 333c35d236eSmrg do { 334c35d236eSmrg while(GLINT_READ_REG(OutFIFOWords) == 0); 335c35d236eSmrg } while (GLINT_READ_REG(OutputFIFO) != Sync_tag); 336c35d236eSmrg} 337c35d236eSmrg 338c35d236eSmrgstatic void 339c35d236eSmrgPermediaSetClippingRectangle( 340c35d236eSmrg ScrnInfoPtr pScrn, 341c35d236eSmrg int x1, int y1, 342c35d236eSmrg int x2, int y2 343c35d236eSmrg){ 344c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 345c35d236eSmrg GLINT_WAIT(3); 346c35d236eSmrg GLINT_WRITE_REG (((y1&0x0FFF) << 16) | (x1&0x0FFF), ScissorMinXY); 347c35d236eSmrg GLINT_WRITE_REG (((y2&0x0FFF) << 16) | (x2&0x0FFF), ScissorMaxXY); 348c35d236eSmrg GLINT_WRITE_REG (1, ScissorMode); 349c35d236eSmrg pGlint->ClippingOn = TRUE; 350c35d236eSmrg} 351c35d236eSmrg 352c35d236eSmrgstatic void 353c35d236eSmrgPermediaDisableClipping( 354c35d236eSmrg ScrnInfoPtr pScrn 355c35d236eSmrg){ 356c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 357c35d236eSmrg CHECKCLIPPING; 358c35d236eSmrg} 359c35d236eSmrg 360c35d236eSmrgstatic void 361c35d236eSmrgPermediaSetupForScreenToScreenCopy( 362c35d236eSmrg ScrnInfoPtr pScrn, 363c35d236eSmrg int xdir, int ydir, int rop, 364c35d236eSmrg unsigned int planemask, int transparency_color 365c35d236eSmrg){ 366c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 367c35d236eSmrg 368c35d236eSmrg pGlint->BltScanDirection = 0; 369c35d236eSmrg if (ydir == 1) pGlint->BltScanDirection |= YPositive; 370c35d236eSmrg 371c35d236eSmrg GLINT_WAIT(4); 372c35d236eSmrg DO_PLANEMASK(planemask); 373c35d236eSmrg GLINT_WRITE_REG(0, RasterizerMode); 374c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 375c35d236eSmrg 376c35d236eSmrg if ((rop == GXset) || (rop == GXclear)) { 377c35d236eSmrg pGlint->FrameBufferReadMode = pGlint->pprod; 378c35d236eSmrg } else 379c35d236eSmrg if ((rop == GXcopy) || (rop == GXcopyInverted)) { 380c35d236eSmrg pGlint->FrameBufferReadMode = pGlint->pprod | FBRM_SrcEnable; 381c35d236eSmrg } else { 382c35d236eSmrg pGlint->FrameBufferReadMode = pGlint->pprod | FBRM_SrcEnable | 383c35d236eSmrg FBRM_DstEnable; 384c35d236eSmrg } 385c35d236eSmrg LOADROP(rop); 386c35d236eSmrg} 387c35d236eSmrg 388c35d236eSmrgstatic void 389c35d236eSmrgPermediaSubsequentScreenToScreenCopy( 390c35d236eSmrg ScrnInfoPtr pScrn, 391c35d236eSmrg int x1, int y1, 392c35d236eSmrg int x2, int y2, 393c35d236eSmrg int w, int h) 394c35d236eSmrg{ 395c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 396c35d236eSmrg int srcaddr; 397c35d236eSmrg int dstaddr; 398c35d236eSmrg char align; 399c35d236eSmrg int direction; 400c35d236eSmrg 401c35d236eSmrg if (!(pGlint->BltScanDirection & YPositive)) { 402c35d236eSmrg y1 = y1 + h - 1; 403c35d236eSmrg y2 = y2 + h - 1; 404e29e96ebSjoerg direction = -65536; 405c35d236eSmrg } else { 406c35d236eSmrg direction = 1<<16; 407c35d236eSmrg } 408c35d236eSmrg 409c35d236eSmrg /* We can only use GXcopy for Packed modes, and less than 32 width 410c35d236eSmrg * gives us speed for small blits. */ 411c35d236eSmrg if ((w < 32) || (pGlint->ROP != GXcopy)) { 412c35d236eSmrg GLINT_WAIT(9); 413c35d236eSmrg PermediaLoadCoord(pScrn, x2<<16, y2<<16, (x2+w)<<16, h, 0, direction); 414c35d236eSmrg srcaddr = x1; 415c35d236eSmrg dstaddr = x2; 416c35d236eSmrg GLINT_WRITE_REG(pGlint->FrameBufferReadMode, FBReadMode); 417c35d236eSmrg } else { 418c35d236eSmrg GLINT_WAIT(10); 419c35d236eSmrg PermediaLoadCoord(pScrn, (x2>>pGlint->BppShift)<<16, y2<<16, 420c35d236eSmrg ((x2+w+7)>>pGlint->BppShift)<<16, h, 0, 421c35d236eSmrg direction); 422c35d236eSmrg srcaddr = (x1 & ~pGlint->bppalign); 423c35d236eSmrg dstaddr = (x2 & ~pGlint->bppalign); 424c35d236eSmrg align = (x2 & pGlint->bppalign) - (x1 & pGlint->bppalign); 425c35d236eSmrg GLINT_WRITE_REG(pGlint->FrameBufferReadMode | FBRM_Packed | 426c35d236eSmrg (align&7)<<20, FBReadMode); 427c35d236eSmrg GLINT_WRITE_REG(x2<<16|(x2+w), PackedDataLimits); 428c35d236eSmrg } 429c35d236eSmrg srcaddr += y1 * pScrn->displayWidth; 430c35d236eSmrg dstaddr += y2 * pScrn->displayWidth; 431c35d236eSmrg GLINT_WRITE_REG(srcaddr - dstaddr, FBSourceOffset); 432c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid, Render); 433c35d236eSmrg} 434c35d236eSmrg 435c35d236eSmrgstatic void 436c35d236eSmrgPermediaSetupForFillRectSolid( 437c35d236eSmrg ScrnInfoPtr pScrn, 438c35d236eSmrg int color, int rop, 439c35d236eSmrg unsigned int planemask 440c35d236eSmrg){ 441c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 442c35d236eSmrg REPLICATE(color); 443c35d236eSmrg 444c35d236eSmrg GLINT_WAIT(6); 445c35d236eSmrg DO_PLANEMASK(planemask); 446c35d236eSmrg GLINT_WRITE_REG(0, RasterizerMode); 447c35d236eSmrg if (rop == GXcopy) { 448c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 449c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 450c35d236eSmrg GLINT_WRITE_REG(color, FBBlockColor); 451c35d236eSmrg } else { 452c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); 453c35d236eSmrg GLINT_WRITE_REG(color, ConstantColor); 454c35d236eSmrg } 455c35d236eSmrg LOADROP(rop); 456c35d236eSmrg} 457c35d236eSmrg 458c35d236eSmrgstatic void 459c35d236eSmrgPermediaSubsequentFillRectSolid( 460c35d236eSmrg ScrnInfoPtr pScrn, 461c35d236eSmrg int x, int y, 462c35d236eSmrg int w, int h) 463c35d236eSmrg{ 464c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 465c35d236eSmrg int speed = 0; 466c35d236eSmrg if (pGlint->ROP == GXcopy) { 467c35d236eSmrg GLINT_WAIT(7); 468c35d236eSmrg PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16); 469c35d236eSmrg speed = FastFillEnable; 470c35d236eSmrg } else { 471c35d236eSmrg GLINT_WAIT(9); 472c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_Packed | FBRM_DstEnable, FBReadMode); 473c35d236eSmrg PermediaLoadCoord(pScrn, (x>>pGlint->BppShift)<<16, y<<16, 474c35d236eSmrg ((x+w+7)>>pGlint->BppShift)<<16, h, 0, 1<<16); 475c35d236eSmrg GLINT_WRITE_REG(x<<16|(x+w), PackedDataLimits); 476c35d236eSmrg } 477c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | speed, Render); 478c35d236eSmrg} 479c35d236eSmrg 480c35d236eSmrgstatic void 481c35d236eSmrgPermediaSetupForMono8x8PatternFill( 482c35d236eSmrg ScrnInfoPtr pScrn, 483c35d236eSmrg int patternx, int patterny, 484c35d236eSmrg int fg, int bg, int rop, 485c35d236eSmrg unsigned int planemask) 486c35d236eSmrg{ 487c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 488c35d236eSmrg if (bg == -1) pGlint->FrameBufferReadMode = -1; 489c35d236eSmrg else pGlint->FrameBufferReadMode = 0; 490c35d236eSmrg pGlint->ForeGroundColor = fg; 491c35d236eSmrg pGlint->BackGroundColor = bg; 492c35d236eSmrg REPLICATE(pGlint->ForeGroundColor); 493c35d236eSmrg REPLICATE(pGlint->BackGroundColor); 494c35d236eSmrg 495c35d236eSmrg GLINT_WAIT(8); 496c35d236eSmrg GLINT_WRITE_REG ((patternx & 0x000000ff), AreaStipplePattern0); 497c35d236eSmrg GLINT_WRITE_REG ((patternx & 0x0000ff00) >> 8, AreaStipplePattern1); 498c35d236eSmrg GLINT_WRITE_REG ((patternx & 0x00ff0000) >> 16, AreaStipplePattern2); 499c35d236eSmrg GLINT_WRITE_REG ((patternx & 0xff000000) >> 24, AreaStipplePattern3); 500c35d236eSmrg GLINT_WRITE_REG ((patterny & 0x000000ff), AreaStipplePattern4); 501c35d236eSmrg GLINT_WRITE_REG ((patterny & 0x0000ff00) >> 8, AreaStipplePattern5); 502c35d236eSmrg GLINT_WRITE_REG ((patterny & 0x00ff0000) >> 16, AreaStipplePattern6); 503c35d236eSmrg GLINT_WRITE_REG ((patterny & 0xff000000) >> 24, AreaStipplePattern7); 504c35d236eSmrg 505c35d236eSmrg GLINT_WAIT(7); 506c35d236eSmrg DO_PLANEMASK(planemask); 507c35d236eSmrg GLINT_WRITE_REG(0, RasterizerMode); 508c35d236eSmrg 509c35d236eSmrg if (rop == GXcopy) { 510c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 511c35d236eSmrg } else { 512c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 513c35d236eSmrg } 514c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); 515c35d236eSmrg GLINT_WRITE_REG(pGlint->ForeGroundColor, ConstantColor); 516c35d236eSmrg GLINT_WRITE_REG(pGlint->BackGroundColor, Texel0); 517c35d236eSmrg LOADROP(rop); 518c35d236eSmrg} 519c35d236eSmrg 520c35d236eSmrgstatic void 521c35d236eSmrgPermediaSubsequentMono8x8PatternFillRect( 522c35d236eSmrg ScrnInfoPtr pScrn, 523c35d236eSmrg int patternx, int patterny, 524c35d236eSmrg int x, int y, 525c35d236eSmrg int w, int h) 526c35d236eSmrg{ 527c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 528c35d236eSmrg GLINT_WAIT(8); 529c35d236eSmrg PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16); 530c35d236eSmrg if (pGlint->FrameBufferReadMode != -1) { 531c35d236eSmrg GLINT_WRITE_REG(1<<20|patternx<<7|patterny<<12|UNIT_ENABLE, 532c35d236eSmrg AreaStippleMode); 533c35d236eSmrg GLINT_WRITE_REG(AreaStippleEnable | TextureEnable | PrimitiveTrapezoid, 534c35d236eSmrg Render); 535c35d236eSmrg } else { 536c35d236eSmrg GLINT_WRITE_REG(patternx<<7|patterny<<12|UNIT_ENABLE, AreaStippleMode); 537c35d236eSmrg GLINT_WRITE_REG(AreaStippleEnable | PrimitiveTrapezoid, Render); 538c35d236eSmrg } 539c35d236eSmrg} 540c35d236eSmrg 541c35d236eSmrgstatic void 542c35d236eSmrgPermediaWriteBitmap(ScrnInfoPtr pScrn, 543c35d236eSmrg int x, int y, int w, int h, 544c35d236eSmrg unsigned char *src, 545c35d236eSmrg int srcwidth, 546c35d236eSmrg int skipleft, 547c35d236eSmrg int fg, int bg, 548c35d236eSmrg int rop, 549c35d236eSmrg unsigned int planemask 550c35d236eSmrg){ 551c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); 552c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 553c35d236eSmrg unsigned char *srcpntr; 554c35d236eSmrg int dwords, height; 555c35d236eSmrg register int count; 556c35d236eSmrg register CARD32* pattern; 557c35d236eSmrg int dobackground = 0; 558c35d236eSmrg 559c35d236eSmrg w += skipleft; 560c35d236eSmrg x -= skipleft; 561c35d236eSmrg dwords = (w + 31) >> 5; 562c35d236eSmrg 563c35d236eSmrg PermediaSetClippingRectangle(pScrn, x+skipleft, y, x+w, y+h); 564c35d236eSmrg 565c35d236eSmrg GLINT_WAIT(14); 566c35d236eSmrg DO_PLANEMASK(planemask); 567c35d236eSmrg LOADROP(rop); 568c35d236eSmrg if (bg != -1) dobackground = ForceBackgroundColor; 569c35d236eSmrg if (rop == GXcopy) { 570c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 571c35d236eSmrg } else { 572c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 573c35d236eSmrg } 574c35d236eSmrg pGlint->BackGroundColor = bg; 575c35d236eSmrg pGlint->ForeGroundColor = fg; 576c35d236eSmrg REPLICATE(fg); 577c35d236eSmrg REPLICATE(bg); 578c35d236eSmrg if ((rop == GXcopy) && (pGlint->BackGroundColor == -1)) { 579c35d236eSmrg pGlint->FrameBufferReadMode = FastFillEnable; 580c35d236eSmrg GLINT_WRITE_REG(0, RasterizerMode); 581c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 582c35d236eSmrg GLINT_WRITE_REG(fg, FBBlockColor); 583c35d236eSmrg } else { 584c35d236eSmrg GLINT_WRITE_REG(BitMaskPackingEachScanline|dobackground,RasterizerMode); 585c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); 586c35d236eSmrg GLINT_WRITE_REG(fg, ConstantColor); 587c35d236eSmrg if (dobackground) { 588c35d236eSmrg GLINT_WRITE_REG(bg, Texel0); 589c35d236eSmrg pGlint->FrameBufferReadMode = TextureEnable; 590c35d236eSmrg } else { 591c35d236eSmrg pGlint->FrameBufferReadMode = 0; 592c35d236eSmrg } 593c35d236eSmrg } 594c35d236eSmrg PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16); 595c35d236eSmrg 596c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | pGlint->FrameBufferReadMode | SyncOnBitMask, Render); 597c35d236eSmrg 598c35d236eSmrg height = h; 599c35d236eSmrg srcpntr = src; 600c35d236eSmrg while(height--) { 601c35d236eSmrg count = dwords >> 3; 602c35d236eSmrg pattern = (CARD32*)srcpntr; 603c35d236eSmrg while(count--) { 604c35d236eSmrg GLINT_WAIT(8); 605c35d236eSmrg GLINT_WRITE_REG(*(pattern), BitMaskPattern); 606c35d236eSmrg GLINT_WRITE_REG(*(pattern+1), BitMaskPattern); 607c35d236eSmrg GLINT_WRITE_REG(*(pattern+2), BitMaskPattern); 608c35d236eSmrg GLINT_WRITE_REG(*(pattern+3), BitMaskPattern); 609c35d236eSmrg GLINT_WRITE_REG(*(pattern+4), BitMaskPattern); 610c35d236eSmrg GLINT_WRITE_REG(*(pattern+5), BitMaskPattern); 611c35d236eSmrg GLINT_WRITE_REG(*(pattern+6), BitMaskPattern); 612c35d236eSmrg GLINT_WRITE_REG(*(pattern+7), BitMaskPattern); 613c35d236eSmrg pattern+=8; 614c35d236eSmrg } 615c35d236eSmrg count = dwords & 0x07; 616c35d236eSmrg GLINT_WAIT(count); 617c35d236eSmrg while (count--) 618c35d236eSmrg GLINT_WRITE_REG(*(pattern++), BitMaskPattern); 619c35d236eSmrg srcpntr += srcwidth; 620c35d236eSmrg } 621c35d236eSmrg 622c35d236eSmrg PermediaDisableClipping(pScrn); 623c35d236eSmrg SET_SYNC_FLAG(infoRec); 624c35d236eSmrg} 625c35d236eSmrg 626c35d236eSmrgstatic void 627c35d236eSmrgPermediaSetupForScanlineCPUToScreenColorExpandFill( 628c35d236eSmrg ScrnInfoPtr pScrn, 629c35d236eSmrg int fg, int bg, 630c35d236eSmrg int rop, 631c35d236eSmrg unsigned int planemask 632c35d236eSmrg){ 633c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 634c35d236eSmrg int dobackground = 0; 635c35d236eSmrg 636c35d236eSmrg if (bg != -1) dobackground |= ForceBackgroundColor; 637c35d236eSmrg pGlint->BackGroundColor = bg; 638c35d236eSmrg pGlint->ForeGroundColor = fg; 639c35d236eSmrg REPLICATE(fg); 640c35d236eSmrg REPLICATE(bg); 641c35d236eSmrg GLINT_WAIT(7); 642c35d236eSmrg DO_PLANEMASK(planemask); 643c35d236eSmrg if (rop == GXcopy) { 644c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 645c35d236eSmrg } else { 646c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod|FBRM_DstEnable, FBReadMode); 647c35d236eSmrg } 648c35d236eSmrg if ((rop == GXcopy) && (pGlint->BackGroundColor == -1)) { 649c35d236eSmrg pGlint->FrameBufferReadMode = FastFillEnable; 650c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 651c35d236eSmrg GLINT_WRITE_REG(fg, FBBlockColor); 652c35d236eSmrg GLINT_WRITE_REG(0,RasterizerMode); 653c35d236eSmrg } else { 654c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); 655c35d236eSmrg GLINT_WRITE_REG(fg, ConstantColor); 656c35d236eSmrg GLINT_WRITE_REG(BitMaskPackingEachScanline|dobackground,RasterizerMode); 657c35d236eSmrg if (dobackground) { 658c35d236eSmrg GLINT_WRITE_REG(bg, Texel0); 659c35d236eSmrg pGlint->FrameBufferReadMode = TextureEnable; 660c35d236eSmrg } else { 661c35d236eSmrg pGlint->FrameBufferReadMode = 0; 662c35d236eSmrg } 663c35d236eSmrg } 664c35d236eSmrg LOADROP(rop); 665c35d236eSmrg} 666c35d236eSmrg 667c35d236eSmrgstatic void 668c35d236eSmrgPermediaSubsequentScanlineCPUToScreenColorExpandFill( 669c35d236eSmrg ScrnInfoPtr pScrn, 670c35d236eSmrg int x, int y, int w, int h, 671c35d236eSmrg int skipleft 672c35d236eSmrg){ 673c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 674c35d236eSmrg 675c35d236eSmrg pGlint->dwords = ((w + 31) >> 5); /* dwords per scanline */ 676c35d236eSmrg 677c35d236eSmrg#if 0 678c35d236eSmrg PermediaSetClippingRectangle(pScrn, x+skipleft, y, x+w, y+h); 679c35d236eSmrg#endif 680c35d236eSmrg 681c35d236eSmrg pGlint->cpucount = h; 682c35d236eSmrg 683c35d236eSmrg GLINT_WAIT(8); 684c35d236eSmrg PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16); 685c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | pGlint->FrameBufferReadMode | SyncOnBitMask, 686c35d236eSmrg Render); 687c35d236eSmrg#if defined(__alpha__) 688c35d236eSmrg if (0) /* force Alpha to use indirect always */ 689c35d236eSmrg#else 690c35d236eSmrg if ((pGlint->dwords*h) < pGlint->FIFOSize) 691c35d236eSmrg#endif 692c35d236eSmrg { 693c35d236eSmrg /* Turn on direct for less than FIFOSize dword colour expansion */ 694c35d236eSmrg pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->IOBase+OutputFIFO+4; 695c35d236eSmrg pGlint->ScanlineDirect = 1; 696c35d236eSmrg GLINT_WRITE_REG(((pGlint->dwords*h)-1)<<16 | 0x0D, OutputFIFO); 697c35d236eSmrg GLINT_WAIT(pGlint->dwords*h); 698c35d236eSmrg } else { 699c35d236eSmrg /* Use indirect for anything else */ 700c35d236eSmrg pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->ScratchBuffer; 701c35d236eSmrg pGlint->ScanlineDirect = 0; 702c35d236eSmrg } 703c35d236eSmrg 704c35d236eSmrg pGlint->cpucount--; 705c35d236eSmrg} 706c35d236eSmrg 707c35d236eSmrgstatic void 708c35d236eSmrgPermediaSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 709c35d236eSmrg{ 710c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 711c35d236eSmrg CARD32 *srcp = (CARD32*)pGlint->XAAScanlineColorExpandBuffers[bufno]; 712c35d236eSmrg int dwords = pGlint->dwords; 713c35d236eSmrg 714c35d236eSmrg if (!pGlint->ScanlineDirect) { 715c35d236eSmrg while(dwords >= pGlint->FIFOSize) { 716c35d236eSmrg GLINT_WAIT(pGlint->FIFOSize); 717c35d236eSmrg GLINT_WRITE_REG(((pGlint->FIFOSize - 2) << 16) | 0x0D, OutputFIFO); 718c35d236eSmrg GLINT_MoveDWORDS( 719c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 720c35d236eSmrg (CARD32*)srcp, pGlint->FIFOSize - 1); 721c35d236eSmrg dwords -= pGlint->FIFOSize - 1; 722c35d236eSmrg srcp += pGlint->FIFOSize - 1; 723c35d236eSmrg } 724c35d236eSmrg if(dwords) { 725c35d236eSmrg GLINT_WAIT(dwords + 1); 726c35d236eSmrg GLINT_WRITE_REG(((dwords - 1) << 16) | 0x0D, OutputFIFO); 727c35d236eSmrg GLINT_MoveDWORDS( 728c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 729c35d236eSmrg (CARD32*)srcp, dwords); 730c35d236eSmrg } 731c35d236eSmrg } 732c35d236eSmrg} 733c35d236eSmrg 734c35d236eSmrg 735c35d236eSmrgstatic void 736c35d236eSmrgPermediaWritePixmap8bpp( 737c35d236eSmrg ScrnInfoPtr pScrn, 738c35d236eSmrg int x, int y, int w, int h, 739c35d236eSmrg unsigned char *src, 740c35d236eSmrg int srcwidth, 741c35d236eSmrg int rop, 742c35d236eSmrg unsigned int planemask, 743c35d236eSmrg int transparency_color, 744c35d236eSmrg int bpp, int depth 745c35d236eSmrg) 746c35d236eSmrg{ 747c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); 748c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 749c35d236eSmrg int dwords, count; 750c35d236eSmrg CARD32* srcp; 751c35d236eSmrg unsigned char *srcpbyte; 752c35d236eSmrg Bool FastTexLoad = FALSE; 753c35d236eSmrg 754c35d236eSmrg GLINT_WAIT(2); 755c35d236eSmrg DO_PLANEMASK(planemask); 756c35d236eSmrg GLINT_WRITE_REG(0, RasterizerMode); 757c35d236eSmrg 758c35d236eSmrg dwords = (w + 3) >> 2; 759c35d236eSmrg if((!(x&3)) && (!(w&3))) FastTexLoad = TRUE; 760c35d236eSmrg if((rop != GXcopy) || (planemask != ~0)) 761c35d236eSmrg FastTexLoad = FALSE; 762c35d236eSmrg 763c35d236eSmrg#if 0 764c35d236eSmrg if (rop != GXcopy) { 765c35d236eSmrg int skipleft; 766c35d236eSmrg 767c35d236eSmrg if((skipleft = (long)src & 0x03)) { 768c35d236eSmrg skipleft /= (bpp>>3); 769c35d236eSmrg 770c35d236eSmrg x -= skipleft; 771c35d236eSmrg w += skipleft; 772c35d236eSmrg 773c35d236eSmrg src = (unsigned char*)((long)src & ~0x03); 774c35d236eSmrg } 775c35d236eSmrg } 776c35d236eSmrg#endif 777c35d236eSmrg 778c35d236eSmrg if(FastTexLoad) { 779c35d236eSmrg int address; 780c35d236eSmrg 781c35d236eSmrg GLINT_WAIT(1); 782c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode); 783c35d236eSmrg PermediaSync(pScrn); /* we are not using the rasterizer */ 784c35d236eSmrg while(h--) { 785c35d236eSmrg count = dwords; 786c35d236eSmrg address = ((y * pScrn->displayWidth) + x) >> 2; 787c35d236eSmrg srcp = (CARD32*)src; 788c35d236eSmrg GLINT_WAIT(1); 789c35d236eSmrg GLINT_WRITE_REG(address, TextureDownloadOffset); 790c35d236eSmrg while(count >= infoRec->ColorExpandRange) { 791c35d236eSmrg GLINT_WAIT(infoRec->ColorExpandRange); 792c35d236eSmrg /* (0x11 << 4) | 0x0D is the TAG for TextureData */ 793c35d236eSmrg GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) 794c35d236eSmrg | (0x11 << 4) | 0x0D, OutputFIFO); 795c35d236eSmrg GLINT_MoveDWORDS( 796c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 797c35d236eSmrg (CARD32*)srcp, infoRec->ColorExpandRange - 1); 798c35d236eSmrg count -= infoRec->ColorExpandRange - 1; 799c35d236eSmrg address += infoRec->ColorExpandRange - 1; 800c35d236eSmrg srcp += infoRec->ColorExpandRange - 1; 801c35d236eSmrg } 802c35d236eSmrg if(count) { 803c35d236eSmrg GLINT_WAIT(count + 1); 804c35d236eSmrg /* (0x11 << 4) | 0x0D is the TAG for TextureData */ 805c35d236eSmrg GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, 806c35d236eSmrg OutputFIFO); 807c35d236eSmrg GLINT_MoveDWORDS( 808c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 809c35d236eSmrg (CARD32*)srcp, count); 810c35d236eSmrg } 811c35d236eSmrg src += srcwidth; 812c35d236eSmrg y++; 813c35d236eSmrg } 814c35d236eSmrg GLINT_WAIT(1); 815c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode); 816c35d236eSmrg } else { 817c35d236eSmrg GLINT_WAIT(10); 818c35d236eSmrg if (rop == GXcopy) { 819c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 820c35d236eSmrg } else { 821c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 822c35d236eSmrg } 823c35d236eSmrg PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16); 824c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 825c35d236eSmrg LOADROP(rop); 826c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | SyncOnHostData, Render); 827c35d236eSmrg 828c35d236eSmrg { 829c35d236eSmrg while(h--) { 830c35d236eSmrg count = w; 831c35d236eSmrg srcpbyte = (unsigned char *)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) | 836c35d236eSmrg (0x15 << 4) | 0x05, OutputFIFO); 837c35d236eSmrg GLINT_MoveBYTE( 838c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 839c35d236eSmrg (unsigned char *)srcpbyte, infoRec->ColorExpandRange-1); 840c35d236eSmrg count -= infoRec->ColorExpandRange - 1; 841c35d236eSmrg srcpbyte += infoRec->ColorExpandRange - 1; 842c35d236eSmrg } 843c35d236eSmrg if(count) { 844c35d236eSmrg GLINT_WAIT(count + 1); 845c35d236eSmrg /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ 846c35d236eSmrg GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | 847c35d236eSmrg 0x05, OutputFIFO); 848c35d236eSmrg GLINT_MoveBYTE( 849c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 850c35d236eSmrg (unsigned char *)srcpbyte, count); 851c35d236eSmrg } 852c35d236eSmrg src += srcwidth; 853c35d236eSmrg } 854c35d236eSmrg } 855c35d236eSmrg } 856c35d236eSmrg 857c35d236eSmrg SET_SYNC_FLAG(infoRec); 858c35d236eSmrg} 859c35d236eSmrg 860c35d236eSmrgstatic void 861c35d236eSmrgPermediaWritePixmap16bpp( 862c35d236eSmrg ScrnInfoPtr pScrn, 863c35d236eSmrg int x, int y, int w, int h, 864c35d236eSmrg unsigned char *src, 865c35d236eSmrg int srcwidth, 866c35d236eSmrg int rop, 867c35d236eSmrg unsigned int planemask, 868c35d236eSmrg int transparency_color, 869c35d236eSmrg int bpp, int depth 870c35d236eSmrg) 871c35d236eSmrg{ 872c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); 873c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 874c35d236eSmrg int dwords, count; 875c35d236eSmrg CARD32* srcp; 876c35d236eSmrg unsigned short* srcpword; 877c35d236eSmrg Bool FastTexLoad; 878c35d236eSmrg 879c35d236eSmrg GLINT_WAIT(2); 880c35d236eSmrg DO_PLANEMASK(planemask); 881c35d236eSmrg GLINT_WRITE_REG(0, RasterizerMode); 882c35d236eSmrg 883c35d236eSmrg FastTexLoad = FALSE; 884c35d236eSmrg dwords = (w + 1) >> 1; 885c35d236eSmrg if((!(x&1)) && (!(w&1))) FastTexLoad = TRUE; 886c35d236eSmrg if((rop != GXcopy) || (planemask != ~0)) 887c35d236eSmrg FastTexLoad = FALSE; 888c35d236eSmrg 889c35d236eSmrg#if 0 890c35d236eSmrg if (rop != GXcopy) { 891c35d236eSmrg int skipleft; 892c35d236eSmrg 893c35d236eSmrg if((skipleft = (long)src & 0x03L)) { 894c35d236eSmrg skipleft /= (bpp>>3); 895c35d236eSmrg 896c35d236eSmrg x -= skipleft; 897c35d236eSmrg w += skipleft; 898c35d236eSmrg 899c35d236eSmrg src = (unsigned char*)((long)src & ~0x03L); 900c35d236eSmrg } 901c35d236eSmrg } 902c35d236eSmrg#endif 903c35d236eSmrg 904c35d236eSmrg if(FastTexLoad) { 905c35d236eSmrg int address; 906c35d236eSmrg 907c35d236eSmrg GLINT_WAIT(1); 908c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode); 909c35d236eSmrg PermediaSync(pScrn); /* we are not using the rasterizer */ 910c35d236eSmrg while(h--) { 911c35d236eSmrg count = dwords; 912c35d236eSmrg address = ((y * pScrn->displayWidth) + x) >> 1; 913c35d236eSmrg srcp = (CARD32*)src; 914c35d236eSmrg GLINT_WAIT(1); 915c35d236eSmrg GLINT_WRITE_REG(address, TextureDownloadOffset); 916c35d236eSmrg while(count >= infoRec->ColorExpandRange) { 917c35d236eSmrg GLINT_WAIT(infoRec->ColorExpandRange); 918c35d236eSmrg /* (0x11 << 4) | 0x0D is the TAG for TextureData */ 919c35d236eSmrg GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | 920c35d236eSmrg (0x11 << 4) | 0x0D, OutputFIFO); 921c35d236eSmrg GLINT_MoveDWORDS( 922c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 923c35d236eSmrg (CARD32*)srcp, infoRec->ColorExpandRange - 1); 924c35d236eSmrg count -= infoRec->ColorExpandRange - 1; 925c35d236eSmrg address += infoRec->ColorExpandRange - 1; 926c35d236eSmrg srcp += infoRec->ColorExpandRange - 1; 927c35d236eSmrg } 928c35d236eSmrg if(count) { 929c35d236eSmrg GLINT_WAIT(count + 1); 930c35d236eSmrg /* (0x11 << 4) | 0x0D is the TAG for TextureData */ 931c35d236eSmrg GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, 932c35d236eSmrg OutputFIFO); 933c35d236eSmrg GLINT_MoveDWORDS( 934c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 935c35d236eSmrg (CARD32*)srcp, count); 936c35d236eSmrg } 937c35d236eSmrg src += srcwidth; 938c35d236eSmrg y++; 939c35d236eSmrg } 940c35d236eSmrg GLINT_WAIT(1); 941c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode); 942c35d236eSmrg } else { 943c35d236eSmrg GLINT_WAIT(10); 944c35d236eSmrg if (rop == GXcopy) { 945c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 946c35d236eSmrg } else { 947c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 948c35d236eSmrg } 949c35d236eSmrg PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16); 950c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 951c35d236eSmrg LOADROP(rop); 952c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | SyncOnHostData, Render); 953c35d236eSmrg 954c35d236eSmrg { 955c35d236eSmrg while(h--) { 956c35d236eSmrg count = w; 957c35d236eSmrg srcpword = (unsigned short *)src; 958c35d236eSmrg while(count >= infoRec->ColorExpandRange) { 959c35d236eSmrg GLINT_WAIT(infoRec->ColorExpandRange); 960c35d236eSmrg /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ 961c35d236eSmrg GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | 962c35d236eSmrg (0x15 << 4) | 0x05, OutputFIFO); 963c35d236eSmrg GLINT_MoveWORDS( 964c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 965c35d236eSmrg (unsigned short *)srcpword,infoRec->ColorExpandRange-1); 966c35d236eSmrg count -= infoRec->ColorExpandRange - 1; 967c35d236eSmrg srcpword += infoRec->ColorExpandRange - 1; 968c35d236eSmrg } 969c35d236eSmrg if(count) { 970c35d236eSmrg GLINT_WAIT(count + 1); 971c35d236eSmrg /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ 972c35d236eSmrg GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | 973c35d236eSmrg 0x05, OutputFIFO); 974c35d236eSmrg GLINT_MoveWORDS( 975c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 976c35d236eSmrg (unsigned short *)srcpword, count); 977c35d236eSmrg } 978c35d236eSmrg src += srcwidth; 979c35d236eSmrg } 980c35d236eSmrg } 981c35d236eSmrg } 982c35d236eSmrg 983c35d236eSmrg SET_SYNC_FLAG(infoRec); 984c35d236eSmrg} 985c35d236eSmrg 986c35d236eSmrgstatic void 987c35d236eSmrgPermediaWritePixmap32bpp( 988c35d236eSmrg ScrnInfoPtr pScrn, 989c35d236eSmrg int x, int y, int w, int h, 990c35d236eSmrg unsigned char *src, 991c35d236eSmrg int srcwidth, 992c35d236eSmrg int rop, 993c35d236eSmrg unsigned int planemask, 994c35d236eSmrg int transparency_color, 995c35d236eSmrg int bpp, int depth 996c35d236eSmrg) 997c35d236eSmrg{ 998c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); 999c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 1000c35d236eSmrg int dwords, count; 1001c35d236eSmrg CARD32* srcp; 1002c35d236eSmrg Bool FastTexLoad; 1003c35d236eSmrg 1004c35d236eSmrg GLINT_WAIT(3); 1005c35d236eSmrg DO_PLANEMASK(planemask); 1006c35d236eSmrg GLINT_WRITE_REG(0, RasterizerMode); 1007c35d236eSmrg if (rop == GXcopy) { 1008c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 1009c35d236eSmrg } else { 1010c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 1011c35d236eSmrg } 1012c35d236eSmrg 1013c35d236eSmrg FastTexLoad = TRUE; 1014c35d236eSmrg dwords = w; 1015c35d236eSmrg if((rop != GXcopy) || (planemask != ~0)) 1016c35d236eSmrg FastTexLoad = FALSE; 1017c35d236eSmrg 1018c35d236eSmrg#if 0 1019c35d236eSmrg if (!FastTexLoad) { 1020c35d236eSmrg int skipleft; 1021c35d236eSmrg 1022c35d236eSmrg if((skipleft = (long)src & 0x03L)) { 1023c35d236eSmrg skipleft /= (bpp>>3); 1024c35d236eSmrg 1025c35d236eSmrg x -= skipleft; 1026c35d236eSmrg w += skipleft; 1027c35d236eSmrg 1028c35d236eSmrg src = (unsigned char*)((long)src & ~0x03L); 1029c35d236eSmrg } 1030c35d236eSmrg } 1031c35d236eSmrg#endif 1032c35d236eSmrg 1033c35d236eSmrg if(FastTexLoad) { 1034c35d236eSmrg int address; 1035c35d236eSmrg 1036c35d236eSmrg GLINT_WAIT(1); 1037c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode); 1038c35d236eSmrg PermediaSync(pScrn); /* we are not using the rasterizer */ 1039c35d236eSmrg while(h--) { 1040c35d236eSmrg count = dwords; 1041c35d236eSmrg address = (y * pScrn->displayWidth) + x; 1042c35d236eSmrg srcp = (CARD32*)src; 1043c35d236eSmrg GLINT_WAIT(1); 1044c35d236eSmrg GLINT_WRITE_REG(address, TextureDownloadOffset); 1045c35d236eSmrg while(count >= infoRec->ColorExpandRange) { 1046c35d236eSmrg GLINT_WAIT(infoRec->ColorExpandRange); 1047c35d236eSmrg /* (0x11 << 4) | 0x0D is the TAG for TextureData */ 1048c35d236eSmrg GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | 1049c35d236eSmrg (0x11 << 4) | 0x0D, OutputFIFO); 1050c35d236eSmrg GLINT_MoveDWORDS( 1051c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 1052c35d236eSmrg (CARD32*)srcp, infoRec->ColorExpandRange - 1); 1053c35d236eSmrg count -= infoRec->ColorExpandRange - 1; 1054c35d236eSmrg address += infoRec->ColorExpandRange - 1; 1055c35d236eSmrg srcp += infoRec->ColorExpandRange - 1; 1056c35d236eSmrg } 1057c35d236eSmrg if(count) { 1058c35d236eSmrg GLINT_WAIT(count + 1); 1059c35d236eSmrg /* (0x11 << 4) | 0x0D is the TAG for TextureData */ 1060c35d236eSmrg GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, 1061c35d236eSmrg OutputFIFO); 1062c35d236eSmrg GLINT_MoveDWORDS( 1063c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 1064c35d236eSmrg (CARD32*)srcp, count); 1065c35d236eSmrg } 1066c35d236eSmrg src += srcwidth; 1067c35d236eSmrg y++; 1068c35d236eSmrg } 1069c35d236eSmrg GLINT_WAIT(1); 1070c35d236eSmrg GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode); 1071c35d236eSmrg } else { 1072c35d236eSmrg GLINT_WAIT(9); 1073c35d236eSmrg PermediaLoadCoord(pScrn, (x&0xFFFF)<<16, y<<16, ((x&0xFFFF)+w)<<16, h, 0, 1<<16); 1074c35d236eSmrg LOADROP(rop); 1075c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 1076c35d236eSmrg GLINT_WRITE_REG(PrimitiveTrapezoid | SyncOnHostData, Render); 1077c35d236eSmrg 1078c35d236eSmrg while(h--) { 1079c35d236eSmrg count = dwords; 1080c35d236eSmrg srcp = (CARD32*)src; 1081c35d236eSmrg while(count >= infoRec->ColorExpandRange) { 1082c35d236eSmrg GLINT_WAIT(infoRec->ColorExpandRange); 1083c35d236eSmrg /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ 1084c35d236eSmrg GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | 1085c35d236eSmrg (0x15 << 4) | 0x05, OutputFIFO); 1086c35d236eSmrg GLINT_MoveDWORDS( 1087c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 1088c35d236eSmrg (CARD32*)srcp, infoRec->ColorExpandRange - 1); 1089c35d236eSmrg count -= infoRec->ColorExpandRange - 1; 1090c35d236eSmrg srcp += infoRec->ColorExpandRange - 1; 1091c35d236eSmrg } 1092c35d236eSmrg if(count) { 1093c35d236eSmrg GLINT_WAIT(count + 1); 1094c35d236eSmrg /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ 1095c35d236eSmrg GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | 1096c35d236eSmrg 0x05, OutputFIFO); 1097c35d236eSmrg GLINT_MoveDWORDS( 1098c35d236eSmrg (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), 1099c35d236eSmrg (CARD32*)srcp, count); 1100c35d236eSmrg } 1101c35d236eSmrg src += srcwidth; 1102c35d236eSmrg } 1103c35d236eSmrg } 1104c35d236eSmrg 1105c35d236eSmrg SET_SYNC_FLAG(infoRec); 1106c35d236eSmrg} 1107c35d236eSmrg 1108c35d236eSmrgstatic void 1109c35d236eSmrgPermediaPolylinesThinSolidWrapper( 1110c35d236eSmrg DrawablePtr pDraw, 1111c35d236eSmrg GCPtr pGC, 1112c35d236eSmrg int mode, 1113c35d236eSmrg int npt, 1114c35d236eSmrg DDXPointPtr pPts 1115c35d236eSmrg){ 1116c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); 1117c35d236eSmrg GLINTPtr pGlint = GLINTPTR(infoRec->pScrn); 1118c35d236eSmrg pGlint->CurrentGC = pGC; 1119c35d236eSmrg pGlint->CurrentDrawable = pDraw; 1120c35d236eSmrg if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn); 1121c35d236eSmrg XAAPolyLines(pDraw, pGC, mode, npt, pPts); 1122c35d236eSmrg} 1123c35d236eSmrg 1124c35d236eSmrgstatic void 1125c35d236eSmrgPermediaPolySegmentThinSolidWrapper( 1126c35d236eSmrg DrawablePtr pDraw, 1127c35d236eSmrg GCPtr pGC, 1128c35d236eSmrg int nseg, 1129c35d236eSmrg xSegment *pSeg 1130c35d236eSmrg){ 1131c35d236eSmrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); 1132c35d236eSmrg GLINTPtr pGlint = GLINTPTR(infoRec->pScrn); 1133c35d236eSmrg pGlint->CurrentGC = pGC; 1134c35d236eSmrg pGlint->CurrentDrawable = pDraw; 1135c35d236eSmrg if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn); 1136c35d236eSmrg XAAPolySegment(pDraw, pGC, nseg, pSeg); 1137c35d236eSmrg} 1138c35d236eSmrg 1139c35d236eSmrgstatic void 1140c35d236eSmrgPermediaSetupForSolidLine(ScrnInfoPtr pScrn, int color, 1141c35d236eSmrg int rop, unsigned int planemask) 1142c35d236eSmrg{ 1143c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 1144c35d236eSmrg 1145c35d236eSmrg GLINT_WAIT(6); 1146c35d236eSmrg DO_PLANEMASK(planemask); 1147c35d236eSmrg GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 1148c35d236eSmrg GLINT_WRITE_REG(color, GLINTColor); 1149c35d236eSmrg GLINT_WRITE_REG(0, RasterizerMode); 1150c35d236eSmrg if (rop == GXcopy) { 1151c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod, FBReadMode); 1152c35d236eSmrg } else { 1153c35d236eSmrg GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); 1154c35d236eSmrg } 1155c35d236eSmrg LOADROP(rop); 1156c35d236eSmrg} 1157c35d236eSmrg 1158c35d236eSmrgstatic void 1159c35d236eSmrgPermediaSubsequentHorVertLine(ScrnInfoPtr pScrn,int x,int y,int len,int dir) 1160c35d236eSmrg{ 1161c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 1162c35d236eSmrg 1163c35d236eSmrg GLINT_WAIT(7); 1164c35d236eSmrg if (dir == DEGREES_0) { 1165e29e96ebSjoerg PermediaLoadCoord(pScrn, x * 65536, y * 65536, 0, len, 1<<16, 0); 1166c35d236eSmrg } else { 1167e29e96ebSjoerg PermediaLoadCoord(pScrn, x * 65536, y * 65536, 0, len, 0, 1<<16); 1168c35d236eSmrg } 1169c35d236eSmrg 1170c35d236eSmrg GLINT_WRITE_REG(PrimitiveLine, Render); 1171c35d236eSmrg} 1172c35d236eSmrg 1173c35d236eSmrgstatic void 1174c35d236eSmrgPermediaSubsequentSolidBresenhamLine( ScrnInfoPtr pScrn, 1175c35d236eSmrg int x, int y, int dmaj, int dmin, int e, int len, int octant) 1176c35d236eSmrg{ 1177c35d236eSmrg GLINTPtr pGlint = GLINTPTR(pScrn); 1178c35d236eSmrg int dxdom, dy; 1179c35d236eSmrg 1180c35d236eSmrg if(dmaj == dmin) { 1181c35d236eSmrg GLINT_WAIT(7); 1182c35d236eSmrg if(octant & YDECREASING) { 1183e29e96ebSjoerg dy = -65536; 1184c35d236eSmrg } else { 1185e29e96ebSjoerg dy = 65536; 1186c35d236eSmrg } 1187c35d236eSmrg 1188c35d236eSmrg if(octant & XDECREASING) { 1189e29e96ebSjoerg dxdom = -65536; 1190c35d236eSmrg } else { 1191e29e96ebSjoerg dxdom = 65536; 1192c35d236eSmrg } 1193c35d236eSmrg 1194c35d236eSmrg PermediaLoadCoord(pScrn, x<<16, y<<16, 0, len, dxdom, dy); 1195c35d236eSmrg GLINT_WRITE_REG(PrimitiveLine, Render); 1196c35d236eSmrg return; 1197c35d236eSmrg } 1198c35d236eSmrg 1199c35d236eSmrg fbBres(pGlint->CurrentDrawable, pGlint->CurrentGC, 0, 1200c35d236eSmrg (octant & XDECREASING) ? -1 : 1, 1201c35d236eSmrg (octant & YDECREASING) ? -1 : 1, 1202c35d236eSmrg (octant & YMAJOR) ? Y_AXIS : X_AXIS, 1203c35d236eSmrg x, y, e, dmin, -dmaj, len); 1204c35d236eSmrg} 12051fb744b4Smrg#endif 1206