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

📄 spfuncs.cpp

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************
 * Name        : spfuncs.cpp
 * Title       : MBX WinCE slaveport functions
 * Author(s)   : Imagination Technologies
 * Created	   : 24th Oct 2003
 *
 * Copyright   : 2003 by Imagination Technologies. All rights reserved.
 *             : No part of this software, either material or conceptual 
 *             : may be copied or distributed, transmitted, transcribed,
 *             : stored in a retrieval system or translated into any 
 *             : human or computer language in any form by any means,
 *             : electronic, mechanical, manual or other-wise, or 
 *             : disclosed to third parties without the express written
 *             : permission of Imagination Technologies Limited, Unit 8,
 *             : HomePark Industrial Estate, King's Langley, Hertfordshire,
 *             : WD4 8LZ, U.K.
 *
 * Description : MBX WinCE slaveport functions.
 *
 * Platform    : WinCE
 *
 * Modifications:-
 * $Log: spfuncs.cpp $
 *
 *
 ****************************************************************************/

#include	"precomp.h"

extern "C"
{
#include	"dispperf.h"
}


static ULONG ulaBltDirn[2][2] = {{MBX2D_TEXTCOPY_BR2TL, MBX2D_TEXTCOPY_TR2BL},
								 {MBX2D_TEXTCOPY_BL2TR, MBX2D_TEXTCOPY_TL2BR}};

ULONG MBX::OverlapTest( GPEBltParms *pParms )
{
	if (!m_bXPositive  || !m_bYPositive)
	{
		if (!(pParms->bltFlags & BLT_TRANSPARENT))
		{
			/*
			 * HW bug Fix:  The HW tries to optimise SRCCOPY
			 * but has a bug for SRCMOVE
			 */
			SlavePortWrite(MBX2D_CTRL_BH | MBX2D_SRCCK_CTRL);
			SlavePortWrite( 0 );
			SlavePortWrite( 0 );
		}
	}

	return (ulaBltDirn[m_bXPositive][m_bYPositive]);
} /* OverlapTest */


BOOL MBX::SetDstSurf( GPEBltParms *pParms )
{
	BOOL bRetVal = TRUE;

	// has the DST surface address changed ?
	// i.e. has the surface changed ?
//#ifdef CACHE_SURFACES		// NOTE : Destination cannot be cached because SyncWithHost does a fill blt.
//	if (   (pParms->pDst->Buffer() != m_s2DContext.pvDstLinAddr) 
//		&& (pParms->pDst->Stride() != m_s2DContext.ulDstStride)
//		&& (pParms->pDst->Format() != m_s2DContext.ulDstFormat)
//		)
//	{
//#endif
		#ifdef PDUMP
		PDumpScript("-- DST surface attributes");
		#endif

		/* update DST surface attributes */
		SlavePortWrite( MBX2D_DST_CTRL_BH
						| EGPEFormatToDestHW[pParms->pDst->Format()]
						| ((pParms->pDst->Stride()<<MBX2D_DST_STRIDE_SHIFT)
							&	MBX2D_DST_STRIDE_MASK));

		SlavePortWrite( ((((MBXSurf*)pParms->pDst)->GetPhysAddr()
						>>	MBX2D_DST_ADDR_ALIGNSHIFT)
						<<	MBX2D_DST_ADDR_SHIFT)
						&	MBX2D_DST_ADDR_MASK);

	return bRetVal;
} /* SetDstSurf type 1*/


BOOL MBX::SetDstSurf( GPELineParms *lineParams )
{
	BOOL bRetVal = TRUE;
	
		/* has the DST surface address changed? */
		/* i.e. has the surface changed? */
	#ifdef CACHE_SURFACES
		if (lineParams->pDst->Buffer() != m_s2DContext.pvDstLinAddr)
		{
	#endif
			#ifdef PDUMP
			PDumpScript("-- DST surface attributes (line)");
			#endif

			/* update DST surface attributes */
			SlavePortWrite(MBX2D_DST_CTRL_BH
							| EGPEFormatToDestHW[lineParams->pDst->Format()]
							| ((lineParams->pDst->Stride()<<MBX2D_DST_STRIDE_SHIFT) &	MBX2D_DST_STRIDE_MASK));

			SlavePortWrite(((((MBXSurf*)lineParams->pDst)->GetPhysAddr() >> MBX2D_DST_ADDR_ALIGNSHIFT) << MBX2D_DST_ADDR_SHIFT)
							& MBX2D_DST_ADDR_MASK );

	#ifdef CACHE_SURFACES
			/* set-up details in the 2DContext */
			m_s2DContext.pvDstLinAddr = lineParams->pDst->Buffer();
		}
	#endif
	
	return bRetVal;

} /* SetDstSurf */


BOOL MBX::SetMBXPalette (	GPEBltParms *pParms,
							EGPEFormat  eSrcFormat,
							PALETTE_TYPE ePalType
							)
{
	ULONG      ulNumEntries;
	ULONG     *pulPalette, *pulDstPal;
	EGPEFormat eDstFormat = pParms->pDst->Format();

	ASSERT ((ePalType == eSrcPalette) || (ePalType == ePatPalette));

	#ifdef PDUMP
	PDumpScript("-- Set Palette");
	#endif

	if (pParms->pLookup)
	{
		pulPalette = pParms->pLookup;
	}
	else
	{
		return (TRUE);		/* skip palette if ptr is NULL */
	}

	ulNumEntries = 1<<EGPEFormatToBpp[eSrcFormat];

	ASSERT (m_sPaletteInfo.prgbqSrcPalette);
	ASSERT (m_sPaletteInfo.prgbqPatPalette);

	if (pParms->pConvert)
	{
		/* compute best match palette */
		for (ULONG ulCnt = 0; ulCnt < ulNumEntries; ulCnt++)
		{
			pulPalette[ulCnt] = (pParms->pColorConverter->*(pParms->pConvert))( pulPalette[ulCnt] );
		}
	}

	/* which palette to update? */
	pulDstPal = (ULONG *)((ePalType == ePatPalette) ? m_sPaletteInfo.prgbqPatPalette
													: m_sPaletteInfo.prgbqSrcPalette);

	while(ulNumEntries--)
	{
		*pulDstPal++ = DestToABGR(eDstFormat, *pulPalette);
		pulPalette++;
	}

	/* notify MBX that the palette has changed */
	if (ePalType == ePatPalette)
	{
		SlavePortWrite(MBX2D_PAT_PAL_BH);
		SlavePortWrite(m_sPaletteInfo.ulPatPalettePhys);
	}
	else
	{
		SlavePortWrite(MBX2D_SRC_PAL_BH);
		SlavePortWrite(m_sPaletteInfo.ulSrcPalettePhys);
	}

	return (TRUE);
} /* SetMBXPalette */


/*****************************************************************************
 FUNCTION	:	WriteDestRect

 PURPOSE	:	Sends Dest rectangle info to slave port.
 
 PARAMETERS	:	none

 RETURN		:	nothing
*****************************************************************************/
VOID MBX::WriteDestRect (MBXSurf *pSurf, RECTL *prclDst)
{
#ifdef ROTATE_ENABLE

	RECTL rclDst;

	/* Write Destination rectangle to the Slave Port */
	switch (m_ulBltRotationHw)
	{
		case MBX2D_TEXTROT_90DEGS:
			rclDst.top    = m_PhysDestWidth - prclDst->bottom;
			rclDst.left   = prclDst->left;
			rclDst.bottom = m_PhysDestWidth - prclDst->top;
			rclDst.right  = prclDst->right;
			break;

		case MBX2D_TEXTROT_180DEGS:
			rclDst.top    = m_PhysDestHeight - prclDst->bottom;
			rclDst.left   = m_PhysDestWidth - prclDst->right;
			rclDst.bottom = m_PhysDestHeight - prclDst->top;
			rclDst.right  = m_PhysDestWidth - prclDst->left;
			break;

		case MBX2D_TEXTROT_270DEGS:
			rclDst.top    = prclDst->top;
			rclDst.left   = m_PhysDestHeight - prclDst->right;
			rclDst.bottom = prclDst->bottom;
			rclDst.right  = m_PhysDestHeight - prclDst->left;
			break;

		default:
			/* Src and dst are the same OR no rotation */
			switch (pSurf->Rotate())
			{
				case DMDO_90:
					rclDst.left   = prclDst->top;
					rclDst.right  = prclDst->bottom;
					rclDst.top    = m_nScreenHeightSave - prclDst->right;
					rclDst.bottom = m_nScreenHeightSave - prclDst->left;
					break;
    
				case DMDO_180:
					rclDst.left   = m_nScreenWidthSave  - prclDst->right;
					rclDst.right  = m_nScreenWidthSave  - prclDst->left;
					rclDst.top    = m_nScreenHeightSave - prclDst->bottom;
					rclDst.bottom = m_nScreenHeightSave - prclDst->top;
					break;
    
				case DMDO_270:
					rclDst.left   = m_nScreenWidthSave - prclDst->bottom;
					rclDst.right  = m_nScreenWidthSave - prclDst->top;
					rclDst.top    = prclDst->left;
					rclDst.bottom = prclDst->right;
					break;

				default:
					rclDst = *prclDst;
					break;
			}
			break;
	}

	SlavePortWrite( ((SHORT)rclDst.top  &  MBX2D_DST_YSTART_MASK) |
					(((SHORT)rclDst.left << MBX2D_DST_XSTART_SHIFT) & MBX2D_DST_XSTART_MASK) );

	SlavePortWrite( ((SHORT)rclDst.bottom & MBX2D_DST_YEND_MASK) |
					(((SHORT)rclDst.right << MBX2D_DST_XEND_SHIFT) & MBX2D_DST_XEND_MASK) );

#else
	SlavePortWrite( ((SHORT)prclDst->top  &  MBX2D_DST_YSTART_MASK) |
					(((SHORT)prclDst->left << MBX2D_DST_XSTART_SHIFT) & MBX2D_DST_XSTART_MASK) );

	SlavePortWrite( ((SHORT)prclDst->bottom & MBX2D_DST_YEND_MASK) |
					(((SHORT)prclDst->right << MBX2D_DST_XEND_SHIFT) & MBX2D_DST_XEND_MASK) );
#endif
}


/*****************************************************************************
 FUNCTION	:	WriteClipRect

 PURPOSE	:	Sends Dest rectangle info to slave port.
 
 PARAMETERS	:	none

 RETURN		:	nothing
*****************************************************************************/
VOID MBX::WriteClipRect (MBXSurf *pSurf, RECTL *prclClip)
{
#ifdef ROTATE_ENABLE

	RECTL rclClip;

	/* Write Destination rectangle to the Slave Port */
	switch (m_ulBltRotationHw)
	{
		case MBX2D_TEXTROT_90DEGS:
			rclClip.top    = m_PhysDestWidth - prclClip->bottom;
			rclClip.left   = prclClip->left;
			rclClip.bottom = m_PhysDestWidth - prclClip->top;
			rclClip.right  = prclClip->right;
			break;

		case MBX2D_TEXTROT_180DEGS:
			rclClip.top    = m_PhysDestHeight - prclClip->bottom;
			rclClip.left   = m_PhysDestWidth - prclClip->right;
			rclClip.bottom = m_PhysDestHeight - prclClip->top;
			rclClip.right  = m_PhysDestWidth - prclClip->left;
			break;

		case MBX2D_TEXTROT_270DEGS:
			rclClip.top    = prclClip->top;
			rclClip.left   = m_PhysDestHeight - prclClip->right;
			rclClip.bottom = prclClip->bottom;
			rclClip.right  = m_PhysDestHeight - prclClip->left;
			break;

		default:
			/* Src and dst are the same OR no rotation */
			switch (pSurf->Rotate())
			{
				case DMDO_90:
					rclClip.left   = prclClip->top;
					rclClip.right  = prclClip->bottom;
					rclClip.top    = m_nScreenHeightSave - prclClip->right;
					rclClip.bottom = m_nScreenHeightSave - prclClip->left;
					break;
    
				case DMDO_180:
					rclClip.left   = m_nScreenWidthSave  - prclClip->right;
					rclClip.right  = m_nScreenWidthSave  - prclClip->left;
					rclClip.top    = m_nScreenHeightSave - prclClip->bottom;
					rclClip.bottom = m_nScreenHeightSave - prclClip->top;
					break;
    
				case DMDO_270:
					rclClip.left   = m_nScreenWidthSave - prclClip->bottom;
					rclClip.right  = m_nScreenWidthSave - prclClip->top;
					rclClip.top    = prclClip->left;
					rclClip.bottom = prclClip->right;
					break;

				default:
					rclClip = *prclClip;
					break;
			}
			break;
	}

	SlavePortWrite( MBX2D_CLIP_BH |
					((1<<MBX2D_CLIPCOUNT_SHIFT) &
						MBX2D_CLIPCOUNT_MASK) );

	/* Write Clip rectangles to the slave port */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -