diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 16:48:55 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 16:48:55 +0000 |
commit | 68c56916d79bf06e26e01c3e84206edc928d9b51 (patch) | |
tree | d39c13092dc680721e163e448a57df847a6fad62 /src/ffb_attr.c |
Initial revision
Diffstat (limited to 'src/ffb_attr.c')
-rw-r--r-- | src/ffb_attr.c | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/src/ffb_attr.c b/src/ffb_attr.c new file mode 100644 index 0000000..c3baf31 --- /dev/null +++ b/src/ffb_attr.c @@ -0,0 +1,256 @@ +/* + * Attribute setting for the Creator and Creator3D framebuffer. + * + * Copyright (C) 1999 David S. Miller (davem@redhat.com) + * Copyright (C) 1999 Jakub Jelinek (jakub@redhat.com) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * JAKUB JELINEK OR DAVID MILLER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_attr.c,v 1.2 2000/05/23 04:47:44 dawes Exp $ */ + +#include "ffb.h" +#include "ffb_fifo.h" +#include "ffb_rcache.h" + +/* If we're going to write any attributes, write them all. */ +void __FFB_Attr_Raw(FFBPtr pFfb, unsigned int ppc, unsigned int ppc_mask, + unsigned int pmask, unsigned int rop, + int drawop, int fg, unsigned int fbc, unsigned int wid) +{ + ffb_fbcPtr ffb = pFfb->regs; + + FFBLOG(("WRATTRS_RAW: PPC[%08x:%08x] PMSK[%08x] ROP[%08x] DOP[%08x] FG[%08x] FBC[%08x] WID[%02x]\n", + ppc, ppc_mask, pmask, rop, drawop, fg, fbc, wid)); + pFfb->ppc_cache &= ~ppc_mask; + pFfb->ppc_cache |= ppc; + pFfb->fg_cache = fg; + pFfb->fbc_cache = fbc; + pFfb->wid_cache = wid; + pFfb->rop_cache = rop; + pFfb->pmask_cache = pmask; + pFfb->drawop_cache = drawop; + pFfb->rp_active = 1; + FFBFifo(pFfb, 7); + ffb->ppc = ppc; + ffb->fg = fg; + ffb->fbc = fbc; + ffb->wid = wid; + ffb->rop = rop; + ffb->pmask = pmask; + ffb->drawop = drawop; +} + +void __FFB_Attr_SFB_VAR(FFBPtr pFfb, unsigned int ppc, unsigned int ppc_mask, unsigned int fbc, + unsigned int wid, unsigned int rop, unsigned int pmask) +{ + ffb_fbcPtr ffb = pFfb->regs; + + FFBLOG(("WRATTRS_SFBVAR: PPC[%08x:%08x] PMSK[%08x] ROP[%08x] FBC[%08x] WID[%02x]\n", + ppc, ppc_mask, pmask, rop, fbc, wid)); + pFfb->ppc_cache &= ~ppc_mask; + pFfb->ppc_cache |= ppc; + pFfb->fbc_cache = fbc; + pFfb->wid_cache = wid; + pFfb->rop_cache = rop; + pFfb->pmask_cache = pmask; + pFfb->rp_active = 1; + FFBFifo(pFfb, 5); + ffb->ppc = ppc; + ffb->fbc = fbc; + ffb->wid = wid; + ffb->rop = rop; + ffb->pmask = pmask; +} + +#define NEED_PPC 0x00000001 +#define NEED_PMASK 0x00000002 +#define NEED_ROP 0x00000004 +#define NEED_DRAWOP 0x00000008 +#define NEED_FG 0x00000010 +#define NEED_BG 0x00000020 +#define NEED_FBC 0x00000040 +#define NEED_WID 0x00000080 + +void __FFB_Attr_GC(FFBPtr pFfb, GCPtr pGC, WindowPtr pWin, unsigned int ppc, int drawop) +{ + ffb_fbcPtr ffb = pFfb->regs; + unsigned int rop, need_mask, need_count; + + need_mask = need_count = 0; + if ((pFfb->ppc_cache & FFB_PPC_GCMASK) != ppc) { + unsigned int newppc = pFfb->ppc_cache & ~FFB_PPC_GCMASK; + + newppc |= (ppc & FFB_PPC_GCMASK); + pFfb->ppc_cache = newppc; + need_mask |= NEED_PPC; + need_count++; + } + + if (pFfb->pmask_cache != pGC->planemask) { + pFfb->pmask_cache = pGC->planemask; + need_mask |= NEED_PMASK; + need_count++; + } + + rop = (pGC->alu | FFB_ROP_EDIT_BIT)|(FFB_ROP_NEW<<8); + if (pFfb->rop_cache != rop) { + pFfb->rop_cache = rop; + need_mask |= NEED_ROP; + need_count++; + } + + if (pFfb->drawop_cache != drawop) { + pFfb->drawop_cache = drawop; + need_mask |= NEED_DRAWOP; + need_count++; + } + + if (pFfb->fg_cache != pGC->fgPixel) { + pFfb->fg_cache = pGC->fgPixel; + need_mask |= NEED_FG; + need_count++; + } + + { + CreatorPrivWinPtr WinPriv = CreatorGetWindowPrivate(pWin); + unsigned int fbc = WinPriv->fbc_base; + + fbc &= ~FFB_FBC_XE_MASK; + fbc |= FFB_FBC_XE_OFF; + + if (pFfb->fbc_cache != fbc) { + pFfb->fbc_cache = fbc; + need_mask |= NEED_FBC; + need_count++; + } + + } + pFfb->rp_active = 1; + + FFBLOG(("WRATTRS_GC: PPC[%08x:%08x] PMSK[%08x] ROP[%08x] " + "DOP[%08x] FG[%08x] FBC[%08x]\n", + pFfb->ppc_cache & FFB_PPC_GCMASK, FFB_PPC_GCMASK, + pFfb->pmask_cache, pFfb->rop_cache, + pFfb->drawop_cache, pFfb->fg_cache, pFfb->fbc_cache)); + + FFBFifo(pFfb, need_count); + if (need_mask & NEED_PPC) + ffb->ppc = (pFfb->ppc_cache & FFB_PPC_GCMASK); + if (need_mask & NEED_PMASK) + ffb->pmask = pFfb->pmask_cache; + if (need_mask & NEED_ROP) + ffb->rop = pFfb->rop_cache; + if (need_mask & NEED_DRAWOP) + ffb->drawop = pFfb->drawop_cache; + if (need_mask & NEED_FG) + ffb->fg = pFfb->fg_cache; + if (need_mask & NEED_FBC) + ffb->fbc = pFfb->fbc_cache; +} + +void __FFB_Attr_FastfillWin(FFBPtr pFfb, WindowPtr pWin, + unsigned int ppc, unsigned int pixel) +{ + ffb_fbcPtr ffb = pFfb->regs; + unsigned int rop, need_mask, need_count; + + need_mask = need_count = 0; + if ((pFfb->ppc_cache & FFB_PPC_WINMASK) != ppc) { + unsigned int newppc = pFfb->ppc_cache & ~FFB_PPC_WINMASK; + + newppc |= (ppc & FFB_PPC_WINMASK); + pFfb->ppc_cache = newppc; + need_mask |= NEED_PPC; + need_count++; + } + + if (pFfb->pmask_cache != 0x00ffffff) { + pFfb->pmask_cache = 0x00ffffff; + need_mask |= NEED_PMASK; + need_count++; + } + + rop = FFB_ROP_NEW | (FFB_ROP_NEW<<8); + if (pFfb->rop_cache != rop) { + pFfb->rop_cache = rop; + need_mask |= NEED_ROP; + need_count++; + } + + if (pFfb->drawop_cache != FFB_DRAWOP_FASTFILL) { + pFfb->drawop_cache = FFB_DRAWOP_FASTFILL; + need_mask |= NEED_DRAWOP; + need_count++; + } + + if (pFfb->fg_cache != pixel) { + pFfb->fg_cache = pixel; + need_mask |= NEED_FG; + need_count++; + } + + { + CreatorPrivWinPtr pWinPriv = CreatorGetWindowPrivate(pWin); + unsigned int fbc = pWinPriv->fbc_base; + + if (pFfb->has_double_buffer) { + fbc &= ~FFB_FBC_WB_MASK; + fbc |= FFB_FBC_WB_AB; + } + fbc &= ~(FFB_FBC_XE_MASK | FFB_FBC_RGBE_MASK); + fbc |= FFB_FBC_XE_ON | FFB_FBC_RGBE_ON; + if (pFfb->ffb_res == ffb_res_high) + fbc |= FFB_FBC_WB_B; + + if (pFfb->fbc_cache != fbc) { + pFfb->fbc_cache = fbc; + need_mask |= NEED_FBC; + need_count++; + } + + if (pFfb->wid_cache != pWinPriv->wid) { + pFfb->wid_cache = pWinPriv->wid; + need_mask |= NEED_WID; + need_count++; + } + } + + pFfb->rp_active = 1; + + FFBLOG(("WRATTRS_GC: PPC[%08x:%08x] PMSK[%08x] ROP[%08x] DOP[%08x] FG[%08x] FBC[%08x] WID[%02x]\n", + pFfb->ppc_cache & FFB_PPC_WINMASK, FFB_PPC_WINMASK, + pFfb->pmask_cache, pFfb->rop_cache, + pFfb->drawop_cache, pFfb->fg_cache, pFfb->fbc_cache, pFfb->wid_cache)); + + FFBFifo(pFfb, need_count); + if (need_mask & NEED_PPC) + ffb->ppc = (pFfb->ppc_cache & FFB_PPC_WINMASK); + if (need_mask & NEED_PMASK) + ffb->pmask = pFfb->pmask_cache; + if (need_mask & NEED_ROP) + ffb->rop = pFfb->rop_cache; + if (need_mask & NEED_DRAWOP) + ffb->drawop = pFfb->drawop_cache; + if (need_mask & NEED_FG) + ffb->fg = pFfb->fg_cache; + if (need_mask & NEED_FBC) + ffb->fbc = pFfb->fbc_cache; + if (need_mask & NEED_WID) + ffb->wid = pFfb->wid_cache; +} |