tdfx_accel.c revision 909209ee
102be438aSmrg 202be438aSmrg#ifdef HAVE_CONFIG_H 302be438aSmrg#include "config.h" 402be438aSmrg#endif 502be438aSmrg 602be438aSmrg/* All drivers should typically include these */ 702be438aSmrg#include "xf86.h" 802be438aSmrg#include "xf86_OSproc.h" 902be438aSmrg#include "compiler.h" 1002be438aSmrg 1102be438aSmrg/* Drivers that need to access the PCI config space directly need this */ 1202be438aSmrg#include "xf86Pci.h" 1302be438aSmrg 1402be438aSmrg/* Drivers for PCI hardware need this */ 1502be438aSmrg#include "xf86PciInfo.h" 1602be438aSmrg 1702be438aSmrg/* Drivers that use XAA need this */ 18909209eeSmrg#ifdef HAVE_XAA_H 1902be438aSmrg#include "xaalocal.h" 20909209eeSmrg#endif 2102be438aSmrg#include "xf86fbman.h" 2202be438aSmrg 2302be438aSmrg#include "miline.h" 2402be438aSmrg 2502be438aSmrg#include "tdfx.h" 2602be438aSmrg 27909209eeSmrg#ifdef HAVE_XAA_H 2802be438aSmrg#ifdef TDFX_DEBUG_CMDS 2902be438aSmrgstatic int cmdCnt=0; 3002be438aSmrgstatic int lastAddr=0; 3102be438aSmrg#endif 3202be438aSmrg 3302be438aSmrgstatic int TDFXROPCvt[] = {0x00, 0x88, 0x44, 0xCC, 0x22, 0xAA, 0x66, 0xEE, 3402be438aSmrg 0x11, 0x99, 0x55, 0xDD, 0x33, 0xBB, 0x77, 0xFF, 3502be438aSmrg 0x00, 0xA0, 0x50, 0xF0, 0x0A, 0xAA, 0x5A, 0xFA, 3602be438aSmrg 0x05, 0xA5, 0x55, 0xF5, 0x0F, 0xAF, 0x5F, 0xFF}; 3702be438aSmrg#define ROP_PATTERN_OFFSET 16 3802be438aSmrg 3902be438aSmrgstatic void TDFXSetClippingRectangle(ScrnInfoPtr pScrn, int left, int top, 4002be438aSmrg int right, int bottom); 4102be438aSmrgstatic void TDFXDisableClipping(ScrnInfoPtr pScrn); 4202be438aSmrgstatic void TDFXSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patx, 4302be438aSmrg int paty, int fg, int bg, int rop, 4402be438aSmrg unsigned int planemask); 4502be438aSmrgstatic void TDFXSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, 4602be438aSmrg int pay, int x, int y, 4702be438aSmrg int w, int h); 4802be438aSmrgstatic void TDFXSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, 4902be438aSmrg unsigned int planemask); 5002be438aSmrgstatic void TDFXSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, int srcx, 5102be438aSmrg int srcy, int dstx, int dsty, 5202be438aSmrg int flags); 5302be438aSmrgstatic void TDFXSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, int x, int y, 5402be438aSmrg int len, int dir); 5502be438aSmrgstatic void TDFXNonTEGlyphRenderer(ScrnInfoPtr pScrn, int x, int y, int n, 5602be438aSmrg NonTEGlyphPtr glyphs, BoxPtr pbox, int fg, 5702be438aSmrg int rop, unsigned int planemask); 5802be438aSmrgstatic void TDFXSetupForDashedLine(ScrnInfoPtr pScrn, int fg, int bg, int rop, 5902be438aSmrg unsigned int planemask, int length, 6002be438aSmrg unsigned char *pattern); 6102be438aSmrgstatic void TDFXSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, int x1, int y1, 6202be438aSmrg int x2, int y2, int flags, 6302be438aSmrg int phase); 6402be438aSmrg#ifdef ENABLE_SS_COLOR_EXPAND_FILL 6502be438aSmrgstatic void TDFXSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, 6602be438aSmrg int fg, int bg, int rop, 6702be438aSmrg unsigned int planemask); 6802be438aSmrgstatic void TDFXSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, 6902be438aSmrg int x, int y, int w, 7002be438aSmrg int h, int srcx, 7102be438aSmrg int srcy, int offset); 7202be438aSmrg#endif 7302be438aSmrgstatic void TDFXSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 7402be438aSmrg int fg, int bg, int rop, 7502be438aSmrg unsigned int planemask); 7602be438aSmrgstatic void TDFXSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 7702be438aSmrg int x, int y, 7802be438aSmrg int w, int h, 7902be438aSmrg int skipleft); 8002be438aSmrgstatic void TDFXSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno); 8102be438aSmrg 82909209eeSmrg#endif 8302be438aSmrgvoid 8402be438aSmrgTDFXNeedSync(ScrnInfoPtr pScrn) { 8502be438aSmrg TDFXPtr pTDFX = TDFXPTR(pScrn); 8602be438aSmrg pTDFX->syncDone=FALSE; 87909209eeSmrg#ifdef HAVE_XAA_H 8802be438aSmrg pTDFX->AccelInfoRec->NeedToSync = TRUE; 89909209eeSmrg#endif 9002be438aSmrg} 9102be438aSmrg 9202be438aSmrgvoid 9302be438aSmrgTDFXFirstSync(ScrnInfoPtr pScrn) { 9402be438aSmrg TDFXPtr pTDFX = TDFXPTR(pScrn); 9502be438aSmrg 9602be438aSmrg if (!pTDFX->syncDone) { 97909209eeSmrg#ifdef TDFXDRI 9802be438aSmrg if (pTDFX->directRenderingEnabled) { 99909209eeSmrg DRILock(xf86ScrnToScreen(pScrn), 0); 100909209eeSmrg TDFXSwapContextFifo(xf86ScrnToScreen(pScrn)); 10102be438aSmrg } 10202be438aSmrg#endif 10302be438aSmrg pTDFX->syncDone=TRUE; 10402be438aSmrg pTDFX->sync(pScrn); 10502be438aSmrg } 10602be438aSmrg} 10702be438aSmrg 10802be438aSmrgvoid 10902be438aSmrgTDFXCheckSync(ScrnInfoPtr pScrn) { 11002be438aSmrg TDFXPtr pTDFX = TDFXPTR(pScrn); 11102be438aSmrg 11202be438aSmrg if (pTDFX->syncDone) { 11302be438aSmrg pTDFX->sync(pScrn); 11402be438aSmrg pTDFX->syncDone=FALSE; 115909209eeSmrg#ifdef TDFXDRI 11602be438aSmrg if (pTDFX->directRenderingEnabled) { 117909209eeSmrg DRIUnlock(xf86ScrnToScreen(pScrn)); 11802be438aSmrg } 11902be438aSmrg#endif 12002be438aSmrg } 12102be438aSmrg} 12202be438aSmrg 12302be438aSmrgvoid 12402be438aSmrgTDFXSelectBuffer(TDFXPtr pTDFX, int which) { 12502be438aSmrg int fmt; 12602be438aSmrg 12702be438aSmrg TDFXMakeRoom(pTDFX, 4); 12802be438aSmrg DECLARE(SSTCP_SRCBASEADDR|SSTCP_DSTBASEADDR|SSTCP_SRCFORMAT|SSTCP_DSTFORMAT); 12902be438aSmrg switch (which) { 13002be438aSmrg case TDFX_FRONT: 13102be438aSmrg if (pTDFX->cpp==1) fmt=pTDFX->stride|(1<<16); 13202be438aSmrg else fmt=pTDFX->stride|((pTDFX->cpp+1)<<16); 13302be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTBASEADDR, pTDFX->fbOffset); 13402be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); 13502be438aSmrg pTDFX->sst2DDstFmtShadow = fmt; 13602be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCBASEADDR, pTDFX->fbOffset); 13702be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, fmt); 13802be438aSmrg pTDFX->sst2DSrcFmtShadow = fmt; 13902be438aSmrg break; 14002be438aSmrg case TDFX_BACK: 14102be438aSmrg if (pTDFX->cpp==2) 14202be438aSmrg fmt=((pTDFX->stride+127)/128)|(3<<16); /* Tiled 16bpp */ 14302be438aSmrg else 14402be438aSmrg fmt=((pTDFX->stride+127)/128)|(5<<16); /* Tiled 32bpp */ 14502be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTBASEADDR, pTDFX->backOffset|BIT(31)); 14602be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); 14702be438aSmrg pTDFX->sst2DDstFmtShadow = fmt; 14802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCBASEADDR, pTDFX->backOffset|BIT(31)); 14902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, fmt); 15002be438aSmrg pTDFX->sst2DSrcFmtShadow = fmt; 15102be438aSmrg break; 15202be438aSmrg case TDFX_DEPTH: 15302be438aSmrg if (pTDFX->cpp==2) 15402be438aSmrg fmt=((pTDFX->stride+127)/128)|(3<<16); /* Tiled 16bpp */ 15502be438aSmrg else 15602be438aSmrg fmt=((pTDFX->stride+127)/128)|(5<<16); /* Tiled 32bpp */ 15702be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTBASEADDR, pTDFX->depthOffset|BIT(31)); 15802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); 15902be438aSmrg pTDFX->sst2DDstFmtShadow = fmt; 16002be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCBASEADDR, pTDFX->depthOffset|BIT(31)); 16102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, fmt); 16202be438aSmrg pTDFX->sst2DSrcFmtShadow = fmt; 16302be438aSmrg break; 16402be438aSmrg default: 16502be438aSmrg ; 16602be438aSmrg } 16702be438aSmrg} 16802be438aSmrg 16902be438aSmrgvoid 17002be438aSmrgTDFXSetLFBConfig(TDFXPtr pTDFX) { 17102be438aSmrg if (pTDFX->ChipType<=PCI_CHIP_VOODOO3) { 17202be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 17302be438aSmrg unsigned int lfbmode; 17402be438aSmrg lfbmode=TDFXReadLongMMIO(pTDFX, SST_3D_LFBMODE); 17502be438aSmrg 17602be438aSmrg lfbmode&=~BIT(12); /* 0 bit 12 is byte swizzle */ 17702be438aSmrg lfbmode|=BIT(11); /* 1 bit 11 is word swizzle */ 17802be438aSmrg lfbmode&=~BIT(10); /* 0 bit 10 ARGB or ABGR */ 17902be438aSmrg lfbmode&=~BIT(9); /* 0 bit 9 if bit10 = 0: ARGB else ABGR */ 18002be438aSmrg 18102be438aSmrg TDFXWriteLongMMIO(pTDFX, SST_3D_LFBMODE, lfbmode); 18202be438aSmrg#endif 18302be438aSmrg TDFXWriteLongMMIO(pTDFX, LFBMEMORYCONFIG, (pTDFX->backOffset>>12) | 18402be438aSmrg SST_RAW_LFB_ADDR_STRIDE_4K | 18502be438aSmrg ((pTDFX->stride+127)/128)<<SST_RAW_LFB_TILE_STRIDE_SHIFT); 18602be438aSmrg } else { 18702be438aSmrg int chip; 18802be438aSmrg int stride, bits; 18902be438aSmrg int TileAperturePitch, lg2TileAperturePitch; 19002be438aSmrg if (pTDFX->cpp==2) stride=pTDFX->stride; 19102be438aSmrg else stride=4*pTDFX->stride/pTDFX->cpp; 19202be438aSmrg bits=pTDFX->backOffset>>12; 19302be438aSmrg for (lg2TileAperturePitch = 0, TileAperturePitch = 1024; 19402be438aSmrg (lg2TileAperturePitch < 5) && 19502be438aSmrg TileAperturePitch < stride; 19602be438aSmrg lg2TileAperturePitch += 1, TileAperturePitch <<= 1); 19702be438aSmrg#if 0 19802be438aSmrg fprintf(stderr, "Using %d (== lg2(%d)-10) for tile aperture pitch\n", 19902be438aSmrg lg2TileAperturePitch, TileAperturePitch); 20002be438aSmrg fprintf(stderr, "stride == %d\n", stride); 20102be438aSmrg#endif 20202be438aSmrg for (chip=0; chip<pTDFX->numChips; chip++) { 20302be438aSmrg TDFXWriteChipLongMMIO(pTDFX, chip, LFBMEMORYCONFIG, (bits&0x1FFF) | 20402be438aSmrg SST_RAW_LFB_ADDR_STRIDE(lg2TileAperturePitch) | 20502be438aSmrg ((bits&0x6000)<<10) | 20602be438aSmrg ((stride+127)/128)<<SST_RAW_LFB_TILE_STRIDE_SHIFT); 20702be438aSmrg } 20802be438aSmrg } 20902be438aSmrg} 21002be438aSmrg 211909209eeSmrg 21202be438aSmrgBool 21302be438aSmrgTDFXAccelInit(ScreenPtr pScreen) 21402be438aSmrg{ 215909209eeSmrg#ifdef HAVE_XAA_H 21602be438aSmrg XAAInfoRecPtr infoPtr; 217909209eeSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 21802be438aSmrg TDFXPtr pTDFX = TDFXPTR(pScrn); 21902be438aSmrg CARD32 commonFlags; 22002be438aSmrg 22102be438aSmrg pTDFX->AccelInfoRec = infoPtr = XAACreateInfoRec(); 22202be438aSmrg if (!infoPtr) return FALSE; 22302be438aSmrg 22402be438aSmrg infoPtr->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS | LINEAR_FRAMEBUFFER; 22502be438aSmrg 22602be438aSmrg infoPtr->Sync = pTDFX->sync; 22702be438aSmrg 22802be438aSmrg infoPtr->SetClippingRectangle = TDFXSetClippingRectangle; 22902be438aSmrg infoPtr->DisableClipping = TDFXDisableClipping; 23002be438aSmrg infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COLOR_EXPAND | 23102be438aSmrg HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY | 23202be438aSmrg HARDWARE_CLIP_MONO_8x8_FILL | 23302be438aSmrg HARDWARE_CLIP_COLOR_8x8_FILL | 23402be438aSmrg HARDWARE_CLIP_SOLID_FILL | 23502be438aSmrg HARDWARE_CLIP_DASHED_LINE | 23602be438aSmrg HARDWARE_CLIP_SOLID_LINE; 23702be438aSmrg 23802be438aSmrg miSetZeroLineBias(pScreen, OCTANT2 | OCTANT5 | OCTANT7 | OCTANT8); 23902be438aSmrg 24002be438aSmrg commonFlags = BIT_ORDER_IN_BYTE_MSBFIRST | NO_PLANEMASK; 24102be438aSmrg 24202be438aSmrg infoPtr->SetupForSolidFill = TDFXSetupForSolidFill; 24302be438aSmrg infoPtr->SubsequentSolidFillRect = TDFXSubsequentSolidFillRect; 24402be438aSmrg infoPtr->SolidFillFlags = commonFlags; 24502be438aSmrg 24602be438aSmrg infoPtr->SetupForSolidLine = TDFXSetupForSolidLine; 24702be438aSmrg infoPtr->SubsequentSolidTwoPointLine = TDFXSubsequentSolidTwoPointLine; 24802be438aSmrg infoPtr->SubsequentSolidHorVertLine = TDFXSubsequentSolidHorVertLine; 24902be438aSmrg infoPtr->SolidLineFlags = commonFlags; 25002be438aSmrg 25102be438aSmrg infoPtr->SetupForDashedLine = TDFXSetupForDashedLine; 25202be438aSmrg infoPtr->SubsequentDashedTwoPointLine = TDFXSubsequentDashedTwoPointLine; 25302be438aSmrg infoPtr->DashedLineFlags = commonFlags | LINE_PATTERN_LSBFIRST_LSBJUSTIFIED; 25402be438aSmrg infoPtr->DashPatternMaxLength = 32; 25502be438aSmrg 25602be438aSmrg infoPtr->NonTEGlyphRenderer = TDFXNonTEGlyphRenderer; 25702be438aSmrg infoPtr->NonTEGlyphRendererFlags = commonFlags; 25802be438aSmrg 25902be438aSmrg infoPtr->SetupForScreenToScreenCopy = TDFXSetupForScreenToScreenCopy; 26002be438aSmrg infoPtr->SubsequentScreenToScreenCopy = TDFXSubsequentScreenToScreenCopy; 26102be438aSmrg infoPtr->ScreenToScreenCopyFlags = commonFlags; 26202be438aSmrg 26302be438aSmrg /* When we're using the fifo we have to use indirect expansion */ 264909209eeSmrg pTDFX->scanlineColorExpandBuffers[0] = malloc((pScrn->virtualX+62)/32*4); 265909209eeSmrg pTDFX->scanlineColorExpandBuffers[1] = malloc((pScrn->virtualX+62)/32*4); 26602be438aSmrg infoPtr->NumScanlineColorExpandBuffers=2; 26702be438aSmrg infoPtr->ScanlineColorExpandBuffers=pTDFX->scanlineColorExpandBuffers; 26802be438aSmrg infoPtr->SetupForScanlineCPUToScreenColorExpandFill = 26902be438aSmrg TDFXSetupForCPUToScreenColorExpandFill; 27002be438aSmrg infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = 27102be438aSmrg TDFXSubsequentCPUToScreenColorExpandFill; 27202be438aSmrg infoPtr->SubsequentColorExpandScanline = 27302be438aSmrg TDFXSubsequentColorExpandScanline; 27402be438aSmrg infoPtr->ScanlineCPUToScreenColorExpandFillFlags = NO_PLANEMASK | 27502be438aSmrg#if X_BYTE_ORDER == X_LITTLE_ENDIAN 27602be438aSmrg BIT_ORDER_IN_BYTE_MSBFIRST | 27702be438aSmrg#endif 27802be438aSmrg CPU_TRANSFER_PAD_DWORD | SCANLINE_PAD_DWORD | 27902be438aSmrg LEFT_EDGE_CLIPPING; /* | LEFT_EDGE_CLIPPING_NEGATIVE_X; */ 28002be438aSmrg 28102be438aSmrg infoPtr->SetupForMono8x8PatternFill = TDFXSetupForMono8x8PatternFill; 28202be438aSmrg infoPtr->SubsequentMono8x8PatternFillRect = 28302be438aSmrg TDFXSubsequentMono8x8PatternFillRect; 28402be438aSmrg infoPtr->Mono8x8PatternFillFlags = commonFlags | 28502be438aSmrg HARDWARE_PATTERN_PROGRAMMED_BITS | 28602be438aSmrg HARDWARE_PATTERN_PROGRAMMED_ORIGIN | 28702be438aSmrg HARDWARE_PATTERN_SCREEN_ORIGIN; 28802be438aSmrg 28902be438aSmrg#ifdef ENABLE_SS_COLOR_EXPAND_FILL 29002be438aSmrg /* This causes us to fail compliance */ 29102be438aSmrg /* I suspect 1bpp pixmaps are getting written to cache incorrectly */ 29202be438aSmrg infoPtr->SetupForScreenToScreenColorExpandFill = 29302be438aSmrg TDFXSetupForScreenToScreenColorExpandFill; 29402be438aSmrg infoPtr->SubsequentScreenToScreenColorExpandFill = 29502be438aSmrg TDFXSubsequentScreenToScreenColorExpandFill; 29602be438aSmrg infoPtr->ScreenToScreenColorExpandFillFlags = commonFlags; 29702be438aSmrg#endif 29802be438aSmrg 29902be438aSmrg pTDFX->PciCnt=TDFXReadLongMMIO(pTDFX, 0)&0x1F; 30002be438aSmrg pTDFX->PrevDrawState=pTDFX->DrawState=0; 30102be438aSmrg 30202be438aSmrg pTDFX->ModeReg.srcbaseaddr=pTDFX->fbOffset; 30302be438aSmrg TDFXWriteLongMMIO(pTDFX, SST_2D_SRCBASEADDR, pTDFX->ModeReg.srcbaseaddr); 30402be438aSmrg pTDFX->ModeReg.dstbaseaddr=pTDFX->fbOffset; 30502be438aSmrg TDFXWriteLongMMIO(pTDFX, SST_2D_DSTBASEADDR, pTDFX->ModeReg.dstbaseaddr); 30602be438aSmrg 30702be438aSmrg pTDFX->sst2DSrcFmtShadow = TDFXReadLongMMIO(pTDFX, SST_2D_SRCFORMAT); 30802be438aSmrg pTDFX->sst2DDstFmtShadow = TDFXReadLongMMIO(pTDFX, SST_2D_DSTFORMAT); 30902be438aSmrg 31002be438aSmrg /* Fill in acceleration functions */ 31102be438aSmrg return XAAInit(pScreen, infoPtr); 312909209eeSmrg#else 313909209eeSmrg return FALSE; 314909209eeSmrg#endif 31502be438aSmrg} 31602be438aSmrg 31702be438aSmrgstatic void TDFXMakeRoomNoProp(TDFXPtr pTDFX, int size) { 31802be438aSmrg int stat; 31902be438aSmrg 32002be438aSmrg pTDFX->PciCnt-=size; 32102be438aSmrg if (pTDFX->PciCnt<1) { 32202be438aSmrg do { 32302be438aSmrg stat=TDFXReadLongMMIO(pTDFX, 0); 32402be438aSmrg pTDFX->PciCnt=stat&0x1F; 32502be438aSmrg } while (pTDFX->PciCnt<size); 32602be438aSmrg } 32702be438aSmrg} 32802be438aSmrg 32902be438aSmrgstatic void TDFXSendNOPNoProp(ScrnInfoPtr pScrn) 33002be438aSmrg{ 33102be438aSmrg TDFXPtr pTDFX; 33202be438aSmrg 33302be438aSmrg pTDFX=TDFXPTR(pScrn); 33402be438aSmrg TDFXMakeRoomNoProp(pTDFX, 1); 33502be438aSmrg TDFXWriteLongMMIO(pTDFX, SST_2D_COMMAND, SST_2D_NOP); 33602be438aSmrg} 33702be438aSmrg 33802be438aSmrgvoid TDFXSync(ScrnInfoPtr pScrn) 33902be438aSmrg{ 34002be438aSmrg TDFXPtr pTDFX; 34102be438aSmrg int i; 34202be438aSmrg int stat; 34302be438aSmrg 34402be438aSmrg TDFXTRACEACCEL("TDFXSync\n"); 34502be438aSmrg pTDFX=TDFXPTR(pScrn); 34602be438aSmrg 34702be438aSmrg TDFXSendNOPNoProp(pScrn); 34802be438aSmrg i=0; 34902be438aSmrg do { 35002be438aSmrg stat=TDFXReadLongMMIO(pTDFX, 0); 35102be438aSmrg if (stat&SST_BUSY) i=0; else i++; 35202be438aSmrg } while (i<3); 35302be438aSmrg pTDFX->PciCnt=stat&0x1F; 35402be438aSmrg} 35502be438aSmrg 356909209eeSmrg#ifdef HAVE_XAA_H 357909209eeSmrg 358909209eeSmrg 35902be438aSmrgstatic void 36002be438aSmrgTDFXMatchState(TDFXPtr pTDFX) 36102be438aSmrg{ 36202be438aSmrg if (pTDFX->PrevDrawState==pTDFX->DrawState) return; 36302be438aSmrg 36402be438aSmrg /* Do we need to set a clipping rectangle? */ 36502be438aSmrg if (pTDFX->DrawState&DRAW_STATE_CLIPPING) 36602be438aSmrg pTDFX->Cmd |= SST_2D_USECLIP1; 36702be438aSmrg else 36802be438aSmrg pTDFX->Cmd &= ~SST_2D_USECLIP1; 36902be438aSmrg 37002be438aSmrg /* Do we need to set transparency? */ 37102be438aSmrg TDFXMakeRoom(pTDFX, 1); 37202be438aSmrg DECLARE(SSTCP_COMMANDEXTRA); 37302be438aSmrg if (pTDFX->DrawState&DRAW_STATE_TRANSPARENT) { 37402be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COMMANDEXTRA, SST_2D_SRC_COLORKEY_EX); 37502be438aSmrg } else { 37602be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COMMANDEXTRA, 0); 37702be438aSmrg } 37802be438aSmrg 37902be438aSmrg /* Has the previous routine left clip1 changed? Reset it. */ 38002be438aSmrg if (pTDFX->DrawState&DRAW_STATE_CLIP1CHANGED) { 38102be438aSmrg TDFXMakeRoom(pTDFX, 2); 38202be438aSmrg DECLARE(SSTCP_CLIP1MIN|SSTCP_CLIP1MAX); 38302be438aSmrg TDFXWriteLong(pTDFX, SST_2D_CLIP1MIN, pTDFX->ModeReg.clip1min); 38402be438aSmrg TDFXWriteLong(pTDFX, SST_2D_CLIP1MAX, pTDFX->ModeReg.clip1max); 38502be438aSmrg pTDFX->DrawState&=~DRAW_STATE_CLIP1CHANGED; 38602be438aSmrg } 38702be438aSmrg 38802be438aSmrg pTDFX->PrevDrawState=pTDFX->DrawState; 38902be438aSmrg} 39002be438aSmrg 39102be438aSmrgstatic void 39202be438aSmrgTDFXClearState(ScrnInfoPtr pScrn) 39302be438aSmrg{ 39402be438aSmrg TDFXPtr pTDFX; 39502be438aSmrg 39602be438aSmrg pTDFX=TDFXPTR(pScrn); 39702be438aSmrg pTDFX->Cmd=0; 39802be438aSmrg pTDFX->DrawState&=~DRAW_STATE_TRANSPARENT; 39902be438aSmrg /* Make sure we've done a sync */ 40002be438aSmrg TDFXFirstSync(pScrn); 40102be438aSmrg} 40202be438aSmrg 40302be438aSmrgstatic void 40402be438aSmrgTDFXSetClippingRectangle(ScrnInfoPtr pScrn, int left, int top, int right, 40502be438aSmrg int bottom) 40602be438aSmrg{ 40702be438aSmrg TDFXPtr pTDFX; 40802be438aSmrg 40902be438aSmrg TDFXTRACEACCEL("TDFXSetClippingRectangle %d,%d to %d,%d\n", left, top, 41002be438aSmrg right, bottom); 41102be438aSmrg pTDFX=TDFXPTR(pScrn); 41202be438aSmrg 41302be438aSmrg pTDFX->ModeReg.clip1min=(top&0xFFF)<<16 | (left&0xFFF); 41402be438aSmrg pTDFX->ModeReg.clip1max=((bottom+1)&0xFFF)<<16 | ((right+1)&0xFFF); 41502be438aSmrg 41602be438aSmrg pTDFX->DrawState|=DRAW_STATE_CLIPPING|DRAW_STATE_CLIP1CHANGED; 41702be438aSmrg} 41802be438aSmrg 41902be438aSmrgstatic void 42002be438aSmrgTDFXDisableClipping(ScrnInfoPtr pScrn) 42102be438aSmrg{ 42202be438aSmrg TDFXPtr pTDFX; 42302be438aSmrg 42402be438aSmrg TDFXTRACEACCEL("TDFXDisableClippingRectangle\n"); 42502be438aSmrg pTDFX=TDFXPTR(pScrn); 42602be438aSmrg 42702be438aSmrg pTDFX->DrawState&=~DRAW_STATE_CLIPPING; 42802be438aSmrg} 42902be438aSmrg 43002be438aSmrgvoid 43102be438aSmrgTDFXSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, 43202be438aSmrg unsigned int planemask, int trans_color) 43302be438aSmrg{ 43402be438aSmrg TDFXPtr pTDFX; 43502be438aSmrg int fmt; 43602be438aSmrg 43702be438aSmrg TDFXTRACEACCEL("TDFXSetupForScreenToScreenCopy\n xdir=%d ydir=%d " 43802be438aSmrg "rop=%d planemask=%d trans_color=%d\n", 43902be438aSmrg xdir, ydir, rop, planemask, trans_color); 44002be438aSmrg pTDFX=TDFXPTR(pScrn); 44102be438aSmrg TDFXClearState(pScrn); 44202be438aSmrg 44302be438aSmrg if (trans_color!=-1) { 44402be438aSmrg TDFXMakeRoom(pTDFX, 3); 44502be438aSmrg DECLARE(SSTCP_SRCCOLORKEYMIN|SSTCP_SRCCOLORKEYMAX|SSTCP_ROP); 44602be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCCOLORKEYMIN, trans_color); 44702be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCCOLORKEYMAX, trans_color); 44802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_ROP, TDFXROPCvt[GXnoop]<<8); 44902be438aSmrg pTDFX->DrawState|=DRAW_STATE_TRANSPARENT; 45002be438aSmrg } 45102be438aSmrg pTDFX->Cmd = (TDFXROPCvt[rop]<<24) | SST_2D_SCRNTOSCRNBLIT; 45202be438aSmrg if (xdir==-1) pTDFX->Cmd |= SST_2D_X_RIGHT_TO_LEFT; 45302be438aSmrg if (ydir==-1) pTDFX->Cmd |= SST_2D_Y_BOTTOM_TO_TOP; 45402be438aSmrg if (pTDFX->cpp==1) fmt=pTDFX->stride|(1<<16); 45502be438aSmrg else fmt=pTDFX->stride|((pTDFX->cpp+1)<<16); 45602be438aSmrg 45702be438aSmrg TDFXMakeRoom(pTDFX, 2); 45802be438aSmrg DECLARE(SSTCP_SRCFORMAT|SSTCP_DSTFORMAT); 45902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); 46002be438aSmrg pTDFX->sst2DDstFmtShadow = fmt; 46102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, fmt); 46202be438aSmrg pTDFX->sst2DSrcFmtShadow = fmt; 46302be438aSmrg} 46402be438aSmrg 46502be438aSmrgvoid 46602be438aSmrgTDFXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX, int srcY, 46702be438aSmrg int dstX, int dstY, int w, int h) 46802be438aSmrg{ 46902be438aSmrg TDFXPtr pTDFX; 47002be438aSmrg 47102be438aSmrg TDFXTRACEACCEL("TDFXSubsequentScreenToScreenCopy\n srcX=%d srcY=%d" 47202be438aSmrg " dstX=%d dstY=%d w=%d h=%d\n", srcX, srcY, dstX, dstY, w, h); 47302be438aSmrg pTDFX=TDFXPTR(pScrn); 47402be438aSmrg TDFXMatchState(pTDFX); 47502be438aSmrg 47602be438aSmrg if (pTDFX->Cmd&SST_2D_Y_BOTTOM_TO_TOP) { 47702be438aSmrg srcY += h-1; 47802be438aSmrg dstY += h-1; 47902be438aSmrg } 48002be438aSmrg if (pTDFX->Cmd&SST_2D_X_RIGHT_TO_LEFT) { 48102be438aSmrg srcX += w-1; 48202be438aSmrg dstX += w-1; 48302be438aSmrg } 48402be438aSmrg if ((srcY>=dstY-32 && srcY<=dstY)|| 48502be438aSmrg (srcY>=pTDFX->prevBlitDest.y1-32 && srcY<=pTDFX->prevBlitDest.y1)) { 48602be438aSmrg TDFXSendNOP(pScrn); 48702be438aSmrg } 48802be438aSmrg pTDFX->sync(pScrn); 48902be438aSmrg 49002be438aSmrg TDFXMakeRoom(pTDFX, 4); 49102be438aSmrg DECLARE(SSTCP_DSTSIZE|SSTCP_DSTXY|SSTCP_SRCXY|SSTCP_COMMAND); 49202be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCXY, (srcX&0x1FFF) | ((srcY&0x1FFF)<<16)); 49302be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTSIZE, (w&0x1FFF) | ((h&0x1FFF)<<16)); 49402be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTXY, (dstX&0x1FFF) | ((dstY&0x1FFF)<<16)); 49502be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COMMAND, pTDFX->Cmd|SST_2D_GO); 49602be438aSmrg 49702be438aSmrg pTDFX->prevBlitDest.y1=dstY; 49802be438aSmrg} 49902be438aSmrg 50002be438aSmrgvoid 50102be438aSmrgTDFXSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, 50202be438aSmrg unsigned int planemask) 50302be438aSmrg{ 50402be438aSmrg TDFXPtr pTDFX; 50502be438aSmrg int fmt; 50602be438aSmrg 50702be438aSmrg TDFXTRACEACCEL("TDFXSetupForSolidFill color=%d rop=%d planemask=%d\n", 50802be438aSmrg color, rop, planemask); 50902be438aSmrg pTDFX=TDFXPTR(pScrn); 51002be438aSmrg TDFXClearState(pScrn); 51102be438aSmrg 51202be438aSmrg pTDFX->Cmd=TDFXROPCvt[rop]<<24; 51302be438aSmrg if (pTDFX->cpp==1) fmt=(1<<16)|pTDFX->stride; 51402be438aSmrg else fmt=((pTDFX->cpp+1)<<16)|pTDFX->stride; 51502be438aSmrg 51602be438aSmrg TDFXMakeRoom(pTDFX, 3); 51702be438aSmrg DECLARE(SSTCP_DSTFORMAT|SSTCP_COLORFORE| 51802be438aSmrg SSTCP_COLORBACK); 51902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); 52002be438aSmrg pTDFX->sst2DDstFmtShadow = fmt; 52102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORBACK, color); 52202be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORFORE, color); 52302be438aSmrg} 52402be438aSmrg 52502be438aSmrgvoid 52602be438aSmrgTDFXSubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h) 52702be438aSmrg{ 52802be438aSmrg /* Also called by TDFXSubsequentMono8x8PatternFillRect */ 52902be438aSmrg TDFXPtr pTDFX; 53002be438aSmrg 53102be438aSmrg TDFXTRACEACCEL("TDFXSubsequentSolidFillRect x=%d y=%d w=%d h=%d\n", 53202be438aSmrg x, y, w, h); 53302be438aSmrg pTDFX=TDFXPTR(pScrn); 53402be438aSmrg TDFXMatchState(pTDFX); 53502be438aSmrg 53602be438aSmrg TDFXMakeRoom(pTDFX, 3); 53702be438aSmrg DECLARE(SSTCP_DSTSIZE|SSTCP_DSTXY|SSTCP_COMMAND); 53802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTSIZE, ((h&0x1FFF)<<16) | (w&0x1FFF)); 53902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTXY, ((y&0x1FFF)<<16) | (x&0x1FFF)); 54002be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COMMAND, pTDFX->Cmd | SST_2D_RECTANGLEFILL | 54102be438aSmrg SST_2D_GO); 54202be438aSmrg} 54302be438aSmrg 54402be438aSmrgstatic void 54502be438aSmrgTDFXSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, 54602be438aSmrg int fg, int bg, int rop, unsigned int planemask) 54702be438aSmrg{ 54802be438aSmrg TDFXPtr pTDFX; 54902be438aSmrg int fmt; 55002be438aSmrg 55102be438aSmrg TDFXTRACEACCEL("TDFXSetupForMono8x8PatternFill patx=%x paty=%x fg=%d" 55202be438aSmrg " bg=%d rop=%d planemask=%d\n", patx, paty, fg, bg, rop, 55302be438aSmrg planemask); 55402be438aSmrg pTDFX=TDFXPTR(pScrn); 55502be438aSmrg TDFXClearState(pScrn); 55602be438aSmrg 55702be438aSmrg pTDFX->Cmd = (TDFXROPCvt[rop+ROP_PATTERN_OFFSET]<<24) | 55802be438aSmrg SST_2D_MONOCHROME_PATTERN; 55902be438aSmrg if (bg==-1) { 56002be438aSmrg pTDFX->Cmd |= SST_2D_TRANSPARENT_MONOCHROME; 56102be438aSmrg } 56202be438aSmrg if (pTDFX->cpp==1) fmt=(1<<16)|pTDFX->stride; 56302be438aSmrg else fmt=((pTDFX->cpp+1)<<16)|pTDFX->stride; 56402be438aSmrg 56502be438aSmrg TDFXMakeRoom(pTDFX, 5); 56602be438aSmrg DECLARE(SSTCP_DSTFORMAT|SSTCP_PATTERN0ALIAS 56702be438aSmrg |SSTCP_PATTERN1ALIAS|SSTCP_COLORFORE| 56802be438aSmrg SSTCP_COLORBACK); 56902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); 57002be438aSmrg pTDFX->sst2DDstFmtShadow = fmt; 57102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_PATTERN0, patx); 57202be438aSmrg TDFXWriteLong(pTDFX, SST_2D_PATTERN1, paty); 57302be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORBACK, bg); 57402be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORFORE, fg); 57502be438aSmrg} 57602be438aSmrg 57702be438aSmrgstatic void 57802be438aSmrgTDFXSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty, 57902be438aSmrg int x, int y, int w, int h) 58002be438aSmrg{ 58102be438aSmrg TDFXPtr pTDFX; 58202be438aSmrg 58302be438aSmrg TDFXTRACEACCEL("TDFXSubsequentMono8x8PatternFillRect patx=%x paty=%x" 58402be438aSmrg " x=%d y=%d w=%d h=%d\n", patx, paty, x, y, w, h); 58502be438aSmrg pTDFX=TDFXPTR(pScrn); 58602be438aSmrg 58702be438aSmrg pTDFX->Cmd |= ((patx&0x7)<<SST_2D_X_PATOFFSET_SHIFT) | 58802be438aSmrg ((paty&0x7)<<SST_2D_Y_PATOFFSET_SHIFT); 58902be438aSmrg 59002be438aSmrg TDFXSubsequentSolidFillRect(pScrn, x, y, w, h); 59102be438aSmrg} 59202be438aSmrg 59302be438aSmrgstatic void 59402be438aSmrgTDFXSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, 59502be438aSmrg unsigned int planemask) 59602be438aSmrg{ 59702be438aSmrg TDFXPtr pTDFX; 59802be438aSmrg 59902be438aSmrg TDFXTRACEACCEL("TDFXSetupForSolidLine\n"); 60002be438aSmrg pTDFX=TDFXPTR(pScrn); 60102be438aSmrg TDFXClearState(pScrn); 60202be438aSmrg 60302be438aSmrg pTDFX->Cmd = (TDFXROPCvt[rop]<<24); 60402be438aSmrg 60502be438aSmrg TDFXMakeRoom(pTDFX, 2); 60602be438aSmrg DECLARE(SSTCP_COLORFORE|SSTCP_COLORBACK); 60702be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORBACK, color); 60802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORFORE, color); 60902be438aSmrg} 61002be438aSmrg 61102be438aSmrgstatic void 61202be438aSmrgTDFXSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, int srcx, int srcy, 61302be438aSmrg int dstx, int dsty, int flags) 61402be438aSmrg{ 61502be438aSmrg /* Also used by TDFXSubsequentDashedTwoPointLine */ 61602be438aSmrg TDFXPtr pTDFX; 61702be438aSmrg 61802be438aSmrg TDFXTRACEACCEL("TDFXSubsequentSolidTwoPointLine " 61902be438aSmrg "srcx=%d srcy=%d dstx=%d dsty=%d flags=%d\n", 62002be438aSmrg srcx, srcy, dstx, dsty, flags); 62102be438aSmrg pTDFX=TDFXPTR(pScrn); 62202be438aSmrg TDFXMatchState(pTDFX); 62302be438aSmrg 62402be438aSmrg if (flags&OMIT_LAST) pTDFX->Cmd|=SST_2D_POLYLINE; 62502be438aSmrg else pTDFX->Cmd|=SST_2D_LINE; 62602be438aSmrg 62702be438aSmrg TDFXMakeRoom(pTDFX, 3); 62802be438aSmrg DECLARE(SSTCP_SRCXY|SSTCP_DSTXY|SSTCP_COMMAND); 62902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCXY, (srcy&0x1FFF)<<16 | (srcx&0x1FFF)); 63002be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTXY, (dsty&0x1FFF)<<16 | (dstx&0x1FFF)); 63102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COMMAND, pTDFX->Cmd|SST_2D_GO); 63202be438aSmrg} 63302be438aSmrg 63402be438aSmrgstatic void 63502be438aSmrgTDFXSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, int x, int y, int len, 63602be438aSmrg int dir) 63702be438aSmrg{ 63802be438aSmrg TDFXPtr pTDFX; 63902be438aSmrg 64002be438aSmrg TDFXTRACEACCEL("TDFXSubsequentSolidHorVertLine\n"); 64102be438aSmrg pTDFX=TDFXPTR(pScrn); 64202be438aSmrg TDFXMatchState(pTDFX); 64302be438aSmrg 64402be438aSmrg TDFXMakeRoom(pTDFX, 3); 64502be438aSmrg DECLARE(SSTCP_SRCXY|SSTCP_DSTXY|SSTCP_COMMAND); 64602be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCXY, (y&0x1FFF)<<16 | (x&0x1FFF)); 64702be438aSmrg if (dir == DEGREES_0) 64802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTXY, (y&0x1FFF)<<16 | ((x+len)&0x1FFF)); 64902be438aSmrg else 65002be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTXY, ((y+len)&0x1FFF)<<16 | (x&0x1FFF)); 65102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COMMAND, pTDFX->Cmd|SST_2D_POLYLINE|SST_2D_GO); 65202be438aSmrg} 65302be438aSmrg 65402be438aSmrgstatic void 65502be438aSmrgTDFXNonTEGlyphRenderer(ScrnInfoPtr pScrn, int x, int y, int n, 65602be438aSmrg NonTEGlyphPtr glyphs, BoxPtr pbox, int fg, int rop, 65702be438aSmrg unsigned int planemask) 65802be438aSmrg{ 65902be438aSmrg TDFXPtr pTDFX; 66002be438aSmrg int ndwords; 66102be438aSmrg int g; 66202be438aSmrg NonTEGlyphPtr glyph; 66302be438aSmrg 66402be438aSmrg TDFXTRACEACCEL("TDFXNonTEGlyphRenderer\n"); 66502be438aSmrg pTDFX=TDFXPTR(pScrn); 66602be438aSmrg TDFXClearState(pScrn); 66702be438aSmrg /* Don't bother fixing clip1, we're going to change it anyway */ 66802be438aSmrg pTDFX->DrawState&=~DRAW_STATE_CLIP1CHANGED; 66902be438aSmrg TDFXMatchState(pTDFX); 67002be438aSmrg /* We're changing clip1 so make sure we use it and flag it */ 67102be438aSmrg pTDFX->Cmd|=SST_2D_USECLIP1; 67202be438aSmrg pTDFX->DrawState|=DRAW_STATE_CLIP1CHANGED; 67302be438aSmrg 67402be438aSmrg pTDFX->Cmd|=(TDFXROPCvt[rop]<<24)|SST_2D_TRANSPARENT_MONOCHROME; 67502be438aSmrg pTDFX->Cmd|=SST_2D_HOSTTOSCRNBLIT; 67602be438aSmrg 67702be438aSmrg TDFXMakeRoom(pTDFX, 6); 67802be438aSmrg DECLARE(SSTCP_CLIP1MIN|SSTCP_CLIP1MAX|SSTCP_SRCFORMAT| 67902be438aSmrg SSTCP_SRCXY|SSTCP_COLORFORE|SSTCP_COMMAND); 68002be438aSmrg TDFXWriteLong(pTDFX, SST_2D_CLIP1MIN, ((pbox->y1&0x1FFF)<<16) | 68102be438aSmrg (pbox->x1&0x1FFF)); 68202be438aSmrg TDFXWriteLong(pTDFX, SST_2D_CLIP1MAX, ((pbox->y2&0x1FFF)<<16) | 68302be438aSmrg (pbox->x2&0x1FFF)); 68402be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 68502be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, SST_2D_PIXFMT_1BPP | 68602be438aSmrg SST_2D_SOURCE_PACKING_DWORD | BIT(20)); 68702be438aSmrg#else 68802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, SST_2D_PIXFMT_1BPP | 68902be438aSmrg SST_2D_SOURCE_PACKING_DWORD); 69002be438aSmrg#endif 69102be438aSmrg pTDFX->sst2DSrcFmtShadow = SST_2D_PIXFMT_1BPP | SST_2D_SOURCE_PACKING_DWORD; 69202be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCXY, 0); 69302be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORFORE, fg); 69402be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COMMAND, pTDFX->Cmd); 69502be438aSmrg 69602be438aSmrg for (g=0, glyph=glyphs; g<n; g++, glyph++) { 69702be438aSmrg int dx = x+glyph->start; 69802be438aSmrg int dy = y-glyph->yoff; 69902be438aSmrg int w = glyph->end - glyph->start; 70002be438aSmrg int *glyph_data = (int*)glyph->bits; 70102be438aSmrg 70202be438aSmrg if (!glyph->srcwidth) continue; 70302be438aSmrg ndwords = (glyph->srcwidth+3)>>2; 70402be438aSmrg ndwords *= glyph->height; 70502be438aSmrg 70602be438aSmrg TDFXMakeRoom(pTDFX, 2); 70702be438aSmrg DECLARE(SSTCP_DSTSIZE|SSTCP_DSTXY); 70802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTSIZE, ((glyph->height&0x1FFF)<<16) | 70902be438aSmrg (w&0x1FFF)); 71002be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTXY, ((dy&0x1FFF)<<16) | (dx&0x1FFF)); 71102be438aSmrg 71202be438aSmrg do { 71302be438aSmrg int i = ndwords; 71402be438aSmrg int j; 71502be438aSmrg 71602be438aSmrg if (i>30) i=30; 71702be438aSmrg TDFXMakeRoom(pTDFX, i); 71802be438aSmrg DECLARE_LAUNCH(i, 0); 71902be438aSmrg for (j=0; j<i; j++) { 72002be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 72102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_LAUNCH, *glyph_data); 72202be438aSmrg#else 72302be438aSmrg TDFXWriteLong(pTDFX, SST_2D_LAUNCH, XAAReverseBitOrder(*glyph_data)); 72402be438aSmrg#endif 72502be438aSmrg glyph_data++; 72602be438aSmrg } 72702be438aSmrg ndwords -= i; 72802be438aSmrg } while (ndwords); 72902be438aSmrg } 73002be438aSmrg} 73102be438aSmrg 73202be438aSmrgstatic void 73302be438aSmrgTDFXSetupForDashedLine(ScrnInfoPtr pScrn, int fg, int bg, int rop, 73402be438aSmrg unsigned int planemask, int length, 73502be438aSmrg unsigned char *pattern) 73602be438aSmrg{ 73702be438aSmrg TDFXPtr pTDFX; 73802be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 73902be438aSmrg unsigned int pat = *(unsigned int *)pattern; 74002be438aSmrg#endif 74102be438aSmrg 74202be438aSmrg TDFXTRACEACCEL("TDFXSetupForDashedLine\n"); 74302be438aSmrg pTDFX=TDFXPTR(pScrn); 74402be438aSmrg 74502be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 74602be438aSmrg pat=((pat & 0xAAAAAAAA) >> 1) | ((pat & 0x55555555) << 1); 74702be438aSmrg pat=((pat & 0xCCCCCCCC) >> 2) | ((pat & 0x33333333) << 2); 74802be438aSmrg pat=((pat & 0xF0F0F0F0) >> 4) | ((pat & 0x0F0F0F0F) << 4); 74902be438aSmrg pat=((pat & 0xFF00FF00) >> 8) | ((pat & 0x00FF00FF) << 8); 75002be438aSmrg pat=((pat & 0xFFFF0000) >> 16) | ((pat & 0x0000FFFF) << 16); 75102be438aSmrg#endif 75202be438aSmrg 75302be438aSmrg TDFXClearState(pScrn); 75402be438aSmrg 75502be438aSmrg pTDFX->Cmd = (TDFXROPCvt[rop]<<24) | SST_2D_STIPPLE_LINE; 75602be438aSmrg if(bg == -1) { 75702be438aSmrg pTDFX->Cmd |= SST_2D_TRANSPARENT_MONOCHROME; 75802be438aSmrg } 75902be438aSmrg pTDFX->DashedLineSize = ((length-1)&0xFF)+1; 76002be438aSmrg 76102be438aSmrg TDFXMakeRoom(pTDFX, 3); 76202be438aSmrg DECLARE(SSTCP_COLORFORE|SSTCP_COLORBACK|SSTCP_LINESTIPPLE); 76302be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 76402be438aSmrg TDFXWriteLong(pTDFX, SST_2D_LINESTIPPLE, pat); 76502be438aSmrg#else 76602be438aSmrg TDFXWriteLong(pTDFX, SST_2D_LINESTIPPLE, *(int *)pattern); 76702be438aSmrg#endif 76802be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORBACK, bg); 76902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORFORE, fg); 77002be438aSmrg} 77102be438aSmrg 77202be438aSmrgstatic void 77302be438aSmrgTDFXSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, int x1, int y1, 77402be438aSmrg int x2, int y2, int flags, int phase) 77502be438aSmrg{ 77602be438aSmrg TDFXPtr pTDFX; 77702be438aSmrg int linestyle; 77802be438aSmrg 77902be438aSmrg TDFXTRACEACCEL("TDFXSubsequentDashedTwoPointLine\n"); 78002be438aSmrg pTDFX=TDFXPTR(pScrn); 78102be438aSmrg 78202be438aSmrg linestyle = ((pTDFX->DashedLineSize-1)<<8) | 78302be438aSmrg (((phase%pTDFX->DashedLineSize)&0x1F)<<24); 78402be438aSmrg 78502be438aSmrg TDFXMakeRoom(pTDFX, 1); 78602be438aSmrg DECLARE(SSTCP_LINESTYLE); 78702be438aSmrg TDFXWriteLong(pTDFX, SST_2D_LINESTYLE, linestyle); 78802be438aSmrg 78902be438aSmrg TDFXSubsequentSolidTwoPointLine(pScrn, x1, y1, x2, y2, flags); 79002be438aSmrg} 79102be438aSmrg 79202be438aSmrg#ifdef ENABLE_SS_COLOR_EXPAND_FILL 79302be438aSmrgstatic void 79402be438aSmrgTDFXSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, int fg, int bg, 79502be438aSmrg int rop, unsigned int planemask) 79602be438aSmrg{ 79702be438aSmrg TDFXPtr pTDFX; 79802be438aSmrg 79902be438aSmrg TDFXTRACEACCEL("TDFXSetupForScreenToScreenColorExpandFill\n"); 80002be438aSmrg pTDFX=TDFXPTR(pScrn); 80102be438aSmrg TDFXClearState(pScrn); 80202be438aSmrg 80302be438aSmrg TDFXMatchState(pTDFX); 80402be438aSmrg pTDFX->Cmd|=SST_2D_SCRNTOSCRNBLIT|(TDFXROPCvt[rop]<<24); 80502be438aSmrg 80602be438aSmrg if (bg==-1) { 80702be438aSmrg pTDFX->Cmd |= SST_2D_TRANSPARENT_MONOCHROME; 80802be438aSmrg } 80902be438aSmrg TDFXMakeRoom(pTDFX, 2); 81002be438aSmrg DECLARE(SSTCP_COLORFORE|SSTCP_COLORBACK); 81102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORBACK, bg); 81202be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORFORE, fg); 81302be438aSmrg} 81402be438aSmrg 81502be438aSmrgstatic void 81602be438aSmrgTDFXSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, int y, 81702be438aSmrg int w, int h, int srcx, int srcy, 81802be438aSmrg int offset) 81902be438aSmrg{ 82002be438aSmrg TDFXPtr pTDFX; 82102be438aSmrg int fmt; 82202be438aSmrg 82302be438aSmrg TDFXTRACEACCEL("TDFXSubsequentScreenToScreenColorExpandFill " 82402be438aSmrg "x=%d y=%d w=%d h=%d srcx=%d srcy=%d offset=%d\n", 82502be438aSmrg x, y, w, h, srcx, srcy, offset); 82602be438aSmrg pTDFX=TDFXPTR(pScrn); 82702be438aSmrg /* Don't bother resetting clip1 since we're changing it anyway */ 82802be438aSmrg pTDFX->DrawState&=~DRAW_STATE_CLIP1CHANGED; 82902be438aSmrg TDFXMatchState(pTDFX); 83002be438aSmrg /* We're changing clip1 so make sure we use it and flag it */ 83102be438aSmrg pTDFX->Cmd|=SST_2D_USECLIP1; 83202be438aSmrg pTDFX->DrawState|=DRAW_STATE_CLIP1CHANGED; 83302be438aSmrg 83402be438aSmrg if (srcy>=pTDFX->prevBlitDest.y1-8 && srcy<=pTDFX->prevBlitDest.y1) { 83502be438aSmrg TDFXSendNOP(pScrn); 83602be438aSmrg } 83702be438aSmrg 83802be438aSmrg if (pTDFX->cpp==1) fmt=(1<<16)|pTDFX->stride; 83902be438aSmrg else fmt=(pTDFX->cpp+1)<<16|pTDFX->stride; 84002be438aSmrg 84102be438aSmrg TDFXMakeRoom(pTDFX, 8); 84202be438aSmrg DECLARE(SSTCP_SRCFORMAT|SSTCP_SRCXY|SSTCP_DSTFORMAT | 84302be438aSmrg SSTCP_DSTSIZE|SSTCP_DSTXY|SSTCP_COMMAND | 84402be438aSmrg SSTCP_CLIP1MIN|SSTCP_CLIP1MAX); 84502be438aSmrg TDFXWriteLong(pTDFX,SST_2D_DSTFORMAT, fmt); 84602be438aSmrg pTDFX->sst2DDstFmtShadow = fmt; 84702be438aSmrg TDFXWriteLong(pTDFX,SST_2D_CLIP1MIN, (x&0x1FFF) | ((y&0x1FFF)<<16)); 84802be438aSmrg TDFXWriteLong(pTDFX,SST_2D_CLIP1MAX, ((x+w)&0x1FFF) | (((y+h)&0x1FFF)<<16)); 84902be438aSmrg TDFXWriteLong(pTDFX,SST_2D_SRCFORMAT, pTDFX->stride); 85002be438aSmrg pTDFX->sst2DSrcFmtShadow = pTDFX->stride; 85102be438aSmrg TDFXWriteLong(pTDFX,SST_2D_SRCXY, (srcx&0x1FFF) | ((srcy&0x1FFF)<<16)); 85202be438aSmrg TDFXWriteLong(pTDFX,SST_2D_DSTSIZE, ((w+offset)&0x1FFF) | ((h&0x1FFF)<<16)); 85302be438aSmrg TDFXWriteLong(pTDFX,SST_2D_DSTXY, ((x-offset)&0x1FFF) | ((y&0x1FFF)<<16)); 85402be438aSmrg TDFXWriteLong(pTDFX,SST_2D_COMMAND, pTDFX->Cmd|SST_2D_GO); 85502be438aSmrg 85602be438aSmrg pTDFX->prevBlitDest.y1=y; 85702be438aSmrg} 85802be438aSmrg#endif 85902be438aSmrg 86002be438aSmrgstatic void 86102be438aSmrgTDFXSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int fg, int bg, 86202be438aSmrg int rop, unsigned int planemask) 86302be438aSmrg{ 86402be438aSmrg TDFXPtr pTDFX; 86502be438aSmrg 86602be438aSmrg TDFXTRACEACCEL("SetupForCPUToScreenColorExpandFill bg=%x fg=%x rop=%d\n", 86702be438aSmrg bg, fg, rop); 86802be438aSmrg pTDFX=TDFXPTR(pScrn); 86902be438aSmrg TDFXClearState(pScrn); 87002be438aSmrg 87102be438aSmrg pTDFX->Cmd|=SST_2D_HOSTTOSCRNBLIT|(TDFXROPCvt[rop]<<24); 87202be438aSmrg 87302be438aSmrg if (bg == -1) { 87402be438aSmrg pTDFX->Cmd |= SST_2D_TRANSPARENT_MONOCHROME; 87502be438aSmrg } 87602be438aSmrg 87702be438aSmrg TDFXMakeRoom(pTDFX, 2); 87802be438aSmrg DECLARE(SSTCP_COLORBACK|SSTCP_COLORFORE); 87902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORBACK, bg); 88002be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COLORFORE, fg); 88102be438aSmrg} 88202be438aSmrg 88302be438aSmrgstatic void 88402be438aSmrgTDFXSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, int y, 88502be438aSmrg int w, int h, int skipleft) 88602be438aSmrg{ 88702be438aSmrg TDFXPtr pTDFX; 88802be438aSmrg int fmt; 88902be438aSmrg 89002be438aSmrg TDFXTRACEACCEL("SubsequentCPUToScreenColorExpandFill x=%d y=%d w=%d h=%d" 89102be438aSmrg " skipleft=%d\n", x, y, w, h, skipleft); 89202be438aSmrg pTDFX = TDFXPTR(pScrn); 89302be438aSmrg 89402be438aSmrg /* We're changing clip1 anyway, so don't bother to reset it */ 89502be438aSmrg pTDFX->DrawState&=~DRAW_STATE_CLIP1CHANGED; 89602be438aSmrg TDFXMatchState(pTDFX); 89702be438aSmrg /* Make sure we use clip1 and flag it */ 89802be438aSmrg pTDFX->Cmd|=SST_2D_USECLIP1; 89902be438aSmrg pTDFX->DrawState|=DRAW_STATE_CLIP1CHANGED; 90002be438aSmrg 90102be438aSmrg if (pTDFX->cpp==1) fmt=(1<<16)|pTDFX->stride; 90202be438aSmrg else fmt=((pTDFX->cpp+1)<<16)|pTDFX->stride; 90302be438aSmrg pTDFX->scanlineWidth=w; 90402be438aSmrg 90502be438aSmrg TDFXMakeRoom(pTDFX, 8); 90602be438aSmrg DECLARE(SSTCP_CLIP1MIN|SSTCP_CLIP1MAX|SSTCP_SRCFORMAT| 90702be438aSmrg SSTCP_DSTFORMAT|SSTCP_DSTSIZE|SSTCP_SRCXY| 90802be438aSmrg SSTCP_DSTXY|SSTCP_COMMAND); 90902be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); 91002be438aSmrg pTDFX->sst2DDstFmtShadow = fmt; 91102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_CLIP1MIN, ((y&0x1FFF)<<16)|(x&0x1FFF)); 91202be438aSmrg TDFXWriteLong(pTDFX, SST_2D_CLIP1MAX, (((y+h)&0x1FFF)<<16)|((x+w)&0x1FFF)); 91302be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 91402be438aSmrg /* bit 20 byte swizzle */ 91502be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, ((((w+31)/32)*4) & 0x3FFF) | BIT(20)); 91602be438aSmrg#else 91702be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, (((w+31)/32)*4) & 0x3FFF); 91802be438aSmrg#endif 91902be438aSmrg pTDFX->sst2DSrcFmtShadow = (((w+31)/32)*4) & 0x3FFF; 92002be438aSmrg TDFXWriteLong(pTDFX, SST_2D_SRCXY, skipleft&0x1F); 92102be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTSIZE, ((w-skipleft)&0x1FFF)|((h&0x1FFF)<<16)); 92202be438aSmrg TDFXWriteLong(pTDFX, SST_2D_DSTXY, ((x+skipleft)&0x1FFF) | ((y&0x1FFF)<<16)); 92302be438aSmrg TDFXWriteLong(pTDFX, SST_2D_COMMAND, pTDFX->Cmd|SST_2D_GO); 92402be438aSmrg} 92502be438aSmrg 92602be438aSmrgstatic void TDFXSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 92702be438aSmrg{ 92802be438aSmrg TDFXPtr pTDFX; 92902be438aSmrg int i, size, cnt; 93002be438aSmrg CARD32 *pos; 93102be438aSmrg 93202be438aSmrg TDFXTRACEACCEL("SubsequentColorExpandScanline bufno=%d\n", bufno); 93302be438aSmrg pTDFX = TDFXPTR(pScrn); 93402be438aSmrg 93502be438aSmrg cnt=(pTDFX->scanlineWidth+31)/32; 93602be438aSmrg pos=(CARD32 *)pTDFX->scanlineColorExpandBuffers[bufno]; 93702be438aSmrg while (cnt>0) { 93802be438aSmrg if (cnt>64) size=64; 93902be438aSmrg else size=cnt; 94002be438aSmrg TDFXMakeRoom(pTDFX, size); 94102be438aSmrg DECLARE_LAUNCH(size, 0); 94202be438aSmrg for (i=0; i<size; i++, pos++) { 94302be438aSmrg TDFXWriteLong(pTDFX, SST_2D_LAUNCH, *pos); 94402be438aSmrg } 94502be438aSmrg cnt-=size; 94602be438aSmrg } 94702be438aSmrg} 94802be438aSmrg 949909209eeSmrg#endif 950