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

📄 vgpcopy.h

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 H
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
<module>
* Name         : vgpcopy.h
* Title        : vgp data copy inline function definitions
* Author(s)    : Imagination Technologies
* Created      : 2 March 2004
*
* Copyright    : 2004 by Imagination Technologies Limited.
*                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  : vgp data copy inline function definitions
*
* Platform     : Windows CE
*
</module>
********************************************************************************/
#if !defined(_VGPCOPY_H_)
#define _VGPCOPY_H_

#if defined (SUPPORT_VGP) || defined (SUPPORT_VGP_LITE)
#if defined (FIX_HW_PRN_721)
/*----------------------------------------------------------------------------
<function>
	FUNCTION:   CopyClampData

	PURPOSE:    inline Slaveport data copy function with lower boundary clamping fix

	PARAMETERS:	In: psContext	 - Current context
				In: pbyData		 - vertex data pointer
				In: ui32Bytes	 - byte count
</function>
------------------------------------------------------------------------------*/
__forceinline IMG_VOID CopyClampData(LPD3DM_CONTEXT psContext, IMG_UINT8 *pbyData, IMG_UINT32 ui32Bytes)
{
	PPVRSRV_DEV_SLAVE_PORT psSlavePort				= &psContext->sHWInfo.sDeviceSpecific.sMBX.sTASlavePort;
	IMG_UINT32			   *pui32LinDataAddr		= (IMG_UINT32*) pbyData;
	IMG_UINT32			   *pui32LinPortAddrBase	= (IMG_UINT32*) psSlavePort->pvData;
	IMG_UINT32			   *pui32LinPortAddr;
	IMG_UINT32 				ui32DWORDs				= ui32Bytes >> 2;
	IMG_UINT32				ui32BytesObtained;
	IMG_INT32				i;

	for (i = ui32DWORDs; i != 0 ; i -= ui32DWORDs)
	{
		ui32DWORDs = (i < 32) ? i : 32;
		pui32LinPortAddr = pui32LinPortAddrBase;

		/* Ensure we have space required for one pass */
		while(psContext->dwAllocatedFifoSpaceDWORDS < ui32DWORDs)
		{
				PVRSRVAcquire3DFifoSpace (psContext->sDevData.psDevInfoUM,
										  &psContext->sHWInfo,
										  &ui32BytesObtained);

			psContext->dwAllocatedFifoSpaceDWORDS = (ui32BytesObtained >> 2);
		}

		/* Dump SP writes */
		PDUMPSPBATCH(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, pui32LinDataAddr, ui32DWORDs);

		switch(ui32DWORDs)
		{
			case 32:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 31:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 30:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 29:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 28:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 27:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 26:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 25:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 24:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 23:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 22:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 21:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 20:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 19:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 18:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 17:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 16:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 15:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 14:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 13:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 12:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 11:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 10:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 9:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 8:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 7:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 6:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 5:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 4:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 3:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 2:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
			case 1:
			*pui32LinPortAddr++ = CLAMP_LOWER(*pui32LinDataAddr++);
		}

		psContext->dwAllocatedFifoSpaceDWORDS	-= ui32DWORDs;
		PVRSRVRelease3DFifoSpace(psContext->sDevData.psDevInfoUM, (ui32DWORDs << 2));

	}

	/* Signal that we've sent some data to the TA */
	psContext->psCurrentRenderTarget->sDescription.sSurface.bSceneTADataSent = TRUE;
}
#endif /* defined (FIX_HW_PRN_721) */
/*----------------------------------------------------------------------------
<function>
	FUNCTION:   CopyData

	PURPOSE:    inline Slaveport data copy function

	PARAMETERS:	In: psContext	 - Current context
				In: pbyData		 - vertex data pointer
				In: ui32Bytes	 - byte count
</function>
------------------------------------------------------------------------------*/
__forceinline IMG_VOID CopyData(LPD3DM_CONTEXT psContext, IMG_UINT8 *pbyData, IMG_UINT32 ui32Bytes)
{
	PPVRSRV_DEV_SLAVE_PORT psSlavePort				= &psContext->sHWInfo.sDeviceSpecific.sMBX.sTASlavePort;
	IMG_UINT32			   *pui32LinDataAddr		= (IMG_UINT32*) pbyData;
	IMG_UINT32			   *pui32LinPortAddrBase	= (IMG_UINT32*) psSlavePort->pvData;
	IMG_UINT32			   *pui32LinPortAddr;
	IMG_UINT32 				ui32DWORDs				= ui32Bytes >> 2;
	IMG_UINT32				ui32BytesObtained;
	IMG_INT32				i;

	for (i = ui32DWORDs; i != 0 ; i -= ui32DWORDs)
	{
		ui32DWORDs = (i < 32) ? i : 32;
		pui32LinPortAddr = pui32LinPortAddrBase;

		/* Ensure we have space required for one pass */
		while(psContext->dwAllocatedFifoSpaceDWORDS < ui32DWORDs)
		{
				PVRSRVAcquire3DFifoSpace (psContext->sDevData.psDevInfoUM,
										  &psContext->sHWInfo,
										  &ui32BytesObtained);

			psContext->dwAllocatedFifoSpaceDWORDS = (ui32BytesObtained >> 2);
		}

		/* Dump SP writes */
		PDUMPSPBATCH(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, pui32LinDataAddr, ui32DWORDs);

		switch(ui32DWORDs)
		{
			case 32:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 31:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 30:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 29:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 28:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 27:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 26:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 25:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 24:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 23:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 22:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 21:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 20:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 19:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 18:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 17:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 16:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 15:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 14:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 13:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 12:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 11:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 10:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 9:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 8:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 7:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 6:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 5:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 4:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 3:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 2:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
			case 1:
			*pui32LinPortAddr++ = *pui32LinDataAddr++;
		}

		psContext->dwAllocatedFifoSpaceDWORDS	-= ui32DWORDs;
		PVRSRVRelease3DFifoSpace(psContext->sDevData.psDevInfoUM, (ui32DWORDs << 2));

	}

	/* Signal that we've sent some data to the TA */
	psContext->psCurrentRenderTarget->sDescription.sSurface.bSceneTADataSent = TRUE;
}
/*----------------------------------------------------------------------------
<function>
	FUNCTION:   CopyConvertData

	PURPOSE:    inline Slaveport data copy convert function. 
				Converts from fixed point to floating point

	PARAMETERS:	In: psContext	 - Current context
				In: pbyData		 - vertex data pointer
				In: ui32Bytes	 - byte count
</function>
------------------------------------------------------------------------------*/
__forceinline IMG_VOID CopyConvertData(LPD3DM_CONTEXT psContext, IMG_UINT8 *pbyData, IMG_UINT32 ui32Bytes)
{
	PPVRSRV_DEV_SLAVE_PORT psSlavePort				= &psContext->sHWInfo.sDeviceSpecific.sMBX.sTASlavePort;
	IMG_UINT32			   *pui32LinDataAddr		= (IMG_UINT32*) pbyData;
	IMG_UINT32			   *pui32LinPortAddrBase	= (IMG_UINT32*) psSlavePort->pvData;
	IMG_UINT32			   *pui32LinPortAddr;
	IMG_UINT32 				ui32DWORDs				= ui32Bytes >> 2;
	IMG_UINT32				ui32BytesObtained;
	IMG_INT32				i;

	for (i = ui32DWORDs; i != 0 ; i -= ui32DWORDs)
	{
		ui32DWORDs = (i < 32) ? i : 32;
		pui32LinPortAddr = pui32LinPortAddrBase;

		/* Ensure we have space required for one pass */
		while(psContext->dwAllocatedFifoSpaceDWORDS < ui32DWORDs)
		{
				PVRSRVAcquire3DFifoSpace (psContext->sDevData.psDevInfoUM,
										  &psContext->sHWInfo,
										  &ui32BytesObtained);

			psContext->dwAllocatedFifoSpaceDWORDS = (ui32BytesObtained >> 2);
		}

		/* Dump SP writes */
		PDUMPSPBATCH(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, pui32LinDataAddr, ui32DWORDs);

		switch(ui32DWORDs)
		{
			case 32:
			*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
			case 31:
			*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
			case 30:
			*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
			case 29:
			*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);

⌨️ 快捷键说明

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