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