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 */