📄 primvgp.c
字号:
/******************************************************************************
<module>
* Name : Primvgp.c
* Title : D3DM primcopy routines for vgp
* 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 for vgp
*
* Platform : Windows CE
*
$Log: primvgp.c $
</module>
********************************************************************************/
#include "context.h"
#if defined (SUPPORT_VGP) || defined (SUPPORT_VGP_LITE)
/***********************************************************************************
Function Name : TriangleList
************************************************************************************/
IMG_VOID TriangleList(LPD3DM_CONTEXT psContext,
IMG_UINT32 *pui32Data,
IMG_UINT32 ui32FVFcode,
IMG_UINT32 ui32Stride,
IMG_UINT32 ui32PrimCount)
{
/* Write header to slave port */
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACELIST);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
CopySelect(psContext,
(IMG_UINT8*)pui32Data,
(ui32PrimCount * 3),
&psContext->psVertexSource->sVSIFDef);
/* End the primitive-block */
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;
ui32Stride >>= 2;
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
for(i = 0; i < ui32PrimCount; i++)
{
CopySelect(psContext, (IMG_UINT8*)pui32Data, 3, &psContext->psVertexSource->sVSIFDef);
CopySelect(psContext, (IMG_UINT8*)pui32Data, 1, &psContext->psVertexSource->sVSIFDef);
if(i < ui32PrimCount)
{
TACSWriteEndPrim(psContext);
}
pui32Data += ui32Stride * 3;
}
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;
ui32Stride >>= 2;
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
for(i = 0; i < ui32PrimCount; i++)
{
CopySelect(psContext, (IMG_UINT8*)pui32Data, 2, &psContext->psVertexSource->sVSIFDef);
if(i < ui32PrimCount)
{
TACSWriteEndPrim(psContext);
}
pui32Data += ui32Stride * 2;
}
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)
{
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
CopySelect(psContext, (IMG_UINT8*)pui32Data, ui32PrimCount + 1, &psContext->psVertexSource->sVSIFDef);
TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
TACSWriteTACtlAnd3DState ( psContext,
MBX1_TASTATEPRES_ISPCTL,
&psContext->sHWState.sTACtl3DState,
TRUE);
#endif
}
/***********************************************************************************
Function Name : TriangleStrip
************************************************************************************/
IMG_VOID TriangleStrip( LPD3DM_CONTEXT psContext,
IMG_UINT32 *pui32Data,
IMG_UINT32 ui32FVFcode,
IMG_UINT32 ui32Stride,
IMG_UINT32 ui32PrimCount)
{
/* Write header to slave port */
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACESTRIP);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
CopySelect(psContext,
(IMG_UINT8*)pui32Data,
ui32PrimCount + 2 ,
&psContext->psVertexSource->sVSIFDef);
/* End the primitive-block */
TACSWriteLastPrim(psContext);
}
/***********************************************************************************
Function Name : TriStripLine
************************************************************************************/
IMG_VOID TriStripLine( LPD3DM_CONTEXT psContext,
IMG_UINT32 *pui32Data,
IMG_UINT32 ui32FVFcode,
IMG_UINT32 ui32Stride,
IMG_UINT32 ui32PrimCount)
{
IMG_UINT32 i;
ui32Stride >>= 2;
/* Write header to slave port */
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
for(i = 0; i < ui32PrimCount; i++)
{
CopySelect(psContext, (IMG_UINT8*)pui32Data, 3, &psContext->psVertexSource->sVSIFDef);
CopySelect(psContext, (IMG_UINT8*)pui32Data, 1, &psContext->psVertexSource->sVSIFDef);
if(i < ui32PrimCount)
{
TACSWriteEndPrim(psContext);
}
pui32Data += ui32Stride;
}
TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
TACSWriteTACtlAnd3DState ( psContext,
MBX1_TASTATEPRES_ISPCTL,
&psContext->sHWState.sTACtl3DState,
TRUE);
#endif
}
/***********************************************************************************
Function Name : TriFanLine
************************************************************************************/
IMG_VOID TriFanLine(LPD3DM_CONTEXT psContext,
IMG_UINT32 *pui32Data,
IMG_UINT32 ui32FVFcode,
IMG_UINT32 ui32Stride,
IMG_UINT32 ui32PrimCount)
{
IMG_UINT32 i;
IMG_UINT32 *pui32FirstVertex = pui32Data;
ui32Stride >>= 2;
/* Write header to slave port */
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
/* Move pointer to second vertex */
pui32Data += ui32Stride;
for(i = 0; i < ui32PrimCount; i++)
{
CopySelect(psContext, (IMG_UINT8*)pui32FirstVertex, 1, &psContext->psVertexSource->sVSIFDef);
CopySelect(psContext, (IMG_UINT8*)pui32Data, 2, &psContext->psVertexSource->sVSIFDef);
CopySelect(psContext, (IMG_UINT8*)pui32FirstVertex, 1, &psContext->psVertexSource->sVSIFDef);
if(i < ui32PrimCount)
{
TACSWriteEndPrim(psContext);
}
pui32Data += ui32Stride;
}
TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
TACSWriteTACtlAnd3DState ( psContext,
MBX1_TASTATEPRES_ISPCTL,
&psContext->sHWState.sTACtl3DState,
TRUE);
#endif
}
/***********************************************************************************
Function Name : TriFan
************************************************************************************/
IMG_VOID TriangleFan(LPD3DM_CONTEXT psContext,
IMG_UINT32 *pui32Data,
IMG_UINT32 ui32FVFcode,
IMG_UINT32 ui32Stride,
IMG_UINT32 ui32PrimCount)
{
/* Write header to slave port */
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACEFAN);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
CopySelect(psContext,
(IMG_UINT8*)pui32Data,
ui32PrimCount + 2 ,
&psContext->psVertexSource->sVSIFDef);
/* End the primitive-block */
TACSWriteLastPrim(psContext);
}
/***********************************************************************************
Function Name : PointList
************************************************************************************/
IMG_VOID PointList( LPD3DM_CONTEXT psContext,
IMG_UINT32 *pui32Data,
IMG_UINT32 ui32FVFcode,
IMG_UINT32 ui32Stride,
IMG_UINT32 ui32PrimCount)
{
/* Write header to slave port */
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_POINTS);
TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
CopySelect(psContext,
(IMG_UINT8*)pui32Data,
ui32PrimCount,
&psContext->psVertexSource->sVSIFDef);
/* End the primitive-block */
TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
TACSWriteTACtlAnd3DState ( psContext,
MBX1_TASTATEPRES_ISPCTL,
&psContext->sHWState.sTACtl3DState,
TRUE);
#endif
}
/***********************************************************************************
Function Name : DrawPrimitive
:
Returns : -
Description : Selects and calls correct primitive draw function
************************************************************************************/
IMG_VOID DrawPrimitive ( LPD3DM_CONTEXT psContext,
D3DMPRIMITIVETYPE PrimType,
IMG_UINT32 ui32StartVertex,
IMG_UINT32 ui32PrimitiveCount)
{
/* select current vertex buffer */
LPD3DM_VBUFFER psCurrentVB = psContext->psVertexSource;
LPVOID pvData;
PRIM_FILLMODE eFillMode = psContext->ePrimFillMode;
IMG_UINT32 ui32StrideInBytes = psCurrentVB->dwStrideDW<<2;
/* address to vertex data */
pvData = (LPVOID)((IMG_UINT32)psCurrentVB->pvVertexData + (ui32StartVertex * ui32StrideInBytes));
/* FIXME: store the current prim type to avoid passing extra args */
psContext->eCurrentPrimType = PrimType;
#if defined (FIX_HW_PRN_725_MBXLITE)
/* Initialise Flags */
psContext->dwHWPRN725Flags &= ~HW_PRN_725_FLAGS_INDEXED;
psContext->dwHWPRN725Flags |= HW_PRN_725_FLAGS_STOREVERTS;
psContext->dwHWPRN725Flags &= ~HW_PRN_725_FLAGS_FAN_MODE;
#endif
PROFILE_START_PRIM(PrimType, eFillMode);
/* FIXME - Validate buffer access - i.e. that we're not goint to exceed the buffer length /*
/* copy vertex data (and transform if SW TnL) */
switch(PrimType)
{
case D3DMPT_TRIANGLELIST:
{
#if defined (FIX_HW_PRN_725_MBXLITE)
if(eFillMode != PRIM_FILLMODE_WIREFRAME)
{
psContext->dwHWPRN725Flags &= ~HW_PRN_725_FLAGS_STOREVERTS;
}
#endif
apfnTriList[eFillMode] (psContext,
pvData,
psCurrentVB->dwFVFFlags,
ui32StrideInBytes,
ui32PrimitiveCount);
break;
}
case D3DMPT_TRIANGLESTRIP:
{
apfnTriStrip[eFillMode] (psContext,
pvData,
psCurrentVB->dwFVFFlags,
ui32StrideInBytes,
ui32PrimitiveCount);
break;
}
case D3DMPT_TRIANGLEFAN:
{
#if defined (FIX_HW_PRN_725_MBXLITE)
if(eFillMode != PRIM_FILLMODE_WIREFRAME)
{
psContext->dwHWPRN725Flags &= ~HW_PRN_725_FLAGS_STOREVERTS;
}
#endif
apfnTriFan[eFillMode] (psContext,
pvData,
psCurrentVB->dwFVFFlags,
ui32StrideInBytes,
ui32PrimitiveCount);
break;
}
case D3DMPT_POINTLIST:
{
#if defined (FIX_HW_PRN_725_MBXLITE)
psContext->dwHWPRN725Flags &= ~HW_PRN_725_FLAGS_STOREVERTS;
#endif
apfnPointList[eFillMode](psContext,
pvData,
psCurrentVB->dwFVFFlags,
ui32StrideInBytes,
ui32PrimitiveCount);
break;
}
case D3DMPT_LINELIST:
{
apfnLineList[eFillMode] (psContext,
pvData,
psCurrentVB->dwFVFFlags,
ui32StrideInBytes,
ui32PrimitiveCount);
break;
}
case D3DMPT_LINESTRIP:
{
apfnLineStrip[eFillMode](psContext,
pvData,
psCurrentVB->dwFVFFlags,
ui32StrideInBytes,
ui32PrimitiveCount);
break;
}
default:
break;
///error!!!!!!!!!!!!!!!!!!!!!!!!!!
}
PROFILE_STOP_PRIM(PrimType, eFillMode);
}
#endif /* SUPPORT_VGP */
/*****************************************************************************
End of file (prim.c)
*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -