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

📄 prim.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
<module>
* Name         : Prim.c
* Title        : D3DM primcopy routines
* 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
*
* Platform     : Windows CE
*
</module>
********************************************************************************/

#include "context.h"

#if !defined(SUPPORT_VGP) && !defined (SUPPORT_VGP_LITE)

/*
	D3DM primitve types:
	====================
	Point List
	Line List
	Line Strip
	Triangle List
	Trianle Strip
	Triangle Fan
	
	Vertex Format components:
	=========================

	Position Options:
	-----------------
	XYZ_FLOAT
	XYZ_FIXED
	XYZRHW_FIXED
	XYZRHW_FLOAT

	Normal Options:
	---------------
	NORMAL_NONE
	NORMAL_FLOAT
	NORMAL_FIXED

	Diffuse:
	--------
	DIFFUSE_NONE
	DIFFUSE
	
	Specular:
	--------
	SPECULAR_NONE
	SPECULAR
	
	Texture 0 Options:
	------------------
	TEX0_NONE
	TEX0_2D_FLOAT
	TEX0_2D_FIXED

	Texture 1 Options:
	------------------
	TEX1_NONE
	TEX1_2D_FLOAT
	TEX1_2D_FIXED

	n.b. Texture Coord. Dimensionality fixed to 2 (u, v)
	
	Possible Combinations of each component: 4*3*2*2*3*3 = quite a few at first glance
	
	Therefore let's start out with a generic primitive copier
*/
/***********************************************************************************
 Function Name      : TriangleList
************************************************************************************/
IMG_VOID TriangleList(LPD3DM_CONTEXT psContext,
			IMG_UINT32 *pui32Data, 
			IMG_UINT32 ui32FVFcode, 
			IMG_UINT32 ui32Stride, 
			IMG_UINT32 ui32PrimCount)
{
	IMG_INT32  /*j, */i32NumVerts;
	IMG_UINT32 i;
	IMG_UINT32 ui32ClipCode;
	PVR_NATIVE_VERTEX asVertex[3], **ppsVertex, *apsVertex[3];
	IMG_BOOL bStartPrimitive = IMG_TRUE;
	IMG_BOOL bIsCounterClockwise;
	NTV_TYPE   ntvDepthM = D3DM_Zero;

	/* and quarter index stride for dword ptr arithmetic */
	ui32Stride >>= 2;

	/* set up ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];
	apsVertex[2] = &asVertex[2];
	
	for(i=0; i<ui32PrimCount; i++)
	{
		IMG_BOOL bPassCullTest;

		/* construct native vertices */
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[0]);
		pui32Data += ui32Stride;
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[1]);
		pui32Data += ui32Stride;
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[2]);
		pui32Data += ui32Stride;

		/* Store pointers to colours for flat shading */
		psContext->sTState.sSWTNLState.psCurrentFlatShadeDiffuse  = &apsVertex[0]->sDiffuseOut;
		psContext->sTState.sSWTNLState.psCurrentFlatShadeSpecular = &apsVertex[0]->sSpecularOut;

		/**********************
			clip test
		**********************/
		DoClipTestandVPTransform(psContext, &apsVertex[0], 3);
		
		/**********************
			Depth bias
		**********************/
		if(psContext->sTState.dwRSFlags & TSTATE_RSFLAGS_DEPTHBIAS)
		{
			/* Calculate value of m */
			NTV_TYPE ntvNewDepthM = TriangleMaxDepthSlope(apsVertex[0]);

			/* if m is different from previous m then calculate depth bias offset */
			if(ntvNewDepthM != ntvDepthM)
			{
				CalculateDepthBias(psContext,ntvNewDepthM);

				ntvDepthM = ntvNewDepthM;
			}
		}

		/* any vertices clipped? */
		ui32ClipCode =	 (apsVertex[0]->ui32Flags 
						| apsVertex[1]->ui32Flags 
						| apsVertex[2]->ui32Flags) & D3DM_CLIPFLAG_MASK;

		if ((ui32ClipCode & D3DM_CLIPFLAG_NEAR) == 0)
		{
			/* Check cull status */
			bIsCounterClockwise = IsCounterClockWise(&apsVertex[0]);
			switch(psContext->dwTAPrimCtl & MBX1_TAPRIM_CULLMODEMASK)
			{
				case MBX1_TAPRIM_CULLMODENONE:
					bPassCullTest = IMG_TRUE;
					break;
				case MBX1_TAPRIM_CULLMODECW:
					bPassCullTest = bIsCounterClockwise;
					break;
				case MBX1_TAPRIM_CULLMODECCW:
					bPassCullTest = !bIsCounterClockwise;
					break;
				default:
					///error
					break;
			}
		}
		else
		{
			bPassCullTest = TRUE;
		}

		if(!bPassCullTest)
		{
			continue;
		}
		else if(ui32ClipCode == 0)	/* no clipping: */
		{
			if(bStartPrimitive)
			{
				/*
					Start a new primitive block
				*/
				TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACELIST);
				bStartPrimitive = IMG_FALSE;
			}

			ValidateVertex(psContext, &apsVertex[0], 3);
			
			OutputVertices(psContext, &apsVertex[0], 3);

		}
		else if(!(apsVertex[0]->ui32Flags 
				& apsVertex[1]->ui32Flags 
				& apsVertex[2]->ui32Flags & D3DM_CLIPFLAG_MASK))
		{
			ValidateVertex(psContext, &apsVertex[0], 3);

			i32NumVerts = DoPolygonClip(psContext, &apsVertex[0], 3, ui32ClipCode);

			ppsVertex = psContext->sTState.sSWTNLState.ppsOutputArray;

			if(!bStartPrimitive)
			{
				TACSWriteLastPrim(psContext);
			}

			TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACEFAN);
			OutputVertices(psContext, ppsVertex, i32NumVerts);
			TACSWriteLastPrim(psContext);
			bStartPrimitive = IMG_TRUE;
		}
	}	

	/*
		End the primitive-block if we've had geometry
	*/
	if(!bStartPrimitive)
	{
		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, j, ui32NumVerts;
	IMG_UINT32 ui32ClipCode;
	PVR_NATIVE_VERTEX asVertex[3], **ppsVertex, *apsVertex[4];
	IMG_BOOL bStartPrimitive = IMG_TRUE;
	NTV_TYPE   ntvDepthM = D3DM_Zero;

	/* and quarter index stride for dword ptr arithmetic */
	ui32Stride >>= 2;
	
	/* set up ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];
	apsVertex[2] = &asVertex[2];
	apsVertex[3] = &asVertex[0];/* wrap to close the triangle */

	for(i=0; i<ui32PrimCount; i++)
	{
		/* construct native vertices */
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[0]);
		pui32Data += ui32Stride;
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[1]);
		pui32Data += ui32Stride;
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[2]);
		pui32Data += ui32Stride;

		/* Store pointers to colours for flat shading */
		psContext->sTState.sSWTNLState.psCurrentFlatShadeDiffuse  = &apsVertex[0]->sDiffuseOut;
		psContext->sTState.sSWTNLState.psCurrentFlatShadeSpecular = &apsVertex[0]->sSpecularOut;

		/**********************
			clip test
		**********************/
		DoClipTestandVPTransform(psContext, &apsVertex[0], 3);
		
		/**********************
			Depth bias
		**********************/
		if(psContext->sTState.dwRSFlags & TSTATE_RSFLAGS_DEPTHBIAS)
		{
			/* Calculate value of m */
			NTV_TYPE ntvNewDepthM = TriangleMaxDepthSlope(apsVertex[0]);

			/* if m is different from previous m then calculate depth bias offset */
			if(ntvNewDepthM != ntvDepthM)
			{
				CalculateDepthBias(psContext,ntvNewDepthM);

				ntvDepthM = ntvNewDepthM;
			}
		}
		
		/* any vertices clipped? */
		ui32ClipCode =	( apsVertex[0]->ui32Flags 
						| apsVertex[1]->ui32Flags 
						| apsVertex[2]->ui32Flags ) & D3DM_CLIPFLAG_MASK;
		
		if (ui32ClipCode == 0)	/* no clipping: */
		{
			if (bStartPrimitive)
			{
				/*
					Start a new primitive block
				*/
				TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
				TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
				bStartPrimitive = IMG_FALSE;
			}

			ValidateVertex(psContext, &apsVertex[0], 3);
			
			OutputVertices(psContext, &apsVertex[0], 4);

			TACSWriteEndPrim(psContext);
		}
		else if(!( apsVertex[0]->ui32Flags 
				&  apsVertex[1]->ui32Flags 
				&  apsVertex[2]->ui32Flags & D3DM_CLIPFLAG_MASK)) /* clipped line: */
		{

			ValidateVertex(psContext, &apsVertex[0], 3);

			/* go through segments */
			for (j=0; j<3; j++)
			{
				ui32NumVerts = DoLineClip(psContext, apsVertex[j], apsVertex[j+1], ui32ClipCode);
				if(ui32NumVerts)
				{
					if (bStartPrimitive)
					{
						/* Start a new primitive block */
						TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
						TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
						bStartPrimitive = IMG_FALSE;
					}
					ppsVertex = psContext->sTState.sSWTNLState.ppsOutputArray;		
					OutputVertices(psContext, ppsVertex, ui32NumVerts);
					TACSWriteEndPrim(psContext);
				}
			}
		}
		else
		{
			/* completely clipped out */
		}
	}	

	/*
		End the primitive-block if we've had geometry
	*/
	if(!bStartPrimitive)
	{
		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, ui32NumVerts;
	IMG_UINT32 ui32ClipCode;
	PVR_NATIVE_VERTEX asVertex[2], **ppsVertex, *apsVertex[2];
	IMG_BOOL bStartPrimitive = IMG_TRUE;

	/* and quarter index stride for dword ptr arithmetic */
	ui32Stride >>= 2;
	
	/* set up ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];

	for(i=0; i<ui32PrimCount; i++)
	{
		/* construct native vertices */
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[0]);
		pui32Data += ui32Stride;
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[1]);
		pui32Data += ui32Stride;

		/* Store pointers to colours for flat shading */
		psContext->sTState.sSWTNLState.psCurrentFlatShadeDiffuse  = &apsVertex[0]->sDiffuseOut;
		psContext->sTState.sSWTNLState.psCurrentFlatShadeSpecular = &apsVertex[0]->sSpecularOut;

		/**********************
			clip test
		**********************/
		DoClipTestandVPTransform(psContext, &apsVertex[0], 2);
		
		/* any vertices clipped? */
		ui32ClipCode =	 (apsVertex[0]->ui32Flags | apsVertex[1]->ui32Flags) & D3DM_CLIPFLAG_MASK;
		
		if (ui32ClipCode == 0)	/* no clipping: */
		{
			if (bStartPrimitive)
			{
				/*
					Start a new primitive block
				*/
				TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
				TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
				bStartPrimitive = IMG_FALSE;
			}

			ValidateVertex(psContext, &apsVertex[0], 2);
			
			OutputVertices(psContext, &apsVertex[0], 2);

			TACSWriteEndPrim(psContext);
		}
		else if(!(apsVertex[0]->ui32Flags 
				& apsVertex[1]->ui32Flags 
				& D3DM_CLIPFLAG_MASK))
		{
			if (bStartPrimitive)
			{
				/*
					Start a new primitive block
				*/
				TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
				TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
				bStartPrimitive = IMG_FALSE;
			}

			ValidateVertex(psContext, &apsVertex[0], 2);

			ui32NumVerts = DoLineClip(psContext, apsVertex[0], apsVertex[1], ui32ClipCode);

			ppsVertex = psContext->sTState.sSWTNLState.ppsOutputArray;

			OutputVertices(psContext, ppsVertex, ui32NumVerts);

			TACSWriteEndPrim(psContext);
		}
	}	

	/*
		End the primitive-block if we've had geometry
	*/
	if(!bStartPrimitive)
	{
		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)
{
	IMG_UINT32 i, ui32NumVerts;
	IMG_UINT32 ui32ClipCode;
	PVR_NATIVE_VERTEX asVertex[2], **ppsVertex, *apsVertex[2], *psVTmp;
	IMG_BOOL bNewStrip = IMG_TRUE;
	IMG_UINT32 ui32NumStrips = 0;


	/* and quarter index stride for dword ptr arithmetic */
	ui32Stride >>= 2;
	
	/* set up ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];

	/* construct native vertices */
	SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[0]);
	pui32Data += ui32Stride;

	/**********************
		clip test
	**********************/
	DoClipTestandVPTransform(psContext, &apsVertex[0], 1);

	for(i=0; i<ui32PrimCount; i++)
	{
		/* construct native vertices */
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[1]);
		pui32Data += ui32Stride;

		/* Store pointers to colours for flat shading */

⌨️ 快捷键说明

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