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

📄 specialobject.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE | 
							MBX1_ISPTSPCTL_DESTBLENDZERO | 
							MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE |
							MBX1_ISPTSPCTL_CKDISABLE | 
							MBX1_ISPTSPCTL_OBJTYPE_OPAQUE | 
							MBX1_ISPTSPCTL_DCMPMODEALWAYS;
#endif
		ui32RegionClip = CalcRegionClip(gc, IMG_NULL);

		ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;

		if (!(gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_DEPTH))
		{
			ui32ISPTSPWord |= MBX1_ISPTSPCTL_DWDISABLE;
		}

		ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_TRUE, IMG_FALSE);

		EmitState(gc, &ui323DControlWord, 1);
		EmitState(gc, &ui32ISPTSPWord, 1);
		EmitState(gc, &ui32TSPObjectWord, 1);
		EmitState(gc, &ui32RegionClip, 1);
		EmitState(gc, &ui32InputFormatWord, 1);
		EmitState(gc, &ui32FPControlWord, 1);
	
	
		afVertdata[0] = 0.0f;
		afVertdata[1] = 0.0f;
		afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
		((IMG_UINT32 *)afVertdata)[3] = gc->sClear.ui32ClearColor;

		afVertdata[4] = (GLfloat)ui32PixelWidth * 2.0f;
		afVertdata[5] = 0.0f;
		afVertdata[6] = (GLfloat)gc->sClear.fClearDepth;
		((IMG_UINT32 *)afVertdata)[7] = gc->sClear.ui32ClearColor;

		afVertdata[8]  = 0.0f;
		afVertdata[9]  = (GLfloat)ui32PixelHeight * 2.0f;
		afVertdata[10] = (GLfloat)gc->sClear.fClearDepth;
		((IMG_UINT32 *)afVertdata)[11] =  gc->sClear.ui32ClearColor;

		/* Preserve terminate word bit only */
		gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
		gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE;

		StartTriangleList(gc);
	
		OutputVerticesSpecialObject(gc, afVertdata, 3, 4);

		EndPrimitiveBlock(gc);
	
		gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
		
		gc->sClear.ui32ClearFlags = 0;
	}
	else
	{
		IMG_UINT32 ui32TSPWord[3];

		SetupVGPSectionEnables(gc, IMG_TRUE, IMG_TRUE);
		GLES_DIRTY_VGP_SECTIONS(gc);

		ui323DControlWord = MBX1_TAOBJTYPE_STATE				| 
							MBX1_TASTATEPRES_ISPCTL				|	 
							MBX1_TASTATEPRES_TSPCTL				|
							MBX1_TASTATEPRES_LAYER0CTL			|
							MBX1_TASTATEPRES_REGIONCLIP			|
							MBX1_TASTATEPRES_VGP_IFDEFINITION	|
							MBX1_TASTATEPRES_FP_INPUTFORMAT;

		ui32TSPObjectWord = MBX1_TSPOBJ_ACMPMODEALWAYS;
	
#ifndef FIX_HW_PRN_145	
		ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE | 
							MBX1_ISPTSPCTL_DESTBLENDZERO | 
							MBX1_ISPTSPCTL_LOGICALOPDISABLE |
							MBX1_ISPTSPCTL_CKDISABLE | 
							MBX1_ISPTSPCTL_OBJTYPE_OPAQUE | 
							MBX1_ISPTSPCTL_DCMPMODEALWAYS | 
							(1 << MBX1_ISPTSPCTL_NUMPASSESSHIFT);
#else
		ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE | 
							MBX1_ISPTSPCTL_DESTBLENDZERO | 
							MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE |
							MBX1_ISPTSPCTL_CKDISABLE | 
							MBX1_ISPTSPCTL_OBJTYPE_OPAQUE | 
							MBX1_ISPTSPCTL_DCMPMODEALWAYS | 
							(1 << MBX1_ISPTSPCTL_NUMPASSESSHIFT);
#endif
		
		ui32RegionClip = CalcRegionClip(gc, IMG_NULL);

		ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_TRUE, IMG_TRUE);

		/* Use Previous frame's address + stride for accumulation */
		ui32TSPWord[0] =	MBX1_TSPPL1_TUADDRMODECLAMP |		
							MBX1_TSPPL1_TVADDRMODECLAMP |
							(MBX1_TSPPL1_TSIZE2048 << MBX1_TSPPL1_TUSIZESHIFT) |
							(MBX1_TSPPL1_TSIZE2048 << MBX1_TSPPL1_TVSIZESHIFT) |
							gc->sHWContext.sLastFrameBGObjInfo.ui32TexFormatStride;

		ui32TSPWord[1] =	MBX1_TSPPL2_MIPCTLNOTMIPMAP |
							(0x7 << MBX1_TSPPL2_DADJUSTSHIFT) |
							gc->sHWContext.sLastFrameBGObjInfo.ui32TexAddrStride;
	
		ui32TSPWord[2] =	MBX1_TSPPL3_CS1SELONE |
							MBX1_TSPPL3_CS2SELTEXTURE |
							MBX1_TSPPL3_CS3SELONE |
							MBX1_TSPPL3_CS4SELTEXTURE |
							MBX1_TSPPL3_INVCS3 |
							MBX1_TSPPL3_AS1SELONE |
							MBX1_TSPPL3_AS2SELDIFFUSEALPHA |
							MBX1_TSPPL3_AS3SELONE |
							MBX1_TSPPL3_AS4SELDIFFUSEALPHA |
							MBX1_TSPPL3_INVAS3;

		
		ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;
		
		/* This will clear depth fullscreen, whether scissor is set or not. This is incorrect, but we don't have
		 * a defined behaviour for accumulating depth without an external depth buffer 
		 */
		if (!(gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_DEPTH))
		{
			ui32ISPTSPWord |= MBX1_ISPTSPCTL_DWDISABLE;
		}

		EmitState(gc, &ui323DControlWord, 1);
		EmitState(gc, &ui32ISPTSPWord, 1);
		EmitState(gc, &ui32TSPObjectWord, 1);
		EmitState(gc, ui32TSPWord, 3);
		EmitState(gc, &ui32RegionClip, 1);
		EmitState(gc, &ui32InputFormatWord, 1);
		EmitState(gc, &ui32FPControlWord, 1);
	
		afVertdata[0] = 0.0f;
		afVertdata[1] = 0.0f;
		afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[3] = 0;
		afVertdata[4] = 0.0f;
		afVertdata[5] = 0.0f;

		afVertdata[6] = (GLfloat)ui32PixelWidth * 2.0f;
		afVertdata[7] = 0.0f;
		afVertdata[8] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[9] = 0;
		afVertdata[10] = (GLfloat)ui32PixelWidth * 2.0f / 2048.0f;
		afVertdata[11] = 0.0f;

		afVertdata[12] = 0.0f;
		afVertdata[13] = (GLfloat)ui32PixelHeight * 2.0f;
		afVertdata[14] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[15] = 0;
		afVertdata[16] = 0.0f;
		afVertdata[17] = (GLfloat)ui32PixelHeight * 2.0f / 2048.0f;

		/* Preserve terminate word bit only */
		gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
		gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE;
		
		StartTriangleStrip(gc);
		
		OutputVerticesSpecialObject(gc, afVertdata, 3, 6);
		
		EndPrimitiveBlock(gc);
	
		gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
		
		gc->sClear.ui32ClearFlags &= ~GLES_CLEARFLAG_DEPTH;
	}

	/* Need to mark these bits as dirty for re-emission. */
	gc->sHWContext.ui32TAControland3DState |= (ui323DControlWord & ~MBX1_TASTATEPRES_REGIONCLIP);
}

#else /* SUPPORT_VGP */

/***********************************************************************************
 Function Name      : SendSWBackgroundObject
 Inputs             : gc
 Outputs            : -
 Returns            : -
 Description        : Sends a BG object to either clear color or accumulate.
************************************************************************************/

IMG_VOID SendSWBackgroundObject(GLESContext *gc)
{
	IMG_FLOAT afVertdata[21];
	IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader, ui323DControlWord, ui32RegionClip;
	IMG_UINT32 ui32TSPWord[3], ui32FPControlWord;
	PVR3DIF_SHAREDDATA *psSharedData = gc->psRenderSurface->psTARenderInfo->psSharedData;
	DEVICE3D *ps3D = &gc->sHWContext.ps3DDevData->psDevInfoUM->sDeviceSpecific.s3D;
	IMG_UINT32 ui32PixelWidth, ui32PixelHeight;

	ui32PixelWidth = psSharedData->ui32XTilesPerMT * psSharedData->ui32MTilesX * ps3D->ui32PixelsInTileX;
	ui32PixelHeight = psSharedData->ui32YTilesPerMT * psSharedData->ui32MTilesY * ps3D->ui32PixelsInTileY;

	if(gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_COLOR && 
		(!(gc->ui32FrameEnables & GLES_FS_SCISSOR_ENABLE) || gc->bFullScreenScissor))
	{
		ui323DControlWord = MBX1_TAOBJTYPE_STATE				| 
							MBX1_TASTATEPRES_ISPCTL				|	 
							MBX1_TASTATEPRES_TSPCTL				|
							MBX1_TASTATEPRES_REGIONCLIP			|
							MBX1_TASTATEPRES_FP_INPUTFORMAT;

		ui32TSPObjectWord = MBX1_TSPOBJ_ACMPMODEALWAYS;
	
		ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;

#ifndef FIX_HW_PRN_145	
		ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE			| 
							MBX1_ISPTSPCTL_DESTBLENDZERO		| 
							MBX1_ISPTSPCTL_LOGICALOPDISABLE		|
							MBX1_ISPTSPCTL_CKDISABLE			| 
							MBX1_ISPTSPCTL_OBJTYPE_OPAQUE		| 
							MBX1_ISPTSPCTL_DCMPMODEALWAYS		|
							MBX1_ISPTSPCTL_DWDISABLE;
#else
		ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE			| 
							MBX1_ISPTSPCTL_DESTBLENDZERO		| 
							MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE	|
							MBX1_ISPTSPCTL_CKDISABLE			| 
							MBX1_ISPTSPCTL_OBJTYPE_OPAQUE		| 
							MBX1_ISPTSPCTL_DCMPMODEALWAYS		|
							MBX1_ISPTSPCTL_DWDISABLE;

#endif
		ui32RegionClip = CalcRegionClip(gc, IMG_NULL);

		ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;

		if (gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_DEPTH)
		{
			ui32ISPTSPWord &= ~MBX1_ISPTSPCTL_DWDISABLE;
			gc->sClear.ui32ClearFlags &= ~GLES_CLEARFLAG_DEPTH;
		}

		EmitState(gc, &ui323DControlWord, 1);
		EmitState(gc, &ui32ISPTSPWord, 1);
		EmitState(gc, &ui32TSPObjectWord, 1);
		EmitState(gc, &ui32RegionClip, 1);
		EmitState(gc, &ui32FPControlWord, 1);
	
		afVertdata[0] = 0.0f;
		afVertdata[1] = 0.0f;
		afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[3] = 1.0f;
		((IMG_UINT32 *)afVertdata)[4] = gc->sClear.ui32ClearColor;

		afVertdata[5] = (GLfloat)ui32PixelWidth * 2.0f;
		afVertdata[6] = 0.0f;
		afVertdata[7] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[8] = 1.0f;
		((IMG_UINT32 *)afVertdata)[9] = gc->sClear.ui32ClearColor;

		afVertdata[10] = 0.0f;
		afVertdata[11] = (GLfloat)ui32PixelHeight * 2.0f;
		afVertdata[12] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[13] = 1.0f;
		((IMG_UINT32 *)afVertdata)[14] =  gc->sClear.ui32ClearColor;

		/* Preserve terminate word bit only */
		gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
		gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE;

		StartTriangleList(gc);
	
		OutputVerticesSpecialObject(gc, afVertdata, 3, 5);

		EndPrimitiveBlock(gc);
	
		gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
		
		gc->sClear.ui32ClearFlags = 0;
	}
	else
	{
		ui323DControlWord = MBX1_TAOBJTYPE_STATE				| 
							MBX1_TASTATEPRES_ISPCTL				|	 
							MBX1_TASTATEPRES_TSPCTL				|
							MBX1_TASTATEPRES_LAYER0CTL			|
							MBX1_TASTATEPRES_REGIONCLIP			|
							MBX1_TASTATEPRES_FP_INPUTFORMAT;

		ui32TSPObjectWord = MBX1_TSPOBJ_ACMPMODEALWAYS;
	
		ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;

#ifndef FIX_HW_PRN_145	
		ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE			| 
							MBX1_ISPTSPCTL_DESTBLENDZERO		| 
							MBX1_ISPTSPCTL_LOGICALOPDISABLE		|
							MBX1_ISPTSPCTL_CKDISABLE			| 
							MBX1_ISPTSPCTL_OBJTYPE_OPAQUE		| 
							MBX1_ISPTSPCTL_DCMPMODEALWAYS		|
							MBX1_ISPTSPCTL_DWDISABLE			|
							(1 << MBX1_ISPTSPCTL_NUMPASSESSHIFT);
#else
		ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE			| 
							MBX1_ISPTSPCTL_DESTBLENDZERO		| 
							MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE	|
							MBX1_ISPTSPCTL_CKDISABLE			| 
							MBX1_ISPTSPCTL_OBJTYPE_OPAQUE		| 
							MBX1_ISPTSPCTL_DCMPMODEALWAYS		|
							MBX1_ISPTSPCTL_DWDISABLE			|
							(1 << MBX1_ISPTSPCTL_NUMPASSESSHIFT);
#endif

		/* Use Previous frame's address + stride for accumulation */
		ui32TSPWord[0] =	MBX1_TSPPL1_TUADDRMODECLAMP |		
							MBX1_TSPPL1_TVADDRMODECLAMP |
							(MBX1_TSPPL1_TSIZE2048 << MBX1_TSPPL1_TUSIZESHIFT) |
							(MBX1_TSPPL1_TSIZE2048 << MBX1_TSPPL1_TVSIZESHIFT) |
							gc->sHWContext.sLastFrameBGObjInfo.ui32TexFormatStride;

		ui32TSPWord[1] =	MBX1_TSPPL2_MIPCTLNOTMIPMAP |
							(0x7 << MBX1_TSPPL2_DADJUSTSHIFT) |
							gc->sHWContext.sLastFrameBGObjInfo.ui32TexAddrStride;
	
		ui32TSPWord[2] =	MBX1_TSPPL3_CS1SELONE |
							MBX1_TSPPL3_CS2SELTEXTURE |
							MBX1_TSPPL3_CS3SELONE |
							MBX1_TSPPL3_CS4SELTEXTURE |
							MBX1_TSPPL3_INVCS3 |
							MBX1_TSPPL3_AS1SELONE |
							MBX1_TSPPL3_AS2SELDIFFUSEALPHA |
							MBX1_TSPPL3_AS3SELONE |
							MBX1_TSPPL3_AS4SELDIFFUSEALPHA |
							MBX1_TSPPL3_INVAS3;

		ui32RegionClip = CalcRegionClip(gc, IMG_NULL);

		ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;
		

		/* 
		 * We normally clear depth from the 3D_ZL_BACKGROUND_DEPTH register, but with an external depth buffer
		 * we must clear with a SW object - if it is a fullscreen clear, may as well do it here, rather than 
		 * sending another clear object.
		 */
		if (gc->psRenderSurface->psZBufferMemInfo)
		{
			if((gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_DEPTH) && 
				(!(gc->ui32FrameEnables & GLES_FS_SCISSOR_ENABLE) || gc->bFullScreenScissor))
			{
				ui32ISPTSPWord &= ~MBX1_ISPTSPCTL_DWDISABLE;
				gc->sClear.ui32ClearFlags &= ~GLES_CLEARFLAG_DEPTH;
			}
		}

		EmitState(gc, &ui323DControlWord, 1);
		EmitState(gc, &ui32ISPTSPWord, 1);
		EmitState(gc, &ui32TSPObjectWord, 1);
		EmitState(gc, ui32TSPWord, 3);
		EmitState(gc, &ui32RegionClip, 1);
		EmitState(gc, &ui32FPControlWord, 1);
	
		afVertdata[0] = 0.0f;
		afVertdata[1] = 0.0f;
		afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[3] = 1.0f;
		afVertdata[4] = 0;
		afVertdata[5] = 0.0f;
		afVertdata[6] = 0.0f;

		afVertdata[7] = (GLfloat)ui32PixelWidth * 2.0f;
		afVertdata[8] = 0.0f;
		afVertdata[9] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[10] = 1.0f;
		afVertdata[11] = 0;
		afVertdata[12] = (GLfloat)ui32PixelWidth * 2.0f / 2048.0f;
		afVertdata[13] = 0.0f;

		afVertdata[14] = 0.0f;
		afVertdata[15] = (GLfloat)ui32PixelHeight * 2.0f;
		afVertdata[16] = (GLfloat)gc->sClear.fClearDepth;
		afVertdata[17] = 1.0f;
		afVertdata[18] = 0;
		afVertdata[19] = 0.0f;
		afVertdata[20] = (GLfloat)ui32PixelHeight * 2.0f / 2048.0f;

		/* Preserve terminate word bit only */
		gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
		gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE;
		
		StartTriangleStrip(gc);
		
		OutputVerticesSpecialObject(gc, afVertdata, 3, 7);
		
		EndPrimitiveBlock(gc);
	
		gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
	}

	/* Need to mark these bits as dirty for re-emission. */
	gc->sHWContext.ui32TAControland3DState |= (ui323DControlWord & ~MBX1_TASTATEPRES_REGIONCLIP);
}

#

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -