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

📄 specialobject.c

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

			ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_FALSE, 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);
			
			ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;
			
			/* Preserve terminate word bit only */
			gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
			gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE;
			
			SetupVGPSectionEnables(gc, IMG_TRUE, IMG_FALSE);
			GLES_DIRTY_VGP_SECTIONS(gc);
			
			StartTriangleStrip(gc);
			
			OutputVerticesSpecialObject(gc, afVertdata, 3, 3);
			
			EndPrimitiveBlock(gc);
			
			gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
		}
		else
		{
			DPF((DBG_ERROR,"What is a non-fullscreen disable for?"));
			return;
		}

		/* Now do non-fullscreen enable */

		/*
		 * The vertices are organised as a strip.
		 *
		 *        [1] (X0, Y1) --- (X1, Y1) [3]
		 *                |     \        |
		 *        [0] (X0, Y0) --- (X1, Y0) [2]
		 */
		afVertdata[0] = (IMG_FLOAT)psRect->i32X;
		afVertdata[1] = (IMG_FLOAT)psRect->i32Y;
		afVertdata[2] = 1.0f;
		
		afVertdata[3] = (IMG_FLOAT)psRect->i32X;
		afVertdata[4] = (IMG_FLOAT)(psRect->i32Y + psRect->ui32Height);
		afVertdata[5] = 1.0f;
		
		afVertdata[6] = (IMG_FLOAT)(psRect->i32X + psRect->ui32Width);
		afVertdata[7] = (IMG_FLOAT)psRect->i32Y;
		afVertdata[8] = 1.0f;
		
		afVertdata[9] = (IMG_FLOAT)(psRect->i32X + psRect->ui32Width);
		afVertdata[10] = (IMG_FLOAT)(psRect->i32Y + psRect->ui32Height);
		afVertdata[11] = 1.0f;

		ui32NumVerts = 4;
		
		gc->sLastDrawMask = *psRect;
		gc->bLastDrawMaskFullScreenEnable = IMG_FALSE;
		ui32RegionClip = CalcRegionClip(gc, psRect);
	}
	else
	{
		/* Fullscreen */
		if(gc->bLastDrawMaskFullScreenEnable && bIsEnable)
			return;

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

		afVertdata[0] = 0.0f;
		afVertdata[1] = 0.0f;
		afVertdata[2] = 1.0f;
		
		afVertdata[3] = 2.0f * psDrawParams->ui32Width;
		afVertdata[4] = 0.0f;
		afVertdata[5] = 1.0f;
		
		afVertdata[6] = 0.0f;
		afVertdata[7] = 2.0f * psDrawParams->ui32Height;
		afVertdata[8] = 1.0f;

		ui32NumVerts = 3;
		
		gc->sLastDrawMask.i32X = 0;
		gc->sLastDrawMask.i32Y = 0;
		gc->sLastDrawMask.ui32Width = psDrawParams->ui32Width;
		gc->sLastDrawMask.ui32Width = psDrawParams->ui32Height;

		gc->bLastDrawMaskFullScreenEnable = bIsEnable;

		ui32RegionClip = CalcRegionClip(gc, IMG_NULL);
	}

	ui323DControlWord = MBX1_TAOBJTYPE_STATE				| 
						MBX1_TASTATEPRES_ISPCTL				| 
						MBX1_TASTATEPRES_TSPCTL				|
						MBX1_TASTATEPRES_REGIONCLIP			|
						MBX1_TASTATEPRES_VGP_IFDEFINITION	|
						MBX1_TASTATEPRES_FP_INPUTFORMAT;
	
#ifndef FIX_HW_PRN_145	
	ui32ISPTSPWord = MBX1_ISPTSPCTL_SRCBLENDONE | 
					 MBX1_ISPTSPCTL_DESTBLENDZERO | 
					 MBX1_ISPTSPCTL_LOGICALOPDISABLE | 
					 MBX1_ISPTSPCTL_CKDISABLE | 
					 MBX1_ISPTSPCTL_OBJTYPE_VIEWPORT | 
					 MBX1_ISPTSPCTL_DCMPMODEALWAYS | 
					 MBX1_ISPTSPCTL_DWDISABLE |
					 MBX1_ISPTSPCTL_TAGWDISABLE |
					 (bIsEnable ? MBX1_ISPTSPCTL_VIEWPORTMASK : 0);
#else
	ui32ISPTSPWord = MBX1_ISPTSPCTL_SRCBLENDONE | 
					 MBX1_ISPTSPCTL_DESTBLENDZERO | 
					 MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE | 
					 MBX1_ISPTSPCTL_CKDISABLE | 
					 MBX1_ISPTSPCTL_OBJTYPE_VIEWPORT | 
					 MBX1_ISPTSPCTL_DCMPMODEALWAYS | 
					 MBX1_ISPTSPCTL_DWDISABLE |
					 MBX1_ISPTSPCTL_TAGWDISABLE |
					 (bIsEnable ? MBX1_ISPTSPCTL_VIEWPORTMASK : 0);
#endif

	ui32TSPObjectWord = MBX1_TSPOBJ_ACMPMODEALWAYS;
	
	ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_FALSE, 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);
	
	ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;
	
	/* Preserve terminate word bit only */
	gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
	gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE;

	StartTriangleStrip(gc);
	
	OutputVerticesSpecialObject(gc, afVertdata, ui32NumVerts, 3);

	EndPrimitiveBlock(gc);
	
	gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;

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


#else /* SUPPORT_VGP */

/***********************************************************************************
 Function Name      : SendFogColorChange
 Inputs             : gc
 Outputs            : 
 Returns            : -
 Description        : Sends a special object to change the fog colour register. 
************************************************************************************/
#if defined(SUPPORT_MBX1_LITE)

#if !defined(FIX_HW_PRN_302)
IMG_VOID SendFogColorChange(GLESContext *gc)
{
	GLESDrawableParams *psDrawParams = &gc->sDrawableParams;
	IMG_FLOAT afVertdata[12];
	IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader, ui323DControlWord, ui32FPControlWord;
	IMG_UINT32 i, ui32NumStrips;

	ui32NumStrips = (psDrawParams->ui32Height + MBX1_ISPREGION_SIZEY - 1) >> MBX1_ISPREGION_SHIFTY;

	ui323DControlWord = MBX1_TAOBJTYPE_STATE	| 
						MBX1_TASTATEPRES_ISPCTL | 
						MBX1_TASTATEPRES_TSPCTL |
						MBX1_TASTATEPRES_FP_INPUTFORMAT;
	
	ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;
	
#ifndef FIX_HW_PRN_145	
	ui32ISPTSPWord =	MBX1_ISPTSPCTL_LO_NOOP | 
						MBX1_ISPTSPCTL_LOADFOGCOLOUR | 
						MBX1_ISPTSPCTL_CKDISABLE | 
						MBX1_ISPTSPCTL_OBJTYPE_PSTRANS | 
						MBX1_ISPTSPCTL_DCMPMODEALWAYS | 
						MBX1_ISPTSPCTL_DWDISABLE;
#else
	ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDZERO | 
						MBX1_ISPTSPCTL_DESTBLENDONE | 
						MBX1_ISPTSPCTL_BLENDOPMODELOADFOGCOLOUR | 
						MBX1_ISPTSPCTL_CKDISABLE | 
						MBX1_ISPTSPCTL_OBJTYPE_PSTRANS | 
						MBX1_ISPTSPCTL_DCMPMODEALWAYS | 
						MBX1_ISPTSPCTL_DWDISABLE;
#endif

	ui32TSPObjectWord = MBX1_TSPOBJ_ACMPMODEALWAYS;
	ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;

	EmitState(gc, &ui323DControlWord, 1);
	EmitState(gc, &ui32ISPTSPWord, 1);
	EmitState(gc, &ui32TSPObjectWord, 1);
	EmitState(gc, &ui32FPControlWord, 1);
	
	/* Preserve terminate word bit only */
	gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
	gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE | MBX1_TAPRIM_WBUFFERING_ENABLE;

	StartTriangleList(gc);
	
	for(i = 0 ; i < ui32NumStrips; i++)
	{
		afVertdata[0] = 0.0f;
		afVertdata[1] = (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
		afVertdata[2] = 1.0f;
		((IMG_UINT32 *)afVertdata)[3] = gc->sState.sFog.ui32Color;
		
		afVertdata[4] = (IMG_FLOAT)psDrawParams->ui32Width;
		afVertdata[5] = (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
		afVertdata[6] = 1.0f;
		((IMG_UINT32 *)afVertdata)[7] = gc->sState.sFog.ui32Color;
		
		afVertdata[8] = 0.0f;
		afVertdata[9] = 1.0f + (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
		afVertdata[10] = 1.0f;
		((IMG_UINT32 *)afVertdata)[11] = gc->sState.sFog.ui32Color;
		
		OutputVerticesSpecialObject(gc, afVertdata, 3, 4);
	}
	EndPrimitiveBlock(gc);
	
	gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;

	gc->bFogColorInvalid = IMG_FALSE;

	/* Need to mark these bits as dirty for re-emission. */
	gc->sHWContext.ui32TAControland3DState |= ui323DControlWord;
}
#endif

#else /* SUPPORT_MBX_LITE */

IMG_VOID SendFogColorChange(GLESContext *gc)
{
	GLESDrawableParams *psDrawParams = &gc->sDrawableParams;
	IMG_FLOAT afVertdata[16];
	IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader, ui323DControlWord, ui32FPControlWord;
	IMG_UINT32 i, ui32NumStrips;

	ui32NumStrips = (psDrawParams->ui32Height + MBX1_ISPREGION_SIZEY - 1) >> MBX1_ISPREGION_SHIFTY;

	ui323DControlWord = MBX1_TAOBJTYPE_STATE	| 
						MBX1_TASTATEPRES_ISPCTL | 
						MBX1_TASTATEPRES_TSPCTL |
						MBX1_TASTATEPRES_FP_INPUTFORMAT;
	
	ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;

#ifndef FIX_HW_PRN_145	
	ui32ISPTSPWord =	MBX1_ISPTSPCTL_LO_NOOP			| 
						MBX1_ISPTSPCTL_LOADFOGCOLOUR	| 
						MBX1_ISPTSPCTL_CKDISABLE		| 
						MBX1_ISPTSPCTL_OBJTYPE_PSTRANS	| 
						MBX1_ISPTSPCTL_DCMPMODEALWAYS	| 
						MBX1_ISPTSPCTL_DWDISABLE		|
						MBX1_ISPTSPCTL_TAGWDISABLE;
#else
	ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDZERO				| 
						MBX1_ISPTSPCTL_DESTBLENDONE				| 
						MBX1_ISPTSPCTL_BLENDOPMODELOADFOGCOLOUR | 
						MBX1_ISPTSPCTL_CKDISABLE				| 
						MBX1_ISPTSPCTL_OBJTYPE_PSTRANS			| 
						MBX1_ISPTSPCTL_DCMPMODEALWAYS			| 
						MBX1_ISPTSPCTL_DWDISABLE				|
						MBX1_ISPTSPCTL_TAGWDISABLE;
#endif

	ui32TSPObjectWord = MBX1_TSPOBJ_ACMPMODEALWAYS;
	ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;

	EmitState(gc, &ui323DControlWord, 1);
	EmitState(gc, &ui32ISPTSPWord, 1);
	EmitState(gc, &ui32TSPObjectWord, 1);
	EmitState(gc, &ui32FPControlWord, 1);	

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

	/* MBXlite does not have the special object tag disable mode, so a tag enabled set of strips running
	 * horizontally across the screen are used to save fill rate 
	 */
	StartTriangleStrip(gc);

	for(i = 0 ; i < ui32NumStrips-1; i++)
	{
		afVertdata[0] = 0.0f;
		afVertdata[1] = (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
		afVertdata[2] = 1.0f;
		((IMG_UINT32 *)afVertdata)[3] = gc->sState.sFog.ui32Color;
		
		afVertdata[4] = (IMG_FLOAT)psDrawParams->ui32Width;
		afVertdata[5] = (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
		afVertdata[6] = 1.0f;
		((IMG_UINT32 *)afVertdata)[7] = gc->sState.sFog.ui32Color;
		
		afVertdata[8] = 0.0f;
		afVertdata[9] = 1.0f + (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
		afVertdata[10] = 1.0f;
		((IMG_UINT32 *)afVertdata)[11] = gc->sState.sFog.ui32Color;
	
		afVertdata[12] = (IMG_FLOAT)psDrawParams->ui32Width;
		afVertdata[13] = 1.0f + (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
		afVertdata[14] = 1.0f;
		((IMG_UINT32 *)afVertdata)[15] = gc->sState.sFog.ui32Color;

		OutputVerticesSpecialObject(gc, afVertdata, 4, 4);
		
		EndPrimitive(gc);
	}

	afVertdata[0] = 0.0f;
	afVertdata[1] = (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
	afVertdata[2] = 1.0f;
	((IMG_UINT32 *)afVertdata)[3] = gc->sState.sFog.ui32Color;
	
	afVertdata[4] = (IMG_FLOAT)psDrawParams->ui32Width;
	afVertdata[5] = (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
	afVertdata[6] = 1.0f;
	((IMG_UINT32 *)afVertdata)[7] = gc->sState.sFog.ui32Color;
	
	afVertdata[8] = 0.0f;
	afVertdata[9] = 1.0f + (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
	afVertdata[10] = 1.0f;
	((IMG_UINT32 *)afVertdata)[11] = gc->sState.sFog.ui32Color;
	
	afVertdata[12] = (IMG_FLOAT)psDrawParams->ui32Width;
	afVertdata[13] = 1.0f + (IMG_FLOAT)i * MBX1_ISPREGION_SIZEY;
	afVertdata[14] = 1.0f;
	((IMG_UINT32 *)afVertdata)[15] = gc->sState.sFog.ui32Color;
	
	OutputVerticesSpecialObject(gc, afVertdata, 4, 4);

	EndPrimitiveBlock(gc);
	
	gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;

	gc->bFogColorInvalid = IMG_FALSE;

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

#endif

/***********************************************************************************
 Function Name      : SendDrawMaskRect
 Inputs             : gc, psRect, bIsEnable
 Outputs            : 
 Returns            : -
 Description        : Sends a special object to enable/disable portions of the 
					  screen for drawing
************************************************************************************/

IMG_VOID SendDrawMaskRect(GLESContext *gc, GLESDrawMaskRect *psRect, IMG_BOOL bIsEnable)
{
	/* 
	 * Possible optimisation: It makes sense to use the TA region clip word if a non-fullscreen drawmask is set. This
	 * ensures geometry stretching outside the viewport/scissor region doesn't generate extra pointers  It is also 
	 * important to detect a drawmask equivalent to the previous one (especially full-screen drawmasks). The previous
	 * drawmask state will have to be stored for this.
	 */

	GLESDrawableParams *psDrawParams = &gc->sDrawableParams;

⌨️ 快捷键说明

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