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