⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 texcombine.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -