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

📄 vgpcommon.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
						   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 + -