static void Permedia2SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, unsigned int planemask, int transparency_color) { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia2SetupForScreenToScreenCopy"); pGlint->BltScanDirection = 0; if (xdir == 1) pGlint->BltScanDirection |= XPositive; if (ydir == 1) pGlint->BltScanDirection |= YPositive; GLINT_WAIT(4); DO_PLANEMASK(planemask); GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); if ((rop == GXset) || (rop == GXclear)) { pGlint->FrameBufferReadMode = pGlint->pprod; } else if ((rop == GXcopy) || (rop == GXcopyInverted)) { pGlint->FrameBufferReadMode = pGlint->pprod |FBRM_SrcEnable; } else { pGlint->FrameBufferReadMode = pGlint->pprod | FBRM_SrcEnable | FBRM_DstEnable; } LOADROP(rop); TRACE_EXIT("Permedia2SetupForScreenToScreenCopy"); }
static void Permedia2SetupForScreenToScreenCopy2432bpp(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, unsigned int planemask, int transparency_color) { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia2SetupForScreenToScreenCopy2432bpp"); pGlint->BltScanDirection = 0; if (xdir == 1) pGlint->BltScanDirection |= XPositive; if (ydir == 1) pGlint->BltScanDirection |= YPositive; if (pScrn->bitsPerPixel == 24) { GLINT_WAIT(4); } else { GLINT_WAIT(5); DO_PLANEMASK(planemask); } GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); if ((rop == GXset) || (rop == GXclear)) { GLINT_WRITE_REG(pGlint->pprod, FBReadMode); } else { if ((rop == GXcopy) || (rop == GXcopyInverted)) { GLINT_WRITE_REG(pGlint->pprod|FBRM_SrcEnable, FBReadMode); } else { GLINT_WRITE_REG(pGlint->pprod|FBRM_SrcEnable|FBRM_DstEnable, FBReadMode); } } LOADROP(rop); }
void PermediaSetupForScreenToScreenCopy (int xdir, int ydir, int rop, unsigned planemask, int transparency_color) { blitxdir = xdir; blitydir = ydir; grop = rop; GLINT_WAIT(5); DO_PLANEMASK(planemask); GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); GLINT_WRITE_REG(0, RasterizerMode); if ((rop == GXset) || (rop == GXclear)) { mode = pprod; } else if ((rop == GXcopy) || (rop == GXcopyInverted)) { mode = pprod | FBRM_SrcEnable; } else { mode = pprod | FBRM_SrcEnable | FBRM_DstEnable; } GLINT_WRITE_REG(rop<<1|UNIT_ENABLE, LogicalOpMode); if (ydir == 1) { GLINT_WRITE_REG(1<<16, dY); } else { GLINT_WRITE_REG(-1<<16, dY); } }
static void Permedia2WritePixmap8bpp( ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned char *src, int srcwidth, int rop, unsigned int planemask, int transparency_color, int bpp, int depth ) { XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); GLINTPtr pGlint = GLINTPTR(pScrn); int skipleft, dwords, count; CARD32* srcp; unsigned char *srcpbyte; Bool FastTexLoad = FALSE; TRACE_ENTER("Permedia2SubsequentMono8x8PatternFillRect24bpp"); GLINT_WAIT(3); DO_PLANEMASK(planemask); GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); if (rop == GXcopy) { GLINT_WRITE_REG(pGlint->pprod | FBRM_Packed, FBReadMode); } else { GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); } dwords = (w + 3) >> 2; #if X_BYTE_ORDER == X_LITTLE_ENDIAN if((!(x&3)) && (!(w&3))) FastTexLoad = TRUE; #endif if((rop != GXcopy) || (planemask != ~0)) FastTexLoad = FALSE; if (rop == GXcopy) { skipleft = 0; } else { if((skipleft = (long)src & 0x03)) { skipleft /= (bpp>>3); x -= skipleft; w += skipleft; src = (unsigned char*)((long)src & ~0x03); } }
static void Permedia2SetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, unsigned int planemask) { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia2SetupForSolidLine"); GLINT_WAIT(6); DO_PLANEMASK(planemask); GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); GLINT_WRITE_REG(color, GLINTColor); if (rop == GXcopy) { GLINT_WRITE_REG(pGlint->pprod, FBReadMode); } else { GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); } LOADROP(rop); }
static void Permedia2SetupForScanlineCPUToScreenColorExpandFill( ScrnInfoPtr pScrn, int fg, int bg, int rop, unsigned int planemask ){ GLINTPtr pGlint = GLINTPTR(pScrn); int dobackground = 0; TRACE_ENTER("Permedia2SetupForScanlineCPUToScreenColorExpandFill"); if (bg != -1) dobackground |= ForceBackgroundColor; pGlint->BackGroundColor = bg; pGlint->ForeGroundColor = fg; REPLICATE(fg); REPLICATE(bg); GLINT_WAIT(7); DO_PLANEMASK(planemask); if (rop == GXcopy) { GLINT_WRITE_REG(pGlint->pprod, FBReadMode); } else { GLINT_WRITE_REG(pGlint->pprod|FBRM_DstEnable, FBReadMode); } if ((rop == GXcopy) && (pGlint->BackGroundColor == -1)) { pGlint->FrameBufferReadMode = FastFillEnable; GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); GLINT_WRITE_REG(fg, FBBlockColor); GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); } else { GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); GLINT_WRITE_REG(fg, ConstantColor); GLINT_WRITE_REG(BitMaskPackingEachScanline|dobackground| pGlint->RasterizerSwap,RasterizerMode); if (dobackground) { GLINT_WRITE_REG(bg, Texel0); pGlint->FrameBufferReadMode = TextureEnable; } else { pGlint->FrameBufferReadMode = 0; } } LOADROP(rop); TRACE_EXIT("Permedia2SetupForScanlineCPUToScreenColorExpandFill"); }
static void Permedia2SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patternx, int patterny, int fg, int bg, int rop, unsigned int planemask) { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia2SetupForMono8x8PatternFill"); if (bg == -1) pGlint->FrameBufferReadMode = -1; else pGlint->FrameBufferReadMode = 0; pGlint->ForeGroundColor = fg; pGlint->BackGroundColor = bg; REPLICATE(pGlint->ForeGroundColor); REPLICATE(pGlint->BackGroundColor); #if DEBUG ErrorF("patternx: %x patterny: %x\n", patternx, patterny); #endif GLINT_WAIT(13); DO_PLANEMASK(planemask); GLINT_WRITE_REG((patternx & 0xFF), AreaStipplePattern0); GLINT_WRITE_REG((patternx & 0xFF00) >> 8, AreaStipplePattern1); GLINT_WRITE_REG((patternx & 0xFF0000) >> 16, AreaStipplePattern2); GLINT_WRITE_REG((patternx & 0xFF000000) >> 24, AreaStipplePattern3); GLINT_WRITE_REG((patterny & 0xFF), AreaStipplePattern4); GLINT_WRITE_REG((patterny & 0xFF00) >> 8, AreaStipplePattern5); GLINT_WRITE_REG((patterny & 0xFF0000) >> 16, AreaStipplePattern6); GLINT_WRITE_REG((patterny & 0xFF000000) >> 24, AreaStipplePattern7); if (rop == GXcopy) { GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); GLINT_WRITE_REG(pGlint->pprod, FBReadMode); } else { GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); } LOADROP(rop); TRACE_EXIT("Permedia2SetupForMono8x8PatternFill"); }
void PermediaSetupForFillRectSolid(int color, int rop, unsigned planemask) { REPLICATE(color); gcolor = color; grop = rop; GLINT_WAIT(7); DO_PLANEMASK(planemask); GLINT_WRITE_REG(0, RasterizerMode); if (rop == GXcopy) { mode = pprod; GLINT_WRITE_REG(pprod, FBReadMode); GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); GLINT_WRITE_REG(color, FBBlockColor); } else { mode = pprod|FBRM_DstEnable; GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); GLINT_WRITE_REG(color, ConstantColor); } GLINT_WRITE_REG(rop<<1|UNIT_ENABLE, LogicalOpMode); GLINT_WRITE_REG(1<<16, dY); }
static void Permedia2SetupForFillRectSolid(ScrnInfoPtr pScrn, int color, int rop, unsigned int planemask) { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia2SetupForFillRectSolid"); REPLICATE(color); GLINT_WAIT(6); DO_PLANEMASK(planemask); if (rop == GXcopy) { GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); GLINT_WRITE_REG(pGlint->pprod, FBReadMode); GLINT_WRITE_REG(color, FBBlockColor); } else { GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); GLINT_WRITE_REG(color, ConstantColor); /* We can use Packed mode for filling solid non-GXcopy rasters */ GLINT_WRITE_REG(pGlint->pprod|FBRM_DstEnable|FBRM_Packed, FBReadMode); } LOADROP(rop); TRACE_EXIT("Permedia2SetupForFillRectSolid"); }
static void Permedia2WriteBitmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned char *src, int srcwidth, int skipleft, int fg, int bg, int rop, unsigned int planemask ) { XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); GLINTPtr pGlint = GLINTPTR(pScrn); unsigned char *srcpntr; int dwords, height, mode; Bool SecondPass = FALSE; TRACE_ENTER("Permedia2WriteBitmap"); w += skipleft; x -= skipleft; dwords = (w + 31) >> 5; Permedia2SetClippingRectangle(pScrn,x+skipleft,y,x+w,y+h); if (pScrn->bitsPerPixel == 24) { GLINT_WAIT(10); } else { GLINT_WAIT(11); DO_PLANEMASK(planemask); } LOADROP(rop); Permedia2LoadCoord(pScrn, x&0xFFFF, y, w, h); if (rop == GXcopy) { GLINT_WRITE_REG(pGlint->pprod, FBReadMode); } else { GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); } if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { mode = FastFillEnable; GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); } else { mode = 0; GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); GLINT_WRITE_REG(BitMaskPackingEachScanline| pGlint->RasterizerSwap,RasterizerMode); } if(bg == -1) { REPLICATE(fg); if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { GLINT_WRITE_REG(fg, FBBlockColor); } else { GLINT_WRITE_REG(fg, ConstantColor); } } else if((rop == GXcopy) && (pScrn->bitsPerPixel != 24)) { REPLICATE(bg); GLINT_WRITE_REG(bg, FBBlockColor); GLINT_WRITE_REG(PrimitiveRectangle | XPositive |YPositive |mode,Render); REPLICATE(fg); GLINT_WRITE_REG(fg, FBBlockColor); } else { SecondPass = TRUE; REPLICATE(fg); if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { GLINT_WRITE_REG(fg, FBBlockColor); } else { GLINT_WRITE_REG(fg, ConstantColor); } } SECOND_PASS: GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | mode | SyncOnBitMask, Render); height = h; srcpntr = src; while(height--) { GLINT_WAIT(dwords + 1); /* 0x0D is the TAG value for BitMaskPattern */ GLINT_WRITE_REG(((dwords - 1) << 16) | 0x0D, OutputFIFO); GLINT_MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), (CARD32 *)srcpntr, dwords); srcpntr += srcwidth; } if(SecondPass) { SecondPass = FALSE; REPLICATE(bg); GLINT_WAIT(3); if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { GLINT_WRITE_REG(InvertBitMask|pGlint->RasterizerSwap,RasterizerMode); GLINT_WRITE_REG(bg, FBBlockColor); } else { GLINT_WRITE_REG(InvertBitMask|BitMaskPackingEachScanline| pGlint->RasterizerSwap, RasterizerMode); GLINT_WRITE_REG(bg, ConstantColor); } goto SECOND_PASS; } GLINT_WAIT(1); GLINT_WRITE_REG(pGlint->RasterizerSwap, RasterizerMode); Permedia2DisableClipping(pScrn); SET_SYNC_FLAG(infoRec); TRACE_EXIT("Permedia2WriteBitmap"); }