ffb_accel.c revision 7f8af526
1dbbd9e4bSmacallan/*
2dbbd9e4bSmacallan * Acceleration for the Creator and Creator3D framebuffer.
3dbbd9e4bSmacallan *
4dbbd9e4bSmacallan * Copyright (C) 1998,1999,2000 Jakub Jelinek (jakub@redhat.com)
5dbbd9e4bSmacallan * Copyright (C) 1998 Michal Rehacek (majkl@iname.com)
6dbbd9e4bSmacallan * Copyright (C) 1999,2000 David S. Miller (davem@redhat.com)
7dbbd9e4bSmacallan *
8dbbd9e4bSmacallan * Permission is hereby granted, free of charge, to any person obtaining a copy
9dbbd9e4bSmacallan * of this software and associated documentation files (the "Software"), to deal
10dbbd9e4bSmacallan * in the Software without restriction, including without limitation the rights
11dbbd9e4bSmacallan * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12dbbd9e4bSmacallan * copies of the Software, and to permit persons to whom the Software is
13dbbd9e4bSmacallan * furnished to do so, subject to the following conditions:
14dbbd9e4bSmacallan *
15dbbd9e4bSmacallan * The above copyright notice and this permission notice shall be included in
16dbbd9e4bSmacallan * all copies or substantial portions of the Software.
17dbbd9e4bSmacallan *
18dbbd9e4bSmacallan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19dbbd9e4bSmacallan * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20dbbd9e4bSmacallan * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21dbbd9e4bSmacallan * JAKUB JELINEK, MICHAL REHACEK, OR DAVID MILLER BE LIABLE FOR ANY CLAIM,
22dbbd9e4bSmacallan * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23dbbd9e4bSmacallan * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24dbbd9e4bSmacallan * USE OR OTHER DEALINGS IN THE SOFTWARE.
25dbbd9e4bSmacallan *
26dbbd9e4bSmacallan */
27dbbd9e4bSmacallan/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_accel.c,v 1.6tsi Exp $ */
28dbbd9e4bSmacallan
29dbbd9e4bSmacallan#ifdef HAVE_CONFIG_H
30dbbd9e4bSmacallan#include "config.h"
31dbbd9e4bSmacallan#endif
32dbbd9e4bSmacallan
33dbbd9e4bSmacallan#include	"scrnintstr.h"
34dbbd9e4bSmacallan#include	"pixmapstr.h"
35dbbd9e4bSmacallan#include	"regionstr.h"
36dbbd9e4bSmacallan#include	"mistruct.h"
37dbbd9e4bSmacallan#include	"miline.h"
38dbbd9e4bSmacallan#include	"fb.h"
39dbbd9e4bSmacallan#include	"xaa.h"
40dbbd9e4bSmacallan
41dbbd9e4bSmacallan#include	"ffb.h"
42dbbd9e4bSmacallan#include	"ffb_fifo.h"
43dbbd9e4bSmacallan#include	"ffb_rcache.h"
44dbbd9e4bSmacallan#include	"ffb_loops.h"
45dbbd9e4bSmacallan#include	"ffb_regs.h"
46dbbd9e4bSmacallan
47dbbd9e4bSmacallan/* Indexed by ffb resolution enum. */
48dbbd9e4bSmacallanstruct fastfill_parms ffb_fastfill_parms[] = {
49dbbd9e4bSmacallan	/* fsmall, psmall,  ffh,  ffw,  pfh,  pfw */
50dbbd9e4bSmacallan	{  0x00c0, 0x1400, 0x04, 0x08, 0x10, 0x50 },	/* Standard: 1280 x 1024 */
51dbbd9e4bSmacallan	{  0x0140, 0x2800, 0x04, 0x10, 0x10, 0xa0 },	/* High:     1920 x 1360 */
52dbbd9e4bSmacallan	{  0x0080, 0x0a00, 0x02, 0x08, 0x08, 0x50 },	/* Stereo:   960  x 580  */
53dbbd9e4bSmacallan/*XXX*/	{  0x00c0, 0x0a00, 0x04, 0x08, 0x08, 0x50 },	/* Portrait: 1280 x 2048 XXX */
54dbbd9e4bSmacallan};
55dbbd9e4bSmacallan
56dbbd9e4bSmacallanvoid
57dbbd9e4bSmacallanCreatorVtChange (ScreenPtr pScreen, int enter)
58dbbd9e4bSmacallan{
59dbbd9e4bSmacallan	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
60dbbd9e4bSmacallan	FFBPtr pFfb = GET_FFB_FROM_SCRN (pScrn);
61dbbd9e4bSmacallan	ffb_fbcPtr ffb = pFfb->regs;
62dbbd9e4bSmacallan
63dbbd9e4bSmacallan	pFfb->rp_active = 1;
64dbbd9e4bSmacallan	FFBWait(pFfb, ffb);
65dbbd9e4bSmacallan	pFfb->fifo_cache = -1;
66dbbd9e4bSmacallan	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED |
67dbbd9e4bSmacallan			   FFB_FBC_RB_A | FFB_FBC_SB_BOTH| FFB_FBC_XE_OFF |
68dbbd9e4bSmacallan			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_MASK);
69dbbd9e4bSmacallan	pFfb->ppc_cache = (FFB_PPC_FW_DISABLE |
70dbbd9e4bSmacallan			   FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST |
71dbbd9e4bSmacallan			   FFB_PPC_XS_CONST | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST|
72dbbd9e4bSmacallan			   FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE);
73dbbd9e4bSmacallan
74dbbd9e4bSmacallan	pFfb->pmask_cache = ~0;
75dbbd9e4bSmacallan	pFfb->rop_cache = FFB_ROP_EDIT_BIT;
76dbbd9e4bSmacallan	pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE;
77dbbd9e4bSmacallan	pFfb->fg_cache = pFfb->bg_cache = 0;
78dbbd9e4bSmacallan	pFfb->fontw_cache = 32;
79dbbd9e4bSmacallan	pFfb->fontinc_cache = (1 << 16) | 0;
80dbbd9e4bSmacallan	pFfb->laststipple = NULL;
81dbbd9e4bSmacallan	FFBFifo(pFfb, 9);
82dbbd9e4bSmacallan	ffb->fbc = pFfb->fbc_cache;
83dbbd9e4bSmacallan	ffb->ppc = pFfb->ppc_cache;
84dbbd9e4bSmacallan	ffb->pmask = pFfb->pmask_cache;
85dbbd9e4bSmacallan	ffb->rop = pFfb->rop_cache;
86dbbd9e4bSmacallan	ffb->drawop = pFfb->drawop_cache;
87dbbd9e4bSmacallan	ffb->fg = pFfb->fg_cache;
88dbbd9e4bSmacallan	ffb->bg = pFfb->bg_cache;
89dbbd9e4bSmacallan	ffb->fontw = pFfb->fontw_cache;
90dbbd9e4bSmacallan	ffb->fontinc = pFfb->fontinc_cache;
91dbbd9e4bSmacallan	pFfb->rp_active = 1;
92dbbd9e4bSmacallan	FFBWait(pFfb, ffb);
93dbbd9e4bSmacallan
94dbbd9e4bSmacallan	/* Fixup the FBC/PPC caches to deal with actually using
95dbbd9e4bSmacallan	 * a WID for every ROP.
96dbbd9e4bSmacallan	 */
97dbbd9e4bSmacallan	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED |
98dbbd9e4bSmacallan			   FFB_FBC_RB_A | FFB_FBC_SB_BOTH | FFB_FBC_XE_ON |
99dbbd9e4bSmacallan			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_ON);
100dbbd9e4bSmacallan	pFfb->ppc_cache &= ~FFB_PPC_XS_MASK;
101dbbd9e4bSmacallan	pFfb->ppc_cache |= FFB_PPC_XS_WID;
102dbbd9e4bSmacallan	pFfb->wid_cache = (enter ? pFfb->xaa_wid : 0xff);
103dbbd9e4bSmacallan	FFBFifo(pFfb, 11);
104dbbd9e4bSmacallan	ffb->fbc = pFfb->fbc_cache;
105dbbd9e4bSmacallan	ffb->ppc = FFB_PPC_XS_WID;
106dbbd9e4bSmacallan	ffb->wid = pFfb->wid_cache;
107dbbd9e4bSmacallan	ffb->xpmask = 0xff;
108dbbd9e4bSmacallan	ffb->xclip = FFB_XCLIP_TEST_ALWAYS;
109dbbd9e4bSmacallan	ffb->cmp = 0x80808080;
110dbbd9e4bSmacallan	ffb->matchab = 0x80808080;
111dbbd9e4bSmacallan	ffb->magnab = 0x80808080;
112dbbd9e4bSmacallan	ffb->blendc = (FFB_BLENDC_FORCE_ONE |
113dbbd9e4bSmacallan		       FFB_BLENDC_DF_ONE_M_A |
114dbbd9e4bSmacallan		       FFB_BLENDC_SF_A);
115dbbd9e4bSmacallan	ffb->blendc1 = 0;
116dbbd9e4bSmacallan	ffb->blendc2 = 0;
117dbbd9e4bSmacallan	pFfb->rp_active = 1;
118dbbd9e4bSmacallan	FFBWait(pFfb, ffb);
119dbbd9e4bSmacallan
120dbbd9e4bSmacallan	if (enter) {
121dbbd9e4bSmacallan		pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE;
122dbbd9e4bSmacallan
123dbbd9e4bSmacallan		FFBFifo(pFfb, 5);
124dbbd9e4bSmacallan		ffb->drawop = pFfb->drawop_cache;
125dbbd9e4bSmacallan		FFB_WRITE64(&ffb->by, 0, 0);
126dbbd9e4bSmacallan		FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width);
127dbbd9e4bSmacallan		pFfb->rp_active = 1;
128dbbd9e4bSmacallan		FFBWait(pFfb, ffb);
129dbbd9e4bSmacallan
130dbbd9e4bSmacallan		SET_SYNC_FLAG(pFfb->pXAAInfo);
131dbbd9e4bSmacallan	}
132dbbd9e4bSmacallan}
133dbbd9e4bSmacallan
134dbbd9e4bSmacallan#ifdef DEBUG_FFB
135dbbd9e4bSmacallanFILE *FDEBUG_FD = NULL;
136dbbd9e4bSmacallan#endif
137dbbd9e4bSmacallan
138dbbd9e4bSmacallan#define FFB_ATTR_SFB_VAR_XAA(__fpriv, __pmask, __alu) \
139dbbd9e4bSmacallando {   unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \
140dbbd9e4bSmacallan       unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \
141dbbd9e4bSmacallan       unsigned int __rop = (FFB_ROP_EDIT_BIT | (__alu))|(FFB_ROP_NEW<<8); \
142dbbd9e4bSmacallan       unsigned int __fbc = (__fpriv)->xaa_fbc; \
143dbbd9e4bSmacallan       unsigned int __wid = (__fpriv)->xaa_wid; \
144dbbd9e4bSmacallan       if (((__fpriv)->ppc_cache & __ppc_mask) != __ppc || \
145dbbd9e4bSmacallan           (__fpriv)->fbc_cache != __fbc || \
146dbbd9e4bSmacallan           (__fpriv)->wid_cache != __wid || \
147dbbd9e4bSmacallan           (__fpriv)->rop_cache != __rop || \
148dbbd9e4bSmacallan           (__fpriv)->pmask_cache != (__pmask)) \
149dbbd9e4bSmacallan               __FFB_Attr_SFB_VAR(__fpriv, __ppc, __ppc_mask, __fbc, \
150dbbd9e4bSmacallan                                  __wid, __rop, (__pmask)); \
151dbbd9e4bSmacallan} while(0)
152dbbd9e4bSmacallan
153dbbd9e4bSmacallan#define FFB_ATTR_VSCROLL_XAA(__fpriv, __pmask) \
1547f8af526Smacallando {    unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \
1557f8af526Smacallan        unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \
1567f8af526Smacallan        unsigned int __rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \
1577f8af526Smacallan        unsigned int __fbc = (__fpriv)->xaa_fbc; \
1587f8af526Smacallan        (__fpriv)->ppc_cache &= ~__ppc_mask; \
1597f8af526Smacallan        (__fpriv)->ppc_cache |= __ppc; \
1607f8af526Smacallan        (__fpriv)->regs->ppc = __ppc; \
1617f8af526Smacallan        if ((__fpriv)->fbc_cache != __fbc || \
1627f8af526Smacallan            (__fpriv)->rop_cache != __rop || \
1637f8af526Smacallan            (__fpriv)->pmask_cache != (__pmask) || \
1647f8af526Smacallan            (__fpriv)->drawop_cache != FFB_DRAWOP_VSCROLL) { \
1657f8af526Smacallan                ffb_fbcPtr __ffb = (__fpriv)->regs; \
1667f8af526Smacallan                (__fpriv)->fbc_cache = __fbc; \
1677f8af526Smacallan                (__fpriv)->rop_cache = __rop; \
1687f8af526Smacallan                (__fpriv)->pmask_cache = (__pmask); \
1697f8af526Smacallan                (__fpriv)->drawop_cache = FFB_DRAWOP_VSCROLL; \
1707f8af526Smacallan                (__fpriv)->rp_active = 1; \
1717f8af526Smacallan                FFBFifo(__fpriv, 4); \
1727f8af526Smacallan                (__ffb)->fbc = __fbc; \
1737f8af526Smacallan                (__ffb)->rop = __rop; \
1747f8af526Smacallan                (__ffb)->pmask = (__pmask); \
1757f8af526Smacallan                (__ffb)->drawop = FFB_DRAWOP_VSCROLL; \
1767f8af526Smacallan        } \
177dbbd9e4bSmacallan} while(0)
178dbbd9e4bSmacallan
1797f8af526Smacallan
180dbbd9e4bSmacallanstatic CARD32 FFBAlphaTextureFormats[2] = { PICT_a8, 0 };
181dbbd9e4bSmacallanstatic CARD32 FFBTextureFormats[2] = { PICT_a8b8g8r8, 0 };
1827f8af526Smacallanstatic CARD32 FFBTextureDstFormats[3] = { PICT_a8b8g8r8, PICT_x8b8g8r8, 0 };
183dbbd9e4bSmacallan
184dbbd9e4bSmacallanstatic void FFB_SetupTextureAttrs(FFBPtr pFfb)
185dbbd9e4bSmacallan{
186dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
187dbbd9e4bSmacallan       unsigned int ppc = FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_VAR;
188dbbd9e4bSmacallan       unsigned int ppc_mask = FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK;
189dbbd9e4bSmacallan       unsigned int rop = FFB_ROP_NEW | (FFB_ROP_NEW << 8);
190dbbd9e4bSmacallan       unsigned int fbc = pFfb->xaa_fbc;
191dbbd9e4bSmacallan       unsigned int wid = pFfb->xaa_wid;
192dbbd9e4bSmacallan
193dbbd9e4bSmacallan       ppc |= FFB_PPC_ABE_ENABLE;
194dbbd9e4bSmacallan       ppc_mask |= FFB_PPC_ABE_MASK;
195dbbd9e4bSmacallan
196dbbd9e4bSmacallan       if ((pFfb->ppc_cache & ppc_mask) != ppc ||
197dbbd9e4bSmacallan           pFfb->fbc_cache != fbc ||
198dbbd9e4bSmacallan           pFfb->wid_cache != wid ||
199dbbd9e4bSmacallan           pFfb->rop_cache != rop ||
200dbbd9e4bSmacallan           pFfb->pmask_cache != 0xffffffff)
201dbbd9e4bSmacallan               __FFB_Attr_SFB_VAR(pFfb, ppc, ppc_mask, fbc,
202dbbd9e4bSmacallan                                  wid, rop, 0xffffffff);
203dbbd9e4bSmacallan       FFBWait(pFfb, ffb);
204dbbd9e4bSmacallan}
205dbbd9e4bSmacallan
2067f8af526Smacallanstatic Bool FFB_SetupForCPUToScreenAlphaTexture(
2077f8af526Smacallan	ScrnInfoPtr	pScrn,
2087f8af526Smacallan	int		op,
2097f8af526Smacallan	CARD16		red,
2107f8af526Smacallan	CARD16		green,
2117f8af526Smacallan	CARD16		blue,
2127f8af526Smacallan	CARD16		alpha,
2137f8af526Smacallan	CARD32		maskFormat,
2147f8af526Smacallan	CARD32		dstFormat,
2157f8af526Smacallan	CARD8		*alphaPtr,
2167f8af526Smacallan	int		alphaPitch,
2177f8af526Smacallan	int		width,
2187f8af526Smacallan	int		height,
2197f8af526Smacallan	int		flags
2207f8af526Smacallan)
221dbbd9e4bSmacallan{
222dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
223dbbd9e4bSmacallan
224dbbd9e4bSmacallan       FFBLOG(("FFB_SetupForCPUToScreenAlphaTexture: "
225dbbd9e4bSmacallan               "argb[%04x:%04x:%04x:%04x] alpha[T(%x):P(%d)] "
226dbbd9e4bSmacallan               "wh[%d:%d] flgs[%x]\n",
227dbbd9e4bSmacallan               alpha, red, green, blue,
2287f8af526Smacallan               maskFormat, alphaPitch,
229dbbd9e4bSmacallan               width, height, flags));
230dbbd9e4bSmacallan
231dbbd9e4bSmacallan       FFB_SetupTextureAttrs(pFfb);
232dbbd9e4bSmacallan
233dbbd9e4bSmacallan       pFfb->xaa_tex = (unsigned char *) alphaPtr;
234dbbd9e4bSmacallan       pFfb->xaa_tex_pitch = alphaPitch;
235dbbd9e4bSmacallan       pFfb->xaa_tex_width = width;
236dbbd9e4bSmacallan       pFfb->xaa_tex_height = height;
237dbbd9e4bSmacallan       pFfb->xaa_tex_color = (/*((alpha >> 8) << 24) |*/
238dbbd9e4bSmacallan                              ((blue >> 8) << 16) |
239dbbd9e4bSmacallan                              ((green >> 8) << 8) |
240dbbd9e4bSmacallan                              ((red >> 8) << 0));
241dbbd9e4bSmacallan       return TRUE;
242dbbd9e4bSmacallan}
243dbbd9e4bSmacallan
244dbbd9e4bSmacallanstatic void FFB_SubsequentCPUToScreenAlphaTexture(ScrnInfoPtr pScrn,
245dbbd9e4bSmacallan                                                 int dstx, int dsty,
246dbbd9e4bSmacallan                                                 int srcx, int srcy,
247dbbd9e4bSmacallan                                                 int width, int height)
248dbbd9e4bSmacallan{
249dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
250dbbd9e4bSmacallan       unsigned char *dst_base, *alpha_base, *sfb32;
251dbbd9e4bSmacallan       unsigned int pixel_base;
252dbbd9e4bSmacallan       int psz_shift = 2;
253dbbd9e4bSmacallan
254dbbd9e4bSmacallan       FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: "
255dbbd9e4bSmacallan               "dst[%d:%d] src[%d:%d] wh[%d:%d]\n",
256dbbd9e4bSmacallan               dstx, dsty, srcx, srcy, width, height));
257dbbd9e4bSmacallan
258dbbd9e4bSmacallan       sfb32 = (unsigned char *) pFfb->sfb32;
259dbbd9e4bSmacallan       dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift);
260dbbd9e4bSmacallan       alpha_base = pFfb->xaa_tex;
261dbbd9e4bSmacallan       alpha_base += srcx;
262dbbd9e4bSmacallan       if (srcy)
263dbbd9e4bSmacallan               alpha_base += (srcy * pFfb->xaa_tex_pitch);
264dbbd9e4bSmacallan       pixel_base = pFfb->xaa_tex_color;
265dbbd9e4bSmacallan       while (height--) {
266dbbd9e4bSmacallan               unsigned int *dst = (unsigned int *) dst_base;
267dbbd9e4bSmacallan               unsigned char *alpha = alpha_base;
268dbbd9e4bSmacallan               int w = width;
269dbbd9e4bSmacallan
270dbbd9e4bSmacallan               while (w--) {
271dbbd9e4bSmacallan                       (*dst) = (((unsigned int)*alpha << 24) | pixel_base);
272dbbd9e4bSmacallan                       dst++;
273dbbd9e4bSmacallan                       alpha++;
274dbbd9e4bSmacallan	       }
275dbbd9e4bSmacallan	       dst_base += (2048 << psz_shift);
276dbbd9e4bSmacallan	       alpha_base += pFfb->xaa_tex_pitch;
277dbbd9e4bSmacallan       }
278dbbd9e4bSmacallan}
279dbbd9e4bSmacallan
280dbbd9e4bSmacallan
2817f8af526Smacallanstatic Bool FFB_SetupForCPUToScreenTexture(
2827f8af526Smacallan	ScrnInfoPtr	pScrn,
2837f8af526Smacallan	int		op,
2847f8af526Smacallan	CARD32		srcFormat,
2857f8af526Smacallan	CARD32		dstFormat,
2867f8af526Smacallan	CARD8		*texPtr,
2877f8af526Smacallan	int		texPitch,
2887f8af526Smacallan	int		width,
2897f8af526Smacallan	int		height,
2907f8af526Smacallan	int		flags
2917f8af526Smacallan)
292dbbd9e4bSmacallan{
293dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
294dbbd9e4bSmacallan
295dbbd9e4bSmacallan       FFBLOG(("FFB_SetupForCPUToScreenTexture: "
296dbbd9e4bSmacallan               "TEX[T(%x):P(%d)] "
297dbbd9e4bSmacallan               "wh[%d:%d] flgs[%x]\n",
2987f8af526Smacallan               srcFormat, texPitch,
299dbbd9e4bSmacallan               width, height, flags));
300dbbd9e4bSmacallan
301dbbd9e4bSmacallan       FFB_SetupTextureAttrs(pFfb);
302dbbd9e4bSmacallan
303dbbd9e4bSmacallan       pFfb->xaa_tex = (unsigned char *) texPtr;
304dbbd9e4bSmacallan       pFfb->xaa_tex_pitch = texPitch;
305dbbd9e4bSmacallan       pFfb->xaa_tex_width = width;
306dbbd9e4bSmacallan       pFfb->xaa_tex_height = height;
307dbbd9e4bSmacallan
308dbbd9e4bSmacallan       return TRUE;
309dbbd9e4bSmacallan}
310dbbd9e4bSmacallan
311dbbd9e4bSmacallanstatic void FFB_SubsequentCPUToScreenTexture(ScrnInfoPtr pScrn,
312dbbd9e4bSmacallan                                            int dstx, int dsty,
313dbbd9e4bSmacallan                                            int srcx, int srcy,
314dbbd9e4bSmacallan                                            int width, int height)
315dbbd9e4bSmacallan{
316dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
317dbbd9e4bSmacallan       unsigned char *dst_base, *sfb32;
318dbbd9e4bSmacallan       unsigned int *tex_base;
319dbbd9e4bSmacallan       int psz_shift = 2;
320dbbd9e4bSmacallan
321dbbd9e4bSmacallan       FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: "
322dbbd9e4bSmacallan               "dst[%d:%d] src[%d:%d] wh[%d:%d]\n",
323dbbd9e4bSmacallan               dstx, dsty, srcx, srcy, width, height));
324dbbd9e4bSmacallan
325dbbd9e4bSmacallan       sfb32 = (unsigned char *) pFfb->sfb32;
326dbbd9e4bSmacallan       dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift);
327dbbd9e4bSmacallan       tex_base = (unsigned int *) pFfb->xaa_tex;
328dbbd9e4bSmacallan       tex_base += srcx;
329dbbd9e4bSmacallan       if (srcy)
330dbbd9e4bSmacallan               tex_base += (srcy * pFfb->xaa_tex_pitch);
331dbbd9e4bSmacallan       while (height--) {
332dbbd9e4bSmacallan               unsigned int *dst = (unsigned int *) dst_base;
333dbbd9e4bSmacallan               unsigned int *tex = tex_base;
334dbbd9e4bSmacallan               int w = width;
335dbbd9e4bSmacallan               while (w--) {
336dbbd9e4bSmacallan                       (*dst) = *tex;
337dbbd9e4bSmacallan
338dbbd9e4bSmacallan                       dst++;
339dbbd9e4bSmacallan                       tex++;
340dbbd9e4bSmacallan               }
341dbbd9e4bSmacallan               dst_base += (2048 << psz_shift);
342dbbd9e4bSmacallan               tex_base += pFfb->xaa_tex_pitch;
343dbbd9e4bSmacallan       }
344dbbd9e4bSmacallan}
345dbbd9e4bSmacallan
346dbbd9e4bSmacallanstatic void FFB_WritePixmap(ScrnInfoPtr pScrn,
347dbbd9e4bSmacallan                           int x, int y, int w, int h,
348dbbd9e4bSmacallan                           unsigned char *src,
349dbbd9e4bSmacallan                           int srcwidth,
350dbbd9e4bSmacallan                           int rop,
351dbbd9e4bSmacallan                           unsigned int planemask,
352dbbd9e4bSmacallan                           int trans, int bpp, int depth)
353dbbd9e4bSmacallan{
354dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
355dbbd9e4bSmacallan       unsigned char *dst, *sfb32;
356dbbd9e4bSmacallan       int psz_shift = 2;
357dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
358dbbd9e4bSmacallan
359dbbd9e4bSmacallan       FFBLOG(("FFB_WritePixmap: "
360dbbd9e4bSmacallan               "x[%d] y[%d] w[%d] h[%d] srcw[%d] rop[%d] pmask[%x] "
361dbbd9e4bSmacallan               "trans[%d] bpp[%d] depth[%d]\n",
362dbbd9e4bSmacallan               x, y, w, h, srcwidth, rop, planemask,
363dbbd9e4bSmacallan               trans, bpp, depth));
364dbbd9e4bSmacallan
365dbbd9e4bSmacallan       FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop);
366dbbd9e4bSmacallan       FFBWait(pFfb, ffb);
367dbbd9e4bSmacallan
368dbbd9e4bSmacallan       sfb32 = (unsigned char *) pFfb->sfb32;
369dbbd9e4bSmacallan       dst = sfb32 + (y * (2048 << psz_shift)) + (x << psz_shift);
370dbbd9e4bSmacallan       VISmoveImageLR(src, dst, w << psz_shift, h,
371dbbd9e4bSmacallan                      srcwidth, (2048 << psz_shift));
372dbbd9e4bSmacallan}
373dbbd9e4bSmacallan
374dbbd9e4bSmacallanstatic void FFB_SetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
375dbbd9e4bSmacallan                                          int pat_word1, int pat_word2,
376dbbd9e4bSmacallan                                          int fg, int bg, int rop,
377dbbd9e4bSmacallan                                          unsigned int planemask)
378dbbd9e4bSmacallan{
379dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
380dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
381dbbd9e4bSmacallan       unsigned int ppc, ppc_mask, fbc;
382dbbd9e4bSmacallan       int i;
383dbbd9e4bSmacallan
384dbbd9e4bSmacallan       FFBLOG(("FFB_SetupForMono8x8PatternFill: "
385dbbd9e4bSmacallan               "pat[%08x:%08x] fg[%x] bg[%x] rop[%d] pmask[%x]\n",
386dbbd9e4bSmacallan               pat_word1, pat_word2,
387dbbd9e4bSmacallan               fg, bg, rop, planemask));
388dbbd9e4bSmacallan
389dbbd9e4bSmacallan       ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_ENABLE | FFB_PPC_CS_CONST;
390dbbd9e4bSmacallan       if (bg < 0)
391dbbd9e4bSmacallan               ppc |= FFB_PPC_TBE_TRANSPARENT;
392dbbd9e4bSmacallan       else
393dbbd9e4bSmacallan               ppc |= FFB_PPC_TBE_OPAQUE;
394dbbd9e4bSmacallan       ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK |
395dbbd9e4bSmacallan         FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK;
396dbbd9e4bSmacallan       fbc = pFfb->xaa_fbc;
397dbbd9e4bSmacallan       rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8);
398dbbd9e4bSmacallan
399dbbd9e4bSmacallan       FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, rop,
400dbbd9e4bSmacallan                    FFB_DRAWOP_RECTANGLE, fg, fbc, pFfb->xaa_wid);
401dbbd9e4bSmacallan       if (bg >= 0)
402dbbd9e4bSmacallan               FFB_WRITE_BG(pFfb, ffb, bg);
403dbbd9e4bSmacallan
404dbbd9e4bSmacallan       FFBFifo(pFfb, 32);
405dbbd9e4bSmacallan       for (i = 0; i < 32; i += 2) {
406dbbd9e4bSmacallan               CARD32 val1, val2;
407dbbd9e4bSmacallan               int shift = (24 - ((i % 4) * 8));
408dbbd9e4bSmacallan
409dbbd9e4bSmacallan               if ((i % 8) < 4) {
410dbbd9e4bSmacallan                       val1 = (pat_word1 >> shift) & 0xff;
411dbbd9e4bSmacallan                       val2 = (pat_word1 >> (shift + 8)) & 0xff;
412dbbd9e4bSmacallan               } else {
413dbbd9e4bSmacallan                       val1 = (pat_word2 >> shift) & 0xff;
414dbbd9e4bSmacallan                       val2 = (pat_word2 >> (shift + 8)) & 0xff;
415dbbd9e4bSmacallan               }
416dbbd9e4bSmacallan               val1 |= (val1 << 8) | (val1 << 16) | (val1 << 24);
417dbbd9e4bSmacallan               val2 |= (val2 << 8) | (val2 << 16) | (val2 << 24);
418dbbd9e4bSmacallan               FFB_WRITE64(&ffb->pattern[i], val1, val2);
419dbbd9e4bSmacallan       }
420dbbd9e4bSmacallan       pFfb->rp_active = 1;
421dbbd9e4bSmacallan}
422dbbd9e4bSmacallan
423dbbd9e4bSmacallanstatic void FFB_SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
424dbbd9e4bSmacallan                                                int pat_word1, int pat_word2,
425dbbd9e4bSmacallan                                                int x, int y, int w, int h)
426dbbd9e4bSmacallan{
427dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
428dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
429dbbd9e4bSmacallan
430dbbd9e4bSmacallan       FFBLOG(("FFB_SubsequentMono8x8PatternFillRect: "
431dbbd9e4bSmacallan               "x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h));
432dbbd9e4bSmacallan
433dbbd9e4bSmacallan       FFBFifo(pFfb, 4);
434dbbd9e4bSmacallan       FFB_WRITE64(&ffb->by, y, x);
435dbbd9e4bSmacallan       FFB_WRITE64_2(&ffb->bh, h, w);
436dbbd9e4bSmacallan}
437dbbd9e4bSmacallan
438dbbd9e4bSmacallanstatic void FFB_SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
439dbbd9e4bSmacallan                                                          int fg, int bg,
440dbbd9e4bSmacallan                                                          int rop,
441dbbd9e4bSmacallan                                                          unsigned int planemask)
442dbbd9e4bSmacallan{
443dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
444dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
445dbbd9e4bSmacallan       unsigned int ppc, ppc_mask, fbc;
446dbbd9e4bSmacallan
447dbbd9e4bSmacallan       FFBLOG(("FFB_SetupForScanlineCPUToScreenColorExpandFill: "
448dbbd9e4bSmacallan               "fg[%x] bg[%x] rop[%d] pmask[%x]\n",
449dbbd9e4bSmacallan               fg, bg, rop, planemask));
450dbbd9e4bSmacallan
451dbbd9e4bSmacallan       ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST;
452dbbd9e4bSmacallan       if (bg < 0)
453dbbd9e4bSmacallan               ppc |= FFB_PPC_TBE_TRANSPARENT;
454dbbd9e4bSmacallan       else
455dbbd9e4bSmacallan               ppc |= FFB_PPC_TBE_OPAQUE;
456dbbd9e4bSmacallan       ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK |
457dbbd9e4bSmacallan         FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK;
458dbbd9e4bSmacallan       fbc = pFfb->xaa_fbc;
459dbbd9e4bSmacallan       rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8);
460dbbd9e4bSmacallan
461dbbd9e4bSmacallan       if ((pFfb->ppc_cache & ppc_mask) != ppc ||
462dbbd9e4bSmacallan           pFfb->fg_cache != fg ||
463dbbd9e4bSmacallan           pFfb->fbc_cache != fbc ||
464dbbd9e4bSmacallan           pFfb->rop_cache != rop ||
465dbbd9e4bSmacallan           pFfb->pmask_cache != planemask ||
466dbbd9e4bSmacallan           pFfb->fontinc_cache != ((0<<16) | 32) ||
467dbbd9e4bSmacallan           (bg >= 0 && pFfb->bg_cache != bg)) {
468dbbd9e4bSmacallan               pFfb->ppc_cache &= ~ppc_mask;
469dbbd9e4bSmacallan               pFfb->ppc_cache |= ppc;
470dbbd9e4bSmacallan               pFfb->fg_cache = fg;
471dbbd9e4bSmacallan               pFfb->fbc_cache = fbc;
472dbbd9e4bSmacallan               pFfb->rop_cache = rop;
473dbbd9e4bSmacallan               pFfb->pmask_cache = planemask;
474dbbd9e4bSmacallan               pFfb->fontinc_cache = ((0<<16) | 32);
475dbbd9e4bSmacallan               if (bg >= 0)
476dbbd9e4bSmacallan                       pFfb->bg_cache = bg;
477dbbd9e4bSmacallan               FFBFifo(pFfb, (bg >= 0 ? 7 : 6));
478dbbd9e4bSmacallan               ffb->ppc = ppc;
479dbbd9e4bSmacallan               ffb->fg = fg;
480dbbd9e4bSmacallan               ffb->fbc = fbc;
481dbbd9e4bSmacallan               ffb->rop = rop;
482dbbd9e4bSmacallan               ffb->pmask = planemask;
483dbbd9e4bSmacallan               ffb->fontinc = ((0 << 16) | 32);
484dbbd9e4bSmacallan               if(bg >= 0)
485dbbd9e4bSmacallan                       ffb->bg = bg;
486dbbd9e4bSmacallan       }
487dbbd9e4bSmacallan       pFfb->rp_active = 1;
488dbbd9e4bSmacallan}
489dbbd9e4bSmacallan
490dbbd9e4bSmacallanstatic void FFB_SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
491dbbd9e4bSmacallan                                                            int x, int y, int w, int h,
492dbbd9e4bSmacallan                                                            int skipleft)
493dbbd9e4bSmacallan{
494dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
495dbbd9e4bSmacallan       FFBLOG(("FFB_SubsequentCPUToScreenColorExpandFill: "
496dbbd9e4bSmacallan               "x[%d] y[%d] w[%d] h[%d] skipleft[%d]\n",
497dbbd9e4bSmacallan               x, y, w, h, skipleft));
498dbbd9e4bSmacallan
499dbbd9e4bSmacallan       pFfb->xaa_scanline_x = x;
500dbbd9e4bSmacallan       pFfb->xaa_scanline_y = y;
501dbbd9e4bSmacallan       pFfb->xaa_scanline_w = w;
502dbbd9e4bSmacallan}
503dbbd9e4bSmacallan
504dbbd9e4bSmacallanstatic void FFB_SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
505dbbd9e4bSmacallan{
506dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
507dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
508dbbd9e4bSmacallan       CARD32 *bits = (CARD32 *) pFfb->xaa_scanline_buffers[bufno];
509dbbd9e4bSmacallan       int w;
510dbbd9e4bSmacallan
511dbbd9e4bSmacallan       FFBFifo(pFfb, 1);
512dbbd9e4bSmacallan       ffb->fontxy = ((pFfb->xaa_scanline_y << 16) | pFfb->xaa_scanline_x);
513dbbd9e4bSmacallan
514dbbd9e4bSmacallan       w = pFfb->xaa_scanline_w;
515dbbd9e4bSmacallan       if (w >= 32) {
516dbbd9e4bSmacallan               FFB_WRITE_FONTW(pFfb, ffb, 32);
517dbbd9e4bSmacallan               FFBFifo(pFfb, (w / 32));
518dbbd9e4bSmacallan               do {
519dbbd9e4bSmacallan                       ffb->font = *bits++;
520dbbd9e4bSmacallan                       w -= 32;
521dbbd9e4bSmacallan               } while (w >= 32);
522dbbd9e4bSmacallan       }
523dbbd9e4bSmacallan       if (w > 0) {
524dbbd9e4bSmacallan               FFB_WRITE_FONTW(pFfb, ffb, w);
525dbbd9e4bSmacallan               FFBFifo(pFfb, 1);
526dbbd9e4bSmacallan               ffb->font = *bits++;
527dbbd9e4bSmacallan       }
528dbbd9e4bSmacallan
529dbbd9e4bSmacallan       pFfb->xaa_scanline_y++;
530dbbd9e4bSmacallan}
531dbbd9e4bSmacallan
532dbbd9e4bSmacallanstatic void FFB_SetupForDashedLine(ScrnInfoPtr pScrn,
533dbbd9e4bSmacallan                                  int fg, int bg, int rop,
534dbbd9e4bSmacallan                                  unsigned int planemask,
535dbbd9e4bSmacallan                                  int length, unsigned char *pattern)
536dbbd9e4bSmacallan{
537dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
538dbbd9e4bSmacallan       CARD32 *pat_ptr = (CARD32 *)pattern;
539dbbd9e4bSmacallan       unsigned int ppc, ppc_mask, fbc;
540dbbd9e4bSmacallan
541dbbd9e4bSmacallan       FFBLOG(("FFB_SetupForDashedLine: "
542dbbd9e4bSmacallan               "fg[%x] bg[%x] rop[%d] pmask[%x] patlen[%d] pat[%x]\n",
543dbbd9e4bSmacallan               fg, bg, rop, planemask, length, *pat_ptr));
544dbbd9e4bSmacallan
545dbbd9e4bSmacallan       pFfb->xaa_planemask = planemask;
546dbbd9e4bSmacallan       pFfb->xaa_rop = rop;
547dbbd9e4bSmacallan       pFfb->xaa_linepat =
548dbbd9e4bSmacallan               (*pat_ptr << FFB_LPAT_PATTERN_SHIFT) |
549dbbd9e4bSmacallan               (1 << FFB_LPAT_SCALEVAL_SHIFT) |
550dbbd9e4bSmacallan               ((length & 0xf) << FFB_LPAT_PATLEN_SHIFT);
551dbbd9e4bSmacallan
552dbbd9e4bSmacallan       fbc = pFfb->xaa_fbc;
553dbbd9e4bSmacallan       ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID;
554dbbd9e4bSmacallan       ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK;
555dbbd9e4bSmacallan
556dbbd9e4bSmacallan       FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask,
557dbbd9e4bSmacallan                    (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8),
558dbbd9e4bSmacallan                    FFB_DRAWOP_BRLINEOPEN, fg, fbc, pFfb->xaa_wid);
559dbbd9e4bSmacallan       pFfb->rp_active = 1;
560dbbd9e4bSmacallan}
561dbbd9e4bSmacallan
562dbbd9e4bSmacallanstatic void FFB_SubsequentDashedTwoPointLine( ScrnInfoPtr pScrn,
563dbbd9e4bSmacallan                                             int x1, int y1,
564dbbd9e4bSmacallan                                             int x2, int y2,
565dbbd9e4bSmacallan                                             int flags, int phase)
566dbbd9e4bSmacallan{
567dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
568dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
569dbbd9e4bSmacallan       unsigned int linepat = pFfb->xaa_linepat;
570dbbd9e4bSmacallan       unsigned int drawop;
571dbbd9e4bSmacallan
572dbbd9e4bSmacallan       FFBLOG(("FFB_SubsequentDashedTwoPointLine: "
573dbbd9e4bSmacallan               "x1[%d] y1[%d] x2[%d] y2[%d] flgs[%x] phase[%d]\n",
574dbbd9e4bSmacallan               x1, y2, x2, y2, flags, phase));
575dbbd9e4bSmacallan
576dbbd9e4bSmacallan       linepat |= (phase & 0xf) << FFB_LPAT_PATPTR_SHIFT;
577dbbd9e4bSmacallan
578dbbd9e4bSmacallan       drawop = (flags & OMIT_LAST) ?
579dbbd9e4bSmacallan         FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP;
580dbbd9e4bSmacallan       FFB_WRITE_DRAWOP(pFfb, ffb, drawop);
581dbbd9e4bSmacallan
582dbbd9e4bSmacallan       if (pFfb->has_brline_bug) {
583dbbd9e4bSmacallan               FFBFifo(pFfb, 6);
584dbbd9e4bSmacallan               ffb->ppc = 0;
585dbbd9e4bSmacallan       } else
586dbbd9e4bSmacallan               FFBFifo(pFfb, 5);
587dbbd9e4bSmacallan       ffb->lpat = linepat;
588dbbd9e4bSmacallan       FFB_WRITE64(&ffb->by, y1, x1);
589dbbd9e4bSmacallan       FFB_WRITE64_2(&ffb->bh, y2, x2);
590dbbd9e4bSmacallan}
591dbbd9e4bSmacallan
592dbbd9e4bSmacallanstatic void FFB_SetupForSolidLine(ScrnInfoPtr pScrn,
593dbbd9e4bSmacallan                                 int color, int rop, unsigned int planemask)
594dbbd9e4bSmacallan{
595dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
596dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
597dbbd9e4bSmacallan       unsigned int ppc, ppc_mask, fbc;
598dbbd9e4bSmacallan       FFBLOG(("FFB_SetupForSolidLine: "
599dbbd9e4bSmacallan               "color[%d] rop[%d] pmask[%x]\n",
600dbbd9e4bSmacallan               color, rop, planemask));
601dbbd9e4bSmacallan
602dbbd9e4bSmacallan       pFfb->xaa_planemask = planemask;
603dbbd9e4bSmacallan       pFfb->xaa_rop = rop;
604dbbd9e4bSmacallan
605dbbd9e4bSmacallan       fbc = pFfb->xaa_fbc;
606dbbd9e4bSmacallan       ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID;
607dbbd9e4bSmacallan       ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK;
608dbbd9e4bSmacallan
609dbbd9e4bSmacallan       FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask,
610dbbd9e4bSmacallan                    (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8),
611dbbd9e4bSmacallan                    FFB_DRAWOP_BRLINEOPEN, color, fbc, pFfb->xaa_wid);
612dbbd9e4bSmacallan       FFBFifo(pFfb, 1);
613dbbd9e4bSmacallan       ffb->lpat = 0;
614dbbd9e4bSmacallan       pFfb->rp_active = 1;
615dbbd9e4bSmacallan}
616dbbd9e4bSmacallan
617dbbd9e4bSmacallanstatic void FFB_SubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
618dbbd9e4bSmacallan                                           int x1, int y1,
619dbbd9e4bSmacallan                                           int x2, int y2,
620dbbd9e4bSmacallan                                           int flags)
621dbbd9e4bSmacallan{
622dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
623dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
624dbbd9e4bSmacallan       int drawop;
625dbbd9e4bSmacallan
626dbbd9e4bSmacallan       FFBLOG(("FFB_SubsequentSolidTwoPointLine: "
627dbbd9e4bSmacallan               "x1[%d] y1[%d] x2[%d] y2[%d] flags[%d]\n",
628dbbd9e4bSmacallan               x1, y1, x2, y2, flags));
629dbbd9e4bSmacallan
630dbbd9e4bSmacallan       drawop = (flags & OMIT_LAST) ?
631dbbd9e4bSmacallan         FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP;
632dbbd9e4bSmacallan       FFB_WRITE_DRAWOP(pFfb, ffb, drawop);
633dbbd9e4bSmacallan
634dbbd9e4bSmacallan       if (pFfb->has_brline_bug) {
635dbbd9e4bSmacallan               FFBFifo(pFfb, 5);
636dbbd9e4bSmacallan               ffb->ppc = 0;
637dbbd9e4bSmacallan       } else
638dbbd9e4bSmacallan               FFBFifo(pFfb, 4);
639dbbd9e4bSmacallan       FFB_WRITE64(&ffb->by, y1, x1);
640dbbd9e4bSmacallan       FFB_WRITE64_2(&ffb->bh, y2, x2);
641dbbd9e4bSmacallan}
642dbbd9e4bSmacallan
643dbbd9e4bSmacallanvoid FFB_SetupForSolidFill(ScrnInfoPtr pScrn,
644dbbd9e4bSmacallan                          int color, int rop, unsigned int planemask)
645dbbd9e4bSmacallan{
646dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
647dbbd9e4bSmacallan       unsigned int ppc, ppc_mask, fbc;
648dbbd9e4bSmacallan
649dbbd9e4bSmacallan       FFBLOG(("FFB_SetupForSolidFill: "
650dbbd9e4bSmacallan               "color[%d] rop[%d] pmask[%u]\n",
651dbbd9e4bSmacallan               color, rop, planemask));
652dbbd9e4bSmacallan
653dbbd9e4bSmacallan       pFfb->xaa_planemask = planemask;
654dbbd9e4bSmacallan       pFfb->xaa_rop = rop;
655dbbd9e4bSmacallan
656dbbd9e4bSmacallan       fbc = pFfb->xaa_fbc;
657dbbd9e4bSmacallan       if (pFfb->ffb_res == ffb_res_high)
658dbbd9e4bSmacallan               fbc |= FFB_FBC_WB_B;
659dbbd9e4bSmacallan       ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID;
660dbbd9e4bSmacallan       ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK;
661dbbd9e4bSmacallan
662dbbd9e4bSmacallan       FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask,
663dbbd9e4bSmacallan                    (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8),
664dbbd9e4bSmacallan                    FFB_DRAWOP_RECTANGLE, color, fbc, pFfb->xaa_wid);
665dbbd9e4bSmacallan       pFfb->rp_active = 1;
666dbbd9e4bSmacallan}
667dbbd9e4bSmacallan
668dbbd9e4bSmacallanvoid FFB_SubsequentSolidFillRect(ScrnInfoPtr pScrn,
669dbbd9e4bSmacallan                                int x, int y,
670dbbd9e4bSmacallan                                int w, int h)
671dbbd9e4bSmacallan{
672dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
673dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
674dbbd9e4bSmacallan
675dbbd9e4bSmacallan       FFBLOG(("FFB_SubsequentSolidFillRect: "
676dbbd9e4bSmacallan               "x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h));
677dbbd9e4bSmacallan
678dbbd9e4bSmacallan       FFBFifo(pFfb, 4);
679dbbd9e4bSmacallan       FFB_WRITE64(&ffb->by, y, x);
680dbbd9e4bSmacallan       FFB_WRITE64_2(&ffb->bh, h, w);
681dbbd9e4bSmacallan}
682dbbd9e4bSmacallan
683dbbd9e4bSmacallanstatic void FFB_ScreenToScreenBitBlt(ScrnInfoPtr pScrn,
684dbbd9e4bSmacallan                                    int nbox,
685dbbd9e4bSmacallan                                    DDXPointPtr pptSrc,
686dbbd9e4bSmacallan                                    BoxPtr pbox,
687dbbd9e4bSmacallan                                    int xdir, int ydir,
688dbbd9e4bSmacallan                                    int rop, unsigned int planemask)
689dbbd9e4bSmacallan{
690dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
691dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
692dbbd9e4bSmacallan       int use_vscroll;
693dbbd9e4bSmacallan
694dbbd9e4bSmacallan       FFBLOG(("FFB_ScreenToScreenBitBlt: "
695dbbd9e4bSmacallan               "nbox[%d] xdir[%d] ydir[%d] rop[%d] pmask[%x]\n",
696dbbd9e4bSmacallan               nbox, xdir, ydir, rop, planemask));
697dbbd9e4bSmacallan
698dbbd9e4bSmacallan       use_vscroll = 0;
699dbbd9e4bSmacallan       if (!pFfb->disable_vscroll &&
700dbbd9e4bSmacallan           rop == GXcopy) {
701dbbd9e4bSmacallan               int i;
702dbbd9e4bSmacallan
703dbbd9e4bSmacallan               for (i = 0; i < nbox; i++)
704dbbd9e4bSmacallan                       if (pptSrc[i].x != pbox[i].x1 ||
705dbbd9e4bSmacallan                           pptSrc[i].y == pbox[i].y1)
706dbbd9e4bSmacallan                               break;
707dbbd9e4bSmacallan               if (i == nbox) {
708dbbd9e4bSmacallan                       /* If/When double buffer extension is re-enabled
709dbbd9e4bSmacallan                        * check buffers here.
710dbbd9e4bSmacallan                        */
711dbbd9e4bSmacallan                       use_vscroll = 1;
712dbbd9e4bSmacallan               }
713dbbd9e4bSmacallan       }
714dbbd9e4bSmacallan       if (use_vscroll) {
715dbbd9e4bSmacallan               FFB_ATTR_VSCROLL_XAA(pFfb, planemask);
716dbbd9e4bSmacallan               while (nbox--) {
717dbbd9e4bSmacallan                       FFBFifo(pFfb, 7);
718dbbd9e4bSmacallan                       ffb->drawop = FFB_DRAWOP_VSCROLL;
719dbbd9e4bSmacallan                       FFB_WRITE64(&ffb->by, pptSrc->y, pptSrc->x);
720dbbd9e4bSmacallan                       FFB_WRITE64_2(&ffb->dy, pbox->y1, pbox->x1);
721dbbd9e4bSmacallan                       FFB_WRITE64_3(&ffb->bh, (pbox->y2 - pbox->y1),
722dbbd9e4bSmacallan                                     (pbox->x2 - pbox->x1));
723dbbd9e4bSmacallan
724dbbd9e4bSmacallan                       pbox++;
725dbbd9e4bSmacallan                       pptSrc++;
726dbbd9e4bSmacallan               }
727dbbd9e4bSmacallan               pFfb->rp_active = 1;
728dbbd9e4bSmacallan               SET_SYNC_FLAG(pFfb->pXAAInfo);
729dbbd9e4bSmacallan       } else {
730dbbd9e4bSmacallan               unsigned char *sfb32 = (unsigned char *) pFfb->sfb32;
731dbbd9e4bSmacallan               int psz_shift = 2;
732dbbd9e4bSmacallan
733dbbd9e4bSmacallan               FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop);
734dbbd9e4bSmacallan               if (pFfb->use_blkread_prefetch) {
735dbbd9e4bSmacallan                       unsigned int bit;
736dbbd9e4bSmacallan
737dbbd9e4bSmacallan                       if (xdir < 0)
738dbbd9e4bSmacallan                               bit = FFB_MER_EDRA;
739dbbd9e4bSmacallan                       else
740dbbd9e4bSmacallan                               bit = FFB_MER_EIRA;
741dbbd9e4bSmacallan                       FFBFifo(pFfb, 1);
742dbbd9e4bSmacallan                       ffb->mer = bit;
743dbbd9e4bSmacallan                       pFfb->rp_active = 1;
744dbbd9e4bSmacallan               }
745dbbd9e4bSmacallan               FFBWait(pFfb, ffb);
746dbbd9e4bSmacallan
747dbbd9e4bSmacallan               while (nbox--) {
748dbbd9e4bSmacallan                       unsigned char *src, *dst;
749dbbd9e4bSmacallan                       int x1, y1, x2, y2;
750dbbd9e4bSmacallan                       int width, height;
751dbbd9e4bSmacallan                       int sdkind;
752dbbd9e4bSmacallan
753dbbd9e4bSmacallan                       x1 = pptSrc->x;
754dbbd9e4bSmacallan                       y1 = pptSrc->y;
755dbbd9e4bSmacallan                       x2 = pbox->x1;
756dbbd9e4bSmacallan                       y2 = pbox->y1;
757dbbd9e4bSmacallan                       width = (pbox->x2 - pbox->x1);
758dbbd9e4bSmacallan                       height = (pbox->y2 - pbox->y1);
759dbbd9e4bSmacallan
760dbbd9e4bSmacallan                       src = sfb32 + (y1 * (2048 << psz_shift))
761dbbd9e4bSmacallan                               + (x1 << psz_shift);
762dbbd9e4bSmacallan                       dst = sfb32 + (y2 * (2048 << psz_shift))
763dbbd9e4bSmacallan                               + (x2 << psz_shift);
764dbbd9e4bSmacallan                       sdkind = (2048 << psz_shift);
765dbbd9e4bSmacallan
766dbbd9e4bSmacallan                       if (ydir < 0) {
767dbbd9e4bSmacallan                               src += ((height - 1) * (2048 << psz_shift));
768dbbd9e4bSmacallan                               dst += ((height - 1) * (2048 << psz_shift));
769dbbd9e4bSmacallan                               sdkind = -sdkind;
770dbbd9e4bSmacallan                       }
771dbbd9e4bSmacallan                       width <<= psz_shift;
772dbbd9e4bSmacallan                       if (xdir < 0)
773dbbd9e4bSmacallan                               VISmoveImageRL(src, dst, width, height,
774dbbd9e4bSmacallan                                              sdkind, sdkind);
775dbbd9e4bSmacallan                       else
776dbbd9e4bSmacallan                               VISmoveImageLR(src, dst, width, height,
777dbbd9e4bSmacallan                                              sdkind, sdkind);
778dbbd9e4bSmacallan                       pbox++;
779dbbd9e4bSmacallan                       pptSrc++;
780dbbd9e4bSmacallan	       }
781dbbd9e4bSmacallan               if (pFfb->use_blkread_prefetch) {
782dbbd9e4bSmacallan                       FFBFifo(pFfb, 1);
783dbbd9e4bSmacallan                       ffb->mer = FFB_MER_DRA;
784dbbd9e4bSmacallan                       pFfb->rp_active = 1;
785dbbd9e4bSmacallan                       FFBWait(pFfb, ffb);
786dbbd9e4bSmacallan               }
787dbbd9e4bSmacallan       }
788dbbd9e4bSmacallan}
789dbbd9e4bSmacallan
790dbbd9e4bSmacallanvoid FFB_SetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
791dbbd9e4bSmacallan                                   int xdir, int ydir, int rop,
792dbbd9e4bSmacallan                                   unsigned int planemask,
793dbbd9e4bSmacallan                                   int trans_color)
794dbbd9e4bSmacallan{
795dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
796dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
797dbbd9e4bSmacallan       FFBLOG(("FFB_SetupForScreenToScreenCopy: "
798dbbd9e4bSmacallan               "xdir[%d] ydir[%d] rop[%d] pmask[%x] tcolor[%d]\n",
799dbbd9e4bSmacallan               xdir, ydir, rop, planemask, trans_color));
800dbbd9e4bSmacallan
801dbbd9e4bSmacallan       pFfb->xaa_planemask = planemask;
802dbbd9e4bSmacallan       pFfb->xaa_xdir = xdir;
803dbbd9e4bSmacallan       pFfb->xaa_ydir = ydir;
804dbbd9e4bSmacallan       pFfb->xaa_rop = rop;
805dbbd9e4bSmacallan       FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop);
806dbbd9e4bSmacallan       FFBWait(pFfb, ffb);
807dbbd9e4bSmacallan}
808dbbd9e4bSmacallan
809dbbd9e4bSmacallanvoid FFB_SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
810dbbd9e4bSmacallan                                     int x1, int y1,
811dbbd9e4bSmacallan                                     int x2, int y2,
812dbbd9e4bSmacallan                                     int width, int height)
813dbbd9e4bSmacallan{
814dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
815dbbd9e4bSmacallan       unsigned char *src, *dst, *sfb32;
816dbbd9e4bSmacallan       int psz_shift = 2;
817dbbd9e4bSmacallan       int sdkind;
818dbbd9e4bSmacallan
819dbbd9e4bSmacallan       FFBLOG(("FFB_SubsequentScreenToScreenCopy: "
820dbbd9e4bSmacallan               "x1[%d] y1[%d] x2[%d] y2[%u] w[%d] h[%d]\n",
821dbbd9e4bSmacallan               x1, y1, x2, y2, width, height));
822dbbd9e4bSmacallan
823dbbd9e4bSmacallan       sfb32 = (unsigned char *) pFfb->sfb32;
824dbbd9e4bSmacallan       src = sfb32 + (y1 * (2048 << psz_shift)) + (x1 << psz_shift);
825dbbd9e4bSmacallan       dst = sfb32 + (y2 * (2048 << psz_shift)) + (x2 << psz_shift);
826dbbd9e4bSmacallan       sdkind = (2048 << psz_shift);
827dbbd9e4bSmacallan
828dbbd9e4bSmacallan       if (pFfb->xaa_ydir < 0) {
829dbbd9e4bSmacallan               src += ((height - 1) * (2048 << psz_shift));
830dbbd9e4bSmacallan               dst += ((height - 1) * (2048 << psz_shift));
831dbbd9e4bSmacallan               sdkind = -sdkind;
832dbbd9e4bSmacallan       }
833dbbd9e4bSmacallan
834dbbd9e4bSmacallan       width <<= psz_shift;
835dbbd9e4bSmacallan       if (pFfb->xaa_xdir < 0)
836dbbd9e4bSmacallan               VISmoveImageRL(src, dst, width, height, sdkind, sdkind);
837dbbd9e4bSmacallan       else
838dbbd9e4bSmacallan               VISmoveImageLR(src, dst, width, height, sdkind, sdkind);
839dbbd9e4bSmacallan}
840dbbd9e4bSmacallan
841dbbd9e4bSmacallanstatic void FFB_Sync(ScrnInfoPtr pScrn)
842dbbd9e4bSmacallan{
843dbbd9e4bSmacallan       FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
844dbbd9e4bSmacallan       ffb_fbcPtr ffb = pFfb->regs;
845dbbd9e4bSmacallan
846dbbd9e4bSmacallan       FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy);
847dbbd9e4bSmacallan       FFBWait(pFfb, ffb);
848dbbd9e4bSmacallan}
849dbbd9e4bSmacallan
850dbbd9e4bSmacallan/* Multiplies and divides suck... */
851dbbd9e4bSmacallanstatic void CreatorAlignTabInit(FFBPtr pFfb)
852dbbd9e4bSmacallan{
853dbbd9e4bSmacallan	struct fastfill_parms *ffp = &FFB_FFPARMS(pFfb);
854dbbd9e4bSmacallan	short *tab = pFfb->Pf_AlignTab;
855dbbd9e4bSmacallan	int i;
856dbbd9e4bSmacallan
857dbbd9e4bSmacallan	for(i = 0; i < 0x800; i++) {
858dbbd9e4bSmacallan		int alignval;
859dbbd9e4bSmacallan
860dbbd9e4bSmacallan		alignval = (i / ffp->pagefill_width) * ffp->pagefill_width;
861dbbd9e4bSmacallan		*tab++ = alignval;
862dbbd9e4bSmacallan	}
863dbbd9e4bSmacallan}
864dbbd9e4bSmacallan
865dbbd9e4bSmacallanBool FFBAccelInit(ScreenPtr pScreen, FFBPtr pFfb)
866dbbd9e4bSmacallan{
867dbbd9e4bSmacallan	XAAInfoRecPtr infoRec;
868dbbd9e4bSmacallan	ffb_fbcPtr ffb = pFfb->regs;
869dbbd9e4bSmacallan
870dbbd9e4bSmacallan	pFfb->xaa_fbc = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A |
871dbbd9e4bSmacallan			 FFB_FBC_WE_FORCEON |
872dbbd9e4bSmacallan			 FFB_FBC_SB_BOTH |
873dbbd9e4bSmacallan			 FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF |
874dbbd9e4bSmacallan			 FFB_FBC_RGBE_MASK |
875dbbd9e4bSmacallan			 FFB_FBC_XE_ON);
876dbbd9e4bSmacallan	pFfb->xaa_wid = FFBWidAlloc(pFfb, TrueColor, 0, TRUE);
877dbbd9e4bSmacallan	if (pFfb->xaa_wid == (unsigned int) -1)
878dbbd9e4bSmacallan		return FALSE;
879dbbd9e4bSmacallan
880dbbd9e4bSmacallan	pFfb->pXAAInfo = infoRec = XAACreateInfoRec();
881dbbd9e4bSmacallan	if (!infoRec) {
882dbbd9e4bSmacallan		FFBWidFree(pFfb, pFfb->xaa_wid);
883dbbd9e4bSmacallan		return FALSE;
884dbbd9e4bSmacallan	}
885dbbd9e4bSmacallan
886dbbd9e4bSmacallan	pFfb->xaa_scanline_buffers[0] = xalloc(2048 * 4);
887dbbd9e4bSmacallan	if (!pFfb->xaa_scanline_buffers[0]) {
888dbbd9e4bSmacallan		XAADestroyInfoRec(infoRec);
889dbbd9e4bSmacallan		return FALSE;
890dbbd9e4bSmacallan	}
891dbbd9e4bSmacallan
892dbbd9e4bSmacallan	pFfb->xaa_scanline_buffers[1] = xalloc(2048 * 4);
893dbbd9e4bSmacallan	if (!pFfb->xaa_scanline_buffers[1]) {
894dbbd9e4bSmacallan		xfree(pFfb->xaa_scanline_buffers[0]);
895dbbd9e4bSmacallan		XAADestroyInfoRec(infoRec);
896dbbd9e4bSmacallan		return FALSE;
897dbbd9e4bSmacallan	}
898dbbd9e4bSmacallan
899dbbd9e4bSmacallan	infoRec->Sync = FFB_Sync;
900dbbd9e4bSmacallan
901dbbd9e4bSmacallan	/* Use VIS and VSCROLL for screen to screen copies.  */
902dbbd9e4bSmacallan	infoRec->ScreenToScreenCopyFlags = NO_TRANSPARENCY;
903dbbd9e4bSmacallan	infoRec->SetupForScreenToScreenCopy =
904dbbd9e4bSmacallan		FFB_SetupForScreenToScreenCopy;
905dbbd9e4bSmacallan	infoRec->SubsequentScreenToScreenCopy =
906dbbd9e4bSmacallan		FFB_SubsequentScreenToScreenCopy;
907dbbd9e4bSmacallan
908dbbd9e4bSmacallan	/* In order to optimize VSCROLL and prefetching properly we
909dbbd9e4bSmacallan	 * have to use our own mid-layer routine.
910dbbd9e4bSmacallan	 */
911dbbd9e4bSmacallan	infoRec->ScreenToScreenBitBltFlags = NO_TRANSPARENCY;
912dbbd9e4bSmacallan	infoRec->ScreenToScreenBitBlt =
913dbbd9e4bSmacallan		FFB_ScreenToScreenBitBlt;
914dbbd9e4bSmacallan
915dbbd9e4bSmacallan	infoRec->SolidFillFlags = 0;
916dbbd9e4bSmacallan	infoRec->SetupForSolidFill =
917dbbd9e4bSmacallan		FFB_SetupForSolidFill;
918dbbd9e4bSmacallan	infoRec->SubsequentSolidFillRect =
919dbbd9e4bSmacallan		FFB_SubsequentSolidFillRect;
920dbbd9e4bSmacallan
921dbbd9e4bSmacallan	infoRec->SolidLineFlags = 0;
922dbbd9e4bSmacallan	infoRec->SetupForSolidLine =
923dbbd9e4bSmacallan		FFB_SetupForSolidLine;
924dbbd9e4bSmacallan	infoRec->SubsequentSolidTwoPointLine =
925dbbd9e4bSmacallan		FFB_SubsequentSolidTwoPointLine;
926dbbd9e4bSmacallan	miSetZeroLineBias(pScreen, OCTANT3 | OCTANT4 | OCTANT6 | OCTANT1);
927dbbd9e4bSmacallan
928dbbd9e4bSmacallan	infoRec->DashedLineFlags = (TRANSPARENCY_ONLY |
929dbbd9e4bSmacallan				    LINE_PATTERN_LSBFIRST_LSBJUSTIFIED);
930dbbd9e4bSmacallan	infoRec->DashPatternMaxLength = 16;
931dbbd9e4bSmacallan	infoRec->SetupForDashedLine =
932dbbd9e4bSmacallan		FFB_SetupForDashedLine;
933dbbd9e4bSmacallan	infoRec->SubsequentDashedTwoPointLine =
934dbbd9e4bSmacallan		FFB_SubsequentDashedTwoPointLine;
935dbbd9e4bSmacallan
936dbbd9e4bSmacallan	/* We cannot use the non-scanline color expansion mechanism on FFB
937dbbd9e4bSmacallan	 * for two reasons:
938dbbd9e4bSmacallan	 *
939dbbd9e4bSmacallan	 * 1) A render pass can only render 32-pixels wide on FFB, XAA expects
940dbbd9e4bSmacallan	 *    that arbitrary widths are possible per render pass.
941dbbd9e4bSmacallan	 *
942dbbd9e4bSmacallan	 * 2) The FFB accelerator FIFO is only 100 or so words deep, and
943dbbd9e4bSmacallan	 *    XAA gives no way to limit the number of words it writes into
944dbbd9e4bSmacallan	 *    the ColorExpandBase register per rendering pass.
945dbbd9e4bSmacallan	 */
946dbbd9e4bSmacallan	infoRec->ScanlineColorExpandBuffers = pFfb->xaa_scanline_buffers;
947dbbd9e4bSmacallan	infoRec->NumScanlineColorExpandBuffers = 2;
948dbbd9e4bSmacallan	infoRec->ScanlineCPUToScreenColorExpandFillFlags =
949dbbd9e4bSmacallan		CPU_TRANSFER_PAD_DWORD |
950dbbd9e4bSmacallan		SCANLINE_PAD_DWORD |
951dbbd9e4bSmacallan		CPU_TRANSFER_BASE_FIXED |
952dbbd9e4bSmacallan		BIT_ORDER_IN_BYTE_LSBFIRST;
953dbbd9e4bSmacallan	infoRec->SetupForScanlineCPUToScreenColorExpandFill =
954dbbd9e4bSmacallan		FFB_SetupForScanlineCPUToScreenColorExpandFill;
955dbbd9e4bSmacallan	infoRec->SubsequentScanlineCPUToScreenColorExpandFill =
956dbbd9e4bSmacallan		FFB_SubsequentScanlineCPUToScreenColorExpandFill;
957dbbd9e4bSmacallan	infoRec->SubsequentColorExpandScanline =
958dbbd9e4bSmacallan		FFB_SubsequentColorExpandScanline;
959dbbd9e4bSmacallan
960dbbd9e4bSmacallan	infoRec->Mono8x8PatternFillFlags =
961dbbd9e4bSmacallan		HARDWARE_PATTERN_PROGRAMMED_BITS |
962dbbd9e4bSmacallan		HARDWARE_PATTERN_SCREEN_ORIGIN |
963dbbd9e4bSmacallan		BIT_ORDER_IN_BYTE_LSBFIRST;
964dbbd9e4bSmacallan	infoRec->SetupForMono8x8PatternFill =
965dbbd9e4bSmacallan		FFB_SetupForMono8x8PatternFill;
966dbbd9e4bSmacallan	infoRec->SubsequentMono8x8PatternFillRect =
967dbbd9e4bSmacallan		FFB_SubsequentMono8x8PatternFillRect;
968dbbd9e4bSmacallan
969dbbd9e4bSmacallan	/* Use VIS for pixmap writes.  */
970dbbd9e4bSmacallan	infoRec->WritePixmap = FFB_WritePixmap;
971dbbd9e4bSmacallan
972dbbd9e4bSmacallan	/* RENDER optimizations.  */
973dbbd9e4bSmacallan	infoRec->CPUToScreenAlphaTextureFlags =
974dbbd9e4bSmacallan		XAA_RENDER_NO_TILE |
975dbbd9e4bSmacallan		XAA_RENDER_NO_SRC_ALPHA;
976dbbd9e4bSmacallan	infoRec->CPUToScreenAlphaTextureFormats = FFBAlphaTextureFormats;
9777f8af526Smacallan	infoRec->CPUToScreenAlphaTextureDstFormats = FFBTextureDstFormats;
9787f8af526Smacallan	infoRec->SetupForCPUToScreenAlphaTexture2 =
979dbbd9e4bSmacallan		FFB_SetupForCPUToScreenAlphaTexture;
980dbbd9e4bSmacallan	infoRec->SubsequentCPUToScreenAlphaTexture =
981dbbd9e4bSmacallan		FFB_SubsequentCPUToScreenAlphaTexture;
982dbbd9e4bSmacallan
983dbbd9e4bSmacallan	infoRec->CPUToScreenTextureFlags =
984dbbd9e4bSmacallan		XAA_RENDER_NO_TILE |
985dbbd9e4bSmacallan		XAA_RENDER_NO_SRC_ALPHA;
986dbbd9e4bSmacallan	infoRec->CPUToScreenTextureFormats = FFBTextureFormats;
9877f8af526Smacallan	infoRec->CPUToScreenTextureDstFormats = FFBTextureDstFormats;
9887f8af526Smacallan	infoRec->SetupForCPUToScreenTexture2 =
989dbbd9e4bSmacallan		FFB_SetupForCPUToScreenTexture;
990dbbd9e4bSmacallan	infoRec->SubsequentCPUToScreenTexture =
991dbbd9e4bSmacallan		FFB_SubsequentCPUToScreenTexture;
992dbbd9e4bSmacallan
993dbbd9e4bSmacallan	pFfb->fifo_cache = 0;
994dbbd9e4bSmacallan
995dbbd9e4bSmacallan	FFB_DEBUG_init();
996dbbd9e4bSmacallan	FDEBUG((FDEBUG_FD,
997dbbd9e4bSmacallan		"FFB: cfg0(%08x) cfg1(%08x) cfg2(%08x) cfg3(%08x) ppcfg(%08x)\n",
998dbbd9e4bSmacallan		ffb->fbcfg0, ffb->fbcfg1, ffb->fbcfg2, ffb->fbcfg3, ffb->ppcfg));
999dbbd9e4bSmacallan
1000dbbd9e4bSmacallan	/* Determine the current screen resolution type.  This is
1001dbbd9e4bSmacallan	 * needed to figure out the fastfill/pagefill parameters.
1002dbbd9e4bSmacallan	 */
1003dbbd9e4bSmacallan	switch(ffb->fbcfg0 & FFB_FBCFG0_RES_MASK) {
1004dbbd9e4bSmacallan	default:
1005dbbd9e4bSmacallan	case FFB_FBCFG0_RES_STD:
1006dbbd9e4bSmacallan		pFfb->ffb_res = ffb_res_standard;
1007dbbd9e4bSmacallan		break;
1008dbbd9e4bSmacallan	case FFB_FBCFG0_RES_HIGH:
1009dbbd9e4bSmacallan		pFfb->ffb_res = ffb_res_high;
1010dbbd9e4bSmacallan		break;
1011dbbd9e4bSmacallan	case FFB_FBCFG0_RES_STEREO:
1012dbbd9e4bSmacallan		pFfb->ffb_res = ffb_res_stereo;
1013dbbd9e4bSmacallan		break;
1014dbbd9e4bSmacallan	case FFB_FBCFG0_RES_PRTRAIT:
1015dbbd9e4bSmacallan		pFfb->ffb_res = ffb_res_portrait;
1016dbbd9e4bSmacallan		break;
1017dbbd9e4bSmacallan	};
1018dbbd9e4bSmacallan	CreatorAlignTabInit(pFfb);
1019dbbd9e4bSmacallan
1020dbbd9e4bSmacallan	/* Next, determine the hwbug workarounds and feature enables
1021dbbd9e4bSmacallan	 * we should be using on this board.
1022dbbd9e4bSmacallan	 */
1023dbbd9e4bSmacallan	pFfb->disable_pagefill = 0;
1024dbbd9e4bSmacallan	pFfb->disable_vscroll = 0;
1025dbbd9e4bSmacallan	pFfb->has_brline_bug = 0;
1026dbbd9e4bSmacallan	pFfb->use_blkread_prefetch = 0;
1027dbbd9e4bSmacallan	if (pFfb->ffb_type == ffb1_prototype ||
1028dbbd9e4bSmacallan	    pFfb->ffb_type == ffb1_standard ||
1029dbbd9e4bSmacallan	    pFfb->ffb_type == ffb1_speedsort) {
1030dbbd9e4bSmacallan		pFfb->has_brline_bug = 1;
1031dbbd9e4bSmacallan		if (pFfb->ffb_res == ffb_res_high)
1032dbbd9e4bSmacallan			pFfb->disable_vscroll = 1;
1033dbbd9e4bSmacallan		if (pFfb->ffb_res == ffb_res_high ||
1034dbbd9e4bSmacallan		    pFfb->ffb_res == ffb_res_stereo)
1035dbbd9e4bSmacallan			pFfb->disable_pagefill = 1;
1036dbbd9e4bSmacallan
1037dbbd9e4bSmacallan	} else {
1038dbbd9e4bSmacallan		/* FFB2 has blkread prefetch.  AFB supposedly does too
1039dbbd9e4bSmacallan		 * but the chip locks up on me when I try to use it. -DaveM
1040dbbd9e4bSmacallan		 */
1041dbbd9e4bSmacallan#define AFB_PREFETCH_IS_BUGGY	1
1042dbbd9e4bSmacallan		if (!AFB_PREFETCH_IS_BUGGY ||
1043dbbd9e4bSmacallan		    (pFfb->ffb_type != afb_m3 &&
1044dbbd9e4bSmacallan		     pFfb->ffb_type != afb_m6)) {
1045dbbd9e4bSmacallan			pFfb->use_blkread_prefetch = 1;
1046dbbd9e4bSmacallan		}
1047dbbd9e4bSmacallan		/* XXX I still cannot get page/block fast fills
1048dbbd9e4bSmacallan		 * XXX to work reliably on any of my AFB boards. -DaveM
1049dbbd9e4bSmacallan		 */
1050dbbd9e4bSmacallan#define AFB_FASTFILL_IS_BUGGY	1
1051dbbd9e4bSmacallan		if (AFB_FASTFILL_IS_BUGGY &&
1052dbbd9e4bSmacallan		    (pFfb->ffb_type == afb_m3 ||
1053dbbd9e4bSmacallan		     pFfb->ffb_type == afb_m6))
1054dbbd9e4bSmacallan			pFfb->disable_pagefill = 1;
1055dbbd9e4bSmacallan	}
1056dbbd9e4bSmacallan	pFfb->disable_fastfill_ap = 0;
1057dbbd9e4bSmacallan	if (pFfb->ffb_res == ffb_res_stereo ||
1058dbbd9e4bSmacallan	    pFfb->ffb_res == ffb_res_high)
1059dbbd9e4bSmacallan		pFfb->disable_fastfill_ap = 1;
1060dbbd9e4bSmacallan
1061dbbd9e4bSmacallan	pFfb->ppc_cache = (FFB_PPC_FW_DISABLE |
1062dbbd9e4bSmacallan			   FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST |
1063dbbd9e4bSmacallan			   FFB_PPC_XS_WID | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST |
1064dbbd9e4bSmacallan			   FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE);
1065dbbd9e4bSmacallan	pFfb->wid_cache = pFfb->xaa_wid;
1066dbbd9e4bSmacallan	pFfb->pmask_cache = ~0;
1067dbbd9e4bSmacallan	pFfb->rop_cache = (FFB_ROP_NEW | (FFB_ROP_NEW << 8));
1068dbbd9e4bSmacallan	pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE;
1069dbbd9e4bSmacallan	pFfb->fg_cache = pFfb->bg_cache = 0;
1070dbbd9e4bSmacallan	pFfb->fontw_cache = 32;
1071dbbd9e4bSmacallan	pFfb->fontinc_cache = (1 << 16) | 0;
1072dbbd9e4bSmacallan	pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A |
1073dbbd9e4bSmacallan			   FFB_FBC_WE_FORCEON |
1074dbbd9e4bSmacallan			   FFB_FBC_SB_BOTH |
1075dbbd9e4bSmacallan			   FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF |
1076dbbd9e4bSmacallan			   FFB_FBC_RGBE_OFF |
1077dbbd9e4bSmacallan			   FFB_FBC_XE_ON);
1078dbbd9e4bSmacallan	pFfb->laststipple = NULL;
1079dbbd9e4bSmacallan
1080dbbd9e4bSmacallan	/* We will now clear the screen: we'll draw a rectangle covering all the
1081dbbd9e4bSmacallan	 * viewscreen, using a 'blackness' ROP.
1082dbbd9e4bSmacallan	 */
1083dbbd9e4bSmacallan	FFBFifo(pFfb, 22);
1084dbbd9e4bSmacallan	ffb->fbc = pFfb->fbc_cache;
1085dbbd9e4bSmacallan	ffb->ppc = pFfb->ppc_cache;
1086dbbd9e4bSmacallan	ffb->wid = pFfb->wid_cache;
1087dbbd9e4bSmacallan	ffb->xpmask = 0xff;
1088dbbd9e4bSmacallan	ffb->pmask = pFfb->pmask_cache;
1089dbbd9e4bSmacallan	ffb->rop = pFfb->rop_cache;
1090dbbd9e4bSmacallan	ffb->drawop = pFfb->drawop_cache;
1091dbbd9e4bSmacallan	ffb->fg = pFfb->fg_cache;
1092dbbd9e4bSmacallan	ffb->bg = pFfb->bg_cache;
1093dbbd9e4bSmacallan	ffb->fontw = pFfb->fontw_cache;
1094dbbd9e4bSmacallan	ffb->fontinc = pFfb->fontinc_cache;
1095dbbd9e4bSmacallan	ffb->xclip = FFB_XCLIP_TEST_ALWAYS;
1096dbbd9e4bSmacallan	ffb->cmp = 0x80808080;
1097dbbd9e4bSmacallan	ffb->matchab = 0x80808080;
1098dbbd9e4bSmacallan	ffb->magnab = 0x80808080;
1099dbbd9e4bSmacallan	ffb->blendc = (FFB_BLENDC_FORCE_ONE |
1100dbbd9e4bSmacallan		       FFB_BLENDC_DF_ONE_M_A |
1101dbbd9e4bSmacallan		       FFB_BLENDC_SF_A);
1102dbbd9e4bSmacallan	ffb->blendc1 = 0;
1103dbbd9e4bSmacallan	ffb->blendc2 = 0;
1104dbbd9e4bSmacallan	FFB_WRITE64(&ffb->by, 0, 0);
1105dbbd9e4bSmacallan	FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width);
1106dbbd9e4bSmacallan	pFfb->rp_active = 1;
1107dbbd9e4bSmacallan	FFBWait(pFfb, ffb);
1108dbbd9e4bSmacallan
1109dbbd9e4bSmacallan	FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy);
1110dbbd9e4bSmacallan	FFBWait(pFfb, ffb);
1111dbbd9e4bSmacallan
1112dbbd9e4bSmacallan	if (!XAAInit(pScreen, infoRec)) {
1113dbbd9e4bSmacallan		XAADestroyInfoRec(infoRec);
1114dbbd9e4bSmacallan		xfree(pFfb->xaa_scanline_buffers[0]);
1115dbbd9e4bSmacallan		xfree(pFfb->xaa_scanline_buffers[1]);
1116dbbd9e4bSmacallan		pFfb->pXAAInfo = NULL;
1117dbbd9e4bSmacallan		FFBWidFree(pFfb, pFfb->xaa_wid);
1118dbbd9e4bSmacallan		return FALSE;
1119dbbd9e4bSmacallan	}
1120dbbd9e4bSmacallan	/* Success */
1121dbbd9e4bSmacallan	return TRUE;
1122dbbd9e4bSmacallan}
1123