#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);
#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;
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;
#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;
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;
*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)
{
return TRUE;
}
static void FFB_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags)
{
}
static int FFB_GetViewport(ScrnInfoPtr pScrn)
{
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