Link::Link(string p_name, string p_path, string p_src, string p_dst, string p_lag) { name = p_name; setSrc(p_path + p_src); setDst(p_path + p_dst); DOUBLE n = brahms::text::s2n(p_lag.c_str()); lag = n; if (n == brahms::text::S2N_FAILED || n != lag) ferr << E_SYSTEM_FILE << "invalid lag in Link"; // make inferences, as necessary - currently we don't support set // transport, so we only support the following: // // port to port A>P to B<Q // A>>X>P to B<<Y<Q if (src.type == ST_OUTPUT_PORT && dst.type == ST_INPUT_PORT) { // ok dstPortNameInferred = false; } // port to set A>P to B<<Y (to <<Y<P) // A>>X>P to B<<Y (to <<Y<P) else if (src.type == ST_OUTPUT_PORT && dst.type == ST_INPUT_SET) { // infer portname and change dst type dst.portName = src.portName; dst.type = ST_INPUT_PORT; dstPortNameInferred = true; } // port to process A>P to B (to <P) // A>>X>P to B (to <P) else if (src.type == ST_OUTPUT_PORT && dst.type == ST_PROCESS) { // infer portname and change dst type dst.portName = src.portName; dst.type = ST_INPUT_PORT; dstPortNameInferred = true; } // otherwise, raise a hand-wavy error else { ferr << E_SYSTEMML << "Link protocol either invalid or not currently supported in \"" << string(*this) << "\""; } }
static Bool prepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); G80Ptr pNv = G80PTR(pScrn); if(pPixmap->drawable.depth > 24) return FALSE; if(!setDst(pNv, pPixmap)) return FALSE; G80DmaStart(pNv, 0x2ac, 1); G80DmaNext (pNv, 4); G80SetRopSolid(pNv, alu, planemask); G80DmaStart(pNv, 0x580, 1); G80DmaNext (pNv, 4); G80DmaStart(pNv, 0x588, 1); G80DmaNext (pNv, fg); pNv->DMAKickoffCallback = G80DMAKickoffCallback; return TRUE; }
static Bool prepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int dx, int dy, int alu, Pixel planemask) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); G80Ptr pNv = G80PTR(pScrn); if(!setSrc(pNv, pSrcPixmap)) return FALSE; if(!setDst(pNv, pDstPixmap)) return FALSE; G80DmaStart(pNv, 0x2ac, 1); if(alu == GXcopy && planemask == ~0) { G80DmaNext (pNv, 3); } else { G80DmaNext (pNv, 4); G80SetRopSolid(pNv, alu, planemask); } pNv->DMAKickoffCallback = G80DMAKickoffCallback; return TRUE; }
static Bool upload(PixmapPtr pDst, int x, int y, int w, int h, char *src, int src_pitch) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); G80Ptr pNv = G80PTR(pScrn); const int Bpp = pDst->drawable.bitsPerPixel >> 3; int line_dwords = (w * Bpp + 3) / 4; const Bool kickoff = w * h >= 512; CARD32 depth; if(!setDst(pNv, pDst)) return FALSE; switch(pDst->drawable.depth) { case 8: depth = 0x000000f3; break; case 15: depth = 0x000000f8; break; case 16: depth = 0x000000e8; break; case 24: depth = 0x000000e6; break; case 32: depth = 0x000000cf; break; default: return FALSE; } G80SetClip(pNv, x, y, w, h); G80DmaStart(pNv, 0x2ac, 1); G80DmaNext (pNv, 3); G80DmaStart(pNv, 0x800, 2); G80DmaNext (pNv, 0); G80DmaNext (pNv, depth); G80DmaStart(pNv, 0x838, 10); G80DmaNext (pNv, (line_dwords * 4) / Bpp); G80DmaNext (pNv, h); G80DmaNext (pNv, 0); G80DmaNext (pNv, 1); G80DmaNext (pNv, 0); G80DmaNext (pNv, 1); G80DmaNext (pNv, 0); G80DmaNext (pNv, x); G80DmaNext (pNv, 0); G80DmaNext (pNv, y); while(h-- > 0) { int count = line_dwords; char *p = src; while(count) { int size = count > 1792 ? 1792 : count; G80DmaStart(pNv, 0x40000860, size); memcpy(&pNv->dmaBase[pNv->dmaCurrent], p, size * 4); p += size * Bpp; pNv->dmaCurrent += size; count -= size; } src += src_pitch; } if(kickoff) G80DmaKickoff(pNv); else pNv->DMAKickoffCallback = G80DMAKickoffCallback; return TRUE; }