📄 vgpcopy.h
字号:
case 28:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 27:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 26:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 25:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 24:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 23:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 22:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 21:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 20:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 19:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 18:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 17:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 16:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 15:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 14:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 13:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 12:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 11:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 10:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 9:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 8:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 7:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 6:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 5:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 4:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 3:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 2:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
case 1:
*pui32LinPortAddr++ = FX2FL(*pui32LinDataAddr++);
}
psContext->dwAllocatedFifoSpaceDWORDS -= ui32DWORDs;
PVRSRVRelease3DFifoSpace(psContext->sDevData.psDevInfoUM, (ui32DWORDs << 2));
}
/* Signal that we've sent some data to the TA */
psContext->psCurrentRenderTarget->sDescription.sSurface.bSceneTADataSent = TRUE;
}
/*----------------------------------------------------------------------------
<function>
FUNCTION: CopyVertices
PURPOSE: inline vertex data copy/convert
PARAMETERS: In: psContext - Current context
In: pbyData - vertex data pointer
In: ui32Vertices - vertex count
In: psVSIFDef - Input Format definition
</function>
------------------------------------------------------------------------------*/
__forceinline IMG_VOID CopyVertices(LPD3DM_CONTEXT psContext,
IMG_UINT8 *pbyData,
IMG_UINT32 ui32Vertices,
PVSIFDEF psVSIFDef)
{
VTXCOMPONENT *psComponents = &psVSIFDef->psComponents[0];
IMG_UINT32 ui32Size = psComponents->dwSize;
IMG_UINT32 ui32Offset = psComponents->dwOffset;
IMG_UINT32 dwStride = psVSIFDef->dwStride;
while(ui32Vertices--)
{
#if defined (FIX_HW_PRN_725_MBXLITE)
IMG_UINT32 ui32ISPTSPCtl = psContext->sHWState.sTACtl3DState.dwISPTSPCtl;
if((ui32ISPTSPCtl & MBX1_ISPTSPCTL_OFFSET) &&
((ui32ISPTSPCtl & MBX1_ISPTSPCTL_UVCOUNT) >> MBX1_ISPTSPCTL_UVCOUNTSHIFT) == 1)
{
/* We have an offset colour and 2 sets of tex coords so we need to limit strip length */
D3DM_PRIM_FUNCTION eFunction;
if(psContext->dwHWPRN725Flags & HW_PRN_725_FLAGS_INDEXED)
{
eFunction = (D3DM_PRIM_FUNCTION) sIndexedPrimLookup[(psContext->eCurrentPrimType * 3) + psContext->ePrimFillMode];
}
else
{
eFunction = (D3DM_PRIM_FUNCTION) sPrimLookup[(psContext->eCurrentPrimType * 3) + psContext->ePrimFillMode];
}
switch(eFunction)
{
case TRIANGLELIST:
case INDEXEDTRIANGLELIST:
{
if(psContext->dwNumVerticesSent == 3)
{
TACSWriteLastPrim(psContext);
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACELIST);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
}
break;
}
case TRIFANLINE: /* Uses line strips */
case INDEXEDTRIFANLINE: /* Uses line strips */
case TRILISTLINE: /* Uses line strips */
case INDEXEDTRILISTLINE: /* Uses line strips */
case TRISTRIPLINE: /* Uses line strips */
case INDEXEDTRISTRIPLINE: /* Uses line strips */
case LINELIST: /* Uses line strips */
case INDEXEDLINELIST: /* Uses line strips */
case LINESTRIP:
case INDEXEDLINESTRIP:
{
if(psContext->dwNumVerticesSent == 5)
{
/* End Strip */
TACSWriteEndPrim(psContext);
/* re-write last vertex */
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[1] + ui32Offset), ui32Size);
}
break;
}
case TRIANGLESTRIP:
case INDEXEDTRIANGLESTRIP:
{
if(psContext->dwHWPRN725Flags & HW_PRN_725_FLAGS_RESEND_LAST_TWO)
{
/* Terminate the last triangle before continuing */
TACSWriteEndPrim(psContext);
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[0] + ui32Offset), ui32Size);
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[1] + ui32Offset), ui32Size);
psContext->dwNumVerticesSent += 2;
psContext->dwHWPRN725Flags &= ~HW_PRN_725_FLAGS_RESEND_LAST_TWO;
}
if(psContext->dwNumVerticesSent == 5)
{
/* End the strip */
TACSWriteEndPrim(psContext);
if((psContext->dwTAPrimCtl & MBX1_TAPRIM_CULLMODEMASK) != MBX1_TAPRIM_CULLMODENONE)
{
/*
The next triangle is going to have incorrect cull sense so we need
to do a bit of jiggery pokery and swap the last two vertices before
resending, then send the next, then end the strip and flag that we
need to send the last two verts if we have no more vertices to send
with this call, or just resend the last two vertices if we are continuing
the strip in this call.
*/
/* Output the re-jigged vertices */
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[1] + ui32Offset), ui32Size);
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[0] + ui32Offset), ui32Size);
CopyData(psContext, ((IMG_UINT8*) pbyData + ui32Offset), ui32Size);
psContext->dwNumVerticesSent += 3;
/* move stored vertices on */
psContext->pbyVertices[0] = psContext->pbyVertices[1];
psContext->pbyVertices[1] = pbyData;
if(ui32Vertices-- == 0)
{
/* That was the last for this call, so return */
psContext->dwHWPRN725Flags |= HW_PRN_725_FLAGS_RESEND_LAST_TWO;
return;
}
else
{
/* Terminate the last triangle and restart the strip */
TACSWriteEndPrim(psContext);
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[0] + ui32Offset), ui32Size);
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[1] + ui32Offset), ui32Size);
psContext->dwNumVerticesSent += 2;
pbyData += dwStride;
}
}
else
{
/* We're currently not culling, so just continue */
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[0] + ui32Offset), ui32Size);
CopyData(psContext, ((IMG_UINT8*) psContext->pbyVertices[1] + ui32Offset), ui32Size);
psContext->dwNumVerticesSent += 2;
}
}
break;
}
case TRIANGLEFAN:
case INDEXEDTRIANGLEFAN:
{
/* HW will break fans into strips of MAX 5 vertices so Ignore this case */
break;
}
case POINTLIST:
case INDEXEDPOINTLIST:
{
if(psContext->dwNumVerticesSent == 5)
{
TACSWriteEndPrim(psContext);
}
break;
}
}
}
else
{
/* We're not using the Fix so don't store vertices */
psContext->dwHWPRN725Flags &= ~HW_PRN_725_FLAGS_STOREVERTS;
}
#endif
/* copy a vertex */
CopyData(psContext, ((IMG_UINT8*) pbyData + ui32Offset), ui32Size);
#if defined (FIX_HW_PRN_725_MBXLITE)
psContext->dwNumVerticesSent++;
if(psContext->dwHWPRN725Flags & HW_PRN_725_FLAGS_STOREVERTS)
{
psContext->pbyVertices[0] = psContext->pbyVertices[1];
psContext->pbyVertices[1] = pbyData;
}
#endif
/* Move to next vertex */
pbyData += dwStride;
}
}
/*----------------------------------------------------------------------------
<function>
FUNCTION: CopyVertexComponents
PURPOSE: inline vertex data copy/convert
PARAMETERS: In: psContext - Current context
In: pbyData - vertex data pointer
In: ui32Vertices - vertex count
In: psVSIFDef - Input Format definition
</function>
------------------------------------------------------------------------------*/
__forceinline IMG_VOID CopyVertexComponents(LPD3DM_CONTEXT psContext,
IMG_UINT8 *pbyData,
IMG_UINT32 ui32Vertices,
PVSIFDEF psVSIFDef)
{
VTXCOMPONENT *psComponents = &psVSIFDef->psComponents[0];
IMG_UINT32 ui32NumComponents = psVSIFDef->dwNumComponents;
IMG_UINT32 ui32Stride = psVSIFDef->dwStride;
IMG_UINT32 i, j;
for(i = 0; i < ui32Vertices; i++)
{
#if defined (FIX_HW_PRN_725_MBXLITE)
IMG_UINT32 ui32ISPTSPCtl = psContext->sHWState.sTACtl3DState.dwISPTSPCtl;
if((ui32ISPTSPCtl & MBX1_ISPTSPCTL_OFFSET) &&
((ui32ISPTSPCtl & MBX1_ISPTSPCTL_UVCOUNT) >> MBX1_ISPTSPCTL_UVCOUNTSHIFT) == 1)
{
/* We have an offset colour and 2 sets of tex coords so we need to limit strip length */
D3DM_PRIM_FUNCTION eFunction;
if(psContext->dwHWPRN725Flags & HW_PRN_725_FLAGS_INDEXED)
{
eFunction = (D3DM_PRIM_FUNCTION) sIndexedPrimLookup[(psContext->eCurrentPrimType * 3) + psContext->ePrimFillMode];
}
else
{
eFunction = (D3DM_PRIM_FUNCTION) sPrimLookup[(psContext->eCurrentPrimType * 3) + psContext->ePrimFillMode];
}
switch(eFunction)
{
case TRIANGLELIST:
case INDEXEDTRIANGLELIST:
{
if(psContext->dwNumVerticesSent == 3)
{
TACSWriteLastPrim(psContext);
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACELIST);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
}
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -