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

📄 fasttnl.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
字号:

/**************************************************************************
 * Name         : fasttnl.c
 * Author       : BCB
 * Created      : 23/12/2003
 *
 * Copyright    : 2003 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.
 *
 * Platform     : ANSI
 *
 * $Date: 2003/12/24 12:55:35 $ $Revision: 1.1 $
 * $Log: fasttnl.c $
 **************************************************************************/

#include "context.h"
#include "slaveport.h"

#if defined(SUPPORT_FASTTNL_PATH)

/***********************************************************************************
 Function Name      : FastCopyIndexedData
 Inputs             : gc, pui16Indices, ui32Count
 Outputs            : -
 Returns            : -
 Description        : Copies all needed (indexed) data from arrays to internal 
					  vertex structure
************************************************************************************/

static IMG_VOID FastCopyIndexedData(GLESContext *gc, IMG_UINT16 *pui16Indices, IMG_UINT32 ui32Count)
{
	GLuint i;
	GLESvertex *psVertex = &gc->sTransform.asVertex[0];
	IMG_VOID *pvCPointer, *pvTPointer0, *pvTPointer1, *pvVPointer;

	for(i=0; i<ui32Count; i++)
	{
		pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sVPState.ui32CopyStride);
		pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sCPState.ui32CopyStride);
		pvTPointer0 = gc->sVertexArray.asTPState[0].pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.asTPState[0].ui32CopyStride);
		pvTPointer1 = gc->sVertexArray.asTPState[1].pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.asTPState[1].ui32CopyStride);

		(*gc->sProcs.pfnCopyVertexData)(pvVPointer, &psVertex[i].sWindow);
		(*gc->sProcs.pfnCopyColorData)(pvCPointer, (GLEScoord *)&psVertex[i].sColor);
		(*gc->sProcs.apfnCopyTexCoordData[0])(pvTPointer0, &psVertex[i].asTexture[0]);
		(*gc->sProcs.apfnCopyTexCoordData[1])(pvTPointer1, &psVertex[i].asTexture[1]);
	}
}


/***********************************************************************************
 Function Name      : FastDrawTriangleStrip
 Inputs             : gc, ui32Start, ui32Count, pui16Indices
 Outputs            : -
 Returns            : -
 Description        : Deals with a triangle strip and performs SW TNL on the vertices
					  and outputs them to the slaveport.
************************************************************************************/
IMG_VOID FastDrawTriangleStrip(GLESContext *gc, IMG_UINT32 ui32Start, IMG_UINT32 ui32Count, IMG_UINT16 *pui16Indices)
{
	IMG_UINT32 ui32Loop;
	GLESvertex *psVertex = &gc->sTransform.asVertex[0];
	IMG_UINT16 aui16Index[3];
	IMG_BOOL bNewStrip = IMG_TRUE;
	IMG_UINT32 ui32NumStrips = 0;

	GLES_TIME_START(GLES_TIMER_TRISTRIP_TIME);

	if(gc->sPolygon.ui32CullFlag == GLES_CULLFLAG_BOTH)
	{
		GLES_TIME_STOP(GLES_TIMER_TRISTRIP_TIME);
		return;
	}
	
	if(ui32Count < 3) 
	{
		GLES_TIME_STOP(GLES_TIMER_TRISTRIP_TIME);
		return;
	}

	if(pui16Indices)
	{
		aui16Index[0] = pui16Indices[ui32Start];
		aui16Index[2] = pui16Indices[ui32Start+1];
	}
	else
	{
		aui16Index[0] = (IMG_UINT16) ui32Start;
		aui16Index[2] = (IMG_UINT16) ui32Start+1;
	}

	for(ui32Loop=ui32Start + 2; ui32Loop < ui32Count + ui32Start; ui32Loop++)
	{
		if ((ui32Loop-ui32Start) & 1)
		{
			aui16Index[0] = aui16Index[2];
		}
		else
		{
			aui16Index[1] = aui16Index[2];
		}
		
		if (pui16Indices)
		{
			aui16Index[2] = pui16Indices[ui32Loop];
		}
		else
		{
			aui16Index[2] = (IMG_UINT16)ui32Loop;
		}
	
		FastCopyIndexedData(gc, aui16Index, 3);
		
		if(bNewStrip)
		{
			if(ui32NumStrips)
			{
				EndPrimitive(gc);
			}
			else
			{
				StartTriangleStrip(gc);
			}
			ui32NumStrips++;
			
			(*gc->sProcs.pfnOutputVertices)(gc, psVertex, 3);
			
			/* Can't continue a new strip from an odd vertex: end strip + restart */
			if((ui32Loop + 1 - ui32Start) & 1)
			{
				bNewStrip = IMG_FALSE;
			}
			else
			{
				bNewStrip = IMG_TRUE;
			}
		}
		else
		{
			(*gc->sProcs.pfnOutputVertices)(gc, &psVertex[2], 1);
		}
		
	}

	if(ui32NumStrips)
		EndPrimitiveBlock(gc);

	GLES_TIME_STOP(GLES_TIMER_TRISTRIP_TIME);
}

static __inline IMG_UINT32 SwizzleColor(IMG_VOID *pvCPointer)
{
	IMG_UINT8 *pui8Color = (IMG_UINT8 *)pvCPointer;
	
	return (pui8Color[0] << 16) | (pui8Color[1] << 8) | pui8Color[2] | (pui8Color[3] << 24);
}

IMG_VOID FastOutputVerticesC(GLESContext *gc, IMG_UINT16 *pui16Indices, IMG_UINT32 ui32Start, IMG_UINT32 ui32Count)
{
	IMG_UINT32 i;
	IMG_VOID *pvCPointer, *pvVPointer;

	if(pui16Indices)
	{
		pui16Indices += ui32Start;

		for(i=0; i< ui32Count; i++)
		{
			IMG_UINT32 ui32Color;
			
			pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sVPState.ui32CopyStride);
			pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sCPState.ui32CopyStride);
			
			ui32Color = SwizzleColor(pvCPointer);
			
			WriteToSlavePort(gc, pvVPointer, 4);
			WriteToSlavePort(gc, &ui32Color, 1);
		}
		
	}
	else
	{
		for(i=ui32Start; i< ui32Count+ui32Start; i++)
		{
			IMG_UINT32 ui32Color;
			
			pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (i * gc->sVertexArray.sVPState.ui32CopyStride);
			pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (i * gc->sVertexArray.sCPState.ui32CopyStride);
			
			ui32Color = SwizzleColor(pvCPointer);
			
			WriteToSlavePort(gc, pvVPointer, 4);
			WriteToSlavePort(gc, &ui32Color, 1);
		}

	}
}

