📄 vertex.c
字号:
if(ui32ISPTSPCtl & MBX1_ISPTSPCTL_OFFSET)
{
if(psContext->sTState.dwRSFlags & TSTATE_RSFLAGS_FLAT_SHADING &&
psContext->eCurrentPrimType != D3DMPT_TRIANGLESTRIP &&
psContext->eCurrentPrimType != D3DMPT_LINESTRIP &&
psContext->eCurrentPrimType != D3DMPT_TRIANGLEFAN)
{
NTV_TYPE ntvAlphaChannel = (psVertex->ui32Flags & D3DM_HASFLAG_FOG) ?
psVertex->sSpecularOut.a :
psFlatSpecular->a;
*((IMG_UINT32*) pvLinPortAddr)++ = (AS_ULONG(Mul(ntvAlphaChannel, LONG_AS_NTV(255)))<<24)
| (AS_ULONG(Mul(psFlatSpecular->r, LONG_AS_NTV(255)))<<16)
| (AS_ULONG(Mul(psFlatSpecular->g, LONG_AS_NTV(255)))<<8)
| AS_ULONG(Mul(psFlatSpecular->b, LONG_AS_NTV(255)));
#if defined (PDUMP)
PDumpSlavePort(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, (AS_ULONG(Mul(ntvAlphaChannel, LONG_AS_NTV(255)))<<24)
| (AS_ULONG(Mul(psFlatSpecular->r, LONG_AS_NTV(255)))<<16)
| (AS_ULONG(Mul(psFlatSpecular->g, LONG_AS_NTV(255)))<<8)
| AS_ULONG(Mul(psFlatSpecular->b, LONG_AS_NTV(255))));
#endif
}
else
{
*((IMG_UINT32*) pvLinPortAddr)++ = (AS_ULONG(Mul(psVertex->sSpecularOut.a, LONG_AS_NTV(255)))<<24)
| (AS_ULONG(Mul(psVertex->sSpecularOut.r, LONG_AS_NTV(255)))<<16)
| (AS_ULONG(Mul(psVertex->sSpecularOut.g, LONG_AS_NTV(255)))<<8)
| AS_ULONG(Mul(psVertex->sSpecularOut.b, LONG_AS_NTV(255)));
#if defined (PDUMP)
PDumpSlavePort(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, (AS_ULONG(Mul(psVertex->sSpecularOut.a, LONG_AS_NTV(255)))<<24)
| (AS_ULONG(Mul(psVertex->sSpecularOut.r, LONG_AS_NTV(255)))<<16)
| (AS_ULONG(Mul(psVertex->sSpecularOut.g, LONG_AS_NTV(255)))<<8)
| AS_ULONG(Mul(psVertex->sSpecularOut.b, LONG_AS_NTV(255))));
#endif
}
}
if(ui32ISPTSPCtl & MBX1_ISPTSPCTL_UVCOUNT)
{
IMG_UINT32 ui32UVCount = (ui32ISPTSPCtl & MBX1_ISPTSPCTL_UVCOUNT) >> MBX1_ISPTSPCTL_UVCOUNTSHIFT;
for(i=0; i <= ui32UVCount; i++)
{
switch(psVertex->sTextures[i].ui32NumOut)
{
case 0:
{
*((NTV_TYPE*) pvLinPortAddr)++ = D3DM_Zero;
*((NTV_TYPE*) pvLinPortAddr)++ = D3DM_Zero;
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(ntvZero));
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(ntvZero));
break;
}
case 1:
{
*((NTV_TYPE*) pvLinPortAddr)++ = CLAMP_LOWER(psVertex->sTextures[i].x);
*((NTV_TYPE*) pvLinPortAddr)++ = D3DM_Zero;
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(psVertex->sTextures[i].x));
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(ntvZero));
break;
}
case 2:
case 3:
default:
{
*((NTV_TYPE*) pvLinPortAddr)++ = CLAMP_LOWER(psVertex->sTextures[i].x);
*((NTV_TYPE*) pvLinPortAddr)++ = CLAMP_LOWER(psVertex->sTextures[i].y);
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(psVertex->sTextures[i].x));
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(psVertex->sTextures[i].y));
break;
}
}
}
}
else if(ui32ISPTSPCtl & MBX1_ISPTSPCTL_NUMPASSESMASK)
{
switch(psVertex->sTextures[0].ui32NumOut)
{
case 0:
{
*((NTV_TYPE*) pvLinPortAddr)++ = D3DM_Zero;
*((NTV_TYPE*) pvLinPortAddr)++ = D3DM_Zero;
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(ntvZero));
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(ntvZero));
break;
}
case 1:
{
*((NTV_TYPE*) pvLinPortAddr)++ = CLAMP_LOWER(psVertex->sTextures[0].x);
*((NTV_TYPE*) pvLinPortAddr)++ = D3DM_Zero;
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(psVertex->sTextures[0].x));
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(ntvZero));
break;
}
case 2:
case 3:
default:
{
*((NTV_TYPE*) pvLinPortAddr)++ = CLAMP_LOWER(psVertex->sTextures[0].x);
*((NTV_TYPE*) pvLinPortAddr)++ = CLAMP_LOWER(psVertex->sTextures[0].y);
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(psVertex->sTextures[0].x));
PDUMPSP(psContext->psPDContext, PDUMPTAGS_SP_MBX_DATA, TO_ULONG(psVertex->sTextures[0].y));
break;
}
}
}
ui32DWWritten += ui32VertexSizeDW;
#if defined (FIX_HW_PRN_725_MBXLITE)
psContext->dwNumVerticesSent++;
if(psContext->dwHWPRN725Flags & HW_PRN_725_FLAGS_STOREVERTS)
{
psContext->sVertices[0] = psContext->sVertices[1];
psContext->sVertices[1] = *psVertex;
}
#endif
}
psContext->dwAllocatedFifoSpaceDWORDS -= ui32RequiredDataSize;
PVRSRVRelease3DFifoSpace(psDevData->psDevInfoUM, (ui32RequiredDataSize << 2));
/* Signal that we've sent some data to the TA */
psContext->psCurrentRenderTarget->sDescription.sSurface.bSceneTADataSent = TRUE;
PROFILE_STOP_FUNC(OUTPUT_VERTICES);
}
#endif /*(!defined(SUPPORT_VGP) && !defined(SUPPORT_VGP_LITE))*/
#if (defined(SUPPORT_VGP) && (COREVERSION < 13)) || \
(defined(SUPPORT_VGP_LITE) && (COREVERSION < 120)) || \
(!defined(SUPPORT_VGP) && !defined(SUPPORT_VGP_LITE))
/***********************************************************************************
Function Name : WriteBackVertices
Returns :
Description : Writes transformed and lit vertices back to a user vertex buffer
************************************************************************************/
IMG_VOID WriteBackVertices(LPD3DM_CONTEXT psContext,
PVR_NATIVE_VERTEX **ppsVertex,
IMG_UINT32 ui32FVFcode,
IMG_VOID *pvData,
IMG_UINT32 ui32VertexCount)
{
PVR_NATIVE_VERTEX *psVertex;
IMG_UINT32 i;
IMG_UINT32 ui32TexCount;
DWORD dwRotation = 0;
PROFILE_START_FUNC(WRITE_BACK_VERTICES);
if (ui32VertexCount == 0)
{
/* no vertices to write */
return;
}
while(ui32VertexCount--)
{
psVertex = *ppsVertex++;
/*********************
Position:
*********************/
switch (ui32FVFcode & D3DMFVF_POSITION_MASK)
{
case D3DMFVF_XYZRHW_FLOAT:
*((IMG_FLOAT*)pvData)++ = NTV2FL(psVertex->sWindow.x);
*((IMG_FLOAT*)pvData)++ = NTV2FL(psVertex->sWindow.y);
*((IMG_FLOAT*)pvData)++ = PRNTV2FL(psVertex->sWindow.z);
*((IMG_FLOAT*)pvData)++ = PRNTV2FL(psVertex->sWindow.w);
break;
case D3DMFVF_XYZRHW_FIXED:
*((IMG_FIXED*)pvData)++ = NTV2FX(psVertex->sWindow.x);
*((IMG_FIXED*)pvData)++ = NTV2FX(psVertex->sWindow.y);
*((IMG_FIXED*)pvData)++ = PRNTV2FX(psVertex->sWindow.z);
*((IMG_FIXED*)pvData)++ = PRNTV2FX(psVertex->sWindow.w);
break;
default:
//error!!!!!!!!!!!
break;
}
/*********************
Colours:
*********************/
/* Check for diffuse copy status */
if((ui32FVFcode & D3DMFVF_DIFFUSE) &&
!(psContext->dwFlags & D3DM_CONTEXT_SWFLAGS_PROCVERT_NO_DIFFUSE_COPY))
{
IMG_UINT32 ui32Tmp = 0;
ui32Tmp = (AS_ULONG(Mul(psVertex->sDiffuseOut.a, LONG_AS_NTV(255)))<<24)
| (AS_ULONG(Mul(psVertex->sDiffuseOut.r, LONG_AS_NTV(255)))<<16)
| (AS_ULONG(Mul(psVertex->sDiffuseOut.g, LONG_AS_NTV(255)))<<8)
| AS_ULONG(Mul(psVertex->sDiffuseOut.b, LONG_AS_NTV(255)));
*((IMG_UINT32*)pvData)++ = ui32Tmp;
}
else if(ui32FVFcode & D3DMFVF_DIFFUSE)
{
/* Move past diffuse */
((IMG_UINT32*)pvData)++;
}
/* Check for specular copy status */
if((ui32FVFcode & D3DMFVF_SPECULAR) &&
!(psContext->dwFlags & D3DM_CONTEXT_SWFLAGS_PROCVERT_NO_SPECULAR_COPY))
{
IMG_UINT32 ui32Tmp = 0;
ui32Tmp = (AS_ULONG(Mul(psVertex->sSpecularOut.a, LONG_AS_NTV(255)))<<24)
| (AS_ULONG(Mul(psVertex->sSpecularOut.r, LONG_AS_NTV(255)))<<16)
| (AS_ULONG(Mul(psVertex->sSpecularOut.g, LONG_AS_NTV(255)))<<8)
| AS_ULONG(Mul(psVertex->sSpecularOut.b, LONG_AS_NTV(255)));
*((IMG_UINT32*)pvData)++ = ui32Tmp;
}
else if(ui32FVFcode & D3DMFVF_SPECULAR)
{
/* Move past specular */
((IMG_UINT32*)pvData)++;
}
/*********************
Textures:
*********************/
switch (ui32FVFcode & D3DMFVF_TEXCOUNT_MASK)
{
case D3DMFVF_TEX0:
ui32TexCount = 0;
break;
case D3DMFVF_TEX1:
ui32TexCount = 1;
break;
case D3DMFVF_TEX2:
ui32TexCount = 2;
break;
case D3DMFVF_TEX3:
case D3DMFVF_TEX4:
default:
ui32TexCount = 2;
//error - don't support more than 2 layers
break;
}
/* Output tex co-ords */
for (i=0; i<ui32TexCount; i++)
{
IMG_UINT32 ui32NumOut = psVertex->sTextures[i].ui32NumOut;
/* Check for copy status of this co-ord set */
if(!(((psContext->dwFlags & D3DM_CONTEXT_SWFLAGS_PROCVERT_NO_TEX_COPY_MASK) >>
(D3DM_CONTEXT_SWFLAGS_PROCVERT_NO_TEX_COPY_SHIFT + i)) & 0x00000001))
{
if(((ui32FVFcode>>(24+(i*2))) & 0x3) == D3DMFVF_TEXCOORDFORMAT_FLOAT)
{
switch ((ui32FVFcode>>(16+(i*2))) & 0x3)
{
case D3DMFVF_TEXCOORDCOUNT1:
ZeroMemory(pvData, sizeof(NTV_TYPE));
if(ui32NumOut > 0) *((IMG_FLOAT*)pvData)++ = NTV2FL(psVertex->sTextures[i].x); else ((IMG_FLOAT*)pvData)++;
break;
case D3DMFVF_TEXCOORDCOUNT2:
ZeroMemory(pvData, 2 * sizeof(NTV_TYPE));
if(ui32NumOut > 0) *((IMG_FLOAT*)pvData)++ = NTV2FL(psVertex->sTextures[i].x); else ((IMG_FLOAT*)pvData)++;
if(ui32NumOut > 1) *((IMG_FLOAT*)pvData)++ = NTV2FL(psVertex->sTextures[i].y); else ((IMG_FLOAT*)pvData)++;
break;
case D3DMFVF_TEXCOORDCOUNT3:
ZeroMemory(pvData, 3 * sizeof(NTV_TYPE));
if(ui32NumOut > 0) *((IMG_FLOAT*)pvData)++ = NTV2FL(psVertex->sTextures[i].x); else ((IMG_FLOAT*)pvData)++;
if(ui32NumOut > 1) *((IMG_FLOAT*)pvData)++ = NTV2FL(psVertex->sTextures[i].y); else ((IMG_FLOAT*)pvData)++;
if(ui32NumOut > 2) *((IMG_FLOAT*)pvData)++ = NTV2FL(psVertex->sTextures[i].z); else ((IMG_FLOAT*)pvData)++;
break;
default:
//error unsupported
break;
}
}
else if(((ui32FVFcode>>(24+(i*2))) & 0x3) == D3DMFVF_TEXCOORDFORMAT_FIXED)
{
switch ((ui32FVFcode>>(16+(i*2))) & 0x3)
{
case D3DMFVF_TEXCOORDCOUNT1:
ZeroMemory(pvData, sizeof(NTV_TYPE));
if(ui32NumOut > 0) *((IMG_FIXED*)pvData)++ = NTV2FX(psVertex->sTextures[i].x); else ((IMG_FIXED*)pvData)++;
break;
case D3DMFVF_TEXCOORDCOUNT2:
ZeroMemory(pvData, 2 * sizeof(NTV_TYPE));
if(ui32NumOut > 0) *((IMG_FIXED*)pvData)++ = NTV2FX(psVertex->sTextures[i].x); else ((IMG_FIXED*)pvData)++;
if(ui32NumOut > 1) *((IMG_FIXED*)pvData)++ = NTV2FX(psVertex->sTextures[i].y); else ((IMG_FIXED*)pvData)++;
break;
case D3DMFVF_TEXCOORDCOUNT3:
ZeroMemory(pvData, 3 * sizeof(NTV_TYPE));
if(ui32NumOut > 0) *((IMG_FIXED*)pvData)++ = NTV2FX(psVertex->sTextures[i].x); else ((IMG_FIXED*)pvData)++;
if(ui32NumOut > 1) *((IMG_FIXED*)pvData)++ = NTV2FX(psVertex->sTextures[i].y); else ((IMG_FIXED*)pvData)++;
if(ui32NumOut > 2) *((IMG_FIXED*)pvData)++ = NTV2FX(psVertex->sTextures[i].z); else ((IMG_FIXED*)pvData)++;
default:
//error unsupported
break;
}
}
}
else
{
/* We need to move past this set of texture coords */
switch ((ui32FVFcode>>(16+(i*2))) & 0x3)
{
case D3DMFVF_TEXCOORDCOUNT1:
((IMG_UINT32*)pvData)++;
break;
case D3DMFVF_TEXCOORDCOUNT2:
((IMG_UINT32*)pvData) += 2;
break;
case D3DMFVF_TEXCOORDCOUNT3:
((IMG_UINT32*)pvData) += 3;
default:
//error unsupported
break;
}
}
}
}
PROFILE_STOP_FUNC(WRITE_BACK_VERTICES);
}
/***********************************************************************************
Function Name : ProcessVertices
Returns :
Description : transforms and lights the given vertices
************************************************************************************/
IMG_VOID ProcessVertices(LPD3DM_CONTEXT psContext,
LPD3DM_VBUFFER psDestBuffer,
IMG_UINT32 ui32SrcStartIdx,
IMG_UINT32 ui32DstStartIdx,
IMG_UINT32 ui32VertexCount,
IMG_UINT32 ui32Flags)
{
IMG_UINT32 i;
PVR_NATIVE_VERTEX *psVertices = NULL;
PVR_NATIVE_VERTEX **ppsVertices = NULL;
IMG_UINT32 *pui32Data;
LPD3DM_VBUFFER psSourceBuffer = psContext->psVertexSource;
PROFILE_START_FUNC(PROCESS_VERTICES);
/* Set up source pointer */
pui32Data = ((IMG_UINT32*) psSourceBuffer->pvVertexData) + (ui32SrcStartIdx * psSourceBuffer->dwStrideDW);
/* Allocate conversion bufffer */
psVertices = D3DMAllocate(ui32VertexCount * sizeof(PVR_NATIVE_VERTEX));
if(psVertices == NULL)
{
D3DM_DPF((DPF_ERROR,"ProcessVertices: Can't allocate vertex conversion buffer"));
psContext->hrLastError = D3DM_GENERICFAILURE;
return;
}
/* We also need to allocate an array of pointers to our conversion vertices */
ppsVertices = D3DMAllocate(ui32VertexCount * sizeof(PVR_NATIVE_VERTEX*));
if(ppsVertices == NULL)
{
D3DM_DPF((DPF_ERROR,"ProcessVertices: Can't allocate vertex conversion buffer pointers"));
psContext->hrLastError = D3DM_GENERICFAILURE;
goto ErrorExit;
}
/* Set up vertices */
for(i=0; i < ui32VertexCount; i++)
{
/* construct native vertices */
SetupNativeVertex(psContext, pui32Data, psSourceBuffer->dwFVFFlags, &psVertices[i]);
pui32Data += psSourceBuffer->dwStrideDW;
ppsVertices[i] = &psVertices[i];
}
/* If there is no destination buffer the app is generating Clipstatus, so don't bother validating */
if(psDestBuffer != NULL)
{
ValidateVertex(psContext, ppsVertices, ui32VertexCount);
}
/* Clip Test and transform */
DoClipTestandVPTransform(psContext, ppsVertices, ui32VertexCount);
if(psDestBuffer == NULL) goto ErrorExit;
/* Set up Dest pointer */
pui32Data = ((IMG_UINT32*) psDestBuffer->pvVertexData) + (ui32DstStartIdx * psDestBuffer->dwStrideDW);
/* Write back transformed vertices */
WriteBackVertices(psContext,
ppsVertices,
psDestBuffer->dwFVFFlags,
(IMG_VOID*) pui32Data,
ui32VertexCount);
ErrorExit:
/* Free up pointer buffer */
if(ppsVertices != NULL) D3DMFree(ppsVertices);
/* Free up conversion buffer */
if(psVertices != NULL) D3DMFree(psVertices);
PROFILE_STOP_FUNC(PROCESS_VERTICES);
}
#endif /*(defined(SUPPORT_VGP) && (COREVERSION < 13)) || \
(defined(SUPPORT_VGP_LITE) && (COREVERSION < 120)) || \
(!defined(SUPPORT_VGP) && !defined(SUPPORT_VGP_LITE))*/
/*****************************************************************************
End of file (vertex.c)
*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -