📄 texcombine.c
字号:
case 1:
ui8Scale = GLES_COMBINEOP_SCALE_ONE;
break;
case 2:
ui8Scale = GLES_COMBINEOP_SCALE_TWO;
break;
case 4:
ui8Scale = GLES_COMBINEOP_SCALE_FOUR;
break;
default:
goto bad_enum;
}
psEnvState->ui8ScaleOp[GLES_COMBINE_ALPHA] &= GLES_COMBINEOP_SCALECLEAR;
psEnvState->ui8ScaleOp[GLES_COMBINE_ALPHA] |= ui8Scale;
break;
}
}
/*****************************************************************************
FUNCTION : CalcCombineControlWord
PURPOSE : Finds the color-op layer-control table entries for a given
color-op and arguments
PARAMETERS : psEnvState - Combiner state
pui32TSPWord - Output control words
RETURNS : Success
*****************************************************************************/
IMG_UINT32 CalcCombineControlWord(GLEStextureEnvState *psEnvState, IMG_BOOL *pbHasFactorCol, IMG_BOOL *pbIsDot3)
{
IMG_UINT32 ui32Entry, ui32Swiz, ui32OpLookup, ui32Scale =0;
IMG_UINT32 aui32Src[GLES_COMBINE_MAX_SRC];
IMG_UINT32 abNegate[4];
IMG_UINT32 i, ui32ScaleShift, ui32ControlWord, ui32LookupValue;
ui32ControlWord = 0;
*pbIsDot3 = IMG_FALSE;
*pbHasFactorCol = IMG_FALSE;
for(i=0; i < GLES_NUM_COMBINERS; i++)
{
aui32Src[0] = psEnvState->aui8Src[i][0] & GLES_COMBINESRC_SRCMASK;
aui32Src[1] = psEnvState->aui8Src[i][1] & GLES_COMBINESRC_SRCMASK;
abNegate[0] = (psEnvState->aui8Src[i][0] & GLES_COMBINESRC_OPERANDONEMINUS) ? IMG_TRUE : IMG_FALSE;
abNegate[1] = (psEnvState->aui8Src[i][1] & GLES_COMBINESRC_OPERANDONEMINUS) ? IMG_TRUE : IMG_FALSE;
ui32OpLookup = (psEnvState->ui8ScaleOp[i] & ~GLES_COMBINEOP_OPCLEAR) >> GLES_COMBINEOP_OPSHIFT;
if(i == 0)
{
if(ui32OpLookup < GLES_COLOROP3_COUNT)
{
aui32Src[2] = psEnvState->aui8Src[0][2] & GLES_COMBINESRC_SRCMASK;
abNegate[2] = (psEnvState->aui8Src[0][2] & GLES_COMBINESRC_OPERANDONEMINUS) ? IMG_TRUE : IMG_FALSE;
ui32Entry = (GLES_COLOROP3OFF_SCALE * ui32OpLookup) +
(GLES_COLORARG1OFF_SCALE * aui32Src[0]) +
(GLES_COLORARG2OFF_SCALE * aui32Src[1]) +
(GLES_COLORARG3OFF_SCALE * aui32Src[2]);
ui32LookupValue = *(ui32ColorOp3LCtlTable + ui32Entry);
}
else
{
abNegate[2] = 0;
ui32Entry = (GLES_COLOROP2OFF_SCALE * (ui32OpLookup - GLES_COLOROP3_COUNT)) +
(GLES_COLORARG1OFF_SCALE * aui32Src[0]) +
(GLES_COLORARG2OFF_SCALE * aui32Src[1]);
ui32LookupValue = *(ui32ColorOp2LCtlTable + ui32Entry);
}
if(ui32LookupValue == 0xFFFFFFFF)
{
DPF((DBG_WARNING,"Couldn't encode that blend - trying a replace instead..."));
ui32Entry = (GLES_COLOROP2OFF_SCALE * (GLES_COMBINEOP_REPLACE - GLES_COLOROP3_COUNT)) +
(GLES_COLORARG1OFF_SCALE * aui32Src[0]) +
(GLES_COLORARG2OFF_SCALE * aui32Src[1]);
ui32LookupValue = *(ui32ColorOp2LCtlTable + ui32Entry);
}
ui32Swiz = (ui32LookupValue & COLOR_SWIZ_MASK) >> COLOR_SWIZ_SHIFT;
ui32ControlWord |= (ui32LookupValue & ~COLOR_SWIZ_MASK);
ui32ScaleShift = MBX1_TSPPL3_CBEOPSHIFT;
}
else
{
if(ui32OpLookup < GLES_ALPHAOP3_COUNT)
{
aui32Src[2] = psEnvState->aui8Src[1][2] & GLES_COMBINESRC_SRCMASK;
abNegate[2] = (psEnvState->aui8Src[1][2] & GLES_COMBINESRC_OPERANDONEMINUS) ? IMG_TRUE : IMG_FALSE;
ui32Entry = (GLES_ALPHAOP3OFF_SCALE * ui32OpLookup) +
(GLES_ALPHAARG1OFF_SCALE * aui32Src[0]) +
(GLES_ALPHAARG2OFF_SCALE * aui32Src[1]) +
(GLES_ALPHAARG3OFF_SCALE * aui32Src[2]);
ui32LookupValue = *(ui32AlphaOp3LCtlTable + ui32Entry);
}
else
{
abNegate[2] = 0;
ui32Entry = (GLES_ALPHAOP2OFF_SCALE * (ui32OpLookup - GLES_ALPHAOP3_COUNT)) +
(GLES_ALPHAARG1OFF_SCALE * aui32Src[0]) +
(GLES_ALPHAARG2OFF_SCALE * aui32Src[1]);
ui32LookupValue = *(ui32AlphaOp2LCtlTable + ui32Entry);
}
if(ui32LookupValue == 0xFFFFFFFF)
{
DPF((DBG_WARNING,"Couldn't encode that blend - trying a replace instead..."));
ui32Entry = (GLES_ALPHAOP2OFF_SCALE * (GLES_COMBINEOP_REPLACE - GLES_ALPHAOP3_COUNT)) +
(GLES_ALPHAARG1OFF_SCALE * aui32Src[0]) +
(GLES_ALPHAARG2OFF_SCALE * aui32Src[1]);
ui32LookupValue = *(ui32AlphaOp2LCtlTable + ui32Entry);
}
ui32Swiz = (ui32LookupValue & ALPHA_SWIZ_MASK) >> ALPHA_SWIZ_SHIFT;
ui32ControlWord |= (ui32LookupValue & ~ALPHA_SWIZ_MASK);
ui32ScaleShift = MBX1_TSPPL3_ABEOPSHIFT;
}
abNegate[3] = 0;
switch(ui32OpLookup)
{
case GLES_COMBINEOP_INTERPOLATE:
abNegate[3] = !abNegate[2];
abNegate[0] <<= aui32InvSwiz[i][ui32Swiz][0];
abNegate[1] <<= aui32InvSwiz[i][ui32Swiz][2];
abNegate[2] <<= aui32InvSwiz[i][ui32Swiz][1];
abNegate[3] <<= aui32InvSwiz[i][ui32Swiz][3];
if(((aui32Src[0] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT) ||
((aui32Src[1] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT) ||
((aui32Src[2] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT))
{
*pbHasFactorCol = IMG_TRUE;
}
ui32Scale = (psEnvState->ui8ScaleOp[i] & ~GLES_COMBINEOP_SCALECLEAR) >> GLES_COMBINEOP_SCALESHIFT;
break;
case GLES_COMBINEOP_REPLACE:
abNegate[0] <<= aui32InvSwiz[i][ui32Swiz][1];
abNegate[1] = 0;
if((aui32Src[0] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT)
{
*pbHasFactorCol = IMG_TRUE;
}
ui32Scale = (psEnvState->ui8ScaleOp[i] & ~GLES_COMBINEOP_SCALECLEAR) >> GLES_COMBINEOP_SCALESHIFT;
break;
case GLES_COMBINEOP_MODULATE:
abNegate[0] <<= aui32InvSwiz[i][ui32Swiz][0];
abNegate[1] <<= aui32InvSwiz[i][ui32Swiz][1];
if(((aui32Src[0] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT) ||
((aui32Src[1] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT))
{
*pbHasFactorCol = IMG_TRUE;
}
ui32Scale = (psEnvState->ui8ScaleOp[i] & ~GLES_COMBINEOP_SCALECLEAR) >> GLES_COMBINEOP_SCALESHIFT;
break;
case GLES_COMBINEOP_ADD:
case GLES_COMBINEOP_ADD_SIGNED:
abNegate[0] <<= aui32InvSwiz[i][ui32Swiz][1];
abNegate[1] <<= aui32InvSwiz[i][ui32Swiz][3];
if(((aui32Src[0] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT) ||
((aui32Src[1] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT))
{
*pbHasFactorCol = IMG_TRUE;
}
ui32Scale = (psEnvState->ui8ScaleOp[i] & ~GLES_COMBINEOP_SCALECLEAR) >> GLES_COMBINEOP_SCALESHIFT;
break;
case GLES_COMBINEOP_SUBTRACT:
abNegate[0] = !abNegate[0];
abNegate[0] <<= aui32InvSwiz[i][ui32Swiz][1];
abNegate[1] <<= aui32InvSwiz[i][ui32Swiz][3];
if(((aui32Src[0] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT) ||
((aui32Src[1] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT))
{
*pbHasFactorCol = IMG_TRUE;
}
ui32Scale = (psEnvState->ui8ScaleOp[i] & ~GLES_COMBINEOP_SCALECLEAR) >> GLES_COMBINEOP_SCALESHIFT;
if (ui32Scale)
{
DPF((DBG_WARNING,"Cannot subtract and scale"));
ui32Scale = 0;
}
break;
case GLES_COMBINEOP_DOT3_RGB:
abNegate[0] <<= aui32InvSwiz[i][ui32Swiz][0];
abNegate[1] <<= aui32InvSwiz[i][ui32Swiz][1];
if(((aui32Src[0] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT) ||
((aui32Src[1] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT))
{
*pbHasFactorCol = IMG_TRUE;
}
ui32Scale = (psEnvState->ui8ScaleOp[i] & ~GLES_COMBINEOP_SCALECLEAR) >> GLES_COMBINEOP_SCALESHIFT;
*pbIsDot3 = IMG_TRUE;
break;
case GLES_COMBINEOP_DOT3_RGBA:
abNegate[0] <<= aui32InvSwiz[i][ui32Swiz][0];
abNegate[1] <<= aui32InvSwiz[i][ui32Swiz][1];
if(((aui32Src[0] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT) ||
((aui32Src[1] & ~GLES_COMBINESRC_SRCCLEAR) == GLES_COMBINESRC_CONSTANT))
{
*pbHasFactorCol = IMG_TRUE;
}
ui32Scale = (psEnvState->ui8ScaleOp[i] & ~GLES_COMBINEOP_SCALECLEAR) >> GLES_COMBINEOP_SCALESHIFT;
*pbIsDot3 = IMG_TRUE;
/*
* Special case - ignore alpha combiner and set it up to scale by same amount as color ensure
* AS3+4 don't interact.
*/
ui32ControlWord |= abNegate[0] | abNegate[1] | (ui32Scale << MBX1_TSPPL3_CBEOPSHIFT) |
(ui32Scale << MBX1_TSPPL3_ABEOPSHIFT) | MBX1_TSPPL3_INVAS3 | MBX1_TSPPL3_AS3SELONE;
return ui32ControlWord;
}
ui32ControlWord |= abNegate[0] | abNegate[1] | abNegate[2] | abNegate[3] | (ui32Scale << ui32ScaleShift);
}
return ui32ControlWord;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -