[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#246782: [davem@redhat.com: Fw: Re: Kernel 2.6.x breaks X on blade 100]



Here's the patch. Dave tested a build that included it and things
worked.

-- 
Debian     - http://www.debian.org/
Linux 1394 - http://www.linux1394.org/
Subversion - http://subversion.tigris.org/
WatchGuard - http://www.watchguard.com/
diff -urN xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/Imakefile xc/programs/Xserver/hw/xfree86/drivers/sunffb/Imakefile
--- xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/Imakefile	2002-09-16 14:06:01.000000000 -0400
+++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/Imakefile	2004-06-10 23:38:50.706539152 -0400
@@ -77,11 +77,13 @@
 INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \
            -I$(SERVERSRC)/mfb -I$(SERVERSRC)/mi \
            -I$(SERVERSRC)/Xext -I$(SERVERSRC)/cfb \
-	   -I$(SERVERSRC)/dbe \
+	   -I$(SERVERSRC)/dbe -I$(SERVERSRC)/fb \
+	   -I$(SERVERSRC)/render \
 	   -I$(XF86SRC)/xf8_32wid \
 	   -I$(XF86SRC)/ramdac \
 	   -I$(XF86SRC)/ddc \
 	   -I$(XF86SRC)/i2c \
+	   -I$(XF86SRC)/xaa \
            -I$(FONTINCSRC) -I$(SERVERSRC)/include -I$(XINCLUDESRC) \
 	   -I$(EXTINCSRC) \
 	   $(DRIINCLUDES)
diff -urN xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb.h xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb.h
--- xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb.h	2002-12-05 21:44:03.000000000 -0500
+++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb.h	2004-06-10 23:38:50.709538696 -0400
@@ -33,6 +33,7 @@
 #include "xf86_OSproc.h"
 #include "xf86_ansic.h"
 #include "xf86RamDac.h"
+#include "xaa.h"
 #include "Xmd.h"
 #include "gcstruct.h"
 #include "windowstr.h"
@@ -188,6 +189,19 @@
 	unsigned char has_z_buffer;
 	unsigned char has_double_buffer;
 
+	/* XAA related info */
+	XAAInfoRecPtr pXAAInfo;
+	unsigned int xaa_fbc;
+	unsigned int xaa_wid;
+	unsigned int xaa_planemask;
+	unsigned int xaa_linepat;
+	int xaa_xdir, xaa_ydir, xaa_rop;
+	unsigned char *xaa_scanline_buffers[2];
+	int xaa_scanline_x, xaa_scanline_y, xaa_scanline_w;
+	unsigned char *xaa_tex;
+	int xaa_tex_pitch, xaa_tex_width, xaa_tex_height;
+	unsigned int xaa_tex_color;
+
 	enum ffb_resolution ffb_res;
 	BoxRec ClippedBoxBuf[64];
 	xRectangle Pf_Fixups[4];
diff -urN xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_accel.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_accel.c
--- xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_accel.c	2001-03-03 17:41:34.000000000 -0500
+++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_accel.c	2004-06-10 23:38:50.738534288 -0400
@@ -30,22 +30,9 @@
 #include	"pixmapstr.h"
 #include	"regionstr.h"
 #include	"mistruct.h"
-#include	"fontstruct.h"
-#include	"dixfontstr.h"
-#define PSZ 8
-#include	"cfb.h"
-#undef PSZ
-#include	"cfb32.h"
-#include	"mibstore.h"
-#include	"mifillarc.h"
-#include	"miwideline.h"
 #include	"miline.h"
-#include	"fastblt.h"
-#include	"mergerop.h"
-#include	"migc.h"
-#include	"mi.h"
-
-#include	"cfb8_32wid.h"
+#include	"fb.h"
+#include	"xaa.h"
 
 #include	"ffb.h"
 #include	"ffb_fifo.h"
@@ -69,690 +56,776 @@
 /*XXX*/	{  0x00c0, 0x0a00, 0x04, 0x08, 0x08, 0x50 },	/* Portrait: 1280 x 2048 XXX */
 };
 
-static Bool
-CreatorCreateWindow (WindowPtr pWin)
+void
+CreatorVtChange (ScreenPtr pScreen, int enter)
 {
-	ScreenPtr pScreen = pWin->drawable.pScreen;
-	FFBPtr pFfb = GET_FFB_FROM_SCREEN(pScreen);
-	CreatorPrivWinPtr pFfbPrivWin;
-	unsigned int fbc;
-	int depth = (pWin->drawable.depth == 8) ? 8 : 24;
-	int i, visual, visclass;
+	FFBPtr pFfb = GET_FFB_FROM_SCREEN (pScreen);
+	ffb_fbcPtr ffb = pFfb->regs;
 
-	if (depth == 8) {
-		if (!cfbCreateWindow (pWin))
-			return FALSE;
-	} else {
-		if (!cfb32CreateWindow (pWin))
-			return FALSE;
-	}
+	pFfb->rp_active = 1;
+	FFBWait(pFfb, ffb);	
+	pFfb->fifo_cache = -1;
+	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED |
+			   FFB_FBC_RB_A | FFB_FBC_SB_BOTH| FFB_FBC_XE_OFF |
+			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_MASK);
+	pFfb->ppc_cache = (FFB_PPC_FW_DISABLE |
+			   FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST |
+			   FFB_PPC_XS_CONST | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST|
+			   FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE);
 
-	pFfbPrivWin = xalloc(sizeof(CreatorPrivWinRec));
-	if (!pFfbPrivWin)
-		return FALSE;
+	pFfb->pmask_cache = ~0;
+	pFfb->rop_cache = FFB_ROP_EDIT_BIT;
+	pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE;
+	pFfb->fg_cache = pFfb->bg_cache = 0;
+	pFfb->fontw_cache = 32;
+	pFfb->fontinc_cache = (1 << 16) | 0;
+	pFfb->laststipple = NULL;
+	FFBFifo(pFfb, 9);
+	ffb->fbc = pFfb->fbc_cache;
+	ffb->ppc = pFfb->ppc_cache;
+	ffb->pmask = pFfb->pmask_cache;
+	ffb->rop = pFfb->rop_cache;
+	ffb->drawop = pFfb->drawop_cache;
+	ffb->fg = pFfb->fg_cache;
+	ffb->bg = pFfb->bg_cache;
+	ffb->fontw = pFfb->fontw_cache;
+	ffb->fontinc = pFfb->fontinc_cache;
+	pFfb->rp_active = 1;
+	FFBWait(pFfb, ffb);
 
-	fbc  = FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A;
-	fbc |= FFB_FBC_WE_FORCEON;
-	fbc |= FFB_FBC_SB_BOTH;
-	fbc |= FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF;
-	if (depth == 8)
-		fbc |= (FFB_FBC_RE_MASK | FFB_FBC_GE_OFF | FFB_FBC_BE_OFF);
-	else
-		fbc |= FFB_FBC_RGBE_MASK;
-	fbc |= FFB_FBC_XE_ON;
-	pFfbPrivWin->fbc_base = fbc;
-
-	visual = wVisual(pWin);
-	visclass = 0;
-	for (i = 0; i < pScreen->numVisuals; i++) {
-		if (pScreen->visuals[i].vid == visual) {
-			visclass = pScreen->visuals[i].class;
-			break;
-		}
-	}
+	/* Fixup the FBC/PPC caches to deal with actually using
+	 * a WID for every ROP.
+	 */
+	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED |
+			   FFB_FBC_RB_A | FFB_FBC_SB_BOTH | FFB_FBC_XE_ON |
+			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_ON);
+	pFfb->ppc_cache &= ~FFB_PPC_XS_MASK;
+	pFfb->ppc_cache |= FFB_PPC_XS_WID;
+	pFfb->wid_cache = (enter ? pFfb->xaa_wid : 0xff);
+	FFBFifo(pFfb, 11);
+	ffb->fbc = pFfb->fbc_cache;
+	ffb->ppc = FFB_PPC_XS_WID;
+	ffb->wid = pFfb->wid_cache;
+	ffb->xpmask = 0xff;
+	ffb->xclip = FFB_XCLIP_TEST_ALWAYS;
+	ffb->cmp = 0x80808080;
+	ffb->matchab = 0x80808080;
+	ffb->magnab = 0x80808080;
+	ffb->blendc = (FFB_BLENDC_FORCE_ONE |
+		       FFB_BLENDC_DF_ONE_M_A |
+		       FFB_BLENDC_SF_A);
+	ffb->blendc1 = 0;
+	ffb->blendc2 = 0;
+	pFfb->rp_active = 1;
+	FFBWait(pFfb, ffb);
 
-	pFfbPrivWin->wid = FFBWidAlloc(pFfb, visclass, wColormap(pWin), TRUE);
-	if (pFfbPrivWin->wid == (unsigned int) -1) {
-		xfree(pFfbPrivWin);
-		return FALSE;
-	}
-	FFBLOG(("CreatorCreateWindow: pWin %p depth %d wid %x fbc_base %x\n",
-		pWin, depth, pFfbPrivWin->wid, pFfbPrivWin->fbc_base));
+	if (enter) {
+		pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE;
 
-	pFfbPrivWin->Stipple = NULL;
-	CreatorSetWindowPrivate(pWin, pFfbPrivWin);
+		FFBFifo(pFfb, 5);
+		ffb->drawop = pFfb->drawop_cache;
+		FFB_WRITE64(&ffb->by, 0, 0);
+		FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width);
+		pFfb->rp_active = 1;
+		FFBWait(pFfb, ffb);
 
-	return TRUE;
+		SET_SYNC_FLAG(pFfb->pXAAInfo);
+	}
 }
 
-static Bool
-CreatorDestroyWindow (WindowPtr pWin)
+#ifdef DEBUG_FFB
+FILE *FDEBUG_FD = NULL;
+#endif
+
+#define FFB_ATTR_SFB_VAR_XAA(__fpriv, __pmask, __alu) \
+do {	unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \
+	unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \
+	unsigned int __rop = (FFB_ROP_EDIT_BIT | (__alu))|(FFB_ROP_NEW<<8); \
+	unsigned int __fbc = (__fpriv)->xaa_fbc; \
+	unsigned int __wid = (__fpriv)->xaa_wid; \
+	if (((__fpriv)->ppc_cache & __ppc_mask) != __ppc || \
+	    (__fpriv)->fbc_cache != __fbc || \
+	    (__fpriv)->wid_cache != __wid || \
+	    (__fpriv)->rop_cache != __rop || \
+	    (__fpriv)->pmask_cache != (__pmask)) \
+		__FFB_Attr_SFB_VAR(__fpriv, __ppc, __ppc_mask, __fbc, \
+				   __wid, __rop, (__pmask)); \
+} while(0)
+
+#define FFB_ATTR_VSCROLL_XAA(__fpriv, __pmask) \
+do {	unsigned int __rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \
+	unsigned int __fbc = (__fpriv)->xaa_fbc; \
+	if ((__fpriv)->fbc_cache != __fbc || \
+	    (__fpriv)->rop_cache != __rop || \
+	    (__fpriv)->pmask_cache != (__pmask) || \
+	    (__fpriv)->drawop_cache != FFB_DRAWOP_VSCROLL) { \
+		ffb_fbcPtr __ffb = (__fpriv)->regs; \
+		(__fpriv)->fbc_cache = __fbc; \
+		(__fpriv)->rop_cache = __rop; \
+		(__fpriv)->pmask_cache = (__pmask); \
+		(__fpriv)->drawop_cache = FFB_DRAWOP_VSCROLL; \
+		(__fpriv)->rp_active = 1; \
+		FFBFifo(__fpriv, 4); \
+		(__ffb)->fbc = __fbc; \
+		(__ffb)->rop = __rop; \
+		(__ffb)->pmask = (__pmask); \
+		(__ffb)->drawop = FFB_DRAWOP_VSCROLL; \
+	} \
+} while(0)
+
+static CARD32 FFBAlphaTextureFormats[2] = { PICT_a8, 0 };
+static CARD32 FFBTextureFormats[2] = { PICT_a8b8g8r8, 0 };
+
+static void FFB_SetupTextureAttrs(FFBPtr pFfb)
 {
-	FFBPtr pFfb = GET_FFB_FROM_SCREEN(pWin->drawable.pScreen);
-	CreatorPrivWinPtr pFfbPrivWin;
-	int depth = (pWin->drawable.depth == 8) ? 8 : 24;
-
-	FFBLOG(("CreatorDestroyWindow: pWin %p depth %d\n", pWin, depth));
-	pFfbPrivWin = CreatorGetWindowPrivate(pWin);
-	if (pFfbPrivWin->Stipple)
-		xfree(pFfbPrivWin->Stipple);
-	FFBWidFree(pFfb, pFfbPrivWin->wid);
-	xfree(pFfbPrivWin);
+	ffb_fbcPtr ffb = pFfb->regs;
+	unsigned int ppc = FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_VAR;
+	unsigned int ppc_mask = FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK;
+	unsigned int rop = FFB_ROP_NEW | (FFB_ROP_NEW << 8);
+	unsigned int fbc = pFfb->xaa_fbc;
+	unsigned int wid = pFfb->xaa_wid;
+
+	ppc |= FFB_PPC_ABE_ENABLE;
+	ppc_mask |= FFB_PPC_ABE_MASK;
+
+	if ((pFfb->ppc_cache & ppc_mask) != ppc ||
+	    pFfb->fbc_cache != fbc ||
+	    pFfb->wid_cache != wid ||
+	    pFfb->rop_cache != rop ||
+	    pFfb->pmask_cache != 0xffffffff)
+		__FFB_Attr_SFB_VAR(pFfb, ppc, ppc_mask, fbc,
+				   wid, rop, 0xffffffff);
+	FFBWait(pFfb, ffb);
 
-	if (depth == 8)
-		return cfbDestroyWindow (pWin);
-	else
-		return cfb32DestroyWindow (pWin);
 }
 
-extern CreatorStipplePtr FFB_tmpStipple;
+static Bool FFB_SetupForCPUToScreenAlphaTexture(ScrnInfoPtr pScrn, int op,
+						CARD16 red, CARD16 green, CARD16 blue,
+						CARD16 alpha, int alphaType,
+						CARD8 *alphaPtr, int alphaPitch,
+						int width, int height, int flags)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
 
-static int
-CreatorChangeWindowAttributes (WindowPtr pWin, Mask mask)
+	FFBLOG(("FFB_SetupForCPUToScreenAlphaTexture: "
+		"argb[%04x:%04x:%04x:%04x] alpha[T(%x):P(%d)] "
+		"wh[%d:%d] flgs[%x]\n",
+		alpha, red, green, blue,
+		alphaType, alphaPitch,
+		width, height, flags));
+
+	FFB_SetupTextureAttrs(pFfb);
+
+	pFfb->xaa_tex = (unsigned char *) alphaPtr;
+	pFfb->xaa_tex_pitch = alphaPitch;
+	pFfb->xaa_tex_width = width;
+	pFfb->xaa_tex_height = height;
+	pFfb->xaa_tex_color = (/*((alpha >> 8) << 24) |*/
+			       ((blue >> 8) << 16) |
+			       ((green >> 8) << 8) |
+			       ((red >> 8) << 0));
+	return TRUE;
+}
+
+static void FFB_SubsequentCPUToScreenAlphaTexture(ScrnInfoPtr pScrn,
+						  int dstx, int dsty,
+						  int srcx, int srcy,
+						  int width, int height)
 {
-	FFBPtr pFfb = GET_FFB_FROM_SCREEN(pWin->drawable.pScreen);
-	CreatorPrivWinPtr pFfbPrivWin;
-	CreatorStipplePtr stipple;
-	Mask index;
-	WindowPtr pBgWin;
-	register cfbPrivWin *pPrivWin;
-	int width, depth;
-
-	FFBLOG(("CreatorChangeWindowAttributes: WIN(%p) mask(%08x)\n", pWin, mask));
-	pPrivWin = (cfbPrivWin *)(pWin->devPrivates[cfbWindowPrivateIndex].ptr);
-	pFfbPrivWin = CreatorGetWindowPrivate(pWin);
-	depth = pWin->drawable.depth;
-
-	/*
-	 * When background state changes from ParentRelative and
-	 * we had previously rotated the fast border pixmap to match
-	 * the parent relative origin, rerotate to match window
-	 */
-	if (mask & (CWBackPixmap | CWBackPixel) &&
-	    pWin->backgroundState != ParentRelative &&
-	    pPrivWin->fastBorder &&
-	    (pPrivWin->oldRotate.x != pWin->drawable.x ||
-	     pPrivWin->oldRotate.y != pWin->drawable.y)) {
-		if (depth == 8) {
-			cfbXRotatePixmap(pPrivWin->pRotatedBorder,
-					 pWin->drawable.x - pPrivWin->oldRotate.x);
-			cfbYRotatePixmap(pPrivWin->pRotatedBorder,
-					 pWin->drawable.y - pPrivWin->oldRotate.y);
-		} else {
-			cfb32XRotatePixmap(pPrivWin->pRotatedBorder,
-					   pWin->drawable.x - pPrivWin->oldRotate.x);
-			cfb32YRotatePixmap(pPrivWin->pRotatedBorder,
-					   pWin->drawable.y - pPrivWin->oldRotate.y);
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	unsigned char *dst_base, *alpha_base, *sfb32;
+	unsigned int pixel_base;
+	int psz_shift = 2;
+
+	FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: "
+		"dst[%d:%d] src[%d:%d] wh[%d:%d]\n",
+		dstx, dsty, srcx, srcy, width, height));
+
+	sfb32 = (unsigned char *) pFfb->sfb32;
+	dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift);
+	alpha_base = pFfb->xaa_tex;
+	alpha_base += srcx;
+	if (srcy)
+		alpha_base += (srcy * pFfb->xaa_tex_pitch);
+	pixel_base = pFfb->xaa_tex_color;
+	while (height--) {
+		unsigned int *dst = (unsigned int *) dst_base;
+		unsigned char *alpha = alpha_base;
+		int w = width;
+
+		while (w--) {
+			(*dst) = (((unsigned int)*alpha << 24) | pixel_base);
+			dst++;
+			alpha++;
 		}
-		pPrivWin->oldRotate.x = pWin->drawable.x;
-		pPrivWin->oldRotate.y = pWin->drawable.y;
+		dst_base += (2048 << psz_shift);
+		alpha_base += pFfb->xaa_tex_pitch;
 	}
-	while (mask) {
-		index = lowbit(mask);
-		mask &= ~index;
-		switch (index) {
-		case CWBackPixmap:
-			stipple = pFfbPrivWin->Stipple;
-			if (pWin->backgroundState == None ||
-			    pWin->backgroundState == ParentRelative) {
-				pPrivWin->fastBackground = FALSE;
-				if (stipple) {
-					xfree (stipple);
-					pFfbPrivWin->Stipple = NULL;
-				}
-				/* Rotate border to match parent origin */
-				if (pWin->backgroundState == ParentRelative &&
-				    pPrivWin->pRotatedBorder)  {
-					for (pBgWin = pWin->parent;
-					     pBgWin->backgroundState == ParentRelative;
-					     pBgWin = pBgWin->parent);
-					if (depth == 8) {
-						cfbXRotatePixmap(pPrivWin->pRotatedBorder,
-								 pBgWin->drawable.x - pPrivWin->oldRotate.x);
-						cfbYRotatePixmap(pPrivWin->pRotatedBorder,
-								 pBgWin->drawable.y - pPrivWin->oldRotate.y);
-					} else {
-						cfb32XRotatePixmap(pPrivWin->pRotatedBorder,
-								   pBgWin->drawable.x - pPrivWin->oldRotate.x);
-						cfb32YRotatePixmap(pPrivWin->pRotatedBorder,
-								   pBgWin->drawable.y - pPrivWin->oldRotate.y);
-					}
-					pPrivWin->oldRotate.x = pBgWin->drawable.x;
-					pPrivWin->oldRotate.y = pBgWin->drawable.y;
-				}
-				break;
-			}
-			if (!stipple) {
-				if (!FFB_tmpStipple)
-					FFB_tmpStipple = (CreatorStipplePtr)
-						xalloc (sizeof *FFB_tmpStipple);
-				stipple = FFB_tmpStipple;
-			}
-			if (stipple) {
-				int ph = FFB_FFPARMS(pFfb).pagefill_height;
+}
 
-				if (CreatorCheckTile (pWin->background.pixmap, stipple,
-						      ((DrawablePtr)pWin)->x & 31,
-						      ((DrawablePtr)pWin)->y & 31, ph)) {
-					stipple->alu = GXcopy;
-					pPrivWin->fastBackground = FALSE;
-					if (stipple == FFB_tmpStipple) {
-						pFfbPrivWin->Stipple = stipple;
-						FFB_tmpStipple = 0;
-					}
-					break;
-				}
-			}
-			if ((stipple = pFfbPrivWin->Stipple) != NULL) {
-				xfree (stipple);
-				pFfbPrivWin->Stipple = NULL;
-			}
-			if (((width = (pWin->background.pixmap->drawable.width *
-				       pWin->background.pixmap->drawable.bitsPerPixel)) <= 32) &&
-			    !(width & (width - 1))) {
-				if (depth == 8) {
-					cfbCopyRotatePixmap(pWin->background.pixmap,
-							    &pPrivWin->pRotatedBackground,
-							    pWin->drawable.x,
-							    pWin->drawable.y);
-				} else {
-					cfb32CopyRotatePixmap(pWin->background.pixmap,
-							      &pPrivWin->pRotatedBackground,
-							      pWin->drawable.x,
-							      pWin->drawable.y);
-				}
-				if (pPrivWin->pRotatedBackground) {
-					pPrivWin->fastBackground = TRUE;
-					pPrivWin->oldRotate.x = pWin->drawable.x;
-					pPrivWin->oldRotate.y = pWin->drawable.y;
-				} else
-					pPrivWin->fastBackground = FALSE;
-				break;
-			}
-			pPrivWin->fastBackground = FALSE;
-			break;
+static Bool FFB_SetupForCPUToScreenTexture(ScrnInfoPtr pScrn, int op,
+					   int texType,
+					   CARD8 *texPtr, int texPitch,
+					   int width, int height, int flags)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+
+	FFBLOG(("FFB_SetupForCPUToScreenTexture: "
+		"TEX[T(%x):P(%d)] "
+		"wh[%d:%d] flgs[%x]\n",
+		texType, texPitch,
+		width, height, flags));
+
+	FFB_SetupTextureAttrs(pFfb);
+
+	pFfb->xaa_tex = (unsigned char *) texPtr;
+	pFfb->xaa_tex_pitch = texPitch;
+	pFfb->xaa_tex_width = width;
+	pFfb->xaa_tex_height = height;
+
+	return TRUE;
+}
+
+static void FFB_SubsequentCPUToScreenTexture(ScrnInfoPtr pScrn,
+					     int dstx, int dsty,
+					     int srcx, int srcy,
+					     int width, int height)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	unsigned char *dst_base, *sfb32;
+	unsigned int *tex_base;
+	int psz_shift = 2;
+
+	FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: "
+		"dst[%d:%d] src[%d:%d] wh[%d:%d]\n",
+		dstx, dsty, srcx, srcy, width, height));
+
+	sfb32 = (unsigned char *) pFfb->sfb32;
+	dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift);
+	tex_base = (unsigned int *) pFfb->xaa_tex;
+	tex_base += srcx;
+	if (srcy)
+		tex_base += (srcy * pFfb->xaa_tex_pitch);
+	while (height--) {
+		unsigned int *dst = (unsigned int *) dst_base;
+		unsigned int *tex = tex_base;
+		int w = width;
 
-		case CWBackPixel:
-			pPrivWin->fastBackground = FALSE;
-			break;
-
-		case CWBorderPixmap:
-			/* don't bother with accelerator for border tiles (just lazy) */
-			if (((width = (pWin->border.pixmap->drawable.width *
-				       pWin->border.pixmap->drawable.bitsPerPixel)) <= 32) &&
-			    !(width & (width - 1))) {
-				for (pBgWin = pWin;
-				     pBgWin->backgroundState == ParentRelative;
-				     pBgWin = pBgWin->parent)
-					;
-				if (depth == 8) {
-					cfbCopyRotatePixmap(pWin->border.pixmap,
-							    &pPrivWin->pRotatedBorder,
-							    pBgWin->drawable.x,
-							    pBgWin->drawable.y);
-				} else {
-					cfb32CopyRotatePixmap(pWin->border.pixmap,
-							      &pPrivWin->pRotatedBorder,
-							      pBgWin->drawable.x,
-							      pBgWin->drawable.y);
-				}
-				if (pPrivWin->pRotatedBorder) {
-					pPrivWin->fastBorder = TRUE;
-					pPrivWin->oldRotate.x = pBgWin->drawable.x;
-					pPrivWin->oldRotate.y = pBgWin->drawable.y;
-				} else
-					pPrivWin->fastBorder = FALSE;
-			} else
-				pPrivWin->fastBorder = FALSE;
-			break;
-			
-		case CWBorderPixel:
-			pPrivWin->fastBorder = FALSE;
-			break;
+		while (w--) {
+			(*dst) = *tex;
+
+			dst++;
+			tex++;
 		}
+		dst_base += (2048 << psz_shift);
+		tex_base += pFfb->xaa_tex_pitch;
 	}
-	return (TRUE);
 }
 
-static void
-CreatorPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
+static void FFB_WritePixmap(ScrnInfoPtr pScrn,
+			    int x, int y, int w, int h,
+			    unsigned char *src,
+			    int srcwidth,
+			    int rop,
+			    unsigned int planemask,
+			    int trans, int bpp, int depth)
 {
-	FFBPtr pFfb = GET_FFB_FROM_SCREEN (pWin->drawable.pScreen);
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
 	ffb_fbcPtr ffb = pFfb->regs;
-	register cfbPrivWin *pPrivWin;
-	CreatorPrivWinPtr pFfbPrivWin;
-	CreatorStipplePtr stipple;
-	WindowPtr pBgWin;
-	int depth = pWin->drawable.depth;
-
-	if (pFfb->vtSema)
-		return;
-
-	FFBLOG(("CreatorPaintWindow: WIN(%p) what(%d)\n", pWin, what));
-	pPrivWin = cfbGetWindowPrivate(pWin);
-	pFfbPrivWin = CreatorGetWindowPrivate(pWin);
-	switch (what) {
-	case PW_BACKGROUND:
-		stipple = pFfbPrivWin->Stipple;
-		switch (pWin->backgroundState) {
-		case None:
-			return;
-		case ParentRelative:
-			do {
-				pWin = pWin->parent;
-			} while (pWin->backgroundState == ParentRelative);
-			(*pWin->drawable.pScreen->PaintWindowBackground)(pWin, pRegion, what);
-			return;
-		case BackgroundPixmap:
-			if (stipple) {
-				CreatorFillBoxStipple ((DrawablePtr)pWin, 
-						       (int)REGION_NUM_RECTS(pRegion),
-						       REGION_RECTS(pRegion),
-						       stipple);
-				return;
-			}
-			FFB_ATTR_SFB_VAR_WIN(pFfb, 0x00ffffff, GXcopy, pWin);
-			FFBWait(pFfb, ffb);
-			if (pPrivWin->fastBackground) {
-				if (depth == 8) {
-					cfbFillBoxTile32 ((DrawablePtr)pWin,
-							  (int)REGION_NUM_RECTS(pRegion),
-							  REGION_RECTS(pRegion),
-							  pPrivWin->pRotatedBackground);
-				} else {
-					cfb32FillBoxTile32 ((DrawablePtr)pWin,
-							    (int)REGION_NUM_RECTS(pRegion),
-							    REGION_RECTS(pRegion),
-							    pPrivWin->pRotatedBackground);
-				}
-			} else {
-				if (depth == 8) {
-					cfbFillBoxTileOdd ((DrawablePtr)pWin,
-							   (int)REGION_NUM_RECTS(pRegion),
-							   REGION_RECTS(pRegion),
-							   pWin->background.pixmap,
-							   (int) pWin->drawable.x,
-							   (int) pWin->drawable.y);
-				} else {
-					cfb32FillBoxTileOdd ((DrawablePtr)pWin,
-							     (int)REGION_NUM_RECTS(pRegion),
-							     REGION_RECTS(pRegion),
-							     pWin->background.pixmap,
-							     (int) pWin->drawable.x,
-							     (int) pWin->drawable.y);
-				}
-			}
-			return;
-		case BackgroundPixel:
-			CreatorFillBoxSolid ((DrawablePtr)pWin,
-					     (int)REGION_NUM_RECTS(pRegion),
-					     REGION_RECTS(pRegion),
-					     pWin->background.pixel);
-			return;
-		}
-		break;
-	case PW_BORDER:
-		if (pWin->borderIsPixel) {
-			CreatorFillBoxSolid ((DrawablePtr)pWin,
-					     (int)REGION_NUM_RECTS(pRegion),
-					     REGION_RECTS(pRegion),
-					     pWin->border.pixel);
-			return;
-		}
-		FFB_ATTR_SFB_VAR_WIN(pFfb, 0x00ffffff, GXcopy, pWin);
-		FFBWait(pFfb, ffb);
-		if (pPrivWin->fastBorder) {
-			if (depth == 8) {
-				cfbFillBoxTile32 ((DrawablePtr)pWin,
-						  (int)REGION_NUM_RECTS(pRegion),
-						  REGION_RECTS(pRegion),
-						  pPrivWin->pRotatedBorder);
-			} else {
-				cfb32FillBoxTile32 ((DrawablePtr)pWin,
-						    (int)REGION_NUM_RECTS(pRegion),
-						    REGION_RECTS(pRegion),
-						    pPrivWin->pRotatedBorder);
-			}
+	unsigned char *dst, *sfb32;
+	int psz_shift = 2;
+
+	FFBLOG(("FFB_WritePixmap: "
+		"x[%d] y[%d] w[%d] h[%d] srcw[%d] rop[%d] pmask[%x] "
+		"trans[%d] bpp[%d] depth[%d]\n",
+		x, y, w, h, srcwidth, rop, planemask,
+		trans, bpp, depth));
+
+	FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop);
+	FFBWait(pFfb, ffb);
+
+	sfb32 = (unsigned char *) pFfb->sfb32;
+	dst = sfb32 + (y * (2048 << psz_shift)) + (x << psz_shift);
+	VISmoveImageLR(src, dst, w << psz_shift, h,
+		       srcwidth, (2048 << psz_shift));
+}
+
+static void FFB_SetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
+					   int pat_word1, int pat_word2,
+					   int fg, int bg, int rop,
+					   unsigned int planemask)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+	unsigned int ppc, ppc_mask, fbc;
+	int i;
+
+	FFBLOG(("FFB_SetupForMono8x8PatternFill: "
+		"pat[%08x:%08x] fg[%x] bg[%x] rop[%d] pmask[%x]\n",
+		pat_word1, pat_word2,
+		fg, bg, rop, planemask));
+
+	ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_ENABLE | FFB_PPC_CS_CONST;
+	if (bg < 0)
+		ppc |= FFB_PPC_TBE_TRANSPARENT;
+	else
+		ppc |= FFB_PPC_TBE_OPAQUE;
+	ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK |
+	  FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK;
+	fbc = pFfb->xaa_fbc;
+	rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8);
+
+	FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, rop,
+		     FFB_DRAWOP_RECTANGLE, fg, fbc, pFfb->xaa_wid);
+	if (bg >= 0)
+		FFB_WRITE_BG(pFfb, ffb, bg);
+
+	FFBFifo(pFfb, 32);
+	for (i = 0; i < 32; i += 2) {
+		CARD32 val1, val2;
+		int shift = (24 - ((i % 4) * 8));
+
+		if ((i % 8) < 4) {
+			val1 = (pat_word1 >> shift) & 0xff;
+			val2 = (pat_word1 >> (shift + 8)) & 0xff;
 		} else {
-			for (pBgWin = pWin;
-			     pBgWin->backgroundState == ParentRelative;
-			     pBgWin = pBgWin->parent)
-				;
-
-			if (depth == 8) {
-				cfbFillBoxTileOdd ((DrawablePtr)pWin,
-						   (int)REGION_NUM_RECTS(pRegion),
-						   REGION_RECTS(pRegion),
-						   pWin->border.pixmap,
-						   (int) pBgWin->drawable.x,
-						   (int) pBgWin->drawable.y);
-			} else {
-				cfb32FillBoxTileOdd ((DrawablePtr)pWin,
-						     (int)REGION_NUM_RECTS(pRegion),
-						     REGION_RECTS(pRegion),
-						     pWin->border.pixmap,
-						     (int) pBgWin->drawable.x,
-						     (int) pBgWin->drawable.y);
-			}
+			val1 = (pat_word2 >> shift) & 0xff;
+			val2 = (pat_word2 >> (shift + 8)) & 0xff;
 		}
-		return;
+		val1 |= (val1 << 8) | (val1 << 16) | (val1 << 24);
+		val2 |= (val2 << 8) | (val2 << 16) | (val2 << 24);
+		FFB_WRITE64(&ffb->pattern[i], val1, val2);
 	}
+	pFfb->rp_active = 1;
 }
 
-static void 
-CreatorCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+static void FFB_SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
+						 int pat_word1, int pat_word2,
+						 int x, int y, int w, int h)
 {
-	ScreenPtr pScreen = pWin->drawable.pScreen;
-	FFBPtr pFfb = GET_FFB_FROM_SCREEN (pScreen);
-	DDXPointPtr pptSrc;
-	DDXPointPtr ppt;
-	RegionRec rgnDst;
-	BoxPtr pbox;
-	int dx, dy;
-	int i, nbox;
-	WindowPtr pwinRoot;
-
-	if (pFfb->vtSema)
-		return;
-
-	FFBLOG(("CreatorCopyWindow: WIN(%p)\n", pWin));
-
-	REGION_INIT(pScreen, &rgnDst, NullBox, 0);
-
-	dx = ptOldOrg.x - pWin->drawable.x;
-	dy = ptOldOrg.y - pWin->drawable.y;
-	REGION_TRANSLATE(pScreen, prgnSrc, -dx, -dy);
-	REGION_INTERSECT(pScreen, &rgnDst, &pWin->borderClip, prgnSrc);
-
-	pbox = REGION_RECTS(&rgnDst);
-	nbox = REGION_NUM_RECTS(&rgnDst);
-	if(!(pptSrc = (DDXPointPtr )ALLOCATE_LOCAL(nbox * sizeof(DDXPointRec))))
-		return;
-
-	ppt = pptSrc;
-	for (i = nbox; --i >= 0; ppt++, pbox++) {
-		ppt->x = pbox->x1 + dx;
-		ppt->y = pbox->y1 + dy;
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+
+	FFBLOG(("FFB_SubsequentMono8x8PatternFillRect: "
+		"x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h));
+
+	FFBFifo(pFfb, 4);
+	FFB_WRITE64(&ffb->by, y, x);
+	FFB_WRITE64_2(&ffb->bh, h, w);
+}
+
+static void FFB_SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
+							   int fg, int bg,
+							   int rop,
+							   unsigned int planemask)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+	unsigned int ppc, ppc_mask, fbc;
+
+	FFBLOG(("FFB_SetupForScanlineCPUToScreenColorExpandFill: "
+		"fg[%x] bg[%x] rop[%d] pmask[%x]\n",
+		fg, bg, rop, planemask));
+
+	ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST;
+	if (bg < 0)
+		ppc |= FFB_PPC_TBE_TRANSPARENT;
+	else
+		ppc |= FFB_PPC_TBE_OPAQUE;
+	ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK |
+	  FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK;
+	fbc = pFfb->xaa_fbc;
+	rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8);
+
+	if ((pFfb->ppc_cache & ppc_mask) != ppc ||
+	    pFfb->fg_cache != fg ||
+	    pFfb->fbc_cache != fbc ||
+	    pFfb->rop_cache != rop ||
+	    pFfb->pmask_cache != planemask ||
+	    pFfb->fontinc_cache != ((0<<16) | 32) ||
+	    (bg >= 0 && pFfb->bg_cache != bg)) {
+		pFfb->ppc_cache &= ~ppc_mask;
+		pFfb->ppc_cache |= ppc;
+		pFfb->fg_cache = fg;
+		pFfb->fbc_cache = fbc;
+		pFfb->rop_cache = rop;
+		pFfb->pmask_cache = planemask;
+		pFfb->fontinc_cache = ((0<<16) | 32);
+		if (bg >= 0)
+			pFfb->bg_cache = bg;
+		FFBFifo(pFfb, (bg >= 0 ? 7 : 6));
+		ffb->ppc = ppc;
+		ffb->fg = fg;
+		ffb->fbc = fbc;
+		ffb->rop = rop;
+		ffb->pmask = planemask;
+		ffb->fontinc = ((0 << 16) | 32);
+		if(bg >= 0)
+			ffb->bg = bg;
 	}
+	pFfb->rp_active = 1;
+}
 
-	/* XXX Optimize this later to only gcopy/vcopy the 8bpp+WID plane
-	 * XXX when possible.  -DaveM
-	 */
+static void FFB_SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
+							     int x, int y, int w, int h,
+							     int skipleft)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
 
-	pwinRoot = WindowTable[pScreen->myNum];
+	FFBLOG(("FFB_SubsequentCPUToScreenColorExpandFill: "
+		"x[%d] y[%d] w[%d] h[%d] skipleft[%d]\n",
+		x, y, w, h, skipleft));
+
+	pFfb->xaa_scanline_x = x;
+	pFfb->xaa_scanline_y = y;
+	pFfb->xaa_scanline_w = w;
+}
 
-	if (!pFfb->disable_vscroll && (!dx && dy)) {
-		FFBPtr pFfb = GET_FFB_FROM_SCREEN(pScreen);
+static void FFB_SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+	CARD32 *bits = (CARD32 *) pFfb->xaa_scanline_buffers[bufno];
+	int w;
 
-		FFB_ATTR_VSCROLL_WINCOPY(pFfb);
-		CreatorDoVertBitblt ((DrawablePtr)pwinRoot, (DrawablePtr)pwinRoot,
-				     GXcopy, &rgnDst, pptSrc, ~0L);
-	} else {
-		FFBPtr pFfb = GET_FFB_FROM_SCREEN(pScreen);
-		ffb_fbcPtr ffb = pFfb->regs;
+	FFBFifo(pFfb, 1);
+	ffb->fontxy = ((pFfb->xaa_scanline_y << 16) | pFfb->xaa_scanline_x);
 
-		FFB_ATTR_SFB_VAR_WINCOPY(pFfb);
-		FFBWait(pFfb, ffb);
-		CreatorDoBitblt ((DrawablePtr)pwinRoot, (DrawablePtr)pwinRoot,
-				 GXcopy, &rgnDst, pptSrc, ~0L);
+	w = pFfb->xaa_scanline_w;
+	if (w >= 32) {
+		FFB_WRITE_FONTW(pFfb, ffb, 32);
+		FFBFifo(pFfb, (w / 32));
+		do {
+			ffb->font = *bits++;
+			w -= 32;
+		} while (w >= 32);
 	}
-	DEALLOCATE_LOCAL(pptSrc);
-	REGION_UNINIT(pScreen, &rgnDst);
+	if (w > 0) {
+		FFB_WRITE_FONTW(pFfb, ffb, w);
+		FFBFifo(pFfb, 1);
+		ffb->font = *bits++;
+	}
+
+	pFfb->xaa_scanline_y++;
 }
 
-static void
-CreatorSaveAreas(PixmapPtr pPixmap, RegionPtr prgnSave, int xorg, int yorg, WindowPtr pWin)
-{
-	ScreenPtr pScreen = pPixmap->drawable.pScreen;
-	FFBPtr pFfb = GET_FFB_FROM_SCREEN(pScreen);
-	cfb8_32WidScreenPtr pScreenPriv =
-		CFB8_32WID_GET_SCREEN_PRIVATE(pScreen);
-	ffb_fbcPtr ffb = pFfb->regs;
-	register DDXPointPtr pPt;
-	DDXPointPtr pPtsInit;
-	register BoxPtr pBox;
-	register int i;
-	PixmapPtr pScrPix;
-
-	if (pFfb->vtSema)
-		return;
-
-	FFBLOG(("CreatorSaveAreas: WIN(%p)\n", pWin));
-	i = REGION_NUM_RECTS(prgnSave);
-	pPtsInit = (DDXPointPtr)ALLOCATE_LOCAL(i * sizeof(DDXPointRec));
-	if (!pPtsInit)
-		return;
-    
-	pBox = REGION_RECTS(prgnSave);
-	pPt = pPtsInit;
-	while (--i >= 0) {
-		pPt->x = pBox->x1 + xorg;
-		pPt->y = pBox->y1 + yorg;
-		pPt++;
-		pBox++;
-	}
+static void FFB_SetupForDashedLine(ScrnInfoPtr pScrn,
+				   int fg, int bg, int rop,
+				   unsigned int planemask,
+				   int length, unsigned char *pattern)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	CARD32 *pat_ptr = (CARD32 *)pattern;
+	unsigned int ppc, ppc_mask, fbc;
+
+	FFBLOG(("FFB_SetupForDashedLine: "
+		"fg[%x] bg[%x] rop[%d] pmask[%x] patlen[%d] pat[%x]\n",
+		fg, bg, rop, planemask, length, *pat_ptr));
+
+	pFfb->xaa_planemask = planemask;
+	pFfb->xaa_rop = rop;
+	pFfb->xaa_linepat = 
+		(*pat_ptr << FFB_LPAT_PATTERN_SHIFT) |
+		(1 << FFB_LPAT_SCALEVAL_SHIFT) |
+		((length & 0xf) << FFB_LPAT_PATLEN_SHIFT);
+
+	fbc = pFfb->xaa_fbc;
+	ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID;
+	ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK;
+
+	FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask,
+		     (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8),
+		     FFB_DRAWOP_BRLINEOPEN, fg, fbc, pFfb->xaa_wid);
+	pFfb->rp_active = 1;
+}
 
-	if (pWin->drawable.bitsPerPixel == 8)
-		pScrPix = (PixmapPtr) pScreenPriv->pix8;
-	else
-		pScrPix = (PixmapPtr) pScreenPriv->pix32;
+static void FFB_SubsequentDashedTwoPointLine( ScrnInfoPtr pScrn,
+					      int x1, int y1,
+					      int x2, int y2,
+					      int flags, int phase)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+	unsigned int linepat = pFfb->xaa_linepat;
+	unsigned int drawop;
 
-	/* SRC is the framebuffer, DST is a pixmap.  The SFB_VAR attributes may
-	 * seem silly, but they are needed even in this case to handle
-	 * double-buffered windows properly.
-	 */
-	FFB_ATTR_SFB_VAR_WIN(pFfb, 0x00ffffff, GXcopy, pWin);
-	FFBWait(pFfb, ffb);
-	CreatorDoBitblt((DrawablePtr) pScrPix, (DrawablePtr)pPixmap,
-			GXcopy, prgnSave, pPtsInit, ~0L);
+	FFBLOG(("FFB_SubsequentDashedTwoPointLine: "
+		"x1[%d] y1[%d] x2[%d] y2[%d] flgs[%x] phase[%d]\n",
+		x1, y2, x2, y2, flags, phase));
+
+	linepat |= (phase & 0xf) << FFB_LPAT_PATPTR_SHIFT;
+
+	drawop = (flags & OMIT_LAST) ?
+	  FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP;
+	FFB_WRITE_DRAWOP(pFfb, ffb, drawop);
+
+	if (pFfb->has_brline_bug) {
+		FFBFifo(pFfb, 6);
+		ffb->ppc = 0;
+	} else
+		FFBFifo(pFfb, 5);
+	ffb->lpat = linepat;
+	FFB_WRITE64(&ffb->by, y1, x1);
+	FFB_WRITE64_2(&ffb->bh, y2, x2);
+}
+
+static void FFB_SetupForSolidLine(ScrnInfoPtr pScrn, 
+				  int color, int rop, unsigned int planemask)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+	unsigned int ppc, ppc_mask, fbc;
 
-	DEALLOCATE_LOCAL (pPtsInit);
+	FFBLOG(("FFB_SetupForSolidLine: "
+		"color[%d] rop[%d] pmask[%x]\n",
+		color, rop, planemask));
+
+	pFfb->xaa_planemask = planemask;
+	pFfb->xaa_rop = rop;
+
+	fbc = pFfb->xaa_fbc;
+	ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID;
+	ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK;
+
+	FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask,
+		     (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8),
+		     FFB_DRAWOP_BRLINEOPEN, color, fbc, pFfb->xaa_wid);
+	FFBFifo(pFfb, 1);
+	ffb->lpat = 0;
+	pFfb->rp_active = 1;
 }
 
-static void
-CreatorRestoreAreas(PixmapPtr pPixmap, RegionPtr prgnRestore, int xorg, int yorg, WindowPtr pWin)
+static void FFB_SubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
+					    int x1, int y1,
+					    int x2, int y2,
+					    int flags)
 {
-	FFBPtr pFfb;
-	ffb_fbcPtr ffb;
-	register DDXPointPtr pPt;
-	DDXPointPtr pPtsInit;
-	register BoxPtr pBox;
-	register int i;
-	ScreenPtr pScreen = pPixmap->drawable.pScreen;
-	cfb8_32WidScreenPtr pScreenPriv =
-		CFB8_32WID_GET_SCREEN_PRIVATE(pScreen);
-	PixmapPtr pScrPix;
-
-	pFfb = GET_FFB_FROM_SCREEN(pScreen);
-	if (pFfb->vtSema)
-		return;
-
-	FFBLOG(("CreatorRestoreAreas: WIN(%p)\n", pWin));
-	i = REGION_NUM_RECTS(prgnRestore);
-	pPtsInit = (DDXPointPtr)ALLOCATE_LOCAL(i*sizeof(DDXPointRec));
-	if (!pPtsInit)
-		return;
-    
-	pBox = REGION_RECTS(prgnRestore);
-	pPt = pPtsInit;
-	while (--i >= 0) {
-		pPt->x = pBox->x1 - xorg;
-		pPt->y = pBox->y1 - yorg;
-		pPt++;
-		pBox++;
-	}
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+	int drawop;
 
-	if (pWin->drawable.bitsPerPixel == 8)
-		pScrPix = (PixmapPtr) pScreenPriv->pix8;
-	else
-		pScrPix = (PixmapPtr) pScreenPriv->pix32;
+	FFBLOG(("FFB_SubsequentSolidTwoPointLine: "
+		"x1[%d] y1[%d] x2[%d] y2[%d] flags[%d]\n",
+		x1, y1, x2, y2, flags));
+
+	drawop = (flags & OMIT_LAST) ?
+	  FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP;
+	FFB_WRITE_DRAWOP(pFfb, ffb, drawop);
+
+	if (pFfb->has_brline_bug) {
+		FFBFifo(pFfb, 5);
+		ffb->ppc = 0;
+	} else
+		FFBFifo(pFfb, 4);
+	FFB_WRITE64(&ffb->by, y1, x1);
+	FFB_WRITE64_2(&ffb->bh, y2, x2);
+}
 
-	pFfb = GET_FFB_FROM_SCREEN(pScreen);
-	ffb = pFfb->regs;
+void FFB_SetupForSolidFill(ScrnInfoPtr pScrn,
+			   int color, int rop, unsigned int planemask)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	unsigned int ppc, ppc_mask, fbc;
 
-	/* SRC is a pixmap, DST is the framebuffer */
-	FFB_ATTR_SFB_VAR_WIN(pFfb, 0x00ffffff, GXcopy, pWin);
-	FFBWait(pFfb, ffb);
-	CreatorDoBitblt((DrawablePtr)pPixmap, (DrawablePtr) pScrPix,
-			GXcopy, prgnRestore, pPtsInit, ~0L);
+	FFBLOG(("FFB_SetupForSolidFill: "
+		"color[%d] rop[%d] pmask[%u]\n",
+		color, rop, planemask));
+
+	pFfb->xaa_planemask = planemask;
+	pFfb->xaa_rop = rop;
+
+	fbc = pFfb->xaa_fbc;
+	if (pFfb->ffb_res == ffb_res_high)
+		fbc |= FFB_FBC_WB_B;
+	ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID;
+	ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK;
+
+	FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask,
+		     (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8),
+		     FFB_DRAWOP_RECTANGLE, color, fbc, pFfb->xaa_wid);
+	pFfb->rp_active = 1;
+}
+
+void FFB_SubsequentSolidFillRect(ScrnInfoPtr pScrn,
+				 int x, int y,
+				 int w, int h)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+
+	FFBLOG(("FFB_SubsequentSolidFillRect: "
+		"x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h));
 
-	DEALLOCATE_LOCAL (pPtsInit);
+	FFBFifo(pFfb, 4);
+	FFB_WRITE64(&ffb->by, y, x);
+	FFB_WRITE64_2(&ffb->bh, h, w);
 }
 
-static void
-CreatorGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h, unsigned int format, unsigned long planeMask, char* pdstLine)
+static void FFB_ScreenToScreenBitBlt(ScrnInfoPtr pScrn,
+				     int nbox,
+				     DDXPointPtr pptSrc,
+				     BoxPtr pbox,
+				     int xdir, int ydir,
+				     int rop, unsigned int planemask)
 {
-	BoxRec box;
-	DDXPointRec ptSrc;
-	RegionRec rgnDst;
-	ScreenPtr pScreen;
-	PixmapPtr pPixmap;
-
-	FFBLOG(("CreatorGetImage: s[%08x:%08x] wh[%08x:%08x]\n", sx, sy, w, h));
-	if ((w == 0) || (h == 0))
-		return;
-	if (pDrawable->bitsPerPixel == 1) {
-		mfbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
-		return;
-	}
-	pScreen = pDrawable->pScreen;
-	/*
-	 * XFree86 DDX empties the root borderClip when the VT is
-	 * switched away; this checks for that case
-	 */
-	if (!cfbDrawableEnabled (pDrawable))
-		return;
-	if(format == ZPixmap) {
-		FFBPtr pFfb = GET_FFB_FROM_SCREEN (pScreen);
-		ffb_fbcPtr ffb = pFfb->regs;
-
-		/* We have to have the full planemask. */
-		if (pDrawable->type == DRAWABLE_WINDOW) {
-			WindowPtr pWin = (WindowPtr) pDrawable;
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+	int use_vscroll;
 
-			FFB_ATTR_SFB_VAR_WIN(pFfb, 0x00ffffff, GXcopy, pWin);
-			FFBWait(pFfb, ffb);
+	FFBLOG(("FFB_ScreenToScreenBitBlt: "
+		"nbox[%d] xdir[%d] ydir[%d] rop[%d] pmask[%x]\n",
+		nbox, xdir, ydir, rop, planemask));
+
+	use_vscroll = 0;
+	if (!pFfb->disable_vscroll &&
+	    rop == GXcopy) {
+		int i;
+
+		for (i = 0; i < nbox; i++)
+			if (pptSrc[i].x != pbox[i].x1 ||
+			    pptSrc[i].y == pbox[i].y1)
+				break;
+		if (i == nbox) {
+			/* If/When double buffer extension is re-enabled
+			 * check buffers here.
+			 */
+			use_vscroll = 1;
 		}
+	}
+	if (use_vscroll) {
+		FFB_ATTR_VSCROLL_XAA(pFfb, planemask);
+		while (nbox--) {
+			FFBFifo(pFfb, 7);
+			ffb->drawop = FFB_DRAWOP_VSCROLL;
+			FFB_WRITE64(&ffb->by, pptSrc->y, pptSrc->x);
+			FFB_WRITE64_2(&ffb->dy, pbox->y1, pbox->x1);
+			FFB_WRITE64_3(&ffb->bh, (pbox->y2 - pbox->y1),
+				      (pbox->x2 - pbox->x1));
 
-		if (pDrawable->bitsPerPixel == 8) {
-			if((planeMask & 0x000000ff) != 0x000000ff) {
-				cfbGetImage(pDrawable, sx, sy, w, h,
-					    format, planeMask, pdstLine);
-				return;
-			}
-		} else {
-			if((planeMask & 0x00ffffff) != 0x00ffffff) {
-				cfb32GetImage(pDrawable, sx, sy, w, h,
-					      format, planeMask, pdstLine);
-				return;
-			}
+			pbox++;
+			pptSrc++;
 		}
+		pFfb->rp_active = 1;
+		SET_SYNC_FLAG(pFfb->pXAAInfo);
+	} else {
+		unsigned char *sfb32 = (unsigned char *) pFfb->sfb32;
+		int psz_shift = 2;
 
-		/* SRC is the framebuffer, DST is a pixmap */
-		if (pDrawable->type == DRAWABLE_WINDOW && w == 1 && h == 1) {
-			/* Benchmarks do this make sure the acceleration hardware
-			 * has completed all of it's operations, therefore I feel
-			 * it is not cheating to special case this because if
-			 * anything it gives the benchmarks more accurate results.
-			 */
-			if (pDrawable->bitsPerPixel == 32) {
-				unsigned char *sfb = (unsigned char *)pFfb->sfb32;
-				unsigned int *dstPixel = (unsigned int *)pdstLine;
-				unsigned int tmp;
-
-				tmp = *((unsigned int *)(sfb +
-							 ((sy + pDrawable->y) << 13) +
-							 ((sx + pDrawable->x) << 2)));
-				*dstPixel = (tmp & 0x00ffffff);
-			} else {
-				unsigned char *sfb = (unsigned char *)pFfb->sfb8r;
-				unsigned char *dstPixel = (unsigned char *)pdstLine;
-
-				*dstPixel = *((unsigned char *)(sfb +
-								((sy + pDrawable->y) << 11) +
-								((sx + pDrawable->x) << 0)));
+		FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop);
+		if (pFfb->use_blkread_prefetch) {
+			unsigned int bit;
+
+			if (xdir < 0)
+				bit = FFB_MER_EDRA;
+			else
+				bit = FFB_MER_EIRA;
+			FFBFifo(pFfb, 1);
+			ffb->mer = bit;
+			pFfb->rp_active = 1;
+		}
+		FFBWait(pFfb, ffb);
+
+		while (nbox--) {
+			unsigned char *src, *dst;
+			int x1, y1, x2, y2;
+			int width, height;
+			int sdkind;
+
+			x1 = pptSrc->x;
+			y1 = pptSrc->y;
+			x2 = pbox->x1;
+			y2 = pbox->y1;
+			width = (pbox->x2 - pbox->x1);
+			height = (pbox->y2 - pbox->y1);
+
+			src = sfb32 + (y1 * (2048 << psz_shift))
+				+ (x1 << psz_shift);
+			dst = sfb32 + (y2 * (2048 << psz_shift))
+				+ (x2 << psz_shift);
+			sdkind = (2048 << psz_shift);
+
+			if (ydir < 0) {
+				src += ((height - 1) * (2048 << psz_shift));
+				dst += ((height - 1) * (2048 << psz_shift));
+				sdkind = -sdkind;
 			}
-			return;
+			width <<= psz_shift;
+			if (xdir < 0)
+				VISmoveImageRL(src, dst, width, height,
+					       sdkind, sdkind);
+			else
+				VISmoveImageLR(src, dst, width, height,
+					       sdkind, sdkind);
+			pbox++;
+			pptSrc++;
 		}
-		pPixmap = GetScratchPixmapHeader(pScreen, w, h, 
-						 pDrawable->depth, pDrawable->bitsPerPixel,
-						 PixmapBytePad(w,pDrawable->depth), (pointer)pdstLine);
-		if (!pPixmap)
-			return;
-		ptSrc.x = sx + pDrawable->x;
-		ptSrc.y = sy + pDrawable->y;
-		box.x1 = 0;
-		box.y1 = 0;
-		box.x2 = w;
-		box.y2 = h;
-		REGION_INIT(pScreen, &rgnDst, &box, 1);
-		CreatorDoBitblt(pDrawable, (DrawablePtr)pPixmap, GXcopy, &rgnDst,
-				&ptSrc, planeMask);
-		REGION_UNINIT(pScreen, &rgnDst);
-		FreeScratchPixmapHeader(pPixmap);
-	} else
-		miGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
+		if (pFfb->use_blkread_prefetch) {
+			FFBFifo(pFfb, 1);
+			ffb->mer = FFB_MER_DRA;
+			pFfb->rp_active = 1;
+			FFBWait(pFfb, ffb);
+		}
+	}
 }
 
-extern void
-CreatorGetSpans(DrawablePtr pDrawable, int wMax, DDXPointPtr ppt,
-		int *pwidth, int nspans, char *pchardstStart);
-
-void
-CreatorVtChange (ScreenPtr pScreen, int enter)
+void FFB_SetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
+				    int xdir, int ydir, int rop,
+				    unsigned int planemask,
+				    int trans_color)
 {
-	FFBPtr pFfb = GET_FFB_FROM_SCREEN (pScreen);
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
 	ffb_fbcPtr ffb = pFfb->regs;
 
-	pFfb->rp_active = 1;
-	FFBWait(pFfb, ffb);	
-	pFfb->fifo_cache = -1;
-	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED |
-			   FFB_FBC_RB_A | FFB_FBC_SB_BOTH| FFB_FBC_XE_OFF |
-			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_MASK);
-	pFfb->ppc_cache = (FFB_PPC_FW_DISABLE |
-			   FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST |
-			   FFB_PPC_XS_CONST | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST|
-			   FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE);
-
-	pFfb->pmask_cache = ~0;
-	pFfb->rop_cache = FFB_ROP_EDIT_BIT;
-	pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE;
-	pFfb->fg_cache = pFfb->bg_cache = 0;
-	pFfb->fontw_cache = 32;
-	pFfb->fontinc_cache = (1 << 16) | 0;
-	pFfb->laststipple = NULL;
-	FFBFifo(pFfb, 9);
-	ffb->fbc = pFfb->fbc_cache;
-	ffb->ppc = pFfb->ppc_cache;
-	ffb->pmask = pFfb->pmask_cache;
-	ffb->rop = pFfb->rop_cache;
-	ffb->drawop = pFfb->drawop_cache;
-	ffb->fg = pFfb->fg_cache;
-	ffb->bg = pFfb->bg_cache;
-	ffb->fontw = pFfb->fontw_cache;
-	ffb->fontinc = pFfb->fontinc_cache;
-	pFfb->rp_active = 1;
+	FFBLOG(("FFB_SetupForScreenToScreenCopy: "
+		"xdir[%d] ydir[%d] rop[%d] pmask[%x] tcolor[%d]\n",
+		xdir, ydir, rop, planemask, trans_color));
+
+	pFfb->xaa_planemask = planemask;
+	pFfb->xaa_xdir = xdir;
+	pFfb->xaa_ydir = ydir;
+	pFfb->xaa_rop = rop;
+	FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop);
 	FFBWait(pFfb, ffb);
+}
 
