diff options
Diffstat (limited to 'src/ffb_dga.c')
-rw-r--r-- | src/ffb_dga.c | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/src/ffb_dga.c b/src/ffb_dga.c new file mode 100644 index 0000000..3ba43df --- /dev/null +++ b/src/ffb_dga.c @@ -0,0 +1,280 @@ +/* + * Acceleration for the Creator and Creator3D framebuffer - DGA support. + * + * Copyright (C) 2000 David S. Miller (davem@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 + * 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_dga.c,v 1.2 2000/10/17 16:53:17 tsi Exp $ */ + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "dgaproc.h" + +#include "ffb.h" +#include "ffb_regs.h" +#include "ffb_rcache.h" +#include "ffb_fifo.h" +#include "ffb_stip.h" +#include "ffb_loops.h" + +static Bool FFB_OpenFramebuffer(ScrnInfoPtr pScrn, char **name, unsigned char **mem, + int *size, int *offset, int *extra); +static void FFB_CloseFramebuffer(ScrnInfoPtr pScrn); +static Bool FFB_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode); +static void FFB_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags); +static int FFB_GetViewport(ScrnInfoPtr pScrn); +static void FFB_Flush(ScrnInfoPtr pScrn); + +/* Have to disable all this stuff for now until I figure out where + * we should get the WID values from... ho hum... -DaveM + */ +#if 0 +static void FFB_FillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned long color); + +#ifdef USE_VIS +static void FFB_BlitRect(ScrnInfoPtr pScrn, int srcx, int srcy, int w, int h, + int dstx, int dsty); +#else +#define FFB_BlitRect NULL +#endif +#else +#define FFB_FillRect NULL +#define FFB_BlitRect NULL +#endif + +static DGAFunctionRec FFB_DGAFuncs = { + FFB_OpenFramebuffer, + FFB_CloseFramebuffer, + FFB_SetMode, + FFB_SetViewport, + FFB_GetViewport, + FFB_Flush, + FFB_FillRect, + FFB_BlitRect, + NULL +}; + +void FFB_InitDGA(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + FFBPtr pFfb; + DGAModePtr mode; + Bool result; + + pFfb = GET_FFB_FROM_SCRN(pScrn); + + mode = xnfcalloc(sizeof(DGAModeRec), 1); + if (!mode) { + xf86Msg(X_WARNING, "%s: DGA init failed, cannot alloc DGAMode.\n", + pFfb->psdp->device); + return; + } + + mode->num = 0; + mode->mode = pScrn->modes; + + /* Hmmm, what does concurrent access really mean? -DaveM */ + mode->flags = (DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE | DGA_FILL_RECT); + +#ifdef USE_VIS + mode->flags |= DGA_BLIT_RECT; +#endif + + mode->imageWidth = 2048; + mode->imageHeight = 2048; + mode->pixmapWidth = 2048; + mode->pixmapHeight = 2048; + + /* XXX I would imagine that this value states how many bytes + * XXX you add to advance exactly one full horizontal line in + * XXX the framebuffer addressing, but the way we set the pScrn + * XXX mode values do not match that definition. + * XXX + * XXX Ask Jakub what is going on here. -DaveM + */ +#if 1 + mode->bytesPerScanline = pScrn->modes->HDisplay * 4; +#else + mode->bytesPerScanline = (2048 * 4); +#endif + + mode->byteOrder = pScrn->imageByteOrder; + mode->depth = 32; + mode->bitsPerPixel = 32; + mode->red_mask = 0xff; + mode->green_mask = 0xff00; + mode->blue_mask = 0xff0000; + mode->visualClass = TrueColor; + mode->viewportWidth = pScrn->modes->HDisplay; + mode->viewportHeight = pScrn->modes->VDisplay; + + /* Do these values even matter if we do not support + * viewports? -DaveM + */ + mode->xViewportStep = 0; + mode->yViewportStep = 0; + mode->maxViewportX = 0; + mode->maxViewportY = 0; + + mode->viewportFlags = 0; + mode->offset = 0; + + result = DGAInit(pScreen, &FFB_DGAFuncs, mode, 1); + if (result == FALSE) { + xf86Msg(X_WARNING, + "%s: DGA init failed, DGAInit returns FALSE.\n", + pFfb->psdp->device); + } else { + xf86Msg(X_INFO, "%s: DGA support initialized.\n", + pFfb->psdp->device); + } +} + +static Bool FFB_OpenFramebuffer(ScrnInfoPtr pScrn, char **name, unsigned char **mem, + int *size, int *offset, int *extra) +{ + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + + *name = pFfb->psdp->device; + + /* We give the user the dumb frame buffer. */ + *mem = (unsigned char *)FFB_DFB24_VOFF; + *size = 0x1000000; + *offset = 0; + *extra = 0; + + return TRUE; +} + +static void FFB_CloseFramebuffer(ScrnInfoPtr pScrn) +{ +} + +static Bool FFB_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) +{ + /* Nothing to do, we currently only support one mode + * and we are always in it. + */ + return TRUE; +} + +static void FFB_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags) +{ + /* We don't support viewports, so... */ +} + +static int FFB_GetViewport(ScrnInfoPtr pScrn) +{ + /* No viewports, none pending... */ + return 0; +} + +static void FFB_Flush(ScrnInfoPtr pScrn) +{ + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + + FFBWait(pFfb, ffb); +} + +#if 0 + +extern void CreatorFillBoxSolid (DrawablePtr pDrawable, int nBox, + BoxPtr pBox, unsigned long pixel); + +static void FFB_FillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned long color) +{ + DrawableRec draw; + BoxRec box; + + draw.pScreen = pScrn->pScreen; + box.x1 = x; + box.y1 = y; + box.x2 = x + w; + box.y2 = y + h; + + CreatorFillBoxSolid(&draw, 1, &box, color); +} + +#ifdef USE_VIS +extern void VISmoveImageLR(unsigned char *, unsigned char *, long, long, long, long); +extern void VISmoveImageRL(unsigned char *, unsigned char *, long, long, long, long); + +static void FFB_BlitRect(ScrnInfoPtr pScrn, int srcx, int srcy, + int w, int h, int dstx, int dsty) +{ + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + + if (!pFfb->disable_vscroll && + dstx == srcx && + dsty != dsty) { + FFB_WRITE_ATTRIBUTES_VSCROLL(pFfb, 0x00ffffff); + FFBFifo(pFfb, 7); + ffb->drawop = FFB_DRAWOP_VSCROLL; + FFB_WRITE64(&ffb->by, srcy, srcx); + FFB_WRITE64_2(&ffb->dy, dsty, dstx); + FFB_WRITE64_3(&ffb->bh, h, w); + pFfb->rp_active = 1; + } else { + unsigned char *base = (unsigned char *)pFfb->fb; + int use_prefetch = pFfb->use_blkread_prefetch; + + FFB_WRITE_ATTRIBUTES_SFB_VAR(pFfb, 0x00ffffff, GXcopy); + FFBWait(pFfb, ffb); + if (use_prefetch) { + FFBFifo(pFfb, 1); + ffb->mer = FFB_MER_EIRA; + pFfb->rp_active = 1; + FFBWait(pFfb, ffb); + } + if (srcx < dstx) { + VISmoveImageRL((base + + ((srcy + h - 1) * (2048 * 4)) + + (srcx * (32 / 8))), + (base + + ((dsty + h - 1) * (2048 * 4)) + + (dstx * (32 / 8))), + (w * (32 / 8)), + h, + -(2048 * 4), - (2048 * 4)); + } else { + VISmoveImageLR((base + + ((srcy + h - 1) * (2048 * 4)) + + (srcx * (32 / 8))), + (base + + ((dsty + h - 1) * (2048 * 4)) + + (dstx * (32 / 8))), + (w * (32 / 8)), + h, + -(2048 * 4), - (2048 * 4)); + } + if (use_prefetch) { + FFBFifo(pFfb, 1); + ffb->mer = FFB_MER_DRA; + pFfb->rp_active = 1; + FFBWait(pFfb, pFfb->regs); + } + } +} +#endif + +#endif |