📄 blt.cpp
字号:
ULONG xWidth, xDelta;
LONG xStep, xStepSign;
BOOL bStepChange;
if (pBltParms->xPositive && pBltParms->yPositive)
{
ulDir = TOP_TO_BOTTOM;
}
else
{
xSrc += xDim - 1;
ySrc += yDim - 1;
xDst += xDim - 1;
yDst += yDim - 1;
ulDir = BOTTOM_TO_TOP;
}
/* Comment out the 24 Bit support.
// Note: SM910 hardware requires some parameter multiple by 3 in 24 bpp
// mode, they are: source row pitch, dest row pitch, src x, src y,
// dest x, dest y, dim x (not dim y)
if (ppdev->ulBitCount == 24)
{
xSrc *= 3;
xDst *= 3;
xDim *= 3;
// SM910 bug: in 24 BPP when direction is bottom to up, source x and
// y add 2
if (ulDir == BOTTOM_TO_TOP)
{
xSrc += 2;
xDst += 2;
}
}
*/
if (pBltParms->bltFlags & BLT_TRANSPARENT)
{
color = pBltParms->solidColor;
if (pBltParms->pLookup)
color = (pBltParms->pLookup)[color];
if (pBltParms->pConvert)
color = (pBltParms->pColorConverter->*(pBltParms->pConvert))(color);
dwTransp = TRANSPARENCY_ENABLE
| SRC_CONTROL_TRANSP
| MATCH_PIXEL_TRANSP;
}
if (((pBltParms->rop4 & 0xFF) != 0xcc) &&
((xDim*(m_nScreenBpp/8)) >= 192) )
{ // 720 and 820 hw bugs.
// engine has garbage when width over 192 bytes
// cut to 192 bytes pre rect.
xWidth = 192/(m_nScreenBpp/8);
xStep = xWidth; // default value without overlap.
xStepSign = 1;
bStepChange = 0;
// if there is overlap in rectangle, make sure they are not cover each
// other when split into small rectangle.
if (ulDir == TOP_TO_BOTTOM)
{
if (xSrc<xDst)
{
//
// +-------s--+
// | D |
// +-------s--+ |
// | | | |
// | | | |
// | +------|---+
// | S |
// +----------+
//
xDelta = (xDst-xSrc)*(m_nScreenBpp/8);
if (xDelta < xWidth)
xWidth = xDelta;
xStep = -(LONG)xWidth;
xDst = xDst + xDim - xWidth;
xSrc = xSrc + xDim - xWidth;
xStepSign = -1; // going backward
bStepChange = 1;
}
else
{
//
// s----------+
// | D |
// | s----------+
// | | S | |
// | | | |
// +---|------+ |
// | |
// +----------+
//
xStep = xWidth;
}
}
else // bottom to top
{
if (xSrc>xDst)
{
// +----------+
// | S |
// +----------+ |
// | | | |
// | | | |
// | +--s---|---+
// | D |
// +--s-------+
//
xDelta = (xSrc - xDst)*(m_nScreenBpp/8);
if (xDelta < xWidth)
xWidth = xDelta;
xDst = xDst - xDim + xWidth;
xSrc = xSrc - xDim + xWidth;
xStep = xWidth;
bStepChange = 1;
}
else
{
// +----------+
// | S |
// | +----------+
// | | D | |
// | | | |
// +---|------+ |
// | |
// +----------+
//
xStep = -(long)xWidth;
xStepSign = -1;
}
}
while(1)
{
// BITBLT((xDst << 16) | yDst, (xSrc << 16) | ySrc, (xWidth << 16) | yDim,
// 0x80000000 | ulDir | ulRop);
{
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, 24);
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_PITCH),
FIELD_INIT_VAL(DE_PITCH, DESTINATION, wDst) |
FIELD_INIT_VAL(DE_PITCH, SOURCE, wSrc)
);
if (pBltParms->bltFlags & BLT_TRANSPARENT)
{
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_COLOR_COMPARE),
FIELD_INIT_VAL(DE_COLOR_COMPARE, COLOR, color)
);
}
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, wDst) |
FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, wSrc)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_SOURCE_BASE),
((SMISurf*) (pBltParms->pSrc))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_DESTINATION_BASE),
((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_SOURCE),
FIELD_INIT_VAL(DE_SOURCE, X_K1, xSrc) |
FIELD_INIT_VAL(DE_SOURCE, Y_K2, ySrc)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DESTINATION),
FIELD_INIT_VAL(DE_DESTINATION, X, xDst) |
FIELD_INIT_VAL(DE_DESTINATION, Y, yDst)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DIMENSION),
FIELD_INIT_VAL(DE_DIMENSION, X, xWidth) |
FIELD_INIT_VAL(DE_DIMENSION, Y_ET, yDim)
);
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, HOST, COLOR) |
FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
ulDir |
dwTransp |
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 BitBlt\r\n");
#else //------- CMDLIST --------
WaitForNotBusy();
reg_SourceXY = (xSrc << 16) | ySrc;
reg_DestXY = (xDst << 16) | yDst;
reg_DimXY = (xWidth << 16) | yDim;
reg_RowPitch = (wDst << 16) | wSrc;
reg_WindowWidth = (wDst << 16) | wSrc;
if (pBltParms->bltFlags & BLT_TRANSPARENT)
reg_ColorCmp = color;
POKE_32(DE_WINDOW_SOURCE_BASE,
FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, ADDRESS,
VgxSurfAddr(((SMISurf*) (pBltParms->pSrc))->OffsetInVideoMemory())) |
0);
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
| ulDir
| dwTransp
| START_DRAWING_ENGINE;
#endif //CMDLIST
}
xDim-=xWidth;
if((long)xDim <= 0)
break;
if(xWidth>(ULONG)xDim)
{
xWidth=xDim;
if (bStepChange)
{
xStep=(LONG)xWidth*xStepSign;
}
}
xSrc+=xStep;
xDst+=xStep;
}
}
else
{
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, 24);
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_PITCH),
FIELD_INIT_VAL(DE_PITCH, DESTINATION, wDst) |
FIELD_INIT_VAL(DE_PITCH, SOURCE, wSrc)
);
if (pBltParms->bltFlags & BLT_TRANSPARENT)
{
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_COLOR_COMPARE),
FIELD_INIT_VAL(DE_COLOR_COMPARE, COLOR, color)
);
}
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, wDst) |
FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, wSrc)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_SOURCE_BASE),
((SMISurf*) (pBltParms->pSrc))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_DESTINATION_BASE),
((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_SOURCE),
FIELD_INIT_VAL(DE_SOURCE, X_K1, xSrc) |
FIELD_INIT_VAL(DE_SOURCE, Y_K2, ySrc)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DESTINATION),
FIELD_INIT_VAL(DE_DESTINATION, X, xDst) |
FIELD_INIT_VAL(DE_DESTINATION, Y, yDst)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DIMENSION),
FIELD_INIT_VAL(DE_DIMENSION, X, xDim) |
FIELD_INIT_VAL(DE_DIMENSION, Y_ET, yDim)
);
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, HOST, COLOR) |
FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
ulDir |
dwTransp |
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 SrcCopy\r\n");
#else //------- CMDLIST --------
WaitForNotBusy();
reg_SourceXY = (xSrc << 16) | ySrc;
reg_DestXY = (xDst << 16) | yDst;
reg_DimXY = (xDim << 16) | yDim;
reg_RowPitch = (wDst << 16) | wSrc;
reg_WindowWidth = (wDst << 16) | wSrc;
if (pBltParms->bltFlags & BLT_TRANSPARENT)
reg_ColorCmp = color;
POKE_32(DE_WINDOW_SOURCE_BASE,
FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, ADDRESS,
VgxSurfAddr(((SMISurf*) (pBltParms->pSrc))->OffsetInVideoMemory())) |
0);
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
| ulDir
| dwTransp
| START_DRAWING_ENGINE;
#endif //CMDLIST
}
return (S_OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -