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 32f1295e53Smrg#include "ffb.h" 33f1295e53Smrg#include "ffb_fifo.h" 34f1295e53Smrg#include "ffb_rcache.h" 35f1295e53Smrg#include "ffb_loops.h" 36f1295e53Smrg#include "ffb_regs.h" 37f1295e53Smrg 38dbbd9e4bSmacallan#include "scrnintstr.h" 39dbbd9e4bSmacallan#include "pixmapstr.h" 40dbbd9e4bSmacallan#include "regionstr.h" 41dbbd9e4bSmacallan#include "mistruct.h" 42dbbd9e4bSmacallan#include "miline.h" 43dbbd9e4bSmacallan#include "fb.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 51dbbd9e4bSmacallanvoid 52dbbd9e4bSmacallanCreatorVtChange (ScreenPtr pScreen, int enter) 53dbbd9e4bSmacallan{ 547a5333bcSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 55dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN (pScrn); 56dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 57dbbd9e4bSmacallan 58dbbd9e4bSmacallan pFfb->rp_active = 1; 59dbbd9e4bSmacallan FFBWait(pFfb, ffb); 60dbbd9e4bSmacallan pFfb->fifo_cache = -1; 61dbbd9e4bSmacallan pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | 62dbbd9e4bSmacallan FFB_FBC_RB_A | FFB_FBC_SB_BOTH| FFB_FBC_XE_OFF | 63dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_MASK); 64dbbd9e4bSmacallan pFfb->ppc_cache = (FFB_PPC_FW_DISABLE | 65dbbd9e4bSmacallan FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | 66dbbd9e4bSmacallan FFB_PPC_XS_CONST | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST| 67dbbd9e4bSmacallan FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE); 68dbbd9e4bSmacallan 69dbbd9e4bSmacallan pFfb->pmask_cache = ~0; 70dbbd9e4bSmacallan pFfb->rop_cache = FFB_ROP_EDIT_BIT; 71dbbd9e4bSmacallan pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; 72dbbd9e4bSmacallan pFfb->fg_cache = pFfb->bg_cache = 0; 73dbbd9e4bSmacallan pFfb->fontw_cache = 32; 74dbbd9e4bSmacallan pFfb->fontinc_cache = (1 << 16) | 0; 75dbbd9e4bSmacallan pFfb->laststipple = NULL; 76dbbd9e4bSmacallan FFBFifo(pFfb, 9); 77dbbd9e4bSmacallan ffb->fbc = pFfb->fbc_cache; 78dbbd9e4bSmacallan ffb->ppc = pFfb->ppc_cache; 79dbbd9e4bSmacallan ffb->pmask = pFfb->pmask_cache; 80dbbd9e4bSmacallan ffb->rop = pFfb->rop_cache; 81dbbd9e4bSmacallan ffb->drawop = pFfb->drawop_cache; 82dbbd9e4bSmacallan ffb->fg = pFfb->fg_cache; 83dbbd9e4bSmacallan ffb->bg = pFfb->bg_cache; 84dbbd9e4bSmacallan ffb->fontw = pFfb->fontw_cache; 85dbbd9e4bSmacallan ffb->fontinc = pFfb->fontinc_cache; 86dbbd9e4bSmacallan pFfb->rp_active = 1; 87dbbd9e4bSmacallan FFBWait(pFfb, ffb); 88dbbd9e4bSmacallan 89dbbd9e4bSmacallan /* Fixup the FBC/PPC caches to deal with actually using 90dbbd9e4bSmacallan * a WID for every ROP. 91dbbd9e4bSmacallan */ 92dbbd9e4bSmacallan pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | 93dbbd9e4bSmacallan FFB_FBC_RB_A | FFB_FBC_SB_BOTH | FFB_FBC_XE_ON | 94dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_ON); 95dbbd9e4bSmacallan pFfb->ppc_cache &= ~FFB_PPC_XS_MASK; 96dbbd9e4bSmacallan pFfb->ppc_cache |= FFB_PPC_XS_WID; 9789b0bd4cSmacallan pFfb->wid_cache = (enter ? pFfb->wid : 0xff); 98dbbd9e4bSmacallan FFBFifo(pFfb, 11); 99dbbd9e4bSmacallan ffb->fbc = pFfb->fbc_cache; 100dbbd9e4bSmacallan ffb->ppc = FFB_PPC_XS_WID; 101dbbd9e4bSmacallan ffb->wid = pFfb->wid_cache; 102dbbd9e4bSmacallan ffb->xpmask = 0xff; 103dbbd9e4bSmacallan ffb->xclip = FFB_XCLIP_TEST_ALWAYS; 104dbbd9e4bSmacallan ffb->cmp = 0x80808080; 105dbbd9e4bSmacallan ffb->matchab = 0x80808080; 106dbbd9e4bSmacallan ffb->magnab = 0x80808080; 107dbbd9e4bSmacallan ffb->blendc = (FFB_BLENDC_FORCE_ONE | 108dbbd9e4bSmacallan FFB_BLENDC_DF_ONE_M_A | 109dbbd9e4bSmacallan FFB_BLENDC_SF_A); 110dbbd9e4bSmacallan ffb->blendc1 = 0; 111dbbd9e4bSmacallan ffb->blendc2 = 0; 112dbbd9e4bSmacallan pFfb->rp_active = 1; 113dbbd9e4bSmacallan FFBWait(pFfb, ffb); 114dbbd9e4bSmacallan 115dbbd9e4bSmacallan if (enter) { 116dbbd9e4bSmacallan pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; 117dbbd9e4bSmacallan 118dbbd9e4bSmacallan FFBFifo(pFfb, 5); 119dbbd9e4bSmacallan ffb->drawop = pFfb->drawop_cache; 120dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, 0, 0); 121dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width); 122dbbd9e4bSmacallan pFfb->rp_active = 1; 123dbbd9e4bSmacallan FFBWait(pFfb, ffb); 124dbbd9e4bSmacallan 125dbbd9e4bSmacallan SET_SYNC_FLAG(pFfb->pXAAInfo); 126dbbd9e4bSmacallan } 127dbbd9e4bSmacallan} 128dbbd9e4bSmacallan 129dbbd9e4bSmacallan#ifdef DEBUG_FFB 130dbbd9e4bSmacallanFILE *FDEBUG_FD = NULL; 131dbbd9e4bSmacallan#endif 132dbbd9e4bSmacallan 133dbbd9e4bSmacallanstatic CARD32 FFBAlphaTextureFormats[2] = { PICT_a8, 0 }; 134dbbd9e4bSmacallanstatic CARD32 FFBTextureFormats[2] = { PICT_a8b8g8r8, 0 }; 1357f8af526Smacallanstatic CARD32 FFBTextureDstFormats[3] = { PICT_a8b8g8r8, PICT_x8b8g8r8, 0 }; 136dbbd9e4bSmacallan 1377f8af526Smacallanstatic Bool FFB_SetupForCPUToScreenAlphaTexture( 1387f8af526Smacallan ScrnInfoPtr pScrn, 1397f8af526Smacallan int op, 1407f8af526Smacallan CARD16 red, 1417f8af526Smacallan CARD16 green, 1427f8af526Smacallan CARD16 blue, 1437f8af526Smacallan CARD16 alpha, 1447f8af526Smacallan CARD32 maskFormat, 1457f8af526Smacallan CARD32 dstFormat, 1467f8af526Smacallan CARD8 *alphaPtr, 1477f8af526Smacallan int alphaPitch, 1487f8af526Smacallan int width, 1497f8af526Smacallan int height, 1507f8af526Smacallan int flags 1517f8af526Smacallan) 152dbbd9e4bSmacallan{ 153dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 154dbbd9e4bSmacallan 155dbbd9e4bSmacallan FFBLOG(("FFB_SetupForCPUToScreenAlphaTexture: " 156dbbd9e4bSmacallan "argb[%04x:%04x:%04x:%04x] alpha[T(%x):P(%d)] " 157dbbd9e4bSmacallan "wh[%d:%d] flgs[%x]\n", 158dbbd9e4bSmacallan alpha, red, green, blue, 1597f8af526Smacallan maskFormat, alphaPitch, 160dbbd9e4bSmacallan width, height, flags)); 161dbbd9e4bSmacallan 162dbbd9e4bSmacallan FFB_SetupTextureAttrs(pFfb); 163dbbd9e4bSmacallan 164dbbd9e4bSmacallan pFfb->xaa_tex = (unsigned char *) alphaPtr; 165dbbd9e4bSmacallan pFfb->xaa_tex_pitch = alphaPitch; 166dbbd9e4bSmacallan pFfb->xaa_tex_width = width; 167dbbd9e4bSmacallan pFfb->xaa_tex_height = height; 168dbbd9e4bSmacallan pFfb->xaa_tex_color = (/*((alpha >> 8) << 24) |*/ 169dbbd9e4bSmacallan ((blue >> 8) << 16) | 170dbbd9e4bSmacallan ((green >> 8) << 8) | 171dbbd9e4bSmacallan ((red >> 8) << 0)); 172dbbd9e4bSmacallan return TRUE; 173dbbd9e4bSmacallan} 174dbbd9e4bSmacallan 175dbbd9e4bSmacallanstatic void FFB_SubsequentCPUToScreenAlphaTexture(ScrnInfoPtr pScrn, 176dbbd9e4bSmacallan int dstx, int dsty, 177dbbd9e4bSmacallan int srcx, int srcy, 178dbbd9e4bSmacallan int width, int height) 179dbbd9e4bSmacallan{ 180dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 181dbbd9e4bSmacallan unsigned char *dst_base, *alpha_base, *sfb32; 182dbbd9e4bSmacallan unsigned int pixel_base; 183dbbd9e4bSmacallan int psz_shift = 2; 184dbbd9e4bSmacallan 185dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: " 186dbbd9e4bSmacallan "dst[%d:%d] src[%d:%d] wh[%d:%d]\n", 187dbbd9e4bSmacallan dstx, dsty, srcx, srcy, width, height)); 188dbbd9e4bSmacallan 189dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 190dbbd9e4bSmacallan dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift); 191dbbd9e4bSmacallan alpha_base = pFfb->xaa_tex; 192dbbd9e4bSmacallan alpha_base += srcx; 193dbbd9e4bSmacallan if (srcy) 194dbbd9e4bSmacallan alpha_base += (srcy * pFfb->xaa_tex_pitch); 195dbbd9e4bSmacallan pixel_base = pFfb->xaa_tex_color; 196dbbd9e4bSmacallan while (height--) { 197dbbd9e4bSmacallan unsigned int *dst = (unsigned int *) dst_base; 198dbbd9e4bSmacallan unsigned char *alpha = alpha_base; 199dbbd9e4bSmacallan int w = width; 200dbbd9e4bSmacallan 201dbbd9e4bSmacallan while (w--) { 202dbbd9e4bSmacallan (*dst) = (((unsigned int)*alpha << 24) | pixel_base); 203dbbd9e4bSmacallan dst++; 204dbbd9e4bSmacallan alpha++; 205dbbd9e4bSmacallan } 206dbbd9e4bSmacallan dst_base += (2048 << psz_shift); 207dbbd9e4bSmacallan alpha_base += pFfb->xaa_tex_pitch; 208dbbd9e4bSmacallan } 209dbbd9e4bSmacallan} 210dbbd9e4bSmacallan 211dbbd9e4bSmacallan 2127f8af526Smacallanstatic Bool FFB_SetupForCPUToScreenTexture( 2137f8af526Smacallan ScrnInfoPtr pScrn, 2147f8af526Smacallan int op, 2157f8af526Smacallan CARD32 srcFormat, 2167f8af526Smacallan CARD32 dstFormat, 2177f8af526Smacallan CARD8 *texPtr, 2187f8af526Smacallan int texPitch, 2197f8af526Smacallan int width, 2207f8af526Smacallan int height, 2217f8af526Smacallan int flags 2227f8af526Smacallan) 223dbbd9e4bSmacallan{ 224dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 225dbbd9e4bSmacallan 226dbbd9e4bSmacallan FFBLOG(("FFB_SetupForCPUToScreenTexture: " 227dbbd9e4bSmacallan "TEX[T(%x):P(%d)] " 228dbbd9e4bSmacallan "wh[%d:%d] flgs[%x]\n", 2297f8af526Smacallan srcFormat, texPitch, 230dbbd9e4bSmacallan width, height, flags)); 231dbbd9e4bSmacallan 232dbbd9e4bSmacallan FFB_SetupTextureAttrs(pFfb); 233dbbd9e4bSmacallan 234dbbd9e4bSmacallan pFfb->xaa_tex = (unsigned char *) texPtr; 235dbbd9e4bSmacallan pFfb->xaa_tex_pitch = texPitch; 236dbbd9e4bSmacallan pFfb->xaa_tex_width = width; 237dbbd9e4bSmacallan pFfb->xaa_tex_height = height; 238dbbd9e4bSmacallan 239dbbd9e4bSmacallan return TRUE; 240dbbd9e4bSmacallan} 241dbbd9e4bSmacallan 242dbbd9e4bSmacallanstatic void FFB_SubsequentCPUToScreenTexture(ScrnInfoPtr pScrn, 243dbbd9e4bSmacallan int dstx, int dsty, 244dbbd9e4bSmacallan int srcx, int srcy, 245dbbd9e4bSmacallan int width, int height) 246dbbd9e4bSmacallan{ 247dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 248dbbd9e4bSmacallan unsigned char *dst_base, *sfb32; 249dbbd9e4bSmacallan unsigned int *tex_base; 250dbbd9e4bSmacallan int psz_shift = 2; 251dbbd9e4bSmacallan 252dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenAlphaTexture: " 253dbbd9e4bSmacallan "dst[%d:%d] src[%d:%d] wh[%d:%d]\n", 254dbbd9e4bSmacallan dstx, dsty, srcx, srcy, width, height)); 255dbbd9e4bSmacallan 256dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 257dbbd9e4bSmacallan dst_base = sfb32 + (dsty * (2048 << psz_shift)) + (dstx << psz_shift); 258dbbd9e4bSmacallan tex_base = (unsigned int *) pFfb->xaa_tex; 259dbbd9e4bSmacallan tex_base += srcx; 260dbbd9e4bSmacallan if (srcy) 261dbbd9e4bSmacallan tex_base += (srcy * pFfb->xaa_tex_pitch); 262dbbd9e4bSmacallan while (height--) { 263dbbd9e4bSmacallan unsigned int *dst = (unsigned int *) dst_base; 264dbbd9e4bSmacallan unsigned int *tex = tex_base; 265dbbd9e4bSmacallan int w = width; 266dbbd9e4bSmacallan while (w--) { 267dbbd9e4bSmacallan (*dst) = *tex; 268dbbd9e4bSmacallan 269dbbd9e4bSmacallan dst++; 270dbbd9e4bSmacallan tex++; 271dbbd9e4bSmacallan } 272dbbd9e4bSmacallan dst_base += (2048 << psz_shift); 273dbbd9e4bSmacallan tex_base += pFfb->xaa_tex_pitch; 274dbbd9e4bSmacallan } 275dbbd9e4bSmacallan} 276dbbd9e4bSmacallan 277dbbd9e4bSmacallanstatic void FFB_WritePixmap(ScrnInfoPtr pScrn, 278dbbd9e4bSmacallan int x, int y, int w, int h, 279dbbd9e4bSmacallan unsigned char *src, 280dbbd9e4bSmacallan int srcwidth, 281dbbd9e4bSmacallan int rop, 282dbbd9e4bSmacallan unsigned int planemask, 283dbbd9e4bSmacallan int trans, int bpp, int depth) 284dbbd9e4bSmacallan{ 285dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 286dbbd9e4bSmacallan unsigned char *dst, *sfb32; 287dbbd9e4bSmacallan int psz_shift = 2; 288dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 289dbbd9e4bSmacallan 290dbbd9e4bSmacallan FFBLOG(("FFB_WritePixmap: " 291dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d] srcw[%d] rop[%d] pmask[%x] " 292dbbd9e4bSmacallan "trans[%d] bpp[%d] depth[%d]\n", 293dbbd9e4bSmacallan x, y, w, h, srcwidth, rop, planemask, 294dbbd9e4bSmacallan trans, bpp, depth)); 295dbbd9e4bSmacallan 296dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 297dbbd9e4bSmacallan FFBWait(pFfb, ffb); 298dbbd9e4bSmacallan 299dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 300dbbd9e4bSmacallan dst = sfb32 + (y * (2048 << psz_shift)) + (x << psz_shift); 301dbbd9e4bSmacallan VISmoveImageLR(src, dst, w << psz_shift, h, 302dbbd9e4bSmacallan srcwidth, (2048 << psz_shift)); 303dbbd9e4bSmacallan} 304dbbd9e4bSmacallan 305dbbd9e4bSmacallanstatic void FFB_SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, 306dbbd9e4bSmacallan int pat_word1, int pat_word2, 307dbbd9e4bSmacallan int fg, int bg, int rop, 308dbbd9e4bSmacallan unsigned int planemask) 309dbbd9e4bSmacallan{ 310dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 311dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 312dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 313dbbd9e4bSmacallan int i; 314dbbd9e4bSmacallan 315dbbd9e4bSmacallan FFBLOG(("FFB_SetupForMono8x8PatternFill: " 316dbbd9e4bSmacallan "pat[%08x:%08x] fg[%x] bg[%x] rop[%d] pmask[%x]\n", 317dbbd9e4bSmacallan pat_word1, pat_word2, 318dbbd9e4bSmacallan fg, bg, rop, planemask)); 319dbbd9e4bSmacallan 320dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_ENABLE | FFB_PPC_CS_CONST; 321dbbd9e4bSmacallan if (bg < 0) 322dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_TRANSPARENT; 323dbbd9e4bSmacallan else 324dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_OPAQUE; 325dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | 326dbbd9e4bSmacallan FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK; 32789b0bd4cSmacallan fbc = pFfb->fbc; 328dbbd9e4bSmacallan rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8); 329dbbd9e4bSmacallan 330dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, rop, 33189b0bd4cSmacallan FFB_DRAWOP_RECTANGLE, fg, fbc, pFfb->wid); 332dbbd9e4bSmacallan if (bg >= 0) 333dbbd9e4bSmacallan FFB_WRITE_BG(pFfb, ffb, bg); 334dbbd9e4bSmacallan 335dbbd9e4bSmacallan FFBFifo(pFfb, 32); 336dbbd9e4bSmacallan for (i = 0; i < 32; i += 2) { 337dbbd9e4bSmacallan CARD32 val1, val2; 338dbbd9e4bSmacallan int shift = (24 - ((i % 4) * 8)); 339dbbd9e4bSmacallan 340dbbd9e4bSmacallan if ((i % 8) < 4) { 341dbbd9e4bSmacallan val1 = (pat_word1 >> shift) & 0xff; 342dbbd9e4bSmacallan val2 = (pat_word1 >> (shift + 8)) & 0xff; 343dbbd9e4bSmacallan } else { 344dbbd9e4bSmacallan val1 = (pat_word2 >> shift) & 0xff; 345dbbd9e4bSmacallan val2 = (pat_word2 >> (shift + 8)) & 0xff; 346dbbd9e4bSmacallan } 347dbbd9e4bSmacallan val1 |= (val1 << 8) | (val1 << 16) | (val1 << 24); 348dbbd9e4bSmacallan val2 |= (val2 << 8) | (val2 << 16) | (val2 << 24); 349dbbd9e4bSmacallan FFB_WRITE64(&ffb->pattern[i], val1, val2); 350dbbd9e4bSmacallan } 351dbbd9e4bSmacallan pFfb->rp_active = 1; 352dbbd9e4bSmacallan} 353dbbd9e4bSmacallan 354dbbd9e4bSmacallanstatic void FFB_SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 355dbbd9e4bSmacallan int pat_word1, int pat_word2, 356dbbd9e4bSmacallan int x, int y, int w, int h) 357dbbd9e4bSmacallan{ 358dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 359dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 360dbbd9e4bSmacallan 361dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentMono8x8PatternFillRect: " 362dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h)); 363dbbd9e4bSmacallan 364dbbd9e4bSmacallan FFBFifo(pFfb, 4); 365dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y, x); 366dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, h, w); 367dbbd9e4bSmacallan} 368dbbd9e4bSmacallan 369dbbd9e4bSmacallanstatic void FFB_SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 370dbbd9e4bSmacallan int fg, int bg, 371dbbd9e4bSmacallan int rop, 372dbbd9e4bSmacallan unsigned int planemask) 373dbbd9e4bSmacallan{ 374dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 375dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 376dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 377dbbd9e4bSmacallan 378dbbd9e4bSmacallan FFBLOG(("FFB_SetupForScanlineCPUToScreenColorExpandFill: " 379dbbd9e4bSmacallan "fg[%x] bg[%x] rop[%d] pmask[%x]\n", 380dbbd9e4bSmacallan fg, bg, rop, planemask)); 381dbbd9e4bSmacallan 382dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST; 383dbbd9e4bSmacallan if (bg < 0) 384dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_TRANSPARENT; 385dbbd9e4bSmacallan else 386dbbd9e4bSmacallan ppc |= FFB_PPC_TBE_OPAQUE; 387dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | 388dbbd9e4bSmacallan FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK; 38989b0bd4cSmacallan fbc = pFfb->fbc; 390dbbd9e4bSmacallan rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8); 391dbbd9e4bSmacallan 392dbbd9e4bSmacallan if ((pFfb->ppc_cache & ppc_mask) != ppc || 393dbbd9e4bSmacallan pFfb->fg_cache != fg || 394dbbd9e4bSmacallan pFfb->fbc_cache != fbc || 395dbbd9e4bSmacallan pFfb->rop_cache != rop || 396dbbd9e4bSmacallan pFfb->pmask_cache != planemask || 397dbbd9e4bSmacallan pFfb->fontinc_cache != ((0<<16) | 32) || 398dbbd9e4bSmacallan (bg >= 0 && pFfb->bg_cache != bg)) { 399dbbd9e4bSmacallan pFfb->ppc_cache &= ~ppc_mask; 400dbbd9e4bSmacallan pFfb->ppc_cache |= 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 if (bg >= 0) 407dbbd9e4bSmacallan pFfb->bg_cache = bg; 408dbbd9e4bSmacallan FFBFifo(pFfb, (bg >= 0 ? 7 : 6)); 409dbbd9e4bSmacallan ffb->ppc = ppc; 410dbbd9e4bSmacallan ffb->fg = fg; 411dbbd9e4bSmacallan ffb->fbc = fbc; 412dbbd9e4bSmacallan ffb->rop = rop; 413dbbd9e4bSmacallan ffb->pmask = planemask; 414dbbd9e4bSmacallan ffb->fontinc = ((0 << 16) | 32); 415dbbd9e4bSmacallan if(bg >= 0) 416dbbd9e4bSmacallan ffb->bg = bg; 417dbbd9e4bSmacallan } 418dbbd9e4bSmacallan pFfb->rp_active = 1; 419dbbd9e4bSmacallan} 420dbbd9e4bSmacallan 421dbbd9e4bSmacallanstatic void FFB_SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 422dbbd9e4bSmacallan int x, int y, int w, int h, 423dbbd9e4bSmacallan int skipleft) 424dbbd9e4bSmacallan{ 425dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 426dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentCPUToScreenColorExpandFill: " 427dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d] skipleft[%d]\n", 428dbbd9e4bSmacallan x, y, w, h, skipleft)); 429dbbd9e4bSmacallan 430dbbd9e4bSmacallan pFfb->xaa_scanline_x = x; 431dbbd9e4bSmacallan pFfb->xaa_scanline_y = y; 432dbbd9e4bSmacallan pFfb->xaa_scanline_w = w; 433dbbd9e4bSmacallan} 434dbbd9e4bSmacallan 435dbbd9e4bSmacallanstatic void FFB_SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 436dbbd9e4bSmacallan{ 437dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 438dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 439dbbd9e4bSmacallan CARD32 *bits = (CARD32 *) pFfb->xaa_scanline_buffers[bufno]; 440dbbd9e4bSmacallan int w; 441dbbd9e4bSmacallan 442dbbd9e4bSmacallan FFBFifo(pFfb, 1); 443dbbd9e4bSmacallan ffb->fontxy = ((pFfb->xaa_scanline_y << 16) | pFfb->xaa_scanline_x); 444dbbd9e4bSmacallan 445dbbd9e4bSmacallan w = pFfb->xaa_scanline_w; 446dbbd9e4bSmacallan if (w >= 32) { 447dbbd9e4bSmacallan FFB_WRITE_FONTW(pFfb, ffb, 32); 448dbbd9e4bSmacallan FFBFifo(pFfb, (w / 32)); 449dbbd9e4bSmacallan do { 450dbbd9e4bSmacallan ffb->font = *bits++; 451dbbd9e4bSmacallan w -= 32; 452dbbd9e4bSmacallan } while (w >= 32); 453dbbd9e4bSmacallan } 454dbbd9e4bSmacallan if (w > 0) { 455dbbd9e4bSmacallan FFB_WRITE_FONTW(pFfb, ffb, w); 456dbbd9e4bSmacallan FFBFifo(pFfb, 1); 457dbbd9e4bSmacallan ffb->font = *bits++; 458dbbd9e4bSmacallan } 459dbbd9e4bSmacallan 460dbbd9e4bSmacallan pFfb->xaa_scanline_y++; 461dbbd9e4bSmacallan} 462dbbd9e4bSmacallan 463dbbd9e4bSmacallanstatic void FFB_SetupForDashedLine(ScrnInfoPtr pScrn, 464dbbd9e4bSmacallan int fg, int bg, int rop, 465dbbd9e4bSmacallan unsigned int planemask, 466dbbd9e4bSmacallan int length, unsigned char *pattern) 467dbbd9e4bSmacallan{ 468dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 469dbbd9e4bSmacallan CARD32 *pat_ptr = (CARD32 *)pattern; 470dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 471dbbd9e4bSmacallan 472dbbd9e4bSmacallan FFBLOG(("FFB_SetupForDashedLine: " 473dbbd9e4bSmacallan "fg[%x] bg[%x] rop[%d] pmask[%x] patlen[%d] pat[%x]\n", 474dbbd9e4bSmacallan fg, bg, rop, planemask, length, *pat_ptr)); 475dbbd9e4bSmacallan 47689b0bd4cSmacallan pFfb->planemask = planemask; 477dbbd9e4bSmacallan pFfb->xaa_rop = rop; 478dbbd9e4bSmacallan pFfb->xaa_linepat = 479dbbd9e4bSmacallan (*pat_ptr << FFB_LPAT_PATTERN_SHIFT) | 480dbbd9e4bSmacallan (1 << FFB_LPAT_SCALEVAL_SHIFT) | 481dbbd9e4bSmacallan ((length & 0xf) << FFB_LPAT_PATLEN_SHIFT); 482dbbd9e4bSmacallan 48389b0bd4cSmacallan fbc = pFfb->fbc; 484dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 485dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 486dbbd9e4bSmacallan 487dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 488dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 48989b0bd4cSmacallan FFB_DRAWOP_BRLINEOPEN, fg, fbc, pFfb->wid); 490dbbd9e4bSmacallan pFfb->rp_active = 1; 491dbbd9e4bSmacallan} 492dbbd9e4bSmacallan 493dbbd9e4bSmacallanstatic void FFB_SubsequentDashedTwoPointLine( ScrnInfoPtr pScrn, 494dbbd9e4bSmacallan int x1, int y1, 495dbbd9e4bSmacallan int x2, int y2, 496dbbd9e4bSmacallan int flags, int phase) 497dbbd9e4bSmacallan{ 498dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 499dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 500dbbd9e4bSmacallan unsigned int linepat = pFfb->xaa_linepat; 501dbbd9e4bSmacallan unsigned int drawop; 502dbbd9e4bSmacallan 503dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentDashedTwoPointLine: " 504dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%d] flgs[%x] phase[%d]\n", 505dbbd9e4bSmacallan x1, y2, x2, y2, flags, phase)); 506dbbd9e4bSmacallan 507dbbd9e4bSmacallan linepat |= (phase & 0xf) << FFB_LPAT_PATPTR_SHIFT; 508dbbd9e4bSmacallan 509dbbd9e4bSmacallan drawop = (flags & OMIT_LAST) ? 510dbbd9e4bSmacallan FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP; 511dbbd9e4bSmacallan FFB_WRITE_DRAWOP(pFfb, ffb, drawop); 512dbbd9e4bSmacallan 513dbbd9e4bSmacallan if (pFfb->has_brline_bug) { 514dbbd9e4bSmacallan FFBFifo(pFfb, 6); 515dbbd9e4bSmacallan ffb->ppc = 0; 516dbbd9e4bSmacallan } else 517dbbd9e4bSmacallan FFBFifo(pFfb, 5); 518dbbd9e4bSmacallan ffb->lpat = linepat; 519dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y1, x1); 520dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, y2, x2); 521dbbd9e4bSmacallan} 522dbbd9e4bSmacallan 523dbbd9e4bSmacallanstatic void FFB_SetupForSolidLine(ScrnInfoPtr pScrn, 524dbbd9e4bSmacallan int color, int rop, unsigned int planemask) 525dbbd9e4bSmacallan{ 526dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 527dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 528dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 529dbbd9e4bSmacallan FFBLOG(("FFB_SetupForSolidLine: " 530dbbd9e4bSmacallan "color[%d] rop[%d] pmask[%x]\n", 531dbbd9e4bSmacallan color, rop, planemask)); 532dbbd9e4bSmacallan 53389b0bd4cSmacallan pFfb->planemask = planemask; 534dbbd9e4bSmacallan pFfb->xaa_rop = rop; 535dbbd9e4bSmacallan 53689b0bd4cSmacallan fbc = pFfb->fbc; 537dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 538dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 539dbbd9e4bSmacallan 540dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 541dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 54289b0bd4cSmacallan FFB_DRAWOP_BRLINEOPEN, color, fbc, pFfb->wid); 543dbbd9e4bSmacallan FFBFifo(pFfb, 1); 544dbbd9e4bSmacallan ffb->lpat = 0; 545dbbd9e4bSmacallan pFfb->rp_active = 1; 546dbbd9e4bSmacallan} 547dbbd9e4bSmacallan 548dbbd9e4bSmacallanstatic void FFB_SubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 549dbbd9e4bSmacallan int x1, int y1, 550dbbd9e4bSmacallan int x2, int y2, 551dbbd9e4bSmacallan int flags) 552dbbd9e4bSmacallan{ 553dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 554dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 555dbbd9e4bSmacallan int drawop; 556dbbd9e4bSmacallan 557dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentSolidTwoPointLine: " 558dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%d] flags[%d]\n", 559dbbd9e4bSmacallan x1, y1, x2, y2, flags)); 560dbbd9e4bSmacallan 561dbbd9e4bSmacallan drawop = (flags & OMIT_LAST) ? 562dbbd9e4bSmacallan FFB_DRAWOP_BRLINEOPEN : FFB_DRAWOP_BRLINECAP; 563dbbd9e4bSmacallan FFB_WRITE_DRAWOP(pFfb, ffb, drawop); 564dbbd9e4bSmacallan 565dbbd9e4bSmacallan if (pFfb->has_brline_bug) { 566dbbd9e4bSmacallan FFBFifo(pFfb, 5); 567dbbd9e4bSmacallan ffb->ppc = 0; 568dbbd9e4bSmacallan } else 569dbbd9e4bSmacallan FFBFifo(pFfb, 4); 570dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y1, x1); 571dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, y2, x2); 572dbbd9e4bSmacallan} 573dbbd9e4bSmacallan 574dbbd9e4bSmacallanvoid FFB_SetupForSolidFill(ScrnInfoPtr pScrn, 575dbbd9e4bSmacallan int color, int rop, unsigned int planemask) 576dbbd9e4bSmacallan{ 577dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 578dbbd9e4bSmacallan unsigned int ppc, ppc_mask, fbc; 579dbbd9e4bSmacallan 580dbbd9e4bSmacallan FFBLOG(("FFB_SetupForSolidFill: " 581dbbd9e4bSmacallan "color[%d] rop[%d] pmask[%u]\n", 582dbbd9e4bSmacallan color, rop, planemask)); 583dbbd9e4bSmacallan 58489b0bd4cSmacallan pFfb->planemask = planemask; 585dbbd9e4bSmacallan pFfb->xaa_rop = rop; 586dbbd9e4bSmacallan 58789b0bd4cSmacallan fbc = pFfb->fbc; 588dbbd9e4bSmacallan if (pFfb->ffb_res == ffb_res_high) 589dbbd9e4bSmacallan fbc |= FFB_FBC_WB_B; 590dbbd9e4bSmacallan ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; 591dbbd9e4bSmacallan ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; 592dbbd9e4bSmacallan 593dbbd9e4bSmacallan FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, 594dbbd9e4bSmacallan (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), 59589b0bd4cSmacallan FFB_DRAWOP_RECTANGLE, color, fbc, pFfb->wid); 596dbbd9e4bSmacallan pFfb->rp_active = 1; 597dbbd9e4bSmacallan} 598dbbd9e4bSmacallan 599dbbd9e4bSmacallanvoid FFB_SubsequentSolidFillRect(ScrnInfoPtr pScrn, 600dbbd9e4bSmacallan int x, int y, 601dbbd9e4bSmacallan int w, int h) 602dbbd9e4bSmacallan{ 603dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 604dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 605dbbd9e4bSmacallan 606dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentSolidFillRect: " 607dbbd9e4bSmacallan "x[%d] y[%d] w[%d] h[%d]\n", x, y, w, h)); 608dbbd9e4bSmacallan 609dbbd9e4bSmacallan FFBFifo(pFfb, 4); 610dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, y, x); 611dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, h, w); 612dbbd9e4bSmacallan} 613dbbd9e4bSmacallan 614dbbd9e4bSmacallanstatic void FFB_ScreenToScreenBitBlt(ScrnInfoPtr pScrn, 615dbbd9e4bSmacallan int nbox, 616dbbd9e4bSmacallan DDXPointPtr pptSrc, 617dbbd9e4bSmacallan BoxPtr pbox, 618dbbd9e4bSmacallan int xdir, int ydir, 619dbbd9e4bSmacallan int rop, unsigned int planemask) 620dbbd9e4bSmacallan{ 621dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 622dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 623dbbd9e4bSmacallan int use_vscroll; 624dbbd9e4bSmacallan 625dbbd9e4bSmacallan FFBLOG(("FFB_ScreenToScreenBitBlt: " 626dbbd9e4bSmacallan "nbox[%d] xdir[%d] ydir[%d] rop[%d] pmask[%x]\n", 627dbbd9e4bSmacallan nbox, xdir, ydir, rop, planemask)); 628dbbd9e4bSmacallan 629dbbd9e4bSmacallan use_vscroll = 0; 630dbbd9e4bSmacallan if (!pFfb->disable_vscroll && 631dbbd9e4bSmacallan rop == GXcopy) { 632dbbd9e4bSmacallan int i; 633dbbd9e4bSmacallan 634dbbd9e4bSmacallan for (i = 0; i < nbox; i++) 635dbbd9e4bSmacallan if (pptSrc[i].x != pbox[i].x1 || 636dbbd9e4bSmacallan pptSrc[i].y == pbox[i].y1) 637dbbd9e4bSmacallan break; 638dbbd9e4bSmacallan if (i == nbox) { 639dbbd9e4bSmacallan /* If/When double buffer extension is re-enabled 640dbbd9e4bSmacallan * check buffers here. 641dbbd9e4bSmacallan */ 642dbbd9e4bSmacallan use_vscroll = 1; 643dbbd9e4bSmacallan } 644dbbd9e4bSmacallan } 645dbbd9e4bSmacallan if (use_vscroll) { 646dbbd9e4bSmacallan FFB_ATTR_VSCROLL_XAA(pFfb, planemask); 647dbbd9e4bSmacallan while (nbox--) { 648dbbd9e4bSmacallan FFBFifo(pFfb, 7); 649dbbd9e4bSmacallan ffb->drawop = FFB_DRAWOP_VSCROLL; 650dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, pptSrc->y, pptSrc->x); 651dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->dy, pbox->y1, pbox->x1); 652dbbd9e4bSmacallan FFB_WRITE64_3(&ffb->bh, (pbox->y2 - pbox->y1), 653dbbd9e4bSmacallan (pbox->x2 - pbox->x1)); 654dbbd9e4bSmacallan 655dbbd9e4bSmacallan pbox++; 656dbbd9e4bSmacallan pptSrc++; 657dbbd9e4bSmacallan } 658dbbd9e4bSmacallan pFfb->rp_active = 1; 659dbbd9e4bSmacallan SET_SYNC_FLAG(pFfb->pXAAInfo); 660dbbd9e4bSmacallan } else { 661dbbd9e4bSmacallan unsigned char *sfb32 = (unsigned char *) pFfb->sfb32; 662dbbd9e4bSmacallan int psz_shift = 2; 663dbbd9e4bSmacallan 664dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 665dbbd9e4bSmacallan if (pFfb->use_blkread_prefetch) { 666dbbd9e4bSmacallan unsigned int bit; 667dbbd9e4bSmacallan 668dbbd9e4bSmacallan if (xdir < 0) 669dbbd9e4bSmacallan bit = FFB_MER_EDRA; 670dbbd9e4bSmacallan else 671dbbd9e4bSmacallan bit = FFB_MER_EIRA; 672dbbd9e4bSmacallan FFBFifo(pFfb, 1); 673dbbd9e4bSmacallan ffb->mer = bit; 674dbbd9e4bSmacallan pFfb->rp_active = 1; 675dbbd9e4bSmacallan } 676dbbd9e4bSmacallan FFBWait(pFfb, ffb); 677dbbd9e4bSmacallan 678dbbd9e4bSmacallan while (nbox--) { 679dbbd9e4bSmacallan unsigned char *src, *dst; 680dbbd9e4bSmacallan int x1, y1, x2, y2; 681dbbd9e4bSmacallan int width, height; 682dbbd9e4bSmacallan int sdkind; 683dbbd9e4bSmacallan 684dbbd9e4bSmacallan x1 = pptSrc->x; 685dbbd9e4bSmacallan y1 = pptSrc->y; 686dbbd9e4bSmacallan x2 = pbox->x1; 687dbbd9e4bSmacallan y2 = pbox->y1; 688dbbd9e4bSmacallan width = (pbox->x2 - pbox->x1); 689dbbd9e4bSmacallan height = (pbox->y2 - pbox->y1); 690dbbd9e4bSmacallan 691dbbd9e4bSmacallan src = sfb32 + (y1 * (2048 << psz_shift)) 692dbbd9e4bSmacallan + (x1 << psz_shift); 693dbbd9e4bSmacallan dst = sfb32 + (y2 * (2048 << psz_shift)) 694dbbd9e4bSmacallan + (x2 << psz_shift); 695dbbd9e4bSmacallan sdkind = (2048 << psz_shift); 696dbbd9e4bSmacallan 697dbbd9e4bSmacallan if (ydir < 0) { 698dbbd9e4bSmacallan src += ((height - 1) * (2048 << psz_shift)); 699dbbd9e4bSmacallan dst += ((height - 1) * (2048 << psz_shift)); 700dbbd9e4bSmacallan sdkind = -sdkind; 701dbbd9e4bSmacallan } 702dbbd9e4bSmacallan width <<= psz_shift; 703dbbd9e4bSmacallan if (xdir < 0) 704dbbd9e4bSmacallan VISmoveImageRL(src, dst, width, height, 705dbbd9e4bSmacallan sdkind, sdkind); 706dbbd9e4bSmacallan else 707dbbd9e4bSmacallan VISmoveImageLR(src, dst, width, height, 708dbbd9e4bSmacallan sdkind, sdkind); 709dbbd9e4bSmacallan pbox++; 710dbbd9e4bSmacallan pptSrc++; 711dbbd9e4bSmacallan } 712dbbd9e4bSmacallan if (pFfb->use_blkread_prefetch) { 713dbbd9e4bSmacallan FFBFifo(pFfb, 1); 714dbbd9e4bSmacallan ffb->mer = FFB_MER_DRA; 715dbbd9e4bSmacallan pFfb->rp_active = 1; 716dbbd9e4bSmacallan FFBWait(pFfb, ffb); 717dbbd9e4bSmacallan } 718dbbd9e4bSmacallan } 719dbbd9e4bSmacallan} 720dbbd9e4bSmacallan 721dbbd9e4bSmacallanvoid FFB_SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 722dbbd9e4bSmacallan int xdir, int ydir, int rop, 723dbbd9e4bSmacallan unsigned int planemask, 724dbbd9e4bSmacallan int trans_color) 725dbbd9e4bSmacallan{ 726dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 727dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 728dbbd9e4bSmacallan FFBLOG(("FFB_SetupForScreenToScreenCopy: " 729dbbd9e4bSmacallan "xdir[%d] ydir[%d] rop[%d] pmask[%x] tcolor[%d]\n", 730dbbd9e4bSmacallan xdir, ydir, rop, planemask, trans_color)); 731dbbd9e4bSmacallan 73289b0bd4cSmacallan pFfb->planemask = planemask; 733dbbd9e4bSmacallan pFfb->xaa_xdir = xdir; 734dbbd9e4bSmacallan pFfb->xaa_ydir = ydir; 735dbbd9e4bSmacallan pFfb->xaa_rop = rop; 736dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, planemask, rop); 737dbbd9e4bSmacallan FFBWait(pFfb, ffb); 738dbbd9e4bSmacallan} 739dbbd9e4bSmacallan 740dbbd9e4bSmacallanvoid FFB_SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 741dbbd9e4bSmacallan int x1, int y1, 742dbbd9e4bSmacallan int x2, int y2, 743dbbd9e4bSmacallan int width, int height) 744dbbd9e4bSmacallan{ 745dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 746dbbd9e4bSmacallan unsigned char *src, *dst, *sfb32; 747dbbd9e4bSmacallan int psz_shift = 2; 748dbbd9e4bSmacallan int sdkind; 749dbbd9e4bSmacallan 750dbbd9e4bSmacallan FFBLOG(("FFB_SubsequentScreenToScreenCopy: " 751dbbd9e4bSmacallan "x1[%d] y1[%d] x2[%d] y2[%u] w[%d] h[%d]\n", 752dbbd9e4bSmacallan x1, y1, x2, y2, width, height)); 753dbbd9e4bSmacallan 754dbbd9e4bSmacallan sfb32 = (unsigned char *) pFfb->sfb32; 755dbbd9e4bSmacallan src = sfb32 + (y1 * (2048 << psz_shift)) + (x1 << psz_shift); 756dbbd9e4bSmacallan dst = sfb32 + (y2 * (2048 << psz_shift)) + (x2 << psz_shift); 757dbbd9e4bSmacallan sdkind = (2048 << psz_shift); 758dbbd9e4bSmacallan 759dbbd9e4bSmacallan if (pFfb->xaa_ydir < 0) { 760dbbd9e4bSmacallan src += ((height - 1) * (2048 << psz_shift)); 761dbbd9e4bSmacallan dst += ((height - 1) * (2048 << psz_shift)); 762dbbd9e4bSmacallan sdkind = -sdkind; 763dbbd9e4bSmacallan } 764dbbd9e4bSmacallan 765dbbd9e4bSmacallan width <<= psz_shift; 766dbbd9e4bSmacallan if (pFfb->xaa_xdir < 0) 767dbbd9e4bSmacallan VISmoveImageRL(src, dst, width, height, sdkind, sdkind); 768dbbd9e4bSmacallan else 769dbbd9e4bSmacallan VISmoveImageLR(src, dst, width, height, sdkind, sdkind); 770dbbd9e4bSmacallan} 771dbbd9e4bSmacallan 772dbbd9e4bSmacallanstatic void FFB_Sync(ScrnInfoPtr pScrn) 773dbbd9e4bSmacallan{ 774dbbd9e4bSmacallan FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); 775dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 776dbbd9e4bSmacallan 777dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); 778dbbd9e4bSmacallan FFBWait(pFfb, ffb); 779dbbd9e4bSmacallan} 780dbbd9e4bSmacallan 7817a5333bcSmrg#endif 7827a5333bcSmrg 783dbbd9e4bSmacallanBool FFBAccelInit(ScreenPtr pScreen, FFBPtr pFfb) 784dbbd9e4bSmacallan{ 7857a5333bcSmrg#ifdef HAVE_XAA_H 786dbbd9e4bSmacallan XAAInfoRecPtr infoRec; 787dbbd9e4bSmacallan ffb_fbcPtr ffb = pFfb->regs; 788dbbd9e4bSmacallan 78989b0bd4cSmacallan pFfb->fbc = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | 790dbbd9e4bSmacallan FFB_FBC_WE_FORCEON | 791dbbd9e4bSmacallan FFB_FBC_SB_BOTH | 792dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | 793dbbd9e4bSmacallan FFB_FBC_RGBE_MASK | 794dbbd9e4bSmacallan FFB_FBC_XE_ON); 79589b0bd4cSmacallan pFfb->wid = FFBWidAlloc(pFfb, TrueColor, 0, TRUE); 79689b0bd4cSmacallan if (pFfb->wid == (unsigned int) -1) 797dbbd9e4bSmacallan return FALSE; 798dbbd9e4bSmacallan 799dbbd9e4bSmacallan pFfb->pXAAInfo = infoRec = XAACreateInfoRec(); 800dbbd9e4bSmacallan if (!infoRec) { 80189b0bd4cSmacallan FFBWidFree(pFfb, pFfb->wid); 802dbbd9e4bSmacallan return FALSE; 803dbbd9e4bSmacallan } 804dbbd9e4bSmacallan 8057a5333bcSmrg pFfb->xaa_scanline_buffers[0] = malloc(2048 * 4); 806dbbd9e4bSmacallan if (!pFfb->xaa_scanline_buffers[0]) { 807dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 808dbbd9e4bSmacallan return FALSE; 809dbbd9e4bSmacallan } 810dbbd9e4bSmacallan 8117a5333bcSmrg pFfb->xaa_scanline_buffers[1] = malloc(2048 * 4); 812dbbd9e4bSmacallan if (!pFfb->xaa_scanline_buffers[1]) { 8137a5333bcSmrg free(pFfb->xaa_scanline_buffers[0]); 814dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 815dbbd9e4bSmacallan return FALSE; 816dbbd9e4bSmacallan } 817dbbd9e4bSmacallan 818dbbd9e4bSmacallan infoRec->Sync = FFB_Sync; 819dbbd9e4bSmacallan 820dbbd9e4bSmacallan /* Use VIS and VSCROLL for screen to screen copies. */ 821dbbd9e4bSmacallan infoRec->ScreenToScreenCopyFlags = NO_TRANSPARENCY; 822dbbd9e4bSmacallan infoRec->SetupForScreenToScreenCopy = 823dbbd9e4bSmacallan FFB_SetupForScreenToScreenCopy; 824dbbd9e4bSmacallan infoRec->SubsequentScreenToScreenCopy = 825dbbd9e4bSmacallan FFB_SubsequentScreenToScreenCopy; 826dbbd9e4bSmacallan 827dbbd9e4bSmacallan /* In order to optimize VSCROLL and prefetching properly we 828dbbd9e4bSmacallan * have to use our own mid-layer routine. 829dbbd9e4bSmacallan */ 830dbbd9e4bSmacallan infoRec->ScreenToScreenBitBltFlags = NO_TRANSPARENCY; 831dbbd9e4bSmacallan infoRec->ScreenToScreenBitBlt = 832dbbd9e4bSmacallan FFB_ScreenToScreenBitBlt; 833dbbd9e4bSmacallan 834dbbd9e4bSmacallan infoRec->SolidFillFlags = 0; 835dbbd9e4bSmacallan infoRec->SetupForSolidFill = 836dbbd9e4bSmacallan FFB_SetupForSolidFill; 837dbbd9e4bSmacallan infoRec->SubsequentSolidFillRect = 838dbbd9e4bSmacallan FFB_SubsequentSolidFillRect; 839dbbd9e4bSmacallan 840dbbd9e4bSmacallan infoRec->SolidLineFlags = 0; 841dbbd9e4bSmacallan infoRec->SetupForSolidLine = 842dbbd9e4bSmacallan FFB_SetupForSolidLine; 843dbbd9e4bSmacallan infoRec->SubsequentSolidTwoPointLine = 844dbbd9e4bSmacallan FFB_SubsequentSolidTwoPointLine; 845dbbd9e4bSmacallan miSetZeroLineBias(pScreen, OCTANT3 | OCTANT4 | OCTANT6 | OCTANT1); 846dbbd9e4bSmacallan 847dbbd9e4bSmacallan infoRec->DashedLineFlags = (TRANSPARENCY_ONLY | 848dbbd9e4bSmacallan LINE_PATTERN_LSBFIRST_LSBJUSTIFIED); 849dbbd9e4bSmacallan infoRec->DashPatternMaxLength = 16; 850dbbd9e4bSmacallan infoRec->SetupForDashedLine = 851dbbd9e4bSmacallan FFB_SetupForDashedLine; 852dbbd9e4bSmacallan infoRec->SubsequentDashedTwoPointLine = 853dbbd9e4bSmacallan FFB_SubsequentDashedTwoPointLine; 854dbbd9e4bSmacallan 855dbbd9e4bSmacallan /* We cannot use the non-scanline color expansion mechanism on FFB 856dbbd9e4bSmacallan * for two reasons: 857dbbd9e4bSmacallan * 858dbbd9e4bSmacallan * 1) A render pass can only render 32-pixels wide on FFB, XAA expects 859dbbd9e4bSmacallan * that arbitrary widths are possible per render pass. 860dbbd9e4bSmacallan * 861dbbd9e4bSmacallan * 2) The FFB accelerator FIFO is only 100 or so words deep, and 862dbbd9e4bSmacallan * XAA gives no way to limit the number of words it writes into 863dbbd9e4bSmacallan * the ColorExpandBase register per rendering pass. 864dbbd9e4bSmacallan */ 865dbbd9e4bSmacallan infoRec->ScanlineColorExpandBuffers = pFfb->xaa_scanline_buffers; 866dbbd9e4bSmacallan infoRec->NumScanlineColorExpandBuffers = 2; 867dbbd9e4bSmacallan infoRec->ScanlineCPUToScreenColorExpandFillFlags = 868dbbd9e4bSmacallan CPU_TRANSFER_PAD_DWORD | 869dbbd9e4bSmacallan SCANLINE_PAD_DWORD | 870dbbd9e4bSmacallan CPU_TRANSFER_BASE_FIXED | 871dbbd9e4bSmacallan BIT_ORDER_IN_BYTE_LSBFIRST; 872dbbd9e4bSmacallan infoRec->SetupForScanlineCPUToScreenColorExpandFill = 873dbbd9e4bSmacallan FFB_SetupForScanlineCPUToScreenColorExpandFill; 874dbbd9e4bSmacallan infoRec->SubsequentScanlineCPUToScreenColorExpandFill = 875dbbd9e4bSmacallan FFB_SubsequentScanlineCPUToScreenColorExpandFill; 876dbbd9e4bSmacallan infoRec->SubsequentColorExpandScanline = 877dbbd9e4bSmacallan FFB_SubsequentColorExpandScanline; 878dbbd9e4bSmacallan 879dbbd9e4bSmacallan infoRec->Mono8x8PatternFillFlags = 880dbbd9e4bSmacallan HARDWARE_PATTERN_PROGRAMMED_BITS | 881dbbd9e4bSmacallan HARDWARE_PATTERN_SCREEN_ORIGIN | 882dbbd9e4bSmacallan BIT_ORDER_IN_BYTE_LSBFIRST; 883dbbd9e4bSmacallan infoRec->SetupForMono8x8PatternFill = 884dbbd9e4bSmacallan FFB_SetupForMono8x8PatternFill; 885dbbd9e4bSmacallan infoRec->SubsequentMono8x8PatternFillRect = 886dbbd9e4bSmacallan FFB_SubsequentMono8x8PatternFillRect; 887dbbd9e4bSmacallan 888dbbd9e4bSmacallan /* Use VIS for pixmap writes. */ 889dbbd9e4bSmacallan infoRec->WritePixmap = FFB_WritePixmap; 890dbbd9e4bSmacallan 891dbbd9e4bSmacallan /* RENDER optimizations. */ 892dbbd9e4bSmacallan infoRec->CPUToScreenAlphaTextureFlags = 893dbbd9e4bSmacallan XAA_RENDER_NO_TILE | 894dbbd9e4bSmacallan XAA_RENDER_NO_SRC_ALPHA; 895dbbd9e4bSmacallan infoRec->CPUToScreenAlphaTextureFormats = FFBAlphaTextureFormats; 8967f8af526Smacallan infoRec->CPUToScreenAlphaTextureDstFormats = FFBTextureDstFormats; 8977f8af526Smacallan infoRec->SetupForCPUToScreenAlphaTexture2 = 898dbbd9e4bSmacallan FFB_SetupForCPUToScreenAlphaTexture; 899dbbd9e4bSmacallan infoRec->SubsequentCPUToScreenAlphaTexture = 900dbbd9e4bSmacallan FFB_SubsequentCPUToScreenAlphaTexture; 901dbbd9e4bSmacallan 902dbbd9e4bSmacallan infoRec->CPUToScreenTextureFlags = 903dbbd9e4bSmacallan XAA_RENDER_NO_TILE | 904dbbd9e4bSmacallan XAA_RENDER_NO_SRC_ALPHA; 905dbbd9e4bSmacallan infoRec->CPUToScreenTextureFormats = FFBTextureFormats; 9067f8af526Smacallan infoRec->CPUToScreenTextureDstFormats = FFBTextureDstFormats; 9077f8af526Smacallan infoRec->SetupForCPUToScreenTexture2 = 908dbbd9e4bSmacallan FFB_SetupForCPUToScreenTexture; 909dbbd9e4bSmacallan infoRec->SubsequentCPUToScreenTexture = 910dbbd9e4bSmacallan FFB_SubsequentCPUToScreenTexture; 911dbbd9e4bSmacallan 912dbbd9e4bSmacallan pFfb->fifo_cache = 0; 913dbbd9e4bSmacallan 914dbbd9e4bSmacallan FFB_DEBUG_init(); 915dbbd9e4bSmacallan FDEBUG((FDEBUG_FD, 916dbbd9e4bSmacallan "FFB: cfg0(%08x) cfg1(%08x) cfg2(%08x) cfg3(%08x) ppcfg(%08x)\n", 917dbbd9e4bSmacallan ffb->fbcfg0, ffb->fbcfg1, ffb->fbcfg2, ffb->fbcfg3, ffb->ppcfg)); 918dbbd9e4bSmacallan 919504f16bcSmacallan FFB_HardwareSetup(pFfb); 920dbbd9e4bSmacallan 921dbbd9e4bSmacallan pFfb->ppc_cache = (FFB_PPC_FW_DISABLE | 922dbbd9e4bSmacallan FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | 923dbbd9e4bSmacallan FFB_PPC_XS_WID | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST | 924dbbd9e4bSmacallan FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE); 92589b0bd4cSmacallan pFfb->wid_cache = pFfb->wid; 926dbbd9e4bSmacallan pFfb->pmask_cache = ~0; 927dbbd9e4bSmacallan pFfb->rop_cache = (FFB_ROP_NEW | (FFB_ROP_NEW << 8)); 928dbbd9e4bSmacallan pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; 929dbbd9e4bSmacallan pFfb->fg_cache = pFfb->bg_cache = 0; 930dbbd9e4bSmacallan pFfb->fontw_cache = 32; 931dbbd9e4bSmacallan pFfb->fontinc_cache = (1 << 16) | 0; 932dbbd9e4bSmacallan pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | 933dbbd9e4bSmacallan FFB_FBC_WE_FORCEON | 934dbbd9e4bSmacallan FFB_FBC_SB_BOTH | 935dbbd9e4bSmacallan FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | 936dbbd9e4bSmacallan FFB_FBC_RGBE_OFF | 937dbbd9e4bSmacallan FFB_FBC_XE_ON); 938dbbd9e4bSmacallan pFfb->laststipple = NULL; 939dbbd9e4bSmacallan 940dbbd9e4bSmacallan /* We will now clear the screen: we'll draw a rectangle covering all the 941dbbd9e4bSmacallan * viewscreen, using a 'blackness' ROP. 942dbbd9e4bSmacallan */ 943dbbd9e4bSmacallan FFBFifo(pFfb, 22); 944dbbd9e4bSmacallan ffb->fbc = pFfb->fbc_cache; 945dbbd9e4bSmacallan ffb->ppc = pFfb->ppc_cache; 946dbbd9e4bSmacallan ffb->wid = pFfb->wid_cache; 947dbbd9e4bSmacallan ffb->xpmask = 0xff; 948dbbd9e4bSmacallan ffb->pmask = pFfb->pmask_cache; 949dbbd9e4bSmacallan ffb->rop = pFfb->rop_cache; 950dbbd9e4bSmacallan ffb->drawop = pFfb->drawop_cache; 951dbbd9e4bSmacallan ffb->fg = pFfb->fg_cache; 952dbbd9e4bSmacallan ffb->bg = pFfb->bg_cache; 953dbbd9e4bSmacallan ffb->fontw = pFfb->fontw_cache; 954dbbd9e4bSmacallan ffb->fontinc = pFfb->fontinc_cache; 955dbbd9e4bSmacallan ffb->xclip = FFB_XCLIP_TEST_ALWAYS; 956dbbd9e4bSmacallan ffb->cmp = 0x80808080; 957dbbd9e4bSmacallan ffb->matchab = 0x80808080; 958dbbd9e4bSmacallan ffb->magnab = 0x80808080; 959dbbd9e4bSmacallan ffb->blendc = (FFB_BLENDC_FORCE_ONE | 960dbbd9e4bSmacallan FFB_BLENDC_DF_ONE_M_A | 961dbbd9e4bSmacallan FFB_BLENDC_SF_A); 962dbbd9e4bSmacallan ffb->blendc1 = 0; 963dbbd9e4bSmacallan ffb->blendc2 = 0; 964dbbd9e4bSmacallan FFB_WRITE64(&ffb->by, 0, 0); 965dbbd9e4bSmacallan FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width); 966dbbd9e4bSmacallan pFfb->rp_active = 1; 967dbbd9e4bSmacallan FFBWait(pFfb, ffb); 968dbbd9e4bSmacallan 969dbbd9e4bSmacallan FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); 970dbbd9e4bSmacallan FFBWait(pFfb, ffb); 971dbbd9e4bSmacallan 972dbbd9e4bSmacallan if (!XAAInit(pScreen, infoRec)) { 973dbbd9e4bSmacallan XAADestroyInfoRec(infoRec); 9747a5333bcSmrg free(pFfb->xaa_scanline_buffers[0]); 9757a5333bcSmrg free(pFfb->xaa_scanline_buffers[1]); 976dbbd9e4bSmacallan pFfb->pXAAInfo = NULL; 97789b0bd4cSmacallan FFBWidFree(pFfb, pFfb->wid); 978dbbd9e4bSmacallan return FALSE; 979dbbd9e4bSmacallan } 980dbbd9e4bSmacallan /* Success */ 981dbbd9e4bSmacallan return TRUE; 9827a5333bcSmrg#else 9837a5333bcSmrg return FALSE; 9847a5333bcSmrg#endif 985dbbd9e4bSmacallan} 986