ffb_accel.c revision 89b0bd4c
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 28dbbd9e4bSmacallan#ifdef HAVE_CONFIG_H 29dbbd9e4bSmacallan#include "config.h" 30dbbd9e4bSmacallan#endif 31dbbd9e4bSmacallan 32dbbd9e4bSmacallan#include "scrnintstr.h" 33dbbd9e4bSmacallan#include "pixmapstr.h" 34dbbd9e4bSmacallan#include "regionstr.h" 35dbbd9e4bSmacallan#include "mistruct.h" 36dbbd9e4bSmacallan#include "miline.h" 37dbbd9e4bSmacallan#include "fb.h" 38dbbd9e4bSmacallan 39dbbd9e4bSmacallan#include "ffb.h" 40dbbd9e4bSmacallan#include "ffb_fifo.h" 41dbbd9e4bSmacallan#include "ffb_rcache.h" 42dbbd9e4bSmacallan#include "ffb_loops.h" 43dbbd9e4bSmacallan#include "ffb_regs.h" 44dbbd9e4bSmacallan 457a5333bcSmrg#ifdef HAVE_XAA_H 467a5333bcSmrg/* VISmoveImage.s */ 477a5333bcSmrgextern void VISmoveImageRL(unsigned char *src, unsigned char *dst, long w, long h, long skind, long dkind); 487a5333bcSmrgextern void VISmoveImageLR(unsigned char *src, unsigned char *dst, long w, long h, long skind, long dkind); 497a5333bcSmrg 50dbbd9e4bSmacallan/* Indexed by ffb resolution enum. */ 51dbbd9e4bSmacallanstruct fastfill_parms ffb_fastfill_parms[] = { 52dbbd9e4bSmacallan /* fsmall, psmall, ffh, ffw, pfh, pfw */ 53dbbd9e4bSmacallan { 0x00c0, 0x1400, 0x04, 0x08, 0x10, 0x50 }, /* Standard: 1280 x 1024 */ 54dbbd9e4bSmacallan { 0x0140, 0x2800, 0x04, 0x10, 0x10, 0xa0 }, /* High: 1920 x 1360 */ 55dbbd9e4bSmacallan { 0x0080, 0x0a00, 0x02, 0x08, 0x08, 0x50 }, /* Stereo: 960 x 580 */ 56dbbd9e4bSmacallan/*XXX*/ { 0x00c0, 0x0a00, 0x04, 0x08, 0x08, 0x50 }, /* Portrait: 1280 x 2048 XXX */ 57dbbd9e4bSmacallan}; 58dbbd9e4bSmacallan 59dbbd9e4bSmacallanvoid 60dbbd9e4bSmacallanCreatorVtChange (ScreenPtr pScreen, int enter) 61dbbd9e4bSmacallan{ 627a5333bcSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 63dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN (pScrn); 64dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 65dbbd9e4bSmacallan 66dbbd9e4bSmacallan pFfb->rp_active = 1; 67dbbd9e4bSmacallan FFBWait(pFfb, ffb); 68dbbd9e4bSmacallan pFfb->fifo_cache = -1; 69dbbd9e4bSmacallan pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | 70dbbd9e4bSmacallan FFB_FBC_RB_A | FFB_FBC_SB_BOTH| FFB_FBC_XE_OFF | 71dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_MASK); 72dbbd9e4bSmacallan pFfb->ppc_cache = (FFB_PPC_FW_DISABLE | 73dbbd9e4bSmacallan FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | 74dbbd9e4bSmacallan FFB_PPC_XS_CONST | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST| 75dbbd9e4bSmacallan FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE); 76dbbd9e4bSmacallan 77dbbd9e4bSmacallan pFfb->pmask_cache = ~0; 78dbbd9e4bSmacallan pFfb->rop_cache = FFB_ROP_EDIT_BIT; 79dbbd9e4bSmacallan pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; 80dbbd9e4bSmacallan pFfb->fg_cache = pFfb->bg_cache = 0; 81dbbd9e4bSmacallan pFfb->fontw_cache = 32; 82dbbd9e4bSmacallan pFfb->fontinc_cache = (1 << 16) | 0; 83dbbd9e4bSmacallan pFfb->laststipple = NULL; 84dbbd9e4bSmacallan FFBFifo(pFfb, 9); 85dbbd9e4bSmacallan ffb->fbc = pFfb->fbc_cache; 86dbbd9e4bSmacallan ffb->ppc = pFfb->ppc_cache; 87dbbd9e4bSmacallan ffb->pmask = pFfb->pmask_cache; 88dbbd9e4bSmacallan ffb->rop = pFfb->rop_cache; 89dbbd9e4bSmacallan ffb->drawop = pFfb->drawop_cache; 90dbbd9e4bSmacallan ffb->fg = pFfb->fg_cache; 91dbbd9e4bSmacallan ffb->bg = pFfb->bg_cache; 92dbbd9e4bSmacallan ffb->fontw = pFfb->fontw_cache; 93dbbd9e4bSmacallan ffb->fontinc = pFfb->fontinc_cache; 94dbbd9e4bSmacallan pFfb->rp_active = 1; 95dbbd9e4bSmacallan FFBWait(pFfb, ffb); 96dbbd9e4bSmacallan 97dbbd9e4bSmacallan /* Fixup the FBC/PPC caches to deal with actually using 98dbbd9e4bSmacallan * a WID for every ROP. 99dbbd9e4bSmacallan */ 100dbbd9e4bSmacallan pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | 101dbbd9e4bSmacallan FFB_FBC_RB_A | FFB_FBC_SB_BOTH | FFB_FBC_XE_ON | 102dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_ON); 103dbbd9e4bSmacallan pFfb->ppc_cache &= ~FFB_PPC_XS_MASK; 104dbbd9e4bSmacallan pFfb->ppc_cache |= FFB_PPC_XS_WID; 10589b0bd4cSmacallan pFfb->wid_cache = (enter ? pFfb->wid : 0xff); 106dbbd9e4bSmacallan FFBFifo(pFfb, 11); 107dbbd9e4bSmacallan ffb->fbc = pFfb->fbc_cache; 108dbbd9e4bSmacallan ffb->ppc = FFB_PPC_XS_WID; 109dbbd9e4bSmacallan ffb->wid = pFfb->wid_cache; 110dbbd9e4bSmacallan ffb->xpmask = 0xff; 111dbbd9e4bSmacallan ffb->xclip = FFB_XCLIP_TEST_ALWAYS; 112dbbd9e4bSmacallan ffb->cmp = 0x80808080; 113dbbd9e4bSmacallan ffb->matchab = 0x80808080; 114dbbd9e4bSmacallan ffb->magnab = 0x80808080; 115dbbd9e4bSmacallan ffb->blendc = (FFB_BLENDC_FORCE_ONE | 116dbbd9e4bSmacallan FFB_BLENDC_DF_ONE_M_A | 117dbbd9e4bSmacallan FFB_BLENDC_SF_A); 118dbbd9e4bSmacallan ffb->blendc1 = 0; 119dbbd9e4bSmacallan ffb->blendc2 = 0; 120dbbd9e4bSmacallan pFfb->rp_active = 1; 121dbbd9e4bSmacallan FFBWait(pFfb, ffb); 122dbbd9e4bSmacallan 123dbbd9e4bSmacallan if (enter) { 124dbbd9e4bSmacallan pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; 125dbbd9e4bSmacallan 126dbbd9e4bSmacallan FFBFifo(pFfb, 5); 127dbbd9e4bSmacallan ffb->drawop = pFfb->drawop_cache; 128dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, 0, 0); 129dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width); 130dbbd9e4bSmacallan pFfb->rp_active = 1; 131dbbd9e4bSmacallan FFBWait(pFfb, ffb); 132dbbd9e4bSmacallan 133dbbd9e4bSmacallan SET_SYNC_FLAG(pFfb->pXAAInfo); 134dbbd9e4bSmacallan } 135dbbd9e4bSmacallan} 136dbbd9e4bSmacallan 137dbbd9e4bSmacallan#ifdef DEBUG_FFB 138dbbd9e4bSmacallanFILE *FDEBUG_FD = NULL; 139dbbd9e4bSmacallan#endif 140dbbd9e4bSmacallan 141dbbd9e4bSmacallanstatic CARD32 FFBAlphaTextureFormats[2] = { PICT_a8, 0 }; 142dbbd9e4bSmacallanstatic CARD32 FFBTextureFormats[2] = { PICT_a8b8g8r8, 0 }; 1437f8af526Smacallanstatic CARD32 FFBTextureDstFormats[3] = { PICT_a8b8g8r8, PICT_x8b8g8r8, 0 }; 144dbbd9e4bSmacallan 145dbbd9e4bSmacallanstatic void FFB_SetupTextureAttrs(FFBPtr pFfb) 146dbbd9e4bSmacallan{ 147dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 148dbbd9e4bSmacallan unsigned int ppc = FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_VAR; 149dbbd9e4bSmacallan unsigned int ppc_mask = FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 150dbbd9e4bSmacallan unsigned int rop = FFB_ROP_NEW | (FFB_ROP_NEW << 8); 15189b0bd4cSmacallan unsigned int fbc = pFfb->fbc; 15289b0bd4cSmacallan unsigned int wid = pFfb->wid; 153dbbd9e4bSmacallan 154dbbd9e4bSmacallan ppc |= FFB_PPC_ABE_ENABLE; 155dbbd9e4bSmacallan ppc_mask |= FFB_PPC_ABE_MASK; 156dbbd9e4bSmacallan 157dbbd9e4bSmacallan if ((pFfb->ppc_cache & ppc_mask) != ppc || 158dbbd9e4bSmacallan pFfb->fbc_cache != fbc || 159dbbd9e4bSmacallan pFfb->wid_cache != wid || 160dbbd9e4bSmacallan pFfb->rop_cache != rop || 161dbbd9e4bSmacallan pFfb->pmask_cache != 0xffffffff) 162dbbd9e4bSmacallan __FFB_Attr_SFB_VAR(pFfb, ppc, ppc_mask, fbc, 163dbbd9e4bSmacallan wid, rop, 0xffffffff); 164dbbd9e4bSmacallan FFBWait(pFfb, ffb); 165dbbd9e4bSmacallan} 166dbbd9e4bSmacallan 1677f8af526Smacallanstatic Bool FFB_SetupForCPUToScreenAlphaTexture( 1687f8af526Smacallan ScrnInfoPtr pScrn, 1697f8af526Smacallan int op, 1707f8af526Smacallan CARD16 red, 1717f8af526Smacallan CARD16 green, 1727f8af526Smacallan CARD16 blue, 1737f8af526Smacallan CARD16 alpha, 1747f8af526Smacallan CARD32 maskFormat, 1757f8af526Smacallan CARD32 dstFormat, 1767f8af526Smacallan CARD8 *alphaPtr, 1777f8af526Smacallan int alphaPitch, 1787f8af526Smacallan int width, 1797f8af526Smacallan int height, 1807f8af526Smacallan int flags 1817f8af526Smacallan) 182dbbd9e4bSmacallan{ 183dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 184dbbd9e4bSmacallan 185dbbd9e4bSmacallan FFBLOG(("FFB_SetupForCPUToScreenAlphaTexture: " 186dbbd9e4bSmacallan "argb[%04x:%04x:%04x:%04x] alpha[T(%x):P(%d)] " 187dbbd9e4bSmacallan "wh[%d:%d] flgs[%x]\n", 188dbbd9e4bSmacallan alpha, red, green, blue, 1897f8af526Smacallan maskFormat, alphaPitch, 190dbbd9e4bSmacallan width, height, flags)); 191dbbd9e4bSmacallan 192dbbd9e4bSmacallan FFB_SetupTextureAttrs(pFfb); 193dbbd9e4bSmacallan 194dbbd9e4bSmacallan pFfb->xaa_tex = (unsigned char *) alphaPtr; 195dbbd9e4bSmacallan pFfb->xaa_tex_pitch = alphaPitch; 196dbbd9e4bSmacallan pFfb->xaa_tex_width = width; 197dbbd9e4bSmacallan pFfb->xaa_tex_height = height; 198dbbd9e4bSmacallan pFfb->xaa_tex_color = (/*((alpha >> 8) << 24) |*/ 199dbbd9e4bSmacallan ((blue >> 8) << 16) | 200dbbd9e4bSmacallan ((green >> 8) << 8) | 201dbbd9e4bSmacallan ((red >> 8) << 0)); 202dbbd9e4bSmacallan return TRUE; 203dbbd9e4bSmacallan} 204dbbd9e4bSmacallan 205dbbd9e4bSmacallanstatic void FFB_SubsequentCPUToScreenAlphaTexture(ScrnInfoPtr pScrn, 206dbbd9e4bSmacallan int dstx, int dsty, 207dbbd9e4bSmacallan int srcx, int srcy, 208dbbd9e4bSmacallan int width, int height) 209dbbd9e4bSmacallan{ 210dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 211dbbd9e4bSmacallan unsigned char *dst_base, *alpha_base, *sfb32; 212dbbd9e4bSmacallan unsigned int pixel_base; 213dbbd9e4bSmacallan int psz_shift = 2; 214dbbd9e4bSmacallan 215dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: " 216dbbd9e4bSmacallan "dst[%d:%d] src[%d:%d] wh[%d:%d]\n", 217dbbd9e4bSmacallan dstx, dsty, srcx, srcy, width, height)); 218dbbd9e4bSmacallan 219dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 220dbbd9e4bSmacallan dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift); 221dbbd9e4bSmacallan alpha_base = pFfb->xaa_tex; 222dbbd9e4bSmacallan alpha_base += srcx; 223dbbd9e4bSmacallan if (srcy) 224dbbd9e4bSmacallan alpha_base += (srcy * pFfb->xaa_tex_pitch); 225dbbd9e4bSmacallan pixel_base = pFfb->xaa_tex_color; 226dbbd9e4bSmacallan while (height--) { 227dbbd9e4bSmacallan unsigned int *dst = (unsigned int *) dst_base; 228dbbd9e4bSmacallan unsigned char *alpha = alpha_base; 229dbbd9e4bSmacallan int w = width; 230dbbd9e4bSmacallan 231dbbd9e4bSmacallan while (w--) { 232dbbd9e4bSmacallan (*dst) = (((unsigned int)*alpha << 24) | pixel_base); 233dbbd9e4bSmacallan dst++; 234dbbd9e4bSmacallan alpha++; 235dbbd9e4bSmacallan } 236dbbd9e4bSmacallan dst_base += (2048 << psz_shift); 237dbbd9e4bSmacallan alpha_base += pFfb->xaa_tex_pitch; 238dbbd9e4bSmacallan } 239dbbd9e4bSmacallan} 240dbbd9e4bSmacallan 241dbbd9e4bSmacallan 2427f8af526Smacallanstatic Bool FFB_SetupForCPUToScreenTexture( 2437f8af526Smacallan ScrnInfoPtr pScrn, 2447f8af526Smacallan int op, 2457f8af526Smacallan CARD32 srcFormat, 2467f8af526Smacallan CARD32 dstFormat, 2477f8af526Smacallan CARD8 *texPtr, 2487f8af526Smacallan int texPitch, 2497f8af526Smacallan int width, 2507f8af526Smacallan int height, 2517f8af526Smacallan int flags 2527f8af526Smacallan) 253dbbd9e4bSmacallan{ 254dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 255dbbd9e4bSmacallan 256dbbd9e4bSmacallan FFBLOG(("FFB_SetupForCPUToScreenTexture: " 257dbbd9e4bSmacallan "TEX[T(%x):P(%d)] " 258dbbd9e4bSmacallan "wh[%d:%d] flgs[%x]\n", 2597f8af526Smacallan srcFormat, texPitch, 260dbbd9e4bSmacallan width, height, flags)); 261dbbd9e4bSmacallan 262dbbd9e4bSmacallan FFB_SetupTextureAttrs(pFfb); 263dbbd9e4bSmacallan 264dbbd9e4bSmacallan pFfb->xaa_tex = (unsigned char *) texPtr; 265dbbd9e4bSmacallan pFfb->xaa_tex_pitch = texPitch; 266dbbd9e4bSmacallan pFfb->xaa_tex_width = width; 267dbbd9e4bSmacallan pFfb->xaa_tex_height = height; 268dbbd9e4bSmacallan 269dbbd9e4bSmacallan return TRUE; 270dbbd9e4bSmacallan} 271dbbd9e4bSmacallan 272dbbd9e4bSmacallanstatic void FFB_SubsequentCPUToScreenTexture(ScrnInfoPtr pScrn, 273dbbd9e4bSmacallan int dstx, int dsty, 274dbbd9e4bSmacallan int srcx, int srcy, 275dbbd9e4bSmacallan int width, int height) 276dbbd9e4bSmacallan{ 277dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 278dbbd9e4bSmacallan unsigned char *dst_base, *sfb32; 279dbbd9e4bSmacallan unsigned int *tex_base; 280dbbd9e4bSmacallan int psz_shift = 2; 281dbbd9e4bSmacallan 282dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: " 283dbbd9e4bSmacallan "dst[%d:%d] src[%d:%d] wh[%d:%d]\n", 284dbbd9e4bSmacallan dstx, dsty, srcx, srcy, width, height)); 285dbbd9e4bSmacallan 286dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 287dbbd9e4bSmacallan dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift); 288dbbd9e4bSmacallan tex_base = (unsigned int *) pFfb->xaa_tex; 289dbbd9e4bSmacallan tex_base += srcx; 290dbbd9e4bSmacallan if (srcy) 291dbbd9e4bSmacallan tex_base += (srcy * pFfb->xaa_tex_pitch); 292dbbd9e4bSmacallan while (height--) { 293dbbd9e4bSmacallan unsigned int *dst = (unsigned int *) dst_base; 294dbbd9e4bSmacallan unsigned int *tex = tex_base; 295dbbd9e4bSmacallan int w = width; 296dbbd9e4bSmacallan while (w--) { 297dbbd9e4bSmacallan (*dst) = *tex; 298dbbd9e4bSmacallan 299dbbd9e4bSmacallan dst++; 300dbbd9e4bSmacallan tex++; 301dbbd9e4bSmacallan } 302dbbd9e4bSmacallan dst_base += (2048 << psz_shift); 303dbbd9e4bSmacallan tex_base += pFfb->xaa_tex_pitch; 304dbbd9e4bSmacallan } 305dbbd9e4bSmacallan} 306dbbd9e4bSmacallan 307dbbd9e4bSmacallanstatic void FFB_WritePixmap(ScrnInfoPtr pScrn, 308dbbd9e4bSmacallan int x, int y, int w, int h, 309dbbd9e4bSmacallan unsigned char *src, 310dbbd9e4bSmacallan int srcwidth, 311dbbd9e4bSmacallan int rop, 312dbbd9e4bSmacallan unsigned int planemask, 313dbbd9e4bSmacallan int trans, int bpp, int depth) 314dbbd9e4bSmacallan{ 315dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 316dbbd9e4bSmacallan unsigned char *dst, *sfb32; 317dbbd9e4bSmacallan int psz_shift = 2; 318dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 319dbbd9e4bSmacallan 320dbbd9e4bSmacallan FFBLOG(("FFB_WritePixmap: " 321dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d] srcw[%d] rop[%d] pmask[%x] " 322dbbd9e4bSmacallan "trans[%d] bpp[%d] depth[%d]\n", 323dbbd9e4bSmacallan x, y, w, h, srcwidth, rop, planemask, 324dbbd9e4bSmacallan trans, bpp, depth)); 325dbbd9e4bSmacallan 326dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 327dbbd9e4bSmacallan FFBWait(pFfb, ffb); 328dbbd9e4bSmacallan 329dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 330dbbd9e4bSmacallan dst = sfb32 + (y * (2048 << psz_shift)) + (x << psz_shift); 331dbbd9e4bSmacallan VISmoveImageLR(src, dst, w << psz_shift, h, 332dbbd9e4bSmacallan srcwidth, (2048 << psz_shift)); 333dbbd9e4bSmacallan} 334dbbd9e4bSmacallan 335dbbd9e4bSmacallanstatic void FFB_SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 336dbbd9e4bSmacallan int pat_word1, int pat_word2, 337dbbd9e4bSmacallan int fg, int bg, int rop, 338dbbd9e4bSmacallan unsigned int planemask) 339dbbd9e4bSmacallan{ 340dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 341dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 342dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 343dbbd9e4bSmacallan int i; 344dbbd9e4bSmacallan 345dbbd9e4bSmacallan FFBLOG(("FFB_SetupForMono8x8PatternFill: " 346dbbd9e4bSmacallan "pat[%08x:%08x] fg[%x] bg[%x] rop[%d] pmask[%x]\n", 347dbbd9e4bSmacallan pat_word1, pat_word2, 348dbbd9e4bSmacallan fg, bg, rop, planemask)); 349dbbd9e4bSmacallan 350dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_ENABLE | FFB_PPC_CS_CONST; 351dbbd9e4bSmacallan if (bg < 0) 352dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_TRANSPARENT; 353dbbd9e4bSmacallan else 354dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_OPAQUE; 355dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | 356dbbd9e4bSmacallan FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK; 35789b0bd4cSmacallan fbc = pFfb->fbc; 358dbbd9e4bSmacallan rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8); 359dbbd9e4bSmacallan 360dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, rop, 36189b0bd4cSmacallan FFB_DRAWOP_RECTANGLE, fg, fbc, pFfb->wid); 362dbbd9e4bSmacallan if (bg >= 0) 363dbbd9e4bSmacallan FFB_WRITE_BG(pFfb, ffb, bg); 364dbbd9e4bSmacallan 365dbbd9e4bSmacallan FFBFifo(pFfb, 32); 366dbbd9e4bSmacallan for (i = 0; i < 32; i += 2) { 367dbbd9e4bSmacallan CARD32 val1, val2; 368dbbd9e4bSmacallan int shift = (24 - ((i % 4) * 8)); 369dbbd9e4bSmacallan 370dbbd9e4bSmacallan if ((i % 8) < 4) { 371dbbd9e4bSmacallan val1 = (pat_word1 >> shift) & 0xff; 372dbbd9e4bSmacallan val2 = (pat_word1 >> (shift + 8)) & 0xff; 373dbbd9e4bSmacallan } else { 374dbbd9e4bSmacallan val1 = (pat_word2 >> shift) & 0xff; 375dbbd9e4bSmacallan val2 = (pat_word2 >> (shift + 8)) & 0xff; 376dbbd9e4bSmacallan } 377dbbd9e4bSmacallan val1 |= (val1 << 8) | (val1 << 16) | (val1 << 24); 378dbbd9e4bSmacallan val2 |= (val2 << 8) | (val2 << 16) | (val2 << 24); 379dbbd9e4bSmacallan FFB_WRITE64(&ffb->pattern[i], val1, val2); 380dbbd9e4bSmacallan } 381dbbd9e4bSmacallan pFfb->rp_active = 1; 382dbbd9e4bSmacallan} 383dbbd9e4bSmacallan 384dbbd9e4bSmacallanstatic void FFB_SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 385dbbd9e4bSmacallan int pat_word1, int pat_word2, 386dbbd9e4bSmacallan int x, int y, int w, int h) 387dbbd9e4bSmacallan{ 388dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 389dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 390dbbd9e4bSmacallan 391dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentMono8x8PatternFillRect: " 392dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h)); 393dbbd9e4bSmacallan 394dbbd9e4bSmacallan FFBFifo(pFfb, 4); 395dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y, x); 396dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, h, w); 397dbbd9e4bSmacallan} 398dbbd9e4bSmacallan 399dbbd9e4bSmacallanstatic void FFB_SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 400dbbd9e4bSmacallan int fg, int bg, 401dbbd9e4bSmacallan int rop, 402dbbd9e4bSmacallan unsigned int planemask) 403dbbd9e4bSmacallan{ 404dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 405dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 406dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 407dbbd9e4bSmacallan 408dbbd9e4bSmacallan FFBLOG(("FFB_SetupForScanlineCPUToScreenColorExpandFill: " 409dbbd9e4bSmacallan "fg[%x] bg[%x] rop[%d] pmask[%x]\n", 410dbbd9e4bSmacallan fg, bg, rop, planemask)); 411dbbd9e4bSmacallan 412dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST; 413dbbd9e4bSmacallan if (bg < 0) 414dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_TRANSPARENT; 415dbbd9e4bSmacallan else 416dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_OPAQUE; 417dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | 418dbbd9e4bSmacallan FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK; 41989b0bd4cSmacallan fbc = pFfb->fbc; 420dbbd9e4bSmacallan rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8); 421dbbd9e4bSmacallan 422dbbd9e4bSmacallan if ((pFfb->ppc_cache & ppc_mask) != ppc || 423dbbd9e4bSmacallan pFfb->fg_cache != fg || 424dbbd9e4bSmacallan pFfb->fbc_cache != fbc || 425dbbd9e4bSmacallan pFfb->rop_cache != rop || 426dbbd9e4bSmacallan pFfb->pmask_cache != planemask || 427dbbd9e4bSmacallan pFfb->fontinc_cache != ((0<<16) | 32) || 428dbbd9e4bSmacallan (bg >= 0 && pFfb->bg_cache != bg)) { 429dbbd9e4bSmacallan pFfb->ppc_cache &= ~ppc_mask; 430dbbd9e4bSmacallan pFfb->ppc_cache |= ppc; 431dbbd9e4bSmacallan pFfb->fg_cache = fg; 432dbbd9e4bSmacallan pFfb->fbc_cache = fbc; 433dbbd9e4bSmacallan pFfb->rop_cache = rop; 434dbbd9e4bSmacallan pFfb->pmask_cache = planemask; 435dbbd9e4bSmacallan pFfb->fontinc_cache = ((0<<16) | 32); 436dbbd9e4bSmacallan if (bg >= 0) 437dbbd9e4bSmacallan pFfb->bg_cache = bg; 438dbbd9e4bSmacallan FFBFifo(pFfb, (bg >= 0 ? 7 : 6)); 439dbbd9e4bSmacallan ffb->ppc = ppc; 440dbbd9e4bSmacallan ffb->fg = fg; 441dbbd9e4bSmacallan ffb->fbc = fbc; 442dbbd9e4bSmacallan ffb->rop = rop; 443dbbd9e4bSmacallan ffb->pmask = planemask; 444dbbd9e4bSmacallan ffb->fontinc = ((0 << 16) | 32); 445dbbd9e4bSmacallan if(bg >= 0) 446dbbd9e4bSmacallan ffb->bg = bg; 447dbbd9e4bSmacallan } 448dbbd9e4bSmacallan pFfb->rp_active = 1; 449dbbd9e4bSmacallan} 450dbbd9e4bSmacallan 451dbbd9e4bSmacallanstatic void FFB_SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 452dbbd9e4bSmacallan int x, int y, int w, int h, 453dbbd9e4bSmacallan int skipleft) 454dbbd9e4bSmacallan{ 455dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 456dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenColorExpandFill: " 457dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d] skipleft[%d]\n", 458dbbd9e4bSmacallan x, y, w, h, skipleft)); 459dbbd9e4bSmacallan 460dbbd9e4bSmacallan pFfb->xaa_scanline_x = x; 461dbbd9e4bSmacallan pFfb->xaa_scanline_y = y; 462dbbd9e4bSmacallan pFfb->xaa_scanline_w = w; 463dbbd9e4bSmacallan} 464dbbd9e4bSmacallan 465dbbd9e4bSmacallanstatic void FFB_SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 466dbbd9e4bSmacallan{ 467dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 468dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 469dbbd9e4bSmacallan CARD32 *bits = (CARD32 *) pFfb->xaa_scanline_buffers[bufno]; 470dbbd9e4bSmacallan int w; 471dbbd9e4bSmacallan 472dbbd9e4bSmacallan FFBFifo(pFfb, 1); 473dbbd9e4bSmacallan ffb->fontxy = ((pFfb->xaa_scanline_y << 16) | pFfb->xaa_scanline_x); 474dbbd9e4bSmacallan 475dbbd9e4bSmacallan w = pFfb->xaa_scanline_w; 476dbbd9e4bSmacallan if (w >= 32) { 477dbbd9e4bSmacallan FFB_WRITE_FONTW(pFfb, ffb, 32); 478dbbd9e4bSmacallan FFBFifo(pFfb, (w / 32)); 479dbbd9e4bSmacallan do { 480dbbd9e4bSmacallan ffb->font = *bits++; 481dbbd9e4bSmacallan w -= 32; 482dbbd9e4bSmacallan } while (w >= 32); 483dbbd9e4bSmacallan } 484dbbd9e4bSmacallan if (w > 0) { 485dbbd9e4bSmacallan FFB_WRITE_FONTW(pFfb, ffb, w); 486dbbd9e4bSmacallan FFBFifo(pFfb, 1); 487dbbd9e4bSmacallan ffb->font = *bits++; 488dbbd9e4bSmacallan } 489dbbd9e4bSmacallan 490dbbd9e4bSmacallan pFfb->xaa_scanline_y++; 491dbbd9e4bSmacallan} 492dbbd9e4bSmacallan 493dbbd9e4bSmacallanstatic void FFB_SetupForDashedLine(ScrnInfoPtr pScrn, 494dbbd9e4bSmacallan int fg, int bg, int rop, 495dbbd9e4bSmacallan unsigned int planemask, 496dbbd9e4bSmacallan int length, unsigned char *pattern) 497dbbd9e4bSmacallan{ 498dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 499dbbd9e4bSmacallan CARD32 *pat_ptr = (CARD32 *)pattern; 500dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 501dbbd9e4bSmacallan 502dbbd9e4bSmacallan FFBLOG(("FFB_SetupForDashedLine: " 503dbbd9e4bSmacallan "fg[%x] bg[%x] rop[%d] pmask[%x] patlen[%d] pat[%x]\n", 504dbbd9e4bSmacallan fg, bg, rop, planemask, length, *pat_ptr)); 505dbbd9e4bSmacallan 50689b0bd4cSmacallan pFfb->planemask = planemask; 507dbbd9e4bSmacallan pFfb->xaa_rop = rop; 508dbbd9e4bSmacallan pFfb->xaa_linepat = 509dbbd9e4bSmacallan (*pat_ptr << FFB_LPAT_PATTERN_SHIFT) | 510dbbd9e4bSmacallan (1 << FFB_LPAT_SCALEVAL_SHIFT) | 511dbbd9e4bSmacallan ((length & 0xf) << FFB_LPAT_PATLEN_SHIFT); 512dbbd9e4bSmacallan 51389b0bd4cSmacallan fbc = pFfb->fbc; 514dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 515dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 516dbbd9e4bSmacallan 517dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 518dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 51989b0bd4cSmacallan FFB_DRAWOP_BRLINEOPEN, fg, fbc, pFfb->wid); 520dbbd9e4bSmacallan pFfb->rp_active = 1; 521dbbd9e4bSmacallan} 522dbbd9e4bSmacallan 523dbbd9e4bSmacallanstatic void FFB_SubsequentDashedTwoPointLine( ScrnInfoPtr pScrn, 524dbbd9e4bSmacallan int x1, int y1, 525dbbd9e4bSmacallan int x2, int y2, 526dbbd9e4bSmacallan int flags, int phase) 527dbbd9e4bSmacallan{ 528dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 529dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 530dbbd9e4bSmacallan unsigned int linepat = pFfb->xaa_linepat; 531dbbd9e4bSmacallan unsigned int drawop; 532dbbd9e4bSmacallan 533dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentDashedTwoPointLine: " 534dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%d] flgs[%x] phase[%d]\n", 535dbbd9e4bSmacallan x1, y2, x2, y2, flags, phase)); 536dbbd9e4bSmacallan 537dbbd9e4bSmacallan linepat |= (phase & 0xf) << FFB_LPAT_PATPTR_SHIFT; 538dbbd9e4bSmacallan 539dbbd9e4bSmacallan drawop = (flags & OMIT_LAST) ? 540dbbd9e4bSmacallan FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP; 541dbbd9e4bSmacallan FFB_WRITE_DRAWOP(pFfb, ffb, drawop); 542dbbd9e4bSmacallan 543dbbd9e4bSmacallan if (pFfb->has_brline_bug) { 544dbbd9e4bSmacallan FFBFifo(pFfb, 6); 545dbbd9e4bSmacallan ffb->ppc = 0; 546dbbd9e4bSmacallan } else 547dbbd9e4bSmacallan FFBFifo(pFfb, 5); 548dbbd9e4bSmacallan ffb->lpat = linepat; 549dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y1, x1); 550dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, y2, x2); 551dbbd9e4bSmacallan} 552dbbd9e4bSmacallan 553dbbd9e4bSmacallanstatic void FFB_SetupForSolidLine(ScrnInfoPtr pScrn, 554dbbd9e4bSmacallan int color, int rop, unsigned int planemask) 555dbbd9e4bSmacallan{ 556dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 557dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 558dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 559dbbd9e4bSmacallan FFBLOG(("FFB_SetupForSolidLine: " 560dbbd9e4bSmacallan "color[%d] rop[%d] pmask[%x]\n", 561dbbd9e4bSmacallan color, rop, planemask)); 562dbbd9e4bSmacallan 56389b0bd4cSmacallan pFfb->planemask = planemask; 564dbbd9e4bSmacallan pFfb->xaa_rop = rop; 565dbbd9e4bSmacallan 56689b0bd4cSmacallan fbc = pFfb->fbc; 567dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 568dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 569dbbd9e4bSmacallan 570dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 571dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 57289b0bd4cSmacallan FFB_DRAWOP_BRLINEOPEN, color, fbc, pFfb->wid); 573dbbd9e4bSmacallan FFBFifo(pFfb, 1); 574dbbd9e4bSmacallan ffb->lpat = 0; 575dbbd9e4bSmacallan pFfb->rp_active = 1; 576dbbd9e4bSmacallan} 577dbbd9e4bSmacallan 578dbbd9e4bSmacallanstatic void FFB_SubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 579dbbd9e4bSmacallan int x1, int y1, 580dbbd9e4bSmacallan int x2, int y2, 581dbbd9e4bSmacallan int flags) 582dbbd9e4bSmacallan{ 583dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 584dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 585dbbd9e4bSmacallan int drawop; 586dbbd9e4bSmacallan 587dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentSolidTwoPointLine: " 588dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%d] flags[%d]\n", 589dbbd9e4bSmacallan x1, y1, x2, y2, flags)); 590dbbd9e4bSmacallan 591dbbd9e4bSmacallan drawop = (flags & OMIT_LAST) ? 592dbbd9e4bSmacallan FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP; 593dbbd9e4bSmacallan FFB_WRITE_DRAWOP(pFfb, ffb, drawop); 594dbbd9e4bSmacallan 595dbbd9e4bSmacallan if (pFfb->has_brline_bug) { 596dbbd9e4bSmacallan FFBFifo(pFfb, 5); 597dbbd9e4bSmacallan ffb->ppc = 0; 598dbbd9e4bSmacallan } else 599dbbd9e4bSmacallan FFBFifo(pFfb, 4); 600dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y1, x1); 601dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, y2, x2); 602dbbd9e4bSmacallan} 603dbbd9e4bSmacallan 604dbbd9e4bSmacallanvoid FFB_SetupForSolidFill(ScrnInfoPtr pScrn, 605dbbd9e4bSmacallan int color, int rop, unsigned int planemask) 606dbbd9e4bSmacallan{ 607dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 608dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 609dbbd9e4bSmacallan 610dbbd9e4bSmacallan FFBLOG(("FFB_SetupForSolidFill: " 611dbbd9e4bSmacallan "color[%d] rop[%d] pmask[%u]\n", 612dbbd9e4bSmacallan color, rop, planemask)); 613dbbd9e4bSmacallan 61489b0bd4cSmacallan pFfb->planemask = planemask; 615dbbd9e4bSmacallan pFfb->xaa_rop = rop; 616dbbd9e4bSmacallan 61789b0bd4cSmacallan fbc = pFfb->fbc; 618dbbd9e4bSmacallan if (pFfb->ffb_res == ffb_res_high) 619dbbd9e4bSmacallan fbc |= FFB_FBC_WB_B; 620dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 621dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 622dbbd9e4bSmacallan 623dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 624dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 62589b0bd4cSmacallan FFB_DRAWOP_RECTANGLE, color, fbc, pFfb->wid); 626dbbd9e4bSmacallan pFfb->rp_active = 1; 627dbbd9e4bSmacallan} 628dbbd9e4bSmacallan 629dbbd9e4bSmacallanvoid FFB_SubsequentSolidFillRect(ScrnInfoPtr pScrn, 630dbbd9e4bSmacallan int x, int y, 631dbbd9e4bSmacallan int w, int h) 632dbbd9e4bSmacallan{ 633dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 634dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 635dbbd9e4bSmacallan 636dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentSolidFillRect: " 637dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h)); 638dbbd9e4bSmacallan 639dbbd9e4bSmacallan FFBFifo(pFfb, 4); 640dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y, x); 641dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, h, w); 642dbbd9e4bSmacallan} 643dbbd9e4bSmacallan 644dbbd9e4bSmacallanstatic void FFB_ScreenToScreenBitBlt(ScrnInfoPtr pScrn, 645dbbd9e4bSmacallan int nbox, 646dbbd9e4bSmacallan DDXPointPtr pptSrc, 647dbbd9e4bSmacallan BoxPtr pbox, 648dbbd9e4bSmacallan int xdir, int ydir, 649dbbd9e4bSmacallan int rop, unsigned int planemask) 650dbbd9e4bSmacallan{ 651dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 652dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 653dbbd9e4bSmacallan int use_vscroll; 654dbbd9e4bSmacallan 655dbbd9e4bSmacallan FFBLOG(("FFB_ScreenToScreenBitBlt: " 656dbbd9e4bSmacallan "nbox[%d] xdir[%d] ydir[%d] rop[%d] pmask[%x]\n", 657dbbd9e4bSmacallan nbox, xdir, ydir, rop, planemask)); 658dbbd9e4bSmacallan 659dbbd9e4bSmacallan use_vscroll = 0; 660dbbd9e4bSmacallan if (!pFfb->disable_vscroll && 661dbbd9e4bSmacallan rop == GXcopy) { 662dbbd9e4bSmacallan int i; 663dbbd9e4bSmacallan 664dbbd9e4bSmacallan for (i = 0; i < nbox; i++) 665dbbd9e4bSmacallan if (pptSrc[i].x != pbox[i].x1 || 666dbbd9e4bSmacallan pptSrc[i].y == pbox[i].y1) 667dbbd9e4bSmacallan break; 668dbbd9e4bSmacallan if (i == nbox) { 669dbbd9e4bSmacallan /* If/When double buffer extension is re-enabled 670dbbd9e4bSmacallan * check buffers here. 671dbbd9e4bSmacallan */ 672dbbd9e4bSmacallan use_vscroll = 1; 673dbbd9e4bSmacallan } 674dbbd9e4bSmacallan } 675dbbd9e4bSmacallan if (use_vscroll) { 676dbbd9e4bSmacallan FFB_ATTR_VSCROLL_XAA(pFfb, planemask); 677dbbd9e4bSmacallan while (nbox--) { 678dbbd9e4bSmacallan FFBFifo(pFfb, 7); 679dbbd9e4bSmacallan ffb->drawop = FFB_DRAWOP_VSCROLL; 680dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, pptSrc->y, pptSrc->x); 681dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->dy, pbox->y1, pbox->x1); 682dbbd9e4bSmacallan FFB_WRITE64_3(&ffb->bh, (pbox->y2 - pbox->y1), 683dbbd9e4bSmacallan (pbox->x2 - pbox->x1)); 684dbbd9e4bSmacallan 685dbbd9e4bSmacallan pbox++; 686dbbd9e4bSmacallan pptSrc++; 687dbbd9e4bSmacallan } 688dbbd9e4bSmacallan pFfb->rp_active = 1; 689dbbd9e4bSmacallan SET_SYNC_FLAG(pFfb->pXAAInfo); 690dbbd9e4bSmacallan } else { 691dbbd9e4bSmacallan unsigned char *sfb32 = (unsigned char *) pFfb->sfb32; 692dbbd9e4bSmacallan int psz_shift = 2; 693dbbd9e4bSmacallan 694dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 695dbbd9e4bSmacallan if (pFfb->use_blkread_prefetch) { 696dbbd9e4bSmacallan unsigned int bit; 697dbbd9e4bSmacallan 698dbbd9e4bSmacallan if (xdir < 0) 699dbbd9e4bSmacallan bit = FFB_MER_EDRA; 700dbbd9e4bSmacallan else 701dbbd9e4bSmacallan bit = FFB_MER_EIRA; 702dbbd9e4bSmacallan FFBFifo(pFfb, 1); 703dbbd9e4bSmacallan ffb->mer = bit; 704dbbd9e4bSmacallan pFfb->rp_active = 1; 705dbbd9e4bSmacallan } 706dbbd9e4bSmacallan FFBWait(pFfb, ffb); 707dbbd9e4bSmacallan 708dbbd9e4bSmacallan while (nbox--) { 709dbbd9e4bSmacallan unsigned char *src, *dst; 710dbbd9e4bSmacallan int x1, y1, x2, y2; 711dbbd9e4bSmacallan int width, height; 712dbbd9e4bSmacallan int sdkind; 713dbbd9e4bSmacallan 714dbbd9e4bSmacallan x1 = pptSrc->x; 715dbbd9e4bSmacallan y1 = pptSrc->y; 716dbbd9e4bSmacallan x2 = pbox->x1; 717dbbd9e4bSmacallan y2 = pbox->y1; 718dbbd9e4bSmacallan width = (pbox->x2 - pbox->x1); 719dbbd9e4bSmacallan height = (pbox->y2 - pbox->y1); 720dbbd9e4bSmacallan 721dbbd9e4bSmacallan src = sfb32 + (y1 * (2048 << psz_shift)) 722dbbd9e4bSmacallan + (x1 << psz_shift); 723dbbd9e4bSmacallan dst = sfb32 + (y2 * (2048 << psz_shift)) 724dbbd9e4bSmacallan + (x2 << psz_shift); 725dbbd9e4bSmacallan sdkind = (2048 << psz_shift); 726dbbd9e4bSmacallan 727dbbd9e4bSmacallan if (ydir < 0) { 728dbbd9e4bSmacallan src += ((height - 1) * (2048 << psz_shift)); 729dbbd9e4bSmacallan dst += ((height - 1) * (2048 << psz_shift)); 730dbbd9e4bSmacallan sdkind = -sdkind; 731dbbd9e4bSmacallan } 732dbbd9e4bSmacallan width <<= psz_shift; 733dbbd9e4bSmacallan if (xdir < 0) 734dbbd9e4bSmacallan VISmoveImageRL(src, dst, width, height, 735dbbd9e4bSmacallan sdkind, sdkind); 736dbbd9e4bSmacallan else 737dbbd9e4bSmacallan VISmoveImageLR(src, dst, width, height, 738dbbd9e4bSmacallan sdkind, sdkind); 739dbbd9e4bSmacallan pbox++; 740dbbd9e4bSmacallan pptSrc++; 741dbbd9e4bSmacallan } 742dbbd9e4bSmacallan if (pFfb->use_blkread_prefetch) { 743dbbd9e4bSmacallan FFBFifo(pFfb, 1); 744dbbd9e4bSmacallan ffb->mer = FFB_MER_DRA; 745dbbd9e4bSmacallan pFfb->rp_active = 1; 746dbbd9e4bSmacallan FFBWait(pFfb, ffb); 747dbbd9e4bSmacallan } 748dbbd9e4bSmacallan } 749dbbd9e4bSmacallan} 750dbbd9e4bSmacallan 751dbbd9e4bSmacallanvoid FFB_SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 752dbbd9e4bSmacallan int xdir, int ydir, int rop, 753dbbd9e4bSmacallan unsigned int planemask, 754dbbd9e4bSmacallan int trans_color) 755dbbd9e4bSmacallan{ 756dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 757dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 758dbbd9e4bSmacallan FFBLOG(("FFB_SetupForScreenToScreenCopy: " 759dbbd9e4bSmacallan "xdir[%d] ydir[%d] rop[%d] pmask[%x] tcolor[%d]\n", 760dbbd9e4bSmacallan xdir, ydir, rop, planemask, trans_color)); 761dbbd9e4bSmacallan 76289b0bd4cSmacallan pFfb->planemask = planemask; 763dbbd9e4bSmacallan pFfb->xaa_xdir = xdir; 764dbbd9e4bSmacallan pFfb->xaa_ydir = ydir; 765dbbd9e4bSmacallan pFfb->xaa_rop = rop; 766dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 767dbbd9e4bSmacallan FFBWait(pFfb, ffb); 768dbbd9e4bSmacallan} 769dbbd9e4bSmacallan 770dbbd9e4bSmacallanvoid FFB_SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 771dbbd9e4bSmacallan int x1, int y1, 772dbbd9e4bSmacallan int x2, int y2, 773dbbd9e4bSmacallan int width, int height) 774dbbd9e4bSmacallan{ 775dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 776dbbd9e4bSmacallan unsigned char *src, *dst, *sfb32; 777dbbd9e4bSmacallan int psz_shift = 2; 778dbbd9e4bSmacallan int sdkind; 779dbbd9e4bSmacallan 780dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentScreenToScreenCopy: " 781dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%u] w[%d] h[%d]\n", 782dbbd9e4bSmacallan x1, y1, x2, y2, width, height)); 783dbbd9e4bSmacallan 784dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 785dbbd9e4bSmacallan src = sfb32 + (y1 * (2048 << psz_shift)) + (x1 << psz_shift); 786dbbd9e4bSmacallan dst = sfb32 + (y2 * (2048 << psz_shift)) + (x2 << psz_shift); 787dbbd9e4bSmacallan sdkind = (2048 << psz_shift); 788dbbd9e4bSmacallan 789dbbd9e4bSmacallan if (pFfb->xaa_ydir < 0) { 790dbbd9e4bSmacallan src += ((height - 1) * (2048 << psz_shift)); 791dbbd9e4bSmacallan dst += ((height - 1) * (2048 << psz_shift)); 792dbbd9e4bSmacallan sdkind = -sdkind; 793dbbd9e4bSmacallan } 794dbbd9e4bSmacallan 795dbbd9e4bSmacallan width <<= psz_shift; 796dbbd9e4bSmacallan if (pFfb->xaa_xdir < 0) 797dbbd9e4bSmacallan VISmoveImageRL(src, dst, width, height, sdkind, sdkind); 798dbbd9e4bSmacallan else 799dbbd9e4bSmacallan VISmoveImageLR(src, dst, width, height, sdkind, sdkind); 800dbbd9e4bSmacallan} 801dbbd9e4bSmacallan 802dbbd9e4bSmacallanstatic void FFB_Sync(ScrnInfoPtr pScrn) 803dbbd9e4bSmacallan{ 804dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 805dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 806dbbd9e4bSmacallan 807dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); 808dbbd9e4bSmacallan FFBWait(pFfb, ffb); 809dbbd9e4bSmacallan} 810dbbd9e4bSmacallan 811dbbd9e4bSmacallan/* Multiplies and divides suck... */ 812dbbd9e4bSmacallanstatic void CreatorAlignTabInit(FFBPtr pFfb) 813dbbd9e4bSmacallan{ 814dbbd9e4bSmacallan struct fastfill_parms *ffp = &FFB_FFPARMS(pFfb); 815dbbd9e4bSmacallan short *tab = pFfb->Pf_AlignTab; 816dbbd9e4bSmacallan int i; 817dbbd9e4bSmacallan 818dbbd9e4bSmacallan for(i = 0; i < 0x800; i++) { 819dbbd9e4bSmacallan int alignval; 820dbbd9e4bSmacallan 821dbbd9e4bSmacallan alignval = (i / ffp->pagefill_width) * ffp->pagefill_width; 822dbbd9e4bSmacallan *tab++ = alignval; 823dbbd9e4bSmacallan } 824dbbd9e4bSmacallan} 825dbbd9e4bSmacallan 8267a5333bcSmrg#endif 8277a5333bcSmrg 828dbbd9e4bSmacallanBool FFBAccelInit(ScreenPtr pScreen, FFBPtr pFfb) 829dbbd9e4bSmacallan{ 8307a5333bcSmrg#ifdef HAVE_XAA_H 831dbbd9e4bSmacallan XAAInfoRecPtr infoRec; 832dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 833dbbd9e4bSmacallan 83489b0bd4cSmacallan pFfb->fbc = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | 835dbbd9e4bSmacallan FFB_FBC_WE_FORCEON | 836dbbd9e4bSmacallan FFB_FBC_SB_BOTH | 837dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | 838dbbd9e4bSmacallan FFB_FBC_RGBE_MASK | 839dbbd9e4bSmacallan FFB_FBC_XE_ON); 84089b0bd4cSmacallan pFfb->wid = FFBWidAlloc(pFfb, TrueColor, 0, TRUE); 84189b0bd4cSmacallan if (pFfb->wid == (unsigned int) -1) 842dbbd9e4bSmacallan return FALSE; 843dbbd9e4bSmacallan 844dbbd9e4bSmacallan pFfb->pXAAInfo = infoRec = XAACreateInfoRec(); 845dbbd9e4bSmacallan if (!infoRec) { 84689b0bd4cSmacallan FFBWidFree(pFfb, pFfb->wid); 847dbbd9e4bSmacallan return FALSE; 848dbbd9e4bSmacallan } 849dbbd9e4bSmacallan 8507a5333bcSmrg pFfb->xaa_scanline_buffers[0] = malloc(2048 * 4); 851dbbd9e4bSmacallan if (!pFfb->xaa_scanline_buffers[0]) { 852dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 853dbbd9e4bSmacallan return FALSE; 854dbbd9e4bSmacallan } 855dbbd9e4bSmacallan 8567a5333bcSmrg pFfb->xaa_scanline_buffers[1] = malloc(2048 * 4); 857dbbd9e4bSmacallan if (!pFfb->xaa_scanline_buffers[1]) { 8587a5333bcSmrg free(pFfb->xaa_scanline_buffers[0]); 859dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 860dbbd9e4bSmacallan return FALSE; 861dbbd9e4bSmacallan } 862dbbd9e4bSmacallan 863dbbd9e4bSmacallan infoRec->Sync = FFB_Sync; 864dbbd9e4bSmacallan 865dbbd9e4bSmacallan /* Use VIS and VSCROLL for screen to screen copies. */ 866dbbd9e4bSmacallan infoRec->ScreenToScreenCopyFlags = NO_TRANSPARENCY; 867dbbd9e4bSmacallan infoRec->SetupForScreenToScreenCopy = 868dbbd9e4bSmacallan FFB_SetupForScreenToScreenCopy; 869dbbd9e4bSmacallan infoRec->SubsequentScreenToScreenCopy = 870dbbd9e4bSmacallan FFB_SubsequentScreenToScreenCopy; 871dbbd9e4bSmacallan 872dbbd9e4bSmacallan /* In order to optimize VSCROLL and prefetching properly we 873dbbd9e4bSmacallan * have to use our own mid-layer routine. 874dbbd9e4bSmacallan */ 875dbbd9e4bSmacallan infoRec->ScreenToScreenBitBltFlags = NO_TRANSPARENCY; 876dbbd9e4bSmacallan infoRec->ScreenToScreenBitBlt = 877dbbd9e4bSmacallan FFB_ScreenToScreenBitBlt; 878dbbd9e4bSmacallan 879dbbd9e4bSmacallan infoRec->SolidFillFlags = 0; 880dbbd9e4bSmacallan infoRec->SetupForSolidFill = 881dbbd9e4bSmacallan FFB_SetupForSolidFill; 882dbbd9e4bSmacallan infoRec->SubsequentSolidFillRect = 883dbbd9e4bSmacallan FFB_SubsequentSolidFillRect; 884dbbd9e4bSmacallan 885dbbd9e4bSmacallan infoRec->SolidLineFlags = 0; 886dbbd9e4bSmacallan infoRec->SetupForSolidLine = 887dbbd9e4bSmacallan FFB_SetupForSolidLine; 888dbbd9e4bSmacallan infoRec->SubsequentSolidTwoPointLine = 889dbbd9e4bSmacallan FFB_SubsequentSolidTwoPointLine; 890dbbd9e4bSmacallan miSetZeroLineBias(pScreen, OCTANT3 | OCTANT4 | OCTANT6 | OCTANT1); 891dbbd9e4bSmacallan 892dbbd9e4bSmacallan infoRec->DashedLineFlags = (TRANSPARENCY_ONLY | 893dbbd9e4bSmacallan LINE_PATTERN_LSBFIRST_LSBJUSTIFIED); 894dbbd9e4bSmacallan infoRec->DashPatternMaxLength = 16; 895dbbd9e4bSmacallan infoRec->SetupForDashedLine = 896dbbd9e4bSmacallan FFB_SetupForDashedLine; 897dbbd9e4bSmacallan infoRec->SubsequentDashedTwoPointLine = 898dbbd9e4bSmacallan FFB_SubsequentDashedTwoPointLine; 899dbbd9e4bSmacallan 900dbbd9e4bSmacallan /* We cannot use the non-scanline color expansion mechanism on FFB 901dbbd9e4bSmacallan * for two reasons: 902dbbd9e4bSmacallan * 903dbbd9e4bSmacallan * 1) A render pass can only render 32-pixels wide on FFB, XAA expects 904dbbd9e4bSmacallan * that arbitrary widths are possible per render pass. 905dbbd9e4bSmacallan * 906dbbd9e4bSmacallan * 2) The FFB accelerator FIFO is only 100 or so words deep, and 907dbbd9e4bSmacallan * XAA gives no way to limit the number of words it writes into 908dbbd9e4bSmacallan * the ColorExpandBase register per rendering pass. 909dbbd9e4bSmacallan */ 910dbbd9e4bSmacallan infoRec->ScanlineColorExpandBuffers = pFfb->xaa_scanline_buffers; 911dbbd9e4bSmacallan infoRec->NumScanlineColorExpandBuffers = 2; 912dbbd9e4bSmacallan infoRec->ScanlineCPUToScreenColorExpandFillFlags = 913dbbd9e4bSmacallan CPU_TRANSFER_PAD_DWORD | 914dbbd9e4bSmacallan SCANLINE_PAD_DWORD | 915dbbd9e4bSmacallan CPU_TRANSFER_BASE_FIXED | 916dbbd9e4bSmacallan BIT_ORDER_IN_BYTE_LSBFIRST; 917dbbd9e4bSmacallan infoRec->SetupForScanlineCPUToScreenColorExpandFill = 918dbbd9e4bSmacallan FFB_SetupForScanlineCPUToScreenColorExpandFill; 919dbbd9e4bSmacallan infoRec->SubsequentScanlineCPUToScreenColorExpandFill = 920dbbd9e4bSmacallan FFB_SubsequentScanlineCPUToScreenColorExpandFill; 921dbbd9e4bSmacallan infoRec->SubsequentColorExpandScanline = 922dbbd9e4bSmacallan FFB_SubsequentColorExpandScanline; 923dbbd9e4bSmacallan 924dbbd9e4bSmacallan infoRec->Mono8x8PatternFillFlags = 925dbbd9e4bSmacallan HARDWARE_PATTERN_PROGRAMMED_BITS | 926dbbd9e4bSmacallan HARDWARE_PATTERN_SCREEN_ORIGIN | 927dbbd9e4bSmacallan BIT_ORDER_IN_BYTE_LSBFIRST; 928dbbd9e4bSmacallan infoRec->SetupForMono8x8PatternFill = 929dbbd9e4bSmacallan FFB_SetupForMono8x8PatternFill; 930dbbd9e4bSmacallan infoRec->SubsequentMono8x8PatternFillRect = 931dbbd9e4bSmacallan FFB_SubsequentMono8x8PatternFillRect; 932dbbd9e4bSmacallan 933dbbd9e4bSmacallan /* Use VIS for pixmap writes. */ 934dbbd9e4bSmacallan infoRec->WritePixmap = FFB_WritePixmap; 935dbbd9e4bSmacallan 936dbbd9e4bSmacallan /* RENDER optimizations. */ 937dbbd9e4bSmacallan infoRec->CPUToScreenAlphaTextureFlags = 938dbbd9e4bSmacallan XAA_RENDER_NO_TILE | 939dbbd9e4bSmacallan XAA_RENDER_NO_SRC_ALPHA; 940dbbd9e4bSmacallan infoRec->CPUToScreenAlphaTextureFormats = FFBAlphaTextureFormats; 9417f8af526Smacallan infoRec->CPUToScreenAlphaTextureDstFormats = FFBTextureDstFormats; 9427f8af526Smacallan infoRec->SetupForCPUToScreenAlphaTexture2 = 943dbbd9e4bSmacallan FFB_SetupForCPUToScreenAlphaTexture; 944dbbd9e4bSmacallan infoRec->SubsequentCPUToScreenAlphaTexture = 945dbbd9e4bSmacallan FFB_SubsequentCPUToScreenAlphaTexture; 946dbbd9e4bSmacallan 947dbbd9e4bSmacallan infoRec->CPUToScreenTextureFlags = 948dbbd9e4bSmacallan XAA_RENDER_NO_TILE | 949dbbd9e4bSmacallan XAA_RENDER_NO_SRC_ALPHA; 950dbbd9e4bSmacallan infoRec->CPUToScreenTextureFormats = FFBTextureFormats; 9517f8af526Smacallan infoRec->CPUToScreenTextureDstFormats = FFBTextureDstFormats; 9527f8af526Smacallan infoRec->SetupForCPUToScreenTexture2 = 953dbbd9e4bSmacallan FFB_SetupForCPUToScreenTexture; 954dbbd9e4bSmacallan infoRec->SubsequentCPUToScreenTexture = 955dbbd9e4bSmacallan FFB_SubsequentCPUToScreenTexture; 956dbbd9e4bSmacallan 957dbbd9e4bSmacallan pFfb->fifo_cache = 0; 958dbbd9e4bSmacallan 959dbbd9e4bSmacallan FFB_DEBUG_init(); 960dbbd9e4bSmacallan FDEBUG((FDEBUG_FD, 961dbbd9e4bSmacallan "FFB: cfg0(%08x) cfg1(%08x) cfg2(%08x) cfg3(%08x) ppcfg(%08x)\n", 962dbbd9e4bSmacallan ffb->fbcfg0, ffb->fbcfg1, ffb->fbcfg2, ffb->fbcfg3, ffb->ppcfg)); 963dbbd9e4bSmacallan 964dbbd9e4bSmacallan /* Determine the current screen resolution type. This is 965dbbd9e4bSmacallan * needed to figure out the fastfill/pagefill parameters. 966dbbd9e4bSmacallan */ 967dbbd9e4bSmacallan switch(ffb->fbcfg0 & FFB_FBCFG0_RES_MASK) { 968dbbd9e4bSmacallan default: 969dbbd9e4bSmacallan case FFB_FBCFG0_RES_STD: 970dbbd9e4bSmacallan pFfb->ffb_res = ffb_res_standard; 971dbbd9e4bSmacallan break; 972dbbd9e4bSmacallan case FFB_FBCFG0_RES_HIGH: 973dbbd9e4bSmacallan pFfb->ffb_res = ffb_res_high; 974dbbd9e4bSmacallan break; 975dbbd9e4bSmacallan case FFB_FBCFG0_RES_STEREO: 976dbbd9e4bSmacallan pFfb->ffb_res = ffb_res_stereo; 977dbbd9e4bSmacallan break; 978dbbd9e4bSmacallan case FFB_FBCFG0_RES_PRTRAIT: 979dbbd9e4bSmacallan pFfb->ffb_res = ffb_res_portrait; 980dbbd9e4bSmacallan break; 981dbbd9e4bSmacallan }; 982dbbd9e4bSmacallan CreatorAlignTabInit(pFfb); 983dbbd9e4bSmacallan 984dbbd9e4bSmacallan /* Next, determine the hwbug workarounds and feature enables 985dbbd9e4bSmacallan * we should be using on this board. 986dbbd9e4bSmacallan */ 987dbbd9e4bSmacallan pFfb->disable_pagefill = 0; 988dbbd9e4bSmacallan pFfb->disable_vscroll = 0; 989dbbd9e4bSmacallan pFfb->has_brline_bug = 0; 990dbbd9e4bSmacallan pFfb->use_blkread_prefetch = 0; 991dbbd9e4bSmacallan if (pFfb->ffb_type == ffb1_prototype || 992dbbd9e4bSmacallan pFfb->ffb_type == ffb1_standard || 993dbbd9e4bSmacallan pFfb->ffb_type == ffb1_speedsort) { 994dbbd9e4bSmacallan pFfb->has_brline_bug = 1; 995dbbd9e4bSmacallan if (pFfb->ffb_res == ffb_res_high) 996dbbd9e4bSmacallan pFfb->disable_vscroll = 1; 997dbbd9e4bSmacallan if (pFfb->ffb_res == ffb_res_high || 998dbbd9e4bSmacallan pFfb->ffb_res == ffb_res_stereo) 999dbbd9e4bSmacallan pFfb->disable_pagefill = 1; 1000dbbd9e4bSmacallan 1001dbbd9e4bSmacallan } else { 1002dbbd9e4bSmacallan /* FFB2 has blkread prefetch. AFB supposedly does too 1003dbbd9e4bSmacallan * but the chip locks up on me when I try to use it. -DaveM 1004dbbd9e4bSmacallan */ 1005dbbd9e4bSmacallan#define AFB_PREFETCH_IS_BUGGY 1 1006dbbd9e4bSmacallan if (!AFB_PREFETCH_IS_BUGGY || 1007dbbd9e4bSmacallan (pFfb->ffb_type != afb_m3 && 1008dbbd9e4bSmacallan pFfb->ffb_type != afb_m6)) { 1009dbbd9e4bSmacallan pFfb->use_blkread_prefetch = 1; 1010dbbd9e4bSmacallan } 1011dbbd9e4bSmacallan /* XXX I still cannot get page/block fast fills 1012dbbd9e4bSmacallan * XXX to work reliably on any of my AFB boards. -DaveM 1013dbbd9e4bSmacallan */ 1014dbbd9e4bSmacallan#define AFB_FASTFILL_IS_BUGGY 1 1015dbbd9e4bSmacallan if (AFB_FASTFILL_IS_BUGGY && 1016dbbd9e4bSmacallan (pFfb->ffb_type == afb_m3 || 1017dbbd9e4bSmacallan pFfb->ffb_type == afb_m6)) 1018dbbd9e4bSmacallan pFfb->disable_pagefill = 1; 1019dbbd9e4bSmacallan } 1020dbbd9e4bSmacallan pFfb->disable_fastfill_ap = 0; 1021dbbd9e4bSmacallan if (pFfb->ffb_res == ffb_res_stereo || 1022dbbd9e4bSmacallan pFfb->ffb_res == ffb_res_high) 1023dbbd9e4bSmacallan pFfb->disable_fastfill_ap = 1; 1024dbbd9e4bSmacallan 1025dbbd9e4bSmacallan pFfb->ppc_cache = (FFB_PPC_FW_DISABLE | 1026dbbd9e4bSmacallan FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | 1027dbbd9e4bSmacallan FFB_PPC_XS_WID | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST | 1028dbbd9e4bSmacallan FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE); 102989b0bd4cSmacallan pFfb->wid_cache = pFfb->wid; 1030dbbd9e4bSmacallan pFfb->pmask_cache = ~0; 1031dbbd9e4bSmacallan pFfb->rop_cache = (FFB_ROP_NEW | (FFB_ROP_NEW << 8)); 1032dbbd9e4bSmacallan pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; 1033dbbd9e4bSmacallan pFfb->fg_cache = pFfb->bg_cache = 0; 1034dbbd9e4bSmacallan pFfb->fontw_cache = 32; 1035dbbd9e4bSmacallan pFfb->fontinc_cache = (1 << 16) | 0; 1036dbbd9e4bSmacallan pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | 1037dbbd9e4bSmacallan FFB_FBC_WE_FORCEON | 1038dbbd9e4bSmacallan FFB_FBC_SB_BOTH | 1039dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | 1040dbbd9e4bSmacallan FFB_FBC_RGBE_OFF | 1041dbbd9e4bSmacallan FFB_FBC_XE_ON); 1042dbbd9e4bSmacallan pFfb->laststipple = NULL; 1043dbbd9e4bSmacallan 1044dbbd9e4bSmacallan /* We will now clear the screen: we'll draw a rectangle covering all the 1045dbbd9e4bSmacallan * viewscreen, using a 'blackness' ROP. 1046dbbd9e4bSmacallan */ 1047dbbd9e4bSmacallan FFBFifo(pFfb, 22); 1048dbbd9e4bSmacallan ffb->fbc = pFfb->fbc_cache; 1049dbbd9e4bSmacallan ffb->ppc = pFfb->ppc_cache; 1050dbbd9e4bSmacallan ffb->wid = pFfb->wid_cache; 1051dbbd9e4bSmacallan ffb->xpmask = 0xff; 1052dbbd9e4bSmacallan ffb->pmask = pFfb->pmask_cache; 1053dbbd9e4bSmacallan ffb->rop = pFfb->rop_cache; 1054dbbd9e4bSmacallan ffb->drawop = pFfb->drawop_cache; 1055dbbd9e4bSmacallan ffb->fg = pFfb->fg_cache; 1056dbbd9e4bSmacallan ffb->bg = pFfb->bg_cache; 1057dbbd9e4bSmacallan ffb->fontw = pFfb->fontw_cache; 1058dbbd9e4bSmacallan ffb->fontinc = pFfb->fontinc_cache; 1059dbbd9e4bSmacallan ffb->xclip = FFB_XCLIP_TEST_ALWAYS; 1060dbbd9e4bSmacallan ffb->cmp = 0x80808080; 1061dbbd9e4bSmacallan ffb->matchab = 0x80808080; 1062dbbd9e4bSmacallan ffb->magnab = 0x80808080; 1063dbbd9e4bSmacallan ffb->blendc = (FFB_BLENDC_FORCE_ONE | 1064dbbd9e4bSmacallan FFB_BLENDC_DF_ONE_M_A | 1065dbbd9e4bSmacallan FFB_BLENDC_SF_A); 1066dbbd9e4bSmacallan ffb->blendc1 = 0; 1067dbbd9e4bSmacallan ffb->blendc2 = 0; 1068dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, 0, 0); 1069dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width); 1070dbbd9e4bSmacallan pFfb->rp_active = 1; 1071dbbd9e4bSmacallan FFBWait(pFfb, ffb); 1072dbbd9e4bSmacallan 1073dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); 1074dbbd9e4bSmacallan FFBWait(pFfb, ffb); 1075dbbd9e4bSmacallan 1076dbbd9e4bSmacallan if (!XAAInit(pScreen, infoRec)) { 1077dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 10787a5333bcSmrg free(pFfb->xaa_scanline_buffers[0]); 10797a5333bcSmrg free(pFfb->xaa_scanline_buffers[1]); 1080dbbd9e4bSmacallan pFfb->pXAAInfo = NULL; 108189b0bd4cSmacallan FFBWidFree(pFfb, pFfb->wid); 1082dbbd9e4bSmacallan return FALSE; 1083dbbd9e4bSmacallan } 1084dbbd9e4bSmacallan /* Success */ 1085dbbd9e4bSmacallan return TRUE; 10867a5333bcSmrg#else 10877a5333bcSmrg return FALSE; 10887a5333bcSmrg#endif 1089dbbd9e4bSmacallan} 1090