-	/* Fixup the FBC/PPC caches to deal with actually using
-	 * a WID for every ROP.
-	 */
-	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED |
-			   FFB_FBC_RB_A | FFB_FBC_SB_BOTH | FFB_FBC_XE_ON |
-			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_ON);
-	pFfb->ppc_cache &= ~FFB_PPC_XS_MASK;
-	pFfb->ppc_cache |= FFB_PPC_XS_WID;
-	pFfb->wid_cache = 0xff;
-	FFBFifo(pFfb, 8);
-	ffb->fbc = pFfb->fbc_cache;
-	ffb->ppc = FFB_PPC_XS_WID;
-	ffb->wid = pFfb->wid_cache;
-	ffb->xpmask = 0xff;
-	ffb->xclip = FFB_XCLIP_TEST_ALWAYS;
-	ffb->cmp = 0x80808080;
-	ffb->matchab = 0x80808080;
-	ffb->magnab = 0x80808080;
+void FFB_SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
+				      int x1, int y1,
+				      int x2, int y2,
+				      int width, int height)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	unsigned char *src, *dst, *sfb32;
+	int psz_shift = 2;
+	int sdkind;
+
+	FFBLOG(("FFB_SubsequentScreenToScreenCopy: "
+		"x1[%d] y1[%d] x2[%d] y2[%u] w[%d] h[%d]\n",
+		x1, y1, x2, y2, width, height));
+
+	sfb32 = (unsigned char *) pFfb->sfb32;
+	src = sfb32 + (y1 * (2048 << psz_shift)) + (x1 << psz_shift);
+	dst = sfb32 + (y2 * (2048 << psz_shift)) + (x2 << psz_shift);
+	sdkind = (2048 << psz_shift);
+
+	if (pFfb->xaa_ydir < 0) {
+		src += ((height - 1) * (2048 << psz_shift));
+		dst += ((height - 1) * (2048 << psz_shift));
+		sdkind = -sdkind;
+	}
+
+	width <<= psz_shift;
+	if (pFfb->xaa_xdir < 0)
+		VISmoveImageRL(src, dst, width, height, sdkind, sdkind);
+	else
+		VISmoveImageLR(src, dst, width, height, sdkind, sdkind);
+}
+
+static void FFB_Sync(ScrnInfoPtr pScrn)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ffb_fbcPtr ffb = pFfb->regs;
+
+	FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy);
 	FFBWait(pFfb, ffb);
 }
 
@@ -771,36 +844,15 @@
 	}
 }
 
-static Bool
-CreatorPositionWindow(WindowPtr pWin, int x, int y)
-{
-	if (pWin->drawable.bitsPerPixel == 8)
-		return cfbPositionWindow(pWin, x, y);
-	else
-		return cfb32PositionWindow(pWin, x, y);
-}
-
-extern Bool CreatorCreateGC (GCPtr pGC);
-
-#ifdef DEBUG_FFB
-FILE *FDEBUG_FD = NULL;
-#endif
-
-BSFuncRec CreatorBSFuncRec = {
-    CreatorSaveAreas,
-    CreatorRestoreAreas,
-    (BackingStoreSetClipmaskRgnProcPtr) 0,
-    (BackingStoreGetImagePixmapProcPtr) 0,
-    (BackingStoreGetSpansPixmapProcPtr) 0,
-};
-
-Bool FFBAccelInit (ScreenPtr pScreen, FFBPtr pFfb)
+Bool FFBAccelInit(ScreenPtr pScreen, FFBPtr pFfb)
 {
-	ffb_fbcPtr ffb;
+	XAAInfoRecPtr infoRec;
+	ffb_fbcPtr ffb = pFfb->regs;
 
 	if (serverGeneration != CreatorGeneration) {
 		CreatorScreenPrivateIndex = AllocateScreenPrivateIndex ();
-		if (CreatorScreenPrivateIndex == -1) return FALSE;
+		if (CreatorScreenPrivateIndex == -1)
+			return FALSE;
 		CreatorGCPrivateIndex = AllocateGCPrivateIndex ();
 		CreatorWindowPrivateIndex = AllocateWindowPrivateIndex ();
 		CreatorGeneration = serverGeneration;
@@ -810,32 +862,132 @@
 		return FALSE;
 	if (!AllocateWindowPrivate(pScreen, CreatorWindowPrivateIndex, 0))
 		return FALSE;
+
 	pScreen->devPrivates[CreatorScreenPrivateIndex].ptr = pFfb;
 
-	pFfb->fifo_cache = 0;
-	ffb = pFfb->regs;
+	pFfb->xaa_fbc = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A |
+			 FFB_FBC_WE_FORCEON |
+			 FFB_FBC_SB_BOTH |
+			 FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF |
+			 FFB_FBC_RGBE_MASK |
+			 FFB_FBC_XE_ON);
+	pFfb->xaa_wid = FFBWidAlloc(pFfb, TrueColor, 0, TRUE);
+	if (pFfb->xaa_wid == (unsigned int) -1)
+		return FALSE;
 
-	/* Replace various screen functions. */
-	pScreen->CreateGC = CreatorCreateGC;
-	pScreen->CreateWindow = CreatorCreateWindow;
-	pScreen->DestroyWindow = CreatorDestroyWindow;
-	pScreen->PositionWindow = CreatorPositionWindow;
-	pScreen->ChangeWindowAttributes = CreatorChangeWindowAttributes;
-	pScreen->PaintWindowBackground = CreatorPaintWindow;
-	pScreen->PaintWindowBorder = CreatorPaintWindow;
-	pScreen->GetSpans = CreatorGetSpans;
-	pScreen->CopyWindow = CreatorCopyWindow;
-	pScreen->GetImage = CreatorGetImage;
-	pScreen->BackingStoreFuncs = CreatorBSFuncRec;
+	pFfb->pXAAInfo = infoRec = XAACreateInfoRec();
+	if (!infoRec) {
+		FFBWidFree(pFfb, pFfb->xaa_wid);
+		return FALSE;
+	}
 
-	/* cfb8_32wid took over this to init the WID plane,
-	 * and with how our code works that is not necessary.
-	 */
-	pScreen->WindowExposures = miWindowExposures;
+	pFfb->xaa_scanline_buffers[0] = xalloc(2048 * 4);
+	if (!pFfb->xaa_scanline_buffers[0]) {
+		XAADestroyInfoRec(infoRec);
+		return FALSE;
+	}
 
-	/* Set FFB line-bias for clipping. */
+	pFfb->xaa_scanline_buffers[1] = xalloc(2048 * 4);
+	if (!pFfb->xaa_scanline_buffers[1]) {
+		xfree(pFfb->xaa_scanline_buffers[0]);
+		XAADestroyInfoRec(infoRec);
+		return FALSE;
+	}
+
+	infoRec->Sync = FFB_Sync;
+
+	/* Use VIS and VSCROLL for screen to screen copies.  */
+	infoRec->ScreenToScreenCopyFlags = NO_TRANSPARENCY;
+	infoRec->SetupForScreenToScreenCopy =
+		FFB_SetupForScreenToScreenCopy;
+	infoRec->SubsequentScreenToScreenCopy =
+		FFB_SubsequentScreenToScreenCopy;
+
+	/* In order to optimize VSCROLL and prefetching properly we
+	 * have to use our own mid-layer routine.
+	 */
+	infoRec->ScreenToScreenBitBltFlags = NO_TRANSPARENCY;
+	infoRec->ScreenToScreenBitBlt =
+		FFB_ScreenToScreenBitBlt;
+
+	infoRec->SolidFillFlags = 0;
+	infoRec->SetupForSolidFill =
+		FFB_SetupForSolidFill;
+	infoRec->SubsequentSolidFillRect =
+		FFB_SubsequentSolidFillRect;
+
+	infoRec->SolidLineFlags = 0;
+	infoRec->SetupForSolidLine =
+		FFB_SetupForSolidLine;
+	infoRec->SubsequentSolidTwoPointLine =
+		FFB_SubsequentSolidTwoPointLine;
 	miSetZeroLineBias(pScreen, OCTANT3 | OCTANT4 | OCTANT6 | OCTANT1);
 
+	infoRec->DashedLineFlags = (TRANSPARENCY_ONLY |
+				    LINE_PATTERN_LSBFIRST_LSBJUSTIFIED);
+	infoRec->DashPatternMaxLength = 16;
+	infoRec->SetupForDashedLine =
+		FFB_SetupForDashedLine;
+	infoRec->SubsequentDashedTwoPointLine =
+		FFB_SubsequentDashedTwoPointLine;
+
+	/* We cannot use the non-scanline color expansion mechanism on FFB
+	 * for two reasons:
+	 *
+	 * 1) A render pass can only render 32-pixels wide on FFB, XAA expects
+	 *    that arbitrary widths are possible per render pass.
+	 *
+	 * 2) The FFB accelerator FIFO is only 100 or so words deep, and
+	 *    XAA gives no way to limit the number of words it writes into
+	 *    the ColorExpandBase register per rendering pass.
+	 */
+	infoRec->ScanlineColorExpandBuffers = pFfb->xaa_scanline_buffers;
+	infoRec->NumScanlineColorExpandBuffers = 2;
+	infoRec->ScanlineCPUToScreenColorExpandFillFlags =
+		CPU_TRANSFER_PAD_DWORD |
+		SCANLINE_PAD_DWORD |
+		CPU_TRANSFER_BASE_FIXED |
+		BIT_ORDER_IN_BYTE_LSBFIRST;
+	infoRec->SetupForScanlineCPUToScreenColorExpandFill =
+		FFB_SetupForScanlineCPUToScreenColorExpandFill;
+	infoRec->SubsequentScanlineCPUToScreenColorExpandFill =
+		FFB_SubsequentScanlineCPUToScreenColorExpandFill;
+	infoRec->SubsequentColorExpandScanline =
+		FFB_SubsequentColorExpandScanline;
+
+	infoRec->Mono8x8PatternFillFlags =
+		HARDWARE_PATTERN_PROGRAMMED_BITS |
+		HARDWARE_PATTERN_SCREEN_ORIGIN |
+		BIT_ORDER_IN_BYTE_LSBFIRST;
+	infoRec->SetupForMono8x8PatternFill =
+		FFB_SetupForMono8x8PatternFill;
+	infoRec->SubsequentMono8x8PatternFillRect =
+		FFB_SubsequentMono8x8PatternFillRect;
+
+	/* Use VIS for pixmap writes.  */
+	infoRec->WritePixmap = FFB_WritePixmap;
+
+	/* RENDER optimizations.  */
+	infoRec->CPUToScreenAlphaTextureFlags =
+		XAA_RENDER_NO_TILE |
+		XAA_RENDER_NO_SRC_ALPHA;
+	infoRec->CPUToScreenAlphaTextureFormats = FFBAlphaTextureFormats;
+	infoRec->SetupForCPUToScreenAlphaTexture =
+		FFB_SetupForCPUToScreenAlphaTexture;
+	infoRec->SubsequentCPUToScreenAlphaTexture =
+		FFB_SubsequentCPUToScreenAlphaTexture;
+
+	infoRec->CPUToScreenTextureFlags =
+		XAA_RENDER_NO_TILE |
+		XAA_RENDER_NO_SRC_ALPHA;
+	infoRec->CPUToScreenTextureFormats = FFBTextureFormats;
+	infoRec->SetupForCPUToScreenTexture =
+		FFB_SetupForCPUToScreenTexture;
+	infoRec->SubsequentCPUToScreenTexture =
+		FFB_SubsequentCPUToScreenTexture;
+
+	pFfb->fifo_cache = 0;
+
 	FFB_DEBUG_init();
 	FDEBUG((FDEBUG_FD,
 		"FFB: cfg0(%08x) cfg1(%08x) cfg2(%08x) cfg3(%08x) ppcfg(%08x)\n",
@@ -904,26 +1056,31 @@
 
 	pFfb->ppc_cache = (FFB_PPC_FW_DISABLE |
 			   FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST |
-			   FFB_PPC_XS_CONST | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST |
+			   FFB_PPC_XS_WID | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST |
 			   FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE);
-
+	pFfb->wid_cache = pFfb->xaa_wid;
 	pFfb->pmask_cache = ~0;
-	pFfb->rop_cache = (FFB_ROP_ZERO | (FFB_ROP_NEW << 8));
+	pFfb->rop_cache = (FFB_ROP_NEW | (FFB_ROP_NEW << 8));
 	pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE;
 	pFfb->fg_cache = pFfb->bg_cache = 0;
 	pFfb->fontw_cache = 32;
 	pFfb->fontinc_cache = (1 << 16) | 0;
-	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED |
-			   FFB_FBC_RB_A | FFB_FBC_SB_BOTH | FFB_FBC_XE_OFF |
-			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_MASK);
+	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A |
+			   FFB_FBC_WE_FORCEON |
+			   FFB_FBC_SB_BOTH |
+			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF |
+			   FFB_FBC_RGBE_OFF |
+			   FFB_FBC_XE_ON);
 	pFfb->laststipple = NULL;
 
 	/* We will now clear the screen: we'll draw a rectangle covering all the
 	 * viewscreen, using a 'blackness' ROP.
 	 */
-	FFBFifo(pFfb, 13);
+	FFBFifo(pFfb, 22);
 	ffb->fbc = pFfb->fbc_cache;
 	ffb->ppc = pFfb->ppc_cache;
+	ffb->wid = pFfb->wid_cache;
+	ffb->xpmask = 0xff;
 	ffb->pmask = pFfb->pmask_cache;
 	ffb->rop = pFfb->rop_cache;
 	ffb->drawop = pFfb->drawop_cache;
@@ -931,31 +1088,32 @@
 	ffb->bg = pFfb->bg_cache;
 	ffb->fontw = pFfb->fontw_cache;
 	ffb->fontinc = pFfb->fontinc_cache;
+	ffb->xclip = FFB_XCLIP_TEST_ALWAYS;
+	ffb->cmp = 0x80808080;
+	ffb->matchab = 0x80808080;
+	ffb->magnab = 0x80808080;
+	ffb->blendc = (FFB_BLENDC_FORCE_ONE |
+		       FFB_BLENDC_DF_ONE_M_A |
+		       FFB_BLENDC_SF_A);
+	ffb->blendc1 = 0;
+	ffb->blendc2 = 0;
 	FFB_WRITE64(&ffb->by, 0, 0);
 	FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width);
 	pFfb->rp_active = 1;
 	FFBWait(pFfb, ffb);
 	
-	/* Fixup the FBC/PPC caches to deal with actually using
-	 * a WID for every ROP.
-	 */
-	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED |
-			   FFB_FBC_RB_A | FFB_FBC_SB_BOTH | FFB_FBC_XE_ON |
-			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_ON);
-	pFfb->ppc_cache &= ~FFB_PPC_XS_MASK;
-	pFfb->ppc_cache |= FFB_PPC_XS_WID;
-	pFfb->wid_cache = 0xff;
-	FFBFifo(pFfb, 8);
-	ffb->fbc = pFfb->fbc_cache;
-	ffb->ppc = FFB_PPC_XS_WID;
-	ffb->wid = pFfb->wid_cache;
-	ffb->xpmask = 0xff;
-	ffb->xclip = FFB_XCLIP_TEST_ALWAYS;
-	ffb->cmp = 0x80808080;
-	ffb->matchab = 0x80808080;
-	ffb->magnab = 0x80808080;
+	FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy);
 	FFBWait(pFfb, ffb);
 
+	if (!XAAInit(pScreen, infoRec)) {
+		XAADestroyInfoRec(infoRec);
+		xfree(pFfb->xaa_scanline_buffers[0]);
+		xfree(pFfb->xaa_scanline_buffers[1]);
+		pFfb->pXAAInfo = NULL;
+		FFBWidFree(pFfb, pFfb->xaa_wid);
+		return FALSE;
+	}
+
 	/* Success */
 	return TRUE;
 }
diff -urN xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_bcopy.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_bcopy.c
--- xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_bcopy.c	2000-05-23 00:47:44.000000000 -0400
+++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_bcopy.c	2004-06-10 23:38:50.742533680 -0400
@@ -382,7 +382,6 @@
 						if (use_prefetch) {
 							FFBFifo(pFfb, 1);
 							pFfb->regs->mer = FFB_MER_EDRA;
-							pFfb->regs->mer = FFB_MER_EIRA;
 							pFfb->rp_active = 1;
 						}
 						VISmoveImageRL ((psrcBase +
diff -urN xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_dga.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c
--- xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_dga.c	2000-10-17 12:53:17.000000000 -0400
+++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c	2004-06-10 23:38:50.746533072 -0400
@@ -35,30 +35,16 @@
 #include "ffb_stip.h"
 #include "ffb_loops.h"
 
-static Bool FFB_OpenFramebuffer(ScrnInfoPtr pScrn, char **name, unsigned char **mem,
-				int *size, int *offset, int *extra);
-static void FFB_CloseFramebuffer(ScrnInfoPtr pScrn);
-static Bool FFB_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode);
-static void FFB_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags);
-static int FFB_GetViewport(ScrnInfoPtr pScrn);
-static void FFB_Flush(ScrnInfoPtr pScrn);
-
-/* Have to disable all this stuff for now until I figure out where
- * we should get the WID values from... ho hum... -DaveM
- */
-#if 0
-static void FFB_FillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned long color);
-
-#ifdef USE_VIS
-static void FFB_BlitRect(ScrnInfoPtr pScrn, int srcx, int srcy, int w, int h,
-			 int dstx, int dsty);
-#else
-#define FFB_BlitRect NULL
-#endif
-#else
-#define FFB_FillRect NULL
-#define FFB_BlitRect NULL
-#endif
+static Bool FFB_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **,
+				int *, int *, int *);
+static void FFB_CloseFramebuffer(ScrnInfoPtr);
+static Bool FFB_SetMode(ScrnInfoPtr, DGAModePtr);
+static void FFB_SetViewport(ScrnInfoPtr, int, int, int);
+static int FFB_GetViewport(ScrnInfoPtr);
+static void FFB_Flush(ScrnInfoPtr);
+static void FFB_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long);
+static void FFB_BlitRect(ScrnInfoPtr, int, int, int, int,
+			 int, int);
 
 static DGAFunctionRec FFB_DGAFuncs = {
 	FFB_OpenFramebuffer,
@@ -93,10 +79,7 @@
 
 	/* Hmmm, what does concurrent access really mean? -DaveM */
 	mode->flags = (DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE | DGA_FILL_RECT);
-
-#ifdef USE_VIS
 	mode->flags |= DGA_BLIT_RECT;
-#endif
 
 	mode->imageWidth = 2048;
 	mode->imageHeight = 2048;
@@ -195,86 +178,31 @@
 	FFBWait(pFfb, ffb);
 }
 
-#if 0
-
-extern void CreatorFillBoxSolid (DrawablePtr pDrawable, int nBox,
-				 BoxPtr pBox, unsigned long pixel);
+extern void FFB_SetupForSolidFill(ScrnInfoPtr, int, int, unsigned int);
+extern void FFB_SubsequentSolidFillRect(ScrnInfoPtr, int, int, int, int);
 
 static void FFB_FillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned long color)
 {
-	DrawableRec draw;
-	BoxRec box;
-
-	draw.pScreen = pScrn->pScreen;
-	box.x1 = x;
-	box.y1 = y;
-	box.x2 = x + w;
-	box.y2 = y + h;
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
 
-	CreatorFillBoxSolid(&draw, 1, &box, color);
+	FFB_SetupForSolidFill(pScrn, color, GXcopy, ~0);
+	FFB_SubsequentSolidFillRect(pScrn, x, y, w, h);
+	SET_SYNC_FLAG(pFfb->pXAAInfo);
 }
 
-#ifdef USE_VIS
-extern void VISmoveImageLR(unsigned char *, unsigned char *, long, long, long, long);
-extern void VISmoveImageRL(unsigned char *, unsigned char *, long, long, long, long);
+extern void FFB_SetupForScreenToScreenCopy(ScrnInfoPtr, int, int, int,
+					   unsigned int, int);
+extern void FFB_SubsequentScreenToScreenCopy(ScrnInfoPtr, int, int,
+					     int, int, int, int);
 
 static void FFB_BlitRect(ScrnInfoPtr pScrn, int srcx, int srcy,
 			 int w, int h, int dstx, int dsty)
 {
 	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
-	ffb_fbcPtr ffb = pFfb->regs;
-
-	if (!pFfb->disable_vscroll &&
-	    dstx == srcx &&
-	    dsty != dsty) {
-		FFB_WRITE_ATTRIBUTES_VSCROLL(pFfb, 0x00ffffff);
-		FFBFifo(pFfb, 7);
-		ffb->drawop = FFB_DRAWOP_VSCROLL;
-		FFB_WRITE64(&ffb->by, srcy, srcx);
-		FFB_WRITE64_2(&ffb->dy, dsty, dstx);
-		FFB_WRITE64_3(&ffb->bh, h, w);
-		pFfb->rp_active = 1;
-	} else {
-		unsigned char *base = (unsigned char *)pFfb->fb;
-		int use_prefetch = pFfb->use_blkread_prefetch;
+	int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1;
+	int ydir = (srcy < dsty) ? -1 : 1;
 
-		FFB_WRITE_ATTRIBUTES_SFB_VAR(pFfb, 0x00ffffff, GXcopy);
-		FFBWait(pFfb, ffb);
-		if (use_prefetch) {
-			FFBFifo(pFfb, 1);
-			ffb->mer = FFB_MER_EIRA;
-			pFfb->rp_active = 1;
-			FFBWait(pFfb, ffb);
-		}
-		if (srcx < dstx) {
-			VISmoveImageRL((base +
-					((srcy + h - 1) * (2048 * 4)) +
-					(srcx * (32 / 8))),
-				       (base +
-					((dsty + h - 1) * (2048 * 4)) +
-					(dstx * (32 / 8))),
-				       (w * (32 / 8)),
-				       h,
-				       -(2048 * 4), - (2048 * 4));
-		} else {
-			VISmoveImageLR((base +
-					((srcy + h - 1) * (2048 * 4)) +
-					(srcx * (32 / 8))),
-				       (base +
-					((dsty + h - 1) * (2048 * 4)) +
-					(dstx * (32 / 8))),
-				       (w * (32 / 8)),
-				       h,
-				       -(2048 * 4), - (2048 * 4));
-		}
-		if (use_prefetch) {
-			FFBFifo(pFfb, 1);
-			ffb->mer = FFB_MER_DRA;
-			pFfb->rp_active = 1;
-			FFBWait(pFfb, pFfb->regs);
-		}
-	}
+	FFB_SetupForScreenToScreenCopy(pScrn, xdir, ydir, GXcopy, ~0, -1);
+	FFB_SubsequentScreenToScreenCopy(pScrn, srcx, srcy, dstx,dsty, w, h);
+	SET_SYNC_FLAG(pFfb->pXAAInfo);
 }
-#endif
-
-#endif
diff -urN xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_driver.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_driver.c
--- xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_driver.c	2002-12-05 21:44:04.000000000 -0500
+++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_driver.c	2004-06-10 23:38:50.768529728 -0400
@@ -29,12 +29,7 @@
 #include "mipointer.h"
 #include "mibstore.h"
 #include "micmap.h"
-
-#define PSZ 8
-#include "cfb.h"
-#undef PSZ
-#include "cfb32.h"
-#include "cfb8_32wid.h"
+#include "fb.h"
 
 #include "xf86cmap.h"
 
@@ -50,6 +45,7 @@
 static void	FFBLeaveVT(int scrnIndex, int flags);
 static Bool	FFBCloseScreen(int scrnIndex, ScreenPtr pScreen);
 static Bool	FFBSaveScreen(ScreenPtr pScreen, int mode);
+static void	FFBDPMSSet(ScrnInfoPtr pScrn, int mode, int flags);
 
 /* Required if the driver supports mode switching */
 static Bool	FFBSwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
@@ -416,12 +412,12 @@
 	return FALSE;
     }
 
-    if (xf86LoadSubModule(pScrn, "cfb32") == NULL) {
+    if (xf86LoadSubModule(pScrn, "fb") == NULL) {
 	FFBFreeRec(pScrn);
 	return FALSE;
     }
 
-    if (xf86LoadSubModule(pScrn, "cfb") == NULL) {
+    if (xf86LoadSubModule(pScrn, "xaa") == NULL) {
 	FFBFreeRec(pScrn);
 	return FALSE;
     }
@@ -570,8 +566,6 @@
 			pFfb->has_z_buffer = 0;
 		}
 		if (sbits & (1 << 0)) {
-			ErrorF("Double-buffered.\n");
-
 			/* This state really means to the driver that the double
 			 * buffers are available for hw accelerate Dbe.  When the
 			 * FFB is in high-resolution mode, the buffers are combined
@@ -581,86 +575,17 @@
 			if ((ffb->fbcfg0 & FFB_FBCFG0_RES_MASK) != FFB_FBCFG0_RES_HIGH)
 				pFfb->has_double_buffer = 1;
 			else
-				pFfb->has_double_buffer = 1;
+				pFfb->has_double_buffer = 0;
 		} else {
-			ErrorF("Single-buffered.\n");
 			pFfb->has_double_buffer = 0;
 		}
+		if (pFfb->has_double_buffer)
+			ErrorF("Double-buffered.\n");
+		else
+			ErrorF("Single-buffered.\n");
 	}
 }
 
-static unsigned long CreatorUnaccelGeneration = 0;
-static int CreatorUnaccelWindowPrivateIndex;
-
-#define CreatorUnaccelGetWid(w) \
-	((w)->devPrivates[CreatorUnaccelWindowPrivateIndex].val)
-#define CreatorUnaccelSetWid(w,wid) \
-	(((w)->devPrivates[CreatorUnaccelWindowPrivateIndex].val) = (wid))
-
-static unsigned int
-CreatorWidGet(WindowPtr pWin)
-{
-	return CreatorUnaccelGetWid(pWin);
-}
-
-static Bool
-CreatorWidAlloc(WindowPtr pWin)
-{
-	ScreenPtr pScreen = pWin->drawable.pScreen;
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
-	unsigned int wid;
-	int i, visual, visclass;
-
-	visual = wVisual(pWin);
-	visclass = 0;
-	for (i = 0; i < pScreen->numVisuals; i++) {
-		if (pScreen->visuals[i].vid == visual) {
-			visclass = pScreen->visuals[i].class;
-			break;
-		}
-	}
-
-	wid = FFBWidAlloc(pFfb, visclass, wColormap(pWin), TRUE);
-	if (wid == (unsigned int) -1)
-		return FALSE;
-
-	CreatorUnaccelSetWid(pWin, wid);
-
-	return TRUE;
-}
-
-static void
-CreatorWidFree(WindowPtr pWin)
-{
-	ScrnInfoPtr pScrn = xf86Screens[pWin->drawable.pScreen->myNum];
-	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
-	unsigned int wid = CreatorUnaccelGetWid(pWin);
-
-	FFBWidFree(pFfb, wid);
-}
-
-static cfb8_32WidOps CreatorUnaccelWidOps = {
-	CreatorWidGet,
-	CreatorWidAlloc,
-	CreatorWidFree,
-	NULL,
-	NULL
-};
-
-static Bool
-CreatorUnaccelWidInit(ScreenPtr pScreen)
-{
-	if (serverGeneration != CreatorUnaccelGeneration) {
-		CreatorUnaccelWindowPrivateIndex =
-			AllocateWindowPrivateIndex();
-		if (CreatorUnaccelWindowPrivateIndex == -1)
-			return FALSE;
-	}
-
-	return TRUE;
-}
-
 /* Mandatory */
 
 /* This gets called at the start of each server generation */
@@ -674,10 +599,6 @@
     unsigned int afb_fem;
     VisualPtr visual;
 
-    /* Add in our Dbe hook. */
-    if (!FFBDbePreInit(pScreen))
-	return FALSE;
-
     /* 
      * First get the ScrnInfoRec
      */
@@ -797,11 +718,6 @@
     /* Darken the screen for aesthetic reasons and set the viewport */
     FFBSaveScreen(pScreen, SCREEN_SAVER_ON);
 
-    if (pFfb->NoAccel == TRUE) {
-	    if (!CreatorUnaccelWidInit(pScreen))
-		    return FALSE;
-    }
-
     /*
      * The next step is to setup the screen's visuals, and initialise the
      * framebuffer code.  In cases where the framebuffer's default
@@ -817,14 +733,14 @@
     miClearVisualTypes();
 
     /* Setup the visuals we support. */
-    if (!miSetVisualTypes(24, TrueColorMask | DirectColorMask,
+    if (!miSetVisualTypes(24, TrueColorMask,
 			  pScrn->rgbBits, TrueColor))
 	    return FALSE;
-    if (!miSetVisualTypes(8, PseudoColorMask | GrayScaleMask | StaticGrayMask,
-			  pScrn->rgbBits, PseudoColor))
-	    return FALSE;
 
-#ifdef XF86DRI
+    if (!miSetPixmapDepths())
+        return FALSE;
+
+#if 0 /*def XF86DRI*/
     if (pFfb->ffb_type != afb_m3 && pFfb->ffb_type != afb_m6 &&
 	pFfb->NoAccel == FALSE) {
 	    pFfb->dri_enabled = FFBDRIScreenInit(pScreen);
@@ -843,30 +759,14 @@
      * Call the framebuffer layer's ScreenInit function, and fill in other
      * pScreen fields.
      */
-    if (pFfb->NoAccel == TRUE) {
-	    ret = cfb8_32WidScreenInit(pScreen, pFfb->dfb24, pFfb->dfb8r, pFfb->dfb8x,
-				       pScrn->virtualX, pScrn->virtualY,
-				       pScrn->xDpi, pScrn->yDpi,
-				       2048, 2048, 2048, 8,
-				       &CreatorUnaccelWidOps);
-    } else {
-	    /* Use smart framebuffer aperture for cfb8/cfb32. */
-	    ret = cfb8_32WidScreenInit(pScreen, pFfb->sfb32, pFfb->sfb8r, pFfb->dfb8x,
-				       pScrn->virtualX, pScrn->virtualY,
-				       pScrn->xDpi, pScrn->yDpi,
-				       2048, 2048, 2048, 8,
-				       &CreatorUnaccelWidOps);
-    }
+    ret = fbScreenInit(pScreen, (pFfb->NoAccel ? pFfb->dfb24 : pFfb->sfb32),
+		       pScrn->virtualX, pScrn->virtualY,
+		       pScrn->xDpi, pScrn->yDpi,
+		       2048, 32);
 
     if (!ret)
 	return FALSE;
 
-    miInitializeBackingStore(pScreen);
-    xf86SetBackingStore(pScreen);
-    xf86SetSilkenMouse(pScreen);
-
-    xf86SetBlackWhitePixels(pScreen);
-
     if (pScrn->bitsPerPixel > 8) {
         /* Fixup RGB ordering */
         visual = pScreen->visuals + pScreen->numVisuals;
@@ -882,12 +782,24 @@
 	}
     }
 
+    if (!fbPictureInit(pScreen, NULL, 0) &&
+	(serverGeneration == 1))
+      xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+		 "RENDER extension initialisation failed.\n");
+
+    xf86SetBlackWhitePixels(pScreen);
+
     if (!pFfb->NoAccel) {
 	if (!FFBAccelInit(pScreen, pFfb))
 	    return FALSE;
 	xf86Msg(X_INFO, "%s: Using acceleration\n", pFfb->psdp->device);
     }
 
+
+    miInitializeBackingStore(pScreen);
+    xf86SetBackingStore(pScreen);
+    xf86SetSilkenMouse(pScreen);
+
     /* Initialise cursor functions */
     miDCInitialize (pScreen, xf86GetPointerScreenFuncs());
 
@@ -912,9 +824,6 @@
      */
     if (!xf86HandleColormaps(pScreen, 256, 8,
 			     FFBDacLoadPalette, NULL,
-#if 0
-			     CMAP_PALETTED_TRUECOLOR |
-#endif
 			     CMAP_LOAD_EVEN_IF_OFFSCREEN |
 			     CMAP_RELOAD_ON_MODE_SWITCH))
 	return FALSE;
@@ -923,9 +832,9 @@
     if (!pFfb->NoAccel)
 	    FFB_InitDGA(pScreen);
 
-#ifdef XF86DRI
+#if 0 /*def XF86DRI*/
     if (pFfb->dri_enabled) {
-	    /* Now that mi, cfb, drm and others have done their thing, 
+	    /* Now that mi, fb, drm and others have done their thing, 
 	     * complete the DRI setup.
 	     */
 	    pFfb->dri_enabled = FFBDRIFinishScreenInit(pScreen);
@@ -938,6 +847,8 @@
     }
 #endif
 
+    xf86DPMSInit(pScreen, FFBDPMSSet, 0);
+
     pFfb->CloseScreen = pScreen->CloseScreen;
     pScreen->CloseScreen = FFBCloseScreen;
     pScreen->SaveScreen = FFBSaveScreen;
@@ -1034,34 +945,34 @@
 static Bool
 FFBCloseScreen(int scrnIndex, ScreenPtr pScreen)
 {
-    ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-    FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
 
-#ifdef XF86DRI
-    if (pFfb->dri_enabled)
-	    FFBDRICloseScreen(pScreen);
+#if 0 /*def XF86DRI*/
+	if (pFfb->dri_enabled)
+		FFBDRICloseScreen(pScreen);
 #endif
 
-    /* Restore kernel ramdac state before we unmap registers. */
-    FFBDacFini(pFfb);
+	/* Restore kernel ramdac state before we unmap registers. */
+	FFBDacFini(pFfb);
 
-    pScrn->vtSema = FALSE;
+	pScrn->vtSema = FALSE;
 
-    xf86UnmapSbusMem(pFfb->psdp, pFfb->dfb24, 0x1000000);
-    xf86UnmapSbusMem(pFfb->psdp, pFfb->dfb8r, 0x400000);
-    xf86UnmapSbusMem(pFfb->psdp, pFfb->dfb8x, 0x400000);
-    xf86UnmapSbusMem(pFfb->psdp, pFfb->sfb32, 0x1000000);
-    xf86UnmapSbusMem(pFfb->psdp, pFfb->sfb8r, 0x400000);
-    xf86UnmapSbusMem(pFfb->psdp, pFfb->sfb8x, 0x400000);
-    xf86UnmapSbusMem(pFfb->psdp, pFfb->regs, 16384);
-    xf86UnmapSbusMem(pFfb->psdp, pFfb->dac, 8192);
-    xf86UnmapSbusMem(pFfb->psdp, (void *)pFfb->strapping_bits, 8192);
+	xf86UnmapSbusMem(pFfb->psdp, pFfb->dfb24, 0x1000000);
+	xf86UnmapSbusMem(pFfb->psdp, pFfb->dfb8r, 0x400000);
+	xf86UnmapSbusMem(pFfb->psdp, pFfb->dfb8x, 0x400000);
+	xf86UnmapSbusMem(pFfb->psdp, pFfb->sfb32, 0x1000000);
+	xf86UnmapSbusMem(pFfb->psdp, pFfb->sfb8r, 0x400000);
+	xf86UnmapSbusMem(pFfb->psdp, pFfb->sfb8x, 0x400000);
+	xf86UnmapSbusMem(pFfb->psdp, pFfb->regs, 16384);
+	xf86UnmapSbusMem(pFfb->psdp, pFfb->dac, 8192);
+	xf86UnmapSbusMem(pFfb->psdp, (void *)pFfb->strapping_bits, 8192);
 
-    if (pFfb->HWCursor)
-	xf86SbusHideOsHwCursor (pFfb->psdp);
+	if (pFfb->HWCursor)
+		xf86SbusHideOsHwCursor (pFfb->psdp);
 
-    pScreen->CloseScreen = pFfb->CloseScreen;
-    return (*pScreen->CloseScreen)(scrnIndex, pScreen);
+	pScreen->CloseScreen = pFfb->CloseScreen;
+	return (*pScreen->CloseScreen)(scrnIndex, pScreen);
 }
 
 
@@ -1071,7 +982,7 @@
 static void
 FFBFreeScreen(int scrnIndex, int flags)
 {
-    FFBFreeRec(xf86Screens[scrnIndex]);
+	FFBFreeRec(xf86Screens[scrnIndex]);
 }
 
 
@@ -1081,10 +992,10 @@
 static int
 FFBValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
 {
-    if (mode->Flags & V_INTERLACE)
-	return(MODE_BAD);
+	if (mode->Flags & V_INTERLACE)
+		return MODE_BAD;
 
-    return(MODE_OK);
+	return MODE_OK;
 }
 
 /* Do screen blanking */
@@ -1102,6 +1013,14 @@
     return FFBDacSaveScreen(GET_FFB_FROM_SCREEN(pScreen), mode);
 }
 
+static void
+FFBDPMSSet(ScrnInfoPtr pScrn, int mode, int flags)
+{
+	FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
+
+	FFBDacDPMSMode(pFfb, mode, 0);
+}
+
 /*
  * This is the implementation of the Sync() function.
  */
diff -urN xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_rcache.h xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_rcache.h
--- xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_rcache.h	2000-05-23 00:47:45.000000000 -0400
+++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_rcache.h	2004-06-10 23:38:50.762530640 -0400
@@ -41,13 +41,13 @@
  * a nice idea...
  */
 #define FFB_WRITE_PPC(__fpriv, __ffb, __val, __chg_mask) \
-do {	unsigned int oldval = (__fpriv)->ppc_cache; \
+do {	unsigned int __oldval = (__fpriv)->ppc_cache; \
 	unsigned int __t; \
-	__t = (oldval & (__chg_mask)) ^ (__val); \
+	__t = (__oldval & (__chg_mask)) ^ (__val); \
 	if (__t) { \
-		unsigned int newval = oldval & ~(__chg_mask); \
-		newval |= (__val); \
-		(__fpriv)->ppc_cache = newval; \
+		unsigned int __newval = __oldval & ~(__chg_mask); \
+		__newval |= (__val); \
+		(__fpriv)->ppc_cache = __newval; \
 		FFBFifo((__fpriv), 1); \
 		(__ffb)->ppc = (__val); \
 	} \
@@ -178,22 +178,22 @@
 #define FFB_ATTR_FFWIN(__fpriv, __pwin, __ppc, __pixel) \
 do {	CreatorPrivWinPtr __winpriv = CreatorGetWindowPrivate(__pwin);	\
 	unsigned int ___ppc = (__ppc) | FFB_PPC_XS_WID;			\
-	unsigned int fbc = (__winpriv)->fbc_base; \
-	unsigned int rop = (FFB_ROP_NEW|(FFB_ROP_NEW<<8)); \
+	unsigned int __fbc = (__winpriv)->fbc_base; \
+	unsigned int __rop = (FFB_ROP_NEW|(FFB_ROP_NEW<<8)); \
 	if((__fpriv)->has_double_buffer) { \
-		fbc &= ~FFB_FBC_WB_MASK; \
-		fbc |= FFB_FBC_WB_AB; \
+		__fbc &= ~FFB_FBC_WB_MASK; \
+		__fbc |= FFB_FBC_WB_AB; \
 	} \
-	fbc &= ~(FFB_FBC_XE_MASK | FFB_FBC_RGBE_MASK); \
-	fbc |= FFB_FBC_XE_ON | FFB_FBC_RGBE_ON; \
+	__fbc &= ~(FFB_FBC_XE_MASK | FFB_FBC_RGBE_MASK); \
+	__fbc |= FFB_FBC_XE_ON | FFB_FBC_RGBE_ON; \
 	if (pFfb->ffb_res == ffb_res_high) \
-		fbc |= FFB_FBC_WB_B; \
+		__fbc |= FFB_FBC_WB_B; \
 	if ((((__fpriv)->ppc_cache & FFB_PPC_WINMASK) != (___ppc))||	\
 	    ((__fpriv)->pmask_cache != 0x00ffffff)		||	\
-	    ((__fpriv)->rop_cache!= rop)			||	\
+	    ((__fpriv)->rop_cache!= __rop)			||	\
 	    ((__fpriv)->drawop_cache != FFB_DRAWOP_FASTFILL)	||	\
 	    ((__fpriv)->fg_cache != (__pixel))			||	\
-	    ((__fpriv)->fbc_cache != fbc)			||	\
+	    ((__fpriv)->fbc_cache != __fbc)			||	\
 	    ((__fpriv)->wid_cache != ((__winpriv)->wid)))		\
 		__FFB_Attr_FastfillWin(__fpriv, __pwin, ___ppc, __pixel);\
 } while (0)
@@ -215,29 +215,29 @@
 				 FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_ON)
 
 #define FFB_ATTR_SFB_VAR_WINCOPY(__fpriv) \
-do {	unsigned int ppc = FFB_PPC_WINCOPY; \
-	unsigned int ppc_mask = FFB_PPC_WINCOPY_MASK; \
-	unsigned int rop = FFB_ROP_NEW|(FFB_ROP_NEW<<8); \
-	unsigned int fbc = FFB_FBC_WINCOPY; \
+do {	unsigned int __ppc = FFB_PPC_WINCOPY; \
+	unsigned int __ppc_mask = FFB_PPC_WINCOPY_MASK; \
+	unsigned int __rop = FFB_ROP_NEW|(FFB_ROP_NEW<<8); \
+	unsigned int __fbc = FFB_FBC_WINCOPY; \
 	if((__fpriv)->has_double_buffer) { \
-		fbc &= ~FFB_FBC_WB_MASK; \
-		fbc |= FFB_FBC_WB_AB; \
+		__fbc &= ~FFB_FBC_WB_MASK; \
+		__fbc |= FFB_FBC_WB_AB; \
 	} \
-	if (((__fpriv)->ppc_cache & ppc_mask) != ppc || \
-	    (__fpriv)->fbc_cache != fbc || \
-	    (__fpriv)->rop_cache != rop || \
+	if (((__fpriv)->ppc_cache & __ppc_mask) != __ppc || \
+	    (__fpriv)->fbc_cache != __fbc || \
+	    (__fpriv)->rop_cache != __rop || \
 	    (__fpriv)->pmask_cache != 0xffffffff) { \
 		ffb_fbcPtr __ffb = (__fpriv)->regs; \
-		(__fpriv)->ppc_cache &= ~ppc_mask; \
-		(__fpriv)->ppc_cache |= ppc; \
-		(__fpriv)->fbc_cache = fbc; \
-		(__fpriv)->rop_cache = rop; \
+		(__fpriv)->ppc_cache &= ~__ppc_mask; \
+		(__fpriv)->ppc_cache |= __ppc; \
+		(__fpriv)->fbc_cache = __fbc; \
+		(__fpriv)->rop_cache = __rop; \
 		(__fpriv)->pmask_cache = 0xffffffff; \
 		(__fpriv)->rp_active = 1; \
 		FFBFifo(__fpriv, 4); \
-		(__ffb)->ppc = ppc; \
-		(__ffb)->fbc = fbc; \
-		(__ffb)->rop = rop; \
+		(__ffb)->ppc = __ppc; \
+		(__ffb)->fbc = __fbc; \
+		(__ffb)->rop = __rop; \
 		(__ffb)->pmask = 0xffffffff; \
 		(__fpriv)->rp_active = 1; \
 	} \
@@ -247,21 +247,21 @@
 			       unsigned int wid, unsigned int rop, unsigned int pmask);
 
 #define FFB_ATTR_SFB_VAR_WIN(__fpriv, __pmask, __alu, __pwin) \
-do {	unsigned int ppc = FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \
-	unsigned int ppc_mask = FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \
-	unsigned int rop = (FFB_ROP_EDIT_BIT | (__alu))|(FFB_ROP_NEW<<8); \
-	unsigned int fbc = FFB_FBC_WIN(__pwin); \
+do {	unsigned int __ppc = FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \
+	unsigned int __ppc_mask = FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \
+	unsigned int __rop = (FFB_ROP_EDIT_BIT | (__alu))|(FFB_ROP_NEW<<8); \
+	unsigned int __fbc = FFB_FBC_WIN(__pwin); \
 	if((__fpriv)->has_double_buffer) { \
-		fbc &= ~FFB_FBC_WB_MASK; \
-		fbc |= FFB_FBC_WB_AB; \
+		__fbc &= ~FFB_FBC_WB_MASK; \
+		__fbc |= FFB_FBC_WB_AB; \
 	} \
-	if(((__fpriv)->ppc_cache & ppc_mask) != ppc || \
-	   (__fpriv)->fbc_cache != fbc || \
+	if(((__fpriv)->ppc_cache & __ppc_mask) != __ppc || \
+	   (__fpriv)->fbc_cache != __fbc || \
 	   (__fpriv)->wid_cache != FFB_WID_WIN(__pwin) || \
-	   (__fpriv)->rop_cache != rop || \
+	   (__fpriv)->rop_cache != __rop || \
 	   (__fpriv)->pmask_cache != (__pmask)) \
-		__FFB_Attr_SFB_VAR(__fpriv, ppc, ppc_mask, fbc, \
-				   FFB_WID_WIN(__pwin), rop, (__pmask)); \
+		__FFB_Attr_SFB_VAR(__fpriv, __ppc, __ppc_mask, __fbc, \
+				   FFB_WID_WIN(__pwin), __rop, (__pmask)); \
 } while(0)
 
 /* VSCROLL Attributes:
@@ -277,25 +277,25 @@
  * PMASK) all options allowed
  */
 #define FFB_ATTR_VSCROLL_WINCOPY(__fpriv) \
-do {	unsigned int rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \
-	unsigned int fbc = FFB_FBC_WINCOPY; \
+do {	unsigned int __rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \
+	unsigned int __fbc = FFB_FBC_WINCOPY; \
 	if((__fpriv)->has_double_buffer) { \
-		fbc &= ~FFB_FBC_WB_MASK; \
-		fbc |= FFB_FBC_WB_AB; \
+		__fbc &= ~FFB_FBC_WB_MASK; \
+		__fbc |= FFB_FBC_WB_AB; \
 	} \
-	if((__fpriv)->fbc_cache != fbc || \
-	   (__fpriv)->rop_cache != rop || \
+	if((__fpriv)->fbc_cache != __fbc || \
+	   (__fpriv)->rop_cache != __rop || \
 	   (__fpriv)->pmask_cache != 0xffffffff || \
 	   (__fpriv)->drawop_cache != FFB_DRAWOP_VSCROLL) { \
 		ffb_fbcPtr __ffb = (__fpriv)->regs; \
-		(__fpriv)->fbc_cache = fbc; \
-		(__fpriv)->rop_cache = rop; \
+		(__fpriv)->fbc_cache = __fbc; \
+		(__fpriv)->rop_cache = __rop; \
 		(__fpriv)->pmask_cache = 0xffffffff; \
 		(__fpriv)->drawop_cache = FFB_DRAWOP_VSCROLL; \
 		(__fpriv)->rp_active = 1; \
 		FFBFifo(__fpriv, 4); \
-		(__ffb)->fbc = fbc; \
-		(__ffb)->rop = rop; \
+		(__ffb)->fbc = __fbc; \
+		(__ffb)->rop = __rop; \
 		(__ffb)->pmask = 0xffffffff; \
 		(__ffb)->drawop = FFB_DRAWOP_VSCROLL; \
 		(__fpriv)->rp_active = 1; \
@@ -303,25 +303,25 @@
 } while(0)
 
 #define FFB_ATTR_VSCROLL_WIN(__fpriv, __pmask, __pwin) \
-do {	unsigned int rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \
-	unsigned int fbc = FFB_FBC_WIN(__pwin); \
+do {	unsigned int __rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \
+	unsigned int __fbc = FFB_FBC_WIN(__pwin); \
 	if((__fpriv)->has_double_buffer) { \
-		fbc &= ~FFB_FBC_WB_MASK; \
-		fbc |= FFB_FBC_WB_AB; \
+		__fbc &= ~FFB_FBC_WB_MASK; \
+		__fbc |= FFB_FBC_WB_AB; \
 	} \
-	if((__fpriv)->fbc_cache != fbc || \
-	   (__fpriv)->rop_cache != rop || \
+	if((__fpriv)->fbc_cache != __fbc || \
+	   (__fpriv)->rop_cache != __rop || \
 	   (__fpriv)->pmask_cache != (__pmask) || \
 	   (__fpriv)->drawop_cache != FFB_DRAWOP_VSCROLL) { \
 		ffb_fbcPtr __ffb = (__fpriv)->regs; \
-		(__fpriv)->fbc_cache = fbc; \
-		(__fpriv)->rop_cache = rop; \
+		(__fpriv)->fbc_cache = __fbc; \
+		(__fpriv)->rop_cache = __rop; \
 		(__fpriv)->pmask_cache = (__pmask); \
 		(__fpriv)->drawop_cache = FFB_DRAWOP_VSCROLL; \
 		(__fpriv)->rp_active = 1; \
 		FFBFifo(__fpriv, 4); \
-		(__ffb)->fbc = fbc; \
-		(__ffb)->rop = rop; \
+		(__ffb)->fbc = __fbc; \
+		(__ffb)->rop = __rop; \
 		(__ffb)->pmask = (__pmask); \
 		(__ffb)->drawop = FFB_DRAWOP_VSCROLL; \
 	} \
diff -urN xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_regs.h xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_regs.h
--- xc/programs/Xserver/hw/xfree86/drivers/sunffb.orig/ffb_regs.h	2000-05-18 19:21:37.000000000 -0400
+++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_regs.h	2004-06-10 23:38:50.765530184 -0400
@@ -432,6 +432,19 @@
 #define FFB_MER_EDRA		0x000000c0 /* Enable read-ahead, decreasing */
 #define FFB_MER_DRA		0x00000040 /* No read-ahead */
 
+/* Alpha Blend Control */
+#define FFB_BLENDC_FORCE_ONE	0x00000010 /* Defines 0xff as 1.0 */
+#define FFB_BLENDC_DF_MASK	0x0000000c /* Destination Frac Mask */
+#define FFB_BLENDC_DF_ZERO	0x00000000 /* Destination Frac: 0.00 */
+#define FFB_BLENDC_DF_ONE	0x00000004 /* Destination Frac: 1.00 */
+#define FFB_BLENDC_DF_ONE_M_A	0x00000008 /* Destination Frac: 1.00 - Xsrc */
+#define FFB_BLENDC_DF_A		0x0000000c /* Destination Frac: Xsrc */
+#define FFB_BLENDC_SF_MASK	0x00000003 /* Source Frac Mask */
+#define FFB_BLENDC_SF_ZERO	0x00000000 /* Source Frac: 0.00 */
+#define FFB_BLENDC_SF_ONE	0x00000001 /* Source Frac: 1.00 */
+#define FFB_BLENDC_SF_ONE_M_A	0x00000002 /* Source Frac: 1.00 - Xsrc */
+#define FFB_BLENDC_SF_A		0x00000003 /* Source Frac: Xsrc */
+
 /* FBram Config 0 */
 #define FFB_FBCFG0_RFTIME	0xff800000
 #define FFB_FBCFG0_XMAX		0x007c0000

Reply to: