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

📄 specialobject.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************
 * Name         : specialobject.c
 * Author       : BCB
 * Created      : 11/02/2004
 *
 * Copyright    : 2003-2004 by Imagination Technologies Limited. All rights reserved.
 *              : No part of this software, either material or conceptual 
 *              : may be copied or distributed, transmitted, transcribed,
 *              : stored in a retrieval system or translated into any 
 *              : human or computer language in any form by any means,
 *              : electronic, mechanical, manual or other-wise, or 
 *              : disclosed to third parties without the express written
 *              : permission of Imagination Technologies Limited, Unit 8, HomePark
 *              : Industrial Estate, King's Langley, Hertfordshire,
 *              : WD4 8LZ, U.K.
 *
 * Platform     : ANSI
 *
 * $Date: 2004/11/01 10:44:23 $ $Revision: 1.11.1.1 $
 * $Log: specialobject.c $
 **************************************************************************/
#define MODULE_ID MODID_SPECIALOBJECT

#include "context.h"
#include "pvr3dif.h"
#include "vgp.h"
#include "slaveport.h"

/***********************************************************************************
 Function Name      : CalcRegionClip
 Inputs             : gc, psRect
 Outputs            : -
 Returns            : Region Clip Word
 Description        : Calculates a region clip word for a given rect. 
************************************************************************************/

static IMG_UINT32 CalcRegionClip(GLESContext *gc, GLESDrawMaskRect *psRegion)
{
	IMG_UINT32 ui32RegionClip;
	IMG_UINT32 ui32Right, ui32Bottom, ui32Left, ui32Top;
	GLESDrawMaskRect sRect;
	GLESDrawMaskRect *psRect;
	
	
	if(psRegion)
	{
		psRect = psRegion;
	}
	else
	{
		sRect.i32X = 0;
		sRect.i32Y = 0;
		sRect.ui32Width = gc->sDrawableParams.ui32Width;
		sRect.ui32Height = gc->sDrawableParams.ui32Height;

		psRect = &sRect;
	}

	if(gc->sHWContext.sRegisters.psTARegs[GLES_SWTAREG_CONFIG].ui32RegVal & MBX1_TACONFIG_SUPERSAMPLEX)
	{
		psRect->i32X *= 2;
		psRect->ui32Width *= 2;
	}

	if(gc->sHWContext.sRegisters.psTARegs[GLES_SWTAREG_CONFIG].ui32RegVal & MBX1_TACONFIG_SUPERSAMPLEY)
	{
		psRect->i32Y *= 2;
		psRect->ui32Height *= 2;
	}


	/*
		Snap TA clip rect to nearest 16 pixel units outside viewport rectangle.
	*/

	ui32Right = (psRect->i32X + psRect->ui32Width + MBX1_TASTATERGNCLIP_UNITSIZE - 1) & ~(MBX1_TASTATERGNCLIP_UNITSIZE - 1);
	ui32Bottom = (psRect->i32Y + psRect->ui32Height + MBX1_TASTATERGNCLIP_UNITSIZE - 1) & ~(MBX1_TASTATERGNCLIP_UNITSIZE - 1);

	
	/*
		Work out positions in 16 pixel units
	*/
	ui32Left   = (psRect->i32X >> MBX1_TASTATERGNCLIP_UNITSHIFT);
	ui32Right  = (ui32Right >> MBX1_TASTATERGNCLIP_UNITSHIFT) - 1;
	ui32Top    = (psRect->i32Y >> MBX1_TASTATERGNCLIP_UNITSHIFT);
	ui32Bottom = (ui32Bottom >> MBX1_TASTATERGNCLIP_UNITSHIFT) - 1;

	/*
		Setup region-clip word to clip everything outside the calculated 
		tile-region
	*/
	ui32RegionClip = MBX1_TASTATERGNCLIP_CLIPOUTSIDE;

	ui32RegionClip |= (ui32Left << MBX1_TASTATERGNCLIP_LEFTCLIPSHIFT) & (~MBX1_TASTATERGNCLIP_LEFTCLIPCLRMASK);

	ui32RegionClip |= (ui32Right << MBX1_TASTATERGNCLIP_RIGHTCLIPSHIFT) & (~MBX1_TASTATERGNCLIP_RIGHTCLIPCLRMASK);

	ui32RegionClip |= (ui32Top << MBX1_TASTATERGNCLIP_TOPCLIPSHIFT) & (~MBX1_TASTATERGNCLIP_TOPCLIPCLRMASK);

	ui32RegionClip |= (ui32Bottom << MBX1_TASTATERGNCLIP_BOTTOMCLIPSHIFT) & (~MBX1_TASTATERGNCLIP_BOTTOMCLIPCLRMASK);

	return ui32RegionClip;
}

/***********************************************************************************
 Function Name      : SendRegionClipControl
 Inputs             : gc
 Outputs            : -
 Returns            : -
 Description        : Sends a new, fullscreen region clip word.
************************************************************************************/
IMG_VOID SendRegionClipControl(GLESContext *gc)
{
	IMG_UINT32 ui32RegionClip, ui323DControlWord;

	ui32RegionClip = CalcRegionClip(gc, IMG_NULL);
	ui323DControlWord = MBX1_TAOBJTYPE_STATE | MBX1_TASTATEPRES_REGIONCLIP;

	EmitState(gc, &ui323DControlWord, 1);
	EmitState(gc, &ui32RegionClip, 1);

	gc->sHWContext.ui32TAControland3DState &= ~MBX1_TASTATEPRES_REGIONCLIP;
}

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

#if defined (SUPPORT_VGP)
/***********************************************************************************
 Function Name      : SendFogColorChange
 Inputs             : gc
 Outputs            : -
 Returns            : -
 Description        : Sends a special object to change the fog colour register. 
************************************************************************************/
IMG_VOID SendFogColorChange(GLESContext *gc)
{
	GLESDrawableParams *psDrawParams = &gc->sDrawableParams;
	IMG_FLOAT afVertdata[12];
	IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader;
	IMG_UINT32  ui323DControlWord, ui32InputFormatWord, ui32FPControlWord;

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

	/* Fullscreen */
	afVertdata[0] = 0.0f;
	afVertdata[1] = 0.0f;
	afVertdata[2] = 1.0f;
	((IMG_UINT32 *)afVertdata)[3] = gc->sState.sFog.ui32Color;
		
	afVertdata[4] = 2.0f * psDrawParams->ui32Width;
	afVertdata[5] = 0.0f;
	afVertdata[6] = 1.0f;
	((IMG_UINT32 *)afVertdata)[7] = gc->sState.sFog.ui32Color;
		
	afVertdata[8] = 0.0f;
	afVertdata[9] = 2.0f * psDrawParams->ui32Height;
	afVertdata[10] = 1.0f;
	((IMG_UINT32 *)afVertdata)[11] = gc->sState.sFog.ui32Color;

	ui323DControlWord = MBX1_TAOBJTYPE_STATE				| 
						MBX1_TASTATEPRES_ISPCTL				| 
						MBX1_TASTATEPRES_TSPCTL				|
						MBX1_TASTATEPRES_VGP_IFDEFINITION	|
						MBX1_TASTATEPRES_FP_INPUTFORMAT;
	
#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;

	ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_TRUE, IMG_FALSE);

	ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;

	EmitState(gc, &ui323DControlWord, 1);
	EmitState(gc, &ui32ISPTSPWord, 1);
	EmitState(gc, &ui32TSPObjectWord, 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, 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;
}

#else /* SUPPORT_VGP */

/* I am assuming that SUPPORT_VGP_LITE implies MBX_LITE */

#if !defined(FIX_HW_PRN_302)

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

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

	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;
	
#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;

	ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_TRUE, IMG_FALSE);

	ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;

	EmitState(gc, &ui323DControlWord, 1);
	EmitState(gc, &ui32ISPTSPWord, 1);
	EmitState(gc, &ui32TSPObjectWord, 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;

	/* 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
#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;
	IMG_UINT32 ui32NumVerts;
	IMG_FLOAT afVertdata[12];
	IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader;
	IMG_UINT32 ui323DControlWord, ui32InputFormatWord, ui32RegionClip, ui32FPControlWord;

	ui32FPControlWord = MBX1_TAFPFORMAT_TYPEIEEEFLOAT;

	if(psRect)
	{	
		if(psRect->i32X == gc->sLastDrawMask.i32X &&
			psRect->i32Y == gc->sLastDrawMask.i32Y &&
			psRect->ui32Width == gc->sLastDrawMask.ui32Width &&
			psRect->ui32Height == gc->sLastDrawMask.ui32Height)
		{
			return;
		}
		
		if(bIsEnable)
		{
			/* Do fullscreen disable first */
			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;
			
			ui323DControlWord = MBX1_TAOBJTYPE_STATE				| 
								MBX1_TASTATEPRES_ISPCTL				| 
								MBX1_TASTATEPRES_TSPCTL				|
								MBX1_TASTATEPRES_REGIONCLIP			|
								MBX1_TASTATEPRES_VGP_IFDEFINITION	|
								MBX1_TASTATEPRES_FP_INPUTFORMAT;

⌨️ 快捷键说明

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