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