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

📄 texcombine.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 * Name         : texcombine.c
 * Title        : Texture combine functions
 * Author       : BCB
 * Created      : 28/11/2003
 *
 * Copyright    : 2004 by Imagination Technologies Limited. All rights reserved.
 * 				  No part of this software, either material or conceptual 
 * 				  may be copied or distributed, transmitted, transcribed,
 * 				  stored in a retrieval system or translated into any 
 * 				  human or computer language in any form by any means,
 * 				  electronic, mechanical, manual or other-wise, or 
 * 				  disclosed to third parties without the express written
 * 				  permission of Imagination Technologies Limited, Unit 8, HomePark
 * 				  Industrial Estate, King's Langley, Hertfordshire,
 * 				  WD4 8LZ, U.K.
 *
 * Description  : Uses table generated by textool
 *
 * Platform     : ANSI
 *
 * Modifications:
 * $Log: texcombine.c $
 *****************************************************************************/
#define MODULE_ID MODID_TEXCOMBINE

#if defined(SUPPORT_MBX1)

#include "context.h"
#include "tstable.h"
#include "texcombine.h"

const static IMG_UINT32 aui32InvSwiz[2][8][4] = 
{
	{
		{ MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS4SHIFT },		
		{ MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS4SHIFT },		
		{ MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS3SHIFT },		
		{ MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS3SHIFT },
		{ MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS2SHIFT },
		{ MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS2SHIFT },
		{ MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS1SHIFT },
		{ MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS1SHIFT }
	},
	{
		{ MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS4SHIFT },		
		{ MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS4SHIFT },		
		{ MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS3SHIFT },		
		{ MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS3SHIFT },
		{ MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS2SHIFT },
		{ MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS2SHIFT },
		{ MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS1SHIFT },
		{ MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS1SHIFT }
	}
};

const static IMG_UINT32 aui32Op3Count[2] = {GLES_COLOROP3_COUNT, GLES_ALPHAOP3_COUNT};

IMG_VOID TexEnvCombine(GLESContext *gc, GLenum pname, GLenum e)
{
	IMG_UINT8 ui8Op, ui8Scale, ui8Src;
	IMG_UINT32 ui32SrcIndex, ui32Unit;
	GLEStextureEnvState *psEnvState	= &gc->sState.sTexture.psActive->sEnv;
	
	ui32Unit = gc->sState.sTexture.ui32ActiveTexture;

	switch (pname) 
	{
	case GL_COMBINE_RGB:

		switch(e)
		{
		case GL_REPLACE:
			ui8Op = GLES_COMBINEOP_REPLACE;
			break;
		case GL_MODULATE:
			ui8Op = GLES_COMBINEOP_MODULATE;
			break;
		case GL_ADD:
			ui8Op = GLES_COMBINEOP_ADD;
			break;
		case GL_ADD_SIGNED:
			ui8Op = GLES_COMBINEOP_ADD_SIGNED;
			break;
		case GL_INTERPOLATE:
			ui8Op = GLES_COMBINEOP_INTERPOLATE;
			break;
		case GL_SUBTRACT:
			ui8Op = GLES_COMBINEOP_SUBTRACT;
			break;
		case GL_DOT3_RGB:
			ui8Op = GLES_COMBINEOP_DOT3_RGB;
			break;
		case GL_DOT3_RGBA:
			ui8Op = GLES_COMBINEOP_DOT3_RGBA;
			break;
		default:
bad_enum:
			SetError(gc, GL_INVALID_ENUM);
			return;
		}

		psEnvState->ui8ScaleOp[GLES_COMBINE_COLOR] &= GLES_COMBINEOP_OPCLEAR;
		psEnvState->ui8ScaleOp[GLES_COMBINE_COLOR] |= (ui8Op << GLES_COMBINEOP_OPSHIFT);
		break;
    case GL_COMBINE_ALPHA:
		switch(e)
		{
		case GL_REPLACE:
			ui8Op = GLES_COMBINEOP_REPLACE;
			break;
		case GL_MODULATE:
			ui8Op = GLES_COMBINEOP_MODULATE;
			break;
		case GL_ADD:
			ui8Op = GLES_COMBINEOP_ADD;
			break;
		case GL_ADD_SIGNED:
			ui8Op = GLES_COMBINEOP_ADD_SIGNED;
			break;
		case GL_INTERPOLATE:
			ui8Op = GLES_COMBINEOP_INTERPOLATE;
			break;
		case GL_SUBTRACT:
			ui8Op = GLES_COMBINEOP_SUBTRACT;
			break;
		default:
			goto bad_enum;
		}

		psEnvState->ui8ScaleOp[GLES_COMBINE_ALPHA] &= GLES_COMBINEOP_OPCLEAR;
		psEnvState->ui8ScaleOp[GLES_COMBINE_ALPHA] |= (ui8Op << GLES_COMBINEOP_OPSHIFT);
		break;
    case GL_SOURCE0_RGB:
    case GL_SOURCE1_RGB:
    case GL_SOURCE2_RGB:
		ui32SrcIndex = pname - GL_SOURCE0_RGB;
		
		switch(e)
		{
			case GL_TEXTURE:
				ui8Src = GLES_COMBINESRC_TEXTURE;
				break;
			case GL_CONSTANT:
				ui8Src = GLES_COMBINESRC_CONSTANT;
				break;
			case GL_PRIMARY_COLOR:
				ui8Src = GLES_COMBINESRC_PRIMARY;
				break;
			case GL_PREVIOUS:
				if(ui32Unit == 0)
					ui8Src = GLES_COMBINESRC_PRIMARY;
				else
					ui8Src = GLES_COMBINESRC_PREVIOUS;
				break;
			default:
				goto bad_enum;
		}

		psEnvState->aui8Src[GLES_COMBINE_COLOR][ui32SrcIndex] &= GLES_COMBINESRC_SRCCLEAR;
		psEnvState->aui8Src[GLES_COMBINE_COLOR][ui32SrcIndex] |= (ui8Src << GLES_COMBINESRC_SRCSHIFT);
		break;
	case GL_SOURCE0_ALPHA:
	case GL_SOURCE1_ALPHA:
	case GL_SOURCE2_ALPHA:
		ui32SrcIndex = pname - GL_SOURCE0_ALPHA;
		
		switch(e)
		{
			case GL_TEXTURE:
				ui8Src = GLES_COMBINESRC_TEXTURE;
				break;
			case GL_CONSTANT:
				ui8Src = GLES_COMBINESRC_CONSTANT;
				break;
			case GL_PRIMARY_COLOR:
				ui8Src = GLES_COMBINESRC_PRIMARY;
				break;
			case GL_PREVIOUS:
				if(ui32Unit == 0)
					ui8Src = GLES_COMBINESRC_PRIMARY;
				else
					ui8Src = GLES_COMBINESRC_PREVIOUS;
				break;
			default:
				goto bad_enum;
		}

		psEnvState->aui8Src[GLES_COMBINE_ALPHA][ui32SrcIndex] &= GLES_COMBINESRC_SRCCLEAR;
		psEnvState->aui8Src[GLES_COMBINE_ALPHA][ui32SrcIndex] |= (ui8Src << GLES_COMBINESRC_SRCSHIFT);
		break;
    case GL_OPERAND0_RGB:
    case GL_OPERAND1_RGB:
    case GL_OPERAND2_RGB:
		ui32SrcIndex = pname - GL_OPERAND0_RGB;

		switch(e)
		{
			case GL_SRC_COLOR:
				/* Don't need an operand to get color */
				ui8Src = 0; 
				break;
			case GL_ONE_MINUS_SRC_COLOR:
				ui8Src = GLES_COMBINESRC_OPERANDONEMINUS;
				break;
			case GL_SRC_ALPHA:
				ui8Src = GLES_COMBINESRC_OPERANDALPHA;
				break;
			case GL_ONE_MINUS_SRC_ALPHA:
				ui8Src = GLES_COMBINESRC_OPERANDALPHA | GLES_COMBINESRC_OPERANDONEMINUS;
				break;
			default:
				goto bad_enum;
		}

		psEnvState->aui8Src[GLES_COMBINE_COLOR][ui32SrcIndex] &= GLES_COMBINESRC_OPERANDCLEAR;
		psEnvState->aui8Src[GLES_COMBINE_COLOR][ui32SrcIndex] |= ui8Src;
		break;
	case GL_OPERAND0_ALPHA:
	case GL_OPERAND1_ALPHA:
	case GL_OPERAND2_ALPHA:
		ui32SrcIndex = pname - GL_OPERAND0_ALPHA;
		
		switch(e)
		{
			case GL_SRC_ALPHA:
				/* Don't need an operand to get alpha */
				ui8Src = 0;
				break;
			case GL_ONE_MINUS_SRC_ALPHA:
				ui8Src = GLES_COMBINESRC_OPERANDONEMINUS;
				break;
			default:
				goto bad_enum;
		}

		psEnvState->aui8Src[GLES_COMBINE_ALPHA][ui32SrcIndex] &= GLES_COMBINESRC_OPERANDCLEAR;
		psEnvState->aui8Src[GLES_COMBINE_ALPHA][ui32SrcIndex] |= ui8Src;
		break;
    case GL_RGB_SCALE:
		switch(e)
		{
			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_COLOR] &= GLES_COMBINEOP_SCALECLEAR;
		psEnvState->ui8ScaleOp[GLES_COMBINE_COLOR] |= ui8Scale;
		break;
    case GL_ALPHA_SCALE:
		switch(e)
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -