📄 specialobject.c
字号:
/**************************************************************************
* 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 + -