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