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

📄 specialobject.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		 * Just send the scissor/viewport
		 */
		sScissor.i32X = i32X0;
		sScissor.i32Y = i32Y0;
		sScissor.ui32Width = (i32X1 - i32X0);
		sScissor.ui32Height = (i32Y1 - i32Y0);
		
		SendDrawMaskRect(gc, &sScissor, IMG_TRUE);				
	}
}	

IMG_VOID SendDrawMaskForClear(GLESContext *gc)
{
	GLESDrawableParams *psDrawParams = &gc->sDrawableParams;
	GLESDrawMaskRect sScissor;

	if (gc->ui32FrameEnables & GLES_FS_SCISSOR_ENABLE)
	{
		if(gc->bFullScreenScissor)
		{
			/* Full screen enable */
			SendDrawMaskRect(gc, NULL, IMG_TRUE);
		}
		else if(gc->sState.sScissor.ui32ScissorWidth == 0 || gc->sState.sScissor.ui32ScissorHeight == 0)
		{
			/* Full screen should be drawmasked off here */
			SendDrawMaskRect(gc, NULL, IMG_FALSE);
		}
		else
		{
			IMG_INT32 i32X1, i32Y1, i32X0, i32Y0;
			
			switch(psDrawParams->eRotationAngle)
			{
			case ROTATE_0:
				default:
				i32X0 = gc->sState.sScissor.i32ScissorX;
					i32Y0 = psDrawParams->ui32Height - 
						(gc->sState.sScissor.i32ScissorY + gc->sState.sScissor.ui32ScissorHeight);
				break;
			case ROTATE_90:
					i32X0 = psDrawParams->ui32Width - 
							(gc->sState.sScissor.i32ScissorX + gc->sState.sScissor.ui32ScissorWidth);
					i32Y0 = psDrawParams->ui32Height - 
							(gc->sState.sScissor.i32ScissorY + gc->sState.sScissor.ui32ScissorHeight);
				break;
			case ROTATE_180:
				i32X0 = psDrawParams->ui32Width - (gc->sState.sScissor.i32ScissorX + gc->sState.sScissor.ui32ScissorWidth);
				i32Y0 = gc->sState.sScissor.i32ScissorY;
				break;
			case ROTATE_270:
				i32X0 = gc->sState.sScissor.i32ScissorX;
				i32Y0 = gc->sState.sScissor.i32ScissorY;
				break;
			}

			i32X1 = i32X0 + gc->sState.sScissor.ui32ScissorWidth;
			i32Y1 = i32Y0 + gc->sState.sScissor.ui32ScissorHeight;
			
			if ((i32X1 < 0) || (i32Y1 < 0)) 
			{
				/* Full screen should be drawmasked off here */
				SendDrawMaskRect(gc, NULL, IMG_FALSE);
			}
			else 
			{
				if (i32X0 < 0)
				{
					i32X0 = 0;
				}
				
				if (i32Y0 < 0)
				{
					i32Y0 = 0;
				}
				
				sScissor.i32X = i32X0;
				sScissor.i32Y = i32Y0;
				sScissor.ui32Width = (i32X1 - i32X0);
				sScissor.ui32Height = (i32Y1 - i32Y0);

				SendDrawMaskRect(gc, &sScissor, IMG_TRUE);
			}
		}
	}
	else
	{
		/* Full screen enable */
		SendDrawMaskRect(gc, NULL, IMG_TRUE);
	}
}


#if defined (SUPPORT_VGP) || defined (SUPPORT_VGP_LITE)

/***********************************************************************************
 Function Name      : DrawClearPrims
 Inputs             : gc
 Outputs            : -
 Returns            : -
 Description        : Sends a clear primitive to clear either color, depth or both
************************************************************************************/

IMG_VOID DrawClearPrims(GLESContext *gc)
{
	IMG_FLOAT afVertdata[16];
	IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader, ui323DControlWord;
	IMG_UINT32 ui32InputFormatWord, ui32FPControlWord;
	
	SetupVGPSectionEnables(gc, IMG_TRUE, IMG_FALSE);
	GLES_DIRTY_VGP_SECTIONS(gc);

	ui323DControlWord = MBX1_TAOBJTYPE_STATE				| 
						MBX1_TASTATEPRES_ISPCTL				|	 
						MBX1_TASTATEPRES_TSPCTL				|
						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;
#else
	ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE | 
						MBX1_ISPTSPCTL_DESTBLENDZERO | 
						MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE |
						MBX1_ISPTSPCTL_CKDISABLE | 
						MBX1_ISPTSPCTL_OBJTYPE_OPAQUE | 
						MBX1_ISPTSPCTL_DCMPMODEALWAYS;
#endif

	ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_TRUE, IMG_FALSE);
	
	ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;

	ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;

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

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

	EmitState(gc, &ui323DControlWord, 1);
	EmitState(gc, &ui32ISPTSPWord, 1);
	EmitState(gc, &ui32TSPObjectWord, 1);
	EmitState(gc, &ui32InputFormatWord, 1);
	EmitState(gc, &ui32FPControlWord, 1);
	
	
	/*
	* The vertices are organised as a strip.
	*
	*        [1] (X0, Y1) --- (X1, Y1) [3]
	*                |     \        |
	*        [0] (X0, Y0) --- (X1, Y0) [2]
	*/
	afVertdata[0] = (GLfloat)gc->sClear.i32ClearX0;
	afVertdata[1] = (GLfloat)gc->sClear.i32ClearY0;
	afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
	((IMG_UINT32 *)afVertdata)[3] = gc->sClear.ui32ClearColor;

	afVertdata[4] = (GLfloat)gc->sClear.i32ClearX0;
	afVertdata[5] = (GLfloat)gc->sClear.i32ClearY1;
	afVertdata[6] = (GLfloat)gc->sClear.fClearDepth;
	((IMG_UINT32 *)afVertdata)[7] = gc->sClear.ui32ClearColor;

	afVertdata[8]  = (GLfloat)gc->sClear.i32ClearX1;
	afVertdata[9]  = (GLfloat)gc->sClear.i32ClearY0;
	afVertdata[10] = (GLfloat)gc->sClear.fClearDepth;
	((IMG_UINT32 *)afVertdata)[11] =  gc->sClear.ui32ClearColor;

	afVertdata[12] = (GLfloat)gc->sClear.i32ClearX1;
	afVertdata[13] = (GLfloat)gc->sClear.i32ClearY1;
	afVertdata[14] = (GLfloat)gc->sClear.fClearDepth;
	((IMG_UINT32 *)afVertdata)[15] =  gc->sClear.ui32ClearColor;

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

	StartTriangleStrip(gc);
	
	OutputVerticesSpecialObject(gc, afVertdata, 4, 4);

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

	/*
	 * Mark the current drawmask as invalid
	 */
	gc->bDrawMaskInvalid = IMG_TRUE;

	gc->sClear.ui32ClearFlags = 0;

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

/***********************************************************************************
 Function Name      : DrawClearPrims
 Inputs             : gc
 Outputs            : -
 Returns            : -
 Description        : Sends a clear primitive to clear either color, depth or both
************************************************************************************/

IMG_VOID DrawClearPrims(GLESContext *gc)
{
	IMG_FLOAT afVertdata[20];
	IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader, ui323DControlWord, ui32FPControlWord;

	ui323DControlWord = MBX1_TAOBJTYPE_STATE	| 
						MBX1_TASTATEPRES_ISPCTL	| 
						MBX1_TASTATEPRES_TSPCTL |
						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;
#else	
	ui32ISPTSPWord =	MBX1_ISPTSPCTL_SRCBLENDONE | 
						MBX1_ISPTSPCTL_DESTBLENDZERO | 
						MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE |
						MBX1_ISPTSPCTL_CKDISABLE | 
						MBX1_ISPTSPCTL_OBJTYPE_OPAQUE | 
						MBX1_ISPTSPCTL_DCMPMODEALWAYS;
#endif
	
	ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;

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

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

	EmitState(gc, &ui323DControlWord, 1);
	EmitState(gc, &ui32ISPTSPWord, 1);
	EmitState(gc, &ui32TSPObjectWord, 1);
	EmitState(gc, &ui32FPControlWord, 1);
	
	/*
	* The vertices are organised as a strip.
	*
	*        [1] (X0, Y1) --- (X1, Y1) [3]
	*                |     \        |
	*        [0] (X0, Y0) --- (X1, Y0) [2]
	*/
	afVertdata[0] = (GLfloat)gc->sClear.i32ClearX0;
	afVertdata[1] = (GLfloat)gc->sClear.i32ClearY0;
	afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
	afVertdata[3] = 1.0f;
	((IMG_UINT32 *)afVertdata)[4] = gc->sClear.ui32ClearColor;

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

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

	afVertdata[15] = (GLfloat)gc->sClear.i32ClearX1;
	afVertdata[16] = (GLfloat)gc->sClear.i32ClearY1;
	afVertdata[17] = (GLfloat)gc->sClear.fClearDepth;
	afVertdata[18] = 1.0f;
	((IMG_UINT32 *)afVertdata)[19] =  gc->sClear.ui32ClearColor;

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

	StartTriangleStrip(gc);
	
	OutputVerticesSpecialObject(gc, afVertdata, 4, 5);

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

	/*
	 * Mark the current drawmask as invalid
	 */
	gc->bDrawMaskInvalid = IMG_TRUE;

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

#endif


IMG_VOID SetupHWBGObjWords(GLESContext *gc)
{
	PVRSRV_BGOBJ_INFO *psBGObjInfo = &gc->sHWContext.sBGObjInfo;
	GLESDrawableParams *psParams = &gc->sDrawableParams;
	IMG_UINT32 ui32PixelStride = psParams->ui32Stride;

	/* Store previous frame BG OBj Info for accumulation across frames */
	gc->sHWContext.sLastFrameBGObjInfo = *psBGObjInfo;

	switch(psParams->ePixelFormat)
	{
		case PVRSRV_PIXEL_FORMAT_ARGB8888:
			psBGObjInfo->ui32TexFormatStride = MBX1_TSPPL1_TPIXFORM8888;
			ui32PixelStride >>= 2; 
			break;
		case PVRSRV_PIXEL_FORMAT_RGB565:
		default:
			psBGObjInfo->ui32TexFormatStride = MBX1_TSPPL1_TPIXFORM565;
			ui32PixelStride >>= 1; 
			break;
	}

	if(ui32PixelStride & MBX1_TEXSTRIDE_8PIXEL_TEST_MASK)
	{
		psBGObjInfo->ui32TexFormatStride |= MBX1_TSPPL1_TEXSTRIDE_LSB;
	}

	psBGObjInfo->ui32TexAddrStride = (psParams->ui32HWSurfaceAddress >> MBX1_TSPPL2_TEXADDRALIGNSHIFT);

	psBGObjInfo->ui32TexAddrStride |= ((ui32PixelStride >> MBX1_TSPPL2_TEXSTRIDEUNITSHIFT) << 
										MBX1_TSPPL2_TEXSTRIDESHIFT);
}

#if defined (SUPPORT_VGP) || defined (SUPPORT_VGP_LITE)

/***********************************************************************************
 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[18];
	IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader, ui323DControlWord, ui32RegionClip;
	IMG_UINT32 ui32InputFormatWord, ui32FPControlWord;
	PVR3DIF_SHAREDDATA *psSharedData = gc->psRenderSurface->psTARenderInfo->psSharedData;
	IMG_UINT32 ui32PixelWidth, ui32PixelHeight;
	DEVICE3D *ps3D = &gc->sHWContext.ps3DDevData->psDevInfoUM->sDeviceSpecific.s3D;

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

	ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;

	/* We can only optimise the clears by using the BG obj if the clears are supposed to be fullscreen */
	if(gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_COLOR && 
		(!(gc->ui32FrameEnables & GLES_FS_SCISSOR_ENABLE) || gc->bFullScreenScissor))
	{
		SetupVGPSectionEnables(gc, IMG_TRUE, IMG_FALSE);
		GLES_DIRTY_VGP_SECTIONS(gc);
	
		ui323DControlWord = MBX1_TAOBJTYPE_STATE				| 
							MBX1_TASTATEPRES_ISPCTL				|	 
							MBX1_TASTATEPRES_TSPCTL				|
							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;
#else

⌨️ 快捷键说明

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