📄 vgpcopy.h
字号:
/******************************************************************************
<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 + -