📄 bltfuncs.cpp
字号:
#ifdef LOCAL_MEMORY_SELF_REFRESH
SysLocalMemoryEnable(m_sDevData.psDevInfoKM);
#endif // LOCAL_MEMORY_SELF_REFRESH
DispPerfSlaveport (TRUE);
if (psParms->prclClip)
{
prclClip = psParms->prclClip;
WriteClipRect((MBXSurf *)psParms->pDst, psParms->prclClip);
ulClipCount++;
}
SetDstSurf(psParms);
if (m_ulSurfsPresent & MASK_PRESENT)
{
SetMaskSurf(psParms);
}
if (m_ulSurfsPresent & PAT_PRESENT)
{
SetPatHotspot(psParms);
}
rclSrc = *psParms->prclSrc;
#ifdef ROTATE_ENABLE
if (m_bMapToUnrotated)
{
RotateRectl(&rclSrc);
}
#endif /* #ifdef ROTATE_ENABLE */
#ifdef PDUMP
PDumpScript("-- SRC surface attributes");
#endif
if ((eDstFmt == gpe8Bpp) && /* 332RGB */
(eSrcFmt == gpe8Bpp) && /* 332RGB or PAL */
(psParms->pLookup == NULL)) /* treat as 332RGB */
{
ulHWFormat = MBX2D_SRC_332RGB;
}
else
{
ulHWFormat = EGPEFormatToSrcHW[eSrcFmt];
if ((psParms->pConvert) && (eSrcFmt == gpe16Bpp))
{
/* Differentiate between 565/555 source format. */
ULONG ulResult = (psParms->pColorConverter->*(psParms->pConvert))(0x021F);
if (((eDstFmt == gpe16Bpp) && (ulResult != 0x0000021F)) ||
(ulResult >= 0x000080F8))
{
ulHWFormat = MBX2D_SRC_555RGB;
}
}
}
#ifdef PDUMP
PDumpScript("-- SRC surface");
#endif
SlavePortWrite(MBX2D_SRC_CTRL_BH
| MBX2D_SRC_FBMEM
| ulHWFormat
| ((psParms->pSrc->Stride()<<MBX2D_SRC_STRIDE_SHIFT)
& MBX2D_SRC_STRIDE_MASK) );
SlavePortWrite( ((((MBXSurf*)psParms->pSrc)->GetPhysAddr()
>> MBX2D_SRC_ADDR_ALIGNSHIFT)
<< MBX2D_SRC_ADDR_SHIFT)
& MBX2D_SRC_ADDR_MASK );
/* specify the starting pixel coordinate */
SlavePortWrite(MBX2D_SRC_OFF_BH
| ((rclSrc.left<<MBX2D_SRCOFF_XSTART_SHIFT) & MBX2D_SRCOFF_XSTART_MASK)
| ((rclSrc.top<<MBX2D_SRCOFF_YSTART_SHIFT) & MBX2D_SRCOFF_YSTART_MASK) );
if (psParms->bltFlags & BLT_TRANSPARENT)
{
SlavePortWrite( MBX2D_BLIT_BH
| 0xCCCC /* SRCCOPY */
| MBX2D_USE_PAT
| MBX2D_SRCCK_REJECT
| m_ulBltRotationHw
| (ulClipCount ? MBX2D_CLIP_ENABLE : 0)
| OverlapTest(psParms) );
}
else
{
/* let's do the blit */
SlavePortWrite( MBX2D_BLIT_BH
| (psParms->rop4 & MBX2D_ROP4_MASK)
| ((psParms->pBrush == NULL) ? MBX2D_USE_FILL : MBX2D_USE_PAT)
| m_ulBltRotationHw
| (ulClipCount ? MBX2D_CLIP_ENABLE : 0)
| OverlapTest(psParms) );
/* if we've got a fill or clipping send this word */
if ( psParms->pBrush == NULL )
{
SlavePortWrite( psParms->solidColor & MBX2D_FILLCOLOUR_MASK);
}
}
/* Write Destination rectangle to the Slave Port */
WriteDestRect((MBXSurf *)psParms->pDst, psParms->prclDst);
SlavePortFencedWrites();
DispPerfSlaveport (FALSE);
#ifdef SW_SIM
ProcessBltData();
InitBlt();
#endif /* #ifdef SW_SIM */
#if HW_VERIFY
if (ulClipCount)
{
m_clHwVer.UpdateClipRegions((PRECT)prclClip);
}
#endif
m_eHWBltState = BLT_InContProgress;
#ifdef LOCAL_MEMORY_SELF_REFRESH
SysLocalMemoryDisable(m_sDevData.psDevInfoKM);
#endif // LOCAL_MEMORY_SELF_REFRESH
#ifdef ENABLE_2D_PROFILE
profile_end_blt_clip_rect(m_sActiveNode);
#endif
return (S_OK);
} /* SrcBlt */
/*****************************************************************************
FUNCTION : PatBlt
PURPOSE : Pat Blitting
PARAMETERS : GPEBltParms *psParms
RETURN : SC_OK or SC_FALSE
*****************************************************************************/
SCODE MBX::PatBlt ( GPEBltParms *psParms )
{
DPFX(PVR_ZONE_BLT,(L"PatBlt: rop4=%04X", psParms->rop4));
#ifdef ENABLE_2D_PROFILE
profile_start_blt_clip_rect(m_sActiveNode);
#endif
ASSERT (psParms->prclClip == NULL);
#ifdef LOCAL_MEMORY_SELF_REFRESH
SysLocalMemoryEnable(m_sDevData.psDevInfoKM);
#endif // LOCAL_MEMORY_SELF_REFRESH
DispPerfSlaveport (TRUE);
SetDstSurf(psParms);
SetPatHotspot(psParms);
if (m_ulSurfsPresent & MASK_PRESENT)
{
SetMaskSurf(psParms);
}
#ifdef PDUMP
PDumpScript("-- Pat Blit Command");
#endif
/* let's do the blit */
SlavePortWrite( MBX2D_BLIT_BH
| (psParms->rop4 & MBX2D_ROP4_MASK)
| MBX2D_USE_PAT
| m_ulBltRotationHw );
/* Write Destination rectangle to the Slave Port */
WriteDestRect((MBXSurf *)psParms->pDst, psParms->prclDst);
SlavePortFencedWrites();
DispPerfSlaveport (FALSE);
#ifdef SW_SIM
ProcessBltData();
InitBlt();
#endif /* #ifdef SW_SIM */
m_eHWBltState = BLT_InContProgress;
#ifdef LOCAL_MEMORY_SELF_REFRESH
SysLocalMemoryDisable(m_sDevData.psDevInfoKM);
#endif // LOCAL_MEMORY_SELF_REFRESH
#ifdef ENABLE_2D_PROFILE
profile_end_blt_clip_rect(m_sActiveNode);
#endif
return (S_OK);
} /* PatBlt */
/*****************************************************************************
FUNCTION : AATextBlt
PURPOSE : Does 4bpp alpha AA text alpha blend blit
PARAMETERS : GPEBltParms *psParms
RETURN : SC_OK or SC_FALSE
*****************************************************************************/
SCODE MBX::AATextBlt ( GPEBltParms *psParms )
{
ULONG ulFillColour;
RECTL rclMsk = *psParms->prclMask;
ULONG ulMskHeight, ulMskWidth;
ULONG ulMaskBufPhys;
unsigned char *pbyMsk = (unsigned char *)psParms->pMask->Buffer();
unsigned char *pbyMskBufLin;
ULONG ulMskStride = psParms->pMask->Stride();
ULONG ulCnt;
BOOL bUsingStripe;
DPFX(PVR_ZONE_BLT,(L"AATextBlt: rop4=%04X", psParms->rop4));
#ifdef ENABLE_2D_PROFILE
profile_start_blt_clip_rect(m_sActiveNode);
#endif
ASSERT (psParms->prclClip == NULL);
ASSERT (psParms->pDst->Format() >= gpe16Bpp);
ASSERT (psParms->pMask->Format() == gpe4Bpp);
#ifdef LOCAL_MEMORY_SELF_REFRESH
SysLocalMemoryEnable(m_sDevData.psDevInfoKM);
#endif // LOCAL_MEMORY_SELF_REFRESH
SetDstSurf(psParms);
ulMskWidth = (((rclMsk.right - (rclMsk.left & 0xFFFFFFFE)) + 1) >> 1);
/* round up to DWORD alignment */
ulMskWidth = (ulMskWidth+3) & 0xFFFFFFFC;
ulMskHeight = rclMsk.bottom - rclMsk.top;
pbyMsk += (rclMsk.top * ulMskStride) + (rclMsk.left >> 1);
if (psParms->pMask->InVideoMemory())
{
ulMaskBufPhys = ((MBXSurf*)psParms->pMask)->GetPhysAddr();
bUsingStripe = FALSE;
}
else
{
/* can use stripe buffer */
/* check for buffer overwrite */
while (m_ulStrideBufSig >= (*(volatile ULONG *)m_sCallbacks.sStripeComplete.pulLinAddr + NUM_OF_STRIPED_BUFFERS));
pbyMskBufLin = m_pbyStripeLinBase + (m_ulStripeSize * m_ulBufferIdx);
#if HW_VERIFY
BUFINFO MaskInfo;
MaskInfo.ulWidth = rclMsk.right - (rclMsk.left & 0xFFFFFFFE);
MaskInfo.ulHeight = ulMskHeight;
MaskInfo.ulStride = ulMskWidth;
MaskInfo.pvLinAddr = (PVOID)pbyMskBufLin;
MaskInfo.ulPhysBase = m_ulStripePhyBase + (m_ulStripeSize * m_ulBufferIdx);
m_clHwVer.UpdateStripeBufInfo(&MaskInfo);
#endif
for (ulCnt = 0; ulCnt < ulMskHeight; ulCnt++)
{
memcpy (pbyMskBufLin, pbyMsk, ulMskWidth);
pbyMsk += ulMskStride;
pbyMskBufLin += ulMskWidth;
}
ulMaskBufPhys = m_ulStripePhyBase + (m_ulStripeSize * m_ulBufferIdx);
bUsingStripe = TRUE;
}
DispPerfSlaveport (TRUE);
SlavePortWrite(MBX2D_SRC_CTRL_BH
| MBX2D_SRC_FBMEM
| MBX2D_SRC_4_ALPHA
| ((ulMskWidth <<MBX2D_SRC_STRIDE_SHIFT)
& MBX2D_SRC_STRIDE_MASK) );
SlavePortWrite((( ulMaskBufPhys
>> MBX2D_SRC_ADDR_ALIGNSHIFT)
<< MBX2D_SRC_ADDR_SHIFT)
& MBX2D_SRC_ADDR_MASK );
/* specify the starting pixel coordinate */
SlavePortWrite(MBX2D_SRC_OFF_BH
| (((rclMsk.left & 0x0001)<<MBX2D_SRCOFF_XSTART_SHIFT) & MBX2D_SRCOFF_XSTART_MASK));
#ifdef PDUMP
PDumpScript("-- AA Text Blit Command");
#endif
/* let's do the blit */
SlavePortWrite( MBX2D_BLIT_BH
| 0xCCCC /* SRCCOPY */
| MBX2D_USE_FILL
| MBX2D_ALPHA_ENABLE
| m_ulBltRotationHw );
if (psParms->pDst->Format() == gpe16Bpp)
{
ulFillColour = DestToABGR(gpe16Bpp, psParms->solidColor);
}
else
{
ulFillColour = psParms->solidColor;
}
SlavePortWrite( ulFillColour & MBX2D_FILLCOLOUR_MASK );
/* Write Destination rectangle to the Slave Port */
WriteDestRect((MBXSurf *)psParms->pDst, psParms->prclDst);
SlavePortFlushWrites();
if (bUsingStripe)
{
SurfaceUpdateBlit ( m_sCallbacks.sStripeComplete.ulPhysAddr, ++m_ulStrideBufSig );
m_ulBufferIdx++;
m_ulBufferIdx &= (NUM_OF_STRIPED_BUFFERS - 1);
}
DispPerfSlaveport (FALSE);
#ifdef SW_SIM
ProcessBltData();
InitBlt();
#endif /* #ifdef SW_SIM */
m_eHWBltState = BLT_InContProgress;
#ifdef LOCAL_MEMORY_SELF_REFRESH
SysLocalMemoryDisable(m_sDevData.psDevInfoKM);
#endif // LOCAL_MEMORY_SELF_REFRESH
#ifdef ENABLE_2D_PROFILE
profile_end_blt_clip_rect(m_sActiveNode);
#endif
return (S_OK);
} /* AATextBlt */
/*****************************************************************************
FUNCTION : TextBlt
PURPOSE : Does 1bpp text blit
PARAMETERS : GPEBltParms *psParms
RETURN : SC_OK or SC_FALSE
*****************************************************************************/
SCODE MBX::TextBlt ( GPEBltParms *psParms )
{
RECTL rclMsk = *psParms->prclMask;
ULONG ulMskHeight, ulMskWidth;
ULONG ulMaskBufPhys;
unsigned char *pbyMsk = (unsigned char *)psParms->pMask->Buffer();
unsigned char *pbyMskBufLin;
ULONG ulMskStride = psParms->pMask->Stride();
ULONG ulCnt;
BOOL bUsingStripe;
DPFX(PVR_ZONE_BLT,(L"TextBlt: rop4=%04X", psParms->rop4));
#ifdef ENABLE_2D_PROFILE
profile_start_blt_clip_rect(m_sActiveNode);
#endif
ASSERT (psParms->prclClip == NULL);
ASSERT (psParms->pDst->Format() >= gpe16Bpp);
ASSERT (psParms->pMask->Format() == gpe1Bpp);
#ifdef LOCAL_MEMORY_SELF_REFRESH
SysLocalMemoryEnable(m_sDevData.psDevInfoKM);
#endif // LOCAL_MEMORY_SELF_REFRESH
SetDstSurf(psParms);
ulMskWidth = (((rclMsk.right - (rclMsk.left & 0xFFFFFFF8)) + 7) >> 3);
/* round up to DWORD alignment */
ulMskWidth = (ulMskWidth+3) & 0xFFFFFFFC;
ulMskHeight = rclMsk.bottom - rclMsk.top;
pbyMsk += (rclMsk.top * ulMskStride) + (rclMsk.left >> 3);
if (psParms->pMask->InVideoMemory())
{
ulMaskBufPhys = ((MBXSurf*)psParms->pMask)->GetPhysAddr();
bUsingStripe = FALSE;
}
else
{
/* can use stripe buffer */
/* check for buffer overwrite */
while (m_ulStrideBufSig >= (*(volatile ULONG *)m_sCallbacks.sStripeComplete.pulLinAddr + NUM_OF_STRIPED_BUFFERS));
pbyMskBufLin = m_pbyStripeLinBase + (m_ulStripeSize * m_ulBufferIdx);
#if HW_VERIFY
BUFINFO MaskInfo;
MaskInfo.ulWidth = rclMsk.right - (rclMsk.left & 0xFFFFFFF8);
MaskInfo.ulHeight = ulMskHeight;
MaskInfo.ulStride = ulMskWidth;
MaskInfo.pvLinAddr = (PVOID)pbyMskBufLin;
MaskInfo.ulPhysBase = m_ulStripePhyBase + (m_ulStripeSize * m_ulBufferIdx);
m_clHwVer.UpdateStripeBufInfo(&MaskInfo);
#endif
for (ulCnt = 0; ulCnt < ulMskHeight; ulCnt++)
{
memcpy (pbyMskBufLin, pbyMsk, ulMskWidth);
pbyMsk += ulMskStride;
pbyMskBufLin += ulMskWidth;
}
ulMaskBufPhys = m_ulStripePhyBase + (m_ulStripeSize * m_ulBufferIdx);
bUsingStripe = TRUE;
}
DispPerfSlaveport (TRUE);
/* specify mask, x,y */
SlavePortWrite(MBX2D_MASK_OFF_BH |
((rclMsk.left & 0x7)<<MBX2D_MASKOFF_XSTART_SHIFT) & MBX2D_MASKOFF_XSTART_MASK );
SlavePortWrite(MBX2D_MASK_SIZE_BH |
(((rclMsk.right - (rclMsk.left & 0xFFFFFFF8)) << MBX2D_MASK_WIDTH_SHIFT) & MBX2D_MASK_WIDTH_MASK) |
((ulMskHeight << MBX2D_MASK_HEIGHT_SHIFT) & MBX2D_MASK_HEIGHT_MASK) );
SlavePortWrite(MBX2D_MASK_CTRL_BH |
MBX2D_MASK_FBMEM |
(ulMskWidth<<MBX2D_MASK_STRIDE_SHIFT) &
MBX2D_MASK_STRIDE_MASK );
SlavePortWrite(((ulMaskBufPhys
>> MBX2D_MASK_ADDR_ALIGNSHIFT)
<< MBX2D_MASK_ADDR_SHIFT)
& MBX2D_MASK_ADDR_MASK );
#ifdef PDUMP
PDumpScr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -