📄 blt.cpp
字号:
ULONG m_ulSrc;
int dstX = pBltParms->prclDst->left;
int dstY = pBltParms->prclDst->top;
int dimX = pBltParms->prclDst->right - dstX;
int dimXSave = dimX;
int dimY = pBltParms->prclDst->bottom - dstY;
int i=0,j=0;
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);
PUCHAR patBuffer = (PUCHAR) ((SMISurf *) (pBltParms->pMask))->Buffer();
int patStride = ((SMISurf *) (pBltParms->pMask))->Stride();
int patWidth = abs(patStride) * 8;
int patLeft = pBltParms->prclMask->left;
int patTop = pBltParms->prclMask->top;
int patBottom = pBltParms->prclMask->bottom;
int offLeft = (patLeft & 0x07);
patBuffer += patTop * patStride + patLeft / 8;
int BytesPerScan = (dimXSave + offLeft + 7) / 8;
int Bytes4PerScan = (BytesPerScan + 3) & ~3;
int BytesRemain = BytesPerScan & 3;
int nLong = BytesPerScan & ~3;
ULONG Pattern;
ulong DPR = 0x100000;
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, 24+(Bytes4PerScan/4+1)*dimY*2);
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_SOURCE),
FIELD_INIT_VAL(DE_SOURCE, X_K1, offLeft) |
FIELD_INIT_VAL(DE_SOURCE, Y_K2, patTop)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth) |
FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, 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) |
FIELD_INIT_VAL(DE_PITCH, SOURCE, 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_FOREGROUND),
FIELD_INIT_VAL(DE_FOREGROUND, COLOR, color)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_BACKGROUND),
FIELD_INIT_VAL(DE_BACKGROUND, COLOR, ~color)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_COLOR_COMPARE),
FIELD_INIT_VAL(DE_COLOR_COMPARE, 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, HOST, MONO) |
FIELD_INIT(DE_CONTROL, COMMAND, HOST_WRITE) |
FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP2) |
FIELD_INIT(DE_CONTROL, TRANSPARENCY_MATCH, OPAQUE) |
FIELD_INIT(DE_CONTROL, TRANSPARENCY_SELECT, SOURCE) |
FIELD_INIT(DE_CONTROL, TRANSPARANCY, ENABLE) |
FIELD_INIT_VAL(DE_CONTROL, ROP, 0x0C)
);
#else //------- CMDLIST --------
WaitForNotBusy();
reg_SourceXY = (offLeft << 16) | patTop;
reg_DestXY = (dstX << 16) | dstY;
reg_DimXY = (dimX << 16) | dimY;
reg_FgColor = color;
reg_BgColor = ~color;
reg_ColorCmp = color;
// 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 = 0x0C
| USE_ROP2
| CMD_HOSTBLT_WRITE
| SOURCE_IS_MONO
| TRANSPARENCY_ENABLE
| SRC_CONTROL_TRANSP
| MATCH_PIXEL_OPAQUE
| START_DRAWING_ENGINE;
#endif //CMDLIST
// Don't change the following code.
// I already fixed the text corruption in ARM, strongARM and SHx platforms.
// John 2/27/2002
if (patStride < 0)
{
if (nLong)
{
#ifdef CMDLIST
INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ( nLong/4) );
#endif
for (i=0;i<(nLong/4);i++)
{
memcpy(&m_ulSrc, (patBuffer + i*4), 4);
#ifdef CMDLIST
INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else //CMDLIST
*(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
}
#ifdef CMDLIST
INSERTCMD_PADQWORD(cmd_ptr, ( nLong/4) );
#endif
}
if (BytesRemain)
{
memcpy(&m_ulSrc, patBuffer + nLong, BytesRemain);
#ifdef CMDLIST
INSERTCMD_LOADREG_D(cmd_ptr, REG(DE_DATAPORT), m_ulSrc );
#else //CMDLIST
*(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
}
patBuffer += patStride;
}
#ifdef CMDLIST
if (dimY>1) //aviod INSERTCMD_LOADREG_E() with counter 0 which cause hang
INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ((dimY-1)*(Bytes4PerScan/4)) );
#endif
for (i = 1; i < dimY; i++)
{
for (j=0;j<(Bytes4PerScan/4);j++)
{
memcpy(&m_ulSrc, patBuffer+j*4, 4);
#ifdef CMDLIST
INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else //CMDLIST
*(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
}
patBuffer += patStride;
}
#ifdef CMDLIST
INSERTCMD_PADQWORD(cmd_ptr, ((dimY-1)*(Bytes4PerScan/4)) );
#endif
if (patStride > 0)
{
if (nLong)
{
#ifdef CMDLIST
INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ( nLong/4) );
#endif
for (i=0;i<(nLong/4);i++)
{
memcpy(&m_ulSrc, (patBuffer + i*4), 4);
#ifdef CMDLIST
INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else //CMDLIST
*(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
}
#ifdef CMDLIST
INSERTCMD_PADQWORD(cmd_ptr, ( nLong/4) );
#endif
}
if (BytesRemain)
{
memcpy(&m_ulSrc, patBuffer + nLong, BytesRemain);
#ifdef CMDLIST
INSERTCMD_LOADREG_D(cmd_ptr, REG(DE_DATAPORT), m_ulSrc );
#else //CMDLIST
*(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
}
}
#ifdef CMDLIST
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 TextOut\r\n");
#endif //CMDLIST
return(S_OK);
}
SCODE SMI::DestBlt(GPEBltParms *pBltParms)
{
if (pBltParms->rop4 == 0xAAAA)
return(S_OK);
RECTL rectl;
ULONG Pattern;
ulong DPR = 0x100000;
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;
int dstWidth = ((SMISurf*) (pBltParms->pDst))->AlignedWidth();
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, 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_PITCH),
FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth) |
FIELD_INIT_VAL(DE_PITCH, SOURCE, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth) |
FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_DESTINATION_BASE),
((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
);
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, 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 DestBlt\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
| START_DRAWING_ENGINE;
#endif //CMDLIST
return(S_OK);
}
struct BLTRECT
{
RECTL rDest;
RECTL rSrc;
RECTL rOrigDest;
RECTL rOrigSrc;
};
SCODE SMI::SrcCopyHost(GPEBltParms *pBltParms)
{
// RETAILMSG(1, (_T("SMI:: +SrcCopy\r\n")));
BYTE abyRemain[8] = {0,0,0,0,0,0,0,0};
int i,j;
ULONG m_ulSrc;
DWORD dwTransp = 0;
COLOR color;
ULONG Pattern;
ulong DPR = 0x100000;
int srcX = pBltParms->prclSrc->left;
int srcY = pBltParms->prclSrc->top;
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();
PUCHAR pSrcBuffer = (PUCHAR) pBltParms->pSrc->Buffer();
int srcStride = pBltParms->pSrc->Stride();
int srcBpp = EGPEFormatToBpp[pBltParms->pSrc->Format()];
pSrcBuffer += srcY * srcStride + srcX * srcBpp / 8;
int BytesPerScan = dimX * srcBpp / 8;
int Bytes8PerScan = (BytesPerScan + 7) & ~7;
int BytesRemain = BytesPerScan & 7;
int nLong = BytesPerScan & ~7;
if (pBltParms->bltFlags & BLT_TRANSPARENT)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -