#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86_ansic.h"
#include "compiler.h"
#include "xf86Pci.h"
#include "xf86PciInfo.h"
#include "vgaHW.h"
#include "cir.h"
#define _LG_PRIVATE_
#include "lg.h"
#include "lg_xaa.h"
static int lgRop[16] = {
0x00,
0x88,
0x44,
0xCC,
0x22,
0xAA,
0x66,
0xEE,
0x77,
0x99,
0x55,
0xDD,
0x33,
0xBB,
0x11,
0xFF
};
#if 0
static int lgPatRop[16] = {
0x00,
0xA0,
0x50,
0xF0,
0x0A,
0xAA,
0x5A,
0xFA,
0x05,
0xA5,
0x55,
0xF5,
0x0F,
0xAF,
0x5F,
0xFF
};
#endif
static void LgSetBitmask(CirPtr pCir, const CARD32 m);
static void LgWaitQAvail(CirPtr pCir, int n);
static CARD32 LgExpandColor(CARD32 color, int bpp);
static void LgSync(ScrnInfoPtr pScrn);
static void LgSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
unsigned int planemask);
static void LgSubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y,
int w, int h);
static void LgSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir,
int rop, unsigned int planemask,
int transparency_color);
static void LgSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1,
int x2, int y2, int w, int h);
Bool
LgXAAInit(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
CirPtr pCir = CIRPTR(pScrn);
XAAInfoRecPtr XAAPtr;
XAAPtr = XAACreateInfoRec();
if (!XAAPtr)
return FALSE;
XAAPtr->SetupForSolidFill = LgSetupForSolidFill;
XAAPtr->SubsequentSolidFillRect = LgSubsequentSolidFillRect;
XAAPtr->SubsequentSolidFillTrap = NULL;
XAAPtr->SolidFillFlags = 0;
XAAPtr->SetupForScreenToScreenCopy = LgSetupForScreenToScreenCopy;
XAAPtr->SubsequentScreenToScreenCopy = LgSubsequentScreenToScreenCopy;
XAAPtr->ScreenToScreenCopyFlags = ONLY_LEFT_TO_RIGHT_BITBLT;
XAAPtr->Sync = LgSync;
pCir->AccelInfoRec = XAAPtr;
if (!XAAInit(pScreen, XAAPtr))
return FALSE;
return TRUE;
}
static void
LgSetBitmask(CirPtr pCir, const CARD32 m)
{
const LgPtr pLg = LGPTR(pCir);
if (m != pLg->oldBitmask) {
LgSETBITMASK(m);
pLg->oldBitmask = m;
}
}
static void
LgWaitQAvail(CirPtr pCir, int n)
{
if (!0) {
CARD8 qfree;
do
qfree = *(volatile CARD8 *)(pCir->IOBase + QFREE);
while (qfree < n);
}
}
static CARD32
LgExpandColor(CARD32 color, int bpp)
{
if (8 == bpp)
color = ((color&0xFF) << 8) | (color&0xFF);
if (8 == bpp || 16 == bpp)
color = ((color&0xFFFF) << 16) | (color&0xFFFF);
return color;
}
static void
LgSync(ScrnInfoPtr pScrn)
{
const CirPtr pCir = CIRPTR(pScrn);
#if 0
LgPtr pLg = LGPTR(pScrn);
#endif
while (!LgREADY())
;
}
static void
LgSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
unsigned int planemask)
{
const CirPtr pCir = CIRPTR(pScrn);
color = LgExpandColor(color, pScrn->bitsPerPixel);
LgWaitQAvail(pCir, 4);
LgSETBACKGROUND(color);
LgSETROP(lgRop[rop]);
LgSETMODE(SCR2SCR | COLORFILL);
LgSetBitmask(pCir, planemask);
}
static void
LgSubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h)
{
const CirPtr pCir = CIRPTR(pScrn);
LgWaitQAvail(pCir, 2);
LgSETDSTXY(x, y);
LgSETEXTENTS(w, h);
}
static void
LgSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir,
int rop, unsigned int planemask, int transparency_color)
{
int bltmode = 0;
const CirPtr pCir = CIRPTR(pScrn);
const LgPtr pLg = LGPTR(pCir);
pLg->blitTransparent = (transparency_color != -1);
pLg->blitYDir = ydir;
LgWaitQAvail(pCir, 4);
LgSETROP(lgRop[rop]);
if (ydir < 0)
bltmode |= BLITUP;
if (pLg->blitTransparent) {
transparency_color = LgExpandColor(transparency_color,
pScrn->bitsPerPixel);
bltmode |= COLORTRANS;
LgSETBACKGROUND(transparency_color);
LgSETTRANSPARENCY(TRANSEQ);
} else {
LgSETTRANSPARENCY(TRANSNONE);
}
LgSETMODE(SCR2SCR | COLORSRC | bltmode);
LgSetBitmask(pCir, planemask);
}
static void
LgSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1,
int x2, int y2, int w, int h)
{
const CirPtr pCir = CIRPTR(pScrn);
const LgPtr pLg = LGPTR(pCir);
if (pLg->blitYDir == -1) {
y1 += h - 1;
y2 += h - 1;
}
if (pLg->blitTransparent) {
LgWaitQAvail(pCir, 4);
LgSETTRANSMASK(x1, y1);
} else {
LgWaitQAvail(pCir, 3);
}
LgSETSRCXY(x1, y1);
LgSETDSTXY(x2, y2);
LgSETEXTENTS(w, h);
}