⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vertex.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 4 页
字号:

		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 + -