#if 0
#define DEBUG
#endif
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86_ansic.h"
#include "xf86PciInfo.h"
#include "xf86Pci.h"
#include "compiler.h"
#include "xaa.h"
#include "xaalocal.h"
#include "xaarop.h"
#include "sis.h"
#include "sis300_accel.h"
#ifdef SISDUALHEAD
#define HEADOFFSET (pSiS->dhmOffset)
#endif
#undef STSCE
#undef TRAP
static void SiSInitializeAccelerator(ScrnInfoPtr pScrn);
static void SiSSync(ScrnInfoPtr pScrn);
static void SiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir, int rop,
unsigned int planemask, int trans_color);
static void SiSSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1, int x2, int y2,
int width, int height);
static void SiSSetupForSolidFill(ScrnInfoPtr pScrn, int color,
int rop, unsigned int planemask);
static void SiSSubsequentSolidFillRect(ScrnInfoPtr pScrn,
int x, int y, int w, int h);
#ifdef TRAP
static void SiSSubsequentSolidFillTrap(ScrnInfoPtr pScrn, int y, int h,
int left, int dxL, int dyL, int eL,
int right, int dxR, int dyR, int eR);
#endif
static void SiSSetupForSolidLine(ScrnInfoPtr pScrn, int color,
int rop, unsigned int planemask);
static void SiSSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, int x1,
int y1, int x2, int y2, int flags);
static void SiSSubsequentSolidHorzVertLine(ScrnInfoPtr pScrn,
int x, int y, int len, int dir);
static void SiSSetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg, int rop, unsigned int planemask,
int length, unsigned char *pattern);
static void SiSSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
int x1, int y1, int x2, int y2,
int flags, int phase);
static void SiSSetupForMonoPatternFill(ScrnInfoPtr pScrn,
int patx, int paty, int fg, int bg,
int rop, unsigned int planemask);
static void SiSSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
int patx, int paty,
int x, int y, int w, int h);
#ifdef TRAP
static void SiSSubsequentMonoPatternFillTrap(ScrnInfoPtr pScrn,
int patx, int paty,
int y, int h,
int left, int dxL, int dyL, int eL,
int right, int dxR, int dyR, int eR );
#endif
#if 0
static void SiSSetupForColorPatternFill(ScrnInfoPtr pScrn,
int patx, int paty, int rop,
unsigned int planemask,
int trans_color);
static void SiSSubsequentColorPatternFill(ScrnInfoPtr pScrn,
int patx, int paty,
int x, int y, int w, int h);
#endif
#if 0
static void SiSSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
int fg, int bg,
int rop, unsigned int planemask);
static void SiSSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
int x, int y, int w, int h, int skipleft);
#endif
#ifdef STSCE
static void SiSSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
int fg, int bg,
int rop, unsigned int planemask);
static void SiSSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
int x, int y, int w, int h,
int srcx, int srcy, int skipleft);
#endif
static void SiSSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int fg, int bg, int rop,
unsigned int planemask);
static void SiSSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int x, int y, int w, int h,
int skipleft);
static void SiSSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno);
#ifdef SISDUALHEAD
static void SiSRestoreAccelState(ScrnInfoPtr pScrn);
#endif
static void
SiSInitializeAccelerator(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
pSiS->DoColorExpand = FALSE;
}
Bool
SiS300AccelInit(ScreenPtr pScreen)
{
XAAInfoRecPtr infoPtr;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
SISPtr pSiS = SISPTR(pScrn);
int topFB;
int reservedFbSize;
int UsableFbSize;
unsigned char *AvailBufBase;
BoxRec Avail;
int i;
pSiS->AccelInfoPtr = infoPtr = XAACreateInfoRec();
if (!infoPtr) return FALSE;
SiSInitializeAccelerator(pScrn);
infoPtr->Flags = LINEAR_FRAMEBUFFER |
OFFSCREEN_PIXMAPS |
PIXMAP_CACHE;
infoPtr->Sync = SiSSync;
if((pScrn->bitsPerPixel != 8) && (pScrn->bitsPerPixel != 16) &&
(pScrn->bitsPerPixel != 32))
return FALSE;
if(pSiS->scrnOffset < 8192) {
infoPtr->SetupForScreenToScreenCopy = SiSSetupForScreenToScreenCopy;
infoPtr->SubsequentScreenToScreenCopy = SiSSubsequentScreenToScreenCopy;
infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK |
TRANSPARENCY_GXCOPY_ONLY;
infoPtr->SetupForSolidFill = SiSSetupForSolidFill;
infoPtr->SubsequentSolidFillRect = SiSSubsequentSolidFillRect;
#ifdef TRAP
infoPtr->SubsequentSolidFillTrap = SiSSubsequentSolidFillTrap;
#endif
infoPtr->SolidFillFlags = NO_PLANEMASK;
infoPtr->SetupForSolidLine = SiSSetupForSolidLine;
infoPtr->SubsequentSolidTwoPointLine = SiSSubsequentSolidTwoPointLine;
infoPtr->SubsequentSolidHorVertLine = SiSSubsequentSolidHorzVertLine;
infoPtr->SolidLineFlags = NO_PLANEMASK;
infoPtr->SetupForDashedLine = SiSSetupForDashedLine;
infoPtr->SubsequentDashedTwoPointLine = SiSSubsequentDashedTwoPointLine;
infoPtr->DashPatternMaxLength = 64;
infoPtr->DashedLineFlags = NO_PLANEMASK |
LINE_PATTERN_MSBFIRST_LSBJUSTIFIED;
infoPtr->SetupForMono8x8PatternFill = SiSSetupForMonoPatternFill;
infoPtr->SubsequentMono8x8PatternFillRect = SiSSubsequentMonoPatternFill;
#ifdef TRAP
infoPtr->SubsequentMono8x8PatternFillTrap = SiSSubsequentMonoPatternFillTrap;
#endif
infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
HARDWARE_PATTERN_SCREEN_ORIGIN |
HARDWARE_PATTERN_PROGRAMMED_BITS |
BIT_ORDER_IN_BYTE_MSBFIRST ;
#ifdef STSCE
infoPtr->SetupForScreenToScreenColorExpandFill =
SiSSetupForScreenToScreenColorExpand;
infoPtr->SubsequentScreenToScreenColorExpandFill =
SiSSubsequentScreenToScreenColorExpand;
infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK |
BIT_ORDER_IN_BYTE_MSBFIRST ;
#endif
#if 0
infoPtr->SetupForCPUToScreenColorExpandFill =
SiSSetupForCPUToScreenColorExpand;
infoPtr->SubsequentCPUToScreenColorExpandFill =
SiSSubsequentCPUToScreenColorExpand;
infoPtr->ColorExpandRange = PATREGSIZE;
infoPtr->ColorExpandBase = pSiS->IOBase+PBR(0);
infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
BIT_ORDER_IN_BYTE_MSBFIRST |
NO_TRANSPARENCY |
SYNC_AFTER_COLOR_EXPAND |
HARDWARE_PATTERN_SCREEN_ORIGIN |
HARDWARE_PATTERN_PROGRAMMED_BITS ;
#endif
if(pSiS->VGAEngine == SIS_530_VGA) {
pSiS->ColorExpandBufferNumber = 4;
pSiS->ColorExpandBufferCountMask = 0x03;
} else {
pSiS->ColorExpandBufferNumber = 16;
pSiS->ColorExpandBufferCountMask = 0x0F;
}
pSiS->PerColorExpandBufferSize = ((pScrn->virtualX + 31)/32) * 4;
infoPtr->NumScanlineColorExpandBuffers = pSiS->ColorExpandBufferNumber;
infoPtr->ScanlineColorExpandBuffers = (unsigned char **)&pSiS->ColorExpandBufferAddr[0];
infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
SiSSetupForScanlineCPUToScreenColorExpandFill;
infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
SiSSubsequentScanlineCPUToScreenColorExpandFill;
infoPtr->SubsequentColorExpandScanline =
SiSSubsequentColorExpandScanline;
infoPtr->ScanlineCPUToScreenColorExpandFillFlags = NO_PLANEMASK |
CPU_TRANSFER_PAD_DWORD |
SCANLINE_PAD_DWORD |
BIT_ORDER_IN_BYTE_MSBFIRST |
LEFT_EDGE_CLIPPING;
} else {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Virtual screen width too large for accelerator engine\n");
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"2D acceleration and Xv disabled\n");
pSiS->NoXvideo = TRUE;
}
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
infoPtr->RestoreAccelState = SiSRestoreAccelState;
}
#endif
topFB = pSiS->maxxfbmem;
reservedFbSize = pSiS->ColorExpandBufferNumber * pSiS->PerColorExpandBufferSize;
UsableFbSize = topFB - reservedFbSize;
AvailBufBase = pSiS->FbBase + UsableFbSize;
for(i = 0; i < pSiS->ColorExpandBufferNumber; i++) {
pSiS->ColorExpandBufferAddr[i] = AvailBufBase +
i * pSiS->PerColorExpandBufferSize;
pSiS->ColorExpandBufferScreenOffset[i] = UsableFbSize +
i * pSiS->PerColorExpandBufferSize;
}
Avail.x1 = 0;
Avail.y1 = 0;
Avail.x2 = pScrn->displayWidth;
Avail.y2 = (UsableFbSize / (pScrn->displayWidth * pScrn->bitsPerPixel/8)) - 1;
if(Avail.y2 < 0) Avail.y2 = 32767;
if(Avail.y2 < pScrn->currentMode->VDisplay) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Not enough video RAM for accelerator. At least "
"%dKB needed, %ldKB available\n",
((((pScrn->displayWidth * pScrn->bitsPerPixel/8)
* pScrn->currentMode->VDisplay) + reservedFbSize) / 1024) + 8,
pSiS->maxxfbmem/1024);
pSiS->NoAccel = TRUE;
pSiS->NoXvideo = TRUE;
XAADestroyInfoRec(pSiS->AccelInfoPtr);
pSiS->AccelInfoPtr = NULL;
return FALSE;
}
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"Frame Buffer From (%d,%d) To (%d,%d)\n",
Avail.x1, Avail.y1, Avail.x2, Avail.y2);
xf86InitFBManager(pScreen, &Avail);
return(XAAInit(pScreen, infoPtr));
}
static void
SiSSync(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
PDEBUG(ErrorF("SiSSync()\n"));
pSiS->DoColorExpand = FALSE;
SiSIdle
}
#ifdef SISDUALHEAD
static void
SiSRestoreAccelState(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
pSiS->DoColorExpand = FALSE;
SiSIdle
}
#endif
static void SiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir, int rop,
unsigned int planemask, int trans_color)
{
SISPtr pSiS = SISPTR(pScrn);
PDEBUG(ErrorF("Setup ScreenCopy(%d, %d, 0x%x, 0x%x, 0x%x)\n",
xdir, ydir, rop, planemask, trans_color));
SiSSetupDSTColorDepth(pSiS->DstColor);
SiSSetupSRCPitch(pSiS->scrnOffset)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
if(trans_color != -1) {
SiSSetupROP(0x0A)
SiSSetupSRCTrans(trans_color)
SiSSetupCMDFlag(TRANSPARENT_BITBLT)
} else {
SiSSetupROP(XAACopyROP[rop])
}
if(xdir > 0) {
SiSSetupCMDFlag(X_INC)
}
if(ydir > 0) {
SiSSetupCMDFlag(Y_INC)
}
}
static void SiSSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int src_x, int src_y, int dst_x, int dst_y,
int width, int height)
{
SISPtr pSiS = SISPTR(pScrn);
long srcbase, dstbase;
PDEBUG(ErrorF("Subsequent ScreenCopy(%d,%d, %d,%d, %d,%d)\n",
src_x, src_y, dst_x, dst_y, width, height));
srcbase = dstbase = 0;
if(src_y >= 2048) {
srcbase = pSiS->scrnOffset * src_y;
src_y = 0;
}
if((dst_y >= pScrn->virtualY) || (dst_y >= 2048)) {
dstbase = pSiS->scrnOffset * dst_y;
dst_y = 0;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
srcbase += HEADOFFSET;
dstbase += HEADOFFSET;
}
#endif
SiSSetupSRCBase(srcbase);
SiSSetupDSTBase(dstbase);
if(!(pSiS->CommandReg & X_INC)) {
src_x += width-1;
dst_x += width-1;
}
if(!(pSiS->CommandReg & Y_INC)) {
src_y += height-1;
dst_y += height-1;
}
SiSSetupRect(width, height)
SiSSetupSRCXY(src_x, src_y)
SiSSetupDSTXY(dst_x, dst_y)
SiSDoCMD
}
static void
SiSSetupForSolidFill(ScrnInfoPtr pScrn,
int color, int rop, unsigned int planemask)
{
SISPtr pSiS = SISPTR(pScrn);
PDEBUG(ErrorF("Setup SolidFill(0x%x, 0x%x, 0x%x)\n",
color, rop, planemask));
if(pSiS->disablecolorkeycurrent) {
if((CARD32)color == pSiS->colorKey) {
rop = 5;
}
}
SiSSetupPATFG(color)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor);
SiSSetupROP(XAAPatternROP[rop])
}
static void
SiSSubsequentSolidFillRect(ScrnInfoPtr pScrn,
int x, int y, int w, int h)
{
SISPtr pSiS = SISPTR(pScrn);
long dstbase;
PDEBUG(ErrorF("Subsequent SolidFillRect(%d, %d, %d, %d)\n",
x, y, w, h));
dstbase = 0;
if(y >= 2048) {
dstbase = pSiS->scrnOffset * y;
y = 0;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
dstbase += HEADOFFSET;
}
#endif
SiSSetupDSTBase(dstbase)
SiSSetupDSTXY(x,y)
SiSSetupRect(w,h)
pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR |
T_L_X_INC | T_L_Y_INC |
T_R_X_INC | T_R_Y_INC |
TRAPAZOID_FILL);
SiSSetupCMDFlag(X_INC | Y_INC | BITBLT)
SiSDoCMD
}
#ifdef TRAP
static void
SiSSubsequentSolidFillTrap(ScrnInfoPtr pScrn, int y, int h,
int left, int dxL, int dyL, int eL,
int right, int dxR, int dyR, int eR )
{
SISPtr pSiS = SISPTR(pScrn);
long dstbase;
#if 0
float kL, kR;
#endif
dstbase = 0;
if(y >= 2048) {
dstbase=pSiS->scrnOffset*y;
y = 0;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
dstbase += HEADOFFSET;
}
#endif
SiSSetupDSTBase(dstbase)
#if 1
SiSSetupPATFG(0xff0000)
#endif
pSiS->CommandReg &= ~(T_L_X_INC | T_L_Y_INC |
T_R_X_INC | T_R_Y_INC |
T_XISMAJORL | T_XISMAJORR |
BITBLT);
xf86DrvMsg(0, X_INFO, "Trap (%d %d %d %d) dxL %d dyL %d eL %d dxR %d dyR %d eR %d\n",
left, right, y, h, dxL, dyL, eL, dxR, dyR, eR);
#if 0
if (dxL == 0) kL = 0;
else kL = (float)dyL / (float)dxL;
if (dxR == 0) kR = 0;
else kR = (float)dyR / (float)dxR;
xf86DrvMsg(0, X_INFO, "kL %f kR %f!\n", kL, kR);
if ( (kR != kL) &&
(!(kR == 0 && kL == 0)) &&
(!(kR < 0 && kL > 0)) ) {
xf86DrvMsg(0, X_INFO, "Inside if (%f - %d)\n", ( kL * ( ( ((float)right - (float)left) / (kL - kR) ) - left) + y), h+y);
if ( ( ( kL * ( ( ((float)right - (float)left) / (kL - kR) ) - (float)left) + (float)y) < (h + y) ) ) {
xf86DrvMsg(0, X_INFO, "Cross detected!\n");
}
}
#endif
if(dxL < 0) { dxL = -dxL; }
else { SiSSetupCMDFlag(T_L_X_INC) }
if(dxR < 0) { dxR = -dxR; }
else { SiSSetupCMDFlag(T_R_X_INC) }
if(dyL < 0) { dyL = -dyL; }
else { SiSSetupCMDFlag(T_L_Y_INC) }
if(dyR < 0) { dyR = -dyR; }
else { SiSSetupCMDFlag(T_R_Y_INC) }
if(dxL >= dyL) {
SiSSetupCMDFlag(T_XISMAJORL)
}
if(dxR >= dyR) {
SiSSetupCMDFlag(T_XISMAJORR)
}
SiSSetupdL(dxL, dyL)
SiSSetupdR(dxR, dyR)
#if 0
h &= 0x7F;
if (h == 0) h = 10;
#endif
SiSSetupYH(y,h)
SiSSetupLR(left,right)
SiSSetupEL(eL)
SiSSetupER(eR)
SiSSetupCMDFlag(TRAPAZOID_FILL);
SiSDoCMD
}
#endif
static void
SiSSetupForSolidLine(ScrnInfoPtr pScrn,
int color, int rop, unsigned int planemask)
{
SISPtr pSiS = SISPTR(pScrn);
PDEBUG(ErrorF("Setup SolidLine(0x%x, 0x%x, 0x%x)\n",
color, rop, planemask));
SiSSetupLineCount(1)
SiSSetupPATFG(color)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor);
SiSSetupROP(XAAPatternROP[rop])
SiSSetupCMDFlag(PATFG | LINE)
}
static void
SiSSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
int x1, int y1, int x2, int y2, int flags)
{
SISPtr pSiS = SISPTR(pScrn);
long dstbase,miny,maxy;
PDEBUG(ErrorF("Subsequent SolidLine(%d, %d, %d, %d, 0x%x)\n",
x1, y1, x2, y2, flags));
dstbase = 0;
miny = (y1 > y2) ? y2 : y1;
maxy = (y1 > y2) ? y1 : y2;
if(maxy >= 2048) {
dstbase = pSiS->scrnOffset * miny;
y1 -= miny;
y2 -= miny;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
dstbase += HEADOFFSET;
}
#endif
SiSSetupDSTBase(dstbase)
SiSSetupX0Y0(x1,y1)
SiSSetupX1Y1(x2,y2)
if(flags & OMIT_LAST) {
SiSSetupCMDFlag(NO_LAST_PIXEL)
} else {
pSiS->CommandReg &= ~(NO_LAST_PIXEL);
}
SiSDoCMD
}
static void
SiSSubsequentSolidHorzVertLine(ScrnInfoPtr pScrn,
int x, int y, int len, int dir)
{
SISPtr pSiS = SISPTR(pScrn);
long dstbase;
PDEBUG(ErrorF("Subsequent SolidHorzVertLine(%d, %d, %d, %d)\n",
x, y, len, dir));
len--;
dstbase = 0;
if((y >= 2048) || ((dir != DEGREES_0) && ((y + len) >= 2048))) {
dstbase = pSiS->scrnOffset * y;
y = 0;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
dstbase += HEADOFFSET;
}
#endif
SiSSetupDSTBase(dstbase)
SiSSetupX0Y0(x,y)
if(dir == DEGREES_0) {
SiSSetupX1Y1(x + len, y);
} else {
SiSSetupX1Y1(x, y + len);
}
SiSDoCMD
}
static void
SiSSetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg, int rop, unsigned int planemask,
int length, unsigned char *pattern)
{
SISPtr pSiS = SISPTR(pScrn);
PDEBUG(ErrorF("Setup DashedLine(0x%x, 0x%x, 0x%x, 0x%x, %d, 0x%x:%x)\n",
fg, bg, rop, planemask, length, *(pattern+4), *pattern));
SiSSetupLineCount(1)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor);
SiSSetupStyleLow(*pattern)
SiSSetupStyleHigh(*(pattern+4))
SiSSetupStylePeriod(length-1);
SiSSetupROP(XAAPatternROP[rop])
SiSSetupPATFG(fg)
SiSSetupCMDFlag(LINE | LINE_STYLE)
if(bg != -1) {
SiSSetupPATBG(bg)
} else {
SiSSetupCMDFlag(TRANSPARENT);
}
}
static void
SiSSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
int x1, int y1, int x2, int y2,
int flags, int phase)
{
SISPtr pSiS = SISPTR(pScrn);
long dstbase,miny,maxy;
PDEBUG(ErrorF("Subsequent DashedLine(%d,%d, %d,%d, 0x%x,0x%x)\n",
x1, y1, x2, y2, flags, phase));
dstbase = 0;
miny = (y1 > y2) ? y2 : y1;
maxy = (y1 > y2) ? y1 : y2;
if(maxy >= 2048) {
dstbase = pSiS->scrnOffset * miny;
y1 -= miny;
y2 -= miny;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
dstbase += HEADOFFSET;
}
#endif
SiSSetupDSTBase(dstbase)
SiSSetupX0Y0(x1,y1)
SiSSetupX1Y1(x2,y2)
if(flags & OMIT_LAST) {
SiSSetupCMDFlag(NO_LAST_PIXEL)
} else {
pSiS->CommandReg &= ~(NO_LAST_PIXEL);
}
SiSDoCMD
}
static void
SiSSetupForMonoPatternFill(ScrnInfoPtr pScrn,
int patx, int paty, int fg, int bg,
int rop, unsigned int planemask)
{
SISPtr pSiS = SISPTR(pScrn);
PDEBUG(ErrorF("Setup MonoPatFill(0x%x,0x%x, 0x%x,0x%x, 0x%x, 0x%x)\n",
patx, paty, fg, bg, rop, planemask));
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor);
SiSSetupMONOPAT(patx,paty)
SiSSetupPATFG(fg)
SiSSetupROP(XAAPatternROP[rop])
SiSSetupCMDFlag(PATMONO)
if(bg != -1) {
SiSSetupPATBG(bg)
} else {
SiSSetupCMDFlag(TRANSPARENT)
}
}
static void
SiSSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
int patx, int paty,
int x, int y, int w, int h)
{
SISPtr pSiS = SISPTR(pScrn);
long dstbase;
PDEBUG(ErrorF("Subsequent MonoPatFill(0x%x,0x%x, %d,%d, %d,%d)\n",
patx, paty, x, y, w, h));
dstbase = 0;
if(y >= 2048) {
dstbase = pSiS->scrnOffset * y;
y = 0;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
dstbase += HEADOFFSET;
}
#endif
SiSSetupDSTBase(dstbase)
SiSSetupDSTXY(x, y)
SiSSetupRect(w, h)
pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR |
T_L_X_INC | T_L_Y_INC |
T_R_X_INC | T_R_Y_INC |
TRAPAZOID_FILL);
SiSSetupCMDFlag(X_INC | Y_INC)
SiSDoCMD
}
#ifdef TRAP
static void
SiSSubsequentMonoPatternFillTrap(ScrnInfoPtr pScrn,
int patx, int paty,
int y, int h,
int left, int dxL, int dyL, int eL,
int right, int dxR, int dyR, int eR )
{
SISPtr pSiS = SISPTR(pScrn);
long dstbase;
PDEBUG(ErrorF("Subsequent Mono8x8PatternFillTrap(%d, %d, %d - %d %d/%d %d/%d)\n",
y, h, left, right, dxL, dxR, eL, eR));
dstbase = 0;
if(y >= 2048) {
dstbase = pSiS->scrnOffset * y;
y = 0;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
dstbase += HEADOFFSET;
}
#endif
SiSSetupDSTBase(dstbase)
pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR |
T_L_X_INC | T_L_Y_INC |
T_R_X_INC | T_R_Y_INC |
BITBLT);
if(dxL < 0) { dxL = -dxL; }
else { SiSSetupCMDFlag(T_L_X_INC) }
if(dxR < 0) { dxR = -dxR; }
else { SiSSetupCMDFlag(T_R_X_INC) }
if(dyL < 0) { dyL = -dyL; }
else { SiSSetupCMDFlag(T_L_Y_INC) }
if(dyR < 0) { dyR = -dyR; }
else { SiSSetupCMDFlag(T_R_Y_INC) }
if(dxL >= dyL) {
SiSSetupCMDFlag(T_XISMAJORL)
}
if(dxR >= dyR) {
SiSSetupCMDFlag(T_XISMAJORR)
}
SiSSetupYH(y,h)
SiSSetupLR(left,right)
SiSSetupdL(dxL, dyL)
SiSSetupdR(dxR, dyR)
SiSSetupEL(eL)
SiSSetupER(eR)
SiSSetupCMDFlag(TRAPAZOID_FILL);
SiSDoCMD
}
#endif
#if 0
static void
SiSSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
int fg, int bg,
int rop, unsigned int planemask)
{
SISPtr pSiS = SISPTR(pScrn);
PDEBUG(ErrorF("Setup CPUToScreen ColorExpand(0x%x,0x%x, 0x%x,0x%x)\n",
fg, bg, rop, planemask));
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor);
SiSSetupSRCXY(0,0)
SiSSetupSRCFG(fg)
SiSSetupROP(XAAPatternROP[rop])
SiSSetupCMDFlag(X_INC | Y_INC | COLOREXP)
if(bg == -1) {
SiSSetupCMDFlag(TRANSPARENT)
} else {
SiSSetupSRCBG(bg)
}
}
static void
SiSSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
int x, int y, int w, int h, int skipleft)
{
SISPtr pSiS = SISPTR(pScrn);
long dstbase;
PDEBUG(ErrorF("Subsequent CPUToScreen ColorExpand(%d,%d, %d,%d, %d)\n",
x, y, w, h, skipleft));
dstbase = 0;
if(y >= 2048) {
dstbase = pSiS->scrnOffset * y;
y = 0;
}
SiSSetupDSTBase(dstbase)
SiSSetupSRCPitch((w+7)/8)
SiSSetupDSTXY(x,y)
SiSSetupRect(w,h)
pSiS->DoColorExpand = TRUE;
}
#endif
#ifdef STSCE
static void
SiSSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
int fg, int bg,
int rop, unsigned int planemask)
{
SISPtr pSiS = SISPTR(pScrn);
PDEBUG(ErrorF("Setup ScreenToScreen ColorExp(0x%x,0x%x, 0x%x)\n",
fg, bg, rop));
SiSSetupDSTColorDepth(pSiS->DstColor)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupROP(XAACopyROP[rop])
SiSSetupSRCFG(fg)
if(bg == -1) {
SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | X_INC |
Y_INC | SRCVIDEO);
} else {
SiSSetupSRCBG(bg);
SiSSetupCMDFlag(ENCOLOREXP | X_INC | Y_INC |
SRCVIDEO);
};
}
#endif
#ifdef STSCE
#undef npitch
#undef pitchdw
#define nopitch
static void
SiSSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
int x, int y, int w, int h,
int srcx, int srcy, int skipleft)
{
SISPtr pSiS = SISPTR(pScrn);
long srcbase, dstbase;
#if 0
int _x0, _y0, _x1, _y1;
#endif
#ifdef pitchdw
int newsrcx, newsrcy;
newsrcy = ((pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8))) /
(pScrn->displayWidth/8);
newsrcx = ((pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8))) %
(pScrn->displayWidth/8);
#endif
xf86DrvMsg(0, X_INFO, "Sub ScreenToScreen ColorExp(%d,%d, %d,%d, %d,%d, %d)\n",
x, y, w, h, srcx, srcy, skipleft);
srcbase = dstbase = 0;
#ifdef pitchdw
if(newsrcy >= 2048) {
srcbase = (pScrn->displayWidth / 8) * newsrcy;
newsrcy = 0;
}
#endif
#ifdef nopitch
srcbase = (pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8));
#endif
#ifdef npitch
if(srcy >= 2048) {
srcbase = pSiS->scrnOffset * srcy;
srcy = 0;
}
#endif
if(y >= 2048) {
dstbase = pSiS->scrnOffset * y;
y = 0;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
srcbase += HEADOFFSET;
dstbase += HEADOFFSET;
}
#endif
SiSSetupSRCBase(srcbase)
SiSSetupDSTBase(dstbase)
#ifdef pitchdw
SiSSetupSRCPitch(pScrn->displayWidth/8)
#endif
#ifdef nopitch
SiSSetupSRCPitch(pSiS->scrnOffset)
#endif
#ifdef npitch
SiSSetupSRCPitch(pSiS->scrnOffset)
#endif
SiSSetupRect(w,h)
#if 0
if (skipleft > 0) {
_x0 = x+skipleft;
_y0 = y;
_x1 = x+w;
_y1 = y+h;
SiSSetupClipLT(_x0, _y0);
SiSSetupClipRB(_x1, _y1);
SiSSetupCMDFlag(CLIPENABLE);
}
#endif
#ifdef pitchdw
SiSSetupSRCXY(newsrcx, newsrcy)
#endif
#ifdef nopitch
SiSSetupSRCXY(0,0)
#endif
#ifdef npitch
SiSSetupSRCXY(srcx, srcy)
#endif
SiSSetupDSTXY(x,y)
SiSDoCMD
}
#endif
static void
SiSSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int fg, int bg, int rop, unsigned int planemask)
{
SISPtr pSiS=SISPTR(pScrn);
while((MMIO_IN16(pSiS->IOBase, 0x8242) & 0x1F00) != 0) {}
SiSSetupSRCXY(0,0);
SiSSetupROP(XAACopyROP[rop]);
SiSSetupSRCFG(fg);
SiSSetupDSTRect(pSiS->scrnOffset, -1);
SiSSetupDSTColorDepth(pSiS->DstColor);
if(bg == -1) {
SiSSetupCMDFlag(TRANSPARENT |
ENCOLOREXP |
X_INC | Y_INC |
SRCCPUBLITBUF);
} else {
SiSSetupSRCBG(bg);
SiSSetupCMDFlag(ENCOLOREXP |
X_INC | Y_INC |
SRCCPUBLITBUF);
}
}
static void
SiSSubsequentScanlineCPUToScreenColorExpandFill(
ScrnInfoPtr pScrn, int x, int y, int w,
int h, int skipleft)
{
SISPtr pSiS = SISPTR(pScrn);
int _x0, _y0, _x1, _y1;
long dstbase;
dstbase = 0;
if((y >= 2048) || ((y + h) >= 2048)) {
dstbase = pSiS->scrnOffset * y;
y = 0;
}
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
dstbase += HEADOFFSET;
}
#endif
if((MMIO_IN16(pSiS->IOBase, 0x8242) & 0xe000) != 0xe000) {
SiSIdle
}
SiSSetupDSTBase(dstbase)
if(skipleft > 0) {
_x0 = x + skipleft;
_y0 = y;
_x1 = x + w;
_y1 = y + h;
SiSSetupClipLT(_x0, _y0);
SiSSetupClipRB(_x1, _y1);
SiSSetupCMDFlag(CLIPENABLE);
} else {
pSiS->CommandReg &= (~CLIPENABLE);
}
SiSSetupRect(w, 1);
SiSSetupSRCPitch(((((w+7)/8)+3) >> 2) * 4);
pSiS->xcurrent = x;
pSiS->ycurrent = y;
}
static void
SiSSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
{
SISPtr pSiS=SISPTR(pScrn);
#if 0
int newhead,bltbufstage,newtail;
#endif
long cbo;
cbo = pSiS->ColorExpandBufferScreenOffset[bufno];
#ifdef SISDUALHEAD
if(pSiS->VGAEngine != SIS_530_VGA) {
cbo += HEADOFFSET;
}
#endif
if((MMIO_IN16(pSiS->IOBase, 0x8242) & 0xe000) != 0xe000) {
SiSIdle
}
SiSSetupSRCBase(cbo);
SiSSetupDSTXY(pSiS->xcurrent, pSiS->ycurrent);
SiSDoCMD
pSiS->ycurrent++;
if(pSiS->VGAEngine == SIS_530_VGA) {
while(MMIO_IN8(pSiS->IOBase, 0x8242) & 0x80) {}
}
}