⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bltfuncs.cpp

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

#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 + -