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