ffb_accel.c revision 504f16bc
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 1457f8af526Smacallanstatic Bool FFB_SetupForCPUToScreenAlphaTexture( 1467f8af526Smacallan ScrnInfoPtr pScrn, 1477f8af526Smacallan int op, 1487f8af526Smacallan CARD16 red, 1497f8af526Smacallan CARD16 green, 1507f8af526Smacallan CARD16 blue, 1517f8af526Smacallan CARD16 alpha, 1527f8af526Smacallan CARD32 maskFormat, 1537f8af526Smacallan CARD32 dstFormat, 1547f8af526Smacallan CARD8 *alphaPtr, 1557f8af526Smacallan int alphaPitch, 1567f8af526Smacallan int width, 1577f8af526Smacallan int height, 1587f8af526Smacallan int flags 1597f8af526Smacallan) 160dbbd9e4bSmacallan{ 161dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 162dbbd9e4bSmacallan 163dbbd9e4bSmacallan FFBLOG(("FFB_SetupForCPUToScreenAlphaTexture: " 164dbbd9e4bSmacallan "argb[%04x:%04x:%04x:%04x] alpha[T(%x):P(%d)] " 165dbbd9e4bSmacallan "wh[%d:%d] flgs[%x]\n", 166dbbd9e4bSmacallan alpha, red, green, blue, 1677f8af526Smacallan maskFormat, alphaPitch, 168dbbd9e4bSmacallan width, height, flags)); 169dbbd9e4bSmacallan 170dbbd9e4bSmacallan FFB_SetupTextureAttrs(pFfb); 171dbbd9e4bSmacallan 172dbbd9e4bSmacallan pFfb->xaa_tex = (unsigned char *) alphaPtr; 173dbbd9e4bSmacallan pFfb->xaa_tex_pitch = alphaPitch; 174dbbd9e4bSmacallan pFfb->xaa_tex_width = width; 175dbbd9e4bSmacallan pFfb->xaa_tex_height = height; 176dbbd9e4bSmacallan pFfb->xaa_tex_color = (/*((alpha >> 8) << 24) |*/ 177dbbd9e4bSmacallan ((blue >> 8) << 16) | 178dbbd9e4bSmacallan ((green >> 8) << 8) | 179dbbd9e4bSmacallan ((red >> 8) << 0)); 180dbbd9e4bSmacallan return TRUE; 181dbbd9e4bSmacallan} 182dbbd9e4bSmacallan 183dbbd9e4bSmacallanstatic void FFB_SubsequentCPUToScreenAlphaTexture(ScrnInfoPtr pScrn, 184dbbd9e4bSmacallan int dstx, int dsty, 185dbbd9e4bSmacallan int srcx, int srcy, 186dbbd9e4bSmacallan int width, int height) 187dbbd9e4bSmacallan{ 188dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 189dbbd9e4bSmacallan unsigned char *dst_base, *alpha_base, *sfb32; 190dbbd9e4bSmacallan unsigned int pixel_base; 191dbbd9e4bSmacallan int psz_shift = 2; 192dbbd9e4bSmacallan 193dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: " 194dbbd9e4bSmacallan "dst[%d:%d] src[%d:%d] wh[%d:%d]\n", 195dbbd9e4bSmacallan dstx, dsty, srcx, srcy, width, height)); 196dbbd9e4bSmacallan 197dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 198dbbd9e4bSmacallan dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift); 199dbbd9e4bSmacallan alpha_base = pFfb->xaa_tex; 200dbbd9e4bSmacallan alpha_base += srcx; 201dbbd9e4bSmacallan if (srcy) 202dbbd9e4bSmacallan alpha_base += (srcy * pFfb->xaa_tex_pitch); 203dbbd9e4bSmacallan pixel_base = pFfb->xaa_tex_color; 204dbbd9e4bSmacallan while (height--) { 205dbbd9e4bSmacallan unsigned int *dst = (unsigned int *) dst_base; 206dbbd9e4bSmacallan unsigned char *alpha = alpha_base; 207dbbd9e4bSmacallan int w = width; 208dbbd9e4bSmacallan 209dbbd9e4bSmacallan while (w--) { 210dbbd9e4bSmacallan (*dst) = (((unsigned int)*alpha << 24) | pixel_base); 211dbbd9e4bSmacallan dst++; 212dbbd9e4bSmacallan alpha++; 213dbbd9e4bSmacallan } 214dbbd9e4bSmacallan dst_base += (2048 << psz_shift); 215dbbd9e4bSmacallan alpha_base += pFfb->xaa_tex_pitch; 216dbbd9e4bSmacallan } 217dbbd9e4bSmacallan} 218dbbd9e4bSmacallan 219dbbd9e4bSmacallan 2207f8af526Smacallanstatic Bool FFB_SetupForCPUToScreenTexture( 2217f8af526Smacallan ScrnInfoPtr pScrn, 2227f8af526Smacallan int op, 2237f8af526Smacallan CARD32 srcFormat, 2247f8af526Smacallan CARD32 dstFormat, 2257f8af526Smacallan CARD8 *texPtr, 2267f8af526Smacallan int texPitch, 2277f8af526Smacallan int width, 2287f8af526Smacallan int height, 2297f8af526Smacallan int flags 2307f8af526Smacallan) 231dbbd9e4bSmacallan{ 232dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 233dbbd9e4bSmacallan 234dbbd9e4bSmacallan FFBLOG(("FFB_SetupForCPUToScreenTexture: " 235dbbd9e4bSmacallan "TEX[T(%x):P(%d)] " 236dbbd9e4bSmacallan "wh[%d:%d] flgs[%x]\n", 2377f8af526Smacallan srcFormat, texPitch, 238dbbd9e4bSmacallan width, height, flags)); 239dbbd9e4bSmacallan 240dbbd9e4bSmacallan FFB_SetupTextureAttrs(pFfb); 241dbbd9e4bSmacallan 242dbbd9e4bSmacallan pFfb->xaa_tex = (unsigned char *) texPtr; 243dbbd9e4bSmacallan pFfb->xaa_tex_pitch = texPitch; 244dbbd9e4bSmacallan pFfb->xaa_tex_width = width; 245dbbd9e4bSmacallan pFfb->xaa_tex_height = height; 246dbbd9e4bSmacallan 247dbbd9e4bSmacallan return TRUE; 248dbbd9e4bSmacallan} 249dbbd9e4bSmacallan 250dbbd9e4bSmacallanstatic void FFB_SubsequentCPUToScreenTexture(ScrnInfoPtr pScrn, 251dbbd9e4bSmacallan int dstx, int dsty, 252dbbd9e4bSmacallan int srcx, int srcy, 253dbbd9e4bSmacallan int width, int height) 254dbbd9e4bSmacallan{ 255dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 256dbbd9e4bSmacallan unsigned char *dst_base, *sfb32; 257dbbd9e4bSmacallan unsigned int *tex_base; 258dbbd9e4bSmacallan int psz_shift = 2; 259dbbd9e4bSmacallan 260dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: " 261dbbd9e4bSmacallan "dst[%d:%d] src[%d:%d] wh[%d:%d]\n", 262dbbd9e4bSmacallan dstx, dsty, srcx, srcy, width, height)); 263dbbd9e4bSmacallan 264dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 265dbbd9e4bSmacallan dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift); 266dbbd9e4bSmacallan tex_base = (unsigned int *) pFfb->xaa_tex; 267dbbd9e4bSmacallan tex_base += srcx; 268dbbd9e4bSmacallan if (srcy) 269dbbd9e4bSmacallan tex_base += (srcy * pFfb->xaa_tex_pitch); 270dbbd9e4bSmacallan while (height--) { 271dbbd9e4bSmacallan unsigned int *dst = (unsigned int *) dst_base; 272dbbd9e4bSmacallan unsigned int *tex = tex_base; 273dbbd9e4bSmacallan int w = width; 274dbbd9e4bSmacallan while (w--) { 275dbbd9e4bSmacallan (*dst) = *tex; 276dbbd9e4bSmacallan 277dbbd9e4bSmacallan dst++; 278dbbd9e4bSmacallan tex++; 279dbbd9e4bSmacallan } 280dbbd9e4bSmacallan dst_base += (2048 << psz_shift); 281dbbd9e4bSmacallan tex_base += pFfb->xaa_tex_pitch; 282dbbd9e4bSmacallan } 283dbbd9e4bSmacallan} 284dbbd9e4bSmacallan 285dbbd9e4bSmacallanstatic void FFB_WritePixmap(ScrnInfoPtr pScrn, 286dbbd9e4bSmacallan int x, int y, int w, int h, 287dbbd9e4bSmacallan unsigned char *src, 288dbbd9e4bSmacallan int srcwidth, 289dbbd9e4bSmacallan int rop, 290dbbd9e4bSmacallan unsigned int planemask, 291dbbd9e4bSmacallan int trans, int bpp, int depth) 292dbbd9e4bSmacallan{ 293dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 294dbbd9e4bSmacallan unsigned char *dst, *sfb32; 295dbbd9e4bSmacallan int psz_shift = 2; 296dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 297dbbd9e4bSmacallan 298dbbd9e4bSmacallan FFBLOG(("FFB_WritePixmap: " 299dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d] srcw[%d] rop[%d] pmask[%x] " 300dbbd9e4bSmacallan "trans[%d] bpp[%d] depth[%d]\n", 301dbbd9e4bSmacallan x, y, w, h, srcwidth, rop, planemask, 302dbbd9e4bSmacallan trans, bpp, depth)); 303dbbd9e4bSmacallan 304dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 305dbbd9e4bSmacallan FFBWait(pFfb, ffb); 306dbbd9e4bSmacallan 307dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 308dbbd9e4bSmacallan dst = sfb32 + (y * (2048 << psz_shift)) + (x << psz_shift); 309dbbd9e4bSmacallan VISmoveImageLR(src, dst, w << psz_shift, h, 310dbbd9e4bSmacallan srcwidth, (2048 << psz_shift)); 311dbbd9e4bSmacallan} 312dbbd9e4bSmacallan 313dbbd9e4bSmacallanstatic void FFB_SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 314dbbd9e4bSmacallan int pat_word1, int pat_word2, 315dbbd9e4bSmacallan int fg, int bg, int rop, 316dbbd9e4bSmacallan unsigned int planemask) 317dbbd9e4bSmacallan{ 318dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 319dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 320dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 321dbbd9e4bSmacallan int i; 322dbbd9e4bSmacallan 323dbbd9e4bSmacallan FFBLOG(("FFB_SetupForMono8x8PatternFill: " 324dbbd9e4bSmacallan "pat[%08x:%08x] fg[%x] bg[%x] rop[%d] pmask[%x]\n", 325dbbd9e4bSmacallan pat_word1, pat_word2, 326dbbd9e4bSmacallan fg, bg, rop, planemask)); 327dbbd9e4bSmacallan 328dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_ENABLE | FFB_PPC_CS_CONST; 329dbbd9e4bSmacallan if (bg < 0) 330dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_TRANSPARENT; 331dbbd9e4bSmacallan else 332dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_OPAQUE; 333dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | 334dbbd9e4bSmacallan FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK; 33589b0bd4cSmacallan fbc = pFfb->fbc; 336dbbd9e4bSmacallan rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8); 337dbbd9e4bSmacallan 338dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, rop, 33989b0bd4cSmacallan FFB_DRAWOP_RECTANGLE, fg, fbc, pFfb->wid); 340dbbd9e4bSmacallan if (bg >= 0) 341dbbd9e4bSmacallan FFB_WRITE_BG(pFfb, ffb, bg); 342dbbd9e4bSmacallan 343dbbd9e4bSmacallan FFBFifo(pFfb, 32); 344dbbd9e4bSmacallan for (i = 0; i < 32; i += 2) { 345dbbd9e4bSmacallan CARD32 val1, val2; 346dbbd9e4bSmacallan int shift = (24 - ((i % 4) * 8)); 347dbbd9e4bSmacallan 348dbbd9e4bSmacallan if ((i % 8) < 4) { 349dbbd9e4bSmacallan val1 = (pat_word1 >> shift) & 0xff; 350dbbd9e4bSmacallan val2 = (pat_word1 >> (shift + 8)) & 0xff; 351dbbd9e4bSmacallan } else { 352dbbd9e4bSmacallan val1 = (pat_word2 >> shift) & 0xff; 353dbbd9e4bSmacallan val2 = (pat_word2 >> (shift + 8)) & 0xff; 354dbbd9e4bSmacallan } 355dbbd9e4bSmacallan val1 |= (val1 << 8) | (val1 << 16) | (val1 << 24); 356dbbd9e4bSmacallan val2 |= (val2 << 8) | (val2 << 16) | (val2 << 24); 357dbbd9e4bSmacallan FFB_WRITE64(&ffb->pattern[i], val1, val2); 358dbbd9e4bSmacallan } 359dbbd9e4bSmacallan pFfb->rp_active = 1; 360dbbd9e4bSmacallan} 361dbbd9e4bSmacallan 362dbbd9e4bSmacallanstatic void FFB_SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 363dbbd9e4bSmacallan int pat_word1, int pat_word2, 364dbbd9e4bSmacallan int x, int y, int w, int h) 365dbbd9e4bSmacallan{ 366dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 367dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 368dbbd9e4bSmacallan 369dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentMono8x8PatternFillRect: " 370dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h)); 371dbbd9e4bSmacallan 372dbbd9e4bSmacallan FFBFifo(pFfb, 4); 373dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y, x); 374dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, h, w); 375dbbd9e4bSmacallan} 376dbbd9e4bSmacallan 377dbbd9e4bSmacallanstatic void FFB_SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 378dbbd9e4bSmacallan int fg, int bg, 379dbbd9e4bSmacallan int rop, 380dbbd9e4bSmacallan unsigned int planemask) 381dbbd9e4bSmacallan{ 382dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 383dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 384dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 385dbbd9e4bSmacallan 386dbbd9e4bSmacallan FFBLOG(("FFB_SetupForScanlineCPUToScreenColorExpandFill: " 387dbbd9e4bSmacallan "fg[%x] bg[%x] rop[%d] pmask[%x]\n", 388dbbd9e4bSmacallan fg, bg, rop, planemask)); 389dbbd9e4bSmacallan 390dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST; 391dbbd9e4bSmacallan if (bg < 0) 392dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_TRANSPARENT; 393dbbd9e4bSmacallan else 394dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_OPAQUE; 395dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | 396dbbd9e4bSmacallan FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK; 39789b0bd4cSmacallan fbc = pFfb->fbc; 398dbbd9e4bSmacallan rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8); 399dbbd9e4bSmacallan 400dbbd9e4bSmacallan if ((pFfb->ppc_cache & ppc_mask) != ppc || 401dbbd9e4bSmacallan pFfb->fg_cache != fg || 402dbbd9e4bSmacallan pFfb->fbc_cache != fbc || 403dbbd9e4bSmacallan pFfb->rop_cache != rop || 404dbbd9e4bSmacallan pFfb->pmask_cache != planemask || 405dbbd9e4bSmacallan pFfb->fontinc_cache != ((0<<16) | 32) || 406dbbd9e4bSmacallan (bg >= 0 && pFfb->bg_cache != bg)) { 407dbbd9e4bSmacallan pFfb->ppc_cache &= ~ppc_mask; 408dbbd9e4bSmacallan pFfb->ppc_cache |= ppc; 409dbbd9e4bSmacallan pFfb->fg_cache = fg; 410dbbd9e4bSmacallan pFfb->fbc_cache = fbc; 411dbbd9e4bSmacallan pFfb->rop_cache = rop; 412dbbd9e4bSmacallan pFfb->pmask_cache = planemask; 413dbbd9e4bSmacallan pFfb->fontinc_cache = ((0<<16) | 32); 414dbbd9e4bSmacallan if (bg >= 0) 415dbbd9e4bSmacallan pFfb->bg_cache = bg; 416dbbd9e4bSmacallan FFBFifo(pFfb, (bg >= 0 ? 7 : 6)); 417dbbd9e4bSmacallan ffb->ppc = ppc; 418dbbd9e4bSmacallan ffb->fg = fg; 419dbbd9e4bSmacallan ffb->fbc = fbc; 420dbbd9e4bSmacallan ffb->rop = rop; 421dbbd9e4bSmacallan ffb->pmask = planemask; 422dbbd9e4bSmacallan ffb->fontinc = ((0 << 16) | 32); 423dbbd9e4bSmacallan if(bg >= 0) 424dbbd9e4bSmacallan ffb->bg = bg; 425dbbd9e4bSmacallan } 426dbbd9e4bSmacallan pFfb->rp_active = 1; 427dbbd9e4bSmacallan} 428dbbd9e4bSmacallan 429dbbd9e4bSmacallanstatic void FFB_SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 430dbbd9e4bSmacallan int x, int y, int w, int h, 431dbbd9e4bSmacallan int skipleft) 432dbbd9e4bSmacallan{ 433dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 434dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenColorExpandFill: " 435dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d] skipleft[%d]\n", 436dbbd9e4bSmacallan x, y, w, h, skipleft)); 437dbbd9e4bSmacallan 438dbbd9e4bSmacallan pFfb->xaa_scanline_x = x; 439dbbd9e4bSmacallan pFfb->xaa_scanline_y = y; 440dbbd9e4bSmacallan pFfb->xaa_scanline_w = w; 441dbbd9e4bSmacallan} 442dbbd9e4bSmacallan 443dbbd9e4bSmacallanstatic void FFB_SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 444dbbd9e4bSmacallan{ 445dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 446dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 447dbbd9e4bSmacallan CARD32 *bits = (CARD32 *) pFfb->xaa_scanline_buffers[bufno]; 448dbbd9e4bSmacallan int w; 449dbbd9e4bSmacallan 450dbbd9e4bSmacallan FFBFifo(pFfb, 1); 451dbbd9e4bSmacallan ffb->fontxy = ((pFfb->xaa_scanline_y << 16) | pFfb->xaa_scanline_x); 452dbbd9e4bSmacallan 453dbbd9e4bSmacallan w = pFfb->xaa_scanline_w; 454dbbd9e4bSmacallan if (w >= 32) { 455dbbd9e4bSmacallan FFB_WRITE_FONTW(pFfb, ffb, 32); 456dbbd9e4bSmacallan FFBFifo(pFfb, (w / 32)); 457dbbd9e4bSmacallan do { 458dbbd9e4bSmacallan ffb->font = *bits++; 459dbbd9e4bSmacallan w -= 32; 460dbbd9e4bSmacallan } while (w >= 32); 461dbbd9e4bSmacallan } 462dbbd9e4bSmacallan if (w > 0) { 463dbbd9e4bSmacallan FFB_WRITE_FONTW(pFfb, ffb, w); 464dbbd9e4bSmacallan FFBFifo(pFfb, 1); 465dbbd9e4bSmacallan ffb->font = *bits++; 466dbbd9e4bSmacallan } 467dbbd9e4bSmacallan 468dbbd9e4bSmacallan pFfb->xaa_scanline_y++; 469dbbd9e4bSmacallan} 470dbbd9e4bSmacallan 471dbbd9e4bSmacallanstatic void FFB_SetupForDashedLine(ScrnInfoPtr pScrn, 472dbbd9e4bSmacallan int fg, int bg, int rop, 473dbbd9e4bSmacallan unsigned int planemask, 474dbbd9e4bSmacallan int length, unsigned char *pattern) 475dbbd9e4bSmacallan{ 476dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 477dbbd9e4bSmacallan CARD32 *pat_ptr = (CARD32 *)pattern; 478dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 479dbbd9e4bSmacallan 480dbbd9e4bSmacallan FFBLOG(("FFB_SetupForDashedLine: " 481dbbd9e4bSmacallan "fg[%x] bg[%x] rop[%d] pmask[%x] patlen[%d] pat[%x]\n", 482dbbd9e4bSmacallan fg, bg, rop, planemask, length, *pat_ptr)); 483dbbd9e4bSmacallan 48489b0bd4cSmacallan pFfb->planemask = planemask; 485dbbd9e4bSmacallan pFfb->xaa_rop = rop; 486dbbd9e4bSmacallan pFfb->xaa_linepat = 487dbbd9e4bSmacallan (*pat_ptr << FFB_LPAT_PATTERN_SHIFT) | 488dbbd9e4bSmacallan (1 << FFB_LPAT_SCALEVAL_SHIFT) | 489dbbd9e4bSmacallan ((length & 0xf) << FFB_LPAT_PATLEN_SHIFT); 490dbbd9e4bSmacallan 49189b0bd4cSmacallan fbc = pFfb->fbc; 492dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 493dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 494dbbd9e4bSmacallan 495dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 496dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 49789b0bd4cSmacallan FFB_DRAWOP_BRLINEOPEN, fg, fbc, pFfb->wid); 498dbbd9e4bSmacallan pFfb->rp_active = 1; 499dbbd9e4bSmacallan} 500dbbd9e4bSmacallan 501dbbd9e4bSmacallanstatic void FFB_SubsequentDashedTwoPointLine( ScrnInfoPtr pScrn, 502dbbd9e4bSmacallan int x1, int y1, 503dbbd9e4bSmacallan int x2, int y2, 504dbbd9e4bSmacallan int flags, int phase) 505dbbd9e4bSmacallan{ 506dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 507dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 508dbbd9e4bSmacallan unsigned int linepat = pFfb->xaa_linepat; 509dbbd9e4bSmacallan unsigned int drawop; 510dbbd9e4bSmacallan 511dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentDashedTwoPointLine: " 512dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%d] flgs[%x] phase[%d]\n", 513dbbd9e4bSmacallan x1, y2, x2, y2, flags, phase)); 514dbbd9e4bSmacallan 515dbbd9e4bSmacallan linepat |= (phase & 0xf) << FFB_LPAT_PATPTR_SHIFT; 516dbbd9e4bSmacallan 517dbbd9e4bSmacallan drawop = (flags & OMIT_LAST) ? 518dbbd9e4bSmacallan FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP; 519dbbd9e4bSmacallan FFB_WRITE_DRAWOP(pFfb, ffb, drawop); 520dbbd9e4bSmacallan 521dbbd9e4bSmacallan if (pFfb->has_brline_bug) { 522dbbd9e4bSmacallan FFBFifo(pFfb, 6); 523dbbd9e4bSmacallan ffb->ppc = 0; 524dbbd9e4bSmacallan } else 525dbbd9e4bSmacallan FFBFifo(pFfb, 5); 526dbbd9e4bSmacallan ffb->lpat = linepat; 527dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y1, x1); 528dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, y2, x2); 529dbbd9e4bSmacallan} 530dbbd9e4bSmacallan 531dbbd9e4bSmacallanstatic void FFB_SetupForSolidLine(ScrnInfoPtr pScrn, 532dbbd9e4bSmacallan int color, int rop, unsigned int planemask) 533dbbd9e4bSmacallan{ 534dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 535dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 536dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 537dbbd9e4bSmacallan FFBLOG(("FFB_SetupForSolidLine: " 538dbbd9e4bSmacallan "color[%d] rop[%d] pmask[%x]\n", 539dbbd9e4bSmacallan color, rop, planemask)); 540dbbd9e4bSmacallan 54189b0bd4cSmacallan pFfb->planemask = planemask; 542dbbd9e4bSmacallan pFfb->xaa_rop = rop; 543dbbd9e4bSmacallan 54489b0bd4cSmacallan fbc = pFfb->fbc; 545dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 546dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 547dbbd9e4bSmacallan 548dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 549dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 55089b0bd4cSmacallan FFB_DRAWOP_BRLINEOPEN, color, fbc, pFfb->wid); 551dbbd9e4bSmacallan FFBFifo(pFfb, 1); 552dbbd9e4bSmacallan ffb->lpat = 0; 553dbbd9e4bSmacallan pFfb->rp_active = 1; 554dbbd9e4bSmacallan} 555dbbd9e4bSmacallan 556dbbd9e4bSmacallanstatic void FFB_SubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 557dbbd9e4bSmacallan int x1, int y1, 558dbbd9e4bSmacallan int x2, int y2, 559dbbd9e4bSmacallan int flags) 560dbbd9e4bSmacallan{ 561dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 562dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 563dbbd9e4bSmacallan int drawop; 564dbbd9e4bSmacallan 565dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentSolidTwoPointLine: " 566dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%d] flags[%d]\n", 567dbbd9e4bSmacallan x1, y1, x2, y2, flags)); 568dbbd9e4bSmacallan 569dbbd9e4bSmacallan drawop = (flags & OMIT_LAST) ? 570dbbd9e4bSmacallan FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP; 571dbbd9e4bSmacallan FFB_WRITE_DRAWOP(pFfb, ffb, drawop); 572dbbd9e4bSmacallan 573dbbd9e4bSmacallan if (pFfb->has_brline_bug) { 574dbbd9e4bSmacallan FFBFifo(pFfb, 5); 575dbbd9e4bSmacallan ffb->ppc = 0; 576dbbd9e4bSmacallan } else 577dbbd9e4bSmacallan FFBFifo(pFfb, 4); 578dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y1, x1); 579dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, y2, x2); 580dbbd9e4bSmacallan} 581dbbd9e4bSmacallan 582dbbd9e4bSmacallanvoid FFB_SetupForSolidFill(ScrnInfoPtr pScrn, 583dbbd9e4bSmacallan int color, int rop, unsigned int planemask) 584dbbd9e4bSmacallan{ 585dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 586dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 587dbbd9e4bSmacallan 588dbbd9e4bSmacallan FFBLOG(("FFB_SetupForSolidFill: " 589dbbd9e4bSmacallan "color[%d] rop[%d] pmask[%u]\n", 590dbbd9e4bSmacallan color, rop, planemask)); 591dbbd9e4bSmacallan 59289b0bd4cSmacallan pFfb->planemask = planemask; 593dbbd9e4bSmacallan pFfb->xaa_rop = rop; 594dbbd9e4bSmacallan 59589b0bd4cSmacallan fbc = pFfb->fbc; 596dbbd9e4bSmacallan if (pFfb->ffb_res == ffb_res_high) 597dbbd9e4bSmacallan fbc |= FFB_FBC_WB_B; 598dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 599dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 600dbbd9e4bSmacallan 601dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 602dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 60389b0bd4cSmacallan FFB_DRAWOP_RECTANGLE, color, fbc, pFfb->wid); 604dbbd9e4bSmacallan pFfb->rp_active = 1; 605dbbd9e4bSmacallan} 606dbbd9e4bSmacallan 607dbbd9e4bSmacallanvoid FFB_SubsequentSolidFillRect(ScrnInfoPtr pScrn, 608dbbd9e4bSmacallan int x, int y, 609dbbd9e4bSmacallan int w, int h) 610dbbd9e4bSmacallan{ 611dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 612dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 613dbbd9e4bSmacallan 614dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentSolidFillRect: " 615dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h)); 616dbbd9e4bSmacallan 617dbbd9e4bSmacallan FFBFifo(pFfb, 4); 618dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y, x); 619dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, h, w); 620dbbd9e4bSmacallan} 621dbbd9e4bSmacallan 622dbbd9e4bSmacallanstatic void FFB_ScreenToScreenBitBlt(ScrnInfoPtr pScrn, 623dbbd9e4bSmacallan int nbox, 624dbbd9e4bSmacallan DDXPointPtr pptSrc, 625dbbd9e4bSmacallan BoxPtr pbox, 626dbbd9e4bSmacallan int xdir, int ydir, 627dbbd9e4bSmacallan int rop, unsigned int planemask) 628dbbd9e4bSmacallan{ 629dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 630dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 631dbbd9e4bSmacallan int use_vscroll; 632dbbd9e4bSmacallan 633dbbd9e4bSmacallan FFBLOG(("FFB_ScreenToScreenBitBlt: " 634dbbd9e4bSmacallan "nbox[%d] xdir[%d] ydir[%d] rop[%d] pmask[%x]\n", 635dbbd9e4bSmacallan nbox, xdir, ydir, rop, planemask)); 636dbbd9e4bSmacallan 637dbbd9e4bSmacallan use_vscroll = 0; 638dbbd9e4bSmacallan if (!pFfb->disable_vscroll && 639dbbd9e4bSmacallan rop == GXcopy) { 640dbbd9e4bSmacallan int i; 641dbbd9e4bSmacallan 642dbbd9e4bSmacallan for (i = 0; i < nbox; i++) 643dbbd9e4bSmacallan if (pptSrc[i].x != pbox[i].x1 || 644dbbd9e4bSmacallan pptSrc[i].y == pbox[i].y1) 645dbbd9e4bSmacallan break; 646dbbd9e4bSmacallan if (i == nbox) { 647dbbd9e4bSmacallan /* If/When double buffer extension is re-enabled 648dbbd9e4bSmacallan * check buffers here. 649dbbd9e4bSmacallan */ 650dbbd9e4bSmacallan use_vscroll = 1; 651dbbd9e4bSmacallan } 652dbbd9e4bSmacallan } 653dbbd9e4bSmacallan if (use_vscroll) { 654dbbd9e4bSmacallan FFB_ATTR_VSCROLL_XAA(pFfb, planemask); 655dbbd9e4bSmacallan while (nbox--) { 656dbbd9e4bSmacallan FFBFifo(pFfb, 7); 657dbbd9e4bSmacallan ffb->drawop = FFB_DRAWOP_VSCROLL; 658dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, pptSrc->y, pptSrc->x); 659dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->dy, pbox->y1, pbox->x1); 660dbbd9e4bSmacallan FFB_WRITE64_3(&ffb->bh, (pbox->y2 - pbox->y1), 661dbbd9e4bSmacallan (pbox->x2 - pbox->x1)); 662dbbd9e4bSmacallan 663dbbd9e4bSmacallan pbox++; 664dbbd9e4bSmacallan pptSrc++; 665dbbd9e4bSmacallan } 666dbbd9e4bSmacallan pFfb->rp_active = 1; 667dbbd9e4bSmacallan SET_SYNC_FLAG(pFfb->pXAAInfo); 668dbbd9e4bSmacallan } else { 669dbbd9e4bSmacallan unsigned char *sfb32 = (unsigned char *) pFfb->sfb32; 670dbbd9e4bSmacallan int psz_shift = 2; 671dbbd9e4bSmacallan 672dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 673dbbd9e4bSmacallan if (pFfb->use_blkread_prefetch) { 674dbbd9e4bSmacallan unsigned int bit; 675dbbd9e4bSmacallan 676dbbd9e4bSmacallan if (xdir < 0) 677dbbd9e4bSmacallan bit = FFB_MER_EDRA; 678dbbd9e4bSmacallan else 679dbbd9e4bSmacallan bit = FFB_MER_EIRA; 680dbbd9e4bSmacallan FFBFifo(pFfb, 1); 681dbbd9e4bSmacallan ffb->mer = bit; 682dbbd9e4bSmacallan pFfb->rp_active = 1; 683dbbd9e4bSmacallan } 684dbbd9e4bSmacallan FFBWait(pFfb, ffb); 685dbbd9e4bSmacallan 686dbbd9e4bSmacallan while (nbox--) { 687dbbd9e4bSmacallan unsigned char *src, *dst; 688dbbd9e4bSmacallan int x1, y1, x2, y2; 689dbbd9e4bSmacallan int width, height; 690dbbd9e4bSmacallan int sdkind; 691dbbd9e4bSmacallan 692dbbd9e4bSmacallan x1 = pptSrc->x; 693dbbd9e4bSmacallan y1 = pptSrc->y; 694dbbd9e4bSmacallan x2 = pbox->x1; 695dbbd9e4bSmacallan y2 = pbox->y1; 696dbbd9e4bSmacallan width = (pbox->x2 - pbox->x1); 697dbbd9e4bSmacallan height = (pbox->y2 - pbox->y1); 698dbbd9e4bSmacallan 699dbbd9e4bSmacallan src = sfb32 + (y1 * (2048 << psz_shift)) 700dbbd9e4bSmacallan + (x1 << psz_shift); 701dbbd9e4bSmacallan dst = sfb32 + (y2 * (2048 << psz_shift)) 702dbbd9e4bSmacallan + (x2 << psz_shift); 703dbbd9e4bSmacallan sdkind = (2048 << psz_shift); 704dbbd9e4bSmacallan 705dbbd9e4bSmacallan if (ydir < 0) { 706dbbd9e4bSmacallan src += ((height - 1) * (2048 << psz_shift)); 707dbbd9e4bSmacallan dst += ((height - 1) * (2048 << psz_shift)); 708dbbd9e4bSmacallan sdkind = -sdkind; 709dbbd9e4bSmacallan } 710dbbd9e4bSmacallan width <<= psz_shift; 711dbbd9e4bSmacallan if (xdir < 0) 712dbbd9e4bSmacallan VISmoveImageRL(src, dst, width, height, 713dbbd9e4bSmacallan sdkind, sdkind); 714dbbd9e4bSmacallan else 715dbbd9e4bSmacallan VISmoveImageLR(src, dst, width, height, 716dbbd9e4bSmacallan sdkind, sdkind); 717dbbd9e4bSmacallan pbox++; 718dbbd9e4bSmacallan pptSrc++; 719dbbd9e4bSmacallan } 720dbbd9e4bSmacallan if (pFfb->use_blkread_prefetch) { 721dbbd9e4bSmacallan FFBFifo(pFfb, 1); 722dbbd9e4bSmacallan ffb->mer = FFB_MER_DRA; 723dbbd9e4bSmacallan pFfb->rp_active = 1; 724dbbd9e4bSmacallan FFBWait(pFfb, ffb); 725dbbd9e4bSmacallan } 726dbbd9e4bSmacallan } 727dbbd9e4bSmacallan} 728dbbd9e4bSmacallan 729dbbd9e4bSmacallanvoid FFB_SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 730dbbd9e4bSmacallan int xdir, int ydir, int rop, 731dbbd9e4bSmacallan unsigned int planemask, 732dbbd9e4bSmacallan int trans_color) 733dbbd9e4bSmacallan{ 734dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 735dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 736dbbd9e4bSmacallan FFBLOG(("FFB_SetupForScreenToScreenCopy: " 737dbbd9e4bSmacallan "xdir[%d] ydir[%d] rop[%d] pmask[%x] tcolor[%d]\n", 738dbbd9e4bSmacallan xdir, ydir, rop, planemask, trans_color)); 739dbbd9e4bSmacallan 74089b0bd4cSmacallan pFfb->planemask = planemask; 741dbbd9e4bSmacallan pFfb->xaa_xdir = xdir; 742dbbd9e4bSmacallan pFfb->xaa_ydir = ydir; 743dbbd9e4bSmacallan pFfb->xaa_rop = rop; 744dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 745dbbd9e4bSmacallan FFBWait(pFfb, ffb); 746dbbd9e4bSmacallan} 747dbbd9e4bSmacallan 748dbbd9e4bSmacallanvoid FFB_SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 749dbbd9e4bSmacallan int x1, int y1, 750dbbd9e4bSmacallan int x2, int y2, 751dbbd9e4bSmacallan int width, int height) 752dbbd9e4bSmacallan{ 753dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 754dbbd9e4bSmacallan unsigned char *src, *dst, *sfb32; 755dbbd9e4bSmacallan int psz_shift = 2; 756dbbd9e4bSmacallan int sdkind; 757dbbd9e4bSmacallan 758dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentScreenToScreenCopy: " 759dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%u] w[%d] h[%d]\n", 760dbbd9e4bSmacallan x1, y1, x2, y2, width, height)); 761dbbd9e4bSmacallan 762dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 763dbbd9e4bSmacallan src = sfb32 + (y1 * (2048 << psz_shift)) + (x1 << psz_shift); 764dbbd9e4bSmacallan dst = sfb32 + (y2 * (2048 << psz_shift)) + (x2 << psz_shift); 765dbbd9e4bSmacallan sdkind = (2048 << psz_shift); 766dbbd9e4bSmacallan 767dbbd9e4bSmacallan if (pFfb->xaa_ydir < 0) { 768dbbd9e4bSmacallan src += ((height - 1) * (2048 << psz_shift)); 769dbbd9e4bSmacallan dst += ((height - 1) * (2048 << psz_shift)); 770dbbd9e4bSmacallan sdkind = -sdkind; 771dbbd9e4bSmacallan } 772dbbd9e4bSmacallan 773dbbd9e4bSmacallan width <<= psz_shift; 774dbbd9e4bSmacallan if (pFfb->xaa_xdir < 0) 775dbbd9e4bSmacallan VISmoveImageRL(src, dst, width, height, sdkind, sdkind); 776dbbd9e4bSmacallan else 777dbbd9e4bSmacallan VISmoveImageLR(src, dst, width, height, sdkind, sdkind); 778dbbd9e4bSmacallan} 779dbbd9e4bSmacallan 780dbbd9e4bSmacallanstatic void FFB_Sync(ScrnInfoPtr pScrn) 781dbbd9e4bSmacallan{ 782dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 783dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 784dbbd9e4bSmacallan 785dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); 786dbbd9e4bSmacallan FFBWait(pFfb, ffb); 787dbbd9e4bSmacallan} 788dbbd9e4bSmacallan 7897a5333bcSmrg#endif 7907a5333bcSmrg 791dbbd9e4bSmacallanBool FFBAccelInit(ScreenPtr pScreen, FFBPtr pFfb) 792dbbd9e4bSmacallan{ 7937a5333bcSmrg#ifdef HAVE_XAA_H 794dbbd9e4bSmacallan XAAInfoRecPtr infoRec; 795dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 796dbbd9e4bSmacallan 79789b0bd4cSmacallan pFfb->fbc = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | 798dbbd9e4bSmacallan FFB_FBC_WE_FORCEON | 799dbbd9e4bSmacallan FFB_FBC_SB_BOTH | 800dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | 801dbbd9e4bSmacallan FFB_FBC_RGBE_MASK | 802dbbd9e4bSmacallan FFB_FBC_XE_ON); 80389b0bd4cSmacallan pFfb->wid = FFBWidAlloc(pFfb, TrueColor, 0, TRUE); 80489b0bd4cSmacallan if (pFfb->wid == (unsigned int) -1) 805dbbd9e4bSmacallan return FALSE; 806dbbd9e4bSmacallan 807dbbd9e4bSmacallan pFfb->pXAAInfo = infoRec = XAACreateInfoRec(); 808dbbd9e4bSmacallan if (!infoRec) { 80989b0bd4cSmacallan FFBWidFree(pFfb, pFfb->wid); 810dbbd9e4bSmacallan return FALSE; 811dbbd9e4bSmacallan } 812dbbd9e4bSmacallan 8137a5333bcSmrg pFfb->xaa_scanline_buffers[0] = malloc(2048 * 4); 814dbbd9e4bSmacallan if (!pFfb->xaa_scanline_buffers[0]) { 815dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 816dbbd9e4bSmacallan return FALSE; 817dbbd9e4bSmacallan } 818dbbd9e4bSmacallan 8197a5333bcSmrg pFfb->xaa_scanline_buffers[1] = malloc(2048 * 4); 820dbbd9e4bSmacallan if (!pFfb->xaa_scanline_buffers[1]) { 8217a5333bcSmrg free(pFfb->xaa_scanline_buffers[0]); 822dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 823dbbd9e4bSmacallan return FALSE; 824dbbd9e4bSmacallan } 825dbbd9e4bSmacallan 826dbbd9e4bSmacallan infoRec->Sync = FFB_Sync; 827dbbd9e4bSmacallan 828dbbd9e4bSmacallan /* Use VIS and VSCROLL for screen to screen copies. */ 829dbbd9e4bSmacallan infoRec->ScreenToScreenCopyFlags = NO_TRANSPARENCY; 830dbbd9e4bSmacallan infoRec->SetupForScreenToScreenCopy = 831dbbd9e4bSmacallan FFB_SetupForScreenToScreenCopy; 832dbbd9e4bSmacallan infoRec->SubsequentScreenToScreenCopy = 833dbbd9e4bSmacallan FFB_SubsequentScreenToScreenCopy; 834dbbd9e4bSmacallan 835dbbd9e4bSmacallan /* In order to optimize VSCROLL and prefetching properly we 836dbbd9e4bSmacallan * have to use our own mid-layer routine. 837dbbd9e4bSmacallan */ 838dbbd9e4bSmacallan infoRec->ScreenToScreenBitBltFlags = NO_TRANSPARENCY; 839dbbd9e4bSmacallan infoRec->ScreenToScreenBitBlt = 840dbbd9e4bSmacallan FFB_ScreenToScreenBitBlt; 841dbbd9e4bSmacallan 842dbbd9e4bSmacallan infoRec->SolidFillFlags = 0; 843dbbd9e4bSmacallan infoRec->SetupForSolidFill = 844dbbd9e4bSmacallan FFB_SetupForSolidFill; 845dbbd9e4bSmacallan infoRec->SubsequentSolidFillRect = 846dbbd9e4bSmacallan FFB_SubsequentSolidFillRect; 847dbbd9e4bSmacallan 848dbbd9e4bSmacallan infoRec->SolidLineFlags = 0; 849dbbd9e4bSmacallan infoRec->SetupForSolidLine = 850dbbd9e4bSmacallan FFB_SetupForSolidLine; 851dbbd9e4bSmacallan infoRec->SubsequentSolidTwoPointLine = 852dbbd9e4bSmacallan FFB_SubsequentSolidTwoPointLine; 853dbbd9e4bSmacallan miSetZeroLineBias(pScreen, OCTANT3 | OCTANT4 | OCTANT6 | OCTANT1); 854dbbd9e4bSmacallan 855dbbd9e4bSmacallan infoRec->DashedLineFlags = (TRANSPARENCY_ONLY | 856dbbd9e4bSmacallan LINE_PATTERN_LSBFIRST_LSBJUSTIFIED); 857dbbd9e4bSmacallan infoRec->DashPatternMaxLength = 16; 858dbbd9e4bSmacallan infoRec->SetupForDashedLine = 859dbbd9e4bSmacallan FFB_SetupForDashedLine; 860dbbd9e4bSmacallan infoRec->SubsequentDashedTwoPointLine = 861dbbd9e4bSmacallan FFB_SubsequentDashedTwoPointLine; 862dbbd9e4bSmacallan 863dbbd9e4bSmacallan /* We cannot use the non-scanline color expansion mechanism on FFB 864dbbd9e4bSmacallan * for two reasons: 865dbbd9e4bSmacallan * 866dbbd9e4bSmacallan * 1) A render pass can only render 32-pixels wide on FFB, XAA expects 867dbbd9e4bSmacallan * that arbitrary widths are possible per render pass. 868dbbd9e4bSmacallan * 869dbbd9e4bSmacallan * 2) The FFB accelerator FIFO is only 100 or so words deep, and 870dbbd9e4bSmacallan * XAA gives no way to limit the number of words it writes into 871dbbd9e4bSmacallan * the ColorExpandBase register per rendering pass. 872dbbd9e4bSmacallan */ 873dbbd9e4bSmacallan infoRec->ScanlineColorExpandBuffers = pFfb->xaa_scanline_buffers; 874dbbd9e4bSmacallan infoRec->NumScanlineColorExpandBuffers = 2; 875dbbd9e4bSmacallan infoRec->ScanlineCPUToScreenColorExpandFillFlags = 876dbbd9e4bSmacallan CPU_TRANSFER_PAD_DWORD | 877dbbd9e4bSmacallan SCANLINE_PAD_DWORD | 878dbbd9e4bSmacallan CPU_TRANSFER_BASE_FIXED | 879dbbd9e4bSmacallan BIT_ORDER_IN_BYTE_LSBFIRST; 880dbbd9e4bSmacallan infoRec->SetupForScanlineCPUToScreenColorExpandFill = 881dbbd9e4bSmacallan FFB_SetupForScanlineCPUToScreenColorExpandFill; 882dbbd9e4bSmacallan infoRec->SubsequentScanlineCPUToScreenColorExpandFill = 883dbbd9e4bSmacallan FFB_SubsequentScanlineCPUToScreenColorExpandFill; 884dbbd9e4bSmacallan infoRec->SubsequentColorExpandScanline = 885dbbd9e4bSmacallan FFB_SubsequentColorExpandScanline; 886dbbd9e4bSmacallan 887dbbd9e4bSmacallan infoRec->Mono8x8PatternFillFlags = 888dbbd9e4bSmacallan HARDWARE_PATTERN_PROGRAMMED_BITS | 889dbbd9e4bSmacallan HARDWARE_PATTERN_SCREEN_ORIGIN | 890dbbd9e4bSmacallan BIT_ORDER_IN_BYTE_LSBFIRST; 891dbbd9e4bSmacallan infoRec->SetupForMono8x8PatternFill = 892dbbd9e4bSmacallan FFB_SetupForMono8x8PatternFill; 893dbbd9e4bSmacallan infoRec->SubsequentMono8x8PatternFillRect = 894dbbd9e4bSmacallan FFB_SubsequentMono8x8PatternFillRect; 895dbbd9e4bSmacallan 896dbbd9e4bSmacallan /* Use VIS for pixmap writes. */ 897dbbd9e4bSmacallan infoRec->WritePixmap = FFB_WritePixmap; 898dbbd9e4bSmacallan 899dbbd9e4bSmacallan /* RENDER optimizations. */ 900dbbd9e4bSmacallan infoRec->CPUToScreenAlphaTextureFlags = 901dbbd9e4bSmacallan XAA_RENDER_NO_TILE | 902dbbd9e4bSmacallan XAA_RENDER_NO_SRC_ALPHA; 903dbbd9e4bSmacallan infoRec->CPUToScreenAlphaTextureFormats = FFBAlphaTextureFormats; 9047f8af526Smacallan infoRec->CPUToScreenAlphaTextureDstFormats = FFBTextureDstFormats; 9057f8af526Smacallan infoRec->SetupForCPUToScreenAlphaTexture2 = 906dbbd9e4bSmacallan FFB_SetupForCPUToScreenAlphaTexture; 907dbbd9e4bSmacallan infoRec->SubsequentCPUToScreenAlphaTexture = 908dbbd9e4bSmacallan FFB_SubsequentCPUToScreenAlphaTexture; 909dbbd9e4bSmacallan 910dbbd9e4bSmacallan infoRec->CPUToScreenTextureFlags = 911dbbd9e4bSmacallan XAA_RENDER_NO_TILE | 912dbbd9e4bSmacallan XAA_RENDER_NO_SRC_ALPHA; 913dbbd9e4bSmacallan infoRec->CPUToScreenTextureFormats = FFBTextureFormats; 9147f8af526Smacallan infoRec->CPUToScreenTextureDstFormats = FFBTextureDstFormats; 9157f8af526Smacallan infoRec->SetupForCPUToScreenTexture2 = 916dbbd9e4bSmacallan FFB_SetupForCPUToScreenTexture; 917dbbd9e4bSmacallan infoRec->SubsequentCPUToScreenTexture = 918dbbd9e4bSmacallan FFB_SubsequentCPUToScreenTexture; 919dbbd9e4bSmacallan 920dbbd9e4bSmacallan pFfb->fifo_cache = 0; 921dbbd9e4bSmacallan 922dbbd9e4bSmacallan FFB_DEBUG_init(); 923dbbd9e4bSmacallan FDEBUG((FDEBUG_FD, 924dbbd9e4bSmacallan "FFB: cfg0(%08x) cfg1(%08x) cfg2(%08x) cfg3(%08x) ppcfg(%08x)\n", 925dbbd9e4bSmacallan ffb->fbcfg0, ffb->fbcfg1, ffb->fbcfg2, ffb->fbcfg3, ffb->ppcfg)); 926dbbd9e4bSmacallan 927504f16bcSmacallan FFB_HardwareSetup(pFfb); 928dbbd9e4bSmacallan 929dbbd9e4bSmacallan pFfb->ppc_cache = (FFB_PPC_FW_DISABLE | 930dbbd9e4bSmacallan FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | 931dbbd9e4bSmacallan FFB_PPC_XS_WID | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST | 932dbbd9e4bSmacallan FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE); 93389b0bd4cSmacallan pFfb->wid_cache = pFfb->wid; 934dbbd9e4bSmacallan pFfb->pmask_cache = ~0; 935dbbd9e4bSmacallan pFfb->rop_cache = (FFB_ROP_NEW | (FFB_ROP_NEW << 8)); 936dbbd9e4bSmacallan pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; 937dbbd9e4bSmacallan pFfb->fg_cache = pFfb->bg_cache = 0; 938dbbd9e4bSmacallan pFfb->fontw_cache = 32; 939dbbd9e4bSmacallan pFfb->fontinc_cache = (1 << 16) | 0; 940dbbd9e4bSmacallan pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | 941dbbd9e4bSmacallan FFB_FBC_WE_FORCEON | 942dbbd9e4bSmacallan FFB_FBC_SB_BOTH | 943dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | 944dbbd9e4bSmacallan FFB_FBC_RGBE_OFF | 945dbbd9e4bSmacallan FFB_FBC_XE_ON); 946dbbd9e4bSmacallan pFfb->laststipple = NULL; 947dbbd9e4bSmacallan 948dbbd9e4bSmacallan /* We will now clear the screen: we'll draw a rectangle covering all the 949dbbd9e4bSmacallan * viewscreen, using a 'blackness' ROP. 950dbbd9e4bSmacallan */ 951dbbd9e4bSmacallan FFBFifo(pFfb, 22); 952dbbd9e4bSmacallan ffb->fbc = pFfb->fbc_cache; 953dbbd9e4bSmacallan ffb->ppc = pFfb->ppc_cache; 954dbbd9e4bSmacallan ffb->wid = pFfb->wid_cache; 955dbbd9e4bSmacallan ffb->xpmask = 0xff; 956dbbd9e4bSmacallan ffb->pmask = pFfb->pmask_cache; 957dbbd9e4bSmacallan ffb->rop = pFfb->rop_cache; 958dbbd9e4bSmacallan ffb->drawop = pFfb->drawop_cache; 959dbbd9e4bSmacallan ffb->fg = pFfb->fg_cache; 960dbbd9e4bSmacallan ffb->bg = pFfb->bg_cache; 961dbbd9e4bSmacallan ffb->fontw = pFfb->fontw_cache; 962dbbd9e4bSmacallan ffb->fontinc = pFfb->fontinc_cache; 963dbbd9e4bSmacallan ffb->xclip = FFB_XCLIP_TEST_ALWAYS; 964dbbd9e4bSmacallan ffb->cmp = 0x80808080; 965dbbd9e4bSmacallan ffb->matchab = 0x80808080; 966dbbd9e4bSmacallan ffb->magnab = 0x80808080; 967dbbd9e4bSmacallan ffb->blendc = (FFB_BLENDC_FORCE_ONE | 968dbbd9e4bSmacallan FFB_BLENDC_DF_ONE_M_A | 969dbbd9e4bSmacallan FFB_BLENDC_SF_A); 970dbbd9e4bSmacallan ffb->blendc1 = 0; 971dbbd9e4bSmacallan ffb->blendc2 = 0; 972dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, 0, 0); 973dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width); 974dbbd9e4bSmacallan pFfb->rp_active = 1; 975dbbd9e4bSmacallan FFBWait(pFfb, ffb); 976dbbd9e4bSmacallan 977dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); 978dbbd9e4bSmacallan FFBWait(pFfb, ffb); 979dbbd9e4bSmacallan 980dbbd9e4bSmacallan if (!XAAInit(pScreen, infoRec)) { 981dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 9827a5333bcSmrg free(pFfb->xaa_scanline_buffers[0]); 9837a5333bcSmrg free(pFfb->xaa_scanline_buffers[1]); 984dbbd9e4bSmacallan pFfb->pXAAInfo = NULL; 98589b0bd4cSmacallan FFBWidFree(pFfb, pFfb->wid); 986dbbd9e4bSmacallan return FALSE; 987dbbd9e4bSmacallan } 988dbbd9e4bSmacallan /* Success */ 989dbbd9e4bSmacallan return TRUE; 9907a5333bcSmrg#else 9917a5333bcSmrg return FALSE; 9927a5333bcSmrg#endif 993dbbd9e4bSmacallan} 994