IMG_VOID FastOutputVerticesCT0(GLESContext *gc, IMG_UINT16 *pui16Indices, IMG_UINT32 ui32Start, IMG_UINT32 ui32Count)
{
	IMG_UINT32 i;
	IMG_VOID *pvCPointer, *pvVPointer, *pvTPointer1;

	if(pui16Indices)
	{
		pui16Indices += ui32Start;

		for(i=0; i< ui32Count; i++)
		{
			IMG_UINT32 ui32Color;
			
			pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sVPState.ui32CopyStride);
			pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sCPState.ui32CopyStride);
			pvTPointer1 = gc->sVertexArray.asTPState[0].pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.asTPState[0].ui32CopyStride);
			
			ui32Color = SwizzleColor(pvCPointer);
			
			WriteToSlavePort(gc, pvVPointer, 4);
			WriteToSlavePort(gc, &ui32Color, 1);
			WriteToSlavePort(gc, pvTPointer1, 2);
		}
		
	}
	else
	{
		pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (ui32Start * gc->sVertexArray.sVPState.ui32CopyStride);
		pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (ui32Start * gc->sVertexArray.sCPState.ui32CopyStride);
		pvTPointer1 = gc->sVertexArray.asTPState[0].pui8CopyPointer + (ui32Start * gc->sVertexArray.asTPState[0].ui32CopyStride);
		
		for(i=0; i< ui32Count; i++)
		{
			IMG_UINT32 ui32Color;
			
			ui32Color = SwizzleColor(pvCPointer);
			
			WriteToSlavePort(gc, pvVPointer, 4);
			WriteToSlavePort(gc, &ui32Color, 1);
			WriteToSlavePort(gc, pvTPointer1, 2);

			pvVPointer = (IMG_UINT8 *)pvVPointer + gc->sVertexArray.sVPState.ui32CopyStride;
			pvVPointer = (IMG_UINT8 *)pvCPointer + gc->sVertexArray.sCPState.ui32CopyStride;
			pvTPointer1 = (IMG_UINT8 *)pvTPointer1 + gc->sVertexArray.asTPState[0].ui32CopyStride;

		}
	}
}

IMG_VOID FastOutputVerticesCT1(GLESContext *gc, IMG_UINT16 *pui16Indices, IMG_UINT32 ui32Start, IMG_UINT32 ui32Count)
{
	IMG_UINT32 i;
	IMG_VOID *pvCPointer, *pvVPointer, *pvTPointer2;

	if(pui16Indices)
	{
		pui16Indices += ui32Start;

		for(i=0; i< ui32Count; i++)
		{
			IMG_UINT32 ui32Color;
			
			pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sVPState.ui32CopyStride);
			pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sCPState.ui32CopyStride);
			pvTPointer2 = gc->sVertexArray.asTPState[1].pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.asTPState[1].ui32CopyStride);
			
			ui32Color = SwizzleColor(pvCPointer);
			
			WriteToSlavePort(gc, pvVPointer, 4);
			WriteToSlavePort(gc, &ui32Color, 1);
			WriteToSlavePort(gc, pvTPointer2, 2);
		}
		
	}
	else
	{
		pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (ui32Start * gc->sVertexArray.sVPState.ui32CopyStride);
		pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (ui32Start * gc->sVertexArray.sCPState.ui32CopyStride);
		pvTPointer2 = gc->sVertexArray.asTPState[1].pui8CopyPointer + (ui32Start * gc->sVertexArray.asTPState[1].ui32CopyStride);
		
		for(i=0; i< ui32Count; i++)
		{
			IMG_UINT32 ui32Color;
				
			ui32Color = SwizzleColor(pvCPointer);
			
			WriteToSlavePort(gc, pvVPointer, 4);
			WriteToSlavePort(gc, &ui32Color, 1);
			WriteToSlavePort(gc, pvTPointer2, 2);
		
			pvVPointer = (IMG_UINT8 *)pvVPointer + gc->sVertexArray.sVPState.ui32CopyStride;
			pvCPointer = (IMG_UINT8 *)pvVPointer + gc->sVertexArray.sCPState.ui32CopyStride;
			pvTPointer2 = (IMG_UINT8 *)pvTPointer2 + gc->sVertexArray.asTPState[1].ui32CopyStride;
		}

	}
}


