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

📄 vgpcopy.h

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