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