📄 blt.cpp
字号:
(TEXT("-Stretch BLT flags NOT supported\r\n")));
if ((pBltParms->rop4 == 0xCCCC))// && !(pBltParms->bltFlags & BLT_TRANSPARENT))
{
//pBltParms->pBlt = GPETYPE CSCSrcCopy;
}
break;
}
DEBUGMSG(GPE_ZONE_BLT_LO, (TEXT("+SRCCOPY\r\n")));
if ((pBltParms->rop4 == 0xCCCC)) // && !(pBltParms->bltFlags & BLT_TRANSPARENT))
{
//pBltParms->pBlt = GPETYPE CSCSrcCopy;
}
if (rev() != 0xA0)
pBltParms->pBlt = GPETYPE &SMI::SrcCopy;
break;
default:
DEBUGMSG(GPE_ZONE_BLT_HI,
(TEXT("-rop4=0x%04X not supported\r\n"),
pBltParms->rop4));
break;
}
if (pBltParms->pBlt != &SMI::WrapBlt)
{
DispPerfType(DISPPERF_ACCEL_HARDWARE);
}
return(S_OK);
}
SCODE SMI::BltComplete(GPEBltParms *pBltParms)
{
DispPerfEnd(0);
return(S_OK);
}
SCODE SMI::FillRect(GPEBltParms *pBltParms)
{
RECTL rectl;
rectl.left = pBltParms->prclDst->left;
rectl.top = pBltParms->prclDst->top;
rectl.right = pBltParms->prclDst->right;
rectl.bottom = pBltParms->prclDst->bottom;
// This function is to calculate rectangle coordinate
// during rotation, otherwise it is a dummy function
RotateRectl(&rectl);
int dstX = rectl.left;
int dstY = rectl.top;
int dimX = rectl.right - dstX;
int dimY = rectl.bottom - dstY;
ulong bpp = 0x00130003;
ulong cmd = 0x8001;
ulong DPR = 0x100000;
int dstWidth = ((SMISurf*) (pBltParms->pDst))->AlignedWidth();
COLOR color = pBltParms->solidColor;
if (pBltParms->pLookup)
color = (pBltParms->pLookup)[color];
if (pBltParms->pConvert)
color = (pBltParms->pColorConverter->*(pBltParms->pConvert))(color);
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, 22);
INSERTCMD_STATUS(cmd_ptr,
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_DESTINATION_BASE),
((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_PITCH),
FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DESTINATION),
FIELD_INIT_VAL(DE_DESTINATION, X, dstX) |
FIELD_INIT_VAL(DE_DESTINATION, Y, dstY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DIMENSION),
FIELD_INIT_VAL(DE_DIMENSION, X, dimX) |
FIELD_INIT_VAL(DE_DIMENSION, Y_ET, dimY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_MONO_PATTERN_LOW),
FIELD_INIT_VAL(DE_MONO_PATTERN_LOW, PATTERN, 0xFFFFFFFF)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_MONO_PATTERN_HIGH),
FIELD_INIT_VAL(DE_MONO_PATTERN_HIGH, PATTERN, 0xFFFFFFFF)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_FOREGROUND),
FIELD_INIT_VAL(DE_FOREGROUND, COLOR, color)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_CONTROL),
FIELD_INIT(DE_CONTROL, STATUS, START) |
FIELD_INIT(DE_CONTROL, UPDATE_DESTINATION_X, DISABLE) |
FIELD_INIT(DE_CONTROL, QUICK_START, DISABLE) |
FIELD_INIT(DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
FIELD_INIT_VAL(DE_CONTROL, ROP, (pBltParms->rop4 & 0xFF))
);
INSERTCMD_FINISH(cmd_ptr, 0);
STOP_CI();
WAIT_CI_STOP();
INSERTCMD_NOP(last_finish_ptr);
last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
FLUSH_CMD();
START_CI("CMDList FillRect\r\n");
#else
WaitForNotBusy();
reg_DestXY = (dstX << 16) | dstY;
reg_DimXY = (dimX << 16) | dimY;
reg_FgColor = color;
reg_RowPitch = (dstWidth << 16) | dstWidth;
reg_WindowWidth = (dstWidth << 16) | dstWidth;
reg_PatternLow = 0xFFFFFFFF;
reg_PatternHigh = 0xFFFFFFFF;
POKE_32(DE_WINDOW_DESTINATION_BASE,
FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,
VgxSurfAddr(((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory())) |
0);
reg_ROPCommand = (pBltParms->rop4 & 0xFF)
| CMD_BITBLT
| MONO_PATTERN
| START_DRAWING_ENGINE;
#endif //CMDLIST
/*
switch(m_nScreenBpp/8)
{
case 1: bpp = 0x00030003; break;
case 2: bpp = 0x00130003; break;
case 3: bpp = 0x00340003; break;
case 4: bpp = 0x00230003; break;
}
WaitForFIFO(10);
WaitForNotBusy();
POKE_32(DPR+0x04, (dstX << 16) | dstY);
POKE_32(DPR+0x08, (dimX << 16) | dimY);
POKE_32(DPR+0x10, (dstWidth << 16) | dstWidth);
POKE_32(DPR+0x14, color);
POKE_32(DPR+0x1C, bpp);
POKE_32(DPR+0x34, 0xFFFFFFFF);
POKE_32(DPR+0x38, 0xFFFFFFFF);
POKE_32(DPR+0x3C, (dstWidth << 16) | dstWidth);
POKE_32(DPR+0x44, ((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory());
POKE_32(DPR+0x0c, (cmd << 16)| 0x800c);
*/
return(S_OK);
}
SCODE SMI::PatFill(GPEBltParms *pBltParms)
{
if (!(pBltParms->xPositive && pBltParms->yPositive))
return WrapBlt(pBltParms);
int patX = (pBltParms->pptlBrush)?((pBltParms->pptlBrush->x+0) & 7):0;
int patY = (pBltParms->pptlBrush)?((pBltParms->pptlBrush->y+0) & 7):0;
PUCHAR pvPattern = (PUCHAR)(pBltParms->pBrush->Buffer());
UCHAR ajPattern[8 * 8 * 4];
ULONG m_ulSrc;
ULONG Pattern;
ulong DPR = 0x100000;
if ((patX || patY) ||
(pBltParms->pBrush->Stride() != (int)m_nScreenBpp))
{
RotateBrush(pBltParms->pBrush, ajPattern, patX, patY);
pvPattern = ajPattern;
}
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, (6+m_nScreenBpp*2+16));
INSERTCMD_STATUS(cmd_ptr,
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_CONTROL),
FIELD_INIT(DE_CONTROL, PATTERN, COLOR)
);
INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ( m_nScreenBpp * 2) );
#else //CMDLIST
WaitForNotBusy();
// Dummy Code to make the function work correctly.
// Don't comment the following code reg_ROPCommand = COLOR_PATTERN;
// John Huang 03/14/2002
reg_ROPCommand = COLOR_PATTERN;
// memcpy(m_pMMIO + 0x0000, pvPattern, m_nScreenBpp * 8);
#endif // CMDLIST
for (UINT i = 0; i < m_nScreenBpp * 2; i++)
{
m_ulSrc = *(PULONG)pvPattern;
#ifdef CMDLIST
INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else //CMDLIST
*((PULONG) (m_pMMIO)+i) = m_ulSrc;
#endif //CMDLIST
pvPattern += 4;
}
int dstX = pBltParms->prclDst->left;
int dstY = pBltParms->prclDst->top;
int dimX = pBltParms->prclDst->right - dstX;
int dimY = pBltParms->prclDst->bottom - dstY;
int dstWidth = ((SMISurf*) (pBltParms->pDst))->AlignedWidth();
#ifdef CMDLIST
INSERTCMD_STATUS(cmd_ptr,
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_DESTINATION_BASE),
((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_PITCH),
FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DESTINATION),
FIELD_INIT_VAL(DE_DESTINATION, X, dstX) |
FIELD_INIT_VAL(DE_DESTINATION, Y, dstY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DIMENSION),
FIELD_INIT_VAL(DE_DIMENSION, X, dimX) |
FIELD_INIT_VAL(DE_DIMENSION, Y_ET, dimY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_CONTROL),
FIELD_INIT(DE_CONTROL, STATUS, START) |
FIELD_INIT(DE_CONTROL, UPDATE_DESTINATION_X, DISABLE) |
FIELD_INIT(DE_CONTROL, PATTERN, COLOR) |
FIELD_INIT(DE_CONTROL, QUICK_START, DISABLE) |
FIELD_INIT(DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
FIELD_INIT_VAL(DE_CONTROL, ROP, (pBltParms->rop4 & 0xFF))
);
INSERTCMD_FINISH(cmd_ptr, 0);
STOP_CI();
WAIT_CI_STOP();
INSERTCMD_NOP(last_finish_ptr);
last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
FLUSH_CMD();
START_CI("CMDList PatFill\r\n");
#else // CMDLIST
WaitForNotBusy();
reg_DestXY = (dstX << 16) | dstY;
reg_DimXY = (dimX << 16) | dimY;
// Problem is on the Xscale 64bit PCI system. Data is
// transfering in 64bit ( 2 (32bit) sets). The 1st set has byte enable & the 2nd set doesn't have.
// Which means 2 sets of DPR registers get written if the DPR register does not have byte enble
// status check. Our DPR34 and DPR38 registers does not have byte enble status check.
// Therefore we need to save and restore DPR34 and DPR38 every time we write to DPR30 & DPR3C.
// FW 7/26/05
Pattern = PEEK_32(DPR+0x38);
reg_RowPitch = (dstWidth << 16) | dstWidth;
reg_WindowWidth = (dstWidth << 16) | dstWidth;
reg_PatternHigh = Pattern;
POKE_32(DE_WINDOW_DESTINATION_BASE,
FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,
VgxSurfAddr(((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory())) |
0);
reg_ROPCommand = (pBltParms->rop4 & 0xFF)
| CMD_BITBLT
| COLOR_PATTERN
| START_DRAWING_ENGINE;
#endif // CMDLIST
return(S_OK);
}
void SMI::RotateBrush(GPESurf *pBrush, UCHAR *pjPattern, int patX, int patY)
{
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("RotateBrush\r\n")));
PUCHAR pjPatByte = (UCHAR *) pBrush->Buffer();
WaitForNotBusy();
switch (pBrush->Format())
{
case gpe8Bpp:
{
for (int y = 0; y < 8; y++)
{
PUCHAR pjBuffer = pjPattern + ((patY + y) & 7) * 8;
for (int x = 0; x < 8; x++)
{
pjBuffer[(patX + x) & 7] = pjPatByte[x];
}
pjPatByte += pBrush->Stride();
}
break;
}
case gpe16Bpp:
{
for (int y = 0; y < 8; y++)
{
PUSHORT pjBuffer = (PUSHORT) pjPattern + ((patY + y) & 7) * 8;
for (int x = 0; x < 8; x++)
{
pjBuffer[(patX + x) & 7] = ((PUSHORT) pjPatByte)[x];
}
pjPatByte += pBrush->Stride();
}
break;
}
case gpe32Bpp:
{
for (int y = 0; y < 8; y++)
{
PULONG pjBuffer = (PULONG) pjPattern + ((patY + y) & 7) * 8;
for (int x = 0; x < 8; x++)
{
pjBuffer[(patX + x) & 7] = ((PULONG) pjPatByte)[x];
}
pjPatByte += pBrush->Stride();
}
break;
}
}
}
SCODE SMI::MaskedImage(GPEBltParms *pBltParms)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -