diff options
Diffstat (limited to 'src/imstt_accel.c')
-rw-r--r-- | src/imstt_accel.c | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/src/imstt_accel.c b/src/imstt_accel.c new file mode 100644 index 0000000..86dca58 --- /dev/null +++ b/src/imstt_accel.c @@ -0,0 +1,224 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_accel.c,v 1.6 2001/05/16 06:48:09 keithp Exp $ */ + +/* + * Copyright 2000 Ani Joshi <ajoshi@unixbox.com> + * + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation and + * that the name of Ani Joshi not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Ani Joshi makes no representations + * about the suitability of this software for any purpose. It is provided + * "as-is" without express or implied warranty. + * + * ANI JOSHI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL ANI JOSHI BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + */ + + +#include "Xarch.h" +#include "xf86.h" +#include "xf86_ansic.h" +#include "compiler.h" +#include "xf86_OSproc.h" +#include "xaa.h" +#include "xf86PciInfo.h" + +#include "imstt.h" +#include "imstt_reg.h" + + + +static void IMSTTSync(ScrnInfoPtr pScrn) +{ + IMSTTPtr iptr = IMSTTPTR(pScrn); +/* IMSTTMMIO_VARS(); */ + + while(INREG(IMSTT_SSTATUS) & 0x80); + while(INREG(IMSTT_SSTATUS) & 0x40); + + return; +} + + +static void IMSTTSetupForSolidFill(ScrnInfoPtr pScrn, int color, + int rop, unsigned int planemask) +{ + IMSTTPtr iptr = IMSTTPTR(pScrn); +/* IMSTTMMIO_VARS(); */ + + switch (pScrn->depth) { + case 8: + iptr->color = color | (color << 8) | (color << 16) | (color << 24); + break; + case 15: + case 16: + iptr->color = color | (color << 8) | (color << 16); + break; + default: + iptr->color = color; + break; + } +} + + +static void IMSTTSubsequentSolidFillRect(ScrnInfoPtr pScrn, + int x, int y, int w, int h) +{ + IMSTTPtr iptr = IMSTTPTR(pScrn); +/* IMSTTMMIO_VARS(); */ + + x *= (pScrn->bitsPerPixel >> 3); + y *= iptr->ll; + w *= (pScrn->bitsPerPixel >> 3); + h--; + w--; + + while(INREG(IMSTT_SSTATUS) & 0x80); + OUTREG(IMSTT_DSA, x + y); + OUTREG(IMSTT_CNT, (h << 16) | w); + OUTREG(IMSTT_DP_OCTL, iptr->ll); + OUTREG(IMSTT_SP, iptr->ll); + OUTREG(IMSTT_BI, 0xffffffff); + OUTREG(IMSTT_MBC, 0xffffffff); + OUTREG(IMSTT_CLR, iptr->color); + + if (iptr->rev == 2) + OUTREG(IMSTT_BLTCTL, 0x200000); + else + OUTREG(IMSTT_BLTCTL, 0x840); + + while(INREG(IMSTT_SSTATUS) & 0x80); + while(INREG(IMSTT_SSTATUS) & 0x40); +} + + +static void IMSTTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, + int ydir, int rop, unsigned int planemask, + int trans_color) +{ + IMSTTPtr iptr = IMSTTPTR(pScrn); +/* IMSTTMMIO_VARS(); */ + unsigned long sp, dp, ll; + + iptr->bltctl = 0x05; + + ll = pScrn->displayWidth * (pScrn->bitsPerPixel >> 3); + ll = iptr->ll; + + sp = ll << 16; + + if (xdir < 0) { + iptr->bltctl |= 0x80; + iptr->cnt = 1; + } else { + iptr->cnt = 0; + } + + if (ydir < 0) { + sp |= -(ll) & 0xffff; + dp = -(ll) & 0xffff; + iptr->ydir = 1; + } else { + sp |= ll; + dp = ll; + iptr->ydir = 0; + } + + iptr->sp = sp; + iptr->dp = dp; + iptr->ll = ll; +} + + +static void IMSTTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, + int x1, int y1, + int x2, int y2, + int w, int h) +{ + IMSTTPtr iptr = IMSTTPTR(pScrn); +/* IMSTTMMIO_VARS(); */ + unsigned long cnt; + + x1 *= (pScrn->bitsPerPixel >> 3); + x2 *= (pScrn->bitsPerPixel >> 3); + w *= (pScrn->bitsPerPixel >> 3); + w--; + h--; + cnt = h << 16; + + if (iptr->cnt) { + x1 += w; + x2 += w; + cnt |= -(w) & 0xffff; + } + else + cnt |= w; + + if (iptr->ydir) { + y1 += h; + y2 += h; + } + + OUTREG(IMSTT_S1SA, y1 * iptr->ll + x1); + OUTREG(IMSTT_SP, iptr->sp); + OUTREG(IMSTT_DSA, y2 * iptr->ll + x2); + OUTREG(IMSTT_CNT, cnt); + OUTREG(IMSTT_DP_OCTL, iptr->dp); + OUTREG(IMSTT_BLTCTL, iptr->bltctl); + while(INREG(IMSTT_SSTATUS) & 0x80); + while(INREG(IMSTT_SSTATUS) & 0x40); +} + + + +Bool IMSTTAccelInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + IMSTTPtr iptr = IMSTTPTR(pScrn); + XAAInfoRecPtr xaaptr; + + if (!(xaaptr = iptr->AccelInfoRec = XAACreateInfoRec())) + return FALSE; + + iptr->ll = pScrn->displayWidth * (pScrn->bitsPerPixel >> 3); + + switch (pScrn->bitsPerPixel) { + case 16: + iptr->screen_width = iptr->pitch >> 1; + break; + case 24: + case 32: + iptr->screen_width = iptr->pitch >> 2; + break; + default: + iptr->screen_width = iptr->pitch = iptr->ll; + break; + } + + xaaptr->Flags = (PIXMAP_CACHE | OFFSCREEN_PIXMAPS | LINEAR_FRAMEBUFFER); + + xaaptr->Sync = IMSTTSync; + + if (pScrn->bitsPerPixel == 8) { + /* FIXME fills are broken > 8bpp, iptr->color needs to be setup right */ + xaaptr->SetupForSolidFill = IMSTTSetupForSolidFill; + xaaptr->SubsequentSolidFillRect = IMSTTSubsequentSolidFillRect; + } + + xaaptr->ScreenToScreenCopyFlags = NO_TRANSPARENCY; + xaaptr->SetupForScreenToScreenCopy = IMSTTSetupForScreenToScreenCopy; + xaaptr->SubsequentScreenToScreenCopy = IMSTTSubsequentScreenToScreenCopy; + + return XAAInit(pScreen, xaaptr); +} + |