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