📄 prim.c
字号:
/******************************************************************************
<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 + -