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

📄 state.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************************************************************************
 * Name         : state.c
 * Author       : BCB
 * Created      : 01/05/2003
 *
 * Copyright    : 2003 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.
 *
 * Platform     : ANSI
 *
 * $Date: 2004/10/26 10:20:49 $ $Revision: 1.33 $
 * $Log: state.c $
 **************************************************************************/
#define MODULE_ID MODID_STATE

#include "context.h"



/***********************************************************************************
 Function Name      : glEnable
 Inputs             : cap
 Outputs            : -
 Returns            : -
 Description        : ENTRYPOINT: Enables state specified by cap.
					  Store all GL enables in a set of 4 enable words grouped by usage.
					  Some enables are for per-primitive raster state, some for TNL,
					  some for per-frame state, and some cannot be handled by MBX and 
					  are ignored.
************************************************************************************/

GLAPI void APIENTRY glEnable(GLenum cap)
{
	IMG_UINT32 ui32RasterEnables, ui32TnLEnables, ui32IgnoreEnables, ui32FrameEnables;
	IMG_UINT32 ui32DirtyBits = 0;
   
	__GL_GET_CONTEXT();

	GLES_TIME_START(GLES_TIMES_glEnable);

	ui32RasterEnables = __GC(ui32RasterEnables);
	ui32TnLEnables = __GC(ui32TnLEnables);
	ui32IgnoreEnables = __GC(ui32IgnoredEnables);
	ui32FrameEnables = __GC(ui32FrameEnables);

    switch (cap) 
	{
		/*
		 * Raterisation Enables, that HW supports
		 */
		case GL_ALPHA_TEST:
		{
			ui32RasterEnables |= GLES_RS_ALPHATEST_ENABLE;
			ui32DirtyBits = GLES_DIRTY_HW_ISPTSP;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_ALPHA_TEST, Raster);
			goto RASTER_CHECK;
		}
		case GL_BLEND:
		{
			ui32RasterEnables |= GLES_RS_ALPHABLEND_ENABLE;
			ui32DirtyBits = GLES_DIRTY_HW_ISPTSP;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_BLEND, Raster);
			goto RASTER_CHECK;
		}
		case GL_COLOR_LOGIC_OP:
		{
			ui32RasterEnables |= GLES_RS_LOGICOP_ENABLE;
			ui32DirtyBits = GLES_DIRTY_HW_ISPTSP;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_COLOR_LOGIC_OP, Raster);
			goto RASTER_CHECK;
		}
		case GL_TEXTURE_2D:
		{
			ui32RasterEnables |= (GLES_RS_TEXTURE0_ENABLE << gc->sState.sTexture.ui32ActiveTexture);
			ui32DirtyBits = GLES_DIRTY_SW_TEXTURE_UNIT | GLES_DIRTY_HW_ISPTSP;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_TEXTURE_2D, Raster);
			goto RASTER_CHECK;
		}
		case GL_DEPTH_TEST:
		{
			if(gc->psMode->bHaveDepthBuffer)
			{
				ui32RasterEnables |= GLES_RS_DEPTHTEST_ENABLE;
				ui32DirtyBits = GLES_DIRTY_HW_ISPTSP;
			}
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_DEPTH_TEST, Raster);
			goto RASTER_CHECK;
		}
		case GL_POLYGON_OFFSET_FILL:
		{
			ui32RasterEnables |= GLES_RS_POLYOFFSET_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_POLYOFFSET;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_POLYGON_OFFSET_FILL, Raster);
			goto RASTER_CHECK;
		}
		case GL_CULL_FACE:
		{
			ui32TnLEnables |= GLES_TL_CULLFACE_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_CULL;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32TnLEnables), ui32TnLEnables, GL_CULL_FACE, TnL);
			goto TNL_CHECK;
		}
		case GL_FOG:
		{
			/* Although fog can be turned on/off per prim, the fog table 
			 * can't be reloaded mid-frame
			 */
			ui32RasterEnables |= GLES_RS_FOG_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_FOG | GLES_DIRTY_HW_ISPTSP;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_FOG, Raster);
			goto RASTER_CHECK;
		}
		/*
		 * State which affects vertex processing
		 */
	    case GL_RESCALE_NORMAL:
		{
			ui32TnLEnables |= GLES_TL_RESCALE_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_LIGHTING;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32TnLEnables), ui32TnLEnables, GL_RESCALE_NORMAL, TnL);
			goto TNL_CHECK;
		}
		case GL_COLOR_MATERIAL:
		{
			ui32TnLEnables |= GLES_TL_COLORMAT_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_LIGHTING;

			/* Need to update material properties with current color when colormaterial is enabled */
			//Materialfv(gc, GL_FRONT_AND_BACK, gc->sState.sLight.eColorMaterialParam, &gc->sState.sCurrent.asAttrib[AP_COLOR].fX);

			GLES_DIRTY_VGP_CONSTANT(gc, GLES_DIRTY_CONSTANT_COLORMATERIAL);
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32TnLEnables), ui32TnLEnables, GL_COLOR_MATERIAL, TnL);
			goto TNL_CHECK;
		}
		case GL_LIGHTING:
		{
			ui32TnLEnables |= GLES_TL_LIGHTING_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_LIGHTING;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32TnLEnables), ui32TnLEnables, GL_LIGHTING, TnL);
			goto TNL_CHECK;
		}
		case GL_NORMALIZE:
		{
			ui32TnLEnables |= GLES_TL_NORMALIZE_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_LIGHTING;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32TnLEnables), ui32TnLEnables, GL_NORMALIZE, TnL);
			goto TNL_CHECK;
		}
		case GL_LIGHT0: case GL_LIGHT1:
		case GL_LIGHT2: case GL_LIGHT3:
		case GL_LIGHT4: case GL_LIGHT5:
		case GL_LIGHT6: case GL_LIGHT7:
		{
			ui32TnLEnables |= (GLES_TL_LIGHT0_ENABLE << (cap - GL_LIGHT0));
			ui32DirtyBits = GLES_DIRTY_SW_LIGHT;
			
			/* If our light types change the constants need to be repacked */
			GLES_DIRTY_VGP_CONSTANT(gc,  GLES_DIRTY_CONSTANT_LIGHTS);
			goto TNL_CHECK;
		}
#if defined(SUPPORT_VGP)
		case GL_CLIP_PLANE0:
		case GL_CLIP_PLANE1:
		case GL_CLIP_PLANE2:
		case GL_CLIP_PLANE3:
		case GL_CLIP_PLANE4:
		case GL_CLIP_PLANE5:
		{
			ui32TnLEnables |= (GLES_TL_CLIP_PLANE0_ENABLE << (cap - GL_CLIP_PLANE0));
			ui32DirtyBits |= GLES_DIRTY_SW_CLIP_PLANE;
			goto TNL_CHECK;
		}
#endif
#if (defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)) && !defined(PASSTHROUGH_BUILD)
		case GL_VERTEX_PROGRAM_ARB:
		{
			ui32TnLEnables |= GLES_TL_VERTEX_PROGRAM_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_VGPPROGRAM | GLES_DIRTY_SW_VGPSECTION;
			goto TNL_CHECK;
		}
#endif
		/*
		 * Whole frame/framebuffer state
		 * Although this state can be turned on/off per prim, 
		 * either we need to special handling or we can only do on a
		 * per frame basis
		 */
		case GL_SCISSOR_TEST:
		{
			if (!(gc->ui32FrameEnables & GLES_FS_SCISSOR_ENABLE))
			{
				if (gc->sClear.ui32ClearFlags)
				{
					/* If we can't flush clears - just continue to record state. */
					if(PrepareToDraw(gc))
					{
						GLESReleaseTA(gc, IMG_FALSE);
					}
					else
					{
						DPF((DBG_ERROR,"Can't flush clears"));
					}
				}

				gc->bDrawMaskInvalid = IMG_TRUE;				
				ui32FrameEnables |= GLES_FS_SCISSOR_ENABLE;
			}
			goto FS_CHECK;
		}
		case GL_DITHER:
		{
			ui32FrameEnables |= GLES_FS_DITHER_ENABLE;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32FrameEnables), ui32FrameEnables, GL_DITHER, Frame);
			goto FS_CHECK;
		}
		case GL_MULTISAMPLE:
		{
			ui32FrameEnables |= GLES_FS_MULTISAMPLE_ENABLE;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32FrameEnables), ui32FrameEnables, GL_MULTISAMPLE, Frame);
			goto FS_CHECK;
		}
		/*
		 * Unsupported multisample state - not do-able in HW
		 */
		case GL_SAMPLE_ALPHA_TO_COVERAGE:
		{
			ui32IgnoreEnables |= GLES_IG_MSALPHACOV_ENABLE;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32IgnoredEnables), ui32IgnoreEnables, GL_SAMPLE_ALPHA_TO_COVERAGE, Ignore);
			goto IGNORE_CHECK;
		}
		case GL_SAMPLE_ALPHA_TO_ONE:
		{
			ui32IgnoreEnables |= GLES_IG_MSSAMPALPHA_ENABLE;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32IgnoredEnables), ui32IgnoreEnables, GL_SAMPLE_ALPHA_TO_ONE, Ignore);
			goto IGNORE_CHECK;
		}
		case GL_SAMPLE_COVERAGE:
		{
			ui32IgnoreEnables |= GLES_IG_MSSAMPCOV_ENABLE;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32IgnoredEnables), ui32IgnoreEnables, GL_SAMPLE_COVERAGE, Ignore);
			goto IGNORE_CHECK;
		}
		/*
		 * Unsupported, but not exported
		 */ 
		case GL_STENCIL_TEST:
		{
			ui32IgnoreEnables |= GLES_IG_STENCILTEST_ENABLE;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32IgnoredEnables), ui32IgnoreEnables, GL_STENCIL_TEST, Ignore);
			goto IGNORE_CHECK;
		}
		/*
		 * Unsupported per-primitive state, and not do-able in HW
		 */ 
		case GL_LINE_SMOOTH:
		{
			ui32RasterEnables |= GLES_RS_LINESMOOTH_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_LINEPOINTSIZE;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_LINE_SMOOTH, Raster);
			goto RASTER_CHECK;
		}
		case GL_POINT_SMOOTH:
		{
			ui32RasterEnables |= GLES_RS_POINTSMOOTH_ENABLE;
			ui32DirtyBits = GLES_DIRTY_SW_LINEPOINTSIZE;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_POINT_SMOOTH, Raster);
			goto RASTER_CHECK;
		}
		/*
		 * Set error value, not an OGL-ES state
		 */
		default:
		{
			SetError(gc, GL_INVALID_ENUM);

			GLES_TIME_STOP(GLES_TIMES_glEnable);
			return;
		}
    }

 RASTER_CHECK:
	if(gc->ui32RasterEnables != ui32RasterEnables)
	{
		gc->ui32RasterEnables = ui32RasterEnables;
		gc->ui32DirtyMask |= ui32DirtyBits;
	}

	GLES_TIME_STOP(GLES_TIMES_glEnable);
	
	return;

 TNL_CHECK:
	if(gc->ui32TnLEnables != ui32TnLEnables)
	{
		gc->ui32TnLEnables = ui32TnLEnables;
		gc->ui32DirtyMask |= ui32DirtyBits;
	}

	GLES_TIME_STOP(GLES_TIMES_glEnable);
	
	return;

 FS_CHECK:
	__GC(ui32FrameEnables) = ui32FrameEnables;

	GLES_TIME_STOP(GLES_TIMES_glEnable);
	
	return;

 IGNORE_CHECK:
	__GC(ui32IgnoredEnables) = ui32IgnoreEnables;

	GLES_TIME_STOP(GLES_TIMES_glEnable);
	
	return;
}

/***********************************************************************************
 Function Name      : glDisable
 Inputs             : cap
 Outputs            : -
 Returns            : -
 Description        : ENTRYPOINT: Disables state specified by cap.
					  All GL enables are stored in a set of 4 enable words grouped by 
					  usage. Some enables are for per-primitive raster state, some for
					  TNL,some for per-frame state, and some cannot be handled by MBX 
					  and are ignored.
************************************************************************************/


GLAPI void APIENTRY glDisable(GLenum cap)
{
	IMG_UINT32 ui32RasterEnables, ui32TnLEnables, ui32IgnoreEnables, ui32FrameEnables;
	IMG_UINT32 ui32DirtyBits=0;
   
	__GL_GET_CONTEXT();

	GLES_TIME_START(GLES_TIMES_glDisable);

	ui32RasterEnables = __GC(ui32RasterEnables);
	ui32TnLEnables = __GC(ui32TnLEnables);
	ui32IgnoreEnables = __GC(ui32IgnoredEnables);
	ui32FrameEnables = __GC(ui32FrameEnables);

    switch (cap) 
	{
		/*
		 * Raterisation Enables, that HW supports
		 */
		case GL_ALPHA_TEST:
		{
			ui32RasterEnables &= ~GLES_RS_ALPHATEST_ENABLE;
			ui32DirtyBits = GLES_DIRTY_HW_ISPTSP;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_ALPHA_TEST, Raster);
			goto RASTER_CHECK;
		}
		case GL_BLEND:
		{
			ui32RasterEnables &= ~GLES_RS_ALPHABLEND_ENABLE;
			ui32DirtyBits = GLES_DIRTY_HW_ISPTSP;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_BLEND, Raster);
			goto RASTER_CHECK;
		}
		case GL_COLOR_LOGIC_OP:
		{
			ui32RasterEnables &= ~GLES_RS_LOGICOP_ENABLE;
			ui32DirtyBits = GLES_DIRTY_HW_ISPTSP;
			GLES_PROFILE_ADD_REDUNTANT_STATE(__GC(ui32RasterEnables), ui32RasterEnables, GL_COLOR_LOGIC_OP, Raster);
			goto RASTER_CHECK;
		}
		case GL_TEXTURE_2D:

⌨️ 快捷键说明

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