📄 vgpcommon.c
字号:
IMG_UINT32 ui32FVFcode,
IMG_VOID *pvData,
IMG_UINT32 ui32VertexCount)
{
IMG_UINT32 i;
IMG_UINT32 ui32TexCount;
DWORD dwRotation = 0;
IMG_FLOAT *pfSourceData;
IMG_FLOAT fTex1[2];
IMG_FLOAT fTex2[2];
IMG_FLOAT fClip0[4];
IMG_UINT32 ui32Outputs;
IMG_BOOL b3DCoordsUsed = (psContext->sTState.sSWTNLState.dwPVDestTexLayerCoordCount[0] == 3) ||
(psContext->sTState.sSWTNLState.dwPVDestTexLayerCoordCount[1] == 3);
PROFILE_START_FUNC(WRITE_BACK_VERTICES);
pfSourceData = (IMG_FLOAT*) psVertices->pvLinAddr;
if (ui32VertexCount == 0)
{
/* no vertices to write */
return;
}
while(ui32VertexCount--)
{
/*********************
Position:
*********************/
switch (ui32FVFcode & D3DMFVF_POSITION_MASK)
{
case D3DMFVF_XYZRHW_FLOAT:
*((IMG_FLOAT*)pvData)++ = *pfSourceData++;
*((IMG_FLOAT*)pvData)++ = *pfSourceData++;
*((IMG_FLOAT*)pvData)++ = *pfSourceData++;
*((IMG_FLOAT*)pvData)++ = *pfSourceData++;
break;
case D3DMFVF_XYZRHW_FIXED:
*((IMG_FIXED*)pvData)++ = FL2FX(*pfSourceData++);
*((IMG_FIXED*)pvData)++ = FL2FX(*pfSourceData++);
*((IMG_FIXED*)pvData)++ = FL2FX(*pfSourceData++);
*((IMG_FIXED*)pvData)++ = FL2FX(*pfSourceData++);
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*) pvData)++ = (AS_ULONG_RND(Mul(FL2NTV(*pfSourceData++), LONG_AS_NTV(255)))<<24)
| (AS_ULONG_RND(Mul(FL2NTV(*pfSourceData++), LONG_AS_NTV(255)))<<16)
| (AS_ULONG_RND(Mul(FL2NTV(*pfSourceData++), LONG_AS_NTV(255)))<<8)
| AS_ULONG_RND(Mul(FL2NTV(*pfSourceData++), LONG_AS_NTV(255)));
}
else if(ui32FVFcode & D3DMFVF_DIFFUSE)
{
/* Move past diffuse */
((IMG_UINT32*) pvData)++;
((IMG_FLOAT*) pfSourceData) += 4;
}
/* Check for specular copy status */
if((ui32FVFcode & D3DMFVF_SPECULAR) &&
!(psContext->dwFlags & D3DM_CONTEXT_SWFLAGS_PROCVERT_NO_SPECULAR_COPY))
{
*((IMG_UINT32*) pvData)++ = (AS_ULONG_RND(Mul(FL2NTV(*pfSourceData++), LONG_AS_NTV(255)))<<24)
| (AS_ULONG_RND(Mul(FL2NTV(*pfSourceData++), LONG_AS_NTV(255)))<<16)
| (AS_ULONG_RND(Mul(FL2NTV(*pfSourceData++), LONG_AS_NTV(255)))<<8)
| AS_ULONG_RND(Mul(FL2NTV(*pfSourceData++), LONG_AS_NTV(255)));
}
else if(ui32FVFcode & D3DMFVF_SPECULAR)
{
/* Move past specular */
((IMG_UINT32*) pvData)++;
((IMG_FLOAT*) pfSourceData) += 4;
}
/*********************
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;
}
/* Pick up tex co-ords */
ui32Outputs = SetVGPOutputEnables(psContext, ui32FVFcode, IMG_NULL);
if(ui32Outputs & MBX1_VGPPROCVERT_SELECTS_REG3)
{
fTex1[0] = *pfSourceData++;
fTex1[1] = *pfSourceData++;
}
if(ui32Outputs & MBX1_VGPPROCVERT_SELECTS_REG4)
{
fTex2[0] = *pfSourceData++;
fTex2[1] = *pfSourceData++;
}
if(ui32Outputs & MBX1_VGPPROCVERT_SELECTS_REG5)
{
fClip0[0] = *pfSourceData++;
fClip0[1] = *pfSourceData++;
fClip0[2] = *pfSourceData++;
fClip0[3] = *pfSourceData++;
}
/* Output tex co-ords */
for (i=0; i<ui32TexCount; i++)
{
/* 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:
{
if(i == 0)
{
*((IMG_FLOAT*)pvData)++ = fTex1[0];
}
else
{
if(!b3DCoordsUsed)
{
*((IMG_FLOAT*)pvData)++ = fTex2[0];
}
else
{
*((IMG_FLOAT*)pvData)++ = fClip0[0];
}
}
break;
}
case D3DMFVF_TEXCOORDCOUNT2:
{
if(i == 0)
{
*((IMG_FLOAT*)pvData)++ = fTex1[0];
*((IMG_FLOAT*)pvData)++ = fTex1[1];
}
else
{
if(!b3DCoordsUsed)
{
*((IMG_FLOAT*)pvData)++ = fTex2[0];
*((IMG_FLOAT*)pvData)++ = fTex2[1];
}
else
{
*((IMG_FLOAT*)pvData)++ = fClip0[0];
*((IMG_FLOAT*)pvData)++ = fClip0[1];
}
}
break;
}
case D3DMFVF_TEXCOORDCOUNT3:
{
/* Fudged to use clip output to allow 3 co-ords */
if(i == 0)
{
*((IMG_FLOAT*)pvData)++ = fTex1[0];
*((IMG_FLOAT*)pvData)++ = fTex1[1];
*((IMG_FLOAT*)pvData)++ = fTex2[0];
}
else
{
/* CLIP0 */
*((IMG_FLOAT*)pvData)++ = fClip0[0];
*((IMG_FLOAT*)pvData)++ = fClip0[1];
*((IMG_FLOAT*)pvData)++ = fClip0[2];
}
break;
default:
//error unsupported
break;
}
}
}
else if(((ui32FVFcode>>(24+(i*2))) & 0x3) == D3DMFVF_TEXCOORDFORMAT_FIXED)
{
switch ((ui32FVFcode>>(16+(i*2))) & 0x3)
{
case D3DMFVF_TEXCOORDCOUNT1:
{
if(i == 0)
{
*((IMG_FIXED*)pvData)++ = FL2FX(fTex1[0]);
}
else
{
if(!b3DCoordsUsed)
{
*((IMG_FIXED*)pvData)++ = FL2FX(fTex2[0]);
}
else
{
*((IMG_FIXED*)pvData)++ = FL2FX(fClip0[0]);
}
}
break;
}
case D3DMFVF_TEXCOORDCOUNT2:
{
if(i == 0)
{
*((IMG_FIXED*)pvData)++ = FL2FX(fTex1[0]);
*((IMG_FIXED*)pvData)++ = FL2FX(fTex1[1]);
}
else
{
if(!b3DCoordsUsed)
{
*((IMG_FIXED*)pvData)++ = FL2FX(fTex2[0]);
*((IMG_FIXED*)pvData)++ = FL2FX(fTex2[1]);
}
else
{
*((IMG_FIXED*)pvData)++ = FL2FX(fClip0[0]);
*((IMG_FIXED*)pvData)++ = FL2FX(fClip0[1]);
}
}
break;
}
case D3DMFVF_TEXCOORDCOUNT3:
{
/* Fudged to use clip output to allow 3 co-ords */
if(i == 0)
{
*((IMG_FIXED*)pvData)++ = FL2FX(fTex1[0]);
*((IMG_FIXED*)pvData)++ = FL2FX(fTex1[1]);
*((IMG_FIXED*)pvData)++ = FL2FX(fTex2[0]);
}
else
{
/* CLIP0 */
*((IMG_FIXED*)pvData)++ = FL2FX(fClip0[0]);
*((IMG_FIXED*)pvData)++ = FL2FX(fClip0[1]);
*((IMG_FIXED*)pvData)++ = FL2FX(fClip0[2]);
}
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)
{
PVRSRV_MEM_INFO *psVertices = NULL;
IMG_UINT32 *pui32Data;
IMG_UINT32 ui32DestBufferVertexSize, ui32DestFVF;
LPD3DM_VBUFFER psSourceBuffer = psContext->psVertexSource;
PROFILE_START_FUNC(PROCESS_VERTICES);
/* We'll have to modify the position section and add vport transform */
psContext->sTState.sSWTNLState.dwSectionModFlags |= 1 << VGPTNL_SECTIONORD_POSITION;
/* Set up source pointer */
pui32Data = ((IMG_UINT32*) psSourceBuffer->pvVertexData) + (ui32SrcStartIdx * psSourceBuffer->dwStrideDW);
/* Get Size of Dest buffer */
if(psDestBuffer)
{
SetVGPOutputEnables(psContext, psDestBuffer->dwFVFFlags, &ui32DestBufferVertexSize);
ui32DestFVF = psDestBuffer->dwFVFFlags;
}
else
{
/* No dest buffer, so app is generating clipstatus */
ui32DestBufferVertexSize = 4;
ui32DestFVF = 0;
}
/* Allocate hardware vertex buffer */
if(D3DMAllocDeviceMem(&psContext->sDevData,
0,
(ui32VertexCount * ui32DestBufferVertexSize),
MBX1_VGPPROCVERT_ADDRESS_GRAN,
&psVertices) != PVRSRV_OK)
{
D3DM_DPF((DPF_ERROR,"ProcessVertices: Can't allocate vertex conversion buffer"));
psContext->hrLastError = D3DM_GENERICFAILURE;
return;
}
#if DEBUG
HostMemSet(psVertices->pvLinAddr, 0x00, psVertices->ui32AllocSize);
#endif
/* Acquire the slaveport and start the TA */
if(D3DMAcquireProcessVerticesResources(psContext,psVertices->uiDevAddr.uiAddr, ui32DestFVF) != PVRSRV_OK)
{
D3DM_DPF((DPF_ERROR,"ProcessVertices: Can't acquire resources"));
psContext->hrLastError = D3DM_GENERICFAILURE;
goto ErrorExit;
}
/* Prim Hdr */
TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_POINTS);
TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
TACSWriteVGPClipWord(psContext, psContext->dwVGPClipCtl);
/* Blat the data into the slaveport */
CopySelect(psContext, (IMG_UINT8*) pui32Data, ui32VertexCount,&psContext->psVertexSource->sVSIFDef);
/* End block */
TACSWriteLastPrim(psContext);
/* Release resources and wait for completion */
D3DMReleaseProcessVerticesResources(psContext);
if(psDestBuffer == NULL)
{
/* TODO - Modify clipstatus here if we ever support it */
goto ErrorExit;
}
/* Set up Dest pointer */
pui32Data = ((IMG_UINT32*) psDestBuffer->pvVertexData) + (ui32DstStartIdx * psDestBuffer->dwStrideDW);
/* Write back transformed vertices */
WriteBackVertices(psContext,
psVertices,
psDestBuffer->dwFVFFlags,
(IMG_VOID*) pui32Data,
ui32VertexCount);
/* We'll have to modify the position section and remove vport transform */
psContext->sTState.sSWTNLState.dwSectionModFlags |= 1 << VGPTNL_SECTIONORD_POSITION;
PDUMPUPDATEFRAME(psContext->psPDContext);
ErrorExit:
/* Free up hw vertex buffer */
if(psVertices != NULL) D3DMFreeDeviceMem(&psContext->sDevData, psVertices);
PROFILE_STOP_FUNC(PROCESS_VERTICES);
}
#endif /* defined ((SUPPORT_VGP) && (COREVERSION >= 13)) || (defined (SUPPORT_VGP_LITE) && (COREVERSION >= 120)) */
/*****************************************************************************
FUNCTION : SetSectionRepeat
PURPOSE : Sets the repeat-count for a vertex-shader section
PARAMETERS : dwSectionIdx - Index of the section to change
dwCount - The new section repeat-count
psContext - The current rendering context
RETURNS : void
*****************************************************************************/
IMG_VOID SetSectionRepeat(DWORD dwSectionIdx,
DWORD dwCount,
LPD3DM_CONTEXT psContext)
{
/* Validate the given section index */
if(dwSectionIdx >= psContext->dwSectionCount)
{
D3DM_DPF((DPF_VGP, "SetSectionRepeat: Invalid section index %d for shader %d (max %d)", dwSectionIdx, psContext->ppsFFTNLSections[dwSectionIdx], psContext->dwSectionCount);
return;
}
/* Check the requested repeat-count */
if((dwCount == 0) || (dwCount - 1 > (MBX1_VGPSECTDEF_COUNT_MASK >> MBX1_VGPSECTDEF_COUNT_SHIFT)))
{
D3DM_DPF((DPF_VGP, "VSSetSectionRepeat: Invalid repeat-count %d (valid 1-%d)", dwCount, (MBX1_VGPSECTDEF_COUNT_MASK>>MBX1_VGPSECTDEF_COUNT_SHIFT));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -