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

📄 primvgp.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
字号:
/******************************************************************************
<module>
* Name         : Primvgp.c
* Title        : D3DM primcopy routines for vgp
* Author(s)    : Imagination Technologies
* Created      : 18 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  : D3DM primcopy routines for vgp
*
* Platform     : Windows CE
*
$Log: primvgp.c $

</module>
********************************************************************************/

#include "context.h"

#if defined (SUPPORT_VGP) || defined (SUPPORT_VGP_LITE)

/***********************************************************************************
 Function Name      : TriangleList
************************************************************************************/
IMG_VOID TriangleList(LPD3DM_CONTEXT	psContext,
					  IMG_UINT32		*pui32Data, 
					  IMG_UINT32		ui32FVFcode, 
					  IMG_UINT32		ui32Stride, 
					  IMG_UINT32		ui32PrimCount)
{
	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACELIST);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	CopySelect(psContext,
			  (IMG_UINT8*)pui32Data, 
			  (ui32PrimCount * 3),
			  &psContext->psVertexSource->sVSIFDef);

	/* End the primitive-block */
	TACSWriteLastPrim(psContext);
}
/***********************************************************************************
 Function Name      : TriListLine
************************************************************************************/
IMG_VOID TriListLine(LPD3DM_CONTEXT psContext,
					IMG_UINT32 *pui32Data, 
					IMG_UINT32 ui32FVFcode, 
					IMG_UINT32 ui32Stride, 
					IMG_UINT32 ui32PrimCount)
{
	IMG_UINT32 i;

	ui32Stride >>= 2;

	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
	TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	for(i = 0; i < ui32PrimCount; i++)
	{
		CopySelect(psContext, (IMG_UINT8*)pui32Data, 3, &psContext->psVertexSource->sVSIFDef);
		CopySelect(psContext, (IMG_UINT8*)pui32Data, 1, &psContext->psVertexSource->sVSIFDef);

		if(i < ui32PrimCount)
		{
			TACSWriteEndPrim(psContext);
		}

		pui32Data += ui32Stride * 3;
	}

	TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
	TACSWriteTACtlAnd3DState ( 	psContext,
								MBX1_TASTATEPRES_ISPCTL,
								&psContext->sHWState.sTACtl3DState,
								TRUE);
#endif				
}
/***********************************************************************************
 Function Name      : LineList
************************************************************************************/
IMG_VOID LineList(LPD3DM_CONTEXT psContext,
				  IMG_UINT32	 *pui32Data, 
				  IMG_UINT32	 ui32FVFcode, 
				  IMG_UINT32	 ui32Stride, 
				  IMG_UINT32	 ui32PrimCount)
{
	IMG_UINT32 i;

	ui32Stride >>= 2;

	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
	TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	for(i = 0; i < ui32PrimCount; i++)
	{
		CopySelect(psContext, (IMG_UINT8*)pui32Data, 2, &psContext->psVertexSource->sVSIFDef);
		if(i < ui32PrimCount)
		{
			TACSWriteEndPrim(psContext);
		}

		pui32Data += ui32Stride * 2;
	}

	TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
	TACSWriteTACtlAnd3DState ( 	psContext,
								MBX1_TASTATEPRES_ISPCTL,
								&psContext->sHWState.sTACtl3DState,
								TRUE);
#endif				
}
/***********************************************************************************
 Function Name      : LineStrip
************************************************************************************/
IMG_VOID LineStrip( LPD3DM_CONTEXT	psContext,
					IMG_UINT32		*pui32Data, 
					IMG_UINT32		ui32FVFcode, 
					IMG_UINT32		ui32Stride, 
					IMG_UINT32		ui32PrimCount)
{
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
	TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	CopySelect(psContext, (IMG_UINT8*)pui32Data, ui32PrimCount + 1, &psContext->psVertexSource->sVSIFDef);

	TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
	TACSWriteTACtlAnd3DState ( 	psContext,
								MBX1_TASTATEPRES_ISPCTL,
								&psContext->sHWState.sTACtl3DState,
								TRUE);
#endif				
}
/***********************************************************************************
 Function Name      : TriangleStrip
************************************************************************************/
IMG_VOID TriangleStrip( LPD3DM_CONTEXT	psContext,
						IMG_UINT32		*pui32Data, 
						IMG_UINT32		ui32FVFcode, 
						IMG_UINT32		ui32Stride, 
						IMG_UINT32		ui32PrimCount)
{
	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACESTRIP);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	CopySelect(psContext,
			  (IMG_UINT8*)pui32Data, 
			  ui32PrimCount + 2 ,
			  &psContext->psVertexSource->sVSIFDef);

	/* End the primitive-block */
	TACSWriteLastPrim(psContext);
}
/***********************************************************************************
 Function Name      : TriStripLine
************************************************************************************/
IMG_VOID TriStripLine(	LPD3DM_CONTEXT	psContext,
						IMG_UINT32		*pui32Data, 
						IMG_UINT32		ui32FVFcode, 
						IMG_UINT32		ui32Stride, 
						IMG_UINT32		ui32PrimCount)
{
	IMG_UINT32 i;

	ui32Stride >>= 2;

	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
	TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	for(i = 0; i < ui32PrimCount; i++)
	{
		CopySelect(psContext, (IMG_UINT8*)pui32Data, 3, &psContext->psVertexSource->sVSIFDef);
		CopySelect(psContext, (IMG_UINT8*)pui32Data, 1, &psContext->psVertexSource->sVSIFDef);

		if(i < ui32PrimCount)
		{
			TACSWriteEndPrim(psContext);
		}

		pui32Data += ui32Stride;
	}

	TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
	TACSWriteTACtlAnd3DState ( 	psContext,
								MBX1_TASTATEPRES_ISPCTL,
								&psContext->sHWState.sTACtl3DState,
								TRUE);
#endif				
}
/***********************************************************************************
 Function Name      : TriFanLine
************************************************************************************/
IMG_VOID TriFanLine(LPD3DM_CONTEXT	psContext,
					IMG_UINT32		*pui32Data, 
					IMG_UINT32		ui32FVFcode, 
					IMG_UINT32		ui32Stride, 
					IMG_UINT32		ui32PrimCount)
{
	IMG_UINT32	i;
	IMG_UINT32	*pui32FirstVertex = pui32Data;

	ui32Stride >>= 2;

	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
	TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	/* Move pointer to second vertex */
	pui32Data += ui32Stride;

	for(i = 0; i < ui32PrimCount; i++)
	{
		CopySelect(psContext, (IMG_UINT8*)pui32FirstVertex, 1, &psContext->psVertexSource->sVSIFDef);
		CopySelect(psContext, (IMG_UINT8*)pui32Data, 2, &psContext->psVertexSource->sVSIFDef);
		CopySelect(psContext, (IMG_UINT8*)pui32FirstVertex, 1, &psContext->psVertexSource->sVSIFDef);

		if(i < ui32PrimCount)
		{
			TACSWriteEndPrim(psContext);
		}

		pui32Data += ui32Stride;
	}

	TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
	TACSWriteTACtlAnd3DState ( 	psContext,
									MBX1_TASTATEPRES_ISPCTL,
								 	&psContext->sHWState.sTACtl3DState,
								 	TRUE);
#endif
}
/***********************************************************************************
 Function Name      : TriFan
************************************************************************************/
IMG_VOID TriangleFan(LPD3DM_CONTEXT psContext,
					 IMG_UINT32		*pui32Data, 
					 IMG_UINT32		ui32FVFcode, 
					 IMG_UINT32		ui32Stride, 
					 IMG_UINT32		ui32PrimCount)
{
	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACEFAN);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	CopySelect(psContext,
			  (IMG_UINT8*)pui32Data, 
			  ui32PrimCount + 2 ,
			  &psContext->psVertexSource->sVSIFDef);

	/* End the primitive-block */
	TACSWriteLastPrim(psContext);
}
/***********************************************************************************
 Function Name      : PointList
************************************************************************************/
IMG_VOID PointList( LPD3DM_CONTEXT	psContext,
					IMG_UINT32		*pui32Data, 
					IMG_UINT32		ui32FVFcode, 
					IMG_UINT32		ui32Stride, 
					IMG_UINT32		ui32PrimCount)
{
	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_POINTS);
	TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	CopySelect(psContext,
			  (IMG_UINT8*)pui32Data, 
			  ui32PrimCount,
			  &psContext->psVertexSource->sVSIFDef);

	/* End the primitive-block */
	TACSWriteLastPrim(psContext);

#ifdef FIX_HW_PRN_299
		TACSWriteTACtlAnd3DState ( 	psContext,
									MBX1_TASTATEPRES_ISPCTL,
								 	&psContext->sHWState.sTACtl3DState,
								 	TRUE);
#endif
}
/***********************************************************************************
 Function Name      : DrawPrimitive
					: 
 Returns            : -
 Description        : Selects and calls correct primitive draw function
************************************************************************************/
IMG_VOID DrawPrimitive ( LPD3DM_CONTEXT psContext, 
				D3DMPRIMITIVETYPE PrimType, 
				IMG_UINT32 ui32StartVertex,
				IMG_UINT32 ui32PrimitiveCount)
{
	/* select current vertex buffer */
	LPD3DM_VBUFFER	psCurrentVB = psContext->psVertexSource;
	LPVOID			pvData;
	PRIM_FILLMODE	eFillMode = psContext->ePrimFillMode;
	IMG_UINT32 		ui32StrideInBytes = psCurrentVB->dwStrideDW<<2;
	
	/* address to vertex data */
 	pvData = (LPVOID)((IMG_UINT32)psCurrentVB->pvVertexData + (ui32StartVertex * ui32StrideInBytes));
	
	/* FIXME: store the current prim type to avoid passing extra args */
	psContext->eCurrentPrimType = PrimType;

#if defined (FIX_HW_PRN_725_MBXLITE)

	/* Initialise Flags */
	psContext->dwHWPRN725Flags  &= ~HW_PRN_725_FLAGS_INDEXED;
	psContext->dwHWPRN725Flags  |= HW_PRN_725_FLAGS_STOREVERTS;
	psContext->dwHWPRN725Flags  &= ~HW_PRN_725_FLAGS_FAN_MODE;

#endif

	PROFILE_START_PRIM(PrimType, eFillMode);

	/* FIXME - Validate buffer access - i.e. that we're not goint to exceed the buffer length /*

	/* copy vertex data (and transform if SW TnL) */
	switch(PrimType)
	{
	    case D3DMPT_TRIANGLELIST:
		{
#if defined (FIX_HW_PRN_725_MBXLITE)
			if(eFillMode != PRIM_FILLMODE_WIREFRAME)
			{
				psContext->dwHWPRN725Flags  &= ~HW_PRN_725_FLAGS_STOREVERTS;
			}
#endif
			apfnTriList[eFillMode] 	(psContext,
									 pvData, 
									 psCurrentVB->dwFVFFlags, 
									 ui32StrideInBytes,
									 ui32PrimitiveCount);
			break;
		}
	    case D3DMPT_TRIANGLESTRIP:
		{
			apfnTriStrip[eFillMode] (psContext,
									 pvData, 
									 psCurrentVB->dwFVFFlags, 
									 ui32StrideInBytes,
									 ui32PrimitiveCount);
			break;
		}
	    case D3DMPT_TRIANGLEFAN:
		{
#if defined (FIX_HW_PRN_725_MBXLITE)
			if(eFillMode != PRIM_FILLMODE_WIREFRAME)
			{
				psContext->dwHWPRN725Flags  &= ~HW_PRN_725_FLAGS_STOREVERTS;
			}
#endif
			apfnTriFan[eFillMode] 	(psContext,
									 pvData, 
									 psCurrentVB->dwFVFFlags, 
									 ui32StrideInBytes,
									 ui32PrimitiveCount);
			break;
		}
		case D3DMPT_POINTLIST:
		{
#if defined (FIX_HW_PRN_725_MBXLITE)
			psContext->dwHWPRN725Flags  &= ~HW_PRN_725_FLAGS_STOREVERTS;
#endif
			apfnPointList[eFillMode](psContext,
									 pvData, 
									 psCurrentVB->dwFVFFlags, 
									 ui32StrideInBytes,
									 ui32PrimitiveCount);
			break;
		}
	    case D3DMPT_LINELIST:
		{
			apfnLineList[eFillMode]	(psContext,
						 			 pvData, 
									 psCurrentVB->dwFVFFlags, 
									 ui32StrideInBytes,
									 ui32PrimitiveCount);
			break;
		}
	    case D3DMPT_LINESTRIP:
		{
			apfnLineStrip[eFillMode](psContext,
									 pvData, 
									 psCurrentVB->dwFVFFlags, 
									 ui32StrideInBytes,
									 ui32PrimitiveCount);
			break;
		}
	    default:
			break;
	    	///error!!!!!!!!!!!!!!!!!!!!!!!!!!
    }

	PROFILE_STOP_PRIM(PrimType, eFillMode);
}
#endif /* SUPPORT_VGP */
/*****************************************************************************
 End of file (prim.c)
*****************************************************************************/

⌨️ 快捷键说明

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