📄 specialobject.c
字号:
ui32ISPTSPWord = MBX1_ISPTSPCTL_SRCBLENDONE |
MBX1_ISPTSPCTL_DESTBLENDZERO |
MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE |
MBX1_ISPTSPCTL_CKDISABLE |
MBX1_ISPTSPCTL_OBJTYPE_OPAQUE |
MBX1_ISPTSPCTL_DCMPMODEALWAYS;
#endif
ui32RegionClip = CalcRegionClip(gc, IMG_NULL);
ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;
if (!(gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_DEPTH))
{
ui32ISPTSPWord |= MBX1_ISPTSPCTL_DWDISABLE;
}
ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_TRUE, 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);
afVertdata[0] = 0.0f;
afVertdata[1] = 0.0f;
afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
((IMG_UINT32 *)afVertdata)[3] = gc->sClear.ui32ClearColor;
afVertdata[4] = (GLfloat)ui32PixelWidth * 2.0f;
afVertdata[5] = 0.0f;
afVertdata[6] = (GLfloat)gc->sClear.fClearDepth;
((IMG_UINT32 *)afVertdata)[7] = gc->sClear.ui32ClearColor;
afVertdata[8] = 0.0f;
afVertdata[9] = (GLfloat)ui32PixelHeight * 2.0f;
afVertdata[10] = (GLfloat)gc->sClear.fClearDepth;
((IMG_UINT32 *)afVertdata)[11] = gc->sClear.ui32ClearColor;
/* Preserve terminate word bit only */
gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE;
StartTriangleList(gc);
OutputVerticesSpecialObject(gc, afVertdata, 3, 4);
EndPrimitiveBlock(gc);
gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
gc->sClear.ui32ClearFlags = 0;
}
else
{
IMG_UINT32 ui32TSPWord[3];
SetupVGPSectionEnables(gc, IMG_TRUE, IMG_TRUE);
GLES_DIRTY_VGP_SECTIONS(gc);
ui323DControlWord = MBX1_TAOBJTYPE_STATE |
MBX1_TASTATEPRES_ISPCTL |
MBX1_TASTATEPRES_TSPCTL |
MBX1_TASTATEPRES_LAYER0CTL |
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 |
(1 << MBX1_ISPTSPCTL_NUMPASSESSHIFT);
#else
ui32ISPTSPWord = MBX1_ISPTSPCTL_SRCBLENDONE |
MBX1_ISPTSPCTL_DESTBLENDZERO |
MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE |
MBX1_ISPTSPCTL_CKDISABLE |
MBX1_ISPTSPCTL_OBJTYPE_OPAQUE |
MBX1_ISPTSPCTL_DCMPMODEALWAYS |
(1 << MBX1_ISPTSPCTL_NUMPASSESSHIFT);
#endif
ui32RegionClip = CalcRegionClip(gc, IMG_NULL);
ui32InputFormatWord = GetVGPPassthoughInputFormat(gc, IMG_TRUE, IMG_TRUE);
/* Use Previous frame's address + stride for accumulation */
ui32TSPWord[0] = MBX1_TSPPL1_TUADDRMODECLAMP |
MBX1_TSPPL1_TVADDRMODECLAMP |
(MBX1_TSPPL1_TSIZE2048 << MBX1_TSPPL1_TUSIZESHIFT) |
(MBX1_TSPPL1_TSIZE2048 << MBX1_TSPPL1_TVSIZESHIFT) |
gc->sHWContext.sLastFrameBGObjInfo.ui32TexFormatStride;
ui32TSPWord[1] = MBX1_TSPPL2_MIPCTLNOTMIPMAP |
(0x7 << MBX1_TSPPL2_DADJUSTSHIFT) |
gc->sHWContext.sLastFrameBGObjInfo.ui32TexAddrStride;
ui32TSPWord[2] = MBX1_TSPPL3_CS1SELONE |
MBX1_TSPPL3_CS2SELTEXTURE |
MBX1_TSPPL3_CS3SELONE |
MBX1_TSPPL3_CS4SELTEXTURE |
MBX1_TSPPL3_INVCS3 |
MBX1_TSPPL3_AS1SELONE |
MBX1_TSPPL3_AS2SELDIFFUSEALPHA |
MBX1_TSPPL3_AS3SELONE |
MBX1_TSPPL3_AS4SELDIFFUSEALPHA |
MBX1_TSPPL3_INVAS3;
ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;
/* This will clear depth fullscreen, whether scissor is set or not. This is incorrect, but we don't have
* a defined behaviour for accumulating depth without an external depth buffer
*/
if (!(gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_DEPTH))
{
ui32ISPTSPWord |= MBX1_ISPTSPCTL_DWDISABLE;
}
EmitState(gc, &ui323DControlWord, 1);
EmitState(gc, &ui32ISPTSPWord, 1);
EmitState(gc, &ui32TSPObjectWord, 1);
EmitState(gc, ui32TSPWord, 3);
EmitState(gc, &ui32RegionClip, 1);
EmitState(gc, &ui32InputFormatWord, 1);
EmitState(gc, &ui32FPControlWord, 1);
afVertdata[0] = 0.0f;
afVertdata[1] = 0.0f;
afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[3] = 0;
afVertdata[4] = 0.0f;
afVertdata[5] = 0.0f;
afVertdata[6] = (GLfloat)ui32PixelWidth * 2.0f;
afVertdata[7] = 0.0f;
afVertdata[8] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[9] = 0;
afVertdata[10] = (GLfloat)ui32PixelWidth * 2.0f / 2048.0f;
afVertdata[11] = 0.0f;
afVertdata[12] = 0.0f;
afVertdata[13] = (GLfloat)ui32PixelHeight * 2.0f;
afVertdata[14] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[15] = 0;
afVertdata[16] = 0.0f;
afVertdata[17] = (GLfloat)ui32PixelHeight * 2.0f / 2048.0f;
/* 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, 6);
EndPrimitiveBlock(gc);
gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
gc->sClear.ui32ClearFlags &= ~GLES_CLEARFLAG_DEPTH;
}
/* Need to mark these bits as dirty for re-emission. */
gc->sHWContext.ui32TAControland3DState |= (ui323DControlWord & ~MBX1_TASTATEPRES_REGIONCLIP);
}
#else /* SUPPORT_VGP */
/***********************************************************************************
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[21];
IMG_UINT32 ui32ISPTSPWord, ui32TSPObjectWord, ui32TempBlockHeader, ui323DControlWord, ui32RegionClip;
IMG_UINT32 ui32TSPWord[3], ui32FPControlWord;
PVR3DIF_SHAREDDATA *psSharedData = gc->psRenderSurface->psTARenderInfo->psSharedData;
DEVICE3D *ps3D = &gc->sHWContext.ps3DDevData->psDevInfoUM->sDeviceSpecific.s3D;
IMG_UINT32 ui32PixelWidth, ui32PixelHeight;
ui32PixelWidth = psSharedData->ui32XTilesPerMT * psSharedData->ui32MTilesX * ps3D->ui32PixelsInTileX;
ui32PixelHeight = psSharedData->ui32YTilesPerMT * psSharedData->ui32MTilesY * ps3D->ui32PixelsInTileY;
if(gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_COLOR &&
(!(gc->ui32FrameEnables & GLES_FS_SCISSOR_ENABLE) || gc->bFullScreenScissor))
{
ui323DControlWord = MBX1_TAOBJTYPE_STATE |
MBX1_TASTATEPRES_ISPCTL |
MBX1_TASTATEPRES_TSPCTL |
MBX1_TASTATEPRES_REGIONCLIP |
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 |
MBX1_ISPTSPCTL_DWDISABLE;
#else
ui32ISPTSPWord = MBX1_ISPTSPCTL_SRCBLENDONE |
MBX1_ISPTSPCTL_DESTBLENDZERO |
MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE |
MBX1_ISPTSPCTL_CKDISABLE |
MBX1_ISPTSPCTL_OBJTYPE_OPAQUE |
MBX1_ISPTSPCTL_DCMPMODEALWAYS |
MBX1_ISPTSPCTL_DWDISABLE;
#endif
ui32RegionClip = CalcRegionClip(gc, IMG_NULL);
ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;
if (gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_DEPTH)
{
ui32ISPTSPWord &= ~MBX1_ISPTSPCTL_DWDISABLE;
gc->sClear.ui32ClearFlags &= ~GLES_CLEARFLAG_DEPTH;
}
EmitState(gc, &ui323DControlWord, 1);
EmitState(gc, &ui32ISPTSPWord, 1);
EmitState(gc, &ui32TSPObjectWord, 1);
EmitState(gc, &ui32RegionClip, 1);
EmitState(gc, &ui32FPControlWord, 1);
afVertdata[0] = 0.0f;
afVertdata[1] = 0.0f;
afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[3] = 1.0f;
((IMG_UINT32 *)afVertdata)[4] = gc->sClear.ui32ClearColor;
afVertdata[5] = (GLfloat)ui32PixelWidth * 2.0f;
afVertdata[6] = 0.0f;
afVertdata[7] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[8] = 1.0f;
((IMG_UINT32 *)afVertdata)[9] = gc->sClear.ui32ClearColor;
afVertdata[10] = 0.0f;
afVertdata[11] = (GLfloat)ui32PixelHeight * 2.0f;
afVertdata[12] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[13] = 1.0f;
((IMG_UINT32 *)afVertdata)[14] = gc->sClear.ui32ClearColor;
/* Preserve terminate word bit only */
gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAPRIM_USE_TERMINATE_WORD;
gc->sHWContext.ui32PrimitiveHeader |= MBX1_TAPRIM_CULLMODENONE;
StartTriangleList(gc);
OutputVerticesSpecialObject(gc, afVertdata, 3, 5);
EndPrimitiveBlock(gc);
gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
gc->sClear.ui32ClearFlags = 0;
}
else
{
ui323DControlWord = MBX1_TAOBJTYPE_STATE |
MBX1_TASTATEPRES_ISPCTL |
MBX1_TASTATEPRES_TSPCTL |
MBX1_TASTATEPRES_LAYER0CTL |
MBX1_TASTATEPRES_REGIONCLIP |
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 |
MBX1_ISPTSPCTL_DWDISABLE |
(1 << MBX1_ISPTSPCTL_NUMPASSESSHIFT);
#else
ui32ISPTSPWord = MBX1_ISPTSPCTL_SRCBLENDONE |
MBX1_ISPTSPCTL_DESTBLENDZERO |
MBX1_ISPTSPCTL_BLENDOPMODEFOGNONE |
MBX1_ISPTSPCTL_CKDISABLE |
MBX1_ISPTSPCTL_OBJTYPE_OPAQUE |
MBX1_ISPTSPCTL_DCMPMODEALWAYS |
MBX1_ISPTSPCTL_DWDISABLE |
(1 << MBX1_ISPTSPCTL_NUMPASSESSHIFT);
#endif
/* Use Previous frame's address + stride for accumulation */
ui32TSPWord[0] = MBX1_TSPPL1_TUADDRMODECLAMP |
MBX1_TSPPL1_TVADDRMODECLAMP |
(MBX1_TSPPL1_TSIZE2048 << MBX1_TSPPL1_TUSIZESHIFT) |
(MBX1_TSPPL1_TSIZE2048 << MBX1_TSPPL1_TVSIZESHIFT) |
gc->sHWContext.sLastFrameBGObjInfo.ui32TexFormatStride;
ui32TSPWord[1] = MBX1_TSPPL2_MIPCTLNOTMIPMAP |
(0x7 << MBX1_TSPPL2_DADJUSTSHIFT) |
gc->sHWContext.sLastFrameBGObjInfo.ui32TexAddrStride;
ui32TSPWord[2] = MBX1_TSPPL3_CS1SELONE |
MBX1_TSPPL3_CS2SELTEXTURE |
MBX1_TSPPL3_CS3SELONE |
MBX1_TSPPL3_CS4SELTEXTURE |
MBX1_TSPPL3_INVCS3 |
MBX1_TSPPL3_AS1SELONE |
MBX1_TSPPL3_AS2SELDIFFUSEALPHA |
MBX1_TSPPL3_AS3SELONE |
MBX1_TSPPL3_AS4SELDIFFUSEALPHA |
MBX1_TSPPL3_INVAS3;
ui32RegionClip = CalcRegionClip(gc, IMG_NULL);
ui32TempBlockHeader = gc->sHWContext.ui32PrimitiveHeader;
/*
* We normally clear depth from the 3D_ZL_BACKGROUND_DEPTH register, but with an external depth buffer
* we must clear with a SW object - if it is a fullscreen clear, may as well do it here, rather than
* sending another clear object.
*/
if (gc->psRenderSurface->psZBufferMemInfo)
{
if((gc->sClear.ui32ClearFlags & GLES_CLEARFLAG_DEPTH) &&
(!(gc->ui32FrameEnables & GLES_FS_SCISSOR_ENABLE) || gc->bFullScreenScissor))
{
ui32ISPTSPWord &= ~MBX1_ISPTSPCTL_DWDISABLE;
gc->sClear.ui32ClearFlags &= ~GLES_CLEARFLAG_DEPTH;
}
}
EmitState(gc, &ui323DControlWord, 1);
EmitState(gc, &ui32ISPTSPWord, 1);
EmitState(gc, &ui32TSPObjectWord, 1);
EmitState(gc, ui32TSPWord, 3);
EmitState(gc, &ui32RegionClip, 1);
EmitState(gc, &ui32FPControlWord, 1);
afVertdata[0] = 0.0f;
afVertdata[1] = 0.0f;
afVertdata[2] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[3] = 1.0f;
afVertdata[4] = 0;
afVertdata[5] = 0.0f;
afVertdata[6] = 0.0f;
afVertdata[7] = (GLfloat)ui32PixelWidth * 2.0f;
afVertdata[8] = 0.0f;
afVertdata[9] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[10] = 1.0f;
afVertdata[11] = 0;
afVertdata[12] = (GLfloat)ui32PixelWidth * 2.0f / 2048.0f;
afVertdata[13] = 0.0f;
afVertdata[14] = 0.0f;
afVertdata[15] = (GLfloat)ui32PixelHeight * 2.0f;
afVertdata[16] = (GLfloat)gc->sClear.fClearDepth;
afVertdata[17] = 1.0f;
afVertdata[18] = 0;
afVertdata[19] = 0.0f;
afVertdata[20] = (GLfloat)ui32PixelHeight * 2.0f / 2048.0f;
/* 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, 7);
EndPrimitiveBlock(gc);
gc->sHWContext.ui32PrimitiveHeader = ui32TempBlockHeader;
}
/* Need to mark these bits as dirty for re-emission. */
gc->sHWContext.ui32TAControland3DState |= (ui323DControlWord & ~MBX1_TASTATEPRES_REGIONCLIP);
}
#
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -