📄 fasttnl.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 + -