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 <[EMAIL PROTECTED]>  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 <[EMAIL PROTECTED]>  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 via email to