riva_xaa.c revision fc5a983d
1fc5a983dSmrg/* 2fc5a983dSmrg * Copyright (c) 1993-1999 NVIDIA, Corporation 3fc5a983dSmrg * 4fc5a983dSmrg * Permission is hereby granted, free of charge, to any person obtaining a 5fc5a983dSmrg * copy of this software and associated documentation files (the 6fc5a983dSmrg * "Software"), to deal in the Software without restriction, including 7fc5a983dSmrg * without limitation the rights to use, copy, modify, merge, publish, 8fc5a983dSmrg * distribute, sublicense, and/or sell copies of the Software, and to 9fc5a983dSmrg * permit persons to whom the Software is furnished to do so, subject to 10fc5a983dSmrg * the following conditions: 11fc5a983dSmrg * 12fc5a983dSmrg * The above copyright notice and this permission notice shall be included 13fc5a983dSmrg * in all copies or substantial portions of the Software. 14fc5a983dSmrg * 15fc5a983dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16fc5a983dSmrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17fc5a983dSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18fc5a983dSmrg * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 19fc5a983dSmrg * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20fc5a983dSmrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 21fc5a983dSmrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22fc5a983dSmrg */ 23fc5a983dSmrg 24fc5a983dSmrg/* Hacked together from mga driver and 3.3.4 NVIDIA driver by 25fc5a983dSmrg Jarno Paananen <jpaana@s2.org> */ 26fc5a983dSmrg 27fc5a983dSmrg#ifdef HAVE_CONFIG_H 28fc5a983dSmrg#include "config.h" 29fc5a983dSmrg#endif 30fc5a983dSmrg 31fc5a983dSmrg#include "riva_include.h" 32fc5a983dSmrg#include "xaalocal.h" 33fc5a983dSmrg#include "xaarop.h" 34fc5a983dSmrg 35fc5a983dSmrg#include "miline.h" 36fc5a983dSmrg 37fc5a983dSmrgstatic void 38fc5a983dSmrgRivaSetClippingRectangle(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2) 39fc5a983dSmrg{ 40fc5a983dSmrg int height = y2-y1 + 1; 41fc5a983dSmrg int width = x2-x1 + 1; 42fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 43fc5a983dSmrg 44fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Clip, 2); 45fc5a983dSmrg pRiva->riva.Clip->TopLeft = (y1 << 16) | (x1 & 0xffff); 46fc5a983dSmrg pRiva->riva.Clip->WidthHeight = (height << 16) | width; 47fc5a983dSmrg} 48fc5a983dSmrg 49fc5a983dSmrg 50fc5a983dSmrgstatic void 51fc5a983dSmrgRivaDisableClipping(ScrnInfoPtr pScrn) 52fc5a983dSmrg{ 53fc5a983dSmrg RivaSetClippingRectangle(pScrn, 0, 0, 0x7fff, 0x7fff); 54fc5a983dSmrg} 55fc5a983dSmrg 56fc5a983dSmrg/* 57fc5a983dSmrg * Set pattern. Internal routine. The upper bits of the colors 58fc5a983dSmrg * are the ALPHA bits. 0 == transparency. 59fc5a983dSmrg */ 60fc5a983dSmrgstatic void 61fc5a983dSmrgRivaSetPattern(RivaPtr pRiva, int clr0, int clr1, int pat0, int pat1) 62fc5a983dSmrg{ 63fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Patt, 4); 64fc5a983dSmrg pRiva->riva.Patt->Color0 = clr0; 65fc5a983dSmrg pRiva->riva.Patt->Color1 = clr1; 66fc5a983dSmrg pRiva->riva.Patt->Monochrome[0] = pat0; 67fc5a983dSmrg pRiva->riva.Patt->Monochrome[1] = pat1; 68fc5a983dSmrg} 69fc5a983dSmrg 70fc5a983dSmrg/* 71fc5a983dSmrg * Set ROP. Translate X rop into ROP3. Internal routine. 72fc5a983dSmrg */ 73fc5a983dSmrgstatic void 74fc5a983dSmrgRivaSetRopSolid(RivaPtr pRiva, int rop) 75fc5a983dSmrg{ 76fc5a983dSmrg if (pRiva->currentRop != rop) { 77fc5a983dSmrg if (pRiva->currentRop >= 16) 78fc5a983dSmrg RivaSetPattern(pRiva, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); 79fc5a983dSmrg pRiva->currentRop = rop; 80fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Rop, 1); 81fc5a983dSmrg pRiva->riva.Rop->Rop3 = XAAGetCopyROP(rop); 82fc5a983dSmrg } 83fc5a983dSmrg} 84fc5a983dSmrg 85fc5a983dSmrgstatic void 86fc5a983dSmrgRivaSetRopPattern(RivaPtr pRiva, int rop) 87fc5a983dSmrg{ 88fc5a983dSmrg if (pRiva->currentRop != (rop + 16)) { 89fc5a983dSmrg pRiva->currentRop = rop + 16; /* +16 is important */ 90fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Rop, 1); 91fc5a983dSmrg pRiva->riva.Rop->Rop3 = XAAGetPatternROP(rop); 92fc5a983dSmrg } 93fc5a983dSmrg} 94fc5a983dSmrg 95fc5a983dSmrg/* 96fc5a983dSmrg * Fill solid rectangles. 97fc5a983dSmrg */ 98fc5a983dSmrgstatic 99fc5a983dSmrgvoid RivaSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, 100fc5a983dSmrg unsigned planemask) 101fc5a983dSmrg{ 102fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 103fc5a983dSmrg 104fc5a983dSmrg RivaSetRopSolid(pRiva, rop); 105fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, 1); 106fc5a983dSmrg pRiva->riva.Bitmap->Color1A = color; 107fc5a983dSmrg} 108fc5a983dSmrg 109fc5a983dSmrgstatic void 110fc5a983dSmrgRivaSubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h) 111fc5a983dSmrg{ 112fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 113fc5a983dSmrg 114fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, 2); 115fc5a983dSmrg pRiva->riva.Bitmap->UnclippedRectangle[0].TopLeft = (x << 16) | y; 116fc5a983dSmrg write_mem_barrier(); 117fc5a983dSmrg pRiva->riva.Bitmap->UnclippedRectangle[0].WidthHeight = (w << 16) | h; 118fc5a983dSmrg write_mem_barrier(); 119fc5a983dSmrg} 120fc5a983dSmrg 121fc5a983dSmrg/* 122fc5a983dSmrg * Screen to screen BLTs. 123fc5a983dSmrg */ 124fc5a983dSmrgstatic void 125fc5a983dSmrgRivaSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, 126fc5a983dSmrg unsigned planemask, int transparency_color) 127fc5a983dSmrg{ 128fc5a983dSmrg RivaSetRopSolid(RivaPTR(pScrn), rop); 129fc5a983dSmrg} 130fc5a983dSmrg 131fc5a983dSmrgstatic void 132fc5a983dSmrgRivaSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, 133fc5a983dSmrg int x2, int y2, int w, int h) 134fc5a983dSmrg{ 135fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 136fc5a983dSmrg 137fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Blt, 3); 138fc5a983dSmrg pRiva->riva.Blt->TopLeftSrc = (y1 << 16) | x1; 139fc5a983dSmrg pRiva->riva.Blt->TopLeftDst = (y2 << 16) | x2; 140fc5a983dSmrg write_mem_barrier(); 141fc5a983dSmrg pRiva->riva.Blt->WidthHeight = (h << 16) | w; 142fc5a983dSmrg write_mem_barrier(); 143fc5a983dSmrg} 144fc5a983dSmrg 145fc5a983dSmrg 146fc5a983dSmrg/* 147fc5a983dSmrg * Fill 8x8 monochrome pattern rectangles. patternx and patterny are 148fc5a983dSmrg * the overloaded pattern bits themselves. The pattern colors don't 149fc5a983dSmrg * support 565, only 555. Hack around it. 150fc5a983dSmrg */ 151fc5a983dSmrgstatic void 152fc5a983dSmrgRivaSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patternx, int patterny, 153fc5a983dSmrg int fg, int bg, int rop, unsigned planemask) 154fc5a983dSmrg{ 155fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 156fc5a983dSmrg 157fc5a983dSmrg RivaSetRopPattern(pRiva, rop); 158fc5a983dSmrg if (pScrn->depth == 16) 159fc5a983dSmrg { 160fc5a983dSmrg fg = ((fg & 0x0000F800) << 8) 161fc5a983dSmrg | ((fg & 0x000007E0) << 5) 162fc5a983dSmrg | ((fg & 0x0000001F) << 3) 163fc5a983dSmrg | 0xFF000000; 164fc5a983dSmrg if (bg != -1) 165fc5a983dSmrg bg = ((bg & 0x0000F800) << 8) 166fc5a983dSmrg | ((bg & 0x000007E0) << 5) 167fc5a983dSmrg | ((bg & 0x0000001F) << 3) 168fc5a983dSmrg | 0xFF000000; 169fc5a983dSmrg else 170fc5a983dSmrg bg = 0; 171fc5a983dSmrg } 172fc5a983dSmrg else 173fc5a983dSmrg { 174fc5a983dSmrg fg |= pRiva->opaqueMonochrome; 175fc5a983dSmrg bg = (bg == -1) ? 0 : bg | pRiva->opaqueMonochrome; 176fc5a983dSmrg }; 177fc5a983dSmrg RivaSetPattern(pRiva, bg, fg, patternx, patterny); 178fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, 1); 179fc5a983dSmrg pRiva->riva.Bitmap->Color1A = fg; 180fc5a983dSmrg} 181fc5a983dSmrg 182fc5a983dSmrgstatic void 183fc5a983dSmrgRivaSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 184fc5a983dSmrg int patternx, int patterny, 185fc5a983dSmrg int x, int y, int w, int h) 186fc5a983dSmrg{ 187fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 188fc5a983dSmrg 189fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, 2); 190fc5a983dSmrg pRiva->riva.Bitmap->UnclippedRectangle[0].TopLeft = (x << 16) | y; 191fc5a983dSmrg write_mem_barrier(); 192fc5a983dSmrg pRiva->riva.Bitmap->UnclippedRectangle[0].WidthHeight = (w << 16) | h; 193fc5a983dSmrg write_mem_barrier(); 194fc5a983dSmrg} 195fc5a983dSmrg 196fc5a983dSmrg 197fc5a983dSmrgvoid 198fc5a983dSmrgRivaResetGraphics(ScrnInfoPtr pScrn) 199fc5a983dSmrg{ 200fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 201fc5a983dSmrg 202fc5a983dSmrg if(pRiva->NoAccel) return; 203fc5a983dSmrg 204fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Patt, 1); 205fc5a983dSmrg pRiva->riva.Patt->Shape = 0; 206fc5a983dSmrg RivaDisableClipping(pScrn); 207fc5a983dSmrg pRiva->currentRop = 16; /* to force RivaSetRopSolid to reset the pattern */ 208fc5a983dSmrg RivaSetRopSolid(pRiva, GXcopy); 209fc5a983dSmrg} 210fc5a983dSmrg 211fc5a983dSmrg 212fc5a983dSmrg 213fc5a983dSmrg/* 214fc5a983dSmrg * Synchronise with graphics engine. Make sure it is idle before returning. 215fc5a983dSmrg * Should attempt to yield CPU if busy for awhile. 216fc5a983dSmrg */ 217fc5a983dSmrgvoid RivaSync(ScrnInfoPtr pScrn) 218fc5a983dSmrg{ 219fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 220fc5a983dSmrg RIVA_BUSY(pRiva->riva); 221fc5a983dSmrg} 222fc5a983dSmrg 223fc5a983dSmrg/* Color expansion */ 224fc5a983dSmrgstatic void 225fc5a983dSmrgRivaSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 226fc5a983dSmrg int fg, int bg, int rop, 227fc5a983dSmrg unsigned int planemask) 228fc5a983dSmrg{ 229fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 230fc5a983dSmrg 231fc5a983dSmrg RivaSetRopSolid(pRiva, rop); 232fc5a983dSmrg 233fc5a983dSmrg if ( bg == -1 ) 234fc5a983dSmrg { 235fc5a983dSmrg /* Transparent case */ 236fc5a983dSmrg bg = 0x80000000; 237fc5a983dSmrg pRiva->expandFifo = (unsigned char*)&pRiva->riva.Bitmap->MonochromeData1C; 238fc5a983dSmrg } 239fc5a983dSmrg else 240fc5a983dSmrg { 241fc5a983dSmrg pRiva->expandFifo = (unsigned char*)&pRiva->riva.Bitmap->MonochromeData01E; 242fc5a983dSmrg if (pScrn->depth == 16) 243fc5a983dSmrg { 244fc5a983dSmrg bg = ((bg & 0x0000F800) << 8) 245fc5a983dSmrg | ((bg & 0x000007E0) << 5) 246fc5a983dSmrg | ((bg & 0x0000001F) << 3) 247fc5a983dSmrg | 0xFF000000; 248fc5a983dSmrg } 249fc5a983dSmrg else 250fc5a983dSmrg { 251fc5a983dSmrg bg |= pRiva->opaqueMonochrome; 252fc5a983dSmrg }; 253fc5a983dSmrg } 254fc5a983dSmrg pRiva->FgColor = fg; 255fc5a983dSmrg pRiva->BgColor = bg; 256fc5a983dSmrg} 257fc5a983dSmrg 258fc5a983dSmrgstatic void 259fc5a983dSmrgRivaSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 260fc5a983dSmrg{ 261fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 262fc5a983dSmrg 263fc5a983dSmrg int t = pRiva->expandWidth; 264fc5a983dSmrg CARD32 *pbits = (CARD32*)pRiva->expandBuffer; 265fc5a983dSmrg CARD32 *d = (CARD32*)pRiva->expandFifo; 266fc5a983dSmrg 267fc5a983dSmrg while(t >= 16) 268fc5a983dSmrg { 269fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, 16); 270fc5a983dSmrg d[0] = pbits[0]; 271fc5a983dSmrg d[1] = pbits[1]; 272fc5a983dSmrg d[2] = pbits[2]; 273fc5a983dSmrg d[3] = pbits[3]; 274fc5a983dSmrg d[4] = pbits[4]; 275fc5a983dSmrg d[5] = pbits[5]; 276fc5a983dSmrg d[6] = pbits[6]; 277fc5a983dSmrg d[7] = pbits[7]; 278fc5a983dSmrg d[8] = pbits[8]; 279fc5a983dSmrg d[9] = pbits[9]; 280fc5a983dSmrg d[10] = pbits[10]; 281fc5a983dSmrg d[11] = pbits[11]; 282fc5a983dSmrg d[12] = pbits[12]; 283fc5a983dSmrg d[13] = pbits[13]; 284fc5a983dSmrg d[14] = pbits[14]; 285fc5a983dSmrg d[15] = pbits[15]; 286fc5a983dSmrg t -= 16; pbits += 16; 287fc5a983dSmrg } 288fc5a983dSmrg if(t) { 289fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, t); 290fc5a983dSmrg while(t >= 4) 291fc5a983dSmrg { 292fc5a983dSmrg d[0] = pbits[0]; 293fc5a983dSmrg d[1] = pbits[1]; 294fc5a983dSmrg d[2] = pbits[2]; 295fc5a983dSmrg d[3] = pbits[3]; 296fc5a983dSmrg t -= 4; pbits += 4; 297fc5a983dSmrg } 298fc5a983dSmrg while(t--) 299fc5a983dSmrg *(d++) = *(pbits++); 300fc5a983dSmrg } 301fc5a983dSmrg 302fc5a983dSmrg if (!(--pRiva->expandRows)) { /* hardware bug workaround */ 303fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Blt, 1); 304fc5a983dSmrg write_mem_barrier(); 305fc5a983dSmrg pRiva->riva.Blt->TopLeftSrc = 0; 306fc5a983dSmrg } 307fc5a983dSmrg write_mem_barrier(); 308fc5a983dSmrg} 309fc5a983dSmrg 310fc5a983dSmrgstatic void 311fc5a983dSmrgRivaSubsequentColorExpandScanlineFifo(ScrnInfoPtr pScrn, int bufno) 312fc5a983dSmrg{ 313fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 314fc5a983dSmrg 315fc5a983dSmrg if ( --pRiva->expandRows ) { 316fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, pRiva->expandWidth); 317fc5a983dSmrg } else { /* hardware bug workaround */ 318fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Blt, 1); 319fc5a983dSmrg write_mem_barrier(); 320fc5a983dSmrg pRiva->riva.Blt->TopLeftSrc = 0; 321fc5a983dSmrg } 322fc5a983dSmrg write_mem_barrier(); 323fc5a983dSmrg} 324fc5a983dSmrg 325fc5a983dSmrgstatic void 326fc5a983dSmrgRivaSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, 327fc5a983dSmrg int y, int w, int h, 328fc5a983dSmrg int skipleft) 329fc5a983dSmrg{ 330fc5a983dSmrg int bw; 331fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 332fc5a983dSmrg 333fc5a983dSmrg bw = (w + 31) & ~31; 334fc5a983dSmrg pRiva->expandWidth = bw >> 5; 335fc5a983dSmrg 336fc5a983dSmrg if ( pRiva->BgColor == 0x80000000 ) 337fc5a983dSmrg { 338fc5a983dSmrg /* Use faster transparent method */ 339fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, 5); 340fc5a983dSmrg pRiva->riva.Bitmap->ClipC.TopLeft = (y << 16) | ((x+skipleft) 341fc5a983dSmrg & 0xFFFF); 342fc5a983dSmrg pRiva->riva.Bitmap->ClipC.BottomRight = ((y+h) << 16) | ((x+w)&0xffff); 343fc5a983dSmrg pRiva->riva.Bitmap->Color1C = pRiva->FgColor; 344fc5a983dSmrg pRiva->riva.Bitmap->WidthHeightC = (h << 16) | bw; 345fc5a983dSmrg write_mem_barrier(); 346fc5a983dSmrg pRiva->riva.Bitmap->PointC = (y << 16) | (x & 0xFFFF); 347fc5a983dSmrg write_mem_barrier(); 348fc5a983dSmrg } 349fc5a983dSmrg else 350fc5a983dSmrg { 351fc5a983dSmrg /* Opaque */ 352fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, 7); 353fc5a983dSmrg pRiva->riva.Bitmap->ClipE.TopLeft = (y << 16) | ((x+skipleft) 354fc5a983dSmrg & 0xFFFF); 355fc5a983dSmrg pRiva->riva.Bitmap->ClipE.BottomRight = ((y+h) << 16) | ((x+w)&0xffff); 356fc5a983dSmrg pRiva->riva.Bitmap->Color0E = pRiva->BgColor; 357fc5a983dSmrg pRiva->riva.Bitmap->Color1E = pRiva->FgColor; 358fc5a983dSmrg pRiva->riva.Bitmap->WidthHeightInE = (h << 16) | bw; 359fc5a983dSmrg pRiva->riva.Bitmap->WidthHeightOutE = (h << 16) | bw; 360fc5a983dSmrg write_mem_barrier(); 361fc5a983dSmrg pRiva->riva.Bitmap->PointE = (y << 16) | (x & 0xFFFF); 362fc5a983dSmrg write_mem_barrier(); 363fc5a983dSmrg } 364fc5a983dSmrg 365fc5a983dSmrg pRiva->expandRows = h; 366fc5a983dSmrg 367fc5a983dSmrg if(pRiva->expandWidth > (pRiva->riva.FifoEmptyCount >> 2)) { 368fc5a983dSmrg pRiva->AccelInfoRec->ScanlineColorExpandBuffers = &pRiva->expandBuffer; 369fc5a983dSmrg pRiva->AccelInfoRec->SubsequentColorExpandScanline = 370fc5a983dSmrg RivaSubsequentColorExpandScanline; 371fc5a983dSmrg } else { 372fc5a983dSmrg pRiva->AccelInfoRec->ScanlineColorExpandBuffers = &pRiva->expandFifo; 373fc5a983dSmrg pRiva->AccelInfoRec->SubsequentColorExpandScanline = 374fc5a983dSmrg RivaSubsequentColorExpandScanlineFifo; 375fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Bitmap, pRiva->expandWidth); 376fc5a983dSmrg } 377fc5a983dSmrg} 378fc5a983dSmrg 379fc5a983dSmrgstatic void 380fc5a983dSmrgRivaSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, unsigned planemask) 381fc5a983dSmrg{ 382fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 383fc5a983dSmrg 384fc5a983dSmrg RivaSetRopSolid(pRiva, rop); 385fc5a983dSmrg pRiva->FgColor = color; 386fc5a983dSmrg} 387fc5a983dSmrg 388fc5a983dSmrgstatic void 389fc5a983dSmrgRivaSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, int x, int y, int len, int dir) 390fc5a983dSmrg{ 391fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 392fc5a983dSmrg 393fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Line, 3); 394fc5a983dSmrg pRiva->riva.Line->Color = pRiva->FgColor; 395fc5a983dSmrg pRiva->riva.Line->Lin[0].point0 = ((y << 16) | ( x & 0xffff)); 396fc5a983dSmrg write_mem_barrier(); 397fc5a983dSmrg if ( dir ==DEGREES_0 ) 398fc5a983dSmrg pRiva->riva.Line->Lin[0].point1 = ((y << 16) | (( x + len ) & 0xffff)); 399fc5a983dSmrg else 400fc5a983dSmrg pRiva->riva.Line->Lin[0].point1 = (((y + len) << 16) | ( x & 0xffff)); 401fc5a983dSmrg write_mem_barrier(); 402fc5a983dSmrg} 403fc5a983dSmrg 404fc5a983dSmrgstatic void 405fc5a983dSmrgRivaSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, int x1, int y1, 406fc5a983dSmrg int x2, int y2, int flags) 407fc5a983dSmrg{ 408fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 409fc5a983dSmrg Bool lastPoint = !(flags & OMIT_LAST); 410fc5a983dSmrg 411fc5a983dSmrg RIVA_FIFO_FREE(pRiva->riva, Line, lastPoint ? 5 : 3); 412fc5a983dSmrg pRiva->riva.Line->Color = pRiva->FgColor; 413fc5a983dSmrg pRiva->riva.Line->Lin[0].point0 = ((y1 << 16) | (x1 & 0xffff)); 414fc5a983dSmrg write_mem_barrier(); 415fc5a983dSmrg pRiva->riva.Line->Lin[0].point1 = ((y2 << 16) | (x2 & 0xffff)); 416fc5a983dSmrg write_mem_barrier(); 417fc5a983dSmrg if (lastPoint) 418fc5a983dSmrg { 419fc5a983dSmrg pRiva->riva.Line->Lin[1].point0 = ((y2 << 16) | (x2 & 0xffff)); 420fc5a983dSmrg write_mem_barrier(); 421fc5a983dSmrg pRiva->riva.Line->Lin[1].point1 = (((y2 + 1) << 16) | (x2 & 0xffff)); 422fc5a983dSmrg write_mem_barrier(); 423fc5a983dSmrg } 424fc5a983dSmrg} 425fc5a983dSmrg 426fc5a983dSmrgstatic void 427fc5a983dSmrgRivaValidatePolyArc( 428fc5a983dSmrg GCPtr pGC, 429fc5a983dSmrg unsigned long changes, 430fc5a983dSmrg DrawablePtr pDraw 431fc5a983dSmrg){ 432fc5a983dSmrg if(pGC->planemask != ~0) return; 433fc5a983dSmrg 434fc5a983dSmrg if(!pGC->lineWidth && 435fc5a983dSmrg ((pGC->alu != GXcopy) || (pGC->lineStyle != LineSolid))) 436fc5a983dSmrg { 437fc5a983dSmrg pGC->ops->PolyArc = miZeroPolyArc; 438fc5a983dSmrg } 439fc5a983dSmrg} 440fc5a983dSmrg 441fc5a983dSmrgstatic void 442fc5a983dSmrgRivaValidatePolyPoint( 443fc5a983dSmrg GCPtr pGC, 444fc5a983dSmrg unsigned long changes, 445fc5a983dSmrg DrawablePtr pDraw 446fc5a983dSmrg){ 447fc5a983dSmrg pGC->ops->PolyPoint = XAAGetFallbackOps()->PolyPoint; 448fc5a983dSmrg 449fc5a983dSmrg if(pGC->planemask != ~0) return; 450fc5a983dSmrg 451fc5a983dSmrg if(pGC->alu != GXcopy) 452fc5a983dSmrg pGC->ops->PolyPoint = miPolyPoint; 453fc5a983dSmrg} 454fc5a983dSmrg 455fc5a983dSmrg/* Initialize XAA acceleration info */ 456fc5a983dSmrgBool 457fc5a983dSmrgRivaAccelInit(ScreenPtr pScreen) 458fc5a983dSmrg{ 459fc5a983dSmrg XAAInfoRecPtr infoPtr; 460fc5a983dSmrg ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 461fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 462fc5a983dSmrg 463fc5a983dSmrg pRiva->AccelInfoRec = infoPtr = XAACreateInfoRec(); 464fc5a983dSmrg if(!infoPtr) return FALSE; 465fc5a983dSmrg 466fc5a983dSmrg /* fill out infoPtr here */ 467fc5a983dSmrg infoPtr->Flags = LINEAR_FRAMEBUFFER | PIXMAP_CACHE | OFFSCREEN_PIXMAPS; 468fc5a983dSmrg 469fc5a983dSmrg /* sync */ 470fc5a983dSmrg infoPtr->Sync = RivaSync; 471fc5a983dSmrg 472fc5a983dSmrg /* solid fills */ 473fc5a983dSmrg infoPtr->SolidFillFlags = NO_PLANEMASK; 474fc5a983dSmrg infoPtr->SetupForSolidFill = RivaSetupForSolidFill; 475fc5a983dSmrg infoPtr->SubsequentSolidFillRect = RivaSubsequentSolidFillRect; 476fc5a983dSmrg 477fc5a983dSmrg /* screen to screen copy */ 478fc5a983dSmrg infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK; 479fc5a983dSmrg infoPtr->SetupForScreenToScreenCopy = RivaSetupForScreenToScreenCopy; 480fc5a983dSmrg infoPtr->SubsequentScreenToScreenCopy = RivaSubsequentScreenToScreenCopy; 481fc5a983dSmrg 482fc5a983dSmrg /* 8x8 mono patterns */ 483fc5a983dSmrg /* 484fc5a983dSmrg * Set pattern opaque bits based on pixel format. 485fc5a983dSmrg */ 486fc5a983dSmrg pRiva->opaqueMonochrome = ~((1 << pScrn->depth) - 1); 487fc5a983dSmrg 488fc5a983dSmrg infoPtr->Mono8x8PatternFillFlags = HARDWARE_PATTERN_SCREEN_ORIGIN | 489fc5a983dSmrg HARDWARE_PATTERN_PROGRAMMED_BITS | 490fc5a983dSmrg NO_PLANEMASK; 491fc5a983dSmrg infoPtr->SetupForMono8x8PatternFill = RivaSetupForMono8x8PatternFill; 492fc5a983dSmrg infoPtr->SubsequentMono8x8PatternFillRect = 493fc5a983dSmrg RivaSubsequentMono8x8PatternFillRect; 494fc5a983dSmrg 495fc5a983dSmrg /* Color expansion */ 496fc5a983dSmrg infoPtr->ScanlineCPUToScreenColorExpandFillFlags = 497fc5a983dSmrg BIT_ORDER_IN_BYTE_LSBFIRST | 498fc5a983dSmrg NO_PLANEMASK | 499fc5a983dSmrg CPU_TRANSFER_PAD_DWORD | 500fc5a983dSmrg LEFT_EDGE_CLIPPING | 501fc5a983dSmrg LEFT_EDGE_CLIPPING_NEGATIVE_X; 502fc5a983dSmrg 503fc5a983dSmrg infoPtr->NumScanlineColorExpandBuffers = 1; 504fc5a983dSmrg 505fc5a983dSmrg infoPtr->SetupForScanlineCPUToScreenColorExpandFill = 506fc5a983dSmrg RivaSetupForScanlineCPUToScreenColorExpandFill; 507fc5a983dSmrg infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = 508fc5a983dSmrg RivaSubsequentScanlineCPUToScreenColorExpandFill; 509fc5a983dSmrg 510fc5a983dSmrg pRiva->expandFifo = (unsigned char*)&pRiva->riva.Bitmap->MonochromeData01E; 511fc5a983dSmrg 512fc5a983dSmrg /* Allocate buffer for color expansion and also image writes in the 513fc5a983dSmrg future */ 514fc5a983dSmrg pRiva->expandBuffer = xnfalloc(((pScrn->virtualX*pScrn->bitsPerPixel)/8) + 8); 515fc5a983dSmrg 516fc5a983dSmrg 517fc5a983dSmrg infoPtr->ScanlineColorExpandBuffers = &pRiva->expandBuffer; 518fc5a983dSmrg infoPtr->SubsequentColorExpandScanline = RivaSubsequentColorExpandScanline; 519fc5a983dSmrg 520fc5a983dSmrg infoPtr->SolidLineFlags = infoPtr->SolidFillFlags; 521fc5a983dSmrg infoPtr->SetupForSolidLine = RivaSetupForSolidLine; 522fc5a983dSmrg infoPtr->SubsequentSolidHorVertLine = 523fc5a983dSmrg RivaSubsequentSolidHorVertLine; 524fc5a983dSmrg infoPtr->SubsequentSolidTwoPointLine = 525fc5a983dSmrg RivaSubsequentSolidTwoPointLine; 526fc5a983dSmrg infoPtr->SetClippingRectangle = RivaSetClippingRectangle; 527fc5a983dSmrg infoPtr->DisableClipping = RivaDisableClipping; 528fc5a983dSmrg infoPtr->ClippingFlags = HARDWARE_CLIP_SOLID_LINE; 529fc5a983dSmrg miSetZeroLineBias(pScreen, OCTANT1 | OCTANT3 | OCTANT4 | OCTANT6); 530fc5a983dSmrg 531fc5a983dSmrg infoPtr->ValidatePolyArc = RivaValidatePolyArc; 532fc5a983dSmrg infoPtr->PolyArcMask = GCFunction | GCLineWidth | GCPlaneMask; 533fc5a983dSmrg infoPtr->ValidatePolyPoint = RivaValidatePolyPoint; 534fc5a983dSmrg infoPtr->PolyPointMask = GCFunction | GCPlaneMask; 535fc5a983dSmrg 536fc5a983dSmrg RivaResetGraphics(pScrn); 537fc5a983dSmrg 538fc5a983dSmrg return(XAAInit(pScreen, infoPtr)); 539fc5a983dSmrg} 540