IMG_VOID FastOutputVerticesCMT(GLESContext *gc, IMG_UINT16 *pui16Indices, IMG_UINT32 ui32Start, IMG_UINT32 ui32Count)
{
	IMG_UINT32 i;
	IMG_VOID *pvCPointer, *pvVPointer, *pvTPointer1, *pvTPointer2;

	if(pui16Indices)
	{
		pui16Indices += ui32Start;

		for(i=0; i< ui32Count; i++)
		{
			IMG_UINT32 ui32Color;
			
			pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sVPState.ui32CopyStride);
			pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.sCPState.ui32CopyStride);
			pvTPointer1 = gc->sVertexArray.asTPState[0].pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.asTPState[0].ui32CopyStride);
			pvTPointer2 = gc->sVertexArray.asTPState[1].pui8CopyPointer + (pui16Indices[i] * gc->sVertexArray.asTPState[1].ui32CopyStride);
			
			ui32Color = SwizzleColor(pvCPointer);
			
			WriteToSlavePort(gc, pvVPointer, 4);
			WriteToSlavePort(gc, &ui32Color, 1);
			WriteToSlavePort(gc, pvTPointer1, 2);
			WriteToSlavePort(gc, pvTPointer2, 2);
		}
		
	}
	else
	{
		pvVPointer = gc->sVertexArray.sVPState.pui8CopyPointer + (ui32Start * gc->sVertexArray.sVPState.ui32CopyStride);
		pvCPointer = gc->sVertexArray.sCPState.pui8CopyPointer + (ui32Start * gc->sVertexArray.sCPState.ui32CopyStride);
		pvTPointer1 = gc->sVertexArray.asTPState[0].pui8CopyPointer + (ui32Start * gc->sVertexArray.asTPState[0].ui32CopyStride);
		pvTPointer2 = gc->sVertexArray.asTPState[1].pui8CopyPointer + (ui32Start * gc->sVertexArray.asTPState[1].ui32CopyStride);

		for(i=0; i< ui32Count; i++)
		{
			IMG_UINT32 ui32Color;
						
			ui32Color = SwizzleColor(pvCPointer);
			
			WriteToSlavePort(gc, pvVPointer, 4);
			WriteToSlavePort(gc, &ui32Color, 1);
			WriteToSlavePort(gc, pvTPointer1, 2);
			WriteToSlavePort(gc, pvTPointer2, 2);
			
			pvVPointer = (IMG_UINT8 *)pvVPointer + gc->sVertexArray.sVPState.ui32CopyStride;
			pvCPointer = (IMG_UINT8 *)pvVPointer + gc->sVertexArray.sCPState.ui32CopyStride;
			pvTPointer1 = (IMG_UINT8 *)pvTPointer1 + gc->sVertexArray.asTPState[0].ui32CopyStride;
			pvTPointer2 = (IMG_UINT8 *)pvTPointer2 + gc->sVertexArray.asTPState[1].ui32CopyStride;
		}

	}

}

/***********************************************************************************
 Function Name      : SuperFastDrawTriangleStrip
 Inputs             : gc, ui32Start, ui32Count, pui16Indices
 Outputs            : -
 Returns            : -
 Description        : Deals with a triangle strip and performs SW TNL on the vertices
					  and outputs them to the slaveport.
************************************************************************************/
IMG_VOID SuperFastDrawTriangleStrip(GLESContext *gc, IMG_UINT32 ui32Start, IMG_UINT32 ui32Count, IMG_UINT16 *pui16Indices)
{
	IMG_UINT32 ui32BlockHeader = MBX1_TAOBJTYPE_VERTEXFACESTRIP | gc->sHWContext.ui32PrimitiveHeader;

	GLES_TIME_START(GLES_TIMER_TRISTRIP_TIME);

	if(gc->sPolygon.ui32CullFlag == GLES_CULLFLAG_BOTH)
	{
		GLES_TIME_STOP(GLES_TIMER_TRISTRIP_TIME);
		return;
	}
	
	if(ui32Count < 3) 
	{
		GLES_TIME_STOP(GLES_TIMER_TRISTRIP_TIME);
		return;
	}

	WriteToSlavePort(gc, &ui32BlockHeader, 1);
			
	(*gc->sProcs.pfnFastOutputVertices)(gc, pui16Indices, ui32Start, ui32Count);
			
	EndPrimitiveBlock(gc);

	GLES_TIME_STOP(GLES_TIMER_TRISTRIP_TIME);
}
#endif

⌨️ 快捷键说明

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