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

X Strike Force XFree86 SVN commit: r1079 - in trunk/debian: . patches



Author: branden
Date: 2004-02-19 17:31:53 -0500 (Thu, 19 Feb 2004)
New Revision: 1079

Added:
   trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff
Modified:
   trunk/debian/changelog
Log:
Apply patch by David S. Miller to implement XAA and Render support in the
sunffb driver.


Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	2004-02-19 22:30:01 UTC (rev 1078)
+++ trunk/debian/changelog	2004-02-19 22:31:53 UTC (rev 1079)
@@ -51,8 +51,12 @@
     colorspace conversion in the X server's fb layer.
     - debian/patches/072_Xserver_fb_convert_RGB_to_BGR.diff
 
- -- Branden Robinson <branden@debian.org>  Thu, 19 Feb 2004 17:28:19 -0500
+  * Apply patch by David S. Miller to implement XAA and Render support in the
+    sunffb driver.
+    - debian/patches/073_sunffb_xaa_render_fb_support.diff
 
+ -- Branden Robinson <branden@debian.org>  Thu, 19 Feb 2004 17:31:00 -0500
+
 xfree86 (4.3.0-2) unstable; urgency=low
 
   * The "It's like I have a shotgun in my mouth, I've got my finger on the

Added: trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff
===================================================================
--- trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff	2004-02-19 22:30:01 UTC (rev 1078)
+++ trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff	2004-02-19 22:31:53 UTC (rev 1079)
@@ -0,0 +1,2569 @@
+$Id$
+
+Implement XAA and Render extension in sunffb driver.
+
+This patch by David S. Miller via Ben Collins.
+
+Not submitted to XFree86.
+
+diff -urN xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/Imakefile xc/programs/Xserver/hw/xfree86/drivers/sunffb/Imakefile
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/Imakefile	2002-09-16 14:06:01.000000000 -0400
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/Imakefile	2004-02-17 10:47:51.000000000 -0500
+@@ -75,9 +75,10 @@
+ INCLUDES = -I. -I../../include
+ #else
+ INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \
+-           -I$(SERVERSRC)/mfb -I$(SERVERSRC)/mi \
+-           -I$(SERVERSRC)/Xext -I$(SERVERSRC)/cfb \
++           -I$(SERVERSRC)/mfb -I$(SERVERSRC)/mi -I$(SERVERSRC)/fb \
++           -I$(SERVERSRC)/Xext -I$(SERVERSRC)/cfb -I$(SERVERSRC)/render \
+ 	   -I$(SERVERSRC)/dbe \
++	   -I$(XF86SRC)/xaa \
+ 	   -I$(XF86SRC)/xf8_32wid \
+ 	   -I$(XF86SRC)/ramdac \
+ 	   -I$(XF86SRC)/ddc \
+diff -urN xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb.h xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb.h
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb.h	2002-12-05 21:44:03.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb.h	2004-02-17 10:51:43.000000000 -0500
+@@ -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,18 @@
+ 	unsigned char has_z_buffer;
+ 	unsigned char has_double_buffer;
+ 
++	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.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_accel.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_accel.c
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_accel.c	2001-03-03 17:41:34.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_accel.c	2004-02-17 10:47:51.000000000 -0500
+@@ -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"
+@@ -54,6 +41,7 @@
+ #include	"ffb_regs.h"
+ #include	"ffb_stip.h"
+ #include 	"ffb_gc.h"
++#include 	"ffb_vis.h"
+ 
+ int	CreatorScreenPrivateIndex;
+ int	CreatorGCPrivateIndex;
+@@ -69,690 +57,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 +845,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 +863,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 +1057,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 +1089,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.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_bcopy.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_bcopy.c
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_bcopy.c	2000-05-23 00:47:44.000000000 -0400
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_bcopy.c	2004-02-17 10:47:51.000000000 -0500
+@@ -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.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dac.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dac.c
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dac.c	2002-12-05 21:44:03.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dac.c	2004-02-17 10:53:01.000000000 -0500
+@@ -41,6 +41,11 @@
+ #define DPMS_SPIN_COUNT 100
+ #endif  /* DPMS_SPIN_COUNT */
+ 
++#ifndef DPMS_SERVER
++# define DPMS_SERVER
++#endif
++#include "extensions/dpms.h"
++
+ /* Cursor programming */
+ 
+ void
+diff -urN xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c	2000-10-17 12:53:17.000000000 -0400
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c	2004-02-17 10:47:51.000000000 -0500
+@@ -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.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_driver.c xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_driver.c
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_driver.c	2002-12-05 21:44:04.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_driver.c	2004-02-17 10:47:51.000000000 -0500
+@@ -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 */
+diff -urN xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_rcache.h xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_rcache.h
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_rcache.h	2000-05-23 00:47:45.000000000 -0400
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_rcache.h	2004-02-17 10:47:51.000000000 -0500
+@@ -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.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_regs.h xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_regs.h
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_regs.h	2000-05-18 19:21:37.000000000 -0400
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_regs.h	2004-02-17 10:47:51.000000000 -0500
+@@ -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
+diff -urN xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_vis.h xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_vis.h
+--- xc.orig/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_vis.h	1969-12-31 19:00:00.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_vis.h	2004-02-17 10:47:51.000000000 -0500
+@@ -0,0 +1,32 @@
++/*
++ * Acceleration for the Creator and Creator3D framebuffer - VIS asm extern decls.
++ *
++ * Copyright (C) 2003 David S. Miller (davem@redhat.com)
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
++ * JAKUB JELINEK, MICHAL REHACEK, OR DAVID MILLER BE LIABLE FOR ANY CLAIM,
++ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
++ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
++ * USE OR OTHER DEALINGS IN THE SOFTWARE.
++ *
++ */
++
++#ifndef FFBVIS_H
++#define FFBVIS_H
++
++extern void VISmoveImageLR(unsigned char *, unsigned char *, long, long, long, long);
++extern void VISmoveImageRL(unsigned char *, unsigned char *, long, long, long, long);
++
++#endif /* FFBVIS_H */


Property changes on: trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff
___________________________________________________________________
Name: svn:keywords
   + Id



Reply to: