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

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



Author: branden
Date: 2004-03-16 15:37:47 -0500 (Tue, 16 Mar 2004)
New Revision: 1153

Added:
   trunk/debian/patches/072_Xserver_fb_convert_RGB_to_BGR.diff
Removed:
   trunk/debian/patches/072_Xserver_fb_convert_RGB_to_BGR.diff
   trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff
Modified:
   trunk/debian/changelog
Log:
Revert patch applied in 4.3.0-3 to enhance the sunffb driver;
unfortunately, it does not build.  (Closes: #236705)
+ Apply patch by David S. Miller to implement XAA and Render support in
  the sunffb driver.

Reverts r1079, except for debian/changelog.


Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	2004-03-16 10:13:46 UTC (rev 1152)
+++ trunk/debian/changelog	2004-03-16 20:37:47 UTC (rev 1153)
@@ -1,5 +1,7 @@
-xfree86 (4.3.0-6) unstable; urgency=low
+xfree86 (4.3.0-6) unstable; urgency=medium
 
+  * Urgency due to fix for FTBFS on SPARC.
+
   * Fix build-server rule to copy a hardlinked source tree for the debugging
     server build exactly as the normal build rule does; the clever tricks
     undertaken to conserve inodes did not work properly (thanks, Daniel
@@ -33,8 +35,14 @@
     system.  However, that's the user's decision.  (Closes: #236780)
     - debian/control
 
- -- Branden Robinson <branden@debian.org>  Tue, 16 Mar 2004 05:01:45 -0500
+  * Revert patch applied in 4.3.0-3 to enhance the sunffb driver;
+    unfortunately, it does not build.  (Closes: #236705)
+    + 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: deleted
 
+ -- Branden Robinson <branden@debian.org>  Tue, 16 Mar 2004 15:19:02 -0500
+
 xfree86 (4.3.0-5) unstable; urgency=medium
 
   * Urgency due to fix for FTBFS on some architectures.

Deleted: trunk/debian/patches/072_Xserver_fb_convert_RGB_to_BGR.diff
===================================================================
--- trunk/debian/patches/072_Xserver_fb_convert_RGB_to_BGR.diff	2004-03-16 10:13:46 UTC (rev 1152)
+++ trunk/debian/patches/072_Xserver_fb_convert_RGB_to_BGR.diff	2004-03-16 20:37:47 UTC (rev 1153)
@@ -1,96 +0,0 @@
-$Id$
-
-Fix up case where we need to convert RGB->BGR (fixes SDL under sunffb, for
-example).
-
-This patch by David S. Miller via Ben Collins.
-
-Not submitted to XFree86.
-
---- xc.orig/programs/Xserver/fb/fbpict.c	2002-12-13 20:46:02.000000000 -0500
-+++ xc/programs/Xserver/fb/fbpict.c	2004-02-17 10:44:46.000000000 -0500
-@@ -99,7 +99,7 @@
-     return m|n|o|p;
- }
- 
--#define fbComposeGetSolid(pict, bits) { \
-+#define fbComposeGetSolid(pict, bits, fmt) { \
-     FbBits	*__bits__; \
-     FbStride	__stride__; \
-     int		__bpp__; \
-@@ -120,6 +120,14 @@
-     default: \
- 	return; \
-     } \
-+    /* If necessary, convert RGB <--> BGR. */ \
-+    if (PICT_FORMAT_TYPE((pict)->format) != PICT_FORMAT_TYPE(fmt)) \
-+    { \
-+        (bits) = (((bits) & 0xff000000) | \
-+                  (((bits) & 0x00ff0000) >> 16) | \
-+                  (((bits) & 0x0000ff00) >>  0) | \
-+                  (((bits) & 0x000000ff) << 16)); \
-+    } \
-     /* manage missing src alpha */ \
-     if ((pict)->pFormat->direct.alphaMask == 0) \
- 	(bits) |= 0xff000000; \
-@@ -162,13 +170,13 @@
-     FbStride	dstStride, maskStride;
-     CARD16	w;
- 
--    fbComposeGetSolid(pSrc, src);
-+    fbComposeGetSolid(pSrc, src, pDst->format);
-     
-     dstMask = FbFullMask (pDst->pDrawable->depth);
-     srca = src >> 24;
-     if (src == 0)
- 	return;
--    
-+
-     fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-     fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
-     
-@@ -221,7 +229,7 @@
-     CARD16	w;
-     CARD32	m, n, o, p;
- 
--    fbComposeGetSolid(pSrc, src);
-+    fbComposeGetSolid(pSrc, src, pDst->format);
-     
-     dstMask = FbFullMask (pDst->pDrawable->depth);
-     srca = src >> 24;
-@@ -294,7 +302,7 @@
-     FbStride	dstStride, maskStride;
-     CARD16	w;
- 
--    fbComposeGetSolid(pSrc, src);
-+    fbComposeGetSolid(pSrc, src, pDst->format);
-     
-     srca = src >> 24;
-     if (src == 0)
-@@ -356,7 +364,7 @@
-     FbStride	dstStride, maskStride;
-     CARD16	w;
- 
--    fbComposeGetSolid(pSrc, src);
-+    fbComposeGetSolid(pSrc, src, pDst->format);
-     
-     srca = src >> 24;
-     if (src == 0)
-@@ -421,7 +429,7 @@
-     CARD16	w;
-     CARD32	m, n, o;
- 
--    fbComposeGetSolid(pSrc, src);
-+    fbComposeGetSolid(pSrc, src, pDst->format);
-     
-     srca = src >> 24;
-     if (src == 0)
-@@ -826,7 +834,7 @@
-     int		maskXoff, maskYoff;
-     FbBits	src;
-     
--    fbComposeGetSolid(pSrc, src);
-+    fbComposeGetSolid(pSrc, src, pDst->format);
- 
-     if ((src & 0xff000000) != 0xff000000)
-     {

Copied: trunk/debian/patches/072_Xserver_fb_convert_RGB_to_BGR.diff (from rev 1078, trunk/debian/patches/072_Xserver_fb_convert_RGB_to_BGR.diff)


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

Deleted: trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff
===================================================================
--- trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff	2004-03-16 10:13:46 UTC (rev 1152)
+++ trunk/debian/patches/073_sunffb_xaa_render_fb_support.diff	2004-03-16 20:37:47 UTC (rev 1153)
@@ -1,2569 +0,0 @@
-$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 */



Reply to: