📄 halsurf.cpp
字号:
}
// WaitForVSync();
os.dwDstX1 = pd->lXPos;
os.dwDstY1 = pd->lYPos;
//reg_FPRLeftTop = (pd->lXPos & 0xFFFF) | ((pd->lYPos & 0xFFFF) << 16);
//reg_FPRRightBottom = ((pd->lXPos+os.dwDstW-1) & 0xFFFF) | (((pd->lYPos+os.dwDstH-1) & 0xFFFF) << 16);
POKE_32(VIDEO_PLANE_TL,
FIELD_VALUE(0, VIDEO_PLANE_TL, TOP, pd->lYPos) |
FIELD_VALUE(0, VIDEO_PLANE_TL, LEFT, pd->lXPos) |
0);
POKE_32(VIDEO_PLANE_BR,
FIELD_VALUE(0, VIDEO_PLANE_BR, BOTTOM, (pd->lYPos+os.dwDstH-1)) |
FIELD_VALUE(0, VIDEO_PLANE_BR, RIGHT, (pd->lXPos+os.dwDstW-1)) |
0);
pd->ddRVal = DD_OK;
return DDHAL_DRIVER_HANDLED;
}
DWORD SMI::CSCStretchBlt (LPDDHAL_BLTDATA pd)
{
//DWORD iSrcBPP, iDestBPP;
DWORD origSrcDimX, origSrcDimY, origDestDimX, origDestDimY;
DWORD ScaleXn, ScaleXd, ScaleYn, ScaleYd;
DWORD SrcTn, SrcTd, SrcLn, SrcLd;
DWORD SrcRn, SrcRd, SrcBn, SrcBd;
DWORD SrcDimX, SrcDimY, DestDimX, DestDimY;
DWORD SrcFormat, DstFormat, HFilter, VFilter, byOrder;
DWORD SrcYBase, SrcUBase, SrcVBase, SrcYPitch, SrcUVPitch;
DWORD DestBase, DestPitch, DestHeight, DestWidth, DestBpp;
DWORD SrcBpp, SrcLnAdd = 0;
/* Following calculation are not correct for UV base & pitch for YUV420 & YUV420I format*/
SrcYBase = DDGPESurf::GetDDGPESurf(pd->lpDDSrcSurface)->OffsetInVideoMemory();
SrcUBase = DDGPESurf::GetDDGPESurf(pd->lpDDSrcSurface)->OffsetInVideoMemory();
SrcVBase = DDGPESurf::GetDDGPESurf(pd->lpDDSrcSurface)->OffsetInVideoMemory();
DestBase = DDGPESurf::GetDDGPESurf(pd->lpDDDestSurface)->OffsetInVideoMemory();
SrcYPitch = pd->lpDDSrcSurface->lpGbl->lPitch;
SrcUVPitch = pd->lpDDSrcSurface->lpGbl->lPitch;
DestPitch = pd->lpDDDestSurface->lpGbl->lPitch;
DestHeight = pd->lpDDDestSurface->lpGbl->wHeight;
DestWidth = pd->lpDDDestSurface->lpGbl->wWidth;
DestBpp = DestPitch/DestWidth;
SrcFormat = 0;
byOrder = 0;
if ((pd->rOrigSrc.right == 0) &&
(pd->rOrigSrc.left == 0) &&
(pd->rOrigSrc.bottom == 0) &&
(pd->rOrigSrc.top == 0))
{
pd->rOrigSrc = pd->rSrc;
}
if ((pd->rOrigDest.right == 0) &&
(pd->rOrigDest.left == 0) &&
(pd->rOrigDest.bottom == 0) &&
(pd->rOrigDest.top == 0))
{
pd->rOrigDest = pd->rDest;
}
if (pd->lpDDSrcSurface->dwFlags & DDRAWISURF_HASPIXELFORMAT)
{
LPDDPIXELFORMAT lpddpf = &pd->lpDDSrcSurface->lpGbl->ddpfSurface;
if(lpddpf->dwFlags & DDPF_FOURCC)
{
if(lpddpf->dwFourCC == FOURCC_YUYV422)
{
//DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - YUYV422 surface\r\n") ));
SrcFormat = CSC_CONTROL_SOURCE_FORMAT_YUV422;
byOrder = CSC_CONTROL_BYTE_ORDER_YUYV;
SrcBpp = 16/8; // 2by-p-p
SrcYBase += (pd->rOrigSrc.left * SrcBpp) + (pd->rOrigSrc.top * SrcYPitch);
SrcLnAdd = (SrcYBase & 0xF) / SrcBpp;
}
else if(lpddpf->dwFourCC == FOURCC_YUY2422 )
{
//DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - YUY2422 surface\r\n") ));
SrcFormat = CSC_CONTROL_SOURCE_FORMAT_YUV422;
byOrder = CSC_CONTROL_BYTE_ORDER_YUYV;
SrcBpp = 16/8; // 2by-p-p
SrcYBase += (pd->rOrigSrc.left * SrcBpp) + (pd->rOrigSrc.top * SrcYPitch);
SrcLnAdd = (SrcYBase & 0xF) / SrcBpp;
}
else if(lpddpf->dwFourCC == FOURCC_UYVY422 )
{
//DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - YUY2422 surface\r\n") ));
SrcFormat = CSC_CONTROL_SOURCE_FORMAT_YUV422;
byOrder = CSC_CONTROL_BYTE_ORDER_UYVY;
SrcBpp = 16/8; // 2by-p-p
SrcYBase += (pd->rOrigSrc.left * SrcBpp) + (pd->rOrigSrc.top * SrcYPitch);
SrcLnAdd = (SrcYBase & 0xF) / SrcBpp;
}
else
{
DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported FOURCC %08x\r\n"),
lpddpf->dwFourCC ));
return DDERR_UNSUPPORTEDFORMAT;
}
}
else if (lpddpf->dwFlags & DDPF_RGB )
{
// Assuming we can only handle lpddpf->dwRGBBitCount divisible by 8
SrcBpp = lpddpf->dwRGBBitCount/8;
SrcYBase += (pd->rOrigSrc.left * SrcBpp) + (pd->rOrigSrc.top * SrcYPitch);
if( lpddpf->dwRGBBitCount == 16 )
{
if( lpddpf->dwRGBAlphaBitMask == 0x0000 &&
lpddpf->dwRBitMask == 0xF800 )
{
//DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - 565 surface detected\r\n") ));
SrcFormat = CSC_CONTROL_SOURCE_FORMAT_RGB565;
}
else
{
DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported 16-bit format\r\n") ));
return DDERR_UNSUPPORTEDFORMAT;
}
}
else if( lpddpf->dwRGBBitCount == 32 )
{
if( lpddpf->dwRGBAlphaBitMask == 0x00000000 &&
lpddpf->dwRBitMask == 0x00FF0000 )
{
//DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - 8888 surface detected\r\n") ));
SrcFormat = CSC_CONTROL_SOURCE_FORMAT_RGB8888;
}
else
{
DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported 32-bit format\r\n") ));
return DDERR_UNSUPPORTEDFORMAT;
}
}
else
{
DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported bit-depth (%d)\r\n"),
lpddpf->dwRGBBitCount));
return DDERR_UNSUPPORTEDFORMAT;
}
}
else
{
DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported format\r\n")));
return DDERR_UNSUPPORTEDFORMAT;
}
}
else
{
switch (m_nScreenBpp)
{
case 16:
SrcFormat = CSC_CONTROL_SOURCE_FORMAT_RGB565;
break;
case 32:
SrcFormat = CSC_CONTROL_SOURCE_FORMAT_RGB8888;
break;
default:
DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported screen bit-depth (%d)\r\n"),
m_nScreenBpp));
return DDERR_UNSUPPORTEDFORMAT;
}
}
switch (DestBpp)
{
case 2:
DstFormat = CSC_CONTROL_DESTINATION_FORMAT_RGB565;
break;
case 4:
DstFormat = CSC_CONTROL_DESTINATION_FORMAT_RGB8888;
break;
default:
DEBUGMSG(1, (TEXT("ERROR! SMI::CSCStretchBlt() - CSC Dst Format Unsupported - iDestBpp = %d\r\n"),DestBpp));
return DDERR_UNSUPPORTEDFORMAT;
break;
}
HFilter = CSC_CONTROL_HORIZONTAL_FILTER_ENABLE;
VFilter = CSC_CONTROL_VERTICAL_FILTER_ENABLE;
origSrcDimX = pd->rOrigSrc.right - pd->rOrigSrc.left;
origSrcDimY = pd->rOrigSrc.bottom - pd->rOrigSrc.top;
origDestDimX = pd->rOrigDest.right - pd->rOrigDest.left;
origDestDimY = pd->rOrigDest.bottom - pd->rOrigDest.top;
ScaleXn = (origSrcDimX-1)/(origDestDimX-1);
ScaleXd = ((origSrcDimX-1)<<13)/(origDestDimX-1) - (ScaleXn<<13);
ScaleYn = (origSrcDimY-1)/(origDestDimY-1);
ScaleYd = ((origSrcDimY-1)<<13)/(origDestDimY-1) - (ScaleYn<<13);
SrcLn = (pd->rDest.left - pd->rOrigDest.left)*(origSrcDimX-1)/(origDestDimX-1);
SrcLd = ((pd->rDest.left - pd->rOrigDest.left)<<13)*(origSrcDimX-1)/(origDestDimX-1) - (SrcLn<<13);
SrcRn = (pd->rDest.right - 1 - pd->rOrigDest.left)*(origSrcDimX-1)/(origDestDimX-1);
SrcRd = ((pd->rDest.right - 1 - pd->rOrigDest.left)<<13)*(origSrcDimX-1)/(origDestDimX-1) - (SrcRn<<13);
SrcTn = (pd->rDest.top - pd->rOrigDest.top)*(origSrcDimY-1)/(origDestDimY-1);
SrcTd = ((pd->rDest.top - pd->rOrigDest.top)<<13)*(origSrcDimY-1)/(origDestDimY-1) - (SrcTn<<13);
SrcBn = (pd->rDest.bottom - 1 - pd->rOrigDest.top)*(origSrcDimY-1)/(origDestDimY-1);
SrcBd = ((pd->rDest.bottom - 1 - pd->rOrigDest.top)<<13)*(origSrcDimY-1)/(origDestDimY-1) - (SrcBn<<13);
SrcDimX = (SrcRd == 0) ? (SrcRn - SrcLn + 1) : (SrcRn - SrcLn + 2);
SrcDimY = (SrcBd == 0) ? (SrcBn - SrcTn + 1) : (SrcBn - SrcTn + 2);
DestDimX = pd->rDest.right - pd->rDest.left;
DestDimY = pd->rDest.bottom - pd->rDest.top;
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, 30);
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, CSC_CONSTANTS,
FIELD_VALUE(0, CSC_CONSTANTS, Y, 0) |
FIELD_VALUE(0, CSC_CONSTANTS, R, 0) |
FIELD_VALUE(0, CSC_CONSTANTS, G, 0) |
FIELD_VALUE(0, CSC_CONSTANTS, B, 0) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_Y_SOURCE_X,
FIELD_VALUE(0, CSC_Y_SOURCE_X, INTEGER, SrcLn + SrcLnAdd) |
FIELD_VALUE(0, CSC_Y_SOURCE_X, FRACTION, SrcLd) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_Y_SOURCE_Y,
FIELD_VALUE(0, CSC_Y_SOURCE_Y, INTEGER, SrcTn) |
FIELD_VALUE(0, CSC_Y_SOURCE_Y, FRACTION, SrcTd) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_SOURCE_DIMENSION,
FIELD_VALUE(0, CSC_SOURCE_DIMENSION, X, SrcDimX) |
FIELD_VALUE(0, CSC_SOURCE_DIMENSION, Y, SrcDimY) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_SOURCE_PITCH,
FIELD_VALUE(0, CSC_SOURCE_PITCH, Y, SrcYPitch >> 4) |
FIELD_VALUE(0, CSC_SOURCE_PITCH, UV, SrcUVPitch >> 4) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_DESTINATION,
FIELD_SET(0, CSC_DESTINATION, WRAP, DISABLE) |
FIELD_VALUE(0, CSC_DESTINATION, X, pd->rDest.left) |
FIELD_VALUE(0, CSC_DESTINATION, Y, pd->rDest.top) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_DESTINATION_DIMENSION,
FIELD_VALUE(0, CSC_DESTINATION_DIMENSION, X, DestDimX) |
FIELD_VALUE(0, CSC_DESTINATION_DIMENSION, Y, DestDimY) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_DESTINATION_PITCH,
FIELD_VALUE(0, CSC_DESTINATION_PITCH, X, DestPitch >> 4) |
FIELD_VALUE(0, CSC_DESTINATION_PITCH, Y, DestHeight) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_SCALE_FACTOR,
FIELD_VALUE(0, CSC_SCALE_FACTOR, HORIZONTAL, (ScaleXn<<13 | ScaleXd)) |
FIELD_VALUE(0, CSC_SCALE_FACTOR, VERTICAL, (ScaleYn<<13 | ScaleYd)) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_Y_SOURCE_BASE,
FIELD_SET(0, CSC_Y_SOURCE_BASE, EXT, LOCAL) |
FIELD_VALUE(0, CSC_Y_SOURCE_BASE, ADDRESS, SrcYBase) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_U_SOURCE_BASE,
FIELD_SET(0, CSC_U_SOURCE_BASE, EXT, LOCAL) |
FIELD_VALUE(0, CSC_U_SOURCE_BASE, ADDRESS, SrcUBase) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_V_SOURCE_BASE,
FIELD_SET(0, CSC_V_SOURCE_BASE, EXT, LOCAL) |
FIELD_VALUE(0, CSC_V_SOURCE_BASE, ADDRESS, SrcVBase) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_DESTINATION_BASE,
FIELD_SET(0, CSC_DESTINATION_BASE, EXT, LOCAL) |
FIELD_VALUE(0, CSC_DESTINATION_BASE, ADDRESS, DestBase) |
0);
INSERTCMD_LOADREG_D(cmd_ptr, CSC_CONTROL,
FIELD_SET(0, CSC_CONTROL, STATUS, START) |
FIELD_VALUE(0, CSC_CONTROL, SOURCE_FORMAT, SrcFormat) |
FIELD_VALUE(0, CSC_CONTROL, DESTINATION_FORMAT, DstFormat) |
FIELD_VALUE(0, CSC_CONTROL, HORIZONTAL_FILTER, HFilter) |
FIELD_VALUE(0, CSC_CONTROL, VERTICAL_FILTER, VFilter) |
FIELD_VALUE(0, CSC_CONTROL, BYTE_ORDER, byOrder) |
0);
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("CSCStretchBlt\r\n");
#else //------- CMDLIST --------
WaitForNotBusy();
POKE_32(CSC_CONSTANTS,
FIELD_VALUE(0, CSC_CONSTANTS, Y, 0) |
FIELD_VALUE(0, CSC_CONSTANTS, R, 0) |
FIELD_VALUE(0, CSC_CONSTANTS, G, 0) |
FIELD_VALUE(0, CSC_CONSTANTS, B, 0) |
0);
POKE_32(CSC_Y_SOURCE_X,
FIELD_VALUE(0, CSC_Y_SOURCE_X, INTEGER, SrcLn + SrcLnAdd) |
FIELD_VALUE(0, CSC_Y_SOURCE_X, FRACTION, SrcLd) |
0);
POKE_32(CSC_Y_SOURCE_Y,
FIELD_VALUE(0, CSC_Y_SOURCE_Y, INTEGER, SrcTn) |
FIELD_VALUE(0, CSC_Y_SOURCE_Y, FRACTION, SrcTd) |
0);
POKE_32(CSC_SOURCE_DIMENSION,
FIELD_VALUE(0, CSC_SOURCE_DIMENSION, X, SrcDimX) |
FIELD_VALUE(0, CSC_SOURCE_DIMENSION, Y, SrcDimY) |
0);
POKE_32(CSC_SOURCE_PITCH,
FIELD_VALUE(0, CSC_SOURCE_PITCH, Y, SrcYPitch >> 4) |
FIELD_VALUE(0, CSC_SOURCE_PITCH, UV, SrcUVPitch >> 4) |
0);
POKE_32(CSC_DESTINATION,
FIELD_SET(0, CSC_DESTINATION, WRAP, DISABLE) |
FIELD_VALUE(0, CSC_DESTINATION, X, pd->rDest.left) |
FIELD_VALUE(0, CSC_DESTINATION, Y, pd->rDest.top) |
0);
POKE_32(CSC_DESTINATION_DIMENSION,
FIELD_VALUE(0, CSC_DESTINATION_DIMENSION, X, DestDimX) |
FIELD_VALUE(0, CSC_DESTINATION_DIMENSION, Y, DestDimY) |
0);
POKE_32(CSC_DESTINATION_PITCH,
FIELD_VALUE(0, CSC_DESTINATION_PITCH, X, DestPitch >> 4) |
FIELD_VALUE(0, CSC_DESTINATION_PITCH, Y, DestHeight) |
0);
POKE_32(CSC_SCALE_FACTOR,
FIELD_VALUE(0, CSC_SCALE_FACTOR, HORIZONTAL, (ScaleXn<<13 | ScaleXd)) |
FIELD_VALUE(0, CSC_SCALE_FACTOR, VERTICAL, (ScaleYn<<13 | ScaleYd)) |
0);
POKE_32(CSC_Y_SOURCE_BASE,
FIELD_VALUE(0, CSC_Y_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, CSC_Y_SOURCE_BASE, ADDRESS, VgxSurfAddr(SrcYBase)) |
0);
POKE_32(CSC_U_SOURCE_BASE,
FIELD_VALUE(0, CSC_U_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, CSC_U_SOURCE_BASE, ADDRESS, VgxSurfAddr(SrcUBase)) |
0);
POKE_32(CSC_V_SOURCE_BASE,
FIELD_VALUE(0, CSC_V_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, CSC_V_SOURCE_BASE, ADDRESS, VgxSurfAddr(SrcVBase)) |
0);
POKE_32(CSC_DESTINATION_BASE,
FIELD_VALUE(0, CSC_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, CSC_DESTINATION_BASE, ADDRESS, VgxSurfAddr(DestBase)) |
0);
POKE_32(CSC_CONTROL,
FIELD_SET(0, CSC_CONTROL, STATUS, START) |
FIELD_VALUE(0, CSC_CONTROL, SOURCE_FORMAT, SrcFormat) |
FIELD_VALUE(0, CSC_CONTROL, DESTINATION_FORMAT, DstFormat) |
FIELD_VALUE(0, CSC_CONTROL, HORIZONTAL_FILTER, HFilter) |
FIELD_VALUE(0, CSC_CONTROL, VERTICAL_FILTER, VFilter) |
FIELD_VALUE(0, CSC_CONTROL, BYTE_ORDER, byOrder) |
0);
#endif //CMDLIST
return S_OK;
}
// Set video vertical mode
void SMI::Video_SetVerticalMode(int mode)
{
if (mode == INTERPOLATE)
{
POKE_32(VIDEO_DISPLAY_CTRL,
FIELD_SET(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, VERTICAL_MODE, INTERPOLATE));
}
else if (mode == REPLICATE)
{
POKE_32(VIDEO_DISPLAY_CTRL,
FIELD_SET(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, VERTICAL_MODE, REPLICATE));
}
}
// Set video horizontal mode
void SMI::Video_SetHorizontalMode(int mode)
{
if (mode == INTERPOLATE)
{
POKE_32(VIDEO_DISPLAY_CTRL,
FIELD_SET(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, HORIZONTAL_MODE, INTERPOLATE));
}
else if (mode == REPLICATE)
{
POKE_32(VIDEO_DISPLAY_CTRL,
FIELD_SET(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, HORIZONTAL_MODE, REPLICATE));
}
}
#endif // DD_ENABLE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -