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

📄 primindexedvgp.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
<module>
* Name         : primindexedvgp.c
* Title        : D3DM indexed primitive functions for VGP
* 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  : D3DM indexed primitive functions for VGP
*
* Platform     : Windows CE
*
$Log: primindexedvgp.c $

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

#include "context.h"

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

#define NON_OPT_IDX_TRI_LIST
/***********************************************************************************
 Function Name      : IndexedTriangleList
************************************************************************************/
IMG_VOID IndexedTriangleList (LPD3DM_CONTEXT psContext,
							  IMG_UINT32	ui32FVFcode, 
							  BYTE			*pbVBData,
							  IMG_UINT32	ui32VBByteStride,
							  BYTE			*pbIBData,
							  IMG_UINT32	ui32IBByteStride,
							  IMG_UINT32	ui32PrimCount)
{

#ifdef NON_OPT_IDX_TRI_LIST

/***********************************************************************************
* Non optimised Indexed Triangle List											   * 
***********************************************************************************/

	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	DWORD i;
	IMG_UINT32	ui32IndexMask = psContext->ui32IndexMask;

	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACELIST);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	for(i=0; i<ui32PrimCount * 3; i++)
	{
		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}

		CopySelect(psContext,
				  (IMG_UINT8*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)), 
				  1,
				  &psContext->psVertexSource->sVSIFDef);
		
		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	}
	
/**********************************************************************************/
#else  /* NON_OPT_IDX_TRI_LIST */
/***********************************************************************************
* Optimised Indexed Triangle List												   * 
***********************************************************************************/



/**********************************************************************************/
#endif /* NON_OPT_IDX_TRI_LIST */

ErrorExit:

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

/***********************************************************************************
 Function Name      : IndexedTriangleStrip
************************************************************************************/
IMG_VOID IndexedTriangleStrip(LPD3DM_CONTEXT psContext,
							  IMG_UINT32	 ui32FVFcode, 
							  BYTE			 *pbVBData,
							  IMG_UINT32	 ui32VBByteStride,
							  BYTE			 *pbIBData,
							  IMG_UINT32	 ui32IBByteStride,
							  IMG_UINT32	 ui32PrimCount)
{
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	DWORD i;
	IMG_UINT32	ui32IndexMask = psContext->ui32IndexMask;

	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACESTRIP);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	for(i=0; i<ui32PrimCount + 2; i++)
	{
		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}

		CopySelect(psContext,
				  (IMG_UINT8*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)), 
				  1,
				  &psContext->psVertexSource->sVSIFDef);
		
		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	}

ErrorExit:

	/* End the primitive-block */
	TACSWriteLastPrim(psContext);
}
/***********************************************************************************
 Function Name      : IndexedTriangleFan
************************************************************************************/
IMG_VOID IndexedTriangleFan(LPD3DM_CONTEXT psContext,
					 IMG_UINT32	ui32FVFcode, 
					 BYTE *pbVBData,
					 IMG_UINT32 ui32VBByteStride,
					 BYTE *pbIBData,
					 IMG_UINT32 ui32IBByteStride,
					 IMG_UINT32 ui32PrimCount)
{
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	IMG_UINT32 i;
	IMG_UINT32	ui32IndexMask = psContext->ui32IndexMask;

	/* Write header to slave port */
	TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACEFAN);
	TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);

	for(i=0; i<ui32PrimCount + 2; i++)
	{
		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}

		CopySelect(psContext,
				  (IMG_UINT8*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)), 
				  1,
				  &psContext->psVertexSource->sVSIFDef);
		
		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	}

ErrorExit:

	/* End the primitive-block */
	TACSWriteLastPrim(psContext);
}
/***********************************************************************************
 Function Name      : IndexedPointList
************************************************************************************/
IMG_VOID IndexedPointList(LPD3DM_CONTEXT psContext,
					 IMG_UINT32	ui32FVFcode, 
					 BYTE *pbVBData,
					 IMG_UINT32 ui32VBByteStride,
					 BYTE *pbIBData,
					 IMG_UINT32 ui32IBByteStride,
					 IMG_UINT32 ui32PrimCount)
{
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	IMG_UINT32 i;
	IMG_UINT32	ui32IndexMask = psContext->ui32IndexMask;

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

	for(i=0; i<ui32PrimCount; i++)
	{
		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}

		CopySelect(psContext,
				  (IMG_UINT8*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)), 
				  1,
				  &psContext->psVertexSource->sVSIFDef);
		
		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;

	}

ErrorExit:

	TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
	TACSWriteTACtlAnd3DState ( 	psContext,
								MBX1_TASTATEPRES_ISPCTL,
								&psContext->sHWState.sTACtl3DState,
								TRUE);
#endif		
}
/***********************************************************************************
 Function Name      : IndexedLineList
************************************************************************************/
IMG_VOID IndexedLineList(LPD3DM_CONTEXT psContext,
					 IMG_UINT32	ui32FVFcode, 
					 BYTE *pbVBData,
					 IMG_UINT32 ui32VBByteStride,
					 BYTE *pbIBData,
					 IMG_UINT32 ui32IBByteStride,
					 IMG_UINT32 ui32PrimCount)
{
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	IMG_UINT32 i, j;
	IMG_UINT32	ui32IndexMask = psContext->ui32IndexMask;

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

	for(i=0; i<ui32PrimCount; i++)
	{
		for(j = 0; j < 2; j++)
		{
			/* Validate index value to prevent access violations */
			if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
			{
				psContext->hrLastError = D3DMERR_INVALIDCALL;
				goto ErrorExit;
			}

			CopySelect(psContext,
					  (IMG_UINT8*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)), 
					  1,
					  &psContext->psVertexSource->sVSIFDef);
			
			/* Advance pointer */
			pbIBData	+= ui32IBByteStride;
			pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
		}

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

ErrorExit:

	TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
	TACSWriteTACtlAnd3DState ( 	psContext,
								MBX1_TASTATEPRES_ISPCTL,
								&psContext->sHWState.sTACtl3DState,
								TRUE);
#endif				
}
/***********************************************************************************
 Function Name      : IndexedLineStrip
************************************************************************************/
IMG_VOID IndexedLineStrip(LPD3DM_CONTEXT psContext,
					 IMG_UINT32	ui32FVFcode, 
					 BYTE *pbVBData,
					 IMG_UINT32 ui32VBByteStride,
					 BYTE *pbIBData,
					 IMG_UINT32 ui32IBByteStride,
					 IMG_UINT32 ui32PrimCount)
{
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	IMG_UINT32 i;
	IMG_UINT32	ui32IndexMask = psContext->ui32IndexMask;

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

	for(i=0; i<ui32PrimCount + 1; i++)
	{
		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}

		CopySelect(psContext,
				  (IMG_UINT8*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)), 
				  1,
				  &psContext->psVertexSource->sVSIFDef);
		
		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	}

ErrorExit:

	TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
	TACSWriteTACtlAnd3DState ( 	psContext,
								MBX1_TASTATEPRES_ISPCTL,
								&psContext->sHWState.sTACtl3DState,
								TRUE);
#endif		
}
/***********************************************************************************
 Function Name      : IndexedTriListLine
************************************************************************************/
IMG_VOID IndexedTriListLine(LPD3DM_CONTEXT psContext,
							IMG_UINT32	ui32FVFcode, 
							BYTE *pbVBData,
							IMG_UINT32 ui32VBByteStride,
							BYTE *pbIBData,
							IMG_UINT32 ui32IBByteStride,
							IMG_UINT32 ui32PrimCount)
{
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	IMG_UINT32 i,j;
	IMG_UINT32	ui32IndexMask = psContext->ui32IndexMask;

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

	for(i=0; i<ui32PrimCount; i++)
	{
		IMG_UINT8 *pui8FirstVertex;

		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}

		pui8FirstVertex = (IMG_UINT8*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride));

		/* Draw first Vertex */
		CopySelect(psContext,
				  pui8FirstVertex, 
				  1,
				  &psContext->psVertexSource->sVSIFDef);
		
		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;

		for(j = 0; j < 2; j++)
		{
			/* Validate index value to prevent access violations */
			if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
			{
				psContext->hrLastError = D3DMERR_INVALIDCALL;
				goto ErrorExit;
			}

			CopySelect(psContext,
					  (IMG_UINT8*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)), 
					  1,
					  &psContext->psVertexSource->sVSIFDef);
			
			/* Advance pointer */
			pbIBData	+= ui32IBByteStride;
			pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
		}

		/* Draw first Vertex again */

⌨️ 快捷键说明

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