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